def runTest(self): self.assert_(os.path.isfile(self.filename + ',v')) recorder = RCSRecorder() f = open(self.filename + ',v', 'rb') try: parse(f, recorder) finally: f.close() v2 = recorder.texts['1.2'] self.assertEqual(v2, self.v2) delta = recorder.texts['1.1'] s = RCSStream(v2) self.assertEqual(s.get_text(), self.v2) invdelta = s.invert_diff(delta) self.assertEqual(s.get_text(), self.v1) delta2 = s.invert_diff(invdelta) self.applyTest(self.v2, delta, self.v1) self.applyTest(self.v1, invdelta, self.v2) if STRICT_INVERSES: self.assertEqual(delta2, delta) elif delta2 != delta: self.applyTest(self.v2, delta2, self.v1)
def get_tag_set(path): class TagCollector(Sink): def __init__(self): self.tags = set() # A map { branch_tuple : name } for branches on which no # revisions have yet been seen: self.branches = {} def define_tag(self, name, revision): revtuple = rev_tuple(revision) if len(revtuple) % 2 == 0: # This is a tag (as opposed to branch) self.tags.add(name) else: self.branches[revtuple] = name def define_revision(self, revision, timestamp, author, state, branches, next): branch = rev_tuple(revision)[:-1] try: del self.branches[branch] except KeyError: pass def get_tags(self): tags = self.tags for branch in self.branches.values(): tags.add(branch) return tags tag_collector = TagCollector() parse(open(path, 'rb'), tag_collector) return tag_collector.get_tags()
def get_tag_set(path): class TagCollector(Sink): def __init__(self): self.tags = set() # A map { branch_tuple : name } for branches on which no # revisions have yet been seen: self.branches = {} def define_tag(self, name, revision): revtuple = rev_tuple(revision) if len(revtuple) % 2 == 0: # This is a tag (as opposed to branch) self.tags.add(name) else: self.branches[revtuple] = name def define_revision( self, revision, timestamp, author, state, branches, next ): branch = rev_tuple(revision)[:-1] try: del self.branches[branch] except KeyError: pass def get_tags(self): tags = self.tags for branch in self.branches.values(): tags.add(branch) return tags tag_collector = TagCollector() parse(open(path, 'rb'), tag_collector) return tag_collector.get_tags()
def main(args): [blobfilename] = args blobfile = open(blobfilename, 'w+b') while True: try: (rcsfile, marks) = pickle.load(sys.stdin) except EOFError: break parse(open(rcsfile, 'rb'), WriteBlobSink(blobfile, marks)) blobfile.close()
def process_file(filename, rev_from, rev_to, force): func = get_transform_func(rev_from, rev_to, force) tmp_filename = filename + '.tmp' infp = open(filename, 'rb') outfp = open(tmp_filename, 'wb') try: writer = WriteRCSFileSink(outfp) revfilter = RenumberingFilter(writer, func) parse(infp, revfilter) finally: outfp.close() infp.close() os.rename(tmp_filename, filename)
def get_branch_tree(path): """Return the forest of branches in path. Return [(branch_revision, [sub_branch, ...]), ...], where branch_revision is a revtuple and sub_branch has the same form as the whole return value. """ class BranchCollector(Sink): def __init__(self): self.branches = {} def define_revision(self, revision, timestamp, author, state, branches, next): parent = rev_tuple(revision)[:-1] if len(parent) == 1: parent = (1, ) entry = self.branches.setdefault(parent, []) for branch in branches: entry.append(rev_tuple(branch)[:-1]) def _get_subbranches(self, parent): retval = [] try: branches = self.branches[parent] except KeyError: return [] del self.branches[parent] for branch in branches: subbranches = self._get_subbranches(branch) retval.append(( branch, subbranches, )) return retval def get_branches(self): retval = self._get_subbranches((1, )) assert not self.branches return retval branch_collector = BranchCollector() f = open(path, 'rb') try: parse(f, branch_collector) finally: f.close() return branch_collector.get_branches()
def get_branch_tree(path): """Return the forest of branches in path. Return [(branch_revision, [sub_branch, ...]), ...], where branch_revision is a revtuple and sub_branch has the same form as the whole return value. """ class BranchCollector(Sink): def __init__(self): self.branches = {} def define_revision( self, revision, timestamp, author, state, branches, next ): parent = rev_tuple(revision)[:-1] if len(parent) == 1: parent = (1,) entry = self.branches.setdefault(parent, []) for branch in branches: entry.append(rev_tuple(branch)[:-1]) def _get_subbranches(self, parent): retval = [] try: branches = self.branches[parent] except KeyError: return [] del self.branches[parent] for branch in branches: subbranches = self._get_subbranches(branch) retval.append((branch, subbranches,)) return retval def get_branches(self): retval = self._get_subbranches((1,)) assert not self.branches return retval branch_collector = BranchCollector() f = open(path, 'rb') try: parse(f, branch_collector) finally: f.close() return branch_collector.get_branches()
def destroy_file(self, filename): tmp_filename = get_tmp_filename() f = open(tmp_filename, 'wb') new_filename = rewrite_filename(filename) parse( open(filename, 'rb'), DestroyerFilterSink( self.author_substituter, self.log_substituter, WriteRCSFileSink(f), )) f.close() # Replace the original file with the new one: assert filename == new_filename or not os.path.exists(new_filename) os.remove(filename) shutil.move(tmp_filename, new_filename)
def destroy_file(self, filename): tmp_filename = get_tmp_filename() f = open(tmp_filename, 'wb') new_filename = rewrite_filename(filename) parse( open(filename, 'rb'), DestroyerFilterSink( self.author_substituter, self.log_substituter, WriteRCSFileSink(f), ) ) f.close() # Replace the original file with the new one: assert filename == new_filename or not os.path.exists(new_filename) os.remove(filename) shutil.move(tmp_filename, new_filename)
def process_file(self, cvs_file_items): """Read revision information for the file described by CVS_FILE_ITEMS. Compute the text record refcounts, discard any records that are unneeded, and store the text records for the file to the _rcs_trees database.""" # A map from cvs_rev_id to TextRecord instance: self.text_record_db = TextRecordDatabase(self._delta_db, NullDatabase()) parse( open(cvs_file_items.cvs_file.rcs_path, 'rb'), _Sink(self, cvs_file_items), ) self.text_record_db.recompute_refcounts(cvs_file_items) self.text_record_db.free_unused() self._rcs_trees[cvs_file_items.cvs_file.id] = self.text_record_db del self.text_record_db
def process_file(self, cvs_file): logger.normal(cvs_file.rcs_path) fdc = _FileDataCollector(self, cvs_file) try: parse(open(cvs_file.rcs_path, 'rb'), fdc) except (RCSParseError, RuntimeError): self.collect_data.record_fatal_error( "%r is not a valid ,v file" % (cvs_file.rcs_path,) ) # Abort the processing of this file, but let the pass continue # with other files: return except ValueError, e: self.collect_data.record_fatal_error( "%r is not a valid ,v file (%s)" % (cvs_file.rcs_path, str(e),) ) # Abort the processing of this file, but let the pass continue # with other files: return
def process_file(self, cvs_file): logger.normal(cvs_file.rcs_path) fdc = _FileDataCollector(self, cvs_file) try: parse(open(cvs_file.rcs_path, 'rb'), fdc) except (RCSParseError, RuntimeError): self.collect_data.record_fatal_error("%r is not a valid ,v file" % (cvs_file.rcs_path, )) # Abort the processing of this file, but let the pass continue # with other files: return except ValueError, e: self.collect_data.record_fatal_error( "%r is not a valid ,v file (%s)" % ( cvs_file.rcs_path, str(e), )) # Abort the processing of this file, but let the pass continue # with other files: return
def admin_completed(self): self.sink.admin_completed() def define_revision(self, revision, timestamp, author, state, branches, next): self.sink.define_revision(revision, timestamp, author, state, branches, next) def tree_completed(self): self.sink.tree_completed() def set_description(self, description): self.sink.set_description(description) def set_revision_info(self, revision, log, text): self.sink.set_revision_info(revision, log, text) def parse_completed(self): self.sink.parse_completed() if __name__ == '__main__': if sys.argv[1:]: for path in sys.argv[1:]: if os.path.isfile(path) and path.endswith(',v'): parse(open(path, 'rb'), WriteRCSFileSink(sys.stdout)) else: sys.stderr.write('%r is being ignored.\n' % path) else: parse(sys.stdin, WriteRCSFileSink(sys.stdout))
) def tree_completed(self): self.sink.tree_completed() def set_description(self, description): self.sink.set_description(description) def set_revision_info(self, revision, log, text): self.sink.set_revision_info(revision, log, text) def parse_completed(self): self.sink.parse_completed() if __name__ == '__main__': if sys.argv[1:]: for path in sys.argv[1:]: if os.path.isfile(path) and path.endswith(',v'): f = open(path, 'rb') try: parse(f, WriteRCSFileSink(sys.stdout)) finally: f.close() else: sys.stderr.write('%r is being ignored.\n' % path) else: parse(sys.stdin, WriteRCSFileSink(sys.stdout))
def filter(self, text): fout = StringIO() sink = WriteRCSFileSink(fout) filter = self.get_filter_sink(sink) parse(StringIO(text), filter) return fout.getvalue()
self, revision, timestamp, author, state, branches, next ): self.sink.define_revision( revision, timestamp, author, state, branches, next ) def tree_completed(self): self.sink.tree_completed() def set_description(self, description): self.sink.set_description(description) def set_revision_info(self, revision, log, text): self.sink.set_revision_info(revision, log, text) def parse_completed(self): self.sink.parse_completed() if __name__ == '__main__': if sys.argv[1:]: for path in sys.argv[1:]: if os.path.isfile(path) and path.endswith(',v'): parse(open(path, 'rb'), WriteRCSFileSink(sys.stdout)) else: sys.stderr.write('%r is being ignored.\n' % path) else: parse(sys.stdin, WriteRCSFileSink(sys.stdout))