blob: 229254264596b8d32b48930a4f238baa59cc84ca [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')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000058 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000059 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +000060 self.mox.StubOutWithMock(gclient_scm.scm.SVN, '_CaptureInfo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000061 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
62 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
maruel@chromium.orgfae707b2011-09-15 18:57:58 +000063 self.mox.StubOutWithMock(subprocess2, 'communicate')
64 self.mox.StubOutWithMock(subprocess2, 'Popen')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000065 self._scm_wrapper = gclient_scm.CreateSCM
maruel@chromium.org389d6de2010-09-09 14:14:37 +000066 gclient_scm.scm.SVN.current_version = None
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.
213 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
214 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
215 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
216 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000217 parent = gclient_scm.os.path.dirname(self.base_path)
218 gclient_scm.os.path.exists(parent).AndReturn(False)
219 gclient_scm.os.makedirs(parent)
220 gclient_scm.os.path.exists(parent).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000221 files_list = self.mox.CreateMockAnything()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000222 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
223 ).AndReturn('1.6')
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000224 gclient_scm.scm.SVN.RunAndGetFileList(
225 options.verbose,
226 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
227 cwd=self.root_dir,
228 file_list=files_list)
229
230 self.mox.ReplayAll()
231 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
232 relpath=self.relpath)
233 scm.revert(options, self.args, files_list)
234 self.checkstdout(
235 '\n_____ %s is not a valid svn checkout, synching instead\n' %
236 self.relpath)
237
msb@chromium.orge28e4982009-09-25 20:51:45 +0000238 def testRevertNone(self):
239 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000240 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000241 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000242 gclient_scm.scm.SVN.CaptureStatus(
243 None, self.base_path, no_ignore=False).AndReturn([])
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000244 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000245 gclient_scm.scm.SVN.RunAndGetFileList(
246 options.verbose,
247 ['update', '--revision', 'BASE', '--ignore-externals'],
248 cwd=self.base_path,
249 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000250
251 self.mox.ReplayAll()
252 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
253 relpath=self.relpath)
254 file_list = []
255 scm.revert(options, self.args, file_list)
256
msb@chromium.orge28e4982009-09-25 20:51:45 +0000257 def testRevertDirectory(self):
258 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000259 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000260 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000261 items = [
262 ('~ ', 'a'),
263 ]
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000264 gclient_scm.scm.SVN.CaptureStatus(
265 None, self.base_path, no_ignore=False).AndReturn(items)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000266 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000267 gclient_scm.os.path.exists(file_path).AndReturn(True)
268 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000269 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000270 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000271 gclient_scm.gclient_utils.RemoveDirectory(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000272 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000273 gclient_scm.scm.SVN.RunAndGetFileList(
274 options.verbose,
275 ['update', '--revision', 'BASE', '--ignore-externals'],
276 cwd=self.base_path,
277 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000278
279 self.mox.ReplayAll()
280 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
281 relpath=self.relpath)
282 file_list2 = []
283 scm.revert(options, self.args, file_list2)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000284 self.checkstdout(('%s\n' % file_path))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000285
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000286 def testRevertDot(self):
287 self.mox.StubOutWithMock(gclient_scm.SVNWrapper, 'update')
288 options = self.Options(verbose=True)
289 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
290 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
291 items = [
292 ('~ ', '.'),
293 ]
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000294 gclient_scm.scm.SVN.CaptureStatus(
295 None, self.base_path, no_ignore=False).AndReturn(items)
maruel@chromium.org62087572012-04-24 23:16:28 +0000296 # RemoveDirectory() doesn't work on path ending with '.', like 'foo/.'.
297 file_path = self.base_path
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000298 gclient_scm.os.path.exists(file_path).AndReturn(True)
299 gclient_scm.os.path.isfile(file_path).AndReturn(False)
300 gclient_scm.os.path.islink(file_path).AndReturn(False)
301 gclient_scm.os.path.isdir(file_path).AndReturn(True)
302 gclient_scm.gclient_utils.RemoveDirectory(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000303 # pylint: disable=E1120
maruel@chromium.org428342a2011-11-10 15:46:33 +0000304 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000305 gclient_scm.SVNWrapper.update(options, [], ['.'])
306
307 self.mox.ReplayAll()
308 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
309 relpath=self.relpath)
310 file_list2 = []
311 scm.revert(options, self.args, file_list2)
maruel@chromium.org62087572012-04-24 23:16:28 +0000312 self.checkstdout(('%s\n' % os.path.join(file_path, '.')))
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000313
msb@chromium.orge28e4982009-09-25 20:51:45 +0000314 def testStatus(self):
315 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000316 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000317 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000318 options.verbose,
319 ['status'] + self.args + ['--ignore-externals'],
320 cwd=self.base_path,
321 file_list=[]).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000322
323 self.mox.ReplayAll()
324 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
325 relpath=self.relpath)
326 file_list = []
327 self.assertEqual(scm.status(options, self.args, file_list), None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000328
329 # TODO(maruel): TEST REVISIONS!!!
330 # TODO(maruel): TEST RELOCATE!!!
331 def testUpdateCheckout(self):
332 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000333 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000334 file_info.root = 'blah'
335 file_info.url = self.url
336 file_info.uuid = 'ABC'
337 file_info.revision = 42
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000338 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
339 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000340 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000341 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000342 parent = gclient_scm.os.path.dirname(self.base_path)
343 gclient_scm.os.path.exists(parent).AndReturn(False)
344 gclient_scm.os.makedirs(parent)
345 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000346 files_list = self.mox.CreateMockAnything()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000347 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
348 ).AndReturn('1.5.1')
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000349 gclient_scm.scm.SVN.RunAndGetFileList(
350 options.verbose,
351 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
352 cwd=self.root_dir,
353 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000354 self.mox.ReplayAll()
355 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
356 relpath=self.relpath)
357 scm.update(options, (), files_list)
358
359 def testUpdateUpdate(self):
360 options = self.Options(verbose=True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000361 options.force = True
362 options.nohooks = False
363 file_info = {
364 'Repository Root': 'blah',
365 'URL': self.url,
366 'UUID': 'ABC',
367 'Revision': 42,
368 }
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000369 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
370 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000371 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000372
msb@chromium.orge28e4982009-09-25 20:51:45 +0000373 # Checkout or update.
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000374 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000375 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000376
377 # Verify no locked files.
378 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
379
msb@chromium.orge28e4982009-09-25 20:51:45 +0000380 # Cheat a bit here.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000381 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
382 ).AndReturn(file_info)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000383
384 # _AddAdditionalUpdateFlags()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000385 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
386 ).AndReturn('1.5.1')
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000387
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 }
412 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
413 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
414 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
415
416 # Checkout or update.
417 dotted_path = join(self.base_path, '.')
418 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
419
420 # Create an untracked file and directory.
421 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
422 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
423
424 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
425 ).AndReturn(file_info)
426
427 self.mox.ReplayAll()
428 files_list = []
429 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
430 relpath=self.relpath)
431 scm.update(options, (), files_list)
432 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
433
434 def testUpdateResetDeleteUnversionedTrees(self):
435 options = self.Options(verbose=True)
436 options.reset = True
437 options.delete_unversioned_trees = True
438
439 file_info = {
440 'Repository Root': 'blah',
441 'URL': self.url,
442 'UUID': 'ABC',
443 'Revision': 42,
444 }
445 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
446 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
447 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
448
449 # Checkout or update.
450 dotted_path = join(self.base_path, '.')
451 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
452
453 # Create an untracked file and directory.
454 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
455 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
456
457 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
458 ).AndReturn(file_info)
459
460 # Confirm that the untracked file is removed.
461 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path
462 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
463 gclient_scm.os.path.isdir(join(self.base_path, 'dir')).AndReturn(True)
464 gclient_scm.os.path.isdir(join(self.base_path, 'file')).AndReturn(False)
465 gclient_scm.os.path.islink(join(self.base_path, 'dir')).AndReturn(False)
466 gclient_scm.gclient_utils.RemoveDirectory(join(self.base_path, 'dir'))
467
468 self.mox.ReplayAll()
469 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
470 relpath=self.relpath)
471 files_list = []
472 scm.update(options, (), files_list)
473 self.checkstdout(
474 ('\n_____ %s at 42\n'
475 '\n_____ removing unversioned directory dir\n') % self.relpath)
476
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000477 def testUpdateSingleCheckout(self):
478 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000479 file_info = {
480 'URL': self.url,
481 'Revision': 42,
482 }
tony@chromium.org57564662010-04-14 02:35:12 +0000483
484 # Checks to make sure that we support svn co --depth.
485 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000486 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
487 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000488 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
489 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000490
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000491 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000492 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000493 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000494
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000495 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000496 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000497 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000498 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000499 always=True,
500 cwd=self.root_dir)
501 gclient_scm.scm.SVN.RunAndGetFileList(
502 options.verbose,
503 ['update', 'DEPS', '--ignore-externals'],
504 cwd=self.base_path,
505 file_list=files_list)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000506
507 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000508 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
509 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
510 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
515 self.mox.ReplayAll()
516 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
517 relpath=self.relpath)
518 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000519 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org57564662010-04-14 02:35:12 +0000520
521 def testUpdateSingleCheckoutSVN14(self):
522 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000523
524 # Checks to make sure that we support svn co --depth.
525 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000526 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
527 ).AndReturn('1.4.4')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000528 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org57564662010-04-14 02:35:12 +0000529
530 # When checking out a single file with svn 1.4, we use svn export
531 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000532 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000533 ['svn', 'export', join(self.url, 'DEPS'), join(self.base_path, 'DEPS')],
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000534 always=True, cwd=self.root_dir)
tony@chromium.org57564662010-04-14 02:35:12 +0000535
536 self.mox.ReplayAll()
537 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
538 relpath=self.relpath)
539 scm.updatesingle(options, ['DEPS'], files_list)
540
541 def testUpdateSingleCheckoutSVNUpgrade(self):
542 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000543 file_info = {
544 'URL': self.url,
545 'Revision': 42,
546 }
547
548 # Checks to make sure that we support svn co --depth.
549 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000550 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
551 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000552 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000553 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
554 # the old DEPS file.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000555 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(True)
556 gclient_scm.os.remove(join(self.base_path, 'DEPS'))
tony@chromium.org57564662010-04-14 02:35:12 +0000557
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000558 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000559 gclient_scm.scm.SVN.CaptureStatus(
560 None, join(self.base_path, '.')).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000561
tony@chromium.org57564662010-04-14 02:35:12 +0000562 # When checking out a single file, we issue an svn checkout and svn update.
563 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000564 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000565 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000566 always=True,
567 cwd=self.root_dir)
568 gclient_scm.scm.SVN.RunAndGetFileList(
569 options.verbose,
570 ['update', 'DEPS', '--ignore-externals'],
571 cwd=self.base_path,
572 file_list=files_list)
tony@chromium.org57564662010-04-14 02:35:12 +0000573
574 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000575 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
576 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
577 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000578 gclient_scm.scm.SVN._CaptureInfo(
579 [], join(self.base_path, ".")).AndReturn(file_info)
580 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
581 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000582
583 self.mox.ReplayAll()
584 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
585 relpath=self.relpath)
586 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000587 self.checkstdout(
588 ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000589
590 def testUpdateSingleUpdate(self):
591 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000592 file_info = {
593 'URL': self.url,
594 'Revision': 42,
595 }
tony@chromium.org57564662010-04-14 02:35:12 +0000596 # Checks to make sure that we support svn co --depth.
597 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000598 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
599 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000600 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000601
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000602 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000603 gclient_scm.scm.SVN.CaptureStatus(None, join(self.base_path, '.')
604 ).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000605
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000606 # Now we fall back on scm.update().
607 files_list = self.mox.CreateMockAnything()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000608 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
609 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
610 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000611 gclient_scm.scm.SVN._CaptureInfo(
612 [], join(self.base_path, '.')).AndReturn(file_info)
613 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
614 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000615
616 self.mox.ReplayAll()
617 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
618 relpath=self.relpath)
619 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000620 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000621
msb@chromium.orge28e4982009-09-25 20:51:45 +0000622 def testUpdateGit(self):
623 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000624 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
625 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000626
627 self.mox.ReplayAll()
628 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
629 relpath=self.relpath)
630 file_list = []
631 scm.update(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000632 self.checkstdout(
633 ('________ found .git directory; skipping %s\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000634
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000635 def testUpdateHg(self):
636 options = self.Options(verbose=True)
637 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
638 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(True)
639
640 self.mox.ReplayAll()
641 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
642 relpath=self.relpath)
643 file_list = []
644 scm.update(options, self.args, file_list)
645 self.checkstdout(
646 ('________ found .hg directory; skipping %s\n' % self.relpath))
647
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000648 def testGetUsableRevSVN(self):
649 # pylint: disable=E1101
650 options = self.Options(verbose=True)
651
652 # Mock SVN revision validity checking.
653 self.mox.StubOutWithMock(
654 gclient_scm.scm.SVN, 'IsValidRevision', True)
655 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 1)
656 ).AndReturn(True)
657 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 'fake')
658 ).AndReturn(False)
659
660 self.mox.ReplayAll()
661
662 svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir)
663 # With an SVN checkout, 1 an example of a valid usable rev.
664 self.assertEquals(svn_scm.GetUsableRev(1, options), 1)
665 # With an SVN checkout, a fake or unknown rev should raise an excpetion.
666 self.assertRaises(gclient_scm.gclient_utils.Error,
667 svn_scm.GetUsableRev, 'fake', options)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000668
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000669class BaseGitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
670 unittest.TestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000671 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000672 class OptionsObject(object):
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000673 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000674 self.verbose = verbose
675 self.revision = revision
676 self.manually_grab_svn_rev = True
677 self.deps_os = None
678 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000679 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000680 self.nohooks = False
bauerb@chromium.org4dd09372011-07-22 14:41:51 +0000681 self.merge = False
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000682 self.delete_unversioned_trees = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000683
684 sample_git_import = """blob
685mark :1
686data 6
687Hello
688
689blob
690mark :2
691data 4
692Bye
693
694reset refs/heads/master
695commit refs/heads/master
696mark :3
697author Bob <bob@example.com> 1253744361 -0700
698committer Bob <bob@example.com> 1253744361 -0700
699data 8
700A and B
701M 100644 :1 a
702M 100644 :2 b
703
704blob
705mark :4
706data 10
707Hello
708You
709
710blob
711mark :5
712data 8
713Bye
714You
715
716commit refs/heads/origin
717mark :6
718author Alice <alice@example.com> 1253744424 -0700
719committer Alice <alice@example.com> 1253744424 -0700
720data 13
721Personalized
722from :3
723M 100644 :4 a
724M 100644 :5 b
725
726reset refs/heads/master
727from :3
728"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000729 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000730 return self.OptionsObject(*args, **kwargs)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000731
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000732 @staticmethod
733 def CreateGitRepo(git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000734 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000735 try:
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000736 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000737 cwd=path).communicate()
738 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000739 # git is not available, skip this test.
740 return False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000741 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
742 stderr=STDOUT, cwd=path).communicate(input=git_import)
743 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
744 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000745 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000746 stderr=STDOUT, cwd=path).communicate()
747 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
748 stderr=STDOUT, cwd=path).communicate()
749 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
750 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000751 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000752 stderr=STDOUT, cwd=path).communicate()
iannucci@chromium.org1e7187a2013-02-17 20:54:05 +0000753 Popen(['git', 'config', 'user.email', 'someuser@chromium.org'], stdout=PIPE,
754 stderr=STDOUT, cwd=path).communicate()
755 Popen(['git', 'config', 'user.name', 'Some User'], stdout=PIPE,
756 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000757 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000758
msb@chromium.orge28e4982009-09-25 20:51:45 +0000759 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000760 TestCaseUtils.setUp(self)
761 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000762 self.url = 'git://foo'
763 self.root_dir = tempfile.mkdtemp()
764 self.relpath = '.'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000765 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000766 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000767 StdoutCheck.setUp(self)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000768 self._original_GitBinaryExists = gclient_scm.GitWrapper.BinaryExists
769 self._original_SVNBinaryExists = gclient_scm.SVNWrapper.BinaryExists
770 gclient_scm.GitWrapper.BinaryExists = staticmethod(lambda : True)
771 gclient_scm.SVNWrapper.BinaryExists = staticmethod(lambda : True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000772
773 def tearDown(self):
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000774 StdoutCheck.tearDown(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000775 TestCaseUtils.tearDown(self)
776 unittest.TestCase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000777 rmtree(self.root_dir)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000778 gclient_scm.GitWrapper.BinaryExists = self._original_GitBinaryExists
779 gclient_scm.SVNWrapper.BinaryExists = self._original_SVNBinaryExists
msb@chromium.orge28e4982009-09-25 20:51:45 +0000780
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000781class ManagedGitWrapperTestCase(BaseGitWrapperTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000782 def testDir(self):
783 members = [
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000784 'BinaryExists',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000785 'FullUrlForRelativeUrl',
786 'GetRevisionDate',
787 'GetUsableRev',
788 'RunCommand',
789 'cleanup',
790 'diff',
791 'pack',
szager@chromium.orgd4af6622012-06-04 22:13:55 +0000792 'UpdateSubmoduleConfig',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000793 'relpath',
794 'revert',
795 'revinfo',
796 'runhooks',
797 'status',
798 'update',
799 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000800 ]
801
802 # If you add a member, be sure to add the relevant test!
803 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
804
805 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000806 if not self.enabled:
807 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000808 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000809 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000810 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
811 relpath=self.relpath)
812 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000813 scm.update(options, None, file_list)
814 gclient_scm.os.remove(file_path)
815 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000816 scm.revert(options, self.args, file_list)
817 self.assertEquals(file_list, [file_path])
818 file_list = []
819 scm.diff(options, self.args, file_list)
820 self.assertEquals(file_list, [])
szager@google.com85d3e3a2011-10-07 17:12:00 +0000821 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000822
823 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000824 if not self.enabled:
825 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000826 options = self.Options()
827 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
828 relpath=self.relpath)
829 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000830 scm.update(options, None, file_list)
831 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000832 scm.revert(options, self.args, file_list)
833 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000834 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000835 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000836 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000837
838 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000839 if not self.enabled:
840 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000841 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000842 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
843 relpath=self.relpath)
844 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000845 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000846 file_path = join(self.base_path, 'a')
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000847 open(file_path, 'a').writelines('touched\n')
848 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000849 scm.revert(options, self.args, file_list)
850 self.assertEquals(file_list, [file_path])
851 file_list = []
852 scm.diff(options, self.args, file_list)
853 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000854 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000855 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000856 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000857
858 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000859 if not self.enabled:
860 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000861 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000862 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
863 relpath=self.relpath)
864 file_list = []
865 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000866 file_path = join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000867 f = open(file_path, 'w')
868 f.writelines('new\n')
869 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000870 Popen(['git', 'add', 'c'], stdout=PIPE,
871 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000872 file_list = []
873 scm.revert(options, self.args, file_list)
874 self.assertEquals(file_list, [file_path])
875 file_list = []
876 scm.diff(options, self.args, file_list)
877 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000878 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000879 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000880 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000881
882 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000883 if not self.enabled:
884 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000885 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000886 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000887 open(file_path, 'a').writelines('touched\n')
888 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
889 relpath=self.relpath)
890 file_list = []
891 scm.status(options, self.args, file_list)
892 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000893 self.checkstdout(
894 ('\n________ running \'git diff --name-status '
895 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000896 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000897
898 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000899 if not self.enabled:
900 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000901 options = self.Options()
902 expected_file_list = []
903 for f in ['a', 'b']:
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000904 file_path = join(self.base_path, f)
905 open(file_path, 'a').writelines('touched\n')
906 expected_file_list.extend([file_path])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000907 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
908 relpath=self.relpath)
909 file_list = []
910 scm.status(options, self.args, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000911 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000912 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000913 self.checkstdout(
914 ('\n________ running \'git diff --name-status '
915 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000916 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000917
msb@chromium.orge28e4982009-09-25 20:51:45 +0000918 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000919 if not self.enabled:
920 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000921 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000922 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000923 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
924 relpath=self.relpath)
925 file_list = []
926 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000927 self.assertEquals(file_list, expected_file_list)
928 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000929 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000930 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000931
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000932 def testUpdateReset(self):
933 if not self.enabled:
934 return
935 options = self.Options()
936 options.reset = True
937
938 dir_path = join(self.base_path, 'c')
939 os.mkdir(dir_path)
940 open(join(dir_path, 'nested'), 'w').writelines('new\n')
941
942 file_path = join(self.base_path, 'file')
943 open(file_path, 'w').writelines('new\n')
944
945 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
946 relpath=self.relpath)
947 file_list = []
948 scm.update(options, (), file_list)
949 self.assert_(gclient_scm.os.path.isdir(dir_path))
950 self.assert_(gclient_scm.os.path.isfile(file_path))
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000951 sys.stdout.close()
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000952
953 def testUpdateResetDeleteUnversionedTrees(self):
954 if not self.enabled:
955 return
956 options = self.Options()
957 options.reset = True
958 options.delete_unversioned_trees = True
959
960 dir_path = join(self.base_path, 'dir')
961 os.mkdir(dir_path)
962 open(join(dir_path, 'nested'), 'w').writelines('new\n')
963
964 file_path = join(self.base_path, 'file')
965 open(file_path, 'w').writelines('new\n')
966
967 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
968 relpath=self.relpath)
969 file_list = []
970 scm.update(options, (), file_list)
971 self.assert_(not gclient_scm.os.path.isdir(dir_path))
972 self.assert_(gclient_scm.os.path.isfile(file_path))
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000973 sys.stdout.close()
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000974
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000975 def testUpdateUnstagedConflict(self):
976 if not self.enabled:
977 return
978 options = self.Options()
979 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
980 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000981 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000982 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000983 try:
984 scm.update(options, (), [])
985 self.fail()
maruel@chromium.orgfae707b2011-09-15 18:57:58 +0000986 except (gclient_scm.gclient_utils.Error, subprocess2.CalledProcessError):
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000987 # The exact exception text varies across git versions so it's not worth
988 # verifying it. It's fine as long as it throws.
989 pass
990 # Manually flush stdout since we can't verify it's content accurately across
991 # git versions.
992 sys.stdout.getvalue()
993 sys.stdout.close()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000994
msb@chromium.org5bde4852009-12-14 16:47:12 +0000995 def testUpdateConflict(self):
996 if not self.enabled:
997 return
998 options = self.Options()
999 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1000 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001001 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001002 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001003 scm._Run(['commit', '-am', 'test'], options)
1004 __builtin__.raw_input = lambda x: 'y'
1005 exception = ('Conflict while rebasing this branch.\n'
1006 'Fix the conflict and run gclient again.\n'
1007 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001008 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001009 exception = ('\n____ . at refs/heads/master\n'
1010 '\tYou have unstaged changes.\n'
1011 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001012 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +00001013 sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +00001014
msb@chromium.orge4af1ab2010-01-13 21:26:09 +00001015 def testUpdateNotGit(self):
1016 if not self.enabled:
1017 return
1018 options = self.Options()
1019 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1020 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001021 git_path = join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +00001022 rename(git_path, git_path + 'foo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001023 exception = ('\n____ . at refs/heads/master\n'
1024 '\tPath is not a git repo. No .git dir.\n'
1025 '\tTo resolve:\n'
1026 '\t\trm -rf .\n'
1027 '\tAnd run gclient sync again\n')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +00001028 self.assertRaisesError(exception, scm.update, options, (), [])
1029
msb@chromium.org0f282062009-11-06 20:14:02 +00001030 def testRevinfo(self):
1031 if not self.enabled:
1032 return
1033 options = self.Options()
1034 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1035 relpath=self.relpath)
1036 rev_info = scm.revinfo(options, (), None)
1037 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
1038
msb@chromium.orge28e4982009-09-25 20:51:45 +00001039
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001040class ManagedGitWrapperTestCaseMox(BaseTestCase):
1041 class OptionsObject(object):
1042 def __init__(self, verbose=False, revision=None, force=False):
1043 self.verbose = verbose
1044 self.revision = revision
1045 self.deps_os = None
1046 self.force = force
1047 self.reset = False
1048 self.nohooks = False
1049 # TODO(maruel): Test --jobs > 1.
1050 self.jobs = 1
1051
1052 def Options(self, *args, **kwargs):
1053 return self.OptionsObject(*args, **kwargs)
1054
1055 def setUp(self):
1056 BaseTestCase.setUp(self)
1057 self.fake_hash_1 = 't0ta11yf4k3'
1058 self.fake_hash_2 = '3v3nf4k3r'
1059 self.url = 'git://foo'
1060 self.root_dir = '/tmp'
1061 self.relpath = 'fake'
1062 self.base_path = os.path.join(self.root_dir, self.relpath)
1063
1064 def tearDown(self):
1065 BaseTestCase.tearDown(self)
1066
1067 def testGetUsableRevGit(self):
1068 # pylint: disable=E1101
1069 options = self.Options(verbose=True)
1070
1071 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1072 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1073 ).AndReturn(True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001074
1075 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1076 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1077 ).AndReturn(False)
1078
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001079 gclient_scm.scm.os.path.isdir(self.base_path).AndReturn(True)
1080
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)
1121
1122 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1123 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1124 ).AndReturn(True)
1125
1126 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1127 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1128 ).AndReturn(True)
1129 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=too_big
1130 ).AndReturn(False)
1131
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001132 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
1133 gclient_scm.os.path.isdir(self.base_path).MultipleTimes().AndReturn(True)
1134
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001135 self.mox.ReplayAll()
1136
1137 git_svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
1138 relpath=self.relpath)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001139 # Without an existing checkout, this should fail.
1140 # TODO(dbeam) Fix this. http://crbug.com/109184
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001141 self.assertRaises(gclient_scm.gclient_utils.Error,
1142 git_svn_scm.GetUsableRev, '1', options)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001143 # Given an SVN revision with a git-svn checkout, it should be translated to
1144 # a git sha1 and be usable.
1145 self.assertEquals(git_svn_scm.GetUsableRev('1', options),
1146 self.fake_hash_1)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001147 # Our fake HEAD rev is r2, so this should call git fetch and git svn fetch
1148 # to get more revs (pymox will complain if this doesn't happen). We mock an
1149 # optimized checkout the first time, so this run should call git fetch.
1150 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1151 self.fake_hash_2)
1152 # The time we pretend we're not optimized, so no git fetch should fire.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001153 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1154 self.fake_hash_2)
1155 # Given a git sha1 with a git-svn checkout, it should be used as is.
1156 self.assertEquals(git_svn_scm.GetUsableRev(self.fake_hash_1, options),
1157 self.fake_hash_1)
1158 # We currently check for seemingly valid SVN revisions by assuming 6 digit
1159 # numbers, so assure that numeric revs >= 1000000 don't work.
1160 self.assertRaises(gclient_scm.gclient_utils.Error,
1161 git_svn_scm.GetUsableRev, too_big, options)
1162
1163
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001164class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001165 def testUpdateUpdate(self):
1166 if not self.enabled:
1167 return
1168 options = self.Options()
1169 expected_file_list = []
1170 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1171 relpath=self.relpath)
1172 file_list = []
1173 options.revision = 'unmanaged'
1174 scm.update(options, (), file_list)
1175 self.assertEquals(file_list, expected_file_list)
1176 self.assertEquals(scm.revinfo(options, (), None),
1177 '069c602044c5388d2d15c3f875b057c852003458')
1178 self.checkstdout('________ unmanaged solution; skipping .\n')
1179
1180
msb@chromium.orge28e4982009-09-25 20:51:45 +00001181if __name__ == '__main__':
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001182 if '-v' in sys.argv:
1183 logging.basicConfig(
1184 level=logging.DEBUG,
1185 format='%(asctime).19s %(levelname)s %(filename)s:'
1186 '%(lineno)s %(message)s')
msb@chromium.orge28e4982009-09-25 20:51:45 +00001187 unittest.main()
1188
1189# vim: ts=2:sw=2:tw=80:et: