blob: a8d006317f8c7f466249fd49cb73c1714d9ccb26 [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)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000181 gclient_scm.scm.SVN.Capture(['--version'], None
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000182 ).AndReturn('svn, version 1.5.1 (r32289)')
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()
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000222 gclient_scm.scm.SVN.Capture(['--version'], None
223 ).AndReturn('svn, version 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()
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000347 gclient_scm.scm.SVN.Capture(['--version'], None
maruel@chromium.org669600d2010-09-01 19:06:31 +0000348 ).AndReturn('svn, version 1.5.1 (r32289)')
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()
385 gclient_scm.scm.SVN.Capture(['--version'], None
386 ).AndReturn('svn, version 1.5.1 (r32289)')
387
msb@chromium.orge28e4982009-09-25 20:51:45 +0000388 additional_args = []
389 if options.manually_grab_svn_rev:
390 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000391 additional_args.extend(['--force', '--ignore-externals'])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000392 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000393 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000394 options.verbose,
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000395 ['update', self.base_path] + additional_args,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000396 cwd=self.root_dir, file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000397
398 self.mox.ReplayAll()
399 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
400 relpath=self.relpath)
401 scm.update(options, (), files_list)
402
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000403 def testUpdateReset(self):
404 options = self.Options(verbose=True)
405 options.reset = True
406 file_info = {
407 'Repository Root': 'blah',
408 'URL': self.url,
409 'UUID': 'ABC',
410 'Revision': 42,
411 }
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
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000486 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000487 ).AndReturn('svn, version 1.5.1 (r32289)')
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
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000526 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000527 ).AndReturn('svn, version 1.4.4 (r25188)')
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
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000550 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000551 ).AndReturn('svn, version 1.5.1 (r32289)')
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
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000598 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000599 ).AndReturn('svn, version 1.5.1 (r32289)')
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()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000753 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000754
msb@chromium.orge28e4982009-09-25 20:51:45 +0000755 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000756 TestCaseUtils.setUp(self)
757 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000758 self.url = 'git://foo'
759 self.root_dir = tempfile.mkdtemp()
760 self.relpath = '.'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000761 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000762 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000763 StdoutCheck.setUp(self)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000764 self._original_GitBinaryExists = gclient_scm.GitWrapper.BinaryExists
765 self._original_SVNBinaryExists = gclient_scm.SVNWrapper.BinaryExists
766 gclient_scm.GitWrapper.BinaryExists = staticmethod(lambda : True)
767 gclient_scm.SVNWrapper.BinaryExists = staticmethod(lambda : True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000768
769 def tearDown(self):
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000770 StdoutCheck.tearDown(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000771 TestCaseUtils.tearDown(self)
772 unittest.TestCase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000773 rmtree(self.root_dir)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000774 gclient_scm.GitWrapper.BinaryExists = self._original_GitBinaryExists
775 gclient_scm.SVNWrapper.BinaryExists = self._original_SVNBinaryExists
msb@chromium.orge28e4982009-09-25 20:51:45 +0000776
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000777class ManagedGitWrapperTestCase(BaseGitWrapperTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000778 def testDir(self):
779 members = [
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000780 'BinaryExists',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000781 'FullUrlForRelativeUrl',
782 'GetRevisionDate',
783 'GetUsableRev',
784 'RunCommand',
785 'cleanup',
786 'diff',
787 'pack',
szager@chromium.orgd4af6622012-06-04 22:13:55 +0000788 'UpdateSubmoduleConfig',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000789 'relpath',
790 'revert',
791 'revinfo',
792 'runhooks',
793 'status',
794 'update',
795 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000796 ]
797
798 # If you add a member, be sure to add the relevant test!
799 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
800
801 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000802 if not self.enabled:
803 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000804 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000805 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000806 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
807 relpath=self.relpath)
808 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000809 scm.update(options, None, file_list)
810 gclient_scm.os.remove(file_path)
811 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000812 scm.revert(options, self.args, file_list)
813 self.assertEquals(file_list, [file_path])
814 file_list = []
815 scm.diff(options, self.args, file_list)
816 self.assertEquals(file_list, [])
szager@google.com85d3e3a2011-10-07 17:12:00 +0000817 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000818
819 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000820 if not self.enabled:
821 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000822 options = self.Options()
823 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
824 relpath=self.relpath)
825 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000826 scm.update(options, None, file_list)
827 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000828 scm.revert(options, self.args, file_list)
829 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000830 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000831 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000832 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000833
834 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000835 if not self.enabled:
836 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000837 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000838 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
839 relpath=self.relpath)
840 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000841 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000842 file_path = join(self.base_path, 'a')
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000843 open(file_path, 'a').writelines('touched\n')
844 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000845 scm.revert(options, self.args, file_list)
846 self.assertEquals(file_list, [file_path])
847 file_list = []
848 scm.diff(options, self.args, file_list)
849 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000850 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000851 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000852 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000853
854 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000855 if not self.enabled:
856 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000857 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000858 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
859 relpath=self.relpath)
860 file_list = []
861 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000862 file_path = join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000863 f = open(file_path, 'w')
864 f.writelines('new\n')
865 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000866 Popen(['git', 'add', 'c'], stdout=PIPE,
867 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000868 file_list = []
869 scm.revert(options, self.args, file_list)
870 self.assertEquals(file_list, [file_path])
871 file_list = []
872 scm.diff(options, self.args, file_list)
873 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000874 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000875 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000876 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000877
878 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000879 if not self.enabled:
880 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000881 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000882 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000883 open(file_path, 'a').writelines('touched\n')
884 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
885 relpath=self.relpath)
886 file_list = []
887 scm.status(options, self.args, file_list)
888 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000889 self.checkstdout(
890 ('\n________ running \'git diff --name-status '
891 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000892 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000893
894 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000895 if not self.enabled:
896 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000897 options = self.Options()
898 expected_file_list = []
899 for f in ['a', 'b']:
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000900 file_path = join(self.base_path, f)
901 open(file_path, 'a').writelines('touched\n')
902 expected_file_list.extend([file_path])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000903 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
904 relpath=self.relpath)
905 file_list = []
906 scm.status(options, self.args, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000907 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000908 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000909 self.checkstdout(
910 ('\n________ running \'git diff --name-status '
911 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000912 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000913
msb@chromium.orge28e4982009-09-25 20:51:45 +0000914 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000915 if not self.enabled:
916 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000917 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000918 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000919 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
920 relpath=self.relpath)
921 file_list = []
922 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000923 self.assertEquals(file_list, expected_file_list)
924 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000925 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000926 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000927
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000928 def testUpdateReset(self):
929 if not self.enabled:
930 return
931 options = self.Options()
932 options.reset = True
933
934 dir_path = join(self.base_path, 'c')
935 os.mkdir(dir_path)
936 open(join(dir_path, 'nested'), 'w').writelines('new\n')
937
938 file_path = join(self.base_path, 'file')
939 open(file_path, 'w').writelines('new\n')
940
941 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
942 relpath=self.relpath)
943 file_list = []
944 scm.update(options, (), file_list)
945 self.assert_(gclient_scm.os.path.isdir(dir_path))
946 self.assert_(gclient_scm.os.path.isfile(file_path))
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000947 sys.stdout.close()
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000948
949 def testUpdateResetDeleteUnversionedTrees(self):
950 if not self.enabled:
951 return
952 options = self.Options()
953 options.reset = True
954 options.delete_unversioned_trees = True
955
956 dir_path = join(self.base_path, 'dir')
957 os.mkdir(dir_path)
958 open(join(dir_path, 'nested'), 'w').writelines('new\n')
959
960 file_path = join(self.base_path, 'file')
961 open(file_path, 'w').writelines('new\n')
962
963 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
964 relpath=self.relpath)
965 file_list = []
966 scm.update(options, (), file_list)
967 self.assert_(not gclient_scm.os.path.isdir(dir_path))
968 self.assert_(gclient_scm.os.path.isfile(file_path))
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000969 sys.stdout.close()
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000970
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000971 def testUpdateUnstagedConflict(self):
972 if not self.enabled:
973 return
974 options = self.Options()
975 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
976 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000977 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000978 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000979 try:
980 scm.update(options, (), [])
981 self.fail()
maruel@chromium.orgfae707b2011-09-15 18:57:58 +0000982 except (gclient_scm.gclient_utils.Error, subprocess2.CalledProcessError):
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000983 # The exact exception text varies across git versions so it's not worth
984 # verifying it. It's fine as long as it throws.
985 pass
986 # Manually flush stdout since we can't verify it's content accurately across
987 # git versions.
988 sys.stdout.getvalue()
989 sys.stdout.close()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000990
msb@chromium.org5bde4852009-12-14 16:47:12 +0000991 def testUpdateConflict(self):
992 if not self.enabled:
993 return
994 options = self.Options()
995 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
996 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000997 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000998 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000999 scm._Run(['commit', '-am', 'test'], options)
1000 __builtin__.raw_input = lambda x: 'y'
1001 exception = ('Conflict while rebasing this branch.\n'
1002 'Fix the conflict and run gclient again.\n'
1003 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001004 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001005 exception = ('\n____ . at refs/heads/master\n'
1006 '\tYou have unstaged changes.\n'
1007 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001008 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +00001009 sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +00001010
msb@chromium.orge4af1ab2010-01-13 21:26:09 +00001011 def testUpdateNotGit(self):
1012 if not self.enabled:
1013 return
1014 options = self.Options()
1015 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1016 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001017 git_path = join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +00001018 rename(git_path, git_path + 'foo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001019 exception = ('\n____ . at refs/heads/master\n'
1020 '\tPath is not a git repo. No .git dir.\n'
1021 '\tTo resolve:\n'
1022 '\t\trm -rf .\n'
1023 '\tAnd run gclient sync again\n')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +00001024 self.assertRaisesError(exception, scm.update, options, (), [])
1025
msb@chromium.org0f282062009-11-06 20:14:02 +00001026 def testRevinfo(self):
1027 if not self.enabled:
1028 return
1029 options = self.Options()
1030 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1031 relpath=self.relpath)
1032 rev_info = scm.revinfo(options, (), None)
1033 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
1034
msb@chromium.orge28e4982009-09-25 20:51:45 +00001035
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001036class ManagedGitWrapperTestCaseMox(BaseTestCase):
1037 class OptionsObject(object):
1038 def __init__(self, verbose=False, revision=None, force=False):
1039 self.verbose = verbose
1040 self.revision = revision
1041 self.deps_os = None
1042 self.force = force
1043 self.reset = False
1044 self.nohooks = False
1045 # TODO(maruel): Test --jobs > 1.
1046 self.jobs = 1
1047
1048 def Options(self, *args, **kwargs):
1049 return self.OptionsObject(*args, **kwargs)
1050
1051 def setUp(self):
1052 BaseTestCase.setUp(self)
1053 self.fake_hash_1 = 't0ta11yf4k3'
1054 self.fake_hash_2 = '3v3nf4k3r'
1055 self.url = 'git://foo'
1056 self.root_dir = '/tmp'
1057 self.relpath = 'fake'
1058 self.base_path = os.path.join(self.root_dir, self.relpath)
1059
1060 def tearDown(self):
1061 BaseTestCase.tearDown(self)
1062
1063 def testGetUsableRevGit(self):
1064 # pylint: disable=E1101
1065 options = self.Options(verbose=True)
1066
1067 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1068 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1069 ).AndReturn(True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001070
1071 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1072 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1073 ).AndReturn(False)
1074
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001075 gclient_scm.scm.os.path.isdir(self.base_path).AndReturn(True)
1076
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001077 self.mox.ReplayAll()
1078
1079 git_scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1080 relpath=self.relpath)
1081 # A [fake] git sha1 with a git repo should work (this is in the case that
1082 # the LKGR gets flipped to git sha1's some day).
1083 self.assertEquals(git_scm.GetUsableRev(self.fake_hash_1, options),
1084 self.fake_hash_1)
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001085 # An SVN rev with an existing purely git repo should raise an exception.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001086 self.assertRaises(gclient_scm.gclient_utils.Error,
1087 git_scm.GetUsableRev, '1', options)
1088
1089 def testGetUsableRevGitSvn(self):
1090 # pylint: disable=E1101
1091 options = self.Options()
1092 too_big = str(1e7)
1093
1094 # Pretend like the git-svn repo's HEAD is at r2.
1095 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetGitSvnHeadRev', True)
1096 gclient_scm.scm.GIT.GetGitSvnHeadRev(cwd=self.base_path).MultipleTimes(
1097 ).AndReturn(2)
1098
1099 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetSha1ForSvnRev', True)
1100 # r1 -> first fake hash, r3 -> second fake hash.
1101 gclient_scm.scm.GIT.GetSha1ForSvnRev(cwd=self.base_path, rev='1'
1102 ).AndReturn(self.fake_hash_1)
1103 gclient_scm.scm.GIT.GetSha1ForSvnRev(cwd=self.base_path, rev='3'
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001104 ).MultipleTimes().AndReturn(self.fake_hash_2)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001105
1106 # Ensure that we call git svn fetch if our LKGR is > the git-svn HEAD rev.
1107 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'Capture', True)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001108 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1109 cwd=self.base_path).AndReturn('blah')
1110 gclient_scm.scm.GIT.Capture(['fetch'], cwd=self.base_path)
1111 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
1112 error = subprocess2.CalledProcessError(1, 'cmd', '/cwd', 'stdout', 'stderr')
1113 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1114 cwd=self.base_path).AndRaise(error)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001115 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
1116
1117 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1118 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1119 ).AndReturn(True)
1120
1121 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1122 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1123 ).AndReturn(True)
1124 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=too_big
1125 ).AndReturn(False)
1126
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001127 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
1128 gclient_scm.os.path.isdir(self.base_path).MultipleTimes().AndReturn(True)
1129
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001130 self.mox.ReplayAll()
1131
1132 git_svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
1133 relpath=self.relpath)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001134 # Without an existing checkout, this should fail.
1135 # TODO(dbeam) Fix this. http://crbug.com/109184
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001136 self.assertRaises(gclient_scm.gclient_utils.Error,
1137 git_svn_scm.GetUsableRev, '1', options)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001138 # Given an SVN revision with a git-svn checkout, it should be translated to
1139 # a git sha1 and be usable.
1140 self.assertEquals(git_svn_scm.GetUsableRev('1', options),
1141 self.fake_hash_1)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001142 # Our fake HEAD rev is r2, so this should call git fetch and git svn fetch
1143 # to get more revs (pymox will complain if this doesn't happen). We mock an
1144 # optimized checkout the first time, so this run should call git fetch.
1145 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1146 self.fake_hash_2)
1147 # The time we pretend we're not optimized, so no git fetch should fire.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001148 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1149 self.fake_hash_2)
1150 # Given a git sha1 with a git-svn checkout, it should be used as is.
1151 self.assertEquals(git_svn_scm.GetUsableRev(self.fake_hash_1, options),
1152 self.fake_hash_1)
1153 # We currently check for seemingly valid SVN revisions by assuming 6 digit
1154 # numbers, so assure that numeric revs >= 1000000 don't work.
1155 self.assertRaises(gclient_scm.gclient_utils.Error,
1156 git_svn_scm.GetUsableRev, too_big, options)
1157
1158
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001159class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001160 def testUpdateUpdate(self):
1161 if not self.enabled:
1162 return
1163 options = self.Options()
1164 expected_file_list = []
1165 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1166 relpath=self.relpath)
1167 file_list = []
1168 options.revision = 'unmanaged'
1169 scm.update(options, (), file_list)
1170 self.assertEquals(file_list, expected_file_list)
1171 self.assertEquals(scm.revinfo(options, (), None),
1172 '069c602044c5388d2d15c3f875b057c852003458')
1173 self.checkstdout('________ unmanaged solution; skipping .\n')
1174
1175
msb@chromium.orge28e4982009-09-25 20:51:45 +00001176if __name__ == '__main__':
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001177 if '-v' in sys.argv:
1178 logging.basicConfig(
1179 level=logging.DEBUG,
1180 format='%(asctime).19s %(levelname)s %(filename)s:'
1181 '%(lineno)s %(message)s')
msb@chromium.orge28e4982009-09-25 20:51:45 +00001182 unittest.main()
1183
1184# vim: ts=2:sw=2:tw=80:et: