blob: f49b2d82b2e9a561dd5285f261d2434620f700e5 [file] [log] [blame]
msb@chromium.orge28e4982009-09-25 20:51:45 +00001#!/usr/bin/python
maruel@chromium.orgba551772010-02-03 18:21:42 +00002# Copyright (c) 2010 The Chromium Authors. All rights reserved.
3# 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.orgba551772010-02-03 18:21:42 +00008# Import before super_mox to keep valid references.
9from os import rename
10from shutil import rmtree
maruel@chromium.org54019f32010-09-09 13:50:11 +000011import StringIO
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000012from subprocess import Popen, PIPE, STDOUT
msb@chromium.orge28e4982009-09-25 20:51:45 +000013import tempfile
maruel@chromium.org389d6de2010-09-09 14:14:37 +000014import unittest
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +000015import __builtin__
msb@chromium.orge28e4982009-09-25 20:51:45 +000016
maruel@chromium.orgba551772010-02-03 18:21:42 +000017# Fixes include path.
maruel@chromium.orgdd057f32010-09-20 19:33:31 +000018from super_mox import mox, StdoutCheck, TestCaseUtils, SuperMoxTestBase
maruel@chromium.orgba551772010-02-03 18:21:42 +000019
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +000020import sys
msb@chromium.orge28e4982009-09-25 20:51:45 +000021import gclient_scm
maruel@chromium.org96913eb2010-06-01 16:22:47 +000022
maruel@chromium.org795a8c12010-10-05 19:54:29 +000023# Shortcut since this function is used often
24join = gclient_scm.os.path.join
25
maruel@chromium.org96913eb2010-06-01 16:22:47 +000026
maruel@chromium.org389d6de2010-09-09 14:14:37 +000027class GCBaseTestCase(object):
maruel@chromium.org96913eb2010-06-01 16:22:47 +000028 def assertRaisesError(self, msg, fn, *args, **kwargs):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000029 """Like unittest's assertRaises() but checks for Gclient.Error."""
maruel@chromium.org96913eb2010-06-01 16:22:47 +000030 try:
31 fn(*args, **kwargs)
32 except gclient_scm.gclient_utils.Error, e:
33 self.assertEquals(e.args[0], msg)
34 else:
35 self.fail('%s not raised' % msg)
msb@chromium.orge28e4982009-09-25 20:51:45 +000036
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000037
maruel@chromium.org389d6de2010-09-09 14:14:37 +000038class BaseTestCase(GCBaseTestCase, SuperMoxTestBase):
39 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000040 SuperMoxTestBase.setUp(self)
41 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCall')
42 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter')
43 self.mox.StubOutWithMock(gclient_scm.gclient_utils,
44 'CheckCallAndFilterAndHeader')
45 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
46 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
47 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'Popen')
48 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
49 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo
50 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
51 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo')
52 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
53 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
54 self._scm_wrapper = gclient_scm.CreateSCM
maruel@chromium.org389d6de2010-09-09 14:14:37 +000055 gclient_scm.scm.SVN.current_version = None
maruel@chromium.org795a8c12010-10-05 19:54:29 +000056 # Absolute path of the fake checkout directory.
57 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000058
59 def tearDown(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +000060 SuperMoxTestBase.tearDown(self)
61
62
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000063class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000064 class OptionsObject(object):
maruel@chromium.org8071c282010-09-20 19:44:19 +000065 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +000066 self.verbose = verbose
67 self.revision = revision
68 self.manually_grab_svn_rev = True
69 self.deps_os = None
70 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000071 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000072 self.nohooks = False
73
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000074 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +000075 return self.OptionsObject(*args, **kwargs)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000076
msb@chromium.orge28e4982009-09-25 20:51:45 +000077 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000078 BaseTestCase.setUp(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +000079 self.url = self.SvnUrl()
msb@chromium.orge28e4982009-09-25 20:51:45 +000080
81 def testDir(self):
82 members = [
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +000083 'FullUrlForRelativeUrl', 'RunCommand',
maruel@chromium.org55e724e2010-03-11 19:36:49 +000084 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +000085 'revinfo', 'runhooks', 'status', 'update',
tony@chromium.org4b5b1772010-04-08 01:52:56 +000086 'updatesingle', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +000087 ]
88
89 # If you add a member, be sure to add the relevant test!
maruel@chromium.org9eda4112010-06-11 18:56:10 +000090 self.compareMembers(self._scm_wrapper('svn://a'), members)
msb@chromium.orge28e4982009-09-25 20:51:45 +000091
92 def testUnsupportedSCM(self):
maruel@chromium.org9eda4112010-06-11 18:56:10 +000093 args = ['gopher://foo', self.root_dir, self.relpath]
94 exception_msg = 'No SCM found for url gopher://foo'
95 self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
msb@chromium.orge28e4982009-09-25 20:51:45 +000096
msb@chromium.orge6f78352010-01-13 17:05:33 +000097 def testSVNFullUrlForRelativeUrl(self):
98 self.url = 'svn://a/b/c/d'
99
100 self.mox.ReplayAll()
101 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
102 relpath=self.relpath)
103 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
104
105 def testGITFullUrlForRelativeUrl(self):
106 self.url = 'git://a/b/c/d'
107
108 self.mox.ReplayAll()
109 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
110 relpath=self.relpath)
111 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
112
msb@chromium.orge28e4982009-09-25 20:51:45 +0000113 def testRunCommandException(self):
114 options = self.Options(verbose=False)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000115 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
116 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000117
118 self.mox.ReplayAll()
119 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
120 relpath=self.relpath)
121 exception = "Unsupported argument(s): %s" % ','.join(self.args)
122 self.assertRaisesError(exception, scm.RunCommand,
123 'update', options, self.args)
124
125 def testRunCommandUnknown(self):
126 # TODO(maruel): if ever used.
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000127 pass
msb@chromium.orge28e4982009-09-25 20:51:45 +0000128
129 def testRevertMissing(self):
130 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000131 gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000132 gclient_scm.scm.SVN.Capture(['--version']
133 ).AndReturn('svn, version 1.5.1 (r32289)')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000134 # It'll to a checkout instead.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000135 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
136 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000137 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000138 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000139 files_list = self.mox.CreateMockAnything()
maruel@chromium.org03807072010-08-16 17:18:44 +0000140 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000141 ['checkout', self.url, self.base_path,
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000142 '--force'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000143 cwd=self.root_dir,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000144 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000145
146 self.mox.ReplayAll()
147 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
148 relpath=self.relpath)
149 scm.revert(options, self.args, files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000150 self.checkstdout(
151 ('\n_____ %s is missing, synching instead\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000152
153 def testRevertNone(self):
154 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000155 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
156 gclient_scm.scm.SVN.CaptureStatus(self.base_path).AndReturn([])
maruel@chromium.org03807072010-08-16 17:18:44 +0000157 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000158 ['update', '--revision', 'BASE'],
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000159 cwd=self.base_path,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000160 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000161
162 self.mox.ReplayAll()
163 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
164 relpath=self.relpath)
165 file_list = []
166 scm.revert(options, self.args, file_list)
167
168 def testRevert2Files(self):
169 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000170 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000171 items = [
172 ('M ', 'a'),
173 ('A ', 'b'),
174 ]
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000175 file_path1 = join(self.base_path, 'a')
176 file_path2 = join(self.base_path, 'b')
177 gclient_scm.scm.SVN.CaptureStatus(self.base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000178 gclient_scm.os.path.exists(file_path1).AndReturn(True)
179 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
180 gclient_scm.os.remove(file_path1)
181 gclient_scm.os.path.exists(file_path2).AndReturn(True)
182 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
183 gclient_scm.os.remove(file_path2)
maruel@chromium.org03807072010-08-16 17:18:44 +0000184 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000185 ['update', '--revision', 'BASE'],
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000186 cwd=self.base_path,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000187 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000188
189 self.mox.ReplayAll()
190 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
191 relpath=self.relpath)
192 file_list = []
193 scm.revert(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000194 self.checkstdout(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000195 ('%s\n%s\n' % (join(self.base_path, 'a'),
196 join(self.base_path, 'b'))))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000197
198 def testRevertDirectory(self):
199 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000200 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000201 items = [
202 ('~ ', 'a'),
203 ]
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000204 gclient_scm.scm.SVN.CaptureStatus(self.base_path).AndReturn(items)
205 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000206 gclient_scm.os.path.exists(file_path).AndReturn(True)
207 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000208 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000209 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000210 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000211 file_list1 = []
maruel@chromium.org03807072010-08-16 17:18:44 +0000212 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000213 ['update', '--revision', 'BASE'],
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000214 cwd=self.base_path,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000215 file_list=mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000216
217 self.mox.ReplayAll()
218 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
219 relpath=self.relpath)
220 file_list2 = []
221 scm.revert(options, self.args, file_list2)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000222 self.checkstdout(('%s\n' % file_path))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000223
224 def testStatus(self):
225 options = self.Options(verbose=True)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000226 gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000227 gclient_scm.scm.SVN.RunAndGetFileList(
228 options.verbose, ['status'] + self.args,
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000229 cwd=self.base_path, file_list=[]).AndReturn(None)
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 self.assertEqual(scm.status(options, self.args, file_list), None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000236
237 # TODO(maruel): TEST REVISIONS!!!
238 # TODO(maruel): TEST RELOCATE!!!
239 def testUpdateCheckout(self):
240 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000241 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000242 file_info.root = 'blah'
243 file_info.url = self.url
244 file_info.uuid = 'ABC'
245 file_info.revision = 42
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000246 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
247 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000248 # Checkout.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000249 gclient_scm.os.path.exists(self.base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000250 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000251 gclient_scm.scm.SVN.Capture(['--version']
252 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org03807072010-08-16 17:18:44 +0000253 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose,
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000254 ['checkout', self.url, self.base_path,
maruel@chromium.org2b9aa8e2010-08-25 20:01:42 +0000255 '--force'],
maruel@chromium.org669600d2010-09-01 19:06:31 +0000256 cwd=self.root_dir,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000257 file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000258 self.mox.ReplayAll()
259 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
260 relpath=self.relpath)
261 scm.update(options, (), files_list)
262
263 def testUpdateUpdate(self):
264 options = self.Options(verbose=True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000265 options.force = True
266 options.nohooks = False
267 file_info = {
268 'Repository Root': 'blah',
269 'URL': self.url,
270 'UUID': 'ABC',
271 'Revision': 42,
272 }
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000273 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
274 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000275
276 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000277 dotted_path = join(self.base_path, '.')
278 gclient_scm.scm.SVN.CaptureStatus(dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000279
msb@chromium.orge28e4982009-09-25 20:51:45 +0000280 # Checkout or update.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000281 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
282 gclient_scm.scm.SVN.CaptureInfo(dotted_path).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000283 # Cheat a bit here.
maruel@chromium.org54019f32010-09-09 13:50:11 +0000284 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000285 additional_args = []
286 if options.manually_grab_svn_rev:
287 additional_args = ['--revision', str(file_info['Revision'])]
maruel@chromium.org669600d2010-09-01 19:06:31 +0000288 gclient_scm.scm.SVN.Capture(['--version']
289 ).AndReturn('svn, version 1.5.1 (r32289)')
290 additional_args.append('--force')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000291 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000292 gclient_scm.scm.SVN.RunAndGetFileList(
maruel@chromium.org03807072010-08-16 17:18:44 +0000293 options.verbose,
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000294 ['update', self.base_path] + additional_args,
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000295 cwd=self.root_dir, file_list=files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000296
297 self.mox.ReplayAll()
298 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
299 relpath=self.relpath)
300 scm.update(options, (), files_list)
301
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000302 def testUpdateSingleCheckout(self):
303 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000304 file_info = {
305 'URL': self.url,
306 'Revision': 42,
307 }
tony@chromium.org57564662010-04-14 02:35:12 +0000308
309 # Checks to make sure that we support svn co --depth.
310 gclient_scm.scm.SVN.current_version = None
311 gclient_scm.scm.SVN.Capture(['--version']
312 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000313 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
314 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000315
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000316 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000317 dotted_path = join(self.base_path, '.')
318 gclient_scm.scm.SVN.CaptureStatus(dotted_path).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000319
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000320 # When checking out a single file, we issue an svn checkout and svn update.
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000321 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000322 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000323 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000324 always=True, cwd=self.root_dir)
maruel@chromium.org03807072010-08-16 17:18:44 +0000325 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, ['update', 'DEPS'],
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000326 cwd=self.base_path, file_list=files_list)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000327
328 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000329 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
330 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
331 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
332 gclient_scm.scm.SVN.CaptureInfo(dotted_path).AndReturn(file_info)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000333 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org57564662010-04-14 02:35:12 +0000334
335 self.mox.ReplayAll()
336 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
337 relpath=self.relpath)
338 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000339 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org57564662010-04-14 02:35:12 +0000340
341 def testUpdateSingleCheckoutSVN14(self):
342 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000343 file_info = {
344 'URL': self.url,
345 'Revision': 42,
346 }
347
348 # Checks to make sure that we support svn co --depth.
349 gclient_scm.scm.SVN.current_version = None
350 gclient_scm.scm.SVN.Capture(['--version']
351 ).AndReturn('svn, version 1.4.4 (r25188)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000352 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org57564662010-04-14 02:35:12 +0000353
354 # When checking out a single file with svn 1.4, we use svn export
355 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000356 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000357 ['svn', 'export', join(self.url, 'DEPS'), join(self.base_path, 'DEPS')],
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000358 always=True, cwd=self.root_dir)
tony@chromium.org57564662010-04-14 02:35:12 +0000359
360 self.mox.ReplayAll()
361 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
362 relpath=self.relpath)
363 scm.updatesingle(options, ['DEPS'], files_list)
364
365 def testUpdateSingleCheckoutSVNUpgrade(self):
366 options = self.Options(verbose=True)
tony@chromium.org57564662010-04-14 02:35:12 +0000367 file_info = {
368 'URL': self.url,
369 'Revision': 42,
370 }
371
372 # Checks to make sure that we support svn co --depth.
373 gclient_scm.scm.SVN.current_version = None
374 gclient_scm.scm.SVN.Capture(['--version']
375 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000376 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
tony@chromium.org57564662010-04-14 02:35:12 +0000377 # If DEPS already exists, assume we're upgrading from svn1.4, so delete
378 # the old DEPS file.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000379 gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(True)
380 gclient_scm.os.remove(join(self.base_path, 'DEPS'))
tony@chromium.org57564662010-04-14 02:35:12 +0000381
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000382 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000383 gclient_scm.scm.SVN.CaptureStatus(join(self.base_path, '.')).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000384
tony@chromium.org57564662010-04-14 02:35:12 +0000385 # When checking out a single file, we issue an svn checkout and svn update.
386 files_list = self.mox.CreateMockAnything()
maruel@chromium.org669600d2010-09-01 19:06:31 +0000387 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000388 ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
maruel@chromium.org77e4eca2010-09-21 13:23:07 +0000389 always=True, cwd=self.root_dir)
maruel@chromium.org03807072010-08-16 17:18:44 +0000390 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, ['update', 'DEPS'],
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000391 cwd=self.base_path, file_list=files_list)
tony@chromium.org57564662010-04-14 02:35:12 +0000392
393 # Now we fall back on scm.update().
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000394 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
395 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
396 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000397 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000398 join(self.base_path, ".")).AndReturn(file_info)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000399 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000400
401 self.mox.ReplayAll()
402 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
403 relpath=self.relpath)
404 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000405 self.checkstdout(
406 ('\n_____ %s at 42\n' % self.relpath))
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000407
408 def testUpdateSingleUpdate(self):
409 options = self.Options(verbose=True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000410 file_info = {
411 'URL': self.url,
412 'Revision': 42,
413 }
tony@chromium.org57564662010-04-14 02:35:12 +0000414 # Checks to make sure that we support svn co --depth.
415 gclient_scm.scm.SVN.current_version = None
416 gclient_scm.scm.SVN.Capture(['--version']
417 ).AndReturn('svn, version 1.5.1 (r32289)')
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000418 gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000419
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000420 # Verify no locked files.
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000421 gclient_scm.scm.SVN.CaptureStatus(join(self.base_path, '.')).AndReturn([])
maruel@chromium.orge407c9a2010-08-09 19:11:37 +0000422
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000423 # Now we fall back on scm.update().
424 files_list = self.mox.CreateMockAnything()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000425 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
426 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
427 gclient_scm.os.path.exists(self.base_path).AndReturn(True)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000428 gclient_scm.scm.SVN.CaptureInfo(
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000429 join(self.base_path, '.')).AndReturn(file_info)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000430 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000431
432 self.mox.ReplayAll()
433 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
434 relpath=self.relpath)
435 scm.updatesingle(options, ['DEPS'], files_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000436 self.checkstdout('\n_____ %s at 42\n' % self.relpath)
tony@chromium.org4b5b1772010-04-08 01:52:56 +0000437
msb@chromium.orge28e4982009-09-25 20:51:45 +0000438 def testUpdateGit(self):
439 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000440 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
441 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000442
443 self.mox.ReplayAll()
444 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
445 relpath=self.relpath)
446 file_list = []
447 scm.update(options, self.args, file_list)
maruel@chromium.org54019f32010-09-09 13:50:11 +0000448 self.checkstdout(
449 ('________ found .git directory; skipping %s\n' % self.relpath))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000450
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000451 def testUpdateHg(self):
452 options = self.Options(verbose=True)
453 gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
454 gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(True)
455
456 self.mox.ReplayAll()
457 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
458 relpath=self.relpath)
459 file_list = []
460 scm.update(options, self.args, file_list)
461 self.checkstdout(
462 ('________ found .hg directory; skipping %s\n' % self.relpath))
463
msb@chromium.orge28e4982009-09-25 20:51:45 +0000464
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000465class GitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
466 unittest.TestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000467 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000468 class OptionsObject(object):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000469 def __init__(self, verbose=False, revision=None):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000470 self.verbose = verbose
471 self.revision = revision
472 self.manually_grab_svn_rev = True
473 self.deps_os = None
474 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000475 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000476 self.nohooks = False
477
478 sample_git_import = """blob
479mark :1
480data 6
481Hello
482
483blob
484mark :2
485data 4
486Bye
487
488reset refs/heads/master
489commit refs/heads/master
490mark :3
491author Bob <bob@example.com> 1253744361 -0700
492committer Bob <bob@example.com> 1253744361 -0700
493data 8
494A and B
495M 100644 :1 a
496M 100644 :2 b
497
498blob
499mark :4
500data 10
501Hello
502You
503
504blob
505mark :5
506data 8
507Bye
508You
509
510commit refs/heads/origin
511mark :6
512author Alice <alice@example.com> 1253744424 -0700
513committer Alice <alice@example.com> 1253744424 -0700
514data 13
515Personalized
516from :3
517M 100644 :4 a
518M 100644 :5 b
519
520reset refs/heads/master
521from :3
522"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000523 def Options(self, *args, **kwargs):
maruel@chromium.org8071c282010-09-20 19:44:19 +0000524 return self.OptionsObject(*args, **kwargs)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000525
526 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000527 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000528 try:
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000529 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000530 cwd=path).communicate()
531 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000532 # git is not available, skip this test.
533 return False
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000534 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
535 stderr=STDOUT, cwd=path).communicate(input=git_import)
536 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
537 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000538 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000539 stderr=STDOUT, cwd=path).communicate()
540 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
541 stderr=STDOUT, cwd=path).communicate()
542 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
543 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000544 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000545 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000546 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000547
msb@chromium.orge28e4982009-09-25 20:51:45 +0000548 def setUp(self):
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000549 TestCaseUtils.setUp(self)
550 unittest.TestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000551 self.url = 'git://foo'
552 self.root_dir = tempfile.mkdtemp()
553 self.relpath = '.'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000554 self.base_path = join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000555 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000556 StdoutCheck.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000557
558 def tearDown(self):
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000559 StdoutCheck.tearDown(self)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000560 TestCaseUtils.tearDown(self)
561 unittest.TestCase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000562 rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000563
564 def testDir(self):
565 members = [
maruel@chromium.org55e724e2010-03-11 19:36:49 +0000566 'FullUrlForRelativeUrl', 'RunCommand',
msb@chromium.orge6f78352010-01-13 17:05:33 +0000567 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org9eda4112010-06-11 18:56:10 +0000568 'revinfo', 'runhooks', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000569 ]
570
571 # If you add a member, be sure to add the relevant test!
572 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
573
574 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000575 if not self.enabled:
576 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000577 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000578 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000579 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
580 relpath=self.relpath)
581 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000582 scm.update(options, None, file_list)
583 gclient_scm.os.remove(file_path)
584 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000585 scm.revert(options, self.args, file_list)
586 self.assertEquals(file_list, [file_path])
587 file_list = []
588 scm.diff(options, self.args, file_list)
589 self.assertEquals(file_list, [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000590 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000591 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
592 'Fast-forward\n a | 1 +\n b | 1 +\n'
593 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000594 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
595 'HEAD is now at a7142dc Personalized\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000596 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000597
598 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000599 if not self.enabled:
600 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000601 options = self.Options()
602 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
603 relpath=self.relpath)
604 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000605 scm.update(options, None, file_list)
606 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000607 scm.revert(options, self.args, file_list)
608 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000609 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000610 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000611 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000612 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
613 'Fast-forward\n a | 1 +\n b | 1 +\n'
614 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000615 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
616 'HEAD is now at a7142dc Personalized\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000617 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000618
619 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000620 if not self.enabled:
621 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000622 options = self.Options()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000623 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
624 relpath=self.relpath)
625 file_list = []
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000626 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000627 file_path = join(self.base_path, 'a')
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000628 open(file_path, 'a').writelines('touched\n')
629 file_list = []
msb@chromium.orge28e4982009-09-25 20:51:45 +0000630 scm.revert(options, self.args, file_list)
631 self.assertEquals(file_list, [file_path])
632 file_list = []
633 scm.diff(options, self.args, file_list)
634 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000635 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000636 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000637 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000638 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
639 'Fast-forward\n a | 1 +\n b | 1 +\n'
640 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000641 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
642 'HEAD is now at a7142dc Personalized\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000643 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000644
645 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000646 if not self.enabled:
647 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000648 options = self.Options()
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000649 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
650 relpath=self.relpath)
651 file_list = []
652 scm.update(options, None, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000653 file_path = join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000654 f = open(file_path, 'w')
655 f.writelines('new\n')
656 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000657 Popen(['git', 'add', 'c'], stdout=PIPE,
658 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000659 file_list = []
660 scm.revert(options, self.args, file_list)
661 self.assertEquals(file_list, [file_path])
662 file_list = []
663 scm.diff(options, self.args, file_list)
664 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000665 self.assertEquals(scm.revinfo(options, self.args, None),
nasser@codeaurora.orgb2b46312010-04-30 20:58:03 +0000666 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000667 self.checkstdout(
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000668 ('\n_____ . at refs/heads/master\nUpdating 069c602..a7142dc\n'
669 'Fast-forward\n a | 1 +\n b | 1 +\n'
670 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n\n'
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000671 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
672 'HEAD is now at a7142dc Personalized\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000673 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000674
675 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000676 if not self.enabled:
677 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000678 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000679 file_path = join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000680 open(file_path, 'a').writelines('touched\n')
681 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
682 relpath=self.relpath)
683 file_list = []
684 scm.status(options, self.args, file_list)
685 self.assertEquals(file_list, [file_path])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000686 self.checkstdout(
687 ('\n________ running \'git diff --name-status '
688 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000689 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000690
691 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000692 if not self.enabled:
693 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000694 options = self.Options()
695 expected_file_list = []
696 for f in ['a', 'b']:
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000697 file_path = join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000698 open(file_path, 'a').writelines('touched\n')
699 expected_file_list.extend([file_path])
700 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
701 relpath=self.relpath)
702 file_list = []
703 scm.status(options, self.args, file_list)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000704 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000705 self.assertEquals(sorted(file_list), expected_file_list)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000706 self.checkstdout(
707 ('\n________ running \'git diff --name-status '
708 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000709 join(self.root_dir, '.'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000710
711 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000712 if not self.enabled:
713 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000714 options = self.Options(verbose=True)
715 root_dir = tempfile.mkdtemp()
716 relpath = 'foo'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000717 base_path = join(root_dir, relpath)
718 url = join(self.base_path, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000719 try:
720 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
721 relpath=relpath)
722 file_list = []
723 scm.update(options, (), file_list)
724 self.assertEquals(len(file_list), 2)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000725 self.assert_(gclient_scm.os.path.isfile(join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000726 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000727 '069c602044c5388d2d15c3f875b057c852003458')
728 finally:
maruel@chromium.orgba551772010-02-03 18:21:42 +0000729 rmtree(root_dir)
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000730 self.checkstdout(
731 ('\n_____ foo at refs/heads/master\n\n'
732 '________ running \'git clone -b master --verbose %s %s\' in \'%s\'\n'
733 'Initialized empty Git repository in %s\n') %
734 (join(self.root_dir, '.', '.git'), join(root_dir, 'foo'), root_dir,
bauerb@chromium.org4acf7422010-10-07 14:20:08 +0000735 join(gclient_scm.os.path.realpath(root_dir), 'foo', '.git') + '/'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000736
737 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000738 if not self.enabled:
739 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000740 options = self.Options()
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000741 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000742 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
743 relpath=self.relpath)
744 file_list = []
745 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000746 self.assertEquals(file_list, expected_file_list)
747 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000748 'a7142dc9f0009350b96a11f372b6ea658592aa95')
maruel@chromium.orgad80e3b2010-09-09 14:18:28 +0000749 self.checkstdout(
750 '\n_____ . at refs/heads/master\n'
751 'Updating 069c602..a7142dc\nFast-forward\n a | 1 +\n b | 1 +\n'
752 ' 2 files changed, 2 insertions(+), 0 deletions(-)\n\n')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000753
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000754 def testUpdateUnstagedConflict(self):
755 if not self.enabled:
756 return
757 options = self.Options()
758 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
759 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000760 file_path = join(self.base_path, 'b')
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000761 f = open(file_path, 'w').writelines('conflict\n')
762 exception = (
763 "error: Your local changes to 'b' would be overwritten by merge. "
764 "Aborting.\n"
765 "Please, commit your changes or stash them before you can merge.\n")
766 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000767 self.checkstdout('\n_____ . at refs/heads/master\n')
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000768
msb@chromium.org5bde4852009-12-14 16:47:12 +0000769 def testUpdateConflict(self):
770 if not self.enabled:
771 return
772 options = self.Options()
773 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
774 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000775 file_path = join(self.base_path, 'b')
msb@chromium.org5bde4852009-12-14 16:47:12 +0000776 f = open(file_path, 'w').writelines('conflict\n')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000777 scm._Run(['commit', '-am', 'test'], options)
778 __builtin__.raw_input = lambda x: 'y'
779 exception = ('Conflict while rebasing this branch.\n'
780 'Fix the conflict and run gclient again.\n'
781 'See \'man git-rebase\' for details.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +0000782 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000783 exception = ('\n____ . at refs/heads/master\n'
784 '\tYou have unstaged changes.\n'
785 '\tPlease commit, stash, or reset.\n')
msb@chromium.org5bde4852009-12-14 16:47:12 +0000786 self.assertRaisesError(exception, scm.update, options, (), [])
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000787 # The hash always changes. Use a cheap trick.
788 start = ('\n________ running \'git commit -am test\' in \'%s\'\n'
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000789 '[new ') % join(self.root_dir, '.')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000790 end = ('] test\n 1 files changed, 1 insertions(+), '
791 '1 deletions(-)\n\n_____ . at refs/heads/master\n'
792 'Attempting rebase onto refs/remotes/origin/master...\n')
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +0000793 self.assertTrue(sys.stdout.getvalue().startswith(start))
794 self.assertTrue(sys.stdout.getvalue().endswith(end))
795 self.assertEquals(len(sys.stdout.getvalue()),
maruel@chromium.orgdd057f32010-09-20 19:33:31 +0000796 len(start) + len(end) + 7)
maruel@chromium.orgcb2985f2010-11-03 14:08:31 +0000797 sys.stdout.close()
msb@chromium.org5bde4852009-12-14 16:47:12 +0000798
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000799 def testUpdateNotGit(self):
800 if not self.enabled:
801 return
802 options = self.Options()
803 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
804 relpath=self.relpath)
maruel@chromium.org795a8c12010-10-05 19:54:29 +0000805 git_path = join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +0000806 rename(git_path, git_path + 'foo')
maruel@chromium.org389d6de2010-09-09 14:14:37 +0000807 exception = ('\n____ . at refs/heads/master\n'
808 '\tPath is not a git repo. No .git dir.\n'
809 '\tTo resolve:\n'
810 '\t\trm -rf .\n'
811 '\tAnd run gclient sync again\n')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000812 self.assertRaisesError(exception, scm.update, options, (), [])
813
msb@chromium.org0f282062009-11-06 20:14:02 +0000814 def testRevinfo(self):
815 if not self.enabled:
816 return
817 options = self.Options()
818 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
819 relpath=self.relpath)
820 rev_info = scm.revinfo(options, (), None)
821 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
822
msb@chromium.orge28e4982009-09-25 20:51:45 +0000823
msb@chromium.orge28e4982009-09-25 20:51:45 +0000824if __name__ == '__main__':
msb@chromium.orge28e4982009-09-25 20:51:45 +0000825 unittest.main()
826
827# vim: ts=2:sw=2:tw=80:et: