Fix hard link dissociation bug

strip unlinks the file first, breaking hard links, so we detect instances where we are about to strip a file with many linkages and prevent it.

This fixes the libexec non executable bug in the git package.

Took me a long time to figure out what was wrong! :P
This commit is contained in:
Max Howell 2009-07-22 20:28:42 +01:00
parent 7bd9f08558
commit 32281b7a7f

View File

@ -239,6 +239,7 @@ public
end
def clean
#TODO strip libexec too
[bin,lib].each {|path| path.find do |path|
if not path.file?
next
@ -248,21 +249,30 @@ public
else
fo=`file -h #{path}`
args=nil
chmod=0444
perms=0444
if fo =~ /Mach-O dynamically linked shared library/
args='-SxX'
elsif fo =~ /Mach-O executable/ # defaults strip everything
args='' # still do the strip
chmod=0544
perms=0544
elsif fo =~ /script text executable/
chmod=0544
perms=0544
end
if args
puts "Stripping: #{path}" if ARGV.include? '--verbose'
path.chmod 0644 # so we can strip
`strip #{args} #{path}`
unless path.stat.nlink > 1
`strip #{args} #{path}`
else
# strip unlinks the file and recreates it, thus breaking hard links!
# is this expected behaviour? patch does it too… still,mktm this fixes it
tmp=`mktemp -t #{path.basename}`.strip
`strip -o #{tmp} #{path}`
`cat #{tmp} > #{path}`
File.unlink tmp
end
end
path.chmod chmod
path.chmod perms
end
end}