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 end
def clean def clean
#TODO strip libexec too
[bin,lib].each {|path| path.find do |path| [bin,lib].each {|path| path.find do |path|
if not path.file? if not path.file?
next next
@ -248,21 +249,30 @@ public
else else
fo=`file -h #{path}` fo=`file -h #{path}`
args=nil args=nil
chmod=0444 perms=0444
if fo =~ /Mach-O dynamically linked shared library/ if fo =~ /Mach-O dynamically linked shared library/
args='-SxX' args='-SxX'
elsif fo =~ /Mach-O executable/ # defaults strip everything elsif fo =~ /Mach-O executable/ # defaults strip everything
args='' # still do the strip args='' # still do the strip
chmod=0544 perms=0544
elsif fo =~ /script text executable/ elsif fo =~ /script text executable/
chmod=0544 perms=0544
end end
if args if args
puts "Stripping: #{path}" if ARGV.include? '--verbose' puts "Stripping: #{path}" if ARGV.include? '--verbose'
path.chmod 0644 # so we can strip 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 end
path.chmod chmod path.chmod perms
end end
end} end}