]> git.scottworley.com Git - pinch/commitdiff
Process alias and non-alias configs separately
authorScott Worley <scottworley@scottworley.com>
Wed, 17 Jun 2020 18:50:13 +0000 (11:50 -0700)
committerScott Worley <scottworley@scottworley.com>
Thu, 18 Jun 2020 06:15:29 +0000 (23:15 -0700)
pinch.py

index 1959f450323f742420eb18c20c447c0815a3b3ee..9b845e3414df7a5c66a0cd940890a8562ebf7da8 100644 (file)
--- a/pinch.py
+++ b/pinch.py
@@ -18,6 +18,7 @@ import urllib.request
 import xml.dom.minidom
 
 from typing import (
+    Callable,
     Dict,
     Iterable,
     List,
@@ -590,18 +591,23 @@ K = TypeVar('K')
 V = TypeVar('V')
 
 
-def filter_dict(d: Dict[K, V], fields: Set[K]
-                ) -> Tuple[Dict[K, V], Dict[K, V]]:
+def partition_dict(pred: Callable[[K, V], bool],
+                   d: Dict[K, V]) -> Tuple[Dict[K, V], Dict[K, V]]:
     selected: Dict[K, V] = {}
     remaining: Dict[K, V] = {}
     for k, v in d.items():
-        if k in fields:
+        if pred(k, v):
             selected[k] = v
         else:
             remaining[k] = v
     return selected, remaining
 
 
+def filter_dict(d: Dict[K, V], fields: Set[K]
+                ) -> Tuple[Dict[K, V], Dict[K, V]]:
+    return partition_dict(lambda k, v: k in fields, d)
+
+
 def read_config_section(
         conf: configparser.SectionProxy) -> Tuple[SearchPath, Optional[Pin]]:
     mapping: Mapping[str, Tuple[Type[SearchPath], Type[Pin]]] = {
@@ -664,19 +670,24 @@ def pinCommand(args: argparse.Namespace) -> None:
 def updateCommand(args: argparse.Namespace) -> None:
     v = Verification()
     exprs: Dict[str, str] = {}
-    config = read_config_files(args.channels_file)
-    for section in config:
-        sp, pin = read_pinned_config_section(section, config[section])
-        if isinstance(sp, AliasSearchPath):
-            continue
+    config = {
+        section: read_pinned_config_section(section, conf) for section,
+        conf in read_config_files(
+            args.channels_file).items()}
+    alias, nonalias = partition_dict(
+        lambda k, v: isinstance(v[0], AliasSearchPath), config)
+
+    for section, (sp, pin) in nonalias.items():
+        assert not isinstance(sp, AliasSearchPath)  # mypy can't see through
+        assert not isinstance(pin, AliasPin)        # partition_dict()
         tarball = sp.fetch(v, pin)
         exprs[section] = (
             'f: f { name = "%s"; channelName = "%%s"; src = builtins.storePath "%s"; }' %
-            (config[section]['release_name'], tarball))
+            (pin.release_name, tarball))
 
-    for section in config:
-        if 'alias_of' in config[section]:
-            exprs[section] = exprs[str(config[section]['alias_of'])]
+    for section, (sp, pin) in alias.items():
+        assert isinstance(sp, AliasSearchPath)  # For mypy
+        exprs[section] = exprs[sp.alias_of]
 
     command = [
         'nix-env',