started work on git module.
This commit is contained in:
parent
437a4bfa13
commit
d113289fd2
8
Cargo.lock
generated
8
Cargo.lock
generated
|
@ -284,9 +284,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "git2"
|
||||
version = "0.18.1"
|
||||
version = "0.18.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fbf97ba92db08df386e10c8ede66a2a0369bd277090afd8710e19e38de9ec0cd"
|
||||
checksum = "1b3ba52851e73b46a4c3df1d89343741112003f0f6f13beb0dfac9e457c3fdcd"
|
||||
dependencies = [
|
||||
"bitflags 2.4.2",
|
||||
"libc",
|
||||
|
@ -377,9 +377,9 @@ checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
|
|||
|
||||
[[package]]
|
||||
name = "libgit2-sys"
|
||||
version = "0.16.1+1.7.1"
|
||||
version = "0.16.2+1.7.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f2a2bb3680b094add03bb3732ec520ece34da31a8cd2d633d1389d0f0fb60d0c"
|
||||
checksum = "ee4126d8b4ee5c9d9ea891dd875cfdc1e9d0950437179104b183d7d8a74d24e8"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"libc",
|
||||
|
|
|
@ -12,7 +12,7 @@ description = "Utility to modify commit timestamps of a git repository"
|
|||
chrono = "0.4.33"
|
||||
chrono-tz = "0.8.5"
|
||||
clap = { version = "4.4.18", features = ["derive"] }
|
||||
git2 = "0.18.1"
|
||||
git2 = "0.18.2"
|
||||
iana-time-zone = "0.1.60"
|
||||
itertools = "0.12.1"
|
||||
once_cell = "1.19.0"
|
||||
|
|
47
src/git.rs
Normal file
47
src/git.rs
Normal file
|
@ -0,0 +1,47 @@
|
|||
use chrono::Duration;
|
||||
use git2::{Commit, Repository};
|
||||
use itertools::Itertools;
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::time::{distribute_across_ranges_with_jitter, TimeRange};
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
pub(crate) enum GitErrors {
|
||||
#[error("end is not a parent of start")]
|
||||
NotAParent,
|
||||
|
||||
#[error("{0} is not a commit hash in the repo")]
|
||||
NotACommit(String),
|
||||
}
|
||||
|
||||
/// find the number of commits between start and end,
|
||||
/// where end is a parent commit of start
|
||||
fn get_no_of_commits(start: &Commit, end: &Commit) -> Result<u32, GitErrors> {
|
||||
match start.parent_ids().find_position(|sha| sha == &end.id()) {
|
||||
Some(tuple) => Ok(tuple.0.try_into().expect("commit has over 2^32 parents")),
|
||||
None => Err(GitErrors::NotAParent),
|
||||
}
|
||||
}
|
||||
|
||||
// will need to do an in memory rebase, ammending each commit with a new signature.
|
||||
pub fn rebase_commits_across_timerange<Tz: chrono::TimeZone>(
|
||||
repo: &Repository,
|
||||
start_sha: &str,
|
||||
end_sha: &str,
|
||||
ranges: &[TimeRange<Tz>],
|
||||
max_jitter: &Duration,
|
||||
) -> Result<(), GitErrors> {
|
||||
let start_commit = if let Ok(commit) = repo.find_commit_by_prefix(start_sha) {
|
||||
commit
|
||||
} else {
|
||||
return Err(GitErrors::NotACommit(start_sha.to_string()));
|
||||
};
|
||||
let end_commit = if let Ok(commit) = repo.find_commit_by_prefix(end_sha) {
|
||||
commit
|
||||
} else {
|
||||
return Err(GitErrors::NotACommit(end_sha.to_string()));
|
||||
};
|
||||
let num_commits = get_no_of_commits(&start_commit, &end_commit)?;
|
||||
let times = distribute_across_ranges_with_jitter(ranges, num_commits, max_jitter);
|
||||
todo!()
|
||||
}
|
19
src/main.rs
19
src/main.rs
|
@ -1,5 +1,6 @@
|
|||
mod args;
|
||||
mod err;
|
||||
mod git;
|
||||
mod time;
|
||||
|
||||
use chrono::prelude::*;
|
||||
|
@ -9,13 +10,19 @@ use clap::Parser;
|
|||
fn main() {
|
||||
let cli = args::Cli::parse();
|
||||
println!("{:#?}", cli);
|
||||
let start_time = match cli.timezone {
|
||||
Some(tz) => tz.from_local_datetime(&cli.start_time).unwrap(),
|
||||
None => get_local_timezone()
|
||||
.expect("Could not get local timezone")
|
||||
.from_local_datetime(&cli.start_time)
|
||||
.unwrap(),
|
||||
let tz = cli
|
||||
.timezone
|
||||
.unwrap_or_else(|| get_local_timezone().expect("Could not get local timezone"));
|
||||
let start_time = tz.from_local_datetime(&cli.start_time).unwrap();
|
||||
let end_time = if let Some(time) = cli.end_time {
|
||||
tz.from_local_datetime(&time).unwrap()
|
||||
} else {
|
||||
Utc::now().with_timezone(&tz)
|
||||
};
|
||||
println!(
|
||||
"start_time = {:#?}, end_time = {:#?}, tz = {:#?}",
|
||||
start_time, end_time, tz
|
||||
)
|
||||
}
|
||||
|
||||
fn get_local_timezone() -> Result<Tz, String> {
|
||||
|
|
|
@ -9,7 +9,6 @@ pub struct TimeRange<Tz: chrono::TimeZone> {
|
|||
}
|
||||
|
||||
impl<Tz: chrono::TimeZone> TimeRange<Tz> {
|
||||
|
||||
/// whether a time instance lies within the time range
|
||||
pub fn is_in_range<Otz: chrono::TimeZone>(&self, other: &DateTime<Otz>) -> bool {
|
||||
(self.start <= *other) && (other <= &self.end)
|
||||
|
|
Loading…
Reference in a new issue