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.
36
# If newTree and oldTree are located in /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."
53
if test "x$a" = "x"; then
62
cat << 'EOF' |sed -e "s#TMP#$TMP#" -e "s#OTREE#$OTREE#"\
63
-e "s#NTREE#$NTREE#" > $1
66
# Patch package to upgrade OTREE to NTREE
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"
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]"
88
if [ "$foo" = "n" ]; then
95
echo "Obsoleted Files:"
98
echo "echo \"Removing ../$i\"" >> $TMP/delfiles
99
if [ -d $OTREE/$i ]; then
100
echo "rm -rf ../$i" >> $TMP/delfiles
102
echo "rm ../$i" >> $TMP/delfiles
106
chmod +x $TMP/delfiles
110
#########################
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
124
src=`echo $i|sed -e "s#..#$NTREE#"`
125
file=`echo $i|sed -e "s#../##"`
130
(dir=`pwd`;cd $NTREE;tar cf $dir/$TMP/files/$dst.tar $file)
132
echo "$dst=\"$file\"" >> $TMP/newfiles
133
dindex=`expr $dindex + 1`
136
cp $src $TMP/files/$dst
137
echo "$dst=\"$file\"" >> $TMP/newfiles
138
index=`expr $index + 1`
141
echo "filecount=$index" >> $TMP/newfiles
142
echo "dircount=$dindex" >> $TMP/newfiles
144
cat << 'EOF' |sed -e "s#TMP#$TMP#" -e "s#OTREE#$OTREE#"\
145
-e "s#NTREE#$NTREE#" >> $TMP/newfiles
148
#create new directories
151
while [ $index -lt $dircount ]; do
153
eval origname=\$"$fname"
154
echo "Recreating directory ../$origname"
155
(cd tmpdir; tar xf ../files/$fname.tar)
156
mv tmpdir/$origname ../$origname
157
index=`expr $index + 1`
163
while [ $index -lt $filecount ]; do
165
eval origname=\$"$fname"
166
echo "Copying file ../$origname"
167
cp files/$fname ../$origname
168
index=`expr $index + 1`
174
chmod +x $TMP/newfiles
177
#####################
179
check_binary_changes() {
180
files=`grep "Binary files" $TMP/bindiff|cut -d\ -f5`
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"
190
echo "Binary files changed:"
192
fname="changed$index"
193
oname=`echo $i|sed -e "s#$NTREE##" -e "s#^/##"`
194
cp $i $TMP/files/$fname
196
echo "$fname=\"$oname\"" >> $TMP/updbinfiles
197
index=`expr $index + 1`
199
echo "filecount=$index" >> $TMP/updbinfiles
202
cat << 'EOF' |sed -e "s#TMP#$TMP#" -e "s#OTREE#$OTREE#"\
203
-e "s#NTREE#$NTREE#" >> $TMP/updbinfiles
206
while [ $index -lt $filecount ]; do
207
fname="changed$index"
208
eval origname=\$"$fname"
209
echo "Replacing file ../$origname"
211
cp files/$fname ../$origname
212
index=`expr $index + 1`
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/##"`
228
# remove excluded files
231
for j in $no_diff; do
232
if test "$i" = "$j"; then
244
# diff remaining files
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
251
cat $TMP/tmp >> $TMP/bindiff
257
################# main
260
echo $1|sed -e 's#/$##'
263
OTREE=`stripslash $1`
264
NTREE=`stripslash $2`
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#" \
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.
303
if test "$USER" = root; then
304
echo "Do not run this script as the root user"
308
if test "$dir" != "$TARGET_TREE"; then
309
echo "You must move the \"TMP\" directory to inside the "
310
echo "\"$TARGET_TREE\" directory before running this script."
314
echo "################################"
315
echo "Removing Obsolete Files"
316
echo "################################"
319
echo "################################"
320
echo "Copying New Files"
321
echo "################################"
324
echo "################################"
325
echo "Replacing modified binary files"
326
echo "################################"
329
echo "################################"
330
echo "Patching modified text files"
331
echo "################################"
333
patch -p1 -s < $savedir/diff
335
echo "Patching finished."
338
#....................
339
cat << 'EOF' |sed -e "s#TMP#$TMP#" -e "s#OTREE#$OTREE#" -e "s#NTREE#$NTREE#" \
342
This patch package will upgrade OTREE to NTREE.
343
You must unpack it inside the OTREE directory or it will not work.
344
This patch can only be applied over a clean OTREE distribution.
345
To apply, just type (followed by a Return, of course):
349
#....................
351
#....................
352
cat << 'EOF' > $TMP/cleanup
357
find .. -name \*.orig -exec rm {} \;
359
chmod +x $TMP/cleanup
360
#....................
363
# this must be the first function called
377
echo "Do you want to add something to the README file? <y/n> [n]"
379
if [ "$foo" = "y" ]; then
385
tar czf $OUTPUT.tar.gz $TMP
389
echo "Patch pack $OUTPUT.tar.gz successfully created."