]> thyrsus.com Git - src.git/commitdiff
Refactor so the parser moves to the back end.
authorEric S. Raymond <esr@thyrsus.com>
Mon, 10 Nov 2014 05:31:26 +0000 (00:31 -0500)
committerEric S. Raymond <esr@thyrsus.com>
Mon, 10 Nov 2014 05:31:26 +0000 (00:31 -0500)
src

diff --git a/src b/src
index 5e29cdd84b682bbae0a33f744e53c4dde7577bf1..6def8369c6439c9b96af7d020f597833f9903c82 100755 (executable)
--- 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:])