mirror of
https://github.com/Llewellynvdm/starship.git
synced 2024-12-27 11:52:43 +00:00
feat: Add commit count for ahead/behind symbols (#247)
Add logic for the git status module to display the number of commits the index is ahead or behind next to the symbol.
This commit is contained in:
parent
ed27cf4a2c
commit
9853743eda
@ -66,12 +66,17 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
|
|||||||
|
|
||||||
// Add the ahead/behind segment
|
// Add the ahead/behind segment
|
||||||
if let Ok((ahead, behind)) = ahead_behind {
|
if let Ok((ahead, behind)) = ahead_behind {
|
||||||
|
let ahead_segment = format!("{}{}", GIT_STATUS_AHEAD, ahead);
|
||||||
|
let behind_segment = format!("{}{}", GIT_STATUS_BEHIND, behind);
|
||||||
|
|
||||||
if ahead > 0 && behind > 0 {
|
if ahead > 0 && behind > 0 {
|
||||||
module.new_segment("diverged", GIT_STATUS_DIVERGED);
|
module.new_segment("diverged", GIT_STATUS_DIVERGED);
|
||||||
|
module.new_segment("ahead", ahead_segment.as_str());
|
||||||
|
module.new_segment("behind", behind_segment.as_str());
|
||||||
} else if ahead > 0 {
|
} else if ahead > 0 {
|
||||||
module.new_segment("ahead", GIT_STATUS_AHEAD);
|
module.new_segment("ahead", ahead_segment.as_str());
|
||||||
} else if behind > 0 {
|
} else if behind > 0 {
|
||||||
module.new_segment("behind", GIT_STATUS_BEHIND);
|
module.new_segment("behind", behind_segment.as_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,7 +118,11 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
|
|||||||
/// Gets the bitflags associated with the repo's git status
|
/// Gets the bitflags associated with the repo's git status
|
||||||
fn get_repo_status(repository: &Repository) -> Result<Status, git2::Error> {
|
fn get_repo_status(repository: &Repository) -> Result<Status, git2::Error> {
|
||||||
let mut status_options = git2::StatusOptions::new();
|
let mut status_options = git2::StatusOptions::new();
|
||||||
|
|
||||||
status_options.include_untracked(true);
|
status_options.include_untracked(true);
|
||||||
|
status_options.renames_from_rewrites(true);
|
||||||
|
status_options.renames_head_to_index(true);
|
||||||
|
status_options.renames_index_to_workdir(true);
|
||||||
|
|
||||||
let repo_file_statuses = repository.statuses(Some(&mut status_options))?;
|
let repo_file_statuses = repository.statuses(Some(&mut status_options))?;
|
||||||
|
|
||||||
|
BIN
tests/fixtures/rocket.bundle
vendored
Normal file
BIN
tests/fixtures/rocket.bundle
vendored
Normal file
Binary file not shown.
318
tests/testsuite/git_status.rs
Normal file
318
tests/testsuite/git_status.rs
Normal file
@ -0,0 +1,318 @@
|
|||||||
|
use ansi_term::Color;
|
||||||
|
use git2::Repository;
|
||||||
|
use std::env;
|
||||||
|
use std::fs::{self, File};
|
||||||
|
use std::io;
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
use crate::common;
|
||||||
|
|
||||||
|
fn create_fixture_repo() -> io::Result<std::path::PathBuf> {
|
||||||
|
let fixture_repo_dir = common::new_tempdir()?.path().join("fixture");
|
||||||
|
let fixture = env::current_dir()?.join("tests/fixtures/rocket.bundle");
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.args(&["config", "--global", "user.email", "starship@example.com"])
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.args(&["config", "--global", "user.name", "starship"])
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.args(&[
|
||||||
|
"clone",
|
||||||
|
"-b",
|
||||||
|
"master",
|
||||||
|
&fixture.to_str().unwrap(),
|
||||||
|
fixture_repo_dir.to_str().unwrap(),
|
||||||
|
])
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
Ok(fixture_repo_dir)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn shows_behind_count() -> io::Result<()> {
|
||||||
|
let fixture_repo_dir = create_fixture_repo()?;
|
||||||
|
let repo_dir = common::new_tempdir()?.path().join("rocket");
|
||||||
|
|
||||||
|
Repository::clone(fixture_repo_dir.to_str().unwrap(), &repo_dir.as_path()).unwrap();
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.args(&["reset", "--hard", "HEAD^"])
|
||||||
|
.current_dir(repo_dir.as_path())
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
let output = common::render_module("git_status")
|
||||||
|
.arg("--path")
|
||||||
|
.arg(repo_dir)
|
||||||
|
.output()?;
|
||||||
|
let actual = String::from_utf8(output.stdout).unwrap();
|
||||||
|
let expected = Color::Red
|
||||||
|
.bold()
|
||||||
|
.paint(format!("[{}] ", "⇣1"))
|
||||||
|
.to_string();
|
||||||
|
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn shows_ahead_count() -> io::Result<()> {
|
||||||
|
let fixture_repo_dir = create_fixture_repo()?;
|
||||||
|
let repo_dir = common::new_tempdir()?.path().join("rocket");
|
||||||
|
|
||||||
|
Repository::clone(fixture_repo_dir.to_str().unwrap(), &repo_dir.as_path()).unwrap();
|
||||||
|
|
||||||
|
File::create(repo_dir.join("readme.md"))?;
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.args(&["commit", "-am", "Update readme"])
|
||||||
|
.current_dir(&repo_dir)
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
let output = common::render_module("git_status")
|
||||||
|
.arg("--path")
|
||||||
|
.arg(repo_dir)
|
||||||
|
.output()?;
|
||||||
|
let actual = String::from_utf8(output.stdout).unwrap();
|
||||||
|
let expected = Color::Red
|
||||||
|
.bold()
|
||||||
|
.paint(format!("[{}] ", "⇡1"))
|
||||||
|
.to_string();
|
||||||
|
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn shows_diverged() -> io::Result<()> {
|
||||||
|
let fixture_repo_dir = create_fixture_repo()?;
|
||||||
|
let repo_dir = common::new_tempdir()?.path().join("rocket");
|
||||||
|
|
||||||
|
Repository::clone(fixture_repo_dir.to_str().unwrap(), &repo_dir.as_path()).unwrap();
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.args(&["reset", "--hard", "HEAD^"])
|
||||||
|
.current_dir(repo_dir.as_path())
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
fs::write(repo_dir.join("Cargo.toml"), " ")?;
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.args(&["commit", "-am", "Update readme"])
|
||||||
|
.current_dir(repo_dir.as_path())
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
let output = common::render_module("git_status")
|
||||||
|
.arg("--path")
|
||||||
|
.arg(repo_dir)
|
||||||
|
.output()?;
|
||||||
|
let actual = String::from_utf8(output.stdout).unwrap();
|
||||||
|
let expected = Color::Red
|
||||||
|
.bold()
|
||||||
|
.paint(format!("[{}] ", "⇕⇡1⇣1"))
|
||||||
|
.to_string();
|
||||||
|
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn shows_conflicted() -> io::Result<()> {
|
||||||
|
let fixture_repo_dir = create_fixture_repo()?;
|
||||||
|
let repo_dir = common::new_tempdir()?.path().join("rocket");
|
||||||
|
|
||||||
|
Repository::clone(fixture_repo_dir.to_str().unwrap(), &repo_dir.as_path()).unwrap();
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.args(&["reset", "--hard", "HEAD^"])
|
||||||
|
.current_dir(repo_dir.as_path())
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
fs::write(repo_dir.join("readme.md"), "# goodbye")?;
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.args(&["add", "."])
|
||||||
|
.current_dir(repo_dir.as_path())
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.args(&["commit", "-m", "Change readme"])
|
||||||
|
.current_dir(repo_dir.as_path())
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.args(&["pull", "--rebase"])
|
||||||
|
.current_dir(repo_dir.as_path())
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
let output = common::render_module("git_status")
|
||||||
|
.arg("--path")
|
||||||
|
.arg(repo_dir)
|
||||||
|
.output()?;
|
||||||
|
let actual = String::from_utf8(output.stdout).unwrap();
|
||||||
|
let expected = Color::Red.bold().paint(format!("[{}] ", "=")).to_string();
|
||||||
|
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn shows_untracked_file() -> io::Result<()> {
|
||||||
|
let fixture_repo_dir = create_fixture_repo()?;
|
||||||
|
let repo_dir = common::new_tempdir()?.path().join("rocket");
|
||||||
|
|
||||||
|
Repository::clone(fixture_repo_dir.to_str().unwrap(), &repo_dir.as_path()).unwrap();
|
||||||
|
|
||||||
|
File::create(repo_dir.join("license"))?;
|
||||||
|
|
||||||
|
let output = common::render_module("git_status")
|
||||||
|
.arg("--path")
|
||||||
|
.arg(repo_dir)
|
||||||
|
.output()?;
|
||||||
|
let actual = String::from_utf8(output.stdout).unwrap();
|
||||||
|
let expected = Color::Red.bold().paint(format!("[{}] ", "?")).to_string();
|
||||||
|
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn shows_stashed() -> io::Result<()> {
|
||||||
|
let fixture_repo_dir = create_fixture_repo()?;
|
||||||
|
let repo_dir = common::new_tempdir()?.path().join("rocket");
|
||||||
|
|
||||||
|
Repository::clone(fixture_repo_dir.to_str().unwrap(), &repo_dir.as_path()).unwrap();
|
||||||
|
|
||||||
|
File::create(repo_dir.join("readme.md"))?;
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.arg("stash")
|
||||||
|
.current_dir(repo_dir.as_path())
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
let output = common::render_module("git_status")
|
||||||
|
.arg("--path")
|
||||||
|
.arg(repo_dir)
|
||||||
|
.output()?;
|
||||||
|
let actual = String::from_utf8(output.stdout).unwrap();
|
||||||
|
let expected = Color::Red.bold().paint(format!("[{}] ", "$")).to_string();
|
||||||
|
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn shows_modified() -> io::Result<()> {
|
||||||
|
let fixture_repo_dir = create_fixture_repo()?;
|
||||||
|
let repo_dir = common::new_tempdir()?.path().join("rocket");
|
||||||
|
|
||||||
|
Repository::clone(fixture_repo_dir.to_str().unwrap(), &repo_dir.as_path()).unwrap();
|
||||||
|
|
||||||
|
File::create(repo_dir.join("readme.md"))?;
|
||||||
|
|
||||||
|
let output = common::render_module("git_status")
|
||||||
|
.arg("--path")
|
||||||
|
.arg(repo_dir)
|
||||||
|
.output()?;
|
||||||
|
let actual = String::from_utf8(output.stdout).unwrap();
|
||||||
|
let expected = Color::Red.bold().paint(format!("[{}] ", "!")).to_string();
|
||||||
|
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn shows_added_file() -> io::Result<()> {
|
||||||
|
let fixture_repo_dir = create_fixture_repo()?;
|
||||||
|
let repo_dir = common::new_tempdir()?.path().join("rocket");
|
||||||
|
|
||||||
|
Repository::clone(fixture_repo_dir.to_str().unwrap(), &repo_dir.as_path()).unwrap();
|
||||||
|
|
||||||
|
File::create(repo_dir.join("license"))?;
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.args(&["add", "."])
|
||||||
|
.current_dir(repo_dir.as_path())
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
let output = common::render_module("git_status")
|
||||||
|
.arg("--path")
|
||||||
|
.arg(repo_dir)
|
||||||
|
.output()?;
|
||||||
|
let actual = String::from_utf8(output.stdout).unwrap();
|
||||||
|
let expected = Color::Red.bold().paint(format!("[{}] ", "+")).to_string();
|
||||||
|
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn shows_renamed_file() -> io::Result<()> {
|
||||||
|
let fixture_repo_dir = create_fixture_repo()?;
|
||||||
|
let repo_dir = common::new_tempdir()?.path().join("rocket");
|
||||||
|
|
||||||
|
Repository::clone(fixture_repo_dir.to_str().unwrap(), &repo_dir.as_path()).unwrap();
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.args(&["mv", "readme.md", "readme.md.bak"])
|
||||||
|
.current_dir(repo_dir.as_path())
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
Command::new("git")
|
||||||
|
.args(&["add", "-A"])
|
||||||
|
.current_dir(repo_dir.as_path())
|
||||||
|
.output()?;
|
||||||
|
|
||||||
|
let output = common::render_module("git_status")
|
||||||
|
.arg("--path")
|
||||||
|
.arg(repo_dir)
|
||||||
|
.output()?;
|
||||||
|
let actual = String::from_utf8(output.stdout).unwrap();
|
||||||
|
let expected = Color::Red.bold().paint(format!("[{}] ", "»")).to_string();
|
||||||
|
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn shows_deleted_file() -> io::Result<()> {
|
||||||
|
let fixture_repo_dir = create_fixture_repo()?;
|
||||||
|
let repo_dir = common::new_tempdir()?.path().join("rocket");
|
||||||
|
|
||||||
|
Repository::clone(fixture_repo_dir.to_str().unwrap(), &repo_dir.as_path()).unwrap();
|
||||||
|
|
||||||
|
fs::remove_file(repo_dir.join("readme.md"))?;
|
||||||
|
|
||||||
|
let output = common::render_module("git_status")
|
||||||
|
.arg("--path")
|
||||||
|
.arg(repo_dir)
|
||||||
|
.output()?;
|
||||||
|
let actual = String::from_utf8(output.stdout).unwrap();
|
||||||
|
let expected = Color::Red.bold().paint(format!("[{}] ", "✘")).to_string();
|
||||||
|
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
@ -3,6 +3,7 @@ mod cmd_duration;
|
|||||||
mod common;
|
mod common;
|
||||||
mod configuration;
|
mod configuration;
|
||||||
mod directory;
|
mod directory;
|
||||||
|
mod git_status;
|
||||||
mod golang;
|
mod golang;
|
||||||
mod jobs;
|
mod jobs;
|
||||||
mod line_break;
|
mod line_break;
|
||||||
|
Loading…
Reference in New Issue
Block a user