aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Perepelitsa <roman.perepelitsa@gmail.com>2020-06-14 11:29:29 +0300
committerRoman Perepelitsa <roman.perepelitsa@gmail.com>2020-06-14 11:29:29 +0300
commit5e5d3f5afff5112da97b5b972a17d24411bb04c7 (patch)
tree1d26aa18a19db659558554ec306d6207b13f9194
parent4c15d633ddf311d07c45f94c326ef27e19c9e7b7 (diff)
parent0717e57ff46201ff04e7d62cda8677e174a83be6 (diff)
Merge commit '0717e57ff46201ff04e7d62cda8677e174a83be6'
-rw-r--r--gitstatus/README.md12
-rw-r--r--gitstatus/gitstatus.prompt.sh2
-rwxr-xr-xgitstatus/install2
-rw-r--r--gitstatus/src/dir.cc12
4 files changed, 15 insertions, 13 deletions
diff --git a/gitstatus/README.md b/gitstatus/README.md
index 291f89bf..cbf29c3a 100644
--- a/gitstatus/README.md
+++ b/gitstatus/README.md
@@ -103,9 +103,9 @@ function my_set_prompt() {
if gitstatus_query MY && [[ $VCS_STATUS_RESULT == ok-sync ]]; then
RPROMPT=${${VCS_STATUS_LOCAL_BRANCH:-@${VCS_STATUS_COMMIT}}//\%/%%} # escape %
- (( $VCS_STATUS_NUM_STAGED )) && RPROMPT+='+'
- (( $VCS_STATUS_NUM_UNSTAGED )) && RPROMPT+='!'
- (( $VCS_STATUS_NUM_UNTRACKED )) && RPROMPT+='?'
+ (( VCS_STATUS_NUM_STAGED )) && RPROMPT+='+'
+ (( VCS_STATUS_NUM_UNSTAGED )) && RPROMPT+='!'
+ (( VCS_STATUS_NUM_UNTRACKED )) && RPROMPT+='?'
fi
setopt no_prompt_{bang,subst} prompt_percent # enable/disable correct prompt expansions
@@ -204,9 +204,9 @@ function my_set_prompt() {
else
PS1+=" @${VCS_STATUS_COMMIT//\\/\\\\}" # escape backslash
fi
- [[ "$VCS_STATUS_HAS_STAGED" == 1 ]] && PS1+='+'
- [[ "$VCS_STATUS_HAS_UNSTAGED" == 1 ]] && PS1+='!'
- [[ "$VCS_STATUS_HAS_UNTRACKED" == 1 ]] && PS1+='?'
+ (( VCS_STATUS_HAS_STAGED" )) && PS1+='+'
+ (( VCS_STATUS_HAS_UNSTAGED" )) && PS1+='!'
+ (( VCS_STATUS_HAS_UNTRACKED" )) && PS1+='?'
fi
PS1+='\n\$ '
diff --git a/gitstatus/gitstatus.prompt.sh b/gitstatus/gitstatus.prompt.sh
index b2c67c8d..9c1a2138 100644
--- a/gitstatus/gitstatus.prompt.sh
+++ b/gitstatus/gitstatus.prompt.sh
@@ -94,7 +94,7 @@ shopt -s promptvars
#
# Example:
#
-# user@host ~/projects/skynet master+!
+# user@host ~/projects/skynet master ⇡42
# $ █
PS1='\[\033[01;32m\]\u@\h\[\033[00m\] ' # green user@host
PS1+='\[\033[01;34m\]\w\[\033[00m\]' # blue current working directory
diff --git a/gitstatus/install b/gitstatus/install
index 4303129b..ec442ed9 100755
--- a/gitstatus/install
+++ b/gitstatus/install
@@ -131,7 +131,7 @@ END
>&2 echo "[gitstatus] error: GITSTATUS_DAEMON is not absolute path: $daemon"
return 1
fi
- if [ -z "$daemon" && -e "$gitstatus_dir"/usrbin/gitstatusd ]; then
+ if [ -z "$daemon" -a -e "$gitstatus_dir"/usrbin/gitstatusd ]; then
daemon="$gitstatus_dir"/usrbin/gitstatusd
fi
if [ -n "$daemon" ]; then
diff --git a/gitstatus/src/dir.cc b/gitstatus/src/dir.cc
index 14bc6ac4..1817e1d3 100644
--- a/gitstatus/src/dir.cc
+++ b/gitstatus/src/dir.cc
@@ -116,16 +116,18 @@ bool ListDir(int dir_fd, Arena& arena, std::vector<char*>& entries, bool precomp
entries.clear();
return false;
}
- if (n == 0) break;
for (int pos = 0; pos < n;) {
auto* ent = reinterpret_cast<linux_dirent64*>(buf + pos);
if (!Dots(ent->d_name)) entries.push_back(ent->d_name);
pos += ent->d_reclen;
- // It's tempting to bail here if n + sizeof(linux_dirent64) + 512 <= n. After all, there
- // was enough space for another entry but SYS_getdents64 didn't write it, so this must be
- // the end of the directory listing, right? Unfortuatenly, no. SYS_getdents64 is finicky.
- // It sometimes writes a partial list of entries even if the full list would fit.
}
+ if (n == 0) break;
+ // The following optimization relies on SYS_getdents64 always returning as many
+ // entries as would fit. This is not guaranteed by the specification and I don't
+ // know if this is true in practice. The optimization has no measurable effect on
+ // gitstatus performance, so it's turned off.
+ //
+ // if (n + sizeof(linux_dirent64) + 512 <= kBufSize) break;
}
if (case_sensitive) {