mirror of
https://github.com/nix-community/nixvim.git
synced 2025-06-28 11:30:06 +02:00
flake: add diff-plugins command
Some checks are pending
Publish every Git push to main to FlakeHub / flakehub-publish (push) Waiting to run
Publish every git push to Flakestry / publish-flake (push) Waiting to run
Documentation / Version info (push) Waiting to run
Documentation / Build (push) Blocked by required conditions
Documentation / Combine builds (push) Blocked by required conditions
Documentation / Deploy (push) Blocked by required conditions
Some checks are pending
Publish every Git push to main to FlakeHub / flakehub-publish (push) Waiting to run
Publish every git push to Flakestry / publish-flake (push) Waiting to run
Documentation / Version info (push) Waiting to run
Documentation / Build (push) Blocked by required conditions
Documentation / Combine builds (push) Blocked by required conditions
Documentation / Deploy (push) Blocked by required conditions
Prints the plugins added or removed when compared to a particular nixvim revision.
This commit is contained in:
parent
f0764db721
commit
a473ef658a
2 changed files with 113 additions and 0 deletions
|
@ -115,6 +115,11 @@
|
|||
command = ''${pkgs.python3.interpreter} ${./new-plugin.py} "$@"'';
|
||||
help = "Create a new plugin";
|
||||
}
|
||||
{
|
||||
name = "diff-plugins";
|
||||
command = ''${pkgs.python3.interpreter} ${./diff-plugins.py} "$@"'';
|
||||
help = "Compare available plugins with another nixvim commit";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
|
108
flake/dev/diff-plugins.py
Normal file
108
flake/dev/diff-plugins.py
Normal file
|
@ -0,0 +1,108 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import json
|
||||
import re
|
||||
import subprocess
|
||||
from argparse import ArgumentParser, ArgumentTypeError
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
Main function to compare nixvim plugins with another revision.
|
||||
"""
|
||||
|
||||
parser = ArgumentParser(description="Compare nixvim plugins with another revision")
|
||||
parser.add_argument(
|
||||
"flakeref",
|
||||
metavar="old",
|
||||
help="the commit or flakeref to compare against",
|
||||
type=flakeref,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--compact",
|
||||
"-c",
|
||||
help="produce compact json instead of prettifying",
|
||||
action="store_true",
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
after_plugins = list_plugins(".")
|
||||
before_plugins = list_plugins(args.flakeref)
|
||||
print(
|
||||
json.dumps(
|
||||
diff(before_plugins, after_plugins),
|
||||
separators=((",", ":") if args.compact else None),
|
||||
indent=(None if args.compact else 4),
|
||||
sort_keys=(not args.compact),
|
||||
default=list,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def flakeref(arg):
|
||||
"""
|
||||
An argparse type that represents a flakeref, or a partial flakeref that we can
|
||||
normalise using sane defaults.
|
||||
"""
|
||||
default_protocol = "github:"
|
||||
default_repo = "nix-community/nixvim"
|
||||
sha_rxp = re.compile(r"^[A-Fa-f0-9]{6,40}$")
|
||||
repo_rxp = re.compile(
|
||||
r"^(?P<protocol>[^:/]+:)?(?P<repo>(:?[^/]+)/(:?[^/]+))(?P<sha>/[A-Fa-f0-9]{6,40})?$"
|
||||
)
|
||||
if sha_rxp.match(arg):
|
||||
return f"{default_protocol}{default_repo}/{arg}"
|
||||
elif m := repo_rxp.match(arg):
|
||||
protocol = m.group("protocol") or default_protocol
|
||||
repo = m.group("repo")
|
||||
sha = m.group("sha") or ""
|
||||
return protocol + repo + sha
|
||||
else:
|
||||
raise ArgumentTypeError(f"Unsupported commit or flakeref format: {arg}")
|
||||
|
||||
|
||||
def diff(before: list[str], after: list[str]):
|
||||
"""
|
||||
Compare the before and after plugin sets.
|
||||
"""
|
||||
# TODO: also guess at "renamed" plugins heuristically
|
||||
return {
|
||||
"added": {n: after[n] - before[n] for n in ["plugins", "colorschemes"]},
|
||||
"removed": {n: before[n] - after[n] for n in ["plugins", "colorschemes"]},
|
||||
}
|
||||
|
||||
|
||||
def list_plugins(flake: str) -> list[str]:
|
||||
"""
|
||||
Gets a list of plugins that exist in the flake.
|
||||
Grouped as "plugins" and "colorschemes"
|
||||
"""
|
||||
expr = """
|
||||
options:
|
||||
builtins.listToAttrs (
|
||||
map
|
||||
(name: {
|
||||
inherit name;
|
||||
value = builtins.attrNames options.${name};
|
||||
})
|
||||
[
|
||||
"plugins"
|
||||
"colorschemes"
|
||||
]
|
||||
)
|
||||
"""
|
||||
cmd = [
|
||||
"nix",
|
||||
"eval",
|
||||
f"{flake}#nixvimConfiguration.options",
|
||||
"--apply",
|
||||
expr,
|
||||
"--json",
|
||||
]
|
||||
out = subprocess.check_output(cmd)
|
||||
# Parse as json, converting the lists to sets
|
||||
return {k: set(v) for k, v in json.loads(out).items()}
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Add table
Add a link
Reference in a new issue