diff options
| -rw-r--r-- | docs/manifest-format.md | 10 | ||||
| -rw-r--r-- | git_superproject.py | 14 | ||||
| -rw-r--r-- | manifest_xml.py | 10 | ||||
| -rw-r--r-- | tests/test_git_superproject.py | 2 | ||||
| -rw-r--r-- | tests/test_manifest_xml.py | 69 |
5 files changed, 90 insertions, 15 deletions
diff --git a/docs/manifest-format.md b/docs/manifest-format.md index 854e5e1b..ed297ae7 100644 --- a/docs/manifest-format.md +++ b/docs/manifest-format.md | |||
| @@ -103,8 +103,9 @@ following DTD: | |||
| 103 | <!ATTLIST repo-hooks enabled-list CDATA #REQUIRED> | 103 | <!ATTLIST repo-hooks enabled-list CDATA #REQUIRED> |
| 104 | 104 | ||
| 105 | <!ELEMENT superproject EMPTY> | 105 | <!ELEMENT superproject EMPTY> |
| 106 | <!ATTLIST superproject name CDATA #REQUIRED> | 106 | <!ATTLIST superproject name CDATA #REQUIRED> |
| 107 | <!ATTLIST superproject remote IDREF #IMPLIED> | 107 | <!ATTLIST superproject remote IDREF #IMPLIED> |
| 108 | <!ATTLIST superproject revision CDATA #IMPLIED> | ||
| 108 | 109 | ||
| 109 | <!ELEMENT contactinfo EMPTY> | 110 | <!ELEMENT contactinfo EMPTY> |
| 110 | <!ATTLIST contactinfo bugurl CDATA #REQUIRED> | 111 | <!ATTLIST contactinfo bugurl CDATA #REQUIRED> |
| @@ -432,6 +433,11 @@ same meaning as project's name attribute. See the | |||
| 432 | Attribute `remote`: Name of a previously defined remote element. | 433 | Attribute `remote`: Name of a previously defined remote element. |
| 433 | If not supplied the remote given by the default element is used. | 434 | If not supplied the remote given by the default element is used. |
| 434 | 435 | ||
| 436 | Attribute `revision`: Name of the Git branch the manifest wants | ||
| 437 | to track for this superproject. If not supplied the revision given | ||
| 438 | by the remote element is used if applicable, else the default | ||
| 439 | element is used. | ||
| 440 | |||
| 435 | ### Element contactinfo | 441 | ### Element contactinfo |
| 436 | 442 | ||
| 437 | *** | 443 | *** |
diff --git a/git_superproject.py b/git_superproject.py index 935e1250..ce68690f 100644 --- a/git_superproject.py +++ b/git_superproject.py | |||
| @@ -90,7 +90,7 @@ class Superproject(object): | |||
| 90 | self._git_event_log = git_event_log | 90 | self._git_event_log = git_event_log |
| 91 | self._quiet = quiet | 91 | self._quiet = quiet |
| 92 | self._print_messages = print_messages | 92 | self._print_messages = print_messages |
| 93 | self._branch = self._GetBranch() | 93 | self._branch = manifest.branch |
| 94 | self._repodir = os.path.abspath(repodir) | 94 | self._repodir = os.path.abspath(repodir) |
| 95 | self._superproject_dir = superproject_dir | 95 | self._superproject_dir = superproject_dir |
| 96 | self._superproject_path = os.path.join(self._repodir, superproject_dir) | 96 | self._superproject_path = os.path.join(self._repodir, superproject_dir) |
| @@ -100,6 +100,7 @@ class Superproject(object): | |||
| 100 | if self._manifest.superproject: | 100 | if self._manifest.superproject: |
| 101 | remote = self._manifest.superproject['remote'] | 101 | remote = self._manifest.superproject['remote'] |
| 102 | git_name = hashlib.md5(remote.name.encode('utf8')).hexdigest() + '-' | 102 | git_name = hashlib.md5(remote.name.encode('utf8')).hexdigest() + '-' |
| 103 | self._branch = self._manifest.superproject['revision'] | ||
| 103 | self._remote_url = remote.url | 104 | self._remote_url = remote.url |
| 104 | else: | 105 | else: |
| 105 | self._remote_url = None | 106 | self._remote_url = None |
| @@ -116,17 +117,6 @@ class Superproject(object): | |||
| 116 | """Returns the manifest path if the path exists or None.""" | 117 | """Returns the manifest path if the path exists or None.""" |
| 117 | return self._manifest_path if os.path.exists(self._manifest_path) else None | 118 | return self._manifest_path if os.path.exists(self._manifest_path) else None |
| 118 | 119 | ||
| 119 | def _GetBranch(self): | ||
| 120 | """Returns the branch name for getting the approved manifest.""" | ||
| 121 | p = self._manifest.manifestProject | ||
| 122 | b = p.GetBranch(p.CurrentBranch) | ||
| 123 | if not b: | ||
| 124 | return None | ||
| 125 | branch = b.merge | ||
| 126 | if branch and branch.startswith(R_HEADS): | ||
| 127 | branch = branch[len(R_HEADS):] | ||
| 128 | return branch | ||
| 129 | |||
| 130 | def _LogMessage(self, message): | 120 | def _LogMessage(self, message): |
| 131 | """Logs message to stderr and _git_event_log.""" | 121 | """Logs message to stderr and _git_event_log.""" |
| 132 | if self._print_messages: | 122 | if self._print_messages: |
diff --git a/manifest_xml.py b/manifest_xml.py index 7099d5fe..135c91fb 100644 --- a/manifest_xml.py +++ b/manifest_xml.py | |||
| @@ -507,6 +507,9 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 507 | if not d.remote or remote.orig_name != remoteName: | 507 | if not d.remote or remote.orig_name != remoteName: |
| 508 | remoteName = remote.orig_name | 508 | remoteName = remote.orig_name |
| 509 | e.setAttribute('remote', remoteName) | 509 | e.setAttribute('remote', remoteName) |
| 510 | revision = remote.revision or d.revisionExpr | ||
| 511 | if not revision or revision != self._superproject['revision']: | ||
| 512 | e.setAttribute('revision', self._superproject['revision']) | ||
| 510 | root.appendChild(e) | 513 | root.appendChild(e) |
| 511 | 514 | ||
| 512 | if self._contactinfo.bugurl != Wrapper().BUG_URL: | 515 | if self._contactinfo.bugurl != Wrapper().BUG_URL: |
| @@ -914,6 +917,13 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 914 | raise ManifestParseError("no remote for superproject %s within %s" % | 917 | raise ManifestParseError("no remote for superproject %s within %s" % |
| 915 | (name, self.manifestFile)) | 918 | (name, self.manifestFile)) |
| 916 | self._superproject['remote'] = remote.ToRemoteSpec(name) | 919 | self._superproject['remote'] = remote.ToRemoteSpec(name) |
| 920 | revision = node.getAttribute('revision') or remote.revision | ||
| 921 | if not revision: | ||
| 922 | revision = self._default.revisionExpr | ||
| 923 | if not revision: | ||
| 924 | raise ManifestParseError('no revision for superproject %s within %s' % | ||
| 925 | (name, self.manifestFile)) | ||
| 926 | self._superproject['revision'] = revision | ||
| 917 | if node.nodeName == 'contactinfo': | 927 | if node.nodeName == 'contactinfo': |
| 918 | bugurl = self._reqatt(node, 'bugurl') | 928 | bugurl = self._reqatt(node, 'bugurl') |
| 919 | # This element can be repeated, later entries will clobber earlier ones. | 929 | # This element can be repeated, later entries will clobber earlier ones. |
diff --git a/tests/test_git_superproject.py b/tests/test_git_superproject.py index e9b824d6..a24fc7f0 100644 --- a/tests/test_git_superproject.py +++ b/tests/test_git_superproject.py | |||
| @@ -157,7 +157,7 @@ class SuperprojectTestCase(unittest.TestCase): | |||
| 157 | """) | 157 | """) |
| 158 | self._superproject = git_superproject.Superproject(manifest, self.repodir, | 158 | self._superproject = git_superproject.Superproject(manifest, self.repodir, |
| 159 | self.git_event_log) | 159 | self.git_event_log) |
| 160 | with mock.patch.object(self._superproject, '_GetBranch', return_value='junk'): | 160 | with mock.patch.object(self._superproject, '_branch', 'junk'): |
| 161 | sync_result = self._superproject.Sync() | 161 | sync_result = self._superproject.Sync() |
| 162 | self.assertFalse(sync_result.success) | 162 | self.assertFalse(sync_result.success) |
| 163 | self.assertTrue(sync_result.fatal) | 163 | self.assertTrue(sync_result.fatal) |
diff --git a/tests/test_manifest_xml.py b/tests/test_manifest_xml.py index 20459d1d..ce422536 100644 --- a/tests/test_manifest_xml.py +++ b/tests/test_manifest_xml.py | |||
| @@ -572,6 +572,7 @@ class SuperProjectElementTests(ManifestParseTestCase): | |||
| 572 | self.assertEqual(manifest.superproject['name'], 'superproject') | 572 | self.assertEqual(manifest.superproject['name'], 'superproject') |
| 573 | self.assertEqual(manifest.superproject['remote'].name, 'test-remote') | 573 | self.assertEqual(manifest.superproject['remote'].name, 'test-remote') |
| 574 | self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject') | 574 | self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject') |
| 575 | self.assertEqual(manifest.superproject['revision'], 'refs/heads/main') | ||
| 575 | self.assertEqual( | 576 | self.assertEqual( |
| 576 | sort_attributes(manifest.ToXml().toxml()), | 577 | sort_attributes(manifest.ToXml().toxml()), |
| 577 | '<?xml version="1.0" ?><manifest>' | 578 | '<?xml version="1.0" ?><manifest>' |
| @@ -580,6 +581,72 @@ class SuperProjectElementTests(ManifestParseTestCase): | |||
| 580 | '<superproject name="superproject"/>' | 581 | '<superproject name="superproject"/>' |
| 581 | '</manifest>') | 582 | '</manifest>') |
| 582 | 583 | ||
| 584 | def test_superproject_revision(self): | ||
| 585 | """Check superproject settings with a different revision attribute""" | ||
| 586 | self.maxDiff = None | ||
| 587 | manifest = self.getXmlManifest(""" | ||
| 588 | <manifest> | ||
| 589 | <remote name="test-remote" fetch="http://localhost" /> | ||
| 590 | <default remote="test-remote" revision="refs/heads/main" /> | ||
| 591 | <superproject name="superproject" revision="refs/heads/stable" /> | ||
| 592 | </manifest> | ||
| 593 | """) | ||
| 594 | self.assertEqual(manifest.superproject['name'], 'superproject') | ||
| 595 | self.assertEqual(manifest.superproject['remote'].name, 'test-remote') | ||
| 596 | self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject') | ||
| 597 | self.assertEqual(manifest.superproject['revision'], 'refs/heads/stable') | ||
| 598 | self.assertEqual( | ||
| 599 | sort_attributes(manifest.ToXml().toxml()), | ||
| 600 | '<?xml version="1.0" ?><manifest>' | ||
| 601 | '<remote fetch="http://localhost" name="test-remote"/>' | ||
| 602 | '<default remote="test-remote" revision="refs/heads/main"/>' | ||
| 603 | '<superproject name="superproject" revision="refs/heads/stable"/>' | ||
| 604 | '</manifest>') | ||
| 605 | |||
| 606 | def test_superproject_revision_default_negative(self): | ||
| 607 | """Check superproject settings with a same revision attribute""" | ||
| 608 | self.maxDiff = None | ||
| 609 | manifest = self.getXmlManifest(""" | ||
| 610 | <manifest> | ||
| 611 | <remote name="test-remote" fetch="http://localhost" /> | ||
| 612 | <default remote="test-remote" revision="refs/heads/stable" /> | ||
| 613 | <superproject name="superproject" revision="refs/heads/stable" /> | ||
| 614 | </manifest> | ||
| 615 | """) | ||
| 616 | self.assertEqual(manifest.superproject['name'], 'superproject') | ||
| 617 | self.assertEqual(manifest.superproject['remote'].name, 'test-remote') | ||
| 618 | self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject') | ||
| 619 | self.assertEqual(manifest.superproject['revision'], 'refs/heads/stable') | ||
| 620 | self.assertEqual( | ||
| 621 | sort_attributes(manifest.ToXml().toxml()), | ||
| 622 | '<?xml version="1.0" ?><manifest>' | ||
| 623 | '<remote fetch="http://localhost" name="test-remote"/>' | ||
| 624 | '<default remote="test-remote" revision="refs/heads/stable"/>' | ||
| 625 | '<superproject name="superproject"/>' | ||
| 626 | '</manifest>') | ||
| 627 | |||
| 628 | def test_superproject_revision_remote(self): | ||
| 629 | """Check superproject settings with a same revision attribute""" | ||
| 630 | self.maxDiff = None | ||
| 631 | manifest = self.getXmlManifest(""" | ||
| 632 | <manifest> | ||
| 633 | <remote name="test-remote" fetch="http://localhost" revision="refs/heads/main" /> | ||
| 634 | <default remote="test-remote" /> | ||
| 635 | <superproject name="superproject" revision="refs/heads/stable" /> | ||
| 636 | </manifest> | ||
| 637 | """) | ||
| 638 | self.assertEqual(manifest.superproject['name'], 'superproject') | ||
| 639 | self.assertEqual(manifest.superproject['remote'].name, 'test-remote') | ||
| 640 | self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject') | ||
| 641 | self.assertEqual(manifest.superproject['revision'], 'refs/heads/stable') | ||
| 642 | self.assertEqual( | ||
| 643 | sort_attributes(manifest.ToXml().toxml()), | ||
| 644 | '<?xml version="1.0" ?><manifest>' | ||
| 645 | '<remote fetch="http://localhost" name="test-remote" revision="refs/heads/main"/>' | ||
| 646 | '<default remote="test-remote"/>' | ||
| 647 | '<superproject name="superproject" revision="refs/heads/stable"/>' | ||
| 648 | '</manifest>') | ||
| 649 | |||
| 583 | def test_remote(self): | 650 | def test_remote(self): |
| 584 | """Check superproject settings with a remote.""" | 651 | """Check superproject settings with a remote.""" |
| 585 | manifest = self.getXmlManifest(""" | 652 | manifest = self.getXmlManifest(""" |
| @@ -593,6 +660,7 @@ class SuperProjectElementTests(ManifestParseTestCase): | |||
| 593 | self.assertEqual(manifest.superproject['name'], 'platform/superproject') | 660 | self.assertEqual(manifest.superproject['name'], 'platform/superproject') |
| 594 | self.assertEqual(manifest.superproject['remote'].name, 'superproject-remote') | 661 | self.assertEqual(manifest.superproject['remote'].name, 'superproject-remote') |
| 595 | self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/platform/superproject') | 662 | self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/platform/superproject') |
| 663 | self.assertEqual(manifest.superproject['revision'], 'refs/heads/main') | ||
| 596 | self.assertEqual( | 664 | self.assertEqual( |
| 597 | sort_attributes(manifest.ToXml().toxml()), | 665 | sort_attributes(manifest.ToXml().toxml()), |
| 598 | '<?xml version="1.0" ?><manifest>' | 666 | '<?xml version="1.0" ?><manifest>' |
| @@ -613,6 +681,7 @@ class SuperProjectElementTests(ManifestParseTestCase): | |||
| 613 | """) | 681 | """) |
| 614 | self.assertEqual(manifest.superproject['name'], 'superproject') | 682 | self.assertEqual(manifest.superproject['name'], 'superproject') |
| 615 | self.assertEqual(manifest.superproject['remote'].name, 'default-remote') | 683 | self.assertEqual(manifest.superproject['remote'].name, 'default-remote') |
| 684 | self.assertEqual(manifest.superproject['revision'], 'refs/heads/main') | ||
| 616 | self.assertEqual( | 685 | self.assertEqual( |
| 617 | sort_attributes(manifest.ToXml().toxml()), | 686 | sort_attributes(manifest.ToXml().toxml()), |
| 618 | '<?xml version="1.0" ?><manifest>' | 687 | '<?xml version="1.0" ?><manifest>' |
