blob: ac13c108b43ebb85f653500332d2513a49759ec1 [file] [log] [blame]
maruel@chromium.org45d8db02011-03-31 20:43:56 +00001#!/usr/bin/env python
2# Copyright (c) 2011 The Chromium Authors. All rights reserved.
maruel@chromium.orgba551772010-02-03 18:21:42 +00003# 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.org428342a2011-11-10 15:46:33 +00008# pylint: disable=E1103
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00009
maruel@chromium.orgba551772010-02-03 18:21:42 +000010# Import before super_mox to keep valid references.
11from os import rename
12from shutil import rmtree
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000013from subprocess import Popen, PIPE, STDOUT
maruel@chromium.org428342a2011-11-10 15:46:33 +000014
15import logging
16import os
17import sys
msb@chromium.orge28e4982009-09-25 20:51:45 +000018import tempfile
maruel@chromium.org389d6de2010-09-09 14:14:37 +000019import unittest
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +000020import __builtin__
msb@chromium.orge28e4982009-09-25 20:51:45 +000021
maruel@chromium.org428342a2011-11-10 15:46:33 +000022sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
maruel@chromium.orgba551772010-02-03 18:21:42 +000023
maruel@chromium.org0927b7e2011-11-11 16:06:22 +000024from testing_support.super_mox import mox, StdoutCheck, SuperMoxTestBase
25from testing_support.super_mox import TestCaseUtils
maruel@chromium.org428342a2011-11-10 15:46:33 +000026
msb@chromium.orge28e4982009-09-25 20:51:45 +000027import gclient_scm
maruel@chromium.orgfae707b2011-09-15 18:57:58 +000028import subprocess2
maruel@chromium.org96913eb2010-06-01 16:22:47 +000029
maruel@chromium.org795a8c12010-10-05 19:54:29 +000030# Shortcut since this function is used often
31join = gclient_scm.os.path.join
32
maruel@chromium.org96913eb2010-06-01 16:22:47 +000033
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +000034# Access to a protected member XXX of a client class
35# pylint: disable=W0212
36
37
maruel@chromium.org389d6de2010-09-09 14:14:37 +000038class GCBaseTestCase(object):
maruel@chromium.org96913eb2010-06-01 16:22:47 +000039 def assertRaisesError(self, msg, fn, *args, **kwargs):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000040 """Like unittest's assertRaises() but checks for Gclient.Error."""
maruel@chromium.org428342a2011-11-10 15:46:33 +000041 # pylint: disable=E1101
maruel@chromium.org96913eb2010-06-01 16:22:47 +000042 try:
43 fn(*args, **kwargs)
44 except gclient_scm.gclient_utils.Error, e:
45 self.assertEquals(e.args[0], msg)
46 else:
47 self.fail('%s not raised' % msg)
msb@chromium.orge28e4982009-09-25 20:51:45 +000048
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000049
maruel@chromium.org389d6de2010-09-09 14:14:37 +000050class BaseTestCase(GCBaseTestCase, SuperMoxTestBase):
51 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000052 SuperMoxTestBase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000053 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter')
54 self.mox.StubOutWithMock(gclient_scm.gclient_utils,
55 'CheckCallAndFilterAndHeader')
56 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
57 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000058 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000059 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +000060 self.mox.StubOutWithMock(gclient_scm.scm.SVN, '_CaptureInfo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000061 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
62 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
maruel@chromium.orgfae707b2011-09-15 18:57:58 +000063 self.mox.StubOutWithMock(subprocess2, 'communicate')
64 self.mox.StubOutWithMock(subprocess2, 'Popen')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000065 self._scm_wrapper = gclient_scm.CreateSCM
maruel@chromium.org389d6de2010-09-09 14:14:37 +000066 gclient_scm.scm.SVN.current_version = None
maruel@chromium.org795a8c12010-10-05 19:54:29 +000067 # Absolute path of the fake checkout directory.
68 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000069
70 def tearDown(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000071 SuperMoxTestBase.tearDown(self)
72
73
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000074class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000075 class OptionsObject(object):
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +000076 def __init__(self, verbose=False, revision=None, force=False):
msb@chromium.orge28e4982009-09-25 20:51:45 +000077 self.verbose = verbose
78 self.revision = revision
79 self.manually_grab_svn_rev = True
80 self.deps_os = None
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +000081 self.force = force
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000082 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000083 self.nohooks = False
maruel@chromium.org36ac2392011-10-12 16:36:11 +000084 # TODO(maruel): Test --jobs > 1.
85 self.jobs = 1
msb@chromium.orge28e4982009-09-25 20:51:45 +000086
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000087 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +000088 return self.OptionsObject(*args, **kwargs)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000089
msb@chromium.orge28e4982009-09-25 20:51:45 +000090 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000091 BaseTestCase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000092 self.url = self.SvnUrl()
msb@chromium.orge28e4982009-09-25 20:51:45 +000093
94 def testDir(self):
95 members = [
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +000096 'FullUrlForRelativeUrl',
97 'GetRevisionDate',
98 'GetUsableRev',
99 'RunCommand',
100 'cleanup',
101 'diff',
102 'pack',
103 'relpath',
104 'revert',
105 'revinfo',
106 'runhooks',
107 'status',
108 'update',
109 'updatesingle',
110 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000111 ]
112
113 # If you add a member, be sure to add the relevant test!
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000114 self.compareMembers(self._scm_wrapper('svn://a'), members)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000115
116 def testUnsupportedSCM(self):
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000117 args = ['gopher://foo', self.root_dir, self.relpath]
118 exception_msg = 'No SCM found for url gopher://foo'
119 self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000120
msb@chromium.orge6f78352010-01-13 17:05:33 +0000121 def testSVNFullUrlForRelativeUrl(self):
122 self.url = 'svn://a/b/c/d'
123
124 self.mox.ReplayAll()
125 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
126 relpath=self.relpath)
127 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
128
129 def testGITFullUrlForRelativeUrl(self):
130 self.url = 'git://a/b/c/d'
131
132 self.mox.ReplayAll()
133 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
134 relpath=self.relpath)
135 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
136
igorgatis@gmail.com4e075672011-11-21 16:35:08 +0000137 def testGITFakeHttpUrl(self):
138 self.url = 'git+http://foo'
139
140 self.mox.ReplayAll()
141 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
142 relpath=self.relpath)
143 self.assertEqual(scm.url, 'http://foo')
144
145 def testGITFakeHttpsUrl(self):
146 self.url = 'git+https://foo'
147
148 self.mox.ReplayAll()
149 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
150 relpath=self.relpath)
151 self.assertEqual(scm.url, 'https://foo')
152
msb@chromium.orge28e4982009-09-25 20:51:45 +0000153 def testRunCommandException(self):
154 options = self.Options(verbose=False)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000155 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
156 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
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 exception = "Unsupported argument(s): %s" % ','.join(self.args)
162 self.assertRaisesError(exception, scm.RunCommand,
163 'update', options, self.args)
164
165 def testRunCommandUnknown(self):
166 # TODO(maruel): if ever used.
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000167 pass
msb@chromium.orge28e4982009-09-25 20:51:45 +0000168
169 def testRevertMissing(self):
170 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000171 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000172 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000173 gclient_scm.scm.SVN.Capture(['--version'], None
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000174 ).AndReturn('svn, version 1.5.1 (r32289)')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000175 # It'll to a checkout instead.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000176 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
177 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000178 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000179 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000180 parent = gclient_scm.os.path.dirname(self.base_path)
181 gclient_scm.os.path.exists(parent).AndReturn(False)
182 gclient_scm.os.makedirs(parent)
183 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000184 files_list = self.mox.CreateMockAnything()
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000185 gclient_scm.scm.SVN.RunAndGetFileList(
186 options.verbose,
187 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
188 cwd=self.root_dir,
189 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000190
191 self.mox.ReplayAll()
192 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
193 relpath=self.relpath)
194 scm.revert(options, self.args, files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000195 self.checkstdout(
196 ('\n_____ %s is missing, synching instead\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000197
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000198 def testRevertNoDotSvn(self):
199 options = self.Options(verbose=True, force=True)
200 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
201 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(False)
202 gclient_scm.os.path.isdir(join(self.base_path, '.git')).AndReturn(False)
203 gclient_scm.os.path.isdir(join(self.base_path, '.hg')).AndReturn(False)
204 # Checkout.
205 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
206 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
207 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
208 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000209 parent = gclient_scm.os.path.dirname(self.base_path)
210 gclient_scm.os.path.exists(parent).AndReturn(False)
211 gclient_scm.os.makedirs(parent)
212 gclient_scm.os.path.exists(parent).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000213 files_list = self.mox.CreateMockAnything()
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000214 gclient_scm.scm.SVN.Capture(['--version'], None
215 ).AndReturn('svn, version 1.6')
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000216 gclient_scm.scm.SVN.RunAndGetFileList(
217 options.verbose,
218 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
219 cwd=self.root_dir,
220 file_list=files_list)
221
222 self.mox.ReplayAll()
223 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
224 relpath=self.relpath)
225 scm.revert(options, self.args, files_list)
226 self.checkstdout(
227 '\n_____ %s is not a valid svn checkout, synching instead\n' %
228 self.relpath)
229
msb@chromium.orge28e4982009-09-25 20:51:45 +0000230 def testRevertNone(self):
231 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000232 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000233 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000234 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path).AndReturn([])
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000235 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000236 gclient_scm.scm.SVN.RunAndGetFileList(
237 options.verbose,
238 ['update', '--revision', 'BASE', '--ignore-externals'],
239 cwd=self.base_path,
240 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000241
242 self.mox.ReplayAll()
243 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
244 relpath=self.relpath)
245 file_list = []
246 scm.revert(options, self.args, file_list)
247
msb@chromium.orge28e4982009-09-25 20:51:45 +0000248 def testRevertDirectory(self):
249 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000250 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000251 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000252 items = [
253 ('~ ', 'a'),
254 ]
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000255 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path).AndReturn(items)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000256 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000257 gclient_scm.os.path.exists(file_path).AndReturn(True)
258 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000259 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000260 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000261 gclient_scm.gclient_utils.RemoveDirectory(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000262 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000263 gclient_scm.scm.SVN.RunAndGetFileList(
264 options.verbose,
265 ['update', '--revision', 'BASE', '--ignore-externals'],
266 cwd=self.base_path,
267 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000268
269 self.mox.ReplayAll()
270 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
271 relpath=self.relpath)
272 file_list2 = []
273 scm.revert(options, self.args, file_list2)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000274 self.checkstdout(('%s\n' % file_path))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000275
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000276 def testRevertDot(self):
277 self.mox.StubOutWithMock(gclient_scm.SVNWrapper, 'update')
278 options = self.Options(verbose=True)
279 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
280 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
281 items = [
282 ('~ ', '.'),
283 ]
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000284 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path).AndReturn(items)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000285 file_path = join(self.base_path, '.')
286 gclient_scm.os.path.exists(file_path).AndReturn(True)
287 gclient_scm.os.path.isfile(file_path).AndReturn(False)
288 gclient_scm.os.path.islink(file_path).AndReturn(False)
289 gclient_scm.os.path.isdir(file_path).AndReturn(True)
290 gclient_scm.gclient_utils.RemoveDirectory(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000291 # pylint: disable=E1120
maruel@chromium.org428342a2011-11-10 15:46:33 +0000292 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000293 gclient_scm.SVNWrapper.update(options, [], ['.'])
294
295 self.mox.ReplayAll()
296 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
297 relpath=self.relpath)
298 file_list2 = []
299 scm.revert(options, self.args, file_list2)
300 self.checkstdout(('%s\n' % file_path))
301
msb@chromium.orge28e4982009-09-25 20:51:45 +0000302 def testStatus(self):
303 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000304 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000305 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000306 options.verbose,
307 ['status'] + self.args + ['--ignore-externals'],
308 cwd=self.base_path,
309 file_list=[]).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000310
311 self.mox.ReplayAll()
312 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
313 relpath=self.relpath)
314 file_list = []
315 self.assertEqual(scm.status(options, self.args, file_list), None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000316
317 # TODO(maruel): TEST REVISIONS!!!
318 # TODO(maruel): TEST RELOCATE!!!
319 def testUpdateCheckout(self):
320 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000321 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000322 file_info.root = 'blah'
323 file_info.url = self.url
324 file_info.uuid = 'ABC'
325 file_info.revision = 42
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000326 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
327 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000328 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000329 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000330 parent = gclient_scm.os.path.dirname(self.base_path)
331 gclient_scm.os.path.exists(parent).AndReturn(False)
332 gclient_scm.os.makedirs(parent)
333 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000334 files_list = self.mox.CreateMockAnything()
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000335 gclient_scm.scm.SVN.Capture(['--version'], None
maruel@chromium.org669600d2010-09-01 19:06:31 +0000336 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000337 gclient_scm.scm.SVN.RunAndGetFileList(
338 options.verbose,
339 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
340 cwd=self.root_dir,
341 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000342 self.mox.ReplayAll()
343 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
344 relpath=self.relpath)
345 scm.update(options, (), files_list)
346
347 def testUpdateUpdate(self):
348 options = self.Options(verbose=True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000349 options.force = True
350 options.nohooks = False
351 file_info = {
352 'Repository Root': 'blah',
353 'URL': self.url,
354 'UUID': 'ABC',
355 'Revision': 42,
356 }
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000357 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
358 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000359
360 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000361 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000362 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000363
msb@chromium.orge28e4982009-09-25 20:51:45 +0000364 # Checkout or update.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000365 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000366 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000367 # Cheat a bit here.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000368 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
369 ).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000370 additional_args = []
371 if options.manually_grab_svn_rev:
372 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000373 gclient_scm.scm.SVN.Capture(['--version'], None
maruel@chromium.org669600d2010-09-01 19:06:31 +0000374 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000375 additional_args.extend(['--force', '--ignore-externals'])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000376 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000377 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000378 options.verbose,
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000379 ['update', self.base_path] + additional_args,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000380 cwd=self.root_dir, file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000381
382 self.mox.ReplayAll()
383 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
384 relpath=self.relpath)
385 scm.update(options, (), files_list)
386
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000387 def testUpdateSingleCheckout(self):
388 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000389 file_info = {
390 'URL': self.url,
391 'Revision': 42,
392 }
tony@chromium.org57564662010-04-14 02:35:12 +0000393
394 # Checks to make sure that we support svn co --depth.
395 gclient_scm.scm.SVN.current_version = None
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000396 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000397 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000398 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
399 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000400
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000401 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000402 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000403 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000404
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000405 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000406 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000407 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000408 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000409 always=True,
410 cwd=self.root_dir)
411 gclient_scm.scm.SVN.RunAndGetFileList(
412 options.verbose,
413 ['update', 'DEPS', '--ignore-externals'],
414 cwd=self.base_path,
415 file_list=files_list)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000416
417 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000418 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
419 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
420 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000421 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
422 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
423 ).AndReturn(file_info)
tony@chromium.org57564662010-04-14 02:35:12 +0000424
425 self.mox.ReplayAll()
426 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
427 relpath=self.relpath)
428 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000429 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org57564662010-04-14 02:35:12 +0000430
431 def testUpdateSingleCheckoutSVN14(self):
432 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000433
434 # Checks to make sure that we support svn co --depth.
435 gclient_scm.scm.SVN.current_version = None
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000436 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000437 ).AndReturn('svn, version 1.4.4 (r25188)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000438 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org57564662010-04-14 02:35:12 +0000439
440 # When checking out a single file with svn 1.4, we use svn export
441 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000442 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000443 ['svn', 'export', join(self.url, 'DEPS'), join(self.base_path, 'DEPS')],
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000444 always=True, cwd=self.root_dir)
tony@chromium.org57564662010-04-14 02:35:12 +0000445
446 self.mox.ReplayAll()
447 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
448 relpath=self.relpath)
449 scm.updatesingle(options, ['DEPS'], files_list)
450
451 def testUpdateSingleCheckoutSVNUpgrade(self):
452 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000453 file_info = {
454 'URL': self.url,
455 'Revision': 42,
456 }
457
458 # Checks to make sure that we support svn co --depth.
459 gclient_scm.scm.SVN.current_version = None
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000460 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000461 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000462 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000463 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
464 # the old DEPS file.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000465 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(True)
466 gclient_scm.os.remove(join(self.base_path, 'DEPS'))
tony@chromium.org57564662010-04-14 02:35:12 +0000467
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000468 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000469 gclient_scm.scm.SVN.CaptureStatus(
470 None, join(self.base_path, '.')).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000471
tony@chromium.org57564662010-04-14 02:35:12 +0000472 # When checking out a single file, we issue an svn checkout and svn update.
473 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000474 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000475 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000476 always=True,
477 cwd=self.root_dir)
478 gclient_scm.scm.SVN.RunAndGetFileList(
479 options.verbose,
480 ['update', 'DEPS', '--ignore-externals'],
481 cwd=self.base_path,
482 file_list=files_list)
tony@chromium.org57564662010-04-14 02:35:12 +0000483
484 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000485 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
486 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
487 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000488 gclient_scm.scm.SVN._CaptureInfo(
489 [], join(self.base_path, ".")).AndReturn(file_info)
490 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
491 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000492
493 self.mox.ReplayAll()
494 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
495 relpath=self.relpath)
496 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000497 self.checkstdout(
498 ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000499
500 def testUpdateSingleUpdate(self):
501 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000502 file_info = {
503 'URL': self.url,
504 'Revision': 42,
505 }
tony@chromium.org57564662010-04-14 02:35:12 +0000506 # Checks to make sure that we support svn co --depth.
507 gclient_scm.scm.SVN.current_version = None
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000508 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000509 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000510 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000511
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000512 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000513 gclient_scm.scm.SVN.CaptureStatus(None, join(self.base_path, '.')
514 ).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000515
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000516 # Now we fall back on scm.update().
517 files_list = self.mox.CreateMockAnything()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000518 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
519 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
520 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000521 gclient_scm.scm.SVN._CaptureInfo(
522 [], join(self.base_path, '.')).AndReturn(file_info)
523 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
524 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000525
526 self.mox.ReplayAll()
527 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
528 relpath=self.relpath)
529 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000530 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000531
msb@chromium.orge28e4982009-09-25 20:51:45 +0000532 def testUpdateGit(self):
533 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000534 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
535 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000536
537 self.mox.ReplayAll()
538 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
539 relpath=self.relpath)
540 file_list = []
541 scm.update(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000542 self.checkstdout(
543 ('________ found .git directory; skipping %s\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000544
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000545 def testUpdateHg(self):
546 options = self.Options(verbose=True)
547 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
548 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(True)
549
550 self.mox.ReplayAll()
551 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
552 relpath=self.relpath)
553 file_list = []
554 scm.update(options, self.args, file_list)
555 self.checkstdout(
556 ('________ found .hg directory; skipping %s\n' % self.relpath))
557
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000558 def testGetUsableRevSVN(self):
559 # pylint: disable=E1101
560 options = self.Options(verbose=True)
561
562 # Mock SVN revision validity checking.
563 self.mox.StubOutWithMock(
564 gclient_scm.scm.SVN, 'IsValidRevision', True)
565 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 1)
566 ).AndReturn(True)
567 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 'fake')
568 ).AndReturn(False)
569
570 self.mox.ReplayAll()
571
572 svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir)
573 # With an SVN checkout, 1 an example of a valid usable rev.
574 self.assertEquals(svn_scm.GetUsableRev(1, options), 1)
575 # With an SVN checkout, a fake or unknown rev should raise an excpetion.
576 self.assertRaises(gclient_scm.gclient_utils.Error,
577 svn_scm.GetUsableRev, 'fake', options)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000578
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000579class BaseGitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
580 unittest.TestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000581 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000582 class OptionsObject(object):
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000583 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000584 self.verbose = verbose
585 self.revision = revision
586 self.manually_grab_svn_rev = True
587 self.deps_os = None
588 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000589 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000590 self.nohooks = False
bauerb@chromium.org4dd09372011-07-22 14:41:51 +0000591 self.merge = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000592
593 sample_git_import = """blob
594mark :1
595data 6
596Hello
597
598blob
599mark :2
600data 4
601Bye
602
603reset refs/heads/master
604commit refs/heads/master
605mark :3
606author Bob <bob@example.com> 1253744361 -0700
607committer Bob <bob@example.com> 1253744361 -0700
608data 8
609A and B
610M 100644 :1 a
611M 100644 :2 b
612
613blob
614mark :4
615data 10
616Hello
617You
618
619blob
620mark :5
621data 8
622Bye
623You
624
625commit refs/heads/origin
626mark :6
627author Alice <alice@example.com> 1253744424 -0700
628committer Alice <alice@example.com> 1253744424 -0700
629data 13
630Personalized
631from :3
632M 100644 :4 a
633M 100644 :5 b
634
635reset refs/heads/master
636from :3
637"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000638 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000639 return self.OptionsObject(*args, **kwargs)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000640
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000641 @staticmethod
642 def CreateGitRepo(git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000643 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000644 try:
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000645 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000646 cwd=path).communicate()
647 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000648 # git is not available, skip this test.
649 return False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000650 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
651 stderr=STDOUT, cwd=path).communicate(input=git_import)
652 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
653 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000654 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000655 stderr=STDOUT, cwd=path).communicate()
656 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
657 stderr=STDOUT, cwd=path).communicate()
658 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
659 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000660 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000661 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000662 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000663
msb@chromium.orge28e4982009-09-25 20:51:45 +0000664 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000665 TestCaseUtils.setUp(self)
666 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000667 self.url = 'git://foo'
668 self.root_dir = tempfile.mkdtemp()
669 self.relpath = '.'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000670 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000671 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000672 StdoutCheck.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000673
674 def tearDown(self):
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000675 StdoutCheck.tearDown(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000676 TestCaseUtils.tearDown(self)
677 unittest.TestCase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000678 rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000679
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000680class ManagedGitWrapperTestCase(BaseGitWrapperTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000681 def testDir(self):
682 members = [
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000683 'FullUrlForRelativeUrl',
684 'GetRevisionDate',
685 'GetUsableRev',
686 'RunCommand',
687 'cleanup',
688 'diff',
689 'pack',
690 'relpath',
691 'revert',
692 'revinfo',
693 'runhooks',
694 'status',
695 'update',
696 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000697 ]
698
699 # If you add a member, be sure to add the relevant test!
700 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
701
702 def testRevertMissing(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()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000706 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000707 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
708 relpath=self.relpath)
709 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000710 scm.update(options, None, file_list)
711 gclient_scm.os.remove(file_path)
712 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000713 scm.revert(options, self.args, file_list)
714 self.assertEquals(file_list, [file_path])
715 file_list = []
716 scm.diff(options, self.args, file_list)
717 self.assertEquals(file_list, [])
szager@google.com85d3e3a2011-10-07 17:12:00 +0000718 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000719 'Fast-forward\n a | 1 +\n b | 1 +\n'
720 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000721 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000722 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
723 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
724 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000725
726 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000727 if not self.enabled:
728 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000729 options = self.Options()
730 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
731 relpath=self.relpath)
732 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000733 scm.update(options, None, file_list)
734 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000735 scm.revert(options, self.args, file_list)
736 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000737 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000738 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000739 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000740 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
741 'Fast-forward\n a | 1 +\n b | 1 +\n'
742 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000743 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
744 'HEAD is now at a7142dc Personalized\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000745 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000746
747 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000748 if not self.enabled:
749 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000750 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000751 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
752 relpath=self.relpath)
753 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000754 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000755 file_path = join(self.base_path, 'a')
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000756 open(file_path, 'a').writelines('touched\n')
757 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000758 scm.revert(options, self.args, file_list)
759 self.assertEquals(file_list, [file_path])
760 file_list = []
761 scm.diff(options, self.args, file_list)
762 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000763 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000764 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000765 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000766 'Fast-forward\n a | 1 +\n b | 1 +\n'
767 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000768 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000769 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
770 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
771 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000772
773 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000774 if not self.enabled:
775 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000776 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000777 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
778 relpath=self.relpath)
779 file_list = []
780 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000781 file_path = join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000782 f = open(file_path, 'w')
783 f.writelines('new\n')
784 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000785 Popen(['git', 'add', 'c'], stdout=PIPE,
786 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000787 file_list = []
788 scm.revert(options, self.args, file_list)
789 self.assertEquals(file_list, [file_path])
790 file_list = []
791 scm.diff(options, self.args, file_list)
792 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000793 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000794 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000795 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000796 'Fast-forward\n a | 1 +\n b | 1 +\n'
797 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000798 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000799 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
800 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
801 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000802
803 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000804 if not self.enabled:
805 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000806 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000807 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000808 open(file_path, 'a').writelines('touched\n')
809 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
810 relpath=self.relpath)
811 file_list = []
812 scm.status(options, self.args, file_list)
813 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000814 self.checkstdout(
815 ('\n________ running \'git diff --name-status '
816 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000817 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000818
819 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000820 if not self.enabled:
821 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000822 options = self.Options()
823 expected_file_list = []
824 for f in ['a', 'b']:
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000825 file_path = join(self.base_path, f)
826 open(file_path, 'a').writelines('touched\n')
827 expected_file_list.extend([file_path])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000828 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
829 relpath=self.relpath)
830 file_list = []
831 scm.status(options, self.args, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000832 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000833 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000834 self.checkstdout(
835 ('\n________ running \'git diff --name-status '
836 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000837 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000838
839 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000840 if not self.enabled:
841 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000842 options = self.Options(verbose=True)
dpranke@chromium.org330f5342011-03-13 02:56:43 +0000843 root_dir = gclient_scm.os.path.realpath(tempfile.mkdtemp())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000844 relpath = 'foo'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000845 base_path = join(root_dir, relpath)
846 url = join(self.base_path, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000847 try:
848 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
849 relpath=relpath)
850 file_list = []
851 scm.update(options, (), file_list)
852 self.assertEquals(len(file_list), 2)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000853 self.assert_(gclient_scm.os.path.isfile(join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000854 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000855 '069c602044c5388d2d15c3f875b057c852003458')
856 finally:
maruel@chromium.orgba551772010-02-03 18:21:42 +0000857 rmtree(root_dir)
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000858 msg1 = (
859 "\n_____ foo at refs/heads/master\n\n"
szager@google.com85d3e3a2011-10-07 17:12:00 +0000860 "________ running 'git clone --progress -b master --verbose %s %s' "
861 "in '%s'\n"
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000862 "Initialized empty Git repository in %s\n") % (
863 join(self.root_dir, '.', '.git'),
864 join(root_dir, 'foo'),
865 root_dir,
866 join(gclient_scm.os.path.realpath(root_dir), 'foo', '.git') + '/')
867 msg2 = (
868 "\n_____ foo at refs/heads/master\n\n"
szager@google.com85d3e3a2011-10-07 17:12:00 +0000869 "________ running 'git clone --progress -b master --verbose %s %s'"
870 " in '%s'\n"
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000871 "Cloning into %s...\ndone.\n") % (
872 join(self.root_dir, '.', '.git'),
873 join(root_dir, 'foo'),
874 root_dir,
875 join(gclient_scm.os.path.realpath(root_dir), 'foo'))
876 out = sys.stdout.getvalue()
877 sys.stdout.close()
dpranke@chromium.org330f5342011-03-13 02:56:43 +0000878 sys.stdout = self._old_stdout
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000879 self.assertTrue(out in (msg1, msg2), (out, msg1, msg2))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000880
881 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000882 if not self.enabled:
883 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000884 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000885 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000886 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
887 relpath=self.relpath)
888 file_list = []
889 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000890 self.assertEquals(file_list, expected_file_list)
891 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000892 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000893 self.checkstdout(
894 '\n_____ . at refs/heads/master\n'
895 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
896 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000897
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000898 def testUpdateUnstagedConflict(self):
899 if not self.enabled:
900 return
901 options = self.Options()
902 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
903 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000904 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000905 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000906 try:
907 scm.update(options, (), [])
908 self.fail()
maruel@chromium.orgfae707b2011-09-15 18:57:58 +0000909 except (gclient_scm.gclient_utils.Error, subprocess2.CalledProcessError):
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000910 # The exact exception text varies across git versions so it's not worth
911 # verifying it. It's fine as long as it throws.
912 pass
913 # Manually flush stdout since we can't verify it's content accurately across
914 # git versions.
915 sys.stdout.getvalue()
916 sys.stdout.close()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000917
msb@chromium.org5bde4852009-12-14 16:47:12 +0000918 def testUpdateConflict(self):
919 if not self.enabled:
920 return
921 options = self.Options()
922 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
923 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000924 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000925 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000926 scm._Run(['commit', '-am', 'test'], options)
927 __builtin__.raw_input = lambda x: 'y'
928 exception = ('Conflict while rebasing this branch.\n'
929 'Fix the conflict and run gclient again.\n'
930 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +0000931 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000932 exception = ('\n____ . at refs/heads/master\n'
933 '\tYou have unstaged changes.\n'
934 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +0000935 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000936 # The hash always changes. Use a cheap trick.
937 start = ('\n________ running \'git commit -am test\' in \'%s\'\n'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000938 '[new ') % join(self.root_dir, '.')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000939 end = ('] test\n 1 files changed, 1 insertions(+), '
940 '1 deletions(-)\n\n_____ . at refs/heads/master\n'
941 'Attempting rebase onto refs/remotes/origin/master...\n')
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +0000942 self.assertTrue(sys.stdout.getvalue().startswith(start))
943 self.assertTrue(sys.stdout.getvalue().endswith(end))
944 self.assertEquals(len(sys.stdout.getvalue()),
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000945 len(start) + len(end) + 7)
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +0000946 sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +0000947
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000948 def testUpdateNotGit(self):
949 if not self.enabled:
950 return
951 options = self.Options()
952 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
953 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000954 git_path = join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +0000955 rename(git_path, git_path + 'foo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000956 exception = ('\n____ . at refs/heads/master\n'
957 '\tPath is not a git repo. No .git dir.\n'
958 '\tTo resolve:\n'
959 '\t\trm -rf .\n'
960 '\tAnd run gclient sync again\n')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000961 self.assertRaisesError(exception, scm.update, options, (), [])
962
msb@chromium.org0f282062009-11-06 20:14:02 +0000963 def testRevinfo(self):
964 if not self.enabled:
965 return
966 options = self.Options()
967 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
968 relpath=self.relpath)
969 rev_info = scm.revinfo(options, (), None)
970 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
971
msb@chromium.orge28e4982009-09-25 20:51:45 +0000972
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000973class ManagedGitWrapperTestCaseMox(BaseTestCase):
974 class OptionsObject(object):
975 def __init__(self, verbose=False, revision=None, force=False):
976 self.verbose = verbose
977 self.revision = revision
978 self.deps_os = None
979 self.force = force
980 self.reset = False
981 self.nohooks = False
982 # TODO(maruel): Test --jobs > 1.
983 self.jobs = 1
984
985 def Options(self, *args, **kwargs):
986 return self.OptionsObject(*args, **kwargs)
987
988 def setUp(self):
989 BaseTestCase.setUp(self)
990 self.fake_hash_1 = 't0ta11yf4k3'
991 self.fake_hash_2 = '3v3nf4k3r'
992 self.url = 'git://foo'
993 self.root_dir = '/tmp'
994 self.relpath = 'fake'
995 self.base_path = os.path.join(self.root_dir, self.relpath)
996
997 def tearDown(self):
998 BaseTestCase.tearDown(self)
999
1000 def testGetUsableRevGit(self):
1001 # pylint: disable=E1101
1002 options = self.Options(verbose=True)
1003
1004 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1005 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1006 ).AndReturn(True)
1007 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev='1'
1008 ).AndReturn(False)
1009
1010 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1011 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1012 ).AndReturn(False)
1013
1014 self.mox.ReplayAll()
1015
1016 git_scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1017 relpath=self.relpath)
1018 # A [fake] git sha1 with a git repo should work (this is in the case that
1019 # the LKGR gets flipped to git sha1's some day).
1020 self.assertEquals(git_scm.GetUsableRev(self.fake_hash_1, options),
1021 self.fake_hash_1)
1022 # An SVN rev with a purely git repo should raise an exception.
1023 self.assertRaises(gclient_scm.gclient_utils.Error,
1024 git_scm.GetUsableRev, '1', options)
1025
1026 def testGetUsableRevGitSvn(self):
1027 # pylint: disable=E1101
1028 options = self.Options()
1029 too_big = str(1e7)
1030
1031 # Pretend like the git-svn repo's HEAD is at r2.
1032 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetGitSvnHeadRev', True)
1033 gclient_scm.scm.GIT.GetGitSvnHeadRev(cwd=self.base_path).MultipleTimes(
1034 ).AndReturn(2)
1035
1036 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetSha1ForSvnRev', True)
1037 # r1 -> first fake hash, r3 -> second fake hash.
1038 gclient_scm.scm.GIT.GetSha1ForSvnRev(cwd=self.base_path, rev='1'
1039 ).AndReturn(self.fake_hash_1)
1040 gclient_scm.scm.GIT.GetSha1ForSvnRev(cwd=self.base_path, rev='3'
1041 ).AndReturn(self.fake_hash_2)
1042
1043 # Ensure that we call git svn fetch if our LKGR is > the git-svn HEAD rev.
1044 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'Capture', True)
1045 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
1046
1047 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1048 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1049 ).AndReturn(True)
1050
1051 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1052 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1053 ).AndReturn(True)
1054 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=too_big
1055 ).AndReturn(False)
1056
1057 self.mox.ReplayAll()
1058
1059 git_svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
1060 relpath=self.relpath)
1061 # Given an SVN revision with a git-svn checkout, it should be translated to
1062 # a git sha1 and be usable.
1063 self.assertEquals(git_svn_scm.GetUsableRev('1', options),
1064 self.fake_hash_1)
1065 # Our fake HEAD rev is r2, so this should call git svn fetch to get more
1066 # revs (pymox will complain if this doesn't happen).
1067 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1068 self.fake_hash_2)
1069 # Given a git sha1 with a git-svn checkout, it should be used as is.
1070 self.assertEquals(git_svn_scm.GetUsableRev(self.fake_hash_1, options),
1071 self.fake_hash_1)
1072 # We currently check for seemingly valid SVN revisions by assuming 6 digit
1073 # numbers, so assure that numeric revs >= 1000000 don't work.
1074 self.assertRaises(gclient_scm.gclient_utils.Error,
1075 git_svn_scm.GetUsableRev, too_big, options)
1076
1077
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001078class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
1079 def testUpdateCheckout(self):
1080 if not self.enabled:
1081 return
1082 options = self.Options(verbose=True)
1083 root_dir = gclient_scm.os.path.realpath(tempfile.mkdtemp())
1084 relpath = 'foo'
1085 base_path = join(root_dir, relpath)
1086 url = join(self.base_path, '.git')
1087 try:
1088 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
1089 relpath=relpath)
1090 file_list = []
1091 options.revision = 'unmanaged'
1092 scm.update(options, (), file_list)
1093 self.assertEquals(len(file_list), 2)
1094 self.assert_(gclient_scm.os.path.isfile(join(base_path, 'a')))
1095 self.assertEquals(scm.revinfo(options, (), None),
1096 '069c602044c5388d2d15c3f875b057c852003458')
1097 finally:
1098 rmtree(root_dir)
1099 msg1 = (
1100 "\n_____ foo at refs/heads/master\n\n"
szager@google.com85d3e3a2011-10-07 17:12:00 +00001101 "________ running 'git clone --progress -b master --verbose %s %s'"
1102 " in '%s'\n"
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001103 "Initialized empty Git repository in %s\n") % (
1104 join(self.root_dir, '.', '.git'),
1105 join(root_dir, 'foo'),
1106 root_dir,
1107 join(gclient_scm.os.path.realpath(root_dir), 'foo', '.git') + '/')
1108 msg2 = (
1109 "\n_____ foo at refs/heads/master\n\n"
szager@google.com85d3e3a2011-10-07 17:12:00 +00001110 "________ running 'git clone --progress -b master --verbose %s %s'"
1111 " in '%s'\n"
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001112 "Cloning into %s...\ndone.\n") % (
1113 join(self.root_dir, '.', '.git'),
1114 join(root_dir, 'foo'),
1115 root_dir,
1116 join(gclient_scm.os.path.realpath(root_dir), 'foo'))
1117 out = sys.stdout.getvalue()
1118 sys.stdout.close()
1119 sys.stdout = self._old_stdout
1120 self.assertTrue(out in (msg1, msg2), (out, msg1, msg2))
1121
1122 def testUpdateUpdate(self):
1123 if not self.enabled:
1124 return
1125 options = self.Options()
1126 expected_file_list = []
1127 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1128 relpath=self.relpath)
1129 file_list = []
1130 options.revision = 'unmanaged'
1131 scm.update(options, (), file_list)
1132 self.assertEquals(file_list, expected_file_list)
1133 self.assertEquals(scm.revinfo(options, (), None),
1134 '069c602044c5388d2d15c3f875b057c852003458')
1135 self.checkstdout('________ unmanaged solution; skipping .\n')
1136
1137
msb@chromium.orge28e4982009-09-25 20:51:45 +00001138if __name__ == '__main__':
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001139 if '-v' in sys.argv:
1140 logging.basicConfig(
1141 level=logging.DEBUG,
1142 format='%(asctime).19s %(levelname)s %(filename)s:'
1143 '%(lineno)s %(message)s')
msb@chromium.orge28e4982009-09-25 20:51:45 +00001144 unittest.main()
1145
1146# vim: ts=2:sw=2:tw=80:et: