blob: bd516d97d4d11566c49079a39912a4627b2b31fb [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.orgdd057f32010-09-20 19:33:31 +000018from super_mox import mox, StdoutCheck, 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
maruel@chromium.org389d6de2010-09-09 14:14:37 +000034class BaseTestCase(GCBaseTestCase, SuperMoxTestBase):
35 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000036 SuperMoxTestBase.setUp(self)
37 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCall')
38 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter')
39 self.mox.StubOutWithMock(gclient_scm.gclient_utils,
40 'CheckCallAndFilterAndHeader')
41 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
42 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
43 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'Popen')
44 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
45 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo
46 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
47 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo')
48 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
49 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
50 self._scm_wrapper = gclient_scm.CreateSCM
maruel@chromium.org389d6de2010-09-09 14:14:37 +000051 gclient_scm.scm.SVN.current_version = None
52
53 def tearDown(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000054 SuperMoxTestBase.tearDown(self)
55
56
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000057class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000058 class OptionsObject(object):
maruel@chromium.org8071c282010-09-20 19:44:19 +000059 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +000060 self.verbose = verbose
61 self.revision = revision
62 self.manually_grab_svn_rev = True
63 self.deps_os = None
64 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000065 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000066 self.nohooks = False
maruel@chromium.orgdd057f32010-09-20 19:33:31 +000067 self.stdout = gclient_scm.sys.stdout
msb@chromium.orge28e4982009-09-25 20:51:45 +000068
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000069 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +000070 return self.OptionsObject(*args, **kwargs)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000071
msb@chromium.orge28e4982009-09-25 20:51:45 +000072 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000073 BaseTestCase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000074 self.url = self.SvnUrl()
msb@chromium.orge28e4982009-09-25 20:51:45 +000075
76 def testDir(self):
77 members = [
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +000078 'FullUrlForRelativeUrl', 'RunCommand',
maruel@chromium.org55e724e2010-03-11 19:36:49 +000079 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +000080 'revinfo', 'runhooks', 'status', 'update',
tony@chromium.org4b5b1772010-04-08 01:52:56 +000081 'updatesingle', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +000082 ]
83
84 # If you add a member, be sure to add the relevant test!
maruel@chromium.org9eda4112010-06-11 18:56:10 +000085 self.compareMembers(self._scm_wrapper('svn://a'), members)
msb@chromium.orge28e4982009-09-25 20:51:45 +000086
87 def testUnsupportedSCM(self):
maruel@chromium.org9eda4112010-06-11 18:56:10 +000088 args = ['gopher://foo', self.root_dir, self.relpath]
89 exception_msg = 'No SCM found for url gopher://foo'
90 self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
msb@chromium.orge28e4982009-09-25 20:51:45 +000091
msb@chromium.orge6f78352010-01-13 17:05:33 +000092 def testSVNFullUrlForRelativeUrl(self):
93 self.url = 'svn://a/b/c/d'
94
95 self.mox.ReplayAll()
96 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
97 relpath=self.relpath)
98 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
99
100 def testGITFullUrlForRelativeUrl(self):
101 self.url = 'git://a/b/c/d'
102
103 self.mox.ReplayAll()
104 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
105 relpath=self.relpath)
106 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
107
msb@chromium.orge28e4982009-09-25 20:51:45 +0000108 def testRunCommandException(self):
109 options = self.Options(verbose=False)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000110 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
111 gclient_scm.os.path.exists(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000112
113 self.mox.ReplayAll()
114 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
115 relpath=self.relpath)
116 exception = "Unsupported argument(s): %s" % ','.join(self.args)
117 self.assertRaisesError(exception, scm.RunCommand,
118 'update', options, self.args)
119
120 def testRunCommandUnknown(self):
121 # TODO(maruel): if ever used.
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000122 pass
msb@chromium.orge28e4982009-09-25 20:51:45 +0000123
124 def testRevertMissing(self):
125 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000126 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
127 gclient_scm.os.path.isdir(base_path).AndReturn(False)
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000128 gclient_scm.scm.SVN.Capture(['--version']
129 ).AndReturn('svn, version 1.5.1 (r32289)')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000130 # It'll to a checkout instead.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000131 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
132 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000133 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000134 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000135 files_list = self.mox.CreateMockAnything()
maruel@chromium.org03807072010-08-16 17:18:44 +0000136 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000137 ['checkout', self.url, base_path,
138 '--force'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000139 cwd=self.root_dir,
140 file_list=files_list,
141 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000142
143 self.mox.ReplayAll()
144 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
145 relpath=self.relpath)
146 scm.revert(options, self.args, files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000147 self.checkstdout(
148 ('\n_____ %s is missing, synching instead\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000149
150 def testRevertNone(self):
151 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000152 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
153 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000154 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn([])
maruel@chromium.org03807072010-08-16 17:18:44 +0000155 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000156 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000157 cwd=base_path,
158 file_list=mox.IgnoreArg(),
159 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000160
161 self.mox.ReplayAll()
162 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
163 relpath=self.relpath)
164 file_list = []
165 scm.revert(options, self.args, file_list)
166
167 def testRevert2Files(self):
168 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000169 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
170 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000171 items = [
172 ('M ', 'a'),
173 ('A ', 'b'),
174 ]
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000175 file_path1 = gclient_scm.os.path.join(base_path, 'a')
176 file_path2 = gclient_scm.os.path.join(base_path, 'b')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000177 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000178 gclient_scm.os.path.exists(file_path1).AndReturn(True)
179 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
180 gclient_scm.os.remove(file_path1)
181 gclient_scm.os.path.exists(file_path2).AndReturn(True)
182 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
183 gclient_scm.os.remove(file_path2)
maruel@chromium.org03807072010-08-16 17:18:44 +0000184 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000185 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000186 cwd=base_path,
187 file_list=mox.IgnoreArg(),
188 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000189
190 self.mox.ReplayAll()
191 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
192 relpath=self.relpath)
193 file_list = []
194 scm.revert(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000195 self.checkstdout(
196 ('%s\n%s\n' % (gclient_scm.os.path.join(base_path, 'a'),
197 gclient_scm.os.path.join(base_path, 'b'))))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000198
199 def testRevertDirectory(self):
200 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000201 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
202 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000203 items = [
204 ('~ ', 'a'),
205 ]
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000206 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000207 file_path = gclient_scm.os.path.join(base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000208 gclient_scm.os.path.exists(file_path).AndReturn(True)
209 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000210 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000211 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000212 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000213 file_list1 = []
maruel@chromium.org03807072010-08-16 17:18:44 +0000214 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000215 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000216 cwd=base_path,
217 file_list=mox.IgnoreArg(),
218 stdout=options.stdout)
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.org8ef5f542009-11-12 02:05:02 +0000229 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
230 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org03807072010-08-16 17:18:44 +0000231 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000232 ['status'] + self.args,
maruel@chromium.org669600d2010-09-01 19:06:31 +0000233 cwd=base_path, file_list=[],
234 stdout=options.stdout).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 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
247 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000248 file_info.root = 'blah'
249 file_info.url = self.url
250 file_info.uuid = 'ABC'
251 file_info.revision = 42
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000252 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
253 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000254 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000255 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000256 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000257 gclient_scm.scm.SVN.Capture(['--version']
258 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org03807072010-08-16 17:18:44 +0000259 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000260 ['checkout', self.url, base_path,
261 '--force'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000262 cwd=self.root_dir,
263 file_list=files_list,
264 stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000265 self.mox.ReplayAll()
266 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
267 relpath=self.relpath)
268 scm.update(options, (), files_list)
269
270 def testUpdateUpdate(self):
271 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000272 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000273 options.force = True
274 options.nohooks = False
275 file_info = {
276 'Repository Root': 'blah',
277 'URL': self.url,
278 'UUID': 'ABC',
279 'Revision': 42,
280 }
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000281 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
282 ).AndReturn(False)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000283
284 # Verify no locked files.
285 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
286 ).AndReturn([])
287
msb@chromium.orge28e4982009-09-25 20:51:45 +0000288 # Checkout or update.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000289 gclient_scm.os.path.exists(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000290 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000291 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000292 # Cheat a bit here.
maruel@chromium.org54019f32010-09-09 13:50:11 +0000293 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000294 additional_args = []
295 if options.manually_grab_svn_rev:
296 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.org669600d2010-09-01 19:06:31 +0000297 gclient_scm.scm.SVN.Capture(['--version']
298 ).AndReturn('svn, version 1.5.1 (r32289)')
299 additional_args.append('--force')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000300 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000301 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000302 options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000303 ['update', base_path] + additional_args,
maruel@chromium.org669600d2010-09-01 19:06:31 +0000304 cwd=self.root_dir, file_list=files_list, stdout=options.stdout)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000305
306 self.mox.ReplayAll()
307 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
308 relpath=self.relpath)
309 scm.update(options, (), files_list)
310
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000311 def testUpdateSingleCheckout(self):
312 options = self.Options(verbose=True)
313 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
314 file_info = {
315 'URL': self.url,
316 'Revision': 42,
317 }
tony@chromium.org57564662010-04-14 02:35:12 +0000318
319 # Checks to make sure that we support svn co --depth.
320 gclient_scm.scm.SVN.current_version = None
321 gclient_scm.scm.SVN.Capture(['--version']
322 ).AndReturn('svn, version 1.5.1 (r32289)')
323 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
324 ).AndReturn(False)
325 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, 'DEPS')
326 ).AndReturn(False)
327
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000328 # Verify no locked files.
329 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
330 ).AndReturn([])
331
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000332 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000333 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000334 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
335 ['svn', 'checkout', '--depth', 'empty', self.url, base_path],
336 always=True, cwd=self.root_dir, stdout=options.stdout)
maruel@chromium.org03807072010-08-16 17:18:44 +0000337 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, ['update', 'DEPS'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000338 cwd=base_path, file_list=files_list, stdout=options.stdout)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000339
340 # Now we fall back on scm.update().
341 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
tony@chromium.org57564662010-04-14 02:35:12 +0000342 ).AndReturn(False)
343 gclient_scm.os.path.exists(base_path).AndReturn(True)
344 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000345 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
346 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org57564662010-04-14 02:35:12 +0000347
348 self.mox.ReplayAll()
349 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
350 relpath=self.relpath)
351 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000352 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org57564662010-04-14 02:35:12 +0000353
354 def testUpdateSingleCheckoutSVN14(self):
355 options = self.Options(verbose=True)
356 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
357 file_info = {
358 'URL': self.url,
359 'Revision': 42,
360 }
361
362 # Checks to make sure that we support svn co --depth.
363 gclient_scm.scm.SVN.current_version = None
364 gclient_scm.scm.SVN.Capture(['--version']
365 ).AndReturn('svn, version 1.4.4 (r25188)')
366 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path)
367 ).AndReturn(True)
368
369 # When checking out a single file with svn 1.4, we use svn export
370 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000371 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
372 ['svn', 'export', gclient_scm.os.path.join(self.url, 'DEPS'),
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000373 gclient_scm.os.path.join(base_path, 'DEPS')],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000374 always=True, cwd=self.root_dir, stdout=options.stdout)
tony@chromium.org57564662010-04-14 02:35:12 +0000375
376 self.mox.ReplayAll()
377 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
378 relpath=self.relpath)
379 scm.updatesingle(options, ['DEPS'], files_list)
380
381 def testUpdateSingleCheckoutSVNUpgrade(self):
382 options = self.Options(verbose=True)
383 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
384 file_info = {
385 'URL': self.url,
386 'Revision': 42,
387 }
388
389 # Checks to make sure that we support svn co --depth.
390 gclient_scm.scm.SVN.current_version = None
391 gclient_scm.scm.SVN.Capture(['--version']
392 ).AndReturn('svn, version 1.5.1 (r32289)')
393 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
394 ).AndReturn(False)
395 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
396 # the old DEPS file.
397 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, 'DEPS')
398 ).AndReturn(True)
399 gclient_scm.os.remove(gclient_scm.os.path.join(base_path, 'DEPS'))
400
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000401 # Verify no locked files.
402 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
403 ).AndReturn([])
404
tony@chromium.org57564662010-04-14 02:35:12 +0000405 # When checking out a single file, we issue an svn checkout and svn update.
406 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000407 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
408 ['svn', 'checkout', '--depth', 'empty', self.url, base_path],
409 always=True, cwd=self.root_dir, stdout=options.stdout)
maruel@chromium.org03807072010-08-16 17:18:44 +0000410 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, ['update', 'DEPS'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000411 cwd=base_path, file_list=files_list, stdout=options.stdout)
tony@chromium.org57564662010-04-14 02:35:12 +0000412
413 # Now we fall back on scm.update().
414 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
415 ).AndReturn(False)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000416 gclient_scm.os.path.exists(base_path).AndReturn(True)
417 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000418 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
419 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000420
421 self.mox.ReplayAll()
422 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
423 relpath=self.relpath)
424 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000425 self.checkstdout(
426 ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000427
428 def testUpdateSingleUpdate(self):
429 options = self.Options(verbose=True)
430 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
431 file_info = {
432 'URL': self.url,
433 'Revision': 42,
434 }
tony@chromium.org57564662010-04-14 02:35:12 +0000435 # Checks to make sure that we support svn co --depth.
436 gclient_scm.scm.SVN.current_version = None
437 gclient_scm.scm.SVN.Capture(['--version']
438 ).AndReturn('svn, version 1.5.1 (r32289)')
439 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
440 ).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000441
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000442 # Verify no locked files.
443 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
444 ).AndReturn([])
445
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000446 # Now we fall back on scm.update().
447 files_list = self.mox.CreateMockAnything()
448 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
449 ).AndReturn(False)
450 gclient_scm.os.path.exists(base_path).AndReturn(True)
451 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000452 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
453 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000454
455 self.mox.ReplayAll()
456 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
457 relpath=self.relpath)
458 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000459 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000460
msb@chromium.orge28e4982009-09-25 20:51:45 +0000461 def testUpdateGit(self):
462 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000463 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
464 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000465
466 self.mox.ReplayAll()
467 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
468 relpath=self.relpath)
469 file_list = []
470 scm.update(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000471 self.checkstdout(
472 ('________ found .git directory; skipping %s\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000473
msb@chromium.orge28e4982009-09-25 20:51:45 +0000474
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000475class GitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
476 unittest.TestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000477 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000478 class OptionsObject(object):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000479 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000480 self.verbose = verbose
481 self.revision = revision
482 self.manually_grab_svn_rev = True
483 self.deps_os = None
484 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000485 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000486 self.nohooks = False
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000487 self.stdout = gclient_scm.sys.stdout
msb@chromium.orge28e4982009-09-25 20:51:45 +0000488
489 sample_git_import = """blob
490mark :1
491data 6
492Hello
493
494blob
495mark :2
496data 4
497Bye
498
499reset refs/heads/master
500commit refs/heads/master
501mark :3
502author Bob <bob@example.com> 1253744361 -0700
503committer Bob <bob@example.com> 1253744361 -0700
504data 8
505A and B
506M 100644 :1 a
507M 100644 :2 b
508
509blob
510mark :4
511data 10
512Hello
513You
514
515blob
516mark :5
517data 8
518Bye
519You
520
521commit refs/heads/origin
522mark :6
523author Alice <alice@example.com> 1253744424 -0700
524committer Alice <alice@example.com> 1253744424 -0700
525data 13
526Personalized
527from :3
528M 100644 :4 a
529M 100644 :5 b
530
531reset refs/heads/master
532from :3
533"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000534 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000535 return self.OptionsObject(*args, **kwargs)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000536
537 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000538 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000539 try:
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000540 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000541 cwd=path).communicate()
542 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000543 # git is not available, skip this test.
544 return False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000545 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
546 stderr=STDOUT, cwd=path).communicate(input=git_import)
547 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
548 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000549 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000550 stderr=STDOUT, cwd=path).communicate()
551 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
552 stderr=STDOUT, cwd=path).communicate()
553 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
554 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000555 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000556 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000557 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000558
msb@chromium.orge28e4982009-09-25 20:51:45 +0000559 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000560 TestCaseUtils.setUp(self)
561 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000562 self.url = 'git://foo'
563 self.root_dir = tempfile.mkdtemp()
564 self.relpath = '.'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000565 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000566 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000567 StdoutCheck.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000568
569 def tearDown(self):
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000570 StdoutCheck.tearDown(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000571 TestCaseUtils.tearDown(self)
572 unittest.TestCase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000573 rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000574
575 def testDir(self):
576 members = [
maruel@chromium.org55e724e2010-03-11 19:36:49 +0000577 'FullUrlForRelativeUrl', 'RunCommand',
msb@chromium.orge6f78352010-01-13 17:05:33 +0000578 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000579 'revinfo', 'runhooks', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000580 ]
581
582 # If you add a member, be sure to add the relevant test!
583 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
584
585 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000586 if not self.enabled:
587 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000588 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000589 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000590 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
591 relpath=self.relpath)
592 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000593 scm.update(options, None, file_list)
594 gclient_scm.os.remove(file_path)
595 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000596 scm.revert(options, self.args, file_list)
597 self.assertEquals(file_list, [file_path])
598 file_list = []
599 scm.diff(options, self.args, file_list)
600 self.assertEquals(file_list, [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000601 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000602 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
603 'Fast-forward\n a | 1 +\n b | 1 +\n'
604 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000605 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
606 'HEAD is now at a7142dc Personalized\n') %
607 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000608
609 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000610 if not self.enabled:
611 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000612 options = self.Options()
613 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
614 relpath=self.relpath)
615 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000616 scm.update(options, None, file_list)
617 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000618 scm.revert(options, self.args, file_list)
619 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000620 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000621 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000622 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000623 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
624 'Fast-forward\n a | 1 +\n b | 1 +\n'
625 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000626 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
627 'HEAD is now at a7142dc Personalized\n') %
628 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000629
630 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000631 if not self.enabled:
632 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000633 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000634 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
635 relpath=self.relpath)
636 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000637 scm.update(options, None, file_list)
638 file_path = gclient_scm.os.path.join(self.base_path, 'a')
639 open(file_path, 'a').writelines('touched\n')
640 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000641 scm.revert(options, self.args, file_list)
642 self.assertEquals(file_list, [file_path])
643 file_list = []
644 scm.diff(options, self.args, file_list)
645 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000646 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000647 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000648 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000649 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
650 'Fast-forward\n a | 1 +\n b | 1 +\n'
651 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000652 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
653 'HEAD is now at a7142dc Personalized\n') %
654 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000655
656 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000657 if not self.enabled:
658 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000659 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000660 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
661 relpath=self.relpath)
662 file_list = []
663 scm.update(options, None, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000664 file_path = gclient_scm.os.path.join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000665 f = open(file_path, 'w')
666 f.writelines('new\n')
667 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000668 Popen(['git', 'add', 'c'], stdout=PIPE,
669 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000670 file_list = []
671 scm.revert(options, self.args, file_list)
672 self.assertEquals(file_list, [file_path])
673 file_list = []
674 scm.diff(options, self.args, file_list)
675 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000676 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000677 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000678 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000679 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
680 'Fast-forward\n a | 1 +\n b | 1 +\n'
681 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000682 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
683 'HEAD is now at a7142dc Personalized\n') %
684 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000685
686 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000687 if not self.enabled:
688 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000689 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000690 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000691 open(file_path, 'a').writelines('touched\n')
692 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
693 relpath=self.relpath)
694 file_list = []
695 scm.status(options, self.args, file_list)
696 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000697 self.checkstdout(
698 ('\n________ running \'git diff --name-status '
699 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
700 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000701
702 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000703 if not self.enabled:
704 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000705 options = self.Options()
706 expected_file_list = []
707 for f in ['a', 'b']:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000708 file_path = gclient_scm.os.path.join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000709 open(file_path, 'a').writelines('touched\n')
710 expected_file_list.extend([file_path])
711 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
712 relpath=self.relpath)
713 file_list = []
714 scm.status(options, self.args, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000715 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
716 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000717 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000718 self.checkstdout(
719 ('\n________ running \'git diff --name-status '
720 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
721 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000722
723 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000724 if not self.enabled:
725 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000726 options = self.Options(verbose=True)
727 root_dir = tempfile.mkdtemp()
728 relpath = 'foo'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000729 base_path = gclient_scm.os.path.join(root_dir, relpath)
730 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000731 try:
732 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
733 relpath=relpath)
734 file_list = []
735 scm.update(options, (), file_list)
736 self.assertEquals(len(file_list), 2)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000737 self.assert_(gclient_scm.os.path.isfile(
738 gclient_scm.os.path.join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000739 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000740 '069c602044c5388d2d15c3f875b057c852003458')
741 finally:
maruel@chromium.orgba551772010-02-03 18:21:42 +0000742 rmtree(root_dir)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000743 join = gclient_scm.os.path.join
744 self.checkstdout(
745 ('\n_____ foo at refs/heads/master\n\n'
746 '________ running \'git clone -b master --verbose %s %s\' in \'%s\'\n'
747 'Initialized empty Git repository in %s\n') %
748 (join(self.root_dir, '.', '.git'), join(root_dir, 'foo'), root_dir,
749 join(root_dir, 'foo', '.git') + '/'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000750
751 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000752 if not self.enabled:
753 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000754 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000755 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
756 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000757 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
758 relpath=self.relpath)
759 file_list = []
760 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000761 self.assertEquals(file_list, expected_file_list)
762 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000763 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000764 self.checkstdout(
765 '\n_____ . at refs/heads/master\n'
766 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
767 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000768
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000769 def testUpdateUnstagedConflict(self):
770 if not self.enabled:
771 return
772 options = self.Options()
773 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
774 relpath=self.relpath)
775 file_path = gclient_scm.os.path.join(self.base_path, 'b')
776 f = open(file_path, 'w').writelines('conflict\n')
777 exception = (
778 "error: Your local changes to 'b' would be overwritten by merge. "
779 "Aborting.\n"
780 "Please, commit your changes or stash them before you can merge.\n")
781 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000782 self.checkstdout('\n_____ . at refs/heads/master\n')
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000783
msb@chromium.org5bde4852009-12-14 16:47:12 +0000784 def testUpdateConflict(self):
785 if not self.enabled:
786 return
787 options = self.Options()
788 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
789 relpath=self.relpath)
790 file_path = gclient_scm.os.path.join(self.base_path, 'b')
791 f = open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000792 scm._Run(['commit', '-am', 'test'], options)
793 __builtin__.raw_input = lambda x: 'y'
794 exception = ('Conflict while rebasing this branch.\n'
795 'Fix the conflict and run gclient again.\n'
796 'See \'man git-rebase\' for details.\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 exception = ('\n____ . at refs/heads/master\n'
799 '\tYou have unstaged changes.\n'
800 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +0000801 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000802 # The hash always changes. Use a cheap trick.
803 start = ('\n________ running \'git commit -am test\' in \'%s\'\n'
804 '[new ') % gclient_scm.os.path.join(self.root_dir, '.')
805 end = ('] test\n 1 files changed, 1 insertions(+), '
806 '1 deletions(-)\n\n_____ . at refs/heads/master\n'
807 'Attempting rebase onto refs/remotes/origin/master...\n')
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000808 self.assertTrue(gclient_scm.sys.stdout.getvalue().startswith(start))
809 self.assertTrue(gclient_scm.sys.stdout.getvalue().endswith(end))
810 self.assertEquals(len(gclient_scm.sys.stdout.getvalue()),
811 len(start) + len(end) + 7)
812 gclient_scm.sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +0000813
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000814 def testUpdateNotGit(self):
815 if not self.enabled:
816 return
817 options = self.Options()
818 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
819 relpath=self.relpath)
820 git_path = gclient_scm.os.path.join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +0000821 rename(git_path, git_path + 'foo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000822 exception = ('\n____ . at refs/heads/master\n'
823 '\tPath is not a git repo. No .git dir.\n'
824 '\tTo resolve:\n'
825 '\t\trm -rf .\n'
826 '\tAnd run gclient sync again\n')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000827 self.assertRaisesError(exception, scm.update, options, (), [])
828
msb@chromium.org0f282062009-11-06 20:14:02 +0000829 def testRevinfo(self):
830 if not self.enabled:
831 return
832 options = self.Options()
833 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
834 relpath=self.relpath)
835 rev_info = scm.revinfo(options, (), None)
836 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
837
msb@chromium.orge28e4982009-09-25 20:51:45 +0000838
msb@chromium.orge28e4982009-09-25 20:51:45 +0000839if __name__ == '__main__':
msb@chromium.orge28e4982009-09-25 20:51:45 +0000840 unittest.main()
841
842# vim: ts=2:sw=2:tw=80:et: