OSDN Git Service

BugTrack/2436 Ignore ESLint/nodejs related files
[pukiwiki/pukiwiki_devel.git] / release.sh
1 #!/bin/sh
2
3 # release.sh
4 #
5 #  Release automation script for PukiWiki
6 #  ==========================================================
7    Copyright='(C) 2002-2004,2011 minix-up project, All Rights Reserved'
8    Homepage='http://cvsknit.sourceforge.net/'
9    License='(also revised)BSD Licnese, NO WARRANTY'
10 #
11 set -ex
12
13 # Name and Usage --------------------------------------------
14 _name="` basename $0 `"
15
16 usage(){
17   trace 'usage()' || return  # (DEBUG)
18   warn  "Usage: $_name [options] VERSION_TAG (1.4.3_rc1 like)"
19   warn  "  Options:"
20   warn  "    --nopkg     Suppress creating archive (Extract and chmod only)"
21   warn  "    --norm      --nopkg, and remove nothing (.cvsignore etc)"
22   warn  "    --co        --norm, and use 'checkout' command instead of 'export'"
23   warn  "    --utf8      Create UTF-8 converted archive"
24   warn  "    --eucjp     Create EUC_JP converted archive"
25   warn  "    --fromeucjp Indicate source charset is EUC_JP"
26   warn  "    -z|--zip    Create *.zip archive"
27   warn  "    --move-dist Move *.ini.php => *.ini-dist.php"
28   warn  "    --copy-dist Move, and Copy *.ini.php <= *.ini-dist.php"
29   warn  "    --git       Use git repository"
30   warn  "    --repo <repository> Git repository_url"
31   warn  "    --name <distname> package_name"
32   return 1
33 }
34
35 # Common functions ------------------------------------------
36 warn(){  echo "$*" 1>&2 ; }
37 err() {  warn "Error: $*" ; exit 1 ; }
38
39 quote(){
40   test    $# -gt 0  && {  echo -n  "\"$1\"" ; shift ; }
41   while [ $# -gt 0 ] ; do echo -n " \"$1\"" ; shift ; done ; echo
42 }
43
44 trace(){
45   test "$__debug" || return 0  # (DEBUG)
46   _msg="$1" ; test $# -gt 0 && shift ; warn "  $_msg    : ` quote "$@" `"
47 }
48
49 check_versiontag(){
50   case "$1" in
51     [1-9].[0-9]              | [1-9].[0-9]                   ) tag="r$1" ;;
52     [1-9].[0-9]_rc[1-9]      | [1-9].[0-9]_rc[1-9]           ) tag="r$1" ;;
53     [1-9].[0-9].[0-9]        | [1-9].[0-9].[0-9][0-9]        ) tag="r$1" ;;
54     [1-9].[0-9].[0-9]_[a-z]* | [1-9].[0-9].[0-9][0-9]_[a-z]* ) tag="r$1" ;;
55     [1-9].[0-9].[0-9]_[1-9]  | [1-9].[0-9].[0-9][0-9]_[1-9]  ) tag="r$1" ;;
56     [1-9].[0-9].[0-9]_[1-9]_[a-z]*  | [1-9].[0-9].[0-9][0-9]_[1-9]_[a-z]*  ) tag="r$1" ;;
57     HEAD | r1_3_3_branch | branch_r* ) tag="$rel" ;;
58     '' ) usage ; return 1 ;;
59      * ) warn "Error: Invalid string: $1" ; usage ; return 1 ;;
60   esac
61   echo "$tag" | tr '.' '_'
62 }
63
64 chmod_pkg(){
65   ( cd "$1"
66     # ALL: Read only
67     find . -type d | while read line; do chmod 755 "$line"; done
68     find . -type f | while read line; do chmod 644 "$line"; done
69     # Add write permission for PukiWiki
70     chmod 777 attach backup cache counter diff wiki* 2>/dev/null
71     chmod 666 wiki*/*.txt cache/*.dat cache/*.ref cache/*.rel  2>/dev/null
72   )
73 }
74
75 # Default variables -----------------------------------------
76
77 mod=pukiwiki
78
79 CVSROOT=":pserver:anonymous@cvs.sourceforge.jp:/cvsroot/$mod"
80
81 # Function verifying arguments ------------------------------
82
83 getopt(){ _arg=noarg
84   trace 'getopt()' "$@"  # (DEBUG)
85
86   case "$1" in
87   ''  )  echo 1 ;;
88   -[hH]|--help ) echo _help _exit ;;
89   --debug      ) echo _debug 1    ;;
90   --nopkg      ) echo _nopkg 1    ;;
91   --norm|--noremove ) echo _nopkg _noremove 1 ;;
92   --co|--checkout   ) echo _nopkg _noremove _checkout 1 ;;
93   -z|--zip     ) echo _zip 1      ;;
94   --ut|--utf|--utf8|--utf-8 ) echo _utf8 1  ;;
95   --eucjp ) echo _eucjp 1 ;;
96   --fromeucjp ) echo _fromeucjp 1 ;;
97   --copy-dist  ) echo _copy_dist 1 ;;
98   --move-dist  ) echo _move_dist 1 ;;
99   -d  ) echo _CVSROOT 2 ; _arg="$2" ;;
100   --git ) echo _git 1 ;;
101   --repo ) echo _gitrepo 2 ; _arg="$2" ;;
102   --name ) echo _pkg_name 2 ; _arg="$2" ;;
103   -*  ) warn "Error: Unknown option \"$1\"" ; return 1 ;;
104    *  ) echo OTHER ;;
105   esac
106
107   test 'x' != "x$_arg"
108 }
109
110 # Working start ---------------------------------------------
111
112 # Show arguments in one line (DEBUG)
113 case '--debug' in "$1"|"$3") false ;; * ) true ;; esac || {
114   test 'x--debug' = "x$1" && shift ; __debug=on ; trace 'Args  ' "$@"
115 }
116
117 # Parsing
118 while [ $# -gt 0 ] ; do
119   chs="` getopt "$@" `" || err "Syntax error with '$1'"
120   trace '$chs  ' "$chs"  # (DEBUG)
121
122   for ch in $chs ; do
123     case "$ch" in
124      [1-3]   ) shift $ch ;;
125      _exit   ) exit      ;;
126      _help   ) usage     ;;
127
128      _CVSROOT) CVSROOT="$2" ;;
129      _gitrepo) gitrepo="$2" ;;
130      _pkg_name) pkg_name="$2" ;;
131
132      _*      ) eval "_$ch"=on ;;
133       *      ) break 2   ;;
134     esac
135   done
136 done
137
138 # No argument
139 if [ $# -eq 0 ] ; then usage ; exit ; fi
140
141 # Utility check ---------------------------------------------
142
143 # Convert UTF-8 -> EUC_JP or EUC_JP -> UTF-8
144 if [ \( "$__eucjp" -a ! "$__fromeucjp" \) -o \( "$__utf8" -a "$__fromeucjp" \) ] ; then
145   __charconv=1
146 fi
147
148 if [ "$__charconv" ] ; then
149
150   # nkf
151   which nkf || err "nkf version 2.0 or later (UTF-8 enabled) not found"
152   nkf_version="` nkf -v 2>&1 | sed -e '/^Network Kanji Filter/!d' -e 's/.* Version \([1-9]\).*/\1/' `"
153   if [ "$nkf_version" = '1' -o "$nkf_version" = '0' ] ; then
154     err "nkf found but not seems 2.x (UTF-8 enabled) or later"
155   fi
156
157   # encls.php
158   encls="./encls.php"
159   if [ ! -f "$encls" ]
160   then err "encls not found"
161   else
162     php="` which php `"        || err "php-cli not found"
163     encls="$php `pwd`/$encls"
164   fi
165
166   convert(){
167     __nkfopt="--ic=eucJP-ms -w"
168     if [ "$__eucjp" ] ; then
169       __nkfopt="--ic=UTF8 --oc=eucJP-ms"
170     fi
171     for list in "$@" ; do
172       # NOTE: Specify '-E'(From EUC-JP) otherwise skin file will be collapsed
173       nkf $__nkfopt "$list" > "$list.$$.tmp" && mv "$list.$$.tmp" "$list" && echo "  $list"
174     done
175   }
176   convert_EUCJP2UTF8(){
177     for list in "$@" ; do
178       # Very rough conversion!
179       #sed 's/EUC-JP/UTF-8/g' "$list" > "$list.$$.tmp" && mv "$list.$$.tmp" "$list"
180       sed 's#^//UTF-8:##' "$list" > "$list.$$.tmp" && mv "$list.$$.tmp" "$list"
181     done
182   }
183   convert_UTF82EUCJP(){
184     for list in "$@" ; do
185       # Very rough conversion!
186       #sed 's/UTF-8/EUC-JP/g' "$list" > "$list.$$.tmp" && mv "$list.$$.tmp" "$list"
187       # This is very specific logic for PukiWiki 1.5.x source code
188       sed -i 's#^define('\''PKWK_UTF8_ENABLE'\'', *1);#//UTF-8:\0#' "$list"
189       sed -i 's#^case \+'\''ko'\'': *define('\''MB_LANGUAGE'\'', *'\''Korean'\''#//UTF-8:\0#' "$list"
190       sed -i 's#^[^a-zA-Z]*// *See *BugTrack2/13 *for *all#//UTF-8:\0#' "$list"
191       sed -i 's#^[^a-zA-Z]*// *and *give *us *your *report#//UTF-8:\0#' "$list"
192
193     done
194   }
195 fi > /dev/null
196
197 if [ -z "$__zip" ]
198 then
199   which tar  || err "tar not found"
200   which gzip || err "gzip not found"
201 else
202   which zip  || err "zip not found"
203 fi > /dev/null
204
205 # Argument check --------------------------------------------
206
207 rel="$1"
208
209 if [ "$pkg_name" ] ; then
210   pkg_dir="$pkg_name"
211   tag="$rel"
212 else
213   tag="` check_versiontag "$rel" `" || exit 1
214   pkg_dir="${mod}-${rel}"
215   if [ "$__utf8" ] ; then
216     pkg_dir="${pkg_dir}_utf8"
217   fi
218 fi
219
220 # Export the module -----------------------------------------
221 test ! -d "$pkg_dir" || err "There's already a directory: $pkg_dir"
222
223 if [ -z "$__checkout" ]
224 then cmd="export"
225 else cmd="checkout"
226 fi
227
228 if [ "$__git" ] ; then
229   echo git clone "$gitrepo" "$pkg_dir"
230        git clone "$gitrepo" "$pkg_dir"
231   echo cd $pkg_dir 
232   cd $pkg_dir 
233   echo git reset --hard "$tag"
234        git reset --hard "$tag"
235
236   # Set file timestamp
237   for FILE in $(git ls-files); do
238     TIME=$(git log --pretty=format:%ci -n1 $FILE)
239     echo $TIME'\t'$FILE
240     STAMP=$(date -d "$TIME" +"%y%m%d%H%M.%S")
241     touch -t $STAMP $FILE
242   done
243
244   cd ..
245 else
246   exit
247   echo cvs -z3 -d "$CVSROOT" -q "$cmd" -r "$tag" -d "$pkg_dir" "$mod"
248        cvs -z3 -d "$CVSROOT" -q "$cmd" -r "$tag" -d "$pkg_dir" "$mod"
249 fi
250
251 test   -d "$pkg_dir" || err "There isn't a directory: $pkg_dir"
252
253 # Remove '.cvsignore' if exists -----------------------------
254 test -z "$__noremove" && {
255   if [ "$__git" ] ; then
256     echo rm -rf "$pkg_dir/.git"
257          rm -rf "$pkg_dir/.git"
258   fi
259   echo find "$pkg_dir" -type f -name '.cvsignore' "| xargs rm -f"
260        find "$pkg_dir" -type f -name '.cvsignore' | xargs rm -f
261   echo find "$pkg_dir" -type f -name '.gitignore' -exec rm -f {} \;
262        find "$pkg_dir" -type f -name '.gitignore' -exec rm -f {} \;
263   echo find "$pkg_dir" -type f -name '.eslintrc.json' -exec rm -f {} \;
264        find "$pkg_dir" -type f -name '.eslintrc.json' -exec rm -f {} \;
265   echo find "$pkg_dir" -type f -name 'package.json' -exec rm -f {} \;
266        find "$pkg_dir" -type f -name 'package.json' -exec rm -f {} \;
267 }
268
269 # Get back original files ----------------------------------
270 if [ -f "$pkg_dir/wiki/_526563656E744368616E676573.txt" ] ; then
271   mv $pkg_dir/wiki/_526563656E744368616E676573.txt $pkg_dir/wiki/526563656E744368616E676573.txt
272 fi
273 if [ -f "$pkg_dir/cache/_recent.dat" ] ; then
274   mv $pkg_dir/cache/_recent.dat $pkg_dir/cache/recent.dat
275 fi
276
277
278 # Conversion ------------------------------------------------
279
280 if [ "$__charconv" ] ; then
281   if [ "$__utf8" ] ; then
282     echo "Converting EUC-JP => UTF-8 ..."
283   else
284     echo "Converting UTF-8 => EUC-JP ..."
285   fi
286   find "$pkg_dir" -type f \( -name "*.txt" -or -name "*.php" -or -name "*.lng"  -or -name "*.dat" -or -name "*.ref" \) |
287   while read line; do
288     case "$line" in
289       "$pkg_dir"/zh-CN.lng.php ) ;; # UTF-8 already, Do nothing
290       * ) convert "$line" ;;
291     esac
292   done
293
294   if [ "$__utf8" ] ; then
295     # Replace 'EUC-JP' => 'UTF-8'
296     ( cd "$pkg_dir" &&
297       convert_EUCJP2UTF8 lib/init.php skin/pukiwiki.skin*.php
298     )
299   else
300     # Replace 'UTF-8' => 'EUC-JP'
301     ( cd "$pkg_dir" &&
302       convert_UTF82EUCJP lib/init.php skin/pukiwiki.skin*.php
303     )
304   fi
305
306   # Filename encoded 'encoded-EUC-JP' to 'encoded-UTF-8'
307   echo "Renaming encoded-EUC-JP => encoded-UTF-8 ..."
308   ( cd "$pkg_dir" &&
309     for dir in wiki wiki.en cache; do
310       ( cd "$dir" &&
311         ls *.txt *.ref *.rel 2>/dev/null | while read line; do
312           target="`$encls "$line" 2>/dev/null`" || exit 1
313           if [ "x$line" != "x$target" ] ; then
314             echo " " mv "$dir/$line" "$dir/$target"
315                      mv "$line" "$target" || exit 1
316           fi
317         done
318       ) || exit 1
319     done
320   ) || err "stop."
321 fi
322
323 # chmod -----------------------------------------------------
324
325 chmod_pkg "$pkg_dir"
326
327 # Create a package ------------------------------------------
328
329 test ! -z "$__nopkg" && exit 0
330
331 ( cd "$pkg_dir"
332
333   # wiki.en/
334   target="wiki.en"
335   if [ -z "$__zip" ]
336   then tar cf - "$target" | gzip -9 > "$target".tgz
337   else zip -r9 "$target.zip" "$target"
338   fi
339   rm -Rf "$target"
340
341   # en documents
342   if [ -z "$__zip" ]
343   then gzip -9 *.en.txt
344   else
345     for list in *.en.txt ; do
346       zip  -9 "$list".zip "$list"
347       rm -f "$list"
348     done
349   fi
350 )
351
352 # Move / Copy *.ini.php files
353 if [ 'x' != "x$__copy_dist$__move_dist" ] ; then
354 ( cd "$pkg_dir"
355
356   find . -type f -name "*.ini.php" | while read file; do
357     dist_file="` echo "$file" | sed 's/ini\.php$/ini-dist.php/' `"
358     mv -f "$file" "$dist_file"
359     test "$__copy_dist" && cp -f "$dist_file" "$file"
360   done
361 )
362 fi
363
364 if [ -z "$__zip" ]
365 then
366   # Tar + gzip
367   echo tar cf - "$pkg_dir" \| gzip -9 \> "$pkg_dir.tar.gz"
368        tar cf - "$pkg_dir"  | gzip -9  > "$pkg_dir.tar.gz"
369 else
370   # Zip
371   echo zip -r9 "$pkg_dir.zip" "$pkg_dir"
372        zip -r9 "$pkg_dir.zip" "$pkg_dir"
373 fi
374