blob: 9794b51a77910ab48182cabd5f6adad2f6d25c1e [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)
msb@chromium.org32906d12010-01-12 18:22:09 +0000176 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000177 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000178 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000179 file_list1 = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000180 gclient_scm.scm.SVN.RunAndGetFileList(options,
181 ['update', '--revision', 'BASE'],
182 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000183
184 self.mox.ReplayAll()
185 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
186 relpath=self.relpath)
187 file_list2 = []
188 scm.revert(options, self.args, file_list2)
189
190 def testStatus(self):
191 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000192 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
193 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000194 gclient_scm.scm.SVN.RunAndGetFileList(options,
195 ['status'] + self.args,
196 base_path, []).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000197
198 self.mox.ReplayAll()
199 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
200 relpath=self.relpath)
201 file_list = []
202 self.assertEqual(scm.status(options, self.args, file_list), None)
203
204
205 # TODO(maruel): TEST REVISIONS!!!
206 # TODO(maruel): TEST RELOCATE!!!
207 def testUpdateCheckout(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 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000211 file_info.root = 'blah'
212 file_info.url = self.url
213 file_info.uuid = 'ABC'
214 file_info.revision = 42
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000215 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
216 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000217 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000218 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000219 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000220 gclient_scm.scm.SVN.RunAndGetFileList(options,
221 ['checkout', self.url, base_path],
222 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000223 self.mox.ReplayAll()
224 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
225 relpath=self.relpath)
226 scm.update(options, (), files_list)
227
228 def testUpdateUpdate(self):
229 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000230 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000231 options.force = True
232 options.nohooks = False
233 file_info = {
234 'Repository Root': 'blah',
235 'URL': self.url,
236 'UUID': 'ABC',
237 'Revision': 42,
238 }
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000239 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
240 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000241 # Checkout or update.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000242 gclient_scm.os.path.exists(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000243 gclient_scm.scm.SVN.CaptureInfo(
244 gclient_scm.os.path.join(base_path, "."), '.'
245 ).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000246 # Cheat a bit here.
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000247 gclient_scm.scm.SVN.CaptureInfo(file_info['URL'], '.').AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000248 additional_args = []
249 if options.manually_grab_svn_rev:
250 additional_args = ['--revision', str(file_info['Revision'])]
251 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000252 gclient_scm.scm.SVN.RunAndGetFileList(
253 options,
254 ['update', base_path] + additional_args,
255 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000256
257 self.mox.ReplayAll()
258 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
259 relpath=self.relpath)
260 scm.update(options, (), files_list)
261
262 def testUpdateGit(self):
263 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000264 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
265 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000266 print("________ found .git directory; skipping %s" % self.relpath)
267
268 self.mox.ReplayAll()
269 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
270 relpath=self.relpath)
271 file_list = []
272 scm.update(options, self.args, file_list)
273
msb@chromium.orge28e4982009-09-25 20:51:45 +0000274
msb@chromium.org5bde4852009-12-14 16:47:12 +0000275class GitWrapperTestCase(BaseTestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000276 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000277 class OptionsObject(object):
278 def __init__(self, test_case, verbose=False, revision=None):
279 self.verbose = verbose
280 self.revision = revision
281 self.manually_grab_svn_rev = True
282 self.deps_os = None
283 self.force = False
284 self.nohooks = False
285
286 sample_git_import = """blob
287mark :1
288data 6
289Hello
290
291blob
292mark :2
293data 4
294Bye
295
296reset refs/heads/master
297commit refs/heads/master
298mark :3
299author Bob <bob@example.com> 1253744361 -0700
300committer Bob <bob@example.com> 1253744361 -0700
301data 8
302A and B
303M 100644 :1 a
304M 100644 :2 b
305
306blob
307mark :4
308data 10
309Hello
310You
311
312blob
313mark :5
314data 8
315Bye
316You
317
318commit refs/heads/origin
319mark :6
320author Alice <alice@example.com> 1253744424 -0700
321committer Alice <alice@example.com> 1253744424 -0700
322data 13
323Personalized
324from :3
325M 100644 :4 a
326M 100644 :5 b
327
328reset refs/heads/master
329from :3
330"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000331 def Options(self, *args, **kwargs):
332 return self.OptionsObject(self, *args, **kwargs)
333
334 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000335 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000336 try:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000337 Popen(['git', 'init'], stdout=PIPE, stderr=STDOUT,
338 cwd=path).communicate()
339 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000340 # git is not available, skip this test.
341 return False
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000342 Popen(['git', 'fast-import'], stdin=PIPE, stdout=PIPE, stderr=STDOUT,
343 cwd=path).communicate(input=git_import)
344 Popen(['git', 'checkout'], stdout=PIPE, stderr=STDOUT,
345 cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000346 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000347
msb@chromium.orge28e4982009-09-25 20:51:45 +0000348 def setUp(self):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000349 self.args = self.Args()
350 self.url = 'git://foo'
351 self.root_dir = tempfile.mkdtemp()
352 self.relpath = '.'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000353 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000354 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000355 SuperMoxBaseTestBase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000356
357 def tearDown(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000358 SuperMoxBaseTestBase.tearDown(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000359 shutil.rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000360
361 def testDir(self):
362 members = [
maruel@chromium.orgf2f9d552009-12-22 00:12:57 +0000363 'COMMAND', 'Capture', 'CaptureStatus', 'FetchUpstreamTuple',
maruel@chromium.orgb24a8e12009-12-22 13:45:48 +0000364 'GenerateDiff', 'GetBranch', 'GetBranchRef', 'GetCheckoutRoot',
maruel@chromium.org8ede00e2010-01-12 14:35:28 +0000365 'GetDifferentFiles', 'GetEmail', 'GetPatchName', 'GetSVNBranch',
maruel@chromium.orgee4071d2009-12-22 22:25:37 +0000366 'GetUpstream', 'IsGitSvn', 'RunAndFilterOutput', 'ShortBranchName',
367 'RunCommand', 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000368 'revinfo', 'runhooks', 'scm_name', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000369 ]
370
371 # If you add a member, be sure to add the relevant test!
372 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
373
374 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000375 if not self.enabled:
376 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000377 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000378 file_path = gclient_scm.os.path.join(self.base_path, 'a')
379 gclient_scm.os.remove(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000380 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
381 relpath=self.relpath)
382 file_list = []
383 scm.revert(options, self.args, file_list)
384 self.assertEquals(file_list, [file_path])
385 file_list = []
386 scm.diff(options, self.args, file_list)
387 self.assertEquals(file_list, [])
388
389 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000390 if not self.enabled:
391 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000392 options = self.Options()
393 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, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000398 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000399 '069c602044c5388d2d15c3f875b057c852003458')
400
401
402 def testRevertModified(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()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000406 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000407 open(file_path, 'a').writelines('touched\n')
408 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
409 relpath=self.relpath)
410 file_list = []
411 scm.revert(options, self.args, file_list)
412 self.assertEquals(file_list, [file_path])
413 file_list = []
414 scm.diff(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 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000420 if not self.enabled:
421 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000422 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000423 file_path = gclient_scm.os.path.join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000424 f = open(file_path, 'w')
425 f.writelines('new\n')
426 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000427 Popen(['git', 'add', 'c'], stdout=PIPE,
428 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000429 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
430 relpath=self.relpath)
431 file_list = []
432 scm.revert(options, self.args, file_list)
433 self.assertEquals(file_list, [file_path])
434 file_list = []
435 scm.diff(options, self.args, file_list)
436 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000437 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000438 '069c602044c5388d2d15c3f875b057c852003458')
439
440 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000441 if not self.enabled:
442 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000443 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000444 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000445 open(file_path, 'a').writelines('touched\n')
446 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
447 relpath=self.relpath)
448 file_list = []
449 scm.status(options, self.args, file_list)
450 self.assertEquals(file_list, [file_path])
451
452 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000453 if not self.enabled:
454 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000455 options = self.Options()
456 expected_file_list = []
457 for f in ['a', 'b']:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000458 file_path = gclient_scm.os.path.join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000459 open(file_path, 'a').writelines('touched\n')
460 expected_file_list.extend([file_path])
461 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
462 relpath=self.relpath)
463 file_list = []
464 scm.status(options, self.args, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000465 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
466 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000467 self.assertEquals(sorted(file_list), expected_file_list)
468
469 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000470 if not self.enabled:
471 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000472 options = self.Options(verbose=True)
473 root_dir = tempfile.mkdtemp()
474 relpath = 'foo'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000475 base_path = gclient_scm.os.path.join(root_dir, relpath)
476 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000477 try:
478 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
479 relpath=relpath)
480 file_list = []
481 scm.update(options, (), file_list)
482 self.assertEquals(len(file_list), 2)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000483 self.assert_(gclient_scm.os.path.isfile(
484 gclient_scm.os.path.join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000485 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000486 '069c602044c5388d2d15c3f875b057c852003458')
487 finally:
488 shutil.rmtree(root_dir)
489
490 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000491 if not self.enabled:
492 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000493 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000494 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
495 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000496 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
497 relpath=self.relpath)
498 file_list = []
499 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000500 self.assertEquals(file_list, expected_file_list)
501 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000502 'a7142dc9f0009350b96a11f372b6ea658592aa95')
503
msb@chromium.org5bde4852009-12-14 16:47:12 +0000504 def testUpdateConflict(self):
505 if not self.enabled:
506 return
507 options = self.Options()
508 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
509 relpath=self.relpath)
510 file_path = gclient_scm.os.path.join(self.base_path, 'b')
511 f = open(file_path, 'w').writelines('conflict\n')
512 scm._Run(['commit', '-am', 'test'])
513 exception = \
514 '\n____ .\n' \
515 '\nConflict while rebasing this branch.\n' \
516 'Fix the conflict and run gclient again.\n' \
517 'See man git-rebase for details.\n'
518 self.assertRaisesError(exception, scm.update, options, (), [])
519 exception = \
520 '\n____ .\n' \
521 '\tAlready in a conflict, i.e. (no branch).\n' \
522 '\tFix the conflict and run gclient again.\n' \
523 '\tOr to abort run:\n\t\tgit-rebase --abort\n' \
524 '\tSee man git-rebase for details.\n'
525 self.assertRaisesError(exception, scm.update, options, (), [])
526
msb@chromium.org0f282062009-11-06 20:14:02 +0000527 def testRevinfo(self):
528 if not self.enabled:
529 return
530 options = self.Options()
531 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
532 relpath=self.relpath)
533 rev_info = scm.revinfo(options, (), None)
534 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
535
msb@chromium.orge28e4982009-09-25 20:51:45 +0000536
msb@chromium.orge28e4982009-09-25 20:51:45 +0000537if __name__ == '__main__':
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000538 import unittest
msb@chromium.orge28e4982009-09-25 20:51:45 +0000539 unittest.main()
540
541# vim: ts=2:sw=2:tw=80:et: