blob: 9771dc55be03b4a2e60ddcb354d9f81f4f8e9a1e [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.org8ef5f542009-11-12 02:05:02 +000019from gclient_test import BaseTestCase as GCBaseTestCase
msb@chromium.orge28e4982009-09-25 20:51:45 +000020
21
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000022class BaseTestCase(GCBaseTestCase):
23 def setUp(self):
24 GCBaseTestCase.setUp(self)
25 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
26 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
27 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'SubprocessCall')
28 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000029 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo
30 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
31 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo')
32 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
33 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Run')
34 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000035 self._scm_wrapper = gclient_scm.CreateSCM
36
37
38class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000039 class OptionsObject(object):
40 def __init__(self, test_case, verbose=False, revision=None):
41 self.verbose = verbose
42 self.revision = revision
43 self.manually_grab_svn_rev = True
44 self.deps_os = None
45 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000046 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000047 self.nohooks = False
48
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000049 def Options(self, *args, **kwargs):
50 return self.OptionsObject(self, *args, **kwargs)
51
msb@chromium.orge28e4982009-09-25 20:51:45 +000052 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000053 BaseTestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +000054 self.root_dir = self.Dir()
55 self.args = self.Args()
56 self.url = self.Url()
57 self.relpath = 'asf'
58
59 def testDir(self):
60 members = [
maruel@chromium.org55e724e2010-03-11 19:36:49 +000061 'FullUrlForRelativeUrl', 'RunCommand',
62 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000063 'revinfo', 'runhooks', 'scm_name', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +000064 ]
65
66 # If you add a member, be sure to add the relevant test!
67 self.compareMembers(self._scm_wrapper(), members)
68
69 def testUnsupportedSCM(self):
70 args = [self.url, self.root_dir, self.relpath]
71 kwargs = {'scm_name' : 'foo'}
72 exception_msg = 'Unsupported scm %(scm_name)s' % kwargs
73 self.assertRaisesError(exception_msg, self._scm_wrapper, *args, **kwargs)
74
msb@chromium.orge6f78352010-01-13 17:05:33 +000075 def testSVNFullUrlForRelativeUrl(self):
76 self.url = 'svn://a/b/c/d'
77
78 self.mox.ReplayAll()
79 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
80 relpath=self.relpath)
81 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
82
83 def testGITFullUrlForRelativeUrl(self):
84 self.url = 'git://a/b/c/d'
85
86 self.mox.ReplayAll()
87 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
88 relpath=self.relpath)
89 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
90
msb@chromium.orge28e4982009-09-25 20:51:45 +000091 def testRunCommandException(self):
92 options = self.Options(verbose=False)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000093 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
94 gclient_scm.os.path.exists(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +000095
96 self.mox.ReplayAll()
97 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
98 relpath=self.relpath)
99 exception = "Unsupported argument(s): %s" % ','.join(self.args)
100 self.assertRaisesError(exception, scm.RunCommand,
101 'update', options, self.args)
102
103 def testRunCommandUnknown(self):
104 # TODO(maruel): if ever used.
105 pass
106
107 def testRevertMissing(self):
108 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000109 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
110 gclient_scm.os.path.isdir(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000111 # It'll to a checkout instead.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000112 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
113 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000114 print("\n_____ %s is missing, synching instead" % self.relpath)
115 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000116 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000117 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000118 gclient_scm.scm.SVN.RunAndGetFileList(options,
119 ['checkout', self.url, base_path],
120 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000121
122 self.mox.ReplayAll()
123 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
124 relpath=self.relpath)
125 scm.revert(options, self.args, files_list)
126
127 def testRevertNone(self):
128 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000129 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
130 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000131 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn([])
132 gclient_scm.scm.SVN.RunAndGetFileList(options,
133 ['update', '--revision', 'BASE'],
134 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000135
136 self.mox.ReplayAll()
137 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
138 relpath=self.relpath)
139 file_list = []
140 scm.revert(options, self.args, file_list)
141
142 def testRevert2Files(self):
143 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000144 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
145 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000146 items = [
147 ('M ', 'a'),
148 ('A ', 'b'),
149 ]
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000150 file_path1 = gclient_scm.os.path.join(base_path, 'a')
151 file_path2 = gclient_scm.os.path.join(base_path, 'b')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000152 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000153 gclient_scm.os.path.exists(file_path1).AndReturn(True)
154 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
155 gclient_scm.os.remove(file_path1)
156 gclient_scm.os.path.exists(file_path2).AndReturn(True)
157 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
158 gclient_scm.os.remove(file_path2)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000159 gclient_scm.scm.SVN.RunAndGetFileList(options,
160 ['update', '--revision', 'BASE'],
161 base_path, mox.IgnoreArg())
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000162 print(gclient_scm.os.path.join(base_path, 'a'))
163 print(gclient_scm.os.path.join(base_path, 'b'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000164
165 self.mox.ReplayAll()
166 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
167 relpath=self.relpath)
168 file_list = []
169 scm.revert(options, self.args, file_list)
170
171 def testRevertDirectory(self):
172 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000173 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
174 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000175 items = [
176 ('~ ', 'a'),
177 ]
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000178 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000179 file_path = gclient_scm.os.path.join(base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000180 print(file_path)
181 gclient_scm.os.path.exists(file_path).AndReturn(True)
182 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000183 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000184 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000185 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000186 file_list1 = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000187 gclient_scm.scm.SVN.RunAndGetFileList(options,
188 ['update', '--revision', 'BASE'],
189 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000190
191 self.mox.ReplayAll()
192 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
193 relpath=self.relpath)
194 file_list2 = []
195 scm.revert(options, self.args, file_list2)
196
197 def testStatus(self):
198 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000199 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
200 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000201 gclient_scm.scm.SVN.RunAndGetFileList(options,
202 ['status'] + self.args,
203 base_path, []).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000204
205 self.mox.ReplayAll()
206 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
207 relpath=self.relpath)
208 file_list = []
209 self.assertEqual(scm.status(options, self.args, file_list), None)
210
211
212 # TODO(maruel): TEST REVISIONS!!!
213 # TODO(maruel): TEST RELOCATE!!!
214 def testUpdateCheckout(self):
215 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000216 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
217 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000218 file_info.root = 'blah'
219 file_info.url = self.url
220 file_info.uuid = 'ABC'
221 file_info.revision = 42
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000222 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
223 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000224 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000225 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000226 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000227 gclient_scm.scm.SVN.RunAndGetFileList(options,
228 ['checkout', self.url, base_path],
229 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000230 self.mox.ReplayAll()
231 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
232 relpath=self.relpath)
233 scm.update(options, (), files_list)
234
235 def testUpdateUpdate(self):
236 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000237 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000238 options.force = True
239 options.nohooks = False
240 file_info = {
241 'Repository Root': 'blah',
242 'URL': self.url,
243 'UUID': 'ABC',
244 'Revision': 42,
245 }
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000246 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
247 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000248 # Checkout or update.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000249 gclient_scm.os.path.exists(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000250 gclient_scm.scm.SVN.CaptureInfo(
251 gclient_scm.os.path.join(base_path, "."), '.'
252 ).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000253 # Cheat a bit here.
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000254 gclient_scm.scm.SVN.CaptureInfo(file_info['URL'], '.').AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000255 additional_args = []
256 if options.manually_grab_svn_rev:
257 additional_args = ['--revision', str(file_info['Revision'])]
258 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000259 gclient_scm.scm.SVN.RunAndGetFileList(
260 options,
261 ['update', base_path] + additional_args,
262 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000263
264 self.mox.ReplayAll()
265 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
266 relpath=self.relpath)
267 scm.update(options, (), files_list)
268
269 def testUpdateGit(self):
270 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000271 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
272 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000273 print("________ found .git directory; skipping %s" % self.relpath)
274
275 self.mox.ReplayAll()
276 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
277 relpath=self.relpath)
278 file_list = []
279 scm.update(options, self.args, file_list)
280
msb@chromium.orge28e4982009-09-25 20:51:45 +0000281
msb@chromium.org5bde4852009-12-14 16:47:12 +0000282class GitWrapperTestCase(BaseTestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000283 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000284 class OptionsObject(object):
285 def __init__(self, test_case, verbose=False, revision=None):
286 self.verbose = verbose
287 self.revision = revision
288 self.manually_grab_svn_rev = True
289 self.deps_os = None
290 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000291 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000292 self.nohooks = False
293
294 sample_git_import = """blob
295mark :1
296data 6
297Hello
298
299blob
300mark :2
301data 4
302Bye
303
304reset refs/heads/master
305commit refs/heads/master
306mark :3
307author Bob <bob@example.com> 1253744361 -0700
308committer Bob <bob@example.com> 1253744361 -0700
309data 8
310A and B
311M 100644 :1 a
312M 100644 :2 b
313
314blob
315mark :4
316data 10
317Hello
318You
319
320blob
321mark :5
322data 8
323Bye
324You
325
326commit refs/heads/origin
327mark :6
328author Alice <alice@example.com> 1253744424 -0700
329committer Alice <alice@example.com> 1253744424 -0700
330data 13
331Personalized
332from :3
333M 100644 :4 a
334M 100644 :5 b
335
336reset refs/heads/master
337from :3
338"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000339 def Options(self, *args, **kwargs):
340 return self.OptionsObject(self, *args, **kwargs)
341
342 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000343 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000344 try:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000345 Popen(['git', 'init'], stdout=PIPE, stderr=STDOUT,
346 cwd=path).communicate()
347 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000348 # git is not available, skip this test.
349 return False
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000350 Popen(['git', 'fast-import'], stdin=PIPE, stdout=PIPE, stderr=STDOUT,
351 cwd=path).communicate(input=git_import)
352 Popen(['git', 'checkout'], stdout=PIPE, stderr=STDOUT,
353 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000354 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
355 stderr=STDOUT, cwd=path).communicate()
356 Popen(['git', 'checkout', '-b', 'new', 'origin/master'], stdout=PIPE,
357 stderr=STDOUT, cwd=path).communicate()
358 Popen(['git', 'push', 'origin', 'origin/origin:origin/master'], stdout=PIPE,
359 stderr=STDOUT, cwd=path).communicate()
360 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
361 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000362 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000363
msb@chromium.orge28e4982009-09-25 20:51:45 +0000364 def setUp(self):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000365 self.args = self.Args()
366 self.url = 'git://foo'
367 self.root_dir = tempfile.mkdtemp()
368 self.relpath = '.'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000369 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000370 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000371 SuperMoxBaseTestBase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000372
373 def tearDown(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000374 SuperMoxBaseTestBase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000375 rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000376
377 def testDir(self):
378 members = [
maruel@chromium.org55e724e2010-03-11 19:36:49 +0000379 'FullUrlForRelativeUrl', 'RunCommand',
msb@chromium.orge6f78352010-01-13 17:05:33 +0000380 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000381 'revinfo', 'runhooks', 'scm_name', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000382 ]
383
384 # If you add a member, be sure to add the relevant test!
385 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
386
387 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000388 if not self.enabled:
389 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000390 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000391 file_path = gclient_scm.os.path.join(self.base_path, 'a')
392 gclient_scm.os.remove(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000393 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
394 relpath=self.relpath)
395 file_list = []
396 scm.revert(options, self.args, file_list)
397 self.assertEquals(file_list, [file_path])
398 file_list = []
399 scm.diff(options, self.args, file_list)
400 self.assertEquals(file_list, [])
401
402 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000403 if not self.enabled:
404 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000405 options = self.Options()
406 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
407 relpath=self.relpath)
408 file_list = []
409 scm.revert(options, self.args, file_list)
410 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000411 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000412 '069c602044c5388d2d15c3f875b057c852003458')
413
414
415 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000416 if not self.enabled:
417 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000418 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000419 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000420 open(file_path, 'a').writelines('touched\n')
421 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
422 relpath=self.relpath)
423 file_list = []
424 scm.revert(options, self.args, file_list)
425 self.assertEquals(file_list, [file_path])
426 file_list = []
427 scm.diff(options, self.args, file_list)
428 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000429 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000430 '069c602044c5388d2d15c3f875b057c852003458')
431
432 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000433 if not self.enabled:
434 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000435 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000436 file_path = gclient_scm.os.path.join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000437 f = open(file_path, 'w')
438 f.writelines('new\n')
439 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000440 Popen(['git', 'add', 'c'], stdout=PIPE,
441 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000442 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
443 relpath=self.relpath)
444 file_list = []
445 scm.revert(options, self.args, file_list)
446 self.assertEquals(file_list, [file_path])
447 file_list = []
448 scm.diff(options, self.args, file_list)
449 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000450 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000451 '069c602044c5388d2d15c3f875b057c852003458')
452
453 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000454 if not self.enabled:
455 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000456 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000457 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000458 open(file_path, 'a').writelines('touched\n')
459 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
460 relpath=self.relpath)
461 file_list = []
462 scm.status(options, self.args, file_list)
463 self.assertEquals(file_list, [file_path])
464
465 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000466 if not self.enabled:
467 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000468 options = self.Options()
469 expected_file_list = []
470 for f in ['a', 'b']:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000471 file_path = gclient_scm.os.path.join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000472 open(file_path, 'a').writelines('touched\n')
473 expected_file_list.extend([file_path])
474 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
475 relpath=self.relpath)
476 file_list = []
477 scm.status(options, self.args, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000478 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
479 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000480 self.assertEquals(sorted(file_list), expected_file_list)
481
482 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000483 if not self.enabled:
484 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000485 options = self.Options(verbose=True)
486 root_dir = tempfile.mkdtemp()
487 relpath = 'foo'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000488 base_path = gclient_scm.os.path.join(root_dir, relpath)
489 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000490 try:
491 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
492 relpath=relpath)
493 file_list = []
494 scm.update(options, (), file_list)
495 self.assertEquals(len(file_list), 2)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000496 self.assert_(gclient_scm.os.path.isfile(
497 gclient_scm.os.path.join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000498 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000499 '069c602044c5388d2d15c3f875b057c852003458')
500 finally:
maruel@chromium.orgba551772010-02-03 18:21:42 +0000501 rmtree(root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000502
503 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000504 if not self.enabled:
505 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000506 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000507 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
508 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000509 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
510 relpath=self.relpath)
511 file_list = []
512 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000513 self.assertEquals(file_list, expected_file_list)
514 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000515 'a7142dc9f0009350b96a11f372b6ea658592aa95')
516
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000517 def testUpdateUnstagedConflict(self):
518 if not self.enabled:
519 return
520 options = self.Options()
521 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
522 relpath=self.relpath)
523 file_path = gclient_scm.os.path.join(self.base_path, 'b')
524 f = open(file_path, 'w').writelines('conflict\n')
525 exception = (
526 "error: Your local changes to 'b' would be overwritten by merge. "
527 "Aborting.\n"
528 "Please, commit your changes or stash them before you can merge.\n")
529 self.assertRaisesError(exception, scm.update, options, (), [])
530
msb@chromium.org5bde4852009-12-14 16:47:12 +0000531 def testUpdateConflict(self):
532 if not self.enabled:
533 return
534 options = self.Options()
535 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
536 relpath=self.relpath)
537 file_path = gclient_scm.os.path.join(self.base_path, 'b')
538 f = open(file_path, 'w').writelines('conflict\n')
539 scm._Run(['commit', '-am', 'test'])
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000540 self.mox.StubOutWithMock(__builtin__, 'raw_input')
541 __builtin__.raw_input.__call__(mox.StrContains('Cannot fast-forward merge, '
542 'attempt to rebase? (y)es / '
543 '(q)uit / (s)kip : ')
544 ).AndReturn('y')
545 self.mox.ReplayAll()
msb@chromium.org5bde4852009-12-14 16:47:12 +0000546 exception = \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000547 'Conflict while rebasing this branch.\n' \
msb@chromium.org5bde4852009-12-14 16:47:12 +0000548 'Fix the conflict and run gclient again.\n' \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000549 "See 'man git-rebase' for details.\n"
msb@chromium.org5bde4852009-12-14 16:47:12 +0000550 self.assertRaisesError(exception, scm.update, options, (), [])
551 exception = \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000552 '\n____ . at refs/heads/master\n' \
msb@chromium.org5bde4852009-12-14 16:47:12 +0000553 '\tAlready in a conflict, i.e. (no branch).\n' \
554 '\tFix the conflict and run gclient again.\n' \
555 '\tOr to abort run:\n\t\tgit-rebase --abort\n' \
556 '\tSee man git-rebase for details.\n'
557 self.assertRaisesError(exception, scm.update, options, (), [])
558
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000559 def testUpdateNotGit(self):
560 if not self.enabled:
561 return
562 options = self.Options()
563 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
564 relpath=self.relpath)
565 git_path = gclient_scm.os.path.join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +0000566 rename(git_path, git_path + 'foo')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000567 exception = \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000568 '\n____ . at refs/heads/master\n' \
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000569 '\tPath is not a git repo. No .git dir.\n' \
570 '\tTo resolve:\n' \
571 '\t\trm -rf .\n' \
572 '\tAnd run gclient sync again\n'
573 self.assertRaisesError(exception, scm.update, options, (), [])
574
msb@chromium.org0f282062009-11-06 20:14:02 +0000575 def testRevinfo(self):
576 if not self.enabled:
577 return
578 options = self.Options()
579 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
580 relpath=self.relpath)
581 rev_info = scm.revinfo(options, (), None)
582 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
583
msb@chromium.orge28e4982009-09-25 20:51:45 +0000584
msb@chromium.orge28e4982009-09-25 20:51:45 +0000585if __name__ == '__main__':
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000586 import unittest
msb@chromium.orge28e4982009-09-25 20:51:45 +0000587 unittest.main()
588
589# vim: ts=2:sw=2:tw=80:et: