| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 # Copyright (C) 2008 Evan Martin <martine@danga.com> | 6 # Copyright (C) 2008 Evan Martin <martine@danga.com> |
| 7 | 7 |
| 8 """A git-command for integrating reviews on Rietveld.""" | 8 """A git-command for integrating reviews on Rietveld.""" |
| 9 | 9 |
| 10 from distutils.version import LooseVersion | 10 from distutils.version import LooseVersion |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 import subcommand | 57 import subcommand |
| 58 import subprocess2 | 58 import subprocess2 |
| 59 import watchlists | 59 import watchlists |
| 60 | 60 |
| 61 __version__ = '1.0' | 61 __version__ = '1.0' |
| 62 | 62 |
| 63 DEFAULT_SERVER = 'https://codereview.appspot.com' | 63 DEFAULT_SERVER = 'https://codereview.appspot.com' |
| 64 POSTUPSTREAM_HOOK_PATTERN = '.git/hooks/post-cl-%s' | 64 POSTUPSTREAM_HOOK_PATTERN = '.git/hooks/post-cl-%s' |
| 65 DESCRIPTION_BACKUP_FILE = '~/.git_cl_description_backup' | 65 DESCRIPTION_BACKUP_FILE = '~/.git_cl_description_backup' |
| 66 GIT_INSTRUCTIONS_URL = 'http://code.google.com/p/chromium/wiki/UsingGit' | 66 GIT_INSTRUCTIONS_URL = 'http://code.google.com/p/chromium/wiki/UsingGit' |
| 67 CHANGE_ID = 'Change-Id:' | |
| 68 REFS_THAT_ALIAS_TO_OTHER_REFS = { | 67 REFS_THAT_ALIAS_TO_OTHER_REFS = { |
| 69 'refs/remotes/origin/lkgr': 'refs/remotes/origin/master', | 68 'refs/remotes/origin/lkgr': 'refs/remotes/origin/master', |
| 70 'refs/remotes/origin/lkcr': 'refs/remotes/origin/master', | 69 'refs/remotes/origin/lkcr': 'refs/remotes/origin/master', |
| 71 } | 70 } |
| 72 | 71 |
| 73 # Valid extensions for files we want to lint. | 72 # Valid extensions for files we want to lint. |
| 74 DEFAULT_LINT_REGEX = r"(.*\.cpp|.*\.cc|.*\.h)" | 73 DEFAULT_LINT_REGEX = r"(.*\.cpp|.*\.cc|.*\.h)" |
| 75 DEFAULT_LINT_IGNORE_REGEX = r"$^" | 74 DEFAULT_LINT_IGNORE_REGEX = r"$^" |
| 76 | 75 |
| 77 # Shortcut since it quickly becomes redundant. | 76 # Shortcut since it quickly becomes redundant. |
| (...skipping 2124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2202 print "\nPatch titles (-t) are not supported in Gerrit. Aborting..." | 2201 print "\nPatch titles (-t) are not supported in Gerrit. Aborting..." |
| 2203 return 1 | 2202 return 1 |
| 2204 | 2203 |
| 2205 if options.squash: | 2204 if options.squash: |
| 2206 # Try to get the message from a previous upload. | 2205 # Try to get the message from a previous upload. |
| 2207 shadow_branch = 'refs/heads/git_cl_uploads/' + cl.GetBranch() | 2206 shadow_branch = 'refs/heads/git_cl_uploads/' + cl.GetBranch() |
| 2208 message = RunGitSilent(['show', '--format=%B', '-s', shadow_branch]) | 2207 message = RunGitSilent(['show', '--format=%B', '-s', shadow_branch]) |
| 2209 if not message: | 2208 if not message: |
| 2210 if not options.force: | 2209 if not options.force: |
| 2211 change_desc.prompt() | 2210 change_desc.prompt() |
| 2212 | |
| 2213 if CHANGE_ID not in change_desc.description: | |
| 2214 # Run the commit-msg hook without modifying the head commit by writing | |
| 2215 # the commit message to a temporary file and running the hook over it, | |
| 2216 # then reading the file back in. | |
| 2217 commit_msg_hook = os.path.join(settings.GetRoot(), '.git', 'hooks', | |
| 2218 'commit-msg') | |
| 2219 file_handle, msg_file = tempfile.mkstemp(text=True, | |
| 2220 prefix='commit_msg') | |
| 2221 logging.debug("%s %s", file_handle, msg_file) | |
| 2222 try: | |
| 2223 try: | |
| 2224 try: | |
| 2225 fileobj = os.fdopen(file_handle, 'w') | |
| 2226 except OSError: | |
| 2227 # if fdopen fails, file_handle remains open. | |
| 2228 # See https://docs.python.org/2/library/os.html#os.fdopen. | |
| 2229 os.close(file_handle) | |
| 2230 raise | |
| 2231 with fileobj: | |
| 2232 # This will close the file_handle. | |
| 2233 fileobj.write(change_desc.description) | |
| 2234 logging.debug("%s %s finish editing", file_handle, msg_file) | |
| 2235 finally: | |
| 2236 RunCommand([commit_msg_hook, msg_file]) | |
| 2237 change_desc.set_description(gclient_utils.FileRead(msg_file)) | |
| 2238 finally: | |
| 2239 os.remove(msg_file) | |
| 2240 | |
| 2241 if not change_desc.description: | 2211 if not change_desc.description: |
| 2242 print "Description is empty; aborting." | 2212 print "Description is empty; aborting." |
| 2243 return 1 | 2213 return 1 |
| 2244 | |
| 2245 message = change_desc.description | 2214 message = change_desc.description |
| 2215 change_ids = git_footers.get_footer_change_id(message) |
| 2216 if len(change_ids) > 1: |
| 2217 DieWithError('too many Change-Id footers in %s branch' % shadow_branch) |
| 2218 if not change_ids: |
| 2219 message = git_footers.add_footer_change_id( |
| 2220 message, GenerateGerritChangeId(message)) |
| 2221 change_desc.set_description(message) |
| 2246 | 2222 |
| 2247 remote, upstream_branch = cl.FetchUpstreamTuple(cl.GetBranch()) | 2223 remote, upstream_branch = cl.FetchUpstreamTuple(cl.GetBranch()) |
| 2248 if remote is '.': | 2224 if remote is '.': |
| 2249 # If our upstream branch is local, we base our squashed commit on its | 2225 # If our upstream branch is local, we base our squashed commit on its |
| 2250 # squashed version. | 2226 # squashed version. |
| 2251 parent = ('refs/heads/git_cl_uploads/' + | 2227 parent = ('refs/heads/git_cl_uploads/' + |
| 2252 scm.GIT.ShortBranchName(upstream_branch)) | 2228 scm.GIT.ShortBranchName(upstream_branch)) |
| 2253 | 2229 |
| 2254 # Verify that the upstream branch has been uploaded too, otherwise Gerrit | 2230 # Verify that the upstream branch has been uploaded too, otherwise Gerrit |
| 2255 # will create additional CLs when uploading. | 2231 # will create additional CLs when uploading. |
| (...skipping 1729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3985 if __name__ == '__main__': | 3961 if __name__ == '__main__': |
| 3986 # These affect sys.stdout so do it outside of main() to simplify mocks in | 3962 # These affect sys.stdout so do it outside of main() to simplify mocks in |
| 3987 # unit testing. | 3963 # unit testing. |
| 3988 fix_encoding.fix_encoding() | 3964 fix_encoding.fix_encoding() |
| 3989 colorama.init() | 3965 colorama.init() |
| 3990 try: | 3966 try: |
| 3991 sys.exit(main(sys.argv[1:])) | 3967 sys.exit(main(sys.argv[1:])) |
| 3992 except KeyboardInterrupt: | 3968 except KeyboardInterrupt: |
| 3993 sys.stderr.write('interrupted\n') | 3969 sys.stderr.write('interrupted\n') |
| 3994 sys.exit(1) | 3970 sys.exit(1) |
| OLD | NEW |