From 6d0a3ec4f2a3df682097a1423d10cdf1f0996338 Mon Sep 17 00:00:00 2001 From: askiiart Date: Sat, 18 Jan 2025 15:10:34 -0600 Subject: [PATCH 1/2] fix docs --- docs/behind-the-scenes/commands.md | 2 +- docs/behind-the-scenes/default-max-threads.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/behind-the-scenes/commands.md b/docs/behind-the-scenes/commands.md index 7091f82..eda493f 100644 --- a/docs/behind-the-scenes/commands.md +++ b/docs/behind-the-scenes/commands.md @@ -1,3 +1,3 @@ # How commands are run -I was unable to find a way to directly run *multiple* commands via Docker/Podman. Instead of doing that, greg puts all the commands in a temporary script, mounts it inside, and then run it with +I was unable to find a way to directly run *multiple* commands via Docker/Podman. Instead of doing that, greg puts all the commands in a temporary script, mounts it inside, and then runs it with `shell`. diff --git a/docs/behind-the-scenes/default-max-threads.md b/docs/behind-the-scenes/default-max-threads.md index 826e793..e812308 100644 --- a/docs/behind-the-scenes/default-max-threads.md +++ b/docs/behind-the-scenes/default-max-threads.md @@ -23,7 +23,7 @@ i.e. with `total_threads` as the number of threads the CPU(s) has: --- -Alternative algorithms I tried: +Alternative algorithm I tried: ```rs if total_threads >= 32 { From 2809459d8ba9f689bd4cdd6a6b1db32948a6362c Mon Sep 17 00:00:00 2001 From: askiiart Date: Sat, 18 Jan 2025 15:14:28 -0600 Subject: [PATCH 2/2] remove `id` and improve naming of logs --- README.md | 2 -- docs/config-reference.md | 12 ++++++------ gregory.example.toml | 4 +--- src/data.rs | 4 +--- src/main.rs | 29 +++++++++++++++++------------ 5 files changed, 25 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index c2c80fb..1c545f4 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ This is Gregory. Gregory controls repos. Gregory keeps track of updating repos, trying to be simple and elegant, but enough. -## THIS IS A PROTOTYPE - ## Documentation Go look at [`docs/`](/docs/) diff --git a/docs/config-reference.md b/docs/config-reference.md index b53bc9a..1f607a7 100644 --- a/docs/config-reference.md +++ b/docs/config-reference.md @@ -28,9 +28,6 @@ Note: This primarily uses LibreWolf and Fedora as examples of packages and distr ## Job config -- `id` (string): An ID to identify the job, such as the compilation of a program **(highly recommended)** - - Default is `-1` for unassigned - - If you just want to run stuff, you don't need this, but it's *highly* recommended as it allows you to filter your logs. - `revision` (string): A revision id for the job, such as a version number for a compilation script - Default is `1` - `threads` (float): The maximum number of vCPUs/threads to dedicate to a job; this can be a fractional number @@ -56,9 +53,9 @@ Example: [packages.librewolf] dependencies = ["some-librewolf-dependency"] + version_check = ["check-version --whenever-you-feel-like-it-please"] [packages.librewolf.compilation] - id = "1" revision = "2" threads = 8 image = "docker.io/library/debian" @@ -75,7 +72,11 @@ Example: volumes = ["librewolf"] ``` -Aside from just the jobs, `packages` also contains the `dependencies` field, which lists dependencies for this package which gregory manages - don't list external dependencies in that field. +`packages` contains the following fields: + +- `dependencies` (array): Lists dependencies for this package which gregory manages - don't list external dependencies in that field. This isn't required, but will ensure that gregory doesn't have to be run multiple times to get a package up-to-date. + - Note that the repo will be updated (`[update-repo]`) after any dependency it updated +- `version-check` (array): Commands to be run to check the version of the package; what's printed to `stdout` will be counted as the version, and if anything is printed to `stderr`, the package will be ignored and an error will be logged. Additionally, if the package version seems to have decreased, then a warning will be logged. ### Compilation (optional) @@ -89,7 +90,6 @@ It's defined in this format: [packages.librewolf] [packages.librewolf.compilation] - id = "1" revision = "2" threads = 8 image = "docker.io/library/debian" diff --git a/gregory.example.toml b/gregory.example.toml index b36e84f..bf55cd4 100644 --- a/gregory.example.toml +++ b/gregory.example.toml @@ -6,9 +6,9 @@ max-threads = 10 [packages.librewolf] dependencies = ["some-librewolf-dependency"] + version_check = ["check-version --whenever-you-feel-like-it-please"] [packages.librewolf.compilation] - id = "1" revision = "2" threads = 6 image = "docker.io/library/debian" @@ -27,7 +27,6 @@ max-threads = 10 [packages.some-librewolf-dependency] [packages.some-librewolf-dependency.compilation] - id = "2" revision = "4" threads = 2 image = "docker.io/library/debian" @@ -35,7 +34,6 @@ max-threads = 10 volumes = ["other-workspace"] [packages.some-librewolf-dependency.packaging.fedora] - id = "3" revision = "2" threads = 2 image = "docker.io/library/fedora" diff --git a/src/data.rs b/src/data.rs index d8e21b7..b5cf0a1 100644 --- a/src/data.rs +++ b/src/data.rs @@ -35,9 +35,7 @@ pub(crate) struct Config { /// Holds the data for a job #[derive(Debug, Clone, Deserialize)] pub(crate) struct Job { - /// An ID to identify the job, such as the compilation of a program - #[serde(default = "id")] - pub(crate) id: String, + /// What revision of the job config, temporary until better revision tracking is added #[serde(default = "revision")] pub(crate) revision: String, /// How many threads to limit this job to; recommended to set it to the max threads the job will use diff --git a/src/main.rs b/src/main.rs index 629e3dd..ae28b76 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use crate::data::*; use better_commands; use clap::{CommandFactory, Parser}; use clap_complete::aot::{generate, Bash, Elvish, Fish, PowerShell, Zsh}; +use std::collections::HashMap; use std::fs::create_dir_all; use std::fs::remove_dir_all; use std::fs::write; @@ -52,38 +53,40 @@ fn main() { fn run(config_path: String) { let config = config_from_file(config_path).unwrap(); - let mut jobs: Vec = Vec::new(); + let mut jobs: HashMap = HashMap::new(); + + for (package_name, package) in config.clone().packages { - for (_, package) in config.clone().packages { match package.compilation { Some(tmp) => { - jobs.push(tmp); + jobs.insert(format!("packages.{}.compilation", package_name), tmp); } None => {} } - for (_, job) in package.packaging { - jobs.push(job); + for (packaging_name, job) in package.packaging { + jobs.insert(format!("packages.{}.{}", package_name, packaging_name), job); } } - for (_, job) in config.clone().update_repo { - jobs.push(job); + for (repo, job) in config.clone().update_repo { + jobs.insert(format!("update-repo.{}", repo), job); } - for job in jobs { - println!("{:#?}", run_job(config.clone(), job)); + for (job_name, job) in jobs { + println!("{:#?}", run_job(config.clone(), job_name, job)); } + } -fn run_job(conf: Config, job: Job) -> JobExitStatus { +fn run_job(conf: Config, job_name: String, job: Job) -> JobExitStatus { // limit threads to max_threads in the config let mut threads = job.threads; if job.threads > conf.max_threads { threads = conf.max_threads; } - let container_name: String = format!("gregory-{}-{}-{}", job.id, job.revision, Uuid::now_v7()); + let container_name: String = format!("gregory-{}-{}-{}", job_name, job.revision, Uuid::now_v7()); // do job log setup let log_path = &format!("{}/logs/{container_name}", conf.data_dir); // can't select fields in the format!() {} thing, have to do this @@ -108,6 +111,7 @@ fn run_job(conf: Config, job: Job) -> JobExitStatus { .permissions(); PermissionsExt::set_mode(&mut perms, 0o755); + // run the job let mut cmd_args: Vec = vec![ "run".to_string(), format!("--name={container_name}"), @@ -150,7 +154,8 @@ fn run_job(conf: Config, job: Job) -> JobExitStatus { } }, ); - // remove tmp dir + + // remove tmp dir/clean up remove_dir_all(script_dir).unwrap(); println!("{:?}", cmd_output);