1
0
mirror of https://github.com/Llewellynvdm/starship.git synced 2024-11-28 15:56:28 +00:00

feat(git_status): added symbol for local repos up-to-date with remote. (#2945)

* git_status: added symbol for when local branch is up-to-date with upstream

* updated docs

* removed unused variable, moved location of config comment

* changed uptodate default to empty string, simplified and made safer

* added uptodate default line back into docstring

* fixed linting and formatting errors

* refactored uptodate to up_to_date, removed redundant else statement
This commit is contained in:
Bill 2021-08-07 12:22:00 -05:00 committed by GitHub
parent b7b7df9885
commit b2e2330cb0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 18 deletions

View File

@ -1314,6 +1314,7 @@ current directory.
| `ahead` | `"⇡"` | The format of `ahead` | | `ahead` | `"⇡"` | The format of `ahead` |
| `behind` | `"⇣"` | The format of `behind` | | `behind` | `"⇣"` | The format of `behind` |
| `diverged` | `"⇕"` | The format of `diverged` | | `diverged` | `"⇕"` | The format of `diverged` |
| `up_to_date` | `""` | The format of `up_to_date` |
| `untracked` | `"?"` | The format of `untracked` | | `untracked` | `"?"` | The format of `untracked` |
| `stashed` | `"$"` | The format of `stashed` | | `stashed` | `"$"` | The format of `stashed` |
| `modified` | `"!"` | The format of `modified` | | `modified` | `"!"` | The format of `modified` |
@ -1328,9 +1329,9 @@ current directory.
The following variables can be used in `format`: The following variables can be used in `format`:
| Variable | Description | | Variable | Description |
| -------------- | --------------------------------------------------------------------------------------------- | | -------------- | ----------------------------------------------------------------------------------------------------------- |
| `all_status` | Shortcut for`$conflicted$stashed$deleted$renamed$modified$staged$untracked` | | `all_status` | Shortcut for`$conflicted$stashed$deleted$renamed$modified$staged$untracked` |
| `ahead_behind` | Displays `diverged` `ahead` or `behind` format string based on the current status of the repo | | `ahead_behind` | Displays `diverged`, `ahead`, `behind` or `up_to_date` format string based on the current status of the repo. |
| `conflicted` | Displays `conflicted` when this branch has merge conflicts. | | `conflicted` | Displays `conflicted` when this branch has merge conflicts. |
| `untracked` | Displays `untracked` when there are untracked files in the working directory. | | `untracked` | Displays `untracked` when there are untracked files in the working directory. |
| `stashed` | Displays `stashed` when a stash exists for the local repository. | | `stashed` | Displays `stashed` when a stash exists for the local repository. |
@ -1365,6 +1366,7 @@ conflicted = "🏳"
ahead = "🏎💨" ahead = "🏎💨"
behind = "😰" behind = "😰"
diverged = "😵" diverged = "😵"
up_to_date = "✓"
untracked = "🤷‍" untracked = "🤷‍"
stashed = "📦" stashed = "📦"
modified = "📝" modified = "📝"

View File

@ -10,6 +10,7 @@ pub struct GitStatusConfig<'a> {
pub stashed: &'a str, pub stashed: &'a str,
pub ahead: &'a str, pub ahead: &'a str,
pub behind: &'a str, pub behind: &'a str,
pub up_to_date: &'a str,
pub diverged: &'a str, pub diverged: &'a str,
pub conflicted: &'a str, pub conflicted: &'a str,
pub deleted: &'a str, pub deleted: &'a str,
@ -28,6 +29,7 @@ impl<'a> Default for GitStatusConfig<'a> {
stashed: "\\$", stashed: "\\$",
ahead: "", ahead: "",
behind: "", behind: "",
up_to_date: "",
diverged: "", diverged: "",
conflicted: "=", conflicted: "=",
deleted: "", deleted: "",

View File

@ -18,6 +18,7 @@ const ALL_STATUS_FORMAT: &str = "$conflicted$stashed$deleted$renamed$modified$st
/// - `⇡` This branch is ahead of the branch being tracked /// - `⇡` This branch is ahead of the branch being tracked
/// - `⇣` This branch is behind of the branch being tracked /// - `⇣` This branch is behind of the branch being tracked
/// - `⇕` This branch has diverged from the branch being tracked /// - `⇕` This branch has diverged from the branch being tracked
/// - `` This branch is up-to-date with the branch being tracked
/// - `?` — There are untracked files in the working directory /// - `?` — There are untracked files in the working directory
/// - `$` — A stash exists for the local repository /// - `$` — A stash exists for the local repository
/// - `!` — There are file modifications in the working directory /// - `!` — There are file modifications in the working directory
@ -47,6 +48,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
format_count(config.stashed, "git_status.stashed", count) format_count(config.stashed, "git_status.stashed", count)
}), }),
"ahead_behind" => info.get_ahead_behind().and_then(|(ahead, behind)| { "ahead_behind" => info.get_ahead_behind().and_then(|(ahead, behind)| {
let (ahead, behind) = (ahead?, behind?);
if ahead > 0 && behind > 0 { if ahead > 0 && behind > 0 {
format_text(config.diverged, "git_status.diverged", |variable| { format_text(config.diverged, "git_status.diverged", |variable| {
match variable { match variable {
@ -60,7 +62,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
} else if behind > 0 && ahead == 0 { } else if behind > 0 && ahead == 0 {
format_count(config.behind, "git_status.behind", behind) format_count(config.behind, "git_status.behind", behind)
} else { } else {
None format_symbol(config.up_to_date, "git_status.up_to_date")
} }
}), }),
"conflicted" => info.get_conflicted().and_then(|count| { "conflicted" => info.get_conflicted().and_then(|count| {
@ -120,7 +122,7 @@ impl<'a> GitStatusInfo<'a> {
} }
} }
pub fn get_ahead_behind(&self) -> Option<(usize, usize)> { pub fn get_ahead_behind(&self) -> Option<(Option<usize>, Option<usize>)> {
self.get_repo_status().map(|data| (data.ahead, data.behind)) self.get_repo_status().map(|data| (data.ahead, data.behind))
} }
@ -217,8 +219,8 @@ fn get_stashed_count(context: &Context) -> Option<usize> {
#[derive(Default, Debug, Copy, Clone)] #[derive(Default, Debug, Copy, Clone)]
struct RepoStatus { struct RepoStatus {
ahead: usize, ahead: Option<usize>,
behind: usize, behind: Option<usize>,
conflicted: usize, conflicted: usize,
deleted: usize, deleted: usize,
renamed: usize, renamed: usize,
@ -271,8 +273,8 @@ impl RepoStatus {
let re = Regex::new(r"branch\.ab \+([0-9]+) \-([0-9]+)").unwrap(); let re = Regex::new(r"branch\.ab \+([0-9]+) \-([0-9]+)").unwrap();
if let Some(caps) = re.captures(s) { if let Some(caps) = re.captures(s) {
self.ahead = caps.get(1).unwrap().as_str().parse::<usize>().unwrap(); self.ahead = caps.get(1).unwrap().as_str().parse::<usize>().ok();
self.behind = caps.get(2).unwrap().as_str().parse::<usize>().unwrap(); self.behind = caps.get(2).unwrap().as_str().parse::<usize>().ok();
} }
} }
} }
@ -303,6 +305,10 @@ fn format_count(format_str: &str, config_path: &str, count: usize) -> Option<Vec
}) })
} }
fn format_symbol(format_str: &str, config_path: &str) -> Option<Vec<Segment>> {
format_text(format_str, config_path, |_variable| None)
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use ansi_term::{ANSIStrings, Color}; use ansi_term::{ANSIStrings, Color};
@ -450,6 +456,23 @@ mod tests {
repo_dir.close() repo_dir.close()
} }
#[test]
fn shows_up_to_date_with_upstream() -> io::Result<()> {
let repo_dir = fixture_repo(FixtureProvider::Git)?;
let actual = ModuleRenderer::new("git_status")
.config(toml::toml! {
[git_status]
up_to_date=""
})
.path(&repo_dir.path())
.collect();
let expected = format_output("");
assert_eq!(expected, actual);
repo_dir.close()
}
#[test] #[test]
fn shows_conflicted() -> io::Result<()> { fn shows_conflicted() -> io::Result<()> {
let repo_dir = fixture_repo(FixtureProvider::Git)?; let repo_dir = fixture_repo(FixtureProvider::Git)?;