Index: git_cl.py |
diff --git a/git_cl.py b/git_cl.py |
index 6c7afe48f50d4ce1a42dfdd338b2f05ce1b7f357..acd04a57af4bddebaefd66e69df71682fe7d04fc 100755 |
--- a/git_cl.py |
+++ b/git_cl.py |
@@ -92,6 +92,41 @@ def ask_for_data(prompt): |
sys.exit(1) |
+def add_git_similarity(parser): |
+ parser.add_option( |
+ '--similarity', metavar='SIM', type='int', action='store', default=None, |
+ help='Sets the percentage that a pair of files need to match in order to' |
+ ' be considered copies (default 50)') |
+ |
+ old_parser_args = parser.parse_args |
+ def Parse(args): |
+ options, args = old_parser_args(args) |
+ |
+ branch = Changelist().GetBranch() |
+ key = 'branch.%s.git-cl-similarity' % branch |
+ if options.similarity is None: |
+ if branch: |
+ (_, stdout) = RunGitWithCode(['config', '--int', '--get', key]) |
+ try: |
+ options.similarity = int(stdout.strip()) |
+ except ValueError: |
+ pass |
+ options.similarity = options.similarity or 50 |
+ else: |
+ if branch: |
+ print('Note: Saving similarity of %d%% in git config.' |
+ % options.similarity) |
+ RunGit(['config', '--int', key, str(options.similarity)]) |
+ |
+ options.similarity = max(1, min(options.similarity, 100)) |
+ |
+ print('Using %d%% similarity for rename/copy detection. ' |
+ 'Override with --similarity.' % options.similarity) |
+ |
+ return options, args |
+ parser.parse_args = Parse |
+ |
+ |
def MatchSvnGlob(url, base_url, glob_spec, allow_wildcards): |
"""Return the corresponding git ref if |base_url| together with |glob_spec| |
matches the full |url|. |
@@ -134,7 +169,7 @@ def MatchSvnGlob(url, base_url, glob_spec, allow_wildcards): |
return None |
-def print_stats(args): |
+def print_stats(similarity, args): |
"""Prints statistics about the change to the user.""" |
# --no-ext-diff is broken in some versions of Git, so try to work around |
# this by overriding the environment (but there is still a problem if the |
@@ -144,7 +179,7 @@ def print_stats(args): |
del env['GIT_EXTERNAL_DIFF'] |
return subprocess2.call( |
['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder', |
- '-l100000'] + args, env=env) |
+ '-C%s' % similarity, '-l100000'] + args, env=env) |
class Settings(object): |
@@ -1037,6 +1072,8 @@ def RietveldUpload(options, args, cl): |
if cc: |
upload_args.extend(['--cc', cc]) |
+ upload_args.extend(['--git_similarity', str(options.similarity)]) |
+ |
# Include the upstream repo's URL in the change -- this is useful for |
# projects that have their source spread across multiple repos. |
remote_url = cl.GetGitBaseUrlFromConfig() |
@@ -1103,6 +1140,7 @@ def CMDupload(parser, args): |
if settings.GetIsGerrit(): |
parser.add_option('--target_branch', dest='target_branch', default='master', |
help='target branch to upload') |
+ add_git_similarity(parser) |
(options, args) = parser.parse_args(args) |
# Print warning if the user used the -m/--message argument. This will soon |
@@ -1138,7 +1176,7 @@ def CMDupload(parser, args): |
if not options.reviewers and hook_results.reviewers: |
options.reviewers = hook_results.reviewers |
- print_stats(args) |
+ print_stats(options.similarity, args) |
if settings.GetIsGerrit(): |
return GerritUpload(options, args, cl) |
return RietveldUpload(options, args, cl) |
@@ -1170,6 +1208,7 @@ def SendUpstream(parser, args, cmd): |
help="external contributor for patch (appended to " + |
"description and used as author for git). Should be " + |
"formatted as 'First Last <email@example.com>'") |
+ add_git_similarity(parser) |
(options, args) = parser.parse_args(args) |
cl = Changelist() |
@@ -1271,7 +1310,7 @@ def SendUpstream(parser, args, cmd): |
branches = [base_branch, cl.GetBranchRef()] |
if not options.force: |
- print_stats(branches) |
+ print_stats(options.similarity, branches) |
ask_for_data('About to commit; enter to confirm.') |
# We want to squash all this branch's commits into one commit with the proper |
@@ -1320,6 +1359,7 @@ def SendUpstream(parser, args, cmd): |
else: |
# dcommit the merge branch. |
retcode, output = RunGitWithCode(['svn', 'dcommit', |
+ '-C%s' % options.similarity, |
'--no-rebase', '--rmdir']) |
finally: |
# And then swap back to the original branch and clean up. |