Revert of Make gclient ready for the Blink (DEPS to main project) transition (patchset #6 id:180001 of https://codereview.chromium.org/743083002/)

Reason for revert:
The test intoruced is flake (see crrev.com/753543006/).
Need to look into that with more patience as it reproduces only on precise.


Original issue's description:
> Make gclient ready for the Blink (DEPS to main project) transition
> 
> This CL makes gclient understand correctly whether a git project is
> being moved from DEPS to an upper project and vice-versa.
> The driving use case for this is the upcoming Blink merge, where
> third_party/Webkit will be removed from DEPS (and .gitignore) and will 
> become part of the main project.
> 
> At present state, gclient leaves the .git folder around when a project
> is removed from DEPS, and that causes many problems. 
> 
> Furthermore this CL solves the performance problem of bisecting across
> the merge point. The subproject's (Blink) .git/ folder is moved to a
> backup location (in the main checkout root) and is restored when moving
> backwards, avoiding a re-fetch when bisecting across the merge point. 
> 
> BUG=431469
> 
> Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=293329

TBR=iannucci@chromium.org,maruel@chromium.org,jochen@chromium.org
NOTREECHECKS=true
NOTRY=true
BUG=431469

Review URL: https://codereview.chromium.org/796053002

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@293352 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/gclient.py b/gclient.py
index 22a4eb9..f6db225 100755
--- a/gclient.py
+++ b/gclient.py
@@ -1542,18 +1542,23 @@
         # Fix path separator on Windows.
         entry_fixed = entry.replace('/', os.path.sep)
         e_dir = os.path.join(self.root_dir, entry_fixed)
+
+        def _IsParentOfAny(parent, path_list):
+          parent_plus_slash = parent + '/'
+          return any(
+              path[:len(parent_plus_slash)] == parent_plus_slash
+              for path in path_list)
+
         # Use entry and not entry_fixed there.
         if (entry not in entries and
             (not any(path.startswith(entry + '/') for path in entries)) and
             os.path.exists(e_dir)):
-          # The entry has been removed from DEPS.
           scm = gclient_scm.CreateSCM(
               prev_url, self.root_dir, entry_fixed, self.outbuf)
 
           # Check to see if this directory is now part of a higher-up checkout.
           # The directory might be part of a git OR svn checkout.
           scm_root = None
-          scm_class = None
           for scm_class in (gclient_scm.scm.GIT, gclient_scm.scm.SVN):
             try:
               scm_root = scm_class.GetCheckoutRoot(scm.checkout_path)
@@ -1566,45 +1571,9 @@
                             'determine whether it is part of a higher-level '
                             'checkout, so not removing.' % entry)
             continue
-
-          # This is to handle the case of third_party/WebKit migrating from
-          # being a DEPS entry to being part of the main project.
-          # If the subproject is a Git project, we need to remove its .git
-          # folder. Otherwise git operations on that folder will have different
-          # effects depending on the current working directory.
-          if scm_class == gclient_scm.scm.GIT and (
-              os.path.abspath(scm_root) == os.path.abspath(e_dir)):
-            e_par_dir = os.path.join(e_dir, os.pardir)
-            if scm_class.IsInsideWorkTree(e_par_dir):
-              par_scm_root = scm_class.GetCheckoutRoot(e_par_dir)
-              # rel_e_dir : relative path of entry w.r.t. its parent repo.
-              rel_e_dir = os.path.relpath(e_dir, par_scm_root)
-              if scm_class.IsDirectoryVersioned(par_scm_root, rel_e_dir):
-                save_dir = scm.GetGitBackupDirPath()
-                # Remove any eventual stale backup dir for the same project.
-                if os.path.exists(save_dir):
-                  gclient_utils.rmtree(save_dir)
-                os.rename(os.path.join(e_dir, '.git'), save_dir)
-                # When switching between the two states (entry/ is a subproject
-                # -> entry/ is part of the outer project), it is very likely
-                # that some files are changed in the checkout, unless we are
-                # jumping *exactly* across the commit which changed just DEPS.
-                # In such case we want to cleanup any eventual stale files
-                # (coming from the old subproject) in order to end up with a
-                # clean checkout.
-                scm_class.CleanupDir(par_scm_root, rel_e_dir)
-                assert not os.path.exists(os.path.join(e_dir, '.git'))
-                print(('\nWARNING: \'%s\' has been moved from DEPS to a higher '
-                       'level checkout. The git folder containing all the local'
-                       ' branches has been saved to %s.\n'
-                       'If you don\'t care about its state you can safely '
-                       'remove that folder to free up space.') %
-                      (entry, save_dir))
-                continue
-
           if scm_root in full_entries:
