blob: 66c1f5e3b335488bf73c33d5126d4e84ea51ec09 [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',
msb@chromium.orge6f78352010-01-13 17:05:33 +000069 'GetEmail', 'GetFileProperty', 'FullUrlForRelativeUrl', 'IsMoved',
70 'ReadSimpleAuth', 'Run', '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.orge6f78352010-01-13 17:05:33 +000084 def testSVNFullUrlForRelativeUrl(self):
85 self.url = 'svn://a/b/c/d'
86
87 self.mox.ReplayAll()
88 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
89 relpath=self.relpath)
90 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
91
92 def testGITFullUrlForRelativeUrl(self):
93 self.url = 'git://a/b/c/d'
94
95 self.mox.ReplayAll()
96 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
97 relpath=self.relpath)
98 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
99
msb@chromium.orge28e4982009-09-25 20:51:45 +0000100 def testRunCommandException(self):
101 options = self.Options(verbose=False)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000102 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
103 gclient_scm.os.path.exists(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000104
105 self.mox.ReplayAll()
106 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
107 relpath=self.relpath)
108 exception = "Unsupported argument(s): %s" % ','.join(self.args)
109 self.assertRaisesError(exception, scm.RunCommand,
110 'update', options, self.args)
111
112 def testRunCommandUnknown(self):
113 # TODO(maruel): if ever used.
114 pass
115
116 def testRevertMissing(self):
117 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000118 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
119 gclient_scm.os.path.isdir(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000120 # It'll to a checkout instead.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000121 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
122 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000123 print("\n_____ %s is missing, synching instead" % self.relpath)
124 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000125 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000126 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000127 gclient_scm.scm.SVN.RunAndGetFileList(options,
128 ['checkout', self.url, base_path],
129 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000130
131 self.mox.ReplayAll()
132 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
133 relpath=self.relpath)
134 scm.revert(options, self.args, files_list)
135
136 def testRevertNone(self):
137 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000138 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
139 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000140 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn([])
141 gclient_scm.scm.SVN.RunAndGetFileList(options,
142 ['update', '--revision', 'BASE'],
143 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000144
145 self.mox.ReplayAll()
146 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
147 relpath=self.relpath)
148 file_list = []
149 scm.revert(options, self.args, file_list)
150
151 def testRevert2Files(self):
152 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000153 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
154 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000155 items = [
156 ('M ', 'a'),
157 ('A ', 'b'),
158 ]
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000159 file_path1 = gclient_scm.os.path.join(base_path, 'a')
160 file_path2 = gclient_scm.os.path.join(base_path, 'b')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000161 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000162 gclient_scm.os.path.exists(file_path1).AndReturn(True)
163 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
164 gclient_scm.os.remove(file_path1)
165 gclient_scm.os.path.exists(file_path2).AndReturn(True)
166 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
167 gclient_scm.os.remove(file_path2)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000168 gclient_scm.scm.SVN.RunAndGetFileList(options,
169 ['update', '--revision', 'BASE'],
170 base_path, mox.IgnoreArg())
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000171 print(gclient_scm.os.path.join(base_path, 'a'))
172 print(gclient_scm.os.path.join(base_path, 'b'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000173
174 self.mox.ReplayAll()
175 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
176 relpath=self.relpath)
177 file_list = []
178 scm.revert(options, self.args, file_list)
179
180 def testRevertDirectory(self):
181 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000182 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
183 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000184 items = [
185 ('~ ', 'a'),
186 ]
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000187 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000188 file_path = gclient_scm.os.path.join(base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000189 print(file_path)
190 gclient_scm.os.path.exists(file_path).AndReturn(True)
191 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000192 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000193 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000194 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000195 file_list1 = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000196 gclient_scm.scm.SVN.RunAndGetFileList(options,
197 ['update', '--revision', 'BASE'],
198 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000199
200 self.mox.ReplayAll()
201 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
202 relpath=self.relpath)
203 file_list2 = []
204 scm.revert(options, self.args, file_list2)
205
206 def testStatus(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 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000210 gclient_scm.scm.SVN.RunAndGetFileList(options,
211 ['status'] + self.args,
212 base_path, []).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000213
214 self.mox.ReplayAll()
215 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
216 relpath=self.relpath)
217 file_list = []
218 self.assertEqual(scm.status(options, self.args, file_list), None)
219
220
221 # TODO(maruel): TEST REVISIONS!!!
222 # TODO(maruel): TEST RELOCATE!!!
223 def testUpdateCheckout(self):
224 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000225 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
226 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000227 file_info.root = 'blah'
228 file_info.url = self.url
229 file_info.uuid = 'ABC'
230 file_info.revision = 42
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000231 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
232 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000233 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000234 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000235 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000236 gclient_scm.scm.SVN.RunAndGetFileList(options,
237 ['checkout', self.url, base_path],
238 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000239 self.mox.ReplayAll()
240 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
241 relpath=self.relpath)
242 scm.update(options, (), files_list)
243
244 def testUpdateUpdate(self):
245 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000246 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000247 options.force = True
248 options.nohooks = False
249 file_info = {
250 'Repository Root': 'blah',
251 'URL': self.url,
252 'UUID': 'ABC',
253 'Revision': 42,
254 }
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000255 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
256 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000257 # Checkout or update.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000258 gclient_scm.os.path.exists(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000259 gclient_scm.scm.SVN.CaptureInfo(
260 gclient_scm.os.path.join(base_path, "."), '.'
261 ).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000262 # Cheat a bit here.
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000263 gclient_scm.scm.SVN.CaptureInfo(file_info['URL'], '.').AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000264 additional_args = []
265 if options.manually_grab_svn_rev:
266 additional_args = ['--revision', str(file_info['Revision'])]
267 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000268 gclient_scm.scm.SVN.RunAndGetFileList(
269 options,
270 ['update', base_path] + additional_args,
271 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000272
273 self.mox.ReplayAll()
274 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
275 relpath=self.relpath)
276 scm.update(options, (), files_list)
277
278 def testUpdateGit(self):
279 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000280 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
281 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000282 print("________ found .git directory; skipping %s" % self.relpath)
283
284 self.mox.ReplayAll()
285 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
286 relpath=self.relpath)
287 file_list = []
288 scm.update(options, self.args, file_list)
289
msb@chromium.orge28e4982009-09-25 20:51:45 +0000290
msb@chromium.org5bde4852009-12-14 16:47:12 +0000291class GitWrapperTestCase(BaseTestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000292 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000293 class OptionsObject(object):
294 def __init__(self, test_case, verbose=False, revision=None):
295 self.verbose = verbose
296 self.revision = revision
297 self.manually_grab_svn_rev = True
298 self.deps_os = None
299 self.force = False
300 self.nohooks = False
301
302 sample_git_import = """blob
303mark :1
304data 6
305Hello
306
307blob
308mark :2
309data 4
310Bye
311
312reset refs/heads/master
313commit refs/heads/master
314mark :3
315author Bob <bob@example.com> 1253744361 -0700
316committer Bob <bob@example.com> 1253744361 -0700
317data 8
318A and B
319M 100644 :1 a
320M 100644 :2 b
321
322blob
323mark :4
324data 10
325Hello
326You
327
328blob
329mark :5
330data 8
331Bye
332You
333
334commit refs/heads/origin
335mark :6
336author Alice <alice@example.com> 1253744424 -0700
337committer Alice <alice@example.com> 1253744424 -0700
338data 13
339Personalized
340from :3
341M 100644 :4 a
342M 100644 :5 b
343
344reset refs/heads/master
345from :3
346"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000347 def Options(self, *args, **kwargs):
348 return self.OptionsObject(self, *args, **kwargs)
349
350 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000351 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000352 try:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000353 Popen(['git', 'init'], stdout=PIPE, stderr=STDOUT,
354 cwd=path).communicate()
355 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000356 # git is not available, skip this test.
357 return False
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000358 Popen(['git', 'fast-import'], stdin=PIPE, stdout=PIPE, stderr=STDOUT,
359 cwd=path).communicate(input=git_import)
360 Popen(['git', 'checkout'], stdout=PIPE, stderr=STDOUT,
361 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)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000375 shutil.rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000376
377 def testDir(self):
378 members = [
maruel@chromium.orgf2f9d552009-12-22 00:12:57 +0000379 'COMMAND', 'Capture', 'CaptureStatus', 'FetchUpstreamTuple',
msb@chromium.orge6f78352010-01-13 17:05:33 +0000380 'FullUrlForRelativeUrl', 'GenerateDiff', 'GetBranch', 'GetBranchRef',
381 'GetCheckoutRoot', 'GetDifferentFiles', 'GetEmail', 'GetPatchName',
382 'GetSVNBranch', 'GetUpstream', 'IsGitSvn', 'RunAndFilterOutput',
383 'ShortBranchName', 'RunCommand',
384 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000385 'revinfo', 'runhooks', 'scm_name', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000386 ]
387
388 # If you add a member, be sure to add the relevant test!
389 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
390
391 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000392 if not self.enabled:
393 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000394 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000395 file_path = gclient_scm.os.path.join(self.base_path, 'a')
396 gclient_scm.os.remove(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000397 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
398 relpath=self.relpath)
399 file_list = []
400 scm.revert(options, self.args, file_list)
401 self.assertEquals(file_list, [file_path])
402 file_list = []
403 scm.diff(options, self.args, file_list)
404 self.assertEquals(file_list, [])
405
406 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000407 if not self.enabled:
408 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000409 options = self.Options()
410 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
411 relpath=self.relpath)
412 file_list = []
413 scm.revert(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
419 def testRevertModified(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, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000424 open(file_path, 'a').writelines('touched\n')
425 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
426 relpath=self.relpath)
427 file_list = []
428 scm.revert(options, self.args, file_list)
429 self.assertEquals(file_list, [file_path])
430 file_list = []
431 scm.diff(options, self.args, file_list)
432 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000433 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000434 '069c602044c5388d2d15c3f875b057c852003458')
435
436 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000437 if not self.enabled:
438 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000439 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000440 file_path = gclient_scm.os.path.join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000441 f = open(file_path, 'w')
442 f.writelines('new\n')
443 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000444 Popen(['git', 'add', 'c'], stdout=PIPE,
445 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000446 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
447 relpath=self.relpath)
448 file_list = []
449 scm.revert(options, self.args, file_list)
450 self.assertEquals(file_list, [file_path])
451 file_list = []
452 scm.diff(options, self.args, file_list)
453 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000454 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000455 '069c602044c5388d2d15c3f875b057c852003458')
456
457 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000458 if not self.enabled:
459 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000460 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000461 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000462 open(file_path, 'a').writelines('touched\n')
463 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
464 relpath=self.relpath)
465 file_list = []
466 scm.status(options, self.args, file_list)
467 self.assertEquals(file_list, [file_path])
468
469 def testStatus2New(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()
473 expected_file_list = []
474 for f in ['a', 'b']:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000475 file_path = gclient_scm.os.path.join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000476 open(file_path, 'a').writelines('touched\n')
477 expected_file_list.extend([file_path])
478 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
479 relpath=self.relpath)
480 file_list = []
481 scm.status(options, self.args, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000482 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
483 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000484 self.assertEquals(sorted(file_list), expected_file_list)
485
486 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000487 if not self.enabled:
488 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000489 options = self.Options(verbose=True)
490 root_dir = tempfile.mkdtemp()
491 relpath = 'foo'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000492 base_path = gclient_scm.os.path.join(root_dir, relpath)
493 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000494 try:
495 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
496 relpath=relpath)
497 file_list = []
498 scm.update(options, (), file_list)
499 self.assertEquals(len(file_list), 2)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000500 self.assert_(gclient_scm.os.path.isfile(
501 gclient_scm.os.path.join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000502 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000503 '069c602044c5388d2d15c3f875b057c852003458')
504 finally:
505 shutil.rmtree(root_dir)
506
507 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000508 if not self.enabled:
509 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000510 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000511 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
512 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000513 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
514 relpath=self.relpath)
515 file_list = []
516 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000517 self.assertEquals(file_list, expected_file_list)
518 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000519 'a7142dc9f0009350b96a11f372b6ea658592aa95')
520
msb@chromium.org5bde4852009-12-14 16:47:12 +0000521 def testUpdateConflict(self):
522 if not self.enabled:
523 return
524 options = self.Options()
525 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
526 relpath=self.relpath)
527 file_path = gclient_scm.os.path.join(self.base_path, 'b')
528 f = open(file_path, 'w').writelines('conflict\n')
529 scm._Run(['commit', '-am', 'test'])
530 exception = \
531 '\n____ .\n' \
532 '\nConflict while rebasing this branch.\n' \
533 'Fix the conflict and run gclient again.\n' \
534 'See man git-rebase for details.\n'
535 self.assertRaisesError(exception, scm.update, options, (), [])
536 exception = \
537 '\n____ .\n' \
538 '\tAlready in a conflict, i.e. (no branch).\n' \
539 '\tFix the conflict and run gclient again.\n' \
540 '\tOr to abort run:\n\t\tgit-rebase --abort\n' \
541 '\tSee man git-rebase for details.\n'
542 self.assertRaisesError(exception, scm.update, options, (), [])
543
msb@chromium.org0f282062009-11-06 20:14:02 +0000544 def testRevinfo(self):
545 if not self.enabled:
546 return
547 options = self.Options()
548 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
549 relpath=self.relpath)
550 rev_info = scm.revinfo(options, (), None)
551 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
552
msb@chromium.orge28e4982009-09-25 20:51:45 +0000553
msb@chromium.orge28e4982009-09-25 20:51:45 +0000554if __name__ == '__main__':
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000555 import unittest
msb@chromium.orge28e4982009-09-25 20:51:45 +0000556 unittest.main()
557
558# vim: ts=2:sw=2:tw=80:et: