#symlink #stow #stowfile

app nstow

[BROKEN] Cross-platform symlink farm manager with links defined in a stowfile

2 releases

0.2.1 Aug 15, 2024
0.2.0 Aug 15, 2024

#625 in Filesystem

MIT license

38KB
795 lines

Nstow

BROKEN!

This crate is broken and may not be updated in the forseeable future.
Use at your own risk.

nstow is a symlink farm manager that aims to superset[^1] GNU Stow (or stow).

It is a clone of new-stow with cross-platform compatiblity.

[^1] See the comparison section below.

Install

The package nstow provies a binary named nstow.

Cargo

cargo install nstow

Distro packages

TODO

Usage

  1. Create a stowfile (see Stowfiles section further down)
  2. Link files
nstow --stow
  1. Unlink files
nstow --unstow

Examples

  • Stow has historically been used to create symlinks from compiled execs to locations on the path. See ./examples/exec for an example
  • See ./examples/dotfiles for an example on using nstow to manage dotfiles

Additional information

nstow --help

Stowfiles

nstow searches the working directory for a stowfile. Stowfiles define a set of sources and links.

---
vars:
  # Variables may be defined for use in a src or link path
  - THIS_IS_A_VAR=var_value
  # Additionally, environment variables are inherrited

stow:
  - src: some_example_file
    links:
      - ${HOME}/${THIS_IS_A_VAR}/link_it_here # One source file may be linked to many places
      - ${HOME}/some/nested/dir/link_it_here_too # Link's parent directories are created if they do not exist

  - src: alacritty.yml
    links:
      # Example of Stowfile using an env var not defined in the `var` section
      - "${XDG_CONFIG_HOME}/alacritty/alacritty.yaml"

  # Source files may be arbitrarily nested in directories
  - bash:
      - src: bashrc
        links:
          - "${HOME}/.bashrc"

      - src: bash_profile
        links:
          - "${HOME}/.bash_profile"

  # The source can have any name, even something unrelated to the link's name
  - src: readline
    links:
      - "${HOME}/.inputrc"

The stowfile above will result in links

  • ./some_example_file -> ~/var_value/link_it_here
  • ./some_example_file -> ~/some/nested/dir/link_it_here_too
  • ./alacritty.yml -> ~/.config/alacritty/alacritty.yml
  • ./bash/bashrc -> ~/.bashrc
  • ./bash/bash_profile -> ~/.bash_profile
  • ./readline -> ~/.inputrc

Comparison between nstow and gstow

nstow aims to superset (most) of stow's features [^2]

GNU Stow Feature New Stow Comments
--no
--dir
--stow
--delete
--restow
--adopt planned
--no-folding planned
--ignore=REGEX
--defer=REGEX
--override=REGEX
--backup=REGEX
--dotfiles planned

Note that stow's regexes may match the beginning or end of a file while nstow regexes match any part.

TODO: do we want full feature parity with stow and the ability to link without a stowfile? [^2]GNU Stow options are current with 2.3.1, the latest at the time of writing.

Developing

Dependencies

Dependencies are managed with a Nix Flake. While we reccomend using Nix, you can ignore it and work with Cargo directly. The toolchain list in flake.nix will specify any extra development dependencies.

Testing

./run-tests runs the script tests/integration-tests in a container so that we can create/delete symlinks with impunity.

Dependencies

~6–15MB
~185K SLoC