17 releases

0.2.7 Sep 7, 2023
0.2.6 Apr 1, 2023
0.2.5 Oct 6, 2022
0.2.3 Dec 10, 2021
0.1.4 Nov 16, 2020

#891 in Command line utilities

Download history 24/week @ 2024-09-23

56 downloads per month

MIT and maybe AGPL-3.0-only

33KB
684 lines

pad-path

Intuitively modify your $PATH.

Crates.io

Installation

Windows (via Scoop)

# add the bucket containing pad-path's manifest
scoop bucket add jrhawley https://github.com/jrhawley/scoop-bucket

# install
scoop install pad-path

Nix

nix profile install github:jrhawley/pad-path

Build from source (via Cargo)

# directly from crates.io
cargo install pad-path

# or, equivalently, after downloading the code repo
git clone https://github.com/jrhawley/pad-path
cd pad-path
cargo install --path .

Usage

Intuitively modify your `$PATH`

USAGE:
    pad [SUBCOMMAND]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    add       Add a directory
    clean     Remove duplicates and non-existent directories [aliases: dedup]
    dn        Decrease priority for a directory [aliases: down, dec]
    help      Prints this message or the help of the given subcommand(s)
    ls        List the directories in PATH [aliases: echo]
    revert    Revert to a previous version of PATH [aliases: undo]
    rm        Remove a directory [aliases: del]
    up        Increase priority for a directory [aliases: inc]

It would be convenient, but insecure, to have pad-path modify the shell's environment variables directly. Instead, pad-path prints out what the new $PATH will look like, and the user can set it as the value for $PATH, or pipe it to another command.

Examples

In Bash, an example workflow is below.

# display your current $PATH
> pad ls
/folder/to/remove
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin

# preview what $PATH would look like if you remove the first folder
> pad rm /folder/to/remove
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin

# set the new $PATH
> export PATH=$(pad rm /folder/to/remove)

# see that the new path is set
> echo $PATH
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin

Similarly, in PowerShell, you can assign the output of a pad-path command to $Env:Path.

# check the value of $Env:Path
> pad ls
C:\WINDOWS\system32
C:\WINDOWS
C:\WINDOWS\System32\WindowsPowerShell\v1.0
C:\WINDOWS\System32\OpenSSH
C:\Program Files\dotnet

# add a new variable to $Env:Path
> $Env:Path = (pad add "C:\Program Files\new_dir")

# check that the folder has been added correctly
> pad ls
C:\WINDOWS\system32
C:\WINDOWS
C:\WINDOWS\System32\WindowsPowerShell\v1.0
C:\WINDOWS\System32\OpenSSH
C:\Program Files\dotnet
C:\Program Files\new_dir

Development

Compilation

pad-path is designed to work on Windows, macOS, and Linux operating systems. To compile binaries for each of these systems, we make use of cargo-make.

To build a release version, run:

# for the OS you're working on
cargo make build-release

# for a specific OS
cargo make build-release-windows
cargo make build-release-macos
cargo make build-release-linux

# for all OS's
cargo make build-release-all

To create a tag and a release on GitHub, we make use of the GitHub CLI.

Testing

We generally follow the testing ideas in The Rust Programming Language Book. To run tests quickly and concisely, we make use of cargo-nextest.

# run all tests
cargo nextest run

# or, equivalently
cargo make test

Dependencies

~1.7–7.5MB
~117K SLoC