Я использую ящик git2 , чтобы получить список статусов в хранилище git, это код, который я использую:
use git2::{Repository, StatusOptions, StatusShow};
use std::{collections::HashMap, env};
fn main() {
let path = env::current_dir().unwrap();
let repo = Repository::discover(path).unwrap();
let mut status_opt = StatusOptions::new();
status_opt
.show(StatusShow::IndexAndWorkdir)
.include_untracked(true)
.include_unmodified(false)
.no_refresh(false);
let status_result = repo.statuses(Some(&mut status_opt)).unwrap();
let mut map: HashMap<git2::Status, u32> = HashMap::new();
for status_entry in status_result.iter() {
*map.entry(status_entry.status()).or_insert(0) += 1;
}
println!("{:?}", map);
}
На основепо модификациям текущего репозитория возвращает карту git2::Status
и вхождений, но я бы хотел вернуть аналогичный вывод в команду git status --porcelain
.
Например, в зависимости отизменения хранилища, это вывод git status --porcelain
:
M file_a
AM file_b
A file_c
?? file_e
?? file_f
Передача вывода в awk
:
$ git status --porcelain | awk -v ORS=", " 'NR>0{arr[$1]++}END{for (a in arr) print a, arr[a]}'
A 1, ?? 2, M 1, AM 1,
Использование Rust приведенный выше код вернет:
{INDEX_NEW: 1, WT_NEW: 2, INDEX_NEW | WT_MODIFIED: 1, INDEX_MODIFIED: 1}
Я хотел бы знать, как можно сопоставить значение git2::Status
констант с пользовательскими строками (совпадающими со строками фарфора), например:
INDEX_NEW -> A
INDEX_NEW | WT_MODIFIED -> AM
INDEX_MODIFIED -> M
WT_NEW -> ??
Главным образом, как поступать с такими делами, как INDEX_NEW | WT_MODIFIED
, которые будут отображаться, например, в AM