diff options
Diffstat (limited to 'eggs/infrae.subversion-1.4.5-py2.6.egg/infrae')
14 files changed, 572 insertions, 0 deletions
diff --git a/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/__init__.py b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/__init__.py new file mode 100644 index 0000000..a839e5c --- /dev/null +++ b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2007-2008 Infrae. All rights reserved. +# $Id$ + +__import__('pkg_resources').declare_namespace(__name__) diff --git a/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/__init__.pyo b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/__init__.pyo Binary files differnew file mode 100644 index 0000000..0596d1d --- /dev/null +++ b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/__init__.pyo diff --git a/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Common.py b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Common.py new file mode 100644 index 0000000..234ef6b --- /dev/null +++ b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Common.py @@ -0,0 +1,244 @@ +# Copyright (c) 2007-2008 Infrae. All rights reserved. +# $Id: Common.py 33243 2009-01-29 10:59:47Z sylvain $ + +from sets import Set # For python 2.3 compatibility +import os.path +import os +import re + + +import zc.buildout + + +def ignoredFile(file): + """Return true if the file should be ignored while checking for + added/changed/modified files. + """ + for suffix in ['.pyc', '.pyo', '.egg-info']: + if file.endswith(suffix): + return True + return False + + +def reportInvalidFiles(path, name, badfiles): + """Report invalid files. + """ + badfiles = [file for file in badfiles if not ignoredFile(file)] + if not badfiles: + return + raise ValueError("""\ +In '%s': +local modifications detected while uninstalling %r: Uninstall aborted! + +Please check for local modifications and make sure these are checked +in. + +If you sure that these modifications can be ignored, remove the +checkout manually: + + rm -rf %s + +Or if applicable, add the file to the 'svn:ignore' property of the +file's container directory. Alternatively, add an ignore glob pattern +to your subversion client's 'global-ignores' configuration variable. +""" % (path, name, """ + rm -rf """.join(badfiles))) + + +def checkExistPath(path, warning=True): + """Check that a path exist. + """ + status = os.path.exists(path) + if not status and warning: + print "-------- WARNING --------" + print "Directory %s have been removed." % os.path.abspath(path) + print "Changes might be lost." + print "-------- WARNING --------" + return status + + +def checkAddedPaths(location, urls): + """Check that no path have been added to that location. + """ + current_paths = Set([os.path.join(location, s) for s in + os.listdir(location)]) + recipe_paths = Set(urls.keys()) + added_paths = list(current_paths - recipe_paths) + for path in added_paths[:]: + if path.endswith('.svn'): + added_paths.remove(path) + if added_paths: + msg = "New path have been added to the location: %s." + raise ValueError(msg % ', '.join(added_paths)) + + +def prepareURLs(location, urls): + """Given a list of urls/path, and a location, prepare a list of + tuple with url, full path. + """ + + def prepareEntry(line): + link, path = line.split() + return os.path.join(location, path), link + + return dict([prepareEntry(l) for l in urls.splitlines() if l.strip()]) + + +def extractNames(urls): + """Return just the target names of the urls (used for egg names)""" + + def extractName(line): + link, name = line.split() + return name + + return [extractName(line) for line in urls.splitlines() if line.strip()] + + +class BaseRecipe(object): + """infrae.subversion recipe. Base class. + """ + + def __init__(self, buildout, name, options): + self.buildout = buildout + self.name = name + self.options = options + # location is overridable if desired. + location = options.get('location', None) + if location: + self.location = os.path.abspath(os.path.join( + buildout['buildout']['directory'], location)) + else: + self.location = os.path.join( + buildout['buildout']['parts-directory'], self.name) + options['location'] = self.location + self.revisions = {} # Store revision information for each link + self.updated = [] # Store updated links + self.urls = prepareURLs(self.location, options['urls']) + self.export = options.get('export') + self.offline = buildout['buildout'].get('offline', 'false') == 'true' + self.eggify = options.get('as_eggs', False) + self.eggs = self.eggify and extractNames(options['urls']) or [] + self.newest = ( + not self.offline and + buildout['buildout'].get('newest', 'true') == 'true' + ) + self.verbose = buildout['buildout'].get('verbosity', 0) + self.warning = not (options.get('no_warnings', 'false') == 'true') + + def _exportInformationToOptions(self): + """Export revision and changed information to options. + + Options can only contains strings. + """ + if self.options.get('export_info', False): + self.options['updated'] = str('\n'.join(self.updated)) + str_revisions = ['%s %s' % r for r in self.revisions.items() + if r[1]] + self.options['revisions'] = str('\n'.join(sorted(str_revisions))) + # Always export egg list + self.options['eggs'] = '\n'.join(sorted(self.eggs)) + + def _updateAllRevisionInformation(self): + """Update all revision information for defined urls. + """ + for path, link in self.urls.items(): + if os.path.exists(path): + self._updateRevisionInformation(link, path) + + def _updateRevisionInformation(self, link, revision): + """Update revision information on a path. + """ + old_revision = self.revisions.get(link, None) + self.revisions[link] = revision + if not (old_revision is None): + self.updated.append(link) + + def _updatePath(self, link, path): + """Update a single path. + """ + raise NotImplementedError + + def _updateAllPaths(self): + """Update the checkouts. + """ + ignore = self.options.get('ignore_updates', False) or self.export + + num_release = re.compile('.*@[0-9]+$') + for path, link in self.urls.items(): + if not checkExistPath(path, warning=self.warning): + if self.verbose: + print "Entry %s missing, checkout a new version ..." % link + self._installPath(link, path) + continue + + if ignore: + continue + + if num_release.match(link): + if self.verbose: + print "Given num release for %s, skipping." % link + continue + + if self.verbose: + print "Updating %s" % path + self._updatePath(link, path) + + def update(self): + """Update the recipe. + + Does not update SVN path if the buildout is in offline mode, + but still eggify and export information. + """ + if self.newest: + self._updateAllPaths() + + if self.eggify: + self._eggify() + self._exportInformationToOptions() + return self.location + + def _installPath(self, link, path): + """Checkout a single entry. + """ + raise NotImplementedError + + def _installPathVerbose(self, link, path): + """Checkout a single entry with verbose. + """ + if self.verbose: + print "%s %s to %s" % (self.export and 'Export' or 'Fetch', + link, path) + self._installPath(link, path) + + def _eggify(self): + """Install everything as development eggs if eggs=true""" + if self.eggify: + target = self.buildout['buildout']['develop-eggs-directory'] + for path in self.urls.keys(): + # If we update the recipe, and we don't have newest, + # and that some path have been deleted, all of them + # might not be there. + if checkExistPath(path, warning=self.warning): + zc.buildout.easy_install.develop(path, target) + + def install(self): + """Checkout the checkouts. + + Fails if buildout is running in offline mode. + """ + + for path, link in self.urls.items(): + self._installPathVerbose(link, path) + installed = [self.location] + + if self.eggify: + self._eggify() + # And also return the develop-eggs/*.egg-link files that are + # ours so that an uninstall automatically zaps them. + dev_dir = self.buildout['buildout']['develop-eggs-directory'] + egg_links = ['%s.egg-link' % egg for egg in self.eggs] + egg_links = [os.path.join(dev_dir, link) for link in egg_links] + installed += egg_links + self._exportInformationToOptions() + + return installed diff --git a/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Common.pyo b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Common.pyo Binary files differnew file mode 100644 index 0000000..df510e5 --- /dev/null +++ b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Common.pyo diff --git a/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Native.py b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Native.py new file mode 100644 index 0000000..d43b4b7 --- /dev/null +++ b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Native.py @@ -0,0 +1,140 @@ +# Copyright (c) 2007-2008 Infrae. All rights reserved. +# $Id: Native.py 33170 2009-01-21 15:46:45Z sylvain $ + +from pysvn import wc_status_kind, opt_revision_kind, wc_notify_action +import pysvn + +from Common import BaseRecipe, prepareURLs +from Common import checkAddedPaths, checkExistPath, reportInvalidFiles + +import os +import re +import getpass + + +def createSVNClient(recipe): + """Create a pysvn client, and setup some callback and options. + """ + + def callback_ssl(info): + print "-------- SECURITY WARNING --------" + print "There is no valid SSL certificat for %s." % info['realm'] + print "Check that the files are correct after being fetched." + print "-------- SECURITY WARNING --------" + return True, 0, False + + def callback_login(realm, username, may_save): + print 'Authentication realm: ' + realm + user = raw_input('Username: ') + password = getpass.getpass('Password for ' + "'" + user + "': ") + return True, user, password, True + + def callback_notify(info): + if info['action'] == wc_notify_action.update_completed: + path = info['path'] + url = recipe.urls.get(path, None) + if not (url is None): + recipe._updateRevisionInformation(url, path, info['revision']) + + client = pysvn.Client() + client.set_interactive(True) + client.callback_ssl_server_trust_prompt = callback_ssl + client.callback_get_login = callback_login + if not (recipe is None): + client.callback_notify = callback_notify + return client + + +class Recipe(BaseRecipe): + """infrae.subversion recipe. + """ + + def __init__(self, buildout, name, options): + super(Recipe, self).__init__(buildout, name, options) + if self.verbose: + print 'Using pysvn implementation.' + self.client = createSVNClient(self) + if not self.export: + self._updateAllRevisionInformation() + self._exportInformationToOptions() + + def _updateRevisionInformation(self, link, path, revision=None): + """Update revision information on a path. + """ + if revision is None: + if self.export: + return + info = self.client.info(path) + revision = info['revision'] + + assert (revision.kind == opt_revision_kind.number) + super(Recipe, self)._updateRevisionInformation(link, revision.number) + + def _updatePath(self, link, path): + """Update a single path. + """ + self.client.update(path) + + def _parseRevisionInUrl(self, url): + """Parse URL to extract revision number. This is not done by + pysvn, so we have to do it by ourself. + """ + num_release = re.compile('(.*)@([0-9]+)$') + match = num_release.match(url) + if match: + return (match.group(1), + pysvn.Revision(opt_revision_kind.number, + int(match.group(2)))) + return (url, pysvn.Revision(opt_revision_kind.head)) + + def _installPath(self, link, path): + """Checkout a single entry. + """ + link, wanted_revision = self._parseRevisionInUrl(link) + if self.export: + method = self.client.export + else: + method = self.client.checkout + method(link, path, revision=wanted_revision, recurse=True) + + +def uninstall(name, options): + r""" + This is an uninstallation hook for the 'infrae.subversion' recipe. + + Its only job is to raise an exception when there are changes in a + subversion tree that a user might not want to lose. This function + does *not* delete or otherwise touch any files. + + The location of the path is passed as options['location']. + """ + if bool(options.get('export', False)): + return # SVN Export, there is nothing to check. + + if bool(options.get('ignore_verification', False)): + return # Verification disabled. + + # XXX This makes the assumption that we're in the buildout + # directory and that our part is in 'parts'. We don't have + # options['buildout'] available so no + # 'buildout:parts-directory'. + location = options.get('location', os.path.join('.', 'parts', name)) + urls = prepareURLs(location, options['urls']) + client = createSVNClient(None) + + bad_svn_status = [wc_status_kind.modified, + wc_status_kind.missing, + wc_status_kind.unversioned, ] + + if not checkExistPath(location): + return + + checkAddedPaths(location, urls) + + for path in urls.keys(): + if not checkExistPath(path): + continue + + badfiles = filter(lambda e: e['text_status'] in bad_svn_status, + client.status(path)) + reportInvalidFiles(path, name, [file['path'] for file in badfiles]) diff --git a/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Native.pyo b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Native.pyo Binary files differnew file mode 100644 index 0000000..bf95d58 --- /dev/null +++ b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Native.pyo diff --git a/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Py.py b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Py.py new file mode 100644 index 0000000..05e297b --- /dev/null +++ b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Py.py @@ -0,0 +1,87 @@ +# Copyright (c) 2007-2008 Infrae. All rights reserved. +# $Id: Py.py 32775 2009-01-05 10:53:29Z sylvain $ + +import os +import py + +from Common import BaseRecipe, prepareURLs +from Common import checkAddedPaths, checkExistPath, reportInvalidFiles + + +class Recipe(BaseRecipe): + """infrae.subversion recipe. + """ + + def __init__(self, buildout, name, options): + super(Recipe, self).__init__(buildout, name, options) + if self.verbose: + print 'Using py implementation.' + if not self.offline: # Py is not able to do svn status + # without asking something on a + # server. + self._updateAllRevisionInformation() + self._exportInformationToOptions() + + def _updateRevisionInformation(self, link, path): + """Update revision information on a path. + """ + if isinstance(path, str): + path = py.path.svnwc(path) + + revision = path.status().rev + super(Recipe, self)._updateRevisionInformation(link, revision) + + def _updatePath(self, link, path): + """Update a single path. + """ + wc = py.path.svnwc(path) + wc.update() + self._updateRevisionInformation(link, wc) + + def _installPath(self, link, path): + """Checkout a single entry. + """ + if self.export: + raise NotImplementedError + wc = py.path.svnwc(path) + wc.checkout(link) + self._updateRevisionInformation(link, wc) + + +def uninstall(name, options): + r""" + This is an uninstallation hook for the 'infrae.subversion' recipe. + + Its only job is to raise an exception when there are changes in a + subversion tree that a user might not want to lose. This function + does *not* delete or otherwise touch any files. + + The location of the path is passed as options['location']. + """ + if bool(options.get('export', False)): + return # SVN Export, there is nothing to check. + + if bool(options.get('ignore_verification', False)): + return # Verification disabled. + + + # XXX This makes the assumption that we're in the buildout + # directory and that our part is in 'parts'. We don't have + # options['buildout'] available so no + # 'buildout:parts-directory'. + location = options.get('location', os.path.join('.', 'parts', name)) + urls = prepareURLs(location, options['urls']) + + if not checkExistPath(location): + return + + checkAddedPaths(location, urls) + + for path in urls.keys(): + if not checkExistPath(path): + continue + + wc = py.path.svnwc(path) + status = wc.status(rec=1) + badfiles = [] + status.modified + status.incomplete + status.unknown + reportInvalidFiles(path, name, [file.strpath for file in badfiles]) diff --git a/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Py.pyo b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Py.pyo Binary files differnew file mode 100644 index 0000000..c2ed51d --- /dev/null +++ b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/Py.pyo diff --git a/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/__init__.py b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/__init__.py new file mode 100644 index 0000000..d13d541 --- /dev/null +++ b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/__init__.py @@ -0,0 +1,22 @@ +# Copyright (c) 2007-2008 Infrae. All rights reserved. +# $Id$ + +import os + +impl = os.getenv('INFRAE_SUBVERSION_IMPL', 'PYSVN') + +if impl == 'PYSVN': + try: + # Try to use a native binding, use native SVN. + import Native + Recipe = Native.Recipe + uninstall = Native.uninstall + except: + # Or if the binding is not present, use slow py. + impl = 'PY' + +if impl == 'PY': + import Py + Recipe = Py.Recipe + uninstall = Py.uninstall + diff --git a/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/__init__.pyo b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/__init__.pyo Binary files differnew file mode 100644 index 0000000..14c6b2d --- /dev/null +++ b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/__init__.pyo diff --git a/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/tests/__init__.py b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/tests/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/tests/__init__.py diff --git a/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/tests/__init__.pyo b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/tests/__init__.pyo Binary files differnew file mode 100644 index 0000000..f5a5ae4 --- /dev/null +++ b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/tests/__init__.pyo diff --git a/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/tests/test_impl.py b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/tests/test_impl.py new file mode 100644 index 0000000..55e6988 --- /dev/null +++ b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/tests/test_impl.py @@ -0,0 +1,75 @@ +## -*- coding: utf-8 -*- + +__author__ = "sylvain@infrae.com" +__format__ = "plaintext" +__version__ = "$Id: test_impl.py 31670 2008-10-31 10:21:14Z sylvain $" + +import doctest +import os +import os.path +import sys +import unittest +from doctest import DocFileSuite + +import py +import svnhelper.testing +import svnhelper.tests +import zc.buildout.testing +from svnhelper.core import helper + +import infrae.subversion + + +def setUp(test): + test_package = os.path.dirname(svnhelper.tests.__file__) + test_package = os.path.join(test_package, 'tests', 'my.testing') + tested_package = os.path.dirname(infrae.subversion.__file__) + + zc.buildout.testing.buildoutSetUp(test) + zc.buildout.testing.install('py', test) + zc.buildout.testing.install_develop('infrae.subversion', test) + svnhelper.testing.setUpRepository(test) + test.globs['init_test_package'](test_package) + helper.import_to(test_package, + test.globs['repository']) + helper.import_to(tested_package, + test.globs['repository'] + '/infrae.subversion/trunk/infrae.subversion') + +def tearDown(test): + svnhelper.testing.tearDownRepository(test) + zc.buildout.testing.buildoutTearDown(test) + +flags = (doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE | + doctest.REPORT_ONLY_FIRST_FAILURE | doctest.REPORT_NDIFF) + +def have_pysvn(): + impl = os.getenv('INFRAE_SUBVERSION_IMPL', 'PYSVN') + if impl == 'PYSVN': + try: + import pysvn + return True + except: + pass + return False + +def test_file(name): + return os.path.join(os.path.dirname(__file__), name) + +def test_suite(): + tests = [DocFileSuite(test_file('IMPL.txt'), + optionflags=flags, + globs=globals(), + setUp=setUp, + tearDown=tearDown, + module_relative=False)] + if have_pysvn(): + tests += [DocFileSuite(test_file('EXPORT.txt'), + optionflags=flags, + globs=globals(), + setUp=setUp, + tearDown=tearDown, + module_relative=False)] + return unittest.TestSuite(tests) + +if __name__ == '__main__': + unittest.main(defaultTest='test_suite') diff --git a/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/tests/test_impl.pyo b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/tests/test_impl.pyo Binary files differnew file mode 100644 index 0000000..f30eecb --- /dev/null +++ b/eggs/infrae.subversion-1.4.5-py2.6.egg/infrae/subversion/tests/test_impl.pyo |