blob: 741727e34f69c58b42145616866fff6377fae95c [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.
maruel@chromium.orgba551772010-02-03 18:21:42 +000011from shutil import rmtree
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000012from subprocess import Popen, PIPE, STDOUT
maruel@chromium.org428342a2011-11-10 15:46:33 +000013
14import logging
15import os
16import sys
msb@chromium.orge28e4982009-09-25 20:51:45 +000017import tempfile
maruel@chromium.org389d6de2010-09-09 14:14:37 +000018import unittest
msb@chromium.orge28e4982009-09-25 20:51:45 +000019
maruel@chromium.org428342a2011-11-10 15:46:33 +000020sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
maruel@chromium.orgba551772010-02-03 18:21:42 +000021
maruel@chromium.org0927b7e2011-11-11 16:06:22 +000022from testing_support.super_mox import mox, StdoutCheck, SuperMoxTestBase
23from testing_support.super_mox import TestCaseUtils
maruel@chromium.org428342a2011-11-10 15:46:33 +000024
msb@chromium.orge28e4982009-09-25 20:51:45 +000025import gclient_scm
maruel@chromium.orgfae707b2011-09-15 18:57:58 +000026import subprocess2
maruel@chromium.org96913eb2010-06-01 16:22:47 +000027
maruel@chromium.org795a8c12010-10-05 19:54:29 +000028# Shortcut since this function is used often
29join = gclient_scm.os.path.join
30
maruel@chromium.org96913eb2010-06-01 16:22:47 +000031
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +000032# Access to a protected member XXX of a client class
33# pylint: disable=W0212
34
35
maruel@chromium.org389d6de2010-09-09 14:14:37 +000036class GCBaseTestCase(object):
maruel@chromium.org96913eb2010-06-01 16:22:47 +000037 def assertRaisesError(self, msg, fn, *args, **kwargs):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000038 """Like unittest's assertRaises() but checks for Gclient.Error."""
maruel@chromium.org428342a2011-11-10 15:46:33 +000039 # pylint: disable=E1101
maruel@chromium.org96913eb2010-06-01 16:22:47 +000040 try:
41 fn(*args, **kwargs)
42 except gclient_scm.gclient_utils.Error, e:
43 self.assertEquals(e.args[0], msg)
44 else:
45 self.fail('%s not raised' % msg)
msb@chromium.orge28e4982009-09-25 20:51:45 +000046
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000047
maruel@chromium.org389d6de2010-09-09 14:14:37 +000048class BaseTestCase(GCBaseTestCase, SuperMoxTestBase):
49 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000050 SuperMoxTestBase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000051 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter')
52 self.mox.StubOutWithMock(gclient_scm.gclient_utils,
53 'CheckCallAndFilterAndHeader')
54 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
55 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
digit@chromium.orgdc112ac2013-04-24 13:00:19 +000056 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'rmtree')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000057 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +000058 self.mox.StubOutWithMock(gclient_scm.scm.SVN, '_CaptureInfo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000059 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
60 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
maruel@chromium.orgfae707b2011-09-15 18:57:58 +000061 self.mox.StubOutWithMock(subprocess2, 'communicate')
62 self.mox.StubOutWithMock(subprocess2, 'Popen')
maruel@chromium.org389d6de2010-09-09 14:14:37 +000063 self._scm_wrapper = gclient_scm.CreateSCM
maruel@chromium.org389d6de2010-09-09 14:14:37 +000064 gclient_scm.scm.SVN.current_version = None
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +000065 self._original_SVNBinaryExists = gclient_scm.SVNWrapper.BinaryExists
66 self._original_GitBinaryExists = gclient_scm.GitWrapper.BinaryExists
67 gclient_scm.SVNWrapper.BinaryExists = staticmethod(lambda : True)
68 gclient_scm.GitWrapper.BinaryExists = staticmethod(lambda : True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +000069 # Absolute path of the fake checkout directory.
70 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000071
72 def tearDown(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000073 SuperMoxTestBase.tearDown(self)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +000074 gclient_scm.SVNWrapper.BinaryExists = self._original_SVNBinaryExists
75 gclient_scm.GitWrapper.BinaryExists = self._original_GitBinaryExists
maruel@chromium.org389d6de2010-09-09 14:14:37 +000076
77
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000078class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000079 class OptionsObject(object):
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +000080 def __init__(self, verbose=False, revision=None, force=False):
msb@chromium.orge28e4982009-09-25 20:51:45 +000081 self.verbose = verbose
82 self.revision = revision
83 self.manually_grab_svn_rev = True
84 self.deps_os = None
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +000085 self.force = force
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000086 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000087 self.nohooks = False
maruel@chromium.org36ac2392011-10-12 16:36:11 +000088 # TODO(maruel): Test --jobs > 1.
89 self.jobs = 1
steveblock@chromium.org98e69452012-02-16 16:36:43 +000090 self.delete_unversioned_trees = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000091
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000092 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +000093 return self.OptionsObject(*args, **kwargs)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000094
msb@chromium.orge28e4982009-09-25 20:51:45 +000095 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000096 BaseTestCase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000097 self.url = self.SvnUrl()
msb@chromium.orge28e4982009-09-25 20:51:45 +000098
99 def testDir(self):
100 members = [
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000101 'BinaryExists',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000102 'FullUrlForRelativeUrl',
xusydoc@chromium.org885a9602013-05-31 09:54:40 +0000103 'GetCheckoutRoot',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000104 'GetRevisionDate',
105 'GetUsableRev',
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000106 'Svnversion',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000107 'RunCommand',
108 'cleanup',
109 'diff',
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000110 'name',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000111 'pack',
112 'relpath',
113 'revert',
114 'revinfo',
115 'runhooks',
116 'status',
117 'update',
118 'updatesingle',
119 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000120 ]
121
122 # If you add a member, be sure to add the relevant test!
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000123 self.compareMembers(self._scm_wrapper('svn://a'), members)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000124
125 def testUnsupportedSCM(self):
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000126 args = ['gopher://foo', self.root_dir, self.relpath]
127 exception_msg = 'No SCM found for url gopher://foo'
128 self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000129
msb@chromium.orge6f78352010-01-13 17:05:33 +0000130 def testSVNFullUrlForRelativeUrl(self):
131 self.url = 'svn://a/b/c/d'
132
133 self.mox.ReplayAll()
134 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
135 relpath=self.relpath)
136 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
137
138 def testGITFullUrlForRelativeUrl(self):
139 self.url = 'git://a/b/c/d'
140
141 self.mox.ReplayAll()
142 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
143 relpath=self.relpath)
144 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
145
igorgatis@gmail.com4e075672011-11-21 16:35:08 +0000146 def testGITFakeHttpUrl(self):
147 self.url = 'git+http://foo'
148
149 self.mox.ReplayAll()
150 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
151 relpath=self.relpath)
152 self.assertEqual(scm.url, 'http://foo')
153
154 def testGITFakeHttpsUrl(self):
155 self.url = 'git+https://foo'
156
157 self.mox.ReplayAll()
158 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
159 relpath=self.relpath)
160 self.assertEqual(scm.url, 'https://foo')
161
msb@chromium.orge28e4982009-09-25 20:51:45 +0000162 def testRunCommandException(self):
163 options = self.Options(verbose=False)
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000164 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
165 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
166
msb@chromium.orge28e4982009-09-25 20:51:45 +0000167 self.mox.ReplayAll()
168 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
169 relpath=self.relpath)
170 exception = "Unsupported argument(s): %s" % ','.join(self.args)
171 self.assertRaisesError(exception, scm.RunCommand,
172 'update', options, self.args)
173
174 def testRunCommandUnknown(self):
175 # TODO(maruel): if ever used.
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000176 pass
msb@chromium.orge28e4982009-09-25 20:51:45 +0000177
178 def testRevertMissing(self):
179 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000180 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000181 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000182 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
183 ).AndReturn('1.5.1')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000184 # It'll to a checkout instead.
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000185 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
186 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000187 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000188 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000189 parent = gclient_scm.os.path.dirname(self.base_path)
190 gclient_scm.os.path.exists(parent).AndReturn(False)
191 gclient_scm.os.makedirs(parent)
192 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000193 files_list = self.mox.CreateMockAnything()
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000194 gclient_scm.scm.SVN.RunAndGetFileList(
195 options.verbose,
196 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
197 cwd=self.root_dir,
198 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000199
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000200 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
201 ).AndReturn({'Revision': 100})
202
msb@chromium.orge28e4982009-09-25 20:51:45 +0000203 self.mox.ReplayAll()
204 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
205 relpath=self.relpath)
206 scm.revert(options, self.args, files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000207 self.checkstdout(
208 ('\n_____ %s is missing, synching instead\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000209
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000210 def testRevertNoDotSvn(self):
211 options = self.Options(verbose=True, force=True)
212 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
213 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(False)
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000214 gclient_scm.os.path.isdir(join(self.base_path, '.git')).AndReturn(False)
215 gclient_scm.os.path.isdir(join(self.base_path, '.hg')).AndReturn(False)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000216 # Checkout.
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000217 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
218 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000219 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000220 parent = gclient_scm.os.path.dirname(self.base_path)
221 gclient_scm.os.path.exists(parent).AndReturn(False)
222 gclient_scm.os.makedirs(parent)
223 gclient_scm.os.path.exists(parent).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000224 files_list = self.mox.CreateMockAnything()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000225 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
226 ).AndReturn('1.6')
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000227 gclient_scm.scm.SVN.RunAndGetFileList(
228 options.verbose,
229 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
230 cwd=self.root_dir,
231 file_list=files_list)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000232 gclient_scm.gclient_utils.rmtree(self.base_path)
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000233 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
234 ).AndReturn({'Revision': 100})
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000235 self.mox.ReplayAll()
236 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
237 relpath=self.relpath)
238 scm.revert(options, self.args, files_list)
239 self.checkstdout(
240 '\n_____ %s is not a valid svn checkout, synching instead\n' %
241 self.relpath)
242
msb@chromium.orge28e4982009-09-25 20:51:45 +0000243 def testRevertNone(self):
244 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000245 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000246 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000247 gclient_scm.scm.SVN.CaptureStatus(
248 None, self.base_path, no_ignore=False).AndReturn([])
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000249 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000250 gclient_scm.scm.SVN.RunAndGetFileList(
251 options.verbose,
252 ['update', '--revision', 'BASE', '--ignore-externals'],
253 cwd=self.base_path,
254 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000255
256 self.mox.ReplayAll()
257 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
258 relpath=self.relpath)
259 file_list = []
260 scm.revert(options, self.args, file_list)
261
msb@chromium.orge28e4982009-09-25 20:51:45 +0000262 def testRevertDirectory(self):
263 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000264 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000265 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000266 items = [
267 ('~ ', 'a'),
268 ]
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000269 gclient_scm.scm.SVN.CaptureStatus(
270 None, self.base_path, no_ignore=False).AndReturn(items)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000271 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000272 gclient_scm.os.path.exists(file_path).AndReturn(True)
273 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000274 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000275 gclient_scm.os.path.isdir(file_path).AndReturn(True)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000276 gclient_scm.gclient_utils.rmtree(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000277 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000278 gclient_scm.scm.SVN.RunAndGetFileList(
279 options.verbose,
280 ['update', '--revision', 'BASE', '--ignore-externals'],
281 cwd=self.base_path,
282 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000283
284 self.mox.ReplayAll()
285 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
286 relpath=self.relpath)
287 file_list2 = []
288 scm.revert(options, self.args, file_list2)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000289 self.checkstdout(('%s\n' % file_path))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000290
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000291 def testRevertDot(self):
292 self.mox.StubOutWithMock(gclient_scm.SVNWrapper, 'update')
293 options = self.Options(verbose=True)
294 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
295 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
296 items = [
297 ('~ ', '.'),
298 ]
maruel@chromium.orgea15cb72012-05-04 14:16:31 +0000299 gclient_scm.scm.SVN.CaptureStatus(
300 None, self.base_path, no_ignore=False).AndReturn(items)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000301 # gclient_utils.rmtree() doesn't work on path ending with '.', like 'foo/.'.
maruel@chromium.org62087572012-04-24 23:16:28 +0000302 file_path = self.base_path
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000303 gclient_scm.os.path.exists(file_path).AndReturn(True)
304 gclient_scm.os.path.isfile(file_path).AndReturn(False)
305 gclient_scm.os.path.islink(file_path).AndReturn(False)
306 gclient_scm.os.path.isdir(file_path).AndReturn(True)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000307 gclient_scm.gclient_utils.rmtree(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000308 # pylint: disable=E1120
maruel@chromium.org428342a2011-11-10 15:46:33 +0000309 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000310 gclient_scm.SVNWrapper.update(options, [], ['.'])
311
312 self.mox.ReplayAll()
313 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
314 relpath=self.relpath)
315 file_list2 = []
316 scm.revert(options, self.args, file_list2)
maruel@chromium.org62087572012-04-24 23:16:28 +0000317 self.checkstdout(('%s\n' % os.path.join(file_path, '.')))
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000318
msb@chromium.orge28e4982009-09-25 20:51:45 +0000319 def testStatus(self):
320 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000321 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000322 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000323 options.verbose,
324 ['status'] + self.args + ['--ignore-externals'],
325 cwd=self.base_path,
326 file_list=[]).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000327
328 self.mox.ReplayAll()
329 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
330 relpath=self.relpath)
331 file_list = []
332 self.assertEqual(scm.status(options, self.args, file_list), None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000333
334 # TODO(maruel): TEST REVISIONS!!!
335 # TODO(maruel): TEST RELOCATE!!!
336 def testUpdateCheckout(self):
337 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000338 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000339 file_info.root = 'blah'
340 file_info.url = self.url
341 file_info.uuid = 'ABC'
342 file_info.revision = 42
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000343 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
344 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000345 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000346 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000347 parent = gclient_scm.os.path.dirname(self.base_path)
348 gclient_scm.os.path.exists(parent).AndReturn(False)
349 gclient_scm.os.makedirs(parent)
350 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000351 files_list = self.mox.CreateMockAnything()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000352 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
353 ).AndReturn('1.5.1')
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000354 gclient_scm.scm.SVN.RunAndGetFileList(
355 options.verbose,
356 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
357 cwd=self.root_dir,
358 file_list=files_list)
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000359 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
360 ).AndReturn({'Revision': 100})
msb@chromium.orge28e4982009-09-25 20:51:45 +0000361 self.mox.ReplayAll()
362 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
363 relpath=self.relpath)
364 scm.update(options, (), files_list)
365
366 def testUpdateUpdate(self):
367 options = self.Options(verbose=True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000368 options.force = True
369 options.nohooks = False
370 file_info = {
371 'Repository Root': 'blah',
372 'URL': self.url,
373 'UUID': 'ABC',
374 'Revision': 42,
375 }
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000376 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
377 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000378 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000379
msb@chromium.orge28e4982009-09-25 20:51:45 +0000380 # Checkout or update.
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000381 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000382 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000383
384 # Verify no locked files.
385 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
386
msb@chromium.orge28e4982009-09-25 20:51:45 +0000387 # Cheat a bit here.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000388 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
389 ).AndReturn(file_info)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000390
391 # _AddAdditionalUpdateFlags()
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000392 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
393 ).AndReturn('1.5.1')
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000394
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000395 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
396 ).AndReturn({'Revision': 100})
397
msb@chromium.orge28e4982009-09-25 20:51:45 +0000398 additional_args = []
399 if options.manually_grab_svn_rev:
400 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000401 additional_args.extend(['--force', '--ignore-externals'])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000402 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000403 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000404 options.verbose,
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000405 ['update', self.base_path] + additional_args,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000406 cwd=self.root_dir, file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000407
408 self.mox.ReplayAll()
409 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
410 relpath=self.relpath)
411 scm.update(options, (), files_list)
412
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000413 def testUpdateReset(self):
414 options = self.Options(verbose=True)
415 options.reset = True
416 file_info = {
417 'Repository Root': 'blah',
418 'URL': self.url,
419 'UUID': 'ABC',
420 'Revision': 42,
421 }
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000422 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
423 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000424 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
425
426 # Checkout or update.
427 dotted_path = join(self.base_path, '.')
428 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
429
430 # Create an untracked file and directory.
431 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
432 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
433
434 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
435 ).AndReturn(file_info)
436
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000437 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
438 ).AndReturn({'Revision': 100})
439
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000440 self.mox.ReplayAll()
441 files_list = []
442 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
443 relpath=self.relpath)
444 scm.update(options, (), files_list)
445 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
446
447 def testUpdateResetDeleteUnversionedTrees(self):
448 options = self.Options(verbose=True)
449 options.reset = True
450 options.delete_unversioned_trees = True
451
452 file_info = {
453 'Repository Root': 'blah',
454 'URL': self.url,
455 'UUID': 'ABC',
456 'Revision': 42,
457 }
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000458 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
459 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000460 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
461
462 # Checkout or update.
463 dotted_path = join(self.base_path, '.')
464 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
465
466 # Create an untracked file and directory.
467 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
468 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
469
470 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
471 ).AndReturn(file_info)
472
473 # Confirm that the untracked file is removed.
474 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path
475 ).AndReturn([['? ', 'dir'], ['? ', 'file']])
476 gclient_scm.os.path.isdir(join(self.base_path, 'dir')).AndReturn(True)
477 gclient_scm.os.path.isdir(join(self.base_path, 'file')).AndReturn(False)
478 gclient_scm.os.path.islink(join(self.base_path, 'dir')).AndReturn(False)
digit@chromium.orgdc112ac2013-04-24 13:00:19 +0000479 gclient_scm.gclient_utils.rmtree(join(self.base_path, 'dir'))
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000480
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000481 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
482 ).AndReturn({'Revision': 100})
483
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000484 self.mox.ReplayAll()
485 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
486 relpath=self.relpath)
487 files_list = []
488 scm.update(options, (), files_list)
489 self.checkstdout(
490 ('\n_____ %s at 42\n'
491 '\n_____ removing unversioned directory dir\n') % self.relpath)
492
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000493 def testUpdateSingleCheckout(self):
494 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000495 file_info = {
496 'URL': self.url,
497 'Revision': 42,
498 }
tony@chromium.org57564662010-04-14 02:35:12 +0000499
500 # Checks to make sure that we support svn co --depth.
501 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000502 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
503 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000504 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
505 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000506
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000507 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000508 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000509 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000510
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000511 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000512 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000513 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000514 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000515 always=True,
516 cwd=self.root_dir)
517 gclient_scm.scm.SVN.RunAndGetFileList(
518 options.verbose,
519 ['update', 'DEPS', '--ignore-externals'],
520 cwd=self.base_path,
521 file_list=files_list)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000522
523 # Now we fall back on scm.update().
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000524 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
525 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000526 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000527 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
528 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
529 ).AndReturn(file_info)
tony@chromium.org57564662010-04-14 02:35:12 +0000530
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000531 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
532 ).AndReturn({'Revision': 100})
533
tony@chromium.org57564662010-04-14 02:35:12 +0000534 self.mox.ReplayAll()
535 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
536 relpath=self.relpath)
537 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000538 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org57564662010-04-14 02:35:12 +0000539
540 def testUpdateSingleCheckoutSVN14(self):
541 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000542
543 # Checks to make sure that we support svn co --depth.
544 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000545 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
546 ).AndReturn('1.4.4')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000547 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org57564662010-04-14 02:35:12 +0000548
549 # When checking out a single file with svn 1.4, we use svn export
550 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000551 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000552 ['svn', 'export', join(self.url, 'DEPS'), join(self.base_path, 'DEPS')],
scottmg@chromium.orgf547c802013-09-27 17:55:26 +0000553 always=True, cwd=self.root_dir)
tony@chromium.org57564662010-04-14 02:35:12 +0000554
555 self.mox.ReplayAll()
556 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
557 relpath=self.relpath)
558 scm.updatesingle(options, ['DEPS'], files_list)
559
560 def testUpdateSingleCheckoutSVNUpgrade(self):
561 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000562 file_info = {
563 'URL': self.url,
564 'Revision': 42,
565 }
566
567 # Checks to make sure that we support svn co --depth.
568 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000569 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
570 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000571 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000572 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
573 # the old DEPS file.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000574 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(True)
575 gclient_scm.os.remove(join(self.base_path, 'DEPS'))
tony@chromium.org57564662010-04-14 02:35:12 +0000576
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000577 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000578 gclient_scm.scm.SVN.CaptureStatus(
579 None, join(self.base_path, '.')).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000580
tony@chromium.org57564662010-04-14 02:35:12 +0000581 # When checking out a single file, we issue an svn checkout and svn update.
582 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000583 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000584 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000585 always=True,
586 cwd=self.root_dir)
587 gclient_scm.scm.SVN.RunAndGetFileList(
588 options.verbose,
589 ['update', 'DEPS', '--ignore-externals'],
590 cwd=self.base_path,
591 file_list=files_list)
tony@chromium.org57564662010-04-14 02:35:12 +0000592
593 # Now we fall back on scm.update().
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000594 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
595 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000596 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000597 gclient_scm.scm.SVN._CaptureInfo(
598 [], join(self.base_path, ".")).AndReturn(file_info)
599 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
600 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000601
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000602 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
603 ).AndReturn({'Revision': 100})
604
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000605 self.mox.ReplayAll()
606 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
607 relpath=self.relpath)
608 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000609 self.checkstdout(
610 ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000611
612 def testUpdateSingleUpdate(self):
613 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000614 file_info = {
615 'URL': self.url,
616 'Revision': 42,
617 }
tony@chromium.org57564662010-04-14 02:35:12 +0000618 # Checks to make sure that we support svn co --depth.
619 gclient_scm.scm.SVN.current_version = None
shouqun.liu@intel.com13b522c2012-07-20 17:16:51 +0000620 gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
621 ).AndReturn('1.5.1')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000622 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000623
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000624 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000625 gclient_scm.scm.SVN.CaptureStatus(None, join(self.base_path, '.')
626 ).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000627
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000628 # Now we fall back on scm.update().
629 files_list = self.mox.CreateMockAnything()
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000630 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
631 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000632 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000633 gclient_scm.scm.SVN._CaptureInfo(
634 [], join(self.base_path, '.')).AndReturn(file_info)
635 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
636 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000637
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000638 gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
639 ).AndReturn({'Revision': 100})
640
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000641 self.mox.ReplayAll()
642 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
643 relpath=self.relpath)
644 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000645 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000646
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000647 def testUpdateGit(self):
thakis@chromium.org0a0e3102014-01-17 16:57:09 +0000648 options = self.Options(verbose=True)
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000649 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
650 gclient_scm.os.path.exists(file_path).AndReturn(True)
thakis@chromium.org0a0e3102014-01-17 16:57:09 +0000651
652 self.mox.ReplayAll()
653 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
654 relpath=self.relpath)
655 file_list = []
656 scm.update(options, self.args, file_list)
657 self.checkstdout(
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +0000658 ('________ found .git directory; skipping %s\n' % self.relpath))
659
660 def testUpdateHg(self):
661 options = self.Options(verbose=True)
662 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
663 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(True)
664
665 self.mox.ReplayAll()
666 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
667 relpath=self.relpath)
668 file_list = []
669 scm.update(options, self.args, file_list)
670 self.checkstdout(
671 ('________ found .hg directory; skipping %s\n' % self.relpath))
thakis@chromium.org0a0e3102014-01-17 16:57:09 +0000672
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000673 def testGetUsableRevSVN(self):
674 # pylint: disable=E1101
675 options = self.Options(verbose=True)
676
677 # Mock SVN revision validity checking.
678 self.mox.StubOutWithMock(
679 gclient_scm.scm.SVN, 'IsValidRevision', True)
680 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 1)
681 ).AndReturn(True)
682 gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 'fake')
683 ).AndReturn(False)
684
685 self.mox.ReplayAll()
686
687 svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir)
688 # With an SVN checkout, 1 an example of a valid usable rev.
689 self.assertEquals(svn_scm.GetUsableRev(1, options), 1)
690 # With an SVN checkout, a fake or unknown rev should raise an excpetion.
691 self.assertRaises(gclient_scm.gclient_utils.Error,
692 svn_scm.GetUsableRev, 'fake', options)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000693
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000694class BaseGitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
695 unittest.TestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000696 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000697 class OptionsObject(object):
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000698 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000699 self.verbose = verbose
700 self.revision = revision
701 self.manually_grab_svn_rev = True
702 self.deps_os = None
703 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000704 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000705 self.nohooks = False
iannucci@chromium.orgd4fffee2013-06-28 00:35:26 +0000706 self.upstream = False
iannucci@chromium.org53456aa2013-07-03 19:38:34 +0000707 self.cache_dir = None
bauerb@chromium.org4dd09372011-07-22 14:41:51 +0000708 self.merge = False
bratell@opera.com18fa4542013-05-21 13:30:46 +0000709 self.jobs = 1
steveblock@chromium.org98e69452012-02-16 16:36:43 +0000710 self.delete_unversioned_trees = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000711
712 sample_git_import = """blob
713mark :1
714data 6
715Hello
716
717blob
718mark :2
719data 4
720Bye
721
722reset refs/heads/master
723commit refs/heads/master
724mark :3
725author Bob <bob@example.com> 1253744361 -0700
726committer Bob <bob@example.com> 1253744361 -0700
727data 8
728A and B
729M 100644 :1 a
730M 100644 :2 b
731
732blob
733mark :4
734data 10
735Hello
736You
737
738blob
739mark :5
740data 8
741Bye
742You
743
744commit refs/heads/origin
745mark :6
746author Alice <alice@example.com> 1253744424 -0700
747committer Alice <alice@example.com> 1253744424 -0700
748data 13
749Personalized
750from :3
751M 100644 :4 a
752M 100644 :5 b
753
bauerb@chromium.org30c46d62014-01-23 12:11:56 +0000754blob
755mark :7
756data 5
757Mooh
758
759commit refs/heads/feature
760mark :8
761author Bob <bob@example.com> 1390311986 -0000
762committer Bob <bob@example.com> 1390311986 -0000
763data 6
764Add C
765from :3
766M 100644 :7 c
767
msb@chromium.orge28e4982009-09-25 20:51:45 +0000768reset refs/heads/master
769from :3
770"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000771 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000772 return self.OptionsObject(*args, **kwargs)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000773
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000774 @staticmethod
775 def CreateGitRepo(git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000776 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000777 try:
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000778 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000779 cwd=path).communicate()
780 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000781 # git is not available, skip this test.
782 return False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000783 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
784 stderr=STDOUT, cwd=path).communicate(input=git_import)
785 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
786 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000787 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000788 stderr=STDOUT, cwd=path).communicate()
789 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
790 stderr=STDOUT, cwd=path).communicate()
791 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
792 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000793 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000794 stderr=STDOUT, cwd=path).communicate()
iannucci@chromium.org1e7187a2013-02-17 20:54:05 +0000795 Popen(['git', 'config', 'user.email', 'someuser@chromium.org'], stdout=PIPE,
796 stderr=STDOUT, cwd=path).communicate()
797 Popen(['git', 'config', 'user.name', 'Some User'], stdout=PIPE,
798 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000799 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000800
bauerb@chromium.org30c46d62014-01-23 12:11:56 +0000801 def _GetAskForDataCallback(self, expected_prompt, return_value):
802 def AskForData(prompt, options):
803 self.assertEquals(prompt, expected_prompt)
804 return return_value
805 return AskForData
806
msb@chromium.orge28e4982009-09-25 20:51:45 +0000807 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000808 TestCaseUtils.setUp(self)
809 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000810 self.url = 'git://foo'
811 self.root_dir = tempfile.mkdtemp()
812 self.relpath = '.'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000813 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000814 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000815 StdoutCheck.setUp(self)
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000816 self._original_GitBinaryExists = gclient_scm.GitWrapper.BinaryExists
817 self._original_SVNBinaryExists = gclient_scm.SVNWrapper.BinaryExists
818 gclient_scm.GitWrapper.BinaryExists = staticmethod(lambda : True)
819 gclient_scm.SVNWrapper.BinaryExists = staticmethod(lambda : True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000820
821 def tearDown(self):
maruel@chromium.org1a60dca2013-11-26 14:06:26 +0000822 try:
823 rmtree(self.root_dir)
824 StdoutCheck.tearDown(self)
825 TestCaseUtils.tearDown(self)
826 unittest.TestCase.tearDown(self)
827 finally:
828 # TODO(maruel): Use auto_stub.TestCase.
829 gclient_scm.GitWrapper.BinaryExists = self._original_GitBinaryExists
830 gclient_scm.SVNWrapper.BinaryExists = self._original_SVNBinaryExists
831
msb@chromium.orge28e4982009-09-25 20:51:45 +0000832
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000833class ManagedGitWrapperTestCase(BaseGitWrapperTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000834 def testDir(self):
835 members = [
mukai@chromium.org9e3e82c2012-04-18 12:55:43 +0000836 'BinaryExists',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000837 'FullUrlForRelativeUrl',
xusydoc@chromium.org885a9602013-05-31 09:54:40 +0000838 'GetCheckoutRoot',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000839 'GetRevisionDate',
840 'GetUsableRev',
841 'RunCommand',
iannucci@chromium.org53456aa2013-07-03 19:38:34 +0000842 'cache_dir',
843 'cache_locks',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000844 'cleanup',
845 'diff',
iannucci@chromium.org2702bcd2013-09-24 19:10:07 +0000846 'name',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000847 'pack',
szager@chromium.orgd4af6622012-06-04 22:13:55 +0000848 'UpdateSubmoduleConfig',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000849 'relpath',
maruel@chromium.org1a60dca2013-11-26 14:06:26 +0000850 'remote',
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +0000851 'revert',
852 'revinfo',
853 'runhooks',
854 'status',
855 'update',
856 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000857 ]
858
859 # If you add a member, be sure to add the relevant test!
860 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
861
862 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000863 if not self.enabled:
864 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000865 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000866 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000867 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
868 relpath=self.relpath)
869 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000870 scm.update(options, None, file_list)
871 gclient_scm.os.remove(file_path)
872 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000873 scm.revert(options, self.args, file_list)
874 self.assertEquals(file_list, [file_path])
875 file_list = []
876 scm.diff(options, self.args, file_list)
877 self.assertEquals(file_list, [])
szager@google.com85d3e3a2011-10-07 17:12:00 +0000878 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000879
880 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000881 if not self.enabled:
882 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000883 options = self.Options()
884 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
885 relpath=self.relpath)
886 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000887 scm.update(options, None, file_list)
888 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000889 scm.revert(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')
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000893 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000894
895 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000896 if not self.enabled:
897 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000898 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000899 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
900 relpath=self.relpath)
901 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000902 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000903 file_path = join(self.base_path, 'a')
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000904 open(file_path, 'a').writelines('touched\n')
905 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000906 scm.revert(options, self.args, file_list)
907 self.assertEquals(file_list, [file_path])
908 file_list = []
909 scm.diff(options, self.args, file_list)
910 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000911 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000912 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000913 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000914
915 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000916 if not self.enabled:
917 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000918 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000919 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
920 relpath=self.relpath)
921 file_list = []
922 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000923 file_path = join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000924 f = open(file_path, 'w')
925 f.writelines('new\n')
926 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000927 Popen(['git', 'add', 'c'], stdout=PIPE,
928 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000929 file_list = []
930 scm.revert(options, self.args, file_list)
931 self.assertEquals(file_list, [file_path])
932 file_list = []
933 scm.diff(options, self.args, file_list)
934 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000935 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000936 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000937 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000938
939 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000940 if not self.enabled:
941 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000942 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000943 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000944 open(file_path, 'a').writelines('touched\n')
945 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
946 relpath=self.relpath)
947 file_list = []
948 scm.status(options, self.args, file_list)
949 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000950 self.checkstdout(
951 ('\n________ running \'git diff --name-status '
952 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000953 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000954
955 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000956 if not self.enabled:
957 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000958 options = self.Options()
959 expected_file_list = []
960 for f in ['a', 'b']:
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000961 file_path = join(self.base_path, f)
962 open(file_path, 'a').writelines('touched\n')
963 expected_file_list.extend([file_path])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000964 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
965 relpath=self.relpath)
966 file_list = []
967 scm.status(options, self.args, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000968 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000969 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000970 self.checkstdout(
971 ('\n________ running \'git diff --name-status '
972 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000973 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000974
msb@chromium.orge28e4982009-09-25 20:51:45 +0000975 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000976 if not self.enabled:
977 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000978 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000979 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000980 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
981 relpath=self.relpath)
982 file_list = []
983 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000984 self.assertEquals(file_list, expected_file_list)
985 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000986 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +0000987 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000988
bauerb@chromium.org30c46d62014-01-23 12:11:56 +0000989 def testUpdateMerge(self):
990 if not self.enabled:
991 return
992 options = self.Options()
993 options.merge = True
994 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
995 relpath=self.relpath)
996 scm._Run(['checkout', '-q', 'feature'], options)
997 rev = scm.revinfo(options, (), None)
998 file_list = []
999 scm.update(options, (), file_list)
1000 self.assertEquals(file_list, [join(self.base_path, x)
1001 for x in ['a', 'b', 'c']])
1002 # The actual commit that is created is unstable, so we verify its tree and
1003 # parents instead.
1004 self.assertEquals(scm._Capture(['rev-parse', 'HEAD:']),
1005 'd2e35c10ac24d6c621e14a1fcadceb533155627d')
1006 self.assertEquals(scm._Capture(['rev-parse', 'HEAD^1']), rev)
1007 self.assertEquals(scm._Capture(['rev-parse', 'HEAD^2']),
1008 scm._Capture(['rev-parse', 'origin/master']))
1009 sys.stdout.close()
1010
1011 def testUpdateRebase(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)
1017 scm._Run(['checkout', '-q', 'feature'], options)
1018 file_list = []
1019 # Fake a 'y' key press.
1020 scm._AskForData = self._GetAskForDataCallback(
1021 'Cannot fast-forward merge, attempt to rebase? '
1022 '(y)es / (q)uit / (s)kip : ', 'y')
1023 scm.update(options, (), file_list)
1024 self.assertEquals(file_list, [join(self.base_path, x)
1025 for x in ['a', 'b', 'c']])
1026 # The actual commit that is created is unstable, so we verify its tree and
1027 # parent instead.
1028 self.assertEquals(scm._Capture(['rev-parse', 'HEAD:']),
1029 'd2e35c10ac24d6c621e14a1fcadceb533155627d')
1030 self.assertEquals(scm._Capture(['rev-parse', 'HEAD^']),
1031 scm._Capture(['rev-parse', 'origin/master']))
1032 sys.stdout.close()
1033
steveblock@chromium.org98e69452012-02-16 16:36:43 +00001034 def testUpdateReset(self):
1035 if not self.enabled:
1036 return
1037 options = self.Options()
1038 options.reset = True
1039
1040 dir_path = join(self.base_path, 'c')
1041 os.mkdir(dir_path)
1042 open(join(dir_path, 'nested'), 'w').writelines('new\n')
1043
1044 file_path = join(self.base_path, 'file')
1045 open(file_path, 'w').writelines('new\n')
1046
1047 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1048 relpath=self.relpath)
1049 file_list = []
1050 scm.update(options, (), file_list)
1051 self.assert_(gclient_scm.os.path.isdir(dir_path))
1052 self.assert_(gclient_scm.os.path.isfile(file_path))
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +00001053 sys.stdout.close()
steveblock@chromium.org98e69452012-02-16 16:36:43 +00001054
1055 def testUpdateResetDeleteUnversionedTrees(self):
1056 if not self.enabled:
1057 return
1058 options = self.Options()
1059 options.reset = True
1060 options.delete_unversioned_trees = True
1061
1062 dir_path = join(self.base_path, 'dir')
1063 os.mkdir(dir_path)
1064 open(join(dir_path, 'nested'), 'w').writelines('new\n')
1065
1066 file_path = join(self.base_path, 'file')
1067 open(file_path, 'w').writelines('new\n')
1068
1069 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1070 relpath=self.relpath)
1071 file_list = []
1072 scm.update(options, (), file_list)
1073 self.assert_(not gclient_scm.os.path.isdir(dir_path))
1074 self.assert_(gclient_scm.os.path.isfile(file_path))
maruel@chromium.orgc6ca3a12012-06-20 14:46:02 +00001075 sys.stdout.close()
steveblock@chromium.org98e69452012-02-16 16:36:43 +00001076
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +00001077 def testUpdateUnstagedConflict(self):
1078 if not self.enabled:
1079 return
1080 options = self.Options()
1081 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1082 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001083 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001084 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001085 try:
1086 scm.update(options, (), [])
1087 self.fail()
maruel@chromium.orgfae707b2011-09-15 18:57:58 +00001088 except (gclient_scm.gclient_utils.Error, subprocess2.CalledProcessError):
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001089 # The exact exception text varies across git versions so it's not worth
1090 # verifying it. It's fine as long as it throws.
1091 pass
1092 # Manually flush stdout since we can't verify it's content accurately across
1093 # git versions.
1094 sys.stdout.getvalue()
1095 sys.stdout.close()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +00001096
msb@chromium.org5bde4852009-12-14 16:47:12 +00001097 def testUpdateConflict(self):
1098 if not self.enabled:
1099 return
1100 options = self.Options()
1101 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1102 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +00001103 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +00001104 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001105 scm._Run(['commit', '-am', 'test'], options)
bauerb@chromium.org30c46d62014-01-23 12:11:56 +00001106 scm._AskForData = self._GetAskForDataCallback(
1107 'Cannot fast-forward merge, attempt to rebase? '
1108 '(y)es / (q)uit / (s)kip : ', 'y')
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001109 exception = ('Conflict while rebasing this branch.\n'
1110 'Fix the conflict and run gclient again.\n'
1111 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001112 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org1a60dca2013-11-26 14:06:26 +00001113 exception = ('\n____ . at refs/remotes/origin/master\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +00001114 '\tYou have unstaged changes.\n'
1115 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +00001116 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +00001117 sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +00001118
msb@chromium.org0f282062009-11-06 20:14:02 +00001119 def testRevinfo(self):
1120 if not self.enabled:
1121 return
1122 options = self.Options()
1123 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1124 relpath=self.relpath)
1125 rev_info = scm.revinfo(options, (), None)
1126 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
1127
msb@chromium.orge28e4982009-09-25 20:51:45 +00001128
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001129class ManagedGitWrapperTestCaseMox(BaseTestCase):
1130 class OptionsObject(object):
1131 def __init__(self, verbose=False, revision=None, force=False):
1132 self.verbose = verbose
1133 self.revision = revision
1134 self.deps_os = None
1135 self.force = force
1136 self.reset = False
1137 self.nohooks = False
1138 # TODO(maruel): Test --jobs > 1.
1139 self.jobs = 1
1140
1141 def Options(self, *args, **kwargs):
1142 return self.OptionsObject(*args, **kwargs)
1143
1144 def setUp(self):
1145 BaseTestCase.setUp(self)
1146 self.fake_hash_1 = 't0ta11yf4k3'
1147 self.fake_hash_2 = '3v3nf4k3r'
1148 self.url = 'git://foo'
maruel@chromium.org97170132013-05-08 14:58:34 +00001149 self.root_dir = '/tmp' if sys.platform != 'win32' else 't:\\tmp'
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001150 self.relpath = 'fake'
1151 self.base_path = os.path.join(self.root_dir, self.relpath)
1152
1153 def tearDown(self):
1154 BaseTestCase.tearDown(self)
1155
1156 def testGetUsableRevGit(self):
1157 # pylint: disable=E1101
1158 options = self.Options(verbose=True)
1159
1160 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1161 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1162 ).AndReturn(True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001163
1164 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +00001165 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001166 ).AndReturn(False)
1167
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001168 gclient_scm.scm.os.path.isdir(self.base_path).AndReturn(True)
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001169 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001170
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001171 self.mox.ReplayAll()
1172
1173 git_scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1174 relpath=self.relpath)
1175 # A [fake] git sha1 with a git repo should work (this is in the case that
1176 # the LKGR gets flipped to git sha1's some day).
1177 self.assertEquals(git_scm.GetUsableRev(self.fake_hash_1, options),
1178 self.fake_hash_1)
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001179 # An SVN rev with an existing purely git repo should raise an exception.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001180 self.assertRaises(gclient_scm.gclient_utils.Error,
1181 git_scm.GetUsableRev, '1', options)
1182
1183 def testGetUsableRevGitSvn(self):
1184 # pylint: disable=E1101
1185 options = self.Options()
1186 too_big = str(1e7)
1187
1188 # Pretend like the git-svn repo's HEAD is at r2.
1189 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'GetGitSvnHeadRev', True)
1190 gclient_scm.scm.GIT.GetGitSvnHeadRev(cwd=self.base_path).MultipleTimes(
1191 ).AndReturn(2)
1192
szager@chromium.orgc51def32012-10-15 18:50:37 +00001193 self.mox.StubOutWithMock(
1194 gclient_scm.scm.GIT, 'GetBlessedSha1ForSvnRev', True)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001195 # r1 -> first fake hash, r3 -> second fake hash.
szager@chromium.orgc51def32012-10-15 18:50:37 +00001196 gclient_scm.scm.GIT.GetBlessedSha1ForSvnRev(cwd=self.base_path, rev='1'
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001197 ).AndReturn(self.fake_hash_1)
szager@chromium.orgc51def32012-10-15 18:50:37 +00001198 gclient_scm.scm.GIT.GetBlessedSha1ForSvnRev(cwd=self.base_path, rev='3'
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001199 ).MultipleTimes().AndReturn(self.fake_hash_2)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001200
1201 # Ensure that we call git svn fetch if our LKGR is > the git-svn HEAD rev.
1202 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'Capture', True)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001203 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1204 cwd=self.base_path).AndReturn('blah')
1205 gclient_scm.scm.GIT.Capture(['fetch'], cwd=self.base_path)
1206 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
1207 error = subprocess2.CalledProcessError(1, 'cmd', '/cwd', 'stdout', 'stderr')
1208 gclient_scm.scm.GIT.Capture(['config', '--get', 'svn-remote.svn.fetch'],
1209 cwd=self.base_path).AndRaise(error)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001210 gclient_scm.scm.GIT.Capture(['svn', 'fetch'], cwd=self.base_path)
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001211 gclient_scm.scm.GIT.Capture(['fetch', 'origin'], cwd=self.base_path)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001212
1213 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
mmoss@chromium.org50fd47f2014-02-13 01:03:19 +00001214 gclient_scm.scm.GIT.IsGitSvn(cwd=self.base_path).MultipleTimes(
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001215 ).AndReturn(True)
1216
1217 self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsValidRevision', True)
1218 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=self.fake_hash_1
1219 ).AndReturn(True)
1220 gclient_scm.scm.GIT.IsValidRevision(cwd=self.base_path, rev=too_big
iannucci@chromium.org3830a672013-02-19 20:15:14 +00001221 ).MultipleTimes(2).AndReturn(False)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001222
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001223 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
1224 gclient_scm.os.path.isdir(self.base_path).MultipleTimes().AndReturn(True)
1225
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001226 self.mox.ReplayAll()
1227
1228 git_svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
1229 relpath=self.relpath)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001230 # Without an existing checkout, this should fail.
1231 # TODO(dbeam) Fix this. http://crbug.com/109184
dbeam@chromium.org051c88b2011-12-22 00:23:03 +00001232 self.assertRaises(gclient_scm.gclient_utils.Error,
1233 git_svn_scm.GetUsableRev, '1', options)
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001234 # Given an SVN revision with a git-svn checkout, it should be translated to
1235 # a git sha1 and be usable.
1236 self.assertEquals(git_svn_scm.GetUsableRev('1', options),
1237 self.fake_hash_1)
dbeam@chromium.org2a75fdb2012-02-15 01:32:57 +00001238 # Our fake HEAD rev is r2, so this should call git fetch and git svn fetch
1239 # to get more revs (pymox will complain if this doesn't happen). We mock an
1240 # optimized checkout the first time, so this run should call git fetch.
1241 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1242 self.fake_hash_2)
1243 # The time we pretend we're not optimized, so no git fetch should fire.
dbeam@chromium.orge5d1e612011-12-19 19:49:19 +00001244 self.assertEquals(git_svn_scm.GetUsableRev('3', options),
1245 self.fake_hash_2)
1246 # Given a git sha1 with a git-svn checkout, it should be used as is.
1247 self.assertEquals(git_svn_scm.GetUsableRev(self.fake_hash_1, options),
1248 self.fake_hash_1)
1249 # We currently check for seemingly valid SVN revisions by assuming 6 digit
1250 # numbers, so assure that numeric revs >= 1000000 don't work.
1251 self.assertRaises(gclient_scm.gclient_utils.Error,
1252 git_svn_scm.GetUsableRev, too_big, options)
1253
1254
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001255class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +00001256 def testUpdateUpdate(self):
1257 if not self.enabled:
1258 return
1259 options = self.Options()
1260 expected_file_list = []
1261 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
1262 relpath=self.relpath)
1263 file_list = []
1264 options.revision = 'unmanaged'
1265 scm.update(options, (), file_list)
1266 self.assertEquals(file_list, expected_file_list)
1267 self.assertEquals(scm.revinfo(options, (), None),
1268 '069c602044c5388d2d15c3f875b057c852003458')
1269 self.checkstdout('________ unmanaged solution; skipping .\n')
1270
1271
msb@chromium.orge28e4982009-09-25 20:51:45 +00001272if __name__ == '__main__':
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +00001273 if '-v' in sys.argv:
1274 logging.basicConfig(
1275 level=logging.DEBUG,
1276 format='%(asctime).19s %(levelname)s %(filename)s:'
1277 '%(lineno)s %(message)s')
msb@chromium.orge28e4982009-09-25 20:51:45 +00001278 unittest.main()
1279
1280# vim: ts=2:sw=2:tw=80:et: