f37 -> f39
[infrastructure.git] / scripts / svn-keywords.sh
1 #!/bin/bash
2
3 COMMAND=$(basename $0)
4
5 usage () {
6
7    echo "Usage: $COMMAND keywords -- files or directories"
8    exit 1
9
10 }
11
12 [[ -z "$@" ]] && usage
13
14 mode=keywords
15
16 while [[ "$@" ]] ; do
17
18   case "$1" in
19     --)
20       mode=dirs ; shift ;;
21     *)
22       case $mode in
23         keywords)
24           keywords="$keywords $1" ; shift ;;
25         dirs)
26           dirs="$dirs $1" ; shift ;;
27         *)
28           usage ;;
29       esac
30       ;;
31   esac
32 done
33   
34 if [ "$mode" == keywords -o -z "$dirs" -o -z "$keywords" ] ; then
35   usage
36 fi
37
38 function run_keyword_on_file () {
39     keyword=$1; shift
40     file=$1; shift
41     echo -n "$file "
42     if [ ! -f $file ] ; then
43         echo "NOT FOUND - skipped"
44         continue
45     fi
46     current_keywords=$(svn propget svn:keywords $file)
47     has_keyword=$(echo $current_keywords | grep $keyword)
48     if [ -z "$has_keyword" ] ; then
49         echo "+$keyword"
50         svn propset svn:keywords "$current_keywords $keyword" $file
51     else
52         echo "="
53     fi
54 }    
55
56 # figures what files need to have the svn:keywords set, and adds it when missing
57 function run_keywords () {
58     for dir in $dirs; do
59         cd $here
60         if [ -d $dir ] ; then
61             cd $dir
62             echo "xxxxxxxxxxxxxxxxxxxx Fixing keywords props in $(pwd)"
63             echo -n "xxxxxxxxxx Gathering files under subversion "
64             svnfiles=$(svn list -R | grep -v '/$')
65             
66             # handle this, as otherwise grep hangs on stdin
67             if [ -z "$svnfiles" ] ; then
68                 echo "xxxxx Nothing applicable in $dir - skipping"
69                 continue
70             fi
71                 
72             echo $(ls -1 $svnfiles | wc -l) files found
73
74             for keyword in $keywords ; do
75                 
76                 files=$(grep -l '$'"$keyword" $svnfiles)
77                 if [ -z "$files" ] ; then
78                     echo "xxxxx No file found with \$$keyword"
79                     continue
80                 fi
81                 nbfiles=$(ls -1 $files | wc -l)
82                 echo "xxxxx Found" $nbfiles "with \$$keyword"
83             
84                 for file in $files ; do
85                     run_keyword_on_file $keyword $file
86                 done
87             done
88         else 
89             for keyword in $keywords ; do
90                 grep '$'"$keyword" $dir > /dev/null && run_keyword_on_file $keyword $dir
91             done
92         fi
93     done
94 }
95
96 # removes expansion of the specified keywords for diff
97 # useful when comparing with another codebase
98 function run_normalize_on_files () {
99     for keyword in $keywords ; do
100         echo "Deflating \$$keyword on $# files"
101         for file in "$@" ; do
102             sed -e 's,$'"$keyword"'.*\$,\$'"$keyword"'$,' $file > $file.new
103             mv $file.new $file
104         done
105     done
106 }    
107
108 function run_normalize () {
109     for dir in $dirs; do
110         cd $here
111         if [ -d $dir ] ; then
112             cd $dir
113             echo "xxxxxxxxxxxxxxxxxxxx Normalizing keywords $keywords in $(pwd) "
114             echo -n "xxxxxxxxxx Gathering actual files under subversion "
115             svnfiles=$(svn list -R)
116
117             files=""
118             for scan in $svnfiles; do
119                 if [ -d $scan ] ; then continue
120                 elif [ -L $scan ] ; then continue
121                 else files="$files $scan"
122                 fi
123             done
124             echo $(ls -1 $files |wc -l) files found
125             run_normalize_on_files $files
126             echo Done
127         else
128             run_normalize_on_files $dir
129         fi
130     done
131 }
132
133 here=$(pwd -P)
134
135 case $0 in
136     *keywords*)
137         run_keywords ;;
138     *normalize*)
139         run_normalize ;;
140     *)
141         echo Unsupported command $0 ;;
142 esac