chore: merge 0.0.6 #6
6 changed files with 82 additions and 10 deletions
|
@ -13,6 +13,8 @@
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see https://www.gnu.org/gpl-3.0.html.
|
// along with this program. If not, see https://www.gnu.org/gpl-3.0.html.
|
||||||
|
//
|
||||||
|
//! Handles command line input
|
||||||
|
|
||||||
use crate::utils::dir::home_dir;
|
use crate::utils::dir::home_dir;
|
||||||
use crate::utils::strings::INTERACTIVE_NOTICE;
|
use crate::utils::strings::INTERACTIVE_NOTICE;
|
||||||
|
|
54
src/git.rs
54
src/git.rs
|
@ -13,6 +13,8 @@
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see https://www.gnu.org/gpl-3.0.html.
|
// along with this program. If not, see https://www.gnu.org/gpl-3.0.html.
|
||||||
|
//
|
||||||
|
//! Git repositories
|
||||||
|
|
||||||
use log::{debug, error, info, trace, warn};
|
use log::{debug, error, info, trace, warn};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
@ -23,25 +25,29 @@ use std::os::unix::fs::symlink;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::{fs, process::Command};
|
use std::{fs, process::Command};
|
||||||
|
|
||||||
// why not make it O(log n) instead of a vec that's /only/ O(n)
|
/// An enum containing flags that change behaviour of repos and categories
|
||||||
// ...because premature optimization is the root of all evil!
|
|
||||||
//
|
|
||||||
// it's time
|
|
||||||
|
|
||||||
#[derive(PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize, Debug)]
|
#[derive(PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize, Debug)]
|
||||||
pub enum RepoFlags {
|
pub enum RepoFlags {
|
||||||
|
/// If push is set, the repository should respond to the push subcommand
|
||||||
Push,
|
Push,
|
||||||
|
/// If clone is set, the repository should respond to the clone subcommand
|
||||||
Clone,
|
Clone,
|
||||||
|
/// If pull is set, the repository should respond to the pull subcommand
|
||||||
Pull,
|
Pull,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represents the config.toml file.
|
/// Represents the config.toml file.
|
||||||
|
///
|
||||||
|
/// For diagrams of the underlying architecture, consult ARCHITECHTURE.md
|
||||||
|
///
|
||||||
|
///
|
||||||
#[derive(PartialEq, Debug, Serialize, Deserialize)]
|
#[derive(PartialEq, Debug, Serialize, Deserialize)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
/// map of all categories
|
/// map of all categories
|
||||||
///
|
///
|
||||||
/// Key should conceptually be seen as the name of the category.
|
/// Key should conceptually be seen as the name of the category.
|
||||||
pub categories: HashMap<String, Category>,
|
pub categories: HashMap<String, Category>,
|
||||||
|
/// A vector containing links
|
||||||
pub links: Vec<Links>,
|
pub links: Vec<Links>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,6 +66,7 @@ pub struct Category {
|
||||||
/// Contain fields for a single link.
|
/// Contain fields for a single link.
|
||||||
#[derive(PartialEq, Debug, Serialize, Deserialize)]
|
#[derive(PartialEq, Debug, Serialize, Deserialize)]
|
||||||
pub struct Links {
|
pub struct Links {
|
||||||
|
/// The name of the link
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub rx: String,
|
pub rx: String,
|
||||||
pub tx: String,
|
pub tx: String,
|
||||||
|
@ -254,6 +261,11 @@ impl Config {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/// Runs associated function on all repos in config
|
||||||
|
///
|
||||||
|
/// TODO: need to be made over a generic repo type
|
||||||
|
///
|
||||||
|
///
|
||||||
fn on_all_spinner<F>(&self, op: &str, f: F)
|
fn on_all_spinner<F>(&self, op: &str, f: F)
|
||||||
where
|
where
|
||||||
F: Fn(&GitRepo) -> bool,
|
F: Fn(&GitRepo) -> bool,
|
||||||
|
@ -287,7 +299,33 @@ impl Config {
|
||||||
/// However, at 6:24, we're so ready! Let's go!
|
/// However, at 6:24, we're so ready! Let's go!
|
||||||
///
|
///
|
||||||
/// Fun fact: only the last element of a tuple must have a dynamically typed size
|
/// Fun fact: only the last element of a tuple must have a dynamically typed size
|
||||||
fn series_on_all(&self, closures: Vec<SeriesItem>) {
|
///
|
||||||
|
/// # Usage
|
||||||
|
///
|
||||||
|
/// Here is an example of how an associated method could use this function.
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// let series: Vec<SeriesItem> = vec![
|
||||||
|
/// SeriesItem {
|
||||||
|
/// operation: "pull",
|
||||||
|
/// closure: Box::new(move |repo: &GitRepo| repo.pull()),
|
||||||
|
/// },
|
||||||
|
/// SeriesItem {
|
||||||
|
/// operation: "add",
|
||||||
|
/// closure: Box::new(move |repo: &GitRepo| repo.add_all()),
|
||||||
|
/// },
|
||||||
|
/// SeriesItem {
|
||||||
|
/// operation: "commit",
|
||||||
|
/// closure: Box::new(move |repo: &GitRepo| repo.commit()),
|
||||||
|
/// },
|
||||||
|
/// SeriesItem {
|
||||||
|
/// operation: "push",
|
||||||
|
/// closure: Box::new(move |repo: &GitRepo| repo.push()),
|
||||||
|
/// },
|
||||||
|
/// ];
|
||||||
|
/// self.series_on_all(series);
|
||||||
|
/// ```
|
||||||
|
pub fn series_on_all(&self, closures: Vec<SeriesItem>) {
|
||||||
for (_, category) in self.categories.iter() {
|
for (_, category) in self.categories.iter() {
|
||||||
for (_, repo) in category.repos.iter() {
|
for (_, repo) in category.repos.iter() {
|
||||||
for instruction in closures.iter() {
|
for instruction in closures.iter() {
|
||||||
|
@ -353,10 +391,6 @@ impl Config {
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
self.series_on_all(series);
|
self.series_on_all(series);
|
||||||
// self.on_all_spinner("pull", |repo| repo.pull());
|
|
||||||
// self.on_all_spinner("add", |repo| repo.add_all());
|
|
||||||
// self.on_all_spinner("commit", |repo| repo.commit_with_msg(msg));
|
|
||||||
// self.on_all_spinner("push", |repo| repo.push());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* LINK RELATED */
|
/* LINK RELATED */
|
||||||
|
|
21
src/main.rs
21
src/main.rs
|
@ -13,6 +13,22 @@
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see https://www.gnu.org/gpl-3.0.html.
|
// along with this program. If not, see https://www.gnu.org/gpl-3.0.html.
|
||||||
|
//
|
||||||
|
//! A Rust GitOps/symlinkfarm orchestrator inspired by GNU Stow.
|
||||||
|
//!
|
||||||
|
//! # What is?
|
||||||
|
//!
|
||||||
|
//! 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 throug 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/ testing helps ensure regressions
|
||||||
|
//! aren't introduced.
|
||||||
|
//!
|
||||||
|
//! That said, we're in 0.0.Z, *here be dragons* for now.
|
||||||
#![feature(unsized_tuple_coercion)]
|
#![feature(unsized_tuple_coercion)]
|
||||||
|
|
||||||
extern crate log;
|
extern crate log;
|
||||||
|
@ -29,9 +45,14 @@ use cli::{Args, Commands};
|
||||||
use git::Config;
|
use git::Config;
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
use log::{debug, error, info, trace, warn};
|
use log::{debug, error, info, trace, warn};
|
||||||
|
|
||||||
|
/// The main loop of the binary
|
||||||
|
///
|
||||||
|
/// Here, we handle parsing the configuration file, as well as matching commands
|
||||||
|
/// to the relavant operations.
|
||||||
fn main() {
|
fn main() {
|
||||||
pretty_env_logger::init();
|
pretty_env_logger::init();
|
||||||
let args = Args::parse();
|
let args = Args::parse();
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see https://www.gnu.org/gpl-3.0.html.
|
// along with this program. If not, see https://www.gnu.org/gpl-3.0.html.
|
||||||
|
//
|
||||||
|
//! Sublibrary for useful functions
|
||||||
|
|
||||||
pub mod dir;
|
pub mod dir;
|
||||||
pub mod strings;
|
pub mod strings;
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see https://www.gnu.org/gpl-3.0.html.
|
// along with this program. If not, see https://www.gnu.org/gpl-3.0.html.
|
||||||
|
//
|
||||||
|
//! Nice helpers for dealing with filesystem environment.
|
||||||
|
|
||||||
#![feature(stmt_expr_attributes)]
|
#![feature(stmt_expr_attributes)]
|
||||||
use log::{debug, error, info, trace, warn};
|
use log::{debug, error, info, trace, warn};
|
||||||
|
@ -20,6 +22,9 @@ use log::{debug, error, info, trace, warn};
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
|
/// Returns the users current dir
|
||||||
|
///
|
||||||
|
/// Does not work on Windows
|
||||||
pub fn current_dir() -> String {
|
pub fn current_dir() -> String {
|
||||||
#[allow(deprecated)] // NOTE we don't care about windows , we don't support it
|
#[allow(deprecated)] // NOTE we don't care about windows , we don't support it
|
||||||
env::current_dir()
|
env::current_dir()
|
||||||
|
@ -29,6 +34,9 @@ pub fn current_dir() -> String {
|
||||||
.expect("Failed to turn home_dir into a valid string")
|
.expect("Failed to turn home_dir into a valid string")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the users home dir
|
||||||
|
///
|
||||||
|
/// Does not work on Windows
|
||||||
pub fn home_dir() -> String {
|
pub fn home_dir() -> String {
|
||||||
#[allow(deprecated)] // NOTE we don't care about windows , we don't support it
|
#[allow(deprecated)] // NOTE we don't care about windows , we don't support it
|
||||||
env::home_dir()
|
env::home_dir()
|
||||||
|
|
|
@ -13,6 +13,11 @@
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see https://www.gnu.org/gpl-3.0.html.
|
// along with this program. If not, see https://www.gnu.org/gpl-3.0.html.
|
||||||
|
//
|
||||||
|
//! Module for chunk of text
|
||||||
|
//!
|
||||||
|
//! Ideally, at a VERY long term scale, this should be a nice pattern for
|
||||||
|
//! possible translations.
|
||||||
|
|
||||||
/// Contains the notice for interactive programs from the GPLv3's "How to Apply
|
/// Contains the notice for interactive programs from the GPLv3's "How to Apply
|
||||||
/// These Terms to Your New Programs"
|
/// These Terms to Your New Programs"
|
||||||
|
|
Loading…
Reference in a new issue