blob: fa16be676b1e91ee538ef723f75b2f78c7cedf4c [file] [log] [blame]
maruel@chromium.org45d8db02011-03-31 20:43:56 +00001#!/usr/bin/env python
steveblock@chromium.org93567042012-02-15 01:02:26 +00002# Copyright (c) 2012 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.
maruel@chromium.orgba551772010-02-03 18:21:42 +000011from shutil import rmtree
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000012from subprocess import Popen, PIPE, STDOUT
maruel@chromium.org428342a2011-11-10 15:46:33 +000013
14import logging
15import os
16import sys
msb@chromium.orge28e4982009-09-25 20:51:45 +000017import tempfile
maruel@chromium.org389d6de2010-09-09 14:14:37 +000018import unittest
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +000019import __builtin__
msb@chromium.orge28e4982009-09-25 20:51:45 +000020
maruel@chromium.org428342a2011-11-10 15:46:33 +000021sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
maruel@chromium.orgba551772010-02-03 18:21:42 +000022
maruel@chromium.org0927b7e2011-11-11 16:06:22 +000023from testing_support.super_mox import mox, StdoutCheck, SuperMoxTestBase
24from testing_support.super_mox import TestCaseUtils
maruel@chromium.org428342a2011-11-10 15:46:33 +000025
msb@chromium.orge28e4982009-09-25 20:51:45 +000026import gclient_scm
maruel@chromium.orgfae707b2011-09-15 18:57:58 +000027import subprocess2
maruel@chromium.org96913eb2010-06-01 16:22:47 +000028
maruel@chromium.org795a8c12010-10-05 19:54:29 +000029# Shortcut since this function is used often
30join = gclient_scm.os.path.join
31
maruel@chromium.org96913eb2010-06-01 16:22:47 +000032
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +000033# Access to a protected member XXX of a client class
34# pylint: disable=W0212
35
36
maruel@chromium.org389d6de2010-09-09 14:14:37 +000037class GCBaseTestCase(object):
maruel@chromium.org96913eb2010-06-01 16:22:47 +000038 def assertRaisesError(self, msg, fn, *args, **kwargs):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000039 """Like unittest's assertRaises() but checks for Gclient.Error."""
maruel@chromium.org428342a2011-11-10 15:46:33 +000040 # pylint: disable=E1101
maruel@chromium.org96913eb2010-06-01 16:22:47 +000041 try:
42 fn(*args, **kwargs)
43 except gclient_scm.gclient_utils.Error, e:
44 self.assertEquals(e.args[0], msg)
45 else:
46 self.fail('%s not raised' % msg)
msb@chromium.orge28e4982009-09-25 20:51:45 +000047
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000048
maruel@chromium.org389d6de2010-09-09 14:14:37 +000049class BaseTestCase(GCBaseTestCase, SuperMoxTestBase):
50 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000051 SuperMoxTestBase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000052 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter')
53 self.mox.StubOutWithMock(gclient_scm.gclient_utils,
54 'CheckCallAndFilterAndHeader')
55 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
56 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
digit@chromium.orgdc112ac2013-04-24 13:00:19 +000057 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'rmtree')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000058 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +000059 self.mox.StubOutWithMock(gclient_scm.scm.SVN, '_CaptureInfo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000060 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
61 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
maruel@chromium.orgfae707b2011-09-15 18:57:58 +000062 self.mox.StubOutWithMock(subprocess2, 'communicate')
63 self.mox.StubOutWithMock(subprocess2, 'Popen')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000064 self._scm_wrapper = gclient_scm.CreateSCM
maruel@chromium.org389d6de2010-09-09 14:14:37 +000065 gclient_scm.scm.SVN.current_version = None
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +000066 self._original_SVNBinaryExists = gclient_scm.SVNWrapper.BinaryExists
67 self._original_GitBinaryExists = gclient_scm.GitWrapper.BinaryExists
68 gclient_scm.SVNWrapper.BinaryExists = staticmethod(lambda : True)
69 gclient_scm.GitWrapper.BinaryExists = staticmethod(lambda : True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +000070 # Absolute path of the fake checkout directory.
71 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000072
73 def tearDown(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000074 SuperMoxTestBase.tearDown(self)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +000075 gclient_scm.SVNWrapper.BinaryExists = self._original_SVNBinaryExists
76 gclient_scm.GitWrapper.BinaryExists = self._original_GitBinaryExists
maruel@chromium.org389d6de2010-09-09 14:14:37 +000077
78
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000079class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000080 class OptionsObject(object):
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +000081 def __init__(self, verbose=False, revision=None, force=False):
msb@chromium.orge28e4982009-09-25 20:51:45 +000082 self.verbose = verbose
83 self.revision = revision
84 self.manually_grab_svn_rev = True
85 self.deps_os = None
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +000086 self.force = force
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000087 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000088 self.nohooks = False
maruel@chromium.org36ac2392011-10-12 16:36:11 +000089 # TODO(maruel): Test --jobs > 1.
90 self.jobs = 1
steveblock@chromium.org98e69452012-02-16 16:36:43 +000091 self.delete_unversioned_trees = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000092
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000093 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +000094 return self.OptionsObject(*args, **kwargs)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000095
msb@chromium.orge28e4982009-09-25 20:51:45 +000096 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000097 BaseTestCase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000098 self.url = self.SvnUrl()
msb@chromium.orge28e4982009-09-25 20:51:45 +000099
100 def testDir(self):
101 members = [
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000102 'BinaryExists',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000103 'FullUrlForRelativeUrl',
xusydoc@chromium.org885a9602013-05-31 09:54:40 +0000104 'GetCheckoutRoot',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000105 'GetRevisionDate',
106 'GetUsableRev',
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000107 'Svnversion',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000108 'RunCommand',
109 'cleanup',
110 'diff',
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000111 'name',
szager@chromium.org12b07e72013-05-03 22:06:34 +0000112 'nag_max',
113 'nag_timer',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000114 'pack',
115 'relpath',
116 'revert',
117 'revinfo',
118 'runhooks',
119 'status',
120 'update',
121 'updatesingle',
122 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000123 ]
124
125 # If you add a member, be sure to add the relevant test!
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000126 self.compareMembers(self._scm_wrapper('svn://a'), members)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000127
128 def testUnsupportedSCM(self):
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000129 args = ['gopher://foo', self.root_dir, self.relpath]
130 exception_msg = 'No SCM found for url gopher://foo'
131 self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000132
msb@chromium.orge6f78352010-01-13 17:05:33 +0000133 def testSVNFullUrlForRelativeUrl(self):
134 self.url = 'svn://a/b/c/d'
135
136 self.mox.ReplayAll()
137 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
138 relpath=self.relpath)
139 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
140
141 def testGITFullUrlForRelativeUrl(self):
142 self.url = 'git://a/b/c/d'
143
144 self.mox.ReplayAll()
145 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
146 relpath=self.relpath)
147 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
148
igorgatis@gmail.com4e075672011-11-21 16:35:08 +0000149 def testGITFakeHttpUrl(self):
150 self.url = 'git+http://foo'
151
152 self.mox.ReplayAll()
153 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
154 relpath=self.relpath)
155 self.assertEqual(scm.url, 'http://foo')
156
157 def testGITFakeHttpsUrl(self):
158 self.url = 'git+https://foo'
159
160 self.mox.ReplayAll()
161 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
162 relpath=self.relpath)
163 self.assertEqual(scm.url, 'https://foo')
164
msb@chromium.orge28e4982009-09-25 20:51:45 +0000165 def testRunCommandException(self):
166 options = self.Options(verbose=False)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000167 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
168 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000169
170 self.mox.ReplayAll()
171 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
172 relpath=self.relpath)
173 exception = "Unsupported argument(s): %s" % ','.join(self.args)
174 self.assertRaisesError(exception, scm.RunCommand,
175 'update', options, self.args)
176
177 def testRunCommandUnknown(self):
178 # TODO(maruel): if ever used.
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000179 pass
msb@chromium.orge28e4982009-09-25 20:51:45 +0000180
181 def testRevertMissing(self):
182 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000183 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000184 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000185 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
186 ).AndReturn('1.5.1')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000187 # It'll to a checkout instead.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000188 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
189 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000190 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000191 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000192 parent = gclient_scm.os.path.dirname(self.base_path)
193 gclient_scm.os.path.exists(parent).AndReturn(False)
194 gclient_scm.os.makedirs(parent)
195 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000196 files_list = self.mox.CreateMockAnything()
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000197 gclient_scm.scm.SVN.RunAndGetFileList(
198 options.verbose,
199 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
200 cwd=self.root_dir,
201 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000202
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000203 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
204 ).AndReturn({'Revision': 100})
205
msb@chromium.orge28e4982009-09-25 20:51:45 +0000206 self.mox.ReplayAll()
207 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
208 relpath=self.relpath)
209 scm.revert(options, self.args, files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000210 self.checkstdout(
211 ('\n_____ %s is missing, synching instead\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000212
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000213 def testRevertNoDotSvn(self):
214 options = self.Options(verbose=True, force=True)
215 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
216 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(False)
217 gclient_scm.os.path.isdir(join(self.base_path, '.git')).AndReturn(False)
218 gclient_scm.os.path.isdir(join(self.base_path, '.hg')).AndReturn(False)
219 # Checkout.
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000220 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
221 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
222 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000223 parent = gclient_scm.os.path.dirname(self.base_path)
224 gclient_scm.os.path.exists(parent).AndReturn(False)
225 gclient_scm.os.makedirs(parent)
226 gclient_scm.os.path.exists(parent).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000227 files_list = self.mox.CreateMockAnything()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000228 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
229 ).AndReturn('1.6')
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000230 gclient_scm.scm.SVN.RunAndGetFileList(
231 options.verbose,
232 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
233 cwd=self.root_dir,
234 file_list=files_list)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000235 gclient_scm.gclient_utils.rmtree(self.base_path)
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000236 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
237 ).AndReturn({'Revision': 100})
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000238 self.mox.ReplayAll()
239 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
240 relpath=self.relpath)
241 scm.revert(options, self.args, files_list)
242 self.checkstdout(
243 '\n_____ %s is not a valid svn checkout, synching instead\n' %
244 self.relpath)
245
msb@chromium.orge28e4982009-09-25 20:51:45 +0000246 def testRevertNone(self):
247 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000248 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000249 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000250 gclient_scm.scm.SVN.CaptureStatus(
251 None, self.base_path, no_ignore=False).AndReturn([])
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000252 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000253 gclient_scm.scm.SVN.RunAndGetFileList(
254 options.verbose,
255 ['update', '--revision', 'BASE', '--ignore-externals'],
256 cwd=self.base_path,
257 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000258
259 self.mox.ReplayAll()
260 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
261 relpath=self.relpath)
262 file_list = []
263 scm.revert(options, self.args, file_list)
264
msb@chromium.orge28e4982009-09-25 20:51:45 +0000265 def testRevertDirectory(self):
266 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000267 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000268 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000269 items = [
270 ('~ ', 'a'),
271 ]
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000272 gclient_scm.scm.SVN.CaptureStatus(
273 None, self.base_path, no_ignore=False).AndReturn(items)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000274 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000275 gclient_scm.os.path.exists(file_path).AndReturn(True)
276 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000277 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000278 gclient_scm.os.path.isdir(file_path).AndReturn(True)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000279 gclient_scm.gclient_utils.rmtree(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000280 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000281 gclient_scm.scm.SVN.RunAndGetFileList(
282 options.verbose,
283 ['update', '--revision', 'BASE', '--ignore-externals'],
284 cwd=self.base_path,
285 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000286
287 self.mox.ReplayAll()
288 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
289 relpath=self.relpath)
290 file_list2 = []
291 scm.revert(options, self.args, file_list2)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000292 self.checkstdout(('%s\n' % file_path))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000293
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000294 def testRevertDot(self):
295 self.mox.StubOutWithMock(gclient_scm.SVNWrapper, 'update')
296 options = self.Options(verbose=True)
297 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
298 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
299 items = [
300 ('~ ', '.'),
301 ]
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000302 gclient_scm.scm.SVN.CaptureStatus(
303 None, self.base_path, no_ignore=False).AndReturn(items)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000304 # gclient_utils.rmtree() doesn't work on path ending with '.', like 'foo/.'.
maruel@chromium.org62087572012-04-24 23:16:28 +0000305 file_path = self.base_path
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000306 gclient_scm.os.path.exists(file_path).AndReturn(True)
307 gclient_scm.os.path.isfile(file_path).AndReturn(False)
308 gclient_scm.os.path.islink(file_path).AndReturn(False)
309 gclient_scm.os.path.isdir(file_path).AndReturn(True)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000310 gclient_scm.gclient_utils.rmtree(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000311 # pylint: disable=E1120
maruel@chromium.org428342a2011-11-10 15:46:33 +0000312 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000313 gclient_scm.SVNWrapper.update(options, [], ['.'])
314
315 self.mox.ReplayAll()
316 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
317 relpath=self.relpath)
318 file_list2 = []
319 scm.revert(options, self.args, file_list2)
maruel@chromium.org62087572012-04-24 23:16:28 +0000320 self.checkstdout(('%s\n' % os.path.join(file_path, '.')))
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000321
msb@chromium.orge28e4982009-09-25 20:51:45 +0000322 def testStatus(self):
323 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000324 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000325 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000326 options.verbose,
327 ['status'] + self.args + ['--ignore-externals'],
328 cwd=self.base_path,
329 file_list=[]).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000330
331 self.mox.ReplayAll()
332 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
333 relpath=self.relpath)
334 file_list = []
335 self.assertEqual(scm.status(options, self.args, file_list), None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000336
337 # TODO(maruel): TEST REVISIONS!!!
338 # TODO(maruel): TEST RELOCATE!!!
339 def testUpdateCheckout(self):
340 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000341 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000342 file_info.root = 'blah'
343 file_info.url = self.url
344 file_info.uuid = 'ABC'
345 file_info.revision = 42
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000346 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
347 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000348 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000349 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000350 parent = gclient_scm.os.path.dirname(self.base_path)
351 gclient_scm.os.path.exists(parent).AndReturn(False)
352 gclient_scm.os.makedirs(parent)
353 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000354 files_list = self.mox.CreateMockAnything()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000355 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
356 ).AndReturn('1.5.1')
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000357 gclient_scm.scm.SVN.RunAndGetFileList(
358 options.verbose,
359 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
360 cwd=self.root_dir,
361 file_list=files_list)
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000362 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
363 ).AndReturn({'Revision': 100})
msb@chromium.orge28e4982009-09-25 20:51:45 +0000364 self.mox.ReplayAll()
365 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
366 relpath=self.relpath)
367 scm.update(options, (), files_list)
368
369 def testUpdateUpdate(self):
370 options = self.Options(verbose=True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000371 options.force = True
372 options.nohooks = False
373 file_info = {
374 'Repository Root': 'blah',
375 'URL': self.url,
376 'UUID': 'ABC',
377 'Revision': 42,
378 }
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000379 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
380 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000381 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000382
msb@chromium.orge28e4982009-09-25 20:51:45 +0000383 # Checkout or update.
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000384 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000385 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000386
387 # Verify no locked files.
388 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
389
msb@chromium.orge28e4982009-09-25 20:51:45 +0000390 # Cheat a bit here.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000391 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
392 ).AndReturn(file_info)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000393
394 # _AddAdditionalUpdateFlags()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000395 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
396 ).AndReturn('1.5.1')
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000397
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000398 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
399 ).AndReturn({'Revision': 100})
400
msb@chromium.orge28e4982009-09-25 20:51:45 +0000401 additional_args = []
402 if options.manually_grab_svn_rev:
403 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000404 additional_args.extend(['--force', '--ignore-externals'])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000405 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000406 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000407 options.verbose,
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000408 ['update', self.base_path] + additional_args,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000409 cwd=self.root_dir, file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000410
411 self.mox.ReplayAll()
412 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
413 relpath=self.relpath)
414 scm.update(options, (), files_list)
415
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000416 def testUpdateReset(self):
417 options = self.Options(verbose=True)
418 options.reset = True
419 file_info = {
420 'Repository Root': 'blah',
421 'URL': self.url,
422 'UUID': 'ABC',
423 'Revision': 42,
424 }
425 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
426 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
427 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
428
429 # Checkout or update.
430 dotted_path = join(self.base_path, '.')
431 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
432
433 # Create an untracked file and directory.
434 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
435 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
436
437 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
438 ).AndReturn(file_info)
439
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000440 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
441 ).AndReturn({'Revision': 100})
442
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000443 self.mox.ReplayAll()
444 files_list = []
445 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
446 relpath=self.relpath)
447 scm.update(options, (), files_list)
448 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
449
450 def testUpdateResetDeleteUnversionedTrees(self):
451 options = self.Options(verbose=True)
452 options.reset = True
453 options.delete_unversioned_trees = True
454
455 file_info = {
456 'Repository Root': 'blah',
457 'URL': self.url,
458 'UUID': 'ABC',
459 'Revision': 42,
460 }
461 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
462 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
463 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
464
465 # Checkout or update.
466 dotted_path = join(self.base_path, '.')
467 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
468
469 # Create an untracked file and directory.
470 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
471 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
472
473 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
474 ).AndReturn(file_info)
475
476 # Confirm that the untracked file is removed.
477 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path
478 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
479 gclient_scm.os.path.isdir(join(self.base_path, 'dir')).AndReturn(True)
480 gclient_scm.os.path.isdir(join(self.base_path, 'file')).AndReturn(False)
481 gclient_scm.os.path.islink(join(self.base_path, 'dir')).AndReturn(False)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000482 gclient_scm.gclient_utils.rmtree(join(self.base_path, 'dir'))
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000483
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000484 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
485 ).AndReturn({'Revision': 100})
486
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000487 self.mox.ReplayAll()
488 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
489 relpath=self.relpath)
490 files_list = []
491 scm.update(options, (), files_list)
492 self.checkstdout(
493 ('\n_____ %s at 42\n'
494 '\n_____ removing unversioned directory dir\n') % self.relpath)
495
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000496 def testUpdateSingleCheckout(self):
497 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000498 file_info = {
499 'URL': self.url,
500 'Revision': 42,
501 }
tony@chromium.org57564662010-04-14 02:35:12 +0000502
503 # Checks to make sure that we support svn co --depth.
504 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000505 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
506 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000507 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
508 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000509
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000510 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000511 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000512 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000513
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000514 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000515 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000516 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000517 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000518 always=True,
iannucci@chromium.orge6ebb4e2013-07-04 20:21:52 +0000519 nag_max=30,
szager@chromium.org12b07e72013-05-03 22:06:34 +0000520 nag_timer=30,
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000521 cwd=self.root_dir)
522 gclient_scm.scm.SVN.RunAndGetFileList(
523 options.verbose,
524 ['update', 'DEPS', '--ignore-externals'],
525 cwd=self.base_path,
526 file_list=files_list)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000527
528 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000529 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
530 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
531 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000532 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
533 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
534 ).AndReturn(file_info)
tony@chromium.org57564662010-04-14 02:35:12 +0000535
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000536 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
537 ).AndReturn({'Revision': 100})
538
tony@chromium.org57564662010-04-14 02:35:12 +0000539 self.mox.ReplayAll()
540 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
541 relpath=self.relpath)
542 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000543 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org57564662010-04-14 02:35:12 +0000544
545 def testUpdateSingleCheckoutSVN14(self):
546 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000547
548 # Checks to make sure that we support svn co --depth.
549 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000550 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
551 ).AndReturn('1.4.4')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000552 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org57564662010-04-14 02:35:12 +0000553
554 # When checking out a single file with svn 1.4, we use svn export
555 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000556 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000557 ['svn', 'export', join(self.url, 'DEPS'), join(self.base_path, 'DEPS')],
iannucci@chromium.orge6ebb4e2013-07-04 20:21:52 +0000558 nag_timer=30, nag_max=30, always=True, cwd=self.root_dir)
tony@chromium.org57564662010-04-14 02:35:12 +0000559
560 self.mox.ReplayAll()
561 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
562 relpath=self.relpath)
563 scm.updatesingle(options, ['DEPS'], files_list)
564
565 def testUpdateSingleCheckoutSVNUpgrade(self):
566 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000567 file_info = {
568 'URL': self.url,
569 'Revision': 42,
570 }
571
572 # Checks to make sure that we support svn co --depth.
573 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000574 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
575 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000576 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000577 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
578 # the old DEPS file.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000579 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(True)
580 gclient_scm.os.remove(join(self.base_path, 'DEPS'))
tony@chromium.org57564662010-04-14 02:35:12 +0000581
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000582 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000583 gclient_scm.scm.SVN.CaptureStatus(
584 None, join(self.base_path, '.')).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000585
tony@chromium.org57564662010-04-14 02:35:12 +0000586 # When checking out a single file, we issue an svn checkout and svn update.
587 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000588 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000589 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000590 always=True,
iannucci@chromium.orge6ebb4e2013-07-04 20:21:52 +0000591 nag_max=30,
szager@chromium.org12b07e72013-05-03 22:06:34 +0000592 nag_timer=30,
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000593 cwd=self.root_dir)
594 gclient_scm.scm.SVN.RunAndGetFileList(
595 options.verbose,
596 ['update', 'DEPS', '--ignore-externals'],
597 cwd=self.base_path,
598 file_list=files_list)
tony@chromium.org57564662010-04-14 02:35:12 +0000599
600 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000601 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
602 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
603 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000604 gclient_scm.scm.SVN._CaptureInfo(
605 [], join(self.base_path, ".")).AndReturn(file_info)
606 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
607 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000608
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000609 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
610 ).AndReturn({'Revision': 100})
611
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000612 self.mox.ReplayAll()
613 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
614 relpath=self.relpath)
615 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000616 self.checkstdout(
617 ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000618
619 def testUpdateSingleUpdate(self):
620 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000621 file_info = {
622 'URL': self.url,
623 'Revision': 42,
624 }
tony@chromium.org57564662010-04-14 02:35:12 +0000625 # Checks to make sure that we support svn co --depth.
626 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000627 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
628 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000629 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000630
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000631 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000632 gclient_scm.scm.SVN.CaptureStatus(None, join(self.base_path, '.')
633 ).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000634
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000635 # Now we fall back on scm.update().
636 files_list = self.mox.CreateMockAnything()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000637 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
638 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
639 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000640 gclient_scm.scm.SVN._CaptureInfo(
641 [], join(self.base_path, '.')).AndReturn(file_info)
642 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
643 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000644
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000645 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
646 ).AndReturn({'Revision': 100})
647
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000648 self.mox.ReplayAll()
649 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
650 relpath=self.relpath)
651 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000652 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000653
msb@chromium.orge28e4982009-09-25 20:51:45 +0000654 def testUpdateGit(self):
655 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000656 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
657 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000658
659 self.mox.ReplayAll()
660 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
661 relpath=self.relpath)
662 file_list = []
663 scm.update(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000664 self.checkstdout(
665 ('________ found .git directory; skipping %s\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000666
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000667 def testUpdateHg(self):
668 options = self.Options(verbose=True)
669 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
670 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(True)
671
672 self.mox.ReplayAll()
673 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
674 relpath=self.relpath)
675 file_list = []
676 scm.update(options, self.args, file_list)
677 self.checkstdout(
678 ('________ found .hg directory; skipping %s\n' % self.relpath))
679
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000680 def testGetUsableRevSVN(self):
681 # pylint: disable=E1101
682 options = self.Options(verbose=True)
683
684 # Mock SVN revision validity checking.
685 self.mox.StubOutWithMock(
686 gclient_scm.scm.SVN, 'IsValidRevision', True)
687 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 1)
688 ).AndReturn(True)
689 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 'fake')
690 ).AndReturn(False)
691
692 self.mox.ReplayAll()
693
694 svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir)
695 # With an SVN checkout, 1 an example of a valid usable rev.
696 self.assertEquals(svn_scm.GetUsableRev(1, options), 1)
697 # With an SVN checkout, a fake or unknown rev should raise an excpetion.
698 self.assertRaises(gclient_scm.gclient_utils.Error,
699 svn_scm.GetUsableRev, 'fake', options)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000700
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000701class BaseGitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
702 unittest.TestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000703 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000704 class OptionsObject(object):
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000705 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000706 self.verbose = verbose
707 self.revision = revision
708 self.manually_grab_svn_rev = True
709 self.deps_os = None
710 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000711 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000712 self.nohooks = False
iannucci@chromium.orgd4fffee2013-06-28 00:35:26 +0000713 self.upstream = False
iannucci@chromium.org53456aa2013-07-03 19:38:34 +0000714 self.cache_dir = None
bauerb@chromium.org4dd09372011-07-22 14:41:51 +0000715 self.merge = False
bratell@opera.com18fa4542013-05-21 13:30:46 +0000716 self.jobs = 1
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000717 self.delete_unversioned_trees = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000718
719 sample_git_import = """blob
720mark :1
721data 6
722Hello
723
724blob
725mark :2
726data 4
727Bye
728
729reset refs/heads/master
730commit refs/heads/master
731mark :3
732author Bob <bob@example.com> 1253744361 -0700
733committer Bob <bob@example.com> 1253744361 -0700
734data 8
735A and B
736M 100644 :1 a
737M 100644 :2 b
738
739blob
740mark :4
741data 10
742Hello
743You
744
745blob
746mark :5
747data 8
748Bye
749You
750
751commit refs/heads/origin
752mark :6
753author Alice <alice@example.com> 1253744424 -0700
754committer Alice <alice@example.com> 1253744424 -0700
755data 13
756Personalized
757from :3
758M 100644 :4 a
759M 100644 :5 b
760
761reset refs/heads/master
762from :3
763"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000764 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000765 return self.OptionsObject(*args, **kwargs)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000766
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000767 @staticmethod
768 def CreateGitRepo(git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000769 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000770 try:
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000771 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000772 cwd=path).communicate()
773 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000774 # git is not available, skip this test.
775 return False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000776 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
777 stderr=STDOUT, cwd=path).communicate(input=git_import)
778 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
779 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000780 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000781 stderr=STDOUT, cwd=path).communicate()
782 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
783 stderr=STDOUT, cwd=path).communicate()
784 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
785 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000786 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000787 stderr=STDOUT, cwd=path).communicate()
iannucci@chromium.org1e7187a2013-02-17 20:54:05 +0000788 Popen(['git', 'config', 'user.email', 'someuser@chromium.org'], stdout=PIPE,
789 stderr=STDOUT, cwd=path).communicate()
790 Popen(['git', 'config', 'user.name', 'Some User'], stdout=PIPE,
791 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000792 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000793
msb@chromium.orge28e4982009-09-25 20:51:45 +0000794 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000795 TestCaseUtils.setUp(self)
796 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000797 self.url = 'git://foo'
798 self.root_dir = tempfile.mkdtemp()
799 self.relpath = '.'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000800 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000801 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000802 StdoutCheck.setUp(self)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000803 self._original_GitBinaryExists = gclient_scm.GitWrapper.BinaryExists
804 self._original_SVNBinaryExists = gclient_scm.SVNWrapper.BinaryExists
805 gclient_scm.GitWrapper.BinaryExists = staticmethod(lambda : True)
806 gclient_scm.SVNWrapper.BinaryExists = staticmethod(lambda : True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000807
808 def tearDown(self):
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000809 StdoutCheck.tearDown(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000810 TestCaseUtils.tearDown(self)
811 unittest.TestCase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000812 rmtree(self.root_dir)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000813 gclient_scm.GitWrapper.BinaryExists = self._original_GitBinaryExists
814 gclient_scm.SVNWrapper.BinaryExists = self._original_SVNBinaryExists
msb@chromium.orge28e4982009-09-25 20:51:45 +0000815
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000816class ManagedGitWrapperTestCase(BaseGitWrapperTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000817 def testDir(self):
818 members = [
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000819 'BinaryExists',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000820 'FullUrlForRelativeUrl',
xusydoc@chromium.org885a9602013-05-31 09:54:40 +0000821 'GetCheckoutRoot',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000822 'GetRevisionDate',
823 'GetUsableRev',
824 'RunCommand',
iannucci@chromium.org53456aa2013-07-03 19:38:34 +0000825 'cache_dir',
826 'cache_locks',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000827 'cleanup',
828 'diff',
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000829 'name',
szager@chromium.org12b07e72013-05-03 22:06:34 +0000830 'nag_max',
831 'nag_timer',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000832 'pack',
szager@chromium.orgd4af6622012-06-04 22:13:55 +0000833 'UpdateSubmoduleConfig',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000834 'relpath',
835 'revert',
836 'revinfo',
837 'runhooks',
838 'status',
839 'update',
840 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000841 ]
842
843 # If you add a member, be sure to add the relevant test!
844 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
845
846 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000847 if not self.enabled:
848 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000849 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000850 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000851 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
852 relpath=self.relpath)
853 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000854 scm.update(options, None, file_list)
855 gclient_scm.os.remove(file_path)
856 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000857 scm.revert(options, self.args, file_list)
858 self.assertEquals(file_list, [file_path])
859 file_list = []
860 scm.diff(options, self.args, file_list)
861 self.assertEquals(file_list, [])
szager@google.com85d3e3a2011-10-07 17:12:00 +0000862 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000863
864 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000865 if not self.enabled:
866 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000867 options = self.Options()
868 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
869 relpath=self.relpath)
870 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000871 scm.update(options, None, file_list)
872 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000873 scm.revert(options, self.args, file_list)
874 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000875 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000876 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000877 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000878
879 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000880 if not self.enabled:
881 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000882 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000883 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
884 relpath=self.relpath)
885 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000886 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000887 file_path = join(self.base_path, 'a')
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000888 open(file_path, 'a').writelines('touched\n')
889 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000890 scm.revert(options, self.args, file_list)
891 self.assertEquals(file_list, [file_path])
892 file_list = []
893 scm.diff(options, self.args, file_list)
894 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000895 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000896 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000897 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000898
899 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000900 if not self.enabled:
901 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000902 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000903 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
904 relpath=self.relpath)
905 file_list = []
906 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000907 file_path = join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000908 f = open(file_path, 'w')
909 f.writelines('new\n')
910 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000911 Popen(['git', 'add', 'c'], stdout=PIPE,
912 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000913 file_list = []
914 scm.revert(options, self.args, file_list)
915 self.assertEquals(file_list, [file_path])
916 file_list = []
917 scm.diff(options, self.args, file_list)
918 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000919 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000920 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000921 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000922
923 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000924 if not self.enabled:
925 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000926 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000927 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000928 open(file_path, 'a').writelines('touched\n')
929 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
930 relpath=self.relpath)
931 file_list = []
932 scm.status(options, self.args, file_list)
933 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000934 self.checkstdout(
935 ('\n________ running \'git diff --name-status '
936 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000937 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000938
939 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000940 if not self.enabled:
941 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000942 options = self.Options()
943 expected_file_list = []
944 for f in ['a', 'b']:
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000945 file_path = join(self.base_path, f)
946 open(file_path, 'a').writelines('touched\n')
947 expected_file_list.extend([file_path])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000948 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
949 relpath=self.relpath)
950 file_list = []
951 scm.status(options, self.args, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000952 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000953 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000954 self.checkstdout(
955 ('\n________ running \'git diff --name-status '
956 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000957 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000958
msb@chromium.orge28e4982009-09-25 20:51:45 +0000959 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000960 if not self.enabled:
961 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000962 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000963 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000964 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
965 relpath=self.relpath)
966 file_list = []
967 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000968 self.assertEquals(file_list, expected_file_list)
969 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000970 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000971 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000972
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000973 def testUpdateReset(self):
974 if not self.enabled:
975 return
976 options = self.Options()
977 options.reset = True
978
979 dir_path = join(self.base_path, 'c')
980 os.mkdir(dir_path)
981 open(join(dir_path, 'nested'), 'w').writelines('new\n')
982
983 file_path = join(self.base_path, 'file')
984 open(file_path, 'w').writelines('new\n')
985
986 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
987 relpath=self.relpath)
988 file_list = []
989 scm.update(options, (), file_list)
990 self.assert_(gclient_scm.os.path.isdir(dir_path))
991 self.assert_(gclient_scm.os.path.isfile(file_path))
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000992 sys.stdout.close()
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000993
994 def testUpdateResetDeleteUnversionedTrees(self):
995 if not self.enabled:
996 return
997 options = self.Options()
998 options.reset = True
999 options.delete_unversioned_trees = True
1000
1001 dir_path = join(self.base_path, 'dir')
1002 os.mkdir(dir_path)
1003 open(join(dir_path, 'nested'), 'w').writelines('new\n')
1004
1005 file_path = join(self.base_path, 'file')
1006 open(file_path, 'w').writelines('new\n')
1007
1008 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1009 relpath=self.relpath)
1010 file_list = []
1011 scm.update(options, (), file_list)
1012 self.assert_(not gclient_scm.os.path.isdir(dir_path))
1013 self.assert_(gclient_scm.os.path.isfile(file_path))
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +00001014 sys.stdout.close()
steveblock@chromium.org98e69452012-02-16 16:36:43 +00001015
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +00001016 def testUpdateUnstagedConflict(self):
1017 if not self.enabled:
1018 return
1019 options = self.Options()
1020 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1021 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001022 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001023 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001024 try:
1025 scm.update(options, (), [])
1026 self.fail()
maruel@chromium.orgfae707b2011-09-15 18:57:58 +00001027 except (gclient_scm.gclient_utils.Error, subprocess2.CalledProcessError):
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001028 # The exact exception text varies across git versions so it's not worth
1029 # verifying it. It's fine as long as it throws.
1030 pass
1031 # Manually flush stdout since we can't verify it's content accurately across
1032 # git versions.
1033 sys.stdout.getvalue()
1034 sys.stdout.close()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +00001035
msb@chromium.org5bde4852009-12-14 16:47:12 +00001036 def testUpdateConflict(self):
1037 if not self.enabled:
1038 return
1039 options = self.Options()
1040 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1041 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001042 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001043 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001044 scm._Run(['commit', '-am', 'test'], options)
1045 __builtin__.raw_input = lambda x: 'y'
1046 exception = ('Conflict while rebasing this branch.\n'
1047 'Fix the conflict and run gclient again.\n'
1048 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001049 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001050 exception = ('\n____ . at refs/heads/master\n'
1051 '\tYou have unstaged changes.\n'
1052 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001053 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +00001054 sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +00001055
msb@chromium.org0f282062009-11-06 20:14:02 +00001056 def testRevinfo(self):
1057 if not self.enabled:
1058 return
1059 options = self.Options()
1060 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1061 relpath=self.relpath)
1062 rev_info = scm.revinfo(options, (), None)
1063 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
1064
msb@chromium.orge28e4982009-09-25 20:51:45 +00001065
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001066class ManagedGitWrapperTestCaseMox(BaseTestCase):
1067 class OptionsObject(object):
1068 def __init__(self, verbose=False, revision=None, force=False):
1069 self.verbose = verbose
1070 self.revision = revision
1071 self.deps_os = None
1072 self.force = force
1073 self.reset = False
1074 self.nohooks = False
1075 # TODO(maruel): Test --jobs > 1.
1076 self.jobs = 1
1077
1078 def Options(self, *args, **kwargs):
1079 return self.OptionsObject(*args, **kwargs)
1080
1081 def setUp(self):
1082 BaseTestCase.setUp(self)
1083 self.fake_hash_1 = 't0ta11yf4k3'
1084 self.fake_hash_2 = '3v3nf4k3r'
1085 self.url = 'git://foo'
maruel@chromium.org97170132013-05-08 14:58:34 +00001086 self.root_dir = '/tmp' if sys.platform != 'win32' else 't:\\tmp'
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001087 self.relpath = 'fake'
1088 self.base_path = os.path.join(self.root_dir, self.relpath)
1089
1090 def tearDown(self):
1091 BaseTestCase.tearDown(self)
1092
1093 def testGetUsableRevGit(self):
1094 # pylint: disable=E1101
1095 options = self.Options(verbose=True)
1096
1097 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1098 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1099 ).AndReturn(True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001100
1101 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1102 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1103 ).AndReturn(False)
1104
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001105 gclient_scm.scm.os.path.isdir(self.base_path).AndReturn(True)
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001106 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001107
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001108 self.mox.ReplayAll()
1109
1110 git_scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1111 relpath=self.relpath)
1112 # A [fake] git sha1 with a git repo should work (this is in the case that
1113 # the LKGR gets flipped to git sha1's some day).
1114 self.assertEquals(git_scm.GetUsableRev(self.fake_hash_1, options),
1115 self.fake_hash_1)
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001116 # An SVN rev with an existing purely git repo should raise an exception.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001117 self.assertRaises(gclient_scm.gclient_utils.Error,
1118 git_scm.GetUsableRev, '1', options)
1119
1120 def testGetUsableRevGitSvn(self):
1121 # pylint: disable=E1101
1122 options = self.Options()
1123 too_big = str(1e7)
1124
1125 # Pretend like the git-svn repo's HEAD is at r2.
1126 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetGitSvnHeadRev', True)
1127 gclient_scm.scm.GIT.GetGitSvnHeadRev(cwd=self.base_path).MultipleTimes(
1128 ).AndReturn(2)
1129
szager@chromium.orgc51def32012-10-15 18:50:37 +00001130 self.mox.StubOutWithMock(
1131 gclient_scm.scm.GIT, 'GetBlessedSha1ForSvnRev', True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001132 # r1 -> first fake hash, r3 -> second fake hash.
szager@chromium.orgc51def32012-10-15 18:50:37 +00001133 gclient_scm.scm.GIT.GetBlessedSha1ForSvnRev(cwd=self.base_path, rev='1'
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001134 ).AndReturn(self.fake_hash_1)
szager@chromium.orgc51def32012-10-15 18:50:37 +00001135 gclient_scm.scm.GIT.GetBlessedSha1ForSvnRev(cwd=self.base_path, rev='3'
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001136 ).MultipleTimes().AndReturn(self.fake_hash_2)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001137
1138 # Ensure that we call git svn fetch if our LKGR is > the git-svn HEAD rev.
1139 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'Capture', True)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001140 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1141 cwd=self.base_path).AndReturn('blah')
1142 gclient_scm.scm.GIT.Capture(['fetch'], cwd=self.base_path)
1143 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
1144 error = subprocess2.CalledProcessError(1, 'cmd', '/cwd', 'stdout', 'stderr')
1145 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1146 cwd=self.base_path).AndRaise(error)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001147 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001148 gclient_scm.scm.GIT.Capture(['fetch', 'origin'], cwd=self.base_path)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001149
1150 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1151 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1152 ).AndReturn(True)
1153
1154 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1155 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1156 ).AndReturn(True)
1157 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=too_big
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001158 ).MultipleTimes(2).AndReturn(False)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001159
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001160 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
1161 gclient_scm.os.path.isdir(self.base_path).MultipleTimes().AndReturn(True)
1162
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001163 self.mox.ReplayAll()
1164
1165 git_svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
1166 relpath=self.relpath)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001167 # Without an existing checkout, this should fail.
1168 # TODO(dbeam) Fix this. http://crbug.com/109184
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001169 self.assertRaises(gclient_scm.gclient_utils.Error,
1170 git_svn_scm.GetUsableRev, '1', options)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001171 # Given an SVN revision with a git-svn checkout, it should be translated to
1172 # a git sha1 and be usable.
1173 self.assertEquals(git_svn_scm.GetUsableRev('1', options),
1174 self.fake_hash_1)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001175 # Our fake HEAD rev is r2, so this should call git fetch and git svn fetch
1176 # to get more revs (pymox will complain if this doesn't happen). We mock an
1177 # optimized checkout the first time, so this run should call git fetch.
1178 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1179 self.fake_hash_2)
1180 # The time we pretend we're not optimized, so no git fetch should fire.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001181 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1182 self.fake_hash_2)
1183 # Given a git sha1 with a git-svn checkout, it should be used as is.
1184 self.assertEquals(git_svn_scm.GetUsableRev(self.fake_hash_1, options),
1185 self.fake_hash_1)
1186 # We currently check for seemingly valid SVN revisions by assuming 6 digit
1187 # numbers, so assure that numeric revs >= 1000000 don't work.
1188 self.assertRaises(gclient_scm.gclient_utils.Error,
1189 git_svn_scm.GetUsableRev, too_big, options)
1190
1191
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001192class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001193 def testUpdateUpdate(self):
1194 if not self.enabled:
1195 return
1196 options = self.Options()
1197 expected_file_list = []
1198 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1199 relpath=self.relpath)
1200 file_list = []
1201 options.revision = 'unmanaged'
1202 scm.update(options, (), file_list)
1203 self.assertEquals(file_list, expected_file_list)
1204 self.assertEquals(scm.revinfo(options, (), None),
1205 '069c602044c5388d2d15c3f875b057c852003458')
1206 self.checkstdout('________ unmanaged solution; skipping .\n')
1207
1208
msb@chromium.orge28e4982009-09-25 20:51:45 +00001209if __name__ == '__main__':
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001210 if '-v' in sys.argv:
1211 logging.basicConfig(
1212 level=logging.DEBUG,
1213 format='%(asctime).19s %(levelname)s %(filename)s:'
1214 '%(lineno)s %(message)s')
msb@chromium.orge28e4982009-09-25 20:51:45 +00001215 unittest.main()
1216
1217# vim: ts=2:sw=2:tw=80:et: