mirror_ubuntu-kernels/debian/scripts/misc/gen-auto-reconstruct

90 lines
2.1 KiB
Plaintext
Raw Normal View History

2024-07-02 00:48:40 +03:00
#!/bin/bash
if [ "$#" -ne 3 ]; then
echo "Usage: $0 <orig tag>|<base release> <reconstruct> <options>" 1>&2
exit 1
fi
tag="$1"
reconstruct="$2"
options="$3"
case "$tag" in
v*) ;;
*) tag="v${tag%.*}" ;;
esac
# Validate the tag.
count=$( git tag -l "$tag" | wc -l )
if [ "$count" != 1 ]; then
echo "$0: $tag: tag invalid" 1>&2
exit 1
fi
#git ls-tree -r --full-tree HEAD | grep ^120 | \
#while read mode type blobid name
(
# Identify all new symlinks since the proffered tag.
echo "# Recreate any symlinks created since the orig."
git diff "$tag.." --raw --no-renames | awk '(/^:000000 120000/ && $5 == "A") { print $NF }' | \
while read name
do
link=$( readlink "$name" )
echo "[ ! -L '$name' ] && ln -sf '$link' '$name'"
done
# Identify files with execute permissions added since the proffered tag.
git diff "$tag.." --raw --no-renames | awk -F '[: \t]' '{print $2, $3, $NF }' | \
while IFS=" " read old new name
do
old=$( printf "0%s" $old )
new=$( printf "0%s" $new )
changed=$(( (old ^ new) & 0111 ))
if [ "$changed" -ne 0 ]; then
added=$(( new & 0111 ))
if [ "$added" -ne 0 ]; then
echo "chmod +x '$name'"
elif [ "$new" -ne 0 ]; then
echo "chmod -x '$name'"
fi
fi
done
# Identify all removed files since the proffered tag.
echo "# Remove any files deleted from the orig."
git diff "$tag.." --raw --no-renames | awk '(/^:/ && $5 == "D") { print $NF }' | \
while read name
do
echo "rm -f '$name'"
done
# All done, make sure this does not complete in error.
echo "exit 0"
) >"$reconstruct"
(
# Identify all new symlinks since the proffered tag.
echo "# Ignore any symlinks created since the orig which are rebuilt by reconstruct."
git diff "$tag.." --raw --no-renames | awk '(/^:000000 120000/ && $5 == "A") { print $NF }' | \
while read name
do
echo "extend-diff-ignore=^$name\$"
done
) >"$options.update"
head='^## autoreconstruct -- begin$'
foot='^## autoreconstruct -- end$'
sed -i -e "
/$head/,/$foot/{
/$head/{
p;
r $options.update
};
/$foot/p;
d
}
" "$options"
rm -f "$options.update"