9ns: Add MEM_WAIT in a few places
[akaros.git] / scripts / tagging / global-subd.sh
1 #!/bin/bash
2 # global-subd.sh
3 # barret rhoden 2012-03-07
4
5 # this is a wrapper for 'global' that allows limiting the search to a
6 # subdirectory of the pwd.  set the last argument to be the subdirectory, like
7 # with git grep.  due to some limitations with global's formatting options, we
8 # don't have the output sorted (by whatever mechanism they use), but it does
9 # still retain its relative path.
10 #
11 # one nice side effect of the directory argument is that you can use this
12 # script from outside of a gtags-managed directory, since we cd into the path.
13 # for example, you can be in ~you/ and call global-subd.sh PATH_TO_REPO
14 # ARGUMENTS, and it will run global within that directory.  not a big deal one
15 # way or another.
16 #
17 # as a side note, if you call global with a wildcard, you need to quote-escape
18 # it (single or double), to prevent the bash expansion.  e.g., cd user/parlib,
19 # global vcore* isn't what you want, you want global "vcore*" (or 'vcore*').  
20 # we still need to "" the args we pass to global (even for plain old global),
21 # so that the caller's quotes make it through.  also note that if there is bash
22 # expansion, it happens at the calling dir, not the cd'd dir
23
24 FIRST_ARG=$1
25 LAST_ARG=${BASH_ARGV[0]}
26
27 # Helper: we needed to drop our dir's trailing /, if there was one, and escape
28 # all intermediate ones for sed later.  This will make whatever path you send
29 # in correct for sed later.
30 set_sed_arg()
31 {
32         SED_ARG="$1"
33         # remove trailing /
34         SED_ARG=`echo "$SED_ARG" | sed 's/\/$//'`
35         # need 4 \ to get two \ in the sed, which outputs one \ (something to do
36         # with the nested shell calls (``).  just need \/ to output \
37         SED_ARG=`echo "$SED_ARG" | sed 's/\//\\\\\//g'`
38 }
39
40 # We try for the first arg being the dir, and then the last arg.  In either
41 # case, we call global with -l for local (this dir and children), and -n to
42 # stop stripping paths.  unfortunately, -n also stops the (decent?) sorting of
43 # the results...  sed finds our path and strips the leading "./".
44 # Note, we need the quotes on input, o/w the test will pass for empty input...
45 if [ -d "$FIRST_ARG" ]
46 then
47         cd "$FIRST_ARG"
48         set_sed_arg $FIRST_ARG
49         # call global with the first arg taken off
50         shift # have $@ forget arg1
51         global -ln "$@" | sed "s/\.\/\($SED_ARG\)/\1/g"
52 elif [ -d "$LAST_ARG" ]
53 then
54         cd "$LAST_ARG"
55         set_sed_arg $LAST_ARG
56         # call global with the last arg taken off.  need to do it in one line,
57         # since bash sucks and it won't keep any quoted wildcards intact otherwise
58         # (or will still muck with the arguments in some weird way).  this is
59         # similar to doing NEW_ARGS=${@:1:$LAST_MINUS_ONE}, and passing NEW_ARGS
60         LAST_MINUS_ONE=$(($#-1))
61         global -ln "${@:1:$LAST_MINUS_ONE}" | sed "s/\.\/\($SED_ARG\)/\1/g"
62 else # plain old global
63         global "$@"
64 fi