blob: 1767f5200c152b602688dfab5f148f106fa9f26d [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 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000818 'Fast-forward\n a | 1 +\n b | 1 +\n'
819 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000820 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000821 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
822 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
823 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000824
825 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000826 if not self.enabled:
827 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000828 options = self.Options()
829 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
830 relpath=self.relpath)
831 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000832 scm.update(options, None, file_list)
833 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000834 scm.revert(options, self.args, file_list)
835 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000836 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000837 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000838 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000839 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
840 'Fast-forward\n a | 1 +\n b | 1 +\n'
841 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000842 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
843 'HEAD is now at a7142dc Personalized\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000844 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000845
846 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000847 if not self.enabled:
848 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000849 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000850 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
851 relpath=self.relpath)
852 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000853 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000854 file_path = join(self.base_path, 'a')
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000855 open(file_path, 'a').writelines('touched\n')
856 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000857 scm.revert(options, self.args, file_list)
858 self.assertEquals(file_list, [file_path])
859 file_list = []
860 scm.diff(options, self.args, file_list)
861 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000862 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000863 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000864 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000865 'Fast-forward\n a | 1 +\n b | 1 +\n'
866 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000867 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000868 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
869 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
870 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000871
872 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000873 if not self.enabled:
874 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000875 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000876 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
877 relpath=self.relpath)
878 file_list = []
879 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000880 file_path = join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000881 f = open(file_path, 'w')
882 f.writelines('new\n')
883 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000884 Popen(['git', 'add', 'c'], stdout=PIPE,
885 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000886 file_list = []
887 scm.revert(options, self.args, file_list)
888 self.assertEquals(file_list, [file_path])
889 file_list = []
890 scm.diff(options, self.args, file_list)
891 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000892 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000893 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000894 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000895 'Fast-forward\n a | 1 +\n b | 1 +\n'
896 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000897 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000898 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
899 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
900 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000901
902 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000903 if not self.enabled:
904 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000905 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000906 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000907 open(file_path, 'a').writelines('touched\n')
908 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
909 relpath=self.relpath)
910 file_list = []
911 scm.status(options, self.args, file_list)
912 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000913 self.checkstdout(
914 ('\n________ running \'git diff --name-status '
915 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000916 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000917
918 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000919 if not self.enabled:
920 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000921 options = self.Options()
922 expected_file_list = []
923 for f in ['a', 'b']:
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000924 file_path = join(self.base_path, f)
925 open(file_path, 'a').writelines('touched\n')
926 expected_file_list.extend([file_path])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000927 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
928 relpath=self.relpath)
929 file_list = []
930 scm.status(options, self.args, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000931 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000932 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000933 self.checkstdout(
934 ('\n________ running \'git diff --name-status '
935 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000936 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000937
msb@chromium.orge28e4982009-09-25 20:51:45 +0000938 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000939 if not self.enabled:
940 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000941 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000942 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000943 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
944 relpath=self.relpath)
945 file_list = []
946 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000947 self.assertEquals(file_list, expected_file_list)
948 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000949 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000950 self.checkstdout(
951 '\n_____ . at refs/heads/master\n'
952 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
953 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000954
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000955 def testUpdateReset(self):
956 if not self.enabled:
957 return
958 options = self.Options()
959 options.reset = True
960
961 dir_path = join(self.base_path, 'c')
962 os.mkdir(dir_path)
963 open(join(dir_path, 'nested'), 'w').writelines('new\n')
964
965 file_path = join(self.base_path, 'file')
966 open(file_path, 'w').writelines('new\n')
967
968 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
969 relpath=self.relpath)
970 file_list = []
971 scm.update(options, (), file_list)
972 self.assert_(gclient_scm.os.path.isdir(dir_path))
973 self.assert_(gclient_scm.os.path.isfile(file_path))
974 self.checkstdout(
975 '\n________ running \'git reset --hard HEAD\' in \'%s\''
976 '\nHEAD is now at 069c602 A and B\n'
977 '\n_____ . at refs/heads/master\n'
978 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
979 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n'
980 % join(self.root_dir, '.'))
981
982 def testUpdateResetDeleteUnversionedTrees(self):
983 if not self.enabled:
984 return
985 options = self.Options()
986 options.reset = True
987 options.delete_unversioned_trees = True
988
989 dir_path = join(self.base_path, 'dir')
990 os.mkdir(dir_path)
991 open(join(dir_path, 'nested'), 'w').writelines('new\n')
992
993 file_path = join(self.base_path, 'file')
994 open(file_path, 'w').writelines('new\n')
995
996 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
997 relpath=self.relpath)
998 file_list = []
999 scm.update(options, (), file_list)
1000 self.assert_(not gclient_scm.os.path.isdir(dir_path))
1001 self.assert_(gclient_scm.os.path.isfile(file_path))
1002 self.checkstdout(
1003 '\n________ running \'git reset --hard HEAD\' in \'%s\''
1004 '\nHEAD is now at 069c602 A and B\n'
1005 '\n_____ . at refs/heads/master\n'
1006 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
1007 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n'
1008 '\n_____ removing unversioned directory dir/\n' % join(self.root_dir,
1009 '.'))
1010
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +00001011 def testUpdateUnstagedConflict(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 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001018 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001019 try:
1020 scm.update(options, (), [])
1021 self.fail()
maruel@chromium.orgfae707b2011-09-15 18:57:58 +00001022 except (gclient_scm.gclient_utils.Error, subprocess2.CalledProcessError):
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001023 # The exact exception text varies across git versions so it's not worth
1024 # verifying it. It's fine as long as it throws.
1025 pass
1026 # Manually flush stdout since we can't verify it's content accurately across
1027 # git versions.
1028 sys.stdout.getvalue()
1029 sys.stdout.close()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +00001030
msb@chromium.org5bde4852009-12-14 16:47:12 +00001031 def testUpdateConflict(self):
1032 if not self.enabled:
1033 return
1034 options = self.Options()
1035 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1036 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001037 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001038 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001039 scm._Run(['commit', '-am', 'test'], options)
1040 __builtin__.raw_input = lambda x: 'y'
1041 exception = ('Conflict while rebasing this branch.\n'
1042 'Fix the conflict and run gclient again.\n'
1043 'See \'man git-rebase\' for details.\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 exception = ('\n____ . at refs/heads/master\n'
1046 '\tYou have unstaged changes.\n'
1047 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001048 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001049 # The hash always changes. Use a cheap trick.
1050 start = ('\n________ running \'git commit -am test\' in \'%s\'\n'
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001051 '[new ') % join(self.root_dir, '.')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001052 end = ('] test\n 1 files changed, 1 insertions(+), '
1053 '1 deletions(-)\n\n_____ . at refs/heads/master\n'
1054 'Attempting rebase onto refs/remotes/origin/master...\n')
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +00001055 self.assertTrue(sys.stdout.getvalue().startswith(start))
1056 self.assertTrue(sys.stdout.getvalue().endswith(end))
1057 self.assertEquals(len(sys.stdout.getvalue()),
maruel@chromium.orgdd057f32010-09-20 19:33:31 +00001058 len(start) + len(end) + 7)
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +00001059 sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +00001060
msb@chromium.orge4af1ab2010-01-13 21:26:09 +00001061 def testUpdateNotGit(self):
1062 if not self.enabled:
1063 return
1064 options = self.Options()
1065 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1066 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001067 git_path = join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +00001068 rename(git_path, git_path + 'foo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001069 exception = ('\n____ . at refs/heads/master\n'
1070 '\tPath is not a git repo. No .git dir.\n'
1071 '\tTo resolve:\n'
1072 '\t\trm -rf .\n'
1073 '\tAnd run gclient sync again\n')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +00001074 self.assertRaisesError(exception, scm.update, options, (), [])
1075
msb@chromium.org0f282062009-11-06 20:14:02 +00001076 def testRevinfo(self):
1077 if not self.enabled:
1078 return
1079 options = self.Options()
1080 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1081 relpath=self.relpath)
1082 rev_info = scm.revinfo(options, (), None)
1083 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
1084
msb@chromium.orge28e4982009-09-25 20:51:45 +00001085
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001086class ManagedGitWrapperTestCaseMox(BaseTestCase):
1087 class OptionsObject(object):
1088 def __init__(self, verbose=False, revision=None, force=False):
1089 self.verbose = verbose
1090 self.revision = revision
1091 self.deps_os = None
1092 self.force = force
1093 self.reset = False
1094 self.nohooks = False
1095 # TODO(maruel): Test --jobs > 1.
1096 self.jobs = 1
1097
1098 def Options(self, *args, **kwargs):
1099 return self.OptionsObject(*args, **kwargs)
1100
1101 def setUp(self):
1102 BaseTestCase.setUp(self)
1103 self.fake_hash_1 = 't0ta11yf4k3'
1104 self.fake_hash_2 = '3v3nf4k3r'
1105 self.url = 'git://foo'
1106 self.root_dir = '/tmp'
1107 self.relpath = 'fake'
1108 self.base_path = os.path.join(self.root_dir, self.relpath)
1109
1110 def tearDown(self):
1111 BaseTestCase.tearDown(self)
1112
1113 def testGetUsableRevGit(self):
1114 # pylint: disable=E1101
1115 options = self.Options(verbose=True)
1116
1117 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1118 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1119 ).AndReturn(True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001120
1121 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1122 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1123 ).AndReturn(False)
1124
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001125 gclient_scm.scm.os.path.isdir(self.base_path).AndReturn(True)
1126
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001127 self.mox.ReplayAll()
1128
1129 git_scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1130 relpath=self.relpath)
1131 # A [fake] git sha1 with a git repo should work (this is in the case that
1132 # the LKGR gets flipped to git sha1's some day).
1133 self.assertEquals(git_scm.GetUsableRev(self.fake_hash_1, options),
1134 self.fake_hash_1)
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001135 # An SVN rev with an existing purely git repo should raise an exception.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001136 self.assertRaises(gclient_scm.gclient_utils.Error,
1137 git_scm.GetUsableRev, '1', options)
1138
1139 def testGetUsableRevGitSvn(self):
1140 # pylint: disable=E1101
1141 options = self.Options()
1142 too_big = str(1e7)
1143
1144 # Pretend like the git-svn repo's HEAD is at r2.
1145 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetGitSvnHeadRev', True)
1146 gclient_scm.scm.GIT.GetGitSvnHeadRev(cwd=self.base_path).MultipleTimes(
1147 ).AndReturn(2)
1148
1149 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetSha1ForSvnRev', True)
1150 # r1 -> first fake hash, r3 -> second fake hash.
1151 gclient_scm.scm.GIT.GetSha1ForSvnRev(cwd=self.base_path, rev='1'
1152 ).AndReturn(self.fake_hash_1)
1153 gclient_scm.scm.GIT.GetSha1ForSvnRev(cwd=self.base_path, rev='3'
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001154 ).MultipleTimes().AndReturn(self.fake_hash_2)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001155
1156 # Ensure that we call git svn fetch if our LKGR is > the git-svn HEAD rev.
1157 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'Capture', True)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001158 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1159 cwd=self.base_path).AndReturn('blah')
1160 gclient_scm.scm.GIT.Capture(['fetch'], cwd=self.base_path)
1161 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
1162 error = subprocess2.CalledProcessError(1, 'cmd', '/cwd', 'stdout', 'stderr')
1163 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1164 cwd=self.base_path).AndRaise(error)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001165 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
1166
1167 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1168 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1169 ).AndReturn(True)
1170
1171 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1172 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1173 ).AndReturn(True)
1174 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=too_big
1175 ).AndReturn(False)
1176
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001177 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
1178 gclient_scm.os.path.isdir(self.base_path).MultipleTimes().AndReturn(True)
1179
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001180 self.mox.ReplayAll()
1181
1182 git_svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
1183 relpath=self.relpath)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001184 # Without an existing checkout, this should fail.
1185 # TODO(dbeam) Fix this. http://crbug.com/109184
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001186 self.assertRaises(gclient_scm.gclient_utils.Error,
1187 git_svn_scm.GetUsableRev, '1', options)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001188 # Given an SVN revision with a git-svn checkout, it should be translated to
1189 # a git sha1 and be usable.
1190 self.assertEquals(git_svn_scm.GetUsableRev('1', options),
1191 self.fake_hash_1)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001192 # Our fake HEAD rev is r2, so this should call git fetch and git svn fetch
1193 # to get more revs (pymox will complain if this doesn't happen). We mock an
1194 # optimized checkout the first time, so this run should call git fetch.
1195 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1196 self.fake_hash_2)
1197 # The time we pretend we're not optimized, so no git fetch should fire.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001198 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1199 self.fake_hash_2)
1200 # Given a git sha1 with a git-svn checkout, it should be used as is.
1201 self.assertEquals(git_svn_scm.GetUsableRev(self.fake_hash_1, options),
1202 self.fake_hash_1)
1203 # We currently check for seemingly valid SVN revisions by assuming 6 digit
1204 # numbers, so assure that numeric revs >= 1000000 don't work.
1205 self.assertRaises(gclient_scm.gclient_utils.Error,
1206 git_svn_scm.GetUsableRev, too_big, options)
1207
1208
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001209class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001210 def testUpdateUpdate(self):
1211 if not self.enabled:
1212 return
1213 options = self.Options()
1214 expected_file_list = []
1215 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1216 relpath=self.relpath)
1217 file_list = []
1218 options.revision = 'unmanaged'
1219 scm.update(options, (), file_list)
1220 self.assertEquals(file_list, expected_file_list)
1221 self.assertEquals(scm.revinfo(options, (), None),
1222 '069c602044c5388d2d15c3f875b057c852003458')
1223 self.checkstdout('________ unmanaged solution; skipping .\n')
1224
1225
msb@chromium.orge28e4982009-09-25 20:51:45 +00001226if __name__ == '__main__':
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001227 if '-v' in sys.argv:
1228 logging.basicConfig(
1229 level=logging.DEBUG,
1230 format='%(asctime).19s %(levelname)s %(filename)s:'
1231 '%(lineno)s %(message)s')
msb@chromium.orge28e4982009-09-25 20:51:45 +00001232 unittest.main()
1233
1234# vim: ts=2:sw=2:tw=80:et: