aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/cleaner.rb
blob: 36bb74f4badbcbe2b0023a87dbc0db14d8459682 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
class Cleaner
  def initialize f
    @f = Formula.factory f
    [f.bin, f.sbin, f.lib].select{ |d| d.exist? }.each{ |d| clean_dir d }

    unless ENV['HOMEBREW_KEEP_INFO'].nil?
      f.info.rmtree if f.info.directory? and not f.skip_clean? f.info
    end

    # Hunt for empty folders and nuke them unless they are protected by
    # f.skip_clean? We want post-order traversal, so put the dirs in a stack
    # and then pop them off later.
    paths = []
    f.prefix.find do |path|
      paths << path if path.directory?
    end

    paths.each do |d|
      if d.children.empty? and not f.skip_clean? d
        puts "rmdir: #{d} (empty)" if ARGV.verbose?
        d.rmdir
      end
    end
  end

  private

  def strip path, args=''
    return if @f.skip_clean? path
    puts "strip #{path}" if ARGV.verbose?
    path.chmod 0644 # so we can strip
    unless path.stat.nlink > 1
      system "/usr/bin/strip", *(args+path)
    else
      path = path.to_s.gsub ' ', '\\ '

      # strip unlinks the file and recreates it, thus breaking hard links!
      # is this expected behaviour? patch does it too… still, this fixes it
      tmp = `/usr/bin/mktemp -t homebrew_strip`.chomp
      begin
        `/usr/bin/strip #{args} -o #{tmp} #{path}`
        `/bin/cat #{tmp} > #{path}`
      ensure
        FileUtils.rm tmp
      end
    end
  end

  def clean_file path
    perms = 0444
    case `/usr/bin/file -h '#{path}'`
    when /Mach-O dynamically linked shared library/
      # Stripping libraries is causing no end of trouble. Lets just give up,
      # and try to do it manually in instances where it makes sense.
      #strip path, '-SxX'
    when /Mach-O [^ ]* ?executable/
      strip path
      perms = 0555
    when /text executable/
      perms = 0555
    end
    path.chmod perms
  end

  def clean_dir d
    d.find do |path|
      if path.directory?
        Find.prune if @f.skip_clean? path
      elsif not path.file?
        next
      elsif path.extname == '.la'
        # *.la files are stupid
        path.unlink unless @f.skip_clean? path
      elsif not path.symlink?
        clean_file path
      end
    end
  end
end