Index: git_cl.py |
diff --git a/git_cl.py b/git_cl.py |
index ef974d50f33f07faf2a5e7cb1049cc5813649d4c..2025835b6a21915b733293ad33804deb67ca0602 100755 |
--- a/git_cl.py |
+++ b/git_cl.py |
@@ -2148,6 +2148,36 @@ def AddChangeIdToCommitMessage(options, args): |
print >> sys.stderr, 'ERROR: Gerrit commit-msg hook not available.' |
+def GenerateGerritChangeId(message): |
+ """Returns Ixxxxxx...xxx change id. |
+ |
+ Works the same way as |
+ https://gerrit-review.googlesource.com/tools/hooks/commit-msg |
+ but can be called on demand on all platforms. |
+ |
+ The basic idea is to generate git hash of a state of the tree, original commit |
+ message, author/committer info and timestamps. |
+ """ |
+ lines = [] |
+ tree_hash = RunGitSilent(['write-tree']) |
+ lines.append('tree %s' % tree_hash.strip()) |
+ code, parent = RunGitWithCode(['rev-parse', 'HEAD~0'], suppress_stderr=False) |
+ if code == 0: |
+ lines.append('parent %s' % parent.strip()) |
+ author = RunGitSilent(['var', 'GIT_AUTHOR_IDENT']) |
+ lines.append('author %s' % author.strip()) |
+ committer = RunGitSilent(['var', 'GIT_COMMITTER_IDENT']) |
+ lines.append('committer %s' % committer.strip()) |
+ lines.append('') |
+ # Note: Gerrit's commit-hook actually cleans message of some lines and |
+ # whitespace. This code is not doing this, but it clearly won't decrease |
+ # entropy. |
+ lines.append(message) |
+ change_hash = RunCommand(['git', 'hash-object', '-t', 'commit', '--stdin'], |
+ stdin='\n'.join(lines)) |
+ return 'I%s' % change_hash.strip() |
+ |
+ |
def GerritUpload(options, args, cl, change): |
"""upload the current branch to gerrit.""" |
# We assume the remote called "origin" is the one we want. |