tirofinale 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6473dccfd6113d1e14c05c01284b0b820a2d22c7
4
- data.tar.gz: e14ab35527721a2278b7bc2ebad75b2c64420edc
3
+ metadata.gz: 054f5fa1b2cd389a6df5590b52c6620089a5a0f1
4
+ data.tar.gz: 48036daba2ace54d30203efa3c028d307082d9f9
5
5
  SHA512:
6
- metadata.gz: cf94c7682abcf38f765e7029b7237c6a913d291a63d4fa2c9b79f34065bc82e837288fb726632cddd73009d8239a6fd5a717bcf1f6b88a4cf904e205d185fd72
7
- data.tar.gz: 25bd9fa89dac14b7e4d1018b847ca6814806fe59ea5e8fd12d31a3fb967920da8da688167042d60145515ad77cb95407e978bf7831701b11c6547e1a873952b0
6
+ metadata.gz: 09f43d7e14bb8a8c2dd0f816c9e8f5cb0589a37ce016daffd2ca1fd67a0c1f9649de0d10f3e53d73a12d757d0c6b9a54a7c6879ab156bbf537595c308336c3cd
7
+ data.tar.gz: 6d1cc2354cab6300b5282af825ffc730f303b983be8fb041384b89f5cdc84993cf88c54975b5d75b4de73dcd1648cdfb184539db48218c1daf6e2be10d6073ea
data/README.md CHANGED
@@ -17,29 +17,51 @@ Alpine Linux from v2.6 to v3.4 only.
17
17
  ## Usage
18
18
 
19
19
  ~~~~
20
+ $ tirofinale --help
20
21
  Usage: tirofinale [options]
22
+ --dependency
21
23
  --dist-version VERSION
22
24
  --gem GEM_NAME
25
+ --pretty-print
26
+ --debug-local-aports PATH
23
27
  ~~~~
24
28
 
25
- Show packages which is required to build `nokogiri` gem on Alpine Linux v3.4.
29
+ Default output format is optimized to shell.
30
+ You can install required packages to install `nokogiri` gem by `apk` command following line.
26
31
 
27
32
  ~~~~
28
- $ tirofinale --dist-version 3.4 --gem nokogiri
29
- ruby-dev libxml2-dev libxslt-dev
33
+ # apk add `tirofinale --gem nokogiri`
30
34
  ~~~~
31
35
 
32
- Auto detect Alpine Linux version by run without `--dist-version` parameter.
36
+ Human readable output gettable by `--pretty-print` option.
33
37
 
34
38
  ~~~~
35
- $ tirofinale --gem nokogiri
36
- ruby-dev libxml2-dev libxslt-dev
39
+ $ tirofinale --gem nokogiri --pretty-print
40
+ This environment require following packages to install gem 'nokogiri'.
41
+ ruby-dev
42
+ libxml2-dev
43
+ libxslt-dev
37
44
  ~~~~
38
45
 
39
- You can install packages by `apk` following command.
46
+ Distribution version is detected automatically when you run `tirofinale` on Alpine Linux environment.
47
+ If you specify version manually, you can use `--dist-version VERSION` option.
48
+ The following line show packages which are required to build `nokogiri` gem on Alpine Linux v3.4 on any environment.
40
49
 
41
50
  ~~~~
42
- # apk add `tirofinale --gem nokogiri`
51
+ $ tirofinale --dist-version 3.4 --gem nokogiri
52
+ ~~~~
53
+
54
+ Dependency of gem to gems will be resolved by Tirofinale's `--dependency` option.
55
+ For example, `thin` gem depends on `daemons` gem, `eventmachine` gem and `rack` gem.
56
+ And, `openssl-dev` package is required to build `eventmachine` on Alpine Linux.
57
+ In folowing example, Tirofinale show distribution packages dependent by `thin` gem and `thin` gem depdns on gems.
58
+
59
+ ~~~~
60
+ $ tirofinale --gem thin --dependency --pretty-print
61
+ This environment require following packages to install gem 'thin'.
62
+ ruby-dev
63
+ openssl-dev
64
+ ruby
43
65
  ~~~~
44
66
 
45
67
  ## License
@@ -0,0 +1,28 @@
1
+ load '../../exe/tirofinale'
2
+ require 'pp'
3
+
4
+ path_to_aports = ARGV[0]
5
+
6
+ init_logger()
7
+
8
+ all_deps = []
9
+
10
+ ruby_packages = open('../../data/ruby-packages'){|f| f.read}
11
+ ruby_packages.each_line{|l|
12
+ begin
13
+ name = l.match(/ruby-(.+)$/)[1]
14
+ deps = fetch_build_dep_packages_alpine(name, '3.4', path_to_aports)
15
+
16
+ all_deps << {:name => name, :deps => deps}
17
+ rescue => e
18
+ puts "Error occured name='#{name}'"
19
+ p e.inspect
20
+ pp e.backtrace
21
+ end
22
+ }
23
+
24
+ all_deps.sort_by!{|dep| dep[:deps].size}
25
+
26
+ all_deps.each{|dep|
27
+ puts "#{dep[:name]} => [#{dep[:deps].join(', ')}]"
28
+ }
@@ -0,0 +1,122 @@
1
+ main/ruby-augeas
2
+ main/ruby-bundler
3
+ unmaintained/ruby-railties4.2
4
+ unmaintained/ruby-isbn
5
+ unmaintained/ruby-rack14
6
+ unmaintained/ruby-tilt
7
+ unmaintained/ruby-openid
8
+ unmaintained/ruby-rbpdf-font
9
+ unmaintained/ruby-mini_portile
10
+ unmaintained/ruby-unicorn
11
+ unmaintained/ruby-metaclass
12
+ unmaintained/ruby-mysql2
13
+ unmaintained/ruby-sinatra
14
+ unmaintained/ruby-rails-deprecated_sanitizer4.2
15
+ unmaintained/ruby-amazon-ec2
16
+ unmaintained/ruby-mocha
17
+ unmaintained/ruby-diff-lcs
18
+ unmaintained/ruby-crack
19
+ unmaintained/ruby-rails4.2
20
+ unmaintained/ruby-actionpack4.2
21
+ unmaintained/ruby-tzinfo
22
+ unmaintained/ruby-useragent
23
+ unmaintained/ruby-rack-ssl
24
+ unmaintained/ruby-globalid
25
+ unmaintained/ruby-mini_portile2
26
+ unmaintained/ruby-protected_attributes4.2
27
+ unmaintained/ruby-rack-protection
28
+ unmaintained/ruby-actionpack-action_caching4.2
29
+ unmaintained/ruby-sprockets-rails4.2
30
+ unmaintained/ruby-net-ldap
31
+ unmaintained/ruby-htmlentities
32
+ unmaintained/ruby-gollum_rails-github-markup
33
+ unmaintained/ruby-gollum_rails-charlock_holmes
34
+ unmaintained/ruby-rouge
35
+ unmaintained/ruby-puma
36
+ unmaintained/ruby-shoulda
37
+ unmaintained/ruby-activerecord4.2
38
+ unmaintained/ruby-activesupport4.2
39
+ unmaintained/ruby-i18n
40
+ unmaintained/ruby-coderay
41
+ unmaintained/ruby-pry
42
+ unmaintained/ruby-mustache
43
+ unmaintained/ruby-gollum_rails-gitlab-grit
44
+ unmaintained/ruby-thread_safe
45
+ unmaintained/ruby-rack-cache
46
+ unmaintained/ruby-sanitize
47
+ unmaintained/ruby-jquery-rails4.2
48
+ unmaintained/ruby-net-http-digest_auth
49
+ unmaintained/ruby-http-cookie
50
+ unmaintained/ruby-hoe
51
+ unmaintained/ruby-shoulda-matchers
52
+ unmaintained/ruby-pg
53
+ unmaintained/ruby-mechanize
54
+ unmaintained/ruby-daemon-controller
55
+ unmaintained/ruby-github-markdown
56
+ unmaintained/ruby-rack-test
57
+ unmaintained/ruby-posix-spawn
58
+ unmaintained/ruby-mail
59
+ unmaintained/ruby-curb
60
+ unmaintained/ruby-rbpdf
61
+ unmaintained/ruby-hike
62
+ unmaintained/ruby-erubis
63
+ unmaintained/ruby-roadie
64
+ unmaintained/ruby-kgio
65
+ unmaintained/ruby-net-http-persistent
66
+ unmaintained/ruby-addressable
67
+ unmaintained/ruby-thor
68
+ unmaintained/ruby-rails-dom-testing4.2
69
+ unmaintained/ruby-rmagick
70
+ unmaintained/ruby-gollum-lib-github-markup
71
+ unmaintained/ruby-loofah
72
+ unmaintained/ruby-activemodel4.2
73
+ unmaintained/ruby-charlock_holmes
74
+ unmaintained/ruby-polyglot
75
+ unmaintained/ruby-github-markup
76
+ unmaintained/ruby-yard
77
+ unmaintained/ruby-sprockets
78
+ unmaintained/ruby-ntlm-http
79
+ unmaintained/ruby-arel
80
+ unmaintained/ruby-multi_json
81
+ unmaintained/ruby-stringex
82
+ unmaintained/ruby-activejob4.2
83
+ unmaintained/ruby-fcgi
84
+ unmaintained/ruby-thin
85
+ unmaintained/ruby-treetop
86
+ unmaintained/ruby-file-tail
87
+ unmaintained/ruby-rack
88
+ unmaintained/ruby-require
89
+ unmaintained/ruby-nokogiri
90
+ unmaintained/ruby-fastercsv
91
+ unmaintained/ruby-gitlab-grit
92
+ unmaintained/ruby-mime-types
93
+ unmaintained/ruby-network_interface
94
+ unmaintained/ruby-rack-openid
95
+ unmaintained/ruby-actionview4.2
96
+ unmaintained/ruby-sequel
97
+ unmaintained/ruby-test-unit
98
+ unmaintained/ruby-raindrops
99
+ unmaintained/ruby-redcarpet
100
+ unmaintained/ruby-xml-simple
101
+ unmaintained/ruby-actionmailer4.2
102
+ unmaintained/ruby-uuidtools
103
+ unmaintained/ruby-webrobots
104
+ unmaintained/ruby-bcrypt
105
+ unmaintained/ruby-rails-html-sanitizer
106
+ unmaintained/ruby-unf-ext
107
+ unmaintained/ruby-shoulda-context
108
+ unmaintained/ruby-roadie-rails
109
+ unmaintained/ruby-fastthread
110
+ unmaintained/ruby-actionpack-xml_parser4.2
111
+ unmaintained/ruby-abn
112
+ unmaintained/ruby-safe_yaml
113
+ unmaintained/ruby-tins
114
+ unmaintained/ruby-builder
115
+ unmaintained/ruby-unf
116
+ unmaintained/ruby-css_parser
117
+ unmaintained/ruby-sqlite
118
+ unmaintained/ruby-eventmachine
119
+ unmaintained/ruby-request_store
120
+ unmaintained/ruby-daemons
121
+ unmaintained/ruby-spruz
122
+ unmaintained/ruby-domain_name
data/exe/tirofinale CHANGED
@@ -1,7 +1,16 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'open-uri'
3
3
  require 'optparse'
4
- require 'pp'
4
+ require 'yaml'
5
+ require 'logger'
6
+
7
+ def init_logger
8
+ $logger = Logger.new(STDERR)
9
+ $logger.level = 4
10
+ if level = ENV['LOG_LEVEL']
11
+ $logger.level = level.to_i
12
+ end
13
+ end
5
14
 
6
15
  def detect_version_alpine
7
16
  content = open('/etc/alpine-release'){|f| f.read }
@@ -9,14 +18,20 @@ def detect_version_alpine
9
18
  major_minor ? major_minor[1] : nil
10
19
  end
11
20
 
12
- def search_apkbuild(gem_name, alpine_version)
21
+ def search_apkbuild(gem_name, alpine_version, debug_local_aports = nil)
13
22
  dir_list = ['community', 'main', 'non-free', 'testing', 'unmaintained']
14
23
  dir_list.each{|dir_name|
15
24
  apkbuild_url = "http://git.alpinelinux.org/cgit/aports/plain/#{dir_name}/ruby-#{gem_name}/APKBUILD?h=#{alpine_version + '-stable'}"
25
+ if debug_local_aports
26
+ apkbuild_url = "#{debug_local_aports}/#{dir_name}/ruby-#{gem_name}/APKBUILD"
27
+ end
28
+
16
29
  begin
17
30
  return open(apkbuild_url){|f| f.read}
18
31
  rescue OpenURI::HTTPError => e
19
32
  next
33
+ rescue Errno::ENOENT => e
34
+ next
20
35
  end
21
36
  }
