diff options
-rwxr-xr-x | bin/repoman | 233 | ||||
-rw-r--r-- | pym/portage/sets/libs.py | 8 | ||||
-rw-r--r-- | pym/repoman/utilities.py | 21 |
3 files changed, 187 insertions, 75 deletions
diff --git a/bin/repoman b/bin/repoman index ad487fd8b..953e4d88e 100755 --- a/bin/repoman +++ b/bin/repoman @@ -421,12 +421,13 @@ if options.mode in ('last', 'lfull'): can_force = True -isCvs=False -myreporoot=None +vcs = None if os.path.isdir("CVS"): - isCvs = True + vcs = "cvs" +if os.path.isdir(".svn"): + vcs = "svn" -if isCvs and \ +if vcs == "cvs" and \ "commit" == options.mode and \ "RMD160" not in portage.checksum.hashorigin_map: from portage.util import grablines @@ -444,8 +445,8 @@ if isCvs and \ sys.exit(1) del repo_lines -if options.mode == 'commit' and not options.pretend and not isCvs: - logging.info("Not in a CVS repository; enabling pretend mode.") +if options.mode == 'commit' and not options.pretend and not vcs: + logging.info("Not in a version controlled repository; enabling pretend mode.") options.pretend = True try: @@ -488,7 +489,7 @@ repolevel = len(reposplit) # Reason for this is if they're trying to commit in just $FILESDIR/*, the Manifest needs updating. # this check ensures that repoman knows where it is, and the manifest recommit is at least possible. if options.mode == 'commit' and repolevel not in [1,2,3]: - print red("***")+" Commit attempts *must* be from within a cvs co, category, or package directory." + print red("***")+" Commit attempts *must* be from within a vcs co, category, or package directory." print red("***")+" Attempting to commit from a packages files directory will be blocked for instance." print red("***")+" This is intended behaviour, to ensure the manifest is recommited for a package." print red("***") @@ -694,8 +695,8 @@ else: #this can be problematic if xmllint changes their output xmllint_capable=True -if options.mode == 'commit' and isCvs: - utilities.detect_vcs_conflicts(options, vcs="cvs") +if options.mode == 'commit' and vcs: + utilities.detect_vcs_conflicts(options, vcs) if options.mode == "manifest": pass @@ -705,7 +706,7 @@ else: print green("\nRepoMan scours the neighborhood...") new_ebuilds = set() -if isCvs: +if vcs == "cvs": mycvstree = cvstree.getentries("./", recursive=1) mynew = cvstree.findnew(mycvstree, recursive=1, basedir="./") new_ebuilds.update(x for x in mynew if x.endswith(".ebuild")) @@ -812,40 +813,86 @@ for x in scanlist: if not os.path.isdir(os.path.join(checkdir, "files")): has_filesdir = False - if isCvs: + if vcs: try: - myf=open(checkdir+"/CVS/Entries","r") - myl=myf.readlines() + if vcs == "cvs": + myf=open(checkdir+"/CVS/Entries","r") + if vcs == "svn": + myf=os.popen("svn list") + myl=myf.readlines() + myf.close() for l in myl: - if l[0]!="/": - continue - splitl=l[1:].split("/") - if not len(splitl): - continue - if splitl[0][-7:]==".ebuild": - eadded.append(splitl[0][:-7]) + if vcs == "cvs": + if l[0]!="/": + continue + splitl=l[1:].split("/") + if not len(splitl): + continue + if splitl[0][-7:]==".ebuild": + eadded.append(splitl[0][:-7]) + if vcs == "svn": + l = l.rstrip(); + if l[-1:] == "/": + continue + if l[-7:] == ".ebuild": + eadded.append(l[:-7]) + if vcs == "svn": + myf=os.popen("svn status") + myl=myf.readlines() + myf.close() + for l in myl: + if l[0] == "A": + l = l.rstrip().split(' ')[-1] + if l[-7:] == ".ebuild": + eadded.append(l[:-7]) except IOError: - if options.mode == 'commit': + if options.mode == 'commit' and vcs == "cvs": stats["CVS/Entries.IO_error"] += 1 fails["CVS/Entries.IO_error"].append(checkdir+"/CVS/Entries") + if options.mode == 'commit' and vcs == "svn": + stats["svn.IO_error"] += 1 + fails["svn.IO_error"].append(checkdir+"svn info") continue - if isCvs and has_filesdir: + if vcs and has_filesdir: try: - myf=open(checkdir+"/files/CVS/Entries","r") + if vcs == "cvs": + myf=open(checkdir+"/files/CVS/Entries","r") + if vcs == "svn": + myf=os.popen("svn list "+os.path.normpath(checkdir+"/files")) myl=myf.readlines() + myf.close() for l in myl: - if l[0]!="/": - continue - splitl=l[1:].split("/") - if not len(splitl): - continue - if splitl[0][:7]=="digest-": - dadded.append(splitl[0][7:]) + if vcs == "cvs": + if l[0]!="/": + continue + splitl=l[1:].split("/") + if not len(splitl): + continue + if splitl[0][:7]=="digest-": + dadded.append(splitl[0][7:]) + if vcs == "svn": + l = l.rstrip(); + if l[-1:] == "/": + continue + if l[:7] == "digest-": + dadded.append(l[7:]) + if vcs == "svn": + myf=os.popen("svn status "+os.path.normpath(checkdir+"/files")) + myl=myf.readlines() + myf.close() + for l in myl: + if l[0] == "A": + l = l.rstrip().split(' ')[-1] + if l[:7] == "digest-": + dadded.append(l[7:]) except IOError: - if options.mode == 'commit': + if options.mode == 'commit' and vcs == "cvs": stats["CVS/Entries.IO_error"] += 1 fails["CVS/Entries.IO_error"].append(checkdir+"/files/CVS/Entries") + if options.mode == 'commit' and vcs == "svn": + stats["svn.IO_error"] += 1 + fails["svn.IO_error"].append(checkdir+"/files svn info") continue mf = Manifest(checkdir, repoman_settings["DISTDIR"]) @@ -900,10 +947,11 @@ for x in scanlist: else: raise oe if S_ISDIR(mystat.st_mode): - if y == "CVS": + # !!! VCS "portability" alert! Need some function isVcsDir() or alike !!! + if y == "CVS" or y == ".svn": continue for z in os.listdir(checkdir+"/files/"+y): - if z == "CVS": + if z == "CVS" or z == ".svn": continue filesdirlist.append(y+"/"+z) # current policy is no files over 20k, this is the check. @@ -968,8 +1016,8 @@ for x in scanlist: if stat.S_IMODE(os.stat(full_path).st_mode) & 0111: stats["file.executable"] += 1 fails["file.executable"].append(x+"/"+y+".ebuild") - if isCvs and y not in eadded: - #ebuild not added to cvs + if vcs and y not in eadded: + #ebuild not added to vcs stats["ebuild.notadded"]=stats["ebuild.notadded"]+1 fails["ebuild.notadded"].append(x+"/"+y+".ebuild") if y in dadded: @@ -1511,12 +1559,23 @@ else: if options.pretend: print green("RepoMan sez:"), "\"So, you want to play it safe. Good call.\"\n" - mycvstree=portage.cvstree.getentries("./",recursive=1) - if isCvs and not mycvstree: - print "!!! It seems we don't have a cvs tree?" - sys.exit(3) + if vcs == "cvs": + try: + myvcstree=portage.cvstree.getentries("./",recursive=1) + myunadded=portage.cvstree.findunadded(myvcstree,recursive=1,basedir="./") + except SystemExit, e: + raise # TODO propogate this + except: + err("Error retrieving CVS tree; exiting.") - myunadded=portage.cvstree.findunadded(mycvstree,recursive=1,basedir="./") + if vcs == "svn": + try: + svnstatus=os.popen("svn status").readlines() + myunadded = [ "./"+elem.rstrip().split()[1] for elem in svnstatus if elem.startswith("?") ] + except SystemExit, e: + raise # TODO propogate this + except: + err("Error retrieving SVN info; exiting.") myautoadd=[] if myunadded: for x in range(len(myunadded)-1,-1,-1): @@ -1540,24 +1599,30 @@ else: if myautoadd: print ">>> Auto-Adding missing digests..." if options.pretend: - print "(/usr/bin/cvs add "+" ".join(myautoadd)+")" + if vcs == "cvs": + print "(cvs add "+" ".join(myautoadd)+")" + if vcs == "svn": + print "(svn add "+" ".join(myautoadd)+")" retval=0 else: - retval=os.system("/usr/bin/cvs add "+" ".join(myautoadd)) + if vcs == "cvs": + retval=os.system("cvs add "+" ".join(myautoadd)) + if vcs == "svn": + retval=os.system("svn add "+" ".join(myautoadd)) if retval: - print "!!! Exiting on cvs (shell) error code:",retval + print "!!! Exiting on vcs (shell) error code:",retval sys.exit(retval) if myunadded: - print red("!!! The following files are in your cvs tree but are not added to the master") - print red("!!! tree. Please remove them from the cvs tree or add them to the master tree.") + print red("!!! The following files are in your local tree but are not added to the master") + print red("!!! tree. Please remove them from the local tree or add them to the master tree.") for x in myunadded: print " ",x print print sys.exit(1) - if isCvs: + if vcs == "cvs": mycvstree=portage.cvstree.getentries("./",recursive=1) mychanged=portage.cvstree.findchanged(mycvstree,recursive=1,basedir="./") mynew=portage.cvstree.findnew(mycvstree,recursive=1,basedir="./") @@ -1566,6 +1631,18 @@ else: bin_blobs = set(portage.cvstree.findoption(mycvstree, bin_blob_pattern, recursive=1, basedir="./")) + + if vcs == "svn": + svnstatus = os.popen("svn status").readlines() + mychanged = [ elem.rstrip()[7:] for elem in svnstatus if elem.startswith("M") ] + for manifest in [ file for file in mychanged if '/Manifest' in file ]: + mychanged.remove(manifest) + mynew = [ elem.rstrip()[7:] for elem in svnstatus if elem.startswith("A") ] + myremoved = [ elem.rstrip()[7:] for elem in svnstatus if elem.startswith("D") ] + # no idea how to detect binaries in SVN + bin_blobs = [] + + if vcs: if not (mychanged or mynew or myremoved): print green("RepoMan sez:"), "\"Doing nothing is not always good for QA.\"" print @@ -1575,18 +1652,18 @@ else: # Manifests need to be regenerated after all other commits, so don't commit # them now even if they have changed. - mymanifests = [f for f in mychanged if 'Manifest' == os.path.basename(f)] - mychanged = [f for f in mychanged if 'Manifest' != os.path.basename(f)] - myupdates=mychanged+mynew - myheaders=[] - mydirty=[] - headerstring="'\$(Header|Id)" - headerstring+=".*\$'" + mymanifests = [f for f in mychanged if "Manifest" == os.path.basename(f)] + mychanged = [f for f in mychanged if "Manifest" != os.path.basename(f)] + myupdates = mychanged + mynew + myheaders = [] + mydirty = [] + headerstring = "'\$(Header|Id)" + headerstring += ".*\$'" for myfile in myupdates: if myfile in bin_blobs: continue myout = commands.getstatusoutput("egrep -q "+headerstring+" "+myfile) - if myout[0]==0: + if myout[0] == 0: myheaders.append(myfile) print "*",green(str(len(myupdates))),"files being committed...",green(str(len(myheaders))),"have headers that will change." @@ -1627,7 +1704,8 @@ else: sys.stderr.write("Failed to insert portage version in message!\n") sys.stderr.flush() portage_version = "Unknown" - commitmessage += "\n(Portage version: "+str(portage_version) + unameout = commands.getstatusoutput("uname -srp")[1] + commitmessage+="\n(Portage version: "+str(portage_version)+"/"+vcs+"/"+unameout if options.force: commitmessage += ", RepoMan options: --force" commitmessage += ")" @@ -1648,12 +1726,21 @@ else: retval = None if options.pretend: - print "(/usr/bin/cvs -q commit -F %s %s)" % \ - (commitmessagefile, " ".join(myfiles)) + if vcs == "cvs": + print "(cvs -q commit -F %s %s)" % \ + (commitmessagefile, " ".join(myfiles)) + if vcs == "svn": + print "(svn commit -F %s %s)" % \ + (commitmessagefile, " ".join(myfiles)) else: - retval = spawn(["/usr/bin/cvs", "-q", "commit", - "-F", commitmessagefile] + myfiles, - env=os.environ) + if vcs == "cvs": + retval = spawn(["cvs", "-q", "commit", + "-F", commitmessagefile] + myfiles, + env=os.environ) + if vcs == "svn": + retval = spawn(["svn", "commit", + "-F", commitmessagefile] + myfiles, + env=os.environ) try: os.unlink(commitmessagefile) except OSError: @@ -1759,14 +1846,20 @@ else: # Force an unsigned commit when more than one Manifest needs to be signed. if repolevel < 3 and "sign" in repoman_settings.features: if options.pretend: - print "(/usr/bin/cvs -q commit -F commitmessagefile)" + if vcs == "cvs": + print "(cvs -q commit -F commitmessagefile)" + if vcs == "svn": + print "(svn -q commit -F commitmessagefile)" else: fd, commitmessagefile = tempfile.mkstemp(".repoman.msg") mymsg = os.fdopen(fd, "w") mymsg.write(commitmessage) mymsg.write("\n (Unsigned Manifest commit)") mymsg.close() - retval=os.system("/usr/bin/cvs -q commit -F "+commitmessagefile) + if vcs == "cvs": + retval=os.system("cvs -q commit -F "+commitmessagefile) + if vcs == "svn": + retval=os.system("svn -q commit -F "+commitmessagefile) try: os.unlink(commitmessagefile) except OSError: @@ -1822,7 +1915,10 @@ else: if manifest_commit_required or signed: if options.pretend: - print "(/usr/bin/cvs -q commit -F commitmessagefile)" + if vcs == "cvs": + print "(cvs -q commit -F commitmessagefile)" + if vcs == "svn": + print "(svn -q commit -F commitmessagefile)" else: fd, commitmessagefile = tempfile.mkstemp(".repoman.msg") mymsg = os.fdopen(fd, "w") @@ -1832,7 +1928,10 @@ else: else: mymsg.write("\n (Unsigned Manifest commit)") mymsg.close() - retval=os.system("/usr/bin/cvs -q commit -F "+commitmessagefile) + if vcs == "cvs": + retval=os.system("cvs -q commit -F "+commitmessagefile) + if vcs == "svn": + retval=os.system("svn -q commit -F "+commitmessagefile) try: os.unlink(commitmessagefile) except OSError: @@ -1842,10 +1941,10 @@ else: sys.exit(retval) print - if isCvs: - print "CVS commit complete." + if vcs: + print "Commit complete." else: - print "repoman was too scared by not seeing any familiar cvs file that he forgot to commit anything" + print "repoman was too scared by not seeing any familiar version control file that he forgot to commit anything" print green("RepoMan sez:"), "\"If everyone were like you, I'd be out of business!\"\n" sys.exit(0) diff --git a/pym/portage/sets/libs.py b/pym/portage/sets/libs.py index 4ab8a33fe..8159cc35f 100644 --- a/pym/portage/sets/libs.py +++ b/pym/portage/sets/libs.py @@ -37,7 +37,11 @@ class PreservedLibraryConsumerSet(LibraryConsumerSet): if reg: for libs in reg.getPreservedLibs().values(): for lib in libs: - #print lib, self.dbapi.linkmap.findConsumers(lib) + if self.debug: + print lib + for x in sorted(self.dbapi.linkmap.findConsumers(lib)): + print " ", x + print "-"*40 consumers.update(self.dbapi.linkmap.findConsumers(lib)) else: return @@ -46,5 +50,5 @@ class PreservedLibraryConsumerSet(LibraryConsumerSet): self._setAtoms(self.mapPathsToAtoms(consumers)) def singleBuilder(cls, options, settings, trees): - return PreservedLibraryConsumerSet(trees["vartree"].dbapi) + return PreservedLibraryConsumerSet(trees["vartree"].dbapi, True) singleBuilder = classmethod(singleBuilder) diff --git a/pym/repoman/utilities.py b/pym/repoman/utilities.py index 7666ba5d6..28df593cf 100644 --- a/pym/repoman/utilities.py +++ b/pym/repoman/utilities.py @@ -42,30 +42,39 @@ def detect_vcs_conflicts(options, vcs): retval = commands.getstatusoutput("cvs -n up 2>&1 | " + \ "egrep '^[^\?] .*' | " + \ "egrep -v '^. .*/digest-[^/]+|^cvs server: .* -- ignored$'") + if vcs == 'svn': + logging.info("Performing a " + output.green("svn status -u") + \ + " with a little magic grep to check for updates.") + retval = commands.getstatusoutput("svn status -u 2>&1 | " + \ + "egrep -v '^. +.*/digest-[^/]+' | " + \ + "head -n-1") + if vcs in ['cvs', 'svn']: mylines = retval[1].splitlines() myupdates = [] for line in mylines: if not line: continue - if line[0] not in "UPMAR": # Updates,Patches,Modified,Added,Removed + if line[0] not in "UPMARD": # Updates,Patches,Modified,Added,Removed/Replaced(svn),Deleted(svn) logging.error(red("!!! Please fix the following issues reported " + \ - "from cvs: ")+green("(U,P,M,A,R are ok)")) + "from cvs: ")+green("(U,P,M,A,R,D are ok)")) logging.error(red("!!! Note: This is a pretend/no-modify pass...")) logging.error(retval[1]) sys.exit(1) - elif line[0] in "UP": + elif vcs == 'cvs' and line[0] in "UP": myupdates.append(line[2:]) + elif vcs == 'svn' and line[8] == '*': + myupdates.append(line[9:].lstrip(" 1234567890")) if myupdates: logging.info(green("Fetching trivial updates...")) if options.pretend: - logging.info("(cvs up "+" ".join(myupdates)+")") + logging.info("(" + vcs + " update " + " ".join(myupdates) + ")") retval = os.EX_OK else: - retval = os.system("cvs up " + " ".join(myupdates)) + retval = os.system(vcs + " update " + " ".join(myupdates)) if retval != os.EX_OK: - logging.fatal("!!! cvs exited with an error. Terminating.") + logging.fatal("!!! " + cvs + " exited with an error. Terminating.") sys.exit(retval) |