def test_cut_nodes_on_very_deep_graph(self): gr = pygraph.classes.graph.graph() gr.add_nodes(range(0, 5001)) for i in range(0, 5000): gr.add_edge((i, i + 1)) recursionlimit = getrecursionlimit() cut_nodes(gr) assert getrecursionlimit() == recursionlimit
def test_cut_nodes_on_very_deep_graph(self): gr = pygraph.classes.graph.graph() gr.add_nodes(range(0,5001)) for i in range(0,5000): gr.add_edge((i,i+1)) recursionlimit = getrecursionlimit() cut_nodes(gr) assert getrecursionlimit() == recursionlimit
def a1(stringTraces, traceInvalid): try: from pygraph.algorithms.accessibility import cut_nodes except ImportError: raise ImportError("Please intall pygraph.") dgInvalid = traceInvalid.getDigraph() cutNodes = [cut_nodes(dgInvalid)] for trace in stringTraces: dgCmd = trace[0].getDigraph() cutNodes.append(cut_nodes(dgInvalid)) return cutNodes
def test_cut_nodes_in_hypergraph(self): gr = hypergraph() # Add some nodes / edges gr.add_nodes(range(9)) gr.add_hyperedges(['a', 'b', 'c']) # Connect the 9 nodes with three size-3 hyperedges for node_set in [['a',0,1,2], ['b',3,4,5], ['c',6,7,8]]: for node in node_set[1:]: gr.link(node, node_set[0]) # Connect the groups gr.add_hyperedges(['l1','l2']) gr.link(0, 'l1') gr.link(3, 'l1') gr.link(5, 'l2') gr.link(8, 'l2') cn = cut_nodes(gr); assert 0 in cn assert 3 in cn assert 5 in cn assert 8 in cn assert len(cn) == 4
def test_cut_nodes_in_hypergraph(self): gr = hypergraph() # Add some nodes / edges gr.add_nodes(range(9)) gr.add_hyperedges(['a', 'b', 'c']) # Connect the 9 nodes with three size-3 hyperedges for node_set in [['a', 0, 1, 2], ['b', 3, 4, 5], ['c', 6, 7, 8]]: for node in node_set[1:]: gr.link(node, node_set[0]) # Connect the groups gr.add_hyperedges(['l1', 'l2']) gr.link(0, 'l1') gr.link(3, 'l1') gr.link(5, 'l2') gr.link(8, 'l2') cn = cut_nodes(gr) assert 0 in cn assert 3 in cn assert 5 in cn assert 8 in cn assert len(cn) == 4
def test_cut_nodes_in_graph(self): gr = testlib.new_graph() gr.add_nodes(['x','y']) gr.add_edge(('x','y')) gr.add_edge(('x',0)) gr_copy = deepcopy(gr) cn = cut_nodes(gr) for each in cn: before = number_of_connected_components(connected_components(gr)) gr.del_node(each) number_of_connected_components(connected_components(gr)) > before gr = gr_copy
def test_cut_nodes_in_graph(self): gr = testlib.new_graph() gr.add_nodes(['x', 'y']) gr.add_edge(('x', 'y')) gr.add_edge(('x', 0)) gr_copy = deepcopy(gr) cn = cut_nodes(gr) for each in cn: before = number_of_connected_components(connected_components(gr)) gr.del_node(each) number_of_connected_components(connected_components(gr)) > before gr = gr_copy
def cut_hyperedges(self): """ Return the cut-hyperedges of the given hypergraph. @rtype: list @return: List of cut-nodes. """ cut_nodes_ = accessibility.cut_nodes(self.graph) cut_nodes = [] for each in cut_nodes_: if (each[1] == 'h'): cut_nodes.append(each[0]) return cut_nodes
def ccm_fast_export(releases, graphs): global acn_ancestors global users users = users() logger.basicConfig(filename='ccm_fast_export.log',level=logger.DEBUG) commit_lookup = {} # Get the initial release for k, v in releases.iteritems(): if k == 'delimiter': continue if k == 'ccm_types': continue if v['previous'] is None: release = k break logger.info("Starting at %s as initial release" % release) if 'created' not in releases[release]: initial_release_time = 0.0 # epoch for now since releases[release] has no 'created' key :( else: initial_release_time = time.mktime(releases[release]['created'].timetuple()) mark = 0 files = [] # Create the initial release # get all the file objects: file_objects = [ccm_cache.get_object(o) for o in releases[release]['objects']] project_obj = ccm_cache.get_object(releases[release]['fourpartname']) paths = project_obj.get_members() for o in file_objects: if o.get_type() != 'dir': object_mark, mark = create_blob(o, mark) for p in paths[o.get_object_name()]: files.append('M ' + releases['ccm_types']['permissions'][o.get_type()] + ' :'+str(object_mark) + ' ' + p) empty_dirs = releases[release]['empty_dirs'] logger.info("Empty dirs for release %s\n%s" %(release, empty_dirs)) mark = create_blob_for_empty_dir(get_mark(mark)) #file_list = create_file_list(objects, object_lookup, releases['ccm_types'], empty_dirs=empty_dirs, empty_dir_mark=mark) if empty_dirs: for d in empty_dirs: if mark: path = d + '/.gitignore' files.append('M 100644 :' + str(mark) + ' ' + path) mark = get_mark(mark) commit_info = ['reset refs/tags/' + release, 'commit refs/tags/' + release, 'mark :' + str(mark), 'author Nokia <*****@*****.**> ' + str(int(initial_release_time)) + " +0000", 'committer Nokia <*****@*****.**> ' + str(int(initial_release_time)) + " +0000", 'data 15', 'Initial commit', '\n'.join(files), ''] print '\n'.join(commit_info) logger.info("git-fast-import:\n%s" %('\n'.join(commit_info))) tag_msg = 'Release: %s' %release annotated_tag = ['tag %s' % release, 'from :%s' % str(mark), 'tagger Nokia <*****@*****.**> ' + str(int(initial_release_time)) + " +0000", 'data %s' % len(tag_msg), tag_msg] print '\n'.join(annotated_tag) commit_lookup[release] = mark # do the following releases (graphs) release_queue = deque(releases[release]['next']) while release_queue: release = release_queue.popleft() previous_release = releases[release]['previous'] logger.info("Next release: %s" % release) commit_graph = graphs[release]['commit'] commit_graph = fix_orphan_nodes(commit_graph, previous_release) commit_graph = ch.spaghettify_digraph(commit_graph, previous_release, release) #htg.commit_graph_to_image(commit_graph, releases[release], graphs[release]['task'], name=releases[release]['name']+'_after' ) # Find the cutting nodes logger.info("Finding the cutting nodes") undirected = graph() undirected.add_nodes(commit_graph.nodes()) [undirected.add_edge(edge) for edge in commit_graph.edges()] cutting_nodes = cut_nodes(undirected) del undirected # Create the reverse commit graph logger.info("Building the reverse commit graph") reverse_commit_graph = commit_graph.reverse() # Compute the accessibility matrix of the reverse commit graph logger.info("Compute the ancestors") ancestors = accessibility(reverse_commit_graph) del reverse_commit_graph logger.info("Ancestors of the release: %s" % str(ancestors[release])) # Clean up the ancestors matrix for k, v in ancestors.iteritems(): if k in v: v.remove(k) # Get the commits order commits = topological_sorting(commit_graph) # Fix the commits order list commits.remove(previous_release) commits.remove(release) last_cutting_node = None # Check if the release (Synergy project has changed name, if it has the # 'base' directory name needs to be renamed if releases.has_key('delimiter'): delim = releases['delimiter'] else: delim = '-' previous_name = previous_release.split(delim)[0] current_name = release.split(delim)[0] if current_name != previous_name: logger.info("Name changed: %s -> %s" %(previous_name, current_name)) from_mark = commit_lookup[previous_release] mark, commit = rename_toplevel_dir(previous_name, current_name, release, releases, mark, from_mark) print '\n'.join(commit) # adjust the commit lookup commit_lookup[previous_release] = mark for counter, commit in enumerate(commits): logger.info("Commit %i/%i" % (counter+1, len(commits))) acn_ancestors = [] if last_cutting_node is not None: acn_ancestors = ancestors[last_cutting_node] # Create the references lists. It lists the parents of the commit #reference = [commit_lookup[parent] for parent in ancestors[commit] if parent not in acn_ancestors] reference = [commit_lookup[parent] for parent in commit_graph.incidents(commit)] if len(reference) > 1: # Merge commit mark = create_merge_commit(commit, release, releases, mark, reference, graphs, set(ancestors[commit]) - set(acn_ancestors)) else: # Normal commit mark = create_commit(commit, release, releases, mark, reference, graphs) # Update the lookup table commit_lookup[commit] = mark # Update the last cutting edge if necessary if commit in cutting_nodes: last_cutting_node = commit if last_cutting_node is not None: acn_ancestors = ancestors[last_cutting_node] reference = [commit_lookup[parent] for parent in ancestors[release] if parent not in acn_ancestors] logger.info("Reference %s" %str([parent for parent in ancestors[release] if parent not in acn_ancestors])) if not reference: logger.info("Reference previous %s, mark: %d" % (releases[release]['previous'], commit_lookup[releases[release]['previous']])) reference = [commit_lookup[ releases[release]['previous'] ] ] mark, merge_commit = create_release_merge_commit(releases, release, get_mark(mark), reference, graphs, set(ancestors[release]) - set(acn_ancestors)) print '\n'.join(merge_commit) annotated_tag = create_annotated_tag(releases, release, mark) print '\n'.join(annotated_tag) commit_lookup[release] = mark release_queue.extend(releases[release]['next']) #release = releases[release]['next'] #release = None #reset to master master = get_master_tag() reset = ['reset refs/heads/master', 'from :' + str(commit_lookup[master])] logger.info("git-fast-import:\n%s" %('\n'.join(reset))) print '\n'.join(reset)
def ccm_fast_export(releases, graphs): global acn_ancestors global users users = users() logger.basicConfig(filename='ccm_fast_export.log',level=logger.DEBUG) commit_lookup = {} # Get the initial release for k, v in releases.iteritems(): if k == 'delimiter': continue if k == 'ccm_types': continue if v['previous'] is None: release = k break logger.info("Starting at %s as initial release" % release) if 'created' not in releases[release]: initial_release_time = 0.0 # epoch for now since releases[release] has no 'created' key :( else: initial_release_time = time.mktime(releases[release]['created'].timetuple()) mark = 0 files = [] # Create the initial release # get all the file objects: file_objects = (ccm_cache.get_object(o) for o in releases[release]['objects']) project_obj = ccm_cache.get_object(releases[release]['fourpartname']) paths = project_obj.get_members() for o in file_objects: if o.get_type() != 'dir': object_mark, mark = create_blob(o, mark) for p in paths[o.get_object_name()]: files.append('M ' + releases['ccm_types']['permissions'][o.get_type()] + ' :'+str(object_mark) + ' ' + p) empty_dirs = releases[release]['empty_dirs'] logger.info("Empty dirs for release %s\n%s" %(release, empty_dirs)) mark = create_blob_for_empty_dir(get_mark(mark)) #file_list = create_file_list(objects, object_lookup, releases['ccm_types'], empty_dirs=empty_dirs, empty_dir_mark=mark) if empty_dirs: for d in empty_dirs: if mark: path = d + '/.gitignore' files.append('M 100644 :' + str(mark) + ' ' + path) mark = get_mark(mark) commit_info = ['reset refs/tags/' + release, 'commit refs/tags/' + release, 'mark :' + str(mark), 'author Nokia <*****@*****.**> ' + str(int(initial_release_time)) + " +0000", 'committer Nokia <*****@*****.**> ' + str(int(initial_release_time)) + " +0000", 'data 15', 'Initial commit', '\n'.join(files), ''] print '\n'.join(commit_info) logger.info("git-fast-import:\n%s" %('\n'.join(commit_info))) tag_msg = 'Release: %s' %release annotated_tag = ['tag %s' % release, 'from :%s' % str(mark), 'tagger Nokia <*****@*****.**> ' + str(int(initial_release_time)) + " +0000", 'data %s' % len(tag_msg), tag_msg] print '\n'.join(annotated_tag) commit_lookup[release] = mark # do the following releases (graphs) release_queue = deque(releases[release]['next']) while release_queue: release = release_queue.popleft() previous_release = releases[release]['previous'] logger.info("Next release: %s" % release) commit_graph = graphs[release]['commit'] commit_graph = fix_orphan_nodes(commit_graph, previous_release) commit_graph = ch.spaghettify_digraph(commit_graph, previous_release, release) #htg.commit_graph_to_image(commit_graph, releases[release], graphs[release]['task'], name=releases[release]['name']+'_after' ) # Find the cutting nodes logger.info("Finding the cutting nodes") undirected = graph() undirected.add_nodes(commit_graph.nodes()) [undirected.add_edge(edge) for edge in commit_graph.edges()] cutting_nodes = cut_nodes(undirected) del undirected # Create the reverse commit graph logger.info("Building the reverse commit graph") reverse_commit_graph = commit_graph.reverse() # Compute the accessibility matrix of the reverse commit graph logger.info("Compute the ancestors") ancestors = accessibility(reverse_commit_graph) del reverse_commit_graph logger.info("Ancestors of the release: %s" % str(ancestors[release])) # Clean up the ancestors matrix for k, v in ancestors.iteritems(): if k in v: v.remove(k) # Get the commits order commits = topological_sorting(commit_graph) # Fix the commits order list commits.remove(previous_release) commits.remove(release) last_cutting_node = None # Check if the release (Synergy project has changed name, if it has the # 'base' directory name needs to be renamed if releases.has_key('delimiter'): delim = releases['delimiter'] else: delim = '-' previous_name = previous_release.split(delim)[0] current_name = release.split(delim)[0] if current_name != previous_name: logger.info("Name changed: %s -> %s" %(previous_name, current_name)) from_mark = commit_lookup[previous_release] mark, commit = rename_toplevel_dir(previous_name, current_name, release, releases, mark, from_mark) print '\n'.join(commit) # adjust the commit lookup commit_lookup[previous_release] = mark for counter, commit in enumerate(commits): logger.info("Commit %i/%i" % (counter+1, len(commits))) acn_ancestors = [] if last_cutting_node is not None: acn_ancestors = ancestors[last_cutting_node] # Create the references lists. It lists the parents of the commit #reference = [commit_lookup[parent] for parent in ancestors[commit] if parent not in acn_ancestors] reference = [commit_lookup[parent] for parent in commit_graph.incidents(commit)] if len(reference) > 1: # Merge commit mark = create_merge_commit(commit, release, releases, mark, reference, graphs, set(ancestors[commit]) - set(acn_ancestors)) else: # Normal commit mark = create_commit(commit, release, releases, mark, reference, graphs) # Update the lookup table commit_lookup[commit] = mark # Update the last cutting edge if necessary if commit in cutting_nodes: last_cutting_node = commit if last_cutting_node is not None: acn_ancestors = ancestors[last_cutting_node] reference = [commit_lookup[parent] for parent in ancestors[release] if parent not in acn_ancestors] logger.info("Reference %s" %str([parent for parent in ancestors[release] if parent not in acn_ancestors])) if not reference: logger.info("Reference previous %s, mark: %d" % (releases[release]['previous'], commit_lookup[releases[release]['previous']])) reference = [commit_lookup[ releases[release]['previous'] ] ] mark, merge_commit = create_release_merge_commit(releases, release, get_mark(mark), reference, graphs, set(ancestors[release]) - set(acn_ancestors)) print '\n'.join(merge_commit) annotated_tag = create_annotated_tag(releases, release, mark) print '\n'.join(annotated_tag) commit_lookup[release] = mark release_queue.extend(releases[release]['next']) #release = releases[release]['next'] #release = None #reset to master master = get_master_tag() reset = ['reset refs/heads/master', 'from :' + str(commit_lookup[master])] logger.info("git-fast-import:\n%s" %('\n'.join(reset))) print '\n'.join(reset)