项目作者: berberman

项目描述 :
Generate nix sources expr for the latest version of packages
高级语言: Haskell
项目地址: git://github.com/berberman/nvfetcher.git
创建时间: 2021-04-20T04:07:58Z
项目社区:https://github.com/berberman/nvfetcher

开源协议:MIT License

下载


nvfetcher

Hackage
MIT license
nix

nvfetcher is a tool to automate nix package updates. It’s built on top of shake,
integrating nvchecker.
nvfetcher cli program accepts a TOML file as config, which defines a set of package sources to run.

Overview

For example, feeding the following configuration tonvfetcher:

  1. # nvfetcher.toml
  2. [feeluown]
  3. src.pypi = "feeluown"
  4. fetch.pypi = "feeluown"

it will create _sources/generated.nix:

  1. { fetchgit, fetchurl, fetchFromGitHub }:
  2. {
  3. feeluown = {
  4. pname = "feeluown";
  5. version = "3.8.2";
  6. src = fetchurl {
  7. url = "https://pypi.io/packages/source/f/feeluown/feeluown-3.8.2.tar.gz";
  8. sha256 = "sha256-V2yzpkmjRkipZOvQGB2mYRhiiEly6QPrTOMJ7BmyWBQ=";
  9. };
  10. };
  11. }

and _sources/generated.json:

  1. {
  2. "feeluown": {
  3. "pinned": false,
  4. "cargoLocks": null,
  5. "name": "feeluown-core",
  6. "version": "3.8.2",
  7. "passthru": null,
  8. "src": {
  9. "url": "https://pypi.io/packages/source/f/feeluown/feeluown-3.8.2.tar.gz",
  10. "name": null,
  11. "type": "url",
  12. "sha256": "sha256-V2yzpkmjRkipZOvQGB2mYRhiiEly6QPrTOMJ7BmyWBQ="
  13. },
  14. "extract": null,
  15. "rustGitDeps": null
  16. }
  17. }

We tell nvfetcher how to get the latest version number of packages and how to fetch their sources given version numbers,
and nvfetcher will help us keep their version and prefetched SHA256 sums up-to-date, producing ready-to-use nix expressions in _sources/generated.nix.
Nvfetcher reads generated.json to produce version change message, such as feeluown: 3.8.1 → 3.8.2.
We always check versions of packages during each run, but only do prefetch and further operations when needed.

Live examples

How to use the generated sources file? Here are several examples:

Installation

nvfetcher package is available in nixpkgs, so you can try it with:

  1. $ nix-shell -p nvfetcher

This repo also has flakes support:

  1. $ nix run github:berberman/nvfetcher

To use it as a Haskell library, the package is available on Hackage.
If you want to use the Haskell library from flakes, there is also a shell ghcWithNvfetcher:

  1. $ nix develop github:berberman/nvfetcher#ghcWithNvfetcher
  2. $ runghc Main.hs

where you can define packages in Main.hs. See Haskell library for details.

Usage

Basically, there are two ways to use nvfetcher, where the difference is how we provide package sources definitions to it.

CLI

To run nvfetcher as a CLI program, you’ll need to provide package sources defined in TOML.

  1. Usage: nvfetcher [--version] [--help] [-o|--build-dir DIR] [--commit-changes]
  2. [-l|--changelog FILE] [-j NUM] [-r|--retry NUM] [-t|--timing]
  3. [-v|--verbose] [-f|--filter REGEX] [-k|--keyfile FILE]
  4. [--keep-old] [--keep-going] [TARGET] [-c|--config FILE]
  5. generate nix sources expr for the latest version of packages
  6. Available options:
  7. --version Show version
  8. --help Show this help text
  9. -o,--build-dir DIR Directory that nvfetcher puts artifacts to
  10. (default: "_sources")
  11. --commit-changes `git commit` build dir with version changes as commit
  12. message
  13. -l,--changelog FILE Dump version changes to a file
  14. -j NUM Number of threads (0: detected number of processors)
  15. (default: 0)
  16. -r,--retry NUM Times to retry of some rules (nvchecker, prefetch,
  17. nix-build, etc.) (default: 3)
  18. -t,--timing Show build time
  19. -v,--verbose Verbose mode
  20. -f,--filter REGEX Regex to filter packages to be updated
  21. -k,--keyfile FILE Nvchecker keyfile
  22. --keep-old Don't remove old files other than generated json and
  23. nix before build
  24. --keep-going Don't stop if some packages failed to be fetched
  25. TARGET Three targets are available: 1.build 2.clean (remove
  26. all generated files) 3.purge (remove shake db)
  27. (default: build)
  28. -c,--config FILE Path to nvfetcher TOML config
  29. (default: "nvfetcher.toml")

