blob: 43cae2b75383e18c6e9953d3079e227617908094 [file] [log] [blame]
msb@chromium.orge28e4982009-09-25 20:51:45 +00001#!/usr/bin/python
maruel@chromium.orgba551772010-02-03 18:21:42 +00002# Copyright (c) 2010 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
msb@chromium.orge28e4982009-09-25 20:51:45 +00005
6"""Unit tests for gclient_scm.py."""
7
maruel@chromium.orgba551772010-02-03 18:21:42 +00008# Import before super_mox to keep valid references.
9from os import rename
10from shutil import rmtree
maruel@chromium.org54019f32010-09-09 13:50:11 +000011import StringIO
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000012from subprocess import Popen, PIPE, STDOUT
msb@chromium.orge28e4982009-09-25 20:51:45 +000013import tempfile
maruel@chromium.org389d6de2010-09-09 14:14:37 +000014import unittest
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +000015import __builtin__
msb@chromium.orge28e4982009-09-25 20:51:45 +000016
maruel@chromium.orgba551772010-02-03 18:21:42 +000017# Fixes include path.
maruel@chromium.org389d6de2010-09-09 14:14:37 +000018from super_mox import mox, TestCaseUtils, SuperMoxTestBase
maruel@chromium.orgba551772010-02-03 18:21:42 +000019
msb@chromium.orge28e4982009-09-25 20:51:45 +000020import gclient_scm
maruel@chromium.org96913eb2010-06-01 16:22:47 +000021
22
maruel@chromium.org389d6de2010-09-09 14:14:37 +000023class GCBaseTestCase(object):
maruel@chromium.org96913eb2010-06-01 16:22:47 +000024 def assertRaisesError(self, msg, fn, *args, **kwargs):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000025 """Like unittest's assertRaises() but checks for Gclient.Error."""
maruel@chromium.org96913eb2010-06-01 16:22:47 +000026 try:
27 fn(*args, **kwargs)
28 except gclient_scm.gclient_utils.Error, e:
29 self.assertEquals(e.args[0], msg)
30 else:
31 self.fail('%s not raised' % msg)
msb@chromium.orge28e4982009-09-25 20:51:45 +000032
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000033 def setUp(self):
maruel@chromium.org54019f32010-09-09 13:50:11 +000034 self.stdout = StringIO.StringIO()
35
36 def tearDown(self):
maruel@chromium.org54019f32010-09-09 13:50:11 +000037 try:
38 self.stdout.getvalue()
39 self.fail()
40 except AttributeError:
41 pass
42
43 def checkstdout(self, expected):
44 value = self.stdout.getvalue()
45 self.stdout.close()
46 self.assertEquals(expected, value)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000047
48
maruel@chromium.org389d6de2010-09-09 14:14:37 +000049class BaseTestCase(GCBaseTestCase, SuperMoxTestBase):
50 def setUp(self):
51 GCBaseTestCase.setUp(self)
52 SuperMoxTestBase.setUp(self)
53 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCall')
54 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter')
55 self.mox.StubOutWithMock(gclient_scm.gclient_utils,
56 'CheckCallAndFilterAndHeader')
57 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
58 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
59 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'Popen')
60 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
61 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo
62 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
63 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo')
64 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
65 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
66 self._scm_wrapper = gclient_scm.CreateSCM
67 gclient_scm.sys.stdout.flush = lambda: None
68 gclient_scm.scm.SVN.current_version = None
69
70 def tearDown(self):
71 GCBaseTestCase.tearDown(self)
72 SuperMoxTestBase.tearDown(self)
73
74
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000075class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000076 class OptionsObject(object):
77 def __init__(self, test_case, verbose=False, revision=None):
78 self.verbose = verbose
79 self.revision = revision
80 self.manually_grab_svn_rev = True
81 self.deps_os = None
82 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000083 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000084 self.nohooks = False
maruel@chromium.org54019f32010-09-09 13:50:11 +000085 self.stdout = test_case.stdout
msb@chromium.orge28e4982009-09-25 20:51:45 +000086
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000087 def Options(self, *args, **kwargs):
88 return self.OptionsObject(self, *args, **kwargs)
89
msb@chromium.orge28e4982009-09-25 20:51:45 +000090 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000091 BaseTestCase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000092 self.url = self.SvnUrl()
msb@chromium.orge28e4982009-09-25 20:51:45 +000093
94 def testDir(self):
95 members = [
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +000096 'FullUrlForRelativeUrl', 'RunCommand',
maruel@chromium.org55e724e2010-03-11 19:36:49 +000097 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +000098 'revinfo', 'runhooks', 'status', 'update',
tony@chromium.org4b5b1772010-04-08 01:52:56 +000099 'updatesingle', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000100 ]
101
102 # If you add a member, be sure to add the relevant test!
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000103 self.compareMembers(self._scm_wrapper('svn://a'), members)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000104 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000105
106 def testUnsupportedSCM(self):
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000107 args = ['gopher://foo', self.root_dir, self.relpath]
108 exception_msg = 'No SCM found for url gopher://foo'
109 self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000110 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000111
msb@chromium.orge6f78352010-01-13 17:05:33 +0000112 def testSVNFullUrlForRelativeUrl(self):
113 self.url = 'svn://a/b/c/d'
114
115 self.mox.ReplayAll()
116 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
117 relpath=self.relpath)
118 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
maruel@chromium.org54019f32010-09-09 13:50:11 +0000119 self.checkstdout('')
msb@chromium.orge6f78352010-01-13 17:05:33 +0000120
121 def testGITFullUrlForRelativeUrl(self):
122 self.url = 'git://a/b/c/d'
123
124 self.mox.ReplayAll()
125 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
126 relpath=self.relpath)
127 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
maruel@chromium.org54019f32010-09-09 13:50:11 +0000128 self.checkstdout('')
msb@chromium.orge6f78352010-01-13 17:05:33 +0000129
msb@chromium.orge28e4982009-09-25 20:51:45 +0000130 def testRunCommandException(self):
131 options = self.Options(verbose=False)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000132 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
133 gclient_scm.os.path.exists(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000134
135 self.mox.ReplayAll()
136 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
137 relpath=self.relpath)
138 exception = "Unsupported argument(s): %s" % ','.join(self.args)
139 self.assertRaisesError(exception, scm.RunCommand,
140 'update', options, self.args)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000141 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000142
143 def testRunCommandUnknown(self):
144 # TODO(maruel): if ever used.
maruel@chromium.org54019f32010-09-09 13:50:11 +0000145 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000146
147 def testRevertMissing(self):
148 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000149 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
150 gclient_scm.os.path.isdir(base_path).AndReturn(False)
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000151 gclient_scm.scm.SVN.Capture(['--version']
152 ).AndReturn('svn, version 1.5.1 (r32289)')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000153 # It'll to a checkout instead.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000154 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
155 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000156 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000157 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000158 files_list = self.mox.CreateMockAnything()
maruel@chromium.org03807072010-08-16 17:18:44 +0000159 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000160 ['checkout', self.url, base_path,
161 '--force'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000162 cwd=self.root_dir,
163 file_list=files_list,
164 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000165
166 self.mox.ReplayAll()
167 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
168 relpath=self.relpath)
169 scm.revert(options, self.args, files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000170 self.checkstdout(
171 ('\n_____ %s is missing, synching instead\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000172
173 def testRevertNone(self):
174 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000175 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
176 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000177 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn([])
maruel@chromium.org03807072010-08-16 17:18:44 +0000178 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000179 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000180 cwd=base_path,
181 file_list=mox.IgnoreArg(),
182 stdout=options.stdout)
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_list = []
188 scm.revert(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000189 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000190
191 def testRevert2Files(self):
192 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000193 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
194 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000195 items = [
196 ('M ', 'a'),
197 ('A ', 'b'),
198 ]
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000199 file_path1 = gclient_scm.os.path.join(base_path, 'a')
200 file_path2 = gclient_scm.os.path.join(base_path, 'b')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000201 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000202 gclient_scm.os.path.exists(file_path1).AndReturn(True)
203 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
204 gclient_scm.os.remove(file_path1)
205 gclient_scm.os.path.exists(file_path2).AndReturn(True)
206 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
207 gclient_scm.os.remove(file_path2)
maruel@chromium.org03807072010-08-16 17:18:44 +0000208 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000209 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000210 cwd=base_path,
211 file_list=mox.IgnoreArg(),
212 stdout=options.stdout)
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 scm.revert(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000219 self.checkstdout(
220 ('%s\n%s\n' % (gclient_scm.os.path.join(base_path, 'a'),
221 gclient_scm.os.path.join(base_path, 'b'))))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000222
223 def testRevertDirectory(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 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000227 items = [
228 ('~ ', 'a'),
229 ]
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000230 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000231 file_path = gclient_scm.os.path.join(base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000232 gclient_scm.os.path.exists(file_path).AndReturn(True)
233 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000234 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000235 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000236 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000237 file_list1 = []
maruel@chromium.org03807072010-08-16 17:18:44 +0000238 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000239 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000240 cwd=base_path,
241 file_list=mox.IgnoreArg(),
242 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000243
244 self.mox.ReplayAll()
245 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
246 relpath=self.relpath)
247 file_list2 = []
248 scm.revert(options, self.args, file_list2)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000249 self.checkstdout(('%s\n' % file_path))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000250
251 def testStatus(self):
252 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000253 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
254 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org03807072010-08-16 17:18:44 +0000255 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000256 ['status'] + self.args,
maruel@chromium.org669600d2010-09-01 19:06:31 +0000257 cwd=base_path, file_list=[],
258 stdout=options.stdout).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000259
260 self.mox.ReplayAll()
261 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
262 relpath=self.relpath)
263 file_list = []
264 self.assertEqual(scm.status(options, self.args, file_list), None)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000265 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000266
267 # TODO(maruel): TEST REVISIONS!!!
268 # TODO(maruel): TEST RELOCATE!!!
269 def testUpdateCheckout(self):
270 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000271 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
272 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000273 file_info.root = 'blah'
274 file_info.url = self.url
275 file_info.uuid = 'ABC'
276 file_info.revision = 42
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000277 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
278 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000279 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000280 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000281 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000282 gclient_scm.scm.SVN.Capture(['--version']
283 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org03807072010-08-16 17:18:44 +0000284 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000285 ['checkout', self.url, base_path,
286 '--force'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000287 cwd=self.root_dir,
288 file_list=files_list,
289 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000290 self.mox.ReplayAll()
291 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
292 relpath=self.relpath)
293 scm.update(options, (), files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000294 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000295
296 def testUpdateUpdate(self):
297 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000298 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000299 options.force = True
300 options.nohooks = False
301 file_info = {
302 'Repository Root': 'blah',
303 'URL': self.url,
304 'UUID': 'ABC',
305 'Revision': 42,
306 }
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000307 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
308 ).AndReturn(False)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000309
310 # Verify no locked files.
311 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
312 ).AndReturn([])
313
msb@chromium.orge28e4982009-09-25 20:51:45 +0000314 # Checkout or update.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000315 gclient_scm.os.path.exists(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000316 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000317 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000318 # Cheat a bit here.
maruel@chromium.org54019f32010-09-09 13:50:11 +0000319 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000320 additional_args = []
321 if options.manually_grab_svn_rev:
322 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.org669600d2010-09-01 19:06:31 +0000323 gclient_scm.scm.SVN.Capture(['--version']
324 ).AndReturn('svn, version 1.5.1 (r32289)')
325 additional_args.append('--force')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000326 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000327 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000328 options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000329 ['update', base_path] + additional_args,
maruel@chromium.org669600d2010-09-01 19:06:31 +0000330 cwd=self.root_dir, file_list=files_list, stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000331
332 self.mox.ReplayAll()
333 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
334 relpath=self.relpath)
335 scm.update(options, (), files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000336 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000337
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000338 def testUpdateSingleCheckout(self):
339 options = self.Options(verbose=True)
340 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
341 file_info = {
342 'URL': self.url,
343 'Revision': 42,
344 }
tony@chromium.org57564662010-04-14 02:35:12 +0000345
346 # Checks to make sure that we support svn co --depth.
347 gclient_scm.scm.SVN.current_version = None
348 gclient_scm.scm.SVN.Capture(['--version']
349 ).AndReturn('svn, version 1.5.1 (r32289)')
350 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
351 ).AndReturn(False)
352 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, 'DEPS')
353 ).AndReturn(False)
354
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000355 # Verify no locked files.
356 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
357 ).AndReturn([])
358
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000359 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000360 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000361 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
362 ['svn', 'checkout', '--depth', 'empty', self.url, base_path],
363 always=True, cwd=self.root_dir, stdout=options.stdout)
maruel@chromium.org03807072010-08-16 17:18:44 +0000364 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, ['update', 'DEPS'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000365 cwd=base_path, file_list=files_list, stdout=options.stdout)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000366
367 # Now we fall back on scm.update().
368 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
tony@chromium.org57564662010-04-14 02:35:12 +0000369 ).AndReturn(False)
370 gclient_scm.os.path.exists(base_path).AndReturn(True)
371 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000372 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
373 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
maruel@chromium.org669600d2010-09-01 19:06:31 +0000374 options.stdout.write("\n_____ %s at 42" % self.relpath)
375 options.stdout.write('\n')
tony@chromium.org57564662010-04-14 02:35:12 +0000376
377 self.mox.ReplayAll()
378 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
379 relpath=self.relpath)
380 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000381 self.checkstdout(
382 2 * ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org57564662010-04-14 02:35:12 +0000383
384 def testUpdateSingleCheckoutSVN14(self):
385 options = self.Options(verbose=True)
386 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
387 file_info = {
388 'URL': self.url,
389 'Revision': 42,
390 }
391
392 # Checks to make sure that we support svn co --depth.
393 gclient_scm.scm.SVN.current_version = None
394 gclient_scm.scm.SVN.Capture(['--version']
395 ).AndReturn('svn, version 1.4.4 (r25188)')
396 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path)
397 ).AndReturn(True)
398
399 # When checking out a single file with svn 1.4, we use svn export
400 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000401 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
402 ['svn', 'export', gclient_scm.os.path.join(self.url, 'DEPS'),
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000403 gclient_scm.os.path.join(base_path, 'DEPS')],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000404 always=True, cwd=self.root_dir, stdout=options.stdout)
tony@chromium.org57564662010-04-14 02:35:12 +0000405
406 self.mox.ReplayAll()
407 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
408 relpath=self.relpath)
409 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000410 self.checkstdout('')
tony@chromium.org57564662010-04-14 02:35:12 +0000411
412 def testUpdateSingleCheckoutSVNUpgrade(self):
413 options = self.Options(verbose=True)
414 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
415 file_info = {
416 'URL': self.url,
417 'Revision': 42,
418 }
419
420 # Checks to make sure that we support svn co --depth.
421 gclient_scm.scm.SVN.current_version = None
422 gclient_scm.scm.SVN.Capture(['--version']
423 ).AndReturn('svn, version 1.5.1 (r32289)')
424 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
425 ).AndReturn(False)
426 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
427 # the old DEPS file.
428 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, 'DEPS')
429 ).AndReturn(True)
430 gclient_scm.os.remove(gclient_scm.os.path.join(base_path, 'DEPS'))
431
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000432 # Verify no locked files.
433 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
434 ).AndReturn([])
435
tony@chromium.org57564662010-04-14 02:35:12 +0000436 # When checking out a single file, we issue an svn checkout and svn update.
437 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000438 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
439 ['svn', 'checkout', '--depth', 'empty', self.url, base_path],
440 always=True, cwd=self.root_dir, stdout=options.stdout)
maruel@chromium.org03807072010-08-16 17:18:44 +0000441 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, ['update', 'DEPS'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000442 cwd=base_path, file_list=files_list, stdout=options.stdout)
tony@chromium.org57564662010-04-14 02:35:12 +0000443
444 # Now we fall back on scm.update().
445 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
446 ).AndReturn(False)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000447 gclient_scm.os.path.exists(base_path).AndReturn(True)
448 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000449 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
450 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000451
452 self.mox.ReplayAll()
453 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
454 relpath=self.relpath)
455 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000456 self.checkstdout(
457 ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000458
459 def testUpdateSingleUpdate(self):
460 options = self.Options(verbose=True)
461 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
462 file_info = {
463 'URL': self.url,
464 'Revision': 42,
465 }
tony@chromium.org57564662010-04-14 02:35:12 +0000466 # Checks to make sure that we support svn co --depth.
467 gclient_scm.scm.SVN.current_version = None
468 gclient_scm.scm.SVN.Capture(['--version']
469 ).AndReturn('svn, version 1.5.1 (r32289)')
470 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
471 ).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000472
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000473 # Verify no locked files.
474 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
475 ).AndReturn([])
476
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000477 # Now we fall back on scm.update().
478 files_list = self.mox.CreateMockAnything()
479 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
480 ).AndReturn(False)
481 gclient_scm.os.path.exists(base_path).AndReturn(True)
482 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000483 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
484 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000485
486 self.mox.ReplayAll()
487 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
488 relpath=self.relpath)
489 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000490 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000491
msb@chromium.orge28e4982009-09-25 20:51:45 +0000492 def testUpdateGit(self):
493 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000494 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
495 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000496
497 self.mox.ReplayAll()
498 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
499 relpath=self.relpath)
500 file_list = []
501 scm.update(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000502 self.checkstdout(
503 ('________ found .git directory; skipping %s\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000504
msb@chromium.orge28e4982009-09-25 20:51:45 +0000505
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000506class GitWrapperTestCase(GCBaseTestCase, TestCaseUtils, unittest.TestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000507 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000508 class OptionsObject(object):
509 def __init__(self, test_case, verbose=False, revision=None):
510 self.verbose = verbose
511 self.revision = revision
512 self.manually_grab_svn_rev = True
513 self.deps_os = None
514 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000515 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000516 self.nohooks = False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000517 self.stdout = test_case.stdout
msb@chromium.orge28e4982009-09-25 20:51:45 +0000518
519 sample_git_import = """blob
520mark :1
521data 6
522Hello
523
524blob
525mark :2
526data 4
527Bye
528
529reset refs/heads/master
530commit refs/heads/master
531mark :3
532author Bob <bob@example.com> 1253744361 -0700
533committer Bob <bob@example.com> 1253744361 -0700
534data 8
535A and B
536M 100644 :1 a
537M 100644 :2 b
538
539blob
540mark :4
541data 10
542Hello
543You
544
545blob
546mark :5
547data 8
548Bye
549You
550
551commit refs/heads/origin
552mark :6
553author Alice <alice@example.com> 1253744424 -0700
554committer Alice <alice@example.com> 1253744424 -0700
555data 13
556Personalized
557from :3
558M 100644 :4 a
559M 100644 :5 b
560
561reset refs/heads/master
562from :3
563"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000564 def Options(self, *args, **kwargs):
565 return self.OptionsObject(self, *args, **kwargs)
566
567 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000568 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000569 try:
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000570 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000571 cwd=path).communicate()
572 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000573 # git is not available, skip this test.
574 return False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000575 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
576 stderr=STDOUT, cwd=path).communicate(input=git_import)
577 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
578 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000579 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000580 stderr=STDOUT, cwd=path).communicate()
581 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
582 stderr=STDOUT, cwd=path).communicate()
583 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
584 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000585 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000586 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000587 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000588
msb@chromium.orge28e4982009-09-25 20:51:45 +0000589 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000590 GCBaseTestCase.setUp(self)
591 TestCaseUtils.setUp(self)
592 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000593 self.url = 'git://foo'
594 self.root_dir = tempfile.mkdtemp()
595 self.relpath = '.'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000596 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000597 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000598
599 def tearDown(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000600 GCBaseTestCase.tearDown(self)
601 TestCaseUtils.tearDown(self)
602 unittest.TestCase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000603 rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000604
605 def testDir(self):
606 members = [
maruel@chromium.org55e724e2010-03-11 19:36:49 +0000607 'FullUrlForRelativeUrl', 'RunCommand',
msb@chromium.orge6f78352010-01-13 17:05:33 +0000608 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000609 'revinfo', 'runhooks', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000610 ]
611
612 # If you add a member, be sure to add the relevant test!
613 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000614 self.checkstdout('')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000615
616 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000617 if not self.enabled:
618 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000619 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000620 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000621 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
622 relpath=self.relpath)
623 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000624 scm.update(options, None, file_list)
625 gclient_scm.os.remove(file_path)
626 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000627 scm.revert(options, self.args, file_list)
628 self.assertEquals(file_list, [file_path])
629 file_list = []
630 scm.diff(options, self.args, file_list)
631 self.assertEquals(file_list, [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000632 self.checkstdout(
633 ('\n_____ . at refs/heads/master\n\n\n'
634 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
635 'HEAD is now at a7142dc Personalized\n') %
636 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000637
638 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000639 if not self.enabled:
640 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000641 options = self.Options()
642 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
643 relpath=self.relpath)
644 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000645 scm.update(options, None, file_list)
646 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000647 scm.revert(options, self.args, file_list)
648 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000649 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000650 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000651 self.checkstdout(
652 ('\n_____ . at refs/heads/master\n\n\n'
653 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
654 'HEAD is now at a7142dc Personalized\n') %
655 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000656
657 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000658 if not self.enabled:
659 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000660 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000661 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
662 relpath=self.relpath)
663 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000664 scm.update(options, None, file_list)
665 file_path = gclient_scm.os.path.join(self.base_path, 'a')
666 open(file_path, 'a').writelines('touched\n')
667 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000668 scm.revert(options, self.args, file_list)
669 self.assertEquals(file_list, [file_path])
670 file_list = []
671 scm.diff(options, self.args, file_list)
672 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000673 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000674 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000675 self.checkstdout(
676 ('\n_____ . at refs/heads/master\n\n\n'
677 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
678 'HEAD is now at a7142dc Personalized\n') %
679 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000680
681 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000682 if not self.enabled:
683 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000684 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000685 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
686 relpath=self.relpath)
687 file_list = []
688 scm.update(options, None, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000689 file_path = gclient_scm.os.path.join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000690 f = open(file_path, 'w')
691 f.writelines('new\n')
692 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000693 Popen(['git', 'add', 'c'], stdout=PIPE,
694 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000695 file_list = []
696 scm.revert(options, self.args, file_list)
697 self.assertEquals(file_list, [file_path])
698 file_list = []
699 scm.diff(options, self.args, file_list)
700 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000701 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000702 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000703 self.checkstdout(
704 ('\n_____ . at refs/heads/master\n\n\n'
705 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
706 'HEAD is now at a7142dc Personalized\n') %
707 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000708
709 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000710 if not self.enabled:
711 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000712 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000713 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000714 open(file_path, 'a').writelines('touched\n')
715 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
716 relpath=self.relpath)
717 file_list = []
718 scm.status(options, self.args, file_list)
719 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000720 self.checkstdout(
721 ('\n________ running \'git diff --name-status '
722 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
723 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000724
725 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000726 if not self.enabled:
727 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000728 options = self.Options()
729 expected_file_list = []
730 for f in ['a', 'b']:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000731 file_path = gclient_scm.os.path.join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000732 open(file_path, 'a').writelines('touched\n')
733 expected_file_list.extend([file_path])
734 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
735 relpath=self.relpath)
736 file_list = []
737 scm.status(options, self.args, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000738 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
739 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000740 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000741 self.checkstdout(
742 ('\n________ running \'git diff --name-status '
743 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
744 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000745
746 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000747 if not self.enabled:
748 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000749 options = self.Options(verbose=True)
750 root_dir = tempfile.mkdtemp()
751 relpath = 'foo'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000752 base_path = gclient_scm.os.path.join(root_dir, relpath)
753 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000754 try:
755 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
756 relpath=relpath)
757 file_list = []
758 scm.update(options, (), file_list)
759 self.assertEquals(len(file_list), 2)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000760 self.assert_(gclient_scm.os.path.isfile(
761 gclient_scm.os.path.join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000762 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000763 '069c602044c5388d2d15c3f875b057c852003458')
764 finally:
maruel@chromium.orgba551772010-02-03 18:21:42 +0000765 rmtree(root_dir)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000766 join = gclient_scm.os.path.join
767 self.checkstdout(
768 ('\n_____ foo at refs/heads/master\n\n'
769 '________ running \'git clone -b master --verbose %s %s\' in \'%s\'\n'
770 'Initialized empty Git repository in %s\n') %
771 (join(self.root_dir, '.', '.git'), join(root_dir, 'foo'), root_dir,
772 join(root_dir, 'foo', '.git') + '/'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000773
774 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000775 if not self.enabled:
776 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000777 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000778 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
779 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000780 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
781 relpath=self.relpath)
782 file_list = []
783 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000784 self.assertEquals(file_list, expected_file_list)
785 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000786 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000787 self.checkstdout('\n_____ . at refs/heads/master\n\n')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000788
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000789 def testUpdateUnstagedConflict(self):
790 if not self.enabled:
791 return
792 options = self.Options()
793 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
794 relpath=self.relpath)
795 file_path = gclient_scm.os.path.join(self.base_path, 'b')
796 f = open(file_path, 'w').writelines('conflict\n')
797 exception = (
798 "error: Your local changes to 'b' would be overwritten by merge. "
799 "Aborting.\n"
800 "Please, commit your changes or stash them before you can merge.\n")
801 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000802 self.checkstdout('\n_____ . at refs/heads/master\n')
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000803
msb@chromium.org5bde4852009-12-14 16:47:12 +0000804 def testUpdateConflict(self):
805 if not self.enabled:
806 return
807 options = self.Options()
808 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
809 relpath=self.relpath)
810 file_path = gclient_scm.os.path.join(self.base_path, 'b')
811 f = open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000812 scm._Run(['commit', '-am', 'test'], options)
813 __builtin__.raw_input = lambda x: 'y'
814 exception = ('Conflict while rebasing this branch.\n'
815 'Fix the conflict and run gclient again.\n'
816 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +0000817 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000818 exception = ('\n____ . at refs/heads/master\n'
819 '\tYou have unstaged changes.\n'
820 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +0000821 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000822 # The hash always changes. Use a cheap trick.
823 start = ('\n________ running \'git commit -am test\' in \'%s\'\n'
824 '[new ') % gclient_scm.os.path.join(self.root_dir, '.')
825 end = ('] test\n 1 files changed, 1 insertions(+), '
826 '1 deletions(-)\n\n_____ . at refs/heads/master\n'
827 'Attempting rebase onto refs/remotes/origin/master...\n')
828 self.assertTrue(self.stdout.getvalue().startswith(start))
829 self.assertTrue(self.stdout.getvalue().endswith(end))
830 self.assertEquals(len(self.stdout.getvalue()), len(start) + len(end) + 7)
831 self.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +0000832
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000833 def testUpdateNotGit(self):
834 if not self.enabled:
835 return
836 options = self.Options()
837 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
838 relpath=self.relpath)
839 git_path = gclient_scm.os.path.join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +0000840 rename(git_path, git_path + 'foo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000841 exception = ('\n____ . at refs/heads/master\n'
842 '\tPath is not a git repo. No .git dir.\n'
843 '\tTo resolve:\n'
844 '\t\trm -rf .\n'
845 '\tAnd run gclient sync again\n')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000846 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000847 self.checkstdout('')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000848
msb@chromium.org0f282062009-11-06 20:14:02 +0000849 def testRevinfo(self):
850 if not self.enabled:
851 return
852 options = self.Options()
853 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
854 relpath=self.relpath)
855 rev_info = scm.revinfo(options, (), None)
856 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000857 self.checkstdout('')
msb@chromium.org0f282062009-11-06 20:14:02 +0000858
msb@chromium.orge28e4982009-09-25 20:51:45 +0000859
msb@chromium.orge28e4982009-09-25 20:51:45 +0000860if __name__ == '__main__':
msb@chromium.orge28e4982009-09-25 20:51:45 +0000861 unittest.main()
862
863# vim: ts=2:sw=2:tw=80:et: