blob: 00ae0d8c667fa4df6cb744ae73ba2ef312a6333a [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.orgbf38a7e2010-12-14 18:15:54 +00008# pylint: disable=E1101,E1103,W0403
9
maruel@chromium.orgba551772010-02-03 18:21:42 +000010# Import before super_mox to keep valid references.
11from os import rename
12from shutil import rmtree
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000013from subprocess import Popen, PIPE, STDOUT
msb@chromium.orge28e4982009-09-25 20:51:45 +000014import tempfile
maruel@chromium.org389d6de2010-09-09 14:14:37 +000015import unittest
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +000016import __builtin__
msb@chromium.orge28e4982009-09-25 20:51:45 +000017
maruel@chromium.orgba551772010-02-03 18:21:42 +000018# Fixes include path.
maruel@chromium.orgdd057f32010-09-20 19:33:31 +000019from super_mox import mox, StdoutCheck, TestCaseUtils, SuperMoxTestBase
maruel@chromium.orgba551772010-02-03 18:21:42 +000020
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +000021import sys
msb@chromium.orge28e4982009-09-25 20:51:45 +000022import gclient_scm
maruel@chromium.org96913eb2010-06-01 16:22:47 +000023
maruel@chromium.org795a8c12010-10-05 19:54:29 +000024# Shortcut since this function is used often
25join = gclient_scm.os.path.join
26
maruel@chromium.org96913eb2010-06-01 16:22:47 +000027
maruel@chromium.org389d6de2010-09-09 14:14:37 +000028class GCBaseTestCase(object):
maruel@chromium.org96913eb2010-06-01 16:22:47 +000029 def assertRaisesError(self, msg, fn, *args, **kwargs):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000030 """Like unittest's assertRaises() but checks for Gclient.Error."""
maruel@chromium.org96913eb2010-06-01 16:22:47 +000031 try:
32 fn(*args, **kwargs)
33 except gclient_scm.gclient_utils.Error, e:
34 self.assertEquals(e.args[0], msg)
35 else:
36 self.fail('%s not raised' % msg)
msb@chromium.orge28e4982009-09-25 20:51:45 +000037
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000038
maruel@chromium.org389d6de2010-09-09 14:14:37 +000039class BaseTestCase(GCBaseTestCase, SuperMoxTestBase):
40 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000041 SuperMoxTestBase.setUp(self)
42 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCall')
43 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter')
44 self.mox.StubOutWithMock(gclient_scm.gclient_utils,
45 'CheckCallAndFilterAndHeader')
46 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
47 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
48 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'Popen')
49 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
50 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo
51 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
52 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo')
53 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
54 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
55 self._scm_wrapper = gclient_scm.CreateSCM
maruel@chromium.org389d6de2010-09-09 14:14:37 +000056 gclient_scm.scm.SVN.current_version = None
maruel@chromium.org795a8c12010-10-05 19:54:29 +000057 # Absolute path of the fake checkout directory.
58 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000059
60 def tearDown(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000061 SuperMoxTestBase.tearDown(self)
62
63
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000064class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000065 class OptionsObject(object):
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +000066 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +000067 self.verbose = verbose
68 self.revision = revision
69 self.manually_grab_svn_rev = True
70 self.deps_os = None
71 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000072 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000073 self.nohooks = False
74
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000075 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +000076 return self.OptionsObject(*args, **kwargs)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000077
msb@chromium.orge28e4982009-09-25 20:51:45 +000078 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000079 BaseTestCase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000080 self.url = self.SvnUrl()
msb@chromium.orge28e4982009-09-25 20:51:45 +000081
82 def testDir(self):
83 members = [
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +000084 'FullUrlForRelativeUrl', 'RunCommand',
maruel@chromium.org55e724e2010-03-11 19:36:49 +000085 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +000086 'revinfo', 'runhooks', 'status', 'update',
tony@chromium.org4b5b1772010-04-08 01:52:56 +000087 'updatesingle', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +000088 ]
89
90 # If you add a member, be sure to add the relevant test!
maruel@chromium.org9eda4112010-06-11 18:56:10 +000091 self.compareMembers(self._scm_wrapper('svn://a'), members)
msb@chromium.orge28e4982009-09-25 20:51:45 +000092
93 def testUnsupportedSCM(self):
maruel@chromium.org9eda4112010-06-11 18:56:10 +000094 args = ['gopher://foo', self.root_dir, self.relpath]
95 exception_msg = 'No SCM found for url gopher://foo'
96 self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
msb@chromium.orge28e4982009-09-25 20:51:45 +000097
msb@chromium.orge6f78352010-01-13 17:05:33 +000098 def testSVNFullUrlForRelativeUrl(self):
99 self.url = 'svn://a/b/c/d'
100
101 self.mox.ReplayAll()
102 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
103 relpath=self.relpath)
104 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
105
106 def testGITFullUrlForRelativeUrl(self):
107 self.url = 'git://a/b/c/d'
108
109 self.mox.ReplayAll()
110 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
111 relpath=self.relpath)
112 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
113
msb@chromium.orge28e4982009-09-25 20:51:45 +0000114 def testRunCommandException(self):
115 options = self.Options(verbose=False)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000116 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
117 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000118
119 self.mox.ReplayAll()
120 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
121 relpath=self.relpath)
122 exception = "Unsupported argument(s): %s" % ','.join(self.args)
123 self.assertRaisesError(exception, scm.RunCommand,
124 'update', options, self.args)
125
126 def testRunCommandUnknown(self):
127 # TODO(maruel): if ever used.
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000128 pass
msb@chromium.orge28e4982009-09-25 20:51:45 +0000129
130 def testRevertMissing(self):
131 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000132 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000133 gclient_scm.scm.SVN.Capture(['--version']
134 ).AndReturn('svn, version 1.5.1 (r32289)')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000135 # It'll to a checkout instead.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000136 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
137 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000138 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000139 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000140 files_list = self.mox.CreateMockAnything()
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000141 gclient_scm.scm.SVN.RunAndGetFileList(
142 options.verbose,
143 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
144 cwd=self.root_dir,
145 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000146
147 self.mox.ReplayAll()
148 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
149 relpath=self.relpath)
150 scm.revert(options, self.args, files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000151 self.checkstdout(
152 ('\n_____ %s is missing, synching instead\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000153
154 def testRevertNone(self):
155 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000156 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
157 gclient_scm.scm.SVN.CaptureStatus(self.base_path).AndReturn([])
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000158 gclient_scm.scm.SVN.RunAndGetFileList(
159 options.verbose,
160 ['update', '--revision', 'BASE', '--ignore-externals'],
161 cwd=self.base_path,
162 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000163
164 self.mox.ReplayAll()
165 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
166 relpath=self.relpath)
167 file_list = []
168 scm.revert(options, self.args, file_list)
169
170 def testRevert2Files(self):
171 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000172 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000173 items = [
174 ('M ', 'a'),
175 ('A ', 'b'),
176 ]
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000177 file_path1 = join(self.base_path, 'a')
178 file_path2 = join(self.base_path, 'b')
179 gclient_scm.scm.SVN.CaptureStatus(self.base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000180 gclient_scm.os.path.exists(file_path1).AndReturn(True)
181 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
182 gclient_scm.os.remove(file_path1)
183 gclient_scm.os.path.exists(file_path2).AndReturn(True)
184 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
185 gclient_scm.os.remove(file_path2)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000186 gclient_scm.scm.SVN.RunAndGetFileList(
187 options.verbose,
188 ['update', '--revision', 'BASE', '--ignore-externals'],
189 cwd=self.base_path,
190 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000191
192 self.mox.ReplayAll()
193 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
194 relpath=self.relpath)
195 file_list = []
196 scm.revert(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000197 self.checkstdout(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000198 ('%s\n%s\n' % (join(self.base_path, 'a'),
199 join(self.base_path, 'b'))))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000200
201 def testRevertDirectory(self):
202 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000203 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000204 items = [
205 ('~ ', 'a'),
206 ]
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000207 gclient_scm.scm.SVN.CaptureStatus(self.base_path).AndReturn(items)
208 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000209 gclient_scm.os.path.exists(file_path).AndReturn(True)
210 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000211 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000212 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000213 gclient_scm.gclient_utils.RemoveDirectory(file_path)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000214 gclient_scm.scm.SVN.RunAndGetFileList(
215 options.verbose,
216 ['update', '--revision', 'BASE', '--ignore-externals'],
217 cwd=self.base_path,
218 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000219
220 self.mox.ReplayAll()
221 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
222 relpath=self.relpath)
223 file_list2 = []
224 scm.revert(options, self.args, file_list2)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000225 self.checkstdout(('%s\n' % file_path))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000226
227 def testStatus(self):
228 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000229 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000230 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000231 options.verbose,
232 ['status'] + self.args + ['--ignore-externals'],
233 cwd=self.base_path,
234 file_list=[]).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000235
236 self.mox.ReplayAll()
237 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
238 relpath=self.relpath)
239 file_list = []
240 self.assertEqual(scm.status(options, self.args, file_list), None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000241
242 # TODO(maruel): TEST REVISIONS!!!
243 # TODO(maruel): TEST RELOCATE!!!
244 def testUpdateCheckout(self):
245 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000246 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000247 file_info.root = 'blah'
248 file_info.url = self.url
249 file_info.uuid = 'ABC'
250 file_info.revision = 42
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000251 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
252 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000253 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000254 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000255 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000256 gclient_scm.scm.SVN.Capture(['--version']
257 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000258 gclient_scm.scm.SVN.RunAndGetFileList(
259 options.verbose,
260 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
261 cwd=self.root_dir,
262 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000263 self.mox.ReplayAll()
264 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
265 relpath=self.relpath)
266 scm.update(options, (), files_list)
267
268 def testUpdateUpdate(self):
269 options = self.Options(verbose=True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000270 options.force = True
271 options.nohooks = False
272 file_info = {
273 'Repository Root': 'blah',
274 'URL': self.url,
275 'UUID': 'ABC',
276 'Revision': 42,
277 }
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000278 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
279 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000280
281 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000282 dotted_path = join(self.base_path, '.')
283 gclient_scm.scm.SVN.CaptureStatus(dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000284
msb@chromium.orge28e4982009-09-25 20:51:45 +0000285 # Checkout or update.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000286 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
287 gclient_scm.scm.SVN.CaptureInfo(dotted_path).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000288 # Cheat a bit here.
maruel@chromium.org54019f32010-09-09 13:50:11 +0000289 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000290 additional_args = []
291 if options.manually_grab_svn_rev:
292 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.org669600d2010-09-01 19:06:31 +0000293 gclient_scm.scm.SVN.Capture(['--version']
294 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000295 additional_args.extend(['--force', '--ignore-externals'])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000296 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000297 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000298 options.verbose,
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000299 ['update', self.base_path] + additional_args,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000300 cwd=self.root_dir, file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000301
302 self.mox.ReplayAll()
303 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
304 relpath=self.relpath)
305 scm.update(options, (), files_list)
306
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000307 def testUpdateSingleCheckout(self):
308 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000309 file_info = {
310 'URL': self.url,
311 'Revision': 42,
312 }
tony@chromium.org57564662010-04-14 02:35:12 +0000313
314 # Checks to make sure that we support svn co --depth.
315 gclient_scm.scm.SVN.current_version = None
316 gclient_scm.scm.SVN.Capture(['--version']
317 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000318 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
319 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000320
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000321 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000322 dotted_path = join(self.base_path, '.')
323 gclient_scm.scm.SVN.CaptureStatus(dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000324
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000325 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000326 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000327 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000328 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000329 always=True,
330 cwd=self.root_dir)
331 gclient_scm.scm.SVN.RunAndGetFileList(
332 options.verbose,
333 ['update', 'DEPS', '--ignore-externals'],
334 cwd=self.base_path,
335 file_list=files_list)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000336
337 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000338 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
339 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
340 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
341 gclient_scm.scm.SVN.CaptureInfo(dotted_path).AndReturn(file_info)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000342 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org57564662010-04-14 02:35:12 +0000343
344 self.mox.ReplayAll()
345 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
346 relpath=self.relpath)
347 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000348 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org57564662010-04-14 02:35:12 +0000349
350 def testUpdateSingleCheckoutSVN14(self):
351 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000352
353 # Checks to make sure that we support svn co --depth.
354 gclient_scm.scm.SVN.current_version = None
355 gclient_scm.scm.SVN.Capture(['--version']
356 ).AndReturn('svn, version 1.4.4 (r25188)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000357 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org57564662010-04-14 02:35:12 +0000358
359 # When checking out a single file with svn 1.4, we use svn export
360 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000361 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000362 ['svn', 'export', join(self.url, 'DEPS'), join(self.base_path, 'DEPS')],
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000363 always=True, cwd=self.root_dir)
tony@chromium.org57564662010-04-14 02:35:12 +0000364
365 self.mox.ReplayAll()
366 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
367 relpath=self.relpath)
368 scm.updatesingle(options, ['DEPS'], files_list)
369
370 def testUpdateSingleCheckoutSVNUpgrade(self):
371 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000372 file_info = {
373 'URL': self.url,
374 'Revision': 42,
375 }
376
377 # Checks to make sure that we support svn co --depth.
378 gclient_scm.scm.SVN.current_version = None
379 gclient_scm.scm.SVN.Capture(['--version']
380 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000381 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000382 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
383 # the old DEPS file.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000384 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(True)
385 gclient_scm.os.remove(join(self.base_path, 'DEPS'))
tony@chromium.org57564662010-04-14 02:35:12 +0000386
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000387 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000388 gclient_scm.scm.SVN.CaptureStatus(join(self.base_path, '.')).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000389
tony@chromium.org57564662010-04-14 02:35:12 +0000390 # When checking out a single file, we issue an svn checkout and svn update.
391 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000392 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000393 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000394 always=True,
395 cwd=self.root_dir)
396 gclient_scm.scm.SVN.RunAndGetFileList(
397 options.verbose,
398 ['update', 'DEPS', '--ignore-externals'],
399 cwd=self.base_path,
400 file_list=files_list)
tony@chromium.org57564662010-04-14 02:35:12 +0000401
402 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000403 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
404 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
405 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000406 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000407 join(self.base_path, ".")).AndReturn(file_info)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000408 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000409
410 self.mox.ReplayAll()
411 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
412 relpath=self.relpath)
413 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000414 self.checkstdout(
415 ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000416
417 def testUpdateSingleUpdate(self):
418 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000419 file_info = {
420 'URL': self.url,
421 'Revision': 42,
422 }
tony@chromium.org57564662010-04-14 02:35:12 +0000423 # Checks to make sure that we support svn co --depth.
424 gclient_scm.scm.SVN.current_version = None
425 gclient_scm.scm.SVN.Capture(['--version']
426 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000427 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000428
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000429 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000430 gclient_scm.scm.SVN.CaptureStatus(join(self.base_path, '.')).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000431
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000432 # Now we fall back on scm.update().
433 files_list = self.mox.CreateMockAnything()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000434 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
435 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
436 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000437 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000438 join(self.base_path, '.')).AndReturn(file_info)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000439 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000440
441 self.mox.ReplayAll()
442 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
443 relpath=self.relpath)
444 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000445 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000446
msb@chromium.orge28e4982009-09-25 20:51:45 +0000447 def testUpdateGit(self):
448 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000449 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
450 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000451
452 self.mox.ReplayAll()
453 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
454 relpath=self.relpath)
455 file_list = []
456 scm.update(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000457 self.checkstdout(
458 ('________ found .git directory; skipping %s\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000459
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000460 def testUpdateHg(self):
461 options = self.Options(verbose=True)
462 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
463 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(True)
464
465 self.mox.ReplayAll()
466 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
467 relpath=self.relpath)
468 file_list = []
469 scm.update(options, self.args, file_list)
470 self.checkstdout(
471 ('________ found .hg directory; skipping %s\n' % self.relpath))
472
msb@chromium.orge28e4982009-09-25 20:51:45 +0000473
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000474class GitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
475 unittest.TestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000476 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000477 class OptionsObject(object):
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000478 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000479 self.verbose = verbose
480 self.revision = revision
481 self.manually_grab_svn_rev = True
482 self.deps_os = None
483 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000484 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000485 self.nohooks = False
486
487 sample_git_import = """blob
488mark :1
489data 6
490Hello
491
492blob
493mark :2
494data 4
495Bye
496
497reset refs/heads/master
498commit refs/heads/master
499mark :3
500author Bob <bob@example.com> 1253744361 -0700
501committer Bob <bob@example.com> 1253744361 -0700
502data 8
503A and B
504M 100644 :1 a
505M 100644 :2 b
506
507blob
508mark :4
509data 10
510Hello
511You
512
513blob
514mark :5
515data 8
516Bye
517You
518
519commit refs/heads/origin
520mark :6
521author Alice <alice@example.com> 1253744424 -0700
522committer Alice <alice@example.com> 1253744424 -0700
523data 13
524Personalized
525from :3
526M 100644 :4 a
527M 100644 :5 b
528
529reset refs/heads/master
530from :3
531"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000532 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000533 return self.OptionsObject(*args, **kwargs)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000534
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000535 @staticmethod
536 def CreateGitRepo(git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000537 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000538 try:
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000539 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000540 cwd=path).communicate()
541 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000542 # git is not available, skip this test.
543 return False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000544 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
545 stderr=STDOUT, cwd=path).communicate(input=git_import)
546 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
547 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000548 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000549 stderr=STDOUT, cwd=path).communicate()
550 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
551 stderr=STDOUT, cwd=path).communicate()
552 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
553 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000554 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000555 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000556 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000557
msb@chromium.orge28e4982009-09-25 20:51:45 +0000558 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000559 TestCaseUtils.setUp(self)
560 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000561 self.url = 'git://foo'
562 self.root_dir = tempfile.mkdtemp()
563 self.relpath = '.'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000564 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000565 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000566 StdoutCheck.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000567
568 def tearDown(self):
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000569 StdoutCheck.tearDown(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000570 TestCaseUtils.tearDown(self)
571 unittest.TestCase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000572 rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000573
574 def testDir(self):
575 members = [
maruel@chromium.org55e724e2010-03-11 19:36:49 +0000576 'FullUrlForRelativeUrl', 'RunCommand',
msb@chromium.orge6f78352010-01-13 17:05:33 +0000577 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000578 'revinfo', 'runhooks', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000579 ]
580
581 # If you add a member, be sure to add the relevant test!
582 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
583
584 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000585 if not self.enabled:
586 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000587 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000588 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000589 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
590 relpath=self.relpath)
591 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000592 scm.update(options, None, file_list)
593 gclient_scm.os.remove(file_path)
594 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000595 scm.revert(options, self.args, file_list)
596 self.assertEquals(file_list, [file_path])
597 file_list = []
598 scm.diff(options, self.args, file_list)
599 self.assertEquals(file_list, [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000600 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000601 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
602 'Fast-forward\n a | 1 +\n b | 1 +\n'
603 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000604 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
605 'HEAD is now at a7142dc Personalized\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000606 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000607
608 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000609 if not self.enabled:
610 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000611 options = self.Options()
612 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
613 relpath=self.relpath)
614 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000615 scm.update(options, None, file_list)
616 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000617 scm.revert(options, self.args, file_list)
618 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000619 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000620 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000621 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000622 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
623 'Fast-forward\n a | 1 +\n b | 1 +\n'
624 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000625 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
626 'HEAD is now at a7142dc Personalized\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000627 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000628
629 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000630 if not self.enabled:
631 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000632 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000633 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
634 relpath=self.relpath)
635 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000636 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000637 file_path = join(self.base_path, 'a')
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000638 open(file_path, 'a').writelines('touched\n')
639 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000640 scm.revert(options, self.args, file_list)
641 self.assertEquals(file_list, [file_path])
642 file_list = []
643 scm.diff(options, self.args, file_list)
644 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000645 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000646 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000647 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000648 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
649 'Fast-forward\n a | 1 +\n b | 1 +\n'
650 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000651 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
652 'HEAD is now at a7142dc Personalized\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000653 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000654
655 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000656 if not self.enabled:
657 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000658 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000659 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
660 relpath=self.relpath)
661 file_list = []
662 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000663 file_path = join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000664 f = open(file_path, 'w')
665 f.writelines('new\n')
666 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000667 Popen(['git', 'add', 'c'], stdout=PIPE,
668 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000669 file_list = []
670 scm.revert(options, self.args, file_list)
671 self.assertEquals(file_list, [file_path])
672 file_list = []
673 scm.diff(options, self.args, file_list)
674 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000675 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000676 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000677 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000678 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
679 'Fast-forward\n a | 1 +\n b | 1 +\n'
680 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000681 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
682 'HEAD is now at a7142dc Personalized\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000683 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000684
685 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000686 if not self.enabled:
687 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000688 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000689 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000690 open(file_path, 'a').writelines('touched\n')
691 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
692 relpath=self.relpath)
693 file_list = []
694 scm.status(options, self.args, file_list)
695 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000696 self.checkstdout(
697 ('\n________ running \'git diff --name-status '
698 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000699 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000700
701 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000702 if not self.enabled:
703 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000704 options = self.Options()
705 expected_file_list = []
706 for f in ['a', 'b']:
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000707 file_path = join(self.base_path, f)
708 open(file_path, 'a').writelines('touched\n')
709 expected_file_list.extend([file_path])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000710 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
711 relpath=self.relpath)
712 file_list = []
713 scm.status(options, self.args, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000714 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000715 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000716 self.checkstdout(
717 ('\n________ running \'git diff --name-status '
718 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000719 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000720
721 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000722 if not self.enabled:
723 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000724 options = self.Options(verbose=True)
725 root_dir = tempfile.mkdtemp()
726 relpath = 'foo'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000727 base_path = join(root_dir, relpath)
728 url = join(self.base_path, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000729 try:
730 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
731 relpath=relpath)
732 file_list = []
733 scm.update(options, (), file_list)
734 self.assertEquals(len(file_list), 2)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000735 self.assert_(gclient_scm.os.path.isfile(join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000736 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000737 '069c602044c5388d2d15c3f875b057c852003458')
738 finally:
maruel@chromium.orgba551772010-02-03 18:21:42 +0000739 rmtree(root_dir)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000740 self.checkstdout(
741 ('\n_____ foo at refs/heads/master\n\n'
742 '________ running \'git clone -b master --verbose %s %s\' in \'%s\'\n'
743 'Initialized empty Git repository in %s\n') %
744 (join(self.root_dir, '.', '.git'), join(root_dir, 'foo'), root_dir,
bauerb@chromium.org4acf7422010-10-07 14:20:08 +0000745 join(gclient_scm.os.path.realpath(root_dir), 'foo', '.git') + '/'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000746
747 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000748 if not self.enabled:
749 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000750 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000751 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000752 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
753 relpath=self.relpath)
754 file_list = []
755 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000756 self.assertEquals(file_list, expected_file_list)
757 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000758 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000759 self.checkstdout(
760 '\n_____ . at refs/heads/master\n'
761 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
762 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000763
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000764 def testUpdateUnstagedConflict(self):
765 if not self.enabled:
766 return
767 options = self.Options()
768 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
769 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000770 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000771 open(file_path, 'w').writelines('conflict\n')
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000772 exception = (
773 "error: Your local changes to 'b' would be overwritten by merge. "
774 "Aborting.\n"
775 "Please, commit your changes or stash them before you can merge.\n")
776 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000777 self.checkstdout('\n_____ . at refs/heads/master\n')
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000778
msb@chromium.org5bde4852009-12-14 16:47:12 +0000779 def testUpdateConflict(self):
780 if not self.enabled:
781 return
782 options = self.Options()
783 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
784 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000785 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000786 open(file_path, 'w').writelines('conflict\n')
787 # pylint: disable=W0212
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000788 scm._Run(['commit', '-am', 'test'], options)
789 __builtin__.raw_input = lambda x: 'y'
790 exception = ('Conflict while rebasing this branch.\n'
791 'Fix the conflict and run gclient again.\n'
792 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +0000793 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000794 exception = ('\n____ . at refs/heads/master\n'
795 '\tYou have unstaged changes.\n'
796 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +0000797 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000798 # The hash always changes. Use a cheap trick.
799 start = ('\n________ running \'git commit -am test\' in \'%s\'\n'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000800 '[new ') % join(self.root_dir, '.')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000801 end = ('] test\n 1 files changed, 1 insertions(+), '
802 '1 deletions(-)\n\n_____ . at refs/heads/master\n'
803 'Attempting rebase onto refs/remotes/origin/master...\n')
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +0000804 self.assertTrue(sys.stdout.getvalue().startswith(start))
805 self.assertTrue(sys.stdout.getvalue().endswith(end))
806 self.assertEquals(len(sys.stdout.getvalue()),
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000807 len(start) + len(end) + 7)
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +0000808 sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +0000809
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000810 def testUpdateNotGit(self):
811 if not self.enabled:
812 return
813 options = self.Options()
814 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
815 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000816 git_path = join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +0000817 rename(git_path, git_path + 'foo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000818 exception = ('\n____ . at refs/heads/master\n'
819 '\tPath is not a git repo. No .git dir.\n'
820 '\tTo resolve:\n'
821 '\t\trm -rf .\n'
822 '\tAnd run gclient sync again\n')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000823 self.assertRaisesError(exception, scm.update, options, (), [])
824
msb@chromium.org0f282062009-11-06 20:14:02 +0000825 def testRevinfo(self):
826 if not self.enabled:
827 return
828 options = self.Options()
829 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
830 relpath=self.relpath)
831 rev_info = scm.revinfo(options, (), None)
832 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
833
msb@chromium.orge28e4982009-09-25 20:51:45 +0000834
msb@chromium.orge28e4982009-09-25 20:51:45 +0000835if __name__ == '__main__':
msb@chromium.orge28e4982009-09-25 20:51:45 +0000836 unittest.main()
837
838# vim: ts=2:sw=2:tw=80:et: