blob: 3267745bb5c674d4d7152b0c719620f258612384 [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.org54019f32010-09-09 13:50:11 +000011import StringIO
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000012from subprocess import Popen, PIPE, STDOUT
msb@chromium.orge28e4982009-09-25 20:51:45 +000013import tempfile
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +000014import __builtin__
msb@chromium.orge28e4982009-09-25 20:51:45 +000015
maruel@chromium.orgba551772010-02-03 18:21:42 +000016# Fixes include path.
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +000017from super_mox import mox, SuperMoxBaseTestBase, SuperMoxTestBase
maruel@chromium.orgba551772010-02-03 18:21:42 +000018
msb@chromium.orge28e4982009-09-25 20:51:45 +000019import gclient_scm
maruel@chromium.org96913eb2010-06-01 16:22:47 +000020
21
22class GCBaseTestCase(SuperMoxTestBase):
23 # Like unittest's assertRaises, but checks for Gclient.Error.
24 def assertRaisesError(self, msg, fn, *args, **kwargs):
25 try:
26 fn(*args, **kwargs)
27 except gclient_scm.gclient_utils.Error, e:
28 self.assertEquals(e.args[0], msg)
29 else:
30 self.fail('%s not raised' % msg)
msb@chromium.orge28e4982009-09-25 20:51:45 +000031
32
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000033class BaseTestCase(GCBaseTestCase):
34 def setUp(self):
35 GCBaseTestCase.setUp(self)
maruel@chromium.org17d01792010-09-01 18:07:10 +000036 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter')
maruel@chromium.org669600d2010-09-01 19:06:31 +000037 self.mox.StubOutWithMock(gclient_scm.gclient_utils,
38 'CheckCallAndFilterAndHeader')
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000039 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
40 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000041 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000042 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo
43 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
44 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo')
45 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000046 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000047 self._scm_wrapper = gclient_scm.CreateSCM
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +000048 gclient_scm.sys.stdout.flush = lambda: None
maruel@chromium.org669600d2010-09-01 19:06:31 +000049 gclient_scm.scm.SVN.current_version = None
maruel@chromium.org54019f32010-09-09 13:50:11 +000050 self.stdout = StringIO.StringIO()
51
52 def tearDown(self):
53 GCBaseTestCase.tearDown(self)
54 try:
55 self.stdout.getvalue()
56 self.fail()
57 except AttributeError:
58 pass
59
60 def checkstdout(self, expected):
61 value = self.stdout.getvalue()
62 self.stdout.close()
63 self.assertEquals(expected, value)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000064
65
66class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000067 class OptionsObject(object):
68 def __init__(self, test_case, verbose=False, revision=None):
69 self.verbose = verbose
70 self.revision = revision
71 self.manually_grab_svn_rev = True
72 self.deps_os = None
73 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000074 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000075 self.nohooks = False
maruel@chromium.org54019f32010-09-09 13:50:11 +000076 self.stdout = test_case.stdout
msb@chromium.orge28e4982009-09-25 20:51:45 +000077
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000078 def Options(self, *args, **kwargs):
79 return self.OptionsObject(self, *args, **kwargs)
80
msb@chromium.orge28e4982009-09-25 20:51:45 +000081 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000082 BaseTestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +000083 self.root_dir = self.Dir()
84 self.args = self.Args()
85 self.url = self.Url()
86 self.relpath = 'asf'
87
88 def testDir(self):
89 members = [
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +000090 'FullUrlForRelativeUrl', 'RunCommand',
maruel@chromium.org55e724e2010-03-11 19:36:49 +000091 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +000092 'revinfo', 'runhooks', 'status', 'update',
tony@chromium.org4b5b1772010-04-08 01:52:56 +000093 'updatesingle', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +000094 ]
95
96 # If you add a member, be sure to add the relevant test!
maruel@chromium.org9eda4112010-06-11 18:56:10 +000097 self.compareMembers(self._scm_wrapper('svn://a'), members)
maruel@chromium.org54019f32010-09-09 13:50:11 +000098 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +000099
100 def testUnsupportedSCM(self):
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000101 args = ['gopher://foo', self.root_dir, self.relpath]
102 exception_msg = 'No SCM found for url gopher://foo'
103 self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000104 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000105
msb@chromium.orge6f78352010-01-13 17:05:33 +0000106 def testSVNFullUrlForRelativeUrl(self):
107 self.url = 'svn://a/b/c/d'
108
109 self.mox.ReplayAll()
110 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
111 relpath=self.relpath)
112 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
maruel@chromium.org54019f32010-09-09 13:50:11 +0000113 self.checkstdout('')
msb@chromium.orge6f78352010-01-13 17:05:33 +0000114
115 def testGITFullUrlForRelativeUrl(self):
116 self.url = 'git://a/b/c/d'
117
118 self.mox.ReplayAll()
119 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
120 relpath=self.relpath)
121 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
maruel@chromium.org54019f32010-09-09 13:50:11 +0000122 self.checkstdout('')
msb@chromium.orge6f78352010-01-13 17:05:33 +0000123
msb@chromium.orge28e4982009-09-25 20:51:45 +0000124 def testRunCommandException(self):
125 options = self.Options(verbose=False)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000126 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
127 gclient_scm.os.path.exists(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000128
129 self.mox.ReplayAll()
130 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
131 relpath=self.relpath)
132 exception = "Unsupported argument(s): %s" % ','.join(self.args)
133 self.assertRaisesError(exception, scm.RunCommand,
134 'update', options, self.args)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000135 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000136
137 def testRunCommandUnknown(self):
138 # TODO(maruel): if ever used.
maruel@chromium.org54019f32010-09-09 13:50:11 +0000139 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000140
141 def testRevertMissing(self):
142 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000143 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
144 gclient_scm.os.path.isdir(base_path).AndReturn(False)
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000145 gclient_scm.scm.SVN.Capture(['--version']
146 ).AndReturn('svn, version 1.5.1 (r32289)')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000147 # It'll to a checkout instead.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000148 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
149 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000150 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000151 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000152 files_list = self.mox.CreateMockAnything()
maruel@chromium.org03807072010-08-16 17:18:44 +0000153 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000154 ['checkout', self.url, base_path,
155 '--force'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000156 cwd=self.root_dir,
157 file_list=files_list,
158 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000159
160 self.mox.ReplayAll()
161 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
162 relpath=self.relpath)
163 scm.revert(options, self.args, files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000164 self.checkstdout(
165 ('\n_____ %s is missing, synching instead\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000166
167 def testRevertNone(self):
168 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000169 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
170 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000171 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn([])
maruel@chromium.org03807072010-08-16 17:18:44 +0000172 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000173 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000174 cwd=base_path,
175 file_list=mox.IgnoreArg(),
176 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000177
178 self.mox.ReplayAll()
179 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
180 relpath=self.relpath)
181 file_list = []
182 scm.revert(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000183 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000184
185 def testRevert2Files(self):
186 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000187 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
188 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000189 items = [
190 ('M ', 'a'),
191 ('A ', 'b'),
192 ]
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000193 file_path1 = gclient_scm.os.path.join(base_path, 'a')
194 file_path2 = gclient_scm.os.path.join(base_path, 'b')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000195 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000196 gclient_scm.os.path.exists(file_path1).AndReturn(True)
197 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
198 gclient_scm.os.remove(file_path1)
199 gclient_scm.os.path.exists(file_path2).AndReturn(True)
200 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
201 gclient_scm.os.remove(file_path2)
maruel@chromium.org03807072010-08-16 17:18:44 +0000202 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000203 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000204 cwd=base_path,
205 file_list=mox.IgnoreArg(),
206 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000207
208 self.mox.ReplayAll()
209 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
210 relpath=self.relpath)
211 file_list = []
212 scm.revert(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000213 self.checkstdout(
214 ('%s\n%s\n' % (gclient_scm.os.path.join(base_path, 'a'),
215 gclient_scm.os.path.join(base_path, 'b'))))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000216
217 def testRevertDirectory(self):
218 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000219 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
220 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000221 items = [
222 ('~ ', 'a'),
223 ]
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000224 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000225 file_path = gclient_scm.os.path.join(base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000226 gclient_scm.os.path.exists(file_path).AndReturn(True)
227 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000228 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000229 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000230 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000231 file_list1 = []
maruel@chromium.org03807072010-08-16 17:18:44 +0000232 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000233 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000234 cwd=base_path,
235 file_list=mox.IgnoreArg(),
236 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000237
238 self.mox.ReplayAll()
239 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
240 relpath=self.relpath)
241 file_list2 = []
242 scm.revert(options, self.args, file_list2)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000243 self.checkstdout(('%s\n' % file_path))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000244
245 def testStatus(self):
246 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000247 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
248 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org03807072010-08-16 17:18:44 +0000249 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000250 ['status'] + self.args,
maruel@chromium.org669600d2010-09-01 19:06:31 +0000251 cwd=base_path, file_list=[],
252 stdout=options.stdout).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000253
254 self.mox.ReplayAll()
255 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
256 relpath=self.relpath)
257 file_list = []
258 self.assertEqual(scm.status(options, self.args, file_list), None)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000259 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000260
261 # TODO(maruel): TEST REVISIONS!!!
262 # TODO(maruel): TEST RELOCATE!!!
263 def testUpdateCheckout(self):
264 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000265 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
266 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000267 file_info.root = 'blah'
268 file_info.url = self.url
269 file_info.uuid = 'ABC'
270 file_info.revision = 42
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000271 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
272 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000273 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000274 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000275 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000276 gclient_scm.scm.SVN.Capture(['--version']
277 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org03807072010-08-16 17:18:44 +0000278 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000279 ['checkout', self.url, base_path,
280 '--force'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000281 cwd=self.root_dir,
282 file_list=files_list,
283 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000284 self.mox.ReplayAll()
285 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
286 relpath=self.relpath)
287 scm.update(options, (), files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000288 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000289
290 def testUpdateUpdate(self):
291 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000292 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000293 options.force = True
294 options.nohooks = False
295 file_info = {
296 'Repository Root': 'blah',
297 'URL': self.url,
298 'UUID': 'ABC',
299 'Revision': 42,
300 }
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000301 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
302 ).AndReturn(False)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000303
304 # Verify no locked files.
305 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
306 ).AndReturn([])
307
msb@chromium.orge28e4982009-09-25 20:51:45 +0000308 # Checkout or update.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000309 gclient_scm.os.path.exists(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000310 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000311 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000312 # Cheat a bit here.
maruel@chromium.org54019f32010-09-09 13:50:11 +0000313 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000314 additional_args = []
315 if options.manually_grab_svn_rev:
316 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.org669600d2010-09-01 19:06:31 +0000317 gclient_scm.scm.SVN.Capture(['--version']
318 ).AndReturn('svn, version 1.5.1 (r32289)')
319 additional_args.append('--force')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000320 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000321 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000322 options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000323 ['update', base_path] + additional_args,
maruel@chromium.org669600d2010-09-01 19:06:31 +0000324 cwd=self.root_dir, file_list=files_list, stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000325
326 self.mox.ReplayAll()
327 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
328 relpath=self.relpath)
329 scm.update(options, (), files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000330 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000331
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000332 def testUpdateSingleCheckout(self):
333 options = self.Options(verbose=True)
334 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
335 file_info = {
336 'URL': self.url,
337 'Revision': 42,
338 }
tony@chromium.org57564662010-04-14 02:35:12 +0000339
340 # Checks to make sure that we support svn co --depth.
341 gclient_scm.scm.SVN.current_version = None
342 gclient_scm.scm.SVN.Capture(['--version']
343 ).AndReturn('svn, version 1.5.1 (r32289)')
344 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
345 ).AndReturn(False)
346 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, 'DEPS')
347 ).AndReturn(False)
348
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000349 # Verify no locked files.
350 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
351 ).AndReturn([])
352
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000353 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000354 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000355 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
356 ['svn', 'checkout', '--depth', 'empty', self.url, base_path],
357 always=True, cwd=self.root_dir, stdout=options.stdout)
maruel@chromium.org03807072010-08-16 17:18:44 +0000358 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, ['update', 'DEPS'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000359 cwd=base_path, file_list=files_list, stdout=options.stdout)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000360
361 # Now we fall back on scm.update().
362 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
tony@chromium.org57564662010-04-14 02:35:12 +0000363 ).AndReturn(False)
364 gclient_scm.os.path.exists(base_path).AndReturn(True)
365 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000366 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
367 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
maruel@chromium.org669600d2010-09-01 19:06:31 +0000368 options.stdout.write("\n_____ %s at 42" % self.relpath)
369 options.stdout.write('\n')
tony@chromium.org57564662010-04-14 02:35:12 +0000370
371 self.mox.ReplayAll()
372 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
373 relpath=self.relpath)
374 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000375 self.checkstdout(
376 2 * ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org57564662010-04-14 02:35:12 +0000377
378 def testUpdateSingleCheckoutSVN14(self):
379 options = self.Options(verbose=True)
380 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
381 file_info = {
382 'URL': self.url,
383 'Revision': 42,
384 }
385
386 # Checks to make sure that we support svn co --depth.
387 gclient_scm.scm.SVN.current_version = None
388 gclient_scm.scm.SVN.Capture(['--version']
389 ).AndReturn('svn, version 1.4.4 (r25188)')
390 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path)
391 ).AndReturn(True)
392
393 # When checking out a single file with svn 1.4, we use svn export
394 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000395 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
396 ['svn', 'export', gclient_scm.os.path.join(self.url, 'DEPS'),
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000397 gclient_scm.os.path.join(base_path, 'DEPS')],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000398 always=True, cwd=self.root_dir, stdout=options.stdout)
tony@chromium.org57564662010-04-14 02:35:12 +0000399
400 self.mox.ReplayAll()
401 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
402 relpath=self.relpath)
403 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000404 self.checkstdout('')
tony@chromium.org57564662010-04-14 02:35:12 +0000405
406 def testUpdateSingleCheckoutSVNUpgrade(self):
407 options = self.Options(verbose=True)
408 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
409 file_info = {
410 'URL': self.url,
411 'Revision': 42,
412 }
413
414 # Checks to make sure that we support svn co --depth.
415 gclient_scm.scm.SVN.current_version = None
416 gclient_scm.scm.SVN.Capture(['--version']
417 ).AndReturn('svn, version 1.5.1 (r32289)')
418 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
419 ).AndReturn(False)
420 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
421 # the old DEPS file.
422 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, 'DEPS')
423 ).AndReturn(True)
424 gclient_scm.os.remove(gclient_scm.os.path.join(base_path, 'DEPS'))
425
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000426 # Verify no locked files.
427 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
428 ).AndReturn([])
429
tony@chromium.org57564662010-04-14 02:35:12 +0000430 # When checking out a single file, we issue an svn checkout and svn update.
431 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000432 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
433 ['svn', 'checkout', '--depth', 'empty', self.url, base_path],
434 always=True, cwd=self.root_dir, stdout=options.stdout)
maruel@chromium.org03807072010-08-16 17:18:44 +0000435 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, ['update', 'DEPS'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000436 cwd=base_path, file_list=files_list, stdout=options.stdout)
tony@chromium.org57564662010-04-14 02:35:12 +0000437
438 # Now we fall back on scm.update().
439 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
440 ).AndReturn(False)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000441 gclient_scm.os.path.exists(base_path).AndReturn(True)
442 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000443 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
444 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000445
446 self.mox.ReplayAll()
447 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
448 relpath=self.relpath)
449 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000450 self.checkstdout(
451 ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000452
453 def testUpdateSingleUpdate(self):
454 options = self.Options(verbose=True)
455 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
456 file_info = {
457 'URL': self.url,
458 'Revision': 42,
459 }
tony@chromium.org57564662010-04-14 02:35:12 +0000460 # Checks to make sure that we support svn co --depth.
461 gclient_scm.scm.SVN.current_version = None
462 gclient_scm.scm.SVN.Capture(['--version']
463 ).AndReturn('svn, version 1.5.1 (r32289)')
464 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
465 ).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000466
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000467 # Verify no locked files.
468 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
469 ).AndReturn([])
470
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000471 # Now we fall back on scm.update().
472 files_list = self.mox.CreateMockAnything()
473 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
474 ).AndReturn(False)
475 gclient_scm.os.path.exists(base_path).AndReturn(True)
476 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000477 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
478 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000479
480 self.mox.ReplayAll()
481 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
482 relpath=self.relpath)
483 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000484 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000485
msb@chromium.orge28e4982009-09-25 20:51:45 +0000486 def testUpdateGit(self):
487 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000488 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
489 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000490
491 self.mox.ReplayAll()
492 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
493 relpath=self.relpath)
494 file_list = []
495 scm.update(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000496 self.checkstdout(
497 ('________ found .git directory; skipping %s\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000498
msb@chromium.orge28e4982009-09-25 20:51:45 +0000499
msb@chromium.org5bde4852009-12-14 16:47:12 +0000500class GitWrapperTestCase(BaseTestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000501 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000502 class OptionsObject(object):
503 def __init__(self, test_case, verbose=False, revision=None):
504 self.verbose = verbose
505 self.revision = revision
506 self.manually_grab_svn_rev = True
507 self.deps_os = None
508 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000509 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000510 self.nohooks = False
maruel@chromium.org54019f32010-09-09 13:50:11 +0000511 self.stdout = StringIO.StringIO()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000512
513 sample_git_import = """blob
514mark :1
515data 6
516Hello
517
518blob
519mark :2
520data 4
521Bye
522
523reset refs/heads/master
524commit refs/heads/master
525mark :3
526author Bob <bob@example.com> 1253744361 -0700
527committer Bob <bob@example.com> 1253744361 -0700
528data 8
529A and B
530M 100644 :1 a
531M 100644 :2 b
532
533blob
534mark :4
535data 10
536Hello
537You
538
539blob
540mark :5
541data 8
542Bye
543You
544
545commit refs/heads/origin
546mark :6
547author Alice <alice@example.com> 1253744424 -0700
548committer Alice <alice@example.com> 1253744424 -0700
549data 13
550Personalized
551from :3
552M 100644 :4 a
553M 100644 :5 b
554
555reset refs/heads/master
556from :3
557"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000558 def Options(self, *args, **kwargs):
559 return self.OptionsObject(self, *args, **kwargs)
560
561 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000562 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000563 try:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000564 Popen(['git', 'init'], stdout=PIPE, stderr=STDOUT,
565 cwd=path).communicate()
566 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000567 # git is not available, skip this test.
568 return False
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000569 Popen(['git', 'fast-import'], stdin=PIPE, stdout=PIPE, stderr=STDOUT,
570 cwd=path).communicate(input=git_import)
571 Popen(['git', 'checkout'], stdout=PIPE, stderr=STDOUT,
572 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000573 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
574 stderr=STDOUT, cwd=path).communicate()
575 Popen(['git', 'checkout', '-b', 'new', 'origin/master'], stdout=PIPE,
576 stderr=STDOUT, cwd=path).communicate()
577 Popen(['git', 'push', 'origin', 'origin/origin:origin/master'], stdout=PIPE,
578 stderr=STDOUT, cwd=path).communicate()
579 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
580 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000581 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000582
msb@chromium.orge28e4982009-09-25 20:51:45 +0000583 def setUp(self):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000584 self.args = self.Args()
585 self.url = 'git://foo'
586 self.root_dir = tempfile.mkdtemp()
587 self.relpath = '.'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000588 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000589 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000590 BaseTestBase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000591
592 def tearDown(self):
maruel@chromium.org54019f32010-09-09 13:50:11 +0000593 BaseTestBase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000594 rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000595
596 def testDir(self):
597 members = [
maruel@chromium.org55e724e2010-03-11 19:36:49 +0000598 'FullUrlForRelativeUrl', 'RunCommand',
msb@chromium.orge6f78352010-01-13 17:05:33 +0000599 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000600 'revinfo', 'runhooks', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000601 ]
602
603 # If you add a member, be sure to add the relevant test!
604 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
605
606 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000607 if not self.enabled:
608 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000609 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000610 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000611 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
612 relpath=self.relpath)
613 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000614 scm.update(options, None, file_list)
615 gclient_scm.os.remove(file_path)
616 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000617 scm.revert(options, self.args, file_list)
618 self.assertEquals(file_list, [file_path])
619 file_list = []
620 scm.diff(options, self.args, file_list)
621 self.assertEquals(file_list, [])
622
623 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000624 if not self.enabled:
625 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000626 options = self.Options()
627 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
628 relpath=self.relpath)
629 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000630 scm.update(options, None, file_list)
631 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000632 scm.revert(options, self.args, file_list)
633 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000634 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000635 'a7142dc9f0009350b96a11f372b6ea658592aa95')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000636
637
638 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000639 if not self.enabled:
640 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000641 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000642 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
643 relpath=self.relpath)
644 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000645 scm.update(options, None, file_list)
646 file_path = gclient_scm.os.path.join(self.base_path, 'a')
647 open(file_path, 'a').writelines('touched\n')
648 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000649 scm.revert(options, self.args, file_list)
650 self.assertEquals(file_list, [file_path])
651 file_list = []
652 scm.diff(options, self.args, file_list)
653 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000654 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000655 'a7142dc9f0009350b96a11f372b6ea658592aa95')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000656
657 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000658 if not self.enabled:
659 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000660 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000661 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
662 relpath=self.relpath)
663 file_list = []
664 scm.update(options, None, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000665 file_path = gclient_scm.os.path.join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000666 f = open(file_path, 'w')
667 f.writelines('new\n')
668 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000669 Popen(['git', 'add', 'c'], stdout=PIPE,
670 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000671 file_list = []
672 scm.revert(options, self.args, file_list)
673 self.assertEquals(file_list, [file_path])
674 file_list = []
675 scm.diff(options, self.args, file_list)
676 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000677 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000678 'a7142dc9f0009350b96a11f372b6ea658592aa95')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000679
680 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000681 if not self.enabled:
682 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000683 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000684 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000685 open(file_path, 'a').writelines('touched\n')
686 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
687 relpath=self.relpath)
688 file_list = []
689 scm.status(options, self.args, file_list)
690 self.assertEquals(file_list, [file_path])
691
692 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000693 if not self.enabled:
694 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000695 options = self.Options()
696 expected_file_list = []
697 for f in ['a', 'b']:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000698 file_path = gclient_scm.os.path.join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000699 open(file_path, 'a').writelines('touched\n')
700 expected_file_list.extend([file_path])
701 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
702 relpath=self.relpath)
703 file_list = []
704 scm.status(options, self.args, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000705 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
706 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000707 self.assertEquals(sorted(file_list), expected_file_list)
708
709 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000710 if not self.enabled:
711 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000712 options = self.Options(verbose=True)
713 root_dir = tempfile.mkdtemp()
714 relpath = 'foo'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000715 base_path = gclient_scm.os.path.join(root_dir, relpath)
716 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000717 try:
718 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
719 relpath=relpath)
720 file_list = []
721 scm.update(options, (), file_list)
722 self.assertEquals(len(file_list), 2)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000723 self.assert_(gclient_scm.os.path.isfile(
724 gclient_scm.os.path.join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000725 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000726 '069c602044c5388d2d15c3f875b057c852003458')
727 finally:
maruel@chromium.orgba551772010-02-03 18:21:42 +0000728 rmtree(root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000729
730 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000731 if not self.enabled:
732 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000733 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000734 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
735 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000736 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
737 relpath=self.relpath)
738 file_list = []
739 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000740 self.assertEquals(file_list, expected_file_list)
741 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000742 'a7142dc9f0009350b96a11f372b6ea658592aa95')
743
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000744 def testUpdateUnstagedConflict(self):
745 if not self.enabled:
746 return
747 options = self.Options()
748 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
749 relpath=self.relpath)
750 file_path = gclient_scm.os.path.join(self.base_path, 'b')
751 f = open(file_path, 'w').writelines('conflict\n')
752 exception = (
753 "error: Your local changes to 'b' would be overwritten by merge. "
754 "Aborting.\n"
755 "Please, commit your changes or stash them before you can merge.\n")
756 self.assertRaisesError(exception, scm.update, options, (), [])
757
msb@chromium.org5bde4852009-12-14 16:47:12 +0000758 def testUpdateConflict(self):
759 if not self.enabled:
760 return
761 options = self.Options()
762 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
763 relpath=self.relpath)
764 file_path = gclient_scm.os.path.join(self.base_path, 'b')
765 f = open(file_path, 'w').writelines('conflict\n')
766 scm._Run(['commit', '-am', 'test'])
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000767 self.mox.StubOutWithMock(__builtin__, 'raw_input')
768 __builtin__.raw_input.__call__(mox.StrContains('Cannot fast-forward merge, '
769 'attempt to rebase? (y)es / '
770 '(q)uit / (s)kip : ')
771 ).AndReturn('y')
772 self.mox.ReplayAll()
msb@chromium.org5bde4852009-12-14 16:47:12 +0000773 exception = \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000774 'Conflict while rebasing this branch.\n' \
msb@chromium.org5bde4852009-12-14 16:47:12 +0000775 'Fix the conflict and run gclient again.\n' \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000776 "See 'man git-rebase' for details.\n"
msb@chromium.org5bde4852009-12-14 16:47:12 +0000777 self.assertRaisesError(exception, scm.update, options, (), [])
778 exception = \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000779 '\n____ . at refs/heads/master\n' \
msb@chromium.org786fb682010-06-02 15:16:23 +0000780 '\tYou have unstaged changes.\n' \
781 '\tPlease commit, stash, or reset.\n'
msb@chromium.org5bde4852009-12-14 16:47:12 +0000782 self.assertRaisesError(exception, scm.update, options, (), [])
783
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000784 def testUpdateNotGit(self):
785 if not self.enabled:
786 return
787 options = self.Options()
788 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
789 relpath=self.relpath)
790 git_path = gclient_scm.os.path.join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +0000791 rename(git_path, git_path + 'foo')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000792 exception = \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000793 '\n____ . at refs/heads/master\n' \
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000794 '\tPath is not a git repo. No .git dir.\n' \
795 '\tTo resolve:\n' \
796 '\t\trm -rf .\n' \
797 '\tAnd run gclient sync again\n'
798 self.assertRaisesError(exception, scm.update, options, (), [])
799
msb@chromium.org0f282062009-11-06 20:14:02 +0000800 def testRevinfo(self):
801 if not self.enabled:
802 return
803 options = self.Options()
804 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
805 relpath=self.relpath)
806 rev_info = scm.revinfo(options, (), None)
807 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
808
msb@chromium.orge28e4982009-09-25 20:51:45 +0000809
msb@chromium.orge28e4982009-09-25 20:51:45 +0000810if __name__ == '__main__':
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000811 import unittest
msb@chromium.orge28e4982009-09-25 20:51:45 +0000812 unittest.main()
813
814# vim: ts=2:sw=2:tw=80:et: