Class: EmergeGem

Inherits:
Object
  • Object
show all
Defined in:
lib/emerge-gem.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(argv) ⇒ EmergeGem

Returns a new instance of EmergeGem.



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
# File 'lib/emerge-gem.rb', line 17

def initialize( argv )
  @gems = []
  @emerge_options = []
  portage_base_dir = '/usr/local/portage'
  @portage_path = 'dev-ruby'

  collecting_emerge_options = false
  while argv.any?
    arg = argv.shift
    case arg
    when '--'
      collecting_emerge_options = true
    when '-h', '--help'
      print_usage_and_exit
    when '--no-emerge'
      @no_emerge = true
    when '--portage-base-dir'
      portage_base_dir = arg
    when '--portage-path'
      @portage_path = arg
    when '-v', '--verbose'
      @verbose = true
      puts "(verbose mode)"
    else
      if collecting_emerge_options
        @emerge_options << arg
      else
        @gems << arg
      end
    end
  end

  if @gems.empty?
    print_usage_and_exit
  end

  @ebuild_dest ||= "#{portage_base_dir}/#{@portage_path}"

  @eix_installed = system( 'which eix > /dev/null' )
  if @eix_installed
    inform "eix detected"
  end
end

Class Method Details

.gem_installed?(gem_name) ⇒ Boolean

Returns:

  • (Boolean)


108
109
110
# File 'lib/emerge-gem.rb', line 108

def self.gem_installed?( gem_name )
  gem_versions_installed( gem_name ).any?
end

.gem_versions_installed(gem_name) ⇒ Object



104
105
106
# File 'lib/emerge-gem.rb', line 104

def self.gem_versions_installed( gem_name )
  Gem.source_index.find_name( gem_name ).map { |gem| gem.version.to_s }
end

.package_installed?(package_name) ⇒ Boolean

Returns:

  • (Boolean)


116
117
118
# File 'lib/emerge-gem.rb', line 116

def self.package_installed?( package_name )
  system "eix -Ie --only-names #{package_name} | egrep '#{package_name}$' > /dev/null"
end

.portage_version_installed(gem_name) ⇒ Object



112
113
114
# File 'lib/emerge-gem.rb', line 112

def self.portage_version_installed( gem_name )
  `eix -Ien* --format '<installedversionsshort>' #{gem_name}`[ /([0-9.]+)/, 1 ]
end

Instance Method Details

#check_local_gemsObject



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/emerge-gem.rb', line 69

def check_local_gems
  return  if ! @eix_installed
  @gems.each do |gem|
    inform "Checking installation of #{gem}"
    gem_versions = EmergeGem.gem_versions_installed( gem )
    next  if gem_versions.empty?
    inform "#{gem} gem installed"

    package_version = EmergeGem.portage_version_installed( gem )
    if package_version
      next  if gem_versions.include?( package_version )

      puts "Portage version of #{gem} is #{package_version} but Rubygems reports version(s):"
      puts gem_versions.join( ', ' )
      puts "Sync Rubygem installation with Portage's version? [y/n]"
      answer = $stdin.gets.strip
      if answer =~ /^y/i
        shell "gem uninstall -a -x -I #{gem}"
        shell "gem install -v #{package_version} #{gem}"
      else
        puts "(retaining differing gem installation of #{gem})"
      end
    else
      puts "#{gem} seems to be installed via gem and not Portage."
      puts "Uninstall the #{gem} gem before emerging?  [y/n]"
      answer = $stdin.gets.strip
      if answer =~ /^y/i
        shell "gem uninstall #{gem}"
      else
        puts "(not uninstalling #{gem} gem)"
      end
    end
  end
end

#digest_ebuildsObject



147
148
149
150
151
# File 'lib/emerge-gem.rb', line 147

def digest_ebuilds
  @ebuilds.each do |name, ebuild|
    shell "ebuild #{ebuild.local_path} digest"
  end
end

#emergeObject



153
154
155
156
157
158
159
160
161
# File 'lib/emerge-gem.rb', line 153

def emerge
  ebuild_names = @ebuilds.values.map { |e| "#{@portage_path}/#{e.name}" }.join( ' ' )
  command = "emerge #{@emerge_options.join( ' ' )} #{ebuild_names}"
  if @no_emerge
    puts "(would execute: #{command})"
  else
    shell command
  end
end

#gather_ebuildsObject



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/emerge-gem.rb', line 120

def gather_ebuilds
  @ebuilds = {}
  gems = @gems.dup
  while gems.any?
    next_package = gems.shift

    if ! @ebuilds[ next_package ]
      inform "Gathering info about #{next_package} gem..."
      @ebuilds[ next_package ] = Ebuild.create_from_spec_lookup( next_package )
    end

    @ebuilds[ next_package ].spec.dependencies.each do |dependency|
      next  if @ebuilds[ dependency.name ]
      inform "  Looking up dependency #{dependency.name}"
      gems.push dependency.name
      @gems.push dependency.name
    end
  end
end

#inform(message) ⇒ Object



169
170
171
172
# File 'lib/emerge-gem.rb', line 169

def inform( message )
  return  if ! @verbose
  puts message
end


7
8
9
10
11
12
13
14
15
# File 'lib/emerge-gem.rb', line 7

def print_usage_and_exit
  puts "#{$0} [options] <gem name> [gem name...] [-- <emerge options>]"
  puts "    -h --help              show usage"
  puts "    --no-emerge            don't actually execute any emerge commands"
  puts "    --portage-base-dir     (default /usr/local/portage)"
  puts "    --portage-path         relative to portage base dir (default dev-ruby)"
  puts "    --verbose              print more details about work being done"
  exit 1
end

#runObject



61
62
63
64
65
66
67
# File 'lib/emerge-gem.rb', line 61

def run
  gather_ebuilds
  check_local_gems
  write_ebuilds
  digest_ebuilds
  emerge
end

#shell(command) ⇒ Object



163
164
165
166
167
# File 'lib/emerge-gem.rb', line 163

def shell( command )
  puts "\033[1m#{command}\033[0m"
  system( command ) or
    exit $?
end

#write_ebuildsObject



140
141
142
143
144
145
# File 'lib/emerge-gem.rb', line 140

def write_ebuilds
  @ebuilds.each do |name, ebuild|
    inform "Writing out #{ebuild.filename}"
    ebuild.write @ebuild_dest
  end
end