Initial revision
[wmaker-crm.git] / mkpatch
bloba872293a72effd58d75cb934a4d22690b01e6d1c
1 #!/bin/sh
3 # mkpatch 1.1
5 # Creates a more-or-less self-contained patch package.
7 # Copyright (c) Alfredo K. Kojima
10 # Syntax: mkpatch old_tree new_tree patch_name
12 # If a file named mkp.stuff is found in the current directory, it
13 # will be used to extract special handling cases. Each directive must
14 # be placed in a line of the file and the arguments must be separated
15 # by a single space. The currently supported directives are:
17 # DONTDIFF <file_path>
18 # Do not use diff in the specified file, replacing the file instead.
19 # The path must exclude the top directory and the path must be
20 # valid from both trees.
21 # It will handle special cases of files that diff thinks are text
22 # files, but actually are not, like XPM files created by stupid,
23 # brain damaged, moron XV.
25 # Example mkp.stuff file:
26 # DONTDIFF icons/somthing.xpm
27 # DONTDIFF icons/smthingelse.xpm
30 # The resulting patch pack will be relatively big (if compared to things
31 # produced by xdelta and others), but it will be self-contained and
32 # hopefully smaller than the whole source tree.
34 # You MUST run mkpatch from a directory above old_tree and new_tree.
35 # Example:
36 # If newTree and oldTree are located in /tmp
37 # cd /tmp
38 # mkpatch oldTree newTree old_to_new
40 # File names cannot contain the character # or spaces
44 if test ! $# = 3 ; then
45 echo "$0:read the script for the syntax."
46 exit 1
51 istext() {
52 a=`file $1|grep text`
53 if test "x$a" = "x"; then
54 return 0
55 else
56 return 1
61 put_header() {
62 cat << 'EOF' |sed -e "s#TMP#$TMP#" -e "s#OTREE#$OTREE#"\
63 -e "s#NTREE#$NTREE#" > $1
64 #!/bin/sh
66 # Patch package to upgrade OTREE to NTREE
68 EOF
69 if [ $# -gt 1 ]; then
70 echo $2 >> $1
72 echo "unalias rm" >> $1
76 ##########################
78 check_removed_files() {
80 files=`grep "Only in $OTREE" $TMP/tdiff|sed -e "s#Only in $OTREE##" -e "s#: #/#" -e "s#//#/#"`
82 put_header $TMP/delfiles "# Remove obsolete files"
83 #..................
84 cat << EOF >> $TMP/delfiles
85 echo "Files that are not needed anymore will be removed now."
86 echo "Do you wish to proceed? <y/n> [y]"
87 read foo
88 if [ "$foo" = "n" ]; then
89 exit 0
92 EOF
93 #...................
95 echo "Obsoleted Files:"
96 for i in $files; do
97 echo $OTREE/$i
98 echo "echo \"Removing ../$i\"" >> $TMP/delfiles
99 if [ -d $OTREE/$i ]; then
100 echo "rm -rf ../$i" >> $TMP/delfiles
101 else
102 echo "rm ../$i" >> $TMP/delfiles
104 done
106 chmod +x $TMP/delfiles
110 #########################
112 check_new_files() {
113 files=`grep "Only in $NTREE" $TMP/tdiff|sed -e "s#Only in $NTREE#../#" -e "s#: #/#" -e "s#//#/#"`
115 put_header $TMP/newfiles "# Copy new files"
116 echo "# Table of internal file names to real file names" >> $TMP/newfiles
118 index=0
119 dindex=0
120 mkdir $TMP/files
121 echo "New Files:"
122 for i in $files; do
123 name=`basename $i`
124 src=`echo $i|sed -e "s#..#$NTREE#"`
125 file=`echo $i|sed -e "s#../##"`
126 echo $src
127 if [ -d $src ]; then
128 dst="dir$dindex"
130 (dir=`pwd`;cd $NTREE;tar cf $dir/$TMP/files/$dst.tar $file)
132 echo "$dst=\"$file\"" >> $TMP/newfiles
133 dindex=`expr $dindex + 1`
134 else
135 dst="file$index"
136 cp $src $TMP/files/$dst
137 echo "$dst=\"$file\"" >> $TMP/newfiles
138 index=`expr $index + 1`
140 done
141 echo "filecount=$index" >> $TMP/newfiles
142 echo "dircount=$dindex" >> $TMP/newfiles
143 #..........
144 cat << 'EOF' |sed -e "s#TMP#$TMP#" -e "s#OTREE#$OTREE#"\
145 -e "s#NTREE#$NTREE#" >> $TMP/newfiles
148 #create new directories
149 index=0
150 mkdir tmpdir
151 while [ $index -lt $dircount ]; do
152 fname="dir$index"
153 eval origname=$"$fname"
154 echo "Recreating directory ../$origname"
155 (cd tmpdir; tar xf ../files/$fname.tar)
156 mv tmpdir/`basename $origname` ../$origname
157 index=`expr $index + 1`
158 done
159 rmdir tmpdir
161 #copy files
162 index=0
163 while [ $index -lt $filecount ]; do
164 fname="file$index"
165 eval origname=$"$fname"
166 echo "Copying file ../$origname"
167 cp files/$fname ../$origname
168 index=`expr $index + 1`
169 done
172 #..........
174 chmod +x $TMP/newfiles
177 #####################
179 check_binary_changes() {
180 files=`grep "Binary files" $TMP/bindiff|cut -d\ -f5`
181 files=`echo $files`
183 put_header $TMP/updbinfiles "# Replace changed binary files"
184 echo "# Table of internal file names to real file names" >> $TMP/updbinfiles
186 for i in $no_diff; do
187 files="$files $NTREE/$i"
188 done
189 index=0
190 echo "Binary files changed:"
191 for i in $files; do
192 fname="changed$index"
193 oname=`echo $i|sed -e "s#$NTREE##" -e "s#^/##"`
194 cp $i $TMP/files/$fname
195 echo $i
196 echo "$fname=\"$oname\"" >> $TMP/updbinfiles
197 index=`expr $index + 1`
198 done
199 echo "filecount=$index" >> $TMP/updbinfiles
201 #..........
202 cat << 'EOF' |sed -e "s#TMP#$TMP#" -e "s#OTREE#$OTREE#"\
203 -e "s#NTREE#$NTREE#" >> $TMP/updbinfiles
205 index=0
206 while [ $index -lt $filecount ]; do
207 fname="changed$index"
208 eval origname=$"$fname"
209 echo "Replacing file ../$origname"
210 rm ../$origname
211 cp files/$fname ../$origname
212 index=`expr $index + 1`
213 done
216 #..........
217 chmod +x $TMP/updbinfiles
221 #####################
222 check_text_changes() {
223 echo "diff'ing trees..."
224 diff -rq $OTREE $NTREE > $TMP/tdiff
225 tmp=`egrep "^Files" $TMP/tdiff|cut -d\ -f2|sed -e "s#$OTREE/##"`
227 files=""
228 # remove excluded files
229 for i in $tmp; do
230 ok=1
231 for j in $no_diff; do
232 if test "$i" = "$j"; then
233 ok=0
234 break
236 done
237 if [ $ok = 1 ]; then
238 files="$files $i"
240 done
242 touch $TMP/diff
243 touch $TMP/bindiff
244 # diff remaining files
245 for f in $files; do
246 diff -rc $OTREE/$f $NTREE/$f >> $TMP/tmp
247 foo=`egrep "^Binary" $TMP/tmp`
248 if test "x$foo" = "x"; then
249 cat $TMP/tmp >> $TMP/diff
250 else
251 cat $TMP/tmp >> $TMP/bindiff
253 rm -f $TMP/tmp
254 done
257 ################# main
259 stripslash() {
260 echo $1|sed -e 's#/$##'
263 OTREE=`stripslash $1`
264 NTREE=`stripslash $2`
265 OUTPUT=$3
267 TMP=$OUTPUT.patchd
269 rm -fr $TMP
270 mkdir $TMP
273 if [ -f mkp.stuff ]; then
274 echo "Using mkp.stuff file..."
276 no_diff=`grep DONTDIFF mkp.stuff|cut -d\ -f2`
277 no_diff=`echo $no_diff`
282 #....................
283 cat << 'EOF' |sed -e "s#TMP#$TMP#" -e "s#OTREE#$OTREE#" -e "s#NTREE#$NTREE#" \
284 > $TMP/runme
285 #!/bin/sh
287 # Patch package to upgrade OTREE to NTREE
289 # Automatically generated by mkpatch
291 # Move the TMP directory to inside NTREE
292 # and run this script.
295 TARGET_TREE=OTREE
297 savedir=`pwd`
298 cd ..
299 dir=`pwd`
300 dir=`basename $dir`
301 cd $savedir
303 if test ! "$dir" = "$TARGET_TREE"; then
304 echo "You must move the \"TMP\" directory to inside the "
305 echo "\"$TARGET_TREE\" directory before running this script."
306 exit 1
309 echo "################################"
310 echo "Removing Obsolete Files"
311 echo "################################"
312 ./delfiles
313 echo
314 echo "################################"
315 echo "Copying New Files"
316 echo "################################"
317 ./newfiles
318 echo
319 echo "################################"
320 echo "Replacing modified binary files"
321 echo "################################"
322 ./updbinfiles
323 echo
324 echo "################################"
325 echo "Patching modified text files"
326 echo "################################"
327 cd ..
328 patch -p1 -s < $savedir/diff
330 echo "Patching finished."
333 #....................
334 cat << 'EOF' |sed -e "s#TMP#$TMP#" -e "s#OTREE#$OTREE#" -e "s#NTREE#$NTREE#" \
335 > $TMP/README
337 This patch package will upgrade OTREE to NTREE.
338 You must unpack it inside the NTREE directory or it will not work.
339 This patch can only be applied over a clean OTREE distribution.
340 To apply, just type (followed by a Return, of course):
341 ./runme
344 #....................
346 #....................
347 cat << 'EOF' > $TMP/cleanup
348 #!/bin/sh
350 # Remove .orig files
352 find .. -name \*.orig -exec rm {} \;
354 chmod +x $TMP/cleanup
355 #....................
358 # this must be the first function called
359 check_text_changes
361 check_removed_files
363 check_new_files
365 check_binary_changes
367 rm -f $TMP/tdiff
368 rm -f $TMP/bindiff
370 chmod +x $TMP/runme
372 echo "Do you want to add something to the README file? <y/n> [n]"
373 read foo
374 if [ "$foo" = "y" ]; then
375 vi $TMP/README
378 rm -f $OUTPUT.tar.gz
380 tar czf $OUTPUT.tar.gz $TMP
382 rm -fr $TMP
384 echo "Patch pack $OUTPUT.tar.gz successfully created."