#!/usr/bin/env python # # $Id: vendor_import.py,v 1.3 2003/02/03 06:01:47 anthony Exp $ # # Version 0.3 # # default. override with -d cmdline option CVSROOT=":ext:devhost1.off.ekorp.com:/export/00/cvsroot" # default. override with -R cmdline option ADMINREPOS="vendor_branch_admin" # default. override with -t cmdline option TMPDIR="/tmp" # You might need to change these. GNUTAR="tar" UNZIP="unzip" PACKAGES_FILE="package_names_db" VERSIONS_FILE="vendor_versions_db" import os, sys, re def Debug(msg): sys.stderr.write(msg+'\n') def Error(msg): sys.stderr.write("Error: "+msg+'\n') def Fatal(msg): sys.stderr.write("Fatal: "+msg+'\n') sys.exit(1) def System(cmd): Debug("CMD: %s"%cmd) ret = os.system(cmd) if ret != 0: Fatal("Command %s returned %d"%(cmd, ret)) def OpenCVSFile(filename): CMD="cvs -d %s co -p %s"%(CVSROOT, filename) return os.popen(CMD, 'r') def FindDBEntry(filename): pkgfile=OpenCVSFile(os.path.join(ADMINREPOS,PACKAGES_FILE)) for line in pkgfile: line = line.strip() # skip comments, blank lines if not line[0] or line[0] == '#': continue els = line.split(':') if len(els) != 5: Error( "Malformed line: %s"%line ) else: matchRE,vendor,package,repos,versionRE = els if re.match(matchRE, filename): m = re.match(versionRE,filename) if m: version = m.group('version') else: Fatal( "%s does not match RE %s"%(filename,versionRE) ) return vendor,package,repos,version def FindPreviousVersion(pkg): "Find the previously checked in version of the file" versfile=OpenCVSFile(os.path.join(ADMINREPOS,VERSIONS_FILE)) versions=versfile.readlines() versions.reverse() for item in versions: ipkg,ivers = item.split() if ipkg == pkg: return ivers return None def AddVersionDBEntry(pkg, versiontag): cwd = os.getcwd() updatedir = "admin_update_%s%s"%(pkg,os.getpid()) os.chdir(TMPDIR) System("cvs -Q -d %s co -d %s %s"%(CVSROOT, updatedir, ADMINREPOS)) os.chdir(updatedir) admin = open(VERSIONS_FILE, 'a') admin.write("%s %s\n"%(pkg, versiontag)) admin.close() System("cvs -Q com -m 'added %s %s' %s"%(pkg,versiontag,VERSIONS_FILE)) os.chdir('..') System("rm -rf %s"%updatedir) os.chdir(cwd) Unpackers = { '.tar.gz':'tar xzf', '.tgz':'tar xzf', '.tar.bz2':'tar xjf', '.tar.Z':'tar xZf', '.tar': 'tar xf', '.zip':'unzip' } def FindUnpackCommand(filename): for k in Unpackers.keys(): if filename.endswith(k): return Unpackers[k] Fatal("Couldn't work out how to unpack %s - add an entry to Unpackers"% filename) def main(): # parse options filename = sys.argv[1] # find correct entry in DB ret = FindDBEntry(os.path.basename(filename)) if not ret: Fatal( "No matching DB entry for %s"%filename ) vendor,pkg,repos,version = ret Debug("PKG: %s VERS: %s VENDOR: %s REPOS: %s"%(pkg,version,vendor,repos)) version = 'v'+re.sub("[\$,\.:;@ \t]","_", version) Debug("Version tag will be %s"%version) # find previous entry in DB prevVersion = FindPreviousVersion(pkg) print "previous version is %s"%prevVersion if not prevVersion: Debug("No previous entry in version DB, using vendor tag %s"%vendor) else: if version == prevVersion: Fatal("prev == new, duplicate merge? bailing out.") Debug("Previous version is %s, will do merge"%prevVersion) if not os.path.isdir(TMPDIR): Fatal("temp directory %s does not exist!"%TMPDIR) os.chdir(TMPDIR) cmd = FindUnpackCommand(filename) if not cmd: Fatal("Don't know how to unpack %s"%filename) mergedir = os.path.join(TMPDIR, "merge_%s_%s"%(pkg,os.getpid())) os.mkdir(mergedir) os.chdir(mergedir) Debug("Unpacking in %s"%mergedir) System("%s %s"%(cmd, filename)) contents = os.listdir('.') if len(contents) != 1: Fatal( "Unpacking should create a single directory in %s, not %d"%( mergedir, len(contents)) ) unpackdir = contents[0] if not os.path.isdir(unpackdir): Fatal( "Unpacking should create a single directory in %s"%(mergedir) ) os.chdir(unpackdir) System("cvs -d %s -Q import -m 'import of %s, %s' -ko %s %s %s"% (CVSROOT, pkg, version, repos, vendor, version) ) os.chdir('..') System("rm -rf %s"%unpackdir) if not prevVersion: AddVersionDBEntry(pkg, vendor) sys.exit(0) mergedir = "merge_%s_%d"%(pkg,os.getpid()) System("cvs -Q -d %s co -d %s -j %s -j %s %s"%( CVSROOT,mergedir,prevVersion,version,repos)) AddVersionDBEntry(pkg, version) os.chdir(mergedir) Debug("Merging in %s"%os.getcwd()) System("cvs -q commit -m 'merging %s -> %s'"%(prevVersion,version)) # More here - if there's conflicts, the previous should bounce. if __name__ == "__main__": main()