mirror of https://codeberg.org/glenneth/stash.git
220 lines
5.8 KiB
Markdown
220 lines
5.8 KiB
Markdown
# Stash
|
|
|
|
`stash` is a command-line utility written in Guile Scheme that helps organize your files by moving them to a target location and creating symbolic links (symlinks) in their original location. While it's great for managing dotfiles, it works with any directories you want to organize.
|
|
|
|
## Installation
|
|
|
|
### Using Guix (Recommended)
|
|
|
|
1. Add the Stash channel to your `~/.config/guix/channels.scm`:
|
|
|
|
```scheme
|
|
(cons* (channel
|
|
(name 'stash)
|
|
(url "https://codeberg.org/glenneth/stash")
|
|
(branch "main"))
|
|
%default-channels)
|
|
```
|
|
|
|
2. Update your channels and install:
|
|
|
|
```sh
|
|
guix pull
|
|
guix install stash
|
|
```
|
|
|
|
3. Configure your shell environment:
|
|
|
|
```sh
|
|
# For Fish shell (add to ~/.config/fish/config.fish):
|
|
set -gx GUIX_PROFILE $HOME/.guix-profile
|
|
set -gx PATH $GUIX_PROFILE/bin $PATH
|
|
|
|
# For Bash (add to ~/.bashrc):
|
|
export GUIX_PROFILE=$HOME/.guix-profile
|
|
export PATH=$GUIX_PROFILE/bin:$PATH
|
|
|
|
# For Zsh (add to ~/.zshrc):
|
|
export GUIX_PROFILE=$HOME/.guix-profile
|
|
export PATH=$GUIX_PROFILE/bin:$PATH
|
|
```
|
|
|
|
### Method 2: Manual Installation
|
|
|
|
1. **Prerequisites**:
|
|
- Guile Scheme 3.0.9 or later
|
|
- A Unix-like environment (Linux/macOS)
|
|
|
|
2. **Installation Steps**:
|
|
|
|
```sh
|
|
# Clone the repository
|
|
git clone https://github.com/yourusername/stash.git
|
|
cd stash
|
|
|
|
# Add to your ~/.guile load path
|
|
mkdir -p ~/.guile.d/site/3.0
|
|
ln -s $(pwd)/modules/stash ~/.guile.d/site/3.0/
|
|
|
|
# Optional: Add a convenient alias to your shell config (~/.bashrc or ~/.zshrc)
|
|
echo 'alias stash="guile -L $(pwd) $(pwd)/stash.scm"' >> ~/.bashrc
|
|
source ~/.bashrc
|
|
```
|
|
|
|
3. **Verify Installation**:
|
|
|
|
```sh
|
|
# Test if stash works
|
|
stash --help
|
|
```
|
|
|
|
## Shell Integration
|
|
|
|
After installation, you might want to ensure the `stash` command is easily accessible:
|
|
|
|
1. **Using Guix Installation**:
|
|
- The command should be available after setting up your shell environment as shown above
|
|
- If not, create a symbolic link: `ln -sf ~/.guix-profile/bin/stash ~/.local/bin/stash`
|
|
|
|
2. **Using Manual Installation**:
|
|
|
|
- Add an alias to your shell config:
|
|
|
|
```sh
|
|
# For Fish (in ~/.config/fish/config.fish):
|
|
alias stash="guile -L /path/to/stash /path/to/stash/stash.scm"
|
|
|
|
# For Bash/Zsh:
|
|
alias stash='guile -L /path/to/stash /path/to/stash/stash.scm'
|
|
```
|
|
|
|
## Key Features
|
|
|
|
- **Flexible Usage**: Works with any directories, not just config files
|
|
- **Interactive Mode**: Option to interactively specify target directory
|
|
- **Recursive Processing**: Can process entire directory trees
|
|
- **Advanced Path Handling**: Supports home directory expansion and relative paths
|
|
- **Symlink Management**: Creates and manages symlinks while maintaining directory structure
|
|
- **Ignore Patterns**: Supports local and global ignore patterns
|
|
|
|
## Usage
|
|
|
|
Stash offers several ways to organize your files:
|
|
|
|
1. **Interactive Mode** (easiest for beginners):
|
|
|
|
```sh
|
|
# Move Pictures directory to a backup location
|
|
guile -L . stash.scm --source ~/Pictures --interactive
|
|
```
|
|
|
|
2. **Explicit Paths**:
|
|
|
|
```sh
|
|
# Move Documents to backup while keeping symlink
|
|
guile -L . stash.scm --source ~/Documents/notes --target ~/backup/notes
|
|
|
|
# Move project to code archive
|
|
guile -L . stash.scm --source ~/projects/webapp --target ~/code/archive/webapp
|
|
```
|
|
|
|
3. **Recursive Mode** (for entire directory trees):
|
|
|
|
```sh
|
|
# Archive entire projects directory
|
|
guile -L . stash.scm --source ~/projects --target ~/archive/projects --recursive
|
|
```
|
|
|
|
4. **Dot Syntax** (after files are stashed):
|
|
|
|
```sh
|
|
# Recreate symlink for previously stashed directory
|
|
cd ~/backup/notes
|
|
guile -L . stash.scm .
|
|
```
|
|
|
|
## Common Use Cases
|
|
|
|
1. **Organizing Dotfiles**:
|
|
|
|
```sh
|
|
# Move config files to dotfiles repo
|
|
guile -L . stash.scm --source ~/.config --target ~/.dotfiles/config --recursive
|
|
```
|
|
|
|
2. **Backing Up Documents**:
|
|
|
|
```sh
|
|
# Move documents to external drive
|
|
guile -L . stash.scm --source ~/Documents --target /media/backup/docs --recursive
|
|
```
|
|
|
|
3. **Project Organization**:
|
|
|
|
```sh
|
|
# Archive old project while keeping it accessible
|
|
guile -L . stash.scm --source ~/projects/old-app --target ~/archive/projects/old-app
|
|
```
|
|
|
|
## Path Handling
|
|
|
|
Stash handles various path formats:
|
|
|
|
- Absolute paths: `/home/user/documents`
|
|
- Relative paths: `../documents`, `./notes`
|
|
- Home directory: `~/documents`
|
|
- Dot notation: `.`, `..`
|
|
|
|
## Ignore Patterns
|
|
|
|
Stash supports two types of ignore files:
|
|
|
|
- `.stash-local-ignore`: Directory-specific ignore patterns
|
|
- `.stash-global-ignore`: Global ignore patterns
|
|
|
|
Default ignore patterns:
|
|
|
|
- `.git` directories
|
|
- `.stash-local-ignore` files
|
|
- `.DS_Store` files
|
|
|
|
## Project Structure
|
|
|
|
```sh
|
|
stash/
|
|
├── .guix-channel/ # Guix channel configuration
|
|
│ └── stash/
|
|
│ └── packages/
|
|
│ └── stash.scm
|
|
├── modules/
|
|
│ └── stash/
|
|
│ ├── colors.scm # Terminal colors
|
|
│ ├── conflict.scm # Conflict resolution
|
|
│ ├── file-ops.scm # File operations
|
|
│ ├── help.scm # Help messages
|
|
│ ├── log.scm # Logging utilities
|
|
│ ├── package.scm # Package information
|
|
│ ├── paths.scm # Path manipulation
|
|
│ └── tree.scm # Directory tree handling
|
|
├── tests/ # Test suite
|
|
│ ├── run-tests.sh
|
|
│ ├── test-helpers.scm
|
|
│ └── *-test.scm # Individual test files
|
|
├── README.md # Project overview
|
|
├── USER_GUIDE.md # Comprehensive documentation
|
|
└── stash.scm # Main executable
|
|
```
|
|
|
|
## Dependencies
|
|
|
|
- Guile Scheme 3.0.9
|
|
- Standard Guile libraries
|
|
|
|
## Development
|
|
|
|
See `DEVLOG.md` for detailed development history and recent changes.
|
|
|
|
## License
|
|
|
|
`stash` is licensed under the GNU General Public License v3. See the LICENSE file for more information.
|