80b63969c6
Signed-off-by: Christina Sørensen <christina@cafkafk.com>
163 lines
4.6 KiB
Markdown
163 lines
4.6 KiB
Markdown
<!--
|
|
SPDX-FileCopyrightText: 2023 Christina Sørensen
|
|
SPDX-FileContributor: Christina Sørensen
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only
|
|
-->
|
|
|
|
<div align="center">
|
|
|
|
<h1>SEIÐR</h1>
|
|
|
|
|
|
![seidr](https://github.com/cafkafk/seidr/assets/89321978/345cb89e-e893-42b2-a883-a1dedafc35fa)
|
|
|
|
An experimental Rust GitOps/symlinkfarm orchestrator inspired by GNU Stow.
|
|
|
|
[![Built with Nix](https://img.shields.io/badge/Built_With-Nix-5277C3.svg?logo=nixos&labelColor=73C3D5)](https://nixos.org)
|
|
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](code_of_conduct.md)
|
|
[![Unit tests](https://github.com/cafkafk/seidr/actions/workflows/unit-tests.yml/badge.svg)](https://github.com/cafkafk/seidr/actions/workflows/unit-tests.yml)
|
|
![Crates.io](https://img.shields.io/crates/v/seidr?link=https%3A%2F%2Fcrates.io%2Fcrates%2Fseidr)
|
|
![Crates.io](https://img.shields.io/crates/l/seidr?link=https%3A%2F%2Fgithub.com%2Fcafkafk%2Fseidr%2Fblob%2Fmain%2FLICENCE)
|
|
|
|
</div>
|
|
|
|
> **Warning**
|
|
> Seiðr is experimental. I'm gonna change how links work soon. Every update might mean rewriting your config. You're warned.
|
|
|
|
A Rust GitOps/symlinkfarm orchestrator inspired by GNU Stow. Useful for dealing
|
|
with "dotfiles", and with git support as a first class feature. Configuration is
|
|
done through a single yaml file, giving it a paradigm that should bring joy to
|
|
those that use declarative operating systems and package managers.
|
|
|
|
Although this isn't really a case where it matters *that* much for performance,
|
|
being written in rust instead of e.g. /janky/ scripting languages does also mean
|
|
it is snappy and reliable, and the /extensive/ (hardly, but eventually) testing
|
|
helps ensure regressions aren't introduced.
|
|
|
|
That said, we're in 0.Y.Z, *here be dragons* for now (although a little less each
|
|
commit).
|
|
|
|
### Installation
|
|
|
|
git clone https://github.com/cafkafk/seidr
|
|
cd seidr
|
|
cargo install --path .
|
|
|
|
### Configuration
|
|
If you want a template, you can copy the file from src/test/config.yaml:
|
|
|
|
mkdir -p ~/.config/seidr/
|
|
cp src/test/config.yaml ~/.config/seidr/config.yaml
|
|
|
|
You should *seriously* change this file before running any commands.
|
|
|
|
The configuration format will likely break regularly in versions 0.Y.Z.
|
|
|
|
#### Dhall
|
|
|
|
I already daily drive seidr, and here's an example of how I keep it manageable with dhall. Writing the `.yaml` files by hand and keeping them up to date quickly felt like writing aterm `.drv` files for Nix by hand... that is to say not pleasant. This somewhat makes it better.
|
|
|
|
```dhall
|
|
let {- First, we define some useful variables
|
|
-}
|
|
home
|
|
: Text
|
|
= "/home/ces/"
|
|
|
|
let config
|
|
: Text
|
|
= "${home}/.config/"
|
|
|
|
let gitProjectsDir
|
|
: Text
|
|
= "${home}/org/src/git/"
|
|
|
|
let nixosConfigName
|
|
: Text
|
|
= "afk-nixos"
|
|
|
|
let nixosConfigDir
|
|
: Text
|
|
= gitProjectsDir
|
|
|
|
let nixosConfigPath
|
|
: Text
|
|
= "${home}/org/src/git/${nixosConfigName}/"
|
|
|
|
let seidrConfigPath
|
|
: Text
|
|
= "${nixosConfigPath}/seidr/"
|
|
|
|
let {- Now, we create some schemes and types and such to make our lives easier
|
|
|
|
TODO: We could totally also write some functions, but I haven't gotten to that yet.
|
|
-}
|
|
Flags
|
|
: Type
|
|
= < Clone | Fast >
|
|
|
|
let Repo
|
|
: Type
|
|
= { name : Optional Text
|
|
, path : Optional Text
|
|
, url : Optional Text
|
|
, kind : Optional Text
|
|
, flags : Optional (List Flags)
|
|
}
|
|
|
|
let Link
|
|
: Type
|
|
= { name : Optional Text, rx : Text, tx : Text }
|
|
|
|
let {- Here, we define our repositories
|
|
-}
|
|
nixosConfigRepo
|
|
: Repo
|
|
= { name = Some nixosConfigName
|
|
, path = Some nixosConfigDir
|
|
, url = Some "git@github.com:cafkafk/afk-nixos.git"
|
|
, kind = Some "GitRepo"
|
|
, flags = Some [ Flags.Clone, Flags.Fast ]
|
|
}
|
|
|
|
let ezaDevelopmentRepo
|
|
: Repo
|
|
= { name = Some "eza"
|
|
, path = Some gitProjectsDir
|
|
, url = Some "git@github.com:eza-community/eza.git"
|
|
, kind = Some "GitRepo"
|
|
, flags = Some [ Flags.Clone, Flags.Fast ]
|
|
}
|
|
|
|
let {- Here, we define our repositories
|
|
-}
|
|
starship
|
|
: Link
|
|
= { name = Some "starship"
|
|
, tx = "${seidrConfigPath}/starship.toml"
|
|
, rx = "${config}/starship.toml"
|
|
}
|
|
|
|
let {- And now we pull it all together -}
|
|
categories =
|
|
{ seidr.repos
|
|
=
|
|
{ -- dots = { name = "seidr", path = path },
|
|
nixosConfigRepo
|
|
, ezaDevelopmentRepo
|
|
}
|
|
, starship.links.starship = starship
|
|
}
|
|
|
|
in { categories }
|
|
```
|
|
|
|
Then it's as easy as running something like this:
|
|
|
|
```
|
|
dhall-to-yaml --file seidr.dhall --explain --output seidr.yaml
|
|
seidr -c seidr.yaml --help
|
|
```
|
|
|
|
Ofc, you replace `--help` with whatever you wanna do here.
|