Мне нужно получить список авторов для репозитория git, как git shortlog -s
делает в командной строке.
То, что я делаю в настоящее время и работает, это сделать revwalk ( просматривая все ревизии) и собирая список авторов для всех коммитов по одному, но это довольно медленно, особенно по сравнению с командой git командной строки.
Я использую ржавчину, но Я ожидаю, что решение похоже на C или другой язык привязки к libgit2.
Это мой текущий, работающий, но медленный код:
let repo = Repository::open(&git_path)?;
let mut revwalk = repo.revwalk()?;
revwalk.push_head()?;
let mut authors: Vec<String> = revwalk
.map(|r| {
let oid = r?;
repo.find_commit(oid)
})
.filter_map(|c| match c {
Ok(commit) => Some(commit),
Err(e) => {
println!("Error walking the revisions {}, skipping", e);
None
}
})
.fold(HashSet::new(), |mut sofar, cur| {
if let Some(name) = cur.author().name() {
sofar.insert(name.to_string());
}
sofar
})
.into_iter()
.collect();
authors.sort();
EDIT Хорошо, если в режиме релиза с ржавчиной это заметно быстрее. Я до сих пор не знаю, есть ли более эффективный способ.