diff options
Diffstat (limited to 'debian/git.preinst')
-rw-r--r-- | debian/git.preinst | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/debian/git.preinst b/debian/git.preinst new file mode 100644 index 0000000..6b8090c --- /dev/null +++ b/debian/git.preinst @@ -0,0 +1,67 @@ +#!/bin/sh +set -e + +#DEBHELPER# + +# /var/cache/git/ -> /var/lib/git/ transition +if test "$1" = upgrade && + dpkg --compare-versions "$2" lt-nl '1:1.8.4~rc0-1'; then + mkdir -m 755 -p /var/lib/git + ( + cd /var/lib/git + for target in ../../cache/git/*; do + if ! test -L "$target" && ! test -e "$target"; then + continue + fi + + link=${target#../../cache/git/} + if ! test -L "$link" && ! test -e "$link"; then + ln -s "$target" "$link" + fi + done + ) +fi + +# A previous version of the /var/lib/git/ transition code +# left behind a symlink '/var/lib/git/*' -> '../../cache/git/*'. +if test "$1" = upgrade && + dpkg --compare-versions "$2" eq '1:1.8.4~rc0-1' && + test -L '/var/lib/git/*'; then + target=$(readlink '/var/lib/git/*') + if test "$target" = '../../cache/git/*'; then + rm -f '/var/lib/git/*' + fi +fi + +# Git versions before 1.7.7-2 kept about 100 hard links to +# /usr/lib/git-core/git at /usr/lib/git-core/git-* to avoid +# wasting time resolving a symlink when old scripts call "git +# foo" as git-foo. Btrfs doesn't like to have more than 130 or +# so links to a single inode in a given directory. dpkg versions +# 1.16.1 and later temporarily double the number of hard links to +# an inode when upgrading a package. +# +# Replace the hard links with symlinks _before_ upgrading to +# avoid trouble. +# +# For added fun, coreutils mv will not replace a file by a +# symlink to the same inode (bug #654666). We give +# /usr/lib/git-core/git its own inode to work around that. + +if test "$1" = upgrade && + dpkg --compare-versions "$2" lt-nl '1:1.7.7-2'; then + refinode=$(stat -c%i /usr/lib/git-core/git-add) + + rm -f /usr/lib/git-core/git.tmp + cp -p /usr/lib/git-core/git /usr/lib/git-core/git.tmp + mv -f /usr/lib/git-core/git.tmp /usr/lib/git-core/git + for f in /usr/lib/git-core/*; do + test "$f" != /usr/lib/git-core/git && + test "$f" != /usr/lib/git-core/git-add || continue + rm -f "$f.tmp" + inode=$(stat -c%i "$f") + test "$inode" = "$refinode" || continue + ln -s git "$f.tmp" + mv -f "$f.tmp" "$f" + done +fi |