blob: 87d8acf7e7bbf92c7b19fa60252d76e344c2a3a8 [file] [log] [blame]
maruel@chromium.org45d8db02011-03-31 20:43:56 +00001#!/usr/bin/env python
2# Copyright (c) 2011 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
maruel@chromium.org795a8c12010-10-05 19:54:29 +000067 # Absolute path of the fake checkout directory.
68 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000069
70 def tearDown(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000071 SuperMoxTestBase.tearDown(self)
72
73
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000074class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000075 class OptionsObject(object):
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +000076 def __init__(self, verbose=False, revision=None, force=False):
msb@chromium.orge28e4982009-09-25 20:51:45 +000077 self.verbose = verbose
78 self.revision = revision
79 self.manually_grab_svn_rev = True
80 self.deps_os = None
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +000081 self.force = force
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000082 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000083 self.nohooks = False
maruel@chromium.org36ac2392011-10-12 16:36:11 +000084 # TODO(maruel): Test --jobs > 1.
85 self.jobs = 1
msb@chromium.orge28e4982009-09-25 20:51:45 +000086
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000087 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +000088 return self.OptionsObject(*args, **kwargs)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000089
msb@chromium.orge28e4982009-09-25 20:51:45 +000090 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000091 BaseTestCase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000092 self.url = self.SvnUrl()
msb@chromium.orge28e4982009-09-25 20:51:45 +000093
94 def testDir(self):
95 members = [
floitsch@google.comeaab7842011-04-28 09:07:58 +000096 'FullUrlForRelativeUrl', 'GetRevisionDate', 'RunCommand',
phajdan.jr@chromium.org6e043f72011-05-02 07:24:32 +000097 'cleanup', 'diff', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +000098 'revinfo', 'runhooks', 'status', 'update',
tony@chromium.org4b5b1772010-04-08 01:52:56 +000099 'updatesingle', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000100 ]
101
102 # If you add a member, be sure to add the relevant test!
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000103 self.compareMembers(self._scm_wrapper('svn://a'), members)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000104
105 def testUnsupportedSCM(self):
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000106 args = ['gopher://foo', self.root_dir, self.relpath]
107 exception_msg = 'No SCM found for url gopher://foo'
108 self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000109
msb@chromium.orge6f78352010-01-13 17:05:33 +0000110 def testSVNFullUrlForRelativeUrl(self):
111 self.url = 'svn://a/b/c/d'
112
113 self.mox.ReplayAll()
114 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
115 relpath=self.relpath)
116 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
117
118 def testGITFullUrlForRelativeUrl(self):
119 self.url = 'git://a/b/c/d'
120
121 self.mox.ReplayAll()
122 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
123 relpath=self.relpath)
124 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
125
igorgatis@gmail.com4e075672011-11-21 16:35:08 +0000126 def testGITFakeHttpUrl(self):
127 self.url = 'git+http://foo'
128
129 self.mox.ReplayAll()
130 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
131 relpath=self.relpath)
132 self.assertEqual(scm.url, 'http://foo')
133
134 def testGITFakeHttpsUrl(self):
135 self.url = 'git+https://foo'
136
137 self.mox.ReplayAll()
138 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
139 relpath=self.relpath)
140 self.assertEqual(scm.url, 'https://foo')
141
msb@chromium.orge28e4982009-09-25 20:51:45 +0000142 def testRunCommandException(self):
143 options = self.Options(verbose=False)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000144 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
145 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000146
147 self.mox.ReplayAll()
148 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
149 relpath=self.relpath)
150 exception = "Unsupported argument(s): %s" % ','.join(self.args)
151 self.assertRaisesError(exception, scm.RunCommand,
152 'update', options, self.args)
153
154 def testRunCommandUnknown(self):
155 # TODO(maruel): if ever used.
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000156 pass
msb@chromium.orge28e4982009-09-25 20:51:45 +0000157
158 def testRevertMissing(self):
159 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000160 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000161 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000162 gclient_scm.scm.SVN.Capture(['--version'], None
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000163 ).AndReturn('svn, version 1.5.1 (r32289)')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000164 # It'll to a checkout instead.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000165 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
166 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000167 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000168 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000169 parent = gclient_scm.os.path.dirname(self.base_path)
170 gclient_scm.os.path.exists(parent).AndReturn(False)
171 gclient_scm.os.makedirs(parent)
172 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000173 files_list = self.mox.CreateMockAnything()
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000174 gclient_scm.scm.SVN.RunAndGetFileList(
175 options.verbose,
176 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
177 cwd=self.root_dir,
178 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000179
180 self.mox.ReplayAll()
181 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
182 relpath=self.relpath)
183 scm.revert(options, self.args, files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000184 self.checkstdout(
185 ('\n_____ %s is missing, synching instead\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000186
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000187 def testRevertNoDotSvn(self):
188 options = self.Options(verbose=True, force=True)
189 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
190 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(False)
191 gclient_scm.os.path.isdir(join(self.base_path, '.git')).AndReturn(False)
192 gclient_scm.os.path.isdir(join(self.base_path, '.hg')).AndReturn(False)
193 # Checkout.
194 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
195 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
196 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
197 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000198 parent = gclient_scm.os.path.dirname(self.base_path)
199 gclient_scm.os.path.exists(parent).AndReturn(False)
200 gclient_scm.os.makedirs(parent)
201 gclient_scm.os.path.exists(parent).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000202 files_list = self.mox.CreateMockAnything()
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000203 gclient_scm.scm.SVN.Capture(['--version'], None
204 ).AndReturn('svn, version 1.6')
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000205 gclient_scm.scm.SVN.RunAndGetFileList(
206 options.verbose,
207 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
208 cwd=self.root_dir,
209 file_list=files_list)
210
211 self.mox.ReplayAll()
212 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
213 relpath=self.relpath)
214 scm.revert(options, self.args, files_list)
215 self.checkstdout(
216 '\n_____ %s is not a valid svn checkout, synching instead\n' %
217 self.relpath)
218
msb@chromium.orge28e4982009-09-25 20:51:45 +0000219 def testRevertNone(self):
220 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000221 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000222 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000223 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path).AndReturn([])
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000224 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000225 gclient_scm.scm.SVN.RunAndGetFileList(
226 options.verbose,
227 ['update', '--revision', 'BASE', '--ignore-externals'],
228 cwd=self.base_path,
229 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000230
231 self.mox.ReplayAll()
232 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
233 relpath=self.relpath)
234 file_list = []
235 scm.revert(options, self.args, file_list)
236
msb@chromium.orge28e4982009-09-25 20:51:45 +0000237 def testRevertDirectory(self):
238 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000239 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgc0cc0872011-10-12 17:02:41 +0000240 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000241 items = [
242 ('~ ', 'a'),
243 ]
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000244 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path).AndReturn(items)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000245 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000246 gclient_scm.os.path.exists(file_path).AndReturn(True)
247 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000248 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000249 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000250 gclient_scm.gclient_utils.RemoveDirectory(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000251 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000252 gclient_scm.scm.SVN.RunAndGetFileList(
253 options.verbose,
254 ['update', '--revision', 'BASE', '--ignore-externals'],
255 cwd=self.base_path,
256 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000257
258 self.mox.ReplayAll()
259 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
260 relpath=self.relpath)
261 file_list2 = []
262 scm.revert(options, self.args, file_list2)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000263 self.checkstdout(('%s\n' % file_path))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000264
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000265 def testRevertDot(self):
266 self.mox.StubOutWithMock(gclient_scm.SVNWrapper, 'update')
267 options = self.Options(verbose=True)
268 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
269 gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
270 items = [
271 ('~ ', '.'),
272 ]
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000273 gclient_scm.scm.SVN.CaptureStatus(None, self.base_path).AndReturn(items)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000274 file_path = join(self.base_path, '.')
275 gclient_scm.os.path.exists(file_path).AndReturn(True)
276 gclient_scm.os.path.isfile(file_path).AndReturn(False)
277 gclient_scm.os.path.islink(file_path).AndReturn(False)
278 gclient_scm.os.path.isdir(file_path).AndReturn(True)
279 gclient_scm.gclient_utils.RemoveDirectory(file_path)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000280 # pylint: disable=E1120
maruel@chromium.org428342a2011-11-10 15:46:33 +0000281 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.org8b322b32011-11-01 19:05:50 +0000282 gclient_scm.SVNWrapper.update(options, [], ['.'])
283
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)
289 self.checkstdout(('%s\n' % file_path))
290
msb@chromium.orge28e4982009-09-25 20:51:45 +0000291 def testStatus(self):
292 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000293 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000294 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000295 options.verbose,
296 ['status'] + self.args + ['--ignore-externals'],
297 cwd=self.base_path,
298 file_list=[]).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000299
300 self.mox.ReplayAll()
301 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
302 relpath=self.relpath)
303 file_list = []
304 self.assertEqual(scm.status(options, self.args, file_list), None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000305
306 # TODO(maruel): TEST REVISIONS!!!
307 # TODO(maruel): TEST RELOCATE!!!
308 def testUpdateCheckout(self):
309 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000310 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000311 file_info.root = 'blah'
312 file_info.url = self.url
313 file_info.uuid = 'ABC'
314 file_info.revision = 42
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000315 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
316 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000317 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000318 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
maruel@chromium.org6c48a302011-10-20 23:44:20 +0000319 parent = gclient_scm.os.path.dirname(self.base_path)
320 gclient_scm.os.path.exists(parent).AndReturn(False)
321 gclient_scm.os.makedirs(parent)
322 gclient_scm.os.path.exists(parent).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000323 files_list = self.mox.CreateMockAnything()
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000324 gclient_scm.scm.SVN.Capture(['--version'], None
maruel@chromium.org669600d2010-09-01 19:06:31 +0000325 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000326 gclient_scm.scm.SVN.RunAndGetFileList(
327 options.verbose,
328 ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
329 cwd=self.root_dir,
330 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000331 self.mox.ReplayAll()
332 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
333 relpath=self.relpath)
334 scm.update(options, (), files_list)
335
336 def testUpdateUpdate(self):
337 options = self.Options(verbose=True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000338 options.force = True
339 options.nohooks = False
340 file_info = {
341 'Repository Root': 'blah',
342 'URL': self.url,
343 'UUID': 'ABC',
344 'Revision': 42,
345 }
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000346 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
347 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000348
349 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000350 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000351 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000352
msb@chromium.orge28e4982009-09-25 20:51:45 +0000353 # Checkout or update.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000354 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000355 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000356 # Cheat a bit here.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000357 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
358 ).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000359 additional_args = []
360 if options.manually_grab_svn_rev:
361 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000362 gclient_scm.scm.SVN.Capture(['--version'], None
maruel@chromium.org669600d2010-09-01 19:06:31 +0000363 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000364 additional_args.extend(['--force', '--ignore-externals'])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000365 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000366 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000367 options.verbose,
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000368 ['update', self.base_path] + additional_args,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000369 cwd=self.root_dir, file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000370
371 self.mox.ReplayAll()
372 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
373 relpath=self.relpath)
374 scm.update(options, (), files_list)
375
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000376 def testUpdateSingleCheckout(self):
377 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000378 file_info = {
379 'URL': self.url,
380 'Revision': 42,
381 }
tony@chromium.org57564662010-04-14 02:35:12 +0000382
383 # Checks to make sure that we support svn co --depth.
384 gclient_scm.scm.SVN.current_version = None
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000385 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000386 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000387 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
388 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000389
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000390 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000391 dotted_path = join(self.base_path, '.')
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000392 gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000393
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000394 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000395 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000396 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000397 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000398 always=True,
399 cwd=self.root_dir)
400 gclient_scm.scm.SVN.RunAndGetFileList(
401 options.verbose,
402 ['update', 'DEPS', '--ignore-externals'],
403 cwd=self.base_path,
404 file_list=files_list)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000405
406 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000407 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
408 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
409 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000410 gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
411 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
412 ).AndReturn(file_info)
tony@chromium.org57564662010-04-14 02:35:12 +0000413
414 self.mox.ReplayAll()
415 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
416 relpath=self.relpath)
417 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000418 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org57564662010-04-14 02:35:12 +0000419
420 def testUpdateSingleCheckoutSVN14(self):
421 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000422
423 # Checks to make sure that we support svn co --depth.
424 gclient_scm.scm.SVN.current_version = None
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000425 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000426 ).AndReturn('svn, version 1.4.4 (r25188)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000427 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org57564662010-04-14 02:35:12 +0000428
429 # When checking out a single file with svn 1.4, we use svn export
430 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000431 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000432 ['svn', 'export', join(self.url, 'DEPS'), join(self.base_path, 'DEPS')],
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000433 always=True, cwd=self.root_dir)
tony@chromium.org57564662010-04-14 02:35:12 +0000434
435 self.mox.ReplayAll()
436 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
437 relpath=self.relpath)
438 scm.updatesingle(options, ['DEPS'], files_list)
439
440 def testUpdateSingleCheckoutSVNUpgrade(self):
441 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000442 file_info = {
443 'URL': self.url,
444 'Revision': 42,
445 }
446
447 # Checks to make sure that we support svn co --depth.
448 gclient_scm.scm.SVN.current_version = None
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000449 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000450 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000451 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000452 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
453 # the old DEPS file.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000454 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(True)
455 gclient_scm.os.remove(join(self.base_path, 'DEPS'))
tony@chromium.org57564662010-04-14 02:35:12 +0000456
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000457 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000458 gclient_scm.scm.SVN.CaptureStatus(
459 None, join(self.base_path, '.')).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000460
tony@chromium.org57564662010-04-14 02:35:12 +0000461 # When checking out a single file, we issue an svn checkout and svn update.
462 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000463 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000464 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.orgce117f62011-01-17 20:04:25 +0000465 always=True,
466 cwd=self.root_dir)
467 gclient_scm.scm.SVN.RunAndGetFileList(
468 options.verbose,
469 ['update', 'DEPS', '--ignore-externals'],
470 cwd=self.base_path,
471 file_list=files_list)
tony@chromium.org57564662010-04-14 02:35:12 +0000472
473 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000474 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
475 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
476 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000477 gclient_scm.scm.SVN._CaptureInfo(
478 [], join(self.base_path, ".")).AndReturn(file_info)
479 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
480 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000481
482 self.mox.ReplayAll()
483 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
484 relpath=self.relpath)
485 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000486 self.checkstdout(
487 ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000488
489 def testUpdateSingleUpdate(self):
490 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000491 file_info = {
492 'URL': self.url,
493 'Revision': 42,
494 }
tony@chromium.org57564662010-04-14 02:35:12 +0000495 # Checks to make sure that we support svn co --depth.
496 gclient_scm.scm.SVN.current_version = None
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000497 gclient_scm.scm.SVN.Capture(['--version'], None
tony@chromium.org57564662010-04-14 02:35:12 +0000498 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000499 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000500
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000501 # Verify no locked files.
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000502 gclient_scm.scm.SVN.CaptureStatus(None, join(self.base_path, '.')
503 ).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000504
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000505 # Now we fall back on scm.update().
506 files_list = self.mox.CreateMockAnything()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000507 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
508 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
509 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
maruel@chromium.orgd579fcf2011-12-13 20:36:03 +0000510 gclient_scm.scm.SVN._CaptureInfo(
511 [], join(self.base_path, '.')).AndReturn(file_info)
512 gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
513 ).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +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.org54019f32010-09-09 13:50:11 +0000519 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000520
msb@chromium.orge28e4982009-09-25 20:51:45 +0000521 def testUpdateGit(self):
522 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000523 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
524 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000525
526 self.mox.ReplayAll()
527 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
528 relpath=self.relpath)
529 file_list = []
530 scm.update(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000531 self.checkstdout(
532 ('________ found .git directory; skipping %s\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000533
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000534 def testUpdateHg(self):
535 options = self.Options(verbose=True)
536 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
537 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(True)
538
539 self.mox.ReplayAll()
540 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
541 relpath=self.relpath)
542 file_list = []
543 scm.update(options, self.args, file_list)
544 self.checkstdout(
545 ('________ found .hg directory; skipping %s\n' % self.relpath))
546
msb@chromium.orge28e4982009-09-25 20:51:45 +0000547
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000548class BaseGitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
549 unittest.TestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000550 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000551 class OptionsObject(object):
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000552 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000553 self.verbose = verbose
554 self.revision = revision
555 self.manually_grab_svn_rev = True
556 self.deps_os = None
557 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000558 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000559 self.nohooks = False
bauerb@chromium.org4dd09372011-07-22 14:41:51 +0000560 self.merge = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000561
562 sample_git_import = """blob
563mark :1
564data 6
565Hello
566
567blob
568mark :2
569data 4
570Bye
571
572reset refs/heads/master
573commit refs/heads/master
574mark :3
575author Bob <bob@example.com> 1253744361 -0700
576committer Bob <bob@example.com> 1253744361 -0700
577data 8
578A and B
579M 100644 :1 a
580M 100644 :2 b
581
582blob
583mark :4
584data 10
585Hello
586You
587
588blob
589mark :5
590data 8
591Bye
592You
593
594commit refs/heads/origin
595mark :6
596author Alice <alice@example.com> 1253744424 -0700
597committer Alice <alice@example.com> 1253744424 -0700
598data 13
599Personalized
600from :3
601M 100644 :4 a
602M 100644 :5 b
603
604reset refs/heads/master
605from :3
606"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000607 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000608 return self.OptionsObject(*args, **kwargs)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000609
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000610 @staticmethod
611 def CreateGitRepo(git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000612 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000613 try:
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000614 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000615 cwd=path).communicate()
616 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000617 # git is not available, skip this test.
618 return False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000619 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
620 stderr=STDOUT, cwd=path).communicate(input=git_import)
621 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
622 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000623 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000624 stderr=STDOUT, cwd=path).communicate()
625 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
626 stderr=STDOUT, cwd=path).communicate()
627 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
628 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000629 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000630 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000631 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000632
msb@chromium.orge28e4982009-09-25 20:51:45 +0000633 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000634 TestCaseUtils.setUp(self)
635 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000636 self.url = 'git://foo'
637 self.root_dir = tempfile.mkdtemp()
638 self.relpath = '.'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000639 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000640 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000641 StdoutCheck.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000642
643 def tearDown(self):
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000644 StdoutCheck.tearDown(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000645 TestCaseUtils.tearDown(self)
646 unittest.TestCase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000647 rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000648
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000649
650class ManagedGitWrapperTestCase(BaseGitWrapperTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000651 def testDir(self):
652 members = [
floitsch@google.comeaab7842011-04-28 09:07:58 +0000653 'FullUrlForRelativeUrl', 'GetRevisionDate', 'RunCommand',
phajdan.jr@chromium.org6e043f72011-05-02 07:24:32 +0000654 'cleanup', 'diff', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000655 'revinfo', 'runhooks', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000656 ]
657
658 # If you add a member, be sure to add the relevant test!
659 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
660
661 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000662 if not self.enabled:
663 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000664 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000665 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000666 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
667 relpath=self.relpath)
668 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000669 scm.update(options, None, file_list)
670 gclient_scm.os.remove(file_path)
671 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000672 scm.revert(options, self.args, file_list)
673 self.assertEquals(file_list, [file_path])
674 file_list = []
675 scm.diff(options, self.args, file_list)
676 self.assertEquals(file_list, [])
szager@google.com85d3e3a2011-10-07 17:12:00 +0000677 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000678 'Fast-forward\n a | 1 +\n b | 1 +\n'
679 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000680 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000681 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
682 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
683 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000684
685 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000686 if not self.enabled:
687 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000688 options = self.Options()
689 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
690 relpath=self.relpath)
691 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000692 scm.update(options, None, file_list)
693 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000694 scm.revert(options, self.args, file_list)
695 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000696 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000697 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000698 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000699 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
700 'Fast-forward\n a | 1 +\n b | 1 +\n'
701 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000702 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
703 'HEAD is now at a7142dc Personalized\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000704 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000705
706 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000707 if not self.enabled:
708 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000709 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000710 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
711 relpath=self.relpath)
712 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000713 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000714 file_path = join(self.base_path, 'a')
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000715 open(file_path, 'a').writelines('touched\n')
716 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000717 scm.revert(options, self.args, file_list)
718 self.assertEquals(file_list, [file_path])
719 file_list = []
720 scm.diff(options, self.args, file_list)
721 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000722 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000723 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000724 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000725 'Fast-forward\n a | 1 +\n b | 1 +\n'
726 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000727 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000728 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
729 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
730 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000731
732 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000733 if not self.enabled:
734 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000735 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000736 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
737 relpath=self.relpath)
738 file_list = []
739 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000740 file_path = join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000741 f = open(file_path, 'w')
742 f.writelines('new\n')
743 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000744 Popen(['git', 'add', 'c'], stdout=PIPE,
745 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000746 file_list = []
747 scm.revert(options, self.args, file_list)
748 self.assertEquals(file_list, [file_path])
749 file_list = []
750 scm.diff(options, self.args, file_list)
751 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000752 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000753 'a7142dc9f0009350b96a11f372b6ea658592aa95')
szager@google.com85d3e3a2011-10-07 17:12:00 +0000754 expectation = ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000755 'Fast-forward\n a | 1 +\n b | 1 +\n'
756 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000757 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
szager@google.com85d3e3a2011-10-07 17:12:00 +0000758 'HEAD is now at a7142dc Personalized\n') % join(self.root_dir, '.')
759 self.assertTrue(sys.stdout.getvalue().startswith(expectation))
760 sys.stdout.close()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000761
762 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000763 if not self.enabled:
764 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000765 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000766 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000767 open(file_path, 'a').writelines('touched\n')
768 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
769 relpath=self.relpath)
770 file_list = []
771 scm.status(options, self.args, file_list)
772 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000773 self.checkstdout(
774 ('\n________ running \'git diff --name-status '
775 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000776 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000777
778 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000779 if not self.enabled:
780 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000781 options = self.Options()
782 expected_file_list = []
783 for f in ['a', 'b']:
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000784 file_path = join(self.base_path, f)
785 open(file_path, 'a').writelines('touched\n')
786 expected_file_list.extend([file_path])
msb@chromium.orge28e4982009-09-25 20:51:45 +0000787 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
788 relpath=self.relpath)
789 file_list = []
790 scm.status(options, self.args, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000791 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000792 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000793 self.checkstdout(
794 ('\n________ running \'git diff --name-status '
795 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000796 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000797
798 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000799 if not self.enabled:
800 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000801 options = self.Options(verbose=True)
dpranke@chromium.org330f5342011-03-13 02:56:43 +0000802 root_dir = gclient_scm.os.path.realpath(tempfile.mkdtemp())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000803 relpath = 'foo'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000804 base_path = join(root_dir, relpath)
805 url = join(self.base_path, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000806 try:
807 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
808 relpath=relpath)
809 file_list = []
810 scm.update(options, (), file_list)
811 self.assertEquals(len(file_list), 2)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000812 self.assert_(gclient_scm.os.path.isfile(join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000813 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000814 '069c602044c5388d2d15c3f875b057c852003458')
815 finally:
maruel@chromium.orgba551772010-02-03 18:21:42 +0000816 rmtree(root_dir)
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000817 msg1 = (
818 "\n_____ foo at refs/heads/master\n\n"
szager@google.com85d3e3a2011-10-07 17:12:00 +0000819 "________ running 'git clone --progress -b master --verbose %s %s' "
820 "in '%s'\n"
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000821 "Initialized empty Git repository in %s\n") % (
822 join(self.root_dir, '.', '.git'),
823 join(root_dir, 'foo'),
824 root_dir,
825 join(gclient_scm.os.path.realpath(root_dir), 'foo', '.git') + '/')
826 msg2 = (
827 "\n_____ foo at refs/heads/master\n\n"
szager@google.com85d3e3a2011-10-07 17:12:00 +0000828 "________ running 'git clone --progress -b master --verbose %s %s'"
829 " in '%s'\n"
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000830 "Cloning into %s...\ndone.\n") % (
831 join(self.root_dir, '.', '.git'),
832 join(root_dir, 'foo'),
833 root_dir,
834 join(gclient_scm.os.path.realpath(root_dir), 'foo'))
835 out = sys.stdout.getvalue()
836 sys.stdout.close()
dpranke@chromium.org330f5342011-03-13 02:56:43 +0000837 sys.stdout = self._old_stdout
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000838 self.assertTrue(out in (msg1, msg2), (out, msg1, msg2))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000839
840 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000841 if not self.enabled:
842 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000843 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000844 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000845 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
846 relpath=self.relpath)
847 file_list = []
848 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000849 self.assertEquals(file_list, expected_file_list)
850 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000851 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000852 self.checkstdout(
853 '\n_____ . at refs/heads/master\n'
854 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
855 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000856
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000857 def testUpdateUnstagedConflict(self):
858 if not self.enabled:
859 return
860 options = self.Options()
861 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
862 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000863 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000864 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000865 try:
866 scm.update(options, (), [])
867 self.fail()
maruel@chromium.orgfae707b2011-09-15 18:57:58 +0000868 except (gclient_scm.gclient_utils.Error, subprocess2.CalledProcessError):
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000869 # The exact exception text varies across git versions so it's not worth
870 # verifying it. It's fine as long as it throws.
871 pass
872 # Manually flush stdout since we can't verify it's content accurately across
873 # git versions.
874 sys.stdout.getvalue()
875 sys.stdout.close()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000876
msb@chromium.org5bde4852009-12-14 16:47:12 +0000877 def testUpdateConflict(self):
878 if not self.enabled:
879 return
880 options = self.Options()
881 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
882 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000883 file_path = join(self.base_path, 'b')
maruel@chromium.orgbf38a7e2010-12-14 18:15:54 +0000884 open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000885 scm._Run(['commit', '-am', 'test'], options)
886 __builtin__.raw_input = lambda x: 'y'
887 exception = ('Conflict while rebasing this branch.\n'
888 'Fix the conflict and run gclient again.\n'
889 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +0000890 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000891 exception = ('\n____ . at refs/heads/master\n'
892 '\tYou have unstaged changes.\n'
893 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +0000894 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000895 # The hash always changes. Use a cheap trick.
896 start = ('\n________ running \'git commit -am test\' in \'%s\'\n'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000897 '[new ') % join(self.root_dir, '.')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000898 end = ('] test\n 1 files changed, 1 insertions(+), '
899 '1 deletions(-)\n\n_____ . at refs/heads/master\n'
900 'Attempting rebase onto refs/remotes/origin/master...\n')
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +0000901 self.assertTrue(sys.stdout.getvalue().startswith(start))
902 self.assertTrue(sys.stdout.getvalue().endswith(end))
903 self.assertEquals(len(sys.stdout.getvalue()),
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000904 len(start) + len(end) + 7)
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +0000905 sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +0000906
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000907 def testUpdateNotGit(self):
908 if not self.enabled:
909 return
910 options = self.Options()
911 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
912 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000913 git_path = join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +0000914 rename(git_path, git_path + 'foo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000915 exception = ('\n____ . at refs/heads/master\n'
916 '\tPath is not a git repo. No .git dir.\n'
917 '\tTo resolve:\n'
918 '\t\trm -rf .\n'
919 '\tAnd run gclient sync again\n')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000920 self.assertRaisesError(exception, scm.update, options, (), [])
921
msb@chromium.org0f282062009-11-06 20:14:02 +0000922 def testRevinfo(self):
923 if not self.enabled:
924 return
925 options = self.Options()
926 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
927 relpath=self.relpath)
928 rev_info = scm.revinfo(options, (), None)
929 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
930
msb@chromium.orge28e4982009-09-25 20:51:45 +0000931
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000932class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
933 def testUpdateCheckout(self):
934 if not self.enabled:
935 return
936 options = self.Options(verbose=True)
937 root_dir = gclient_scm.os.path.realpath(tempfile.mkdtemp())
938 relpath = 'foo'
939 base_path = join(root_dir, relpath)
940 url = join(self.base_path, '.git')
941 try:
942 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
943 relpath=relpath)
944 file_list = []
945 options.revision = 'unmanaged'
946 scm.update(options, (), file_list)
947 self.assertEquals(len(file_list), 2)
948 self.assert_(gclient_scm.os.path.isfile(join(base_path, 'a')))
949 self.assertEquals(scm.revinfo(options, (), None),
950 '069c602044c5388d2d15c3f875b057c852003458')
951 finally:
952 rmtree(root_dir)
953 msg1 = (
954 "\n_____ foo at refs/heads/master\n\n"
szager@google.com85d3e3a2011-10-07 17:12:00 +0000955 "________ running 'git clone --progress -b master --verbose %s %s'"
956 " in '%s'\n"
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000957 "Initialized empty Git repository in %s\n") % (
958 join(self.root_dir, '.', '.git'),
959 join(root_dir, 'foo'),
960 root_dir,
961 join(gclient_scm.os.path.realpath(root_dir), 'foo', '.git') + '/')
962 msg2 = (
963 "\n_____ foo at refs/heads/master\n\n"
szager@google.com85d3e3a2011-10-07 17:12:00 +0000964 "________ running 'git clone --progress -b master --verbose %s %s'"
965 " in '%s'\n"
cmp@chromium.orgeb2756d2011-09-20 20:17:51 +0000966 "Cloning into %s...\ndone.\n") % (
967 join(self.root_dir, '.', '.git'),
968 join(root_dir, 'foo'),
969 root_dir,
970 join(gclient_scm.os.path.realpath(root_dir), 'foo'))
971 out = sys.stdout.getvalue()
972 sys.stdout.close()
973 sys.stdout = self._old_stdout
974 self.assertTrue(out in (msg1, msg2), (out, msg1, msg2))
975
976 def testUpdateUpdate(self):
977 if not self.enabled:
978 return
979 options = self.Options()
980 expected_file_list = []
981 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
982 relpath=self.relpath)
983 file_list = []
984 options.revision = 'unmanaged'
985 scm.update(options, (), file_list)
986 self.assertEquals(file_list, expected_file_list)
987 self.assertEquals(scm.revinfo(options, (), None),
988 '069c602044c5388d2d15c3f875b057c852003458')
989 self.checkstdout('________ unmanaged solution; skipping .\n')
990
991
msb@chromium.orge28e4982009-09-25 20:51:45 +0000992if __name__ == '__main__':
maruel@chromium.orgcdbecc42011-02-09 04:31:47 +0000993 if '-v' in sys.argv:
994 logging.basicConfig(
995 level=logging.DEBUG,
996 format='%(asctime).19s %(levelname)s %(filename)s:'
997 '%(lineno)s %(message)s')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000998 unittest.main()
999
1000# vim: ts=2:sw=2:tw=80:et: