blob: d7425c5256e8c367ace00b86426ee4d6d75da11f [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',
788 'relpath',
789 'revert',
790 'revinfo',
791 'runhooks',
792 'status',
793 'update',
794 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000795 ]
796
797 # If you add a member, be sure to add the relevant test!
798 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
799
800 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000801 if not self.enabled:
802 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000803 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000804 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000805 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
806 relpath=self.relpath)
807 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000808 scm.update(options, None, file_list)
809 gclient_scm.os.remove(file_path)
810 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000811 scm.revert(options, self.args, file_list)
812 self.assertEquals(file_list, [file_path])
813 file_list = []
814 scm.diff(options, self.args, file_list)
815 self.assertEquals(file_list, [])
szager@google.com85d3e3a2011-10-07 17:12:00 +0000816 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000817 'Fast-forward\n a | 1 +\n b | 1 +\n'
818 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000819 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000820 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
821 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
822 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000823
824 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000825 if not self.enabled:
826 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000827 options = self.Options()
828 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
829 relpath=self.relpath)
830 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000831 scm.update(options, None, file_list)
832 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000833 scm.revert(options, self.args, file_list)
834 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000835 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000836 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000837 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000838 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
839 'Fast-forward\n a | 1 +\n b | 1 +\n'
840 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000841 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
842 'HEAD is now at a7142dc Personalized\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000843 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000844
845 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000846 if not self.enabled:
847 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000848 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000849 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
850 relpath=self.relpath)
851 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000852 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000853 file_path = join(self.base_path, 'a')
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000854 open(file_path, 'a').writelines('touched\n')
855 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000856 scm.revert(options, self.args, file_list)
857 self.assertEquals(file_list, [file_path])
858 file_list = []
859 scm.diff(options, self.args, file_list)
860 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000861 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000862 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000863 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000864 'Fast-forward\n a | 1 +\n b | 1 +\n'
865 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000866 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000867 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
868 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
869 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000870
871 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000872 if not self.enabled:
873 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000874 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000875 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
876 relpath=self.relpath)
877 file_list = []
878 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000879 file_path = join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000880 f = open(file_path, 'w')
881 f.writelines('new\n')
882 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000883 Popen(['git', 'add', 'c'], stdout=PIPE,
884 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000885 file_list = []
886 scm.revert(options, self.args, file_list)
887 self.assertEquals(file_list, [file_path])
888 file_list = []
889 scm.diff(options, self.args, file_list)
890 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000891 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000892 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000893 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000894 'Fast-forward\n a | 1 +\n b | 1 +\n'
895 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000896 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000897 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
898 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
899 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000900
901 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000902 if not self.enabled:
903 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000904 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000905 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000906 open(file_path, 'a').writelines('touched\n')
907 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
908 relpath=self.relpath)
909 file_list = []
910 scm.status(options, self.args, file_list)
911 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000912 self.checkstdout(
913 ('\n________ running \'git diff --name-status '
914 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000915 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000916
917 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000918 if not self.enabled:
919 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000920 options = self.Options()
921 expected_file_list = []
922 for f in ['a', 'b']:
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000923 file_path = join(self.base_path, f)
924 open(file_path, 'a').writelines('touched\n')
925 expected_file_list.extend([file_path])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000926 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
927 relpath=self.relpath)
928 file_list = []
929 scm.status(options, self.args, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000930 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000931 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000932 self.checkstdout(
933 ('\n________ running \'git diff --name-status '
934 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000935 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000936
msb@chromium.orge28e4982009-09-25 20:51:45 +0000937 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000938 if not self.enabled:
939 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000940 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000941 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000942 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
943 relpath=self.relpath)
944 file_list = []
945 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000946 self.assertEquals(file_list, expected_file_list)
947 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000948 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000949 self.checkstdout(
950 '\n_____ . at refs/heads/master\n'
951 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
952 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000953
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000954 def testUpdateReset(self):
955 if not self.enabled:
956 return
957 options = self.Options()
958 options.reset = True
959
960 dir_path = join(self.base_path, 'c')
961 os.mkdir(dir_path)
962 open(join(dir_path, 'nested'), 'w').writelines('new\n')
963
964 file_path = join(self.base_path, 'file')
965 open(file_path, 'w').writelines('new\n')
966
967 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
968 relpath=self.relpath)
969 file_list = []
970 scm.update(options, (), file_list)
971 self.assert_(gclient_scm.os.path.isdir(dir_path))
972 self.assert_(gclient_scm.os.path.isfile(file_path))
973 self.checkstdout(
974 '\n________ running \'git reset --hard HEAD\' in \'%s\''
975 '\nHEAD is now at 069c602 A and B\n'
976 '\n_____ . at refs/heads/master\n'
977 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
978 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n'
979 % join(self.root_dir, '.'))
980
981 def testUpdateResetDeleteUnversionedTrees(self):
982 if not self.enabled:
983 return
984 options = self.Options()
985 options.reset = True
986 options.delete_unversioned_trees = True
987
988 dir_path = join(self.base_path, 'dir')
989 os.mkdir(dir_path)
990 open(join(dir_path, 'nested'), 'w').writelines('new\n')
991
992 file_path = join(self.base_path, 'file')
993 open(file_path, 'w').writelines('new\n')
994
995 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
996 relpath=self.relpath)
997 file_list = []
998 scm.update(options, (), file_list)
999 self.assert_(not gclient_scm.os.path.isdir(dir_path))
1000 self.assert_(gclient_scm.os.path.isfile(file_path))
1001 self.checkstdout(
1002 '\n________ running \'git reset --hard HEAD\' in \'%s\''
1003 '\nHEAD is now at 069c602 A and B\n'
1004 '\n_____ . at refs/heads/master\n'
1005 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
1006 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n'
1007 '\n_____ removing unversioned directory dir/\n' % join(self.root_dir,
1008 '.'))
1009
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +00001010 def testUpdateUnstagedConflict(self):
1011 if not self.enabled:
1012 return
1013 options = self.Options()
1014 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1015 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001016 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001017 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001018 try:
1019 scm.update(options, (), [])
1020 self.fail()
maruel@chromium.orgfae707b2011-09-15 18:57:58 +00001021 except (gclient_scm.gclient_utils.Error, subprocess2.CalledProcessError):
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001022 # The exact exception text varies across git versions so it's not worth
1023 # verifying it. It's fine as long as it throws.
1024 pass
1025 # Manually flush stdout since we can't verify it's content accurately across
1026 # git versions.
1027 sys.stdout.getvalue()
1028 sys.stdout.close()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +00001029
msb@chromium.org5bde4852009-12-14 16:47:12 +00001030 def testUpdateConflict(self):
1031 if not self.enabled:
1032 return
1033 options = self.Options()
1034 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1035 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001036 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001037 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001038 scm._Run(['commit', '-am', 'test'], options)
1039 __builtin__.raw_input = lambda x: 'y'
1040 exception = ('Conflict while rebasing this branch.\n'
1041 'Fix the conflict and run gclient again.\n'
1042 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001043 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001044 exception = ('\n____ . at refs/heads/master\n'
1045 '\tYou have unstaged changes.\n'
1046 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001047 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001048 # The hash always changes. Use a cheap trick.
1049 start = ('\n________ running \'git commit -am test\' in \'%s\'\n'
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001050 '[new ') % join(self.root_dir, '.')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001051 end = ('] test\n 1 files changed, 1 insertions(+), '
1052 '1 deletions(-)\n\n_____ . at refs/heads/master\n'
1053 'Attempting rebase onto refs/remotes/origin/master...\n')
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +00001054 self.assertTrue(sys.stdout.getvalue().startswith(start))
1055 self.assertTrue(sys.stdout.getvalue().endswith(end))
1056 self.assertEquals(len(sys.stdout.getvalue()),
maruel@chromium.orgdd057f32010-09-20 19:33:31 +00001057 len(start) + len(end) + 7)
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +00001058 sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +00001059
msb@chromium.orge4af1ab2010-01-13 21:26:09 +00001060 def testUpdateNotGit(self):
1061 if not self.enabled:
1062 return
1063 options = self.Options()
1064 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1065 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001066 git_path = join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +00001067 rename(git_path, git_path + 'foo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001068 exception = ('\n____ . at refs/heads/master\n'
1069 '\tPath is not a git repo. No .git dir.\n'
1070 '\tTo resolve:\n'
1071 '\t\trm -rf .\n'
1072 '\tAnd run gclient sync again\n')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +00001073 self.assertRaisesError(exception, scm.update, options, (), [])
1074
msb@chromium.org0f282062009-11-06 20:14:02 +00001075 def testRevinfo(self):
1076 if not self.enabled:
1077 return
1078 options = self.Options()
1079 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1080 relpath=self.relpath)
1081 rev_info = scm.revinfo(options, (), None)
1082 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
1083
msb@chromium.orge28e4982009-09-25 20:51:45 +00001084
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001085class ManagedGitWrapperTestCaseMox(BaseTestCase):
1086 class OptionsObject(object):
1087 def __init__(self, verbose=False, revision=None, force=False):
1088 self.verbose = verbose
1089 self.revision = revision
1090 self.deps_os = None
1091 self.force = force
1092 self.reset = False
1093 self.nohooks = False
1094 # TODO(maruel): Test --jobs > 1.
1095 self.jobs = 1
1096
1097 def Options(self, *args, **kwargs):
1098 return self.OptionsObject(*args, **kwargs)
1099
1100 def setUp(self):
1101 BaseTestCase.setUp(self)
1102 self.fake_hash_1 = 't0ta11yf4k3'
1103 self.fake_hash_2 = '3v3nf4k3r'
1104 self.url = 'git://foo'
1105 self.root_dir = '/tmp'
1106 self.relpath = 'fake'
1107 self.base_path = os.path.join(self.root_dir, self.relpath)
1108
1109 def tearDown(self):
1110 BaseTestCase.tearDown(self)
1111
1112 def testGetUsableRevGit(self):
1113 # pylint: disable=E1101
1114 options = self.Options(verbose=True)
1115
1116 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1117 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1118 ).AndReturn(True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001119
1120 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1121 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1122 ).AndReturn(False)
1123
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001124 gclient_scm.scm.os.path.isdir(self.base_path).AndReturn(True)
1125
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001126 self.mox.ReplayAll()
1127
1128 git_scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1129 relpath=self.relpath)
1130 # A [fake] git sha1 with a git repo should work (this is in the case that
1131 # the LKGR gets flipped to git sha1's some day).
1132 self.assertEquals(git_scm.GetUsableRev(self.fake_hash_1, options),
1133 self.fake_hash_1)
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001134 # An SVN rev with an existing purely git repo should raise an exception.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001135 self.assertRaises(gclient_scm.gclient_utils.Error,
1136 git_scm.GetUsableRev, '1', options)
1137
1138 def testGetUsableRevGitSvn(self):
1139 # pylint: disable=E1101
1140 options = self.Options()
1141 too_big = str(1e7)
1142
1143 # Pretend like the git-svn repo's HEAD is at r2.
1144 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetGitSvnHeadRev', True)
1145 gclient_scm.scm.GIT.GetGitSvnHeadRev(cwd=self.base_path).MultipleTimes(
1146 ).AndReturn(2)
1147
1148 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetSha1ForSvnRev', True)
1149 # r1 -> first fake hash, r3 -> second fake hash.
1150 gclient_scm.scm.GIT.GetSha1ForSvnRev(cwd=self.base_path, rev='1'
1151 ).AndReturn(self.fake_hash_1)
1152 gclient_scm.scm.GIT.GetSha1ForSvnRev(cwd=self.base_path, rev='3'
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001153 ).MultipleTimes().AndReturn(self.fake_hash_2)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001154
1155 # Ensure that we call git svn fetch if our LKGR is > the git-svn HEAD rev.
1156 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'Capture', True)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001157 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1158 cwd=self.base_path).AndReturn('blah')
1159 gclient_scm.scm.GIT.Capture(['fetch'], cwd=self.base_path)
1160 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
1161 error = subprocess2.CalledProcessError(1, 'cmd', '/cwd', 'stdout', 'stderr')
1162 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1163 cwd=self.base_path).AndRaise(error)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001164 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
1165
1166 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
1167 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
1168 ).AndReturn(True)
1169
1170 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1171 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1172 ).AndReturn(True)
1173 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=too_big
1174 ).AndReturn(False)
1175
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001176 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
1177 gclient_scm.os.path.isdir(self.base_path).MultipleTimes().AndReturn(True)
1178
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001179 self.mox.ReplayAll()
1180
1181 git_svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
1182 relpath=self.relpath)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001183 # Without an existing checkout, this should fail.
1184 # TODO(dbeam) Fix this. http://crbug.com/109184
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001185 self.assertRaises(gclient_scm.gclient_utils.Error,
1186 git_svn_scm.GetUsableRev, '1', options)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001187 # Given an SVN revision with a git-svn checkout, it should be translated to
1188 # a git sha1 and be usable.
1189 self.assertEquals(git_svn_scm.GetUsableRev('1', options),
1190 self.fake_hash_1)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001191 # Our fake HEAD rev is r2, so this should call git fetch and git svn fetch
1192 # to get more revs (pymox will complain if this doesn't happen). We mock an
1193 # optimized checkout the first time, so this run should call git fetch.
1194 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1195 self.fake_hash_2)
1196 # The time we pretend we're not optimized, so no git fetch should fire.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001197 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1198 self.fake_hash_2)
1199 # Given a git sha1 with a git-svn checkout, it should be used as is.
1200 self.assertEquals(git_svn_scm.GetUsableRev(self.fake_hash_1, options),
1201 self.fake_hash_1)
1202 # We currently check for seemingly valid SVN revisions by assuming 6 digit
1203 # numbers, so assure that numeric revs >= 1000000 don't work.
1204 self.assertRaises(gclient_scm.gclient_utils.Error,
1205 git_svn_scm.GetUsableRev, too_big, options)
1206
1207
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001208class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001209 def testUpdateUpdate(self):
1210 if not self.enabled:
1211 return
1212 options = self.Options()
1213 expected_file_list = []
1214 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1215 relpath=self.relpath)
1216 file_list = []
1217 options.revision = 'unmanaged'
1218 scm.update(options, (), file_list)
1219 self.assertEquals(file_list, expected_file_list)
1220 self.assertEquals(scm.revinfo(options, (), None),
1221 '069c602044c5388d2d15c3f875b057c852003458')
1222 self.checkstdout('________ unmanaged solution; skipping .\n')
1223
1224
msb@chromium.orge28e4982009-09-25 20:51:45 +00001225if __name__ == '__main__':
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001226 if '-v' in sys.argv:
1227 logging.basicConfig(
1228 level=logging.DEBUG,
1229 format='%(asctime).19s %(levelname)s %(filename)s:'
1230 '%(lineno)s %(message)s')
msb@chromium.orge28e4982009-09-25 20:51:45 +00001231 unittest.main()
1232
1233# vim: ts=2:sw=2:tw=80:et: