[geneagrapher] 180/226: Changed to store ancestor and descendant information in Node class as set.

Doug Torrance dtorrance-guest at moszumanska.debian.org
Sat Jul 11 17:11:05 UTC 2015


This is an automated email from the git hooks/post-receive script.

dtorrance-guest pushed a commit to branch master
in repository geneagrapher.

commit 482974f75a59fa8b6cf0bc74288f1b37d50caaec
Author: David Alber <alber.david at gmail.com>
Date:   Sun Nov 27 00:15:35 2011 -0800

    Changed to store ancestor and descendant information in Node class as set.
---
 geneagrapher/grabber.py            | 17 +++++++----------
 geneagrapher/graph/graph.py        | 16 +++++++++++++---
 geneagrapher/graph/node.py         | 12 ++++++------
 tests/test_geneagrapher_methods.py | 36 ++++++++++++++++++------------------
 tests/test_grabber_methods.py      | 36 ++++++++++++++++++------------------
 tests/test_graph_methods.py        | 29 +++++++++++++++--------------
 tests/test_node_methods.py         | 38 +++++++++++++++++++-------------------
 7 files changed, 96 insertions(+), 88 deletions(-)

diff --git a/geneagrapher/grabber.py b/geneagrapher/grabber.py
index edfc2dc..c055e61 100644
--- a/geneagrapher/grabber.py
+++ b/geneagrapher/grabber.py
@@ -13,8 +13,8 @@ class Grabber:
         self.name = None
         self.institution = None
         self.year = None
-        self.advisors = []
-        self.descendants = []
+        self.advisors = set([])
+        self.descendants = set([])
 
     @staticmethod
     def extract_id(tag):
@@ -32,9 +32,6 @@ class Grabber:
         soup = BeautifulSoup(page, convertEntities='html')
         page.close()
 
-        self.advisors = []
-        self.descendants = []
-
         if soup.firstText().text == u"You have specified an ID that does not \
 exist in the database. Please back up and try again.":
             # Then a bad URL (e.g., a bad record id) was given. Throw an
@@ -58,14 +55,14 @@ center; margin-bottom: 1ex").find('span').contents[-1].strip()
             self.year = int(inst_year)
 
         # Get advisor IDs.
-        self.advisors = [self.extract_id(info.findNext()) for info in
-                         soup.findAll(text=re.compile('Advisor'))
-                         if 'Advisor: Unknown' not in info]
+        self.advisors = set([self.extract_id(info.findNext()) for info in
+                             soup.findAll(text=re.compile('Advisor'))
+                             if 'Advisor: Unknown' not in info])
 
         # Get descendant IDs.
         if soup.find('table') is not None:
-            self.descendants = [self.extract_id(info) for info in
-                                soup.find('table').findAll('a')]
+            self.descendants = set([self.extract_id(info) for info in
+                                    soup.find('table').findAll('a')])
 
         return [self.name, self.institution, self.year, self.advisors,
                 self.descendants]
diff --git a/geneagrapher/graph/graph.py b/geneagrapher/graph/graph.py
index e1aea5e..ea76ad3 100644
--- a/geneagrapher/graph/graph.py
+++ b/geneagrapher/graph/graph.py
@@ -116,20 +116,30 @@ of Node objects for 'seeds'")
             node = self.get_node(node_id)
             printed_nodes[node_id] = node
 
+            sorted_ancestors = sorted([a for a in node.ancestors if a in self],
+                                      lambda x, y:
+                                      cmp(self[x].record.name.split()[-1],
+                                          self[y].record.name.split()[-1]))
+            sorted_descendants = sorted([d for d in node.descendants if
+                                         d in self],
+                                        lambda x, y:
+                                        cmp(self[x].record.name.split()[-1],
+                                            self[y].record.name.split()[-1]))
+
             if include_ancestors:
                 # Add this node's advisors to queue.
-                queue += node.ancestors
+                queue += sorted_ancestors
 
             if include_descendants:
                 # Add this node's descendants to queue.
-                queue += node.descendants
+                queue += sorted_descendants
 
             # Print this node's information.
             nodestr = u"    {} [label=\"{}\"];".format(node_id, node)
             dotfile += nodestr
 
             # Store the connection information for this node.
