1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
use std::convert::TryInto;
use std::process::Command;
use std::time::SystemTime;
use eyre::Context;
use itertools::Itertools;
use lib::core::eventlog::{EventLogDb, EventTransactionId, BRANCHLESS_TRANSACTION_ID_ENV_VAR};
use lib::git::{GitRunInfo, Repo};
fn pass_through_git_command_inner(
git_run_info: &GitRunInfo,
args: &[&str],
event_tx_id: Option<EventTransactionId>,
) -> eyre::Result<isize> {
let GitRunInfo {
path_to_git,
working_directory,
env,
} = git_run_info;
let mut command = Command::new(path_to_git);
command.current_dir(working_directory);
command.args(args);
command.env_clear();
command.envs(env.iter());
if let Some(event_tx_id) = event_tx_id {
command.env(BRANCHLESS_TRANSACTION_ID_ENV_VAR, event_tx_id.to_string());
}
let exit_status = command.status().wrap_err("Running Git command")?;
let exit_code = exit_status.code().unwrap_or(1).try_into()?;
Ok(exit_code)
}
fn pass_through_git_command<S: AsRef<str> + std::fmt::Debug>(
git_run_info: &GitRunInfo,
args: &[S],
event_tx_id: Option<EventTransactionId>,
) -> eyre::Result<isize> {
pass_through_git_command_inner(
git_run_info,
args.iter().map(AsRef::as_ref).collect_vec().as_slice(),
event_tx_id,
)
}
fn make_event_tx_id<S: AsRef<str> + std::fmt::Debug>(
args: &[S],
) -> eyre::Result<EventTransactionId> {
let now = SystemTime::now();
let repo = Repo::from_current_dir()?;
let conn = repo.get_db_conn()?;
let event_log_db = EventLogDb::new(&conn)?;
let event_tx_id = {
let message = args.first().map(|s| s.as_ref()).unwrap_or("wrap");
event_log_db.make_transaction_id(now, message)?
};
Ok(event_tx_id)
}
pub fn wrap<S: AsRef<str> + std::fmt::Debug>(
git_run_info: &GitRunInfo,
args: &[S],
) -> eyre::Result<isize> {
let event_tx_id = make_event_tx_id(args).ok();
let exit_code = pass_through_git_command(git_run_info, args, event_tx_id)?;
Ok(exit_code)
}