22
37
  false
@@ -25,50 +40,136 @@ end
25
40
  def extract_makedepends(apkbuild)
26
41
  variables = []
27
42
 
28
- apkbuild.each_line{|l|
29
- if m = l.match(/^([^\s]+)=(.*)$/)
30
- key = m[1]
31
- value = m[2]
32
-
33
- variables << {:key => key, :value => value}
34
- end
43
+ # extract quoted variable
44
+ apkbuild.scan(/^([a-z_]+)="(.*?)"/m){|m|
45
+ variables << ({:name => m[0], :value => m[1].gsub(/\s+/, ' ')})
35
46
  }
36
47
 
37
- variables.sort_by!{|var| var[:key].length * -1}
38
-
39
- variables.each{|var|
40
- if m = var[:value].match(/^"(.*)"$/)
41
- var[:value] = m[1]
42
- end
48
+ # extract not quoted variable
49
+ apkbuild.scan(/^([a-z_]+)=([^"]*?)$/){|m|
50
+ variables << ({:name => m[0], :value => m[1].gsub(/\s+/, ' ')})
43
51
  }
44
52
 
53
+ variables.sort_by!{|var| var[:name].length * -1}
54
+
45
55
  variables.each{|var|
46
56
  while var[:value].include?('$')
47
57
  result = nil
48
58
  variables.each{|var2|
49
- result = result || var[:value].gsub!("$#{var2[:key]}", var2[:value])
59
+ result = result || var[:value].gsub!("$#{var2[:name]}", var2[:value])
50
60
  }
51
61
  break unless result
52
62
  end
53
63
  }
54
64
 
55
- variables.select{|var| var[:key] == 'makedepends'}.first[:value]
65
+ makedepends = variables.select{|var| var[:name] == 'makedepends'}.first
66
+ makedepends ? makedepends[:value] : ''
67
+ end
68
+
69
+ def fetch_dep_gems(gem_name, checked = [], level = 0)
70
+ $logger.debug("fetch_dep_gems(). Args:[#{[gem_name, checked, level].join(', ')}]")
71
+
72
+ if level > 10
73
+ return []
74
+ end
75
+
76
+ dep_gems = []
77
+
78
+ url = "https://rubygems.org/api/v1/gems/#{gem_name}.yaml"
79
+ runtime_dep = open(url){|f|
80
+ YAML.load(f.read)['dependencies']['runtime'].map{|dep| dep['name']}
81
+ }
82
+
83
+ dep_gems.push(*runtime_dep)
84
+ checked << gem_name
85
+
86
+ runtime_dep.each{|dep|
87
+ unless checked.include?(dep)
88
+ dep_gems.push(*fetch_dep_gems(dep, checked, level + 1))
89
+ end
90
+ }
91
+
92
+ dep_gems.uniq
93
+
94
+ $logger.info("Gem '#{gem_name}' depends on [#{dep_gems.join(', ')}].")
95
+
96
+ dep_gems
97
+ end
98
+
99
+ def fetch_build_dep_packages_alpine(gem_name, alpine_version, debug_local_aports)
100
+ $logger.info("Fetch Alpine Linux #{alpine_version} dependency packages to build '#{gem_name}'.")
101
+ apkbuild = search_apkbuild(gem_name, alpine_version, debug_local_aports)
102
+ unless apkbuild
103
+ $logger.warn("Alpine Linux does not have binary package for '#{gem_name}'.")
104
+ return []
105
+ end
106
+ makedepends = extract_makedepends(apkbuild)
107
+ packages = makedepends.strip.split(' ')
108
+ $logger.info("Alpine Linux build dependency packages [#{packages.join(', ')}] for '#{gem_name}'.")
109
+ packages
110
+ rescue => e
111
+ $logger.error(e.inspect)
112
+ $logger.error(e.backtrace)
113
+ raise e
56
114
  end
57
115
 
58
- alpine_version = nil
59
- gem_name = nil
116
+ def run
117
+ init_logger()
118
+
119
+ opts = {}
60
120
 
61
- op = OptionParser.new
62
- op.on('--dist-version VERSION'){|val| alpine_version = val}
63
- op.on('--gem GEM_NAME'){|val| gem_name = val}
64
- op.parse(ARGV)
121
+ op = OptionParser.new
122
+ op.on('--dependency'){|val| opts[:dependency] = true}
123
+ op.on('--dist-version VERSION'){|val| opts[:alpine_version] = val}
124
+ op.on('--gem GEM_NAME'){|val| opts[:gem_name] = val}
125
+ op.on('--pretty-print'){|val| opts[:pretty_print] = true}
126
+ op.on('--debug-local-aports PATH'){|val| opts[:debug_local_aports] = val}
127
+ op.parse(ARGV)
65
128
 
66
- alpine_version ||= detect_version_alpine()
129
+ $logger.info "Tirofinale start with #{opts}."
67
130
 
68
- apkbuild = search_apkbuild(gem_name, alpine_version)
131
+ alpine_version = opts[:alpine_version]
132
+ gem_name = opts[:gem_name]
133
+ dependency = opts[:dependency]
134
+ debug_local_aports = opts[:debug_local_aports]
135
+ pretty_print = opts[:pretty_print]
69
136
 
70
- makedepends = extract_makedepends(apkbuild)
137
+ unless alpine_version
138
+ $logger.info('Attempt to auto detect Alpine Linux version.')
139
+ alpine_version = detect_version_alpine()
140
+ $logger.info("Alpine Linux version '#{alpine_version}' was detected.")
141
+ end
71
142
 
72
- packages = makedepends.strip.split(' ')
143
+ packages = fetch_build_dep_packages_alpine(gem_name, alpine_version, debug_local_aports)
73
144
 
74
- print packages.join(' ')
145
+ if dependency
146
+ dep_gem_list = fetch_dep_gems(gem_name)
147
+
148
+ dep_gem_list.each{|dep_gem_name|
149
+ dep_packages = fetch_build_dep_packages_alpine(dep_gem_name, alpine_version, debug_local_aports)
150
+ packages.push(*dep_packages) unless dep_packages.empty?
151
+ }
152
+
153
+ packages.uniq!
154
+ end
155
+
156
+ $logger.info("This environment require packages [#{packages.join(', ')}] to install gem '#{gem_name}'.")
157
+
158
+ if pretty_print
159
+ puts "This environment require following packages to install gem '#{gem_name}'."
160
+ packages.each{|package|
161
+ puts " #{package}"
162
+ }
163
+ else
164
+ print packages.join(' ')
165
+ end
166
+
167
+ $logger.info "Tirofinale done."
168
+ end
169
+
170
+ if $0 == __FILE__
171
+ # execute directory
172
+ run()
173
+ else
174
+ # not to do something by require/load this file
175
+ end
@@ -1,3 +1,3 @@
1
1
  module Tirofinale
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tirofinale
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - xmisao
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-08-07 00:00:00.000000000 Z
11
+ date: 2016-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -68,7 +68,9 @@ files:
68
68
  - README.md
69
69
  - Rakefile
70
70
  - bin/console
71
+ - bin/experiment/list_all_alpine_linux_ruby_package_makedepends.rb
71
72
  - bin/setup
73
+ - data/ruby-packages
72
74
  - exe/tirofinale
73
75
  - lib/tirofinale.rb
74
76
  - lib/tirofinale/version.rb