-            for advisor in node.ancestors:
+            for advisor in sorted_ancestors:
                 if self.has_node(advisor):
                     edgestr = "\n    {} -> {};".format(advisor, node_id)
                     edges += edgestr
diff --git a/geneagrapher/graph/node.py b/geneagrapher/graph/node.py
index ff571be..40f9d0e 100644
--- a/geneagrapher/graph/node.py
+++ b/geneagrapher/graph/node.py
@@ -24,11 +24,11 @@ class Node:
         if not isinstance(self.record, Record):
             raise TypeError("Unexpected parameter type: expected Record \
 object for 'record'")
-        if not isinstance(self.ancestors, list):
-            raise TypeError("Unexpected parameter type: expected list object \
+        if not isinstance(self.ancestors, set):
+            raise TypeError("Unexpected parameter type: expected set object \
 for 'ancestors'")
-        if not isinstance(self.descendants, list):
-            raise TypeError("Unexpected parameter type: expected list object \
+        if not isinstance(self.descendants, set):
+            raise TypeError("Unexpected parameter type: expected set object \
 for 'descendants'")
 
     def __unicode__(self):
@@ -39,13 +39,13 @@ for 'descendants'")
 
     def add_ancestor(self, ancestor):  # NOTE: is this used?
         """
-        Append an ancestor id to the ancestor list.
+        Add an ancestor id to the ancestor set.
         """
         # Verify we were passed an int.
         if not isinstance(ancestor, int):
             raise TypeError("Unexpected parameter type: expected int for \
 'ancestor'")
-        self.ancestors.append(ancestor)
+        self.ancestors.add(ancestor)
 
     def get_id(self):
         """
diff --git a/tests/test_geneagrapher_methods.py b/tests/test_geneagrapher_methods.py
index daeb987..ef56592 100644
--- a/tests/test_geneagrapher_methods.py
+++ b/tests/test_geneagrapher_methods.py
@@ -87,8 +87,8 @@ geneagrapher: error: no record IDs given
         self.assertTrue(127946 in graph)
 
         node = graph[127946]
-        self.assertEquals(node.ancestors, [137717, 137705])
-        self.assertEquals(node.descendants, [144155, 127803])
+        self.assertEquals(node.ancestors, set([137717, 137705]))
+        self.assertEquals(node.descendants, set([144155, 127803]))
 
         record = node.record
         self.assertEquals(record.name, "Christian   Thomasius")
@@ -113,8 +113,8 @@ geneagrapher: error: no record IDs given
         self.assertTrue(127946 in graph)
 
         node = graph[127946]
-        self.assertEquals(node.ancestors, [137717, 137705])
-        self.assertEquals(node.descendants, [144155, 127803])
+        self.assertEquals(node.ancestors, set([137717, 137705]))
+        self.assertEquals(node.descendants, set([144155, 127803]))
 
         record = node.record
         self.assertEquals(record.name, "Christian   Thomasius")
@@ -138,8 +138,8 @@ geneagrapher: error: no record IDs given
         self.assertTrue(143630 in graph)
 
         node = graph[127946]
-        self.assertEquals(node.ancestors, [137717, 137705])
-        self.assertEquals(node.descendants, [144155, 127803])
+        self.assertEquals(node.ancestors, set([137717, 137705]))
+        self.assertEquals(node.descendants, set([144155, 127803]))
 
         record = node.record
         self.assertEquals(record.name, "Christian   Thomasius")
@@ -148,8 +148,8 @@ geneagrapher: error: no record IDs given
         self.assertEquals(record.id, 127946)
 
         node = graph[137717]
-        self.assertEquals(node.ancestors, [])
-        self.assertEquals(node.descendants, [127946])
+        self.assertEquals(node.ancestors, set([]))
+        self.assertEquals(node.descendants, set([127946]))
 
         record = node.record
         self.assertEquals(record.name, "Valentin  Alberti")
@@ -158,8 +158,8 @@ geneagrapher: error: no record IDs given
         self.assertEquals(record.id, 137717)
 
         node = graph[137705]
-        self.assertEquals(node.ancestors, [143630])
-        self.assertEquals(node.descendants, [60985, 21235, 127946])
+        self.assertEquals(node.ancestors, set([143630]))
+        self.assertEquals(node.descendants, set([60985, 21235, 127946]))
 
         record = node.record
         self.assertEquals(record.name, "Jakob  Thomasius")
@@ -168,8 +168,8 @@ geneagrapher: error: no record IDs given
         self.assertEquals(record.id, 137705)
 
         node = graph[143630]
-        self.assertEquals(node.ancestors, [])
-        self.assertEquals(node.descendants, [137705])
+        self.assertEquals(node.ancestors, set([]))
+        self.assertEquals(node.descendants, set([137705]))
 
         record = node.record
         self.assertEquals(record.name, "Friedrich  Leibniz")
@@ -189,8 +189,8 @@ geneagrapher: error: no record IDs given
         self.assertTrue(99457 in graph)
 
         node = graph[79568]
-        self.assertEquals(node.ancestors, [13301])
-        self.assertEquals(node.descendants, [79562, 99457])
+        self.assertEquals(node.ancestors, set([13301]))
+        self.assertEquals(node.descendants, set([79562, 99457]))
 
         record = node.record
         self.assertEquals(record.name, "Ramdas  Kumaresan")
@@ -199,8 +199,8 @@ geneagrapher: error: no record IDs given
         self.assertEquals(record.id, 79568)
 
         node = graph[79562]
-        self.assertEquals(node.ancestors, [79568])
-        self.assertEquals(node.descendants, [])
+        self.assertEquals(node.ancestors, set([79568]))
+        self.assertEquals(node.descendants, set([]))
 
         record = node.record
         self.assertEquals(record.name, "C. S. Ramalingam")
@@ -209,8 +209,8 @@ geneagrapher: error: no record IDs given
         self.assertEquals(record.id, 79562)
 
         node = graph[99457]
-        self.assertEquals(node.ancestors, [79568])
-        self.assertEquals(node.descendants, [])
+        self.assertEquals(node.ancestors, set([79568]))
+        self.assertEquals(node.descendants, set([]))
 
         record = node.record
         self.assertEquals(record.name, "Yadong  Wang")
diff --git a/tests/test_grabber_methods.py b/tests/test_grabber_methods.py
index 9df7aeb..0e0c8f1 100644
--- a/tests/test_grabber_methods.py
+++ b/tests/test_grabber_methods.py
@@ -15,8 +15,8 @@ class TestGrabberMethods(unittest.TestCase):
         self.assertEquals(self.grabber.name, None)
         self.assertEquals(self.grabber.institution, None)
         self.assertEquals(self.grabber.year, None)
-        self.assertEquals(self.grabber.advisors, [])
-        self.assertEquals(self.grabber.descendants, [])
+        self.assertEquals(self.grabber.advisors, set([]))
+        self.assertEquals(self.grabber.descendants, set([]))
 
     def test002_extract_info_bad(self):
         # Verify exception thrown for bad id.
@@ -42,9 +42,9 @@ class TestGrabberMethods(unittest.TestCase):
         self.assertEquals(name, u"Carl Friedrich Gau\xdf")
         self.assertEquals(institution, u"Universit\xe4t Helmstedt")
         self.assertEquals(year, 1799)
-        self.assertEquals(advisors, [18230])
-        self.assertEquals(descendents, [18603, 18233, 62547, 29642, 55175,
-                                        29458, 19953, 18232, 151876])
+        self.assertEquals(advisors, set([18230]))
+        self.assertEquals(descendents, set([18603, 18233, 62547, 29642, 55175,
+                                            29458, 19953, 18232, 151876]))
 
         # Verify calling extract_node_information() twice does not have side
         # effect.
@@ -53,9 +53,9 @@ class TestGrabberMethods(unittest.TestCase):
         self.assertEquals(name, u"Carl Friedrich Gau\xdf")
         self.assertEquals(institution, u"Universit\xe4t Helmstedt")
         self.assertEquals(year, 1799)
-        self.assertEquals(advisors, [18230])
-        self.assertEquals(descendents, [18603, 18233, 62547, 29642, 55175,
-                                        29458, 19953, 18232, 151876])
+        self.assertEquals(advisors, set([18230]))
+        self.assertEquals(descendents, set([18603, 18233, 62547, 29642, 55175,
+                                            29458, 19953, 18232, 151876]))
 
     def test004_extract_info_no_advisor(self):
         # Test the extract_node_information() method for a record with no
@@ -66,8 +66,8 @@ class TestGrabberMethods(unittest.TestCase):
         self.assertEquals(name, u"Valentin  Alberti")
         self.assertEquals(institution, u"Universit\xe4t Leipzig")
         self.assertEquals(year, 1678)
-        self.assertEquals(advisors, [])
-        self.assertEquals(descendents, [127946])
+        self.assertEquals(advisors, set([]))
+        self.assertEquals(descendents, set([127946]))
 
     def test005_extract_info_no_descendants(self):
         # Test the extract_node_information() method for a record with no
@@ -80,8 +80,8 @@ class TestGrabberMethods(unittest.TestCase):
         self.assertEquals(name, u"S.  Cingolani")
         self.assertEquals(institution, u"Scuola Normale Superiore di Pisa")
         self.assertEquals(year, None)
-        self.assertEquals(advisors, [51261])
-        self.assertEquals(descendents, [])
+        self.assertEquals(advisors, set([51261]))
+        self.assertEquals(descendents, set([]))
 
     def test006_extract_info_no_year(self):
         # Test the extract_node_information() method for a record with no year.
@@ -92,8 +92,8 @@ class TestGrabberMethods(unittest.TestCase):
         self.assertEquals(name, u"S.  Cingolani")
         self.assertEquals(institution, u"Scuola Normale Superiore di Pisa")
         self.assertEquals(year, None)
-        self.assertEquals(advisors, [51261])
-        self.assertEquals(descendents, [])
+        self.assertEquals(advisors, set([51261]))
+        self.assertEquals(descendents, set([]))
 
     def test007_extract_info_no_inst(self):
         # Test the extract_node_information() method for a record with no
@@ -105,8 +105,8 @@ class TestGrabberMethods(unittest.TestCase):
         self.assertEquals(name, u"Walter  Mayer")
         self.assertEquals(institution, None)
         self.assertEquals(year, None)
-        self.assertEquals(advisors, [])
-        self.assertEquals(descendents, [52996])
+        self.assertEquals(advisors, set([]))
+        self.assertEquals(descendents, set([52996]))
 
     # Tests for special (from my point of view) characters:
     def test008_slash_l(self):
@@ -120,7 +120,7 @@ class TestGrabberMethods(unittest.TestCase):
         self.assertEquals(institution,
                           u"Georg-August-Universit\xe4t G\xf6ttingen")
         self.assertEquals(year, 1911)
-        self.assertEquals(advisors, [7298])
+        self.assertEquals(advisors, set([7298]))
 
     def test009_multiple_advisors(self):
         # Test for multiple advisors.
@@ -130,7 +130,7 @@ class TestGrabberMethods(unittest.TestCase):
         self.assertEquals(name, u"Rudolf Otto Sigismund Lipschitz")
         self.assertEquals(institution, u"Universit\xe4t Berlin")
         self.assertEquals(year, 1853)
-        self.assertEquals(advisors, [17946, 47064])
+        self.assertEquals(advisors, set([17946, 47064]))
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/test_graph_methods.py b/tests/test_graph_methods.py
index 3ea615b..f64947d 100644
--- a/tests/test_graph_methods.py
+++ b/tests/test_graph_methods.py
@@ -9,7 +9,7 @@ class TestGraphMethods(unittest.TestCase):
     def setUp(self):
         self.record1 = Record(u"Carl Friedrich Gau\xdf",
                               u"Universit\xe4t Helmstedt", 1799, 18231)
-        self.node1 = Node(self.record1, [], [])
+        self.node1 = Node(self.record1, set(), set())
         self.graph1 = Graph([self.node1])
 
     def test001_init_empty(self):
@@ -64,7 +64,7 @@ class TestGraphMethods(unittest.TestCase):
     def test009_add_node(self):
         # Test the add_node() method.
         self.graph1.add_node("Leonhard Euler", "Universitaet Basel", 1726,
-                             38586, [], [])
+                             38586, set(), set())
         self.assertEquals([38586, 18231], self.graph1.get_node_list())
         self.assertEquals(self.graph1.seeds, [self.node1])
 
@@ -72,7 +72,7 @@ class TestGraphMethods(unittest.TestCase):
         # Test the add_node() method when adding a second node and
         # marking it as a seed node.
         self.graph1.add_node("Leonhard Euler", "Universitaet Basel", 1726,
-                             38586, [], [], True)
+                             38586, set(), set(), True)
         self.assertEquals([38586, 18231], self.graph1.get_node_list())
         self.assertEquals(self.graph1.seeds, [self.node1,
                                               self.graph1.get_node(38586)])
@@ -82,20 +82,20 @@ class TestGraphMethods(unittest.TestCase):
         graph = Graph()
         self.assertEquals(graph.seeds, None)
         graph.add_node("Leonhard Euler", "Universitaet Basel", 1726,
-                       38586, [], [])
+                       38586, set(), set())
         self.assertEquals(graph.seeds, [graph.get_node(38586)])
 
     def test012_add_node_already_present(self):
         self.graph1.add_node("Leonhard Euler", "Universitaet Basel", 1726,
-                             38586, [], [])
+                             38586, set(), set())
         self.assertEquals([38586, 18231], self.graph1.get_node_list())
         self.assertRaises(DuplicateNodeError, self.graph1.add_node,
                           "Leonhard Euler", "Universitaet Basel",
-                          1726, 38586, [], [])
+                          1726, 38586, set(), set())
 
         try:
             self.graph1.add_node("Leonhard Euler", "Universitaet Basel",
-                                 1726, 38586, [], [])
+                                 1726, 38586, set(), set())
         except DuplicateNodeError as e:
             self.assertEquals(str(e),
                               "node with id {} already exists".format(38586))
@@ -105,7 +105,7 @@ class TestGraphMethods(unittest.TestCase):
     def test013_add_node_object(self):
         # Test the add_node_object() method.
         record = Record("Leonhard Euler", "Universitaet Basel", 1726, 38586)
-        node = Node(record, [], [])
+        node = Node(record, set(), set())
         self.graph1.add_node_object(node)
         self.assertEquals([38586, 18231], self.graph1.get_node_list())
         self.assertEquals(self.graph1.seeds, [self.node1])
@@ -128,19 +128,20 @@ class TestGraphMethods(unittest.TestCase):
         # Test the generate_dot_file() method.
         graph = Graph()
         graph.add_node(u"Carl Friedrich Gau\xdf", u"Universit\xe4t Helmstedt",
-                       1799, 18231, [18230], [])
+                       1799, 18231, set([18230]), set())
         graph.add_node(u"Johann Friedrich Pfaff",
                        u"Georg-August-Universit\xe4t Goettingen", 1786, 18230,
-                       [66476], [])
+                       set([66476]), set())
         graph.add_node(u"Abraham Gotthelf Kaestner", u"Universit\xe4t Leipzig",
-                       1739, 66476, [57670], [])
+                       1739, 66476, set([57670]), set())
         graph.add_node(u"Christian August Hausen",
                        u"Martin-Luther-Universit\xe4t Halle-Wittenberg", 1713,
-                       57670, [72669], [])
+                       57670, set([72669]), set())
         graph.add_node(u"Johann Christoph Wichmannshausen",
-                       u"Universit\xe4t Leipzig", 1685, 72669, [21235], [])
+                       u"Universit\xe4t Leipzig", 1685, 72669, set([21235]),
+                       set())
         graph.add_node(u"Otto Mencke", u"Universit\xe4t Leipzig", 1665, 21235,
-                       [], [])
+                       set(), set())
 
         dotfileexpt = u"""digraph genealogy {
     graph [charset="utf-8"];
diff --git a/tests/test_node_methods.py b/tests/test_node_methods.py
index 8e6021e..f1723b6 100644
--- a/tests/test_node_methods.py
+++ b/tests/test_node_methods.py
@@ -12,29 +12,29 @@ class TestNodeMethods(unittest.TestCase):
 
     def test001_init(self):
         # Test the constructor.
-        node = Node(self.record, [], [])
+        node = Node(self.record, set(), set())
         self.assertEquals(node.record, self.record)
-        self.assertEquals(node.ancestors, [])
-        self.assertEquals(node.descendants, [])
+        self.assertEquals(node.ancestors, set())
+        self.assertEquals(node.descendants, set())
 
     def test002_init_bad_record(self):
         # Test the constructor for a case where the record passed is not a
         # Record object.
-        self.assertRaises(TypeError, Node, 1, [], [])
+        self.assertRaises(TypeError, Node, 1, set(), set())
 
     def test003_init_bad_ancestor_list(self):
         # Test the constructor for a case where the ancestor list is not a
         # list.
-        self.assertRaises(TypeError, Node, self.record, 1, [])
+        self.assertRaises(TypeError, Node, self.record, 1, set())
 
     def test003_2_init_bad_descendent_list(self):
         # Test the constructor for a case where the descendent list is not a
         # list.
-        self.assertRaises(TypeError, Node, self.record, [], 1)
+        self.assertRaises(TypeError, Node, self.record, set(), 1)
 
     def test004_unicode_full(self):
         # Test __unicode__() method for Node with complete record.
-        node = Node(self.record, [], [])
+        node = Node(self.record, set(), set())
         nodestr = node.__unicode__()
         nodestrexpt = u"Carl Friedrich Gau\xdf \\nUniversit\xe4t Helmstedt \
 (1799)"
@@ -43,7 +43,7 @@ class TestNodeMethods(unittest.TestCase):
     def test005_unicode_no_year(self):
         # Test __unicode__() method for Node containing record without year.
         record = Record(self.record.name, self.record.institution, None, 18231)
-        node = Node(record, [], [])
+        node = Node(record, set(), set())
         nodestr = node.__unicode__()
         nodestrexpt = u"Carl Friedrich Gau\xdf \\nUniversit\xe4t Helmstedt"
         self.assertEquals(nodestr, nodestrexpt)
@@ -52,7 +52,7 @@ class TestNodeMethods(unittest.TestCase):
         # Test __unicode__() method for Node containing record without
         # institution.
         record = Record(self.record.name, None, 1799, 18231)
-        node = Node(record, [], [])
+        node = Node(record, set(), set())
         nodestr = node.__unicode__()
         nodestrexpt = u"Carl Friedrich Gau\xdf \\n(1799)"
         self.assertEquals(nodestr, nodestrexpt)
@@ -61,7 +61,7 @@ class TestNodeMethods(unittest.TestCase):
         # Test __unicode__() method for Node containing record without
         # institution or year.
         record = Record(self.record.name, None, None, 18231)
-        node = Node(record, [], [])
+        node = Node(record, set(), set())
         nodestr = node.__unicode__()
         nodestrexpt = u"Carl Friedrich Gau\xdf"
         self.assertEquals(nodestr, nodestrexpt)
@@ -70,36 +70,36 @@ class TestNodeMethods(unittest.TestCase):
         # Test comparison method for Nodes with identical records.
         record2 = Record("Carl Friedrich Gauss", "Universitaet Helmstedt",
                          1799, 18231)
-        node1 = Node(self.record, [], [])
-        node2 = Node(record2, [], [])
+        node1 = Node(self.record, set(), set())
+        node2 = Node(record2, set(), set())
         self.assert_(node1 == node2)
 
     def test009_cmp_unequal(self):
         # Test comparison method for Nodes with different records.
         record2 = Record("Leonhard Euler", "Universitaet Basel", 1726, 38586)
-        node1 = Node(self.record, [], [])
-        node2 = Node(record2, [], [])
+        node1 = Node(self.record, set(), set())
+        node2 = Node(record2, set(), set())
         self.assert_(node1 < node2)
 
     def test010_add_ancestor(self):
         # Test the add_ancestor() method.
-        node = Node(self.record, [], [])
+        node = Node(self.record, set(), set())
         node.add_ancestor(5)
-        self.assertEquals(node.ancestors, [5])
+        self.assertEquals(node.ancestors, set([5]))
 
     def test011_add_ancestor_bad_type(self):
         # Test the add_ancestor() method for a case where the parameter type
         # is incorrect.
-        node = Node(self.record, [], [])
+        node = Node(self.record, set(), set())
         self.assertRaises(TypeError, node.add_ancestor, '5')
 
     def test012_get_id(self):
-        node = Node(self.record, [], [])
+        node = Node(self.record, set(), set())
         self.assertEquals(node.get_id(), 18231)
 
     def test013_set_id(self):
         # Test the set_id() method.
-        node = Node(self.record, [], [])
+        node = Node(self.record, set(), set())
         self.assertEquals(node.get_id(), 18231)
         node.set_id(15)
         self.assertEquals(node.get_id(), 15)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/geneagrapher.git



More information about the debian-science-commits mailing list