diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/spack/spack/fetch_strategy.py | 26 | ||||
-rw-r--r-- | lib/spack/spack/package.py | 2 | ||||
-rw-r--r-- | lib/spack/spack/stage.py | 2 | ||||
-rw-r--r-- | lib/spack/spack/test/__init__.py | 3 | ||||
-rw-r--r-- | lib/spack/spack/test/svn_fetch.py | 150 |
5 files changed, 176 insertions, 7 deletions
diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py index 328f45c3d6..411c8cc276 100644 --- a/lib/spack/spack/fetch_strategy.py +++ b/lib/spack/spack/fetch_strategy.py @@ -209,11 +209,18 @@ class URLFetchStrategy(FetchStrategy): self.expand() - def __str__(self): + def __repr__(self): url = self.url if self.url else "no url" return "URLFetchStrategy<%s>" % url + def __str__(self): + if self.url: + return self.url + else: + return "URLFetchStrategy<no url>" + + class VCSFetchStrategy(FetchStrategy): def __init__(self, name, *rev_types, **kwargs): super(VCSFetchStrategy, self).__init__() @@ -245,6 +252,10 @@ class VCSFetchStrategy(FetchStrategy): def __str__(self): + return self.url + + + def __repr__(self): return "%s<%s>" % (self.__class__, self.url) @@ -359,6 +370,8 @@ class SvnFetchStrategy(VCSFetchStrategy): super(SvnFetchStrategy, self).__init__( 'svn', 'revision', **kwargs) self._svn = None + if self.revision is not None: + self.revision = str(self.revision) @property @@ -381,6 +394,7 @@ class SvnFetchStrategy(VCSFetchStrategy): args = ['checkout', '--force'] if self.revision: args += ['-r', self.revision] + args.append(self.url) self.svn(*args) self.stage.chdir_to_source() @@ -388,12 +402,16 @@ class SvnFetchStrategy(VCSFetchStrategy): def _remove_untracked_files(self): """Removes untracked files in an svn repository.""" - status = self.svn('status', '--no-ignore', check_output=True) + status = self.svn('status', '--no-ignore', return_output=True) + self.svn('status', '--no-ignore') for line in status.split('\n'): - if not re.match('^[I?]'): + if not re.match('^[I?]', line): continue path = line[8:].strip() - shutil.rmtree(path, ignore_errors=True) + if os.path.isfile(path): + os.unlink(path) + elif os.path.isdir(path): + shutil.rmtree(path, ignore_errors=True) def reset(self): diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index c6e1fd90ef..59bfafa241 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -643,7 +643,7 @@ class Package(object): archive_dir = self.stage.source_path if not archive_dir: self.stage.expand_archive() - tty.msg("Created stage directory in %s." % self.stage.path) + tty.msg("Created stage in %s." % self.stage.path) else: tty.msg("Already staged %s in %s." % (self.name, self.stage.path)) self.stage.chdir_to_source() diff --git a/lib/spack/spack/stage.py b/lib/spack/spack/stage.py index ed92fb17f7..0d684df92d 100644 --- a/lib/spack/spack/stage.py +++ b/lib/spack/spack/stage.py @@ -254,7 +254,7 @@ class Stage(object): fetcher.fetch() break except spack.error.SpackError, e: - tty.msg("Download from %s failed." % fetcher) + tty.msg("Fetching %s failed." % fetcher) continue diff --git a/lib/spack/spack/test/__init__.py b/lib/spack/spack/test/__init__.py index b00f9a31ce..61464293d2 100644 --- a/lib/spack/spack/test/__init__.py +++ b/lib/spack/spack/test/__init__.py @@ -48,7 +48,8 @@ test_names = ['versions', 'config', 'directory_layout', 'python_version', - 'git_fetch'] + 'git_fetch', + 'svn_fetch'] def list_tests(): diff --git a/lib/spack/spack/test/svn_fetch.py b/lib/spack/spack/test/svn_fetch.py new file mode 100644 index 0000000000..e253f21921 --- /dev/null +++ b/lib/spack/spack/test/svn_fetch.py @@ -0,0 +1,150 @@ +############################################################################## +# Copyright (c) 2013, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://scalability-llnl.github.io/spack +# Please also see the LICENSE file for our notice and the LGPL. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License (as published by +# the Free Software Foundation) version 2.1 dated February 1999. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and +# conditions of the GNU General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import os +import re +import unittest +import shutil +import tempfile +from contextlib import closing + +from llnl.util.filesystem import * + +import spack +from spack.version import ver +from spack.stage import Stage +from spack.util.executable import which +from spack.test.mock_packages_test import * + +test_repo_path = 'test-repo' + +test_import_path = 'test-import' +test_file_name = 'test-file.txt' +test_rev_file_name = 'test-rev-file' + +untracked = 'foobarbaz' + +svn = which('svn', required=True) +svnadmin = which('svnadmin', required=True) + + +class SvnFetchTest(MockPackagesTest): + """Tests fetching from a dummy git repository.""" + + def setUp(self): + """Create an svn repository with two revisions.""" + super(SvnFetchTest, self).setUp() + self.stage = Stage('fetch-test') + self.stage.chdir() + + repo_path = join_path(self.stage.path, test_repo_path) + svnadmin('create', repo_path) + self.repo_url = 'file://' + repo_path + + self.import_path = join_path(self.stage.path, test_import_path) + mkdirp(self.import_path) + with working_dir(self.import_path): + touch(test_file_name) + + svn('import', self.import_path, self.repo_url, '-m', 'Initial import') + + shutil.rmtree(self.import_path) + svn('checkout', self.repo_url, self.import_path) + with working_dir(self.import_path): + touch(test_rev_file_name) + svn('add', test_rev_file_name) + svn('ci', '-m', 'second revision') + + spec = Spec('svn-test') + spec.concretize() + self.pkg = spack.db.get(spec, new=True) + + + def tearDown(self): + """Destroy the stage space used by this test.""" + super(SvnFetchTest, self).tearDown() + + if self.stage is not None: + self.stage.destroy() + + self.pkg.do_clean_dist() + + + def assert_rev(self, rev): + """Check that the current revision is equal to the supplied rev.""" + def get_rev(): + output = svn('info', return_output=True) + self.assertTrue("Revision" in output) + for line in output.split('\n'): + match = re.match(r'Revision: (\d+)', line) + if match: + return int(match.group(1)) + self.assertEqual(get_rev(), rev) + + + def try_fetch(self, rev, test_file, args): + """Tries to: + 1. Fetch the repo using a fetch strategy constructed with + supplied args. + 2. Check if the test_file is in the checked out repository. + 3. Assert that the repository is at the revision supplied. + 4. Add and remove some files, then reset the repo, and + ensure it's all there again. + """ + self.pkg.versions[ver('svn')] = args + + self.pkg.do_stage() + self.assert_rev(rev) + + file_path = join_path(self.pkg.stage.source_path, test_file) + self.assertTrue(os.path.isdir(self.pkg.stage.source_path)) + self.assertTrue(os.path.isfile(file_path)) + + os.unlink(file_path) + self.assertFalse(os.path.isfile(file_path)) + + touch(untracked) + self.assertTrue(os.path.isfile(untracked)) + self.pkg.do_clean_work() + self.assertFalse(os.path.isfile(untracked)) + + self.assertTrue(os.path.isdir(self.pkg.stage.source_path)) + self.assertTrue(os.path.isfile(file_path)) + + self.assert_rev(rev) + + + def test_fetch_default(self): + """Test a default checkout and make sure it's on rev 1""" + self.try_fetch(2, test_rev_file_name, { + 'svn' : self.repo_url + }) + + + def test_fetch_r1(self): + """Test fetching an older revision (0).""" + self.try_fetch(1, test_file_name, { + 'svn' : self.repo_url, + 'revision' : 1 + }) |