-            logging.info('%s is part of a higher level checkout, not removing',
-                         scm.GetCheckoutRoot())
+            logging.info('%s is part of a higher level checkout, not '
+                         'removing.', scm.GetCheckoutRoot())
             continue
 
           file_list = []
diff --git a/gclient_scm.py b/gclient_scm.py
index 583a263..e42f671 100644
--- a/gclient_scm.py
+++ b/gclient_scm.py
@@ -390,20 +390,6 @@
     if mirror:
       url = mirror.mirror_path
 
-    # If we are going to introduce a new project, there is a possibility that
-    # we are syncing back to a state where the project was originally a
-    # sub-project rolled by DEPS (realistic case: crossing the Blink merge point
-    # syncing backwards, when Blink was a DEPS entry and not part of src.git).
-    # In such case, we might have a backup of the former .git folder, which can
-    # be used to avoid re-fetching the entire repo again (useful for bisects).
-    backup_dir = self.GetGitBackupDirPath()
-    target_dir = os.path.join(self.checkout_path, '.git')
-    if os.path.exists(backup_dir) and not os.path.exists(target_dir):
-      gclient_utils.safe_makedirs(self.checkout_path)
-      os.rename(backup_dir, target_dir)
-      # Reset to a clean state
-      self._Run(['reset', '--hard', 'HEAD'], options)
-
     if (not os.path.exists(self.checkout_path) or
         (os.path.isdir(self.checkout_path) and
          not os.path.exists(os.path.join(self.checkout_path, '.git')))):
@@ -814,12 +800,6 @@
     base_url = self.url
     return base_url[:base_url.rfind('/')] + url
 
-  def GetGitBackupDirPath(self):
-    """Returns the path where the .git folder for the current project can be
-    staged/restored. Use case: subproject moved from DEPS <-> outer project."""
-    return os.path.join(self._root_dir,
-                        'old_' + self.relpath.replace(os.sep, '_')) + '.git'
-
   def _GetMirror(self, url, options):
     """Get a git_cache.Mirror object for the argument url."""
     if not git_cache.Mirror.GetCachePath():
diff --git a/scm.py b/scm.py
index 94b925e..9bc96bc 100644
--- a/scm.py
+++ b/scm.py
@@ -443,16 +443,6 @@
       return False
 
   @staticmethod
-  def IsDirectoryVersioned(cwd, relative_dir):
-    """Checks whether the given |relative_dir| is part of cwd's repo."""
-    return bool(GIT.Capture(['ls-tree', 'HEAD', relative_dir], cwd=cwd))
-
-  @staticmethod
-  def CleanupDir(cwd, relative_dir):
-    """Cleans up untracked file inside |relative_dir|."""
-    return bool(GIT.Capture(['clean', '-df', relative_dir], cwd=cwd))
-
-  @staticmethod
   def GetGitSvnHeadRev(cwd):
     """Gets the most recently pulled git-svn revision."""
     try:
diff --git a/testing_support/fake_repos.py b/testing_support/fake_repos.py
index 3f90844..1b77bc8 100755
--- a/testing_support/fake_repos.py
+++ b/testing_support/fake_repos.py
@@ -828,40 +828,6 @@
     })
 
 
-class FakeRepoBlinkDEPS(FakeReposBase):
-  """Simulates the Blink DEPS transition in Chrome."""
-
-  NB_GIT_REPOS = 2
-  DEPS_pre = 'deps = {"src/third_party/WebKit": "%(git_base)srepo_2",}'
-  DEPS_post = 'deps = {}'
-
-  def populateGit(self):
-    # Blink repo.
-    self._commit_git('repo_2', {
-        'OWNERS': 'OWNERS-pre',
-        'Source/exists_always': '_ignored_',
-        'Source/exists_before_but_not_after': '_ignored_',
-    })
-
-    # Chrome repo.
-    self._commit_git('repo_1', {
-        'DEPS': self.DEPS_pre % {'git_base': self.git_base},
-        'myfile': 'myfile@1',
-        '.gitignore': '/third_party/WebKit',
-    })
-    self._commit_git('repo_1', {
-        'DEPS': self.DEPS_post % {'git_base': self.git_base},
-        'myfile': 'myfile@2',
-        '.gitignore': '',
-        'third_party/WebKit/OWNERS': 'OWNERS-post',
-        'third_party/WebKit/Source/exists_always': '_ignored_',
-        'third_party/WebKit/Source/exists_after_but_not_before': '_ignored',
-    })
-
-  def populateSvn(self):
-    raise NotImplementedError()
-
-
 class FakeReposTestBase(trial_dir.TestCase):
   """This is vaguely inspired by twisted."""
   # Static FakeRepos instances. Lazy loaded.
