From 23e99709daf5c35b755841dd6457913c26839739 Mon Sep 17 00:00:00 2001 From: Matthew Rothenberg Date: Wed, 15 Oct 2014 02:41:21 -0400 Subject: [PATCH] integrate branch parsing into single system call The `git status --porcelain` command can take an additional argument `-b` which causes the porcelain output to also contain branch information in a stable and supposedly nonchanging way. This change adds that argument to the initial `git status` call, and parses the branch/ahead/behind information from that. The end result is the entire call to `git branch -v` can be removed, resulting in one less subshell command and hopefully a more reliable target across future versions of git. --- lib/git/status_shortcuts.rb | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/git/status_shortcuts.rb b/lib/git/status_shortcuts.rb index 2b656db..e121b8b 100644 --- a/lib/git/status_shortcuts.rb +++ b/lib/git/status_shortcuts.rb @@ -22,14 +22,15 @@ @project_root = File.exist?(".git") ? Dir.pwd : `\git rev-parse --show-toplevel 2> /dev/null`.strip -@git_status = `\git status --porcelain 2> /dev/null` +@git_status = `\git status --porcelain -b 2> /dev/null` -git_branch = `\git branch -v 2> /dev/null` -@branch = git_branch[/^\* (\(no branch\)|[^ ]*)/, 1] -@ahead = git_branch[/^\* [^ ]* *[^ ]* *\[ahead ?(\d+).*\]/, 1] -@behind = git_branch[/^\* [^ ]* *[^ ]* *\[.*behind ?(\d+)\]/, 1] +git_status_lines = @git_status.split("\n") +git_branch = git_status_lines[0] +@branch = git_branch[/^## (?:Initial commit on )?([^ \.]+)/, 1] +@ahead = git_branch[/\[ahead ?(\d+).*\]/, 1] +@behind = git_branch[/\[.*behind ?(\d+)\]/, 1] -@changes = @git_status.split("\n") +@changes = git_status_lines[1..-1] # Exit if too many changes exit if @changes.size > ENV["gs_max_changes"].to_i @@ -131,7 +132,7 @@ end # Extract the second file name from the format x -> y quoted, unquoted = /^(?:"(?:[^"\\]|\\.)*"|[^"].*) -> (?:"((?:[^"\\]|\\.)*)"|(.*[^"]))$/.match(file)[1..2] renamed_file = quoted || unquoted - @stat_hash[:unstaged] << {:msg => " modified", :col => :mod, :file => renamed_file} + @stat_hash[:unstaged] << {:msg => " modified", :col => :mod, :file => renamed_file} elsif x != "R" && y == "M" @stat_hash[:unstaged] << {:msg => " modified", :col => :mod, :file => file} elsif y == "D" && x != "D" && x != "U"