Fix the uptodate logic (uptodate if !find newer dirs than the cache).
[dmenu.git] / dmenu_path
index e590a5c..3569077 100755 (executable)
@@ -1,30 +1,26 @@
-#!/bin/sh
+#!/bin/sh -f
 CACHE=$HOME/.dmenu_cache
-UPTODATE=1
 IFS=:
 
-if test ! -f $CACHE 
-then
-       unset UPTODATE
-fi
+qfind() {
+       find "$@" 2>/dev/null
+}
 
-if test $UPTODATE
-then
-       for dir in $PATH
-       do
-               test $dir -nt $CACHE && unset UPTODATE
-       done
-fi
+uptodate() {                                                                       
+       test -f $CACHE &&
+               test "$(echo "$PATH")" = "$(sed 1q "$CACHE")" &&
+               ! qfind $PATH -maxdepth 0 -newer $CACHE >/dev/null
+}
 
-if test ! $UPTODATE
+if ! uptodate
 then
-       for dir in $PATH
-       do
-               for file in "$dir"/*
-               do
-                       test -x "$file" && echo "${file##*/}"
-               done
-       done | sort | uniq > $CACHE
+       {
+               echo "$PATH"
+               qfind $PATH -type f -maxdepth 1 '(' -perm -u+x -o -perm -g+x -o -perm -o+x ')' |
+                       sed 's,.*/,,' | sort | uniq
+       }
+       mv $CACHE.$pid $CACHE
 fi
 
-cat $CACHE
+tail -n +2 $CACHE
+