Author: glondu-guest Date: Sun Jun 29 22:29:56 2008 New Revision: 5816 URL: http://svn.debian.org/wsvn/?sc=1&rev=5816 Log: Add command line options and possibility to export a shell script
This is still ongoing work... Modified: trunk/tools/svn2git/glondu_svn2git.py Modified: trunk/tools/svn2git/glondu_svn2git.py URL: http://svn.debian.org/wsvn/trunk/tools/svn2git/glondu_svn2git.py?rev=5816&op=diff ============================================================================== --- trunk/tools/svn2git/glondu_svn2git.py (original) +++ trunk/tools/svn2git/glondu_svn2git.py Sun Jun 29 22:29:56 2008 @@ -13,12 +13,16 @@ from debian_bundle.debian_support import version_compare from tempfile import NamedTemporaryFile from commands import getoutput, getstatusoutput -from xml.dom.minidom import parseString +from xml.dom.minidom import parseString, parse +from getopt import getopt # For extracting tgz names from svn-log output svntag_re = re.compile(r"^\[svn-buildpackage\][^(]+\(([^)]+)\)$") +# For extracting working dir from svn-log output +svnwdir_re = re.compile(r"^(/packages/ocaml/([0-9.beta]+|trunk)|/trunk/packages/ocaml/(trunk))(/.*|)$") +svnignore_re = re.compile(r"^/packages/ocaml(|/tags(/.*|))$") # Mapping from alioth login to name and email (could be queried...) users_dict = { @@ -70,9 +74,20 @@ raise ValueError("Unable to parse date '%s'" % str) +def escape_for_shell(str): + return "'" + str.replace("'", "'\\''") + "'" + + def git_init(): os.mkdir("git") run_command("git", "cd git && git init") + + +def get_copyfrom(path): + if path.hasAttribute("copyfrom-path"): + return "[EMAIL PROTECTED]" % (path.getAttribute("copyfrom-path"), path.getAttribute("copyfrom-rev")) + else: + return None class GitCommit: @@ -81,12 +96,69 @@ self.svn2git = svn2git self.rev = int(logentry.getAttribute("revision")) msg_elt = logentry.getElementsByTagName("msg")[0].firstChild - self.msg = msg_elt and msg_elt.nodeValue or "No log message" + self.msg = msg_elt and msg_elt.nodeValue.rstrip() or "No log message" user_elt = logentry.getElementsByTagName("author")[0] self.name, self.email = users_dict[user_elt.firstChild.nodeValue] date_elt = logentry.getElementsByTagName("date")[0] date = parse_datetime(date_elt.firstChild.nodeValue) self.date = date.strftime("%Y-%m-%d %H:%M:%S %z") + path_elts = logentry.getElementsByTagName("path") + self.files = [(x.getAttribute("action"), x.firstChild.nodeValue, get_copyfrom(x)) for x in path_elts] + + def export_sh(self): + print "echo Importing svn revision %d into git" % self.rev + print "( cd svn && svn update -r%d )" % self.rev + print "pushd git" + print "export GIT_AUTHOR_NAME=" + escape_for_shell(self.name) + print "export GIT_AUTHOR_EMAIL=" + escape_for_shell(self.email) + print "export GIT_AUTHOR_DATE=" + escape_for_shell(self.date) + print "export GIT_COMMITTER_NAME=" + escape_for_shell(self.name) + print "export GIT_COMMITTER_EMAIL=" + escape_for_shell(self.email) + print "export GIT_COMMITTER_DATE=" + escape_for_shell(self.date) + + working_dir = None + local_wdir = None + tgz = [] + nb_files = 0 + for (action, file, copyfrom) in self.files: + if svnignore_re.match(file): + print "# ignored (%s) %s" % (action, file) + continue + if copyfrom: + print "# copyfrom %s to (%s) %s" % (copyfrom, action, file) + if action in ("M", "A", "R"): + if working_dir: + if (file+"/").startswith(working_dir): + nb_files += 1 + else: + print "# unrecognized file (%s) %s (will probably be skipped)" % (action, file) + else: + m = svnwdir_re.match(file) + if m: + working_dir = m.group(1) + "/" + local_wdir = m.group(2) or m.group(3) + nb_files += 1 + else: + print "# cannot recognize working dir in (%s) %s" % (action, file) + if file.endswith(".tar.gz"): + print "# deal with (%s) %s manually" % (action, file) + tgz.append(file) + if working_dir: + print "rsync -a --exclude=.svn --exclude='*.tar.gz' --delete ../svn/%s/debian ." % local_wdir + print "git add ." + print "git add -u" + else: + print "# unable to guess working directory for revision %s" % self.rev + if nb_files: + cmd = "" + else: + print "# nothing to commit" + for (action, file, x) in self.files: + print "# %s %s" % (action, file) + cmd = "# " + cmd += "git commit -m " + escape_for_shell(self.msg) + print cmd.encode("utf-8") + print "popd\n" def setup_env(self): os.putenv("GIT_AUTHOR_NAME", self.name) @@ -233,20 +305,40 @@ if __name__ == "__main__": - if len(sys.argv) < 4: - print "Usage: %s <package-name> <tarball-location> <initial-revision>" % sys.argv[0] - sys.exit(1) - - package_name = sys.argv[1] - tarball_location = sys.argv[2] - initial_revision = int(sys.argv[3]) - - if initial_revision == 0: - run_command("clean", "rm -Rf git svn") - git_init() - - print "Retrieving logs...", - a = Svn2Git(package_name, tarball_location) - print "OK!" - print "Here we go!" - a.do(initial_revision) + opts, args = getopt(sys.argv[1:], "p:t:r:x:") + + package_name = None + tarball_location = "tarballs" + initial_revision = 0 + xml = None + + for (x, y) in opts: + if x == "-p": package_name = y + elif x == "-t": tarball_location = y + elif x == "-r": initial_revision = y + elif x == "-x": xml = y + + if xml: + xml = parse(xml) + logentries = xml.getElementsByTagName("logentry") + for x in logentries: + commit = GitCommit(x, None) + commit.export_sh() + sys.exit(0) + + if package_name: + if initial_revision == 0: + run_command("clean", "rm -Rf git svn") + git_init() + + print "Retrieving logs...", + a = Svn2Git(package_name, tarball_location) + print "OK!" + print "Here we go!" + a.do(initial_revision) + sys.exit(0) + + print >>sys.stderr, "Usages:" + print >>sys.stderr, " %s -p <package-name> [-t <tarball-location>] [-r <initial-revision>]" % sys.argv[0] + print >>sys.stderr, " %s -x <xml-log>" % sys.argv[0] + sys.exit(1) _______________________________________________ Pkg-ocaml-maint-commits mailing list Pkg-ocaml-maint-commits@lists.alioth.debian.org http://lists.alioth.debian.org/mailman/listinfo/pkg-ocaml-maint-commits