def subgraph(graph, repo, version_table, containing_paths): """ Return a subgraph which contains the vertices and edges in containing_paths. """ graph.rep_invariant() small_graph = UpdateGraph() max_index = -1 # Copy edges and indices. for path in containing_paths: for step in path: pair = step[:2] # REDFLAG: copies ALL redundant paths small_graph.edge_table[pair] = graph.edge_table[pair][:] for index in pair: if index not in small_graph.index_table: # Don't need to deep copy because index info is # immutable. (a tuple) small_graph.index_table[index] = graph.index_table[index] max_index = max(max_index, index) small_graph.latest_index = max_index # Fix contiguousness. coalesce_indices(graph, small_graph, repo, version_table) # Invariants should be fixed. small_graph.rep_invariant() graph.rep_invariant() return small_graph
def parse_graph(text): """ Returns a graph parsed from text. text must be in the format used by graph_to_string(). Lines starting with '#' are ignored. """ graph = UpdateGraph() lines = text.split('\n') for line in lines: fields = line.split(':') if fields[0] == 'I': fields.pop(0) try: if len(fields) == 0: raise ValueError("HACK") index = int(fields.pop(0)) except ValueError: raise ValueError("Syntax error reading index") try: divider = fields.index('|') except ValueError: raise ValueError("Syntax error reading index %i" % index) parents = fields[:divider] heads = fields[divider + 1:] if index in graph.index_table: print "OVERWRITING INDEX: ", index if len(parents) < 1: raise ValueError("index %i has no parent revs" % index) if len(heads) < 1: raise ValueError("index %i has no head revs" % index) graph.index_table[index] = (tuple(parents), tuple(heads)) elif fields[0] == 'E': #print fields if len(fields) < 5: raise ValueError("Exception parsing edge values.") index_pair = (int(fields[1]), int(fields[2])) length = int(fields[3]) chk_list = [] for chk in fields[4:]: chk_list.append(chk) graph.edge_table[index_pair] = tuple([ length, ] + chk_list) #else: # print "SKIPPED LINE:" # print line indices = graph.index_table.keys() if len(indices) == 0: raise ValueError("No indices?") indices.sort() graph.latest_index = indices[-1] graph.rep_invariant() return graph
def parse_graph(text): """ Returns a graph parsed from text. text must be in the format used by graph_to_string(). Lines starting with '#' are ignored. """ graph = UpdateGraph() lines = text.split('\n') for line in lines: fields = line.split(':') if fields[0] == 'I': fields.pop(0) try: if len(fields) == 0: raise ValueError("HACK") index = int(fields.pop(0)) except ValueError: raise ValueError("Syntax error reading index") try: divider = fields.index('|') except ValueError: raise ValueError("Syntax error reading index %i" % index) parents = fields[:divider] heads = fields[divider + 1:] if index in graph.index_table: print "OVERWRITING INDEX: " , index if len(parents) < 1: raise ValueError("index %i has no parent revs" % index) if len(heads) < 1: raise ValueError("index %i has no head revs" % index) graph.index_table[index] = (tuple(parents), tuple(heads)) elif fields[0] == 'E': #print fields if len(fields) < 5: raise ValueError("Exception parsing edge values.") index_pair = (int(fields[1]), int(fields[2])) length = int(fields[3]) chk_list = [] for chk in fields[4:]: chk_list.append(chk) graph.edge_table[index_pair] = tuple([length, ] + chk_list) #else: # print "SKIPPED LINE:" # print line indices = graph.index_table.keys() if len(indices) == 0: raise ValueError("No indices?") indices.sort() graph.latest_index = indices[-1] graph.rep_invariant() return graph
def parse_v100_graph(text): """ Returns a graph parsed from text in old format. text must be in the format used by graph_to_string(). Lines starting with '#' are ignored. """ graph = UpdateGraph() lines = text.split('\n') for line in lines: fields = line.split(':') if fields[0] == 'I': if len(fields) != 4: raise ValueError("Exception parsing index values.") index = int(fields[1]) if index in graph.index_table: print "OVERWRITING INDEX: ", index if len(tuple(fields[2:])) != 2: raise ValueError("Error parsing index value: %i" % index) versions = tuple(fields[2:]) graph.index_table[index] = ((versions[0], ), (versions[1], )) elif fields[0] == 'E': #print fields if len(fields) < 5: raise ValueError("Exception parsing edge values.") index_pair = (int(fields[1]), int(fields[2])) length = int(fields[3]) chk_list = [] for chk in fields[4:]: chk_list.append(chk) graph.edge_table[index_pair] = tuple([ length, ] + chk_list) #else: # print "SKIPPED LINE:" # print line indices = graph.index_table.keys() if len(indices) == 0: raise ValueError("No indices?") indices.sort() graph.latest_index = indices[-1] graph.rep_invariant() return graph
def parse_v100_graph(text): """ Returns a graph parsed from text in old format. text must be in the format used by graph_to_string(). Lines starting with '#' are ignored. """ graph = UpdateGraph() lines = text.split('\n') for line in lines: fields = line.split(':') if fields[0] == 'I': if len(fields) != 4: raise ValueError("Exception parsing index values.") index = int(fields[1]) if index in graph.index_table: print "OVERWRITING INDEX: " , index if len(tuple(fields[2:])) != 2: raise ValueError("Error parsing index value: %i" % index) versions = tuple(fields[2:]) graph.index_table[index] = ((versions[0], ), (versions[1], )) elif fields[0] == 'E': #print fields if len(fields) < 5: raise ValueError("Exception parsing edge values.") index_pair = (int(fields[1]), int(fields[2])) length = int(fields[3]) chk_list = [] for chk in fields[4:]: chk_list.append(chk) graph.edge_table[index_pair] = tuple([length, ] + chk_list) #else: # print "SKIPPED LINE:" # print line indices = graph.index_table.keys() if len(indices) == 0: raise ValueError("No indices?") indices.sort() graph.latest_index = indices[-1] graph.rep_invariant() return graph