Index: git_cl.py |
diff --git a/git_cl.py b/git_cl.py |
index 244259df3d5b8876c9e353b4d066dcabdba79ba3..99950320d6c76ca09e34173d0018feac84f431b3 100755 |
--- a/git_cl.py |
+++ b/git_cl.py |
@@ -92,33 +92,55 @@ def ask_for_data(prompt): |
sys.exit(1) |
+def git_set_branch_value(key, value): |
+ branch = Changelist().GetBranch() |
+ if branch: |
+ git_key = 'branch.%s.%s' % (branch, key) |
+ RunGit(['config', '--int', git_key, "%d" % value]) |
+ |
+ |
+def git_get_branch_default(key, default): |
+ branch = Changelist().GetBranch() |
+ if branch: |
+ git_key = 'branch.%s.%s' % (branch, key) |
+ (_, stdout) = RunGitWithCode(['config', '--int', '--get', git_key]) |
+ try: |
+ return int(stdout.strip()) |
+ except ValueError: |
+ pass |
+ return default |
+ |
+ |
def add_git_similarity(parser): |
parser.add_option( |
- '--similarity', metavar='SIM', type='int', action='store', default=None, |
+ '--similarity', metavar='SIM', type='int', action='store', |
help='Sets the percentage that a pair of files need to match in order to' |
' be considered copies (default 50)') |
+ parser.add_option( |
+ '--find-copies', action='store_true', |
+ help='Allows git to look for copies.') |
+ parser.add_option( |
+ '--no-find-copies', action='store_false', dest='find_copies', |
+ help='Disallows git from looking for copies.') |
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 |
+ options.similarity = git_get_branch_default('git-cl-similarity', 50) |
else: |
- if branch: |
- print('Note: Saving similarity of %d%% in git config.' |
- % options.similarity) |
- RunGit(['config', '--int', key, str(options.similarity)]) |
+ print('Note: Saving similarity of %d%% in git config.' |
+ % options.similarity) |
+ git_set_branch_value('git-cl-similarity', options.similarity) |
+ |
+ options.similarity = max(0, min(options.similarity, 100)) |
- options.similarity = max(1, min(options.similarity, 100)) |
+ if options.find_copies is None: |
+ options.find_copies = bool( |
+ git_get_branch_default('git-find-copies', True)) |
+ else: |
+ git_set_branch_value('git-find-copies', int(options.find_copies)) |
print('Using %d%% similarity for rename/copy detection. ' |
'Override with --similarity.' % options.similarity) |
@@ -169,7 +191,7 @@ def MatchSvnGlob(url, base_url, glob_spec, allow_wildcards): |
return None |
-def print_stats(similarity, args): |
+def print_stats(similarity, find_copies, 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 |
@@ -177,9 +199,16 @@ def print_stats(similarity, args): |
env = os.environ.copy() |
if 'GIT_EXTERNAL_DIFF' in env: |
del env['GIT_EXTERNAL_DIFF'] |
+ |
+ if find_copies: |
+ similarity_options = ['--find-copies-harder', '-l100000', |
+ '-C%s' % similarity] |
+ else: |
+ similarity_options = ['-M%s' % similarity] |
+ |
return subprocess2.call( |
- ['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder', |
- '-C%s' % similarity, '-l100000'] + args, env=env) |
+ ['git', 'diff', '--no-ext-diff', '--stat'] + similarity_options + args, |
+ env=env) |
class Settings(object): |
@@ -1073,6 +1102,8 @@ def RietveldUpload(options, args, cl): |
upload_args.extend(['--cc', cc]) |
upload_args.extend(['--git_similarity', str(options.similarity)]) |
+ if not options.find_copies: |
+ upload_args.extend(['--git_no_find_copies']) |
# Include the upstream repo's URL in the change -- this is useful for |
# projects that have their source spread across multiple repos. |
@@ -1176,7 +1207,7 @@ def CMDupload(parser, args): |
if not options.reviewers and hook_results.reviewers: |
options.reviewers = hook_results.reviewers |
- print_stats(options.similarity, args) |
+ print_stats(options.similarity, options.find_copies, args) |
if settings.GetIsGerrit(): |
return GerritUpload(options, args, cl) |
return RietveldUpload(options, args, cl) |
@@ -1310,7 +1341,7 @@ def SendUpstream(parser, args, cmd): |
branches = [base_branch, cl.GetBranchRef()] |
if not options.force: |
- print_stats(options.similarity, branches) |
+ print_stats(options.similarity, options.find_copies, 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 |