diff options
| author | Fredrik de Groot <fredrik.de.groot@haleytek.com> | 2024-09-09 15:54:57 +0200 |
|---|---|---|
| committer | LUCI <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2024-10-28 16:55:10 +0000 |
| commit | 303bd963d57936873f62c7b61a885911afc46788 (patch) | |
| tree | 6970ea441a7873ca08fd5af366a0bd0ba6b7a5ca /manifest_xml.py | |
| parent | ae384f8623aeb36809541a5e07900a77a0960d5f (diff) | |
| download | git-repo-303bd963d57936873f62c7b61a885911afc46788.tar.gz | |
manifest: add optional base check on remove and extend
This adds an optional, built-in checker for
guarding against patches hanging on wrong
base revisions, which is useful if a lower layer of
the manifest changes after a patch was done.
When adding a patch with a new revision using
extend-project or remove-project/project:
C---D---E patches in project bla
/
A---B project bla in manifest state 1
<extend-project name="bla" revision="E" base-rev="B">
If project bla gets updated, in a new snap ID
or by a supplier or similar, to a new state:
C---D---E patches in project bla
/
A---B---F---G project bla in manifest state 2
Parsing will fail because revision of bla is now G,
giving the choice to create a new patch branch
from G and updating base-rev, or keeping previous
branch for some reason and only updating base-rev.
Intended for use in a layered manifest with
hashed revisions. Named refs like branches and tags
also work fine when comparing, but will be misleading
if a branch is used as base-rev.
Change-Id: Ic6211550a7d3cc9656057f6a2087c505b40cad2b
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/436777
Reviewed-by: Josip Sokcevic <sokcevic@google.com>
Tested-by: Fredrik de Groot <fredrik.de.groot@haleytek.com>
Commit-Queue: Josip Sokcevic <sokcevic@google.com>
Diffstat (limited to 'manifest_xml.py')
| -rw-r--r-- | manifest_xml.py | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/manifest_xml.py b/manifest_xml.py index b26b0cac..cdab31e6 100644 --- a/manifest_xml.py +++ b/manifest_xml.py | |||
| @@ -1445,6 +1445,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 1445 | 1445 | ||
| 1446 | repo_hooks_project = None | 1446 | repo_hooks_project = None |
| 1447 | enabled_repo_hooks = None | 1447 | enabled_repo_hooks = None |
| 1448 | failed_revision_changes = [] | ||
| 1448 | for node in itertools.chain(*node_list): | 1449 | for node in itertools.chain(*node_list): |
| 1449 | if node.nodeName == "project": | 1450 | if node.nodeName == "project": |
| 1450 | project = self._ParseProject(node) | 1451 | project = self._ParseProject(node) |
| @@ -1471,6 +1472,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 1471 | remote = self._get_remote(node) | 1472 | remote = self._get_remote(node) |
| 1472 | dest_branch = node.getAttribute("dest-branch") | 1473 | dest_branch = node.getAttribute("dest-branch") |
| 1473 | upstream = node.getAttribute("upstream") | 1474 | upstream = node.getAttribute("upstream") |
| 1475 | base_revision = node.getAttribute("base-rev") | ||
| 1474 | 1476 | ||
| 1475 | named_projects = self._projects[name] | 1477 | named_projects = self._projects[name] |
| 1476 | if dest_path and not path and len(named_projects) > 1: | 1478 | if dest_path and not path and len(named_projects) > 1: |
| @@ -1484,6 +1486,13 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 1484 | if groups: | 1486 | if groups: |
| 1485 | p.groups.extend(groups) | 1487 | p.groups.extend(groups) |
| 1486 | if revision: | 1488 | if revision: |
| 1489 | if base_revision: | ||
| 1490 | if p.revisionExpr != base_revision: | ||
| 1491 | failed_revision_changes.append( | ||
| 1492 | "extend-project name %s mismatch base " | ||
| 1493 | "%s vs revision %s" | ||
| 1494 | % (name, base_revision, p.revisionExpr) | ||
| 1495 | ) | ||
| 1487 | p.SetRevision(revision) | 1496 | p.SetRevision(revision) |
| 1488 | 1497 | ||
| 1489 | if remote_name: | 1498 | if remote_name: |
| @@ -1558,6 +1567,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 1558 | if node.nodeName == "remove-project": | 1567 | if node.nodeName == "remove-project": |
| 1559 | name = node.getAttribute("name") | 1568 | name = node.getAttribute("name") |
| 1560 | path = node.getAttribute("path") | 1569 | path = node.getAttribute("path") |
| 1570 | base_revision = node.getAttribute("base-rev") | ||
| 1561 | 1571 | ||
| 1562 | # Name or path needed. | 1572 | # Name or path needed. |
| 1563 | if not name and not path: | 1573 | if not name and not path: |
| @@ -1571,6 +1581,13 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 1571 | for projname, projects in list(self._projects.items()): | 1581 | for projname, projects in list(self._projects.items()): |
| 1572 | for p in projects: | 1582 | for p in projects: |
| 1573 | if name == projname and not path: | 1583 | if name == projname and not path: |
| 1584 | if base_revision: | ||
| 1585 | if p.revisionExpr != base_revision: | ||
| 1586 | failed_revision_changes.append( | ||
| 1587 | "remove-project name %s mismatch base " | ||
| 1588 | "%s vs revision %s" | ||
| 1589 | % (name, base_revision, p.revisionExpr) | ||
| 1590 | ) | ||
| 1574 | del self._paths[p.relpath] | 1591 | del self._paths[p.relpath] |
| 1575 | if not removed_project: | 1592 | if not removed_project: |
| 1576 | del self._projects[name] | 1593 | del self._projects[name] |
| @@ -1578,6 +1595,17 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 1578 | elif path == p.relpath and ( | 1595 | elif path == p.relpath and ( |
| 1579 | name == projname or not name | 1596 | name == projname or not name |
| 1580 | ): | 1597 | ): |
| 1598 | if base_revision: | ||
| 1599 | if p.revisionExpr != base_revision: | ||
| 1600 | failed_revision_changes.append( | ||
| 1601 | "remove-project path %s mismatch base " | ||
| 1602 | "%s vs revision %s" | ||
| 1603 | % ( | ||
| 1604 | p.relpath, | ||
| 1605 | base_revision, | ||
| 1606 | p.revisionExpr, | ||
| 1607 | ) | ||
| 1608 | ) | ||
| 1581 | self._projects[projname].remove(p) | 1609 | self._projects[projname].remove(p) |
| 1582 | del self._paths[p.relpath] | 1610 | del self._paths[p.relpath] |
| 1583 | removed_project = p.name | 1611 | removed_project = p.name |
| @@ -1597,6 +1625,13 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 1597 | "project: %s" % node.toxml() | 1625 | "project: %s" % node.toxml() |
| 1598 | ) | 1626 | ) |
| 1599 | 1627 | ||
| 1628 | if failed_revision_changes: | ||
| 1629 | raise ManifestParseError( | ||
| 1630 | "revision base check failed, rebase patches and update " | ||
| 1631 | "base revs for: ", | ||
| 1632 | failed_revision_changes, | ||
| 1633 | ) | ||
| 1634 | |||
| 1600 | # Store repo hooks project information. | 1635 | # Store repo hooks project information. |
| 1601 | if repo_hooks_project: | 1636 | if repo_hooks_project: |
| 1602 | # Store a reference to the Project. | 1637 | # Store a reference to the Project. |
