Read in config file or search appropriate places.
Add rough README and dependencies along with basic command line arguments.pull/3/head
parent
fff5d4183f
commit
33b9d30858
|
@ -0,0 +1,13 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
filesToFormat=$(
|
||||||
|
git --no-pager diff --name-status --no-color --cached | \
|
||||||
|
awk '$1 != "D" && $2 ~ /\.rs/ {print $2}'
|
||||||
|
)
|
||||||
|
|
||||||
|
for path in $filesToFormat
|
||||||
|
do
|
||||||
|
rustfmt $path
|
||||||
|
git add $path
|
||||||
|
done;
|
|
@ -1,6 +1,15 @@
|
||||||
[package]
|
[package]
|
||||||
name = "homesync"
|
name = "homesync"
|
||||||
|
authors = ["Joshua Potter <jrpotter.github.io>"]
|
||||||
|
description = """
|
||||||
|
|
||||||
|
Homesync provides a way of automatically syncing config files across various\
|
||||||
|
applications you may use.
|
||||||
|
"""
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
clap = { version = "3.0.0-rc.9", features = ["derive"] }
|
||||||
|
notify = "4.0.16"
|
||||||
|
yaml-rust = "0.4"
|
||||||
|
|
41
README.md
41
README.md
|
@ -1 +1,42 @@
|
||||||
# homesync
|
# homesync
|
||||||
|
|
||||||
|
**Caution! This is unstable code!**
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
Homesync provides a way of automatically syncing config files across various
|
||||||
|
applications you may use. It works by establishing a file watcher on all the
|
||||||
|
configs specified in the primary `homesync` config. As files are changed, they
|
||||||
|
are copied to a local git repository to eventually be pushed by the user.
|
||||||
|
Likewise, at any point, the user can sync against the remote repository,
|
||||||
|
overwriting local configurations for one or more packages.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Homesync uses a YAML file, to be found in anyone of the following locations.
|
||||||
|
Locations are searched in the following order:
|
||||||
|
|
||||||
|
• `$XDG_CONFIG_HOME/homesync/homesync.yml`
|
||||||
|
• `$XDG_CONFIG_HOME/homesync.yml`
|
||||||
|
• `$HOME/.config/homesync/homesync.yml`
|
||||||
|
• `$HOME/.homesync.yml`
|
||||||
|
|
||||||
|
That said, it is recommended to modify this config solely from the exposed
|
||||||
|
homesync CLI. Homesync will take responsibility ensuring how the config is
|
||||||
|
modified based on your package manager, platform, etc.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
## Contribution
|
||||||
|
|
||||||
|
Install git hooks as follows:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git config --local core.hooksPath .githooks/
|
||||||
|
```
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
remote:
|
||||||
|
system:
|
||||||
|
packages:
|
||||||
|
homesync:
|
||||||
|
configs:
|
||||||
|
- $XDG_CONFIG_HOME/homesync/homesync.yml
|
||||||
|
- $XDG_CONFIG_HOME/homesync.yml
|
||||||
|
- $HOME/.config/homesync/homesync.yml
|
||||||
|
- $HOME/.homesync.yml
|
|
@ -14,7 +14,9 @@
|
||||||
devShell = with pkgs; mkShell {
|
devShell = with pkgs; mkShell {
|
||||||
buildInputs = [
|
buildInputs = [
|
||||||
cargo
|
cargo
|
||||||
|
rls
|
||||||
rustc
|
rustc
|
||||||
|
rustfmt
|
||||||
] ++ lib.optionals stdenv.isDarwin [ libiconv ];
|
] ++ lib.optionals stdenv.isDarwin [ libiconv ];
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
use std::env;
|
||||||
|
use std::error::Error;
|
||||||
|
use std::fs;
|
||||||
|
use std::io;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use yaml_rust::{Yaml, YamlLoader};
|
||||||
|
|
||||||
|
fn read_config(path: &PathBuf) -> io::Result<Option<String>> {
|
||||||
|
match fs::read_to_string(path) {
|
||||||
|
Err(err) => match err.kind() {
|
||||||
|
// Ignore not found since we may try multiple paths.
|
||||||
|
io::ErrorKind::NotFound => Ok(None),
|
||||||
|
_ => Err(err),
|
||||||
|
},
|
||||||
|
Ok(contents) => Ok(Some(contents)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_config() -> Result<Vec<Yaml>, Box<dyn Error>> {
|
||||||
|
let mut paths: Vec<PathBuf> = Vec::new();
|
||||||
|
if let Ok(xdg_config_home) = env::var("XDG_CONFIG_HOME") {
|
||||||
|
paths.push(
|
||||||
|
[&xdg_config_home, "homesync", "homesync.yml"]
|
||||||
|
.iter()
|
||||||
|
.collect(),
|
||||||
|
);
|
||||||
|
paths.push([&xdg_config_home, "homesync.yml"].iter().collect());
|
||||||
|
}
|
||||||
|
if let Ok(home) = env::var("HOME") {
|
||||||
|
paths.push(
|
||||||
|
[&home, ".config", "homesync", "homesync.yml"]
|
||||||
|
.iter()
|
||||||
|
.collect(),
|
||||||
|
);
|
||||||
|
paths.push([&home, ".homesync.yml"].iter().collect());
|
||||||
|
}
|
||||||
|
for path in paths {
|
||||||
|
if let Ok(Some(contents)) = read_config(&path) {
|
||||||
|
return Ok(YamlLoader::load_from_str(&contents)?);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(Box::new(io::Error::new(
|
||||||
|
io::ErrorKind::NotFound,
|
||||||
|
"Could not find a homesync config.",
|
||||||
|
)))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run(config: Option<String>) -> Result<(), Box<dyn Error>> {
|
||||||
|
let _loaded = match config {
|
||||||
|
Some(path) => {
|
||||||
|
let contents = fs::read_to_string(path)?;
|
||||||
|
YamlLoader::load_from_str(&contents)?
|
||||||
|
}
|
||||||
|
None => find_config()?,
|
||||||
|
};
|
||||||
|
Ok(())
|
||||||
|
}
|
18
src/main.rs
18
src/main.rs
|
@ -1,3 +1,17 @@
|
||||||
fn main() {
|
use clap::Parser;
|
||||||
println!("Hello, world!");
|
use std::process;
|
||||||
|
|
||||||
|
#[derive(Parser, Debug)]
|
||||||
|
#[clap(about, version, author)]
|
||||||
|
struct Args {
|
||||||
|
#[clap(short, long)]
|
||||||
|
config: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let args = Args::parse();
|
||||||
|
homesync::run(args.config).unwrap_or_else(|err| {
|
||||||
|
eprintln!("Problem parsing arguments: {}", err);
|
||||||
|
process::exit(1);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue