blob: 61146b4a4d72043ed8aa3ebadca143d7eead1b00 [file] [log] [blame]
msb@chromium.orge28e4982009-09-25 20:51:45 +00001#!/usr/bin/python
2#
3# Copyright 2008-2009 Google Inc. All Rights Reserved.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17"""Unit tests for gclient_scm.py."""
18
msb@chromium.orge4af1ab2010-01-13 21:26:09 +000019import os
msb@chromium.orge28e4982009-09-25 20:51:45 +000020import shutil
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000021# Import it before super_mox to keep a valid reference.
22from subprocess import Popen, PIPE, STDOUT
msb@chromium.orge28e4982009-09-25 20:51:45 +000023import tempfile
msb@chromium.orge28e4982009-09-25 20:51:45 +000024
msb@chromium.orge28e4982009-09-25 20:51:45 +000025import gclient_scm
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000026from gclient_test import BaseTestCase as GCBaseTestCase
27from super_mox import mox, SuperMoxBaseTestBase
msb@chromium.orge28e4982009-09-25 20:51:45 +000028
29
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000030class BaseTestCase(GCBaseTestCase):
31 def setUp(self):
32 GCBaseTestCase.setUp(self)
33 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
34 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
35 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'SubprocessCall')
36 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000037 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo
38 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
39 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo')
40 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
41 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Run')
42 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000043 self._scm_wrapper = gclient_scm.CreateSCM
44
45
46class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000047 class OptionsObject(object):
48 def __init__(self, test_case, verbose=False, revision=None):
49 self.verbose = verbose
50 self.revision = revision
51 self.manually_grab_svn_rev = True
52 self.deps_os = None
53 self.force = False
54 self.nohooks = False
55
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000056 def Options(self, *args, **kwargs):
57 return self.OptionsObject(self, *args, **kwargs)
58
msb@chromium.orge28e4982009-09-25 20:51:45 +000059 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000060 BaseTestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +000061 self.root_dir = self.Dir()
62 self.args = self.Args()
63 self.url = self.Url()
64 self.relpath = 'asf'
65
66 def testDir(self):
67 members = [
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000068 'COMMAND', 'Capture', 'CaptureHeadRevision', 'CaptureInfo',
maruel@chromium.orgf2f9d552009-12-22 00:12:57 +000069 'CaptureStatus', 'DiffItem', 'GenerateDiff', 'GetCheckoutRoot',
msb@chromium.orge6f78352010-01-13 17:05:33 +000070 'GetEmail', 'GetFileProperty', 'FullUrlForRelativeUrl', 'IsMoved',
71 'ReadSimpleAuth', 'Run', 'RunAndFilterOutput', 'RunAndGetFileList',
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000072 'RunCommand', 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
73 'revinfo', 'runhooks', 'scm_name', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +000074 ]
75
76 # If you add a member, be sure to add the relevant test!
77 self.compareMembers(self._scm_wrapper(), members)
78
79 def testUnsupportedSCM(self):
80 args = [self.url, self.root_dir, self.relpath]
81 kwargs = {'scm_name' : 'foo'}
82 exception_msg = 'Unsupported scm %(scm_name)s' % kwargs
83 self.assertRaisesError(exception_msg, self._scm_wrapper, *args, **kwargs)
84
msb@chromium.orge6f78352010-01-13 17:05:33 +000085 def testSVNFullUrlForRelativeUrl(self):
86 self.url = 'svn://a/b/c/d'
87
88 self.mox.ReplayAll()
89 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
90 relpath=self.relpath)
91 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
92
93 def testGITFullUrlForRelativeUrl(self):
94 self.url = 'git://a/b/c/d'
95
96 self.mox.ReplayAll()
97 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
98 relpath=self.relpath)
99 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
100
msb@chromium.orge28e4982009-09-25 20:51:45 +0000101 def testRunCommandException(self):
102 options = self.Options(verbose=False)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000103 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
104 gclient_scm.os.path.exists(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000105
106 self.mox.ReplayAll()
107 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
108 relpath=self.relpath)
109 exception = "Unsupported argument(s): %s" % ','.join(self.args)
110 self.assertRaisesError(exception, scm.RunCommand,
111 'update', options, self.args)
112
113 def testRunCommandUnknown(self):
114 # TODO(maruel): if ever used.
115 pass
116
117 def testRevertMissing(self):
118 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000119 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
120 gclient_scm.os.path.isdir(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000121 # It'll to a checkout instead.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000122 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
123 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000124 print("\n_____ %s is missing, synching instead" % self.relpath)
125 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000126 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000127 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000128 gclient_scm.scm.SVN.RunAndGetFileList(options,
129 ['checkout', self.url, base_path],
130 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000131
132 self.mox.ReplayAll()
133 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
134 relpath=self.relpath)
135 scm.revert(options, self.args, files_list)
136
137 def testRevertNone(self):
138 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000139 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
140 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000141 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn([])
142 gclient_scm.scm.SVN.RunAndGetFileList(options,
143 ['update', '--revision', 'BASE'],
144 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000145
146 self.mox.ReplayAll()
147 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
148 relpath=self.relpath)
149 file_list = []
150 scm.revert(options, self.args, file_list)
151
152 def testRevert2Files(self):
153 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000154 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
155 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000156 items = [
157 ('M ', 'a'),
158 ('A ', 'b'),
159 ]
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000160 file_path1 = gclient_scm.os.path.join(base_path, 'a')
161 file_path2 = gclient_scm.os.path.join(base_path, 'b')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000162 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000163 gclient_scm.os.path.exists(file_path1).AndReturn(True)
164 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
165 gclient_scm.os.remove(file_path1)
166 gclient_scm.os.path.exists(file_path2).AndReturn(True)
167 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
168 gclient_scm.os.remove(file_path2)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000169 gclient_scm.scm.SVN.RunAndGetFileList(options,
170 ['update', '--revision', 'BASE'],
171 base_path, mox.IgnoreArg())
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000172 print(gclient_scm.os.path.join(base_path, 'a'))
173 print(gclient_scm.os.path.join(base_path, 'b'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000174
175 self.mox.ReplayAll()
176 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
177 relpath=self.relpath)
178 file_list = []
179 scm.revert(options, self.args, file_list)
180
181 def testRevertDirectory(self):
182 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000183 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
184 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000185 items = [
186 ('~ ', 'a'),
187 ]
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000188 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000189 file_path = gclient_scm.os.path.join(base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000190 print(file_path)
191 gclient_scm.os.path.exists(file_path).AndReturn(True)
192 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000193 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000194 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000195 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000196 file_list1 = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000197 gclient_scm.scm.SVN.RunAndGetFileList(options,
198 ['update', '--revision', 'BASE'],
199 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000200
201 self.mox.ReplayAll()
202 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
203 relpath=self.relpath)
204 file_list2 = []
205 scm.revert(options, self.args, file_list2)
206
207 def testStatus(self):
208 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000209 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
210 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000211 gclient_scm.scm.SVN.RunAndGetFileList(options,
212 ['status'] + self.args,
213 base_path, []).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000214
215 self.mox.ReplayAll()
216 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
217 relpath=self.relpath)
218 file_list = []
219 self.assertEqual(scm.status(options, self.args, file_list), None)
220
221
222 # TODO(maruel): TEST REVISIONS!!!
223 # TODO(maruel): TEST RELOCATE!!!
224 def testUpdateCheckout(self):
225 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000226 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
227 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000228 file_info.root = 'blah'
229 file_info.url = self.url
230 file_info.uuid = 'ABC'
231 file_info.revision = 42
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000232 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
233 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000234 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000235 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000236 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000237 gclient_scm.scm.SVN.RunAndGetFileList(options,
238 ['checkout', self.url, base_path],
239 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000240 self.mox.ReplayAll()
241 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
242 relpath=self.relpath)
243 scm.update(options, (), files_list)
244
245 def testUpdateUpdate(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)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000248 options.force = True
249 options.nohooks = False
250 file_info = {
251 'Repository Root': 'blah',
252 'URL': self.url,
253 'UUID': 'ABC',
254 'Revision': 42,
255 }
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000256 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
257 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000258 # Checkout or update.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000259 gclient_scm.os.path.exists(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000260 gclient_scm.scm.SVN.CaptureInfo(
261 gclient_scm.os.path.join(base_path, "."), '.'
262 ).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000263 # Cheat a bit here.
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000264 gclient_scm.scm.SVN.CaptureInfo(file_info['URL'], '.').AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000265 additional_args = []
266 if options.manually_grab_svn_rev:
267 additional_args = ['--revision', str(file_info['Revision'])]
268 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000269 gclient_scm.scm.SVN.RunAndGetFileList(
270 options,
271 ['update', base_path] + additional_args,
272 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000273
274 self.mox.ReplayAll()
275 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
276 relpath=self.relpath)
277 scm.update(options, (), files_list)
278
279 def testUpdateGit(self):
280 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000281 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
282 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000283 print("________ found .git directory; skipping %s" % self.relpath)
284
285 self.mox.ReplayAll()
286 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
287 relpath=self.relpath)
288 file_list = []
289 scm.update(options, self.args, file_list)
290
msb@chromium.orge28e4982009-09-25 20:51:45 +0000291
msb@chromium.org5bde4852009-12-14 16:47:12 +0000292class GitWrapperTestCase(BaseTestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000293 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000294 class OptionsObject(object):
295 def __init__(self, test_case, verbose=False, revision=None):
296 self.verbose = verbose
297 self.revision = revision
298 self.manually_grab_svn_rev = True
299 self.deps_os = None
300 self.force = False
301 self.nohooks = False
302
303 sample_git_import = """blob
304mark :1
305data 6
306Hello
307
308blob
309mark :2
310data 4
311Bye
312
313reset refs/heads/master
314commit refs/heads/master
315mark :3
316author Bob <bob@example.com> 1253744361 -0700
317committer Bob <bob@example.com> 1253744361 -0700
318data 8
319A and B
320M 100644 :1 a
321M 100644 :2 b
322
323blob
324mark :4
325data 10
326Hello
327You
328
329blob
330mark :5
331data 8
332Bye
333You
334
335commit refs/heads/origin
336mark :6
337author Alice <alice@example.com> 1253744424 -0700
338committer Alice <alice@example.com> 1253744424 -0700
339data 13
340Personalized
341from :3
342M 100644 :4 a
343M 100644 :5 b
344
345reset refs/heads/master
346from :3
347"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000348 def Options(self, *args, **kwargs):
349 return self.OptionsObject(self, *args, **kwargs)
350
351 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000352 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000353 try:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000354 Popen(['git', 'init'], stdout=PIPE, stderr=STDOUT,
355 cwd=path).communicate()
356 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000357 # git is not available, skip this test.
358 return False
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000359 Popen(['git', 'fast-import'], stdin=PIPE, stdout=PIPE, stderr=STDOUT,
360 cwd=path).communicate(input=git_import)
361 Popen(['git', 'checkout'], stdout=PIPE, stderr=STDOUT,
362 cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000363 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000364
msb@chromium.orge28e4982009-09-25 20:51:45 +0000365 def setUp(self):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000366 self.args = self.Args()
367 self.url = 'git://foo'
368 self.root_dir = tempfile.mkdtemp()
369 self.relpath = '.'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000370 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000371 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000372 SuperMoxBaseTestBase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000373
374 def tearDown(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000375 SuperMoxBaseTestBase.tearDown(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000376 shutil.rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000377
378 def testDir(self):
379 members = [
maruel@chromium.orgf2f9d552009-12-22 00:12:57 +0000380 'COMMAND', 'Capture', 'CaptureStatus', 'FetchUpstreamTuple',
msb@chromium.orge6f78352010-01-13 17:05:33 +0000381 'FullUrlForRelativeUrl', 'GenerateDiff', 'GetBranch', 'GetBranchRef',
382 'GetCheckoutRoot', 'GetDifferentFiles', 'GetEmail', 'GetPatchName',
383 'GetSVNBranch', 'GetUpstream', 'IsGitSvn', 'RunAndFilterOutput',
384 'ShortBranchName', 'RunCommand',
385 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000386 'revinfo', 'runhooks', 'scm_name', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000387 ]
388
389 # If you add a member, be sure to add the relevant test!
390 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
391
392 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000393 if not self.enabled:
394 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000395 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000396 file_path = gclient_scm.os.path.join(self.base_path, 'a')
397 gclient_scm.os.remove(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000398 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
399 relpath=self.relpath)
400 file_list = []
401 scm.revert(options, self.args, file_list)
402 self.assertEquals(file_list, [file_path])
403 file_list = []
404 scm.diff(options, self.args, file_list)
405 self.assertEquals(file_list, [])
406
407 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000408 if not self.enabled:
409 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000410 options = self.Options()
411 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
412 relpath=self.relpath)
413 file_list = []
414 scm.revert(options, self.args, file_list)
415 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000416 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000417 '069c602044c5388d2d15c3f875b057c852003458')
418
419
420 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000421 if not self.enabled:
422 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000423 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000424 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000425 open(file_path, 'a').writelines('touched\n')
426 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
427 relpath=self.relpath)
428 file_list = []
429 scm.revert(options, self.args, file_list)
430 self.assertEquals(file_list, [file_path])
431 file_list = []
432 scm.diff(options, self.args, file_list)
433 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000434 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000435 '069c602044c5388d2d15c3f875b057c852003458')
436
437 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000438 if not self.enabled:
439 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000440 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000441 file_path = gclient_scm.os.path.join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000442 f = open(file_path, 'w')
443 f.writelines('new\n')
444 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000445 Popen(['git', 'add', 'c'], stdout=PIPE,
446 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000447 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
448 relpath=self.relpath)
449 file_list = []
450 scm.revert(options, self.args, file_list)
451 self.assertEquals(file_list, [file_path])
452 file_list = []
453 scm.diff(options, self.args, file_list)
454 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000455 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000456 '069c602044c5388d2d15c3f875b057c852003458')
457
458 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000459 if not self.enabled:
460 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000461 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000462 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000463 open(file_path, 'a').writelines('touched\n')
464 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
465 relpath=self.relpath)
466 file_list = []
467 scm.status(options, self.args, file_list)
468 self.assertEquals(file_list, [file_path])
469
470 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000471 if not self.enabled:
472 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000473 options = self.Options()
474 expected_file_list = []
475 for f in ['a', 'b']:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000476 file_path = gclient_scm.os.path.join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000477 open(file_path, 'a').writelines('touched\n')
478 expected_file_list.extend([file_path])
479 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
480 relpath=self.relpath)
481 file_list = []
482 scm.status(options, self.args, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000483 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
484 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000485 self.assertEquals(sorted(file_list), expected_file_list)
486
487 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000488 if not self.enabled:
489 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000490 options = self.Options(verbose=True)
491 root_dir = tempfile.mkdtemp()
492 relpath = 'foo'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000493 base_path = gclient_scm.os.path.join(root_dir, relpath)
494 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000495 try:
496 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
497 relpath=relpath)
498 file_list = []
499 scm.update(options, (), file_list)
500 self.assertEquals(len(file_list), 2)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000501 self.assert_(gclient_scm.os.path.isfile(
502 gclient_scm.os.path.join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000503 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000504 '069c602044c5388d2d15c3f875b057c852003458')
505 finally:
506 shutil.rmtree(root_dir)
507
508 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000509 if not self.enabled:
510 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000511 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000512 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
513 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000514 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
515 relpath=self.relpath)
516 file_list = []
517 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000518 self.assertEquals(file_list, expected_file_list)
519 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000520 'a7142dc9f0009350b96a11f372b6ea658592aa95')
521
msb@chromium.org5bde4852009-12-14 16:47:12 +0000522 def testUpdateConflict(self):
523 if not self.enabled:
524 return
525 options = self.Options()
526 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
527 relpath=self.relpath)
528 file_path = gclient_scm.os.path.join(self.base_path, 'b')
529 f = open(file_path, 'w').writelines('conflict\n')
530 scm._Run(['commit', '-am', 'test'])
531 exception = \
532 '\n____ .\n' \
533 '\nConflict while rebasing this branch.\n' \
534 'Fix the conflict and run gclient again.\n' \
535 'See man git-rebase for details.\n'
536 self.assertRaisesError(exception, scm.update, options, (), [])
537 exception = \
538 '\n____ .\n' \
539 '\tAlready in a conflict, i.e. (no branch).\n' \
540 '\tFix the conflict and run gclient again.\n' \
541 '\tOr to abort run:\n\t\tgit-rebase --abort\n' \
542 '\tSee man git-rebase for details.\n'
543 self.assertRaisesError(exception, scm.update, options, (), [])
544
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000545 def testUpdateNotGit(self):
546 if not self.enabled:
547 return
548 options = self.Options()
549 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
550 relpath=self.relpath)
551 git_path = gclient_scm.os.path.join(self.base_path, '.git')
552 os.rename(git_path, git_path + 'foo')
553 exception = \
554 '\n____ .\n' \
555 '\tPath is not a git repo. No .git dir.\n' \
556 '\tTo resolve:\n' \
557 '\t\trm -rf .\n' \
558 '\tAnd run gclient sync again\n'
559 self.assertRaisesError(exception, scm.update, options, (), [])
560
msb@chromium.org0f282062009-11-06 20:14:02 +0000561 def testRevinfo(self):
562 if not self.enabled:
563 return
564 options = self.Options()
565 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
566 relpath=self.relpath)
567 rev_info = scm.revinfo(options, (), None)
568 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
569
msb@chromium.orge28e4982009-09-25 20:51:45 +0000570
msb@chromium.orge28e4982009-09-25 20:51:45 +0000571if __name__ == '__main__':
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000572 import unittest
msb@chromium.orge28e4982009-09-25 20:51:45 +0000573 unittest.main()
574
575# vim: ts=2:sw=2:tw=80:et: