diff --git a/maintainers/scripts/pluginupdate.py b/maintainers/scripts/pluginupdate.py new file mode 100644 index 000000000000..79c79c0f0932 --- /dev/null +++ b/maintainers/scripts/pluginupdate.py @@ -0,0 +1,526 @@ +# Used by pkgs/misc/vim-plugins/update.py and pkgs/applications/editors/kakoune/plugins/update.py + +# format: +# $ nix run nixpkgs.python3Packages.black -c black update.py +# type-check: +# $ nix run nixpkgs.python3Packages.mypy -c mypy update.py +# linted: +# $ nix run nixpkgs.python3Packages.flake8 -c flake8 --ignore E501,E265 update.py + +import argparse +import functools +import http +import json +import os +import subprocess +import sys +import time +import traceback +import urllib.error +import urllib.parse +import urllib.request +import xml.etree.ElementTree as ET +from datetime import datetime +from functools import wraps +from multiprocessing.dummy import Pool +from pathlib import Path +from typing import Dict, List, Optional, Tuple, Union, Any, Callable +from urllib.parse import urljoin, urlparse +from tempfile import NamedTemporaryFile + +import git + +ATOM_ENTRY = "{http://www.w3.org/2005/Atom}entry" # " vim gets confused here +ATOM_LINK = "{http://www.w3.org/2005/Atom}link" # " +ATOM_UPDATED = "{http://www.w3.org/2005/Atom}updated" # " + + +def retry(ExceptionToCheck: Any, tries: int = 4, delay: float = 3, backoff: float = 2): + """Retry calling the decorated function using an exponential backoff. + http://www.saltycrane.com/blog/2009/11/trying-out-retry-decorator-python/ + original from: http://wiki.python.org/moin/PythonDecoratorLibrary#Retry + (BSD licensed) + :param ExceptionToCheck: the exception on which to retry + :param tries: number of times to try (not retry) before giving up + :param delay: initial delay between retries in seconds + :param backoff: backoff multiplier e.g. value of 2 will double the delay + each retry + """ + + def deco_retry(f: Callable) -> Callable: + @wraps(f) + def f_retry(*args: Any, **kwargs: Any) -> Any: + mtries, mdelay = tries, delay + while mtries > 1: + try: + return f(*args, **kwargs) + except ExceptionToCheck as e: + print(f"{str(e)}, Retrying in {mdelay} seconds...") + time.sleep(mdelay) + mtries -= 1 + mdelay *= backoff + return f(*args, **kwargs) + + return f_retry # true decorator + + return deco_retry + + +def make_request(url: str) -> urllib.request.Request: + token = os.getenv("GITHUB_API_TOKEN") + headers = {} + if token is not None: + headers["Authorization"] = f"token {token}" + return urllib.request.Request(url, headers=headers) + + +class Repo: + def __init__( + self, owner: str, name: str, branch: str, alias: Optional[str] + ) -> None: + self.owner = owner + self.name = name + self.branch = branch + self.alias = alias + self.redirect: Dict[str, str] = {} + + def url(self, path: str) -> str: + return urljoin(f"https://github.com/{self.owner}/{self.name}/", path) + + def __repr__(self) -> str: + return f"Repo({self.owner}, {self.name})" + + @retry(urllib.error.URLError, tries=4, delay=3, backoff=2) + def has_submodules(self) -> bool: + try: + req = make_request(self.url(f"blob/{self.branch}/.gitmodules")) + urllib.request.urlopen(req, timeout=10).close() + except urllib.error.HTTPError as e: + if e.code == 404: + return False + else: + raise + return True + + @retry(urllib.error.URLError, tries=4, delay=3, backoff=2) + def latest_commit(self) -> Tuple[str, datetime]: + commit_url = self.url(f"commits/{self.branch}.atom") + commit_req = make_request(commit_url) + with urllib.request.urlopen(commit_req, timeout=10) as req: + self.check_for_redirect(commit_url, req) + xml = req.read() + root = ET.fromstring(xml) + latest_entry = root.find(ATOM_ENTRY) + assert latest_entry is not None, f"No commits found in repository {self}" + commit_link = latest_entry.find(ATOM_LINK) + assert commit_link is not None, f"No link tag found feed entry {xml}" + url = urlparse(commit_link.get("href")) + updated_tag = latest_entry.find(ATOM_UPDATED) + assert ( + updated_tag is not None and updated_tag.text is not None + ), f"No updated tag found feed entry {xml}" + updated = datetime.strptime(updated_tag.text, "%Y-%m-%dT%H:%M:%SZ") + return Path(str(url.path)).name, updated + + def check_for_redirect(self, url: str, req: http.client.HTTPResponse): + response_url = req.geturl() + if url != response_url: + new_owner, new_name = ( + urllib.parse.urlsplit(response_url).path.strip("/").split("/")[:2] + ) + end_line = "\n" if self.alias is None else f" as {self.alias}\n" + plugin_line = "{owner}/{name}" + end_line + + old_plugin = plugin_line.format(owner=self.owner, name=self.name) + new_plugin = plugin_line.format(owner=new_owner, name=new_name) + self.redirect[old_plugin] = new_plugin + + def prefetch_git(self, ref: str) -> str: + data = subprocess.check_output( + ["nix-prefetch-git", "--fetch-submodules", self.url(""), ref] + ) + return json.loads(data)["sha256"] + + def prefetch_github(self, ref: str) -> str: + data = subprocess.check_output( + ["nix-prefetch-url", "--unpack", self.url(f"archive/{ref}.tar.gz")] + ) + return data.strip().decode("utf-8") + + +class Plugin: + def __init__( + self, + name: str, + commit: str, + has_submodules: bool, + sha256: str, + date: Optional[datetime] = None, + ) -> None: + self.name = name + self.commit = commit + self.has_submodules = has_submodules + self.sha256 = sha256 + self.date = date + + @property + def normalized_name(self) -> str: + return self.name.replace(".", "-") + + @property + def version(self) -> str: + assert self.date is not None + return self.date.strftime("%Y-%m-%d") + + def as_json(self) -> Dict[str, str]: + copy = self.__dict__.copy() + del copy["date"] + return copy + + +class Editor: + """The configuration of the update script.""" + + def __init__( + self, + name: str, + root: Path, + get_plugins: str, + generate_nix: Callable[[List[Tuple[str, str, Plugin]], str], None], + default_in: Optional[Path] = None, + default_out: Optional[Path] = None, + deprecated: Optional[Path] = None, + cache_file: Optional[str] = None, + ): + self.name = name + self.root = root + self.get_plugins = get_plugins + self.generate_nix = generate_nix + self.default_in = default_in or root.joinpath(f"{name}-plugin-names") + self.default_out = default_out or root.joinpath("generated.nix") + self.deprecated = deprecated or root.joinpath("deprecated.json") + self.cache_file = cache_file or f"{name}-plugin-cache.json" + + +class CleanEnvironment(object): + def __enter__(self) -> None: + self.old_environ = os.environ.copy() + local_pkgs = str(Path(__file__).parent.parent.parent) + os.environ["NIX_PATH"] = f"localpkgs={local_pkgs}" + self.empty_config = NamedTemporaryFile() + self.empty_config.write(b"{}") + self.empty_config.flush() + os.environ["NIXPKGS_CONFIG"] = self.empty_config.name + + def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None: + os.environ.update(self.old_environ) + self.empty_config.close() + + +def get_current_plugins(editor: Editor) -> List[Plugin]: + with CleanEnvironment(): + out = subprocess.check_output(["nix", "eval", "--json", editor.get_plugins]) + data = json.loads(out) + plugins = [] + for name, attr in data.items(): + p = Plugin(name, attr["rev"], attr["submodules"], attr["sha256"]) + plugins.append(p) + return plugins + + +def prefetch_plugin( + user: str, + repo_name: str, + branch: str, + alias: Optional[str], + cache: "Optional[Cache]" = None, +) -> Tuple[Plugin, Dict[str, str]]: + repo = Repo(user, repo_name, branch, alias) + commit, date = repo.latest_commit() + has_submodules = repo.has_submodules() + cached_plugin = cache[commit] if cache else None + if cached_plugin is not None: + cached_plugin.name = alias or repo_name + cached_plugin.date = date + return cached_plugin, repo.redirect + + print(f"prefetch {user}/{repo_name}") + if has_submodules: + sha256 = repo.prefetch_git(commit) + else: + sha256 = repo.prefetch_github(commit) + + return ( + Plugin(alias or repo_name, commit, has_submodules, sha256, date=date), + repo.redirect, + ) + + +def fetch_plugin_from_pluginline(plugin_line: str) -> Plugin: + plugin, _ = prefetch_plugin(*parse_plugin_line(plugin_line)) + return plugin + + +def print_download_error(plugin: str, ex: Exception): + print(f"{plugin}: {ex}", file=sys.stderr) + ex_traceback = ex.__traceback__ + tb_lines = [ + line.rstrip("\n") + for line in traceback.format_exception(ex.__class__, ex, ex_traceback) + ] + print("\n".join(tb_lines)) + + +def check_results( + results: List[Tuple[str, str, Union[Exception, Plugin], Dict[str, str]]] +) -> Tuple[List[Tuple[str, str, Plugin]], Dict[str, str]]: + failures: List[Tuple[str, Exception]] = [] + plugins = [] + redirects: Dict[str, str] = {} + for (owner, name, result, redirect) in results: + if isinstance(result, Exception): + failures.append((name, result)) + else: + plugins.append((owner, name, result)) + redirects.update(redirect) + + print(f"{len(results) - len(failures)} plugins were checked", end="") + if len(failures) == 0: + print() + return plugins, redirects + else: + print(f", {len(failures)} plugin(s) could not be downloaded:\n") + + for (plugin, exception) in failures: + print_download_error(plugin, exception) + + sys.exit(1) + + +def parse_plugin_line(line: str) -> Tuple[str, str, str, Optional[str]]: + branch = "master" + alias = None + name, repo = line.split("/") + if " as " in repo: + repo, alias = repo.split(" as ") + alias = alias.strip() + if "@" in repo: + repo, branch = repo.split("@") + + return (name.strip(), repo.strip(), branch.strip(), alias) + + +def load_plugin_spec(plugin_file: str) -> List[Tuple[str, str, str, Optional[str]]]: + plugins = [] + with open(plugin_file) as f: + for line in f: + plugin = parse_plugin_line(line) + if not plugin[0]: + msg = f"Invalid repository {line}, must be in the format owner/repo[ as alias]" + print(msg, file=sys.stderr) + sys.exit(1) + plugins.append(plugin) + return plugins + + +def get_cache_path(cache_file_name: str) -> Optional[Path]: + xdg_cache = os.environ.get("XDG_CACHE_HOME", None) + if xdg_cache is None: + home = os.environ.get("HOME", None) + if home is None: + return None + xdg_cache = str(Path(home, ".cache")) + + return Path(xdg_cache, cache_file_name) + + +class Cache: + def __init__(self, initial_plugins: List[Plugin], cache_file_name: str) -> None: + self.cache_file = get_cache_path(cache_file_name) + + downloads = {} + for plugin in initial_plugins: + downloads[plugin.commit] = plugin + downloads.update(self.load()) + self.downloads = downloads + + def load(self) -> Dict[str, Plugin]: + if self.cache_file is None or not self.cache_file.exists(): + return {} + + downloads: Dict[str, Plugin] = {} + with open(self.cache_file) as f: + data = json.load(f) + for attr in data.values(): + p = Plugin( + attr["name"], attr["commit"], attr["has_submodules"], attr["sha256"] + ) + downloads[attr["commit"]] = p + return downloads + + def store(self) -> None: + if self.cache_file is None: + return + + os.makedirs(self.cache_file.parent, exist_ok=True) + with open(self.cache_file, "w+") as f: + data = {} + for name, attr in self.downloads.items(): + data[name] = attr.as_json() + json.dump(data, f, indent=4, sort_keys=True) + + def __getitem__(self, key: str) -> Optional[Plugin]: + return self.downloads.get(key, None) + + def __setitem__(self, key: str, value: Plugin) -> None: + self.downloads[key] = value + + +def prefetch( + args: Tuple[str, str, str, Optional[str]], cache: Cache +) -> Tuple[str, str, Union[Exception, Plugin], dict]: + assert len(args) == 4 + owner, repo, branch, alias = args + try: + plugin, redirect = prefetch_plugin(owner, repo, branch, alias, cache) + cache[plugin.commit] = plugin + return (owner, repo, plugin, redirect) + except Exception as e: + return (owner, repo, e, {}) + + +def rewrite_input( + input_file: Path, + deprecated: Path, + redirects: Dict[str, str] = None, + append: Tuple = (), +): + with open(input_file, "r") as f: + lines = f.readlines() + + lines.extend(append) + + if redirects: + lines = [redirects.get(line, line) for line in lines] + + cur_date_iso = datetime.now().strftime("%Y-%m-%d") + with open(deprecated, "r") as f: + deprecations = json.load(f) + for old, new in redirects.items(): + old_plugin = fetch_plugin_from_pluginline(old) + new_plugin = fetch_plugin_from_pluginline(new) + if old_plugin.normalized_name != new_plugin.normalized_name: + deprecations[old_plugin.normalized_name] = { + "new": new_plugin.normalized_name, + "date": cur_date_iso, + } + with open(deprecated, "w") as f: + json.dump(deprecations, f, indent=4, sort_keys=True) + + lines = sorted(lines, key=str.casefold) + + with open(input_file, "w") as f: + f.writelines(lines) + + +def parse_args(editor: Editor): + parser = argparse.ArgumentParser( + description=( + f"Updates nix derivations for {editor.name} plugins" + f"By default from {editor.default_in} to {editor.default_out}" + ) + ) + parser.add_argument( + "--add", + dest="add_plugins", + default=[], + action="append", + help=f"Plugin to add to {editor.name}Plugins from Github in the form owner/repo", + ) + parser.add_argument( + "--input-names", + "-i", + dest="input_file", + default=editor.default_in, + help="A list of plugins in the form owner/repo", + ) + parser.add_argument( + "--out", + "-o", + dest="outfile", + default=editor.default_out, + help="Filename to save generated nix code", + ) + parser.add_argument( + "--proc", + "-p", + dest="proc", + type=int, + default=30, + help="Number of concurrent processes to spawn.", + ) + return parser.parse_args() + + +def commit(repo: git.Repo, message: str, files: List[Path]) -> None: + repo.index.add([str(f.resolve()) for f in files]) + + if repo.index.diff("HEAD"): + print(f'committing to nixpkgs "{message}"') + repo.index.commit(message) + else: + print("no changes in working tree to commit") + + +def get_update(input_file: str, outfile: str, proc: int, editor: Editor): + cache: Cache = Cache(get_current_plugins(editor), editor.cache_file) + _prefetch = functools.partial(prefetch, cache=cache) + + def update() -> dict: + plugin_names = load_plugin_spec(input_file) + + try: + pool = Pool(processes=proc) + results = pool.map(_prefetch, plugin_names) + finally: + cache.store() + + plugins, redirects = check_results(results) + + editor.generate_nix(plugins, outfile) + + return redirects + + return update + + +def update_plugins(editor: Editor): + """The main entry function of this module. All input arguments are grouped in the `Editor`.""" + + args = parse_args(editor) + nixpkgs_repo = git.Repo(editor.root, search_parent_directories=True) + update = get_update(args.input_file, args.outfile, args.proc, editor) + + redirects = update() + rewrite_input(args.input_file, editor.deprecated, redirects) + commit(nixpkgs_repo, f"{editor.name}Plugins: update", [args.outfile]) + + if redirects: + update() + commit( + nixpkgs_repo, + f"{editor.name}Plugins: resolve github repository redirects", + [args.outfile, args.input_file, editor.deprecated], + ) + + for plugin_line in args.add_plugins: + rewrite_input(args.input_fil, editor.deprecated, append=(plugin_line + "\n",)) + update() + plugin = fetch_plugin_from_pluginline(plugin_line) + commit( + nixpkgs_repo, + "{editor}Plugins.{name}: init at {version}".format( + editor=editor.name, name=plugin.normalized_name, version=plugin.version + ), + [args.outfile, args.input_file], + ) diff --git a/nixos/modules/services/printing/cupsd.nix b/nixos/modules/services/printing/cupsd.nix index b19cd0732526..d2b36d9e7541 100644 --- a/nixos/modules/services/printing/cupsd.nix +++ b/nixos/modules/services/printing/cupsd.nix @@ -104,7 +104,7 @@ let ignoreCollisions = true; }; - filterGutenprint = pkgs: filter (pkg: pkg.meta.isGutenprint or false == true) pkgs; + filterGutenprint = filter (pkg: pkg.meta.isGutenprint or false == true); containsGutenprint = pkgs: length (filterGutenprint pkgs) > 0; getGutenprint = pkgs: head (filterGutenprint pkgs); diff --git a/pkgs/applications/blockchains/zcash/default.nix b/pkgs/applications/blockchains/zcash/default.nix index 6a8bebf6178e..77601aa3d563 100644 --- a/pkgs/applications/blockchains/zcash/default.nix +++ b/pkgs/applications/blockchains/zcash/default.nix @@ -1,23 +1,25 @@ { rust, rustPlatform, stdenv, lib, fetchFromGitHub, autoreconfHook, makeWrapper -, cargo, pkg-config -, bash, curl, coreutils, boost17x, db62, libsodium, libevent, utf8cpp, util-linux +, fetchpatch, cargo, pkg-config, curl, coreutils, boost174, db62, hexdump +, libsodium, libevent, utf8cpp, util-linux, withWallet ? true, withDaemon ? true +, withUtils ? true }: -rustPlatform.buildRustPackage rec { +rustPlatform.buildRustPackage.override { stdenv = stdenv; } rec { pname = "zcash"; - version = "4.1.1"; + version = "4.3.0"; src = fetchFromGitHub { owner = "zcash"; repo = "zcash"; rev = "v${version}"; - sha256 = "185zrw276g545np0niw5hlhlppkjbf5a1r4rwhnbaimdjdii2dil"; + sha256 = "00pn1jw8j90y7i8nc92b51znz4gczphvdzbkbcjx63cf6vk7v4ks"; }; - cargoSha256 = "0qxr6asf8zsya0f1ri39z2cnfpjk96hgwjchz2c7j87vibbvg6dc"; + cargoSha256 = "1rl9sjbvpfrv1mlyb04vw1935qx0kz9cs177xl7izdva1ixk9blr"; - nativeBuildInputs = [ autoreconfHook cargo makeWrapper pkg-config ]; - buildInputs = [ bash boost17x db62 libevent libsodium utf8cpp ]; + nativeBuildInputs = [ autoreconfHook cargo hexdump makeWrapper pkg-config ]; + buildInputs = [ boost174 libevent libsodium utf8cpp ] + ++ lib.optional withWallet db62; # Use the stdenv default phases (./configure; make) instead of the # ones from buildRustPackage. @@ -26,6 +28,14 @@ rustPlatform.buildRustPackage rec { checkPhase = "checkPhase"; installPhase = "installPhase"; + patches = [ + # See https://github.com/zcash/zcash/pull/5015 + (fetchpatch { + url = "https://github.com/zcash/zcash/commit/a0ac27ec6ed434a233c7ad2468258f6e6e7e9688.patch"; + sha256 = "0pmx1spql9p8vvpjgw7qf3qy46f4mh9ni16bq4ss1xz1z9zgjc4k"; + }) + ]; + postPatch = '' # Have to do this here instead of in preConfigure because # cargoDepsCopy gets unset after postPatch. @@ -34,10 +44,12 @@ rustPlatform.buildRustPackage rec { configureFlags = [ "--disable-tests" - "--with-boost-libdir=${lib.getLib boost17x}/lib" + "--with-boost-libdir=${lib.getLib boost174}/lib" "CXXFLAGS=-I${lib.getDev utf8cpp}/include/utf8cpp" "RUST_TARGET=${rust.toRustTargetSpec stdenv.hostPlatform}" - ]; + ] ++ lib.optional (!withWallet) "--disable-wallet" + ++ lib.optional (!withDaemon) "--without-daemon" + ++ lib.optional (!withUtils) "--without-utils"; enableParallelBuilding = true; diff --git a/pkgs/applications/editors/kakoune/plugins/aliases.nix b/pkgs/applications/editors/kakoune/plugins/aliases.nix new file mode 100644 index 000000000000..5ff2a03441de --- /dev/null +++ b/pkgs/applications/editors/kakoune/plugins/aliases.nix @@ -0,0 +1,46 @@ +# Deprecated aliases - for backward compatibility + +lib: overriden: + +with overriden; + +let + # Removing recurseForDerivation prevents derivations of aliased attribute + # set to appear while listing all the packages available. + removeRecurseForDerivations = alias: with lib; + if alias.recurseForDerivations or false then + removeAttrs alias ["recurseForDerivations"] + else alias; + + # Disabling distribution prevents top-level aliases for non-recursed package + # sets from building on Hydra. + removeDistribute = alias: with lib; + if isDerivation alias then + dontDistribute alias + else alias; + + # Make sure that we are not shadowing something from + # all-packages.nix. + checkInPkgs = n: alias: if builtins.hasAttr n overriden + then throw "Alias ${n} is still in kakounePlugins" + else alias; + + mapAliases = aliases: + lib.mapAttrs (n: alias: removeDistribute + (removeRecurseForDerivations + (checkInPkgs n alias))) + aliases; + + deprecations = lib.mapAttrs (old: info: + throw "${old} was renamed to ${info.new} on ${info.date}. Please update to ${info.new}." + ) (builtins.fromJSON (builtins.readFile ./deprecated.json)); + +in +mapAliases ({ + kak-auto-pairs = auto-pairs-kak; # backwards compat, added 2021-01-04 + kak-buffers = kakoune-buffers; # backwards compat, added 2021-01-04 + kak-fzf = fzf-kak; # backwards compat, added 2021-01-04 + kak-powerline = powerline-kak; # backwards compat, added 2021-01-04 + kak-prelude = prelude-kak; # backwards compat, added 2021-01-04 + kak-vertical-selection = kakoune-vertical-selection; # backwards compat, added 2021-01-04 +} // deprecations) diff --git a/pkgs/applications/editors/kakoune/plugins/build-kakoune-plugin.nix b/pkgs/applications/editors/kakoune/plugins/build-kakoune-plugin.nix new file mode 100644 index 000000000000..f35a175312c0 --- /dev/null +++ b/pkgs/applications/editors/kakoune/plugins/build-kakoune-plugin.nix @@ -0,0 +1,33 @@ +{ lib, stdenv, rtpPath ? "share/kak/autoload/plugins" }: +rec { + buildKakounePlugin = attrs@{ + name ? "${attrs.pname}-${attrs.version}", + namePrefix ? "kakplugin-", + src, + unpackPhase ? "", + configurePhase ? "", + buildPhase ? "", + preInstall ? "", + postInstall ? "", + path ? lib.getName name, + ... + }: + stdenv.mkDerivation ((builtins.removeAttrs attrs [ "namePrefix" "path" ]) // { + name = namePrefix + name; + + installPhase = '' + runHook preInstall + + target=$out/${rtpPath}/${path} + mkdir -p $out/${rtpPath} + cp -r . $target + + runHook postInstall + ''; + }); + + buildKakounePluginFrom2Nix = attrs: buildKakounePlugin ({ + buildPhase = ":"; + configurePhase = ":"; + } // attrs); +} diff --git a/pkgs/applications/editors/kakoune/plugins/case.kak.nix b/pkgs/applications/editors/kakoune/plugins/case.kak.nix deleted file mode 100644 index 3fa91113bbad..000000000000 --- a/pkgs/applications/editors/kakoune/plugins/case.kak.nix +++ /dev/null @@ -1,27 +0,0 @@ -{ lib, stdenv, fetchFromGitLab }: - -stdenv.mkDerivation { - name = "case.kak"; - version = "unstable-2020-04-06"; - - src = fetchFromGitLab { - owner = "FlyingWombat"; - repo = "case.kak"; - rev = "6f1511820aa3abfa118e0f856118adc8113e2185"; - sha256 = "002njrlwgakqgp74wivbppr9qyn57dn4n5bxkr6k6nglk9qndwdp"; - }; - - installPhase = '' - mkdir -p $out/share/kak/autoload/plugins - cp -r rc/case.kak $out/share/kak/autoload/plugins - ''; - - meta = with lib; { - description = "Case convention conversion for Kakoune"; - homepage = "https://gitlab.com/FlyingWombat/case.kak"; - license = licenses.unlicense; - maintainers = with maintainers; [ eraserhd ]; - platform = platforms.all; - }; -} - diff --git a/pkgs/applications/editors/kakoune/plugins/default.nix b/pkgs/applications/editors/kakoune/plugins/default.nix index 98b77338b9b3..1fe16a4e60c1 100644 --- a/pkgs/applications/editors/kakoune/plugins/default.nix +++ b/pkgs/applications/editors/kakoune/plugins/default.nix @@ -1,17 +1,25 @@ -{ pkgs, parinfer-rust, rep, kak-lsp }: +{ callPackage, config, kakouneUtils, lib }: -{ - inherit parinfer-rust rep kak-lsp; +let - case-kak = pkgs.callPackage ./case.kak.nix { }; - kak-ansi = pkgs.callPackage ./kak-ansi.nix { }; - kak-auto-pairs = pkgs.callPackage ./kak-auto-pairs.nix { }; - kak-buffers = pkgs.callPackage ./kak-buffers.nix { }; - kak-fzf = pkgs.callPackage ./kak-fzf.nix { }; - kak-plumb = pkgs.callPackage ./kak-plumb.nix { }; - kak-powerline = pkgs.callPackage ./kak-powerline.nix { }; - kak-prelude = pkgs.callPackage ./kak-prelude.nix { }; - kak-vertical-selection = pkgs.callPackage ./kak-vertical-selection.nix { }; - openscad-kak = pkgs.callPackage ./openscad.kak.nix { }; - quickscope-kak = pkgs.callPackage ./quickscope.kak.nix { }; -} + inherit (kakouneUtils.override {}) buildKakounePluginFrom2Nix; + + plugins = callPackage ./generated.nix { + inherit buildKakounePluginFrom2Nix overrides; + }; + + # TL;DR + # * Add your plugin to ./kakoune-plugin-names + # * run ./update.py + # + # If additional modifications to the build process are required, + # add to ./overrides.nix. + overrides = callPackage ./overrides.nix { + inherit buildKakounePluginFrom2Nix; + }; + + aliases = lib.optionalAttrs (config.allowAliases or true) (import ./aliases.nix lib plugins); + +in + +plugins // aliases diff --git a/pkgs/applications/editors/kakoune/plugins/deprecated.json b/pkgs/applications/editors/kakoune/plugins/deprecated.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/pkgs/applications/editors/kakoune/plugins/deprecated.json @@ -0,0 +1 @@ +{} diff --git a/pkgs/applications/editors/kakoune/plugins/generated.nix b/pkgs/applications/editors/kakoune/plugins/generated.nix new file mode 100644 index 000000000000..3ea3ea514788 --- /dev/null +++ b/pkgs/applications/editors/kakoune/plugins/generated.nix @@ -0,0 +1,211 @@ +# This file has been generated by ./pkgs/applications/editors/kakoune/plugins/update.py. Do not edit! +{ lib, buildKakounePluginFrom2Nix, fetchFromGitHub, overrides ? (self: super: {}) }: +let + packages = ( self: +{ + active-window-kak = buildKakounePluginFrom2Nix { + pname = "active-window-kak"; + version = "2020-05-13"; + src = fetchFromGitHub { + owner = "greenfork"; + repo = "active-window.kak"; + rev = "988db69cfbb88bd741d089bb43b0be551693e7c1"; + sha256 = "1fv1cp9q212gamf9z2papl5xcl2w31fpcmbgdzbxcxdl1pvfsqp8"; + }; + meta.homepage = "https://github.com/greenfork/active-window.kak/"; + }; + + auto-pairs-kak = buildKakounePluginFrom2Nix { + pname = "auto-pairs-kak"; + version = "2020-10-04"; + src = fetchFromGitHub { + owner = "alexherbo2"; + repo = "auto-pairs.kak"; + rev = "fd735ec149ef0d9ca5f628a95b1e52858b5afbdc"; + sha256 = "07795kv9njlnp6mckwv141ny2ns6wyf5r0dfjaxh9ngd105zgif1"; + }; + meta.homepage = "https://github.com/alexherbo2/auto-pairs.kak/"; + }; + + connect-kak = buildKakounePluginFrom2Nix { + pname = "connect-kak"; + version = "2021-02-13"; + src = fetchFromGitHub { + owner = "alexherbo2"; + repo = "connect.kak"; + rev = "0858c0e50c6ca6d214fb088f052385a242548e83"; + sha256 = "1w4pwybg3v916hcyc49gz0blygv54ivv81x8fxp44ck0sy98idr3"; + }; + meta.homepage = "https://github.com/alexherbo2/connect.kak/"; + }; + + fzf-kak = buildKakounePluginFrom2Nix { + pname = "fzf-kak"; + version = "2021-01-27"; + src = fetchFromGitHub { + owner = "andreyorst"; + repo = "fzf.kak"; + rev = "e10de405e2a98e910d0808059200d206ba80f865"; + sha256 = "1hbsm1k8k0cgv7gxqicvnl22n2lb1plhkanniggk694gll22lq68"; + }; + meta.homepage = "https://github.com/andreyorst/fzf.kak/"; + }; + + kakoune-buffer-switcher = buildKakounePluginFrom2Nix { + pname = "kakoune-buffer-switcher"; + version = "2020-12-27"; + src = fetchFromGitHub { + owner = "occivink"; + repo = "kakoune-buffer-switcher"; + rev = "6a27c45db87a23070c34fab36d2f8d812cd002a6"; + sha256 = "1rmwy317908v8p54806m721bpzm8sgygb9abri34537ka6r05y5j"; + }; + meta.homepage = "https://github.com/occivink/kakoune-buffer-switcher/"; + }; + + kakoune-buffers = buildKakounePluginFrom2Nix { + pname = "kakoune-buffers"; + version = "2020-06-11"; + src = fetchFromGitHub { + owner = "Delapouite"; + repo = "kakoune-buffers"; + rev = "67959fbad727ba8470fe8cd6361169560f4fb532"; + sha256 = "09prhzz4yzf6ryw0npd1gpcfp77681vgawpp1ilfvbf25xgbbz33"; + }; + meta.homepage = "https://github.com/Delapouite/kakoune-buffers/"; + }; + + kakoune-easymotion = buildKakounePluginFrom2Nix { + pname = "kakoune-easymotion"; + version = "2020-03-09"; + src = fetchFromGitHub { + owner = "danr"; + repo = "kakoune-easymotion"; + rev = "0ca75450023a149efc70e8e383e459b571355c70"; + sha256 = "15czvl0qj2k767pysr6xk2v31mkhvcbmv76xs2a8yrslchms70b5"; + }; + meta.homepage = "https://github.com/danr/kakoune-easymotion/"; + }; + + kakoune-extra-filetypes = buildKakounePluginFrom2Nix { + pname = "kakoune-extra-filetypes"; + version = "2021-01-15"; + src = fetchFromGitHub { + owner = "kakoune-editor"; + repo = "kakoune-extra-filetypes"; + rev = "c6f8aaccd8c9cd6b487964c8943416e21fbe7c18"; + sha256 = "1vkff8xbycfgxv8x09cvc79qcg5fdzn2x77mbmifmkq236khrwrg"; + }; + meta.homepage = "https://github.com/kakoune-editor/kakoune-extra-filetypes/"; + }; + + kakoune-rainbow = buildKakounePluginFrom2Nix { + pname = "kakoune-rainbow"; + version = "2020-09-01"; + src = fetchFromGitHub { + owner = "listentolist"; + repo = "kakoune-rainbow"; + rev = "d09103e8d268cf4621215bf162a0244c9482be3c"; + sha256 = "1i3id7xw0j4z1a14mscr68ckpgvcwsjpl86lr864wy7w7qcmblx6"; + }; + meta.homepage = "https://github.com/listentolist/kakoune-rainbow/"; + }; + + kakoune-registers = buildKakounePluginFrom2Nix { + pname = "kakoune-registers"; + version = "2020-06-19"; + src = fetchFromGitHub { + owner = "Delapouite"; + repo = "kakoune-registers"; + rev = "9531947baecd83c1d4c3bea0adf10f4462f1e120"; + sha256 = "08v9ndghh7wvr8rsrqm05gksk9ai5vnwvw9gwqasbppb48cv4a8c"; + }; + meta.homepage = "https://github.com/Delapouite/kakoune-registers/"; + }; + + kakoune-vertical-selection = buildKakounePluginFrom2Nix { + pname = "kakoune-vertical-selection"; + version = "2019-04-11"; + src = fetchFromGitHub { + owner = "occivink"; + repo = "kakoune-vertical-selection"; + rev = "c420f8b867ce47375fac303886e31623669a42b7"; + sha256 = "13jdyd2j45wvgqvxdzw9zww14ly93bqjb6700zzxj7mkbiff6wsb"; + }; + meta.homepage = "https://github.com/occivink/kakoune-vertical-selection/"; + }; + + openscad-kak = buildKakounePluginFrom2Nix { + pname = "openscad-kak"; + version = "2020-12-10"; + src = fetchFromGitHub { + owner = "mayjs"; + repo = "openscad.kak"; + rev = "ba51bbdcd96ccf94bb9239bef1481b6f37125849"; + sha256 = "15dybd6dnnwla6mj8sw83nwd62para1syxzifznl6rz6kp8vqjjj"; + }; + meta.homepage = "https://github.com/mayjs/openscad.kak/"; + }; + + powerline-kak = buildKakounePluginFrom2Nix { + pname = "powerline-kak"; + version = "2021-02-15"; + src = fetchFromGitHub { + owner = "jdugan6240"; + repo = "powerline.kak"; + rev = "322a760daa099d519ff50d14c29b27f3e2af00d1"; + sha256 = "0mb8f8p6g75p05ifp45i0gbq2mib8c8giz7r1xfd0yrwspp4aksc"; + }; + meta.homepage = "https://github.com/jdugan6240/powerline.kak/"; + }; + + prelude-kak = buildKakounePluginFrom2Nix { + pname = "prelude-kak"; + version = "2020-09-06"; + src = fetchFromGitHub { + owner = "alexherbo2"; + repo = "prelude.kak"; + rev = "f1e0f4d5cb62a36924e3f8ba6824d6aed8c19d23"; + sha256 = "1pncr8azqvl2z9yvzhc68p1s9fld8cvak8yz88zgrp5ypx2cxl8c"; + }; + meta.homepage = "https://github.com/alexherbo2/prelude.kak/"; + }; + + replace-mode-kak = buildKakounePluginFrom2Nix { + pname = "replace-mode-kak"; + version = "2020-10-07"; + src = fetchFromGitHub { + owner = "alexherbo2"; + repo = "replace-mode.kak"; + rev = "5f4c73cdbaf5aeb964ee35ad4b9081b233af90c0"; + sha256 = "1cmylx99bm7jwfb4hclb69sdc4n8f29ssyy2byjiw53ni9rnc8q0"; + }; + meta.homepage = "https://github.com/alexherbo2/replace-mode.kak/"; + }; + + sleuth-kak = buildKakounePluginFrom2Nix { + pname = "sleuth-kak"; + version = "2020-11-06"; + src = fetchFromGitHub { + owner = "alexherbo2"; + repo = "sleuth.kak"; + rev = "911db8bd208ad0d289b8fa15a2ac665ff39bd6bd"; + sha256 = "0g41c0038fpmihqva71xl4vfbmvsp13i47gp6fnmaikajpynzc51"; + }; + meta.homepage = "https://github.com/alexherbo2/sleuth.kak/"; + }; + + tabs-kak = buildKakounePluginFrom2Nix { + pname = "tabs-kak"; + version = "2021-02-16"; + src = fetchFromGitHub { + owner = "enricozb"; + repo = "tabs.kak"; + rev = "1aaa8cd89e404cbbd76d44ff8089de0951612fbf"; + sha256 = "0dfz6j6yxl65jbh4xvpiy2abr2sdjyalynzhl28y7l1gzqv4ni3j"; + }; + meta.homepage = "https://github.com/enricozb/tabs.kak/"; + }; + +}); +in lib.fix' (lib.extends overrides packages) diff --git a/pkgs/applications/editors/kakoune/plugins/kak-ansi.nix b/pkgs/applications/editors/kakoune/plugins/kak-ansi.nix deleted file mode 100644 index f34ee6d29990..000000000000 --- a/pkgs/applications/editors/kakoune/plugins/kak-ansi.nix +++ /dev/null @@ -1,32 +0,0 @@ -{ lib, stdenv, fetchFromGitHub }: - -stdenv.mkDerivation rec { - name = "kak-ansi"; - version = "0.2.1"; - - src = fetchFromGitHub { - owner = "eraserhd"; - repo = "kak-ansi"; - rev = "v${version}"; - sha256 = "0ddjih8hfyf6s4g7y46p1355kklaw1ydzzh61141i0r45wyb2d0d"; - }; - - installPhase = '' - mkdir -p $out/bin $out/share/kak/autoload/plugins/ - cp kak-ansi-filter $out/bin/ - # Hard-code path of filter and don't try to build when Kakoune boots - sed ' - /^declare-option.* ansi_filter /i\ -declare-option -hidden str ansi_filter %{'"$out"'/bin/kak-ansi-filter} - /^declare-option.* ansi_filter /,/^}/d - ' rc/ansi.kak >$out/share/kak/autoload/plugins/ansi.kak - ''; - - meta = with lib; { - description = "Kakoune support for rendering ANSI code"; - homepage = "https://github.com/eraserhd/kak-ansi"; - license = licenses.unlicense; - maintainers = with maintainers; [ eraserhd ]; - platforms = platforms.all; - }; -} diff --git a/pkgs/applications/editors/kakoune/plugins/kak-auto-pairs.nix b/pkgs/applications/editors/kakoune/plugins/kak-auto-pairs.nix deleted file mode 100644 index 36842f999a56..000000000000 --- a/pkgs/applications/editors/kakoune/plugins/kak-auto-pairs.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ lib, stdenv, fetchFromGitHub }: -stdenv.mkDerivation { - name = "kak-auto-pairs"; - version = "2020-07-14"; - src = fetchFromGitHub { - owner = "alexherbo2"; - repo = "auto-pairs.kak"; - rev = "5b4b3b723c34c8b7f40cee60868204974349bf9f"; - sha256 = "1wgrv03f1lkzflbbaz8n23glij5rvfxf8pcqysd668mbx1hcrk9i"; - }; - - installPhase = '' - mkdir -p $out/share/kak/autoload/plugins - cp -r rc $out/share/kak/autoload/plugins/auto-pairs - ''; - - meta = with lib; - { description = "Kakoune extension to enable automatic closing of pairs"; - homepage = "https://github.com/alexherbo2/auto-pairs.kak"; - license = licenses.unlicense; - maintainers = with maintainers; [ nrdxp ]; - platform = platforms.all; - }; -} diff --git a/pkgs/applications/editors/kakoune/plugins/kak-buffers.nix b/pkgs/applications/editors/kakoune/plugins/kak-buffers.nix deleted file mode 100644 index 7075ae3ef0a3..000000000000 --- a/pkgs/applications/editors/kakoune/plugins/kak-buffers.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ stdenv, fetchFromGitHub, lib }: -stdenv.mkDerivation { - name = "kak-buffers"; - version = "2019-04-03"; - src = fetchFromGitHub { - owner = "Delapouite"; - repo = "kakoune-buffers"; - rev = "3b35b23ac2be661a37c085d34dd04d066450f757"; - sha256 = "0f3g0v1sjinii3ig9753jjj35v2km4h9bcfw9xgzwz8b10d75bax"; - }; - - installPhase = '' - mkdir -p $out/share/kak/autoload/plugins - cp -r buffers.kak $out/share/kak/autoload/plugins - ''; - - meta = with lib; - { description = "Ease navigation between opened buffers in Kakoune"; - homepage = "https://github.com/Delapouite/kakoune-buffers"; - license = licenses.mit; - maintainers = with maintainers; [ nrdxp ]; - platform = platforms.all; - }; -} diff --git a/pkgs/applications/editors/kakoune/plugins/kak-fzf.nix b/pkgs/applications/editors/kakoune/plugins/kak-fzf.nix deleted file mode 100644 index b52584b44562..000000000000 --- a/pkgs/applications/editors/kakoune/plugins/kak-fzf.nix +++ /dev/null @@ -1,39 +0,0 @@ -{ lib, stdenv, fetchFromGitHub, fzf }: - -assert lib.asserts.assertOneOf "fzf" fzf.pname [ "fzf" "skim" ]; - -stdenv.mkDerivation { - name = "kak-fzf"; - version = "2020-07-26"; - - src = fetchFromGitHub { - owner = "andreyorst"; - repo = "fzf.kak"; - rev = "f23daa698ad95493fbd675ae153e3cac13ef34e9"; - hash = "sha256-BfXHTJ371ThOizMI/4BAbdJoaltGSP586hz4HqX1KWA="; - }; - - configurePhase = '' - if [[ -x "${fzf}/bin/fzf" ]]; then - fzfImpl='${fzf}/bin/fzf' - else - fzfImpl='${fzf}/bin/sk' - fi - - substituteInPlace rc/fzf.kak \ - --replace \'fzf\' \'"$fzfImpl"\' - ''; - - installPhase = '' - mkdir -p $out/share/kak/autoload/plugins - cp -r rc $out/share/kak/autoload/plugins/fzf - ''; - - meta = with lib; - { description = "Kakoune plugin that brings integration with fzf"; - homepage = "https://github.com/andreyorst/fzf.kak"; - license = licenses.mit; - maintainers = with maintainers; [ nrdxp ]; - platform = platforms.all; - }; -} diff --git a/pkgs/applications/editors/kakoune/plugins/kak-plumb.nix b/pkgs/applications/editors/kakoune/plugins/kak-plumb.nix deleted file mode 100644 index 0c59ca9a08f0..000000000000 --- a/pkgs/applications/editors/kakoune/plugins/kak-plumb.nix +++ /dev/null @@ -1,31 +0,0 @@ -{ lib, stdenv, fetchFromGitHub, kakoune-unwrapped, plan9port, ... }: - -stdenv.mkDerivation rec { - pname = "kak-plumb"; - version = "0.1.1"; - - src = fetchFromGitHub { - owner = "eraserhd"; - repo = "kak-plumb"; - rev = "v${version}"; - sha256 = "1rz6pr786slnf1a78m3sj09axr4d2lb5rg7sfa4mfg1zcjh06ps6"; - }; - - installPhase = '' - mkdir -p $out/bin $out/share/kak/autoload/plugins/ - substitute rc/plumb.kak $out/share/kak/autoload/plugins/plumb.kak \ - --replace '9 plumb' '${plan9port}/bin/9 plumb' - substitute edit-client $out/bin/edit-client \ - --replace '9 9p' '${plan9port}/bin/9 9p' \ - --replace 'kak -p' '${kakoune-unwrapped}/bin/kak -p' - chmod +x $out/bin/edit-client - ''; - - meta = with lib; { - description = "Kakoune integration with the Plan 9 plumber"; - homepage = "https://github.com/eraserhd/kak-plumb"; - license = licenses.unlicense; - maintainers = with maintainers; [ eraserhd ]; - platforms = platforms.all; - }; -} diff --git a/pkgs/applications/editors/kakoune/plugins/kak-powerline.nix b/pkgs/applications/editors/kakoune/plugins/kak-powerline.nix deleted file mode 100644 index 318ae2958b61..000000000000 --- a/pkgs/applications/editors/kakoune/plugins/kak-powerline.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ stdenv, git, fetchFromGitHub, lib }: -stdenv.mkDerivation { - name = "kak-powerline"; - version = "2020-08-22"; - src = fetchFromGitHub { - owner = "jdugan6240"; - repo = "powerline.kak"; - rev = "d641b2cd8024f872bcda23f9256e7aff36da02ae"; - sha256 = "65948f5ef3ab2f46f6d186ad752665c251d887631d439949decc2654a67958a4"; - }; - - configurePhase = '' - substituteInPlace rc/modules/git.kak \ - --replace \'git\' \'${git}/bin/git\' - ''; - - installPhase = '' - mkdir -p $out/share/kak/autoload/plugins - cp -r rc $out/share/kak/autoload/plugins/powerline - ''; - - meta = with lib; - { description = "Kakoune modeline, but with passion"; - homepage = "https://github.com/jdugan6240/powerline.kak"; - license = licenses.mit; - maintainers = with maintainers; [ nrdxp ]; - platform = platforms.all; - }; -} diff --git a/pkgs/applications/editors/kakoune/plugins/kak-prelude.nix b/pkgs/applications/editors/kakoune/plugins/kak-prelude.nix deleted file mode 100644 index e6f06f4b8e64..000000000000 --- a/pkgs/applications/editors/kakoune/plugins/kak-prelude.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ lib, stdenv, fetchFromGitHub }: -stdenv.mkDerivation { - name = "kak-prelude"; - version = "2020-06-09"; - - src = fetchFromGitHub { - owner = "alexherbo2"; - repo = "prelude.kak"; - rev = "f1e0f4d5cb62a36924e3f8ba6824d6aed8c19d23"; - sha256 = "1pncr8azqvl2z9yvzhc68p1s9fld8cvak8yz88zgrp5ypx2cxl8c"; - }; - - installPhase = '' - mkdir -p $out/share/kak/autoload/plugins - cp -r rc $out/share/kak/autoload/plugins/prelude - ''; - - meta = with lib; - { description = "Prelude of shell blocks for Kakoune."; - homepage = "https://github.com/alexherbo2/prelude.kak"; - license = licenses.unlicense; - maintainers = with maintainers; [ buffet ]; - platform = platforms.all; - }; -} diff --git a/pkgs/applications/editors/kakoune/plugins/kak-vertical-selection.nix b/pkgs/applications/editors/kakoune/plugins/kak-vertical-selection.nix deleted file mode 100644 index 2ef9d44854fb..000000000000 --- a/pkgs/applications/editors/kakoune/plugins/kak-vertical-selection.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ stdenv, fetchFromGitHub, lib }: -stdenv.mkDerivation { - name = "kak-vertical-selection"; - version = "2019-04-11"; - src = fetchFromGitHub { - owner = "occivink"; - repo = "kakoune-vertical-selection"; - rev = "c420f8b867ce47375fac303886e31623669a42b7"; - sha256 = "13jdyd2j45wvgqvxdzw9zww14ly93bqjb6700zzxj7mkbiff6wsb"; - }; - - installPhase = '' - mkdir -p $out/share/kak/autoload/plugins - cp -r vertical-selection.kak $out/share/kak/autoload/plugins - ''; - - meta = with lib; - { description = "Select up and down lines that match the same pattern in Kakoune"; - homepage = "https://github.com/occivink/kakoune-vertical-selection"; - license = licenses.unlicense; - maintainers = with maintainers; [ nrdxp ]; - platform = platforms.all; - }; -} diff --git a/pkgs/applications/editors/kakoune/plugins/kakoune-plugin-names b/pkgs/applications/editors/kakoune/plugins/kakoune-plugin-names new file mode 100644 index 000000000000..6cd856cb6c25 --- /dev/null +++ b/pkgs/applications/editors/kakoune/plugins/kakoune-plugin-names @@ -0,0 +1,17 @@ +alexherbo2/auto-pairs.kak +alexherbo2/connect.kak +alexherbo2/prelude.kak +alexherbo2/replace-mode.kak +alexherbo2/sleuth.kak +andreyorst/fzf.kak +danr/kakoune-easymotion +Delapouite/kakoune-buffers +Delapouite/kakoune-registers +enricozb/tabs.kak@main +greenfork/active-window.kak +jdugan6240/powerline.kak +kakoune-editor/kakoune-extra-filetypes +listentolist/kakoune-rainbow +mayjs/openscad.kak +occivink/kakoune-buffer-switcher +occivink/kakoune-vertical-selection diff --git a/pkgs/applications/editors/kakoune/plugins/kakoune-utils.nix b/pkgs/applications/editors/kakoune/plugins/kakoune-utils.nix new file mode 100644 index 000000000000..11a1cc130d6c --- /dev/null +++ b/pkgs/applications/editors/kakoune/plugins/kakoune-utils.nix @@ -0,0 +1,4 @@ +{ lib, stdenv }: +{ + inherit (import ./build-kakoune-plugin.nix { inherit lib stdenv; }) buildKakounePlugin buildKakounePluginFrom2Nix; +} diff --git a/pkgs/applications/editors/kakoune/plugins/openscad.kak.nix b/pkgs/applications/editors/kakoune/plugins/openscad.kak.nix deleted file mode 100644 index 57c1033ebbdd..000000000000 --- a/pkgs/applications/editors/kakoune/plugins/openscad.kak.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ lib, stdenv, fetchFromGitHub }: - -stdenv.mkDerivation { - pname = "openscad.kak"; - version = "unstable-2019-11-08"; - - src = fetchFromGitHub { - owner = "mayjs"; - repo = "openscad.kak"; - rev = "d9143d5e7834e3356b49720664d5647cab9db7cc"; - sha256 = "0j4dqhrn56z77hdalfdxagwz8h6nwr8s9i4w0bs2644k72lsm2ix"; - }; - - installPhase = '' - install -Dm644 rc/openscad.kak -t $out/share/kak/autoload/plugins/ - ''; - - meta = with lib; { - description = "Syntax highlighting for OpenSCAD files"; - homepage = "https://github.com/mayjs/openscad.kak"; - license = licenses.unlicense; - maintainers = with maintainers; [ eraserhd ]; - platforms = platforms.all; - }; -} diff --git a/pkgs/applications/editors/kakoune/plugins/overrides.nix b/pkgs/applications/editors/kakoune/plugins/overrides.nix new file mode 100644 index 000000000000..d75dcc9ac909 --- /dev/null +++ b/pkgs/applications/editors/kakoune/plugins/overrides.nix @@ -0,0 +1,161 @@ +{ lib, stdenv, fetchFromGitHub, fetchFromGitLab, fetchgit +, buildKakounePluginFrom2Nix +, kak-lsp, parinfer-rust, rep +, fzf, git, guile, kakoune-unwrapped, lua5_3, plan9port +}: + +self: super: { + inherit kak-lsp parinfer-rust rep; + + case-kak = buildKakounePluginFrom2Nix { + pname = "case-kak"; + version = "2020-04-06"; + src = fetchFromGitLab { + owner = "FlyingWombat"; + repo = "case.kak"; + rev = "6f1511820aa3abfa118e0f856118adc8113e2185"; + sha256 = "002njrlwgakqgp74wivbppr9qyn57dn4n5bxkr6k6nglk9qndwdp"; + }; + meta.homepage = "https://gitlab.com/FlyingWombat/case.kak"; + }; + + fzf-kak = super.fzf-kak.overrideAttrs(oldAttrs: rec { + preFixup = '' + if [[ -x "${fzf}/bin/fzf" ]]; then + fzfImpl='${fzf}/bin/fzf' + else + fzfImpl='${fzf}/bin/sk' + fi + + substituteInPlace $out/share/kak/autoload/plugins/fzf-kak/rc/fzf.kak \ + --replace \'fzf\' \'"$fzfImpl"\' + ''; + }); + + kak-ansi = stdenv.mkDerivation rec { + pname = "kak-ansi"; + version = "0.2.1"; + + src = fetchFromGitHub { + owner = "eraserhd"; + repo = "kak-ansi"; + rev = "v${version}"; + sha256 = "0ddjih8hfyf6s4g7y46p1355kklaw1ydzzh61141i0r45wyb2d0d"; + }; + + installPhase = '' + mkdir -p $out/bin $out/share/kak/autoload/plugins/ + cp kak-ansi-filter $out/bin/ + # Hard-code path of filter and don't try to build when Kakoune boots + sed ' + /^declare-option.* ansi_filter /i\ +declare-option -hidden str ansi_filter %{'"$out"'/bin/kak-ansi-filter} + /^declare-option.* ansi_filter /,/^}/d + ' rc/ansi.kak >$out/share/kak/autoload/plugins/ansi.kak + ''; + + meta = with lib; { + description = "Kakoune support for rendering ANSI code"; + homepage = "https://github.com/eraserhd/kak-ansi"; + license = licenses.unlicense; + maintainers = with maintainers; [ eraserhd ]; + platforms = platforms.all; + }; + }; + + kak-plumb = stdenv.mkDerivation rec { + pname = "kak-plumb"; + version = "0.1.1"; + + src = fetchFromGitHub { + owner = "eraserhd"; + repo = "kak-plumb"; + rev = "v${version}"; + sha256 = "1rz6pr786slnf1a78m3sj09axr4d2lb5rg7sfa4mfg1zcjh06ps6"; + }; + + installPhase = '' + mkdir -p $out/bin $out/share/kak/autoload/plugins/ + substitute rc/plumb.kak $out/share/kak/autoload/plugins/plumb.kak \ + --replace '9 plumb' '${plan9port}/bin/9 plumb' + substitute edit-client $out/bin/edit-client \ + --replace '9 9p' '${plan9port}/bin/9 9p' \ + --replace 'kak -p' '${kakoune-unwrapped}/bin/kak -p' + chmod +x $out/bin/edit-client + ''; + + meta = with lib; { + description = "Kakoune integration with the Plan 9 plumber"; + homepage = "https://github.com/eraserhd/kak-plumb"; + license = licenses.unlicense; + maintainers = with maintainers; [ eraserhd ]; + platforms = platforms.all; + }; + }; + + kakoune-rainbow = super.kakoune-rainbow.overrideAttrs(oldAttrs: rec { + preFixup = '' + mkdir -p $out/bin + mv $out/share/kak/autoload/plugins/kakoune-rainbow/bin/kak-rainbow.scm $out/bin + substituteInPlace $out/bin/kak-rainbow.scm \ + --replace '/usr/bin/env -S guile' '${guile}/bin/guile' + substituteInPlace $out/share/kak/autoload/plugins/kakoune-rainbow/rainbow.kak \ + --replace '%sh{dirname "$kak_source"}' "'$out'" + ''; + }); + + kakoune-state-save = buildKakounePluginFrom2Nix { + pname = "kakoune-state-save"; + version = "2020-02-09"; + + src = fetchFromGitLab { + owner = "Screwtapello"; + repo = "kakoune-state-save"; + rev = "ab7c0c765326a4a80af78857469ee8c80814c52a"; + sha256 = "AAOCG0TY3G188NnkkwMCSbkkNe487F4gwiFWwG9Yo+A="; + }; + + meta = with lib; { + description = "Help Kakoune save and restore state between sessions"; + homepage = "https://gitlab.com/Screwtapello/kakoune-state-save"; + license = licenses.mit; + maintainers = with maintainers; [ Flakebi ]; + platforms = platforms.all; + }; + }; + + powerline-kak = super.powerline-kak.overrideAttrs(oldAttrs: rec { + preFixup = '' + substituteInPlace $out/share/kak/autoload/plugins/powerline-kak/rc/modules/git.kak \ + --replace ' git ' ' ${git}/bin/git ' + ''; + }); + + quickscope-kak = buildKakounePluginFrom2Nix rec { + pname = "quickscope-kak"; + version = "1.0.0"; + + src = fetchgit { + url = "https://git.sr.ht/~voroskoi/quickscope.kak"; + rev = "v${version}"; + sha256 = "0y1g3zpa2ql8l9rl5i2w84bka8a09kig9nq9zdchaff5pw660mcx"; + }; + + buildInputs = [ lua5_3 ]; + + installPhase = '' + mkdir -p $out/share/kak/autoload/plugins/ + cp quickscope.* $out/share/kak/autoload/plugins/ + # substituteInPlace does not like the pipe + sed -e 's,[|] *lua,|${lua5_3}/bin/lua,' quickscope.kak >$out/share/kak/autoload/plugins/quickscope.kak + ''; + + meta = with lib; { + description = "Highlight f and t jump positions"; + homepage = "https://sr.ht/~voroskoi/quickscope.kak/"; + license = licenses.unlicense; + maintainers = with maintainers; [ eraserhd ]; + platforms = platforms.all; + }; + }; +} diff --git a/pkgs/applications/editors/kakoune/plugins/quickscope.kak.nix b/pkgs/applications/editors/kakoune/plugins/quickscope.kak.nix deleted file mode 100644 index 8e60e17e7928..000000000000 --- a/pkgs/applications/editors/kakoune/plugins/quickscope.kak.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ lib, stdenv, fetchgit, lua5_3 }: - -stdenv.mkDerivation rec { - pname = "quickscope-kak"; - version = "1.0.0"; - - src = fetchgit { - url = "https://git.sr.ht/~voroskoi/quickscope.kak"; - rev = "v${version}"; - sha256 = "0y1g3zpa2ql8l9rl5i2w84bka8a09kig9nq9zdchaff5pw660mcx"; - }; - - buildInputs = [ lua5_3 ]; - - installPhase = '' - mkdir -p $out/share/kak/autoload/plugins/ - cp quickscope.* $out/share/kak/autoload/plugins/ - # substituteInPlace does not like the pipe - sed -e 's,[|] *lua,|${lua5_3}/bin/lua,' quickscope.kak >$out/share/kak/autoload/plugins/quickscope.kak - ''; - - meta = with lib; { - description = "Highlight f and t jump positions"; - homepage = "https://sr.ht/~voroskoi/quickscope.kak/"; - license = licenses.unlicense; - maintainers = with maintainers; [ eraserhd ]; - platforms = platforms.all; - }; -} diff --git a/pkgs/applications/editors/kakoune/plugins/update.py b/pkgs/applications/editors/kakoune/plugins/update.py new file mode 100755 index 000000000000..b6a4bfe4f415 --- /dev/null +++ b/pkgs/applications/editors/kakoune/plugins/update.py @@ -0,0 +1,91 @@ +#!/usr/bin/env nix-shell +#!nix-shell -p nix-prefetch-git -p python3 -p python3Packages.GitPython nix -i python3 + +# format: +# $ nix run nixpkgs.python3Packages.black -c black update.py +# type-check: +# $ nix run nixpkgs.python3Packages.mypy -c mypy update.py +# linted: +# $ nix run nixpkgs.python3Packages.flake8 -c flake8 --ignore E501,E265,E402 update.py + +import inspect +import os +import sys +from typing import List, Tuple +from pathlib import Path + +# Import plugin update library from maintainers/scripts/pluginupdate.py +ROOT = Path(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))) +sys.path.insert( + 0, os.path.join(ROOT.parent.parent.parent.parent.parent, "maintainers", "scripts") +) +import pluginupdate + +GET_PLUGINS = f"""(with import {{}}; +let + inherit (kakouneUtils.override {{}}) buildKakounePluginFrom2Nix; + generated = callPackage {ROOT}/generated.nix {{ + inherit buildKakounePluginFrom2Nix; + }}; + hasChecksum = value: lib.isAttrs value && lib.hasAttrByPath ["src" "outputHash"] value; + getChecksum = name: value: + if hasChecksum value then {{ + submodules = value.src.fetchSubmodules or false; + sha256 = value.src.outputHash; + rev = value.src.rev; + }} else null; + checksums = lib.mapAttrs getChecksum generated; +in lib.filterAttrs (n: v: v != null) checksums)""" + +HEADER = "# This file has been generated by ./pkgs/applications/editors/kakoune/plugins/update.py. Do not edit!" + + +def generate_nix(plugins: List[Tuple[str, str, pluginupdate.Plugin]], outfile: str): + sorted_plugins = sorted(plugins, key=lambda v: v[2].name.lower()) + + with open(outfile, "w+") as f: + f.write(HEADER) + f.write( + """ +{ lib, buildKakounePluginFrom2Nix, fetchFromGitHub, overrides ? (self: super: {}) }: +let + packages = ( self: +{""" + ) + for owner, repo, plugin in sorted_plugins: + if plugin.has_submodules: + submodule_attr = "\n fetchSubmodules = true;" + else: + submodule_attr = "" + + f.write( + f""" + {plugin.normalized_name} = buildKakounePluginFrom2Nix {{ + pname = "{plugin.normalized_name}"; + version = "{plugin.version}"; + src = fetchFromGitHub {{ + owner = "{owner}"; + repo = "{repo}"; + rev = "{plugin.commit}"; + sha256 = "{plugin.sha256}";{submodule_attr} + }}; + meta.homepage = "https://github.com/{owner}/{repo}/"; + }}; +""" + ) + f.write( + """ +}); +in lib.fix' (lib.extends overrides packages) +""" + ) + print(f"updated {outfile}") + + +def main(): + editor = pluginupdate.Editor("kakoune", ROOT, GET_PLUGINS, generate_nix) + pluginupdate.update_plugins(editor) + + +if __name__ == "__main__": + main() diff --git a/pkgs/applications/networking/feedreaders/newsflash/default.nix b/pkgs/applications/networking/feedreaders/newsflash/default.nix index 6c135439322a..ac7af8e53b37 100644 --- a/pkgs/applications/networking/feedreaders/newsflash/default.nix +++ b/pkgs/applications/networking/feedreaders/newsflash/default.nix @@ -20,19 +20,19 @@ stdenv.mkDerivation rec { pname = "newsflash"; - version = "1.3.0"; + version = "1.4.0"; src = fetchFromGitLab { owner = "news-flash"; repo = "news_flash_gtk"; rev = version; - hash = "sha256-Vu8PXdnayrglAFVfO+WZTzk4Qrb/3uqzQIwClnRHto8="; + hash = "sha256-EInI5Unaz9m8/gJ7vAzJVyMynJGq0KZh12dNK8r1wnY="; }; cargoDeps = rustPlatform.fetchCargoTarball { inherit src; name = "${pname}-${version}"; - hash = "sha256-dWumQi/Bk7w2C8zVVExxguWchZU+K2qTC02otsiK9jA="; + hash = "sha256-xrWZhjfYnO6M3LMTP6l3+oZOusvUWuRBDesIlsiEJ6s="; }; patches = [ diff --git a/pkgs/applications/science/electronics/pcb/default.nix b/pkgs/applications/science/electronics/pcb/default.nix index 69ff7b2e69f3..d28f1d181215 100644 --- a/pkgs/applications/science/electronics/pcb/default.nix +++ b/pkgs/applications/science/electronics/pcb/default.nix @@ -21,11 +21,11 @@ stdenv.mkDerivation rec { pname = "pcb"; - version = "4.2.2"; + version = "4.3.0"; src = fetchurl { url = "mirror://sourceforge/pcb/${pname}-${version}.tar.gz"; - sha256 = "0pbfyfadbia1jf9ywkf02j8mfdh8c3mj390c2jdqnl70vcdszvhw"; + sha256 = "sha256-roUvRq+Eq6f1HYE/uRb8f82+6kP3E08VBQcCThdD+14="; }; nativeBuildInputs = [ diff --git a/pkgs/applications/search/doodle/default.nix b/pkgs/applications/search/doodle/default.nix index 83dbb6511442..c4f6362465ff 100644 --- a/pkgs/applications/search/doodle/default.nix +++ b/pkgs/applications/search/doodle/default.nix @@ -1,13 +1,13 @@ { lib, stdenv, fetchurl, libextractor, gettext }: stdenv.mkDerivation rec { - name = "doodle-0.7.1"; + name = "doodle-0.7.2"; buildInputs = [ libextractor gettext ]; src = fetchurl { url = "https://grothoff.org/christian/doodle/download/${name}.tar.gz"; - sha256 = "086va4q8swiablv5x72yikrdh5swhy7kzmg5wlszi5a7vjya29xw"; + sha256 = "sha256-dtRPfUjhBNgN+5zHMYmszISmBv1+K6yjKsbQBiAXWRA="; }; meta = { diff --git a/pkgs/misc/cups/drivers/canon/default.nix b/pkgs/misc/cups/drivers/canon/default.nix index 754c0f4d1d0e..0d6ec276b5f4 100644 --- a/pkgs/misc/cups/drivers/canon/default.nix +++ b/pkgs/misc/cups/drivers/canon/default.nix @@ -1,4 +1,5 @@ -{lib, stdenv, fetchurl, unzip, autoreconfHook, libtool, makeWrapper, cups, ghostscript, pkgsi686Linux, zlib }: +{ lib, stdenv, fetchurl, unzip, autoreconfHook, libtool, makeWrapper, cups +, ghostscript, pkgsi686Linux, zlib }: let @@ -20,7 +21,7 @@ in stdenv.mkDerivation { pname = "canon-cups-ufr2"; - version = version; + inherit version; src = src_canon; phases = [ "unpackPhase" "installPhase" ]; diff --git a/pkgs/misc/cups/drivers/hll2340dw/default.nix b/pkgs/misc/cups/drivers/hll2340dw/default.nix index 35d81b3da006..e61d3ace5f15 100644 --- a/pkgs/misc/cups/drivers/hll2340dw/default.nix +++ b/pkgs/misc/cups/drivers/hll2340dw/default.nix @@ -1,4 +1,6 @@ -{lib, stdenv, fetchurl, cups, dpkg, gnused, makeWrapper, ghostscript, file, a2ps, coreutils, gawk, perl, gnugrep, which}: +{ lib, stdenv, fetchurl, cups, dpkg, gnused, makeWrapper, ghostscript, file +, a2ps, coreutils, perl, gnugrep, which +}: let version = "3.2.0-1"; diff --git a/pkgs/misc/vim-plugins/update.py b/pkgs/misc/vim-plugins/update.py index f5d7434fe272..1180b4572d22 100755 --- a/pkgs/misc/vim-plugins/update.py +++ b/pkgs/misc/vim-plugins/update.py @@ -6,180 +6,18 @@ # type-check: # $ nix run nixpkgs.python3Packages.mypy -c mypy update.py # linted: -# $ nix run nixpkgs.python3Packages.flake8 -c flake8 --ignore E501,E265 update.py +# $ nix run nixpkgs.python3Packages.flake8 -c flake8 --ignore E501,E265,E402 update.py -import argparse -import functools -import http -import json +import inspect import os -import subprocess import sys -import time -import traceback -import urllib.error -import urllib.parse -import urllib.request -import xml.etree.ElementTree as ET -from datetime import datetime -from functools import wraps -from multiprocessing.dummy import Pool +from typing import List, Tuple from pathlib import Path -from typing import Dict, List, Optional, Tuple, Union, Any, Callable -from urllib.parse import urljoin, urlparse -from tempfile import NamedTemporaryFile - -import git - -ATOM_ENTRY = "{http://www.w3.org/2005/Atom}entry" # " vim gets confused here -ATOM_LINK = "{http://www.w3.org/2005/Atom}link" # " -ATOM_UPDATED = "{http://www.w3.org/2005/Atom}updated" # " - -ROOT = Path(__file__).parent -DEFAULT_IN = ROOT.joinpath("vim-plugin-names") -DEFAULT_OUT = ROOT.joinpath("generated.nix") -DEPRECATED = ROOT.joinpath("deprecated.json") - -def retry(ExceptionToCheck: Any, tries: int = 4, delay: float = 3, backoff: float = 2): - """Retry calling the decorated function using an exponential backoff. - http://www.saltycrane.com/blog/2009/11/trying-out-retry-decorator-python/ - original from: http://wiki.python.org/moin/PythonDecoratorLibrary#Retry - (BSD licensed) - :param ExceptionToCheck: the exception on which to retry - :param tries: number of times to try (not retry) before giving up - :param delay: initial delay between retries in seconds - :param backoff: backoff multiplier e.g. value of 2 will double the delay - each retry - """ - - def deco_retry(f: Callable) -> Callable: - @wraps(f) - def f_retry(*args: Any, **kwargs: Any) -> Any: - mtries, mdelay = tries, delay - while mtries > 1: - try: - return f(*args, **kwargs) - except ExceptionToCheck as e: - print(f"{str(e)}, Retrying in {mdelay} seconds...") - time.sleep(mdelay) - mtries -= 1 - mdelay *= backoff - return f(*args, **kwargs) - - return f_retry # true decorator - - return deco_retry - -def make_request(url: str) -> urllib.request.Request: - token = os.getenv("GITHUB_API_TOKEN") - headers = {} - if token is not None: - headers["Authorization"] = f"token {token}" - return urllib.request.Request(url, headers=headers) - -class Repo: - def __init__( - self, owner: str, name: str, branch: str, alias: Optional[str] - ) -> None: - self.owner = owner - self.name = name - self.branch = branch - self.alias = alias - self.redirect: Dict[str, str] = {} - - def url(self, path: str) -> str: - return urljoin(f"https://github.com/{self.owner}/{self.name}/", path) - - def __repr__(self) -> str: - return f"Repo({self.owner}, {self.name})" - - @retry(urllib.error.URLError, tries=4, delay=3, backoff=2) - def has_submodules(self) -> bool: - try: - req = make_request(self.url(f"blob/{self.branch}/.gitmodules")) - urllib.request.urlopen(req, timeout=10).close() - except urllib.error.HTTPError as e: - if e.code == 404: - return False - else: - raise - return True - - @retry(urllib.error.URLError, tries=4, delay=3, backoff=2) - def latest_commit(self) -> Tuple[str, datetime]: - commit_url = self.url(f"commits/{self.branch}.atom") - commit_req = make_request(commit_url) - with urllib.request.urlopen(commit_req, timeout=10) as req: - self.check_for_redirect(commit_url, req) - xml = req.read() - root = ET.fromstring(xml) - latest_entry = root.find(ATOM_ENTRY) - assert latest_entry is not None, f"No commits found in repository {self}" - commit_link = latest_entry.find(ATOM_LINK) - assert commit_link is not None, f"No link tag found feed entry {xml}" - url = urlparse(commit_link.get("href")) - updated_tag = latest_entry.find(ATOM_UPDATED) - assert ( - updated_tag is not None and updated_tag.text is not None - ), f"No updated tag found feed entry {xml}" - updated = datetime.strptime(updated_tag.text, "%Y-%m-%dT%H:%M:%SZ") - return Path(str(url.path)).name, updated - - def check_for_redirect(self, url: str, req: http.client.HTTPResponse): - response_url = req.geturl() - if url != response_url: - new_owner, new_name = ( - urllib.parse.urlsplit(response_url).path.strip("/").split("/")[:2] - ) - end_line = "\n" if self.alias is None else f" as {self.alias}\n" - plugin_line = "{owner}/{name}" + end_line - - old_plugin = plugin_line.format(owner=self.owner, name=self.name) - new_plugin = plugin_line.format(owner=new_owner, name=new_name) - self.redirect[old_plugin] = new_plugin - - def prefetch_git(self, ref: str) -> str: - data = subprocess.check_output( - ["nix-prefetch-git", "--fetch-submodules", self.url(""), ref] - ) - return json.loads(data)["sha256"] - - def prefetch_github(self, ref: str) -> str: - data = subprocess.check_output( - ["nix-prefetch-url", "--unpack", self.url(f"archive/{ref}.tar.gz")] - ) - return data.strip().decode("utf-8") - - -class Plugin: - def __init__( - self, - name: str, - commit: str, - has_submodules: bool, - sha256: str, - date: Optional[datetime] = None, - ) -> None: - self.name = name - self.commit = commit - self.has_submodules = has_submodules - self.sha256 = sha256 - self.date = date - - @property - def normalized_name(self) -> str: - return self.name.replace(".", "-") - - @property - def version(self) -> str: - assert self.date is not None - return self.date.strftime("%Y-%m-%d") - - def as_json(self) -> Dict[str, str]: - copy = self.__dict__.copy() - del copy["date"] - return copy +# Import plugin update library from maintainers/scripts/pluginupdate.py +ROOT = Path(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))) +sys.path.insert(0, os.path.join(ROOT.parent.parent.parent, "maintainers", "scripts")) +import pluginupdate GET_PLUGINS = f"""(with import {{}}; let @@ -197,204 +35,16 @@ let checksums = lib.mapAttrs getChecksum generated; in lib.filterAttrs (n: v: v != null) checksums)""" - -class CleanEnvironment(object): - def __enter__(self) -> None: - self.old_environ = os.environ.copy() - local_pkgs = str(ROOT.joinpath("../../..")) - os.environ["NIX_PATH"] = f"localpkgs={local_pkgs}" - self.empty_config = NamedTemporaryFile() - self.empty_config.write(b"{}") - self.empty_config.flush() - os.environ["NIXPKGS_CONFIG"] = self.empty_config.name - - def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None: - os.environ.update(self.old_environ) - self.empty_config.close() - - -def get_current_plugins() -> List[Plugin]: - with CleanEnvironment(): - out = subprocess.check_output(["nix", "eval", "--json", GET_PLUGINS]) - data = json.loads(out) - plugins = [] - for name, attr in data.items(): - p = Plugin(name, attr["rev"], attr["submodules"], attr["sha256"]) - plugins.append(p) - return plugins - - -def prefetch_plugin( - user: str, - repo_name: str, - branch: str, - alias: Optional[str], - cache: "Optional[Cache]" = None, -) -> Tuple[Plugin, Dict[str, str]]: - repo = Repo(user, repo_name, branch, alias) - commit, date = repo.latest_commit() - has_submodules = repo.has_submodules() - cached_plugin = cache[commit] if cache else None - if cached_plugin is not None: - cached_plugin.name = alias or repo_name - cached_plugin.date = date - return cached_plugin, repo.redirect - - print(f"prefetch {user}/{repo_name}") - if has_submodules: - sha256 = repo.prefetch_git(commit) - else: - sha256 = repo.prefetch_github(commit) - - return ( - Plugin(alias or repo_name, commit, has_submodules, sha256, date=date), - repo.redirect, - ) - - -def fetch_plugin_from_pluginline(plugin_line: str) -> Plugin: - plugin, _ = prefetch_plugin(*parse_plugin_line(plugin_line)) - return plugin - - -def print_download_error(plugin: str, ex: Exception): - print(f"{plugin}: {ex}", file=sys.stderr) - ex_traceback = ex.__traceback__ - tb_lines = [ - line.rstrip("\n") - for line in traceback.format_exception(ex.__class__, ex, ex_traceback) - ] - print("\n".join(tb_lines)) - - -def check_results( - results: List[Tuple[str, str, Union[Exception, Plugin], Dict[str, str]]] -) -> Tuple[List[Tuple[str, str, Plugin]], Dict[str, str]]: - failures: List[Tuple[str, Exception]] = [] - plugins = [] - redirects: Dict[str, str] = {} - for (owner, name, result, redirect) in results: - if isinstance(result, Exception): - failures.append((name, result)) - else: - plugins.append((owner, name, result)) - redirects.update(redirect) - - print(f"{len(results) - len(failures)} plugins were checked", end="") - if len(failures) == 0: - print() - return plugins, redirects - else: - print(f", {len(failures)} plugin(s) could not be downloaded:\n") - - for (plugin, exception) in failures: - print_download_error(plugin, exception) - - sys.exit(1) - - -def parse_plugin_line(line: str) -> Tuple[str, str, str, Optional[str]]: - branch = "master" - alias = None - name, repo = line.split("/") - if " as " in repo: - repo, alias = repo.split(" as ") - alias = alias.strip() - if "@" in repo: - repo, branch = repo.split("@") - - return (name.strip(), repo.strip(), branch.strip(), alias) - - -def load_plugin_spec(plugin_file: str) -> List[Tuple[str, str, str, Optional[str]]]: - plugins = [] - with open(plugin_file) as f: - for line in f: - plugin = parse_plugin_line(line) - if not plugin[0]: - msg = f"Invalid repository {line}, must be in the format owner/repo[ as alias]" - print(msg, file=sys.stderr) - sys.exit(1) - plugins.append(plugin) - return plugins - - -def get_cache_path() -> Optional[Path]: - xdg_cache = os.environ.get("XDG_CACHE_HOME", None) - if xdg_cache is None: - home = os.environ.get("HOME", None) - if home is None: - return None - xdg_cache = str(Path(home, ".cache")) - - return Path(xdg_cache, "vim-plugin-cache.json") - - -class Cache: - def __init__(self, initial_plugins: List[Plugin]) -> None: - self.cache_file = get_cache_path() - - downloads = {} - for plugin in initial_plugins: - downloads[plugin.commit] = plugin - downloads.update(self.load()) - self.downloads = downloads - - def load(self) -> Dict[str, Plugin]: - if self.cache_file is None or not self.cache_file.exists(): - return {} - - downloads: Dict[str, Plugin] = {} - with open(self.cache_file) as f: - data = json.load(f) - for attr in data.values(): - p = Plugin( - attr["name"], attr["commit"], attr["has_submodules"], attr["sha256"] - ) - downloads[attr["commit"]] = p - return downloads - - def store(self) -> None: - if self.cache_file is None: - return - - os.makedirs(self.cache_file.parent, exist_ok=True) - with open(self.cache_file, "w+") as f: - data = {} - for name, attr in self.downloads.items(): - data[name] = attr.as_json() - json.dump(data, f, indent=4, sort_keys=True) - - def __getitem__(self, key: str) -> Optional[Plugin]: - return self.downloads.get(key, None) - - def __setitem__(self, key: str, value: Plugin) -> None: - self.downloads[key] = value - - -def prefetch( - args: Tuple[str, str, str, Optional[str]], cache: Cache -) -> Tuple[str, str, Union[Exception, Plugin], dict]: - assert len(args) == 4 - owner, repo, branch, alias = args - try: - plugin, redirect = prefetch_plugin(owner, repo, branch, alias, cache) - cache[plugin.commit] = plugin - return (owner, repo, plugin, redirect) - except Exception as e: - return (owner, repo, e, {}) - - -header = ( +HEADER = ( "# This file has been generated by ./pkgs/misc/vim-plugins/update.py. Do not edit!" ) -def generate_nix(plugins: List[Tuple[str, str, Plugin]], outfile: str): +def generate_nix(plugins: List[Tuple[str, str, pluginupdate.Plugin]], outfile: str): sorted_plugins = sorted(plugins, key=lambda v: v[2].name.lower()) with open(outfile, "w+") as f: - f.write(header) + f.write(HEADER) f.write( """ { lib, buildVimPluginFrom2Nix, fetchFromGitHub, overrides ? (self: super: {}) }: @@ -432,136 +82,9 @@ in lib.fix' (lib.extends overrides packages) print(f"updated {outfile}") -def rewrite_input( - input_file: Path, redirects: Dict[str, str] = None, append: Tuple = () -): - with open(input_file, "r") as f: - lines = f.readlines() - - lines.extend(append) - - if redirects: - lines = [redirects.get(line, line) for line in lines] - - cur_date_iso = datetime.now().strftime("%Y-%m-%d") - with open(DEPRECATED, "r") as f: - deprecations = json.load(f) - for old, new in redirects.items(): - old_plugin = fetch_plugin_from_pluginline(old) - new_plugin = fetch_plugin_from_pluginline(new) - if old_plugin.normalized_name != new_plugin.normalized_name: - deprecations[old_plugin.normalized_name] = { - "new": new_plugin.normalized_name, - "date": cur_date_iso, - } - with open(DEPRECATED, "w") as f: - json.dump(deprecations, f, indent=4, sort_keys=True) - - lines = sorted(lines, key=str.casefold) - - with open(input_file, "w") as f: - f.writelines(lines) - - -def parse_args(): - parser = argparse.ArgumentParser( - description=( - "Updates nix derivations for vim plugins" - f"By default from {DEFAULT_IN} to {DEFAULT_OUT}" - ) - ) - parser.add_argument( - "--add", - dest="add_plugins", - default=[], - action="append", - help="Plugin to add to vimPlugins from Github in the form owner/repo", - ) - parser.add_argument( - "--input-names", - "-i", - dest="input_file", - default=DEFAULT_IN, - help="A list of plugins in the form owner/repo", - ) - parser.add_argument( - "--out", - "-o", - dest="outfile", - default=DEFAULT_OUT, - help="Filename to save generated nix code", - ) - parser.add_argument( - "--proc", - "-p", - dest="proc", - type=int, - default=30, - help="Number of concurrent processes to spawn.", - ) - return parser.parse_args() - - -def commit(repo: git.Repo, message: str, files: List[Path]) -> None: - repo.index.add([str(f.resolve()) for f in files]) - - if repo.index.diff("HEAD"): - print(f'committing to nixpkgs "{message}"') - repo.index.commit(message) - else: - print("no changes in working tree to commit") - - -def get_update(input_file: str, outfile: str, proc: int): - cache: Cache = Cache(get_current_plugins()) - _prefetch = functools.partial(prefetch, cache=cache) - - def update() -> dict: - plugin_names = load_plugin_spec(input_file) - - try: - pool = Pool(processes=proc) - results = pool.map(_prefetch, plugin_names) - finally: - cache.store() - - plugins, redirects = check_results(results) - - generate_nix(plugins, outfile) - - return redirects - - return update - - def main(): - args = parse_args() - nixpkgs_repo = git.Repo(ROOT, search_parent_directories=True) - update = get_update(args.input_file, args.outfile, args.proc) - - redirects = update() - rewrite_input(args.input_file, redirects) - commit(nixpkgs_repo, "vimPlugins: update", [args.outfile]) - - if redirects: - update() - commit( - nixpkgs_repo, - "vimPlugins: resolve github repository redirects", - [args.outfile, args.input_file, DEPRECATED], - ) - - for plugin_line in args.add_plugins: - rewrite_input(args.input_file, append=(plugin_line + "\n",)) - update() - plugin = fetch_plugin_from_pluginline(plugin_line) - commit( - nixpkgs_repo, - "vimPlugins.{name}: init at {version}".format( - name=plugin.normalized_name, version=plugin.version - ), - [args.outfile, args.input_file], - ) + editor = pluginupdate.Editor("vim", ROOT, GET_PLUGINS, generate_nix) + pluginupdate.update_plugins(editor) if __name__ == "__main__": diff --git a/pkgs/tools/filesystems/rmfuse/poetry-git-overlay.nix b/pkgs/tools/filesystems/rmfuse/poetry-git-overlay.nix index 9185faedc07f..8fa2bc7a0101 100644 --- a/pkgs/tools/filesystems/rmfuse/poetry-git-overlay.nix +++ b/pkgs/tools/filesystems/rmfuse/poetry-git-overlay.nix @@ -5,8 +5,8 @@ self: super: { _: { src = pkgs.fetchgit { url = "https://github.com/rschroll/rmfuse.git"; - rev = "ac91d477cc32311c88aa7ecd1bebd6503e426ae7"; - sha256 = "129n00hricsf4jkgj39bq3m5nhvy4d4yg7mcvrcgwb2546wcix0n"; + rev = "fca03bcdd6dc118f2ba981410ec9dff7f7cb88ec"; + sha256 = "0i7dvvi2bp3hydjpzvr7vg10bx0wxz87spf7pg455aga8d0qhxgk"; }; } ); diff --git a/pkgs/tools/filesystems/rmfuse/poetry.lock b/pkgs/tools/filesystems/rmfuse/poetry.lock index a97b89181fb7..920fbddd0b63 100644 --- a/pkgs/tools/filesystems/rmfuse/poetry.lock +++ b/pkgs/tools/filesystems/rmfuse/poetry.lock @@ -1,10 +1,10 @@ [[package]] -category = "main" -description = "High level compatibility layer for multiple asynchronous event loop implementations" name = "anyio" +version = "2.2.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" optional = false python-versions = ">=3.6.2" -version = "2.1.0" [package.dependencies] idna = ">=2.8" @@ -13,16 +13,16 @@ sniffio = ">=1.1" [package.extras] curio = ["curio (>=1.4)"] doc = ["sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["coverage (>=4.5)", "hypothesis (>=4.0)", "pytest (>=6.0)", "trustme", "uvloop"] +test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=6.0)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] trio = ["trio (>=0.16)"] [[package]] -category = "main" -description = "asks - async http" name = "asks" +version = "2.4.12" +description = "asks - async http" +category = "main" optional = false python-versions = ">= 3.6.2" -version = "2.4.12" [package.dependencies] anyio = ">=2.0,<3.0" @@ -30,34 +30,34 @@ async_generator = "*" h11 = "*" [[package]] -category = "main" -description = "Async generators and context managers for Python 3.5+" name = "async-generator" +version = "1.10" +description = "Async generators and context managers for Python 3.5+" +category = "main" optional = false python-versions = ">=3.5" -version = "1.10" [[package]] -category = "main" -description = "Classes Without Boilerplate" name = "attrs" +version = "20.3.0" +description = "Classes Without Boilerplate" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.3.0" [package.extras] -dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] docs = ["furo", "sphinx", "zope.interface"] -tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] [[package]] -category = "main" -description = "The bidirectional mapping library for Python." name = "bidict" +version = "0.21.2" +description = "The bidirectional mapping library for Python." +category = "main" optional = false python-versions = ">=3.6" -version = "0.21.2" [package.extras] coverage = ["coverage (<6)", "pytest-cov (<3)"] @@ -67,23 +67,23 @@ precommit = ["pre-commit (<3)"] test = ["hypothesis (<6)", "py (<2)", "pytest (<7)", "pytest-benchmark (>=3.2.0,<4)", "sortedcollections (<2)", "sortedcontainers (<3)", "Sphinx (<4)", "sphinx-autodoc-typehints (<2)"] [[package]] -category = "main" -description = "Foreign Function Interface for Python calling C code." name = "cffi" +version = "1.14.5" +description = "Foreign Function Interface for Python calling C code." +category = "main" optional = false python-versions = "*" -version = "1.14.5" [package.dependencies] pycparser = "*" [[package]] -category = "main" -description = "cssselect2" name = "cssselect2" +version = "0.4.1" +description = "cssselect2" +category = "main" optional = false python-versions = ">=3.6" -version = "0.4.1" [package.dependencies] tinycss2 = "*" @@ -94,28 +94,28 @@ doc = ["sphinx", "sphinx-rtd-theme"] test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"] [[package]] -category = "main" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" name = "h11" +version = "0.12.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" optional = false python-versions = ">=3.6" -version = "0.12.0" [[package]] -category = "main" -description = "Internationalized Domain Names in Applications (IDNA)" name = "idna" +version = "3.1" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" optional = false python-versions = ">=3.4" -version = "3.1" [[package]] -category = "main" -description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." name = "lxml" +version = "4.6.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" -version = "4.6.2" [package.extras] cssselect = ["cssselect (>=0.7)"] @@ -124,69 +124,72 @@ htmlsoup = ["beautifulsoup4"] source = ["Cython (>=0.29.7)"] [[package]] -category = "main" -description = "Capture the outcome of Python function calls." name = "outcome" +version = "1.1.0" +description = "Capture the outcome of Python function calls." +category = "main" optional = false python-versions = ">=3.6" -version = "1.1.0" [package.dependencies] attrs = ">=19.2.0" [[package]] -category = "main" -description = "PDF file reader/writer library" name = "pdfrw" +version = "0.4" +description = "PDF file reader/writer library" +category = "main" optional = false python-versions = "*" -version = "0.4" [[package]] -category = "main" -description = "Python Imaging Library (Fork)" name = "pillow" +version = "8.1.2" +description = "Python Imaging Library (Fork)" +category = "main" optional = false python-versions = ">=3.6" -version = "8.1.0" [[package]] -category = "main" -description = "C parser in Python" name = "pycparser" +version = "2.20" +description = "C parser in Python" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.20" [[package]] -category = "main" -description = "Python 3 bindings for libfuse 3 with async I/O support" name = "pyfuse3" +version = "3.2.0" +description = "Python 3 bindings for libfuse 3 with async I/O support" +category = "main" optional = false python-versions = ">=3.5" -version = "3.2.0" [package.dependencies] trio = ">=0.15" [[package]] -category = "main" -description = "The Reportlab Toolkit" name = "reportlab" +version = "3.5.65" +description = "The Reportlab Toolkit" +category = "main" optional = false -python-versions = "*" -version = "3.5.59" +python-versions = ">=2.7, >=3.6, <4" [package.dependencies] pillow = ">=4.0.0" +[package.extras] +rlpycairo = ["rlPyCairo (>=0.0.5)"] + [[package]] -category = "main" -description = "reMarkable Cloud Library" name = "rmcl" +version = "0.4.0" +description = "reMarkable Cloud Library" +category = "main" optional = false python-versions = ">=3.7,<4.0" -version = "0.3.1" [package.dependencies] asks = ">=2.4.12,<3.0.0" @@ -194,30 +197,38 @@ trio = ">=0.18.0,<0.19.0" xdg = ">=5.0.1,<6.0.0" [[package]] -category = "main" -description = "" name = "rmfuse" +version = "0.2.1" +description = "" +category = "main" optional = false python-versions = "^3.7" -version = "0.1.1" +develop = false [package.dependencies] bidict = "^0.21.2" -pyfuse3 = "^3.2.0" -rmcl = "^0.3.1" -rmrl = "^0.1.2" +pyfuse3 = {version = "^3.2.0", optional = true} +rmcl = "^0.4.0" +rmrl = "^0.2.1" +xdg = "^5.0.1" + +[package.extras] +pyfuse3 = ["pyfuse3 (>=3.2.0,<4.0.0)"] +llfuse = ["llfuse (>=1.4.1,<2.0.0)"] [package.source] -reference = "ac91d477cc32311c88aa7ecd1bebd6503e426ae7" type = "git" url = "https://github.com/rschroll/rmfuse.git" +reference = "master" +resolved_reference = "fca03bcdd6dc118f2ba981410ec9dff7f7cb88ec" + [[package]] -category = "main" -description = "Render reMarkable documents to PDF" name = "rmrl" +version = "0.2.1" +description = "Render reMarkable documents to PDF" +category = "main" optional = false python-versions = ">=3.7,<4.0" -version = "0.1.2" [package.dependencies] pdfrw = ">=0.4,<0.5" @@ -226,28 +237,28 @@ svglib = ">=1.0.1,<2.0.0" xdg = ">=5.0.1,<6.0.0" [[package]] -category = "main" -description = "Sniff out which async library your code is running under" name = "sniffio" +version = "1.2.0" +description = "Sniff out which async library your code is running under" +category = "main" optional = false python-versions = ">=3.5" -version = "1.2.0" [[package]] -category = "main" -description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" name = "sortedcontainers" +version = "2.3.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +category = "main" optional = false python-versions = "*" -version = "2.3.0" [[package]] -category = "main" -description = "A pure-Python library for reading and converting SVG" name = "svglib" +version = "1.0.1" +description = "A pure-Python library for reading and converting SVG" +category = "main" optional = false python-versions = ">=3" -version = "1.0.1" [package.dependencies] cssselect2 = ">=0.2.0" @@ -256,12 +267,12 @@ reportlab = "*" tinycss2 = ">=0.6.0" [[package]] -category = "main" -description = "tinycss2" name = "tinycss2" +version = "1.1.0" +description = "tinycss2" +category = "main" optional = false python-versions = ">=3.6" -version = "1.1.0" [package.dependencies] webencodings = ">=0.4" @@ -271,47 +282,47 @@ doc = ["sphinx", "sphinx-rtd-theme"] test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"] [[package]] -category = "main" -description = "A friendly Python library for async concurrency and I/O" name = "trio" +version = "0.18.0" +description = "A friendly Python library for async concurrency and I/O" +category = "main" optional = false python-versions = ">=3.6" -version = "0.18.0" [package.dependencies] async-generator = ">=1.9" attrs = ">=19.2.0" -cffi = ">=1.14" +cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""} idna = "*" outcome = "*" sniffio = "*" sortedcontainers = "*" [[package]] -category = "main" -description = "Character encoding aliases for legacy web content" name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "main" optional = false python-versions = "*" -version = "0.5.1" [[package]] -category = "main" -description = "Variables defined by the XDG Base Directory Specification" name = "xdg" +version = "5.0.1" +description = "Variables defined by the XDG Base Directory Specification" +category = "main" optional = false python-versions = ">=3.6,<4.0" -version = "5.0.1" [metadata] -content-hash = "df8dfb527656dec034712b2d07aaacfdee20f89f635d38af52bb21888d7d4130" -lock-version = "1.0" +lock-version = "1.1" python-versions = "^3.8" +content-hash = "3da90f3013f1220c9081c0a11dac7d8cd05c5a47ebda40fbb4357e44503e99a3" [metadata.files] anyio = [ - {file = "anyio-2.1.0-py3-none-any.whl", hash = "sha256:c286818ccd5dcbd5d385b223f16a055393474527b1d5650da489828a9887d559"}, - {file = "anyio-2.1.0.tar.gz", hash = "sha256:8a56e08623dc55955a06719d4ad62de6009bb3f1dd04936e60b2104dd58da484"}, + {file = "anyio-2.2.0-py3-none-any.whl", hash = "sha256:aa3da546ed17f097ca876c78024dea380a3b7fa80759abfdda59f12176a3dac8"}, + {file = "anyio-2.2.0.tar.gz", hash = "sha256:4a41c5b3a65ed92e469d51b6fba3779301850ea2e352afcf9e36c46f21ee14a9"}, ] asks = [ {file = "asks-2.4.12.tar.gz", hash = "sha256:38de944eb350e7e4e3a918055fa8ff033da5f7b5ff385c1160a2d6b9d84783b0"}, @@ -427,38 +438,39 @@ pdfrw = [ {file = "pdfrw-0.4.tar.gz", hash = "sha256:0dc0494a0e6561b268542b28ede2280387c2728114f117d3bb5d8e4787b93ef4"}, ] pillow = [ - {file = "Pillow-8.1.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:d355502dce85ade85a2511b40b4c61a128902f246504f7de29bbeec1ae27933a"}, - {file = "Pillow-8.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:93a473b53cc6e0b3ce6bf51b1b95b7b1e7e6084be3a07e40f79b42e83503fbf2"}, - {file = "Pillow-8.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2353834b2c49b95e1313fb34edf18fca4d57446675d05298bb694bca4b194174"}, - {file = "Pillow-8.1.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:1d208e670abfeb41b6143537a681299ef86e92d2a3dac299d3cd6830d5c7bded"}, - {file = "Pillow-8.1.0-cp36-cp36m-win32.whl", hash = "sha256:dd9eef866c70d2cbbea1ae58134eaffda0d4bfea403025f4db6859724b18ab3d"}, - {file = "Pillow-8.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b09e10ec453de97f9a23a5aa5e30b334195e8d2ddd1ce76cc32e52ba63c8b31d"}, - {file = "Pillow-8.1.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:b02a0b9f332086657852b1f7cb380f6a42403a6d9c42a4c34a561aa4530d5234"}, - {file = "Pillow-8.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ca20739e303254287138234485579b28cb0d524401f83d5129b5ff9d606cb0a8"}, - {file = "Pillow-8.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:604815c55fd92e735f9738f65dabf4edc3e79f88541c221d292faec1904a4b17"}, - {file = "Pillow-8.1.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cf6e33d92b1526190a1de904df21663c46a456758c0424e4f947ae9aa6088bf7"}, - {file = "Pillow-8.1.0-cp37-cp37m-win32.whl", hash = "sha256:47c0d93ee9c8b181f353dbead6530b26980fe4f5485aa18be8f1fd3c3cbc685e"}, - {file = "Pillow-8.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:96d4dc103d1a0fa6d47c6c55a47de5f5dafd5ef0114fa10c85a1fd8e0216284b"}, - {file = "Pillow-8.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:7916cbc94f1c6b1301ac04510d0881b9e9feb20ae34094d3615a8a7c3db0dcc0"}, - {file = "Pillow-8.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3de6b2ee4f78c6b3d89d184ade5d8fa68af0848f9b6b6da2b9ab7943ec46971a"}, - {file = "Pillow-8.1.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cdbbe7dff4a677fb555a54f9bc0450f2a21a93c5ba2b44e09e54fcb72d2bd13d"}, - {file = "Pillow-8.1.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f50e7a98b0453f39000619d845be8b06e611e56ee6e8186f7f60c3b1e2f0feae"}, - {file = "Pillow-8.1.0-cp38-cp38-win32.whl", hash = "sha256:cb192176b477d49b0a327b2a5a4979552b7a58cd42037034316b8018ac3ebb59"}, - {file = "Pillow-8.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6c5275bd82711cd3dcd0af8ce0bb99113ae8911fc2952805f1d012de7d600a4c"}, - {file = "Pillow-8.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:165c88bc9d8dba670110c689e3cc5c71dbe4bfb984ffa7cbebf1fac9554071d6"}, - {file = "Pillow-8.1.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:5e2fe3bb2363b862671eba632537cd3a823847db4d98be95690b7e382f3d6378"}, - {file = "Pillow-8.1.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7612520e5e1a371d77e1d1ca3a3ee6227eef00d0a9cddb4ef7ecb0b7396eddf7"}, - {file = "Pillow-8.1.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d673c4990acd016229a5c1c4ee8a9e6d8f481b27ade5fc3d95938697fa443ce0"}, - {file = "Pillow-8.1.0-cp39-cp39-win32.whl", hash = "sha256:dc577f4cfdda354db3ae37a572428a90ffdbe4e51eda7849bf442fb803f09c9b"}, - {file = "Pillow-8.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:22d070ca2e60c99929ef274cfced04294d2368193e935c5d6febfd8b601bf865"}, - {file = "Pillow-8.1.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:a3d3e086474ef12ef13d42e5f9b7bbf09d39cf6bd4940f982263d6954b13f6a9"}, - {file = "Pillow-8.1.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:731ca5aabe9085160cf68b2dbef95fc1991015bc0a3a6ea46a371ab88f3d0913"}, - {file = "Pillow-8.1.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:bba80df38cfc17f490ec651c73bb37cd896bc2400cfba27d078c2135223c1206"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c3d911614b008e8a576b8e5303e3db29224b455d3d66d1b2848ba6ca83f9ece9"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:39725acf2d2e9c17356e6835dccebe7a697db55f25a09207e38b835d5e1bc032"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:81c3fa9a75d9f1afafdb916d5995633f319db09bd773cb56b8e39f1e98d90820"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:b6f00ad5ebe846cc91763b1d0c6d30a8042e02b2316e27b05de04fa6ec831ec5"}, - {file = "Pillow-8.1.0.tar.gz", hash = "sha256:887668e792b7edbfb1d3c9d8b5d8c859269a0f0eba4dda562adb95500f60dbba"}, + {file = "Pillow-8.1.2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:5cf03b9534aca63b192856aa601c68d0764810857786ea5da652581f3a44c2b0"}, + {file = "Pillow-8.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:f91b50ad88048d795c0ad004abbe1390aa1882073b1dca10bfd55d0b8cf18ec5"}, + {file = "Pillow-8.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5762ebb4436f46b566fc6351d67a9b5386b5e5de4e58fdaa18a1c83e0e20f1a8"}, + {file = "Pillow-8.1.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e2cd8ac157c1e5ae88b6dd790648ee5d2777e76f1e5c7d184eaddb2938594f34"}, + {file = "Pillow-8.1.2-cp36-cp36m-win32.whl", hash = "sha256:72027ebf682abc9bafd93b43edc44279f641e8996fb2945104471419113cfc71"}, + {file = "Pillow-8.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d1d6bca39bb6dd94fba23cdb3eeaea5e30c7717c5343004d900e2a63b132c341"}, + {file = "Pillow-8.1.2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:90882c6f084ef68b71bba190209a734bf90abb82ab5e8f64444c71d5974008c6"}, + {file = "Pillow-8.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:89e4c757a91b8c55d97c91fa09c69b3677c227b942fa749e9a66eef602f59c28"}, + {file = "Pillow-8.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8c4e32218c764bc27fe49b7328195579581aa419920edcc321c4cb877c65258d"}, + {file = "Pillow-8.1.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:a01da2c266d9868c4f91a9c6faf47a251f23b9a862dce81d2ff583135206f5be"}, + {file = "Pillow-8.1.2-cp37-cp37m-win32.whl", hash = "sha256:30d33a1a6400132e6f521640dd3f64578ac9bfb79a619416d7e8802b4ce1dd55"}, + {file = "Pillow-8.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:71b01ee69e7df527439d7752a2ce8fb89e19a32df484a308eca3e81f673d3a03"}, + {file = "Pillow-8.1.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:5a2d957eb4aba9d48170b8fe6538ec1fbc2119ffe6373782c03d8acad3323f2e"}, + {file = "Pillow-8.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:87f42c976f91ca2fc21a3293e25bd3cd895918597db1b95b93cbd949f7d019ce"}, + {file = "Pillow-8.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:15306d71a1e96d7e271fd2a0737038b5a92ca2978d2e38b6ced7966583e3d5af"}, + {file = "Pillow-8.1.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:71f31ee4df3d5e0b366dd362007740106d3210fb6a56ec4b581a5324ba254f06"}, + {file = "Pillow-8.1.2-cp38-cp38-win32.whl", hash = "sha256:98afcac3205d31ab6a10c5006b0cf040d0026a68ec051edd3517b776c1d78b09"}, + {file = "Pillow-8.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:328240f7dddf77783e72d5ed79899a6b48bc6681f8d1f6001f55933cb4905060"}, + {file = "Pillow-8.1.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:bead24c0ae3f1f6afcb915a057943ccf65fc755d11a1410a909c1fefb6c06ad1"}, + {file = "Pillow-8.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81b3716cc9744ffdf76b39afb6247eae754186838cedad0b0ac63b2571253fe6"}, + {file = "Pillow-8.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:63cd413ac52ee3f67057223d363f4f82ce966e64906aea046daf46695e3c8238"}, + {file = "Pillow-8.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:8565355a29655b28fdc2c666fd9a3890fe5edc6639d128814fafecfae2d70910"}, + {file = "Pillow-8.1.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1940fc4d361f9cc7e558d6f56ff38d7351b53052fd7911f4b60cd7bc091ea3b1"}, + {file = "Pillow-8.1.2-cp39-cp39-win32.whl", hash = "sha256:46c2bcf8e1e75d154e78417b3e3c64e96def738c2a25435e74909e127a8cba5e"}, + {file = "Pillow-8.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:aeab4cd016e11e7aa5cfc49dcff8e51561fa64818a0be86efa82c7038e9369d0"}, + {file = "Pillow-8.1.2-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:74cd9aa648ed6dd25e572453eb09b08817a1e3d9f8d1bd4d8403d99e42ea790b"}, + {file = "Pillow-8.1.2-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:e5739ae63636a52b706a0facec77b2b58e485637e1638202556156e424a02dc2"}, + {file = "Pillow-8.1.2-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:903293320efe2466c1ab3509a33d6b866dc850cfd0c5d9cc92632014cec185fb"}, + {file = "Pillow-8.1.2-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:5daba2b40782c1c5157a788ec4454067c6616f5a0c1b70e26ac326a880c2d328"}, + {file = "Pillow-8.1.2-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:1f93f2fe211f1ef75e6f589327f4d4f8545d5c8e826231b042b483d8383e8a7c"}, + {file = "Pillow-8.1.2-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:6efac40344d8f668b6c4533ae02a48d52fd852ef0654cc6f19f6ac146399c733"}, + {file = "Pillow-8.1.2-pp37-pypy37_pp73-win32.whl", hash = "sha256:f36c3ff63d6fc509ce599a2f5b0d0732189eed653420e7294c039d342c6e204a"}, + {file = "Pillow-8.1.2.tar.gz", hash = "sha256:b07c660e014852d98a00a91adfbe25033898a9d90a8f39beb2437d22a203fc44"}, ] pycparser = [ {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, @@ -468,55 +480,44 @@ pyfuse3 = [ {file = "pyfuse3-3.2.0.tar.gz", hash = "sha256:45f0053ad601b03a36e2c283a5271403674245a66a0daf50e3deaab0ea4fa82f"}, ] reportlab = [ - {file = "reportlab-3.5.59-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:1da3d7a35f918cee905facfa94bd00ae6091cadc06dca1b0b31b69ae02d41d1d"}, - {file = "reportlab-3.5.59-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:792efba0c0c6e4ee94f6dc95f305451733ee9230a1c7d51cb8e5301a549e0dfb"}, - {file = "reportlab-3.5.59-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f3d4a1a273dc141e03b72a553c11bc14dd7a27ec7654a071edcf83eb04f004bc"}, - {file = "reportlab-3.5.59-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e2b4e33fea2ce9d3a14ea39191b169e41eb2ac995274f54ac8fd27519974bce8"}, - {file = "reportlab-3.5.59-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:b1b20208ecdfffd7ca027955c4fe8972b28b30a4b3b80cf25099a08d3b20ed7c"}, - {file = "reportlab-3.5.59-cp27-cp27m-win32.whl", hash = "sha256:5ed00894e0f8281c0b7c0494b4d3067c641fd90c8e5cf933089ec4cc9a48e491"}, - {file = "reportlab-3.5.59-cp27-cp27m-win_amd64.whl", hash = "sha256:85650446538cd2f606ca234634142a7ccd74cb6db7cfec250f76a4242e0f2431"}, - {file = "reportlab-3.5.59-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:79d63ca40231ca3860859b39a92daa5219035ba9553da89a5e1b218550744121"}, - {file = "reportlab-3.5.59-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a0c377bc45e73c3f15f55d7de69fab270d174749d5b454ab0de502b15430ec2a"}, - {file = "reportlab-3.5.59-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:cfa854bea525f8c913cb77e2bda724d94b965a0eb3bcfc4a645a9baa29bb86e2"}, - {file = "reportlab-3.5.59-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3d7713dddaa8081ed709a1fa2456a43f6a74b0f07d605da8441fd53fef334f69"}, - {file = "reportlab-3.5.59-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:ff547cf4c1de7e104cad1a378431ff81efcb03e90e40871ee686107da5b91442"}, - {file = "reportlab-3.5.59-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19353aead39fc115a4d6c598d6fb9fa26da7e69160a0443ebb49b02903e704e8"}, - {file = "reportlab-3.5.59-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6f3ad2b1afe99c436563cd436d8693d4a12e2c4bd45f70c7705759ff7837fe53"}, - {file = "reportlab-3.5.59-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:b26d6f416891cef93411d6d478a25db275766081a5fb66368248293ef459f3be"}, - {file = "reportlab-3.5.59-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:dd9687359e466086b9f6fe6d8069034017f8b6ca3080944fae5709767ca6814e"}, - {file = "reportlab-3.5.59-cp36-cp36m-win32.whl", hash = "sha256:b71faf3b6e4d7058e1af1b8afedaf39a962db4a219affc8177009d8244ec10d4"}, - {file = "reportlab-3.5.59-cp36-cp36m-win_amd64.whl", hash = "sha256:4ca5233a19a5ceca23546290f43addec2345789c7d65bb32f8b2668aa148351f"}, - {file = "reportlab-3.5.59-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:9da445cb79e3f740756924c053edc952cde11a65ff5af8acfda3c0a1317136ef"}, - {file = "reportlab-3.5.59-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:07bff6742fba612da8d1b1f783c436338c6fdc6962828159827d5ca7d2b67935"}, - {file = "reportlab-3.5.59-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:52f8237654acbc78ea2fa6fb4a6a06e5b023b6da93f7889adfe2deba09473fad"}, - {file = "reportlab-3.5.59-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:739b743b7ca1ba4b4d64c321de6fccb49b562d0507ea06c817d9cc4faed5cd22"}, - {file = "reportlab-3.5.59-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:33f3cfdc492575f8af3225701301a7e62fc478358729820c9e0091aff5831378"}, - {file = "reportlab-3.5.59-cp37-cp37m-win32.whl", hash = "sha256:3e2b4d69763103b9dc9b54c0952dc3cee05cedd06e28c0987fad7f84705b12c0"}, - {file = "reportlab-3.5.59-cp37-cp37m-win_amd64.whl", hash = "sha256:18a876449c9000c391dd3415ebc8454cd7bb9e488977b894886a2d7d018f16cd"}, - {file = "reportlab-3.5.59-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:04a08d284da86882ec3a41a7c719833362ef891b09ee8e2fbb47cee352aa684a"}, - {file = "reportlab-3.5.59-cp38-cp38-manylinux1_i686.whl", hash = "sha256:83b28104edd58ad65748d2d0e60e0d97e3b91b3e90b4573ea6fe60de6811972c"}, - {file = "reportlab-3.5.59-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9fabd5fbd24f5971085ffe53150d663f158f7d3050b25c95736e29ebf676d454"}, - {file = "reportlab-3.5.59-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:b4ba4c30af7044ee987e61c88a5ffb76031ca0c53666bc85d823b7de55ddbc75"}, - {file = "reportlab-3.5.59-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:a315edef5c5610b0c75790142f49487e89ea34397fc247ae8aa890fe6d6dd057"}, - {file = "reportlab-3.5.59-cp38-cp38-win32.whl", hash = "sha256:5214a289cf01ebbd65e49bae83709671dd9edb601891cf0ae8abf85f3c0b392f"}, - {file = "reportlab-3.5.59-cp38-cp38-win_amd64.whl", hash = "sha256:009fa61710647cdc62eb373345248d8ebb93583a058990f7c4f9be46d90aa5b1"}, - {file = "reportlab-3.5.59-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:09fb11ab1500e679fc1b01199d2fed24435499856e75043a9ac0d31dd48fd881"}, - {file = "reportlab-3.5.59-cp39-cp39-manylinux1_i686.whl", hash = "sha256:18eec161411026dde49767bee4e5e8eeb8014879554811a62581dc7433628d5b"}, - {file = "reportlab-3.5.59-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:a1d3f7022a920d4a5e165d264581f1862e1c1b877ceeabb96fe98cec98125ae5"}, - {file = "reportlab-3.5.59-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:1b85c20e89c22ae902ca973df2afdd2d64d27dc4ffd2b29ebad8c805a213756b"}, - {file = "reportlab-3.5.59-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:de0c675fc2998a7eaa929c356ba49c84f53a892e9ab25e8ee7d8ebbbdcb2ac16"}, - {file = "reportlab-3.5.59-cp39-cp39-win32.whl", hash = "sha256:3b0026c1129147befd4e5a8cf25da8dea1096fce371e7b2412e36d7254019c06"}, - {file = "reportlab-3.5.59-cp39-cp39-win_amd64.whl", hash = "sha256:6191961533d49c9d860964d42bada4d7ac3bb28502d984feb8034093f2012fa8"}, - {file = "reportlab-3.5.59.tar.gz", hash = "sha256:a755cca2dcf023130b03bb671670301a992157d5c3151d838c0b68ef89894536"}, + {file = "reportlab-3.5.65-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:fd6712a8a6dca12181a3a12316f97810927861e77f2a98029efd2c5cfc8546dc"}, + {file = "reportlab-3.5.65-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:ee711804acdaf3ea7f0f2cd27f19478af993e730df8c8d923a678eb0e2572fba"}, + {file = "reportlab-3.5.65-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4c42e85851f969e21fa4d6414587b7544e877ce685e2495d7d422589c70b6281"}, + {file = "reportlab-3.5.65-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d8fefd07072bfae2715283a821fb1acf8fc4946cf925509d5cc2af791c611809"}, + {file = "reportlab-3.5.65-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:bdf751289efee4891f4f354ce9122da8de8258a40f328b3f11540c4888363337"}, + {file = "reportlab-3.5.65-cp36-cp36m-win32.whl", hash = "sha256:f0634740b099b69caed081acd89692996b5504c59f86f39781b6bebc82b267f5"}, + {file = "reportlab-3.5.65-cp36-cp36m-win_amd64.whl", hash = "sha256:d810bffd4bcd50fdcb2bab0d1fe9ea4e6187ed5237687e41c6ade6c884b00c1e"}, + {file = "reportlab-3.5.65-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:46745826657d35f86843487f4bc6f6f805f61260428f8ee13642bf6372f9df55"}, + {file = "reportlab-3.5.65-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:bc62187181582772688d65c557ad6a40a4c3bb8d1f74de463d35ea81983e9b75"}, + {file = "reportlab-3.5.65-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:58bec163f727c1c60515fc4704a961b3b4ccf2c76b4e6ec1a457ea7ed0c2d756"}, + {file = "reportlab-3.5.65-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d92834993bf998853a04946729266a3276965e7b13f7423212f1c1abdfc4a1c7"}, + {file = "reportlab-3.5.65-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:9ec95808b742ce70c1dab28b2c5bef9093816b92315b948419c2c6968658f9cc"}, + {file = "reportlab-3.5.65-cp37-cp37m-win32.whl", hash = "sha256:b9494986f35d82350b0ce0c29704a49a3945421b789dff92e93fbd3de554fa34"}, + {file = "reportlab-3.5.65-cp37-cp37m-win_amd64.whl", hash = "sha256:07f9d9c0360cb8fc780ca05264faa68b90583cd28dbdf2cda6bda34379b6e66c"}, + {file = "reportlab-3.5.65-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:81898de0a0be2c8318468ae0ae1590f828805e9b7fd68e5a50667dce8b942171"}, + {file = "reportlab-3.5.65-cp38-cp38-manylinux1_i686.whl", hash = "sha256:99aeee49a61c85f1af1087e9e418f3d0c2352c4dd0f0abbfac17ae6c467185aa"}, + {file = "reportlab-3.5.65-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:3ec70873d99c14570e2a9c44b86c8c01526871e7af5ee4b2855246db15cb0c9f"}, + {file = "reportlab-3.5.65-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c12432575c793b8cd8552fddc219bbf2813541c64d02854ae345a108fb875b9d"}, + {file = "reportlab-3.5.65-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2cf692ae7af995b499a31a3f58f2001d98e310e03f74812bcb97a08078239c0"}, + {file = "reportlab-3.5.65-cp38-cp38-win32.whl", hash = "sha256:f92388e30bf6b5d2eceb3d7b05ee2df856635f74ce7d950a8f45d2b70c685a5b"}, + {file = "reportlab-3.5.65-cp38-cp38-win_amd64.whl", hash = "sha256:6f007142f2b166f52cbb3e5d23319e3e496c429831e53b904e6db28c3370f279"}, + {file = "reportlab-3.5.65-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:8707cc21a769150154bf4634dca6e9581ae24a05f0fb81a84fcc1143b1cbbfde"}, + {file = "reportlab-3.5.65-cp39-cp39-manylinux1_i686.whl", hash = "sha256:27a831da0d17153e33c985bd7a88307e206c5a28778cddb755d5372598d12637"}, + {file = "reportlab-3.5.65-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:fe5d98cdac07dd702bcd49f5723aacdd0af8c84d70fc82a5cc3781e52aedad52"}, + {file = "reportlab-3.5.65-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:ba2d10f368c9ea1e76c84b3bb6b9982eb5a8f243c434e821c505b75ca8d85852"}, + {file = "reportlab-3.5.65-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:289539f7888239343ef7ebcd30c55e6204ef78d5f70e1547fdeb854a2da8bfa1"}, + {file = "reportlab-3.5.65-cp39-cp39-win32.whl", hash = "sha256:cdf8ff72cd6fa9303744c8409fb81ef7720da2e034c369762c2fdf496462179e"}, + {file = "reportlab-3.5.65-cp39-cp39-win_amd64.whl", hash = "sha256:4a784ecdf3008f533e5a032b96c395e8592ed5e679baaf5ef4dcc136b01c72e9"}, + {file = "reportlab-3.5.65.tar.gz", hash = "sha256:b2c7eedb4d19db63301c27ad1076086a099fd4c8ca0a6f62f6e9ed749fa5908f"}, ] rmcl = [ - {file = "rmcl-0.3.1-py3-none-any.whl", hash = "sha256:e4ebcc3e6ce7e9efb1dec4a2d0a44c463ef3854d44e1f8919c65a2b3f9312ec7"}, - {file = "rmcl-0.3.1.tar.gz", hash = "sha256:5b5316adf53cca9e56273cad220cb7374cd56e7bac962c943868b05fc090e98c"}, + {file = "rmcl-0.4.0-py3-none-any.whl", hash = "sha256:d2fc5d183b213797f5886a6af52c5531c87b4e1770cc720e0e8ba5992e728473"}, + {file = "rmcl-0.4.0.tar.gz", hash = "sha256:14bd199ff2c71269c3c1ac63d10932de6c68a250a454550940dae3f06b07527a"}, ] rmfuse = [] rmrl = [ - {file = "rmrl-0.1.2-py3-none-any.whl", hash = "sha256:173231c7122a11201232ed8fe74e4a9a65192b87886ef8a98ae912aa9b875c26"}, - {file = "rmrl-0.1.2.tar.gz", hash = "sha256:8c8e757af5ca3eb7475f56803f7f37256fe4c5cad3a9ea5ad7534b2ebd172447"}, + {file = "rmrl-0.2.1-py3-none-any.whl", hash = "sha256:c35b9f20494a6034a16e916d7351575efb3e3f77acabe9094453a7f6013eaa86"}, + {file = "rmrl-0.2.1.tar.gz", hash = "sha256:c532bef4168350e6ab17cf37c6481dc12b6a78e007c073503f082f36215b71c9"}, ] sniffio = [ {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, diff --git a/pkgs/tools/filesystems/rmfuse/pyproject.toml b/pkgs/tools/filesystems/rmfuse/pyproject.toml index 1163e308e704..e3f1767b4cfa 100644 --- a/pkgs/tools/filesystems/rmfuse/pyproject.toml +++ b/pkgs/tools/filesystems/rmfuse/pyproject.toml @@ -6,7 +6,7 @@ authors = [] [tool.poetry.dependencies] python = "^3.8" -rmfuse = {git = "https://github.com/rschroll/rmfuse.git"} +rmfuse = {git = "https://github.com/rschroll/rmfuse.git", extras = ["pyfuse3"]} [tool.poetry.dev-dependencies] diff --git a/pkgs/tools/filesystems/rmfuse/update b/pkgs/tools/filesystems/rmfuse/update old mode 100644 new mode 100755 diff --git a/pkgs/tools/filesystems/s3backer/default.nix b/pkgs/tools/filesystems/s3backer/default.nix index 650fd713a0ed..0a05a683adb1 100644 --- a/pkgs/tools/filesystems/s3backer/default.nix +++ b/pkgs/tools/filesystems/s3backer/default.nix @@ -4,10 +4,10 @@ stdenv.mkDerivation rec { pname = "s3backer"; - version = "1.5.4"; + version = "1.6.1"; src = fetchFromGitHub { - sha256 = "1228qlfgz48k9vv72hrz488zg73zls99cppb9vmikc0pzv1xndsx"; + sha256 = "sha256-67sVT72i8tOMdGH/+Oh1N7Vh/2/qD56ImGWI+tprMOM="; rev = version; repo = "s3backer"; owner = "archiecobbs"; diff --git a/pkgs/tools/misc/git-town/default.nix b/pkgs/tools/misc/git-town/default.nix index 56f9452db7b7..88d62b896df7 100644 --- a/pkgs/tools/misc/git-town/default.nix +++ b/pkgs/tools/misc/git-town/default.nix @@ -2,14 +2,14 @@ buildGoPackage rec { pname = "git-town"; - version = "7.4.0"; + version = "7.5.0"; goPackagePath = "github.com/git-town/git-town"; src = fetchFromGitHub { owner = "git-town"; repo = "git-town"; rev = "v${version}"; - sha256 = "05s2hp4xn0bs3y6rgqkpgz0k8q8yfpwkw5m8vwim95hk6n41ps18"; + sha256 = "sha256-RmLDlTK+JO2KRLuLvO927W3WYdDlteBIpgTgDXh8lC8="; }; buildFlagsArray = [ "-ldflags=-X github.com/git-town/git-town/src/cmd.version=v${version} -X github.com/git-town/git-town/src/cmd.buildDate=nix" ]; diff --git a/pkgs/tools/security/expliot/default.nix b/pkgs/tools/security/expliot/default.nix new file mode 100644 index 000000000000..a13e1707236b --- /dev/null +++ b/pkgs/tools/security/expliot/default.nix @@ -0,0 +1,72 @@ +{ lib +, aiocoap +, awsiotpythonsdk +, bluepy +, buildPythonApplication +, can +, cmd2 +, cryptography +, fetchFromGitLab +, paho-mqtt +, pyi2cflash +, pymodbus +, pynetdicom +, pyparsing +, pyserial +, pyspiflash +, pythonOlder +, upnpy +, xmltodict +, zeroconf +}: + +buildPythonApplication rec { + pname = "expliot"; + version = "0.9.6"; + disabled = pythonOlder "3.7"; + + src = fetchFromGitLab { + owner = "expliot_framework"; + repo = pname; + rev = version; + sha256 = "1wn8fyrvis0gw80zzmpivinw6mz5n33inhv39iallsl3is8xpgpa"; + }; + + propagatedBuildInputs = [ + aiocoap + awsiotpythonsdk + bluepy + can + cmd2 + cryptography + paho-mqtt + pyi2cflash + pymodbus + pynetdicom + pyparsing + pyserial + pyspiflash + upnpy + xmltodict + zeroconf + ]; + + # Project has no tests + doCheck = false; + pythonImportsCheck = [ "expliot" ]; + + meta = with lib; { + description = "IoT security testing and exploitation framework"; + longDescription = '' + EXPLIoT is a Framework for security testing and exploiting IoT + products and IoT infrastructure. It provides a set of plugins + (test cases) which are used to perform the assessment and can + be extended easily with new ones. The name EXPLIoT (pronounced + expl-aa-yo-tee) is a pun on the word exploit and explains the + purpose of the framework i.e. IoT exploitation. + ''; + homepage = "https://expliot.readthedocs.io/"; + license = with licenses; [ agpl3Plus ]; + maintainers = with maintainers; [ fab ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 412ac5b0a4d4..cf9a36b2ac8d 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -4143,6 +4143,8 @@ in expect = callPackage ../tools/misc/expect { }; + expliot = python3Packages.callPackage ../tools/security/expliot { }; + f2fs-tools = callPackage ../tools/filesystems/f2fs-tools { }; Fabric = with python3Packages; toPythonApplication Fabric; @@ -5584,11 +5586,13 @@ in kalibrate-hackrf = callPackage ../applications/radio/kalibrate-hackrf { }; wrapKakoune = kakoune: attrs: callPackage ../applications/editors/kakoune/wrapper.nix (attrs // { inherit kakoune; }); - kakounePlugins = callPackage ../applications/editors/kakoune/plugins { }; + kakounePlugins = recurseIntoAttrs (callPackage ../applications/editors/kakoune/plugins { }); + kakoune-unwrapped = callPackage ../applications/editors/kakoune { }; kakoune = wrapKakoune kakoune-unwrapped { plugins = [ ]; # override with the list of desired plugins }; + kakouneUtils = callPackage ../applications/editors/kakoune/plugins/kakoune-utils.nix { }; kak-lsp = callPackage ../tools/misc/kak-lsp { inherit (darwin.apple_sdk.frameworks) Security; @@ -26694,7 +26698,7 @@ in wownero = callPackage ../applications/blockchains/wownero.nix {}; - zcash = callPackage ../applications/blockchains/zcash { }; + zcash = callPackage ../applications/blockchains/zcash { stdenv = llvmPackages_11.stdenv; }; openethereum = callPackage ../applications/blockchains/openethereum { }; diff --git a/pkgs/top-level/php-packages.nix b/pkgs/top-level/php-packages.nix index d548be9ac2d5..7db0eb4d6a4c 100644 --- a/pkgs/top-level/php-packages.nix +++ b/pkgs/top-level/php-packages.nix @@ -401,7 +401,7 @@ lib.makeScope pkgs.newScope (self: with self; { # oci8 (7.4, 7.3, 7.2) # odbc (7.4, 7.3, 7.2) { name = "opcache"; - buildInputs = [ pcre' ] ++ lib.optionals (lib.versionAtLeast php.version "8.0") [ + buildInputs = [ pcre' ] ++ lib.optionals (!stdenv.isDarwin && lib.versionAtLeast php.version "8.0") [ valgrind.dev ]; patches = lib.optionals (lib.versionOlder php.version "7.4") [ @@ -421,7 +421,9 @@ lib.makeScope pkgs.newScope (self: with self; { #include "zend_accelerator_util_funcs.h" '') ]; zendExtension = true; - doCheck = !(lib.versionOlder php.version "7.4"); } + doCheck = !(lib.versionOlder php.version "7.4"); + # Tests launch the builtin webserver. + __darwinAllowLocalNetworking = true; } { name = "openssl"; buildInputs = [ openssl ]; configureFlags = [ "--with-openssl" ];