--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/thirdparty/vcs-load-dirs/vcs_support/vcs_wc.py Tue May 12 15:52:53 2009 +0200
@@ -0,0 +1,215 @@
+# Copyright (C) 2003-2007 John Goerzen
+# <jgoerzen@complete.org>
+#
+# 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 util
+import os.path
+from commandver import cmd, isdarcs, issvk, isgit, ishg, vcscmd
+
+class wc:
+ """Object for a working copy."""
+
+ def __init__(self, wcpath, verbose = 0, fsonly = 0):
+ self.wcpath = os.path.abspath(wcpath)
+ self.verb = verbose
+ self.fsonly = fsonly
+ if not self.wcverify():
+ raise Exception, "%s is not a tla working copy" % self.wcpath
+
+ def gettreeversion(self):
+ if isdarcs():
+ #util.chdircmd(self.wcpath, util.getstdoutsafeexec, "darcs",
+ # ['check'])
+ return "Darcs repository"
+ elif ishg():
+ return "Mercurial repository"
+ elif issvk():
+ return "Svk repository"
+ elif isgit():
+ return "Git repository"
+ else:
+ return util.chdircmd(self.wcpath, util.getstdoutsafeexec, vcscmd,
+ ['tree-version'])[0].strip()
+
+ def wcverify(self):
+ try:
+ self.gettreeversion()
+ except util.ExecProblem:
+ return 0
+ return 1
+
+ def gettaggingmethod(self):
+ if isdarcs() or isgit() or ishg():
+ return 'explicit'
+ else:
+ return util.chdircmd(self.wcpath, util.getstdoutsafeexec, vcscmd,
+ [cmd().tagging_method])[0].strip()
+
+ def gettree(self):
+ return util.maketree(self.wcpath,
+ ignore = [r'(^(\{arch\}$|,,|\.hg|\.hgtags|\.hgignore|\.git|_darcs|\.arch-ids$|\.arch-inventory$|\+\+)|/\.arch-ids/)'])
+
+ def addtag(self, file):
+ if self.verb:
+ print "Adding %s" % file
+ if (file[-1] == '/') and \
+ (not os.path.exists(os.path.join(self.wcpath,
+ file[:-1]))):
+ try:
+ print "addtag: making dir %s" % file[:-1]
+ os.makedirs(os.path.join(self.wcpath, file[:-1]))
+ except:
+ raise
+ file = self.slashstrip(file)
+ isdir = os.path.isdir(os.path.join(self.wcpath, file))
+ if (not self.fsonly) and \
+ (not ishg()) and ((not isdarcs()) or isdir):
+ # Darcs will see adds later, but we need to add dirs
+ # now so darcs mv will work.
+ #
+ # Mercurial will see adds later, and doesn't track directories,
+ # so we don't do anything with it.
+ util.chdircmd(self.wcpath, util.safeexec, vcscmd,
+ cmd().add + [file])
+
+ def movetag(self, src, dest):
+ if self.verb:
+ print "Moving %s to %s" % (src, dest)
+ if src[-1] == '/' \
+ and dest[-1] == '/' \
+ and ((not isdarcs()) and (not isgit()) and (not ishg())):
+ # Dir to dir -- darcs mv will catch it already.
+ # Git doesn't do rename recording, so don't worry about it?
+ return
+ src, dest = self.slashstrip(src, dest)
+ if not self.fsonly:
+ util.chdircmd(self.wcpath, util.safeexec, vcscmd,
+ [cmd().move, src, dest])
+
+ def movefile(self, src, dest):
+ if self.verb:
+ print "Moving file %s to %s" % (src, dest)
+ src, dest = self.slashstrip(src, dest)
+
+ def doit():
+ destdir = os.path.dirname(dest)
+ if (not os.path.exists(destdir)) and destdir != '':
+ self.makedirs(destdir)
+ if self.fsonly or \
+ (not isdarcs() and (not isgit()) and (not ishg())):
+ # Darcs, hg, and git actually do this when they move the tag
+ os.rename(src, dest)
+
+ util.chdircmd(self.wcpath, doit)
+
+ def delfile(self, file):
+ if self.verb:
+ print "Deleting file %s" % file
+ fullfile = os.path.join(self.wcpath, file)
+ if os.path.isfile(fullfile):
+ os.unlink(fullfile)
+ else:
+ util.safeexec("rm", ['-rf', fullfile])
+
+ def deltag(self, file):
+ if (not self.fsonly) and \
+ ((not isdarcs()) and (not ishg())):
+ if self.verb:
+ print "Deleting %s" % file
+ if os.path.islink(os.path.join(self.wcpath,file)) or os.path.exists(os.path.join(self.wcpath, file)):
+ util.chdircmd(self.wcpath, util.safeexec, vcscmd,
+ cmd().delete + [file])
+
+ def makelog(self, summary, logtext):
+ self.summary = summary
+ self.logtext = logtext
+ if ishg() or isgit() or isdarcs():
+ logfn = self.wcpath + "/../,,vcslog"
+ else:
+ logfn = util.chdircmd(self.wcpath, util.getstdoutsafeexec, vcscmd,
+ ['make-log'])[0].strip()
+
+ self.logfn = os.path.abspath(logfn)
+
+ fd = open(self.logfn, "w")
+ if isgit():
+ fd.write("%s\n\n" % summary)
+ if ishg():
+ fd.write("%s\n" % summary)
+ elif not (isdarcs() or ishg()):
+ fd.write("Summary: %s\n" % summary)
+ fd.write("Keywords: \n\n")
+ fd.write(logtext)
+ print "LOGTEXT", logtext
+ fd.close()
+
+
+ def commit(self):
+ if self.verb:
+ print "Committing changes"
+ if isdarcs():
+ util.chdircmd(self.wcpath, util.safeexec, vcscmd,
+ [cmd().commit, "-l", "-a", "-m", self.summary,
+ "--logfile", self.logfn,
+ "--delete-logfile"])
+ elif isgit():
+ util.chdircmd(self.wcpath, util.safeexec, vcscmd,
+ [cmd().commit, "-a", "-F", self.logfn])
+ os.unlink(self.logfn)
+ elif ishg():
+ util.chdircmd(self.wcpath, util.safeexec, vcscmd,
+ [cmd().commit, "-A", "-l", self.logfn])
+ os.unlink(self.logfn)
+ else:
+ if len(util.chdircmd(self.wcpath, util.getstdoutsafeexec, vcscmd, ['logs']))==0:
+ util.chdircmd(self.wcpath, util.safeexec, vcscmd, [cmd().importcmd])
+ else:
+ util.chdircmd(self.wcpath, util.safeexec, vcscmd, [cmd().commit])
+
+ def slashstrip(self, *args):
+ retval = []
+ for item in args:
+ if not len(item):
+ retval.append(item)
+ if item[-1] == '/':
+ item = item[:-1]
+ retval.append(item)
+ if len(args) == 1:
+ return retval[0]
+ return retval
+
+
+ def makedirs(self, name, mode=0777):
+ """makedirs(path [, mode=0777])
+
+ Super-mkdir; create a leaf directory and all intermediate ones.
+ Works like mkdir, except that any intermediate path segment (not
+ just the rightmost) will be created if it does not exist. This is
+ recursive.
+
+ (Modified from Python source)
+
+ """
+ head, tail = os.path.split(name)
+ if not tail:
+ head, tail = os.path.split(head)
+ if head and tail and not os.path.exists(head):
+ self.makedirs(head, mode)
+ if self.verb:
+ print "Created directory", name
+ os.mkdir(name, mode)
+ self.addtag(name)
+