aboutsummaryrefslogtreecommitdiffstats
path: root/MgaRepo/git.py
diff options
context:
space:
mode:
authorPer Øyvind Karlsen <proyvind@moondrake.org>2016-05-28 22:57:39 +0200
committerPer Øyvind Karlsen <proyvind@moondrake.org>2016-05-28 22:57:39 +0200
commit3c9999b9520abf6a8db83a146c134661dce60dd8 (patch)
tree81334a5a510aae05e78c4c5ce8ec296473b637ba /MgaRepo/git.py
parent9d8d2bc03257a39bc5ddf6bec848431b4e538662 (diff)
downloadmgarepo-3c9999b9520abf6a8db83a146c134661dce60dd8.tar
mgarepo-3c9999b9520abf6a8db83a146c134661dce60dd8.tar.gz
mgarepo-3c9999b9520abf6a8db83a146c134661dce60dd8.tar.bz2
mgarepo-3c9999b9520abf6a8db83a146c134661dce60dd8.tar.xz
mgarepo-3c9999b9520abf6a8db83a146c134661dce60dd8.zip
- do not use shell for running external programs
- add suport for (quick) git-svn cloning of package repositories
Diffstat (limited to 'MgaRepo/git.py')
-rw-r--r--MgaRepo/git.py57
1 files changed, 57 insertions, 0 deletions
diff --git a/MgaRepo/git.py b/MgaRepo/git.py
new file mode 100644
index 0000000..a424a08
--- /dev/null
+++ b/MgaRepo/git.py
@@ -0,0 +1,57 @@
+from MgaRepo import Error, config
+from MgaRepo.util import execcmd
+from MgaRepo.VCS import *
+from os.path import basename, dirname
+from os import chdir, getcwd
+import sys
+import re
+import time
+from xml.etree import ElementTree
+import subprocess
+
+class GITLogEntry(VCSLogEntry):
+ def __init__(self, revision, author, date):
+ VCSLogEntry.__init__(self, revision, author, data)
+
+class GIT(VCS):
+ def __init__(self):
+ VCS.__init__(self)
+ self.vcs_name = "git"
+ self.vcs_command = config.get("global", "git-command", "git")
+ self.vcs_supports['clone'] = True
+ self.env_defaults = {"GIT_SSH": self.vcs_wrapper}
+
+ def clone(self, url, targetpath, **kwargs):
+ if url.split(':')[0].find("svn") < 0:
+ return VCS.clone(self, url, targetpath, **kwargs)
+ else:
+ # To speed things up on huge repositories, we'll just grab all the
+ # revision numbers for this specific directory and grab these only
+ # in stead of having to go through each and every revision...
+ retval, result = execcmd("svn log --stop-on-copy --xml %s" % url)
+ if retval:
+ return retval
+ parser = ElementTree.XMLParser()
+ result = "".join(result.split("\n"))
+ parser.feed(result)
+ log = parser.close()
+ logentries = log.getiterator("logentry")
+ revisions = []
+ topurl = dirname(url)
+ trunk = basename(url)
+ tags = "releases"
+ execcmd("git svn init %s --trunk=%s --tags=%s %s" % (topurl, trunk, tags, targetpath), show=True)
+ chdir(targetpath)
+ for entry in logentries:
+ revisions.append(entry.attrib["revision"])
+ while revisions:
+ execcmd("git svn fetch -r%d" % int(revisions.pop()), show=True)
+
+ cmd = ["svn", "rebase"]
+ return self._execVcs_success(*cmd, **kwargs)
+
+class SVNLook(VCSLook):
+ def __init__(self, repospath, txn=None, rev=None):
+ VCSLook.__init__(self, repospath, txn, rev)
+
+# vim:et:ts=4:sw=4