1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-19 12:28:22 +01:00
Files
wmaker/mkpatch
1999-01-07 12:31:05 +00:00

390 lines
7.8 KiB
Bash
Executable File

#!/bin/sh
#
# mkpatch 1.1
#
# Creates a more-or-less self-contained patch package.
#
# Copyright (c) Alfredo K. Kojima
#
#
# Syntax: mkpatch old_tree new_tree patch_name
#
# If a file named mkp.stuff is found in the current directory, it
# will be used to extract special handling cases. Each directive must
# be placed in a line of the file and the arguments must be separated
# by a single space. The currently supported directives are:
#
# DONTDIFF <file_path>
# Do not use diff in the specified file, replacing the file instead.
# The path must exclude the top directory and the path must be
# valid from both trees.
# It will handle special cases of files that diff thinks are text
# files, but actually are not, like XPM files created by stupid,
# brain damaged, moron XV.
#
# Example mkp.stuff file:
# DONTDIFF icons/somthing.xpm
# DONTDIFF icons/smthingelse.xpm
#
#
# The resulting patch pack will be relatively big (if compared to things
# produced by xdelta and others), but it will be self-contained and
# hopefully smaller than the whole source tree.
#
# You MUST run mkpatch from a directory above old_tree and new_tree.
# Example:
# If newTree and oldTree are located in /tmp
# cd /tmp
# mkpatch oldTree newTree old_to_new
#
# File names cannot contain the character # or spaces
#
if test ! $# = 3 ; then
echo "$0:read the script for the syntax."
exit 1
fi
istext() {
a=`file $1|grep text`
if test "x$a" = "x"; then
return 0
else
return 1
fi
}
put_header() {
cat << 'EOF' |sed -e "s#TMP#$TMP#" -e "s#OTREE#$OTREE#"\
-e "s#NTREE#$NTREE#" > $1
#!/bin/sh
#
# Patch package to upgrade OTREE to NTREE
#
EOF
if [ $# -gt 1 ]; then
echo $2 >> $1
fi
echo "unalias rm" >> $1
}
##########################
check_removed_files() {
files=`grep "Only in $OTREE" $TMP/tdiff|sed -e "s#Only in $OTREE##" -e "s#: #/#" -e "s#//#/#"`
put_header $TMP/delfiles "# Remove obsolete files"
#..................
cat << EOF >> $TMP/delfiles
echo "Files that are not needed anymore will be removed now."
echo "Do you wish to proceed? <y/n> [y]"
read foo
if [ "$foo" = "n" ]; then
exit 0
fi
EOF
#...................
echo "Obsoleted Files:"
for i in $files; do
echo $OTREE/$i
echo "echo \"Removing ../$i\"" >> $TMP/delfiles
if [ -d $OTREE/$i ]; then
echo "rm -rf ../$i" >> $TMP/delfiles
else
echo "rm ../$i" >> $TMP/delfiles
fi
done
chmod +x $TMP/delfiles
}
#########################
check_new_files() {
files=`grep "Only in $NTREE" $TMP/tdiff|sed -e "s#Only in $NTREE#../#" -e "s#: #/#" -e "s#//#/#"`
put_header $TMP/newfiles "# Copy new files"
echo "# Table of internal file names to real file names" >> $TMP/newfiles
index=0
dindex=0
mkdir $TMP/files
echo "New Files:"
for i in $files; do
name=`basename $i`
src=`echo $i|sed -e "s#..#$NTREE#"`
file=`echo $i|sed -e "s#../##"`
echo $src
if [ -d $src ]; then
dst="dir$dindex"
(dir=`pwd`;cd $NTREE;tar cf $dir/$TMP/files/$dst.tar $file)
echo "$dst=\"$file\"" >> $TMP/newfiles
dindex=`expr $dindex + 1`
else
dst="file$index"
cp $src $TMP/files/$dst
echo "$dst=\"$file\"" >> $TMP/newfiles
index=`expr $index + 1`
fi
done
echo "filecount=$index" >> $TMP/newfiles
echo "dircount=$dindex" >> $TMP/newfiles
#..........
cat << 'EOF' |sed -e "s#TMP#$TMP#" -e "s#OTREE#$OTREE#"\
-e "s#NTREE#$NTREE#" >> $TMP/newfiles
#create new directories
index=0
mkdir tmpdir
while [ $index -lt $dircount ]; do
fname="dir$index"
eval origname=$"$fname"
echo "Recreating directory ../$origname"
(cd tmpdir; tar xf ../files/$fname.tar)
mv tmpdir/$origname ../$origname
index=`expr $index + 1`
done
rm -fr tmpdir
#copy files
index=0
while [ $index -lt $filecount ]; do
fname="file$index"
eval origname=$"$fname"
echo "Copying file ../$origname"
cp files/$fname ../$origname
index=`expr $index + 1`
done
EOF
#..........
chmod +x $TMP/newfiles
}
#####################
check_binary_changes() {
files=`grep "Binary files" $TMP/bindiff|cut -d\ -f5`
files=`echo $files`
put_header $TMP/updbinfiles "# Replace changed binary files"
echo "# Table of internal file names to real file names" >> $TMP/updbinfiles
for i in $no_diff; do
files="$files $NTREE/$i"
done
index=0
echo "Binary files changed:"
for i in $files; do
fname="changed$index"
oname=`echo $i|sed -e "s#$NTREE##" -e "s#^/##"`
cp $i $TMP/files/$fname
echo $i
echo "$fname=\"$oname\"" >> $TMP/updbinfiles
index=`expr $index + 1`
done
echo "filecount=$index" >> $TMP/updbinfiles
#..........
cat << 'EOF' |sed -e "s#TMP#$TMP#" -e "s#OTREE#$OTREE#"\
-e "s#NTREE#$NTREE#" >> $TMP/updbinfiles
index=0
while [ $index -lt $filecount ]; do
fname="changed$index"
eval origname=$"$fname"
echo "Replacing file ../$origname"
rm ../$origname
cp files/$fname ../$origname
index=`expr $index + 1`
done
EOF
#..........
chmod +x $TMP/updbinfiles
}
#####################
check_text_changes() {
echo "diff'ing trees..."
diff -rq $OTREE $NTREE > $TMP/tdiff
tmp=`egrep "^Files" $TMP/tdiff|cut -d\ -f2|sed -e "s#$OTREE/##"`
files=""
# remove excluded files
for i in $tmp; do
ok=1
for j in $no_diff; do
if test "$i" = "$j"; then
ok=0
break
fi
done
if [ $ok = 1 ]; then
files="$files $i"
fi
done
touch $TMP/diff
touch $TMP/bindiff
# diff remaining files
for f in $files; do
diff -rc $OTREE/$f $NTREE/$f >> $TMP/tmp
foo=`egrep "^Binary" $TMP/tmp`
if test "x$foo" = "x"; then
cat $TMP/tmp >> $TMP/diff
else
cat $TMP/tmp >> $TMP/bindiff
fi
rm -fr $TMP/tmp
done
}
################# main
stripslash() {
echo $1|sed -e 's#/$##'
}
OTREE=`stripslash $1`
NTREE=`stripslash $2`
OUTPUT=$3
TMP=$OUTPUT.patchd
rm -fr $TMP
mkdir $TMP
if [ -f mkp.stuff ]; then
echo "Using mkp.stuff file..."
no_diff=`grep DONTDIFF mkp.stuff|cut -d\ -f2`
no_diff=`echo $no_diff`
fi
#....................
cat << 'EOF' |sed -e "s#TMP#$TMP#" -e "s#OTREE#$OTREE#" -e "s#NTREE#$NTREE#" \
> $TMP/runme
#!/bin/sh
#
# Patch package to upgrade OTREE to NTREE
#
# Automatically generated by mkpatch
#
# Move the TMP directory to inside NTREE
# and run this script.
#
TARGET_TREE=OTREE
savedir=`pwd`
cd ..
dir=`pwd`
dir=`basename $dir`
cd $savedir
if test "$USER" = root; then
echo "Do not run this script as the root user"
exit 1
fi
if test "$dir" != "$TARGET_TREE"; then
echo "You must move the \"TMP\" directory to inside the "
echo "\"$TARGET_TREE\" directory before running this script."
exit 1
fi
echo "################################"
echo "Removing Obsolete Files"
echo "################################"
./delfiles
echo
echo "################################"
echo "Copying New Files"
echo "################################"
./newfiles
echo
echo "################################"
echo "Replacing modified binary files"
echo "################################"
./updbinfiles
echo
echo "################################"
echo "Patching modified text files"
echo "################################"
cd ..
patch -p1 -s < $savedir/diff
echo "Patching finished."
EOF
#....................
cat << 'EOF' |sed -e "s#TMP#$TMP#" -e "s#OTREE#$OTREE#" -e "s#NTREE#$NTREE#" \
> $TMP/README
This patch package will upgrade OTREE to NTREE.
You must unpack it inside the NTREE directory or it will not work.
This patch can only be applied over a clean OTREE distribution.
To apply, just type (followed by a Return, of course):
./runme
EOF
#....................
#....................
cat << 'EOF' > $TMP/cleanup
#!/bin/sh
#
# Remove .orig files
#
find .. -name \*.orig -exec rm {} \;
EOF
chmod +x $TMP/cleanup
#....................
# this must be the first function called
check_text_changes
check_removed_files
check_new_files
check_binary_changes
rm -f $TMP/tdiff
rm -f $TMP/bindiff
chmod +x $TMP/runme
echo "Do you want to add something to the README file? <y/n> [n]"
read foo
if [ "$foo" = "y" ]; then
vi $TMP/README
fi
rm -f $OUTPUT.tar.gz
tar czf $OUTPUT.tar.gz $TMP
rm -fr $TMP
echo "Patch pack $OUTPUT.tar.gz successfully created."