Pact version manager (pactup
)
> 🚀 Fast and simple Pact version manager, built in Rust
## Features
🌎 Cross-platform support (macOS, [~~Windows~~](#notes), Linux)
✨ Single file, easy installation, instant startup
🚀 Built with speed in mind
📂 Works with `.pact-version` and `.pactrc` files
## Installation
### Using a script (macOS/Linux)
For `bash`, `zsh` and `fish` shells, there's an [automatic installation script](./scripts/install.sh).
First ensure that `curl` and `unzip` are already installed on you operating system. Then execute:
```sh
curl -fsSL https://raw.githubusercontent.com/kadena-community/pactup/main/scripts/install.sh | bash
```
#### Upgrade
Upgrading `pactup` is almost the same as installing it. To prevent duplication in your shell config file add `--skip-shell` to install command.
#### Parameters
`--install-dir`
Set a custom directory for pactup to be installed. The default is `$XDG_DATA_HOME/pactup` (if `$XDG_DATA_HOME` is not defined it falls back to `$HOME/.local/share/pactup` on linux and `$HOME/Library/Application Support/pactup` on MacOS).
`--skip-shell`
Skip appending shell specific loader to shell config file, based on the current user shell, defined in `$SHELL`. e.g. for Bash, `$HOME/.bashrc`. `$HOME/.zshrc` for Zsh. For Fish - `$HOME/.config/fish/conf.d/pactup.fish`
Example:
```sh
curl -fsSL https://raw.githubusercontent.com//main/scripts/install.sh | bash -s -- --install-dir "./.pactup" --skip-shell
```
### Manually
#### Using Cargo (Linux/macOS/Windows)
```sh
cargo install pactup
```
#### Using Npm (Linux/macOS/Windows)
```sh
npm install -g pactup
```
Then, [set up your shell for pactup](#shell-setup)
#### Using a release binary (Linux/macOS/Windows)
- Download the [latest release binary](https://github.com/kadena-community/pactup/releases) for your system
- Make it available globally on `PATH` environment variable
- [Set up your shell for pactup](#shell-setup)
### Removing
To remove pactup (😢), just delete the `.pactup` folder in your home directory. You should also edit your shell configuration to remove any references to pactup (ie. read [Shell Setup](#shell-setup), and do the opposite).
## Completions
pactup ships its completions with the binary:
```sh
pactup completions --shell
```
Where `` can be one of the supported shells:
- `bash`
- `zsh`
- `fish`
- `powershell`
Please follow your shell instructions to install them.
### Shell Setup
Environment variables need to be setup before you can start using pactup.
This is done by evaluating the output of `pactup env`.
> [!NOTE]
> Check out the [Configuration](./docs/configuration.md) section to enable highly
> recommended features, like automatic version switching.
Adding a `.pact-version` to your project is as simple as:
```bash
$ pact --version
pact version 4.11.0
$ echo "4.11" > .pact-version
```
Check out the following guides for the shell you use:
#### Bash
Add the following to your `.bashrc` profile:
```bash
eval "$(pactup env --use-on-cd --shell bash)"
```
#### Zsh
Add the following to your `.zshrc` profile:
```zsh
eval "$(pactup env --use-on-cd --shell zsh)"
```
#### Fish shell
Create `~/.config/fish/conf.d/pactup.fish` add this line to it:
```fish
pactup env --use-on-cd --shell fish | source
```
#### PowerShell
Add the following to the end of your profile file:
```powershell
pactup env --use-on-cd --shell powershell | Out-String | Invoke-Expression
```
- For macOS/Linux, the profile is located at `~/.config/powershell/Microsoft.PowerShell_profile.ps1`
- On Windows to edit your profile you can run this in a PowerShell
```powershell
notepad $profile
```
#### Windows Command Prompt aka Batch aka WinCMD
pactup is also supported but is not entirely covered. You can set up a startup script for [cmd.exe](https://superuser.com/a/144348) or [Windows Terminal](https://superuser.com/a/1855283) and append the following lines:
```batch
@echo off
:: for /F will launch a new instance of cmd so we create a guard to prevent an infnite loop
if not defined PACTUP_AUTORUN_GUARD (
set "PACTUP_AUTORUN_GUARD=AutorunGuard"
FOR /f "tokens=*" %%z IN ('pactup env --use-on-cd') DO CALL %%z
)
```
#### Usage with Cmder
Usage is very similar to the normal WinCMD install, apart for a few tweaks to allow being called from the cmder startup script. The example **assumes** that the `CMDER_ROOT` environment variable is **set** to the **root directory** of your Cmder installation.
Then you can do something like this:
- Make a .cmd file to invoke it
```batch
:: %CMDER_ROOT%\bin\pactup_init.cmd
@echo off
FOR /f "tokens=*" %%z IN ('pactup env --use-on-cd') DO CALL %%z
```
- Add it to the startup script
```batch
:: %CMDER_ROOT%\config\user_profile.cmd
call "%CMDER_ROOT%\bin\pactup_init.cmd"
```
You can replace `%CMDER_ROOT%` with any other convenient path too.
## [Configuration](./docs/configuration.md)
[See the available configuration options for an extended configuration documentation](./docs/configuration.md)
## [Usage](./docs/commands.md)
[See the available commands for an extended usage documentation](./docs/command.md)
## Contributing
PRs welcome :tada:
### Developing
```sh
# Install Rust
git clone https://github.com/kadena-community/pactup
cd crates/pactup
cargo build
```
### Running Binary
```sh
cargo run -- --help # Will behave like `pactup --help`
```
### Running Tests
```sh
cargo test
```
## NOTES
- Windows is not supported because Pact does not support Windows anyway.
- The Pact binaries are problematic; they are not consistent in each release, and often, releases are missing binaries. For example, the latest release, 4.12, does not have any Mac binaries on GitHub. Expect some issues with this.
- Some older versions might require older system libs (eg. libncurses5).
## Troubleshooting
**Error: "Can't download the requested binary: Permission denied (os error 13)"**
This error occurs when installing the `development-latest` nightly version, and then attempting to force install or remove it. The issue stems from permission problems in older versions of `pactup`.
To resolve this, update to the latest `pactup` version (>=0.2.18), and run:
```bash
sudo pactup uninstall development-latest
```
After this, you should be able to run install/uninstall commands without using `sudo`.
## Credit
Pact version manager is ported from the amazing [fnm](https://github.com/Schniz/fnm) codebase.