diff -r d51331eaec15 -r e8262ca32109 thirdparty/vcs-load-dirs/vcs_support/vcs_interact.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/thirdparty/vcs-load-dirs/vcs_support/vcs_interact.py Tue May 12 15:52:53 2009 +0200 @@ -0,0 +1,214 @@ +# Copyright (C) 2003-2007 John Goerzen +# +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +import sys, os +import util +from commandver import isdarcs +from tempfile import mkdtemp + +class interaction: + def __init__(self, wcobj, importdir, docommit, log = '', verbose = 0, + summary = None): + self.wcobj = wcobj + self.log = log + self.docommit = docommit + self.verb = verbose + self.summary = summary + + if os.path.isdir(importdir): + self.importdir = os.path.abspath(importdir) + self.importfile = None + self.tmpdir = None + + else: # Not a dir, try to unpack an archive. + self.importfile = os.path.abspath(importdir) + # mkdtemp returns an absolute path + self.importdir = mkdtemp("-vcs-load-dirs", ",,unpack-", "..") + self.tmpdir = self.importdir + + try: + if self.verb: + print "Unpacking archive..." + + if self.importfile.endswith(".tar.gz"): + util.chdircmd(self.importdir, util.safeexec, "tar", + ["-zxf", self.importfile]) + + elif self.importfile.endswith(".tar.bz2"): + util.chdircmd(self.importdir, util.safeexec, "tar", + ["-jxf", self.importfile]) + elif self.importfile.endswith(".zip"): + util.chdircmd(self.importdir, util.safeexec, "unzip", + [self.importfile]) + else: + raise IOError, "Unknown archive file type" + + # Many tarballs expand into just one single directory. + # Check to see if that's the case. + + dents = os.listdir(self.importdir) + if len(dents) == 1 and os.path.isdir(self.importdir + "/" + + dents[0]): + self.importdir = self.importdir + "/" + dents[0] + except: + self.cleanup() + raise + + def cleanup(self): + if not (self.tmpdir is None): + util.safeexec("rm", ["-rf", self.tmpdir]) + self.tmpdir = None + + def updateimportfiles(self): + if self.verb: + print "Scanning upstream tree..." + self.importfiles = util.maketree(self.importdir) + + def updatewcfiles(self): + if self.verb: + print "Scanning working copy tree..." + self.wcfiles = self.wcobj.gettree() + + def update(self): + self.updatewcfiles() + self.updatechangedfiles() + + def updatechangedfiles(self): + if self.verb: + print "Calculating changes..." + wcfilehash = {} + for x in self.wcfiles: + wcfilehash[x] = 1 + importfilehash = {} + for x in self.importfiles: + importfilehash[x] = 1 + + self.addedfiles = [x for x in self.importfiles if not wcfilehash.has_key(x)] + self.deletedfiles = [x for x in self.wcfiles if not importfilehash.has_key(x)] + + + def main(self): + def readloop(): + for command in sys.stdin.readline().strip().split(','): + command = command.strip() + if command == 'q': + return 0 + if command == 'r': + return 1 + src, dest = command.split(' ') + src = int(src, 16) + dest = int(dest, 16) + self.mv(self.deletedfiles[src], self.addedfiles[dest]) + return 1 + + self.updateimportfiles() + needsupdate = 1 + + while 1: + self.update() + if self.wcobj.fsonly: + # Don't show this interface if we're not talking to the VCS + break + if not (len(self.addedfiles) and len(self.deletedfiles)): + # Just ran update; don't do it again. + needsupdate = 0 + break + + counter = 0 + print "%3s %-35s %3s %-35s" % ('Num', 'Source Files', 'Num', + 'Destination Files',) + print "%s %s %s %s" % ("-" * 3, "-" * 35, "-" * 3, "-" * 35) + while counter < max(len(self.addedfiles), len(self.deletedfiles)): + addfile = '' + delfile = '' + if counter < len(self.addedfiles): + addfile = self.addedfiles[counter] + if counter < len(self.deletedfiles): + delfile = self.deletedfiles[counter] + print "%3x %-35s %3x %-35s" % (counter, delfile, counter, addfile) + counter += 1 + print "Syntax: src dest [,src dest [,...]] to move, q to accept, r to redraw:" + sys.stdout.write("Command: ") + sys.stdout.flush() + try: + if not readloop(): + break + except ValueError: + print "Error handling input; please try again." + except IndexError: + print "Error handling input; please try again." + + self.catchup(needsupdate) + + def catchup(self, needsupdate = 1): + if self.verb: + print " *** Processing changes." + if needsupdate: + self.update() + if self.verb: + print "Deleting %d files" % len(self.deletedfiles) + if isdarcs(): + for file in util.sorttree(self.deletedfiles, filesfirst = True): + self.delfile(file) + else: + for file in self.deletedfiles: + self.delfile(file) + + if self.verb: + print "Copying upstream directory to working copy..." + util.copyfrom(self.importdir, self.wcobj.wcpath) + + if self.verb: + print "Adding %d files" % len(self.addedfiles) + self.addedfiles.sort() # Make sure top-level dirs added before files + for file in self.addedfiles: + self.addfile(file) + self.writelog() + if self.docommit: + self.wcobj.commit() + + def writelog(self): + logtext = "" + if not (self.importfile is None): + importname = self.importfile + else: + importname = self.importdir + + if self.summary: + summary = self.summary + else: + summary = "Imported %s" % os.path.basename(importname) + logtext += "Imported %s\ninto %s\n\n" % \ + (os.path.basename(importname), + self.wcobj.gettreeversion()) + logtext += self.log + self.wcobj.makelog(summary, logtext) + + + def addfile(self, file): + self.wcobj.addtag(file) + + def delfile(self, file): + self.wcobj.deltag(file) + self.wcobj.delfile(file) + + + def mv(self, src, dest): + print "%s -> %s" % (src, dest) + self.wcobj.movefile(src, dest) + self.wcobj.movetag(src, dest) +