blob: a0b6d2864b942b407e6b71c842ccf4904278f715 [file] [log] [blame]
maruel@chromium.org45d8db02011-03-31 20:43:56 +00001#!/usr/bin/env python
steveblock@chromium.org93567042012-02-15 01:02:26 +00002# Copyright (c) 2012 The Chromium Authors. All rights reserved.
maruel@chromium.orgba551772010-02-03 18:21:42 +00003# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
msb@chromium.orge28e4982009-09-25 20:51:45 +00005
6"""Unit tests for gclient_scm.py."""
7
maruel@chromium.org428342a2011-11-10 15:46:33 +00008# pylint: disable=E1103
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00009
maruel@chromium.orgba551772010-02-03 18:21:42 +000010# Import before super_mox to keep valid references.
maruel@chromium.orgba551772010-02-03 18:21:42 +000011from shutil import rmtree
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000012from subprocess import Popen, PIPE, STDOUT
maruel@chromium.org428342a2011-11-10 15:46:33 +000013
14import logging
15import os
szager@chromium.orgfe0d1902014-04-08 20:50:44 +000016import re
maruel@chromium.org428342a2011-11-10 15:46:33 +000017import sys
msb@chromium.orge28e4982009-09-25 20:51:45 +000018import tempfile
maruel@chromium.org389d6de2010-09-09 14:14:37 +000019import unittest
msb@chromium.orge28e4982009-09-25 20:51:45 +000020
maruel@chromium.org428342a2011-11-10 15:46:33 +000021sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
maruel@chromium.orgba551772010-02-03 18:21:42 +000022
maruel@chromium.org0927b7e2011-11-11 16:06:22 +000023from testing_support.super_mox import mox, StdoutCheck, SuperMoxTestBase
24from testing_support.super_mox import TestCaseUtils
maruel@chromium.org428342a2011-11-10 15:46:33 +000025
msb@chromium.orge28e4982009-09-25 20:51:45 +000026import gclient_scm
maruel@chromium.orgfae707b2011-09-15 18:57:58 +000027import subprocess2
maruel@chromium.org96913eb2010-06-01 16:22:47 +000028
maruel@chromium.org795a8c12010-10-05 19:54:29 +000029# Shortcut since this function is used often
30join = gclient_scm.os.path.join
31
szager@chromium.orgfe0d1902014-04-08 20:50:44 +000032TIMESTAMP_RE = re.compile('\[[0-9]{1,2}:[0-9]{2}:[0-9]{2}\] (.*)', re.DOTALL)
33def strip_timestamps(value):
34 lines = value.splitlines(True)
35 for i in xrange(len(lines)):
36 m = TIMESTAMP_RE.match(lines[i])
37 if m:
38 lines[i] = m.group(1)
39 return ''.join(lines)
maruel@chromium.org96913eb2010-06-01 16:22:47 +000040
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +000041# Access to a protected member XXX of a client class
42# pylint: disable=W0212
43
44
maruel@chromium.org389d6de2010-09-09 14:14:37 +000045class GCBaseTestCase(object):
maruel@chromium.org96913eb2010-06-01 16:22:47 +000046 def assertRaisesError(self, msg, fn, *args, **kwargs):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000047 """Like unittest's assertRaises() but checks for Gclient.Error."""
maruel@chromium.org428342a2011-11-10 15:46:33 +000048 # pylint: disable=E1101
maruel@chromium.org96913eb2010-06-01 16:22:47 +000049 try:
50 fn(*args, **kwargs)
51 except gclient_scm.gclient_utils.Error, e:
52 self.assertEquals(e.args[0], msg)
53 else:
54 self.fail('%s not raised' % msg)
msb@chromium.orge28e4982009-09-25 20:51:45 +000055
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000056
maruel@chromium.org389d6de2010-09-09 14:14:37 +000057class BaseTestCase(GCBaseTestCase, SuperMoxTestBase):
58 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000059 SuperMoxTestBase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000060 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter')
61 self.mox.StubOutWithMock(gclient_scm.gclient_utils,
62 'CheckCallAndFilterAndHeader')
63 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
64 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
digit@chromium.orgdc112ac2013-04-24 13:00:19 +000065 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'rmtree')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000066 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +000067 self.mox.StubOutWithMock(gclient_scm.scm.SVN, '_CaptureInfo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000068 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
69 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
maruel@chromium.orgfae707b2011-09-15 18:57:58 +000070 self.mox.StubOutWithMock(subprocess2, 'communicate')
71 self.mox.StubOutWithMock(subprocess2, 'Popen')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000072 self._scm_wrapper = gclient_scm.CreateSCM
maruel@chromium.org389d6de2010-09-09 14:14:37 +000073 gclient_scm.scm.SVN.current_version = None
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +000074 self._original_SVNBinaryExists = gclient_scm.SVNWrapper.BinaryExists
75 self._original_GitBinaryExists = gclient_scm.GitWrapper.BinaryExists
76 gclient_scm.SVNWrapper.BinaryExists = staticmethod(lambda : True)
77 gclient_scm.GitWrapper.BinaryExists = staticmethod(lambda : True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +000078 # Absolute path of the fake checkout directory.
79 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000080
81 def tearDown(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000082 SuperMoxTestBase.tearDown(self)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +000083 gclient_scm.SVNWrapper.BinaryExists = self._original_SVNBinaryExists
84 gclient_scm.GitWrapper.BinaryExists = self._original_GitBinaryExists
maruel@chromium.org389d6de2010-09-09 14:14:37 +000085
86
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000087class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000088 class OptionsObject(object):
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +000089 def __init__(self, verbose=False, revision=None, force=False):
msb@chromium.orge28e4982009-09-25 20:51:45 +000090 self.verbose = verbose
91 self.revision = revision
92 self.manually_grab_svn_rev = True
93 self.deps_os = None
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +000094 self.force = force
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000095 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000096 self.nohooks = False
maruel@chromium.org36ac2392011-10-12 16:36:11 +000097 # TODO(maruel): Test --jobs > 1.
98 self.jobs = 1
steveblock@chromium.org98e69452012-02-16 16:36:43 +000099 self.delete_unversioned_trees = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000100
szager@chromium.orgfe0d1902014-04-08 20:50:44 +0000101 def checkstdout(self, expected):
102 value = sys.stdout.getvalue()
103 sys.stdout.close()
104 # pylint: disable=E1101
105 self.assertEquals(expected, strip_timestamps(value))
106
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000107 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000108 return self.OptionsObject(*args, **kwargs)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000109
msb@chromium.orge28e4982009-09-25 20:51:45 +0000110 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000111 BaseTestCase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000112 self.url = self.SvnUrl()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000113
msb@chromium.orge28e4982009-09-25 20:51:45 +0000114 def testUnsupportedSCM(self):
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000115 args = ['gopher://foo', self.root_dir, self.relpath]
116 exception_msg = 'No SCM found for url gopher://foo'
117 self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000118
msb@chromium.orge6f78352010-01-13 17:05:33 +0000119 def testSVNFullUrlForRelativeUrl(self):
120 self.url = 'svn://a/b/c/d'
121
122 self.mox.ReplayAll()
123 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
124 relpath=self.relpath)
125 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
126
127 def testGITFullUrlForRelativeUrl(self):
128 self.url = 'git://a/b/c/d'
129
130 self.mox.ReplayAll()
131 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
132 relpath=self.relpath)
133 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
134
igorgatis@gmail.com4e075672011-11-21 16:35:08 +0000135 def testGITFakeHttpUrl(self):
136 self.url = 'git+http://foo'
137
138 self.mox.ReplayAll()
139 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
140 relpath=self.relpath)
141 self.assertEqual(scm.url, 'http://foo')
142
143 def testGITFakeHttpsUrl(self):
144 self.url = 'git+https://foo'
145
146 self.mox.ReplayAll()
147 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
148 relpath=self.relpath)
149 self.assertEqual(scm.url, 'https://foo')
150
msb@chromium.orge28e4982009-09-25 20:51:45 +0000151 def testRunCommandException(self):
152 options = self.Options(verbose=False)
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000153 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000154
msb@chromium.orge28e4982009-09-25 20:51:45 +0000155 self.mox.ReplayAll()
156 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
157 relpath=self.relpath)
158 exception = "Unsupported argument(s): %s" % ','.join(self.args)
159 self.assertRaisesError(exception, scm.RunCommand,
160 'update', options, self.args)
161
162 def testRunCommandUnknown(self):
163 # TODO(maruel): if ever used.
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000164 pass
msb@chromium.orge28e4982009-09-25 20:51:45 +0000165
166 def testRevertMissing(self):
167 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000168 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000169 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000170 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
171 ).AndReturn('1.5.1')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000172 # It'll to a checkout instead.
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000173 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000174 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000175 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000176 parent = gclient_scm.os.path.dirname(self.base_path)
177 gclient_scm.os.path.exists(parent).AndReturn(False)
178 gclient_scm.os.makedirs(parent)
179 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000180 files_list = self.mox.CreateMockAnything()
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000181 gclient_scm.scm.SVN.RunAndGetFileList(
182 options.verbose,
183 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
184 cwd=self.root_dir,
185 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000186
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000187 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
188 ).AndReturn({'Revision': 100})
189
msb@chromium.orge28e4982009-09-25 20:51:45 +0000190 self.mox.ReplayAll()
191 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
192 relpath=self.relpath)
193 scm.revert(options, self.args, files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000194 self.checkstdout(
szager@chromium.orgfe0d1902014-04-08 20:50:44 +0000195 ('_____ %s is missing, synching instead\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000196
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000197 def testRevertNoDotSvn(self):
198 options = self.Options(verbose=True, force=True)
199 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
200 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(False)
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000201 gclient_scm.os.path.isdir(join(self.base_path, '.git')).AndReturn(False)
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000202 gclient_scm.os.path.isdir(join(self.base_path, '.hg')).AndReturn(False)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000203 # Checkout.
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000204 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000205 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000206 parent = gclient_scm.os.path.dirname(self.base_path)
207 gclient_scm.os.path.exists(parent).AndReturn(False)
208 gclient_scm.os.makedirs(parent)
209 gclient_scm.os.path.exists(parent).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000210 files_list = self.mox.CreateMockAnything()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000211 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
212 ).AndReturn('1.6')
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000213 gclient_scm.scm.SVN.RunAndGetFileList(
214 options.verbose,
215 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
216 cwd=self.root_dir,
217 file_list=files_list)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000218 gclient_scm.gclient_utils.rmtree(self.base_path)
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000219 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
220 ).AndReturn({'Revision': 100})
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000221 self.mox.ReplayAll()
222 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
223 relpath=self.relpath)
224 scm.revert(options, self.args, files_list)
225 self.checkstdout(
226 '\n_____ %s is not a valid svn checkout, synching instead\n' %
227 self.relpath)
228
msb@chromium.orge28e4982009-09-25 20:51:45 +0000229 def testRevertNone(self):
230 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000231 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000232 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000233 gclient_scm.scm.SVN.CaptureStatus(
234 None, self.base_path, no_ignore=False).AndReturn([])
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000235 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000236 gclient_scm.scm.SVN.RunAndGetFileList(
237 options.verbose,
238 ['update', '--revision', 'BASE', '--ignore-externals'],
239 cwd=self.base_path,
240 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000241
242 self.mox.ReplayAll()
243 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
244 relpath=self.relpath)
245 file_list = []
246 scm.revert(options, self.args, file_list)
247
msb@chromium.orge28e4982009-09-25 20:51:45 +0000248 def testRevertDirectory(self):
249 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000250 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000251 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000252 items = [
253 ('~ ', 'a'),
254 ]
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000255 gclient_scm.scm.SVN.CaptureStatus(
256 None, self.base_path, no_ignore=False).AndReturn(items)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000257 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000258 gclient_scm.os.path.exists(file_path).AndReturn(True)
259 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000260 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000261 gclient_scm.os.path.isdir(file_path).AndReturn(True)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000262 gclient_scm.gclient_utils.rmtree(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000263 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000264 gclient_scm.scm.SVN.RunAndGetFileList(
265 options.verbose,
266 ['update', '--revision', 'BASE', '--ignore-externals'],
267 cwd=self.base_path,
268 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000269
270 self.mox.ReplayAll()
271 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
272 relpath=self.relpath)
273 file_list2 = []
274 scm.revert(options, self.args, file_list2)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000275 self.checkstdout(('%s\n' % file_path))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000276
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000277 def testRevertDot(self):
278 self.mox.StubOutWithMock(gclient_scm.SVNWrapper, 'update')
279 options = self.Options(verbose=True)
280 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
281 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
282 items = [
283 ('~ ', '.'),
284 ]
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000285 gclient_scm.scm.SVN.CaptureStatus(
286 None, self.base_path, no_ignore=False).AndReturn(items)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000287 # gclient_utils.rmtree() doesn't work on path ending with '.', like 'foo/.'.
maruel@chromium.org62087572012-04-24 23:16:28 +0000288 file_path = self.base_path
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000289 gclient_scm.os.path.exists(file_path).AndReturn(True)
290 gclient_scm.os.path.isfile(file_path).AndReturn(False)
291 gclient_scm.os.path.islink(file_path).AndReturn(False)
292 gclient_scm.os.path.isdir(file_path).AndReturn(True)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000293 gclient_scm.gclient_utils.rmtree(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000294 # pylint: disable=E1120
maruel@chromium.org428342a2011-11-10 15:46:33 +0000295 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000296 gclient_scm.SVNWrapper.update(options, [], ['.'])
297
298 self.mox.ReplayAll()
299 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
300 relpath=self.relpath)
301 file_list2 = []
302 scm.revert(options, self.args, file_list2)
maruel@chromium.org62087572012-04-24 23:16:28 +0000303 self.checkstdout(('%s\n' % os.path.join(file_path, '.')))
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000304
msb@chromium.orge28e4982009-09-25 20:51:45 +0000305 def testStatus(self):
306 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000307 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000308 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000309 options.verbose,
310 ['status'] + self.args + ['--ignore-externals'],
311 cwd=self.base_path,
312 file_list=[]).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000313
314 self.mox.ReplayAll()
315 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
316 relpath=self.relpath)
317 file_list = []
318 self.assertEqual(scm.status(options, self.args, file_list), None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000319
320 # TODO(maruel): TEST REVISIONS!!!
321 # TODO(maruel): TEST RELOCATE!!!
322 def testUpdateCheckout(self):
323 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000324 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000325 file_info.root = 'blah'
326 file_info.url = self.url
327 file_info.uuid = 'ABC'
328 file_info.revision = 42
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000329 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000330 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000331 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000332 parent = gclient_scm.os.path.dirname(self.base_path)
333 gclient_scm.os.path.exists(parent).AndReturn(False)
334 gclient_scm.os.makedirs(parent)
335 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000336 files_list = self.mox.CreateMockAnything()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000337 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
338 ).AndReturn('1.5.1')
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000339 gclient_scm.scm.SVN.RunAndGetFileList(
340 options.verbose,
341 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
342 cwd=self.root_dir,
343 file_list=files_list)
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000344 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
345 ).AndReturn({'Revision': 100})
msb@chromium.orge28e4982009-09-25 20:51:45 +0000346 self.mox.ReplayAll()
347 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
348 relpath=self.relpath)
349 scm.update(options, (), files_list)
350
351 def testUpdateUpdate(self):
352 options = self.Options(verbose=True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000353 options.force = True
354 options.nohooks = False
355 file_info = {
356 'Repository Root': 'blah',
357 'URL': self.url,
358 'UUID': 'ABC',
359 'Revision': 42,
360 }
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000361 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
borenet@google.comb09097a2014-04-09 19:09:08 +0000362 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
363 gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000364 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000365
msb@chromium.orge28e4982009-09-25 20:51:45 +0000366 # Checkout or update.
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000367 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000368 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000369
370 # Verify no locked files.
371 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
372
msb@chromium.orge28e4982009-09-25 20:51:45 +0000373 # Cheat a bit here.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000374 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
375 ).AndReturn(file_info)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000376
377 # _AddAdditionalUpdateFlags()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000378 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
379 ).AndReturn('1.5.1')
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000380
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000381 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
382 ).AndReturn({'Revision': 100})
383
msb@chromium.orge28e4982009-09-25 20:51:45 +0000384 additional_args = []
385 if options.manually_grab_svn_rev:
386 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000387 additional_args.extend(['--force', '--ignore-externals'])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000388 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000389 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000390 options.verbose,
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000391 ['update', self.base_path] + additional_args,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000392 cwd=self.root_dir, file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000393
394 self.mox.ReplayAll()
395 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
396 relpath=self.relpath)
397 scm.update(options, (), files_list)
398
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000399 def testUpdateReset(self):
400 options = self.Options(verbose=True)
401 options.reset = True
402 file_info = {
403 'Repository Root': 'blah',
404 'URL': self.url,
405 'UUID': 'ABC',
406 'Revision': 42,
407 }
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000408 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
borenet@google.comb09097a2014-04-09 19:09:08 +0000409 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
410 gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000411 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
412
413 # Checkout or update.
414 dotted_path = join(self.base_path, '.')
415 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
416
417 # Create an untracked file and directory.
418 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
419 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
420
421 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
422 ).AndReturn(file_info)
423
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000424 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
425 ).AndReturn({'Revision': 100})
426
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000427 self.mox.ReplayAll()
428 files_list = []
429 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
430 relpath=self.relpath)
431 scm.update(options, (), files_list)
szager@chromium.orgfe0d1902014-04-08 20:50:44 +0000432 self.checkstdout('_____ %s at 42\n' % self.relpath)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000433
434 def testUpdateResetDeleteUnversionedTrees(self):
435 options = self.Options(verbose=True)
436 options.reset = True
437 options.delete_unversioned_trees = True
438
439 file_info = {
440 'Repository Root': 'blah',
441 'URL': self.url,
442 'UUID': 'ABC',
443 'Revision': 42,
444 }
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000445 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
borenet@google.comb09097a2014-04-09 19:09:08 +0000446 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
447 gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000448 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
449
450 # Checkout or update.
451 dotted_path = join(self.base_path, '.')
452 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
453
454 # Create an untracked file and directory.
455 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
456 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
457
458 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
459 ).AndReturn(file_info)
460
461 # Confirm that the untracked file is removed.
462 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path
463 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
464 gclient_scm.os.path.isdir(join(self.base_path, 'dir')).AndReturn(True)
465 gclient_scm.os.path.isdir(join(self.base_path, 'file')).AndReturn(False)
466 gclient_scm.os.path.islink(join(self.base_path, 'dir')).AndReturn(False)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000467 gclient_scm.gclient_utils.rmtree(join(self.base_path, 'dir'))
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000468
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000469 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
470 ).AndReturn({'Revision': 100})
471
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000472 self.mox.ReplayAll()
473 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
474 relpath=self.relpath)
475 files_list = []
476 scm.update(options, (), files_list)
477 self.checkstdout(
szager@chromium.orgfe0d1902014-04-08 20:50:44 +0000478 ('_____ %s at 42\n'
479 '_____ removing unversioned directory dir\n') % self.relpath)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000480
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000481 def testUpdateSingleCheckout(self):
482 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000483 file_info = {
484 'URL': self.url,
485 'Revision': 42,
486 }
tony@chromium.org57564662010-04-14 02:35:12 +0000487
488 # Checks to make sure that we support svn co --depth.
489 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000490 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
491 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000492 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
493 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000494
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000495 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000496 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000497 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000498
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000499 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000500 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000501 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000502 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000503 always=True,
504 cwd=self.root_dir)
505 gclient_scm.scm.SVN.RunAndGetFileList(
506 options.verbose,
507 ['update', 'DEPS', '--ignore-externals'],
508 cwd=self.base_path,
509 file_list=files_list)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000510
511 # Now we fall back on scm.update().
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000512 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
borenet@google.comb09097a2014-04-09 19:09:08 +0000513 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
514 gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000515 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000516 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
517 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
518 ).AndReturn(file_info)
tony@chromium.org57564662010-04-14 02:35:12 +0000519
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000520 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
521 ).AndReturn({'Revision': 100})
522
tony@chromium.org57564662010-04-14 02:35:12 +0000523 self.mox.ReplayAll()
524 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
525 relpath=self.relpath)
526 scm.updatesingle(options, ['DEPS'], files_list)
szager@chromium.orgfe0d1902014-04-08 20:50:44 +0000527 self.checkstdout('_____ %s at 42\n' % self.relpath)
tony@chromium.org57564662010-04-14 02:35:12 +0000528
529 def testUpdateSingleCheckoutSVN14(self):
530 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000531
532 # Checks to make sure that we support svn co --depth.
533 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000534 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
535 ).AndReturn('1.4.4')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000536 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org57564662010-04-14 02:35:12 +0000537
538 # When checking out a single file with svn 1.4, we use svn export
539 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000540 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000541 ['svn', 'export', join(self.url, 'DEPS'), join(self.base_path, 'DEPS')],
scottmg@chromium.orgf547c802013-09-27 17:55:26 +0000542 always=True, cwd=self.root_dir)
tony@chromium.org57564662010-04-14 02:35:12 +0000543
544 self.mox.ReplayAll()
545 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
546 relpath=self.relpath)
547 scm.updatesingle(options, ['DEPS'], files_list)
548
549 def testUpdateSingleCheckoutSVNUpgrade(self):
550 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000551 file_info = {
552 'URL': self.url,
553 'Revision': 42,
554 }
555
556 # Checks to make sure that we support svn co --depth.
557 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000558 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
559 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000560 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000561 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
562 # the old DEPS file.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000563 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(True)
564 gclient_scm.os.remove(join(self.base_path, 'DEPS'))
tony@chromium.org57564662010-04-14 02:35:12 +0000565
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000566 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000567 gclient_scm.scm.SVN.CaptureStatus(
568 None, join(self.base_path, '.')).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000569
tony@chromium.org57564662010-04-14 02:35:12 +0000570 # When checking out a single file, we issue an svn checkout and svn update.
571 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000572 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000573 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000574 always=True,
575 cwd=self.root_dir)
576 gclient_scm.scm.SVN.RunAndGetFileList(
577 options.verbose,
578 ['update', 'DEPS', '--ignore-externals'],
579 cwd=self.base_path,
580 file_list=files_list)
tony@chromium.org57564662010-04-14 02:35:12 +0000581
582 # Now we fall back on scm.update().
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000583 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
borenet@google.comb09097a2014-04-09 19:09:08 +0000584 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
585 gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000586 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000587 gclient_scm.scm.SVN._CaptureInfo(
588 [], join(self.base_path, ".")).AndReturn(file_info)
589 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
590 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000591
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000592 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
593 ).AndReturn({'Revision': 100})
594
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000595 self.mox.ReplayAll()
596 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
597 relpath=self.relpath)
598 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000599 self.checkstdout(
szager@chromium.orgfe0d1902014-04-08 20:50:44 +0000600 ('_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000601
602 def testUpdateSingleUpdate(self):
603 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000604 file_info = {
605 'URL': self.url,
606 'Revision': 42,
607 }
tony@chromium.org57564662010-04-14 02:35:12 +0000608 # Checks to make sure that we support svn co --depth.
609 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000610 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
611 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000612 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000613
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000614 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000615 gclient_scm.scm.SVN.CaptureStatus(None, join(self.base_path, '.')
616 ).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000617
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000618 # Now we fall back on scm.update().
619 files_list = self.mox.CreateMockAnything()
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000620 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
borenet@google.comb09097a2014-04-09 19:09:08 +0000621 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
622 gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000623 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000624 gclient_scm.scm.SVN._CaptureInfo(
625 [], join(self.base_path, '.')).AndReturn(file_info)
626 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
627 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000628
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000629 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
630 ).AndReturn({'Revision': 100})
631
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000632 self.mox.ReplayAll()
633 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
634 relpath=self.relpath)
635 scm.updatesingle(options, ['DEPS'], files_list)
szager@chromium.orgfe0d1902014-04-08 20:50:44 +0000636 self.checkstdout('_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000637
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000638 def testUpdateGit(self):
thakis@chromium.org0a0e3102014-01-17 16:57:09 +0000639 options = self.Options(verbose=True)
borenet@google.comb09097a2014-04-09 19:09:08 +0000640 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.hg')
641 gclient_scm.os.path.exists(file_path).AndReturn(False)
642 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
643 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
644 gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
645 error = gclient_scm.subprocess2.CalledProcessError(
646 1, 'cmd', '/cwd', 'stdout', 'stderr')
647 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.').AndRaise(error)
648
649 gclient_scm.os.path.exists(self.root_dir).AndReturn(True)
650 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
651 ).AndReturn('1.5.1')
652 gclient_scm.scm.SVN.RunAndGetFileList(
653 options.verbose,
654 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
655 cwd=self.root_dir,
656 file_list=[])
657
658 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
659 ).AndReturn({'Revision': 100})
660
661 self.mox.ReplayAll()
662 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
663 relpath=self.relpath)
664 scm.update(options, None, [])
665
666 def testUpdateGitForce(self):
667 options = self.Options(verbose=True, force=True)
668 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.hg')
669 gclient_scm.os.path.exists(file_path).AndReturn(False)
670 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
671 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
672 gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
673 error = gclient_scm.subprocess2.CalledProcessError(
674 1, 'cmd', '/cwd', 'stdout', 'stderr')
675 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.').AndRaise(error)
676 gclient_scm.os.path.exists(self.root_dir).AndReturn(True)
677 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
678 ).AndReturn('1.5.1')
679 gclient_scm.scm.SVN.RunAndGetFileList(
680 options.verbose,
681 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
682 cwd=self.root_dir,
683 file_list=[])
684
685 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
686 ).AndReturn({'Revision': 100})
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000687
thakis@chromium.org0a0e3102014-01-17 16:57:09 +0000688 self.mox.ReplayAll()
689 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
690 relpath=self.relpath)
691 file_list = []
borenet@google.comb09097a2014-04-09 19:09:08 +0000692 scm.update(options, None, file_list)
693
694 def testUpdateGitSvn(self):
695 options = self.Options(verbose=True)
696 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.hg')
697 gclient_scm.os.path.exists(file_path).AndReturn(False)
698 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
699 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
700 gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(True)
701 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'Capture', True)
702 gclient_scm.scm.GIT.Capture(['config', '--local', '--get',
703 'svn-remote.svn.url'],
704 cwd=self.base_path).AndReturn(self.url)
705
706 self.mox.ReplayAll()
707 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
708 relpath=self.relpath)
709 file_list = []
710 scm.update(options, [], file_list)
thakis@chromium.org0a0e3102014-01-17 16:57:09 +0000711 self.checkstdout(
borenet@google.comb09097a2014-04-09 19:09:08 +0000712 ('\n_____ %s looks like a git-svn checkout. Skipping.\n' % self.relpath)
713 )
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000714
715 def testUpdateHg(self):
716 options = self.Options(verbose=True)
szager@chromium.org6c2b49d2014-02-26 23:57:38 +0000717 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(True)
718
719 self.mox.ReplayAll()
720 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
721 relpath=self.relpath)
722 file_list = []
723 scm.update(options, self.args, file_list)
724 self.checkstdout(
725 ('________ found .hg directory; skipping %s\n' % self.relpath))
thakis@chromium.org0a0e3102014-01-17 16:57:09 +0000726
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000727 def testGetUsableRevSVN(self):
728 # pylint: disable=E1101
729 options = self.Options(verbose=True)
730
731 # Mock SVN revision validity checking.
732 self.mox.StubOutWithMock(
733 gclient_scm.scm.SVN, 'IsValidRevision', True)
734 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 1)
735 ).AndReturn(True)
736 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 'fake')
737 ).AndReturn(False)
738
739 self.mox.ReplayAll()
740
741 svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir)
742 # With an SVN checkout, 1 an example of a valid usable rev.
743 self.assertEquals(svn_scm.GetUsableRev(1, options), 1)
744 # With an SVN checkout, a fake or unknown rev should raise an excpetion.
745 self.assertRaises(gclient_scm.gclient_utils.Error,
746 svn_scm.GetUsableRev, 'fake', options)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000747
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000748class BaseGitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
749 unittest.TestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000750 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000751 class OptionsObject(object):
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000752 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000753 self.verbose = verbose
754 self.revision = revision
755 self.manually_grab_svn_rev = True
756 self.deps_os = None
757 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000758 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000759 self.nohooks = False
iannucci@chromium.orgd4fffee2013-06-28 00:35:26 +0000760 self.upstream = False
iannucci@chromium.org53456aa2013-07-03 19:38:34 +0000761 self.cache_dir = None
bauerb@chromium.org4dd09372011-07-22 14:41:51 +0000762 self.merge = False
bratell@opera.com18fa4542013-05-21 13:30:46 +0000763 self.jobs = 1
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000764 self.delete_unversioned_trees = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000765
766 sample_git_import = """blob
767mark :1
768data 6
769Hello
770
771blob
772mark :2
773data 4
774Bye
775
776reset refs/heads/master
777commit refs/heads/master
778mark :3
779author Bob <bob@example.com> 1253744361 -0700
780committer Bob <bob@example.com> 1253744361 -0700
781data 8
782A and B
783M 100644 :1 a
784M 100644 :2 b
785
786blob
787mark :4
788data 10
789Hello
790You
791
792blob
793mark :5
794data 8
795Bye
796You
797
798commit refs/heads/origin
799mark :6
800author Alice <alice@example.com> 1253744424 -0700
801committer Alice <alice@example.com> 1253744424 -0700
802data 13
803Personalized
804from :3
805M 100644 :4 a
806M 100644 :5 b
807
bauerb@chromium.org30c46d62014-01-23 12:11:56 +0000808blob
809mark :7
810data 5
811Mooh
812
813commit refs/heads/feature
814mark :8
815author Bob <bob@example.com> 1390311986 -0000
816committer Bob <bob@example.com> 1390311986 -0000
817data 6
818Add C
819from :3
820M 100644 :7 c
821
msb@chromium.orge28e4982009-09-25 20:51:45 +0000822reset refs/heads/master
823from :3
824"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000825 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000826 return self.OptionsObject(*args, **kwargs)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000827
szager@chromium.orgfe0d1902014-04-08 20:50:44 +0000828 def checkstdout(self, expected):
829 value = sys.stdout.getvalue()
830 sys.stdout.close()
831 # pylint: disable=E1101
832 self.assertEquals(expected, strip_timestamps(value))
833
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000834 @staticmethod
835 def CreateGitRepo(git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000836 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000837 try:
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000838 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000839 cwd=path).communicate()
840 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000841 # git is not available, skip this test.
842 return False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000843 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
844 stderr=STDOUT, cwd=path).communicate(input=git_import)
845 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
846 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000847 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000848 stderr=STDOUT, cwd=path).communicate()
849 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
850 stderr=STDOUT, cwd=path).communicate()
851 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
852 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000853 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000854 stderr=STDOUT, cwd=path).communicate()
iannucci@chromium.org1e7187a2013-02-17 20:54:05 +0000855 Popen(['git', 'config', 'user.email', 'someuser@chromium.org'], stdout=PIPE,
856 stderr=STDOUT, cwd=path).communicate()
857 Popen(['git', 'config', 'user.name', 'Some User'], stdout=PIPE,
858 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000859 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000860
bauerb@chromium.org30c46d62014-01-23 12:11:56 +0000861 def _GetAskForDataCallback(self, expected_prompt, return_value):
862 def AskForData(prompt, options):
863 self.assertEquals(prompt, expected_prompt)
864 return return_value
865 return AskForData
866
msb@chromium.orge28e4982009-09-25 20:51:45 +0000867 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000868 TestCaseUtils.setUp(self)
869 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000870 self.url = 'git://foo'
871 self.root_dir = tempfile.mkdtemp()
872 self.relpath = '.'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000873 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000874 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000875 StdoutCheck.setUp(self)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000876 self._original_GitBinaryExists = gclient_scm.GitWrapper.BinaryExists
877 self._original_SVNBinaryExists = gclient_scm.SVNWrapper.BinaryExists
878 gclient_scm.GitWrapper.BinaryExists = staticmethod(lambda : True)
879 gclient_scm.SVNWrapper.BinaryExists = staticmethod(lambda : True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000880
881 def tearDown(self):
maruel@chromium.org1a60dca2013-11-26 14:06:26 +0000882 try:
883 rmtree(self.root_dir)
884 StdoutCheck.tearDown(self)
885 TestCaseUtils.tearDown(self)
886 unittest.TestCase.tearDown(self)
887 finally:
888 # TODO(maruel): Use auto_stub.TestCase.
889 gclient_scm.GitWrapper.BinaryExists = self._original_GitBinaryExists
890 gclient_scm.SVNWrapper.BinaryExists = self._original_SVNBinaryExists
891
msb@chromium.orge28e4982009-09-25 20:51:45 +0000892
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000893class ManagedGitWrapperTestCase(BaseGitWrapperTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000894
895 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000896 if not self.enabled:
897 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000898 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000899 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000900 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
901 relpath=self.relpath)
902 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000903 scm.update(options, None, file_list)
904 gclient_scm.os.remove(file_path)
905 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000906 scm.revert(options, self.args, file_list)
907 self.assertEquals(file_list, [file_path])
908 file_list = []
909 scm.diff(options, self.args, file_list)
910 self.assertEquals(file_list, [])
szager@google.com85d3e3a2011-10-07 17:12:00 +0000911 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000912
913 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000914 if not self.enabled:
915 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000916 options = self.Options()
917 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
918 relpath=self.relpath)
919 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000920 scm.update(options, None, file_list)
921 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000922 scm.revert(options, self.args, file_list)
923 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000924 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000925 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000926 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000927
928 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000929 if not self.enabled:
930 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000931 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000932 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
933 relpath=self.relpath)
934 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000935 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000936 file_path = join(self.base_path, 'a')
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000937 open(file_path, 'a').writelines('touched\n')
938 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000939 scm.revert(options, self.args, file_list)
940 self.assertEquals(file_list, [file_path])
941 file_list = []
942 scm.diff(options, self.args, file_list)
943 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000944 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000945 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000946 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000947
948 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000949 if not self.enabled:
950 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000951 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000952 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
953 relpath=self.relpath)
954 file_list = []
955 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000956 file_path = join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000957 f = open(file_path, 'w')
958 f.writelines('new\n')
959 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000960 Popen(['git', 'add', 'c'], stdout=PIPE,
961 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000962 file_list = []
963 scm.revert(options, self.args, file_list)
964 self.assertEquals(file_list, [file_path])
965 file_list = []
966 scm.diff(options, self.args, file_list)
967 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000968 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000969 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000970 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000971
972 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000973 if not self.enabled:
974 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000975 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000976 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000977 open(file_path, 'a').writelines('touched\n')
978 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
979 relpath=self.relpath)
980 file_list = []
981 scm.status(options, self.args, file_list)
982 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000983 self.checkstdout(
szager@chromium.orgfe0d1902014-04-08 20:50:44 +0000984 ('running \'git diff --name-status '
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000985 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000986 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000987
988 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000989 if not self.enabled:
990 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000991 options = self.Options()
992 expected_file_list = []
993 for f in ['a', 'b']:
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000994 file_path = join(self.base_path, f)
995 open(file_path, 'a').writelines('touched\n')
996 expected_file_list.extend([file_path])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000997 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
998 relpath=self.relpath)
999 file_list = []
1000 scm.status(options, self.args, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001001 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +00001002 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001003 self.checkstdout(
szager@chromium.orgfe0d1902014-04-08 20:50:44 +00001004 ('running \'git diff --name-status '
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001005 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001006 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +00001007
msb@chromium.orge28e4982009-09-25 20:51:45 +00001008 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +00001009 if not self.enabled:
1010 return
msb@chromium.orge28e4982009-09-25 20:51:45 +00001011 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001012 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +00001013 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1014 relpath=self.relpath)
1015 file_list = []
1016 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +00001017 self.assertEquals(file_list, expected_file_list)
1018 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +00001019 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +00001020 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +00001021
bauerb@chromium.org30c46d62014-01-23 12:11:56 +00001022 def testUpdateMerge(self):
1023 if not self.enabled:
1024 return
1025 options = self.Options()
1026 options.merge = True
1027 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1028 relpath=self.relpath)
1029 scm._Run(['checkout', '-q', 'feature'], options)
1030 rev = scm.revinfo(options, (), None)
1031 file_list = []
1032 scm.update(options, (), file_list)
1033 self.assertEquals(file_list, [join(self.base_path, x)
1034 for x in ['a', 'b', 'c']])
1035 # The actual commit that is created is unstable, so we verify its tree and
1036 # parents instead.
1037 self.assertEquals(scm._Capture(['rev-parse', 'HEAD:']),
1038 'd2e35c10ac24d6c621e14a1fcadceb533155627d')
1039 self.assertEquals(scm._Capture(['rev-parse', 'HEAD^1']), rev)
1040 self.assertEquals(scm._Capture(['rev-parse', 'HEAD^2']),
1041 scm._Capture(['rev-parse', 'origin/master']))
1042 sys.stdout.close()
1043
1044 def testUpdateRebase(self):
1045 if not self.enabled:
1046 return
1047 options = self.Options()
1048 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1049 relpath=self.relpath)
1050 scm._Run(['checkout', '-q', 'feature'], options)
1051 file_list = []
1052 # Fake a 'y' key press.
1053 scm._AskForData = self._GetAskForDataCallback(
1054 'Cannot fast-forward merge, attempt to rebase? '
1055 '(y)es / (q)uit / (s)kip : ', 'y')
1056 scm.update(options, (), file_list)
1057 self.assertEquals(file_list, [join(self.base_path, x)
1058 for x in ['a', 'b', 'c']])
1059 # The actual commit that is created is unstable, so we verify its tree and
1060 # parent instead.
1061 self.assertEquals(scm._Capture(['rev-parse', 'HEAD:']),
1062 'd2e35c10ac24d6c621e14a1fcadceb533155627d')
1063 self.assertEquals(scm._Capture(['rev-parse', 'HEAD^']),
1064 scm._Capture(['rev-parse', 'origin/master']))
1065 sys.stdout.close()
1066
steveblock@chromium.org98e69452012-02-16 16:36:43 +00001067 def testUpdateReset(self):
1068 if not self.enabled:
1069 return
1070 options = self.Options()
1071 options.reset = True
1072
1073 dir_path = join(self.base_path, 'c')
1074 os.mkdir(dir_path)
1075 open(join(dir_path, 'nested'), 'w').writelines('new\n')
1076
1077 file_path = join(self.base_path, 'file')
1078 open(file_path, 'w').writelines('new\n')
1079
1080 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1081 relpath=self.relpath)
1082 file_list = []
1083 scm.update(options, (), file_list)
1084 self.assert_(gclient_scm.os.path.isdir(dir_path))
1085 self.assert_(gclient_scm.os.path.isfile(file_path))
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +00001086 sys.stdout.close()
steveblock@chromium.org98e69452012-02-16 16:36:43 +00001087
1088 def testUpdateResetDeleteUnversionedTrees(self):
1089 if not self.enabled:
1090 return
1091 options = self.Options()
1092 options.reset = True
1093 options.delete_unversioned_trees = True
1094
1095 dir_path = join(self.base_path, 'dir')
1096 os.mkdir(dir_path)
1097 open(join(dir_path, 'nested'), 'w').writelines('new\n')
1098
1099 file_path = join(self.base_path, 'file')
1100 open(file_path, 'w').writelines('new\n')
1101
1102 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1103 relpath=self.relpath)
1104 file_list = []
1105 scm.update(options, (), file_list)
1106 self.assert_(not gclient_scm.os.path.isdir(dir_path))
1107 self.assert_(gclient_scm.os.path.isfile(file_path))
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +00001108 sys.stdout.close()
steveblock@chromium.org98e69452012-02-16 16:36:43 +00001109
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +00001110 def testUpdateUnstagedConflict(self):
1111 if not self.enabled:
1112 return
1113 options = self.Options()
1114 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1115 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001116 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001117 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001118 try:
1119 scm.update(options, (), [])
1120 self.fail()
maruel@chromium.orgfae707b2011-09-15 18:57:58 +00001121 except (gclient_scm.gclient_utils.Error, subprocess2.CalledProcessError):
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001122 # The exact exception text varies across git versions so it's not worth
1123 # verifying it. It's fine as long as it throws.
1124 pass
1125 # Manually flush stdout since we can't verify it's content accurately across
1126 # git versions.
1127 sys.stdout.getvalue()
1128 sys.stdout.close()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +00001129
msb@chromium.org5bde4852009-12-14 16:47:12 +00001130 def testUpdateConflict(self):
1131 if not self.enabled:
1132 return
1133 options = self.Options()
1134 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1135 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001136 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001137 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001138 scm._Run(['commit', '-am', 'test'], options)
bauerb@chromium.org30c46d62014-01-23 12:11:56 +00001139 scm._AskForData = self._GetAskForDataCallback(
1140 'Cannot fast-forward merge, attempt to rebase? '
1141 '(y)es / (q)uit / (s)kip : ', 'y')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001142 exception = ('Conflict while rebasing this branch.\n'
1143 'Fix the conflict and run gclient again.\n'
1144 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001145 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org1a60dca2013-11-26 14:06:26 +00001146 exception = ('\n____ . at refs/remotes/origin/master\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001147 '\tYou have unstaged changes.\n'
1148 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001149 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +00001150 sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +00001151
msb@chromium.org0f282062009-11-06 20:14:02 +00001152 def testRevinfo(self):
1153 if not self.enabled:
1154 return
1155 options = self.Options()
1156 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1157 relpath=self.relpath)
1158 rev_info = scm.revinfo(options, (), None)
1159 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
1160
msb@chromium.orge28e4982009-09-25 20:51:45 +00001161
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001162class ManagedGitWrapperTestCaseMox(BaseTestCase):
1163 class OptionsObject(object):
1164 def __init__(self, verbose=False, revision=None, force=False):
1165 self.verbose = verbose
1166 self.revision = revision
1167 self.deps_os = None
1168 self.force = force
1169 self.reset = False
1170 self.nohooks = False
1171 # TODO(maruel): Test --jobs > 1.
1172 self.jobs = 1
1173
1174 def Options(self, *args, **kwargs):
1175 return self.OptionsObject(*args, **kwargs)
1176
borenet@google.comb09097a2014-04-09 19:09:08 +00001177 def checkstdout(self, expected):
1178 value = sys.stdout.getvalue()
1179 sys.stdout.close()
1180 # pylint: disable=E1101
1181 self.assertEquals(expected, strip_timestamps(value))
1182
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001183 def setUp(self):
1184 BaseTestCase.setUp(self)
1185 self.fake_hash_1 = 't0ta11yf4k3'
1186 self.fake_hash_2 = '3v3nf4k3r'
1187 self.url = 'git://foo'
maruel@chromium.org97170132013-05-08 14:58:34 +00001188 self.root_dir = '/tmp' if sys.platform != 'win32' else 't:\\tmp'
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001189 self.relpath = 'fake'
1190 self.base_path = os.path.join(self.root_dir, self.relpath)
1191
1192 def tearDown(self):
1193 BaseTestCase.tearDown(self)
1194
1195 def testGetUsableRevGit(self):
1196 # pylint: disable=E1101
1197 options = self.Options(verbose=True)
1198
1199 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1200 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1201 ).AndReturn(True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001202
1203 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
szager@chromium.org6c2b49d2014-02-26 23:57:38 +00001204 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001205 ).AndReturn(False)
1206
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001207 gclient_scm.scm.os.path.isdir(self.base_path).AndReturn(True)
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001208 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001209
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001210 self.mox.ReplayAll()
1211
1212 git_scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1213 relpath=self.relpath)
1214 # A [fake] git sha1 with a git repo should work (this is in the case that
1215 # the LKGR gets flipped to git sha1's some day).
1216 self.assertEquals(git_scm.GetUsableRev(self.fake_hash_1, options),
1217 self.fake_hash_1)
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001218 # An SVN rev with an existing purely git repo should raise an exception.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001219 self.assertRaises(gclient_scm.gclient_utils.Error,
1220 git_scm.GetUsableRev, '1', options)
1221
1222 def testGetUsableRevGitSvn(self):
1223 # pylint: disable=E1101
1224 options = self.Options()
1225 too_big = str(1e7)
1226
1227 # Pretend like the git-svn repo's HEAD is at r2.
1228 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetGitSvnHeadRev', True)
1229 gclient_scm.scm.GIT.GetGitSvnHeadRev(cwd=self.base_path).MultipleTimes(
1230 ).AndReturn(2)
1231
szager@chromium.orgc51def32012-10-15 18:50:37 +00001232 self.mox.StubOutWithMock(
1233 gclient_scm.scm.GIT, 'GetBlessedSha1ForSvnRev', True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001234 # r1 -> first fake hash, r3 -> second fake hash.
szager@chromium.orgc51def32012-10-15 18:50:37 +00001235 gclient_scm.scm.GIT.GetBlessedSha1ForSvnRev(cwd=self.base_path, rev='1'
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001236 ).AndReturn(self.fake_hash_1)
szager@chromium.orgc51def32012-10-15 18:50:37 +00001237 gclient_scm.scm.GIT.GetBlessedSha1ForSvnRev(cwd=self.base_path, rev='3'
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001238 ).MultipleTimes().AndReturn(self.fake_hash_2)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001239
1240 # Ensure that we call git svn fetch if our LKGR is > the git-svn HEAD rev.
1241 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'Capture', True)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001242 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1243 cwd=self.base_path).AndReturn('blah')
1244 gclient_scm.scm.GIT.Capture(['fetch'], cwd=self.base_path)
1245 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
1246 error = subprocess2.CalledProcessError(1, 'cmd', '/cwd', 'stdout', 'stderr')
1247 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1248 cwd=self.base_path).AndRaise(error)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001249 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001250 gclient_scm.scm.GIT.Capture(['fetch', 'origin'], cwd=self.base_path)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001251
1252 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
szager@chromium.org6c2b49d2014-02-26 23:57:38 +00001253 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001254 ).AndReturn(True)
1255
1256 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1257 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1258 ).AndReturn(True)
1259 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=too_big
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001260 ).MultipleTimes(2).AndReturn(False)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001261
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001262 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
1263 gclient_scm.os.path.isdir(self.base_path).MultipleTimes().AndReturn(True)
1264
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001265 self.mox.ReplayAll()
1266
1267 git_svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
1268 relpath=self.relpath)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001269 # Without an existing checkout, this should fail.
1270 # TODO(dbeam) Fix this. http://crbug.com/109184
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001271 self.assertRaises(gclient_scm.gclient_utils.Error,
1272 git_svn_scm.GetUsableRev, '1', options)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001273 # Given an SVN revision with a git-svn checkout, it should be translated to
1274 # a git sha1 and be usable.
1275 self.assertEquals(git_svn_scm.GetUsableRev('1', options),
1276 self.fake_hash_1)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001277 # Our fake HEAD rev is r2, so this should call git fetch and git svn fetch
1278 # to get more revs (pymox will complain if this doesn't happen). We mock an
1279 # optimized checkout the first time, so this run should call git fetch.
1280 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1281 self.fake_hash_2)
1282 # The time we pretend we're not optimized, so no git fetch should fire.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001283 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1284 self.fake_hash_2)
1285 # Given a git sha1 with a git-svn checkout, it should be used as is.
1286 self.assertEquals(git_svn_scm.GetUsableRev(self.fake_hash_1, options),
1287 self.fake_hash_1)
1288 # We currently check for seemingly valid SVN revisions by assuming 6 digit
1289 # numbers, so assure that numeric revs >= 1000000 don't work.
1290 self.assertRaises(gclient_scm.gclient_utils.Error,
1291 git_svn_scm.GetUsableRev, too_big, options)
1292
borenet@google.comb09097a2014-04-09 19:09:08 +00001293 def testUpdateNoDotGit(self):
1294 options = self.Options()
1295
1296 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
1297 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
1298 gclient_scm.os.path.exists(os.path.join(self.base_path, '.git')
1299 ).AndReturn(False)
1300 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
1301 gclient_scm.os.path.exists(os.path.join(self.base_path, '.git')
1302 ).AndReturn(False)
1303
1304 self.mox.StubOutWithMock(gclient_scm.GitWrapper, '_Clone', True)
1305 # pylint: disable=E1120
1306 gclient_scm.GitWrapper._Clone('refs/remotes/origin/master', self.url,
1307 options)
1308 # pylint: disable=E1120
1309 self.mox.StubOutWithMock(gclient_scm.GitWrapper, 'UpdateSubmoduleConfig',
1310 True)
1311 gclient_scm.GitWrapper.UpdateSubmoduleConfig()
1312 self.mox.StubOutWithMock(gclient_scm.subprocess2, 'check_output', True)
1313 gclient_scm.subprocess2.check_output(['git', 'ls-files'],
1314 cwd=self.base_path,
1315 stderr=-1,
1316 ).AndReturn('')
1317 gclient_scm.subprocess2.check_output(
1318 ['git', 'rev-parse', '--verify', 'HEAD'],
1319 cwd=self.base_path,
1320 stderr=-1,
1321 ).AndReturn('')
1322
1323 self.mox.ReplayAll()
1324 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
1325 relpath=self.relpath)
1326 scm.update(options, None, [])
1327 self.checkstdout('\n')
1328
1329 def testUpdateNoDotGitForce(self):
1330 options = self.Options(force=True)
1331
1332 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
1333 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
1334 gclient_scm.os.path.exists(os.path.join(self.base_path, '.git')
1335 ).AndReturn(False)
1336 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
1337 gclient_scm.os.path.exists(os.path.join(self.base_path, '.git')
1338 ).AndReturn(False)
1339 self.mox.StubOutWithMock(gclient_scm.GitWrapper, '_Clone', True)
1340 # pylint: disable=E1120
1341 gclient_scm.GitWrapper._Clone('refs/remotes/origin/master', self.url,
1342 options)
1343 # pylint: disable=E1120
1344 self.mox.StubOutWithMock(gclient_scm.GitWrapper, 'UpdateSubmoduleConfig',
1345 True)
1346 gclient_scm.GitWrapper.UpdateSubmoduleConfig()
1347 self.mox.StubOutWithMock(gclient_scm.subprocess2, 'check_output', True)
1348 gclient_scm.subprocess2.check_output(['git', 'ls-files'],
1349 cwd=self.base_path,
1350 stderr=-1,
1351 ).AndReturn('')
1352 gclient_scm.subprocess2.check_output(
1353 ['git', 'rev-parse', '--verify', 'HEAD'],
1354 cwd=self.base_path,
1355 stderr=-1,
1356 ).AndReturn('')
1357
1358 self.mox.ReplayAll()
1359 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
1360 relpath=self.relpath)
1361 scm.update(options, None, [])
1362 self.checkstdout('\n')
1363
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001364
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001365class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001366 def testUpdateUpdate(self):
1367 if not self.enabled:
1368 return
1369 options = self.Options()
1370 expected_file_list = []
1371 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1372 relpath=self.relpath)
1373 file_list = []
1374 options.revision = 'unmanaged'
1375 scm.update(options, (), file_list)
1376 self.assertEquals(file_list, expected_file_list)
1377 self.assertEquals(scm.revinfo(options, (), None),
1378 '069c602044c5388d2d15c3f875b057c852003458')
1379 self.checkstdout('________ unmanaged solution; skipping .\n')
1380
1381
msb@chromium.orge28e4982009-09-25 20:51:45 +00001382if __name__ == '__main__':
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001383 if '-v' in sys.argv:
1384 logging.basicConfig(
1385 level=logging.DEBUG,
1386 format='%(asctime).19s %(levelname)s %(filename)s:'
1387 '%(lineno)s %(message)s')
msb@chromium.orge28e4982009-09-25 20:51:45 +00001388 unittest.main()
1389
1390# vim: ts=2:sw=2:tw=80:et: