Tool to check Nixpkgs' pkgs/by-name directory

Overview

Nixpkgs pkgs/by-name checker

This repository implements a program to check Nixpkgs' pkgs/by-name directory as part of RFC 140.

See CONTRIBUTING.md for contributor documentation. Below is the user documentation.

Currently the only intended user for this program is Nixpkgs. So the interface may be changed in breaking ways as long as Nixpkgs is adjusted to deal with it. See the pkgs/by-name Readme for how it's used in Nixpkgs.

Nix derivations

The source code contains a default.nix file, which defines a Nix function.

The function takes an attribute set with at least these attributes as its argument:

The function returns an attribute set with at least these attributes:

There is no guarantee that the derivation succeeds on systems that don't have prebuilt store paths, but it can be attempted with

nix-build https://github.com/NixOS/nixpkgs-check-by-name/tarball/master -A build

Prebuilt store paths

The GitHub releases contain a gzip-compressed Nix Archive of the build closure of the Nix derivation with x86_64-linux as the system.

This release artifact is named x86_64-linux.nar.gz and can be imported into a local Nix store using:

storePath=$(gzip -cd x86_64-linux.nar.gz | nix-store --import | tail -1)
# To prevent it from being garbage-collected
nix-store --realise "$storePath" --add-root result

Compared to building the Nix derivations, this has the benefit that no Nix evaluation needs to take place and is therefore much faster and less storage intensive.

Binary interface

The store path acquired from the above methods contains a system-specific binary under $storePath/bin/nixpkgs-check-by-name.

The public interface of this binary is printed by calling

result/bin/nixpkgs-check-by-name --help

Validity checks

The following checks are performed when calling the binary:

File structure checks

  • pkgs/by-name must only contain subdirectories of the form ${shard}/${name}, called package directories.
  • The name's of package directories must be unique when lowercased.
  • name is a string only consisting of the ASCII characters a-z, A-Z, 0-9, - or _.
  • shard is the lowercased first two letters of name, expressed in Nix: shard = toLower (substring 0 2 name).
  • Each package directory must contain a package.nix file and may contain arbitrary other files.

Nix parser checks

  • Each package directory must not refer to files outside itself using symlinks or Nix path expressions.

Nix evaluation checks

Evaluate Nixpkgs with system set to x86_64-linux and check that:

  • For each package directory, the pkgs.${name} attribute must be defined as callPackage pkgs/by-name/${shard}/${name}/package.nix args for some args.
  • For each package directory, pkgs.lib.isDerivation pkgs.${name} must be true.

Ratchet checks

Furthermore, this tool implements certain ratchet checks. This allows gradually phasing out deprecated patterns without breaking the base branch or having to migrate it all at once. It works by not allowing new instances of the pattern to be introduced, but allowing already existing instances. The existing instances are coming from <BASE_NIXPKGS>, which is then checked against <NIXPKGS> for new instances. Ratchets should be removed eventually once the pattern is not used anymore.

The current ratchets are:

  • New manual definitions of pkgs.${name} (e.g. in pkgs/top-level/all-packages.nix) with args = { } (see nix evaluation checks) must not be introduced.
  • New top-level packages defined using pkgs.callPackage must be defined with a package directory.
    • Once a top-level package uses pkgs/by-name, it also can't be moved back out of it.
Comments
  • Automatic GitHub action updates

    Automatic GitHub action updates

    This is an alternative to #39. It runs the dependabot CLI locally in the existing weekly update CI action (along with some jq magic). Yet untested in CI, but It also works locally, which is really nice!

    Best reviewed commit-by-commit, there's some Nix changes in the first 2 commits.


    This work is sponsored by Antithesis :sparkles:

    opened by infinisil 11
  • Errors are inconsistent

    Errors are inconsistent

    See the nixpkgs_problem.rs file. There's some different ways of construct error messages in there:

    • Some are styled with a single-line, some are multi-line (since https://github.com/NixOS/nixpkgs/pull/290743)
    • Some expression paths are relative to the Nixpkgs root (e.g. EmptyArgument), some are relative to the expression file (e.g. WrongCallPackagePath, using create_path_expr). Ideally the latter should be used in all cases for more accurate errors
    • The field names are sometimes superfluous, e.g. UndefinedAttr has both relative_package_file and package_name, even though the former can be computed from the latter using structure::relative_file_for_package, which e.g. EmptyArgument does.

    These should be more consistent overall.

    opened by infinisil 8
  • Fix cargo missing in dev env

    Fix cargo missing in dev env

    No idea how I didn't notice it missing before..

    Must've come from somewhere else :shrug:

    Turns out lazyDerivation (added in https://github.com/NixOS/nixpkgs-check-by-name/pull/40/commits/3f361a461c259b738ad8914749c0ea24ff0ca018) ended up filtering out .nativeBuildInputs and co., which mkShell's inputsFrom relies on to figure out what to use for the environment.. :facepalm:

    opened by infinisil 4
  • Add dependabot configuration to update GH actions

    Add dependabot configuration to update GH actions

    @infinisil I recall you saying something about feeling dependabot is too Github specific. However, I'm not aware of an easier way to keep Github actions up-to-date. Speaking of not being GH specific, worth considering auto-mirroring this repo to another place just for backup? I thought about doing the same for my personal repos, but never got around to it.

    opened by willbush 4
  • Format Rust, Nix and Bash via treefmt

    Format Rust, Nix and Bash via treefmt

    Prompted by https://github.com/NixOS/nixpkgs-check-by-name/pull/46#discussion_r1566745927 (cc @willbush). I didn't use a bash formatter, but https://github.com/lovesegfault/beautysh seems to almost match what I've been doing!

    For Nix formatting we obviously use https://github.com/NixOS/nixfmt :)

    opened by infinisil 3
  • Explicitly expose version to avoid release script failure

    Explicitly expose version to avoid release script failure

    lazyDerivation limits which attributes are exposed, and version is not currently one of them, so we need to explicitly expose it.

    This fixes this CD failure:

    https://github.com/NixOS/nixpkgs-check-by-name/actions/runs/8637321506/job/23679230914

    This was accidentally introduced in #40 (should've made a separate PR for the first commit after all!)

    opened by infinisil 3
  • Automated update

    Automated update

    Run automated updates

    cargo changes
        Updating crates.io index
        Updating aho-corasick v1.0.4 -> v1.1.3
        Updating anstream v0.5.0 -> v0.6.13
        Updating anstyle v1.0.2 -> v1.0.6
        Updating anstyle-parse v0.2.1 -> v0.2.3
        Updating anstyle-query v1.0.0 -> v1.0.2
        Updating anstyle-wincon v2.1.0 -> v3.0.2
        Updating anyhow v1.0.75 -> v1.0.81
        Updating bitflags v2.4.0 -> v2.5.0
        Removing cc v1.0.83
        Updating clap v4.4.0 -> v4.5.3
        Updating clap_builder v4.4.0 -> v4.5.2
        Updating clap_derive v4.4.0 -> v4.5.3
        Updating clap_lex v0.5.1 -> v0.7.0
        Updating colored v2.0.4 -> v2.1.0
        Updating either v1.9.0 -> v1.10.0
        Updating errno v0.3.2 -> v0.3.8
        Removing errno-dragonfly v0.1.2
        Updating fastrand v2.0.0 -> v2.0.1
        Updating hashbrown v0.12.3 -> v0.14.3
        Updating heck v0.4.1 -> v0.5.0
        Removing hermit-abi v0.3.2
        Removing is-terminal v0.4.9
        Updating itoa v1.0.9 -> v1.0.10
        Updating libc v0.2.147 -> v0.2.153
        Updating linux-raw-sys v0.4.5 -> v0.4.13
        Updating lock_api v0.4.10 -> v0.4.11
        Updating memchr v2.5.0 -> v2.7.1
        Updating memoffset v0.8.0 -> v0.9.0
        Removing once_cell v1.18.0
        Updating parking_lot_core v0.9.8 -> v0.9.9
        Updating proc-macro2 v1.0.66 -> v1.0.79
        Updating quote v1.0.33 -> v1.0.35
        Updating redox_syscall v0.3.5 -> v0.4.1
        Updating regex v1.9.3 -> v1.10.3
        Updating regex-automata v0.3.6 -> v0.4.6
        Updating regex-syntax v0.7.4 -> v0.8.2
        Updating rowan v0.15.11 -> v0.15.15
        Updating rustix v0.38.8 -> v0.38.32
        Updating ryu v1.0.15 -> v1.0.17
        Updating serde v1.0.186 -> v1.0.197
        Updating serde_derive v1.0.186 -> v1.0.197
        Updating serde_json v1.0.105 -> v1.0.114
        Updating smallvec v1.11.1 -> v1.13.2
        Updating strsim v0.10.0 -> v0.11.0
        Updating syn v2.0.29 -> v2.0.53
        Updating temp-env v0.3.5 -> v0.3.6
        Updating tempfile v3.8.0 -> v3.10.1
        Updating unicode-ident v1.0.11 -> v1.0.12
          Adding windows-sys v0.52.0
          Adding windows-targets v0.52.4
          Adding windows_aarch64_gnullvm v0.52.4
          Adding windows_aarch64_msvc v0.52.4
          Adding windows_i686_gnu v0.52.4
          Adding windows_i686_msvc v0.52.4
          Adding windows_x86_64_gnu v0.52.4
          Adding windows_x86_64_gnullvm v0.52.4
          Adding windows_x86_64_msvc v0.52.4
    
    npins changes
    [INFO ] Updating 'nixpkgs' …
    Changes:
    -    url: https://releases.nixos.org/nixpkgs/nixpkgs-24.05pre598655.e367f7a1fb93/nixexprs.tar.xz
    +    url: https://releases.nixos.org/nixpkgs/nixpkgs-24.05pre599295.7872526e9c53/nixexprs.tar.xz
    -    hash: 0jbhrysv2dmzd2jilsdsw8y80rzlymwgvaw3jh5ky5k3bkzbi38y
    +    hash: 0ix23iwagyyh815bq65gpz7a3xnqvx5r1p6kpzhlqcb7vs6qnwcq
    [INFO ] Update successful.
    
    opened by infinixbot 3
  • Consistent relative paths to expression file

    Consistent relative paths to expression file

    🚀 Catalyst

    https://github.com/NixOS/nixpkgs-check-by-name/issues/2#issuecomment-2018895221

    📃 Description

    PR has changes needed to output error messages with paths relative to expression file instead of nixpkgs root.

    • tests: move all-packages.nix to pkgs/top-level

      In this commit I move all the tests/*/all-packages.nix to tests/*/pkgs/top-level/all-packages.nix without changing any code (breaking a lot of tests).

      The reason for this commit is to make it more obvious in the expected files results where changes where needed to get ./pkgs/by-name to become ./../by-name

    • Fix relative paths in all-packages.nix files and expected outputs

      This commit just gets tests passing again before I start modifying other code.

    • Update errors paths to be relative to the expression file

      Most changes are here to use relative paths to expression file in all cases.

    opened by willbush 2
  • Fix updates (another try)

    Fix updates (another try)

    Addresses the previous problem (https://github.com/NixOS/nixpkgs-check-by-name/pull/20#issuecomment-2013998832) with the second commit.

    Also using this opportunity to improve how we define what CI should build and make it build the automated update script (but not running it), see the first commit for that.

    This makes sure that when we make changes to the update script (like in this PR), it at least gets at least built (though not ran).

    opened by infinisil 2
  • Automated releases

    Automated releases

    This sets up automated releases, mainly so that we can distribute a pre-built version of the tool, allowing Nixpkgs' CI to fetch it without building.

    I used the release script to generate the first release, which also contains some info about how to use the artifact: https://github.com/NixOS/nixpkgs-check-by-name/releases/tag/0.1.0

    See this Matrix message for historical context.

    After this and #15 is merged, we could also extend the automated PRs to regularly update the version, such that we don't forget to do new releases.

    opened by infinisil 2
  • Fix link in CONTRIBUTING.md

    Fix link in CONTRIBUTING.md

    I didn't notice xref was failing for a valid reason when merging https://github.com/NixOS/nixpkgs-check-by-name/pull/54

    Decided to point at the release.sh which publishes the release.

    opened by willbush 1
  • Switch to using `cargo-edit` for `cargo upgrade` command

    Switch to using `cargo-edit` for `cargo upgrade` command

    The current cargo update command updates the version of dependencies in the Cargo.lock file based on the semver compatibility. It will not change the version range specified in the Cargo.toml file.

    opened by willbush 3
  • Implement automated migrations

    Implement automated migrations

    Most packages in Nixpkgs aren't defined by pkgs/by-name yet, even if they could. While one could migrate them manually, that would take a long time. Instead we should automate this. Figuring out how to do large-scale automated migrations will also be of great benefit to many other future changes in Nixpkgs.

    In this issue I'll try to explain the pre-existing work and my ideas on how to go about this in the current codebase, such that others could implement this.

    The task

    The pkgs/by-name directory has certain validity checks that need to be fulfilled. For the migration in particular, these are most important:

    1. Each package directory (e.g. pkgs/by-name/he/hello) must not refer to files outside itself using symlinks or Nix path expressions.
    2. Evaluate Nixpkgs with system set to x86_64-linux and check that: a. For each package directory, the pkgs.${name} attribute must be defined as callPackage pkgs/by-name/${shard}/${name}/package.nix args for some args. b. For each package directory, pkgs.lib.isDerivation pkgs.${name} must be true.

    A lot of packages under pkgs.* do fulfill these requirements, these are the ones we can migrate automatically. The ones that don't fulfil these requirements typically need some manual refactoring.

    After verifying these requirements, migration can happen in two separate stages:

    • Move all files needed for the package into the appropriate pkgs/by-name directory, with the entry-point at package.nix.

      Rewrite the packages definition in all-packages.nix appropriately to point to ../by-name/...

    • Optionally, if the definition in all-packages.nix has { } as the second callPackage argument, remove the definition completely.

    Examples

    • pkgs.kody (defined here) can't be migrated automatically, because its default.nix contains ../../../top-level/kodi-packages.nix, therefore not fulfilling requirement 1.
    • pkgs.termdown (defined here) can't be migrated automatically, because it's not defined using pkgs.callPackage
    • pkgs.qiv (defined here) fulfills all requirements and therefore can be migrated by:
      • Moving pkgs/applications/graphics/qiv/default.nix to pkgs/by-name/qi/qiv/package.nix and adjusting the definition in all-packages.nix to
          qiv = callPackage ../by-name/qi/qiv/package.nix {
            imlib2 = imlib2Full;
          };
        
      • We cannot remove the definition entirely because the second callPackage argument is not { }
    • pkgs.scli (defined here) fulfills all requirements and therefore can be migrated by:
      • Moving pkgs/applications/misc/scli/default.nix to pkgs/by-name/sc/scli/package.nix and adjusting the definition in all-packages.nix to
          scli = callPackage ../by-name/sc/scli/package.nix { };
        
      • And because the second callPackage argument is { } we can remove the entire definition.

    Ratchet checks

    Currently this tool implements ratchet checks, which prevent the introduction of new instances of deprecated patterns. This happens here: https://github.com/NixOS/nixpkgs-check-by-name/blob/86202962eed024d778f2bece8a68e81361898405/src/eval.rs#L515-L517

    This says that the ratchet for a specific package is "loose" (aka legacy), meaning we can migrate away from it (therefore tightening the ratchet).

    Currently these ratchet states are only used to compare the base branch and the head of a PR, such that we can detect invalid transitions between ratchet states, see ratchet.rs. This allows detect when a PR introduces a new instance of a legacy pattern.

    This notably also means that even if somebody merges a PR that introduces new instances of deprecated patterns (happens if a pattern is deprecated between the PRs CI running and it being merged), it won't break master, because these ratchets aren't invalid on their own: Only the transition from tight to loose is invalid.

    Using ratchets for migrations

    We can also use this ratchet abstraction to determine migrations, because the loose state is exactly what needs to be migrated!

    The tool can have two modes:

    • (This one currently exists) Take two Nixpkgs instances, verify them individually, then compare the ratchets between them: https://github.com/NixOS/nixpkgs-check-by-name/blob/86202962eed024d778f2bece8a68e81361898405/src/main.rs#L119
    • (This one would be new) Take a single Nixpkgs instance, verify it, then run a migration on all loose ratchets.

    Thus in addition to defining how ratchets can be compared, we just need a way to define how ratchets can be migrated.

    I've started a very rough WIP branch of this before here. Note how:

    Problem: Which files are part of a package?

    It's really tricky to figure out which files are part of a package and should therefore be moved. Because outside of pkgs/by-name, each package's entry-point file (usually default.nix) can refer to either more of its own files which should be moved (e.g. ./Cargo.lock), or refer to arbitrary files from other packages in which case it can't be moved without breaking check 1 (like ../../some/file.sh).

    I did manage to get that to work almost perfectly in an older version of this tooling. It works by creating an index of all (static) references between Nix files to figure out whether a file was only references by a single package or many packages, and then revert that relation to figure out which packages only referred to files used by that package itself.

    This tool was used to create this PR: https://github.com/NixOS/nixpkgs/pull/211832

    Notably, the current nixpkgs-check-by-name tool doesn't have such functionality, which also means that when somebody creates a PR that introduces a new package outside of pkgs/by-name, it tells them to migrate it to pkgs/by-name, even if it can't be directly migrated due to it referring to shared files! This is the reason the workaround for packages with multiple versions is necessary.

    Problem: It's non-trivial to efficiently rewrite many sections of files

    This is what I've been struggling with while experimenting. I wrote some notes on this. Basically it's really hard to use rowan (the parsing library used underneath rnix) to edit files in multiple places.

    In this case I'd like to have a basic edit operation implemented that can modify or remove attributes (for all-packages.nix). I did get that working in the older tooling, but it's a bit too hacky (still, it shows that it can be done!).

    Todo

    This is my current idea on how to progress with this:

    1. Port the reference index code from the old tool to nixpkgs-check-by-name, therefore removing the need for the multi-versioned package workaround. This means that we only have a loose ratchet exactly when we can figure out how to migrate automatically.

    2. Implement decent abstractions for representing tree changes, including moving files and changing Nix files. And implement those abstractions efficiently using rnix.

    3. Make ratchets declare how to migrate from a loose state to a tight one using the above tree change abstraction. This should be almost trivial at this point, since we already know that we can migrate, and information from determining this should allow exactly specifying how we can migrate using the abstraction for doing changes.

    4. Set up CI to run the migration for every push to Nixpkgs master, and force push the resulting changes into a separate branch, which can then be merged at any point.

      Bonus: Also make it open a tracking issue for all the packages that can't be migrated manually and update it as they are fixed.

    Every future addition of a new ratchet check (for any pattern we want to deprecate) will have to come with an implementation of how to migrate from it, which will then automatically run and be pushed to the branch, which can then be merged again as necessary.

    opened by infinisil 2
  • Automated changelogs [WIP]

    Automated changelogs [WIP]

    This adds a fully automated changelog and version pipeline, fixing #38. I looked into mainly Towncrier and Changie, but both of them weren't super integrated, so I wrote my own solution, which ended up being fairly simple.

    The solution here works like this:

    • Every PR has to have a "This change is user-facing" checkbox to the PR description (checked in the default PR template), and either:

      • Uncheck it to indicate it's not a user-facing change

      • Or add a changelog by creating a file in one of changes/unreleased/{major,medium,minor}.

        The file has to be a markdown file with its first line like # (and no other lines starting with #).

    • Every week on Tuesday (presumably after the automated update PR from Monday is merged, but can also be triggered manually at any point), a version PR is opened if the main branch has any unreleased changelogs. This PR includes:

      • Depending on whether there are any major, medium or only minor changelogs, the appropriate version number is bumped in Cargo.toml

      • A new changes/released/$MAJOR.$MEDIUM.$MINOR.md file that compiles all previously unreleased changelogs into a single file. Each changelog entry is a Markdown list entry of the form

        - <title> by @<author> in #<PR>
          <optional rest of lines>
        

        The author and PR number is automatically determined based on which PR added the changelog file.

    • Once that PR is merged (optionally with manual updates), the release will be published, with the compiled changelog included.

      Currently there's nothing that would ever update the changelog of releases, but I don't expect that to be necessary.

    This PR needs more testing and comments before it can be merged.

    • [ ] This change is user-facing

    This work is sponsored by Antithesis :sparkles:

    opened by infinisil 3
  • Extend to not just `pkgs/by-name`

    Extend to not just `pkgs/by-name`

    Recently there was an automated mass removal of lib.mdDoc which now requires subsequent PRs whenever a PR that introduces more instances gets merged.

    The approach used by nixpkgs-check-by-name makes sure that this problem doesn't happen. We should consider integrating such treewide removals to benefit from that. This will also be relevant for the upcoming automated pkgs/by-name migration.

    In particular, while this tool currently only has infrastructure for detecting when new instances of deprecated patterns are introduced, I've been planning to add infrastructure to also do automated replacements of such deprecated patterns.

    For now I haven't gotten to that, but let's use this issue to track such developments.

    opened by infinisil 2
  • Version and changelog

    Version and changelog

    We should have a changelog and decide the versioning scheme along with it. These are some thoughts regarding that, prompted via https://github.com/NixOS/nixpkgs-check-by-name/pull/37.

    I'm not considering changelog tools that use the Git log, because I don't think the Git log is valuable for users. I'd like to require each PR to submit such a changelog entry file (with an option to explicitly declare the PR as not changelog-worthy) (first seen here), and then using a tool to generate the changelog when it's time for a release:

    Regarding versions, there's various versioning schemes, but I'm liking EffVer the most, and it matches the existing versions 0.1.0 and since recently 0.1.1.

    I would like the automated weekly update PRs to also take care of bumping the release and changelog automatically if there's been any changes. To figure out the next version, all change entries should be tagged with the level of effort required to update (one of macro/meso/micro). Then the next version can be generated by increasing the previous one by that level. Though it's not perfect, because 100 micro changes could amount to a meso/macro change. So being able to adjust the automatically generated version number would be good too (also for an eventual 1.0.0 release).

    Note that we should take some precaution to not miss PRs that might get merged during which the release/update PR is open, probably by making sure that a commit gets tagged instead of the merged commit.

    opened by infinisil 5
  • Support other package sets

    Support other package sets

    We want to use the pkgs/by-name convention for other package sets, e.g. https://github.com/NixOS/nixpkgs/pull/299347.

    Here's a rough idea how this could look like:

    Package set config

    Define some Nix config file to determine which package sets exist:

    # pkgs/top-level/by-name-sets-config.nix
    {
      packageSets = {
        toplevel = {
          attrPath = [ ];
          path = ./pkgs/by-name;
          shardLength = 2;
        };
        mySet = {
          # Any attrpath that will contain the attributes
          attrPath = [ "mySet" ];
          path = ./pkgs/mySet/by-name;
          # No sharding
          shardLength = null;
        };
      };
    }
    

    Read the packages in Nix

    Create a Nix file to automatically call all of them like the current by-name-overlay.nix:

    # pkgs/top-level/by-name-sets.nix
    {
      toplevel = callPackage: {
        hello = <...>;
      };
      mySet = callPackage: {
        hi = <...>;
      };
    }
    

    For each package set declared, define it by importing by-name-sets.nix, like

    mySet = lib.makeScope pkgs.newScope (self:
      (import ./pkgs/top-level/by-name-sets.nix).mySet self.callPackage
    ) 
    

    Check the packages with the tool

    Adjust this tool to read a by-name-sets-config.nix file for determining what it needs to check and how.

    opened by infinisil 0
Releases(0.1.1)
Owner
Nix/Nixpkgs/NixOS
Nix/Nixpkgs/NixOS
Track where Nixpkgs pull requests have reached.

nixpkgs-track Track where Nixpkgs pull requests have reached (is that update in nixpkgs-unstable yet??). Originally created as a local and reliable CL

uncenter 5 Sep 28, 2024
WIP: A program for switching Dygma layouts based on window name or exe name.

Dygma Layer Switcher Config On the first run of dygma-layer-switcher the config.yml will be generated. --- # Toggle logging. logging: false # Port of

Matthew Wilding 5 Nov 11, 2023
'apk-yara-checker' is a little CLI tool written in Rust to check Yara rules against a folder of APK files.

apk-yara-checker 'apk-yara-checker' is a little CLI tool written in Rust to check Yara rules against a folder of APK files. You have to pass the folde

alberto__segura 15 Oct 5, 2022
dua (-> Disk Usage Analyzer) is a tool to conveniently learn about the usage of disk space of a given directory

dua (-> Disk Usage Analyzer) is a tool to conveniently learn about the usage of disk space of a given directory. It's parallel by default and will max

Sebastian Thiel 1.8k Jan 2, 2023
Jumpy is a tool that allows to quickly jump to one of the directory you've visited in the past

Jumpy Jumpy is a tool that allows to quickly jump to one of the directory you've visited in the past. It is heavily inspired by Zoxide but is more lig

Clément Nerma 2 Oct 3, 2022
Minimal recursive "truncate file/directory names to meet requirements" tool

trunc_filenames ssokolow@monolith ~ % trunc_filenames --help trunc_filenames 0.1.0 Rename files and directories to fit length limits. WARNING: Will n

Stephan Sokolow 2 Nov 20, 2022
A simple tool to clean all projects in a directory.

Cargo Cleanall A simple tool to clean all cargo projects in a directory. Help Cargo plugin to clean all cargo projects in a directory Usage: cargo cl

null 11 Jan 24, 2023
Rsre it's tool to rename file/directory

, Rust renamer Rsre it's tool to rename file/directory Zero dependencies ?? Requirements Rust Nightly Install With Cargo # Install nightly rust rustup

Awiteb 6 Dec 22, 2022
Check the reproducibility status of your Arch Linux packages (read-only mirror)

arch-repro-status A CLI tool for querying the reproducibility status of the Arch Linux packages using data from a rebuilderd instance such as reproduc

Arch Linux 12 Nov 16, 2022
A rustc plugin to check for numerical instability

Herbie lint for Rust What This plugin can add warnings or errors to your crate when using a numerically unstable floating point expression. Quick exam

Martin Carton 172 Oct 31, 2022
🧠 A command-line utility for switching git branches more easily. Switch branches interactively or use a fuzzy search to find that long-forgotten branch name.

git-smart-checkout A git command extension for switching git branches more efficiently. About Interactively switch branches or fuzzy search for that f

Cezar Craciun 51 Dec 29, 2022
Experimental Rust UI library for Audulus. "rui" is a temporary name.

Experimental Rust UI library for Audulus. "rui" is a temporary name.

Audulus LLC 1.1k Dec 28, 2022
A truly zero-dependency crate providing quick, easy, reliable, and scalable access to the name "jordin"

jordin Finally! A truly zero-dependency crate providing quick, easy, reliable, and scalable access to the name "jordin". Additionally, this one-of-a-k

jordin 2 Aug 4, 2022
Give me your APK, I will give you framework name

APK-FiD Give me your APK, I will give you framework name Usage ❯ apk-fid -h APK-FiD 1.0 Petruknisme <[email protected]> Give me your APK, I will giv

Aan 2 Aug 31, 2022
Like wee_alloc, but smaller since I used skinnier letters in the name.

lol_alloc A laughably simple wasm global_allocator. Like wee_alloc, but smaller since I used skinnier letters in the name. lol_alloc is a experimental

Craig 44 Dec 28, 2022
languagetool-code-comments integrates the LanguageTool API to parse, spell check, and correct the grammar of your code comments!

languagetool-code-comments integrates the LanguageTool API to parse, spell check, and correct the grammar of your code comments! Overview Install MacO

Dustin Blackman 17 Dec 25, 2022
CIEBII - Check if every bit is intact

CIEBII Checks If Every Byte Is Intact CIEBII is an image file format that checks if every single byte is intact. What does it do if it finds that a by

Codingsquirrel 2 Oct 7, 2022
Run a program with a modified process name.

tagrun Run a program with a modified process name. You can add a tag for a process with tagrun, and use the tag to locate the process with ps, pgrep o

Li 2 Dec 21, 2022
Check if the process is running inside Windows Subsystem for Linux (Bash on Windows)

is-wsl Check if the process is running inside Windows Subsystem for Linux (Bash on Windows) Inspired by sindresorhus/is-wsl and made for Rust lang. Ca

Sean Larkin 6 Jan 31, 2023