#stow #symlink #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

#178 in Filesystem

Download history 195/week @ 2024-08-15

195 downloads per month

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
~189K SLoC