339 lines
No EOL
8.6 KiB
Markdown
339 lines
No EOL
8.6 KiB
Markdown
# Forge - A Home-Manager Like Tool for Fedora
|
|
|
|
A lightweight configuration management tool for Fedora that provides COPR repository management, dotfile management and package installation functionality through a centralized TOML configuration.
|
|
|
|
## Overview
|
|
|
|
Forge is a bash script that helps you manage your Fedora system configuration by:
|
|
- Managing COPR repositories (enable/disable automatically)
|
|
- Installing and managing system packages via dnf
|
|
- Managing dotfiles through symlinks to actual files
|
|
- Centralized configuration via a single `forge.toml` file
|
|
- User-level configuration similar to home-manager/nixos
|
|
- Automatic backup of existing files before replacement
|
|
|
|
## Installation
|
|
|
|
1. Clone or download this repository
|
|
2. Make the script executable:
|
|
```bash
|
|
chmod +x forge
|
|
```
|
|
3. Optionally, move it to a directory in your PATH:
|
|
```bash
|
|
sudo mv forge /usr/local/bin/forge
|
|
```
|
|
|
|
## Quick Start
|
|
|
|
```bash
|
|
# Initialize the configuration structure
|
|
./forge init
|
|
|
|
# Edit the configuration file to add packages and dotfiles
|
|
nano ~/.config/forge/forge.toml
|
|
|
|
# Apply configuration
|
|
./forge switch
|
|
|
|
# Check status
|
|
./forge status
|
|
```
|
|
|
|
## Commands
|
|
|
|
### `init`
|
|
Initialize the configuration structure and create `forge.toml`.
|
|
|
|
```bash
|
|
./forge init
|
|
```
|
|
|
|
Creates:
|
|
- `~/.config/forge/` - Main configuration directory
|
|
- `~/.config/forge/forge.toml` - Central configuration file
|
|
|
|
### `switch`
|
|
Apply the current configuration (enable COPR, install packages, deploy dotfiles).
|
|
|
|
```bash
|
|
./forge switch
|
|
```
|
|
|
|
This command:
|
|
1. Enables all COPR repositories listed in `forge.toml`
|
|
2. Disables COPR repositories that are no longer configured
|
|
3. Installs all packages listed in `forge.toml`
|
|
4. Creates symlinks for all configured dotfiles
|
|
5. Creates backups of existing files before replacing them
|
|
6. Updates the last switch timestamp
|
|
|
|
### `status`
|
|
Show current configuration status and information.
|
|
|
|
```bash
|
|
./forge status
|
|
```
|
|
|
|
Displays:
|
|
- Configuration directory paths
|
|
- Last switch timestamp
|
|
- List of configured COPR repositories, packages and dotfiles
|
|
|
|
### `help`
|
|
Show help message with all available commands.
|
|
|
|
```bash
|
|
./forge help
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### forge.toml
|
|
The central configuration file located at `~/.config/forge/forge.toml`:
|
|
|
|
```toml
|
|
# Forge Configuration File
|
|
# User-level configuration similar to home-manager/nixos
|
|
|
|
[forge]
|
|
version = "1.0"
|
|
last_switch = null
|
|
|
|
[copr]
|
|
# COPR repositories to enable
|
|
# Just list COPR repository names - presence means enable, absence means don't enable
|
|
copr.fedorainfracloud.org/username/repository
|
|
copr.fedorainfracloud.org/anotheruser/anotherrepo
|
|
|
|
[packages]
|
|
# List of packages to install using dnf
|
|
# Just list package names - presence means install, absence means don't install
|
|
git
|
|
vim
|
|
curl
|
|
wget
|
|
|
|
[dotfiles]
|
|
# Dotfiles to manage with symlinks
|
|
# Format: "target_path" = "source_path"
|
|
# target_path: where the symlink should be created (relative to home directory)
|
|
# source_path: where the actual file is stored (relative to forge directory)
|
|
".bashrc" = "dotfiles/.bashrc"
|
|
".config/vimrc" = "dotfiles/vimrc"
|
|
".config/alacritty/alacritty.yml" = "dotfiles/alacritty.yml"
|
|
|
|
[options]
|
|
# Additional options
|
|
backup = true
|
|
backup_dir = "backup"
|
|
```
|
|
|
|
### Configuration Sections
|
|
|
|
#### `[forge]`
|
|
- `version`: Configuration file version
|
|
- `last_switch`: Timestamp of last switch operation (auto-updated)
|
|
|
|
#### `[copr]`
|
|
List of COPR repositories to enable via `dnf copr enable`. **Just list COPR repository names** - presence means enable, absence means don't enable.
|
|
|
|
**Examples:**
|
|
```toml
|
|
[copr]
|
|
copr.fedorainfracloud.org/username/repository
|
|
copr.fedorainfracloud.org/anotheruser/anotherrepo
|
|
```
|
|
|
|
To remove a COPR repository, simply delete the line containing the repository name. Forge will automatically disable it during the next switch.
|
|
|
|
#### `[packages]`
|
|
List of packages to install via dnf. **Just list package names** - presence means install, absence means don't install.
|
|
|
|
**Examples:**
|
|
```toml
|
|
[packages]
|
|
git
|
|
vim
|
|
curl
|
|
wget
|
|
nodejs
|
|
npm
|
|
```
|
|
|
|
To remove a package, simply delete the line containing the package name.
|
|
|
|
#### `[dotfiles]`
|
|
Dotfile mappings using symlinks:
|
|
- **Key**: Target path where symlink should be created (relative to home directory)
|
|
- **Value**: Source path where actual file is stored (relative to forge directory)
|
|
|
|
#### `[options]`
|
|
Additional configuration options:
|
|
- `backup`: Enable/disable backup of existing files (default: true)
|
|
- `backup_dir`: Directory name for backups (relative to forge directory)
|
|
|
|
## File Structure
|
|
|
|
```
|
|
~/.config/forge/
|
|
├── forge.toml # Main configuration file
|
|
├── dotfiles/ # Your actual dotfiles (source files)
|
|
│ ├── .bashrc
|
|
│ ├── vimrc
|
|
│ └── alacritty.yml
|
|
└── backup/ # Backups of replaced files
|
|
├── .bashrc.20231121_143022.bak
|
|
└── vimrc.20231121_143022.bak
|
|
```
|
|
|
|
## How It Works
|
|
|
|
### COPR Repository Management
|
|
COPR repositories are managed through the `[copr]` section in `forge.toml`:
|
|
- **Add COPR repo**: Simply add the repository name on a new line
|
|
- **Remove COPR repo**: Delete the line containing the repository name
|
|
- **Automatic cleanup**: Forge automatically disables COPR repos that are removed from configuration
|
|
- **No flags needed**: Just presence/absence of the repository name matters
|
|
|
|
### Package Management
|
|
Packages are managed through the `[packages]` section in `forge.toml`:
|
|
- **Add package**: Simply add the package name on a new line
|
|
- **Remove package**: Delete the line containing the package name
|
|
- **No flags needed**: Just presence/absence of the package name matters
|
|
|
|
### Dotfile Management
|
|
Forge uses symlinks to manage dotfiles:
|
|
1. Your actual dotfiles are stored in `~/.config/forge/dotfiles/`
|
|
2. Symlinks are created from your home directory to these files
|
|
3. This allows you to version control your dotfiles in one place
|
|
4. Changes to the source files are immediately reflected in your home directory
|
|
|
|
### Backup System
|
|
Before creating symlinks, Forge:
|
|
1. Checks if the target file exists and is not a symlink
|
|
2. Creates a timestamped backup in the backup directory
|
|
3. Removes the original file
|
|
4. Creates the symlink to your managed dotfile
|
|
|
|
## Examples
|
|
|
|
### Basic Setup
|
|
```bash
|
|
# Initialize forge
|
|
./forge init
|
|
|
|
# Edit forge.toml to add COPR repos and packages
|
|
nano ~/.config/forge/forge.toml
|
|
|
|
# Add to [copr] section:
|
|
copr.fedorainfracloud.org/username/cool-repo
|
|
|
|
# Add to [packages] section:
|
|
git
|
|
vim
|
|
curl
|
|
|
|
# Create your dotfiles directory and add files
|
|
mkdir -p ~/.config/forge/dotfiles
|
|
echo "export EDITOR=vim" > ~/.config/forge/dotfiles/.bashrc
|
|
|
|
# Add to [dotfiles] section:
|
|
".bashrc" = "dotfiles/.bashrc"
|
|
|
|
# Apply configuration
|
|
./forge switch
|
|
```
|
|
|
|
### Managing Application Configurations
|
|
```bash
|
|
# Add alacritty configuration
|
|
mkdir -p ~/.config/forge/dotfiles/.config/alacritty
|
|
cp ~/.config/alacritty/alacritty.yml ~/.config/forge/dotfiles/.config/alacritty/
|
|
|
|
# Edit forge.toml
|
|
nano ~/.config/forge/forge.toml
|
|
|
|
# Add to [dotfiles] section:
|
|
".config/alacritty/alacritty.yml" = "dotfiles/.config/alacritty/alacritty.yml"
|
|
|
|
# Apply changes
|
|
./forge switch
|
|
```
|
|
|
|
### COPR Repository Management Examples
|
|
```toml
|
|
[copr]
|
|
# Development tools COPR
|
|
copr.fedorainfracloud.org/development/tools
|
|
copr.fedorainfracloud.org/user/neovim-nightly
|
|
|
|
# To remove a COPR repo, just delete the line
|
|
# Forge will automatically disable it during the next switch
|
|
```
|
|
|
|
### Package Management Examples
|
|
```toml
|
|
[packages]
|
|
# Development tools
|
|
git
|
|
vim
|
|
nodejs
|
|
npm
|
|
|
|
# System utilities
|
|
curl
|
|
wget
|
|
tree
|
|
htop
|
|
|
|
# To remove a package, just delete the line
|
|
# For example, to remove htop, delete the "htop" line
|
|
```
|
|
|
|
### Version Control Your Configuration
|
|
```bash
|
|
# Initialize git repository in forge directory
|
|
cd ~/.config/forge
|
|
git init
|
|
git add .
|
|
git commit -m "Initial configuration"
|
|
|
|
# Now you can version control your entire system configuration
|
|
git add forge.toml dotfiles/
|
|
git commit -m "Updated vim configuration"
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
- `FORGE_DIR`: Override the default configuration directory (default: `~/.config/forge`)
|
|
|
|
## Dependencies
|
|
|
|
- `dnf` - Fedora package manager
|
|
- `dnf-plugins-core` - For COPR repository management
|
|
- `sed` - For updating configuration file (usually pre-installed)
|
|
|
|
## Migration from Previous Version
|
|
|
|
If you were using the old version of forge with `git = true` format:
|
|
|
|
1. Your existing configuration will not be automatically migrated
|
|
2. Run `./forge init` to create the new `forge.toml` structure
|
|
3. Convert your package configuration from:
|
|
```toml
|
|
# Old format
|
|
git = true
|
|
vim = true
|
|
```
|
|
to:
|
|
```toml
|
|
# New format
|
|
git
|
|
vim
|
|
```
|
|
4. Move your existing dotfiles from the old directory to `~/.config/forge/dotfiles/`
|
|
|
|
## License
|
|
|
|
This project is open source. Feel free to contribute or report issues. |