Allow users of git cl to disable git copy detection entirely.

Depends on rietveld cl: https://codereview.appspot.com/6726050/
BUG=155511

Review URL: https://chromiumcodereview.appspot.com/11195012

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@163092 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/tests/git_cl_test.py b/tests/git_cl_test.py
index 3ca0f2b..56b9b30 100755
--- a/tests/git_cl_test.py
+++ b/tests/git_cl_test.py
@@ -93,11 +93,12 @@
     return result
 
   @classmethod
-  def _upload_calls(cls, similarity):
-    return cls._git_base_calls(similarity) + cls._git_upload_calls()
+  def _upload_calls(cls, similarity, find_copies):
+    return (cls._git_base_calls(similarity, find_copies) +
+            cls._git_upload_calls())
 
   @staticmethod
-  def _git_base_calls(similarity):
+  def _git_base_calls(similarity, find_copies):
     if similarity is None:
       similarity = '50'
       similarity_call = ((['git', 'config', '--int', '--get',
@@ -105,11 +106,31 @@
     else:
       similarity_call = ((['git', 'config', '--int',
                          'branch.master.git-cl-similarity', similarity],), '')
+
+    if find_copies is None:
+      find_copies = True
+      find_copies_call = ((['git', 'config', '--int', '--get',
+                          'branch.master.git-find-copies'],), '')
+    else:
+      val = str(int(find_copies))
+      find_copies_call = ((['git', 'config', '--int',
+                          'branch.master.git-find-copies', val],), '')
+
+    if find_copies:
+      stat_call = ((['git', 'diff', '--no-ext-diff', '--stat',
+                   '--find-copies-harder', '-l100000', '-C'+similarity,
+                   'master...'],), '+dat')
+    else:
+      stat_call = ((['git', 'diff', '--no-ext-diff', '--stat',
+                   '-M'+similarity, 'master...'],), '+dat')
+
     return [
       ((['git', 'config', 'gerrit.host'],), ''),
       ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'),
       ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
       similarity_call,
+      ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
+      find_copies_call,
       ((['git', 'update-index', '--refresh', '-q'],), ''),
       ((['git', 'diff-index', 'HEAD'],), ''),
       ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
@@ -123,9 +144,7 @@
       ((['git', 'config', 'branch.master.rietveldpatchset'],), ''),
       ((['git', 'log', '--pretty=format:%s%n%n%b', 'master...'],), 'foo'),
       ((['git', 'config', 'user.email'],), 'me@example.com'),
-      ((['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder',
-         '-C'+similarity, '-l100000', 'master...'],),
-       '+dat'),
+      stat_call,
       ((['git', 'log', '--pretty=format:%s\n\n%b', 'master..'],), 'desc\n'),
     ]
 
@@ -157,6 +176,9 @@
       ((['git', 'config', '--int', '--get',
         'branch.working.git-cl-similarity'],), ''),
       ((['git', 'symbolic-ref', 'HEAD'],), 'refs/heads/working'),
+      ((['git', 'config', '--int', '--get',
+        'branch.working.git-find-copies'],), ''),
+      ((['git', 'symbolic-ref', 'HEAD'],), 'refs/heads/working'),
       ((['git', 'config', 'branch.working.merge'],), 'refs/heads/master'),
       ((['git', 'config', 'branch.working.remote'],), 'origin'),
       ((['git', 'rev-list', '--merges',
@@ -205,7 +227,7 @@
   def _dcommit_calls_3(cls):
     return [
       ((['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder',
-         '-C50', '-l100000', 'refs/remotes/origin/master',
+         '-l100000', '-C50', 'refs/remotes/origin/master',
          'refs/heads/working'],),
        (' PRESUBMIT.py |    2 +-\n'
         ' 1 files changed, 1 insertions(+), 1 deletions(-)\n')),
@@ -229,7 +251,7 @@
   ]
 
   @staticmethod
-  def _cmd_line(description, args, similarity):
+  def _cmd_line(description, args, similarity, find_copies):
     """Returns the upload command line passed to upload.RealMain()."""
     return [
         'upload', '--assume_yes', '--server',
@@ -237,7 +259,8 @@
         '--message', description
     ] + args + [
         '--cc', 'joe@example.com',
-        '--git_similarity', similarity or '50',
+        '--git_similarity', similarity or '50'
+    ] + (['--git_no_find_copies'] if find_copies == False else []) + [
         'master...'
     ]
 
@@ -253,7 +276,15 @@
       similarity = upload_args[upload_args.index('--similarity')+1]
     except ValueError:
       similarity = None
-    self.calls = self._upload_calls(similarity)
+
+    if '--find-copies' in upload_args:
+      find_copies = True
+    elif '--no-find-copies' in upload_args:
+      find_copies = False
+    else:
+      find_copies = None
+
+    self.calls = self._upload_calls(similarity, find_copies)
     def RunEditor(desc, _):
       self.assertEquals(
           '# Enter a description of the change.\n'
@@ -264,7 +295,8 @@
       return returned_description
     self.mock(git_cl.gclient_utils, 'RunEditor', RunEditor)
     def check_upload(args):
-      cmd_line = self._cmd_line(final_description, reviewers, similarity)
+      cmd_line = self._cmd_line(final_description, reviewers, similarity,
+                                find_copies)
       self.assertEquals(cmd_line, args)
       return 1, 2
     self.mock(git_cl.upload, 'RealMain', check_upload)
@@ -286,6 +318,14 @@
         'desc\n\nBUG=\n',
         [])
 
+  def test_keep_find_copies(self):
+    self._run_reviewer_test(
+        ['--no-find-copies'],
+        'desc\n\nBUG=\n',
+        '# Blah blah comment.\ndesc\n\nBUG=\n',
+        'desc\n\nBUG=\n',
+        [])
+
   def test_reviewers_cmd_line(self):
     # Reviewer is passed as-is
     description = 'desc\n\nR=foo@example.com\nBUG=\n'
@@ -337,7 +377,7 @@
 
     mock = FileMock()
     try:
-      self.calls = self._git_base_calls(None)
+      self.calls = self._git_base_calls(None, None)
       def RunEditor(desc, _):
         return desc
       self.mock(git_cl.gclient_utils, 'RunEditor', RunEditor)
@@ -371,6 +411,9 @@
         ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
         ((['git', 'config', '--int', '--get',
           'branch.master.git-cl-similarity'],), ''),
+        ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
+        ((['git', 'config', '--int', '--get',
+          'branch.master.git-find-copies'],), ''),
         ((['git', 'update-index', '--refresh', '-q'],), ''),
         ((['git', 'diff-index', 'HEAD'],), ''),
         ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
@@ -385,7 +428,7 @@
         ((['git', 'log', '--pretty=format:%s%n%n%b', 'master...'],), 'foo'),
         ((['git', 'config', 'user.email'],), 'me@example.com'),
         ((['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder',
-           '-C50', '-l100000', 'master...'],),
+           '-l100000', '-C50', 'master...'],),
          '+dat'),
         ]