Skip to content

Commit c995f3e

Browse files
committed
migrate get_pending_changes
1 parent a183a32 commit c995f3e

File tree

2 files changed

+43
-50
lines changed

2 files changed

+43
-50
lines changed

src/onefetch/git_utils.rs

+42-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::onefetch::{commit_info::CommitInfo, error::*};
2-
use git2::{Repository, RepositoryOpenFlags};
2+
use git2::{Repository, RepositoryOpenFlags, Status, StatusOptions, StatusShow};
33
use regex::Regex;
44
use std::path::Path;
55

@@ -15,6 +15,47 @@ fn work_dir(repo: &Repository) -> Result<&Path> {
1515
repo.workdir().ok_or_else(|| "unable to query workdir".into())
1616
}
1717

18+
pub fn get_pending_changes(repo: &Repository) -> Result<String> {
19+
let statuses = repo.statuses(Some(
20+
StatusOptions::default()
21+
.show(StatusShow::Workdir)
22+
.update_index(true)
23+
.include_untracked(true)
24+
.renames_head_to_index(true)
25+
.recurse_untracked_dirs(true),
26+
))?;
27+
28+
let mut deleted = 0;
29+
let mut added = 0;
30+
let mut modified = 0;
31+
32+
for e in statuses.iter() {
33+
let s: Status = e.status();
34+
if s.is_index_new() || s.is_wt_new() {
35+
added += 1;
36+
} else if s.is_index_deleted() || s.is_wt_deleted() {
37+
deleted += 1;
38+
} else {
39+
modified += 1;
40+
}
41+
}
42+
43+
let mut result = String::from("");
44+
if modified > 0 {
45+
result = format!("{}+-", modified)
46+
}
47+
48+
if added > 0 {
49+
result = format!("{} {}+", result, added);
50+
}
51+
52+
if deleted > 0 {
53+
result = format!("{} {}-", result, deleted);
54+
}
55+
56+
Ok(result.trim().into())
57+
}
58+
1859
pub fn get_repo_name_and_url(repo: &Repository) -> Result<(String, String)> {
1960
let config = repo.config()?;
2061
let mut remote_origin_url: Option<String> = None;

src/onefetch/info.rs

+1-49
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ impl Info {
215215
let workdir = git_utils::get_repo_work_dir(&repo)?;
216216
let (repository_name, repository_url) = git_utils::get_repo_name_and_url(&repo)?;
217217
let current_commit_info = git_utils::get_current_commit_info(&repo);
218+
let pending = git_utils::get_pending_changes(&repo);
218219
let git_history = Info::get_git_history(&workdir, config.no_merges);
219220
let creation_date = Info::get_creation_date(&git_history);
220221
let number_of_commits = Info::get_number_of_commits(&git_history);
@@ -223,7 +224,6 @@ impl Info {
223224
let (number_of_tags, number_of_branches) = Info::get_number_of_tags_branches(&workdir);
224225
let (git_v, git_user) = Info::get_git_version_and_username(&workdir);
225226
let version = Info::get_version(&workdir);
226-
let pending = Info::get_pending_changes(&workdir);
227227
let repo_size = Info::get_packed_size(&workdir);
228228
let project_license = Detector::new()?.get_project_license(&workdir);
229229
let dependencies = deps::DependencyDetector::new().get_dependencies(&workdir)?;
@@ -381,54 +381,6 @@ impl Info {
381381
number_of_commits.to_string()
382382
}
383383

384-
fn get_pending_changes(dir: &str) -> Result<String> {
385-
let output = Command::new("git")
386-
.arg("-C")
387-
.arg(dir)
388-
.arg("status")
389-
.arg("--porcelain")
390-
.output()
391-
.expect("Failed to execute git.");
392-
393-
let output = String::from_utf8_lossy(&output.stdout);
394-
395-
if output == "" {
396-
Ok("".into())
397-
} else {
398-
let lines = output.lines();
399-
400-
let mut deleted = 0;
401-
let mut added = 0;
402-
let mut modified = 0;
403-
404-
for line in lines {
405-
let prefix = &line[..2];
406-
407-
match prefix.trim() {
408-
"D" => deleted += 1,
409-
"A" | "AM" | "??" => added += 1,
410-
"M" | "MM" | "R" => modified += 1,
411-
_ => {}
412-
}
413-
}
414-
415-
let mut result = String::from("");
416-
if modified > 0 {
417-
result = format!("{}+-", modified)
418-
}
419-
420-
if added > 0 {
421-
result = format!("{} {}+", result, added);
422-
}
423-
424-
if deleted > 0 {
425-
result = format!("{} {}-", result, deleted);
426-
}
427-
428-
Ok(result.trim().into())
429-
}
430-
}
431-
432384
fn get_packed_size(dir: &str) -> Result<String> {
433385
let output = Command::new("git")
434386
.arg("-C")

0 commit comments

Comments
 (0)