Chromium Code Reviews| Index: tools/push-to-trunk/common_includes.py |
| diff --git a/tools/push-to-trunk/common_includes.py b/tools/push-to-trunk/common_includes.py |
| index 7ea39f73c95e80c86e10eb960241dc3e7683b76d..1b45aaeb5d9d40261dfe94e4a2ab9ca5581cfd07 100644 |
| --- a/tools/push-to-trunk/common_includes.py |
| +++ b/tools/push-to-trunk/common_includes.py |
| @@ -296,6 +296,10 @@ class VCInterface(object): |
| # tag and commit are different remote commands, while in git we would commit |
| # and tag locally and then push/land in one unique step. |
| def Tag(self, tag): |
| + """Sets a tag for the current commit. |
| + |
| + Assumptions: The commit already landed and the commit message is unique. |
| + """ |
| raise NotImplementedError() |
| @@ -346,7 +350,7 @@ class GitSvnInterface(VCInterface): |
| self.step.GitSVNTag(tag) |
| -class GitReadOnlyMixin(VCInterface): |
| +class GitTagsOnlyMixin(VCInterface): |
| def Pull(self): |
| self.step.GitPull() |
| @@ -375,8 +379,41 @@ class GitReadOnlyMixin(VCInterface): |
| return "origin/%s" % name |
| return "origin/branch-heads/%s" % name |
| - |
| -class GitReadSvnWriteInterface(GitReadOnlyMixin, GitSvnInterface): |
| + def Tag(self, tag): |
| + # Title of the current commit (the local title and the title for committing |
| + # is the same in all merge and push scripts). |
| + title = self.step.GitLog(n=1, format="%s") |
| + |
| + # Find remote branch where current commit will appear. Assumes everything |
| + # to be merge-free (unique parents). |
| + branch = None |
| + hsh = "HEAD" |
| + while not branch: |
| + branch = self.step.GitRemoteContains(hsh) |
| + hsh += "^" |
|
agable
2014/09/29 09:49:11
Cute. Might be better to actually query Git for th
Michael Achenbach
2014/09/29 10:46:25
Done. Changed the semantics slightly as HEAD alway
|
| + |
| + # Wait for the commit to appear. Assumes unique commit message titles (this |
| + # is the case for all automated merge and push commits - also no title is |
| + # the prefix of another title). |
| + commit = None |
| + for wait_interval in [3, 5, 10, 30]: |
| + self.step.Git("fetch") |
| + commit = self.step.GitLog(n=1, format="%H", grep=title, branch=branch) |
|
agable
2014/09/29 09:49:11
This n=1 is dangerous -- what if two commits get r
Michael Achenbach
2014/09/29 10:46:25
But shouldn't the grep on the unique title take ca
|
| + if commit: |
| + break |
| + print("The commit is not replicated on git. Waiting for %s seconds." % |
|
agable
2014/09/29 09:49:11
nit: "...has not replicated to..."
Michael Achenbach
2014/09/29 10:46:25
Done.
|
| + wait_interval) |
| + self.step._side_effect_handler.Sleep(wait_interval) |
| + |
| + if not commit: |
| + self.step.Die("Couldn't determine commit for setting the tag. Maybe the " |
| + "git updater is lacking behind?") |
|
agable
2014/09/29 09:49:11
nit: "lagging"
agable
2014/09/29 09:49:11
nit: indentation
Michael Achenbach
2014/09/29 10:46:24
Done.
Michael Achenbach
2014/09/29 10:46:24
Done.
|
| + |
| + self.step.Git("tag %s %s" % (tag, commit)) |
|
agable
2014/09/29 09:49:11
The fact that this takes args as a single string i
Michael Achenbach
2014/09/29 10:46:24
I'm sad too. But I'll address this in a separate r
|
| + self.step.Git("push origin %s" % tag) |
| + |
| + |
| +class GitReadSvnWriteInterface(GitTagsOnlyMixin, GitSvnInterface): |
| pass |