Whamcloud - gitweb
LU-9545 lfsck: report "inconsistent" under dryrun mode
[fs/lustre-release.git] / contrib / scripts / updatecw.sh
1 #!/bin/bash
2 # Adds Intel copyright notices to files modified by Intel.
3 # Does not add copyright notices to files that are missing them.
4 #
5 # Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
6 # Copyright (c) 2012, 2014, Intel Corporation.
7 #
8 TMP=${TMP:-/tmp}
9 TMPFILE=$(mktemp $TMP/updatecopy.XXXXXX)
10 EXCFILE=$(mktemp $TMP/excludecopy.XXXXXX)
11 THISYEAR=$(date +%Y)
12 DIRS=${*:-"build ldiskfs libcfs lnet lustre lustre-iokit snmp"}
13
14 #Old copyright messages we might need to find
15 OLDCOPY1="Copyright.*"
16 OLDCOPY2="Use is subject to license terms."
17 #The current copyright
18 INTCOPY=${INTCOPY:-"Copyright.*Intel Corporation"}
19
20 #Emails we assume ownership of
21 AUTH_WHAM=${AUTH_WHAM:-".*@whamcloud.com"}
22 AUTH_INT=${AUTH_INT:-".*@intel.com"}
23 AUTHOR=${AUTHOR:-$AUTH_INT|$AUTH_WHAM}
24
25 START=${START:-"2010-06-01"}    # Post Oracle date
26 ECHOE=${ECHOE:-"echo -e"}
27 [ "$($ECHOE foo)" = "-e foo" ] && ECHOE=echo
28
29 #Commits to exclude (whitespace, copyright, prefix, revert, delete only, etc)
30 cat << EXCLUDE_END > $EXCFILE
31 003df3c38fe74a092f75569793edd6ec5a387d5c
32 01def2b635ff0b7bacde158d9124334c42cd5d2b
33 08aa217ce49aba1ded52e0f7adb8a607035123fd
34 11db1a551172f596d1d284e8496530f9ce24ac81
35 14d162c5438de959d0ea01fb1b40a7c5dfa764d1
36 1f1d3a376d488d715dd1b0c94d5b66ea05c1e6ca
37 27bc60aa7cb3c567fd3150cc55a133d60cec2405
38 2841be335687840cf98961e6c6cde6ee9312e4d7
39 317ebf88af58e9d9235c90f84b112e931ae69b43
40 320e014a2c93cb905637d178269b80847cb8d277
41 3f90f344ae059b30e7d23e4fe554a985eb827b02
42 4df63615669a69b51c752cc4e416f705f8a56197
43 5d37670e8507563db556879041c7992936aefa56
44 60e07b972114df24105a3a1bfa7365892f72a4a7
45 65701b4a30efdb695776bcf690a2b3cabc928da1
46 98060d83459ba10409f295898f0ec917f938b4d3
47 b1e595c09e1b07a6840142b3ae015b8a5a8affeb
48 b529a917a48cb0873f2898348b25a1074d7e9429
49 b5a7260ae8f96c3ff9a9948dacc4f17a46943d00
50 c2c14f31da5f69770d3a46627c81335f5b8d7821
51 cd8c65642f1c36b56ae74a0414a1f1f27337a662
52 e3a7c58aebafce40323db54bf6056029e5af4a70
53 e5f552b70dccbd2fdf21ec7b7053a01bcbe062c2
54 e64d9101cc8ebc61924d6e9db6d7ab3cfa94767c
55 f2a9374170e4522b9d2ac3b7096cf2912339d480
56 fc1475ebdd64cd8eccc603d629ac6b4dcd222445
57 b6332b5c0dfe28d6b574e206ae651262337a8309
58 5acebd778f7427e8221e2cd6e463c76649f83ad3
59 2b294992edce5af7b79d4300ed3aa1ea6a8db850
60 21d716e6c16424d9deb646456758ebbaa9c70fec
61 3c1f519956598b0106bd639f0ccae30ce745eb54
62 faeb94fe81e4646b3121c263521d30e0e83fa71f
63 3b84a1ee5213563945225854a50e9037bb9646db
64 c6aab2ca77831852db22b7dc39baed4d06405b7e
65 26b8238659974959780cd49de92595b4b0bdf89f
66 7817e4c785d075aae76b635dcf799064590833b0
67 930dca7253bc2531bffa15dc763db1081cdf32d8
68 d843591c30d63bf54024e21b48dec92eb0ec9f68
69 1738e70fe6aaf1e07b78a6b89eb11ea115135e69
70 353ef58b1d2394c4721a340e2463b07d4069d99c
71 b0638b322b8c8adb2cf5f6189efd17ad70f3af2c
72 83ae3e2e5b9713822ea4889d832915e791801d90
73 315f6e0237b676a7512a4d2fa5765ad57483676e
74 7b63a5dab65cde131627bf22d16d6e13cf259686
75 6eda93c7b5f65324bdc831100a17c0bef1a3c078
76 355a283fce6998f5b5621adc9697d98d0fb72dfe
77 e2d2fbc07bf8f45e19d8f3127c3a7088351126d6
78 89e685e154daba096c8388e39e279c6e6b342940
79 4c3858b3c88d2a2f443d348945229f5995f3e1dd
80 d5d5b349f23e769ae4c6307a295c532856af9c21
81 be4372fddbada6d026f4188a7e88c6a11d0a83d4
82 bb6dbca9c2c9bdcd33663d6449b27a671fcaf902
83 65e067d5d90270d4237a7271008561a4b432b94d
84 3151aa574e2c9bd3343dad11577cba3c55c16dca
85 bca975c7fa261ffb926e8a18d5869b886c65f447
86 8fdb46e476f0f54025fd9ff85c274f2ed86315f0
87 8f1c8dbe2389e1ef1e1d3387e343fb9a1bb84198
88 8daba6a7381a2fb8cc933f7e9486f60e659465d4
89 2bac2cd8f7bf7f31b92e976d500d89b958ab1788
90 95f85ba9ed5df66a0385755be62254322fc447e1
91 8f27184b14a192848429e52ac234805c324e1f7a
92 3dc94d835dc3adf871c3603fc91c08bdd36701ff
93 25670bb8c21deb64cfbb277bdeeab6e7ee39aa0e
94 f4b93dff9a8f4a59976ea864c4e3c2c42faa5770
95 aab1d832130ee5c181cf7e0e5aa555244d150b00
96 32bd5051a518c57e35f51b7f3c7f739b5ef91b25
97 9fdef0896b78d85312269e97962d9818b395f57a
98 fdd5596593050d22feef05ecba6ba53c65cb3397
99 4817574ad5a31d6dbafc2bd0dfc2b6a33851ea11
100 55f2a237320f23cb59df23518f5a72698d4f251c
101 06c83e0109b2e934ac8cbcdcb2a22f184fe546f5
102 315f6e0237b676a7512a4d2fa5765ad57483676e
103 63a296c31a51cf8ac29f6e339e5686192da14769
104 6c0fa97869b568a7af2d21e7e4ed2b440b7dfa27
105 97da796bd3d9b98f6b65ecce493044a3e7404607
106 9bf46408b3c2c8b7f939d7000a9e8df38c3fd6ed
107 eebeee9afa368d62b9a0813652a4c14430bd8e35
108 ff4357229efe87781e65382c20d3d718ecc3114d
109 beca050380b592477153fe16b79b7b6bb3aacbf2
110 6c47e7f99f5fa8884751ac549a45dd3c0b81e7f1
111 9d06de39731ae16d030cda672ae771496d4f0952
112 0b1ad400c8f64575292a7ff54a8ce872a124b19e
113 b1ff338ede34421acfc2cdbfe0dbe7b293ebd3b2
114 f28cc25929c4e8a111e96b2205a0433542b35e84
115 2112bc0e8b54832c303008cfe53957b8a0019407
116 bbee5d1ae941a208d7a07d0348e835ab58ca90ce
117 dd6623e657032bf34e70446a6d72851c70d605d9
118 EXCLUDE_END
119 [ -n "$EXCLUDE" ] && echo "$EXCLUDE" >> $EXCFILE
120
121 HASHFILE=$TMP/hash_list
122 > $TMP/hash_list
123 git ls-files $DIRS | while read FILE; do
124         FILE=$FILE # just so FILE shows up in "sh -vx" output
125         case "$FILE" in
126         */list.h)
127                 # file is copied from upstream kernel
128                 continue ;;
129         */liblustreapi.h)
130                 # file just includes lustreapi.h, copyrights are in there
131                 continue ;;
132         */*.patch|*/*.series)
133                 # patches can't add copyrights easily
134                 continue ;;
135         */lustre_dlm_flags.h)
136                 # file is automatically generated
137                 continue ;;
138         */.gitignore)
139                 continue ;;
140         esac
141
142         OLDCOPY=$(egrep "$INTCOPY" $FILE | tail -n1)
143         # Skip files that already have a copyright for this year
144         [ -n "$(egrep -e $THISYEAR <<<"$OLDCOPY")" ] && continue
145
146         ADDCOPY=false
147         # Pick only files that have changed since $START
148         # %ai author dates holds has bad data, use %ci instead
149         # Exclude revert commits and the patch being reverted.
150         git log --follow --since=$START --pretty=format:"%ci %ae %H" $FILE |
151                 grep -v -f $EXCFILE | egrep -e "$AUTHOR" |
152                 while read YYYY TTTT TZZZ AUTHOR HASH; do
153                         REVERT=$(git show -s $HASH |
154                                  awk '/This reverts commit/ { print $4 }')
155                         if [ -n "$REVERT" ]; then
156                                 echo $HASH >> $EXCFILE
157                                 tr -d . <<<$REVERT >> $EXCFILE
158                                 continue
159                         fi
160                         echo "$YYYY $TTTT $TZZZ $AUTHOR $HASH"
161                 done > $TMPFILE.2
162         grep -v -f $EXCFILE $TMPFILE.2 > $TMPFILE
163
164         # Skip files not modified by $AUTHOR
165         [ -s "$TMPFILE" ] || continue
166
167         if [ -z "$(egrep -e "$OLDCOPY1" $FILE)" ]; then
168                 case $FILE in
169                 *.[ch])
170                         echo "$FILE: ** NO COPYRIGHT. INSPECT  **"
171                         continue ;;
172                 *)
173                         continue ;;
174                 esac
175         fi
176
177         if [ -z "$(grep "$INTCOPY" <<<"$OLDCOPY")" ]; then
178                 ADDCOPY=true
179                 OLDCOPY="$(egrep "$OLDCOPY1|$OLDCOPY2" $FILE| tail -n1| tr / .)"
180         fi
181
182         # Get commit dates
183         NEWYEAR=$(head -1 $TMPFILE | cut -d- -f 1)
184         OLDYEAR=$(tail -1 $TMPFILE | cut -d- -f 1)
185
186         if [ "$NEWYEAR" -lt "$OLDYEAR" ]; then
187                 echo "$FILE: ** YEAR INVERSION: INSPECT  **"
188                 continue;
189         fi
190
191         [ $NEWYEAR == $OLDYEAR ] && YEAR="$NEWYEAR" || YEAR="$OLDYEAR, $NEWYEAR"
192         # The man page comment .\" needs to be escaped, and the '\' reinforced
193         COMMENT=$(sed -e 's/^\( *[\*#\.\"\\]*\) *[A-Z(].*/\1/' -e 's/\\/\\\\/' \
194                   <<<"$OLDCOPY")
195         NEWCOPY=$(sed -e"s/^/$COMMENT /" -e"s/\.\*/ (c) $YEAR, /" -e's/\.*$//' \
196                   <<<"$INTCOPY").
197
198         # '.\"' as a COMMENT in a man page isn't escaped correctly
199         #case "$FILE" in
200         #*/*.[1-9])
201         #       echo "$FILE: *** EDIT MANUALLY ***"
202         #       continue ;;
203         #esac
204
205         # If copyright is unchanged (excluding whitespace), we're done
206         [ "$OLDCOPY" == "$NEWCOPY" ] && continue
207
208         # Log all changes this year, to help find "noisy" patches
209         awk '/'$THISYEAR'-/ { print $5 }' $TMPFILE | cut -c1-12 >> $HASHFILE
210
211         [ ! -w $FILE ] && echo "$FILE: *** can't write, EDIT MANUALLY ***" &&
212                 continue
213
214         if $ADDCOPY; then
215                 echo "$FILE: $NEWCOPY (newly added) ** INSPECT **"
216                 # Add a new copyright line after the existing copyright.
217                 # Using a temporary file is ugly, but I couldn't get
218                 # newlines into the substitution pattern for some reason,
219                 # and this is not a performance-critical process.
220                 $ECHOE "${COMMENT}\n${NEWCOPY}" > $TMPFILE
221                 # The man page comment .\" (currently .") needs '\' added back
222                 sed -e "/$OLDCOPY/r $TMPFILE" \
223                     -e 's/^\."/.\\"/' $FILE > $FILE.tmp
224         else
225                 if grep -q "Commissariat" <<<"$OLDCOPY"; then
226                         INSPECT="** INSPECT **"
227                 else
228                         INSPECT=""
229                 fi
230                 echo "$FILE: $NEWCOPY $INSPECT"
231                 # Replace the old copyright line with a new copyright
232                 # The man page comment .\" (currently .") needs '\' added back
233                 sed -e "s/.*$INTCOPY.*/$NEWCOPY/" \
234                     -e 's/^\."/.\\"/' $FILE > $FILE.tmp
235         fi
236         [ -s $FILE.tmp ] && cp $FILE.tmp $FILE && rm -f $FILE.tmp
237 #exit
238 done
239 if [ -s $HASHFILE ]; then
240         echo "commits causing the most changes"
241         sort $HASHFILE | uniq -c | sort -nr | head -30 | while read CNT HASH; do
242                 echo $CNT $(git show --oneline --no-patch $HASH)
243         done
244
245 fi
246 rm -f $TMPFILE $TMPFILE.2