diff --git a/tests/gclient_scm_test.py b/tests/gclient_scm_test.py
index 967d360..974aff0 100755
--- a/tests/gclient_scm_test.py
+++ b/tests/gclient_scm_test.py
@@ -1245,8 +1245,6 @@
     self.root_dir = '/tmp' if sys.platform != 'win32' else 't:\\tmp'
     self.relpath = 'fake'
     self.base_path = os.path.join(self.root_dir, self.relpath)
-    self.backup_base_path = os.path.join(self.root_dir,
-                                         'old_%s.git' % self.relpath)
 
   def tearDown(self):
     BaseTestCase.tearDown(self)
@@ -1356,7 +1354,6 @@
 
     gclient_scm.os.path.isdir(
         os.path.join(self.base_path, '.git', 'hooks')).AndReturn(False)
-    gclient_scm.os.path.exists(self.backup_base_path).AndReturn(False)
     gclient_scm.os.path.exists(self.base_path).AndReturn(True)
     gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
     gclient_scm.os.path.exists(os.path.join(self.base_path, '.git')
@@ -1387,7 +1384,6 @@
 
     gclient_scm.os.path.isdir(
         os.path.join(self.base_path, '.git', 'hooks')).AndReturn(False)
-    gclient_scm.os.path.exists(self.backup_base_path).AndReturn(False)
     gclient_scm.os.path.exists(self.base_path).AndReturn(True)
     gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
     gclient_scm.os.path.exists(os.path.join(self.base_path, '.git')
diff --git a/tests/gclient_smoketest.py b/tests/gclient_smoketest.py
index 31d5469..9c84fad 100755
--- a/tests/gclient_smoketest.py
+++ b/tests/gclient_smoketest.py
@@ -22,7 +22,7 @@
 
 from testing_support.fake_repos import join, write
 from testing_support.fake_repos import FakeReposTestBase, FakeRepoTransitive, \
-                                       FakeRepoSkiaDEPS, FakeRepoBlinkDEPS
+                                       FakeRepoSkiaDEPS
 
 import gclient_utils
 import scm as gclient_scm
@@ -1538,136 +1538,6 @@
                                              skia_src), src_git_url)
 
 
