From: Eric S. Raymond Date: Fri, 13 Jul 2007 13:35:11 +0000 (+0000) Subject: This version restores files properly. X-Git-Tag: 1.4~8 X-Git-Url: http://thyrsus.com/gitweb/?a=commitdiff_plain;h=8887ebf64e28235f579c31c10b62c399c22358eb;p=sccs2rcs.git This version restores files properly. --- diff --git a/sccs2rcs b/sccs2rcs index a697e75..4479f58 100755 --- a/sccs2rcs +++ b/sccs2rcs @@ -99,9 +99,19 @@ months = ("Jan","Feb","Mar","Apr","May","Jun", def writeable(f): return os.access(f, os.W_OK) -def sccsfile(f): +def sccsmaster(f): return os.path.join("SCCS", "s." + f) +def is_sccsmaster(f): + return os.path.basename(f).startswith("s.") + +def workfile(f): + assert os.path.basename(f).startswith("s.") + return os.path.basename(f)[2:] + +def rcsfile(f): + return os.path.join("RCS", f + ",v") + def progress(msg): global logtext msg = "sccs2rcs: " + msg @@ -118,9 +128,9 @@ def get_output(command): def die(msg): print >>sys.stderr, "sccs2rcs: fatal error, ", msg progress("error recovery begins") - for filename in os.listdir("."): - if os.path.exists(sccsfile(filename)) and writeable(filename): - get_output("unget " + sccsfile(filename)) + for master in os.listdir("SCCS"): + if is_sccsmaster(master): + get_output("unget " + master) print >>sys.stderr, """\ Danger! Danger! Incomplete history in ./RCS -- remove it. @@ -194,26 +204,31 @@ if __name__ == '__main__': os.environ["PATH"] += ":/usr/lib/cssc" # Loop over every s-file in SCCS dir - for sfile in filter(lambda f: f.startswith("s."), os.listdir("SCCS")): - file = sfile[2:] + workfiles = [] + for master in filter(lambda f: f.startswith("s."), os.listdir("SCCS")): + stem = master[2:] firsttime = True + # These are the files we'll need to restore later + if os.path.exists(stem): + workfiles.append(stem) + # Extract a list of revisions from the master revisions = [] try: - for line in os.popen("prs " + sccsfile(file), "r"): + for line in os.popen("prs " + sccsmaster(stem), "r"): if line.startswith("D "): revisions.append(line.split()[1]) except OSError: - die("open of master file %s failed" % sfile) + die("open of master file %s failed" % master) except IndexError: - die("garbled revision line in master file " + sfile) + die("garbled revision line in master file " + master) revisions.reverse() # Now use prs to run through the revision list extracting data - progress("%s revisions: %s" % (file, ", ".join(revisions))) + progress("%s revisions: %s" % (stem, ", ".join(revisions))) for rev in revisions: - cmd = 'prs -d":Dd: :Dm: :Dy: :T: :P:" -r%s SCCS/s.%s' % (rev, file) + cmd = 'prs -d":Dd: :Dm: :Dy: :T: :P:" -r%s SCCS/s.%s' % (rev, stem) date = get_output_or_die(cmd).strip() try: (day, month, year, tod, author) = date.split() @@ -229,19 +244,19 @@ if __name__ == '__main__': rcsdate = day + " " + months[int(month)] + " " + year + " " + tod progress("==> file %s, rev=%s, date=%s, author=%s" \ - % (file, rev, rcsdate, author)) - get_output_or_die("get -e -r%s SCCS/s.%s" % (rev, file)) + % (stem, rev, rcsdate, author)) + get_output_or_die("get -e -r%s SCCS/s.%s" % (rev, stem)) progress("checked out of SCCS") # replace SCCS keywords with RCS keywords try: - rfp = open(file, "r") - filetext = rfp.read() + rfp = open(stem, "r") + stemtext = rfp.read() rfp.close() for (regexp, rcskey) in conversions: - filetext = regexp.sub(rcskey, filetext) - wfp = open(file, "w") - wfp.write(filetext) + stemtext = regexp.sub(rcskey, stemtext) + wfp = open(stem, "w") + wfp.write(stemtext) wfp.close() except OSError: die("keyword substitution failed") @@ -250,14 +265,14 @@ if __name__ == '__main__': # check file into RCS if firsttime: firsttime = False - if file in initstrings: + if filename in initstrings: cmd = 'ci -f -r%s -d"%s" -w%s -t-%s %s' \ - % (rev, rcsdate, author, initstrings[file], file) + % (rev, rcsdate, author, initstrings[filename], stem) else: if initstrings: - warn("no description for %s in comments file" % file) + warn("no description for %s in comments file" % stem) cmd = 'ci -f -r%s -d"%s" -w%s -t/dev/null %s' \ - % (rev, rcsdate, author, file) + % (rev, rcsdate, author, stem) cmd = "echo 'Initial revision.' | " + cmd get_output_or_die(cmd) progress("initial checkin successful") @@ -267,21 +282,21 @@ if __name__ == '__main__': lckrev = ".".join(revparts[:-1]) if re.match(r"[0-9]+\."): # need to lock the branch -- it is OK if the lock fails - get_output("rcs -l%s %s" % (lckrev, file)) + get_output("rcs -l%s %s" % (lckrev, stem)) progress("got branch lock") else: # need to lock the trunk -- must succeed - get_output_or_die("rcs -l %s" % (file,)) + get_output_or_die("rcs -l %s" % (stem,)) progress("got trunk lock") # Extract the delta message for this revision - deltamsg = get_output_or_die("prs -r$rev SCCS/s.$file") + deltamsg = get_output_or_die("prs -r$rev SCCS/s.%s" % stem) deltalines = deltamsg.split("\n") while deltalines: deltalines.pop(0) if deltalines[0].startswith("COMMENTS"): break deltamsg = deltalines.join("\n") - cmd = 'ci -f -r%s -d"%s" -w%s %s' % (rev, date, author, file) + cmd = 'ci -f -r%s -d"%s" -w%s %s' % (rev, date, author, stem) # FIXME: output of this command isn't logged progress("$ " + cmd) try: @@ -291,14 +306,13 @@ if __name__ == '__main__': except OSError: die("RCS checkin of delta failed") # We're done - logtext += get_output_or_die("unget " + sccsfile(file)) + logtext += get_output_or_die("unget " + sccsmaster(stem)) # Replace all files for which there exist SCCS masters, - progress("replacing workfiles") - for filename in os.listdir("."): - if os.path.exists(sccsfile(filename)): - os.remove(filename) - os.system("co " + file) + progress("replacing workfiles...") + for filename in os.listdir("SCCS"): + if is_sccsmaster(master): + get_output("co " + rcsfile(workfile(master))) progress("done.") # sccs2rcs ends here