Each package corresponds to a TOML table, whose name is encoded as table key, with
two required fields and three optional fields in each table.
You can find an example of the configuration file, see nvfetcher_example.toml.

Keyfile

You can specify nvchecker keyfile via command line option.
For the format of this file, please refer to nvchecker documentation.

Nvchecker

Version source — how do we track upstream version updates?

  • src.github = owner/repo - the latest github release
  • src.github_tag = owner/repo - the max github tag, usually used with list options (see below)
  • src.pypi = pypi_name - the latest pypi release
  • src.git = git_url (and an optional src.branch = git_branch) - the latest commit of a repo
  • src.archpkg = archlinux_pkg_name — the latest version of an archlinux package
  • src.aur = aur_pkg_name — the latest version of an aur package
  • src.manual = v — a fixed version, which never updates
  • src.repology = project:repo — the latest version from repology
  • src.webpage = web_url and src.regex — a string in webpage that matches with regex
  • src.httpheader = request_url and src.regex — a string in http header that matches with regex
  • src.openvsx = publisher.ext_name — the latest version of a vscode extension from open vsx
  • src.vsmarketplace = publisher.ext_name — the latest version of a vscode extension from vscode marketplace
  • src.cmd = cmd — the version from a shell command (e.g. echo Meow)
  • src.container = owner/name - the latest tag of a container from the Docker registry

Optional list options for some version sources (src.github_tag, src.webpage, and src.httpheader and src.container),
see the corresponding nvchecker documentation for details.

  • src.include_regex
  • src.exclude_regex
  • src.sort_version_key
  • src.ignored

Optional global options for all kinds of version sources,
see the corresponding nvchecker documentation for details. You can tweak obtained version number using this option, e.g. stripping the prefix v or transforming the result by regex.

  • src.prefix
  • src.from_pattern
  • src.to_pattern

Nix fetcher

How do we fetch the package source if we have the target version number?
$ver is available in string, which will be set to the result of nvchecker.

  • fetch.github = owner/repo
  • fetch.pypi = pypi_name
  • fetch.git = git_url
  • fetch.url = url
  • fetch.openvsx = publisher.ext_name
  • fetch.vsmarketplace = publisher.ext_name
  • fetch.tarball = tarball_url
  • fetch.docker = owner/name

Optional config for nix-prefetch-url, applies when the fetcher equals to fetch.url.
$ver is available in string, just like for the fetch config.

  • url.name = file_name

Optional config for nix-prefetch-git, applies when the fetcher equals to fetch.github or fetch.git.

  • git.deepClone
  • git.fetchSubmodules
  • git.leaveDotGit

Optional config for fetch.docker/dockerTools.pullImage:

  • docker.os
  • docker.arch
  • docker.finalImageName
  • docker.finalImageTag
  • docker.tlsVerify

Extract src

Optional extract src config, files are extracted into build directory, and then read by readFile in generated nix expr.

  • extract = [ "file_1", "file_2", ...] - file paths are relative to the source root

Rust support

rustPlatform.buildRustPackage now accepts an attribute cargoLock to vendor dependencies from Cargo.lock,
so we can use this instead of TOFU cargoSha256 for Rust packaging. nvfetcher supports automating this process,
extracting the lock file to build and calculating cargoLock.outputHashes, as long as you set the config.
There can be many lock files in one source.

  • cargo_locks = [ "cargo_lock_path_1", "cargo_lock_path_2", ...] - relative to the source root

Passthru

passthru config, an additional set of attrs to be generated.

  • passthru = { k1 = "v1", k2 = "v2", ... }

Note: currently the values can only be strings

Pinned

If a package is pinned, we call nvchecker to check the new version iff there’s no existing version.

  • pinned = true

Git commit date

If the version source of a package is git, nvfetcher can finds out the commit date of this revision,
in the format of %Y-%m-%d by default. You can provide your own strftime format:

  • git.date_format = "strftime_format"

Force fetching

Always fetch the package, even if its version (nvchecker output) doesn’t change.
This is useful when the file to be downloaded cannot not be determined by the url.

  • fetch.force = true

Note: In such case, nvfetcher will not produce a version change log, since the version doesn’t change at all.
Only sha256 in generated files will be updated.

Haskell library

nvfetcher itself is a Haskell library as well, whereas the CLI program is just a trivial wrapper of the library.
You can create a Haskell program depending on it directly, by using the runNvFetcher entry point.
In this case, we can define packages in Haskell language, getting rid of TOML constraints.

You can find an example of using nvfetcher in the library way, see Main_example.hs.

Documentation

For details of the library, documentation of released versions is available on Hackage,
and of master is on our github pages.

Contributing

Issues and PRs are always welcome. _(:з」∠)_

Building from source:

  1. $ git clone https://github.com/berberman/nvfetcher
  2. $ nix develop
  3. $ cabal update
  4. $ cabal build