浏览代码

Fix bug with duplicate service entries in `fig up`

Signed-off-by: Chris Corbyn <[email protected]>
d11wtq 11 年之前
父节点
当前提交
9dd53ecdaa
共有 1 个文件被更改,包括 23 次插入13 次删除
  1. 23 13
      fig/project.py

+ 23 - 13
fig/project.py

@@ -89,22 +89,32 @@ class Project(object):
 
 
         raise NoSuchService(name)
         raise NoSuchService(name)
 
 
-    def get_services(self, service_names=None):
+    def get_services(self, service_names=None, include_links=False):
         """
         """
         Returns a list of this project's services filtered
         Returns a list of this project's services filtered
-        by the provided list of names, or all services if
+        by the provided list of names, or all auto_start services if
         service_names is None or [].
         service_names is None or [].
 
 
+        If include_links is specified, returns a list prepended with the needed
+        links for service_names, in order of dependency.
+
         Preserves the original order of self.services.
         Preserves the original order of self.services.
 
 
         Raises NoSuchService if any of the named services
         Raises NoSuchService if any of the named services
         do not exist.
         do not exist.
         """
         """
         if service_names is None or len(service_names) == 0:
         if service_names is None or len(service_names) == 0:
-            return filter(lambda s: s.options['auto_start'], self.services)
+            return [s for s in self.services if s.options['auto_start']]
         else:
         else:
             unsorted = [self.get_service(name) for name in service_names]
             unsorted = [self.get_service(name) for name in service_names]
-            return [s for s in self.services if s in unsorted]
+            services = [s for s in self.services if s in unsorted]
+
+            if include_links:
+                services = reduce(self._prepend_with_links, services, [])
+
+            uniques = []
+            [uniques.append(s) for s in services if s not in uniques]
+            return uniques
 
 
     def start(self, service_names=None, **options):
     def start(self, service_names=None, **options):
         for service in self.get_services(service_names):
         for service in self.get_services(service_names):
@@ -128,15 +138,7 @@ class Project(object):
     def up(self, service_names=None, start_links=True):
     def up(self, service_names=None, start_links=True):
         new_containers = []
         new_containers = []
 
 
-        for service in self.get_services(service_names):
-            linked_services = service.get_linked_names()
-
-            if start_links and len(linked_services) > 0:
-                new_containers.extend(self.up(
-                    service_names=linked_services,
-                    start_links=True
-                ))
-
+        for service in self.get_services(service_names, include_links=start_links):
             for (_, new) in service.recreate_containers():
             for (_, new) in service.recreate_containers():
                 new_containers.append(new)
                 new_containers.append(new)
 
 
@@ -153,6 +155,14 @@ class Project(object):
                 l.append(container)
                 l.append(container)
         return l
         return l
 
 
+    def _prepend_with_links(self, acc, service):
+        linked_services = self.get_services(
+            service_names=service.get_linked_names(),
+            include_links=True
+        )
+        linked_services.append(service)
+        return acc + linked_services
+
 
 
 class NoSuchService(Exception):
 class NoSuchService(Exception):
     def __init__(self, name):
     def __init__(self, name):