blob: 99007b09b3b7ea01f61adb7f9dacef0994fc91ed [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',
borenet@google.comb75a8352014-01-17 01:08:40 +0000105 'GetRemoteURL',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000106 'GetRevisionDate',
107 'GetUsableRev',
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000108 'Svnversion',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000109 'RunCommand',
110 'cleanup',
111 'diff',
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000112 'name',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000113 'pack',
114 'relpath',
115 'revert',
116 'revinfo',
117 'runhooks',
118 'status',
119 'update',
120 'updatesingle',
121 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000122 ]
123
124 # If you add a member, be sure to add the relevant test!
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000125 self.compareMembers(self._scm_wrapper('svn://a'), members)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000126
127 def testUnsupportedSCM(self):
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000128 args = ['gopher://foo', self.root_dir, self.relpath]
129 exception_msg = 'No SCM found for url gopher://foo'
130 self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000131
msb@chromium.orge6f78352010-01-13 17:05:33 +0000132 def testSVNFullUrlForRelativeUrl(self):
133 self.url = 'svn://a/b/c/d'
134
135 self.mox.ReplayAll()
136 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
137 relpath=self.relpath)
138 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
139
140 def testGITFullUrlForRelativeUrl(self):
141 self.url = 'git://a/b/c/d'
142
143 self.mox.ReplayAll()
144 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
145 relpath=self.relpath)
146 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
147
igorgatis@gmail.com4e075672011-11-21 16:35:08 +0000148 def testGITFakeHttpUrl(self):
149 self.url = 'git+http://foo'
150
151 self.mox.ReplayAll()
152 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
153 relpath=self.relpath)
154 self.assertEqual(scm.url, 'http://foo')
155
156 def testGITFakeHttpsUrl(self):
157 self.url = 'git+https://foo'
158
159 self.mox.ReplayAll()
160 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
161 relpath=self.relpath)
162 self.assertEqual(scm.url, 'https://foo')
163
msb@chromium.orge28e4982009-09-25 20:51:45 +0000164 def testRunCommandException(self):
165 options = self.Options(verbose=False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000166
167 self.mox.ReplayAll()
168 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
169 relpath=self.relpath)
170 exception = "Unsupported argument(s): %s" % ','.join(self.args)
171 self.assertRaisesError(exception, scm.RunCommand,
172 'update', options, self.args)
173
174 def testRunCommandUnknown(self):
175 # TODO(maruel): if ever used.
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000176 pass
msb@chromium.orge28e4982009-09-25 20:51:45 +0000177
178 def testRevertMissing(self):
179 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000180 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000181 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000182 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
183 ).AndReturn('1.5.1')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000184 # It'll to a checkout instead.
msb@chromium.orge28e4982009-09-25 20:51:45 +0000185 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000186 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000187 parent = gclient_scm.os.path.dirname(self.base_path)
188 gclient_scm.os.path.exists(parent).AndReturn(False)
189 gclient_scm.os.makedirs(parent)
190 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000191 files_list = self.mox.CreateMockAnything()
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000192 gclient_scm.scm.SVN.RunAndGetFileList(
193 options.verbose,
194 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
195 cwd=self.root_dir,
196 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000197
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000198 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
199 ).AndReturn({'Revision': 100})
200
msb@chromium.orge28e4982009-09-25 20:51:45 +0000201 self.mox.ReplayAll()
202 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
203 relpath=self.relpath)
204 scm.revert(options, self.args, files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000205 self.checkstdout(
206 ('\n_____ %s is missing, synching instead\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000207
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000208 def testRevertNoDotSvn(self):
209 options = self.Options(verbose=True, force=True)
210 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
211 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(False)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000212 # Checkout.
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000213 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000214 parent = gclient_scm.os.path.dirname(self.base_path)
215 gclient_scm.os.path.exists(parent).AndReturn(False)
216 gclient_scm.os.makedirs(parent)
217 gclient_scm.os.path.exists(parent).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000218 files_list = self.mox.CreateMockAnything()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000219 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
220 ).AndReturn('1.6')
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000221 gclient_scm.scm.SVN.RunAndGetFileList(
222 options.verbose,
223 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
224 cwd=self.root_dir,
225 file_list=files_list)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000226 gclient_scm.gclient_utils.rmtree(self.base_path)
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000227 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
228 ).AndReturn({'Revision': 100})
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000229 self.mox.ReplayAll()
230 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
231 relpath=self.relpath)
232 scm.revert(options, self.args, files_list)
233 self.checkstdout(
234 '\n_____ %s is not a valid svn checkout, synching instead\n' %
235 self.relpath)
236
msb@chromium.orge28e4982009-09-25 20:51:45 +0000237 def testRevertNone(self):
238 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000239 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000240 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000241 gclient_scm.scm.SVN.CaptureStatus(
242 None, self.base_path, no_ignore=False).AndReturn([])
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000243 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000244 gclient_scm.scm.SVN.RunAndGetFileList(
245 options.verbose,
246 ['update', '--revision', 'BASE', '--ignore-externals'],
247 cwd=self.base_path,
248 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000249
250 self.mox.ReplayAll()
251 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
252 relpath=self.relpath)
253 file_list = []
254 scm.revert(options, self.args, file_list)
255
msb@chromium.orge28e4982009-09-25 20:51:45 +0000256 def testRevertDirectory(self):
257 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000258 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000259 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000260 items = [
261 ('~ ', 'a'),
262 ]
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000263 gclient_scm.scm.SVN.CaptureStatus(
264 None, self.base_path, no_ignore=False).AndReturn(items)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000265 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000266 gclient_scm.os.path.exists(file_path).AndReturn(True)
267 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000268 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000269 gclient_scm.os.path.isdir(file_path).AndReturn(True)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000270 gclient_scm.gclient_utils.rmtree(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000271 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000272 gclient_scm.scm.SVN.RunAndGetFileList(
273 options.verbose,
274 ['update', '--revision', 'BASE', '--ignore-externals'],
275 cwd=self.base_path,
276 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000277
278 self.mox.ReplayAll()
279 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
280 relpath=self.relpath)
281 file_list2 = []
282 scm.revert(options, self.args, file_list2)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000283 self.checkstdout(('%s\n' % file_path))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000284
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000285 def testRevertDot(self):
286 self.mox.StubOutWithMock(gclient_scm.SVNWrapper, 'update')
287 options = self.Options(verbose=True)
288 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
289 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
290 items = [
291 ('~ ', '.'),
292 ]
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000293 gclient_scm.scm.SVN.CaptureStatus(
294 None, self.base_path, no_ignore=False).AndReturn(items)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000295 # gclient_utils.rmtree() doesn't work on path ending with '.', like 'foo/.'.
maruel@chromium.org62087572012-04-24 23:16:28 +0000296 file_path = self.base_path
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000297 gclient_scm.os.path.exists(file_path).AndReturn(True)
298 gclient_scm.os.path.isfile(file_path).AndReturn(False)
299 gclient_scm.os.path.islink(file_path).AndReturn(False)
300 gclient_scm.os.path.isdir(file_path).AndReturn(True)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000301 gclient_scm.gclient_utils.rmtree(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000302 # pylint: disable=E1120
maruel@chromium.org428342a2011-11-10 15:46:33 +0000303 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000304 gclient_scm.SVNWrapper.update(options, [], ['.'])
305
306 self.mox.ReplayAll()
307 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
308 relpath=self.relpath)
309 file_list2 = []
310 scm.revert(options, self.args, file_list2)
maruel@chromium.org62087572012-04-24 23:16:28 +0000311 self.checkstdout(('%s\n' % os.path.join(file_path, '.')))
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000312
msb@chromium.orge28e4982009-09-25 20:51:45 +0000313 def testStatus(self):
314 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000315 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000316 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000317 options.verbose,
318 ['status'] + self.args + ['--ignore-externals'],
319 cwd=self.base_path,
320 file_list=[]).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000321
322 self.mox.ReplayAll()
323 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
324 relpath=self.relpath)
325 file_list = []
326 self.assertEqual(scm.status(options, self.args, file_list), None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000327
328 # TODO(maruel): TEST REVISIONS!!!
329 # TODO(maruel): TEST RELOCATE!!!
330 def testUpdateCheckout(self):
331 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000332 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000333 file_info.root = 'blah'
334 file_info.url = self.url
335 file_info.uuid = 'ABC'
336 file_info.revision = 42
msb@chromium.orge28e4982009-09-25 20:51:45 +0000337 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000338 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000339 parent = gclient_scm.os.path.dirname(self.base_path)
340 gclient_scm.os.path.exists(parent).AndReturn(False)
341 gclient_scm.os.makedirs(parent)
342 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000343 files_list = self.mox.CreateMockAnything()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000344 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
345 ).AndReturn('1.5.1')
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000346 gclient_scm.scm.SVN.RunAndGetFileList(
347 options.verbose,
348 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
349 cwd=self.root_dir,
350 file_list=files_list)
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000351 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
352 ).AndReturn({'Revision': 100})
msb@chromium.orge28e4982009-09-25 20:51:45 +0000353 self.mox.ReplayAll()
354 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
355 relpath=self.relpath)
356 scm.update(options, (), files_list)
357
358 def testUpdateUpdate(self):
359 options = self.Options(verbose=True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000360 options.force = True
361 options.nohooks = False
362 file_info = {
363 'Repository Root': 'blah',
364 'URL': self.url,
365 'UUID': 'ABC',
366 'Revision': 42,
367 }
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000368 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000369
msb@chromium.orge28e4982009-09-25 20:51:45 +0000370 # Checkout or update.
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000371 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000372 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000373
374 # Verify no locked files.
375 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
376
msb@chromium.orge28e4982009-09-25 20:51:45 +0000377 # Cheat a bit here.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000378 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
379 ).AndReturn(file_info)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000380
381 # _AddAdditionalUpdateFlags()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000382 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
383 ).AndReturn('1.5.1')
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000384
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000385 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
386 ).AndReturn({'Revision': 100})
387
msb@chromium.orge28e4982009-09-25 20:51:45 +0000388 additional_args = []
389 if options.manually_grab_svn_rev:
390 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000391 additional_args.extend(['--force', '--ignore-externals'])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000392 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000393 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000394 options.verbose,
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000395 ['update', self.base_path] + additional_args,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000396 cwd=self.root_dir, file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000397
398 self.mox.ReplayAll()
399 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
400 relpath=self.relpath)
401 scm.update(options, (), files_list)
402
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000403 def testUpdateReset(self):
404 options = self.Options(verbose=True)
405 options.reset = True
406 file_info = {
407 'Repository Root': 'blah',
408 'URL': self.url,
409 'UUID': 'ABC',
410 'Revision': 42,
411 }
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000412 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
413
414 # Checkout or update.
415 dotted_path = join(self.base_path, '.')
416 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
417
418 # Create an untracked file and directory.
419 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
420 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
421
422 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
423 ).AndReturn(file_info)
424
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000425 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
426 ).AndReturn({'Revision': 100})
427
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000428 self.mox.ReplayAll()
429 files_list = []
430 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
431 relpath=self.relpath)
432 scm.update(options, (), files_list)
433 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
434
435 def testUpdateResetDeleteUnversionedTrees(self):
436 options = self.Options(verbose=True)
437 options.reset = True
438 options.delete_unversioned_trees = True
439
440 file_info = {
441 'Repository Root': 'blah',
442 'URL': self.url,
443 'UUID': 'ABC',
444 'Revision': 42,
445 }
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000446 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
447
448 # Checkout or update.
449 dotted_path = join(self.base_path, '.')
450 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
451
452 # Create an untracked file and directory.
453 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
454 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
455
456 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
457 ).AndReturn(file_info)
458
459 # Confirm that the untracked file is removed.
460 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path
461 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
462 gclient_scm.os.path.isdir(join(self.base_path, 'dir')).AndReturn(True)
463 gclient_scm.os.path.isdir(join(self.base_path, 'file')).AndReturn(False)
464 gclient_scm.os.path.islink(join(self.base_path, 'dir')).AndReturn(False)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000465 gclient_scm.gclient_utils.rmtree(join(self.base_path, 'dir'))
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000466
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000467 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
468 ).AndReturn({'Revision': 100})
469
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000470 self.mox.ReplayAll()
471 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
472 relpath=self.relpath)
473 files_list = []
474 scm.update(options, (), files_list)
475 self.checkstdout(
476 ('\n_____ %s at 42\n'
477 '\n_____ removing unversioned directory dir\n') % self.relpath)
478
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000479 def testUpdateSingleCheckout(self):
480 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000481 file_info = {
482 'URL': self.url,
483 'Revision': 42,
484 }
tony@chromium.org57564662010-04-14 02:35:12 +0000485
486 # Checks to make sure that we support svn co --depth.
487 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000488 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
489 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000490 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
491 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000492
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000493 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000494 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000495 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000496
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000497 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000498 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000499 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000500 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000501 always=True,
502 cwd=self.root_dir)
503 gclient_scm.scm.SVN.RunAndGetFileList(
504 options.verbose,
505 ['update', 'DEPS', '--ignore-externals'],
506 cwd=self.base_path,
507 file_list=files_list)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000508
509 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000510 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000511 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
512 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
513 ).AndReturn(file_info)
tony@chromium.org57564662010-04-14 02:35:12 +0000514
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000515 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
516 ).AndReturn({'Revision': 100})
517
tony@chromium.org57564662010-04-14 02:35:12 +0000518 self.mox.ReplayAll()
519 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
520 relpath=self.relpath)
521 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000522 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org57564662010-04-14 02:35:12 +0000523
524 def testUpdateSingleCheckoutSVN14(self):
525 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000526
527 # Checks to make sure that we support svn co --depth.
528 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000529 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
530 ).AndReturn('1.4.4')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000531 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org57564662010-04-14 02:35:12 +0000532
533 # When checking out a single file with svn 1.4, we use svn export
534 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000535 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000536 ['svn', 'export', join(self.url, 'DEPS'), join(self.base_path, 'DEPS')],
scottmg@chromium.orgf547c802013-09-27 17:55:26 +0000537 always=True, cwd=self.root_dir)
tony@chromium.org57564662010-04-14 02:35:12 +0000538
539 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)
543
544 def testUpdateSingleCheckoutSVNUpgrade(self):
545 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000546 file_info = {
547 'URL': self.url,
548 'Revision': 42,
549 }
550
551 # Checks to make sure that we support svn co --depth.
552 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000553 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
554 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000555 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000556 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
557 # the old DEPS file.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000558 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(True)
559 gclient_scm.os.remove(join(self.base_path, 'DEPS'))
tony@chromium.org57564662010-04-14 02:35:12 +0000560
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000561 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000562 gclient_scm.scm.SVN.CaptureStatus(
563 None, join(self.base_path, '.')).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000564
tony@chromium.org57564662010-04-14 02:35:12 +0000565 # When checking out a single file, we issue an svn checkout and svn update.
566 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000567 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000568 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000569 always=True,
570 cwd=self.root_dir)
571 gclient_scm.scm.SVN.RunAndGetFileList(
572 options.verbose,
573 ['update', 'DEPS', '--ignore-externals'],
574 cwd=self.base_path,
575 file_list=files_list)
tony@chromium.org57564662010-04-14 02:35:12 +0000576
577 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000578 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000579 gclient_scm.scm.SVN._CaptureInfo(
580 [], join(self.base_path, ".")).AndReturn(file_info)
581 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
582 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000583
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000584 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
585 ).AndReturn({'Revision': 100})
586
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000587 self.mox.ReplayAll()
588 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
589 relpath=self.relpath)
590 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000591 self.checkstdout(
592 ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000593
594 def testUpdateSingleUpdate(self):
595 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000596 file_info = {
597 'URL': self.url,
598 'Revision': 42,
599 }
tony@chromium.org57564662010-04-14 02:35:12 +0000600 # Checks to make sure that we support svn co --depth.
601 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000602 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
603 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000604 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000605
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000606 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000607 gclient_scm.scm.SVN.CaptureStatus(None, join(self.base_path, '.')
608 ).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000609
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000610 # Now we fall back on scm.update().
611 files_list = self.mox.CreateMockAnything()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000612 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000613 gclient_scm.scm.SVN._CaptureInfo(
614 [], join(self.base_path, '.')).AndReturn(file_info)
615 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
616 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000617
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000618 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
619 ).AndReturn({'Revision': 100})
620
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000621 self.mox.ReplayAll()
622 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
623 relpath=self.relpath)
624 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000625 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000626
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000627 def testGetUsableRevSVN(self):
628 # pylint: disable=E1101
629 options = self.Options(verbose=True)
630
631 # Mock SVN revision validity checking.
632 self.mox.StubOutWithMock(
633 gclient_scm.scm.SVN, 'IsValidRevision', True)
634 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 1)
635 ).AndReturn(True)
636 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 'fake')
637 ).AndReturn(False)
638
639 self.mox.ReplayAll()
640
641 svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir)
642 # With an SVN checkout, 1 an example of a valid usable rev.
643 self.assertEquals(svn_scm.GetUsableRev(1, options), 1)
644 # With an SVN checkout, a fake or unknown rev should raise an excpetion.
645 self.assertRaises(gclient_scm.gclient_utils.Error,
646 svn_scm.GetUsableRev, 'fake', options)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000647
borenet@google.comb75a8352014-01-17 01:08:40 +0000648 def testGetRemoteURL(self):
649 self.mox.UnsetStubs()
650 options = self.Options(verbose=True)
651 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture', True)
652 svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
653 relpath=self.relpath)
654
655 if svn_scm.relpath:
656 cwd = os.path.join(svn_scm._root_dir, svn_scm.relpath)
657 else:
658 cwd = svn_scm._root_dir
659
660 gclient_scm.scm.SVN.Capture(['info', '--xml', os.curdir], cwd).AndReturn(
661"""<?xml version="1.0"?>
662<info>
663<entry
664 path="."
665 revision="1234"
666 kind="dir">
667<url>%s</url>
668<repository>
669<root>https://dummy.repo.com/svn</root>
670<uuid>FAKE</uuid>
671</repository>
672<wc-info>
673<schedule>normal</schedule>
674<depth>infinity</depth>
675</wc-info>
676<commit
677 revision="1234">
678<author>fakedev@chromium.org</author>
679<date>2013-11-14T15:08:21.757885Z</date>
680</commit>
681</entry>
682</info>
683""" % svn_scm.url)
684
685 self.mox.ReplayAll()
686
687 self.assertEquals(svn_scm.GetRemoteURL(options), self.url)
688
689
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000690class BaseGitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
691 unittest.TestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000692 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000693 class OptionsObject(object):
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000694 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000695 self.verbose = verbose
696 self.revision = revision
697 self.manually_grab_svn_rev = True
698 self.deps_os = None
699 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000700 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000701 self.nohooks = False
iannucci@chromium.orgd4fffee2013-06-28 00:35:26 +0000702 self.upstream = False
iannucci@chromium.org53456aa2013-07-03 19:38:34 +0000703 self.cache_dir = None
bauerb@chromium.org4dd09372011-07-22 14:41:51 +0000704 self.merge = False
bratell@opera.com18fa4542013-05-21 13:30:46 +0000705 self.jobs = 1
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000706 self.delete_unversioned_trees = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000707
708 sample_git_import = """blob
709mark :1
710data 6
711Hello
712
713blob
714mark :2
715data 4
716Bye
717
718reset refs/heads/master
719commit refs/heads/master
720mark :3
721author Bob <bob@example.com> 1253744361 -0700
722committer Bob <bob@example.com> 1253744361 -0700
723data 8
724A and B
725M 100644 :1 a
726M 100644 :2 b
727
728blob
729mark :4
730data 10
731Hello
732You
733
734blob
735mark :5
736data 8
737Bye
738You
739
740commit refs/heads/origin
741mark :6
742author Alice <alice@example.com> 1253744424 -0700
743committer Alice <alice@example.com> 1253744424 -0700
744data 13
745Personalized
746from :3
747M 100644 :4 a
748M 100644 :5 b
749
750reset refs/heads/master
751from :3
752"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000753 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000754 return self.OptionsObject(*args, **kwargs)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000755
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000756 @staticmethod
757 def CreateGitRepo(git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000758 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000759 try:
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000760 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000761 cwd=path).communicate()
762 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000763 # git is not available, skip this test.
764 return False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000765 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
766 stderr=STDOUT, cwd=path).communicate(input=git_import)
767 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
768 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000769 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000770 stderr=STDOUT, cwd=path).communicate()
771 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
772 stderr=STDOUT, cwd=path).communicate()
773 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
774 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000775 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000776 stderr=STDOUT, cwd=path).communicate()
iannucci@chromium.org1e7187a2013-02-17 20:54:05 +0000777 Popen(['git', 'config', 'user.email', 'someuser@chromium.org'], stdout=PIPE,
778 stderr=STDOUT, cwd=path).communicate()
779 Popen(['git', 'config', 'user.name', 'Some User'], stdout=PIPE,
780 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000781 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000782
msb@chromium.orge28e4982009-09-25 20:51:45 +0000783 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000784 TestCaseUtils.setUp(self)
785 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000786 self.url = 'git://foo'
787 self.root_dir = tempfile.mkdtemp()
788 self.relpath = '.'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000789 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000790 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000791 StdoutCheck.setUp(self)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000792 self._original_GitBinaryExists = gclient_scm.GitWrapper.BinaryExists
793 self._original_SVNBinaryExists = gclient_scm.SVNWrapper.BinaryExists
794 gclient_scm.GitWrapper.BinaryExists = staticmethod(lambda : True)
795 gclient_scm.SVNWrapper.BinaryExists = staticmethod(lambda : True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000796
797 def tearDown(self):
maruel@chromium.org1a60dca2013-11-26 14:06:26 +0000798 try:
799 rmtree(self.root_dir)
800 StdoutCheck.tearDown(self)
801 TestCaseUtils.tearDown(self)
802 unittest.TestCase.tearDown(self)
803 finally:
804 # TODO(maruel): Use auto_stub.TestCase.
805 gclient_scm.GitWrapper.BinaryExists = self._original_GitBinaryExists
806 gclient_scm.SVNWrapper.BinaryExists = self._original_SVNBinaryExists
807
msb@chromium.orge28e4982009-09-25 20:51:45 +0000808
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000809class ManagedGitWrapperTestCase(BaseGitWrapperTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000810 def testDir(self):
811 members = [
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000812 'BinaryExists',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000813 'FullUrlForRelativeUrl',
xusydoc@chromium.org885a9602013-05-31 09:54:40 +0000814 'GetCheckoutRoot',
borenet@google.comb75a8352014-01-17 01:08:40 +0000815 'GetRemoteURL',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000816 'GetRevisionDate',
817 'GetUsableRev',
818 'RunCommand',
iannucci@chromium.org53456aa2013-07-03 19:38:34 +0000819 'cache_dir',
820 'cache_locks',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000821 'cleanup',
822 'diff',
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000823 'name',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000824 'pack',
szager@chromium.orgd4af6622012-06-04 22:13:55 +0000825 'UpdateSubmoduleConfig',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000826 'relpath',
maruel@chromium.org1a60dca2013-11-26 14:06:26 +0000827 'remote',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000828 'revert',
829 'revinfo',
830 'runhooks',
831 'status',
832 'update',
833 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000834 ]
835
836 # If you add a member, be sure to add the relevant test!
837 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
838
839 def testRevertMissing(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()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000843 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000844 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
845 relpath=self.relpath)
846 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000847 scm.update(options, None, file_list)
848 gclient_scm.os.remove(file_path)
849 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000850 scm.revert(options, self.args, file_list)
851 self.assertEquals(file_list, [file_path])
852 file_list = []
853 scm.diff(options, self.args, file_list)
854 self.assertEquals(file_list, [])
szager@google.com85d3e3a2011-10-07 17:12:00 +0000855 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000856
857 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000858 if not self.enabled:
859 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000860 options = self.Options()
861 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
862 relpath=self.relpath)
863 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000864 scm.update(options, None, file_list)
865 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000866 scm.revert(options, self.args, file_list)
867 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000868 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000869 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000870 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000871
872 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000873 if not self.enabled:
874 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000875 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000876 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
877 relpath=self.relpath)
878 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000879 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000880 file_path = join(self.base_path, 'a')
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000881 open(file_path, 'a').writelines('touched\n')
882 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000883 scm.revert(options, self.args, file_list)
884 self.assertEquals(file_list, [file_path])
885 file_list = []
886 scm.diff(options, self.args, file_list)
887 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000888 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000889 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000890 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000891
892 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000893 if not self.enabled:
894 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000895 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000896 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
897 relpath=self.relpath)
898 file_list = []
899 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000900 file_path = join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000901 f = open(file_path, 'w')
902 f.writelines('new\n')
903 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000904 Popen(['git', 'add', 'c'], stdout=PIPE,
905 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000906 file_list = []
907 scm.revert(options, self.args, file_list)
908 self.assertEquals(file_list, [file_path])
909 file_list = []
910 scm.diff(options, self.args, file_list)
911 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000912 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000913 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000914 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000915
916 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000917 if not self.enabled:
918 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000919 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000920 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000921 open(file_path, 'a').writelines('touched\n')
922 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
923 relpath=self.relpath)
924 file_list = []
925 scm.status(options, self.args, file_list)
926 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000927 self.checkstdout(
928 ('\n________ running \'git diff --name-status '
929 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000930 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000931
932 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000933 if not self.enabled:
934 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000935 options = self.Options()
936 expected_file_list = []
937 for f in ['a', 'b']:
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000938 file_path = join(self.base_path, f)
939 open(file_path, 'a').writelines('touched\n')
940 expected_file_list.extend([file_path])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000941 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
942 relpath=self.relpath)
943 file_list = []
944 scm.status(options, self.args, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000945 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000946 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000947 self.checkstdout(
948 ('\n________ running \'git diff --name-status '
949 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000950 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000951
msb@chromium.orge28e4982009-09-25 20:51:45 +0000952 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000953 if not self.enabled:
954 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000955 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000956 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000957 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
958 relpath=self.relpath)
959 file_list = []
960 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000961 self.assertEquals(file_list, expected_file_list)
962 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000963 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000964 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000965
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000966 def testUpdateReset(self):
967 if not self.enabled:
968 return
969 options = self.Options()
970 options.reset = True
971
972 dir_path = join(self.base_path, 'c')
973 os.mkdir(dir_path)
974 open(join(dir_path, 'nested'), 'w').writelines('new\n')
975
976 file_path = join(self.base_path, 'file')
977 open(file_path, 'w').writelines('new\n')
978
979 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
980 relpath=self.relpath)
981 file_list = []
982 scm.update(options, (), file_list)
983 self.assert_(gclient_scm.os.path.isdir(dir_path))
984 self.assert_(gclient_scm.os.path.isfile(file_path))
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000985 sys.stdout.close()
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000986
987 def testUpdateResetDeleteUnversionedTrees(self):
988 if not self.enabled:
989 return
990 options = self.Options()
991 options.reset = True
992 options.delete_unversioned_trees = True
993
994 dir_path = join(self.base_path, 'dir')
995 os.mkdir(dir_path)
996 open(join(dir_path, 'nested'), 'w').writelines('new\n')
997
998 file_path = join(self.base_path, 'file')
999 open(file_path, 'w').writelines('new\n')
1000
1001 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1002 relpath=self.relpath)
1003 file_list = []
1004 scm.update(options, (), file_list)
1005 self.assert_(not gclient_scm.os.path.isdir(dir_path))
1006 self.assert_(gclient_scm.os.path.isfile(file_path))
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +00001007 sys.stdout.close()
steveblock@chromium.org98e69452012-02-16 16:36:43 +00001008
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +00001009 def testUpdateUnstagedConflict(self):
1010 if not self.enabled:
1011 return
1012 options = self.Options()
1013 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1014 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001015 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001016 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001017 try:
1018 scm.update(options, (), [])
1019 self.fail()
maruel@chromium.orgfae707b2011-09-15 18:57:58 +00001020 except (gclient_scm.gclient_utils.Error, subprocess2.CalledProcessError):
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001021 # The exact exception text varies across git versions so it's not worth
1022 # verifying it. It's fine as long as it throws.
1023 pass
1024 # Manually flush stdout since we can't verify it's content accurately across
1025 # git versions.
1026 sys.stdout.getvalue()
1027 sys.stdout.close()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +00001028
msb@chromium.org5bde4852009-12-14 16:47:12 +00001029 def testUpdateConflict(self):
1030 if not self.enabled:
1031 return
1032 options = self.Options()
1033 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1034 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001035 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001036 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001037 scm._Run(['commit', '-am', 'test'], options)
1038 __builtin__.raw_input = lambda x: 'y'
1039 exception = ('Conflict while rebasing this branch.\n'
1040 'Fix the conflict and run gclient again.\n'
1041 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001042 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org1a60dca2013-11-26 14:06:26 +00001043 exception = ('\n____ . at refs/remotes/origin/master\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001044 '\tYou have unstaged changes.\n'
1045 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001046 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +00001047 sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +00001048
msb@chromium.org0f282062009-11-06 20:14:02 +00001049 def testRevinfo(self):
1050 if not self.enabled:
1051 return
1052 options = self.Options()
1053 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1054 relpath=self.relpath)
1055 rev_info = scm.revinfo(options, (), None)
1056 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
1057
msb@chromium.orge28e4982009-09-25 20:51:45 +00001058
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001059class ManagedGitWrapperTestCaseMox(BaseTestCase):
1060 class OptionsObject(object):
1061 def __init__(self, verbose=False, revision=None, force=False):
1062 self.verbose = verbose
1063 self.revision = revision
1064 self.deps_os = None
1065 self.force = force
1066 self.reset = False
1067 self.nohooks = False
1068 # TODO(maruel): Test --jobs > 1.
1069 self.jobs = 1
1070
1071 def Options(self, *args, **kwargs):
1072 return self.OptionsObject(*args, **kwargs)
1073
1074 def setUp(self):
1075 BaseTestCase.setUp(self)
1076 self.fake_hash_1 = 't0ta11yf4k3'
1077 self.fake_hash_2 = '3v3nf4k3r'
1078 self.url = 'git://foo'
maruel@chromium.org97170132013-05-08 14:58:34 +00001079 self.root_dir = '/tmp' if sys.platform != 'win32' else 't:\\tmp'
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001080 self.relpath = 'fake'
1081 self.base_path = os.path.join(self.root_dir, self.relpath)
1082
1083 def tearDown(self):
1084 BaseTestCase.tearDown(self)
1085
1086 def testGetUsableRevGit(self):
1087 # pylint: disable=E1101
1088 options = self.Options(verbose=True)
1089
1090 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1091 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1092 ).AndReturn(True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001093
1094 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1095 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1096 ).AndReturn(False)
1097
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001098 gclient_scm.scm.os.path.isdir(self.base_path).AndReturn(True)
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001099 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001100
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001101 self.mox.ReplayAll()
1102
1103 git_scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1104 relpath=self.relpath)
1105 # A [fake] git sha1 with a git repo should work (this is in the case that
1106 # the LKGR gets flipped to git sha1's some day).
1107 self.assertEquals(git_scm.GetUsableRev(self.fake_hash_1, options),
1108 self.fake_hash_1)
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001109 # An SVN rev with an existing purely git repo should raise an exception.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001110 self.assertRaises(gclient_scm.gclient_utils.Error,
1111 git_scm.GetUsableRev, '1', options)
1112
1113 def testGetUsableRevGitSvn(self):
1114 # pylint: disable=E1101
1115 options = self.Options()
1116 too_big = str(1e7)
1117
1118 # Pretend like the git-svn repo's HEAD is at r2.
1119 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetGitSvnHeadRev', True)
1120 gclient_scm.scm.GIT.GetGitSvnHeadRev(cwd=self.base_path).MultipleTimes(
1121 ).AndReturn(2)
1122
szager@chromium.orgc51def32012-10-15 18:50:37 +00001123 self.mox.StubOutWithMock(
1124 gclient_scm.scm.GIT, 'GetBlessedSha1ForSvnRev', True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001125 # r1 -> first fake hash, r3 -> second fake hash.
szager@chromium.orgc51def32012-10-15 18:50:37 +00001126 gclient_scm.scm.GIT.GetBlessedSha1ForSvnRev(cwd=self.base_path, rev='1'
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001127 ).AndReturn(self.fake_hash_1)
szager@chromium.orgc51def32012-10-15 18:50:37 +00001128 gclient_scm.scm.GIT.GetBlessedSha1ForSvnRev(cwd=self.base_path, rev='3'
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001129 ).MultipleTimes().AndReturn(self.fake_hash_2)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001130
1131 # Ensure that we call git svn fetch if our LKGR is > the git-svn HEAD rev.
1132 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'Capture', True)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001133 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1134 cwd=self.base_path).AndReturn('blah')
1135 gclient_scm.scm.GIT.Capture(['fetch'], cwd=self.base_path)
1136 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
1137 error = subprocess2.CalledProcessError(1, 'cmd', '/cwd', 'stdout', 'stderr')
1138 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1139 cwd=self.base_path).AndRaise(error)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001140 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001141 gclient_scm.scm.GIT.Capture(['fetch', 'origin'], cwd=self.base_path)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001142
1143 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1144 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1145 ).AndReturn(True)
1146
1147 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1148 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1149 ).AndReturn(True)
1150 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=too_big
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001151 ).MultipleTimes(2).AndReturn(False)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001152
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001153 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
1154 gclient_scm.os.path.isdir(self.base_path).MultipleTimes().AndReturn(True)
1155
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001156 self.mox.ReplayAll()
1157
1158 git_svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
1159 relpath=self.relpath)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001160 # Without an existing checkout, this should fail.
1161 # TODO(dbeam) Fix this. http://crbug.com/109184
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001162 self.assertRaises(gclient_scm.gclient_utils.Error,
1163 git_svn_scm.GetUsableRev, '1', options)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001164 # Given an SVN revision with a git-svn checkout, it should be translated to
1165 # a git sha1 and be usable.
1166 self.assertEquals(git_svn_scm.GetUsableRev('1', options),
1167 self.fake_hash_1)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001168 # Our fake HEAD rev is r2, so this should call git fetch and git svn fetch
1169 # to get more revs (pymox will complain if this doesn't happen). We mock an
1170 # optimized checkout the first time, so this run should call git fetch.
1171 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1172 self.fake_hash_2)
1173 # The time we pretend we're not optimized, so no git fetch should fire.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001174 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1175 self.fake_hash_2)
1176 # Given a git sha1 with a git-svn checkout, it should be used as is.
1177 self.assertEquals(git_svn_scm.GetUsableRev(self.fake_hash_1, options),
1178 self.fake_hash_1)
1179 # We currently check for seemingly valid SVN revisions by assuming 6 digit
1180 # numbers, so assure that numeric revs >= 1000000 don't work.
1181 self.assertRaises(gclient_scm.gclient_utils.Error,
1182 git_svn_scm.GetUsableRev, too_big, options)
1183
borenet@google.comb75a8352014-01-17 01:08:40 +00001184 def testGetRemoteURL(self):
1185 options = self.Options(verbose=True)
1186 self.mox.StubOutWithMock(gclient_scm.GitWrapper, '_Capture', True)
1187 git_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
1188 relpath=self.relpath)
1189 git_scm._Capture(['config', 'remote.origin.url'], cwd='/tmp/fake'
1190 ).AndReturn('%s\n' % git_scm.url)
1191
1192 self.mox.ReplayAll()
1193
1194 self.assertEquals(git_scm.GetRemoteURL(options), self.url)
1195
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001196
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001197class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001198 def testUpdateUpdate(self):
1199 if not self.enabled:
1200 return
1201 options = self.Options()
1202 expected_file_list = []
1203 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1204 relpath=self.relpath)
1205 file_list = []
1206 options.revision = 'unmanaged'
1207 scm.update(options, (), file_list)
1208 self.assertEquals(file_list, expected_file_list)
1209 self.assertEquals(scm.revinfo(options, (), None),
1210 '069c602044c5388d2d15c3f875b057c852003458')
1211 self.checkstdout('________ unmanaged solution; skipping .\n')
1212
1213
msb@chromium.orge28e4982009-09-25 20:51:45 +00001214if __name__ == '__main__':
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001215 if '-v' in sys.argv:
1216 logging.basicConfig(
1217 level=logging.DEBUG,
1218 format='%(asctime).19s %(levelname)s %(filename)s:'
1219 '%(lineno)s %(message)s')
msb@chromium.orge28e4982009-09-25 20:51:45 +00001220 unittest.main()
1221
1222# vim: ts=2:sw=2:tw=80:et: