]> git.scottworley.com Git - pinch/commitdiff
Aliases
authorScott Worley <scottworley@scottworley.com>
Tue, 19 May 2020 06:55:27 +0000 (23:55 -0700)
committerScott Worley <scottworley@scottworley.com>
Tue, 19 May 2020 06:55:27 +0000 (23:55 -0700)
pinch.py
tests/alias.sh [new file with mode: 0755]

index 46e5af30f9111043827bab3089040c1acaf1699f..b1471007f9399db512013a95a226210ef8cdf04c 100644 (file)
--- a/pinch.py
+++ b/pinch.py
@@ -38,6 +38,7 @@ class ChannelTableEntry(types.SimpleNamespace):
 
 
 class Channel(types.SimpleNamespace):
+    alias_of: str
     channel_html: bytes
     channel_url: str
     forwarded_url: str
@@ -464,6 +465,11 @@ def pin(args: argparse.Namespace) -> None:
             continue
 
         channel = Channel(**dict(config[section].items()))
+
+        if hasattr(channel, 'alias_of'):
+            assert not hasattr(channel, 'git_repo')
+            continue
+
         if hasattr(channel, 'git_revision'):
             channel.old_git_revision = channel.git_revision
             del channel.git_revision
@@ -486,8 +492,13 @@ def update(args: argparse.Namespace) -> None:
     v = Verification()
     config = configparser.ConfigParser()
     config.read_file(open(args.channels_file), args.channels_file)
-    exprs = []
+    exprs = {}
     for section in config.sections():
+
+        if 'alias_of' in config[section]:
+            assert 'git_repo' not in config[section]
+            continue
+
         if 'channel_url' in config[section]:
             tarball = fetch_with_nix_prefetch_url(
                 v, config[section]['tarball_url'], Digest16(
@@ -496,9 +507,15 @@ def update(args: argparse.Namespace) -> None:
             channel = Channel(**dict(config[section].items()))
             ensure_git_rev_available(v, channel)
             tarball = git_get_tarball(v, channel)
-        exprs.append(
-            'f: f { name = "%s"; channelName = "%s"; src = builtins.storePath "%s"; }' %
-            (config[section]['release_name'], section, tarball))
+
+        exprs[section] = (
+            'f: f { name = "%s"; channelName = "%%s"; src = builtins.storePath "%s"; }' %
+            (config[section]['release_name'], tarball))
+
+    for section in config.sections():
+        if 'alias_of' in config[section]:
+            exprs[section] = exprs[str(config[section]['alias_of'])]
+
     command = [
         'nix-env',
         '--profile',
@@ -508,7 +525,7 @@ def update(args: argparse.Namespace) -> None:
         '--file',
         '<nix/unpack-channel.nix>',
         '--install',
-        '--from-expression'] + exprs
+        '--from-expression'] + [exprs[name] % name for name in sorted(exprs.keys())]
     if args.dry_run:
         print(' '.join(map(shlex.quote, command)))
     else:
diff --git a/tests/alias.sh b/tests/alias.sh
new file mode 100755 (executable)
index 0000000..5bc611b
--- /dev/null
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+repo_dir="`mktemp -d`"
+repo="$repo_dir/repo"
+git init "$repo"
+(
+  cd "$repo"
+  echo Contents > test-file
+  git add test-file
+  git commit -m 'Commit message'
+)
+
+conf="`mktemp`"
+cat > "$conf" <<EOF
+[foo]
+git_repo = file://$repo
+git_ref = master
+
+[bar]
+alias_of = foo
+EOF
+
+python3 ./pinch.py pin "$conf"
+
+actual_env_command=`python3 ./pinch.py update --dry-run "$conf"`
+
+rm -rf "$repo_dir" "$conf"
+
+expected_env_command_RE='^nix-env --profile /nix/var/nix/profiles/per-user/[^/]+/channels --show-trace --file '\''<nix/unpack-channel.nix>'\'' --install --from-expression '\''f: f \{ name = "(repo-[0-9]{10}-[0-9a-f]{11})"; channelName = "bar"; src = builtins.storePath "/nix/store/.{32}-\1.tar.xz"; \}'\'' '\''f: f \{ name = "\1"; channelName = "foo"; src = builtins.storePath "/nix/store/.{32}-\1.tar.xz"; \}'\''$'
+
+if echo "$actual_env_command" | egrep "$expected_env_command_RE" > /dev/null;then
+  echo PASS
+else
+  echo "Output:   $actual_env_command"
+  echo "does not match RE: $expected_env_command_RE"
+  exit 1
+fi