-class BlinkDEPSTransitionSmokeTest(GClientSmokeBase):
-  """Simulate the behavior of bisect bots as they transition across the Blink
-  DEPS change."""
-
-  FAKE_REPOS_CLASS = FakeRepoBlinkDEPS
-
-  def setUp(self):
-    super(BlinkDEPSTransitionSmokeTest, self).setUp()
-    self.enabled = self.FAKE_REPOS.set_up_git()
-    self.checkout_path = os.path.join(self.root_dir, 'src')
-    self.blink = os.path.join(self.checkout_path, 'third_party', 'WebKit')
-    self.blink_git_url = self.FAKE_REPOS.git_base + 'repo_2'
-    self.pre_merge_sha = self.githash('repo_1', 1)
-    self.post_merge_sha = self.githash('repo_1', 2)
-
-  def CheckStatusPreMergePoint(self):
-    self.assertEqual(gclient_scm.GIT.Capture(['config', 'remote.origin.url'],
-                                             self.blink), self.blink_git_url)
-    self.assertTrue(os.path.exists(join(self.blink, '.git')))
-    self.assertTrue(os.path.exists(join(self.blink, 'OWNERS')))
-    with open(join(self.blink, 'OWNERS')) as f:
-      owners_content = f.read()
-      self.assertEqual('OWNERS-pre', owners_content, 'OWNERS not updated')
-    self.assertTrue(os.path.exists(join(self.blink, 'Source', 'exists_always')))
-    self.assertTrue(os.path.exists(
-        join(self.blink, 'Source', 'exists_before_but_not_after')))
-    self.assertFalse(os.path.exists(
-        join(self.blink, 'Source', 'exists_after_but_not_before')))
-
-  def CheckStatusPostMergePoint(self):
-    # Check that the contents still exists
-    self.assertTrue(os.path.exists(join(self.blink, 'OWNERS')))
-    with open(join(self.blink, 'OWNERS')) as f:
-      owners_content = f.read()
-      self.assertEqual('OWNERS-post', owners_content, 'OWNERS not updated')
-    self.assertTrue(os.path.exists(join(self.blink, 'Source', 'exists_always')))
-    # Check that file removed between the branch point are actually deleted.
-    self.assertTrue(os.path.exists(
-        join(self.blink, 'Source', 'exists_after_but_not_before')))
-    self.assertFalse(os.path.exists(
-        join(self.blink, 'Source', 'exists_before_but_not_after')))
-    # But not the .git folder
-    self.assertFalse(os.path.exists(join(self.blink, '.git')))
-
-  def testBlinkDEPSChangeUsingGclient(self):
-    """Checks that {src,blink} repos are consistent when syncing going back and
-    forth using gclient sync src@revision."""
-    if not self.enabled:
-      return
-
-    self.gclient(['config', '--spec',
-        'solutions=['
-        '{"name": "src",'
-        ' "url": "' + self.git_base + 'repo_1",'
-        '}]'])
-
-    # Go back and forth two times.
-    for _ in xrange(2):
-      res = self.gclient(['sync', '--revision', 'src@%s' % self.pre_merge_sha])
-      self.assertEqual(res[2], 0, 'DEPS change sync failed.')
-      self.CheckStatusPreMergePoint()
-
-      res = self.gclient(['sync', '--revision', 'src@%s' % self.post_merge_sha])
-      self.assertEqual(res[2], 0, 'DEPS change sync failed.')
-      self.CheckStatusPostMergePoint()
-
-
-  def testBlinkDEPSChangeUsingGit(self):
-    """Like testBlinkDEPSChangeGit, but move the main project using directly
-    git and not gclient sync."""
-    if not self.enabled:
-      return
-
-    self.gclient(['config', '--spec',
-        'solutions=['
-        '{"name": "src",'
-        ' "url": "' + self.git_base + 'repo_1",'
-        ' "managed": False,'
-        '}]'])
-
-    # Perform an initial sync to bootstrap the repo.
-    res = self.gclient(['sync'])
-    self.assertEqual(res[2], 0, 'Initial gclient sync failed.')
-
-    # Go back and forth two times.
-    for _ in xrange(2):
-      subprocess2.check_call(['git', 'checkout', '-q', self.pre_merge_sha],
-                             cwd=self.checkout_path)
-      res = self.gclient(['sync'])
-      self.assertEqual(res[2], 0, 'gclient sync failed.')
-      self.CheckStatusPreMergePoint()
-
-      subprocess2.check_call(['git', 'checkout', '-q', self.post_merge_sha],
-                             cwd=self.checkout_path)
-      res = self.gclient(['sync'])
-      self.assertEqual(res[2], 0, 'DEPS change sync failed.')
-      self.CheckStatusPostMergePoint()
-
-
-  def testBlinkLocalBranchesArePreserved(self):
-    """Checks that the state of local git branches are effectively preserved
-    when going back and forth."""
-    if not self.enabled:
-      return
-
-    self.gclient(['config', '--spec',
-        'solutions=['
-        '{"name": "src",'
-        ' "url": "' + self.git_base + 'repo_1",'
-        '}]'])
-
-    # Initialize to pre-merge point.
-    self.gclient(['sync', '--revision', 'src@%s' % self.pre_merge_sha])
-    self.CheckStatusPreMergePoint()
-
-    # Create a branch named "foo".
-    subprocess2.check_call(['git', 'checkout', '-qB', 'foo'],
-                           cwd=self.blink)
-
-    # Cross the pre-merge point.
-    self.gclient(['sync', '--revision', 'src@%s' % self.post_merge_sha])
-    self.CheckStatusPostMergePoint()
-
-    # Go backwards and check that we still have the foo branch.
-    self.gclient(['sync', '--revision', 'src@%s' % self.pre_merge_sha])
-    self.CheckStatusPreMergePoint()
-    subprocess2.check_call(
-        ['git', 'show-ref', '-q', '--verify', 'refs/heads/foo'], cwd=self.blink)
-
-
 class GClientSmokeFromCheckout(GClientSmokeBase):
   # WebKit abuses this. It has a .gclient and a DEPS from a checkout.
   def setUp(self):
diff --git a/tests/scm_unittest.py b/tests/scm_unittest.py
index 15676aa..982a918 100755
--- a/tests/scm_unittest.py
+++ b/tests/scm_unittest.py
@@ -77,7 +77,6 @@
         'AssertVersion',
         'Capture',
         'CaptureStatus',
-        'CleanupDir',
         'current_version',
         'FetchUpstreamTuple',
         'GenerateDiff',
@@ -93,7 +92,6 @@
         'GetSha1ForSvnRev',
         'GetSVNBranch',
         'GetUpstreamBranch',
-        'IsDirectoryVersioned',
         'IsGitSvn',
         'IsInsideWorkTree',
         'IsValidRevision',