Remove most svn related testing.
Subversion usage is going away, tests get the kick first.
R=iannucci@chromium.org
BUG=475320
Review URL: https://codereview.chromium.org/1158043003
git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@295411 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/testing_support/fake_repos.py b/testing_support/fake_repos.py
index 3f90844..92483fa 100755
--- a/testing_support/fake_repos.py
+++ b/testing_support/fake_repos.py
@@ -59,36 +59,6 @@
return diff
-def commit_svn(repo, usr, pwd):
- """Commits the changes and returns the new revision number."""
- to_add = []
- to_remove = []
- for status, filepath in scm.SVN.CaptureStatus(None, repo):
- if status[0] == '?':
- to_add.append(filepath)
- elif status[0] == '!':
- to_remove.append(filepath)
- if to_add:
- subprocess2.check_output(
- ['svn', 'add', '--no-auto-props', '-q'] + to_add, cwd=repo)
- if to_remove:
- subprocess2.check_output(['svn', 'remove', '-q'] + to_remove, cwd=repo)
-
- out = subprocess2.check_output(
- ['svn', 'commit', repo, '-m', 'foo', '--non-interactive',
- '--no-auth-cache',
- '--username', usr, '--password', pwd],
- cwd=repo)
- match = re.search(r'(\d+)', out)
- if not match:
- raise Exception('Commit failed', out)
- rev = match.group(1)
- status = subprocess2.check_output(['svn', 'status'], cwd=repo)
- assert len(status) == 0, status
- logging.debug('At revision %s' % rev)
- return rev
-
-
def commit_git(repo):
"""Commits the changes and returns the new hash."""
subprocess2.check_call(['git', 'add', '-A', '-f'], cwd=repo)
@@ -162,14 +132,14 @@
class FakeReposBase(object):
- """Generate both svn and git repositories to test gclient functionality.
+ """Generate git repositories to test gclient functionality.
Many DEPS functionalities need to be tested: Var, File, From, deps_os, hooks,
use_relative_paths.
- And types of dependencies: Relative urls, Full urls, both svn and git.
+ And types of dependencies: Relative urls, Full urls, git.
- populateSvn() and populateGit() need to be implemented by the subclass.
+ populateGit() needs to be implemented by the subclass.
"""
# Hostname
NB_GIT_REPOS = 1
@@ -181,25 +151,16 @@
def __init__(self, host=None):
self.trial = trial_dir.TrialDir('repos')
self.host = host or '127.0.0.1'
- # Format is [ None, tree, tree, ...]
- # i.e. revisions are 1-based.
- self.svn_revs = [None]
# Format is { repo: [ None, (hash, tree), (hash, tree), ... ], ... }
# so reference looks like self.git_hashes[repo][rev][0] for hash and
# self.git_hashes[repo][rev][1] for it's tree snapshot.
- # For consistency with self.svn_revs, it is 1-based too.
+ # It is 1-based too.
self.git_hashes = {}
- self.svnserve = None
self.gitdaemon = None
self.git_pid_file = None
self.git_root = None
- self.svn_checkout = None
- self.svn_repo = None
self.git_dirty = False
- self.svn_dirty = False
- self.svn_port = None
self.git_port = None
- self.svn_base = None
self.git_base = None
@property
@@ -214,50 +175,23 @@
# self.root_dir is not set before this call.
self.trial.set_up()
self.git_root = join(self.root_dir, 'git')
- self.svn_checkout = join(self.root_dir, 'svn_checkout')
- self.svn_repo = join(self.root_dir, 'svn')
finally:
# Registers cleanup.
atexit.register(self.tear_down)
def cleanup_dirt(self):
"""For each dirty repository, destroy it."""
- if self.svn_dirty:
- if not self.tear_down_svn():
- logging.error('Using both leaking checkout and svn dirty checkout')
if self.git_dirty:
if not self.tear_down_git():
logging.error('Using both leaking checkout and git dirty checkout')
def tear_down(self):
"""Kills the servers and delete the directories."""
- self.tear_down_svn()
self.tear_down_git()
# This deletes the directories.
self.trial.tear_down()
self.trial = None
- def tear_down_svn(self):
- if self.svnserve:
- logging.debug('Killing svnserve pid %s' % self.svnserve.pid)
- try:
- self.svnserve.kill()
- except OSError as e:
- if e.errno != errno.ESRCH: # no such process
- raise
- wait_for_port_to_free(self.host, self.svn_port)
- self.svnserve = None
- self.svn_port = None
- self.svn_base = None
- if not self.trial.SHOULD_LEAK:
- logging.debug('Removing %s' % self.svn_repo)
- gclient_utils.rmtree(self.svn_repo)
- logging.debug('Removing %s' % self.svn_checkout)
- gclient_utils.rmtree(self.svn_checkout)
- else:
- return False
- return True
-
def tear_down_git(self):
if self.gitdaemon:
logging.debug('Killing git-daemon pid %s' % self.gitdaemon.pid)
@@ -300,60 +234,6 @@
else:
write(join(root, k), v)
- def set_up_svn(self):
- """Creates subversion repositories and start the servers."""
- self.set_up()
- if self.svnserve:
- return True
- try:
- subprocess2.check_call(['svnadmin', 'create', self.svn_repo])
- except (OSError, subprocess2.CalledProcessError):
- return False
- write(join(self.svn_repo, 'conf', 'svnserve.conf'),
- '[general]\n'
- 'anon-access = read\n'
- 'auth-access = write\n'
- 'password-db = passwd\n')
- text = '[users]\n'
- text += ''.join('%s = %s\n' % (usr, pwd) for usr, pwd in self.USERS)
- write(join(self.svn_repo, 'conf', 'passwd'), text)
-
- # Necessary to be able to change revision properties
- revprop_hook_filename = join(self.svn_repo, 'hooks', 'pre-revprop-change')
- if sys.platform == 'win32':
- # TODO(kustermann): Test on Windows one day.
- write("%s.bat" % revprop_hook_filename, "")
- else:
- write(revprop_hook_filename,
- '#!/bin/sh\n'
- 'exit 0\n')
- os.chmod(revprop_hook_filename, 0755)
-
- # Mac 10.6 ships with a buggy subversion build and we need this line
- # to work around the bug.
- write(join(self.svn_repo, 'db', 'fsfs.conf'),
- '[rep-sharing]\n'
- 'enable-rep-sharing = false\n')
-
- # Start the daemon.
- self.svn_port = find_free_port(self.host, 10000)
- logging.debug('Using port %d' % self.svn_port)
- cmd = ['svnserve', '-d', '--foreground', '-r', self.root_dir,
- '--listen-port=%d' % self.svn_port]
- if self.host == '127.0.0.1':
- cmd.append('--listen-host=' + self.host)
- self.check_port_is_free(self.svn_port)
- self.svnserve = subprocess2.Popen(
- cmd,
- cwd=self.svn_repo,
- stdout=subprocess2.PIPE,
- stderr=subprocess2.PIPE)
- wait_for_port_to_bind(self.host, self.svn_port, self.svnserve)
- self.svn_base = 'svn://%s:%d/svn/' % (self.host, self.svn_port)
- self.populateSvn()
- self.svn_dirty = False
- return True
-
def set_up_git(self):
"""Creates git repositories and start the servers."""
self.set_up()
@@ -390,24 +270,6 @@
self.git_dirty = False
return True
- def _commit_svn(self, tree):
- self._genTree(self.svn_checkout, tree)
- commit_svn(self.svn_checkout, self.USERS[0][0], self.USERS[0][1])
- if self.svn_revs and self.svn_revs[-1]:
- new_tree = self.svn_revs[-1].copy()
- new_tree.update(tree)
- else:
- new_tree = tree.copy()
- self.svn_revs.append(new_tree)
-
- def _set_svn_commit_date(self, revision, date):
- subprocess2.check_output(
- ['svn', 'propset', 'svn:date', '--revprop', '-r', revision, date,
- self.svn_base,
- '--username', self.USERS[0][0],
- '--password', self.USERS[0][1],
- '--non-interactive'])
-
def _commit_git(self, repo, tree):
repo_root = join(self.git_root, repo)
self._genTree(repo_root, tree)
@@ -430,133 +292,14 @@
finally:
sock.close()
- def populateSvn(self):
- raise NotImplementedError()
-
def populateGit(self):
raise NotImplementedError()
class FakeRepos(FakeReposBase):
- """Implements populateSvn() and populateGit()."""
+ """Implements populateGit()."""
NB_GIT_REPOS = 5
- def populateSvn(self):
- """Creates a few revisions of changes including DEPS files."""
- # Repos
- subprocess2.check_call(
- ['svn', 'checkout', self.svn_base, self.svn_checkout,
- '-q', '--non-interactive', '--no-auth-cache',
- '--username', self.USERS[0][0], '--password', self.USERS[0][1]])
- assert os.path.isdir(join(self.svn_checkout, '.svn'))
- def file_system(rev, DEPS, DEPS_ALT=None):
- fs = {
- 'origin': 'svn@%(rev)d\n',
- 'trunk/origin': 'svn/trunk@%(rev)d\n',
- 'trunk/src/origin': 'svn/trunk/src@%(rev)d\n',
- 'trunk/src/third_party/origin': 'svn/trunk/src/third_party@%(rev)d\n',
- 'trunk/other/origin': 'src/trunk/other@%(rev)d\n',
- 'trunk/third_party/origin': 'svn/trunk/third_party@%(rev)d\n',
- 'trunk/third_party/foo/origin': 'svn/trunk/third_party/foo@%(rev)d\n',
- 'trunk/third_party/prout/origin': 'svn/trunk/third_party/foo@%(rev)d\n',
- }
- for k in fs.iterkeys():
- fs[k] = fs[k] % { 'rev': rev }
- fs['trunk/src/DEPS'] = DEPS
- if DEPS_ALT:
- fs['trunk/src/DEPS.alt'] = DEPS_ALT
- return fs
-
- # Testing:
- # - dependency disapear
- # - dependency renamed
- # - versioned and unversioned reference
- # - relative and full reference
- # - deps_os
- # - var
- # - hooks
- # - From
- # - File
- # TODO(maruel):
- # - $matching_files
- # - use_relative_paths
- DEPS = """
-vars = {
- 'DummyVariable': 'third_party',
-}
-deps = {
- 'src/other': '%(svn_base)strunk/other@1',
- 'src/third_party/fpp': '/trunk/' + Var('DummyVariable') + '/foo',
-}
-deps_os = {
- 'mac': {
- 'src/third_party/prout': '/trunk/third_party/prout',
- },
-}""" % { 'svn_base': self.svn_base }
-
- DEPS_ALT = """
-deps = {
- 'src/other2': '%(svn_base)strunk/other@2'
-}
-""" % { 'svn_base': self.svn_base }
-
- fs = file_system(1, DEPS, DEPS_ALT)
- self._commit_svn(fs)
-
- fs = file_system(2, """
-deps = {
- 'src/other': '%(svn_base)strunk/other',
- # Load another DEPS and load a dependency from it. That's an example of
- # WebKit's chromium checkout flow. Verify it works out of order.
- 'src/third_party/foo': From('src/file/other', 'foo/bar'),
- 'src/file/other': File('%(svn_base)strunk/other/DEPS'),
-}
-# I think this is wrong to have the hooks run from the base of the gclient
-# checkout. It's maybe a bit too late to change that behavior.
-hooks = [
- {
- 'pattern': '.',
- 'action': ['python', '-c',
- 'open(\\'src/svn_hooked1\\', \\'w\\').write(\\'svn_hooked1\\')'],
- },
- {
- # Should not be run.
- 'pattern': 'nonexistent',
- 'action': ['python', '-c',
- 'open(\\'src/svn_hooked2\\', \\'w\\').write(\\'svn_hooked2\\')'],
- },
-]
-""" % { 'svn_base': self.svn_base })
- fs['trunk/other/DEPS'] = """
-deps = {
- 'foo/bar': '/trunk/third_party/foo@1',
- # Only the requested deps should be processed.
- 'invalid': '/does_not_exist',
-}
-"""
- # WebKit abuses this.
- fs['trunk/webkit/.gclient'] = """
-solutions = [
- {
- 'name': './',
- 'url': None,
- },
-]
-"""
- fs['trunk/webkit/DEPS'] = """
-deps = {
- 'foo/bar': '%(svn_base)strunk/third_party/foo@1'
-}
-
-hooks = [
- {
- 'pattern': '.*',
- 'action': ['echo', 'foo'],
- },
-]
-""" % { 'svn_base': self.svn_base }
- self._commit_svn(fs)
-
def populateGit(self):
# Testing:
# - dependency disappear
@@ -707,62 +450,11 @@
})
-class FakeRepoTransitive(FakeReposBase):
- """Implements populateSvn()"""
-
- def populateSvn(self):
- """Creates a few revisions of changes including a DEPS file."""
- # Repos
- subprocess2.check_call(
- ['svn', 'checkout', self.svn_base, self.svn_checkout,
- '-q', '--non-interactive', '--no-auth-cache',
- '--username', self.USERS[0][0], '--password', self.USERS[0][1]])
- assert os.path.isdir(join(self.svn_checkout, '.svn'))
-
- def file_system(rev):
- DEPS = """deps = {
- 'src/different_repo': '%(svn_base)strunk/third_party',
- 'src/different_repo_fixed': '%(svn_base)strunk/third_party@1',
- 'src/same_repo': '/trunk/third_party',
- 'src/same_repo_fixed': '/trunk/third_party@1',
- }""" % { 'svn_base': self.svn_base }
- return {
- 'trunk/src/DEPS': DEPS,
- 'trunk/src/origin': 'svn/trunk/src@%(rev)d' % { 'rev': rev },
- 'trunk/third_party/origin':
- 'svn/trunk/third_party@%(rev)d' % { 'rev': rev },
- }
-
- # We make three commits. We use always the same DEPS contents but
- # - 'trunk/src/origin' contains 'svn/trunk/src/origin@rX'
- # - 'trunk/third_party/origin' contains 'svn/trunk/third_party/origin@rX'
- # where 'X' is the revision number.
- # So the 'origin' files will change in every commit.
- self._commit_svn(file_system(1))
- self._commit_svn(file_system(2))
- self._commit_svn(file_system(3))
- # We rewrite the timestamps so we can test that '--transitive' will take the
- # parent timestamp on different repositories and the parent revision
- # otherwise.
- self._set_svn_commit_date('1', '2011-10-01T03:00:00.000000Z')
- self._set_svn_commit_date('2', '2011-10-09T03:00:00.000000Z')
- self._set_svn_commit_date('3', '2011-10-02T03:00:00.000000Z')
-
- def populateGit(self):
- pass
-
-
class FakeRepoSkiaDEPS(FakeReposBase):
"""Simulates the Skia DEPS transition in Chrome."""
NB_GIT_REPOS = 5
- DEPS_svn_pre = """deps = {
- 'src/third_party/skia/gyp': '%(svn_base)sskia/gyp',
- 'src/third_party/skia/include': '%(svn_base)sskia/include',
- 'src/third_party/skia/src': '%(svn_base)sskia/src',
-}"""
-
DEPS_git_pre = """deps = {
'src/third_party/skia/gyp': '%(git_base)srepo_3',
'src/third_party/skia/include': '%(git_base)srepo_4',
@@ -773,32 +465,6 @@
'src/third_party/skia': '%(git_base)srepo_1',
}"""
- def populateSvn(self):
- """Create revisions which simulate the Skia DEPS transition in Chrome."""
- subprocess2.check_call(
- ['svn', 'checkout', self.svn_base, self.svn_checkout,
- '-q', '--non-interactive', '--no-auth-cache',
- '--username', self.USERS[0][0], '--password', self.USERS[0][1]])
- assert os.path.isdir(join(self.svn_checkout, '.svn'))
-
- # Skia repo.
- self._commit_svn({
- 'skia/skia_base_file': 'root-level file.',
- 'skia/gyp/gyp_file': 'file in the gyp directory',
- 'skia/include/include_file': 'file in the include directory',
- 'skia/src/src_file': 'file in the src directory',
- })
-
- # Chrome repo.
- self._commit_svn({
- 'trunk/src/DEPS': self.DEPS_svn_pre % {'svn_base': self.svn_base},
- 'trunk/src/myfile': 'svn/trunk/src@1'
- })
- self._commit_svn({
- 'trunk/src/DEPS': self.DEPS_post % {'git_base': self.git_base},
- 'trunk/src/myfile': 'svn/trunk/src@2'
- })
-
def populateGit(self):
# Skia repo.
self._commit_git('repo_1', {
@@ -820,11 +486,11 @@
# Chrome repo.
self._commit_git('repo_2', {
'DEPS': self.DEPS_git_pre % {'git_base': self.git_base},
- 'myfile': 'svn/trunk/src@1'
+ 'myfile': 'src/trunk/src@1'
})
self._commit_git('repo_2', {
'DEPS': self.DEPS_post % {'git_base': self.git_base},
- 'myfile': 'svn/trunk/src@2'
+ 'myfile': 'src/trunk/src@2'
})
@@ -880,11 +546,6 @@
# self.FAKE_REPOS is kept across tests.
@property
- def svn_base(self):
- """Shortcut."""
- return self.FAKE_REPOS.svn_base
-
- @property
def git_base(self):
"""Shortcut."""
return self.FAKE_REPOS.git_base
@@ -919,22 +580,6 @@
logging.debug('Diff\n%s' % pprint.pformat(diff))
self.assertEquals(diff, {})
- def mangle_svn_tree(self, *args):
- """Creates a 'virtual directory snapshot' to compare with the actual result
- on disk."""
- result = {}
- for item, new_root in args:
- old_root, rev = item.split('@', 1)
- tree = self.FAKE_REPOS.svn_revs[int(rev)]
- for k, v in tree.iteritems():
- if not k.startswith(old_root):
- continue
- item = k[len(old_root) + 1:]
- if item.startswith('.'):
- continue
- result[join(new_root, item).replace(os.sep, '/')] = v
- return result
-
def mangle_git_tree(self, *args):
"""Creates a 'virtual directory snapshot' to compare with the actual result
on disk."""
@@ -959,7 +604,6 @@
fake = FakeRepos()
print 'Using %s' % fake.root_dir
try:
- fake.set_up_svn()
fake.set_up_git()
print('Fake setup, press enter to quit or Ctrl-C to keep the checkouts.')
sys.stdin.readline()
diff --git a/testing_support/local_rietveld.py b/testing_support/local_rietveld.py
index c240de5..41b0166 100755
--- a/testing_support/local_rietveld.py
+++ b/testing_support/local_rietveld.py
@@ -81,11 +81,6 @@
raise Failure(
'Install google_appengine sdk in %s or higher up' % self.base_dir)
- if os.path.isdir(os.path.join(self.rietveld, '.svn')):
- # Left over from subversion. Delete it.
- print('Deleting deprecated subversion rietveld files...')
- shutil.rmtree(self.rietveld)
-
if os.path.isdir(os.path.join(self.rietveld, '.hg')):
# Left over from mercurial. Delete it.
print('Deleting deprecated mercurial rietveld files...')
diff --git a/testing_support/super_mox.py b/testing_support/super_mox.py
index 3322719..36abab4 100644
--- a/testing_support/super_mox.py
+++ b/testing_support/super_mox.py
@@ -55,11 +55,6 @@
return (self._RANDOM_CHOICE((self._OS_SEP, '')) +
self._DirElts(max_elt_count, max_elt_length))
- def SvnUrl(self, max_elt_count=4, max_elt_length=8):
- return ('svn://random_host:port/a' +
- self._DirElts(max_elt_count, max_elt_length
- ).replace(self._OS_SEP, '/'))
-
def RootDir(self, max_elt_count=4, max_elt_length=8):
return self._OS_SEP + self._DirElts(max_elt_count, max_elt_length)
diff --git a/tests/checkout_test.py b/tests/checkout_test.py
index dfc88b0..de0d7e6 100755
--- a/tests/checkout_test.py
+++ b/tests/checkout_test.py
@@ -34,16 +34,6 @@
class FakeRepos(fake_repos.FakeReposBase):
TEST_GIT_REPO = 'repo_1'
- def populateSvn(self):
- """Creates a few revisions of changes files."""
- subprocess2.check_call(
- ['svn', 'checkout', self.svn_base, self.svn_checkout, '-q',
- '--non-interactive', '--no-auth-cache',
- '--username', self.USERS[0][0], '--password', self.USERS[0][1]])
- assert os.path.isdir(os.path.join(self.svn_checkout, '.svn'))
- self._commit_svn(self._svn_tree_1())
- self._commit_svn(self._svn_tree_2())
-
def populateGit(self):
"""Creates a few revisions of changes files."""
self._commit_git(self.TEST_GIT_REPO, self._git_tree())
@@ -96,52 +86,6 @@
'#endif\n')
return fs
- @staticmethod
- def _svn_tree_1():
- fs = {}
- fs['trunk/origin'] = 'svn@1'
- fs['trunk/codereview.settings'] = (
- '# Test data\n'
- 'bar: pouet\n')
- fs['trunk/chrome/file.cc'] = (
- 'a\n'
- 'bb\n'
- 'ccc\n'
- 'dd\n'
- 'e\n'
- 'ff\n'
- 'ggg\n'
- 'hh\n'
- 'i\n'
- 'jj\n'
- 'kkk\n'
- 'll\n'
- 'm\n'
- 'nn\n'
- 'ooo\n'
- 'pp\n'
- 'q\n')
- return fs
-
- @classmethod
- def _svn_tree_2(cls):
- fs = cls._svn_tree_1()
- fs['trunk/origin'] = 'svn@2\n'
- fs['trunk/extra'] = 'dummy\n'
- fs['trunk/bin_file'] = '\x00'
- fs['trunk/chromeos/views/DOMui_menu_widget.h'] = (
- '// Copyright (c) 2010\n'
- '// Use of this source code\n'
- '// found in the LICENSE file.\n'
- '\n'
- '#ifndef DOM\n'
- '#define DOM\n'
- '#pragma once\n'
- '\n'
- '#include <string>\n'
- '#endif\n')
- return fs
-
# pylint: disable=R0201
class BaseTest(fake_repos.FakeReposTestBase):
@@ -150,9 +94,6 @@
is_read_only = False
def setUp(self):
- # Need to enforce subversion_config first.
- checkout.SvnMixIn.svn_config_dir = os.path.join(
- ROOT_DIR, 'subversion_config')
super(BaseTest, self).setUp()
self._old_call = subprocess2.call
def redirect_call(args, **kwargs):
@@ -240,107 +181,6 @@
self.assertTree(tree, root)
-class SvnBaseTest(BaseTest):
- def setUp(self):
- super(SvnBaseTest, self).setUp()
- self.enabled = self.FAKE_REPOS.set_up_svn()
- self.assertTrue(self.enabled)
- self.svn_trunk = 'trunk'
- self.svn_url = self.svn_base + self.svn_trunk
- self.previous_log = self._log()
-
- def _log(self):
- # Don't use the local checkout in case of caching incorrency.
- out = subprocess2.check_output(
- ['svn', 'log', self.svn_url,
- '--non-interactive', '--no-auth-cache',
- '--username', self.usr, '--password', self.pwd,
- '--with-all-revprops', '--xml',
- '--limit', '1'])
- logentry = ElementTree.XML(out).find('logentry')
- if logentry == None:
- return {'revision': 0}
- data = {
- 'revision': int(logentry.attrib['revision']),
- }
- def set_item(name):
- item = logentry.find(name)
- if item != None:
- data[name] = item.text
- set_item('author')
- set_item('msg')
- revprops = logentry.find('revprops')
- if revprops != None:
- data['revprops'] = []
- for prop in revprops.getiterator('property'):
- data['revprops'].append((prop.attrib['name'], prop.text))
- return data
-
- def _check_base(self, co, root, expected):
- read_only = isinstance(co, checkout.ReadOnlyCheckout)
- self.assertEquals(not read_only, bool(expected))
- self.assertEquals(read_only, self.is_read_only)
- if not read_only:
- self.FAKE_REPOS.svn_dirty = True
-
- self.assertEquals(root, co.project_path)
- svn_rev = co.prepare(None)
- self.assertEquals(int, type(svn_rev))
- self.assertEquals(self.previous_log['revision'], svn_rev)
- self.assertEquals('pouet', co.get_settings('bar'))
- self.assertTree(self.get_trunk(False), root)
- patches = self.get_patches()
- co.apply_patch(patches)
- self.assertEquals(
- ['bin_file', 'chrome/file.cc', 'new_dir/subdir/new_file', 'extra'],
- patches.filenames)
-
- # Verify that the patch is applied even for read only checkout.
- self.assertTree(self.get_trunk(True), root)
- fake_author = self.FAKE_REPOS.USERS[1][0]
- revision = co.commit(u'msg', fake_author)
- # Nothing changed.
- self.assertTree(self.get_trunk(True), root)
-
- if read_only:
- self.assertEquals('FAKE', revision)
- self.assertEquals(self.previous_log['revision'], co.prepare(None))
- # Changes should be reverted now.
- self.assertTree(self.get_trunk(False), root)
- expected = self.previous_log
- else:
- self.assertEquals(self.previous_log['revision'] + 1, revision)
- self.assertEquals(self.previous_log['revision'] + 1, co.prepare(None))
- self.assertTree(self.get_trunk(True), root)
- expected = expected.copy()
- expected['msg'] = 'msg'
- expected['revision'] = self.previous_log['revision'] + 1
- expected.setdefault('author', fake_author)
-
- actual = self._log()
- self.assertEquals(expected, actual)
-
- def _test_prepare(self, co):
- self.assertEquals(1, co.prepare(1))
-
- def get_trunk(self, modified):
- tree = {}
- subroot = 'trunk/'
- for k, v in self.FAKE_REPOS.svn_revs[-1].iteritems():
- if k.startswith(subroot):
- f = k[len(subroot):]
- assert f not in tree
- tree[f] = v
-
- if modified:
- content_lines = tree['chrome/file.cc'].splitlines(True)
- tree['chrome/file.cc'] = ''.join(
- content_lines[0:5] + ['FOO!\n'] + content_lines[5:])
- del tree['extra']
- tree['new_dir/subdir/new_file'] = 'A new file\nshould exist.\n'
- return tree
-
-
class GitBaseTest(BaseTest):
def setUp(self):
super(GitBaseTest, self).setUp()
@@ -481,255 +321,6 @@
self.assertEquals(expected, out)
-class SvnCheckout(SvnBaseTest):
- def _get_co(self, post_processors):
- self.assertNotEqual(False, post_processors)
- return checkout.SvnCheckout(
- self.root_dir, self.name, self.usr, self.pwd, self.svn_url,
- post_processors)
-
- def testAll(self):
- expected = {
- 'author': self.FAKE_REPOS.USERS[0][0],
- 'revprops': [('realauthor', self.FAKE_REPOS.USERS[1][0])]
- }
- root = os.path.join(self.root_dir, self.name)
- self._check_base(self._get_co(None), root, expected)
-
- def testException(self):
- self._check_exception(
- self._get_co(None),
- 'While running patch -p1 --forward --force --no-backup-if-mismatch;\n'
- ' patching file chrome/file.cc\n'
- ' Hunk #1 FAILED at 3.\n'
- ' 1 out of 1 hunk FAILED -- saving rejects to file '
- 'chrome/file.cc.rej\n')
-
- def testSvnProps(self):
- co = self._get_co(None)
- co.prepare(None)
- try:
- # svn:ignore can only be applied to directories.
- svn_props = [('svn:ignore', 'foo')]
- co.apply_patch(
- [patch.FilePatchDiff('chrome/file.cc', RAW.PATCH, svn_props)])
- self.fail()
- except checkout.PatchApplicationFailed, e:
- self.assertEquals(e.filename, 'chrome/file.cc')
- # The last line of the output depends on the svn version so we can't
- # check it precisely
- self.assertRegexpMatches(
- e.status,
- 'While running svn propset svn:ignore foo chrome/file.cc '
- '--non-interactive;\n'
- ' patching file chrome/file.cc\n'
- ' svn:.*')
- co.prepare(None)
- svn_props = [('svn:eol-style', 'LF'), ('foo', 'bar')]
- co.apply_patch(
- [patch.FilePatchDiff('chrome/file.cc', RAW.PATCH, svn_props)])
- filepath = os.path.join(self.root_dir, self.name, 'chrome/file.cc')
- # Manually verify the properties.
- props = subprocess2.check_output(
- ['svn', 'proplist', filepath],
- cwd=self.root_dir).splitlines()[1:]
- props = sorted(p.strip() for p in props)
- expected_props = dict(svn_props)
- self.assertEquals(sorted(expected_props.iterkeys()), props)
- for k, v in expected_props.iteritems():
- value = subprocess2.check_output(
- ['svn', 'propget', '--strict', k, filepath],
- cwd=self.root_dir).strip()
- self.assertEquals(v, value)
-
- def testWithRevPropsSupport(self):
- # Add the hook that will commit in a way that removes the race condition.
- hook = os.path.join(self.FAKE_REPOS.svn_repo, 'hooks', 'pre-commit')
- shutil.copyfile(os.path.join(ROOT_DIR, 'sample_pre_commit_hook'), hook)
- os.chmod(hook, 0755)
- expected = {
- 'revprops': [('commit-bot', 'user1@example.com')],
- }
- root = os.path.join(self.root_dir, self.name)
- self._check_base(self._get_co(None), root, expected)
-
- def testWithRevPropsSupportNotCommitBot(self):
- # Add the hook that will commit in a way that removes the race condition.
- hook = os.path.join(self.FAKE_REPOS.svn_repo, 'hooks', 'pre-commit')
- shutil.copyfile(os.path.join(ROOT_DIR, 'sample_pre_commit_hook'), hook)
- os.chmod(hook, 0755)
- co = checkout.SvnCheckout(
- self.root_dir, self.name,
- self.FAKE_REPOS.USERS[1][0], self.FAKE_REPOS.USERS[1][1],
- self.svn_url)
- root = os.path.join(self.root_dir, self.name)
- expected = {
- 'author': self.FAKE_REPOS.USERS[1][0],
- }
- self._check_base(co, root, expected)
-
- def testAutoProps(self):
- co = self._get_co(None)
- co.svn_config = checkout.SvnConfig(
- os.path.join(ROOT_DIR, 'subversion_config'))
- co.prepare(None)
- patches = self.get_patches()
- co.apply_patch(patches)
- self.assertEquals(
- ['bin_file', 'chrome/file.cc', 'new_dir/subdir/new_file', 'extra'],
- patches.filenames)
- # *.txt = svn:eol-style=LF in subversion_config/config.
- out = subprocess2.check_output(
- ['svn', 'pget', 'svn:eol-style', 'chrome/file.cc'],
- cwd=co.project_path)
- self.assertEquals('LF\n', out)
-
- def testProcess(self):
- self._test_process(self._get_co)
-
- def testPrepare(self):
- self._test_prepare(self._get_co(None))
-
- def testMove(self):
- co = self._get_co(None)
- self._check_move(co)
- out = subprocess2.check_output(
- ['svn', 'status'], cwd=co.project_path)
- out = sorted(out.splitlines())
- expected = sorted(
- [
- 'A + chromeos/views/webui_menu_widget.h',
- 'D chromeos/views/DOMui_menu_widget.h',
- ])
- self.assertEquals(expected, out)
- # Make sure ancestry is what is expected;
- env = os.environ.copy()
- env['LANGUAGE'] = 'en_US.UTF-8'
- out = subprocess2.check_output(
- ['svn', 'info', 'chromeos/views/webui_menu_widget.h'],
- cwd=co.project_path,
- env=env)
- values = dict(l.split(': ', 1) for l in out.splitlines() if l)
- expected = {
- # checksum seems to vary with svn version so we can't check it
- #'Checksum': '65837bb3da662c8fa88a4a50940ea7c6',
- 'Copied From Rev': '2',
- 'Copied From URL':
- '%strunk/chromeos/views/DOMui_menu_widget.h' % self.svn_base,
- 'Name': 'webui_menu_widget.h',
- 'Node Kind': 'file',
- 'Path': 'chromeos/views/webui_menu_widget.h',
- 'Repository Root': '%s' % self.svn_base.rstrip('/'),
- 'Revision': '2',
- 'Schedule': 'add',
- 'URL': '%strunk/chromeos/views/webui_menu_widget.h' % self.svn_base,
- }
- for key in expected:
- self.assertIn(key, values)
- self.assertEquals(expected[key], values[key])
-
-
-class RawCheckout(SvnBaseTest):
- def setUp(self):
- super(RawCheckout, self).setUp()
- # Use a svn checkout as the base.
- self.base_co = checkout.SvnCheckout(
- self.root_dir, self.name, None, None, self.svn_url)
- self.base_co.prepare(None)
-
- def _get_co(self, post_processors):
- self.assertNotEqual(False, post_processors)
- return checkout.RawCheckout(self.root_dir, self.name, post_processors)
-
- def testAll(self):
- # Can't use self._check_base() since it's too different.
- root = os.path.join(self.root_dir, self.name)
- co = self._get_co(None)
-
- # A copy of BaseTest._check_base()
- self.assertEquals(root, co.project_path)
- self.assertEquals(None, co.prepare(None))
- self.assertEquals('pouet', co.get_settings('bar'))
- self.assertTree(self.get_trunk(False), root)
- patches = self.get_patches()
- co.apply_patch(patches)
- self.assertEquals(
- ['bin_file', 'chrome/file.cc', 'new_dir/subdir/new_file', 'extra'],
- patches.filenames)
-
- # Verify that the patch is applied even for read only checkout.
- self.assertTree(self.get_trunk(True), root)
- try:
- co.commit(u'msg', self.FAKE_REPOS.USERS[1][0])
- self.fail()
- except NotImplementedError:
- pass
- self.assertTree(self.get_trunk(True), root)
- # Verify that prepare() is a no-op.
- self.assertEquals(None, co.prepare(None))
- self.assertTree(self.get_trunk(True), root)
-
- def testException(self):
- self._check_exception(
- self._get_co(None),
- 'While running patch -u --binary -p1;\n'
- ' patching file chrome/file.cc\n'
- ' Hunk #1 FAILED at 3.\n'
- ' 1 out of 1 hunk FAILED -- saving rejects to file '
- 'chrome/file.cc.rej\n')
-
- def testProcess(self):
- self._test_process(self._get_co)
-
- def testPrepare(self):
- # RawCheckout doesn't support prepare() but emulate it.
- co = self._get_co(None)
- revs = [1]
- def prepare(asked):
- self.assertEquals(1, asked)
- return revs.pop(0)
- co.prepare = prepare
- self._test_prepare(co)
- self.assertEquals([], revs)
-
- def testMove(self):
- self._check_move(self._get_co(None))
-
-
-class ReadOnlyCheckout(SvnBaseTest):
- # Use SvnCheckout as the backed since it support read-only checkouts too.
- is_read_only = True
-
- def _get_co(self, post_processors):
- self.assertNotEqual(False, post_processors)
- return checkout.ReadOnlyCheckout(
- checkout.SvnCheckout(
- self.root_dir, self.name, None, None, self.svn_url, None),
- post_processors)
-
- def testAll(self):
- root = os.path.join(self.root_dir, self.name)
- self._check_base(self._get_co(None), root, None)
-
- def testException(self):
- self._check_exception(
- self._get_co(None),
- 'While running patch -p1 --forward --force --no-backup-if-mismatch;\n'
- ' patching file chrome/file.cc\n'
- ' Hunk #1 FAILED at 3.\n'
- ' 1 out of 1 hunk FAILED -- saving rejects to file '
- 'chrome/file.cc.rej\n')
-
- def testProcess(self):
- self._test_process(self._get_co)
-
- def testPrepare(self):
- self._test_prepare(self._get_co(None))
-
- def testMove(self):
- self._check_move(self._get_co(None))
-
-
if __name__ == '__main__':
if '-v' in sys.argv:
DEBUGGING = True
diff --git a/tests/gcl_unittest.py b/tests/gcl_unittest.py
deleted file mode 100755
index 0391101..0000000
--- a/tests/gcl_unittest.py
+++ /dev/null
@@ -1,622 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Unit tests for gcl.py."""
-
-# pylint: disable=E1103,E1101,E1120
-
-import os
-import sys
-
-sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-
-from testing_support.super_mox import mox, SuperMoxTestBase
-
-import gcl
-import presubmit_support
-
-
-class GclTestsBase(SuperMoxTestBase):
- """Setups and tear downs the mocks but doesn't test anything as-is."""
- def setUp(self):
- SuperMoxTestBase.setUp(self)
- self.fake_root_dir = self.RootDir()
- self.mox.StubOutWithMock(gcl, 'RunShell')
- self.mox.StubOutWithMock(gcl.SVN, '_CaptureInfo')
- self.mox.StubOutWithMock(gcl.SVN, 'GetCheckoutRoot')
- self.mox.StubOutWithMock(gcl, 'tempfile')
- self.mox.StubOutWithMock(gcl.upload, 'RealMain')
- self.mox.StubOutWithMock(gcl.gclient_utils, 'FileRead')
- self.mox.StubOutWithMock(gcl.gclient_utils, 'FileWrite')
- gcl.REPOSITORY_ROOT = None
- self.old_review_settings = gcl.CODEREVIEW_SETTINGS
- self.assertEquals(gcl.CODEREVIEW_SETTINGS, {})
-
- def tearDown(self):
- gcl.CODEREVIEW_SETTINGS = self.old_review_settings
-
- def fakeChange(self, files=None): # pylint: disable=R0201
- if files == None:
- files = [('A', 'aa'), ('M', 'bb')]
-
- change_info = self.mox.CreateMock(gcl.ChangeInfo)
- change_info.name = 'naame'
- change_info.issue = 1
- change_info.patchset = 0
- change_info.description = 'deescription'
- change_info.files = files
- change_info.GetFiles = lambda : change_info.files
- change_info.GetIssueDescription = lambda : change_info.description
- change_info.GetFileNames = lambda : [f[1] for f in change_info.files]
- change_info.GetLocalRoot = lambda : 'proout'
- change_info.patch = None
- change_info.rietveld = 'https://my_server'
- change_info._closed = False
- change_info._deleted = False
- change_info._comments_added = []
-
- class RpcServer(object):
- # pylint: disable=R0201,W0613
- def get_issue_properties(self, issue, messages):
- return { 'patchsets': [1337] }
- change_info.RpcServer = RpcServer
-
- def AddComment(comment):
- # pylint: disable=W0212
- change_info._comments_added.append(comment)
- change_info.AddComment = AddComment
-
- def Delete():
- change_info._deleted = True
- change_info.Delete = Delete
-
- def CloseIssue():
- change_info._closed = True
- change_info.CloseIssue = CloseIssue
-
- return change_info
-
-
-class GclUnittest(GclTestsBase):
- """General gcl.py tests."""
- def tearDown(self):
- gcl.CODEREVIEW_SETTINGS = {}
-
- def testMembersChanged(self):
- self.mox.ReplayAll()
- members = [
- 'CODEREVIEW_SETTINGS', 'CODEREVIEW_SETTINGS_FILE',
- 'CODEREVIEW_SETTINGS_FILE_NOT_FOUND',
- 'CMDchange', 'CMDchanges', 'CMDcommit', 'CMDdelete', 'CMDdeleteempties',
- 'CMDdescription', 'CMDdiff', 'CMDhelp', 'CMDlint', 'CMDnothave',
- 'CMDopened', 'CMDpassthru', 'CMDpresubmit', 'CMDrename', 'CMDsettings',
- 'CMDstatus', 'CMDtry', 'CMDupload',
- 'ChangeInfo', 'Command', 'DEFAULT_LINT_IGNORE_REGEX',
- 'DEFAULT_LINT_REGEX', 'CheckHomeForFile', 'DoPresubmitChecks',
- 'ErrorExit', 'FILES_CACHE', 'FilterFlag', 'GenUsage',
- 'GenerateChangeName', 'GenerateDiff', 'GetCLs', 'GetCacheDir',
- 'GetCachedFile', 'GetChangelistInfoFile', 'GetChangesDir',
- 'GetCodeReviewSetting', 'GetFilesNotInCL', 'GetInfoDir',
- 'GetModifiedFiles', 'GetRepositoryRoot', 'GetTreeStatus', 'ListFiles',
- 'LoadChangelistInfoForMultiple', 'MISSING_TEST_MSG',
- 'OptionallyDoPresubmitChecks', 'REPOSITORY_ROOT',
- 'RunShell', 'RunShellWithReturnCode', 'SVN',
- 'TryChange', 'UnknownFiles', 'Warn',
- 'attrs', 'auth', 'breakpad', 'defer_attributes', 'fix_encoding',
- 'gclient_utils', 'git_cl', 'json', 'main', 'need_change',
- 'need_change_and_args', 'no_args', 'optparse', 'os',
- 'presubmit_support', 'random', 're', 'rietveld',
- 'ssl', 'string', 'subprocess2', 'sys', 'tempfile', 'time',
- 'upload', 'urllib2',
- ]
- # If this test fails, you should add the relevant test.
- self.compareMembers(gcl, members)
-
- def testIsSVNMoved(self):
- # TODO(maruel): TEST ME
- pass
-
- def testGetSVNFileProperty(self):
- # TODO(maruel): TEST ME
- pass
-
- def testUnknownFiles(self):
- # TODO(maruel): TEST ME
- pass
-
- def testCheckHomeForFile(self):
- # TODO(maruel): TEST ME
- pass
-
- def testDefaultSettings(self):
- self.assertEquals({}, gcl.CODEREVIEW_SETTINGS)
-
- def testGetCodeReviewSettingOk(self):
- self.mox.StubOutWithMock(gcl, 'GetCachedFile')
- gcl.GetCachedFile(gcl.CODEREVIEW_SETTINGS_FILE).AndReturn(
- 'foo:bar\n'
- '# comment\n'
- ' c : d \n\r'
- 'e: f')
- self.mox.ReplayAll()
- self.assertEquals('bar', gcl.GetCodeReviewSetting('foo'))
- self.assertEquals('d', gcl.GetCodeReviewSetting('c'))
- self.assertEquals('f', gcl.GetCodeReviewSetting('e'))
- self.assertEquals('', gcl.GetCodeReviewSetting('other'))
- self.assertEquals(
- {'foo': 'bar', 'c': 'd', 'e': 'f', '__just_initialized': None},
- gcl.CODEREVIEW_SETTINGS)
-
- def testGetCodeReviewSettingFail(self):
- self.mox.StubOutWithMock(gcl, 'GetCachedFile')
- gcl.GetCachedFile(gcl.CODEREVIEW_SETTINGS_FILE).AndReturn(
- 'aaa\n'
- ' c : d \n\r'
- 'e: f')
- self.mox.ReplayAll()
- try:
- gcl.GetCodeReviewSetting('c')
- self.fail()
- except gcl.gclient_utils.Error:
- pass
- self.assertEquals({}, gcl.CODEREVIEW_SETTINGS)
-
- def testGetRepositoryRootNone(self):
- gcl.os.getcwd().AndReturn(self.fake_root_dir)
- gcl.SVN.GetCheckoutRoot(self.fake_root_dir).AndReturn(None)
- self.mox.ReplayAll()
- self.assertRaises(gcl.gclient_utils.Error, gcl.GetRepositoryRoot)
-
- def testGetRepositoryRootGood(self):
- root_path = gcl.os.path.join('bleh', 'prout', 'pouet')
- gcl.os.getcwd().AndReturn(root_path)
- gcl.SVN.GetCheckoutRoot(root_path).AndReturn(root_path + '.~')
- self.mox.ReplayAll()
- self.assertEquals(gcl.GetRepositoryRoot(), root_path + '.~')
-
- def testHelp(self):
- gcl.sys.stdout.write = lambda x: None
- self.mox.ReplayAll()
- gcl.CMDhelp([])
-
-
-class ChangeInfoUnittest(GclTestsBase):
- def setUp(self):
- GclTestsBase.setUp(self)
- self.mox.StubOutWithMock(gcl, 'GetChangelistInfoFile')
- self.mox.StubOutWithMock(gcl, 'GetRepositoryRoot')
-
- def testChangeInfoMembers(self):
- self.mox.ReplayAll()
- members = [
- 'AddComment', 'CloseIssue', 'Delete', 'Exists', 'GetFiles',
- 'GetApprovingReviewers', 'GetFileNames', 'GetIssueDescription',
- 'GetLocalRoot', 'Load',
- 'MissingTests', 'NeedsUpload', 'PrimeLint', 'RpcServer', 'Save',
- 'SendToRietveld',
- 'SEPARATOR',
- 'UpdateDescriptionFromIssue', 'UpdateRietveldDescription',
- 'append_footer',
- 'description', 'force_description', 'get_reviewers', 'issue', 'name',
- 'needs_upload', 'patch', 'patchset', 'rietveld', 'update_reviewers',
- ]
- # If this test fails, you should add the relevant test.
- self.compareMembers(
- gcl.ChangeInfo('', 0, 0, '', None, self.fake_root_dir, 'foo', False),
- members)
-
- def testChangeInfoBase(self):
- files = [('M', 'foo'), ('A', 'bar')]
- self.mox.ReplayAll()
- o = gcl.ChangeInfo(
- 'name2',
- '42',
- '53',
- 'description2',
- files,
- self.fake_root_dir,
- 'foo',
- False)
- self.assertEquals(o.name, 'name2')
- self.assertEquals(o.issue, 42)
- self.assertEquals(o.patchset, 53)
- self.assertEquals(o.description, 'description2')
- self.assertEquals(o.patch, None)
- self.assertEquals(o.GetFileNames(), ['foo', 'bar'])
- self.assertEquals(o.GetFiles(), files)
- self.assertEquals(o.GetLocalRoot(), self.fake_root_dir)
-
- def testLoadWithIssue(self):
- self.mox.StubOutWithMock(gcl, 'GetCodeReviewSetting')
- description = ["This is some description.", "force an extra separator."]
- gcl.GetChangelistInfoFile('bleh').AndReturn('bleeeh')
- gcl.os.path.exists('bleeeh').AndReturn(True)
- gcl.gclient_utils.FileRead('bleeeh').AndReturn(
- gcl.ChangeInfo.SEPARATOR.join(["42, 53", "G b.cc"] + description))
- gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('foo')
- # Does an upgrade.
- gcl.GetChangelistInfoFile('bleh').AndReturn('bleeeh')
- gcl.gclient_utils.FileWrite('bleeeh', mox.IgnoreArg())
- self.mox.ReplayAll()
-
- change_info = gcl.ChangeInfo.Load('bleh', self.fake_root_dir, True, False)
- self.assertEquals(change_info.name, 'bleh')
- self.assertEquals(change_info.issue, 42)
- self.assertEquals(change_info.patchset, 53)
- self.assertEquals(change_info.description,
- gcl.ChangeInfo.SEPARATOR.join(description))
- self.assertEquals(change_info.GetFiles(), [('G ', 'b.cc')])
-
- def testLoadEmpty(self):
- self.mox.StubOutWithMock(gcl, 'GetCodeReviewSetting')
- gcl.GetChangelistInfoFile('bleh').AndReturn('bleeeh')
- gcl.os.path.exists('bleeeh').AndReturn(True)
- gcl.gclient_utils.FileRead('bleeeh').AndReturn(
- gcl.ChangeInfo.SEPARATOR.join(["", "", ""]))
- gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('foo')
- # Does an upgrade.
- gcl.GetChangelistInfoFile('bleh').AndReturn('bleeeh')
- gcl.gclient_utils.FileWrite('bleeeh', mox.IgnoreArg())
- self.mox.ReplayAll()
-
- change_info = gcl.ChangeInfo.Load('bleh', self.fake_root_dir, True, False)
- self.assertEquals(change_info.name, 'bleh')
- self.assertEquals(change_info.issue, 0)
- self.assertEquals(change_info.patchset, 0)
- self.assertEquals(change_info.description, "")
- self.assertEquals(change_info.GetFiles(), [])
-
- def testSaveEmpty(self):
- gcl.GetChangelistInfoFile('').AndReturn('foo')
- values = {
- 'description': '', 'patchset': 2, 'issue': 1,
- 'files': [], 'needs_upload': False, 'rietveld': 'https://foo'}
- gcl.gclient_utils.FileWrite(
- 'foo', gcl.json.dumps(values, sort_keys=True, indent=2))
- self.mox.ReplayAll()
-
- change_info = gcl.ChangeInfo(
- '', 1, 2, '', None, self.fake_root_dir, 'foo', False)
- change_info.Save()
-
- def testSaveDirty(self):
- gcl.GetChangelistInfoFile('n').AndReturn('foo')
- values = {
- 'description': 'des', 'patchset': 0, 'issue': 0,
- 'files': [], 'needs_upload': True, 'rietveld': 'https://foo'}
- gcl.gclient_utils.FileWrite(
- 'foo', gcl.json.dumps(values, sort_keys=True, indent=2))
- self.mox.ReplayAll()
-
- change_info = gcl.ChangeInfo('n', 0, 0, 'des', None, self.fake_root_dir,
- 'foo', needs_upload=True)
- change_info.Save()
-
-
-class CMDuploadUnittest(GclTestsBase):
- def setUp(self):
- GclTestsBase.setUp(self)
- self.mox.StubOutWithMock(gcl, 'CheckHomeForFile')
- self.mox.StubOutWithMock(gcl, 'DoPresubmitChecks')
- self.mox.StubOutWithMock(gcl, 'GenerateDiff')
- self.mox.StubOutWithMock(gcl, 'GetCodeReviewSetting')
- self.mox.StubOutWithMock(gcl, 'GetRepositoryRoot')
- self.mox.StubOutWithMock(gcl.ChangeInfo, 'SendToRietveld')
- self.mox.StubOutWithMock(gcl, 'TryChange')
- self.mox.StubOutWithMock(gcl.ChangeInfo, 'Load')
-
- def testNew(self):
- change_info = self.mox.CreateMock(gcl.ChangeInfo)
- change_info.name = 'naame'
- change_info.issue = 1
- change_info.patchset = 0
- change_info.description = 'deescription\n\nR=foo@bar.com',
- change_info.files = [('A', 'aa'), ('M', 'bb')]
- change_info.patch = None
- change_info.rietveld = 'https://my_server'
- files = [item[1] for item in change_info.files]
- output = presubmit_support.PresubmitOutput()
- gcl.DoPresubmitChecks(change_info, False, True).AndReturn(output)
- #gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server')
- gcl.os.getcwd().AndReturn('somewhere')
- change_info.GetFiles().AndReturn(change_info.files)
- gcl.os.chdir('proout')
- change_info.get_reviewers().AndReturn('foo@bar.com')
- change_info.GetFileNames().AndReturn(files)
- gcl.GenerateDiff(files)
- gcl.upload.RealMain(['upload.py', '-y', '--server=https://my_server',
- '-r', 'georges@example.com',
- '--issue=1', '--title= '],
- change_info.patch).AndReturn(("1",
- "2"))
- change_info.GetLocalRoot().AndReturn('proout')
- change_info.Save()
- change_info.PrimeLint()
- gcl.os.chdir('somewhere')
- gcl.sys.stdout.write("*** Upload does not submit a try; use gcl try to"
- " submit a try. ***")
- gcl.sys.stdout.write("\n")
- gcl.GetRepositoryRoot().AndReturn(self.fake_root_dir)
- gcl.ChangeInfo.Load('naame', self.fake_root_dir, True, True
- ).AndReturn(change_info)
- self.mox.ReplayAll()
-
- gcl.CMDupload(['naame', '-r', 'georges@example.com'])
- self.checkstdout('*** Upload does not submit a try; use gcl try to submit '
- 'a try. ***\n'
- '*** Upload does not submit a try; use gcl try to submit a try. ***\n')
-
- def testServerOverride(self):
- change_info = gcl.ChangeInfo(
- 'naame',
- 0,
- 0,
- 'deescription',
- [('A', 'aa'), ('M', 'bb')],
- self.fake_root_dir,
- 'my_server',
- False)
- self.mox.StubOutWithMock(change_info, 'Save')
- change_info.Save()
- output = presubmit_support.PresubmitOutput()
- gcl.DoPresubmitChecks(change_info, False, True).AndReturn(output)
- gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile'))
- gcl.os.write(42, change_info.description)
- gcl.os.close(42)
- gcl.GetCodeReviewSetting('CC_LIST')
- gcl.GetCodeReviewSetting('PRIVATE')
- gcl.GetCodeReviewSetting('PROJECT')
- gcl.os.getcwd().AndReturn('somewhere')
- gcl.os.chdir(change_info.GetLocalRoot())
- gcl.GenerateDiff(change_info.GetFileNames())
- gcl.upload.RealMain(
- [ 'upload.py', '-y', '--server=https://my_server', '--server=a',
- '--file=descfile'],
- change_info.patch).AndReturn(("1", "2"))
- gcl.os.remove('descfile')
- change_info.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=60)
- gcl.os.chdir('somewhere')
- gcl.sys.stdout.write("*** Upload does not submit a try; use gcl try to"
- " submit a try. ***")
- gcl.sys.stdout.write("\n")
- gcl.GetRepositoryRoot().AndReturn(self.fake_root_dir)
- gcl.ChangeInfo.Load('naame', self.fake_root_dir, True, True
- ).AndReturn(change_info)
- self.mox.ReplayAll()
-
- gcl.CMDupload(['naame', '--server=a', '--no_watchlists'])
- self.checkstdout('*** Upload does not submit a try; use gcl try to submit '
- 'a try. ***\n'
- '*** Upload does not submit a try; use gcl try to submit a try. ***\n')
-
- def testNormal(self):
- change_info = gcl.ChangeInfo(
- 'naame',
- 0,
- 0,
- 'deescription',
- [('A', 'aa'), ('M', 'bb')],
- self.fake_root_dir,
- 'my_server',
- False)
- self.mox.StubOutWithMock(change_info, 'Save')
- change_info.Save()
- output = presubmit_support.PresubmitOutput()
- gcl.DoPresubmitChecks(change_info, False, True).AndReturn(output)
- gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile'))
- gcl.os.write(42, change_info.description)
- gcl.os.close(42)
- gcl.GetCodeReviewSetting('CC_LIST')
- gcl.GetCodeReviewSetting('PRIVATE')
- gcl.GetCodeReviewSetting('PROJECT')
- gcl.os.getcwd().AndReturn('somewhere')
- gcl.os.chdir(change_info.GetLocalRoot())
- gcl.GenerateDiff(change_info.GetFileNames())
- gcl.upload.RealMain(
- ['upload.py', '-y', '--server=https://my_server', "--file=descfile" ],
- change_info.patch).AndReturn(("1", "2"))
- gcl.os.remove('descfile')
- change_info.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=60)
- gcl.os.chdir('somewhere')
- gcl.sys.stdout.write("*** Upload does not submit a try; use gcl try to"
- " submit a try. ***")
- gcl.sys.stdout.write("\n")
- gcl.GetRepositoryRoot().AndReturn(self.fake_root_dir)
- gcl.ChangeInfo.Load('naame', self.fake_root_dir, True, True
- ).AndReturn(change_info)
- self.mox.ReplayAll()
-
- gcl.CMDupload(['naame', '--no_watchlists'])
- self.assertEquals(change_info.issue, 1)
- self.assertEquals(change_info.patchset, 2)
- self.checkstdout('*** Upload does not submit a try; use gcl try to submit '
- 'a try. ***\n'
- '*** Upload does not submit a try; use gcl try to submit a try. ***\n')
-
- def testNoServer(self):
- self.mox.StubOutWithMock(gcl.sys, 'stderr')
- gcl.sys.stderr.write(
- 'Don\'t use the -s flag, fix codereview.settings instead')
- gcl.sys.stderr.write('\n')
- gcl.GetRepositoryRoot().AndReturn(self.fake_root_dir)
- gcl.ChangeInfo.Load('naame', self.fake_root_dir, True, True
- ).AndReturn(1)
- self.mox.ReplayAll()
-
- try:
- gcl.CMDupload(['naame', '-s', 'foo'])
- self.fail()
- except SystemExit:
- pass
-
- def testReviewersInDescription(self):
- change_info = self.mox.CreateMock(gcl.ChangeInfo)
- change_info.name = 'naame'
- change_info.issue = 1
- change_info.patchset = 0
- change_info.description = 'deescription\n\nR=georges@example.com',
- change_info.files = [('A', 'aa'), ('M', 'bb')]
- change_info.patch = None
- change_info.rietveld = 'https://my_server'
- files = [item[1] for item in change_info.files]
- output = presubmit_support.PresubmitOutput()
- gcl.DoPresubmitChecks(change_info, False, True).AndReturn(output)
- #gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server')
- gcl.os.getcwd().AndReturn('somewhere')
- change_info.GetFiles().AndReturn(change_info.files)
- change_info.get_reviewers().AndReturn(['georges@example.com'])
- change_info.GetFileNames().AndReturn(files)
- change_info.GetLocalRoot().AndReturn('proout')
- gcl.os.chdir('proout')
- gcl.GenerateDiff(files)
- gcl.upload.RealMain(['upload.py', '-y', '--server=https://my_server',
- '--reviewers=georges@example.com',
- '--issue=1', '--title= '],
- change_info.patch).AndReturn(("1", "2"))
- change_info.Save()
- change_info.PrimeLint()
- gcl.os.chdir('somewhere')
- gcl.sys.stdout.write("*** Upload does not submit a try; use gcl try to"
- " submit a try. ***")
- gcl.sys.stdout.write("\n")
- gcl.GetRepositoryRoot().AndReturn(self.fake_root_dir)
- gcl.ChangeInfo.Load('naame', self.fake_root_dir, True, True
- ).AndReturn(change_info)
- self.mox.ReplayAll()
-
- gcl.CMDupload(['naame'])
- self.checkstdout('*** Upload does not submit a try; use gcl try to submit '
- 'a try. ***\n'
- '*** Upload does not submit a try; use gcl try to submit a try. ***\n')
-
- def testSuggestReviewers(self):
- change_info = self.fakeChange()
- output = presubmit_support.PresubmitOutput()
- output.reviewers = ['foo@example.com', 'bar@example.com']
- gcl.DoPresubmitChecks(change_info, False, True).AndReturn(output)
- #gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server')
- gcl.os.getcwd().AndReturn('somewhere')
- gcl.os.chdir('proout')
- gcl.GenerateDiff(change_info.GetFileNames())
- gcl.upload.RealMain(['upload.py', '-y', '--server=https://my_server',
- '--reviewers=foo@example.com,bar@example.com',
- '--issue=1', '--title= '],
- change_info.patch).AndReturn(("1", "2"))
- change_info.get_reviewers().AndReturn(['foo@example.com,bar@example.com'])
- change_info.Save()
- change_info.PrimeLint()
- gcl.os.chdir('somewhere')
- gcl.sys.stdout.write("*** Upload does not submit a try; use gcl try to"
- " submit a try. ***")
- gcl.sys.stdout.write("\n")
- gcl.GetRepositoryRoot().AndReturn(self.fake_root_dir)
- gcl.ChangeInfo.Load('naame', self.fake_root_dir, True, True
- ).AndReturn(change_info)
- self.mox.ReplayAll()
-
- gcl.CMDupload(['naame'])
- self.checkstdout('*** Upload does not submit a try; use gcl try to submit '
- 'a try. ***\n'
- '*** Upload does not submit a try; use gcl try to submit a try. ***\n')
-
-
-class CMDCommitUnittest(GclTestsBase):
- def mockLoad(self, files=None):
- self.mox.StubOutWithMock(gcl, 'GetRepositoryRoot')
- self.mox.StubOutWithMock(gcl.ChangeInfo, 'Load')
- gcl.GetRepositoryRoot().AndReturn(self.fake_root_dir)
- change_info = self.fakeChange(files)
- gcl.ChangeInfo.Load('naame', self.fake_root_dir, True, True
- ).AndReturn(change_info)
- return change_info
-
- def mockPresubmit(self, change_info, fail):
- self.mox.StubOutWithMock(gcl, 'OptionallyDoPresubmitChecks')
- output = presubmit_support.PresubmitOutput()
- if fail:
- output.fail()
- gcl.OptionallyDoPresubmitChecks(change_info, True, []).AndReturn(output)
-
- def mockCommit(self, change_info, commit_message, shell_output):
- gcl.tempfile.mkstemp(text=True).AndReturn((42, 'commit'))
- gcl.os.write(42, commit_message)
- gcl.os.close(42)
- gcl.tempfile.mkstemp(text=True).AndReturn((43, 'files'))
- gcl.os.write(43, '\n'.join(change_info.GetFileNames()))
- gcl.os.close(43)
-
- gcl.RunShell(['svn', 'commit', '--file=commit', '--targets=files'],
- True).AndReturn(shell_output)
- if 'Committed' in shell_output:
- self.mox.StubOutWithMock(gcl, 'GetCodeReviewSetting')
- gcl.GetCodeReviewSetting('VIEW_VC').AndReturn('http://view/')
-
- gcl.os.remove('commit')
- gcl.os.remove('files')
-
- def testPresubmitEmpty(self):
- self.mockLoad(files=[])
- self.mox.ReplayAll()
-
- retval = gcl.CMDcommit(['naame'])
-
- self.assertEquals(retval, 1)
-
- def testPresubmitFails(self):
- change_info = self.mockLoad()
- self.mockPresubmit(change_info, fail=True)
- self.mox.ReplayAll()
-
- retval = gcl.CMDcommit(['naame'])
-
- self.assertEquals(retval, 1)
-
- def testPresubmitSucceeds(self):
- change_info = self.mockLoad()
- self.mockPresubmit(change_info, fail=False)
- self.mockCommit(
- change_info, 'deescription\n\nReview URL: https://my_server/1', '')
- change_info.UpdateDescriptionFromIssue()
- change_info.GetApprovingReviewers().AndReturn(['a@c'])
- change_info.update_reviewers(['a@c'])
- self.mox.ReplayAll()
-
- retval = gcl.CMDcommit(['naame'])
-
- self.assertEquals(retval, 0)
- self.assertEquals(change_info.description, 'deescription')
- # pylint: disable=W0212
- self.assertFalse(change_info._deleted)
- self.assertFalse(change_info._closed)
-
- def testPresubmitSucceedsWithCommittedMessage(self):
- change_info = self.mockLoad()
- self.mockPresubmit(change_info, fail=False)
- self.mockCommit(
- change_info,
- 'deescription\n\nReview URL: https://my_server/1',
- '\nCommitted revision 12345')
- change_info.UpdateDescriptionFromIssue()
- change_info.GetApprovingReviewers().AndReturn(['a@c'])
- change_info.update_reviewers(['a@c'])
- change_info.append_footer('Committed: http://view/12345')
- self.mox.ReplayAll()
-
- retval = gcl.CMDcommit(['naame'])
- self.assertEquals(retval, 0)
- # This is because append_footer is mocked.
- self.assertEquals(change_info.description, 'deescription')
- # pylint: disable=W0212
- self.assertTrue(change_info._deleted)
- self.assertTrue(change_info._closed)
- self.assertEqual(
- change_info._comments_added,
- ["Committed patchset #1 (id:1337) manually as r12345 (presubmit "
- "successful)."])
-
-
-if __name__ == '__main__':
- import unittest
- unittest.main()
diff --git a/tests/gclient_scm_test.py b/tests/gclient_scm_test.py
index 03a87fd..d3fdc68 100755
--- a/tests/gclient_scm_test.py
+++ b/tests/gclient_scm_test.py
@@ -115,690 +115,6 @@
SuperMoxTestBase.tearDown(self)
-class SVNWrapperTestCase(BaseTestCase):
- class OptionsObject(object):
- def __init__(self, verbose=False, revision=None, force=False):
- self.verbose = verbose
- self.revision = revision
- self.manually_grab_svn_rev = True
- self.deps_os = None
- self.force = force
- self.reset = False
- self.nohooks = False
- # TODO(maruel): Test --jobs > 1.
- self.jobs = 1
- self.delete_unversioned_trees = False
-
- def checkstdout(self, expected):
- value = sys.stdout.getvalue()
- sys.stdout.close()
- # pylint: disable=E1101
- self.assertEquals(expected, strip_timestamps(value))
-
- def Options(self, *args, **kwargs):
- return self.OptionsObject(*args, **kwargs)
-
- def setUp(self):
- BaseTestCase.setUp(self)
- self.url = self.SvnUrl()
-
- def testUnsupportedSCM(self):
- args = ['gopher://foo', self.root_dir, self.relpath]
- exception_msg = 'No SCM found for url gopher://foo'
- self.assertRaisesError(exception_msg, self._scm_wrapper, *args)
-
- def testSVNFullUrlForRelativeUrl(self):
- self.url = 'svn://a/b/c/d'
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
-
- def testGITFullUrlForRelativeUrl(self):
- self.url = 'git://a/b/c/d'
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
-
- def testGITFakeHttpUrl(self):
- self.url = 'git+http://foo'
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- self.assertEqual(scm.url, 'http://foo')
-
- def testGITFakeHttpsUrl(self):
- self.url = 'git+https://foo'
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- self.assertEqual(scm.url, 'https://foo')
-
- def testRunCommandException(self):
- options = self.Options(verbose=False)
- gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- exception = "Unsupported argument(s): %s" % ','.join(self.args)
- self.assertRaisesError(exception, scm.RunCommand,
- 'update', options, self.args)
-
- def testRunCommandUnknown(self):
- # TODO(maruel): if ever used.
- pass
-
- def testRevertMissing(self):
- options = self.Options(verbose=True)
- gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
- gclient_scm.os.path.exists(self.base_path).AndReturn(False)
- gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
- ).AndReturn('1.5.1')
- # It'll to a checkout instead.
- gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
- # Checkout.
- gclient_scm.os.path.exists(self.base_path).AndReturn(False)
- parent = gclient_scm.os.path.dirname(self.base_path)
- gclient_scm.os.path.exists(parent).AndReturn(False)
- gclient_scm.os.makedirs(parent)
- gclient_scm.os.path.exists(parent).AndReturn(True)
- files_list = self.mox.CreateMockAnything()
- gclient_scm.scm.SVN.RunAndGetFileList(
- options.verbose,
- ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
- cwd=self.root_dir,
- file_list=files_list)
-
- gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
- ).AndReturn({'Revision': 100})
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- scm.revert(options, self.args, files_list)
- self.checkstdout(
- ('_____ %s is missing, synching instead\n' % self.relpath))
-
- def testRevertNoDotSvn(self):
- options = self.Options(verbose=True, force=True)
- gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
- gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(False)
- gclient_scm.os.path.isdir(join(self.base_path, '.git')).AndReturn(False)
- gclient_scm.os.path.isdir(join(self.base_path, '.hg')).AndReturn(False)
- # Checkout.
- gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
- gclient_scm.os.path.exists(self.base_path).AndReturn(False)
- parent = gclient_scm.os.path.dirname(self.base_path)
- gclient_scm.os.path.exists(parent).AndReturn(False)
- gclient_scm.os.makedirs(parent)
- gclient_scm.os.path.exists(parent).AndReturn(True)
- files_list = self.mox.CreateMockAnything()
- gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
- ).AndReturn('1.6')
- gclient_scm.scm.SVN.RunAndGetFileList(
- options.verbose,
- ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
- cwd=self.root_dir,
- file_list=files_list)
- gclient_scm.gclient_utils.rmtree(self.base_path)
- gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
- ).AndReturn({'Revision': 100})
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- scm.revert(options, self.args, files_list)
- self.checkstdout(
- '\n_____ %s is not a valid svn checkout, synching instead\n' %
- self.relpath)
-
- def testRevertNone(self):
- options = self.Options(verbose=True)
- gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
- gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
- gclient_scm.scm.SVN.CaptureStatus(
- None, self.base_path, no_ignore=False).AndReturn([])
- gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
- gclient_scm.scm.SVN.RunAndGetFileList(
- options.verbose,
- ['update', '--revision', 'BASE', '--ignore-externals'],
- cwd=self.base_path,
- file_list=mox.IgnoreArg())
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- file_list = []
- scm.revert(options, self.args, file_list)
-
- def testRevertDirectory(self):
- options = self.Options(verbose=True)
- gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
- gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
- items = [
- ('~ ', 'a'),
- ]
- gclient_scm.scm.SVN.CaptureStatus(
- None, self.base_path, no_ignore=False).AndReturn(items)
- file_path = join(self.base_path, 'a')
- gclient_scm.os.path.exists(file_path).AndReturn(True)
- gclient_scm.os.path.isfile(file_path).AndReturn(False)
- gclient_scm.os.path.islink(file_path).AndReturn(False)
- gclient_scm.os.path.isdir(file_path).AndReturn(True)
- gclient_scm.gclient_utils.rmtree(file_path)
- gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
- gclient_scm.scm.SVN.RunAndGetFileList(
- options.verbose,
- ['update', '--revision', 'BASE', '--ignore-externals'],
- cwd=self.base_path,
- file_list=mox.IgnoreArg())
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- file_list2 = []
- scm.revert(options, self.args, file_list2)
- self.checkstdout(('%s\n' % file_path))
-
- def testRevertDot(self):
- self.mox.StubOutWithMock(gclient_scm.SVNWrapper, 'update')
- options = self.Options(verbose=True)
- gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
- gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(True)
- items = [
- ('~ ', '.'),
- ]
- gclient_scm.scm.SVN.CaptureStatus(
- None, self.base_path, no_ignore=False).AndReturn(items)
- # gclient_utils.rmtree() doesn't work on path ending with '.', like 'foo/.'.
- file_path = self.base_path
- gclient_scm.os.path.exists(file_path).AndReturn(True)
- gclient_scm.os.path.isfile(file_path).AndReturn(False)
- gclient_scm.os.path.islink(file_path).AndReturn(False)
- gclient_scm.os.path.isdir(file_path).AndReturn(True)
- gclient_scm.gclient_utils.rmtree(file_path)
- # pylint: disable=E1120
- gclient_scm.os.path.isdir(self.base_path).AndReturn(False)
- gclient_scm.SVNWrapper.update(options, [], ['.'])
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- file_list2 = []
- scm.revert(options, self.args, file_list2)
- self.checkstdout(('%s\n' % os.path.join(file_path, '.')))
-
- def testStatus(self):
- options = self.Options(verbose=True)
- gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
- gclient_scm.scm.SVN.RunAndGetFileList(
- options.verbose,
- ['status'] + self.args + ['--ignore-externals'],
- cwd=self.base_path,
- file_list=[]).AndReturn(None)
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- file_list = []
- self.assertEqual(scm.status(options, self.args, file_list), None)
-
- # TODO(maruel): TEST REVISIONS!!!
- # TODO(maruel): TEST RELOCATE!!!
- def testUpdateCheckout(self):
- options = self.Options(verbose=True)
- file_info = gclient_scm.gclient_utils.PrintableObject()
- file_info.root = 'blah'
- file_info.url = self.url
- file_info.uuid = 'ABC'
- file_info.revision = 42
- gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
- # Checkout.
- gclient_scm.os.path.exists(self.base_path).AndReturn(False)
- parent = gclient_scm.os.path.dirname(self.base_path)
- gclient_scm.os.path.exists(parent).AndReturn(False)
- gclient_scm.os.makedirs(parent)
- gclient_scm.os.path.exists(parent).AndReturn(True)
- files_list = self.mox.CreateMockAnything()
- gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
- ).AndReturn('1.5.1')
- gclient_scm.scm.SVN.RunAndGetFileList(
- options.verbose,
- ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
- cwd=self.root_dir,
- file_list=files_list)
- gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
- ).AndReturn({'Revision': 100})
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- scm.update(options, (), files_list)
-
- def testUpdateUpdate(self):
- options = self.Options(verbose=True)
- options.force = True
- options.nohooks = False
- file_info = {
- 'Repository Root': 'blah',
- 'URL': self.url,
- 'UUID': 'ABC',
- 'Revision': 42,
- }
- gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
- self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
- gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
- gclient_scm.os.path.exists(self.base_path).AndReturn(True)
-
- # Checkout or update.
- dotted_path = join(self.base_path, '.')
- gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
-
- # Verify no locked files.
- gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
-
- # Cheat a bit here.
- gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
- ).AndReturn(file_info)
-
- # _AddAdditionalUpdateFlags()
- gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
- ).AndReturn('1.5.1')
-
- gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
- ).AndReturn({'Revision': 100})
-
- additional_args = []
- if options.manually_grab_svn_rev:
- additional_args = ['--revision', str(file_info['Revision'])]
- additional_args.extend(['--force', '--ignore-externals'])
- files_list = []
- gclient_scm.scm.SVN.RunAndGetFileList(
- options.verbose,
- ['update', self.base_path] + additional_args,
- cwd=self.root_dir, file_list=files_list)
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- scm.update(options, (), files_list)
-
- def testUpdateReset(self):
- options = self.Options(verbose=True)
- options.reset = True
- file_info = {
- 'Repository Root': 'blah',
- 'URL': self.url,
- 'UUID': 'ABC',
- 'Revision': 42,
- }
- gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
- self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
- gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
- gclient_scm.os.path.exists(self.base_path).AndReturn(True)
-
- # Checkout or update.
- dotted_path = join(self.base_path, '.')
- gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
-
- # Create an untracked file and directory.
- gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
- ).AndReturn([['? ', 'dir'], ['? ', 'file']])
-
- gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
- ).AndReturn(file_info)
-
- gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
- ).AndReturn({'Revision': 100})
-
- self.mox.ReplayAll()
- files_list = []
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- scm.update(options, (), files_list)
- self.checkstdout('_____ %s at 42\n' % self.relpath)
-
- def testUpdateResetDeleteUnversionedTrees(self):
- options = self.Options(verbose=True)
- options.reset = True
- options.delete_unversioned_trees = True
-
- file_info = {
- 'Repository Root': 'blah',
- 'URL': self.url,
- 'UUID': 'ABC',
- 'Revision': 42,
- }
- gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
- self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
- gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
- gclient_scm.os.path.exists(self.base_path).AndReturn(True)
-
- # Checkout or update.
- dotted_path = join(self.base_path, '.')
- gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
-
- # Create an untracked file and directory.
- gclient_scm.scm.SVN.CaptureStatus(None, dotted_path
- ).AndReturn([['? ', 'dir'], ['? ', 'file']])
-
- gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
- ).AndReturn(file_info)
-
- # Confirm that the untracked file is removed.
- gclient_scm.scm.SVN.CaptureStatus(None, self.base_path
- ).AndReturn([['? ', 'dir'], ['? ', 'file']])
- gclient_scm.os.path.isdir(join(self.base_path, 'dir')).AndReturn(True)
- gclient_scm.os.path.isdir(join(self.base_path, 'file')).AndReturn(False)
- gclient_scm.os.path.islink(join(self.base_path, 'dir')).AndReturn(False)
- gclient_scm.gclient_utils.rmtree(join(self.base_path, 'dir'))
-
- gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
- ).AndReturn({'Revision': 100})
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- files_list = []
- scm.update(options, (), files_list)
- self.checkstdout(
- ('_____ %s at 42\n'
- '_____ removing unversioned directory dir\n') % self.relpath)
-
- def testUpdateSingleCheckout(self):
- options = self.Options(verbose=True)
- file_info = {
- 'URL': self.url,
- 'Revision': 42,
- }
-
- # Checks to make sure that we support svn co --depth.
- gclient_scm.scm.SVN.current_version = None
- gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
- ).AndReturn('1.5.1')
- gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
- gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(False)
-
- # Verify no locked files.
- dotted_path = join(self.base_path, '.')
- gclient_scm.scm.SVN.CaptureStatus(None, dotted_path).AndReturn([])
-
- # When checking out a single file, we issue an svn checkout and svn update.
- files_list = self.mox.CreateMockAnything()
- gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
- ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
- always=True,
- cwd=self.root_dir)
- gclient_scm.scm.SVN.RunAndGetFileList(
- options.verbose,
- ['update', 'DEPS', '--ignore-externals'],
- cwd=self.base_path,
- file_list=files_list)
-
- # Now we fall back on scm.update().
- gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
- self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
- gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
- gclient_scm.os.path.exists(self.base_path).AndReturn(True)
- gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
- gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
- ).AndReturn(file_info)
-
- gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
- ).AndReturn({'Revision': 100})
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- scm.updatesingle(options, ['DEPS'], files_list)
- self.checkstdout('_____ %s at 42\n' % self.relpath)
-
- def testUpdateSingleCheckoutSVN14(self):
- options = self.Options(verbose=True)
-
- # Checks to make sure that we support svn co --depth.
- gclient_scm.scm.SVN.current_version = None
- gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
- ).AndReturn('1.4.4')
- gclient_scm.os.path.exists(self.base_path).AndReturn(True)
-
- # When checking out a single file with svn 1.4, we use svn export
- files_list = self.mox.CreateMockAnything()
- gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
- ['svn', 'export', join(self.url, 'DEPS'), join(self.base_path, 'DEPS')],
- always=True, cwd=self.root_dir)
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- scm.updatesingle(options, ['DEPS'], files_list)
-
- def testUpdateSingleCheckoutSVNUpgrade(self):
- options = self.Options(verbose=True)
- file_info = {
- 'URL': self.url,
- 'Revision': 42,
- }
-
- # Checks to make sure that we support svn co --depth.
- gclient_scm.scm.SVN.current_version = None
- gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
- ).AndReturn('1.5.1')
- gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(False)
- # If DEPS already exists, assume we're upgrading from svn1.4, so delete
- # the old DEPS file.
- gclient_scm.os.path.exists(join(self.base_path, 'DEPS')).AndReturn(True)
- gclient_scm.os.remove(join(self.base_path, 'DEPS'))
-
- # Verify no locked files.
- gclient_scm.scm.SVN.CaptureStatus(
- None, join(self.base_path, '.')).AndReturn([])
-
- # When checking out a single file, we issue an svn checkout and svn update.
- files_list = self.mox.CreateMockAnything()
- gclient_scm.gclient_utils.CheckCallAndFilterAndHeader(
- ['svn', 'checkout', '--depth', 'empty', self.url, self.base_path],
- always=True,
- cwd=self.root_dir)
- gclient_scm.scm.SVN.RunAndGetFileList(
- options.verbose,
- ['update', 'DEPS', '--ignore-externals'],
- cwd=self.base_path,
- file_list=files_list)
-
- # Now we fall back on scm.update().
- gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
- self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
- gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
- gclient_scm.os.path.exists(self.base_path).AndReturn(True)
- gclient_scm.scm.SVN._CaptureInfo(
- [], join(self.base_path, ".")).AndReturn(file_info)
- gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
- ).AndReturn(file_info)
-
- gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
- ).AndReturn({'Revision': 100})
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- scm.updatesingle(options, ['DEPS'], files_list)
- self.checkstdout(
- ('_____ %s at 42\n' % self.relpath))
-
- def testUpdateSingleUpdate(self):
- options = self.Options(verbose=True)
- file_info = {
- 'URL': self.url,
- 'Revision': 42,
- }
- # Checks to make sure that we support svn co --depth.
- gclient_scm.scm.SVN.current_version = None
- gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
- ).AndReturn('1.5.1')
- gclient_scm.os.path.exists(join(self.base_path, '.svn')).AndReturn(True)
-
- # Verify no locked files.
- gclient_scm.scm.SVN.CaptureStatus(None, join(self.base_path, '.')
- ).AndReturn([])
-
- # Now we fall back on scm.update().
- files_list = self.mox.CreateMockAnything()
- gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
- self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
- gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
- gclient_scm.os.path.exists(self.base_path).AndReturn(True)
- gclient_scm.scm.SVN._CaptureInfo(
- [], join(self.base_path, '.')).AndReturn(file_info)
- gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
- ).AndReturn(file_info)
-
- gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
- ).AndReturn({'Revision': 100})
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- scm.updatesingle(options, ['DEPS'], files_list)
- self.checkstdout('_____ %s at 42\n' % self.relpath)
-
- def testUpdateGit(self):
- options = self.Options(verbose=True)
- file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.hg')
- gclient_scm.os.path.exists(file_path).AndReturn(False)
- gclient_scm.os.path.exists(self.base_path).AndReturn(True)
- self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
- gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
- error = gclient_scm.subprocess2.CalledProcessError(
- 1, 'cmd', '/cwd', 'stdout', 'stderr')
- gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.').AndRaise(error)
-
- bad_scm_path = os.path.join(self.root_dir, '_bad_scm',
- os.path.dirname(self.relpath))
- gclient_scm.os.makedirs(bad_scm_path)
- dest_path = os.path.join(bad_scm_path,
- os.path.basename(self.relpath) + 'ABCD')
- self.mox.StubOutWithMock(gclient_scm.tempfile, 'mkdtemp', True)
- gclient_scm.tempfile.mkdtemp(
- prefix=os.path.basename(self.relpath),
- dir=os.path.join(self.root_dir, '_bad_scm',
- os.path.dirname(self.relpath))).AndReturn(dest_path)
- self.mox.StubOutWithMock(gclient_scm.shutil, 'move', True)
- gclient_scm.shutil.move(self.base_path, dest_path)
- gclient_scm.os.path.exists(self.root_dir).AndReturn(True)
- gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
- ).AndReturn('1.5.1')
- gclient_scm.scm.SVN.RunAndGetFileList(
- options.verbose,
- ['checkout', self.url, self.base_path, '--force', '--ignore-externals'],
- cwd=self.root_dir,
- file_list=[])
-
- gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
- ).AndReturn({'Revision': 100})
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- scm.update(options, None, [])
- self.checkstdout('_____ Conflicting directory found in %s. Moving to %s.\n'
- % (self.base_path, dest_path))
-
- def testUpdateGitForce(self):
- options = self.Options(verbose=True, force=True)
- old_environ = dict(gclient_scm.os.environ)
- gclient_scm.os.environ['CHROME_HEADLESS'] = '1'
- try:
- file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.hg')
- gclient_scm.os.path.exists(file_path).AndReturn(False)
- gclient_scm.os.path.exists(self.base_path).AndReturn(True)
- self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
- gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
- error = gclient_scm.subprocess2.CalledProcessError(
- 1, 'cmd', '/cwd', 'stdout', 'stderr')
- gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.').AndRaise(error)
- gclient_scm.gclient_utils.rmtree(self.base_path)
- gclient_scm.os.path.exists(self.root_dir).AndReturn(True)
- gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
- ).AndReturn('1.5.1')
- gclient_scm.scm.SVN.RunAndGetFileList(
- options.verbose,
- ['checkout', self.url, self.base_path, '--force',
- '--ignore-externals'],
- cwd=self.root_dir,
- file_list=[])
-
- gclient_scm.scm.SVN._CaptureInfo([], self.base_path+'/.'
- ).AndReturn({'Revision': 100})
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- file_list = []
- scm.update(options, None, file_list)
- self.checkstdout('_____ Conflicting directory found in %s. Removing.\n'
- % self.base_path)
- finally:
- gclient_scm.os.environ = old_environ
-
- def testUpdateGitSvn(self):
- options = self.Options(verbose=True)
- file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.hg')
- gclient_scm.os.path.exists(file_path).AndReturn(False)
- gclient_scm.os.path.exists(self.base_path).AndReturn(True)
- self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
- gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(True)
- self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'Capture', True)
- gclient_scm.scm.GIT.Capture(['config', '--local', '--get',
- 'svn-remote.svn.url'],
- cwd=self.base_path).AndReturn(self.url)
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- file_list = []
- scm.update(options, [], file_list)
- self.checkstdout(
- ('\n_____ %s looks like a git-svn checkout. Skipping.\n' % self.relpath)
- )
-
- def testUpdateHg(self):
- options = self.Options(verbose=True)
- gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(True)
-
- self.mox.ReplayAll()
- scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
- relpath=self.relpath)
- file_list = []
- scm.update(options, self.args, file_list)
- self.checkstdout(
- ('________ found .hg directory; skipping %s\n' % self.relpath))
-
- def testGetUsableRevSVN(self):
- # pylint: disable=E1101
- options = self.Options(verbose=True)
-
- # Mock SVN revision validity checking.
- self.mox.StubOutWithMock(
- gclient_scm.scm.SVN, 'IsValidRevision', True)
- gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 1)
- ).AndReturn(True)
- gclient_scm.scm.SVN.IsValidRevision(url='%s@%s' % (self.url, 'fake')
- ).AndReturn(False)
-
- self.mox.ReplayAll()
-
- svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir)
- # With an SVN checkout, 1 an example of a valid usable rev.
- self.assertEquals(svn_scm.GetUsableRev(1, options), 1)
- # With an SVN checkout, a fake or unknown rev should raise an excpetion.
- self.assertRaises(gclient_scm.gclient_utils.Error,
- svn_scm.GetUsableRev, 'fake', options)
-
class BaseGitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
unittest.TestCase):
"""This class doesn't use pymox."""
diff --git a/tests/gclient_smoketest.py b/tests/gclient_smoketest.py
index 6a8e3aa..96b5079 100755
--- a/tests/gclient_smoketest.py
+++ b/tests/gclient_smoketest.py
@@ -20,20 +20,17 @@
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, ROOT_DIR)
-from testing_support.fake_repos import join, write
-from testing_support.fake_repos import FakeReposTestBase, FakeRepoTransitive, \
- FakeRepoSkiaDEPS, FakeRepoBlinkDEPS
-
import gclient_utils
import scm as gclient_scm
-
import subprocess2
+from testing_support import fake_repos
+from testing_support.fake_repos import join, write
GCLIENT_PATH = os.path.join(ROOT_DIR, 'gclient')
COVERAGE = False
-class GClientSmokeBase(FakeReposTestBase):
+class GClientSmokeBase(fake_repos.FakeReposTestBase):
def setUp(self):
super(GClientSmokeBase, self).setUp()
# Make sure it doesn't try to auto update when testing!
@@ -301,544 +298,6 @@
self.checkBlock(res[0], [('running', deps), ('running', src)])
-class GClientSmokeSVN(GClientSmokeBase):
- def setUp(self):
- super(GClientSmokeSVN, self).setUp()
- self.enabled = self.FAKE_REPOS.set_up_svn()
-
- def testSync(self):
- # TODO(maruel): safesync.
- if not self.enabled:
- return
- self.gclient(['config', self.svn_base + 'trunk/src/'])
- # Test unversioned checkout.
- self.parseGclient(['sync', '--deps', 'mac', '--jobs', '1'],
- ['running', 'running',
- # This is due to the way svn update is called for a
- # single file when File() is used in a DEPS file.
- ('running', os.path.join(self.root_dir, 'src', 'file', 'other')),
- 'running', 'running', 'running', 'running'])
- tree = self.mangle_svn_tree(
- ('trunk/src@2', 'src'),
- ('trunk/third_party/foo@1', 'src/third_party/foo'),
- ('trunk/other@2', 'src/other'))
- tree['src/file/other/DEPS'] = (
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS'])
- tree['src/svn_hooked1'] = 'svn_hooked1'
- self.assertTree(tree)
-
- # Manually remove svn_hooked1 before synching to make sure it's not
- # recreated.
- os.remove(join(self.root_dir, 'src', 'svn_hooked1'))
-
- # Test incremental versioned sync: sync backward.
- self.parseGclient(
- ['sync', '--revision', 'src@1', '--deps', 'mac',
- '--delete_unversioned_trees', '--jobs', '1'],
- ['running', 'running', 'running', 'running', 'deleting'])
- tree = self.mangle_svn_tree(
- ('trunk/src@1', 'src'),
- ('trunk/third_party/foo@2', 'src/third_party/fpp'),
- ('trunk/other@1', 'src/other'),
- ('trunk/third_party/foo@2', 'src/third_party/prout'))
- tree['src/file/other/DEPS'] = (
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS'])
- self.assertTree(tree)
- # Test incremental sync: delete-unversioned_trees isn't there.
- self.parseGclient(['sync', '--deps', 'mac', '--jobs', '1'],
- ['running', 'running', 'running', 'running', 'running'])
- tree = self.mangle_svn_tree(
- ('trunk/src@2', 'src'),
- ('trunk/third_party/foo@2', 'src/third_party/fpp'),
- ('trunk/third_party/foo@1', 'src/third_party/foo'),
- ('trunk/other@2', 'src/other'),
- ('trunk/third_party/foo@2', 'src/third_party/prout'))
- tree['src/file/other/DEPS'] = (
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS'])
- tree['src/svn_hooked1'] = 'svn_hooked1'
- self.assertTree(tree)
-
- def testSyncIgnoredSolutionName(self):
- """TODO(maruel): This will become an error soon."""
- if not self.enabled:
- return
- self.gclient(['config', self.svn_base + 'trunk/src/'])
- results = self.gclient(
- ['sync', '--deps', 'mac', '-r', 'invalid@1', '--jobs', '1'])
- self.checkBlock(results[0], [
- 'running', 'running',
- # This is due to the way svn update is called for a single file when
- # File() is used in a DEPS file.
- ('running', os.path.join(self.root_dir, 'src', 'file', 'other')),
- 'running', 'running', 'running', 'running'])
- self.checkString('Please fix your script, having invalid --revision flags '
- 'will soon considered an error.\n', results[1])
- self.assertEquals(0, results[2])
- tree = self.mangle_svn_tree(
- ('trunk/src@2', 'src'),
- ('trunk/third_party/foo@1', 'src/third_party/foo'),
- ('trunk/other@2', 'src/other'))
- tree['src/file/other/DEPS'] = (
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS'])
- tree['src/svn_hooked1'] = 'svn_hooked1'
- self.assertTree(tree)
-
- def testSyncNoSolutionName(self):
- # When no solution name is provided, gclient uses the first solution listed.
- if not self.enabled:
- return
- self.gclient(['config', self.svn_base + 'trunk/src/'])
- self.parseGclient(['sync', '--deps', 'mac', '-r', '1', '--jobs', '1'],
- ['running', 'running', 'running', 'running'])
- tree = self.mangle_svn_tree(
- ('trunk/src@1', 'src'),
- ('trunk/third_party/foo@2', 'src/third_party/fpp'),
- ('trunk/other@1', 'src/other'),
- ('trunk/third_party/foo@2', 'src/third_party/prout'))
- self.assertTree(tree)
-
- def testSyncJobs(self):
- if not self.enabled:
- return
- # TODO(maruel): safesync.
- self.gclient(['config', self.svn_base + 'trunk/src/'])
- # Test unversioned checkout.
- # Use --jobs 1 otherwise the order is not deterministic.
- self.parseGclient(
- ['sync', '--deps', 'mac', '--jobs', '1'],
- [
- 'running',
- 'running',
- # This is due to the way svn update is called for a
- # single file when File() is used in a DEPS file.
- ('running', os.path.join(self.root_dir, 'src', 'file', 'other')),
- 'running',
- 'running',
- 'running',
- 'running',
- ],
- untangle=True)
- tree = self.mangle_svn_tree(
- ('trunk/src@2', 'src'),
- ('trunk/third_party/foo@1', 'src/third_party/foo'),
- ('trunk/other@2', 'src/other'))
- tree['src/file/other/DEPS'] = (
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS'])
- tree['src/svn_hooked1'] = 'svn_hooked1'
- self.assertTree(tree)
-
- # Manually remove svn_hooked1 before synching to make sure it's not
- # recreated.
- os.remove(join(self.root_dir, 'src', 'svn_hooked1'))
-
- # Test incremental versioned sync: sync backward.
- self.parseGclient(
- ['sync', '--revision', 'src@1', '--deps', 'mac',
- '--delete_unversioned_trees', '--jobs', '8'],
- ['running', 'running', 'running', 'running', 'deleting'],
- untangle=True)
- tree = self.mangle_svn_tree(
- ('trunk/src@1', 'src'),
- ('trunk/third_party/foo@2', 'src/third_party/fpp'),
- ('trunk/other@1', 'src/other'),
- ('trunk/third_party/foo@2', 'src/third_party/prout'))
- tree['src/file/other/DEPS'] = (
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS'])
- self.assertTree(tree)
- # Test incremental sync: delete-unversioned_trees isn't there.
- self.parseGclient(['sync', '--deps', 'mac', '--jobs', '8'],
- ['running', 'running', 'running', 'running', 'running'],
- untangle=True)
- tree = self.mangle_svn_tree(
- ('trunk/src@2', 'src'),
- ('trunk/third_party/foo@2', 'src/third_party/fpp'),
- ('trunk/third_party/foo@1', 'src/third_party/foo'),
- ('trunk/other@2', 'src/other'),
- ('trunk/third_party/foo@2', 'src/third_party/prout'))
- tree['src/file/other/DEPS'] = (
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS'])
- tree['src/svn_hooked1'] = 'svn_hooked1'
- self.assertTree(tree)
-
- def testSyncCustomDeps(self):
- if not self.enabled:
- return
- out = (
- 'solutions = [\n'
- ' { "name" : "src",\n'
- ' "url" : "%(base)s/src",\n'
- ' "custom_deps" : {\n'
- # Remove 2 deps, change 1, add 1.
- ' "src/other": None,\n'
- ' "src/third_party/foo": \'%(base)s/third_party/prout\',\n'
- ' "src/file/other": None,\n'
- ' "new_deps": "/trunk/src/third_party",\n'
- ' },\n'
- ' "safesync_url": "",\n'
- ' },\n'
- ']\n\n' %
- { 'base': self.svn_base + 'trunk' })
- fileobj = open(os.path.join(self.root_dir, '.gclient'), 'w')
- fileobj.write(out)
- fileobj.close()
- self.parseGclient(
- ['sync', '--deps', 'mac', '--jobs', '1'],
- ['running', 'running', 'running', 'running'],
- untangle=True)
- tree = self.mangle_svn_tree(
- ('trunk/src@2', 'src'),
- ('trunk/third_party/prout@2', 'src/third_party/foo'),
- ('trunk/src/third_party@2', 'new_deps'))
- tree['src/svn_hooked1'] = 'svn_hooked1'
- self.assertTree(tree)
-
- def testSyncCustomDepsNoDeps(self):
- if not self.enabled:
- return
- out = (
- 'solutions = [\n'
- # This directory has no DEPS file.
- ' { "name" : "src/third_party",\n'
- ' "url" : "%(base)s/src/third_party",\n'
- ' "custom_deps" : {\n'
- # Add 1.
- ' "src/other": \'/trunk/other\',\n'
- ' },\n'
- ' "safesync_url": "",\n'
- ' },\n'
- ']\n\n' %
- { 'base': self.svn_base + 'trunk' })
- fileobj = open(os.path.join(self.root_dir, '.gclient'), 'w')
- fileobj.write(out)
- fileobj.close()
- self.parseGclient(
- ['sync', '--deps', 'mac', '--jobs', '1'],
- ['running', 'running'],
- untangle=True)
- tree = self.mangle_svn_tree(
- ('trunk/src/third_party@2', 'src/third_party'),
- ('trunk/other@2', 'src/other'))
- self.assertTree(tree)
-
- def testRevertAndStatus(self):
- if not self.enabled:
- return
- self.gclient(['config', self.svn_base + 'trunk/src/'])
- # Tested in testSync.
- self.gclient(['sync', '--deps', 'mac'])
- write(join(self.root_dir, 'src', 'other', 'hi'), 'Hey!')
-
- out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'],
- [['running', join(self.root_dir, 'src')],
- ['running', join(self.root_dir, 'src', 'other')]])
- out = self.svnBlockCleanup(out)
- self.checkString('file', out[0][1])
- self.checkString('other', out[0][2])
- self.checkString('svn_hooked1', out[0][3])
- self.checkString(join('third_party', 'foo'), out[0][4])
- self.checkString('hi', out[1][1])
- self.assertEquals(5, len(out[0]))
- self.assertEquals(2, len(out[1]))
-
- # Revert implies --force implies running hooks without looking at pattern
- # matching.
- results = self.gclient(['revert', '--deps', 'mac', '--jobs', '1'])
- out = self.splitBlock(results[0])
- # src, src/other is missing, src/other, src/third_party/foo is missing,
- # src/third_party/foo, 2 svn hooks, 3 related to File().
- self.assertEquals( 8, len(out))
- self.checkString('', results[1])
- self.assertEquals(0, results[2])
- tree = self.mangle_svn_tree(
- ('trunk/src@2', 'src'),
- ('trunk/third_party/foo@1', 'src/third_party/foo'),
- ('trunk/other@2', 'src/other'))
- tree['src/file/other/DEPS'] = (
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS'])
- tree['src/svn_hooked1'] = 'svn_hooked1'
- tree['src/svn_hooked2'] = 'svn_hooked2'
- self.assertTree(tree)
-
- out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'],
- [['running', join(self.root_dir, 'src')]])
- out = self.svnBlockCleanup(out)
- self.checkString('file', out[0][1])
- self.checkString('other', out[0][2])
- self.checkString('svn_hooked1', out[0][3])
- self.checkString('svn_hooked2', out[0][4])
- self.checkString(join('third_party', 'foo'), out[0][5])
- self.assertEquals(6, len(out[0]))
- self.assertEquals(1, len(out))
-
- def testRevertAndStatusDepsOs(self):
- if not self.enabled:
- return
- self.gclient(['config', self.svn_base + 'trunk/src/'])
- # Tested in testSync.
- self.gclient(['sync', '--deps', 'mac', '--revision', 'src@1'])
- write(join(self.root_dir, 'src', 'other', 'hi'), 'Hey!')
-
- # Without --verbose, gclient won't output the directories without
- # modification.
- out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'],
- [['running', join(self.root_dir, 'src')],
- ['running', join(self.root_dir, 'src', 'other')]])
- out = self.svnBlockCleanup(out)
- self.checkString('other', out[0][1])
- self.checkString(join('third_party', 'fpp'), out[0][2])
- self.checkString(join('third_party', 'prout'), out[0][3])
- self.checkString('hi', out[1][1])
- self.assertEquals(4, len(out[0]))
- self.assertEquals(2, len(out[1]))
-
- # So verify it works with --verbose.
- out = self.parseGclient(
- ['status', '--deps', 'mac', '--verbose', '--jobs', '1'],
- [['running', join(self.root_dir, 'src')],
- ['running', join(self.root_dir, 'src', 'other')],
- ['running', join(self.root_dir, 'src', 'third_party', 'fpp')],
- ['running', join(self.root_dir, 'src', 'third_party', 'prout')]])
- out = self.svnBlockCleanup(out)
- self.checkString('other', out[0][5])
- self.checkString(join('third_party', 'fpp'), out[0][7])
- self.checkString(join('third_party', 'prout'), out[0][8])
- self.checkString('hi', out[1][5])
- self.assertEquals(9, len(out[0]))
- self.assertEquals(7, len(out[1]))
- self.assertEquals(6, len(out[2]))
- self.assertEquals(6, len(out[3]))
- self.assertEquals(4, len(out))
-
- # Revert implies --force implies running hooks without looking at pattern
- # matching.
- # TODO(maruel): In general, gclient revert output is wrong. It should output
- # the file list after some ___ running 'svn status'
- results = self.gclient(['revert', '--deps', 'mac', '--jobs', '1'])
- out = self.splitBlock(results[0])
- self.assertEquals(4, len(out))
- self.checkString('', results[1])
- self.assertEquals(0, results[2])
- tree = self.mangle_svn_tree(
- ('trunk/src@1', 'src'),
- ('trunk/third_party/foo@2', 'src/third_party/fpp'),
- ('trunk/other@1', 'src/other'),
- ('trunk/third_party/prout@2', 'src/third_party/prout'))
- self.assertTree(tree)
-
- out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'],
- [['running', join(self.root_dir, 'src')]])
- out = self.svnBlockCleanup(out)
- self.checkString('other', out[0][1])
- self.checkString(join('third_party', 'fpp'), out[0][2])
- self.checkString(join('third_party', 'prout'), out[0][3])
- self.assertEquals(4, len(out[0]))
-
- def testRunHooks(self):
- if not self.enabled:
- return
- self.gclient(['config', self.svn_base + 'trunk/src/'])
- self.gclient(['sync', '--deps', 'mac'])
- out = self.parseGclient(['runhooks', '--deps', 'mac'],
- ['running', 'running'])
- self.checkString(1, len(out[0]))
- self.checkString(1, len(out[1]))
-
- def testRunHooksDepsOs(self):
- if not self.enabled:
- return
- self.gclient(['config', self.svn_base + 'trunk/src/'])
- self.gclient(['sync', '--deps', 'mac', '--revision', 'src@1'])
- out = self.parseGclient(['runhooks', '--deps', 'mac'], [])
- self.assertEquals([], out)
-
- def testRevInfo(self):
- if not self.enabled:
- return
- self.gclient(['config', self.svn_base + 'trunk/src/'])
- self.gclient(['sync', '--deps', 'mac'])
- results = self.gclient(['revinfo', '--deps', 'mac'])
- out = ('src: %(base)s/src\n'
- 'src/file/other: File("%(base)s/other/DEPS")\n'
- 'src/other: %(base)s/other\n'
- 'src/third_party/foo: %(base)s/third_party/foo@1\n' %
- { 'base': self.svn_base + 'trunk' })
- self.check((out, '', 0), results)
- results = self.gclient(['revinfo', '--deps', 'mac', '--actual'])
- out = ('src: %(base)s/src@2\n'
- 'src/file/other: %(base)s/other/DEPS@2\n'
- 'src/other: %(base)s/other@2\n'
- 'src/third_party/foo: %(base)s/third_party/foo@1\n' %
- { 'base': self.svn_base + 'trunk' })
- self.check((out, '', 0), results)
- results = self.gclient(['revinfo', '--deps', 'mac', '--snapshot'])
- out = ('# Snapshot generated with gclient revinfo --snapshot\n'
- 'solutions = [\n'
- ' { "name" : "src",\n'
- ' "url" : "%(base)s/src",\n'
- ' "deps_file" : "DEPS",\n'
- ' "managed" : True,\n'
- ' "custom_deps" : {\n'
- ' "foo/bar": None,\n'
- ' "invalid": None,\n'
- ' "src/file/other": \'%(base)s/other/DEPS@2\',\n'
- ' "src/other": \'%(base)s/other@2\',\n'
- ' "src/third_party/foo": '
- '\'%(base)s/third_party/foo@1\',\n'
- ' },\n'
- ' "safesync_url": "",\n'
- ' },\n'
- ']\n\n' %
- { 'base': self.svn_base + 'trunk' })
- self.check((out, '', 0), results)
-
- def testRevInfoAltDeps(self):
- if not self.enabled:
- return
- self.gclient(['config', self.svn_base + 'trunk/src/', '--deps-file',
- 'DEPS.alt'])
- self.gclient(['sync'])
- results = self.gclient(['revinfo', '--snapshot'])
- out = ('# Snapshot generated with gclient revinfo --snapshot\n'
- 'solutions = [\n'
- ' { "name" : "src",\n'
- ' "url" : "%(base)s/src",\n'
- ' "deps_file" : "DEPS.alt",\n'
- ' "managed" : True,\n'
- ' "custom_deps" : {\n'
- ' "foo/bar": None,\n'
- ' "invalid": None,\n'
- ' "src/other2": \'%(base)s/other@2\',\n'
- ' },\n'
- ' "safesync_url": "",\n'
- ' },\n'
- ']\n\n' %
- { 'base': self.svn_base + 'trunk' })
- self.check((out, '', 0), results)
-
-
- def testWrongDirectory(self):
- # Check that we're not using a .gclient configuration which only talks
- # about a subdirectory src when we're in a different subdirectory src-other.
- if not self.enabled:
- return
- self.gclient(['config', self.svn_base + 'trunk/src/'])
- self.gclient(['sync'])
- other_src = join(self.root_dir, 'src-other')
- os.mkdir(other_src)
- res = ('', 'Error: client not configured; see \'gclient config\'\n', 1)
- self.check(res, self.gclient(['status'], other_src))
-
- def testCorrectDirectory(self):
- # Check that when we're in the subdirectory src, the .gclient configuration
- # is used.
- if not self.enabled:
- return
- self.gclient(['config', self.svn_base + 'trunk/src/'])
- self.gclient(['sync'])
- src = join(self.root_dir, 'src')
- res = self.gclient(['status', '--jobs', '1'], src)
- self.checkBlock(res[0], [('running', src)])
-
- def testInitialCheckoutNotYetDone(self):
- # Check that gclient can be executed when the initial checkout hasn't been
- # done yet.
- if not self.enabled:
- return
- self.gclient(['config', self.svn_base + 'trunk/src/'])
- self.parseGclient(
- ['sync', '--jobs', '1'],
- ['running', 'running',
- # This is due to the way svn update is called for a
- # single file when File() is used in a DEPS file.
- ('running', os.path.join(self.root_dir, 'src', 'file', 'other')),
- 'running', 'running', 'running', 'running'])
-
- def testInitialCheckoutFailed(self):
- # Check that gclient can be executed from an arbitrary sub directory if the
- # initial checkout has failed.
- if not self.enabled:
- return
- self.gclient(['config', self.svn_base + 'trunk/src/'])
- self.gclient(['sync'])
- # Cripple the checkout.
- os.remove(join(self.root_dir, '.gclient_entries'))
- src = join(self.root_dir, 'src')
- res = self.gclient(['sync', '--jobs', '1'], src)
- self.checkBlock(res[0],
- ['running', 'running', 'running'])
-
- def testUnversionedRepository(self):
- # Check that gclient automatically deletes crippled SVN repositories.
- if not self.enabled:
- return
- self.gclient(['config', self.svn_base + 'trunk/src/'])
- cmd = ['sync', '--jobs', '1', '--delete_unversioned_trees', '--reset']
- self.assertEquals(0, self.gclient(cmd)[-1])
- third_party = join(self.root_dir, 'src', 'third_party')
- subprocess2.check_call(['svn', 'propset', '-q', 'svn:ignore', 'foo', '.'],
- cwd=third_party)
-
- # Cripple src/third_party/foo and make sure gclient still succeeds.
- gclient_utils.rmtree(join(third_party, 'foo', '.svn'))
- self.assertEquals(0, self.gclient(cmd)[-1])
-
-
-class GClientSmokeSVNTransitive(GClientSmokeBase):
- FAKE_REPOS_CLASS = FakeRepoTransitive
-
- def setUp(self):
- super(GClientSmokeSVNTransitive, self).setUp()
- self.enabled = self.FAKE_REPOS.set_up_svn()
-
- def testSyncTransitive(self):
- if not self.enabled:
- return
-
- self.gclient(['config', self.svn_base + 'trunk/src/'])
-
- def test_case(parent, timestamp, fixed, output):
- # We check out revision 'parent' and expect the following:
- # - src/ is checked out at r'parent'
- # - src/same_repo is checked out at r'parent' (due to --transitive)
- # - src/same_repo_fixed is checked out at r'fixed'
- # - src/different_repo is checked out at r'timestamp'
- # (due to --transitive)
- # - src/different_repo_fixed is checked out at r'fixed'
-
- revisions = self.FAKE_REPOS.svn_revs
- self.parseGclient(
- ['sync', '--transitive', '--revision', 'src@%d' % parent,
- '--jobs', '1'], output)
- self.assertTree({
- 'src/origin': revisions[parent]['trunk/src/origin'],
- 'src/DEPS': revisions[parent]['trunk/src/DEPS'],
- 'src/same_repo/origin': revisions[parent]['trunk/third_party/origin'],
- 'src/same_repo_fixed/origin':
- revisions[fixed]['trunk/third_party/origin'],
- 'src/different_repo/origin':
- revisions[timestamp]['trunk/third_party/origin'],
- 'src/different_repo_fixed/origin':
- revisions[fixed]['trunk/third_party/origin'],
- })
-
- # Here are the test cases for checking out 'trunk/src' at r1, r2 and r3
- # r1: Everything is normal
- test_case(parent=1, timestamp=1, fixed=1,
- output=['running', 'running', 'running', 'running', 'running'])
- # r2: Svn will scan from r1 upwards until it finds a revision matching the
- # given timestamp or it takes the next smallest one (which is r2 in this
- # case).
- test_case(parent=2, timestamp=2, fixed=1,
- output=['running', 'running', 'running'])
- # r3: Svn will scan from r1 upwards until it finds a revision matching the
- # given timestamp or it takes the next smallest one. Since
- # timestamp(r3) < timestamp(r2) svn will checkout r1.
- # This happens often on http://googlecode.com but is unexpected to happen
- # with svnserve (unless you manually change 'svn:date')
- test_case(parent=3, timestamp=1, fixed=1,
- output=['running', 'running', 'running'])
-
-
class GClientSmokeGIT(GClientSmokeBase):
def setUp(self):
super(GClientSmokeGIT, self).setUp()
@@ -1220,247 +679,15 @@
self.assertTrue(os.path.exists(join(repo2_root, 'last_file')))
-class GClientSmokeBoth(GClientSmokeBase):
- def setUp(self):
- super(GClientSmokeBoth, self).setUp()
- self.enabled = self.FAKE_REPOS.set_up_svn() and self.FAKE_REPOS.set_up_git()
-
- def testMultiSolutions(self):
- if not self.enabled:
- return
- self.gclient(['config', '--spec',
- 'solutions=['
- '{"name": "src",'
- ' "url": "' + self.svn_base + 'trunk/src/"},'
- '{"name": "src-git",'
- '"url": "' + self.git_base + 'repo_1"}]'])
- self.parseGclient(['sync', '--deps', 'mac', '--jobs', '1'],
- ['running', 'running',
- # This is due to the way svn update is called for a single
- # file when File() is used in a DEPS file.
- ('running', self.root_dir + '/src/file/other'),
- 'running', 'running', 'running', 'running',
- 'running', 'running'])
- tree = self.mangle_git_tree(('repo_1@2', 'src-git'),
- ('repo_2@1', 'src/repo2'),
- ('repo_3@2', 'src/repo2/repo_renamed'))
- tree.update(self.mangle_svn_tree(
- ('trunk/src@2', 'src'),
- ('trunk/third_party/foo@1', 'src/third_party/foo'),
- ('trunk/other@2', 'src/other')))
- tree['src/file/other/DEPS'] = (
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS'])
- tree['src/git_hooked1'] = 'git_hooked1'
- tree['src/git_hooked2'] = 'git_hooked2'
- tree['src/svn_hooked1'] = 'svn_hooked1'
- self.assertTree(tree)
-
- def testMultiSolutionsJobs(self):
- if not self.enabled:
- return
- self.gclient(['config', '--spec',
- 'solutions=['
- '{"name": "src",'
- ' "url": "' + self.svn_base + 'trunk/src/"},'
- '{"name": "src-git",'
- '"url": "' + self.git_base + 'repo_1"}]'])
- # There is no guarantee that the ordering will be consistent.
- (stdout, stderr, returncode) = self.gclient(
- ['sync', '--deps', 'mac', '--jobs', '8'])
- stdout = self.untangle(stdout)
- self.checkString('', stderr)
- self.assertEquals(0, returncode)
- results = self.splitBlock(stdout)
- self.assertEquals(9, len(results))
- tree = self.mangle_git_tree(('repo_1@2', 'src-git'),
- ('repo_2@1', 'src/repo2'),
- ('repo_3@2', 'src/repo2/repo_renamed'))
- tree.update(self.mangle_svn_tree(
- ('trunk/src@2', 'src'),
- ('trunk/third_party/foo@1', 'src/third_party/foo'),
- ('trunk/other@2', 'src/other')))
- tree['src/file/other/DEPS'] = (
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS'])
- tree['src/git_hooked1'] = 'git_hooked1'
- tree['src/git_hooked2'] = 'git_hooked2'
- tree['src/svn_hooked1'] = 'svn_hooked1'
- self.assertTree(tree)
-
- def testMultiSolutionsMultiRev(self):
- if not self.enabled:
- return
- self.gclient(['config', '--spec',
- 'solutions=['
- '{"name": "src",'
- ' "url": "' + self.svn_base + 'trunk/src/"},'
- '{"name": "src-git",'
- '"url": "' + self.git_base + 'repo_1"}]'])
- self.parseGclient(
- ['sync', '--deps', 'mac', '--jobs', '1', '--revision', '1',
- '-r', 'src-git@' + self.githash('repo_1', 1)],
- ['running', 'running', 'running', 'running'],
- expected_stderr=
- 'You must specify the full solution name like --revision src@1\n'
- 'when you have multiple solutions setup in your .gclient file.\n'
- 'Other solutions present are: src-git.\n')
- tree = self.mangle_git_tree(('repo_1@1', 'src-git'),
- ('repo_2@2', 'src/repo2'),
- ('repo_3@1', 'src/repo2/repo3'),
- ('repo_4@2', 'src/repo4'))
- tree.update(self.mangle_svn_tree(
- ('trunk/src@1', 'src'),
- ('trunk/third_party/foo@2', 'src/third_party/fpp'),
- ('trunk/other@1', 'src/other'),
- ('trunk/third_party/foo@2', 'src/third_party/prout')))
- self.assertTree(tree)
-
- def testRevInfo(self):
- if not self.enabled:
- return
- self.gclient(['config', '--spec',
- 'solutions=['
- '{"name": "src",'
- ' "url": "' + self.svn_base + 'trunk/src/"},'
- '{"name": "src-git",'
- '"url": "' + self.git_base + 'repo_1"}]'])
- self.gclient(['sync', '--deps', 'mac'])
- results = self.gclient(['revinfo', '--deps', 'mac'])
- out = ('src: %(svn_base)s/src/\n'
- 'src-git: %(git_base)srepo_1\n'
- 'src/file/other: File("%(svn_base)s/other/DEPS")\n'
- 'src/other: %(svn_base)s/other\n'
- 'src/repo2: %(git_base)srepo_2@%(hash2)s\n'
- 'src/repo2/repo_renamed: %(git_base)srepo_3\n'
- 'src/third_party/foo: %(svn_base)s/third_party/foo@1\n') % {
- 'svn_base': self.svn_base + 'trunk',
- 'git_base': self.git_base,
- 'hash2': self.githash('repo_2', 1)[:7],
- }
- self.check((out, '', 0), results)
- results = self.gclient(['revinfo', '--deps', 'mac', '--actual'])
- out = ('src: %(svn_base)s/src/@2\n'
- 'src-git: %(git_base)srepo_1@%(hash1)s\n'
- 'src/file/other: %(svn_base)s/other/DEPS@2\n'
- 'src/other: %(svn_base)s/other@2\n'
- 'src/repo2: %(git_base)srepo_2@%(hash2)s\n'
- 'src/repo2/repo_renamed: %(git_base)srepo_3@%(hash3)s\n'
- 'src/third_party/foo: %(svn_base)s/third_party/foo@1\n') % {
- 'svn_base': self.svn_base + 'trunk',
- 'git_base': self.git_base,
- 'hash1': self.githash('repo_1', 2),
- 'hash2': self.githash('repo_2', 1),
- 'hash3': self.githash('repo_3', 2),
- }
- self.check((out, '', 0), results)
-
- def testRecurse(self):
- if not self.enabled:
- return
- self.gclient(['config', '--spec',
- 'solutions=['
- '{"name": "src",'
- ' "url": "' + self.svn_base + 'trunk/src/"},'
- '{"name": "src-git",'
- '"url": "' + self.git_base + 'repo_1"}]'])
- self.gclient(['sync', '--deps', 'mac'])
- results = self.gclient(['recurse', '-j1', 'sh', '-c',
- 'echo $GCLIENT_SCM,$GCLIENT_URL,`pwd`'])
-
- entries = [tuple(line.split(','))
- for line in results[0].strip().split('\n')]
- logging.debug(entries)
-
- bases = {'svn': self.svn_base, 'git': self.git_base}
- expected_source = [
- ('svn', 'trunk/src/', 'src'),
- ('git', 'repo_1', 'src-git'),
- ('svn', 'trunk/other', 'src/other'),
- ('git', 'repo_2@' + self.githash('repo_2', 1)[:7], 'src/repo2'),
- ('git', 'repo_3', 'src/repo2/repo_renamed'),
- ('svn', 'trunk/third_party/foo@1', 'src/third_party/foo'),
- ]
- expected = [(scm, bases[scm] + url, os.path.join(self.root_dir, path))
- for (scm, url, path) in expected_source]
-
- self.assertEquals(sorted(entries), sorted(expected))
-
-
class SkiaDEPSTransitionSmokeTest(GClientSmokeBase):
"""Simulate the behavior of bisect bots as they transition across the Skia
DEPS change."""
- FAKE_REPOS_CLASS = FakeRepoSkiaDEPS
+ FAKE_REPOS_CLASS = fake_repos.FakeRepoSkiaDEPS
def setUp(self):
super(SkiaDEPSTransitionSmokeTest, self).setUp()
- self.enabled = self.FAKE_REPOS.set_up_git() and self.FAKE_REPOS.set_up_svn()
-
- def testSkiaDEPSChangeSVN(self):
- if not self.enabled:
- return
-
- # Create an initial checkout:
- # - Single checkout at the root.
- # - Multiple checkouts in a shared subdirectory.
- self.gclient(['config', '--spec',
- 'solutions=['
- '{"name": "src",'
- ' "url": "' + self.svn_base + 'trunk/src/",'
- '}]'])
-
- checkout_path = os.path.join(self.root_dir, 'src')
- skia = os.path.join(checkout_path, 'third_party', 'skia')
- skia_gyp = os.path.join(skia, 'gyp')
- skia_include = os.path.join(skia, 'include')
- skia_src = os.path.join(skia, 'src')
-
- gyp_svn_url = self.svn_base + 'skia/gyp'
- include_svn_url = self.svn_base + 'skia/include'
- src_svn_url = self.svn_base + 'skia/src'
- skia_git_url = self.git_base + 'repo_1'
-
- # Initial sync. Verify that we get the expected checkout.
- res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@2'])
- self.assertEqual(res[2], 0, 'Initial sync failed.')
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_gyp)['URL'],
- gyp_svn_url)
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_include)['URL'],
- include_svn_url)
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_src)['URL'],
- src_svn_url)
-
- # Verify that the sync succeeds. Verify that we have the expected merged
- # checkout.
- res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@3'])
- self.assertEqual(res[2], 0, 'DEPS change sync failed.')
- self.assertEqual(gclient_scm.GIT.Capture(['config', 'remote.origin.url'],
- skia), skia_git_url)
-
- # Sync again. Verify that we still have the expected merged checkout.
- res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@3'])
- self.assertEqual(res[2], 0, 'Subsequent sync failed.')
- self.assertEqual(gclient_scm.GIT.Capture(['config', 'remote.origin.url'],
- skia), skia_git_url)
-
- # Sync back to the original DEPS. Verify that we get the original structure.
- res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@2'])
- self.assertEqual(res[2], 0, 'Reverse sync failed.')
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_gyp)['URL'],
- gyp_svn_url)
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_include)['URL'],
- include_svn_url)
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_src)['URL'],
- src_svn_url)
-
- # Sync again. Verify that we still have the original structure.
- res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@2'])
- self.assertEqual(res[2], 0, 'Subsequent sync #2 failed.')
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_gyp)['URL'],
- gyp_svn_url)
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_include)['URL'],
- include_svn_url)
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_src)['URL'],
- src_svn_url)
+ self.enabled = self.FAKE_REPOS.set_up_git()
def testSkiaDEPSChangeGit(self):
if not self.enabled:
@@ -1542,7 +769,7 @@
"""Simulate the behavior of bisect bots as they transition across the Blink
DEPS change."""
- FAKE_REPOS_CLASS = FakeRepoBlinkDEPS
+ FAKE_REPOS_CLASS = fake_repos.FakeRepoBlinkDEPS
def setUp(self):
super(BlinkDEPSTransitionSmokeTest, self).setUp()
@@ -1673,103 +900,6 @@
['git', 'show-ref', '-q', '--verify', 'refs/heads/foo'], cwd=self.blink)
-class GClientSmokeFromCheckout(GClientSmokeBase):
- # WebKit abuses this. It has a .gclient and a DEPS from a checkout.
- def setUp(self):
- super(GClientSmokeFromCheckout, self).setUp()
- self.enabled = self.FAKE_REPOS.set_up_svn()
- os.rmdir(self.root_dir)
- if self.enabled:
- usr, pwd = self.FAKE_REPOS.USERS[0]
- subprocess2.check_call(
- ['svn', 'checkout', self.svn_base + '/trunk/webkit',
- self.root_dir, '-q',
- '--non-interactive', '--no-auth-cache',
- '--username', usr, '--password', pwd])
-
- def testSync(self):
- if not self.enabled:
- return
- self.parseGclient(['sync', '--deps', 'mac', '--jobs', '1'],
- ['running', 'running'])
- tree = self.mangle_svn_tree(
- ('trunk/webkit@2', ''),
- ('trunk/third_party/foo@1', 'foo/bar'))
- self.assertTree(tree)
-
- def testRevertAndStatus(self):
- if not self.enabled:
- return
- self.gclient(['sync'])
-
- # TODO(maruel): This is incorrect.
- out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'], [])
-
- # Revert implies --force implies running hooks without looking at pattern
- # matching.
- results = self.gclient(['revert', '--deps', 'mac', '--jobs', '1'])
- out = self.splitBlock(results[0])
- self.assertEquals(2, len(out))
- # This value varies depending on the version of svn being run.
- # New vesions (the one in Trust) print "Updating '.':" and "At revision 1.".
- # Older versions (the one in Precise) print just "At revision 1.".
- #self.assertEquals(3, len(out[0]))
- self.assertEquals(2, len(out[1]))
- self.checkString('foo', out[1][1])
- self.checkString('', results[1])
- self.assertEquals(0, results[2])
- tree = self.mangle_svn_tree(
- ('trunk/webkit@2', ''),
- ('trunk/third_party/foo@1', 'foo/bar'))
- self.assertTree(tree)
-
- # TODO(maruel): This is incorrect.
- out = self.parseGclient(['status', '--deps', 'mac'], [])
-
- def testRunHooks(self):
- if not self.enabled:
- return
- # Hooks aren't really tested for now since there is no hook defined.
- self.gclient(['sync', '--deps', 'mac'])
- out = self.parseGclient(['runhooks', '--deps', 'mac'], ['running'])
- self.assertEquals(1, len(out))
- self.assertEquals(2, len(out[0]))
- self.assertEquals(3, len(out[0][0]))
- self.checkString('foo', out[0][1])
- tree = self.mangle_svn_tree(
- ('trunk/webkit@2', ''),
- ('trunk/third_party/foo@1', 'foo/bar'))
- self.assertTree(tree)
-
- def testRevInfo(self):
- if not self.enabled:
- return
- self.gclient(['sync', '--deps', 'mac'])
- results = self.gclient(['revinfo', '--deps', 'mac'])
- expected = (
- './: None\nfoo/bar: %strunk/third_party/foo@1\n' % self.svn_base,
- '', 0)
- self.check(expected, results)
- # TODO(maruel): To be added after the refactor.
- #results = self.gclient(['revinfo', '--snapshot'])
- #expected = (
- # './: None\nfoo/bar: %strunk/third_party/foo@1\n' % self.svn_base,
- # '', 0)
- #self.check(expected, results)
-
- def testRest(self):
- if not self.enabled:
- return
- self.gclient(['sync'])
- # TODO(maruel): This is incorrect, it should run on ./ too.
- self.parseGclient(
- ['cleanup', '--deps', 'mac', '--verbose', '--jobs', '1'],
- [('running', join(self.root_dir, 'foo', 'bar'))])
- self.parseGclient(
- ['diff', '--deps', 'mac', '--verbose', '--jobs', '1'],
- [('running', join(self.root_dir, 'foo', 'bar'))])
-
-
if __name__ == '__main__':
if '-v' in sys.argv:
logging.basicConfig(level=logging.DEBUG)
diff --git a/tests/scm_unittest.py b/tests/scm_unittest.py
index 15676aa..49e9ee2 100755
--- a/tests/scm_unittest.py
+++ b/tests/scm_unittest.py
@@ -189,293 +189,6 @@
self.assertTrue(scm.GIT.IsValidRevision(cwd=self.clone_dir, rev='HEAD'))
-class RealGitSvnTest(fake_repos.FakeReposTestBase):
- def setUp(self):
- super(RealGitSvnTest, self).setUp()
- self.enabled = self.FAKE_REPOS.set_up_git() and self.FAKE_REPOS.set_up_svn()
- if self.enabled:
- self.tree_name = 'git-svn'
- self.svn_url = scm.os.path.join(self.FAKE_REPOS.svn_base, 'trunk')
- self.clone_dir = scm.os.path.join(self.FAKE_REPOS.git_root,
- self.tree_name)
- scm.os.makedirs(self.clone_dir)
- self._capture(['svn', 'clone', '-q', '-q', self.svn_url, self.clone_dir])
- # git rev-list gives revisions in reverse chronological order.
- hashes = reversed(self._capture(['rev-list', 'HEAD']).splitlines())
- # We insert a null value at 0 to do 1-based indexing, not 0-based, as SVN
- # revisions are 1-based (i.e. they start at r1, not r0).
- self.git_hashes = ([None] + list(hashes))
-
- def tearDown(self):
- scm.gclient_utils.rmtree(self.clone_dir)
-
- def _capture(self, cmd, **kwargs):
- kwargs.setdefault('cwd', self.clone_dir)
- return scm.GIT.Capture(cmd, **kwargs)
-
- def testGetGitSvnHeadRev(self):
- if not self.enabled:
- return
- self.assertEquals(scm.GIT.GetGitSvnHeadRev(cwd=self.clone_dir), 2)
- self._capture(['reset', '--hard', 'HEAD^'])
- self.assertEquals(scm.GIT.GetGitSvnHeadRev(cwd=self.clone_dir), 1)
-
- def testIsGitSvn(self):
- if not self.enabled:
- return
- # Git-svn
- self.assertTrue(scm.GIT.IsGitSvn(self.clone_dir))
- # Pure git
- git_dir = scm.os.path.join(self.FAKE_REPOS.git_root, 'repo_1')
- self.assertFalse(scm.GIT.IsGitSvn(git_dir))
- # Pure svn
- svn_dir = scm.os.path.join(self.FAKE_REPOS.svn_checkout, 'trunk')
- self.assertFalse(scm.GIT.IsGitSvn(svn_dir))
-
- def testParseGitSvnSha1(self):
- test_sha1 = 'a5c63ce8671922e5c59c0dea49ef4f9d4a3020c9'
- expected_output = test_sha1 + '\n'
- # Cygwin git-svn 1.7.9 prints extra escape sequences when run under
- # TERM=xterm
- cygwin_output = test_sha1 + '\n\033[?1034h'
-
- self.assertEquals(scm.GIT.ParseGitSvnSha1(expected_output), test_sha1)
- self.assertEquals(scm.GIT.ParseGitSvnSha1(cygwin_output), test_sha1)
-
- def testGetGetSha1ForSvnRev(self):
- if not self.enabled:
- return
- self.assertEquals(scm.GIT.GetSha1ForSvnRev(cwd=self.clone_dir, rev=1),
- self.git_hashes[1])
- self.assertEquals(scm.GIT.GetSha1ForSvnRev(cwd=self.clone_dir, rev=2),
- self.git_hashes[2])
-
-
-class SVNTestCase(BaseSCMTestCase):
- def setUp(self):
- BaseSCMTestCase.setUp(self)
- self.mox.StubOutWithMock(scm.SVN, 'Capture')
- self.url = self.SvnUrl()
-
- def testMembersChanged(self):
- self.mox.ReplayAll()
- members = [
- 'AssertVersion',
- 'Capture',
- 'CaptureLocalInfo',
- 'CaptureRemoteInfo',
- 'CaptureRevision',
- 'CaptureStatus',
- 'current_version',
- 'GenerateDiff',
- 'GetCheckoutRoot',
- 'GetEmail',
- 'GetFileProperty',
- 'IsMoved',
- 'IsMovedInfo',
- 'IsValidRevision',
- 'ReadSimpleAuth',
- 'Revert',
- 'RunAndGetFileList',
- ]
- # If this test fails, you should add the relevant test.
- self.compareMembers(scm.SVN, members)
-
- def testGetCheckoutRoot(self):
- # pylint: disable=E1103
- self.mox.StubOutWithMock(scm.SVN, '_CaptureInfo')
- self.mox.StubOutWithMock(scm, 'GetCasedPath')
- scm.os.path.abspath = lambda x: x
- scm.GetCasedPath = lambda x: x
- scm.SVN._CaptureInfo([], self.root_dir + '/foo/bar').AndReturn({
- 'Repository Root': 'svn://svn.chromium.org/chrome',
- 'URL': 'svn://svn.chromium.org/chrome/trunk/src',
- })
- scm.SVN._CaptureInfo([], self.root_dir + '/foo').AndReturn({
- 'Repository Root': 'svn://svn.chromium.org/chrome',
- 'URL': 'svn://svn.chromium.org/chrome/trunk',
- })
- scm.SVN._CaptureInfo([], self.root_dir).AndReturn({
- 'Repository Root': 'svn://svn.chromium.org/chrome',
- 'URL': 'svn://svn.chromium.org/chrome/trunk/tools/commit-queue/workdir',
- })
- self.mox.ReplayAll()
- self.assertEquals(scm.SVN.GetCheckoutRoot(self.root_dir + '/foo/bar'),
- self.root_dir + '/foo')
-
- def testGetFileInfo(self):
- xml_text = r"""<?xml version="1.0"?>
-<info>
-<entry kind="file" path="%s" revision="14628">
-<url>http://src.chromium.org/svn/trunk/src/chrome/app/d</url>
-<repository><root>http://src.chromium.org/svn</root></repository>
-<wc-info>
-<schedule>add</schedule>
-<depth>infinity</depth>
-<copy-from-url>http://src.chromium.org/svn/trunk/src/chrome/app/DEPS</copy-from-url>
-<copy-from-rev>14628</copy-from-rev>
-<checksum>369f59057ba0e6d9017e28f8bdfb1f43</checksum>
-</wc-info>
-</entry>
-</info>
-""" % self.url
- scm.SVN.Capture(['info', '--xml', self.url], None).AndReturn(xml_text)
- expected = {
- 'URL': 'http://src.chromium.org/svn/trunk/src/chrome/app/d',
- 'UUID': None,
- 'Repository Root': 'http://src.chromium.org/svn',
- 'Schedule': 'add',
- 'Copied From URL':
- 'http://src.chromium.org/svn/trunk/src/chrome/app/DEPS',
- 'Copied From Rev': '14628',
- 'Path': self.url,
- 'Revision': 14628,
- 'Node Kind': 'file',
- }
- self.mox.ReplayAll()
- file_info = scm.SVN._CaptureInfo([self.url], None)
- self.assertEquals(sorted(file_info.items()), sorted(expected.items()))
-
- def testCaptureInfo(self):
- xml_text = """<?xml version="1.0"?>
-<info>
-<entry
- kind="dir"
- path="."
- revision="35">
-<url>%s</url>
-<repository>
-<root>%s</root>
-<uuid>7b9385f5-0452-0410-af26-ad4892b7a1fb</uuid>
-</repository>
-<wc-info>
-<schedule>normal</schedule>
-<depth>infinity</depth>
-</wc-info>
-<commit
- revision="35">
-<author>maruel</author>
-<date>2008-12-04T20:12:19.685120Z</date>
-</commit>
-</entry>
-</info>
-""" % (self.url, self.root_dir)
- scm.SVN.Capture(['info', '--xml', self.url], None).AndReturn(xml_text)
- self.mox.ReplayAll()
- file_info = scm.SVN._CaptureInfo([self.url], None)
- expected = {
- 'URL': self.url,
- 'UUID': '7b9385f5-0452-0410-af26-ad4892b7a1fb',
- 'Revision': 35,
- 'Repository Root': self.root_dir,
- 'Schedule': 'normal',
- 'Copied From URL': None,
- 'Copied From Rev': None,
- 'Path': '.',
- 'Node Kind': 'directory',
- }
- self.assertEqual(file_info, expected)
-
- def testCaptureStatus(self):
- text = r"""<?xml version="1.0"?>
-<status>
-<target path=".">
-<entry path="unversionned_file.txt">
-<wc-status props="none" item="unversioned"></wc-status>
-</entry>
-<entry path="build\internal\essential.vsprops">
-<wc-status props="normal" item="modified" revision="14628">
-<commit revision="13818">
-<author>ajwong@chromium.org</author>
-<date>2009-04-16T00:42:06.872358Z</date>
-</commit>
-</wc-status>
-</entry>
-<entry path="chrome\app\d">
-<wc-status props="none" copied="true" tree-conflicted="true" item="added">
-</wc-status>
-</entry>
-<entry path="chrome\app\DEPS">
-<wc-status props="modified" item="modified" revision="14628">
-<commit revision="1279">
-<author>brettw@google.com</author>
-<date>2008-08-23T17:16:42.090152Z</date>
-</commit>
-</wc-status>
-</entry>
-<entry path="scripts\master\factory\gclient_factory.py">
-<wc-status props="normal" item="conflicted" revision="14725">
-<commit revision="14633">
-<author>nsylvain@chromium.org</author>
-<date>2009-04-27T19:37:17.977400Z</date>
-</commit>
-</wc-status>
-</entry>
-</target>
-</status>
-"""
- scm.SVN.Capture(['status', '--xml'], '.').AndReturn(text)
-
- self.mox.ReplayAll()
- info = scm.SVN.CaptureStatus(None, '.')
- expected = [
- ('? ', 'unversionned_file.txt'),
- ('M ', 'build\\internal\\essential.vsprops'),
- ('A + ', 'chrome\\app\\d'),
- ('MM ', 'chrome\\app\\DEPS'),
- ('C ', 'scripts\\master\\factory\\gclient_factory.py'),
- ]
- self.assertEquals(sorted(info), sorted(expected))
-
- def testCaptureStatusEmpty(self):
- text = r"""<?xml version="1.0"?>
- <status>
- <target
- path="perf">
- </target>
- </status>"""
- scm.SVN.Capture(['status', '--xml'], None).AndReturn(text)
- self.mox.ReplayAll()
- info = scm.SVN.CaptureStatus(None, None)
- self.assertEquals(info, [])
-
-
-class RealSvnTest(fake_repos.FakeReposTestBase):
- # Tests that work with a checkout.
- def setUp(self):
- super(RealSvnTest, self).setUp()
- self.enabled = self.FAKE_REPOS.set_up_svn()
- if self.enabled:
- self.svn_root = scm.os.path.join(self.root_dir, 'base')
- scm.SVN.Capture(
- ['checkout', self.svn_base + 'trunk/third_party', 'base'],
- cwd=self.root_dir)
- self.tree = self.mangle_svn_tree(('trunk/third_party@-1', ''),)
-
- def _capture(self, cmd, **kwargs):
- kwargs.setdefault('cwd', self.svn_root)
- return scm.SVN.Capture(cmd, **kwargs)
-
- def testCheckout(self):
- if not self.enabled:
- return
- # Checkout and verify the tree.
- self.assertTree(self.tree, self.svn_root)
-
- def testIsValidRevision(self):
- if not self.enabled:
- return
- url_at_rev = self.svn_base + 'trunk/third_party@%s'
- # Invalid or non-existent.
- self.assertFalse(scm.SVN.IsValidRevision('url://totally_invalid/trunk/foo'))
- self.assertFalse(scm.SVN.IsValidRevision(url_at_rev % 0))
- self.assertFalse(scm.SVN.IsValidRevision(url_at_rev % 123))
- # Valid.
- self.assertTrue(scm.SVN.IsValidRevision(url_at_rev % 1))
- self.assertTrue(scm.SVN.IsValidRevision(url_at_rev % 2))
- self.assertTrue(scm.SVN.IsValidRevision(url_at_rev % 'HEAD'))
-
-
if __name__ == '__main__':
if '-v' in sys.argv:
logging.basicConfig(level=logging.DEBUG)