# HG changeset patch # User Andre Heinecke # Date 1268385213 0 # Node ID 092925ff75d787db6850f95e245dacad10dd0790 # Parent 0862a14df80b494d23378cf3ac7a7c68adbb95d7 Added basic Git support, configuration options: git_url git_branch diff -r 0862a14df80b -r 092925ff75d7 README --- a/README Mon Dec 21 13:21:40 2009 +0000 +++ b/README Fri Mar 12 09:13:33 2010 +0000 @@ -2,7 +2,7 @@ ======================= -TreePackager is a tool to automatically build debian packages from SVN. +TreePackager is a tool to automatically build debian packages. Prerequisites @@ -17,6 +17,7 @@ Debian devscripts (devscripts) subversion pbuilder + git-core sudo bzip2 diff -r 0862a14df80b -r 092925ff75d7 treepkg/git.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/treepkg/git.py Fri Mar 12 09:13:33 2010 +0000 @@ -0,0 +1,124 @@ +# Copyright (C) 2010 by Intevation GmbHi +# Authors: +# Andre Heinecke +# +# This program is free software under the GPL (>=v2) +# Read the file COPYING coming with the software for details. + +"""Collection of Git utility code""" + +import os +import shutil +import re +import StringIO + +import run +from cmdexpand import cmdexpand +from util import extract_value_for_key + + +class GitError(Exception): + + """Base class for Git specific errors raised by TreePKG""" + +def checkout(url, localdir, branch=None): + """Clones the repository at url into the localdir""" + run.call(cmdexpand("git clone $url $localdir", **locals())) + if branch: + run.call(cmdexpand("/bin/bash -c \"cd $localdir && git checkout --track -b local $branch\"", + **locals())) + else: + run.call(cmdexpand("/bin/bash -c \"cd $localdir && git checkout --track -b local master\"", + **locals())) + +def update(localdir, revision=None): + """Runs git pull on the localdir.""" + run.call(cmdexpand("/bin/bash -c \"cd $localdir && git pull -q\"", **locals())) + +def export(src, dest): + """Exports the local branch from src to dest""" + run.call(cmdexpand("/bin/bash -c \"cd $src && git checkout-index -a -f --prefix=$dest\"", **locals())) + +def last_changed_revision(git_working_copy): + """return the last changed revision of a Git branch as a incrementing Number""" + output = run.capture_output(cmdexpand("/bin/bash -c \"cd $git_working_copy && git rev-list local | nl | tail -n 1 | awk \'{print $$1}\'\"", **locals())) + if output is None: + raise GitError("Cannot determine last changed revision for %r" + % git_working_copy) + return int(output) + +class GitRepository(object): + + """Describes a git repository""" + + def __init__(self, url, branch=None): + """Initialize the git repository description + Parameters: + url -- The url of the repository + + branch -- The name of the remote Branch to track + defaults to master + """ + self.url = url + self.branch = branch + + def checkout(self, localdir): + """Checks out the repository into localdir.""" + checkout(self.url , localdir, self.branch) + update(localdir) + + def export(self, localdir, destdir): + """Exports the working copy in localdir to destdir""" + export(localdir, destdir) + + def last_changed_revision(self, localdir): + """Returns the last changed revision of the working copy in localdir""" + return last_changed_revision(localdir) + + def check_working_copy(self, localdir): + """ + FIXME STUB: Not implemented for git + """ + return None + +class GitWorkingCopy(object): + + """Represents a checkout of a git repository""" + + def __init__(self, repository, localdir, logger=None): + """ + Initialize the working copy. + Parameters: + repository -- The GitRepository instance describing the + repository + localdir -- The directory for the working copy + logger -- logging object to use for some info/debug messages + """ + self.repository = repository + self.localdir = localdir + self.logger = logger + + def log_info(self, *args): + if self.logger is not None: + self.logger.info(*args) + + def update_or_checkout(self, revision=0): + """Updates the working copy or creates by checking out the repository. + Revision number included for compatibility + """ + if os.path.exists(self.localdir): + self.log_info("Updating the working copy in %r", self.localdir) + update(self.localdir, self.repository.branch) + else: + self.log_info("The working copy in %r doesn't exist yet." + " Checking out from %r", + self.localdir, self.repository.url) + self.repository.checkout(self.localdir) + + def export(self, destdir): + """Exports the working copy to destdir""" + self.repository.export(self.localdir, destdir) + + def last_changed_revision(self): + """Returns the last changed rev of the working copy""" + return self.repository.last_changed_revision(self.localdir) diff -r 0862a14df80b -r 092925ff75d7 treepkg/packager.py --- a/treepkg/packager.py Mon Dec 21 13:21:40 2009 +0000 +++ b/treepkg/packager.py Fri Mar 12 09:13:33 2010 +0000 @@ -17,6 +17,7 @@ import util from subversion import SvnRepository, SvnWorkingCopy, ManualWorkingCopy +from git import GitRepository, GitWorkingCopy import run import status import debian @@ -340,14 +341,14 @@ extra_config_desc = [] - def __init__(self, name, base_dir, svn_url, root_cmd, pbuilderrc, deb_email, - deb_fullname, packager_class="treepkg.packager", + def __init__(self, name, base_dir, root_cmd, pbuilderrc, deb_email, + deb_fullname, svn_url="", packager_class="treepkg.packager", version_template="%(revision)s", pkg_revision_template="treepkg%(pkg_revision)d", handle_dependencies=False, signing_key_id="", do_build=True, rules_svn_url=None, deb_build_options="", pkg_basename="", changelog_msg_template="Update to r%(revision)s", - svn_subset=(), svn_externals=()): + svn_subset=(), svn_externals=(), git_branch="", git_url=""): self.name = name if not pkg_basename: pkg_basename = name @@ -371,9 +372,17 @@ externals = svn_externals if not externals: externals = self.svn_external_subdirs - repo = SvnRepository(svn_url, externals, subset=svn_subset) - self.working_copy = SvnWorkingCopy(repo, self.checkout_dir, - logger=logging) + if svn_url: + repo = SvnRepository(svn_url, externals, subset=svn_subset) + self.working_copy = SvnWorkingCopy(repo, self.checkout_dir, + logger=logging) + elif git_url: + repo = GitRepository(git_url, branch=git_branch) + self.working_copy = GitWorkingCopy(repo, self.checkout_dir, + logger=logging) + else: + print "No Repository URL for %s" % name + raise if rules_svn_url: repo = SvnRepository(rules_svn_url) self.rules_working_copy = SvnWorkingCopy(repo, self.debian_dir, diff -r 0862a14df80b -r 092925ff75d7 treepkg/readconfig.py --- a/treepkg/readconfig.py Mon Dec 21 13:21:40 2009 +0000 +++ b/treepkg/readconfig.py Fri Mar 12 09:13:33 2010 +0000 @@ -65,7 +65,8 @@ packager_desc = [ "name", "base_dir", - "svn_url", ("svn_subset", convert_subversion_subset, ""), + ("svn_url", str,""), + ("svn_subset", convert_subversion_subset, ""), ("svn_externals", shlex.split, ""), ("rules_svn_url", str, ""), "packager_class", ("root_cmd", shlex.split, "sudo"), "pbuilderrc", @@ -75,6 +76,8 @@ ("handle_dependencies", convert_bool), ("signing_key_id", str, ""), ("changelog_msg_template", str, "Update to revision %(revision)d"), + ("git_branch", str,""), + ("git_url", str,"") ] treepkg_desc = [