Add a --unmanaged flag to gclient config to allow the main solution to be unmanaged by the scm.

The dependencies will continue to be managed. A new flag is present in the .gclient file to control this behavior.

Review URL: http://codereview.chromium.org/7918027

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@102002 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/tests/gclient_scm_test.py b/tests/gclient_scm_test.py
index 2ea01fd..21da096 100755
--- a/tests/gclient_scm_test.py
+++ b/tests/gclient_scm_test.py
@@ -442,8 +442,8 @@
         ('________ found .hg directory; skipping %s\n' % self.relpath))
 
 
-class GitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
-                         unittest.TestCase):
+class BaseGitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
+                             unittest.TestCase):
   """This class doesn't use pymox."""
   class OptionsObject(object):
     def __init__(self, verbose=False, revision=None):
@@ -543,6 +543,8 @@
     unittest.TestCase.tearDown(self)
     rmtree(self.root_dir)
 
+
+class ManagedGitWrapperTestCase(BaseGitWrapperTestCase):
   def testDir(self):
     members = [
         'FullUrlForRelativeUrl', 'GetRevisionDate', 'RunCommand',
@@ -823,6 +825,64 @@
     self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
 
 
+class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
+  def testUpdateCheckout(self):
+    if not self.enabled:
+      return
+    options = self.Options(verbose=True)
+    root_dir = gclient_scm.os.path.realpath(tempfile.mkdtemp())
+    relpath = 'foo'
+    base_path = join(root_dir, relpath)
+    url = join(self.base_path, '.git')
+    try:
+      scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
+                                  relpath=relpath)
+      file_list = []
+      options.revision = 'unmanaged'
+      scm.update(options, (), file_list)
+      self.assertEquals(len(file_list), 2)
+      self.assert_(gclient_scm.os.path.isfile(join(base_path, 'a')))
+      self.assertEquals(scm.revinfo(options, (), None),
+                        '069c602044c5388d2d15c3f875b057c852003458')
+    finally:
+      rmtree(root_dir)
+    msg1 = (
+        "\n_____ foo at refs/heads/master\n\n"
+        "________ running 'git clone -b master --verbose %s %s' in '%s'\n"
+        "Initialized empty Git repository in %s\n") % (
+          join(self.root_dir, '.', '.git'),
+          join(root_dir, 'foo'),
+          root_dir,
+          join(gclient_scm.os.path.realpath(root_dir), 'foo', '.git') + '/')
+    msg2 = (
+        "\n_____ foo at refs/heads/master\n\n"
+        "________ running 'git clone -b master --verbose %s %s' in '%s'\n"
+        "Cloning into %s...\ndone.\n") % (
+          join(self.root_dir, '.', '.git'),
+          join(root_dir, 'foo'),
+          root_dir,
+          join(gclient_scm.os.path.realpath(root_dir), 'foo'))
+    out = sys.stdout.getvalue()
+    sys.stdout.close()
+    sys.stdout = self._old_stdout
+    self.assertTrue(out in (msg1, msg2), (out, msg1, msg2))
+
+  def testUpdateUpdate(self):
+    if not self.enabled:
+      return
+    options = self.Options()
+    expected_file_list = []
+    scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
+                                relpath=self.relpath)
+    file_list = []
+    options.revision = 'unmanaged'
+    scm.update(options, (), file_list)
+    self.assertEquals(file_list, expected_file_list)
+    self.assertEquals(scm.revinfo(options, (), None),
+                      '069c602044c5388d2d15c3f875b057c852003458')
+    self.checkstdout('________ unmanaged solution; skipping .\n')
+
+
 if __name__ == '__main__':
   if '-v' in sys.argv:
     logging.basicConfig(