blob: 4e90a21e039264a1fb3ce873bf3bb604b963061b [file] [log] [blame]
msb@chromium.orge28e4982009-09-25 20:51:45 +00001#!/usr/bin/python
maruel@chromium.orgba551772010-02-03 18:21:42 +00002# Copyright (c) 2010 The Chromium Authors. All rights reserved.
3# 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.orgba551772010-02-03 18:21:42 +00008# Import before super_mox to keep valid references.
9from os import rename
10from shutil import rmtree
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000011from subprocess import Popen, PIPE, STDOUT
msb@chromium.orge28e4982009-09-25 20:51:45 +000012import tempfile
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +000013import __builtin__
msb@chromium.orge28e4982009-09-25 20:51:45 +000014
maruel@chromium.orgba551772010-02-03 18:21:42 +000015# Fixes include path.
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +000016from super_mox import mox, SuperMoxBaseTestBase, SuperMoxTestBase
maruel@chromium.orgba551772010-02-03 18:21:42 +000017
msb@chromium.orge28e4982009-09-25 20:51:45 +000018import gclient_scm
maruel@chromium.org96913eb2010-06-01 16:22:47 +000019
20
21class GCBaseTestCase(SuperMoxTestBase):
22 # Like unittest's assertRaises, but checks for Gclient.Error.
23 def assertRaisesError(self, msg, fn, *args, **kwargs):
24 try:
25 fn(*args, **kwargs)
26 except gclient_scm.gclient_utils.Error, e:
27 self.assertEquals(e.args[0], msg)
28 else:
29 self.fail('%s not raised' % msg)
msb@chromium.orge28e4982009-09-25 20:51:45 +000030
31
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000032class BaseTestCase(GCBaseTestCase):
33 def setUp(self):
34 GCBaseTestCase.setUp(self)
maruel@chromium.org17d01792010-09-01 18:07:10 +000035 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter')
maruel@chromium.org669600d2010-09-01 19:06:31 +000036 self.mox.StubOutWithMock(gclient_scm.gclient_utils,
37 'CheckCallAndFilterAndHeader')
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000038 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
39 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000040 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000041 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo
42 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
43 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo')
44 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000045 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000046 self._scm_wrapper = gclient_scm.CreateSCM
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +000047 gclient_scm.sys.stdout.flush = lambda: None
maruel@chromium.org669600d2010-09-01 19:06:31 +000048 gclient_scm.scm.SVN.current_version = None
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000049
50
51class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000052 class OptionsObject(object):
53 def __init__(self, test_case, verbose=False, revision=None):
54 self.verbose = verbose
55 self.revision = revision
56 self.manually_grab_svn_rev = True
57 self.deps_os = None
58 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000059 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000060 self.nohooks = False
maruel@chromium.org669600d2010-09-01 19:06:31 +000061 self.stdout = gclient_scm.sys.stdout
msb@chromium.orge28e4982009-09-25 20:51:45 +000062
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000063 def Options(self, *args, **kwargs):
64 return self.OptionsObject(self, *args, **kwargs)
65
msb@chromium.orge28e4982009-09-25 20:51:45 +000066 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000067 BaseTestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +000068 self.root_dir = self.Dir()
69 self.args = self.Args()
70 self.url = self.Url()
71 self.relpath = 'asf'
72
73 def testDir(self):
74 members = [
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +000075 'FullUrlForRelativeUrl', 'RunCommand',
maruel@chromium.org55e724e2010-03-11 19:36:49 +000076 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +000077 'revinfo', 'runhooks', 'status', 'update',
tony@chromium.org4b5b1772010-04-08 01:52:56 +000078 'updatesingle', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +000079 ]
80
81 # If you add a member, be sure to add the relevant test!
maruel@chromium.org9eda4112010-06-11 18:56:10 +000082 self.compareMembers(self._scm_wrapper('svn://a'), members)
msb@chromium.orge28e4982009-09-25 20:51:45 +000083
84 def testUnsupportedSCM(self):
maruel@chromium.org9eda4112010-06-11 18:56:10 +000085 args = ['gopher://foo', self.root_dir, self.relpath]
86 exception_msg = 'No SCM found for url gopher://foo'
87 self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
msb@chromium.orge28e4982009-09-25 20:51:45 +000088
msb@chromium.orge6f78352010-01-13 17:05:33 +000089 def testSVNFullUrlForRelativeUrl(self):
90 self.url = 'svn://a/b/c/d'
91
92 self.mox.ReplayAll()
93 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
94 relpath=self.relpath)
95 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
96
97 def testGITFullUrlForRelativeUrl(self):
98 self.url = 'git://a/b/c/d'
99
100 self.mox.ReplayAll()
101 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
102 relpath=self.relpath)
103 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
104
msb@chromium.orge28e4982009-09-25 20:51:45 +0000105 def testRunCommandException(self):
106 options = self.Options(verbose=False)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000107 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
108 gclient_scm.os.path.exists(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000109
110 self.mox.ReplayAll()
111 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
112 relpath=self.relpath)
113 exception = "Unsupported argument(s): %s" % ','.join(self.args)
114 self.assertRaisesError(exception, scm.RunCommand,
115 'update', options, self.args)
116
117 def testRunCommandUnknown(self):
118 # TODO(maruel): if ever used.
119 pass
120
121 def testRevertMissing(self):
122 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000123 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
124 gclient_scm.os.path.isdir(base_path).AndReturn(False)
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000125 gclient_scm.scm.SVN.Capture(['--version']
126 ).AndReturn('svn, version 1.5.1 (r32289)')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000127 # It'll to a checkout instead.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000128 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
129 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000130 print("\n_____ %s is missing, synching instead" % self.relpath)
131 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000132 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000133 files_list = self.mox.CreateMockAnything()
maruel@chromium.org03807072010-08-16 17:18:44 +0000134 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000135 ['checkout', self.url, base_path,
136 '--force'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000137 cwd=self.root_dir,
138 file_list=files_list,
139 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000140
141 self.mox.ReplayAll()
142 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
143 relpath=self.relpath)
144 scm.revert(options, self.args, files_list)
145
146 def testRevertNone(self):
147 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000148 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
149 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000150 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn([])
maruel@chromium.org03807072010-08-16 17:18:44 +0000151 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000152 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000153 cwd=base_path,
154 file_list=mox.IgnoreArg(),
155 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000156
157 self.mox.ReplayAll()
158 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
159 relpath=self.relpath)
160 file_list = []
161 scm.revert(options, self.args, file_list)
162
163 def testRevert2Files(self):
164 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000165 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
166 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000167 items = [
168 ('M ', 'a'),
169 ('A ', 'b'),
170 ]
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000171 file_path1 = gclient_scm.os.path.join(base_path, 'a')
172 file_path2 = gclient_scm.os.path.join(base_path, 'b')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000173 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000174 gclient_scm.os.path.exists(file_path1).AndReturn(True)
175 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
176 gclient_scm.os.remove(file_path1)
177 gclient_scm.os.path.exists(file_path2).AndReturn(True)
178 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
179 gclient_scm.os.remove(file_path2)
maruel@chromium.org03807072010-08-16 17:18:44 +0000180 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000181 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000182 cwd=base_path,
183 file_list=mox.IgnoreArg(),
184 stdout=options.stdout)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000185 print(gclient_scm.os.path.join(base_path, 'a'))
186 print(gclient_scm.os.path.join(base_path, 'b'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000187
188 self.mox.ReplayAll()
189 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
190 relpath=self.relpath)
191 file_list = []
192 scm.revert(options, self.args, file_list)
193
194 def testRevertDirectory(self):
195 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000196 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
197 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000198 items = [
199 ('~ ', 'a'),
200 ]
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000201 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000202 file_path = gclient_scm.os.path.join(base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000203 print(file_path)
204 gclient_scm.os.path.exists(file_path).AndReturn(True)
205 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000206 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000207 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000208 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000209 file_list1 = []
maruel@chromium.org03807072010-08-16 17:18:44 +0000210 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000211 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000212 cwd=base_path,
213 file_list=mox.IgnoreArg(),
214 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000215
216 self.mox.ReplayAll()
217 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
218 relpath=self.relpath)
219 file_list2 = []
220 scm.revert(options, self.args, file_list2)
221
222 def testStatus(self):
223 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000224 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
225 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org03807072010-08-16 17:18:44 +0000226 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000227 ['status'] + self.args,
maruel@chromium.org669600d2010-09-01 19:06:31 +0000228 cwd=base_path, file_list=[],
229 stdout=options.stdout).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000230
231 self.mox.ReplayAll()
232 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
233 relpath=self.relpath)
234 file_list = []
235 self.assertEqual(scm.status(options, self.args, file_list), None)
236
237
238 # TODO(maruel): TEST REVISIONS!!!
239 # TODO(maruel): TEST RELOCATE!!!
240 def testUpdateCheckout(self):
241 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000242 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
243 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000244 file_info.root = 'blah'
245 file_info.url = self.url
246 file_info.uuid = 'ABC'
247 file_info.revision = 42
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000248 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
249 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000250 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000251 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000252 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000253 gclient_scm.scm.SVN.Capture(['--version']
254 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org03807072010-08-16 17:18:44 +0000255 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000256 ['checkout', self.url, base_path,
257 '--force'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000258 cwd=self.root_dir,
259 file_list=files_list,
260 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000261 self.mox.ReplayAll()
262 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
263 relpath=self.relpath)
264 scm.update(options, (), files_list)
265
266 def testUpdateUpdate(self):
267 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000268 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000269 options.force = True
270 options.nohooks = False
271 file_info = {
272 'Repository Root': 'blah',
273 'URL': self.url,
274 'UUID': 'ABC',
275 'Revision': 42,
276 }
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000277 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
278 ).AndReturn(False)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000279
280 # Verify no locked files.
281 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
282 ).AndReturn([])
283
msb@chromium.orge28e4982009-09-25 20:51:45 +0000284 # Checkout or update.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000285 gclient_scm.os.path.exists(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000286 gclient_scm.scm.SVN.CaptureInfo(
287 gclient_scm.os.path.join(base_path, "."), '.'
288 ).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000289 # Cheat a bit here.
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000290 gclient_scm.scm.SVN.CaptureInfo(file_info['URL'], '.').AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000291 additional_args = []
292 if options.manually_grab_svn_rev:
293 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.org669600d2010-09-01 19:06:31 +0000294 gclient_scm.scm.SVN.Capture(['--version']
295 ).AndReturn('svn, version 1.5.1 (r32289)')
296 additional_args.append('--force')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000297 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000298 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000299 options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000300 ['update', base_path] + additional_args,
maruel@chromium.org669600d2010-09-01 19:06:31 +0000301 cwd=self.root_dir, file_list=files_list, stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000302
303 self.mox.ReplayAll()
304 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
305 relpath=self.relpath)
306 scm.update(options, (), files_list)
307
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000308 def testUpdateSingleCheckout(self):
309 options = self.Options(verbose=True)
310 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
311 file_info = {
312 'URL': self.url,
313 'Revision': 42,
314 }
tony@chromium.org57564662010-04-14 02:35:12 +0000315
316 # Checks to make sure that we support svn co --depth.
317 gclient_scm.scm.SVN.current_version = None
318 gclient_scm.scm.SVN.Capture(['--version']
319 ).AndReturn('svn, version 1.5.1 (r32289)')
320 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
321 ).AndReturn(False)
322 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, 'DEPS')
323 ).AndReturn(False)
324
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000325 # Verify no locked files.
326 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
327 ).AndReturn([])
328
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000329 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000330 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000331 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
332 ['svn', 'checkout', '--depth', 'empty', self.url, base_path],
333 always=True, cwd=self.root_dir, stdout=options.stdout)
maruel@chromium.org03807072010-08-16 17:18:44 +0000334 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, ['update', 'DEPS'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000335 cwd=base_path, file_list=files_list, stdout=options.stdout)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000336
337 # Now we fall back on scm.update().
338 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
tony@chromium.org57564662010-04-14 02:35:12 +0000339 ).AndReturn(False)
340 gclient_scm.os.path.exists(base_path).AndReturn(True)
341 gclient_scm.scm.SVN.CaptureInfo(
342 gclient_scm.os.path.join(base_path, "."), '.'
343 ).AndReturn(file_info)
344 gclient_scm.scm.SVN.CaptureInfo(file_info['URL'], '.').AndReturn(file_info)
maruel@chromium.org669600d2010-09-01 19:06:31 +0000345 options.stdout.write("\n_____ %s at 42" % self.relpath)
346 options.stdout.write('\n')
tony@chromium.org57564662010-04-14 02:35:12 +0000347
348 self.mox.ReplayAll()
349 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
350 relpath=self.relpath)
351 scm.updatesingle(options, ['DEPS'], files_list)
352
353 def testUpdateSingleCheckoutSVN14(self):
354 options = self.Options(verbose=True)
355 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
356 file_info = {
357 'URL': self.url,
358 'Revision': 42,
359 }
360
361 # Checks to make sure that we support svn co --depth.
362 gclient_scm.scm.SVN.current_version = None
363 gclient_scm.scm.SVN.Capture(['--version']
364 ).AndReturn('svn, version 1.4.4 (r25188)')
365 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path)
366 ).AndReturn(True)
367
368 # When checking out a single file with svn 1.4, we use svn export
369 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000370 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
371 ['svn', 'export', gclient_scm.os.path.join(self.url, 'DEPS'),
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000372 gclient_scm.os.path.join(base_path, 'DEPS')],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000373 always=True, cwd=self.root_dir, stdout=options.stdout)
tony@chromium.org57564662010-04-14 02:35:12 +0000374
375 self.mox.ReplayAll()
376 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
377 relpath=self.relpath)
378 scm.updatesingle(options, ['DEPS'], files_list)
379
380 def testUpdateSingleCheckoutSVNUpgrade(self):
381 options = self.Options(verbose=True)
382 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
383 file_info = {
384 'URL': self.url,
385 'Revision': 42,
386 }
387
388 # Checks to make sure that we support svn co --depth.
389 gclient_scm.scm.SVN.current_version = None
390 gclient_scm.scm.SVN.Capture(['--version']
391 ).AndReturn('svn, version 1.5.1 (r32289)')
392 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
393 ).AndReturn(False)
394 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
395 # the old DEPS file.
396 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, 'DEPS')
397 ).AndReturn(True)
398 gclient_scm.os.remove(gclient_scm.os.path.join(base_path, 'DEPS'))
399
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000400 # Verify no locked files.
401 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
402 ).AndReturn([])
403
tony@chromium.org57564662010-04-14 02:35:12 +0000404 # When checking out a single file, we issue an svn checkout and svn update.
405 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000406 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
407 ['svn', 'checkout', '--depth', 'empty', self.url, base_path],
408 always=True, cwd=self.root_dir, stdout=options.stdout)
maruel@chromium.org03807072010-08-16 17:18:44 +0000409 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, ['update', 'DEPS'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000410 cwd=base_path, file_list=files_list, stdout=options.stdout)
tony@chromium.org57564662010-04-14 02:35:12 +0000411
412 # Now we fall back on scm.update().
413 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
414 ).AndReturn(False)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000415 gclient_scm.os.path.exists(base_path).AndReturn(True)
416 gclient_scm.scm.SVN.CaptureInfo(
417 gclient_scm.os.path.join(base_path, "."), '.'
418 ).AndReturn(file_info)
419 gclient_scm.scm.SVN.CaptureInfo(file_info['URL'], '.').AndReturn(file_info)
420 print("\n_____ %s at 42" % self.relpath)
421
422 self.mox.ReplayAll()
423 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
424 relpath=self.relpath)
425 scm.updatesingle(options, ['DEPS'], files_list)
426
427 def testUpdateSingleUpdate(self):
428 options = self.Options(verbose=True)
429 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
430 file_info = {
431 'URL': self.url,
432 'Revision': 42,
433 }
tony@chromium.org57564662010-04-14 02:35:12 +0000434 # Checks to make sure that we support svn co --depth.
435 gclient_scm.scm.SVN.current_version = None
436 gclient_scm.scm.SVN.Capture(['--version']
437 ).AndReturn('svn, version 1.5.1 (r32289)')
438 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
439 ).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000440
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000441 # Verify no locked files.
442 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
443 ).AndReturn([])
444
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000445 # Now we fall back on scm.update().
446 files_list = self.mox.CreateMockAnything()
447 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
448 ).AndReturn(False)
449 gclient_scm.os.path.exists(base_path).AndReturn(True)
450 gclient_scm.scm.SVN.CaptureInfo(
451 gclient_scm.os.path.join(base_path, "."), '.'
452 ).AndReturn(file_info)
453 gclient_scm.scm.SVN.CaptureInfo(file_info['URL'], '.').AndReturn(file_info)
454 print("\n_____ %s at 42" % self.relpath)
455
456 self.mox.ReplayAll()
457 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
458 relpath=self.relpath)
459 scm.updatesingle(options, ['DEPS'], files_list)
460
msb@chromium.orge28e4982009-09-25 20:51:45 +0000461 def testUpdateGit(self):
462 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000463 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
464 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000465 print("________ found .git directory; skipping %s" % self.relpath)
466
467 self.mox.ReplayAll()
468 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
469 relpath=self.relpath)
470 file_list = []
471 scm.update(options, self.args, file_list)
472
msb@chromium.orge28e4982009-09-25 20:51:45 +0000473
msb@chromium.org5bde4852009-12-14 16:47:12 +0000474class GitWrapperTestCase(BaseTestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000475 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000476 class OptionsObject(object):
477 def __init__(self, test_case, verbose=False, revision=None):
478 self.verbose = verbose
479 self.revision = revision
480 self.manually_grab_svn_rev = True
481 self.deps_os = None
482 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000483 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000484 self.nohooks = False
485
486 sample_git_import = """blob
487mark :1
488data 6
489Hello
490
491blob
492mark :2
493data 4
494Bye
495
496reset refs/heads/master
497commit refs/heads/master
498mark :3
499author Bob <bob@example.com> 1253744361 -0700
500committer Bob <bob@example.com> 1253744361 -0700
501data 8
502A and B
503M 100644 :1 a
504M 100644 :2 b
505
506blob
507mark :4
508data 10
509Hello
510You
511
512blob
513mark :5
514data 8
515Bye
516You
517
518commit refs/heads/origin
519mark :6
520author Alice <alice@example.com> 1253744424 -0700
521committer Alice <alice@example.com> 1253744424 -0700
522data 13
523Personalized
524from :3
525M 100644 :4 a
526M 100644 :5 b
527
528reset refs/heads/master
529from :3
530"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000531 def Options(self, *args, **kwargs):
532 return self.OptionsObject(self, *args, **kwargs)
533
534 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000535 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000536 try:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000537 Popen(['git', 'init'], stdout=PIPE, stderr=STDOUT,
538 cwd=path).communicate()
539 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000540 # git is not available, skip this test.
541 return False
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000542 Popen(['git', 'fast-import'], stdin=PIPE, stdout=PIPE, stderr=STDOUT,
543 cwd=path).communicate(input=git_import)
544 Popen(['git', 'checkout'], stdout=PIPE, stderr=STDOUT,
545 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000546 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
547 stderr=STDOUT, cwd=path).communicate()
548 Popen(['git', 'checkout', '-b', 'new', 'origin/master'], stdout=PIPE,
549 stderr=STDOUT, cwd=path).communicate()
550 Popen(['git', 'push', 'origin', 'origin/origin:origin/master'], stdout=PIPE,
551 stderr=STDOUT, cwd=path).communicate()
552 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
553 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000554 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000555
msb@chromium.orge28e4982009-09-25 20:51:45 +0000556 def setUp(self):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000557 self.args = self.Args()
558 self.url = 'git://foo'
559 self.root_dir = tempfile.mkdtemp()
560 self.relpath = '.'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000561 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000562 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000563 SuperMoxBaseTestBase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000564
565 def tearDown(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000566 SuperMoxBaseTestBase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000567 rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000568
569 def testDir(self):
570 members = [
maruel@chromium.org55e724e2010-03-11 19:36:49 +0000571 'FullUrlForRelativeUrl', 'RunCommand',
msb@chromium.orge6f78352010-01-13 17:05:33 +0000572 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000573 'revinfo', 'runhooks', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000574 ]
575
576 # If you add a member, be sure to add the relevant test!
577 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
578
579 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000580 if not self.enabled:
581 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000582 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000583 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000584 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
585 relpath=self.relpath)
586 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000587 scm.update(options, None, file_list)
588 gclient_scm.os.remove(file_path)
589 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000590 scm.revert(options, self.args, file_list)
591 self.assertEquals(file_list, [file_path])
592 file_list = []
593 scm.diff(options, self.args, file_list)
594 self.assertEquals(file_list, [])
595
596 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000597 if not self.enabled:
598 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000599 options = self.Options()
600 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
601 relpath=self.relpath)
602 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000603 scm.update(options, None, file_list)
604 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000605 scm.revert(options, self.args, file_list)
606 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000607 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000608 'a7142dc9f0009350b96a11f372b6ea658592aa95')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000609
610
611 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000612 if not self.enabled:
613 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000614 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000615 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
616 relpath=self.relpath)
617 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000618 scm.update(options, None, file_list)
619 file_path = gclient_scm.os.path.join(self.base_path, 'a')
620 open(file_path, 'a').writelines('touched\n')
621 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000622 scm.revert(options, self.args, file_list)
623 self.assertEquals(file_list, [file_path])
624 file_list = []
625 scm.diff(options, self.args, file_list)
626 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000627 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000628 'a7142dc9f0009350b96a11f372b6ea658592aa95')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000629
630 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000631 if not self.enabled:
632 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000633 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000634 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
635 relpath=self.relpath)
636 file_list = []
637 scm.update(options, None, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000638 file_path = gclient_scm.os.path.join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000639 f = open(file_path, 'w')
640 f.writelines('new\n')
641 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000642 Popen(['git', 'add', 'c'], stdout=PIPE,
643 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000644 file_list = []
645 scm.revert(options, self.args, file_list)
646 self.assertEquals(file_list, [file_path])
647 file_list = []
648 scm.diff(options, self.args, file_list)
649 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000650 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000651 'a7142dc9f0009350b96a11f372b6ea658592aa95')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000652
653 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000654 if not self.enabled:
655 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000656 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000657 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000658 open(file_path, 'a').writelines('touched\n')
659 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
660 relpath=self.relpath)
661 file_list = []
662 scm.status(options, self.args, file_list)
663 self.assertEquals(file_list, [file_path])
664
665 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000666 if not self.enabled:
667 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000668 options = self.Options()
669 expected_file_list = []
670 for f in ['a', 'b']:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000671 file_path = gclient_scm.os.path.join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000672 open(file_path, 'a').writelines('touched\n')
673 expected_file_list.extend([file_path])
674 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
675 relpath=self.relpath)
676 file_list = []
677 scm.status(options, self.args, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000678 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
679 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000680 self.assertEquals(sorted(file_list), expected_file_list)
681
682 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000683 if not self.enabled:
684 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000685 options = self.Options(verbose=True)
686 root_dir = tempfile.mkdtemp()
687 relpath = 'foo'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000688 base_path = gclient_scm.os.path.join(root_dir, relpath)
689 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000690 try:
691 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
692 relpath=relpath)
693 file_list = []
694 scm.update(options, (), file_list)
695 self.assertEquals(len(file_list), 2)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000696 self.assert_(gclient_scm.os.path.isfile(
697 gclient_scm.os.path.join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000698 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000699 '069c602044c5388d2d15c3f875b057c852003458')
700 finally:
maruel@chromium.orgba551772010-02-03 18:21:42 +0000701 rmtree(root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000702
703 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000704 if not self.enabled:
705 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000706 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000707 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
708 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000709 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
710 relpath=self.relpath)
711 file_list = []
712 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000713 self.assertEquals(file_list, expected_file_list)
714 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000715 'a7142dc9f0009350b96a11f372b6ea658592aa95')
716
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000717 def testUpdateUnstagedConflict(self):
718 if not self.enabled:
719 return
720 options = self.Options()
721 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
722 relpath=self.relpath)
723 file_path = gclient_scm.os.path.join(self.base_path, 'b')
724 f = open(file_path, 'w').writelines('conflict\n')
725 exception = (
726 "error: Your local changes to 'b' would be overwritten by merge. "
727 "Aborting.\n"
728 "Please, commit your changes or stash them before you can merge.\n")
729 self.assertRaisesError(exception, scm.update, options, (), [])
730
msb@chromium.org5bde4852009-12-14 16:47:12 +0000731 def testUpdateConflict(self):
732 if not self.enabled:
733 return
734 options = self.Options()
735 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
736 relpath=self.relpath)
737 file_path = gclient_scm.os.path.join(self.base_path, 'b')
738 f = open(file_path, 'w').writelines('conflict\n')
739 scm._Run(['commit', '-am', 'test'])
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000740 self.mox.StubOutWithMock(__builtin__, 'raw_input')
741 __builtin__.raw_input.__call__(mox.StrContains('Cannot fast-forward merge, '
742 'attempt to rebase? (y)es / '
743 '(q)uit / (s)kip : ')
744 ).AndReturn('y')
745 self.mox.ReplayAll()
msb@chromium.org5bde4852009-12-14 16:47:12 +0000746 exception = \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000747 'Conflict while rebasing this branch.\n' \
msb@chromium.org5bde4852009-12-14 16:47:12 +0000748 'Fix the conflict and run gclient again.\n' \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000749 "See 'man git-rebase' for details.\n"
msb@chromium.org5bde4852009-12-14 16:47:12 +0000750 self.assertRaisesError(exception, scm.update, options, (), [])
751 exception = \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000752 '\n____ . at refs/heads/master\n' \
msb@chromium.org786fb682010-06-02 15:16:23 +0000753 '\tYou have unstaged changes.\n' \
754 '\tPlease commit, stash, or reset.\n'
msb@chromium.org5bde4852009-12-14 16:47:12 +0000755 self.assertRaisesError(exception, scm.update, options, (), [])
756
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000757 def testUpdateNotGit(self):
758 if not self.enabled:
759 return
760 options = self.Options()
761 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
762 relpath=self.relpath)
763 git_path = gclient_scm.os.path.join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +0000764 rename(git_path, git_path + 'foo')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000765 exception = \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000766 '\n____ . at refs/heads/master\n' \
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000767 '\tPath is not a git repo. No .git dir.\n' \
768 '\tTo resolve:\n' \
769 '\t\trm -rf .\n' \
770 '\tAnd run gclient sync again\n'
771 self.assertRaisesError(exception, scm.update, options, (), [])
772
msb@chromium.org0f282062009-11-06 20:14:02 +0000773 def testRevinfo(self):
774 if not self.enabled:
775 return
776 options = self.Options()
777 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
778 relpath=self.relpath)
779 rev_info = scm.revinfo(options, (), None)
780 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
781
msb@chromium.orge28e4982009-09-25 20:51:45 +0000782
msb@chromium.orge28e4982009-09-25 20:51:45 +0000783if __name__ == '__main__':
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000784 import unittest
msb@chromium.orge28e4982009-09-25 20:51:45 +0000785 unittest.main()
786
787# vim: ts=2:sw=2:tw=80:et: