blob: f9a29bbfa46136edd695951b64cc64d0b9a25097 [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.
11from os import rename
12from shutil import rmtree
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000013from subprocess import Popen, PIPE, STDOUT
maruel@chromium.org428342a2011-11-10 15:46:33 +000014
15import logging
16import os
17import sys
msb@chromium.orge28e4982009-09-25 20:51:45 +000018import tempfile
maruel@chromium.org389d6de2010-09-09 14:14:37 +000019import unittest
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +000020import __builtin__
msb@chromium.orge28e4982009-09-25 20:51:45 +000021
maruel@chromium.org428342a2011-11-10 15:46:33 +000022sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
maruel@chromium.orgba551772010-02-03 18:21:42 +000023
maruel@chromium.org0927b7e2011-11-11 16:06:22 +000024from testing_support.super_mox import mox, StdoutCheck, SuperMoxTestBase
25from testing_support.super_mox import TestCaseUtils
maruel@chromium.org428342a2011-11-10 15:46:33 +000026
msb@chromium.orge28e4982009-09-25 20:51:45 +000027import gclient_scm
maruel@chromium.orgfae707b2011-09-15 18:57:58 +000028import subprocess2
maruel@chromium.org96913eb2010-06-01 16:22:47 +000029
maruel@chromium.org795a8c12010-10-05 19:54:29 +000030# Shortcut since this function is used often
31join = gclient_scm.os.path.join
32
maruel@chromium.org96913eb2010-06-01 16:22:47 +000033
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +000034# Access to a protected member XXX of a client class
35# pylint: disable=W0212
36
37
maruel@chromium.org389d6de2010-09-09 14:14:37 +000038class GCBaseTestCase(object):
maruel@chromium.org96913eb2010-06-01 16:22:47 +000039 def assertRaisesError(self, msg, fn, *args, **kwargs):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000040 """Like unittest's assertRaises() but checks for Gclient.Error."""
maruel@chromium.org428342a2011-11-10 15:46:33 +000041 # pylint: disable=E1101
maruel@chromium.org96913eb2010-06-01 16:22:47 +000042 try:
43 fn(*args, **kwargs)
44 except gclient_scm.gclient_utils.Error, e:
45 self.assertEquals(e.args[0], msg)
46 else:
47 self.fail('%s not raised' % msg)
msb@chromium.orge28e4982009-09-25 20:51:45 +000048
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000049
maruel@chromium.org389d6de2010-09-09 14:14:37 +000050class BaseTestCase(GCBaseTestCase, SuperMoxTestBase):
51 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000052 SuperMoxTestBase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000053 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter')
54 self.mox.StubOutWithMock(gclient_scm.gclient_utils,
55 'CheckCallAndFilterAndHeader')
56 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
57 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
digit@chromium.orgdc112ac2013-04-24 13:00:19 +000058 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'rmtree')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000059 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +000060 self.mox.StubOutWithMock(gclient_scm.scm.SVN, '_CaptureInfo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000061 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
62 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
maruel@chromium.orgfae707b2011-09-15 18:57:58 +000063 self.mox.StubOutWithMock(subprocess2, 'communicate')
64 self.mox.StubOutWithMock(subprocess2, 'Popen')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000065 self._scm_wrapper = gclient_scm.CreateSCM
maruel@chromium.org389d6de2010-09-09 14:14:37 +000066 gclient_scm.scm.SVN.current_version = None
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +000067 self._original_SVNBinaryExists = gclient_scm.SVNWrapper.BinaryExists
68 self._original_GitBinaryExists = gclient_scm.GitWrapper.BinaryExists
69 gclient_scm.SVNWrapper.BinaryExists = staticmethod(lambda : True)
70 gclient_scm.GitWrapper.BinaryExists = staticmethod(lambda : True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +000071 # Absolute path of the fake checkout directory.
72 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000073
74 def tearDown(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000075 SuperMoxTestBase.tearDown(self)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +000076 gclient_scm.SVNWrapper.BinaryExists = self._original_SVNBinaryExists
77 gclient_scm.GitWrapper.BinaryExists = self._original_GitBinaryExists
maruel@chromium.org389d6de2010-09-09 14:14:37 +000078
79
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000080class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000081 class OptionsObject(object):
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +000082 def __init__(self, verbose=False, revision=None, force=False):
msb@chromium.orge28e4982009-09-25 20:51:45 +000083 self.verbose = verbose
84 self.revision = revision
85 self.manually_grab_svn_rev = True
86 self.deps_os = None
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +000087 self.force = force
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000088 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000089 self.nohooks = False
maruel@chromium.org36ac2392011-10-12 16:36:11 +000090 # TODO(maruel): Test --jobs > 1.
91 self.jobs = 1
steveblock@chromium.org98e69452012-02-16 16:36:43 +000092 self.delete_unversioned_trees = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000093
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000094 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +000095 return self.OptionsObject(*args, **kwargs)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000096
msb@chromium.orge28e4982009-09-25 20:51:45 +000097 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000098 BaseTestCase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000099 self.url = self.SvnUrl()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000100
101 def testDir(self):
102 members = [
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000103 'BinaryExists',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000104 'FullUrlForRelativeUrl',
105 'GetRevisionDate',
106 'GetUsableRev',
107 'RunCommand',
108 'cleanup',
109 'diff',
110 'pack',
111 'relpath',
112 'revert',
113 'revinfo',
114 'runhooks',
115 'status',
116 'update',
117 'updatesingle',
118 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000119 ]
120
121 # If you add a member, be sure to add the relevant test!
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000122 self.compareMembers(self._scm_wrapper('svn://a'), members)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000123
124 def testUnsupportedSCM(self):
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000125 args = ['gopher://foo', self.root_dir, self.relpath]
126 exception_msg = 'No SCM found for url gopher://foo'
127 self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000128
msb@chromium.orge6f78352010-01-13 17:05:33 +0000129 def testSVNFullUrlForRelativeUrl(self):
130 self.url = 'svn://a/b/c/d'
131
132 self.mox.ReplayAll()
133 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
134 relpath=self.relpath)
135 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
136
137 def testGITFullUrlForRelativeUrl(self):
138 self.url = 'git://a/b/c/d'
139
140 self.mox.ReplayAll()
141 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
142 relpath=self.relpath)
143 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
144
igorgatis@gmail.com4e075672011-11-21 16:35:08 +0000145 def testGITFakeHttpUrl(self):
146 self.url = 'git+http://foo'
147
148 self.mox.ReplayAll()
149 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
150 relpath=self.relpath)
151 self.assertEqual(scm.url, 'http://foo')
152
153 def testGITFakeHttpsUrl(self):
154 self.url = 'git+https://foo'
155
156 self.mox.ReplayAll()
157 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
158 relpath=self.relpath)
159 self.assertEqual(scm.url, 'https://foo')
160
msb@chromium.orge28e4982009-09-25 20:51:45 +0000161 def testRunCommandException(self):
162 options = self.Options(verbose=False)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000163 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
164 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000165
166 self.mox.ReplayAll()
167 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
168 relpath=self.relpath)
169 exception = "Unsupported argument(s): %s" % ','.join(self.args)
170 self.assertRaisesError(exception, scm.RunCommand,
171 'update', options, self.args)
172
173 def testRunCommandUnknown(self):
174 # TODO(maruel): if ever used.
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000175 pass
msb@chromium.orge28e4982009-09-25 20:51:45 +0000176
177 def testRevertMissing(self):
178 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000179 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000180 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000181 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
182 ).AndReturn('1.5.1')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000183 # It'll to a checkout instead.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000184 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
185 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000186 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000187 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000188 parent = gclient_scm.os.path.dirname(self.base_path)
189 gclient_scm.os.path.exists(parent).AndReturn(False)
190 gclient_scm.os.makedirs(parent)
191 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000192 files_list = self.mox.CreateMockAnything()
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000193 gclient_scm.scm.SVN.RunAndGetFileList(
194 options.verbose,
195 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
196 cwd=self.root_dir,
197 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000198
199 self.mox.ReplayAll()
200 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
201 relpath=self.relpath)
202 scm.revert(options, self.args, files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000203 self.checkstdout(
204 ('\n_____ %s is missing, synching instead\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000205
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000206 def testRevertNoDotSvn(self):
207 options = self.Options(verbose=True, force=True)
208 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
209 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(False)
210 gclient_scm.os.path.isdir(join(self.base_path, '.git')).AndReturn(False)
211 gclient_scm.os.path.isdir(join(self.base_path, '.hg')).AndReturn(False)
212 # Checkout.
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000213 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
214 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
215 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000216 parent = gclient_scm.os.path.dirname(self.base_path)
217 gclient_scm.os.path.exists(parent).AndReturn(False)
218 gclient_scm.os.makedirs(parent)
219 gclient_scm.os.path.exists(parent).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000220 files_list = self.mox.CreateMockAnything()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000221 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
222 ).AndReturn('1.6')
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000223 gclient_scm.scm.SVN.RunAndGetFileList(
224 options.verbose,
225 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
226 cwd=self.root_dir,
227 file_list=files_list)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000228 gclient_scm.gclient_utils.rmtree(self.base_path)
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
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000337 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
338 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000339 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000340 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000341 parent = gclient_scm.os.path.dirname(self.base_path)
342 gclient_scm.os.path.exists(parent).AndReturn(False)
343 gclient_scm.os.makedirs(parent)
344 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000345 files_list = self.mox.CreateMockAnything()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000346 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
347 ).AndReturn('1.5.1')
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000348 gclient_scm.scm.SVN.RunAndGetFileList(
349 options.verbose,
350 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
351 cwd=self.root_dir,
352 file_list=files_list)
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 }
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000368 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
369 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000370 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000371
msb@chromium.orge28e4982009-09-25 20:51:45 +0000372 # Checkout or update.
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000373 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000374 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000375
376 # Verify no locked files.
377 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
378
msb@chromium.orge28e4982009-09-25 20:51:45 +0000379 # Cheat a bit here.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000380 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
381 ).AndReturn(file_info)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000382
383 # _AddAdditionalUpdateFlags()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000384 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
385 ).AndReturn('1.5.1')
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000386
msb@chromium.orge28e4982009-09-25 20:51:45 +0000387 additional_args = []
388 if options.manually_grab_svn_rev:
389 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000390 additional_args.extend(['--force', '--ignore-externals'])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000391 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000392 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000393 options.verbose,
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000394 ['update', self.base_path] + additional_args,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000395 cwd=self.root_dir, file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000396
397 self.mox.ReplayAll()
398 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
399 relpath=self.relpath)
400 scm.update(options, (), files_list)
401
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000402 def testUpdateReset(self):
403 options = self.Options(verbose=True)
404 options.reset = True
405 file_info = {
406 'Repository Root': 'blah',
407 'URL': self.url,
408 'UUID': 'ABC',
409 'Revision': 42,
410 }
411 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
412 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
413 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
414
415 # Checkout or update.
416 dotted_path = join(self.base_path, '.')
417 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
418
419 # Create an untracked file and directory.
420 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
421 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
422
423 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
424 ).AndReturn(file_info)
425
426 self.mox.ReplayAll()
427 files_list = []
428 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
429 relpath=self.relpath)
430 scm.update(options, (), files_list)
431 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
432
433 def testUpdateResetDeleteUnversionedTrees(self):
434 options = self.Options(verbose=True)
435 options.reset = True
436 options.delete_unversioned_trees = True
437
438 file_info = {
439 'Repository Root': 'blah',
440 'URL': self.url,
441 'UUID': 'ABC',
442 'Revision': 42,
443 }
444 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
445 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
446 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
467 self.mox.ReplayAll()
468 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
469 relpath=self.relpath)
470 files_list = []
471 scm.update(options, (), files_list)
472 self.checkstdout(
473 ('\n_____ %s at 42\n'
474 '\n_____ removing unversioned directory dir\n') % self.relpath)
475
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000476 def testUpdateSingleCheckout(self):
477 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000478 file_info = {
479 'URL': self.url,
480 'Revision': 42,
481 }
tony@chromium.org57564662010-04-14 02:35:12 +0000482
483 # Checks to make sure that we support svn co --depth.
484 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000485 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
486 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000487 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
488 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000489
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000490 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000491 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000492 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000493
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000494 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000495 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000496 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000497 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000498 always=True,
499 cwd=self.root_dir)
500 gclient_scm.scm.SVN.RunAndGetFileList(
501 options.verbose,
502 ['update', 'DEPS', '--ignore-externals'],
503 cwd=self.base_path,
504 file_list=files_list)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000505
506 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000507 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
508 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
509 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000510 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
511 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
512 ).AndReturn(file_info)
tony@chromium.org57564662010-04-14 02:35:12 +0000513
514 self.mox.ReplayAll()
515 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
516 relpath=self.relpath)
517 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000518 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org57564662010-04-14 02:35:12 +0000519
520 def testUpdateSingleCheckoutSVN14(self):
521 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000522
523 # Checks to make sure that we support svn co --depth.
524 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000525 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
526 ).AndReturn('1.4.4')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000527 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org57564662010-04-14 02:35:12 +0000528
529 # When checking out a single file with svn 1.4, we use svn export
530 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000531 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000532 ['svn', 'export', join(self.url, 'DEPS'), join(self.base_path, 'DEPS')],
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000533 always=True, cwd=self.root_dir)
tony@chromium.org57564662010-04-14 02:35:12 +0000534
535 self.mox.ReplayAll()
536 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
537 relpath=self.relpath)
538 scm.updatesingle(options, ['DEPS'], files_list)
539
540 def testUpdateSingleCheckoutSVNUpgrade(self):
541 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000542 file_info = {
543 'URL': self.url,
544 'Revision': 42,
545 }
546
547 # Checks to make sure that we support svn co --depth.
548 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000549 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
550 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000551 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000552 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
553 # the old DEPS file.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000554 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(True)
555 gclient_scm.os.remove(join(self.base_path, 'DEPS'))
tony@chromium.org57564662010-04-14 02:35:12 +0000556
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000557 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000558 gclient_scm.scm.SVN.CaptureStatus(
559 None, join(self.base_path, '.')).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000560
tony@chromium.org57564662010-04-14 02:35:12 +0000561 # When checking out a single file, we issue an svn checkout and svn update.
562 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000563 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000564 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000565 always=True,
566 cwd=self.root_dir)
567 gclient_scm.scm.SVN.RunAndGetFileList(
568 options.verbose,
569 ['update', 'DEPS', '--ignore-externals'],
570 cwd=self.base_path,
571 file_list=files_list)
tony@chromium.org57564662010-04-14 02:35:12 +0000572
573 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000574 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
575 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
576 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000577 gclient_scm.scm.SVN._CaptureInfo(
578 [], join(self.base_path, ".")).AndReturn(file_info)
579 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
580 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000581
582 self.mox.ReplayAll()
583 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
584 relpath=self.relpath)
585 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000586 self.checkstdout(
587 ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000588
589 def testUpdateSingleUpdate(self):
590 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000591 file_info = {
592 'URL': self.url,
593 'Revision': 42,
594 }
tony@chromium.org57564662010-04-14 02:35:12 +0000595 # Checks to make sure that we support svn co --depth.
596 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000597 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
598 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000599 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000600
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000601 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000602 gclient_scm.scm.SVN.CaptureStatus(None, join(self.base_path, '.')
603 ).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000604
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000605 # Now we fall back on scm.update().
606 files_list = self.mox.CreateMockAnything()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000607 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
608 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
609 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000610 gclient_scm.scm.SVN._CaptureInfo(
611 [], join(self.base_path, '.')).AndReturn(file_info)
612 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
613 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000614
615 self.mox.ReplayAll()
616 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
617 relpath=self.relpath)
618 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000619 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000620
msb@chromium.orge28e4982009-09-25 20:51:45 +0000621 def testUpdateGit(self):
622 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000623 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
624 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000625
626 self.mox.ReplayAll()
627 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
628 relpath=self.relpath)
629 file_list = []
630 scm.update(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000631 self.checkstdout(
632 ('________ found .git directory; skipping %s\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000633
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000634 def testUpdateHg(self):
635 options = self.Options(verbose=True)
636 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
637 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(True)
638
639 self.mox.ReplayAll()
640 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
641 relpath=self.relpath)
642 file_list = []
643 scm.update(options, self.args, file_list)
644 self.checkstdout(
645 ('________ found .hg directory; skipping %s\n' % self.relpath))
646
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000647 def testGetUsableRevSVN(self):
648 # pylint: disable=E1101
649 options = self.Options(verbose=True)
650
651 # Mock SVN revision validity checking.
652 self.mox.StubOutWithMock(
653 gclient_scm.scm.SVN, 'IsValidRevision', True)
654 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 1)
655 ).AndReturn(True)
656 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 'fake')
657 ).AndReturn(False)
658
659 self.mox.ReplayAll()
660
661 svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir)
662 # With an SVN checkout, 1 an example of a valid usable rev.
663 self.assertEquals(svn_scm.GetUsableRev(1, options), 1)
664 # With an SVN checkout, a fake or unknown rev should raise an excpetion.
665 self.assertRaises(gclient_scm.gclient_utils.Error,
666 svn_scm.GetUsableRev, 'fake', options)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000667
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000668class BaseGitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
669 unittest.TestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000670 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000671 class OptionsObject(object):
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000672 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000673 self.verbose = verbose
674 self.revision = revision
675 self.manually_grab_svn_rev = True
676 self.deps_os = None
677 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000678 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000679 self.nohooks = False
bauerb@chromium.org4dd09372011-07-22 14:41:51 +0000680 self.merge = False
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000681 self.delete_unversioned_trees = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000682
683 sample_git_import = """blob
684mark :1
685data 6
686Hello
687
688blob
689mark :2
690data 4
691Bye
692
693reset refs/heads/master
694commit refs/heads/master
695mark :3
696author Bob <bob@example.com> 1253744361 -0700
697committer Bob <bob@example.com> 1253744361 -0700
698data 8
699A and B
700M 100644 :1 a
701M 100644 :2 b
702
703blob
704mark :4
705data 10
706Hello
707You
708
709blob
710mark :5
711data 8
712Bye
713You
714
715commit refs/heads/origin
716mark :6
717author Alice <alice@example.com> 1253744424 -0700
718committer Alice <alice@example.com> 1253744424 -0700
719data 13
720Personalized
721from :3
722M 100644 :4 a
723M 100644 :5 b
724
725reset refs/heads/master
726from :3
727"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000728 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000729 return self.OptionsObject(*args, **kwargs)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000730
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000731 @staticmethod
732 def CreateGitRepo(git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000733 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000734 try:
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000735 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000736 cwd=path).communicate()
737 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000738 # git is not available, skip this test.
739 return False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000740 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
741 stderr=STDOUT, cwd=path).communicate(input=git_import)
742 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
743 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000744 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000745 stderr=STDOUT, cwd=path).communicate()
746 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
747 stderr=STDOUT, cwd=path).communicate()
748 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
749 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000750 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000751 stderr=STDOUT, cwd=path).communicate()
iannucci@chromium.org1e7187a2013-02-17 20:54:05 +0000752 Popen(['git', 'config', 'user.email', 'someuser@chromium.org'], stdout=PIPE,
753 stderr=STDOUT, cwd=path).communicate()
754 Popen(['git', 'config', 'user.name', 'Some User'], stdout=PIPE,
755 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000756 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000757
msb@chromium.orge28e4982009-09-25 20:51:45 +0000758 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000759 TestCaseUtils.setUp(self)
760 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000761 self.url = 'git://foo'
762 self.root_dir = tempfile.mkdtemp()
763 self.relpath = '.'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000764 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000765 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000766 StdoutCheck.setUp(self)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000767 self._original_GitBinaryExists = gclient_scm.GitWrapper.BinaryExists
768 self._original_SVNBinaryExists = gclient_scm.SVNWrapper.BinaryExists
769 gclient_scm.GitWrapper.BinaryExists = staticmethod(lambda : True)
770 gclient_scm.SVNWrapper.BinaryExists = staticmethod(lambda : True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000771
772 def tearDown(self):
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000773 StdoutCheck.tearDown(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000774 TestCaseUtils.tearDown(self)
775 unittest.TestCase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000776 rmtree(self.root_dir)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000777 gclient_scm.GitWrapper.BinaryExists = self._original_GitBinaryExists
778 gclient_scm.SVNWrapper.BinaryExists = self._original_SVNBinaryExists
msb@chromium.orge28e4982009-09-25 20:51:45 +0000779
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000780class ManagedGitWrapperTestCase(BaseGitWrapperTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000781 def testDir(self):
782 members = [
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000783 'BinaryExists',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000784 'FullUrlForRelativeUrl',
785 'GetRevisionDate',
786 'GetUsableRev',
787 'RunCommand',
788 'cleanup',
789 'diff',
790 'pack',
szager@chromium.orgd4af6622012-06-04 22:13:55 +0000791 'UpdateSubmoduleConfig',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000792 'relpath',
793 'revert',
794 'revinfo',
795 'runhooks',
796 'status',
797 'update',
798 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000799 ]
800
801 # If you add a member, be sure to add the relevant test!
802 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
803
804 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000805 if not self.enabled:
806 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000807 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000808 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000809 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
810 relpath=self.relpath)
811 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000812 scm.update(options, None, file_list)
813 gclient_scm.os.remove(file_path)
814 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000815 scm.revert(options, self.args, file_list)
816 self.assertEquals(file_list, [file_path])
817 file_list = []
818 scm.diff(options, self.args, file_list)
819 self.assertEquals(file_list, [])
szager@google.com85d3e3a2011-10-07 17:12:00 +0000820 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000821
822 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000823 if not self.enabled:
824 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000825 options = self.Options()
826 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
827 relpath=self.relpath)
828 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000829 scm.update(options, None, file_list)
830 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000831 scm.revert(options, self.args, file_list)
832 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000833 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000834 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000835 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000836
837 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000838 if not self.enabled:
839 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000840 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000841 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
842 relpath=self.relpath)
843 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000844 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000845 file_path = join(self.base_path, 'a')
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000846 open(file_path, 'a').writelines('touched\n')
847 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000848 scm.revert(options, self.args, file_list)
849 self.assertEquals(file_list, [file_path])
850 file_list = []
851 scm.diff(options, self.args, file_list)
852 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000853 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000854 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000855 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000856
857 def testRevertNew(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()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000861 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
862 relpath=self.relpath)
863 file_list = []
864 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000865 file_path = join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000866 f = open(file_path, 'w')
867 f.writelines('new\n')
868 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000869 Popen(['git', 'add', 'c'], stdout=PIPE,
870 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000871 file_list = []
872 scm.revert(options, self.args, file_list)
873 self.assertEquals(file_list, [file_path])
874 file_list = []
875 scm.diff(options, self.args, file_list)
876 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000877 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000878 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000879 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000880
881 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000882 if not self.enabled:
883 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000884 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000885 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000886 open(file_path, 'a').writelines('touched\n')
887 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
888 relpath=self.relpath)
889 file_list = []
890 scm.status(options, self.args, file_list)
891 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000892 self.checkstdout(
893 ('\n________ running \'git diff --name-status '
894 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000895 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000896
897 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000898 if not self.enabled:
899 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000900 options = self.Options()
901 expected_file_list = []
902 for f in ['a', 'b']:
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000903 file_path = join(self.base_path, f)
904 open(file_path, 'a').writelines('touched\n')
905 expected_file_list.extend([file_path])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000906 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
907 relpath=self.relpath)
908 file_list = []
909 scm.status(options, self.args, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000910 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000911 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000912 self.checkstdout(
913 ('\n________ running \'git diff --name-status '
914 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000915 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000916
msb@chromium.orge28e4982009-09-25 20:51:45 +0000917 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000918 if not self.enabled:
919 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000920 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000921 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000922 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
923 relpath=self.relpath)
924 file_list = []
925 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000926 self.assertEquals(file_list, expected_file_list)
927 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000928 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000929 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000930
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000931 def testUpdateReset(self):
932 if not self.enabled:
933 return
934 options = self.Options()
935 options.reset = True
936
937 dir_path = join(self.base_path, 'c')
938 os.mkdir(dir_path)
939 open(join(dir_path, 'nested'), 'w').writelines('new\n')
940
941 file_path = join(self.base_path, 'file')
942 open(file_path, 'w').writelines('new\n')
943
944 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
945 relpath=self.relpath)
946 file_list = []
947 scm.update(options, (), file_list)
948 self.assert_(gclient_scm.os.path.isdir(dir_path))
949 self.assert_(gclient_scm.os.path.isfile(file_path))
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000950 sys.stdout.close()
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000951
952 def testUpdateResetDeleteUnversionedTrees(self):
953 if not self.enabled:
954 return
955 options = self.Options()
956 options.reset = True
957 options.delete_unversioned_trees = True
958
959 dir_path = join(self.base_path, 'dir')
960 os.mkdir(dir_path)
961 open(join(dir_path, 'nested'), 'w').writelines('new\n')
962
963 file_path = join(self.base_path, 'file')
964 open(file_path, 'w').writelines('new\n')
965
966 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
967 relpath=self.relpath)
968 file_list = []
969 scm.update(options, (), file_list)
970 self.assert_(not gclient_scm.os.path.isdir(dir_path))
971 self.assert_(gclient_scm.os.path.isfile(file_path))
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000972 sys.stdout.close()
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000973
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000974 def testUpdateUnstagedConflict(self):
975 if not self.enabled:
976 return
977 options = self.Options()
978 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
979 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000980 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000981 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000982 try:
983 scm.update(options, (), [])
984 self.fail()
maruel@chromium.orgfae707b2011-09-15 18:57:58 +0000985 except (gclient_scm.gclient_utils.Error, subprocess2.CalledProcessError):
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000986 # The exact exception text varies across git versions so it's not worth
987 # verifying it. It's fine as long as it throws.
988 pass
989 # Manually flush stdout since we can't verify it's content accurately across
990 # git versions.
991 sys.stdout.getvalue()
992 sys.stdout.close()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000993
msb@chromium.org5bde4852009-12-14 16:47:12 +0000994 def testUpdateConflict(self):
995 if not self.enabled:
996 return
997 options = self.Options()
998 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
999 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001000 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001001 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001002 scm._Run(['commit', '-am', 'test'], options)
1003 __builtin__.raw_input = lambda x: 'y'
1004 exception = ('Conflict while rebasing this branch.\n'
1005 'Fix the conflict and run gclient again.\n'
1006 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001007 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001008 exception = ('\n____ . at refs/heads/master\n'
1009 '\tYou have unstaged changes.\n'
1010 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001011 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +00001012 sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +00001013
msb@chromium.orge4af1ab2010-01-13 21:26:09 +00001014 def testUpdateNotGit(self):
1015 if not self.enabled:
1016 return
1017 options = self.Options()
1018 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1019 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001020 git_path = join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +00001021 rename(git_path, git_path + 'foo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001022 exception = ('\n____ . at refs/heads/master\n'
1023 '\tPath is not a git repo. No .git dir.\n'
1024 '\tTo resolve:\n'
1025 '\t\trm -rf .\n'
1026 '\tAnd run gclient sync again\n')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +00001027 self.assertRaisesError(exception, scm.update, options, (), [])
1028
msb@chromium.org0f282062009-11-06 20:14:02 +00001029 def testRevinfo(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)
1035 rev_info = scm.revinfo(options, (), None)
1036 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
1037
msb@chromium.orge28e4982009-09-25 20:51:45 +00001038
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001039class ManagedGitWrapperTestCaseMox(BaseTestCase):
1040 class OptionsObject(object):
1041 def __init__(self, verbose=False, revision=None, force=False):
1042 self.verbose = verbose
1043 self.revision = revision
1044 self.deps_os = None
1045 self.force = force
1046 self.reset = False
1047 self.nohooks = False
1048 # TODO(maruel): Test --jobs > 1.
1049 self.jobs = 1
1050
1051 def Options(self, *args, **kwargs):
1052 return self.OptionsObject(*args, **kwargs)
1053
1054 def setUp(self):
1055 BaseTestCase.setUp(self)
1056 self.fake_hash_1 = 't0ta11yf4k3'
1057 self.fake_hash_2 = '3v3nf4k3r'
1058 self.url = 'git://foo'
1059 self.root_dir = '/tmp'
1060 self.relpath = 'fake'
1061 self.base_path = os.path.join(self.root_dir, self.relpath)
1062
1063 def tearDown(self):
1064 BaseTestCase.tearDown(self)
1065
1066 def testGetUsableRevGit(self):
1067 # pylint: disable=E1101
1068 options = self.Options(verbose=True)
1069
1070 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1071 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1072 ).AndReturn(True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001073
1074 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1075 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1076 ).AndReturn(False)
1077
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001078 gclient_scm.scm.os.path.isdir(self.base_path).AndReturn(True)
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001079 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001080
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001081 self.mox.ReplayAll()
1082
1083 git_scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1084 relpath=self.relpath)
1085 # A [fake] git sha1 with a git repo should work (this is in the case that
1086 # the LKGR gets flipped to git sha1's some day).
1087 self.assertEquals(git_scm.GetUsableRev(self.fake_hash_1, options),
1088 self.fake_hash_1)
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001089 # An SVN rev with an existing purely git repo should raise an exception.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001090 self.assertRaises(gclient_scm.gclient_utils.Error,
1091 git_scm.GetUsableRev, '1', options)
1092
1093 def testGetUsableRevGitSvn(self):
1094 # pylint: disable=E1101
1095 options = self.Options()
1096 too_big = str(1e7)
1097
1098 # Pretend like the git-svn repo's HEAD is at r2.
1099 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetGitSvnHeadRev', True)
1100 gclient_scm.scm.GIT.GetGitSvnHeadRev(cwd=self.base_path).MultipleTimes(
1101 ).AndReturn(2)
1102
szager@chromium.orgc51def32012-10-15 18:50:37 +00001103 self.mox.StubOutWithMock(
1104 gclient_scm.scm.GIT, 'GetBlessedSha1ForSvnRev', True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001105 # r1 -> first fake hash, r3 -> second fake hash.
szager@chromium.orgc51def32012-10-15 18:50:37 +00001106 gclient_scm.scm.GIT.GetBlessedSha1ForSvnRev(cwd=self.base_path, rev='1'
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001107 ).AndReturn(self.fake_hash_1)
szager@chromium.orgc51def32012-10-15 18:50:37 +00001108 gclient_scm.scm.GIT.GetBlessedSha1ForSvnRev(cwd=self.base_path, rev='3'
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001109 ).MultipleTimes().AndReturn(self.fake_hash_2)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001110
1111 # Ensure that we call git svn fetch if our LKGR is > the git-svn HEAD rev.
1112 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'Capture', True)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001113 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1114 cwd=self.base_path).AndReturn('blah')
1115 gclient_scm.scm.GIT.Capture(['fetch'], cwd=self.base_path)
1116 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
1117 error = subprocess2.CalledProcessError(1, 'cmd', '/cwd', 'stdout', 'stderr')
1118 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1119 cwd=self.base_path).AndRaise(error)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001120 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001121 gclient_scm.scm.GIT.Capture(['fetch', 'origin'], cwd=self.base_path)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001122
1123 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1124 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1125 ).AndReturn(True)
1126
1127 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1128 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1129 ).AndReturn(True)
1130 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=too_big
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001131 ).MultipleTimes(2).AndReturn(False)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001132
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001133 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
1134 gclient_scm.os.path.isdir(self.base_path).MultipleTimes().AndReturn(True)
1135
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001136 self.mox.ReplayAll()
1137
1138 git_svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
1139 relpath=self.relpath)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001140 # Without an existing checkout, this should fail.
1141 # TODO(dbeam) Fix this. http://crbug.com/109184
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001142 self.assertRaises(gclient_scm.gclient_utils.Error,
1143 git_svn_scm.GetUsableRev, '1', options)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001144 # Given an SVN revision with a git-svn checkout, it should be translated to
1145 # a git sha1 and be usable.
1146 self.assertEquals(git_svn_scm.GetUsableRev('1', options),
1147 self.fake_hash_1)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001148 # Our fake HEAD rev is r2, so this should call git fetch and git svn fetch
1149 # to get more revs (pymox will complain if this doesn't happen). We mock an
1150 # optimized checkout the first time, so this run should call git fetch.
1151 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1152 self.fake_hash_2)
1153 # The time we pretend we're not optimized, so no git fetch should fire.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001154 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1155 self.fake_hash_2)
1156 # Given a git sha1 with a git-svn checkout, it should be used as is.
1157 self.assertEquals(git_svn_scm.GetUsableRev(self.fake_hash_1, options),
1158 self.fake_hash_1)
1159 # We currently check for seemingly valid SVN revisions by assuming 6 digit
1160 # numbers, so assure that numeric revs >= 1000000 don't work.
1161 self.assertRaises(gclient_scm.gclient_utils.Error,
1162 git_svn_scm.GetUsableRev, too_big, options)
1163
1164
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001165class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001166 def testUpdateUpdate(self):
1167 if not self.enabled:
1168 return
1169 options = self.Options()
1170 expected_file_list = []
1171 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1172 relpath=self.relpath)
1173 file_list = []
1174 options.revision = 'unmanaged'
1175 scm.update(options, (), file_list)
1176 self.assertEquals(file_list, expected_file_list)
1177 self.assertEquals(scm.revinfo(options, (), None),
1178 '069c602044c5388d2d15c3f875b057c852003458')
1179 self.checkstdout('________ unmanaged solution; skipping .\n')
1180
1181
msb@chromium.orge28e4982009-09-25 20:51:45 +00001182if __name__ == '__main__':
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001183 if '-v' in sys.argv:
1184 logging.basicConfig(
1185 level=logging.DEBUG,
1186 format='%(asctime).19s %(levelname)s %(filename)s:'
1187 '%(lineno)s %(message)s')
msb@chromium.orge28e4982009-09-25 20:51:45 +00001188 unittest.main()
1189
1190# vim: ts=2:sw=2:tw=80:et: