blob: 0d8e722d084d44faf8548375fe21d6ab2296ed5c [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.orgd579fcf2011-12-13 20:36:03 +0000242 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path).AndReturn([])
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000243 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000244 gclient_scm.scm.SVN.RunAndGetFileList(
245 options.verbose,
246 ['update', '--revision', 'BASE', '--ignore-externals'],
247 cwd=self.base_path,
248 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000249
250 self.mox.ReplayAll()
251 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
252 relpath=self.relpath)
253 file_list = []
254 scm.revert(options, self.args, file_list)
255
msb@chromium.orge28e4982009-09-25 20:51:45 +0000256 def testRevertDirectory(self):
257 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000258 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000259 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000260 items = [
261 ('~ ', 'a'),
262 ]
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000263 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path).AndReturn(items)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000264 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000265 gclient_scm.os.path.exists(file_path).AndReturn(True)
266 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000267 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000268 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000269 gclient_scm.gclient_utils.RemoveDirectory(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000270 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000271 gclient_scm.scm.SVN.RunAndGetFileList(
272 options.verbose,
273 ['update', '--revision', 'BASE', '--ignore-externals'],
274 cwd=self.base_path,
275 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000276
277 self.mox.ReplayAll()
278 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
279 relpath=self.relpath)
280 file_list2 = []
281 scm.revert(options, self.args, file_list2)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000282 self.checkstdout(('%s\n' % file_path))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000283
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000284 def testRevertDot(self):
285 self.mox.StubOutWithMock(gclient_scm.SVNWrapper, 'update')
286 options = self.Options(verbose=True)
287 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
288 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
289 items = [
290 ('~ ', '.'),
291 ]
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000292 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path).AndReturn(items)
maruel@chromium.org62087572012-04-24 23:16:28 +0000293 # RemoveDirectory() doesn't work on path ending with '.', like 'foo/.'.
294 file_path = self.base_path
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000295 gclient_scm.os.path.exists(file_path).AndReturn(True)
296 gclient_scm.os.path.isfile(file_path).AndReturn(False)
297 gclient_scm.os.path.islink(file_path).AndReturn(False)
298 gclient_scm.os.path.isdir(file_path).AndReturn(True)
299 gclient_scm.gclient_utils.RemoveDirectory(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000300 # pylint: disable=E1120
maruel@chromium.org428342a2011-11-10 15:46:33 +0000301 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000302 gclient_scm.SVNWrapper.update(options, [], ['.'])
303
304 self.mox.ReplayAll()
305 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
306 relpath=self.relpath)
307 file_list2 = []
308 scm.revert(options, self.args, file_list2)
maruel@chromium.org62087572012-04-24 23:16:28 +0000309 self.checkstdout(('%s\n' % os.path.join(file_path, '.')))
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000310
msb@chromium.orge28e4982009-09-25 20:51:45 +0000311 def testStatus(self):
312 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000313 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000314 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000315 options.verbose,
316 ['status'] + self.args + ['--ignore-externals'],
317 cwd=self.base_path,
318 file_list=[]).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000319
320 self.mox.ReplayAll()
321 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
322 relpath=self.relpath)
323 file_list = []
324 self.assertEqual(scm.status(options, self.args, file_list), None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000325
326 # TODO(maruel): TEST REVISIONS!!!
327 # TODO(maruel): TEST RELOCATE!!!
328 def testUpdateCheckout(self):
329 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000330 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000331 file_info.root = 'blah'
332 file_info.url = self.url
333 file_info.uuid = 'ABC'
334 file_info.revision = 42
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000335 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
336 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000337 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000338 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000339 parent = gclient_scm.os.path.dirname(self.base_path)
340 gclient_scm.os.path.exists(parent).AndReturn(False)
341 gclient_scm.os.makedirs(parent)
342 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000343 files_list = self.mox.CreateMockAnything()
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000344 gclient_scm.scm.SVN.Capture(['--version'], None
maruel@chromium.org669600d2010-09-01 19:06:31 +0000345 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000346 gclient_scm.scm.SVN.RunAndGetFileList(
347 options.verbose,
348 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
349 cwd=self.root_dir,
350 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000351 self.mox.ReplayAll()
352 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
353 relpath=self.relpath)
354 scm.update(options, (), files_list)
355
356 def testUpdateUpdate(self):
357 options = self.Options(verbose=True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000358 options.force = True
359 options.nohooks = False
360 file_info = {
361 'Repository Root': 'blah',
362 'URL': self.url,
363 'UUID': 'ABC',
364 'Revision': 42,
365 }
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000366 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
367 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000368 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000369
msb@chromium.orge28e4982009-09-25 20:51:45 +0000370 # Checkout or update.
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000371 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000372 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000373
374 # Verify no locked files.
375 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
376
msb@chromium.orge28e4982009-09-25 20:51:45 +0000377 # Cheat a bit here.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000378 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
379 ).AndReturn(file_info)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000380
381 # _AddAdditionalUpdateFlags()
382 gclient_scm.scm.SVN.Capture(['--version'], None
383 ).AndReturn('svn, version 1.5.1 (r32289)')
384
msb@chromium.orge28e4982009-09-25 20:51:45 +0000385 additional_args = []
386 if options.manually_grab_svn_rev:
387 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000388 additional_args.extend(['--force', '--ignore-externals'])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000389 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000390 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000391 options.verbose,
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000392 ['update', self.base_path] + additional_args,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000393 cwd=self.root_dir, file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000394
395 self.mox.ReplayAll()
396 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
397 relpath=self.relpath)
398 scm.update(options, (), files_list)
399
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000400 def testUpdateReset(self):
401 options = self.Options(verbose=True)
402 options.reset = True
403 file_info = {
404 'Repository Root': 'blah',
405 'URL': self.url,
406 'UUID': 'ABC',
407 'Revision': 42,
408 }
409 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
410 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
411 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
412
413 # Checkout or update.
414 dotted_path = join(self.base_path, '.')
415 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
416
417 # Create an untracked file and directory.
418 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
419 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
420
421 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
422 ).AndReturn(file_info)
423
424 self.mox.ReplayAll()
425 files_list = []
426 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
427 relpath=self.relpath)
428 scm.update(options, (), files_list)
429 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
430
431 def testUpdateResetDeleteUnversionedTrees(self):
432 options = self.Options(verbose=True)
433 options.reset = True
434 options.delete_unversioned_trees = True
435
436 file_info = {
437 'Repository Root': 'blah',
438 'URL': self.url,
439 'UUID': 'ABC',
440 'Revision': 42,
441 }
442 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
443 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
444 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
445
446 # Checkout or update.
447 dotted_path = join(self.base_path, '.')
448 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
449
450 # Create an untracked file and directory.
451 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
452 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
453
454 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
455 ).AndReturn(file_info)
456
457 # Confirm that the untracked file is removed.
458 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path
459 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
460 gclient_scm.os.path.isdir(join(self.base_path, 'dir')).AndReturn(True)
461 gclient_scm.os.path.isdir(join(self.base_path, 'file')).AndReturn(False)
462 gclient_scm.os.path.islink(join(self.base_path, 'dir')).AndReturn(False)
463 gclient_scm.gclient_utils.RemoveDirectory(join(self.base_path, 'dir'))
464
465 self.mox.ReplayAll()
466 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
467 relpath=self.relpath)
468 files_list = []
469 scm.update(options, (), files_list)
470 self.checkstdout(
471 ('\n_____ %s at 42\n'
472 '\n_____ removing unversioned directory dir\n') % self.relpath)
473
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000474 def testUpdateSingleCheckout(self):
475 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000476 file_info = {
477 'URL': self.url,
478 'Revision': 42,
479 }
tony@chromium.org57564662010-04-14 02:35:12 +0000480
481 # Checks to make sure that we support svn co --depth.
482 gclient_scm.scm.SVN.current_version = None
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000483 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000484 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000485 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
486 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000487
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000488 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000489 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000490 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000491
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000492 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000493 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000494 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000495 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000496 always=True,
497 cwd=self.root_dir)
498 gclient_scm.scm.SVN.RunAndGetFileList(
499 options.verbose,
500 ['update', 'DEPS', '--ignore-externals'],
501 cwd=self.base_path,
502 file_list=files_list)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000503
504 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000505 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
506 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
507 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000508 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
509 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
510 ).AndReturn(file_info)
tony@chromium.org57564662010-04-14 02:35:12 +0000511
512 self.mox.ReplayAll()
513 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
514 relpath=self.relpath)
515 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000516 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org57564662010-04-14 02:35:12 +0000517
518 def testUpdateSingleCheckoutSVN14(self):
519 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000520
521 # Checks to make sure that we support svn co --depth.
522 gclient_scm.scm.SVN.current_version = None
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000523 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000524 ).AndReturn('svn, version 1.4.4 (r25188)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000525 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org57564662010-04-14 02:35:12 +0000526
527 # When checking out a single file with svn 1.4, we use svn export
528 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000529 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000530 ['svn', 'export', join(self.url, 'DEPS'), join(self.base_path, 'DEPS')],
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000531 always=True, cwd=self.root_dir)
tony@chromium.org57564662010-04-14 02:35:12 +0000532
533 self.mox.ReplayAll()
534 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
535 relpath=self.relpath)
536 scm.updatesingle(options, ['DEPS'], files_list)
537
538 def testUpdateSingleCheckoutSVNUpgrade(self):
539 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000540 file_info = {
541 'URL': self.url,
542 'Revision': 42,
543 }
544
545 # Checks to make sure that we support svn co --depth.
546 gclient_scm.scm.SVN.current_version = None
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000547 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000548 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000549 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000550 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
551 # the old DEPS file.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000552 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(True)
553 gclient_scm.os.remove(join(self.base_path, 'DEPS'))
tony@chromium.org57564662010-04-14 02:35:12 +0000554
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000555 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000556 gclient_scm.scm.SVN.CaptureStatus(
557 None, join(self.base_path, '.')).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000558
tony@chromium.org57564662010-04-14 02:35:12 +0000559 # When checking out a single file, we issue an svn checkout and svn update.
560 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000561 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000562 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000563 always=True,
564 cwd=self.root_dir)
565 gclient_scm.scm.SVN.RunAndGetFileList(
566 options.verbose,
567 ['update', 'DEPS', '--ignore-externals'],
568 cwd=self.base_path,
569 file_list=files_list)
tony@chromium.org57564662010-04-14 02:35:12 +0000570
571 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000572 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
573 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
574 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000575 gclient_scm.scm.SVN._CaptureInfo(
576 [], join(self.base_path, ".")).AndReturn(file_info)
577 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
578 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000579
580 self.mox.ReplayAll()
581 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
582 relpath=self.relpath)
583 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000584 self.checkstdout(
585 ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000586
587 def testUpdateSingleUpdate(self):
588 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000589 file_info = {
590 'URL': self.url,
591 'Revision': 42,
592 }
tony@chromium.org57564662010-04-14 02:35:12 +0000593 # Checks to make sure that we support svn co --depth.
594 gclient_scm.scm.SVN.current_version = None
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000595 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000596 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000597 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000598
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000599 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000600 gclient_scm.scm.SVN.CaptureStatus(None, join(self.base_path, '.')
601 ).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000602
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000603 # Now we fall back on scm.update().
604 files_list = self.mox.CreateMockAnything()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000605 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
606 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
607 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000608 gclient_scm.scm.SVN._CaptureInfo(
609 [], join(self.base_path, '.')).AndReturn(file_info)
610 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
611 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000612
613 self.mox.ReplayAll()
614 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
615 relpath=self.relpath)
616 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000617 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000618
msb@chromium.orge28e4982009-09-25 20:51:45 +0000619 def testUpdateGit(self):
620 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000621 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
622 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000623
624 self.mox.ReplayAll()
625 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
626 relpath=self.relpath)
627 file_list = []
628 scm.update(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000629 self.checkstdout(
630 ('________ found .git directory; skipping %s\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000631
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000632 def testUpdateHg(self):
633 options = self.Options(verbose=True)
634 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
635 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(True)
636
637 self.mox.ReplayAll()
638 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
639 relpath=self.relpath)
640 file_list = []
641 scm.update(options, self.args, file_list)
642 self.checkstdout(
643 ('________ found .hg directory; skipping %s\n' % self.relpath))
644
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000645 def testGetUsableRevSVN(self):
646 # pylint: disable=E1101
647 options = self.Options(verbose=True)
648
649 # Mock SVN revision validity checking.
650 self.mox.StubOutWithMock(
651 gclient_scm.scm.SVN, 'IsValidRevision', True)
652 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 1)
653 ).AndReturn(True)
654 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 'fake')
655 ).AndReturn(False)
656
657 self.mox.ReplayAll()
658
659 svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir)
660 # With an SVN checkout, 1 an example of a valid usable rev.
661 self.assertEquals(svn_scm.GetUsableRev(1, options), 1)
662 # With an SVN checkout, a fake or unknown rev should raise an excpetion.
663 self.assertRaises(gclient_scm.gclient_utils.Error,
664 svn_scm.GetUsableRev, 'fake', options)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000665
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000666class BaseGitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
667 unittest.TestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000668 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000669 class OptionsObject(object):
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000670 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000671 self.verbose = verbose
672 self.revision = revision
673 self.manually_grab_svn_rev = True
674 self.deps_os = None
675 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000676 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000677 self.nohooks = False
bauerb@chromium.org4dd09372011-07-22 14:41:51 +0000678 self.merge = False
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000679 self.delete_unversioned_trees = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000680
681 sample_git_import = """blob
682mark :1
683data 6
684Hello
685
686blob
687mark :2
688data 4
689Bye
690
691reset refs/heads/master
692commit refs/heads/master
693mark :3
694author Bob <bob@example.com> 1253744361 -0700
695committer Bob <bob@example.com> 1253744361 -0700
696data 8
697A and B
698M 100644 :1 a
699M 100644 :2 b
700
701blob
702mark :4
703data 10
704Hello
705You
706
707blob
708mark :5
709data 8
710Bye
711You
712
713commit refs/heads/origin
714mark :6
715author Alice <alice@example.com> 1253744424 -0700
716committer Alice <alice@example.com> 1253744424 -0700
717data 13
718Personalized
719from :3
720M 100644 :4 a
721M 100644 :5 b
722
723reset refs/heads/master
724from :3
725"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000726 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000727 return self.OptionsObject(*args, **kwargs)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000728
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000729 @staticmethod
730 def CreateGitRepo(git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000731 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000732 try:
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000733 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000734 cwd=path).communicate()
735 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000736 # git is not available, skip this test.
737 return False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000738 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
739 stderr=STDOUT, cwd=path).communicate(input=git_import)
740 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
741 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000742 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000743 stderr=STDOUT, cwd=path).communicate()
744 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
745 stderr=STDOUT, cwd=path).communicate()
746 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
747 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000748 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000749 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000750 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000751
msb@chromium.orge28e4982009-09-25 20:51:45 +0000752 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000753 TestCaseUtils.setUp(self)
754 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000755 self.url = 'git://foo'
756 self.root_dir = tempfile.mkdtemp()
757 self.relpath = '.'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000758 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000759 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000760 StdoutCheck.setUp(self)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000761 self._original_GitBinaryExists = gclient_scm.GitWrapper.BinaryExists
762 self._original_SVNBinaryExists = gclient_scm.SVNWrapper.BinaryExists
763 gclient_scm.GitWrapper.BinaryExists = staticmethod(lambda : True)
764 gclient_scm.SVNWrapper.BinaryExists = staticmethod(lambda : True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000765
766 def tearDown(self):
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000767 StdoutCheck.tearDown(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000768 TestCaseUtils.tearDown(self)
769 unittest.TestCase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000770 rmtree(self.root_dir)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000771 gclient_scm.GitWrapper.BinaryExists = self._original_GitBinaryExists
772 gclient_scm.SVNWrapper.BinaryExists = self._original_SVNBinaryExists
msb@chromium.orge28e4982009-09-25 20:51:45 +0000773
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000774class ManagedGitWrapperTestCase(BaseGitWrapperTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000775 def testDir(self):
776 members = [
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000777 'BinaryExists',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000778 'FullUrlForRelativeUrl',
779 'GetRevisionDate',
780 'GetUsableRev',
781 'RunCommand',
782 'cleanup',
783 'diff',
784 'pack',
785 'relpath',
786 'revert',
787 'revinfo',
788 'runhooks',
789 'status',
790 'update',
791 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000792 ]
793
794 # If you add a member, be sure to add the relevant test!
795 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
796
797 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000798 if not self.enabled:
799 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000800 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000801 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000802 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
803 relpath=self.relpath)
804 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000805 scm.update(options, None, file_list)
806 gclient_scm.os.remove(file_path)
807 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000808 scm.revert(options, self.args, file_list)
809 self.assertEquals(file_list, [file_path])
810 file_list = []
811 scm.diff(options, self.args, file_list)
812 self.assertEquals(file_list, [])
szager@google.com85d3e3a2011-10-07 17:12:00 +0000813 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000814 'Fast-forward\n a | 1 +\n b | 1 +\n'
815 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000816 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000817 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
818 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
819 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000820
821 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000822 if not self.enabled:
823 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000824 options = self.Options()
825 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
826 relpath=self.relpath)
827 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000828 scm.update(options, None, file_list)
829 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000830 scm.revert(options, self.args, file_list)
831 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000832 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000833 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000834 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000835 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
836 'Fast-forward\n a | 1 +\n b | 1 +\n'
837 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000838 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
839 'HEAD is now at a7142dc Personalized\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000840 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000841
842 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000843 if not self.enabled:
844 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000845 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000846 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
847 relpath=self.relpath)
848 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000849 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000850 file_path = join(self.base_path, 'a')
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000851 open(file_path, 'a').writelines('touched\n')
852 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000853 scm.revert(options, self.args, file_list)
854 self.assertEquals(file_list, [file_path])
855 file_list = []
856 scm.diff(options, self.args, file_list)
857 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000858 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000859 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000860 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000861 'Fast-forward\n a | 1 +\n b | 1 +\n'
862 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000863 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000864 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
865 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
866 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000867
868 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000869 if not self.enabled:
870 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000871 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000872 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
873 relpath=self.relpath)
874 file_list = []
875 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000876 file_path = join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000877 f = open(file_path, 'w')
878 f.writelines('new\n')
879 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000880 Popen(['git', 'add', 'c'], stdout=PIPE,
881 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000882 file_list = []
883 scm.revert(options, self.args, file_list)
884 self.assertEquals(file_list, [file_path])
885 file_list = []
886 scm.diff(options, self.args, file_list)
887 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000888 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000889 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000890 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000891 'Fast-forward\n a | 1 +\n b | 1 +\n'
892 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000893 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000894 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
895 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
896 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000897
898 def testStatusNew(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()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000902 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000903 open(file_path, 'a').writelines('touched\n')
904 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
905 relpath=self.relpath)
906 file_list = []
907 scm.status(options, self.args, file_list)
908 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000909 self.checkstdout(
910 ('\n________ running \'git diff --name-status '
911 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000912 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000913
914 def testStatus2New(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()
918 expected_file_list = []
919 for f in ['a', 'b']:
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000920 file_path = join(self.base_path, f)
921 open(file_path, 'a').writelines('touched\n')
922 expected_file_list.extend([file_path])
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.status(options, self.args, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000927 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000928 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000929 self.checkstdout(
930 ('\n________ running \'git diff --name-status '
931 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000932 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000933
msb@chromium.orge28e4982009-09-25 20:51:45 +0000934 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000935 if not self.enabled:
936 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000937 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000938 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000939 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
940 relpath=self.relpath)
941 file_list = []
942 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000943 self.assertEquals(file_list, expected_file_list)
944 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000945 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000946 self.checkstdout(
947 '\n_____ . at refs/heads/master\n'
948 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
949 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000950
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000951 def testUpdateReset(self):
952 if not self.enabled:
953 return
954 options = self.Options()
955 options.reset = True
956
957 dir_path = join(self.base_path, 'c')
958 os.mkdir(dir_path)
959 open(join(dir_path, 'nested'), 'w').writelines('new\n')
960
961 file_path = join(self.base_path, 'file')
962 open(file_path, 'w').writelines('new\n')
963
964 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
965 relpath=self.relpath)
966 file_list = []
967 scm.update(options, (), file_list)
968 self.assert_(gclient_scm.os.path.isdir(dir_path))
969 self.assert_(gclient_scm.os.path.isfile(file_path))
970 self.checkstdout(
971 '\n________ running \'git reset --hard HEAD\' in \'%s\''
972 '\nHEAD is now at 069c602 A and B\n'
973 '\n_____ . at refs/heads/master\n'
974 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
975 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n'
976 % join(self.root_dir, '.'))
977
978 def testUpdateResetDeleteUnversionedTrees(self):
979 if not self.enabled:
980 return
981 options = self.Options()
982 options.reset = True
983 options.delete_unversioned_trees = True
984
985 dir_path = join(self.base_path, 'dir')
986 os.mkdir(dir_path)
987 open(join(dir_path, 'nested'), 'w').writelines('new\n')
988
989 file_path = join(self.base_path, 'file')
990 open(file_path, 'w').writelines('new\n')
991
992 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
993 relpath=self.relpath)
994 file_list = []
995 scm.update(options, (), file_list)
996 self.assert_(not gclient_scm.os.path.isdir(dir_path))
997 self.assert_(gclient_scm.os.path.isfile(file_path))
998 self.checkstdout(
999 '\n________ running \'git reset --hard HEAD\' in \'%s\''
1000 '\nHEAD is now at 069c602 A and B\n'
1001 '\n_____ . at refs/heads/master\n'
1002 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
1003 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n'
1004 '\n_____ removing unversioned directory dir/\n' % join(self.root_dir,
1005 '.'))
1006
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +00001007 def testUpdateUnstagedConflict(self):
1008 if not self.enabled:
1009 return
1010 options = self.Options()
1011 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1012 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001013 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001014 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001015 try:
1016 scm.update(options, (), [])
1017 self.fail()
maruel@chromium.orgfae707b2011-09-15 18:57:58 +00001018 except (gclient_scm.gclient_utils.Error, subprocess2.CalledProcessError):
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001019 # The exact exception text varies across git versions so it's not worth
1020 # verifying it. It's fine as long as it throws.
1021 pass
1022 # Manually flush stdout since we can't verify it's content accurately across
1023 # git versions.
1024 sys.stdout.getvalue()
1025 sys.stdout.close()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +00001026
msb@chromium.org5bde4852009-12-14 16:47:12 +00001027 def testUpdateConflict(self):
1028 if not self.enabled:
1029 return
1030 options = self.Options()
1031 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1032 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001033 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001034 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001035 scm._Run(['commit', '-am', 'test'], options)
1036 __builtin__.raw_input = lambda x: 'y'
1037 exception = ('Conflict while rebasing this branch.\n'
1038 'Fix the conflict and run gclient again.\n'
1039 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001040 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001041 exception = ('\n____ . at refs/heads/master\n'
1042 '\tYou have unstaged changes.\n'
1043 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001044 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001045 # The hash always changes. Use a cheap trick.
1046 start = ('\n________ running \'git commit -am test\' in \'%s\'\n'
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001047 '[new ') % join(self.root_dir, '.')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001048 end = ('] test\n 1 files changed, 1 insertions(+), '
1049 '1 deletions(-)\n\n_____ . at refs/heads/master\n'
1050 'Attempting rebase onto refs/remotes/origin/master...\n')
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +00001051 self.assertTrue(sys.stdout.getvalue().startswith(start))
1052 self.assertTrue(sys.stdout.getvalue().endswith(end))
1053 self.assertEquals(len(sys.stdout.getvalue()),
maruel@chromium.orgdd057f32010-09-20 19:33:31 +00001054 len(start) + len(end) + 7)
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +00001055 sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +00001056
msb@chromium.orge4af1ab2010-01-13 21:26:09 +00001057 def testUpdateNotGit(self):
1058 if not self.enabled:
1059 return
1060 options = self.Options()
1061 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1062 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001063 git_path = join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +00001064 rename(git_path, git_path + 'foo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001065 exception = ('\n____ . at refs/heads/master\n'
1066 '\tPath is not a git repo. No .git dir.\n'
1067 '\tTo resolve:\n'
1068 '\t\trm -rf .\n'
1069 '\tAnd run gclient sync again\n')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +00001070 self.assertRaisesError(exception, scm.update, options, (), [])
1071
msb@chromium.org0f282062009-11-06 20:14:02 +00001072 def testRevinfo(self):
1073 if not self.enabled:
1074 return
1075 options = self.Options()
1076 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1077 relpath=self.relpath)
1078 rev_info = scm.revinfo(options, (), None)
1079 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
1080
msb@chromium.orge28e4982009-09-25 20:51:45 +00001081
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001082class ManagedGitWrapperTestCaseMox(BaseTestCase):
1083 class OptionsObject(object):
1084 def __init__(self, verbose=False, revision=None, force=False):
1085 self.verbose = verbose
1086 self.revision = revision
1087 self.deps_os = None
1088 self.force = force
1089 self.reset = False
1090 self.nohooks = False
1091 # TODO(maruel): Test --jobs > 1.
1092 self.jobs = 1
1093
1094 def Options(self, *args, **kwargs):
1095 return self.OptionsObject(*args, **kwargs)
1096
1097 def setUp(self):
1098 BaseTestCase.setUp(self)
1099 self.fake_hash_1 = 't0ta11yf4k3'
1100 self.fake_hash_2 = '3v3nf4k3r'
1101 self.url = 'git://foo'
1102 self.root_dir = '/tmp'
1103 self.relpath = 'fake'
1104 self.base_path = os.path.join(self.root_dir, self.relpath)
1105
1106 def tearDown(self):
1107 BaseTestCase.tearDown(self)
1108
1109 def testGetUsableRevGit(self):
1110 # pylint: disable=E1101
1111 options = self.Options(verbose=True)
1112
1113 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1114 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1115 ).AndReturn(True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001116
1117 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1118 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1119 ).AndReturn(False)
1120
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001121 gclient_scm.scm.os.path.isdir(self.base_path).AndReturn(True)
1122
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001123 self.mox.ReplayAll()
1124
1125 git_scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1126 relpath=self.relpath)
1127 # A [fake] git sha1 with a git repo should work (this is in the case that
1128 # the LKGR gets flipped to git sha1's some day).
1129 self.assertEquals(git_scm.GetUsableRev(self.fake_hash_1, options),
1130 self.fake_hash_1)
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001131 # An SVN rev with an existing purely git repo should raise an exception.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001132 self.assertRaises(gclient_scm.gclient_utils.Error,
1133 git_scm.GetUsableRev, '1', options)
1134
1135 def testGetUsableRevGitSvn(self):
1136 # pylint: disable=E1101
1137 options = self.Options()
1138 too_big = str(1e7)
1139
1140 # Pretend like the git-svn repo's HEAD is at r2.
1141 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetGitSvnHeadRev', True)
1142 gclient_scm.scm.GIT.GetGitSvnHeadRev(cwd=self.base_path).MultipleTimes(
1143 ).AndReturn(2)
1144
1145 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetSha1ForSvnRev', True)
1146 # r1 -> first fake hash, r3 -> second fake hash.
1147 gclient_scm.scm.GIT.GetSha1ForSvnRev(cwd=self.base_path, rev='1'
1148 ).AndReturn(self.fake_hash_1)
1149 gclient_scm.scm.GIT.GetSha1ForSvnRev(cwd=self.base_path, rev='3'
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001150 ).MultipleTimes().AndReturn(self.fake_hash_2)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001151
1152 # Ensure that we call git svn fetch if our LKGR is > the git-svn HEAD rev.
1153 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'Capture', True)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001154 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1155 cwd=self.base_path).AndReturn('blah')
1156 gclient_scm.scm.GIT.Capture(['fetch'], cwd=self.base_path)
1157 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
1158 error = subprocess2.CalledProcessError(1, 'cmd', '/cwd', 'stdout', 'stderr')
1159 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1160 cwd=self.base_path).AndRaise(error)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001161 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
1162
1163 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1164 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1165 ).AndReturn(True)
1166
1167 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1168 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1169 ).AndReturn(True)
1170 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=too_big
1171 ).AndReturn(False)
1172
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001173 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
1174 gclient_scm.os.path.isdir(self.base_path).MultipleTimes().AndReturn(True)
1175
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001176 self.mox.ReplayAll()
1177
1178 git_svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
1179 relpath=self.relpath)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001180 # Without an existing checkout, this should fail.
1181 # TODO(dbeam) Fix this. http://crbug.com/109184
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001182 self.assertRaises(gclient_scm.gclient_utils.Error,
1183 git_svn_scm.GetUsableRev, '1', options)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001184 # Given an SVN revision with a git-svn checkout, it should be translated to
1185 # a git sha1 and be usable.
1186 self.assertEquals(git_svn_scm.GetUsableRev('1', options),
1187 self.fake_hash_1)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001188 # Our fake HEAD rev is r2, so this should call git fetch and git svn fetch
1189 # to get more revs (pymox will complain if this doesn't happen). We mock an
1190 # optimized checkout the first time, so this run should call git fetch.
1191 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1192 self.fake_hash_2)
1193 # The time we pretend we're not optimized, so no git fetch should fire.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001194 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1195 self.fake_hash_2)
1196 # Given a git sha1 with a git-svn checkout, it should be used as is.
1197 self.assertEquals(git_svn_scm.GetUsableRev(self.fake_hash_1, options),
1198 self.fake_hash_1)
1199 # We currently check for seemingly valid SVN revisions by assuming 6 digit
1200 # numbers, so assure that numeric revs >= 1000000 don't work.
1201 self.assertRaises(gclient_scm.gclient_utils.Error,
1202 git_svn_scm.GetUsableRev, too_big, options)
1203
1204
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001205class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001206 def testUpdateUpdate(self):
1207 if not self.enabled:
1208 return
1209 options = self.Options()
1210 expected_file_list = []
1211 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1212 relpath=self.relpath)
1213 file_list = []
1214 options.revision = 'unmanaged'
1215 scm.update(options, (), file_list)
1216 self.assertEquals(file_list, expected_file_list)
1217 self.assertEquals(scm.revinfo(options, (), None),
1218 '069c602044c5388d2d15c3f875b057c852003458')
1219 self.checkstdout('________ unmanaged solution; skipping .\n')
1220
1221
msb@chromium.orge28e4982009-09-25 20:51:45 +00001222if __name__ == '__main__':
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001223 if '-v' in sys.argv:
1224 logging.basicConfig(
1225 level=logging.DEBUG,
1226 format='%(asctime).19s %(levelname)s %(filename)s:'
1227 '%(lineno)s %(message)s')
msb@chromium.orge28e4982009-09-25 20:51:45 +00001228 unittest.main()
1229
1230# vim: ts=2:sw=2:tw=80:et: