feat(*): init Rust port

This is a Rust port of the original Perl script, legacy cruft is removed
and it focuses on a modern Hydra deployment.

Nonetheless, it knows how to perform migrations based on the channel
versions.

Signed-off-by: Raito Bezarius <masterancpp@gmail.com>
This commit is contained in:
raito 2024-08-02 17:45:59 +02:00
parent 809d960f49
commit 8288bad70e
6 changed files with 1869 additions and 0 deletions

5
.gitignore vendored
View file

@ -1 +1,6 @@
result result
# Added by cargo
/target

1787
Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

8
Cargo.toml Normal file
View file

@ -0,0 +1,8 @@
[package]
name = "nixos-channel-scripts"
version = "0.1.0"
edition = "2021"
[dependencies]
clap = { version = "4.5.13", features = [ "derive" ] }
object_store = { version = "0.10.2", features = [ "aws" ] }

27
src/actions.rs Normal file
View file

@ -0,0 +1,27 @@
use std::path::PathBuf;
enum HydraProductType {
BrotliJson,
SourceDistribution,
}
impl ToString for HydraProductType {
fn to_string(&self) -> String {
match self {
Self::BrotliJson => "json-br".to_string(),
Self::SourceDistribution => "source-dist".to_string(),
}
}
}
enum Action {
WriteFile {
dst_path: PathBuf,
contents: String
},
WriteHydraProduct {
dst_path: PathBuf,
product_name: String,
product_type: Option<HydraProductType>,
}
}

12
src/config.rs Normal file
View file

@ -0,0 +1,12 @@
use std::path::PathBuf;
struct MirrorConfig {
/// URI to Hydra instance
hydra_uri: String,
/// URI to the binary cache
binary_cache_uri: String,
/// A path to a checkout of nixpkgs
nixpkgs_dir: PathBuf,
/// S3 releases bucket URL
s3_release_bucket_uri: String,
}

30
src/main.rs Normal file
View file

@ -0,0 +1,30 @@
mod config;
mod actions;
use std::path::PathBuf;
use clap::Parser;
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
struct Args {
/// Channel name to update
channel_name: String,
/// Job name to fetch from Hydra instance
job_name: String,
/// TOML configuration file for channel updates
#[arg(short, long)]
config_file: PathBuf,
/// Whether to execute no remote side effects (S3 uploads, redirections), etc.
#[arg(short, long, default_value_t = false)]
dry_run: bool,
/// If a channel rollback is detected, do not bail out and proceed to rollback the channel
#[arg(short, long, default_value_t = false)]
ignore_rollback_protection: bool
}
fn main() {
let args = Args::parse();
println!("Hello, world!");
}