blob: 1d78fe3446e176f6503cceaa183bcb3493f9a1e4 [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
67
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000068 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +000069 return self.OptionsObject(*args, **kwargs)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000070
msb@chromium.orge28e4982009-09-25 20:51:45 +000071 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000072 BaseTestCase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000073 self.url = self.SvnUrl()
msb@chromium.orge28e4982009-09-25 20:51:45 +000074
75 def testDir(self):
76 members = [
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +000077 'FullUrlForRelativeUrl', 'RunCommand',
maruel@chromium.org55e724e2010-03-11 19:36:49 +000078 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +000079 'revinfo', 'runhooks', 'status', 'update',
tony@chromium.org4b5b1772010-04-08 01:52:56 +000080 'updatesingle', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +000081 ]
82
83 # If you add a member, be sure to add the relevant test!
maruel@chromium.org9eda4112010-06-11 18:56:10 +000084 self.compareMembers(self._scm_wrapper('svn://a'), members)
msb@chromium.orge28e4982009-09-25 20:51:45 +000085
86 def testUnsupportedSCM(self):
maruel@chromium.org9eda4112010-06-11 18:56:10 +000087 args = ['gopher://foo', self.root_dir, self.relpath]
88 exception_msg = 'No SCM found for url gopher://foo'
89 self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
msb@chromium.orge28e4982009-09-25 20:51:45 +000090
msb@chromium.orge6f78352010-01-13 17:05:33 +000091 def testSVNFullUrlForRelativeUrl(self):
92 self.url = 'svn://a/b/c/d'
93
94 self.mox.ReplayAll()
95 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
96 relpath=self.relpath)
97 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
98
99 def testGITFullUrlForRelativeUrl(self):
100 self.url = 'git://a/b/c/d'
101
102 self.mox.ReplayAll()
103 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
104 relpath=self.relpath)
105 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
106
msb@chromium.orge28e4982009-09-25 20:51:45 +0000107 def testRunCommandException(self):
108 options = self.Options(verbose=False)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000109 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
110 gclient_scm.os.path.exists(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000111
112 self.mox.ReplayAll()
113 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
114 relpath=self.relpath)
115 exception = "Unsupported argument(s): %s" % ','.join(self.args)
116 self.assertRaisesError(exception, scm.RunCommand,
117 'update', options, self.args)
118
119 def testRunCommandUnknown(self):
120 # TODO(maruel): if ever used.
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000121 pass
msb@chromium.orge28e4982009-09-25 20:51:45 +0000122
123 def testRevertMissing(self):
124 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000125 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
126 gclient_scm.os.path.isdir(base_path).AndReturn(False)
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000127 gclient_scm.scm.SVN.Capture(['--version']
128 ).AndReturn('svn, version 1.5.1 (r32289)')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000129 # It'll to a checkout instead.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000130 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
131 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000132 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000133 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000134 files_list = self.mox.CreateMockAnything()
maruel@chromium.org03807072010-08-16 17:18:44 +0000135 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000136 ['checkout', self.url, base_path,
137 '--force'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000138 cwd=self.root_dir,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000139 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000140
141 self.mox.ReplayAll()
142 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
143 relpath=self.relpath)
144 scm.revert(options, self.args, files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000145 self.checkstdout(
146 ('\n_____ %s is missing, synching instead\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000147
148 def testRevertNone(self):
149 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000150 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
151 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000152 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn([])
maruel@chromium.org03807072010-08-16 17:18:44 +0000153 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000154 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000155 cwd=base_path,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000156 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000157
158 self.mox.ReplayAll()
159 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
160 relpath=self.relpath)
161 file_list = []
162 scm.revert(options, self.args, file_list)
163
164 def testRevert2Files(self):
165 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000166 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
167 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000168 items = [
169 ('M ', 'a'),
170 ('A ', 'b'),
171 ]
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000172 file_path1 = gclient_scm.os.path.join(base_path, 'a')
173 file_path2 = gclient_scm.os.path.join(base_path, 'b')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000174 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000175 gclient_scm.os.path.exists(file_path1).AndReturn(True)
176 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
177 gclient_scm.os.remove(file_path1)
178 gclient_scm.os.path.exists(file_path2).AndReturn(True)
179 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
180 gclient_scm.os.remove(file_path2)
maruel@chromium.org03807072010-08-16 17:18:44 +0000181 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000182 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000183 cwd=base_path,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000184 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000185
186 self.mox.ReplayAll()
187 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
188 relpath=self.relpath)
189 file_list = []
190 scm.revert(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000191 self.checkstdout(
192 ('%s\n%s\n' % (gclient_scm.os.path.join(base_path, 'a'),
193 gclient_scm.os.path.join(base_path, 'b'))))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000194
195 def testRevertDirectory(self):
196 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000197 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
198 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000199 items = [
200 ('~ ', 'a'),
201 ]
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000202 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000203 file_path = gclient_scm.os.path.join(base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000204 gclient_scm.os.path.exists(file_path).AndReturn(True)
205 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000206 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000207 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000208 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000209 file_list1 = []
maruel@chromium.org03807072010-08-16 17:18:44 +0000210 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000211 ['update', '--revision', 'BASE'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000212 cwd=base_path,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000213 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000214
215 self.mox.ReplayAll()
216 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
217 relpath=self.relpath)
218 file_list2 = []
219 scm.revert(options, self.args, file_list2)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000220 self.checkstdout(('%s\n' % file_path))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000221
222 def testStatus(self):
223 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000224 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
225 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000226 gclient_scm.scm.SVN.RunAndGetFileList(
227 options.verbose, ['status'] + self.args,
228 cwd=base_path, file_list=[]).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000229
230 self.mox.ReplayAll()
231 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
232 relpath=self.relpath)
233 file_list = []
234 self.assertEqual(scm.status(options, self.args, file_list), None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000235
236 # TODO(maruel): TEST REVISIONS!!!
237 # TODO(maruel): TEST RELOCATE!!!
238 def testUpdateCheckout(self):
239 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000240 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
241 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000242 file_info.root = 'blah'
243 file_info.url = self.url
244 file_info.uuid = 'ABC'
245 file_info.revision = 42
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000246 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
247 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000248 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000249 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000250 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000251 gclient_scm.scm.SVN.Capture(['--version']
252 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org03807072010-08-16 17:18:44 +0000253 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000254 ['checkout', self.url, base_path,
255 '--force'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000256 cwd=self.root_dir,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000257 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000258 self.mox.ReplayAll()
259 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
260 relpath=self.relpath)
261 scm.update(options, (), files_list)
262
263 def testUpdateUpdate(self):
264 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000265 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000266 options.force = True
267 options.nohooks = False
268 file_info = {
269 'Repository Root': 'blah',
270 'URL': self.url,
271 'UUID': 'ABC',
272 'Revision': 42,
273 }
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000274 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
275 ).AndReturn(False)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000276
277 # Verify no locked files.
278 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
279 ).AndReturn([])
280
msb@chromium.orge28e4982009-09-25 20:51:45 +0000281 # Checkout or update.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000282 gclient_scm.os.path.exists(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000283 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000284 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000285 # Cheat a bit here.
maruel@chromium.org54019f32010-09-09 13:50:11 +0000286 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000287 additional_args = []
288 if options.manually_grab_svn_rev:
289 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.org669600d2010-09-01 19:06:31 +0000290 gclient_scm.scm.SVN.Capture(['--version']
291 ).AndReturn('svn, version 1.5.1 (r32289)')
292 additional_args.append('--force')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000293 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000294 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000295 options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000296 ['update', base_path] + additional_args,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000297 cwd=self.root_dir, file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000298
299 self.mox.ReplayAll()
300 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
301 relpath=self.relpath)
302 scm.update(options, (), files_list)
303
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000304 def testUpdateSingleCheckout(self):
305 options = self.Options(verbose=True)
306 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
307 file_info = {
308 'URL': self.url,
309 'Revision': 42,
310 }
tony@chromium.org57564662010-04-14 02:35:12 +0000311
312 # Checks to make sure that we support svn co --depth.
313 gclient_scm.scm.SVN.current_version = None
314 gclient_scm.scm.SVN.Capture(['--version']
315 ).AndReturn('svn, version 1.5.1 (r32289)')
316 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
317 ).AndReturn(False)
318 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, 'DEPS')
319 ).AndReturn(False)
320
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000321 # Verify no locked files.
322 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
323 ).AndReturn([])
324
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(
328 ['svn', 'checkout', '--depth', 'empty', self.url, base_path],
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000329 always=True, cwd=self.root_dir)
maruel@chromium.org03807072010-08-16 17:18:44 +0000330 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, ['update', 'DEPS'],
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000331 cwd=base_path, file_list=files_list)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000332
333 # Now we fall back on scm.update().
334 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
tony@chromium.org57564662010-04-14 02:35:12 +0000335 ).AndReturn(False)
336 gclient_scm.os.path.exists(base_path).AndReturn(True)
337 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000338 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
339 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org57564662010-04-14 02:35:12 +0000340
341 self.mox.ReplayAll()
342 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
343 relpath=self.relpath)
344 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000345 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org57564662010-04-14 02:35:12 +0000346
347 def testUpdateSingleCheckoutSVN14(self):
348 options = self.Options(verbose=True)
349 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
350 file_info = {
351 'URL': self.url,
352 'Revision': 42,
353 }
354
355 # Checks to make sure that we support svn co --depth.
356 gclient_scm.scm.SVN.current_version = None
357 gclient_scm.scm.SVN.Capture(['--version']
358 ).AndReturn('svn, version 1.4.4 (r25188)')
359 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path)
360 ).AndReturn(True)
361
362 # When checking out a single file with svn 1.4, we use svn export
363 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000364 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
365 ['svn', 'export', gclient_scm.os.path.join(self.url, 'DEPS'),
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000366 gclient_scm.os.path.join(base_path, 'DEPS')],
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000367 always=True, cwd=self.root_dir)
tony@chromium.org57564662010-04-14 02:35:12 +0000368
369 self.mox.ReplayAll()
370 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
371 relpath=self.relpath)
372 scm.updatesingle(options, ['DEPS'], files_list)
373
374 def testUpdateSingleCheckoutSVNUpgrade(self):
375 options = self.Options(verbose=True)
376 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
377 file_info = {
378 'URL': self.url,
379 'Revision': 42,
380 }
381
382 # Checks to make sure that we support svn co --depth.
383 gclient_scm.scm.SVN.current_version = None
384 gclient_scm.scm.SVN.Capture(['--version']
385 ).AndReturn('svn, version 1.5.1 (r32289)')
386 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
387 ).AndReturn(False)
388 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
389 # the old DEPS file.
390 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, 'DEPS')
391 ).AndReturn(True)
392 gclient_scm.os.remove(gclient_scm.os.path.join(base_path, 'DEPS'))
393
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000394 # Verify no locked files.
395 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
396 ).AndReturn([])
397
tony@chromium.org57564662010-04-14 02:35:12 +0000398 # When checking out a single file, we issue an svn checkout and svn update.
399 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000400 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
401 ['svn', 'checkout', '--depth', 'empty', self.url, base_path],
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000402 always=True, cwd=self.root_dir)
maruel@chromium.org03807072010-08-16 17:18:44 +0000403 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, ['update', 'DEPS'],
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000404 cwd=base_path, file_list=files_list)
tony@chromium.org57564662010-04-14 02:35:12 +0000405
406 # Now we fall back on scm.update().
407 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
408 ).AndReturn(False)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000409 gclient_scm.os.path.exists(base_path).AndReturn(True)
410 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000411 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
412 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000413
414 self.mox.ReplayAll()
415 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
416 relpath=self.relpath)
417 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000418 self.checkstdout(
419 ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000420
421 def testUpdateSingleUpdate(self):
422 options = self.Options(verbose=True)
423 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
424 file_info = {
425 'URL': self.url,
426 'Revision': 42,
427 }
tony@chromium.org57564662010-04-14 02:35:12 +0000428 # Checks to make sure that we support svn co --depth.
429 gclient_scm.scm.SVN.current_version = None
430 gclient_scm.scm.SVN.Capture(['--version']
431 ).AndReturn('svn, version 1.5.1 (r32289)')
432 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.svn')
433 ).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000434
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000435 # Verify no locked files.
436 gclient_scm.scm.SVN.CaptureStatus(gclient_scm.os.path.join(base_path, '.')
437 ).AndReturn([])
438
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000439 # Now we fall back on scm.update().
440 files_list = self.mox.CreateMockAnything()
441 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
442 ).AndReturn(False)
443 gclient_scm.os.path.exists(base_path).AndReturn(True)
444 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org54019f32010-09-09 13:50:11 +0000445 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info)
446 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000447
448 self.mox.ReplayAll()
449 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
450 relpath=self.relpath)
451 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000452 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000453
msb@chromium.orge28e4982009-09-25 20:51:45 +0000454 def testUpdateGit(self):
455 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000456 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
457 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000458
459 self.mox.ReplayAll()
460 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
461 relpath=self.relpath)
462 file_list = []
463 scm.update(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000464 self.checkstdout(
465 ('________ found .git directory; skipping %s\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000466
msb@chromium.orge28e4982009-09-25 20:51:45 +0000467
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000468class GitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
469 unittest.TestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000470 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000471 class OptionsObject(object):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000472 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000473 self.verbose = verbose
474 self.revision = revision
475 self.manually_grab_svn_rev = True
476 self.deps_os = None
477 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000478 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000479 self.nohooks = False
480
481 sample_git_import = """blob
482mark :1
483data 6
484Hello
485
486blob
487mark :2
488data 4
489Bye
490
491reset refs/heads/master
492commit refs/heads/master
493mark :3
494author Bob <bob@example.com> 1253744361 -0700
495committer Bob <bob@example.com> 1253744361 -0700
496data 8
497A and B
498M 100644 :1 a
499M 100644 :2 b
500
501blob
502mark :4
503data 10
504Hello
505You
506
507blob
508mark :5
509data 8
510Bye
511You
512
513commit refs/heads/origin
514mark :6
515author Alice <alice@example.com> 1253744424 -0700
516committer Alice <alice@example.com> 1253744424 -0700
517data 13
518Personalized
519from :3
520M 100644 :4 a
521M 100644 :5 b
522
523reset refs/heads/master
524from :3
525"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000526 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000527 return self.OptionsObject(*args, **kwargs)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000528
529 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000530 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000531 try:
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000532 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000533 cwd=path).communicate()
534 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000535 # git is not available, skip this test.
536 return False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000537 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
538 stderr=STDOUT, cwd=path).communicate(input=git_import)
539 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
540 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000541 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000542 stderr=STDOUT, cwd=path).communicate()
543 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
544 stderr=STDOUT, cwd=path).communicate()
545 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
546 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000547 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000548 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000549 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000550
msb@chromium.orge28e4982009-09-25 20:51:45 +0000551 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000552 TestCaseUtils.setUp(self)
553 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000554 self.url = 'git://foo'
555 self.root_dir = tempfile.mkdtemp()
556 self.relpath = '.'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000557 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000558 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000559 StdoutCheck.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000560
561 def tearDown(self):
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000562 StdoutCheck.tearDown(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000563 TestCaseUtils.tearDown(self)
564 unittest.TestCase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000565 rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000566
567 def testDir(self):
568 members = [
maruel@chromium.org55e724e2010-03-11 19:36:49 +0000569 'FullUrlForRelativeUrl', 'RunCommand',
msb@chromium.orge6f78352010-01-13 17:05:33 +0000570 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000571 'revinfo', 'runhooks', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000572 ]
573
574 # If you add a member, be sure to add the relevant test!
575 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
576
577 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000578 if not self.enabled:
579 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000580 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000581 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000582 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
583 relpath=self.relpath)
584 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000585 scm.update(options, None, file_list)
586 gclient_scm.os.remove(file_path)
587 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000588 scm.revert(options, self.args, file_list)
589 self.assertEquals(file_list, [file_path])
590 file_list = []
591 scm.diff(options, self.args, file_list)
592 self.assertEquals(file_list, [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000593 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000594 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
595 'Fast-forward\n a | 1 +\n b | 1 +\n'
596 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000597 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
598 'HEAD is now at a7142dc Personalized\n') %
599 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000600
601 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000602 if not self.enabled:
603 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000604 options = self.Options()
605 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
606 relpath=self.relpath)
607 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000608 scm.update(options, None, file_list)
609 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000610 scm.revert(options, self.args, file_list)
611 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000612 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000613 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000614 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000615 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
616 'Fast-forward\n a | 1 +\n b | 1 +\n'
617 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000618 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
619 'HEAD is now at a7142dc Personalized\n') %
620 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000621
622 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000623 if not self.enabled:
624 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000625 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000626 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
627 relpath=self.relpath)
628 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000629 scm.update(options, None, file_list)
630 file_path = gclient_scm.os.path.join(self.base_path, 'a')
631 open(file_path, 'a').writelines('touched\n')
632 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000633 scm.revert(options, self.args, file_list)
634 self.assertEquals(file_list, [file_path])
635 file_list = []
636 scm.diff(options, self.args, file_list)
637 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000638 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000639 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000640 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000641 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
642 'Fast-forward\n a | 1 +\n b | 1 +\n'
643 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000644 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
645 'HEAD is now at a7142dc Personalized\n') %
646 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000647
648 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000649 if not self.enabled:
650 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000651 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000652 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
653 relpath=self.relpath)
654 file_list = []
655 scm.update(options, None, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000656 file_path = gclient_scm.os.path.join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000657 f = open(file_path, 'w')
658 f.writelines('new\n')
659 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000660 Popen(['git', 'add', 'c'], stdout=PIPE,
661 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000662 file_list = []
663 scm.revert(options, self.args, file_list)
664 self.assertEquals(file_list, [file_path])
665 file_list = []
666 scm.diff(options, self.args, file_list)
667 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000668 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000669 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000670 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000671 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
672 'Fast-forward\n a | 1 +\n b | 1 +\n'
673 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000674 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
675 'HEAD is now at a7142dc Personalized\n') %
676 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000677
678 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000679 if not self.enabled:
680 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000681 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000682 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000683 open(file_path, 'a').writelines('touched\n')
684 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
685 relpath=self.relpath)
686 file_list = []
687 scm.status(options, self.args, file_list)
688 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000689 self.checkstdout(
690 ('\n________ running \'git diff --name-status '
691 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
692 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000693
694 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000695 if not self.enabled:
696 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000697 options = self.Options()
698 expected_file_list = []
699 for f in ['a', 'b']:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000700 file_path = gclient_scm.os.path.join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000701 open(file_path, 'a').writelines('touched\n')
702 expected_file_list.extend([file_path])
703 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
704 relpath=self.relpath)
705 file_list = []
706 scm.status(options, self.args, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000707 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
708 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000709 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000710 self.checkstdout(
711 ('\n________ running \'git diff --name-status '
712 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
713 gclient_scm.os.path.join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000714
715 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000716 if not self.enabled:
717 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000718 options = self.Options(verbose=True)
719 root_dir = tempfile.mkdtemp()
720 relpath = 'foo'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000721 base_path = gclient_scm.os.path.join(root_dir, relpath)
722 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000723 try:
724 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
725 relpath=relpath)
726 file_list = []
727 scm.update(options, (), file_list)
728 self.assertEquals(len(file_list), 2)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000729 self.assert_(gclient_scm.os.path.isfile(
730 gclient_scm.os.path.join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000731 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000732 '069c602044c5388d2d15c3f875b057c852003458')
733 finally:
maruel@chromium.orgba551772010-02-03 18:21:42 +0000734 rmtree(root_dir)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000735 join = gclient_scm.os.path.join
736 self.checkstdout(
737 ('\n_____ foo at refs/heads/master\n\n'
738 '________ running \'git clone -b master --verbose %s %s\' in \'%s\'\n'
739 'Initialized empty Git repository in %s\n') %
740 (join(self.root_dir, '.', '.git'), join(root_dir, 'foo'), root_dir,
741 join(root_dir, 'foo', '.git') + '/'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000742
743 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000744 if not self.enabled:
745 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000746 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000747 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
748 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000749 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
750 relpath=self.relpath)
751 file_list = []
752 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000753 self.assertEquals(file_list, expected_file_list)
754 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000755 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000756 self.checkstdout(
757 '\n_____ . at refs/heads/master\n'
758 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
759 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000760
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000761 def testUpdateUnstagedConflict(self):
762 if not self.enabled:
763 return
764 options = self.Options()
765 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
766 relpath=self.relpath)
767 file_path = gclient_scm.os.path.join(self.base_path, 'b')
768 f = open(file_path, 'w').writelines('conflict\n')
769 exception = (
770 "error: Your local changes to 'b' would be overwritten by merge. "
771 "Aborting.\n"
772 "Please, commit your changes or stash them before you can merge.\n")
773 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000774 self.checkstdout('\n_____ . at refs/heads/master\n')
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000775
msb@chromium.org5bde4852009-12-14 16:47:12 +0000776 def testUpdateConflict(self):
777 if not self.enabled:
778 return
779 options = self.Options()
780 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
781 relpath=self.relpath)
782 file_path = gclient_scm.os.path.join(self.base_path, 'b')
783 f = open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000784 scm._Run(['commit', '-am', 'test'], options)
785 __builtin__.raw_input = lambda x: 'y'
786 exception = ('Conflict while rebasing this branch.\n'
787 'Fix the conflict and run gclient again.\n'
788 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +0000789 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000790 exception = ('\n____ . at refs/heads/master\n'
791 '\tYou have unstaged changes.\n'
792 '\tPlease commit, stash, or reset.\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 # The hash always changes. Use a cheap trick.
795 start = ('\n________ running \'git commit -am test\' in \'%s\'\n'
796 '[new ') % gclient_scm.os.path.join(self.root_dir, '.')
797 end = ('] test\n 1 files changed, 1 insertions(+), '
798 '1 deletions(-)\n\n_____ . at refs/heads/master\n'
799 'Attempting rebase onto refs/remotes/origin/master...\n')
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000800 self.assertTrue(gclient_scm.sys.stdout.getvalue().startswith(start))
801 self.assertTrue(gclient_scm.sys.stdout.getvalue().endswith(end))
802 self.assertEquals(len(gclient_scm.sys.stdout.getvalue()),
803 len(start) + len(end) + 7)
804 gclient_scm.sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +0000805
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000806 def testUpdateNotGit(self):
807 if not self.enabled:
808 return
809 options = self.Options()
810 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
811 relpath=self.relpath)
812 git_path = gclient_scm.os.path.join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +0000813 rename(git_path, git_path + 'foo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000814 exception = ('\n____ . at refs/heads/master\n'
815 '\tPath is not a git repo. No .git dir.\n'
816 '\tTo resolve:\n'
817 '\t\trm -rf .\n'
818 '\tAnd run gclient sync again\n')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000819 self.assertRaisesError(exception, scm.update, options, (), [])
820
msb@chromium.org0f282062009-11-06 20:14:02 +0000821 def testRevinfo(self):
822 if not self.enabled:
823 return
824 options = self.Options()
825 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
826 relpath=self.relpath)
827 rev_info = scm.revinfo(options, (), None)
828 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
829
msb@chromium.orge28e4982009-09-25 20:51:45 +0000830
msb@chromium.orge28e4982009-09-25 20:51:45 +0000831if __name__ == '__main__':
msb@chromium.orge28e4982009-09-25 20:51:45 +0000832 unittest.main()
833
834# vim: ts=2:sw=2:tw=80:et: