gem2arch 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/gem2arch.gemspec +1 -1
- data/lib/gem2arch/core.rb +121 -0
- data/lib/gem2arch.rb +43 -107
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f622d0ec90306633e9c1ebc8e91bd1217bc2cf8
|
4
|
+
data.tar.gz: dbe0ffcc01b60f36797f942ee9ef68e70e20caa5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ca94327573f69480379992b1008e23ba4c3714c77d75e43eca507ffb911faa1145f4f445c40e64ed5ad4178979c67b9e5d1d1f426a6a68d858b35338aaaac29
|
7
|
+
data.tar.gz: 501704362656ed52ec76fb997bde662d687f1bfa0a461c88793698b78b2915301d15154826e26e19c000d49522e3c0770d6ab5272925052acfba45d701a505a8
|
data/gem2arch.gemspec
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
# Variables:
|
5
5
|
s.name = "gem2arch"
|
6
|
-
s.version = "0.0.
|
6
|
+
s.version = "0.0.3"
|
7
7
|
s.description = "A version of gem2arch by crabtw that creates an ArchLinux PKGBUILD from a ruby gem"
|
8
8
|
s.summary = "Creates an ArchLinux PKGBUILD from a ruby gem"
|
9
9
|
s.authors = ["Ari Mizrahi"]
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
require 'digest/sha1'
|
3
|
+
|
4
|
+
module Gem2arch
|
5
|
+
|
6
|
+
class Core
|
7
|
+
|
8
|
+
# Download the gem and return specification information
|
9
|
+
# @params [String] gemname is the name of the gem to download
|
10
|
+
# @params [String] gemver is the version of the gem to download - default nil
|
11
|
+
# @return [Gem::Specification] gem specification object
|
12
|
+
def download( gemname, gemver=nil )
|
13
|
+
# If gem version is not passed set it
|
14
|
+
# to any version greater than 0
|
15
|
+
version = gemver || ">=0"
|
16
|
+
# Get gem requirement object
|
17
|
+
requirement = Gem::Requirement.default
|
18
|
+
# Get gem dependency object
|
19
|
+
depends = Gem::Dependency.new( gemname, version )
|
20
|
+
# Fetch gem specification
|
21
|
+
spec_and_source = Gem::SpecFetcher.fetcher.spec_for_dependency( depends, requirement )
|
22
|
+
# Get gem specification info
|
23
|
+
spec = spec_and_source[0][0][0]
|
24
|
+
# Get source URI
|
25
|
+
source_uri = spec_and_source[0][0][1]
|
26
|
+
# Quit if we don't have a spec, we can't continue without it
|
27
|
+
# it probably means the gem doesn't exist in rubygems.org
|
28
|
+
exit if spec.nil?
|
29
|
+
# Download the .gem file
|
30
|
+
system( "gem fetch #{gemname}" )
|
31
|
+
|
32
|
+
return spec
|
33
|
+
end
|
34
|
+
|
35
|
+
# Hash a file and return it's MD5 or SHA1 value
|
36
|
+
# @params [String] file is spec filename
|
37
|
+
# @params [Symbol] type is :MD5 or :SHA1
|
38
|
+
# @return [String] hash value of passed file parameter
|
39
|
+
def digest( file, type )
|
40
|
+
# Get MD5 || SHA1 object depending on [type]
|
41
|
+
hashv = Digest::MD5.new if type == :MD5
|
42
|
+
hashv = Digest::SHA1.new if type == :SHA1
|
43
|
+
# Open the file and generate hash
|
44
|
+
# in 1024 bit chunks
|
45
|
+
File.open( file ) do |chunks|
|
46
|
+
while buffer = chunks.read(1024)
|
47
|
+
hashv << buffer
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
return hashv.to_s
|
52
|
+
end
|
53
|
+
|
54
|
+
# Build the PKGBUILD file using the downloaded specification
|
55
|
+
# @params [Gem::Specification] spec is gem specification object
|
56
|
+
def build( spec, archdepends=[] )
|
57
|
+
# Set arch=() value of PKGBUILD
|
58
|
+
spec.extensions.empty? ? arch = "'any'" : arch = "'i686' 'x86_64'"
|
59
|
+
# Calculate digest
|
60
|
+
md5sum = digest( "#{spec.full_name}.gem", :MD5 )
|
61
|
+
# Get gem dependencies
|
62
|
+
depends = spec.runtime_dependencies
|
63
|
+
# Modify [Array] depends if it is not empty
|
64
|
+
unless depends.empty?
|
65
|
+
# Break [Array] depends to modify each element
|
66
|
+
depends.map do |dep|
|
67
|
+
# For each dependency we need to modify the comparison
|
68
|
+
# symbol used to be compatible with PKGBUILD
|
69
|
+
dep.requirement.requirements.map do |compare, version|
|
70
|
+
# Modify the comparision symbol for PKGBUILD
|
71
|
+
compare = '>=' if compare == '~>'
|
72
|
+
# Replace the entire string for PKGBUILD
|
73
|
+
archdepends << "'ruby-#{dep.name}#{compare}#{version}'"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Build the gem parameters hash
|
79
|
+
params = {
|
80
|
+
name: spec.name,
|
81
|
+
version: spec.version,
|
82
|
+
website: spec.homepage,
|
83
|
+
description: spec.summary,
|
84
|
+
license: spec.license,
|
85
|
+
arch: arch,
|
86
|
+
md5sum: md5sum,
|
87
|
+
depends: archdepends.join(" ")
|
88
|
+
}
|
89
|
+
|
90
|
+
pkgbuild( params )
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
# Generate the PKGBUILD file
|
96
|
+
# @params [Hash] gem contains all parameters required to generate the PKGBUILD file
|
97
|
+
def pkgbuild( gem )
|
98
|
+
File.open( 'PKGBUILD', 'w' ) do |line|
|
99
|
+
line.puts "pkgname=ruby-#{gem[:name]}"
|
100
|
+
line.puts "_gemname=#{gem[:name]}"
|
101
|
+
line.puts "pkgver=#{gem[:version]}"
|
102
|
+
line.puts "pkgrel=0"
|
103
|
+
line.puts "pkgdesc=\"#{gem[:description]}\""
|
104
|
+
line.puts "arch=(#{gem[:arch]})"
|
105
|
+
line.puts "license=('#{gem[:license]}')"
|
106
|
+
line.puts "makedepends=('ruby')"
|
107
|
+
line.puts "depends=(#{gem[:depends]})"
|
108
|
+
line.puts "url='#{gem[:website]}'"
|
109
|
+
line.puts "source=('http://rubygems.org/downloads/#{gem[:name]}-#{gem[:version]}.gem')"
|
110
|
+
line.puts "md5sums=('#{gem[:md5sum]}')"
|
111
|
+
line.puts "noextract=(#{gem[:name]}-#{gem[:version]}.gem)"
|
112
|
+
|
113
|
+
line.puts "package() {"
|
114
|
+
line.puts "\tcd \"$srcdir\""
|
115
|
+
line.puts "\tlocal _gemdir=\"$(ruby -e 'puts Gem.default_dir')"
|
116
|
+
line.puts "\tgem install --ignore-dependencies --no-user-install -i \"$pkgdir$_gemdir\" -n \"$pkgdir/usr/bin\" $_gemname-$pkgver.gem"
|
117
|
+
line.puts "}"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
data/lib/gem2arch.rb
CHANGED
@@ -1,115 +1,51 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'gem2arch/core'
|
2
|
+
require 'optparse'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'tmpdir'
|
3
5
|
|
4
|
-
|
5
|
-
# @params [String] gemname is the name of the gem to download
|
6
|
-
# @params [String] gemver is the version of the gem to download - default nil
|
7
|
-
# @return [Gem::Specification] gem specification object
|
8
|
-
def download( gemname, gemver=nil )
|
9
|
-
# If gem version is not passed set it
|
10
|
-
# to any version greater than 0
|
11
|
-
version = gemver || ">=0"
|
12
|
-
# Get gem requirement object
|
13
|
-
requirement = Gem::Requirement.default
|
14
|
-
# Get gem dependency object
|
15
|
-
depends = Gem::Dependency.new( gemname, version )
|
16
|
-
# Fetch gem specification
|
17
|
-
spec_and_source = Gem::SpecFetcher.fetcher.spec_for_dependency( depends, requirement )
|
18
|
-
# Get gem specification info
|
19
|
-
spec = spec_and_source[0][0][0]
|
20
|
-
# Get source URI
|
21
|
-
source_uri = spec_and_source[0][0][1]
|
22
|
-
# Quit if we don't have a spec, we can't continue without it
|
23
|
-
# it probably means the gem doesn't exist in rubygems.org
|
24
|
-
exit if spec.nil?
|
25
|
-
# Download the .gem file
|
26
|
-
system( "gem fetch #{gemname}" )
|
27
|
-
|
28
|
-
return spec
|
29
|
-
end
|
6
|
+
module Gem2arch
|
30
7
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
# Get MD5 || SHA1 object depending on [type]
|
37
|
-
hashv = Digest::MD5.new if type == :MD5
|
38
|
-
hashv = Digest::SHA1.new if type == :SHA1
|
39
|
-
# Open the file and generate hash
|
40
|
-
# in 1024 bit chunks
|
41
|
-
File.open( file ) do |chunks|
|
42
|
-
while buffer = chunks.read(1024)
|
43
|
-
hashv << buffer
|
44
|
-
end
|
45
|
-
end
|
8
|
+
def self.start
|
9
|
+
options = {
|
10
|
+
gem: nil,
|
11
|
+
version: nil
|
12
|
+
}
|
46
13
|
|
47
|
-
|
48
|
-
|
14
|
+
OptionParser.new do |opts|
|
15
|
+
opts.banner = "gem2arch 0.0.3 (https://www.github.com/codemunchies/gem2arch)"
|
16
|
+
opts.banner += "Usage: gem2arch [options]"
|
49
17
|
|
50
|
-
|
51
|
-
|
52
|
-
def build( spec, archdepends=[] )
|
53
|
-
# Set arch=() value of PKGBUILD
|
54
|
-
spec.extensions.empty? ? arch = "'any'" : arch = "'i686' 'x86_64'"
|
55
|
-
# Calculate digest
|
56
|
-
md5sum = digest( "#{spec.full_name}.gem", :MD5 )
|
57
|
-
# Get gem dependencies
|
58
|
-
depends = spec.runtime_dependencies
|
59
|
-
# Modify [Array] depends if it is not empty
|
60
|
-
unless depends.empty?
|
61
|
-
# Break [Array] depends to modify each element
|
62
|
-
depends.map do |dep|
|
63
|
-
# For each dependency we need to modify the comparison
|
64
|
-
# symbol used to be compatible with PKGBUILD
|
65
|
-
dep.requirement.requirements.map do |compare, version|
|
66
|
-
# Modify the comparision symbol for PKGBUILD
|
67
|
-
compare = '>=' if compare == '~>'
|
68
|
-
# Replace the entire string for PKGBUILD
|
69
|
-
archdepends << "'ruby-#{dep.name}#{compare}#{version}'"
|
18
|
+
opts.on("--build [STRING]", "Gem to download and generate PKGBUILD for") do |gem|
|
19
|
+
options[:gem] = gem
|
70
20
|
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
# Build the gem parameters hash
|
75
|
-
params = {
|
76
|
-
name: spec.name,
|
77
|
-
version: spec.version,
|
78
|
-
website: spec.homepage,
|
79
|
-
description: spec.summary,
|
80
|
-
license: spec.license,
|
81
|
-
arch: arch,
|
82
|
-
md5sum: md5sum,
|
83
|
-
depends: archdepends.join(" ")
|
84
|
-
}
|
85
21
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
line.puts "}"
|
22
|
+
opts.on("--version [STRING]", "OPTIONAL: target specific version") do |ver|
|
23
|
+
options[:version] = ver
|
24
|
+
end
|
25
|
+
end.parse!
|
26
|
+
|
27
|
+
if options[:gem]
|
28
|
+
# Store paths
|
29
|
+
tmpdir = Dir.mktmpdir
|
30
|
+
basedir = Dir.pwd
|
31
|
+
|
32
|
+
begin
|
33
|
+
# Get [Gem2arch] object
|
34
|
+
gem2arch = Gem2arch::Core.new
|
35
|
+
# Jump into tmpdir
|
36
|
+
Dir.chdir( "#{tmpdir}" )
|
37
|
+
# Download the gem and store spec information
|
38
|
+
gemspec = gem2arch.download( options[:gem], options[:version] )
|
39
|
+
# Generate the PKGBUILD
|
40
|
+
gem2arch.build( gemspec )
|
41
|
+
# Move the PKGBUILD from tmpdir
|
42
|
+
FileUtils.mv( 'PKGBUILD', "#{basedir}" )
|
43
|
+
ensure
|
44
|
+
# Clean up
|
45
|
+
FileUtils.remove_entry_secure tmpdir
|
46
|
+
end
|
47
|
+
else
|
48
|
+
# Something
|
114
49
|
end
|
115
50
|
end
|
51
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gem2arch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ari Mizrahi
|
@@ -19,6 +19,7 @@ extensions: []
|
|
19
19
|
extra_rdoc_files: []
|
20
20
|
files:
|
21
21
|
- lib/gem2arch.rb
|
22
|
+
- lib/gem2arch/core.rb
|
22
23
|
- bin/gem2arch
|
23
24
|
- gem2arch.gemspec
|
24
25
|
- Gemfile
|