From: Eric S. Raymond Date: Mon, 10 Nov 2014 05:31:26 +0000 (-0500) Subject: Refactor so the parser moves to the back end. X-Git-Tag: 0.4~25 X-Git-Url: http://thyrsus.com/gitweb/?a=commitdiff_plain;h=575155b14ecb73fb0654d16c924ce19e21c8e090;p=src.git Refactor so the parser moves to the back end. --- diff --git a/src b/src index 5e29cdd..6def836 100755 --- a/src +++ b/src @@ -98,6 +98,8 @@ class popen_or_die: % (self.command, self.legend, oe)) def __exit__(self, extype, value, traceback_unused): if extype: + if debug > 0: + raise extype(value) croak(b"fatal exception in popen_or_die.") if self.fp.close() is not None: croak(b"%s%s returned error." % (self.command, self.legend)) @@ -141,88 +143,7 @@ class History: self.delimiter = None if not os.path.exists(backend.master(self.name)): croak("%s is not registered" % self.name) - with popen_or_die("cd %s >/dev/null; rlog %s 2>/dev/null; cd ..>/dev/null" % (repodir, name)) as fp: - self.revlist = [] - self.lockrevs = [] - maxrevno = 0 - if debug >= DEBUG_PARSE: - sys.stderr.write("\t-> init\n") - state = "init" - for line in fp: - if debug >= DEBUG_PARSE: - sys.stderr.write("in: %s\n" % repr(line)) - if state == "init": - if line.startswith("locks:"): - if debug >= DEBUG_PARSE: - sys.stderr.write("\t-> locks\n") - state = "locks" - elif line.startswith("symbolic names:"): - if debug >= DEBUG_PARSE: - sys.stderr.write("\t-> symbols\n") - state = "symbols" - elif line.startswith("branch:"): - if not line.strip()[7:]: - self.branch = "trunk" - else: - croak("non-trunk branches are not yet supported.") - elif line.startswith("----------------------------"): - if debug >= DEBUG_PARSE: - sys.stderr.write("\t-> logheader\n") - state = "logheader" - self.revlist.append(RCSRevisionItem(self, maxrevno)) - self.delimiter = line - maxrevno += 1 - elif state == "locks": - if not line[0].isspace(): - if debug >= DEBUG_PARSE: - sys.stderr.write("\t-> init\n") - state = "init" - else: - fields = line.strip().split() - self.lockrevs.append(fields[1]) - elif state == "symbols": - if not line[0].isspace(): - if debug >= DEBUG_PARSE: - sys.stderr.write("\t-> init\n") - state = "init" - else: - fields = line.strip().split() - name = fields[0] - if name.endswith(":"): - name = name[:-1] - rev = fields[1] - self.symbols[name] = rev - elif state == "logheader": - if line.startswith("revision"): - fields = line.split() - self.revlist[-1].revision = fields[1] - elif line.startswith("----------------------------"): - self.revlist.append(RCSRevisionItem(self, maxrevno)) - maxrevno += 1 - elif line.startswith("date"): - fields = line.split() - if pseudotime: - # Artificial date one day after the epoch - # to avoid timezone issues. - date = rfc3339(86400 + len(self) * 60) - else: - date = fields[1] + " " + fields[2] - if date.endswith(";"): - date = date[:-1] - date = date.replace("/","-").replace(" ","T") + "Z" - self.revlist[-1].date = date - elif line.startswith("======================="): - if not self.revlist[-1].log.endswith("\n"): - self.revlist[-1].log += "\n" - break - elif self.revlist: - self.revlist[-1].log += line - for item in self.revlist: - item.revno = maxrevno - item.revno - if debug >= DEBUG_PARSE: - print "\t%d revisions" % len(self) - print "\tlockrevs:", self.lockrevs - print "\tsymbols:", self.symbols + backend.parse(self) def __len__(self): return len(self.revlist) def __getitem__(self, i): @@ -235,7 +156,7 @@ class History: def tip(self): return self.revlist[0] def rcs_to_revno(self, revision): - "Map an RCS ID to a revno" + "Map a native ID to a revno" for item in self.revlist: if item.revision == revision: return item.revno @@ -247,7 +168,7 @@ class History: return item croak("{0} has no revno {1}".format(self.name, revno)) def revno_to_rcs(self, revno): - "Map a revno to an RCS ID" + "Map a revno to a native ID" for item in self.revlist: if item.revno == revno: return item.revision @@ -1004,6 +925,91 @@ class RCS: def release(self, arg): "Release locks." do_or_die("rcs -q -u {0},v".format(arg)) + def parse(self, metadata): + "Get and parse the RCS log output for this file." + with popen_or_die("cd %s >/dev/null; rlog %s 2>/dev/null; cd ..>/dev/null" % (repodir, metadata.name)) as fp: + metadata.revlist = [] + metadata.lockrevs = [] + maxrevno = 0 + if debug >= DEBUG_PARSE: + sys.stderr.write("\t-> init\n") + state = "init" + for line in fp: + if debug >= DEBUG_PARSE: + sys.stderr.write("in: %s\n" % repr(line)) + if state == "init": + if line.startswith("locks:"): + if debug >= DEBUG_PARSE: + sys.stderr.write("\t-> locks\n") + state = "locks" + elif line.startswith("symbolic names:"): + if debug >= DEBUG_PARSE: + sys.stderr.write("\t-> symbols\n") + state = "symbols" + elif line.startswith("branch:"): + if not line.strip()[7:]: + metadata.branch = "trunk" + else: + croak("non-trunk branches are not yet supported.") + elif line.startswith("----------------------------"): + if debug >= DEBUG_PARSE: + sys.stderr.write("\t-> logheader\n") + state = "logheader" + metadata.revlist.append(RCSRevisionItem(metadata, maxrevno)) + metadata.delimiter = line + maxrevno += 1 + elif state == "locks": + if not line[0].isspace(): + if debug >= DEBUG_PARSE: + sys.stderr.write("\t-> init\n") + state = "init" + else: + fields = line.strip().split() + metadata.lockrevs.append(fields[1]) + elif state == "symbols": + if not line[0].isspace(): + if debug >= DEBUG_PARSE: + sys.stderr.write("\t-> init\n") + state = "init" + else: + fields = line.strip().split() + name = fields[0] + if name.endswith(":"): + name = name[:-1] + rev = fields[1] + metadata.symbols[name] = rev + elif state == "logheader": + if line.startswith("revision"): + fields = line.split() + metadata.revlist[-1].revision = fields[1] + elif line.startswith("----------------------------"): + metadata.revlist.append(RCSRevisionItem(metadata, maxrevno)) + maxrevno += 1 + elif line.startswith("date"): + fields = line.split() + if pseudotime: + # Artificial date one day after the epoch + # to avoid timezone issues. + date = rfc3339(86400 + len(metadata.revlist) * 60) + else: + date = fields[1] + " " + fields[2] + if date.endswith(";"): + date = date[:-1] + date = date.replace("/","-").replace(" ","T") + "Z" + metadata.revlist[-1].date = date + elif line.startswith("======================="): + if not metadata.revlist[-1].log.endswith("\n"): + metadata.revlist[-1].log += "\n" + break + elif metadata.revlist: + metadata.revlist[-1].log += line + for item in metadata.revlist: + item.revno = maxrevno - item.revno + if debug >= DEBUG_PARSE: + print "\t%d revisions" % len(metadata.revlist) + print "\tlockrevs:", metadata.lockrevs + print "\tsymbols:", metadata.symbols + if __name__ == "__main__": command = list(sys.argv[1:])