changeset 321:092925ff75d7

Added basic Git support, configuration options: git_url git_branch
author Andre Heinecke <aheinecke@intevation.de>
date Fri, 12 Mar 2010 09:13:33 +0000
parents 0862a14df80b
children 278abafc2d86
files README treepkg/git.py treepkg/packager.py treepkg/readconfig.py
diffstat 4 files changed, 145 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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
 
--- /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 <aheinecke@intevation.de>
+#
+# 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)
--- 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,
--- 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 = [
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)