blob: 77c14322dd738d226848b932a0bd8e3f36923ece [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.orge28e4982009-09-25 20:51:45 +000019import shutil
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000020# Import it before super_mox to keep a valid reference.
21from subprocess import Popen, PIPE, STDOUT
msb@chromium.orge28e4982009-09-25 20:51:45 +000022import tempfile
msb@chromium.orge28e4982009-09-25 20:51:45 +000023
msb@chromium.orge28e4982009-09-25 20:51:45 +000024import gclient_scm
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000025from gclient_test import BaseTestCase as GCBaseTestCase
26from super_mox import mox, SuperMoxBaseTestBase
msb@chromium.orge28e4982009-09-25 20:51:45 +000027
28
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000029class BaseTestCase(GCBaseTestCase):
30 def setUp(self):
31 GCBaseTestCase.setUp(self)
32 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
33 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
34 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'SubprocessCall')
35 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000036 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo
37 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
38 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo')
39 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
40 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Run')
41 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000042 self._scm_wrapper = gclient_scm.CreateSCM
43
44
45class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000046 class OptionsObject(object):
47 def __init__(self, test_case, verbose=False, revision=None):
48 self.verbose = verbose
49 self.revision = revision
50 self.manually_grab_svn_rev = True
51 self.deps_os = None
52 self.force = False
53 self.nohooks = False
54
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000055 def Options(self, *args, **kwargs):
56 return self.OptionsObject(self, *args, **kwargs)
57
msb@chromium.orge28e4982009-09-25 20:51:45 +000058 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000059 BaseTestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +000060 self.root_dir = self.Dir()
61 self.args = self.Args()
62 self.url = self.Url()
63 self.relpath = 'asf'
64
65 def testDir(self):
66 members = [
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000067 'COMMAND', 'Capture', 'CaptureHeadRevision', 'CaptureInfo',
maruel@chromium.orgf2f9d552009-12-22 00:12:57 +000068 'CaptureStatus', 'DiffItem', 'GenerateDiff', 'GetCheckoutRoot',
69 'GetEmail', 'GetFileProperty', 'IsMoved', 'ReadSimpleAuth', 'Run',
maruel@chromium.orgc78f2462009-11-21 01:20:57 +000070 'RunAndFilterOutput', 'RunAndGetFileList',
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000071 'RunCommand', 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
72 'revinfo', 'runhooks', 'scm_name', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +000073 ]
74
75 # If you add a member, be sure to add the relevant test!
76 self.compareMembers(self._scm_wrapper(), members)
77
78 def testUnsupportedSCM(self):
79 args = [self.url, self.root_dir, self.relpath]
80 kwargs = {'scm_name' : 'foo'}
81 exception_msg = 'Unsupported scm %(scm_name)s' % kwargs
82 self.assertRaisesError(exception_msg, self._scm_wrapper, *args, **kwargs)
83
msb@chromium.orge28e4982009-09-25 20:51:45 +000084 def testRunCommandException(self):
85 options = self.Options(verbose=False)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000086 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
87 gclient_scm.os.path.exists(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +000088
89 self.mox.ReplayAll()
90 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
91 relpath=self.relpath)
92 exception = "Unsupported argument(s): %s" % ','.join(self.args)
93 self.assertRaisesError(exception, scm.RunCommand,
94 'update', options, self.args)
95
96 def testRunCommandUnknown(self):
97 # TODO(maruel): if ever used.
98 pass
99
100 def testRevertMissing(self):
101 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000102 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
103 gclient_scm.os.path.isdir(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000104 # It'll to a checkout instead.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000105 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
106 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000107 print("\n_____ %s is missing, synching instead" % self.relpath)
108 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000109 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000110 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000111 gclient_scm.scm.SVN.RunAndGetFileList(options,
112 ['checkout', self.url, base_path],
113 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000114
115 self.mox.ReplayAll()
116 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
117 relpath=self.relpath)
118 scm.revert(options, self.args, files_list)
119
120 def testRevertNone(self):
121 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000122 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
123 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000124 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn([])
125 gclient_scm.scm.SVN.RunAndGetFileList(options,
126 ['update', '--revision', 'BASE'],
127 base_path, mox.IgnoreArg())
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 file_list = []
133 scm.revert(options, self.args, file_list)
134
135 def testRevert2Files(self):
136 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000137 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
138 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000139 items = [
140 ('M ', 'a'),
141 ('A ', 'b'),
142 ]
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000143 file_path1 = gclient_scm.os.path.join(base_path, 'a')
144 file_path2 = gclient_scm.os.path.join(base_path, 'b')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000145 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000146 gclient_scm.os.path.exists(file_path1).AndReturn(True)
147 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
148 gclient_scm.os.remove(file_path1)
149 gclient_scm.os.path.exists(file_path2).AndReturn(True)
150 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
151 gclient_scm.os.remove(file_path2)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000152 gclient_scm.scm.SVN.RunAndGetFileList(options,
153 ['update', '--revision', 'BASE'],
154 base_path, mox.IgnoreArg())
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000155 print(gclient_scm.os.path.join(base_path, 'a'))
156 print(gclient_scm.os.path.join(base_path, 'b'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000157
158 self.mox.ReplayAll()
159 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
160 relpath=self.relpath)
161 file_list = []
162 scm.revert(options, self.args, file_list)
163
164 def testRevertDirectory(self):
165 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000166 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
167 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000168 items = [
169 ('~ ', 'a'),
170 ]
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000171 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000172 file_path = gclient_scm.os.path.join(base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000173 print(file_path)
174 gclient_scm.os.path.exists(file_path).AndReturn(True)
175 gclient_scm.os.path.isfile(file_path).AndReturn(False)
176 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000177 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000178 file_list1 = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000179 gclient_scm.scm.SVN.RunAndGetFileList(options,
180 ['update', '--revision', 'BASE'],
181 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000182
183 self.mox.ReplayAll()
184 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
185 relpath=self.relpath)
186 file_list2 = []
187 scm.revert(options, self.args, file_list2)
188
189 def testStatus(self):
190 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000191 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
192 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000193 gclient_scm.scm.SVN.RunAndGetFileList(options,
194 ['status'] + self.args,
195 base_path, []).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000196
197 self.mox.ReplayAll()
198 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
199 relpath=self.relpath)
200 file_list = []
201 self.assertEqual(scm.status(options, self.args, file_list), None)
202
203
204 # TODO(maruel): TEST REVISIONS!!!
205 # TODO(maruel): TEST RELOCATE!!!
206 def testUpdateCheckout(self):
207 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000208 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
209 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000210 file_info.root = 'blah'
211 file_info.url = self.url
212 file_info.uuid = 'ABC'
213 file_info.revision = 42
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000214 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
215 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000216 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000217 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000218 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000219 gclient_scm.scm.SVN.RunAndGetFileList(options,
220 ['checkout', self.url, base_path],
221 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000222 self.mox.ReplayAll()
223 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
224 relpath=self.relpath)
225 scm.update(options, (), files_list)
226
227 def testUpdateUpdate(self):
228 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000229 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000230 options.force = True
231 options.nohooks = False
232 file_info = {
233 'Repository Root': 'blah',
234 'URL': self.url,
235 'UUID': 'ABC',
236 'Revision': 42,
237 }
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000238 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
239 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000240 # Checkout or update.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000241 gclient_scm.os.path.exists(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000242 gclient_scm.scm.SVN.CaptureInfo(
243 gclient_scm.os.path.join(base_path, "."), '.'
244 ).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000245 # Cheat a bit here.
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000246 gclient_scm.scm.SVN.CaptureInfo(file_info['URL'], '.').AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000247 additional_args = []
248 if options.manually_grab_svn_rev:
249 additional_args = ['--revision', str(file_info['Revision'])]
250 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000251 gclient_scm.scm.SVN.RunAndGetFileList(
252 options,
253 ['update', base_path] + additional_args,
254 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000255
256 self.mox.ReplayAll()
257 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
258 relpath=self.relpath)
259 scm.update(options, (), files_list)
260
261 def testUpdateGit(self):
262 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000263 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
264 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000265 print("________ found .git directory; skipping %s" % self.relpath)
266
267 self.mox.ReplayAll()
268 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
269 relpath=self.relpath)
270 file_list = []
271 scm.update(options, self.args, file_list)
272
msb@chromium.orge28e4982009-09-25 20:51:45 +0000273
msb@chromium.org5bde4852009-12-14 16:47:12 +0000274class GitWrapperTestCase(BaseTestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000275 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000276 class OptionsObject(object):
277 def __init__(self, test_case, verbose=False, revision=None):
278 self.verbose = verbose
279 self.revision = revision
280 self.manually_grab_svn_rev = True
281 self.deps_os = None
282 self.force = False
283 self.nohooks = False
284
285 sample_git_import = """blob
286mark :1
287data 6
288Hello
289
290blob
291mark :2
292data 4
293Bye
294
295reset refs/heads/master
296commit refs/heads/master
297mark :3
298author Bob <bob@example.com> 1253744361 -0700
299committer Bob <bob@example.com> 1253744361 -0700
300data 8
301A and B
302M 100644 :1 a
303M 100644 :2 b
304
305blob
306mark :4
307data 10
308Hello
309You
310
311blob
312mark :5
313data 8
314Bye
315You
316
317commit refs/heads/origin
318mark :6
319author Alice <alice@example.com> 1253744424 -0700
320committer Alice <alice@example.com> 1253744424 -0700
321data 13
322Personalized
323from :3
324M 100644 :4 a
325M 100644 :5 b
326
327reset refs/heads/master
328from :3
329"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000330 def Options(self, *args, **kwargs):
331 return self.OptionsObject(self, *args, **kwargs)
332
333 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000334 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000335 try:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000336 Popen(['git', 'init'], stdout=PIPE, stderr=STDOUT,
337 cwd=path).communicate()
338 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000339 # git is not available, skip this test.
340 return False
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000341 Popen(['git', 'fast-import'], stdin=PIPE, stdout=PIPE, stderr=STDOUT,
342 cwd=path).communicate(input=git_import)
343 Popen(['git', 'checkout'], stdout=PIPE, stderr=STDOUT,
344 cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000345 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000346
msb@chromium.orge28e4982009-09-25 20:51:45 +0000347 def setUp(self):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000348 self.args = self.Args()
349 self.url = 'git://foo'
350 self.root_dir = tempfile.mkdtemp()
351 self.relpath = '.'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000352 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000353 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000354 SuperMoxBaseTestBase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000355
356 def tearDown(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000357 SuperMoxBaseTestBase.tearDown(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000358 shutil.rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000359
360 def testDir(self):
361 members = [
maruel@chromium.orgf2f9d552009-12-22 00:12:57 +0000362 'COMMAND', 'Capture', 'CaptureStatus', 'FetchUpstreamTuple',
maruel@chromium.orgb24a8e12009-12-22 13:45:48 +0000363 'GenerateDiff', 'GetBranch', 'GetBranchRef', 'GetCheckoutRoot',
364 'GetEmail', 'GetPatchName', 'GetSVNBranch',
maruel@chromium.orgee4071d2009-12-22 22:25:37 +0000365 'GetUpstream', 'IsGitSvn', 'RunAndFilterOutput', 'ShortBranchName',
366 'RunCommand', 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000367 'revinfo', 'runhooks', 'scm_name', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000368 ]
369
370 # If you add a member, be sure to add the relevant test!
371 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
372
373 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000374 if not self.enabled:
375 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000376 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000377 file_path = gclient_scm.os.path.join(self.base_path, 'a')
378 gclient_scm.os.remove(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000379 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
380 relpath=self.relpath)
381 file_list = []
382 scm.revert(options, self.args, file_list)
383 self.assertEquals(file_list, [file_path])
384 file_list = []
385 scm.diff(options, self.args, file_list)
386 self.assertEquals(file_list, [])
387
388 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000389 if not self.enabled:
390 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000391 options = self.Options()
392 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
393 relpath=self.relpath)
394 file_list = []
395 scm.revert(options, self.args, file_list)
396 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000397 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000398 '069c602044c5388d2d15c3f875b057c852003458')
399
400
401 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000402 if not self.enabled:
403 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000404 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000405 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000406 open(file_path, 'a').writelines('touched\n')
407 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
408 relpath=self.relpath)
409 file_list = []
410 scm.revert(options, self.args, file_list)
411 self.assertEquals(file_list, [file_path])
412 file_list = []
413 scm.diff(options, self.args, file_list)
414 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000415 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000416 '069c602044c5388d2d15c3f875b057c852003458')
417
418 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000419 if not self.enabled:
420 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000421 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000422 file_path = gclient_scm.os.path.join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000423 f = open(file_path, 'w')
424 f.writelines('new\n')
425 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000426 Popen(['git', 'add', 'c'], stdout=PIPE,
427 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000428 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
429 relpath=self.relpath)
430 file_list = []
431 scm.revert(options, self.args, file_list)
432 self.assertEquals(file_list, [file_path])
433 file_list = []
434 scm.diff(options, self.args, file_list)
435 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000436 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000437 '069c602044c5388d2d15c3f875b057c852003458')
438
439 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000440 if not self.enabled:
441 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000442 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000443 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000444 open(file_path, 'a').writelines('touched\n')
445 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
446 relpath=self.relpath)
447 file_list = []
448 scm.status(options, self.args, file_list)
449 self.assertEquals(file_list, [file_path])
450
451 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000452 if not self.enabled:
453 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000454 options = self.Options()
455 expected_file_list = []
456 for f in ['a', 'b']:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000457 file_path = gclient_scm.os.path.join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000458 open(file_path, 'a').writelines('touched\n')
459 expected_file_list.extend([file_path])
460 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
461 relpath=self.relpath)
462 file_list = []
463 scm.status(options, self.args, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000464 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
465 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000466 self.assertEquals(sorted(file_list), expected_file_list)
467
468 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000469 if not self.enabled:
470 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000471 options = self.Options(verbose=True)
472 root_dir = tempfile.mkdtemp()
473 relpath = 'foo'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000474 base_path = gclient_scm.os.path.join(root_dir, relpath)
475 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000476 try:
477 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
478 relpath=relpath)
479 file_list = []
480 scm.update(options, (), file_list)
481 self.assertEquals(len(file_list), 2)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000482 self.assert_(gclient_scm.os.path.isfile(
483 gclient_scm.os.path.join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000484 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000485 '069c602044c5388d2d15c3f875b057c852003458')
486 finally:
487 shutil.rmtree(root_dir)
488
489 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000490 if not self.enabled:
491 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000492 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000493 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
494 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000495 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
496 relpath=self.relpath)
497 file_list = []
498 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000499 self.assertEquals(file_list, expected_file_list)
500 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000501 'a7142dc9f0009350b96a11f372b6ea658592aa95')
502
msb@chromium.org5bde4852009-12-14 16:47:12 +0000503 def testUpdateConflict(self):
504 if not self.enabled:
505 return
506 options = self.Options()
507 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
508 relpath=self.relpath)
509 file_path = gclient_scm.os.path.join(self.base_path, 'b')
510 f = open(file_path, 'w').writelines('conflict\n')
511 scm._Run(['commit', '-am', 'test'])
512 exception = \
513 '\n____ .\n' \
514 '\nConflict while rebasing this branch.\n' \
515 'Fix the conflict and run gclient again.\n' \
516 'See man git-rebase for details.\n'
517 self.assertRaisesError(exception, scm.update, options, (), [])
518 exception = \
519 '\n____ .\n' \
520 '\tAlready in a conflict, i.e. (no branch).\n' \
521 '\tFix the conflict and run gclient again.\n' \
522 '\tOr to abort run:\n\t\tgit-rebase --abort\n' \
523 '\tSee man git-rebase for details.\n'
524 self.assertRaisesError(exception, scm.update, options, (), [])
525
msb@chromium.org0f282062009-11-06 20:14:02 +0000526 def testRevinfo(self):
527 if not self.enabled:
528 return
529 options = self.Options()
530 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
531 relpath=self.relpath)
532 rev_info = scm.revinfo(options, (), None)
533 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
534
msb@chromium.orge28e4982009-09-25 20:51:45 +0000535
msb@chromium.orge28e4982009-09-25 20:51:45 +0000536if __name__ == '__main__':
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000537 import unittest
msb@chromium.orge28e4982009-09-25 20:51:45 +0000538 unittest.main()
539
540# vim: ts=2:sw=2:tw=80:et: