% (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))
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):
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
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
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:])