diff options
| -rwxr-xr-x | git-base.sh | 46 | ||||
| -rwxr-xr-x | test-files.sh | 27 | 
2 files changed, 73 insertions, 0 deletions
| diff --git a/git-base.sh b/git-base.sh index 2debafa..fbd7ef9 100755 --- a/git-base.sh +++ b/git-base.sh @@ -205,6 +205,52 @@ unstaged="%{$fg_bold[red]%}"  conflicted="%{$fg_bold[yellow]%}"  untracked="%{$fg_bold[white]%}" +is_dirty() { +  if ! git rev-parse; then +    #not in repo, thus not dirty +    return 1 +  else +    #in repo, might be dirty +    if [[ -n "$(git ls-files --exclude-standard --others)" ]]; then +      #untracked files thus dirty +      return 0 +    else +      #no untracked files +      if git show HEAD --; then +        #has a commit hash, thus not on an initial commit +        if ! git diff --quiet --ignore-submodules HEAD --; then +          #has differences thus dirty +          return 0 +        else +          return 1 +        fi +      else +        #no commit hash, thus can't use HEAD. +        #As it's inital commit we can just list the files. +        if [[ -n "$(ls -a -1 | grep -Ev '(\.|\.\.|\.git)')" ]]; then +          #files listed and no commit hash, thus changes +          return 0 +        else +          return 1 +        fi +      fi +    fi +  fi +  { +    #returns 1 if not a git repo +    git rev-parse && { +      #returns 1 if untracked files +      git ls-files --exclude-standard --others && ! { +        git show HEAD -- || +        #returns 1 if unstaged or staged files +        git diff --quiet --ignore-submodules HEAD -- +      } +    } +  } +  exitCode="$?" +  return "$exitCode" +} +  porcelain_status() {    echo "$(git status --porcelain 2>/dev/null)"  } diff --git a/test-files.sh b/test-files.sh index 2d39023..270ee3b 100755 --- a/test-files.sh +++ b/test-files.sh @@ -237,4 +237,31 @@ test_conflicted_us_changes() {    rm_tmp  } +test_is_dirty() { +  cd_to_tmp + +  assertFalse "not in repo" is_dirty + +  git init --quiet +  assertFalse "in repo and clean" is_dirty + +  touch foo +  assertTrue "untracked files" is_dirty + +  git add . +  assertTrue "staged addition files" is_dirty + +  git commit -m "inital commit" --quiet + +  assertFalse "commited and clean" is_dirty + +  echo "foo" >> foo +  assertTrue "modified file unstaged" is_dirty + +  git add . +  assertTrue "modified file staged" is_dirty + +  rm_tmp +} +  . ./shunit/shunit2 | 
