gpm 0.1.9 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/gpm +1 -1
- data/lib/gpm/cli.rb +5 -3
- data/lib/gpm/has_directories.rb +7 -0
- data/lib/gpm/has_option_methods.rb +15 -0
- data/lib/gpm/io_helpers.rb +1 -1
- data/lib/gpm/packaging_task.rb +3 -3
- data/lib/gpm/source.rb +59 -3
- data/lib/gpm/source/bundler.rb +19 -16
- data/lib/gpm/source/files_providers/composite_files_provider.rb +4 -11
- data/lib/gpm/source/files_providers/files_from_bundler_directory_provider.rb +11 -20
- data/lib/gpm/source/files_providers/files_from_directory_provider.rb +20 -5
- data/lib/gpm/source/files_providers/vendored_gems_installer.rb +1 -1
- data/lib/gpm/source/gem.rb +32 -30
- data/lib/gpm/source/maven.rb +106 -0
- data/lib/gpm/source/war.rb +53 -0
- data/lib/gpm/target.rb +6 -1
- data/lib/gpm/target/deb.rb +6 -4
- data/lib/gpm/target/generate_from_templates.rb +2 -1
- data/templates/deb/control.tar.gz.dir/control.erb +1 -1
- metadata +54 -29
- data/lib/gpm/source/files_providers/files_from_gem_directory_provider.rb +0 -13
data/bin/gpm
CHANGED
data/lib/gpm/cli.rb
CHANGED
@@ -4,11 +4,12 @@ require_relative 'packaging_task'
|
|
4
4
|
|
5
5
|
class GpmCli < Thor
|
6
6
|
def self.supported_sources
|
7
|
-
["gem","bundler"]
|
7
|
+
["gem","bundler", "war", "maven"]
|
8
8
|
end
|
9
9
|
def self.supported_targets
|
10
10
|
["deb"]
|
11
11
|
end
|
12
|
+
INCLUDE_FILES_PARAM = "include-files".to_sym
|
12
13
|
# gpm package -s <source type> -t <target type> [options]
|
13
14
|
desc "package APP_DIRECTORY_OR_FILE", "Packages the app given in a specified source format to a desired target format"
|
14
15
|
method_option :source, :type => :string, :aliases => "-s", :desc => "The input for creating the package (Currently supported: #{supported_sources.join(', ')})", :required => true
|
@@ -18,12 +19,13 @@ class GpmCli < Thor
|
|
18
19
|
method_option :owner, :type => :string, :aliases => "-o", :desc => "The owning user for the destination path", :default => "root"
|
19
20
|
method_option :group, :type => :string, :aliases => "-g", :desc => "The owning group for the destination path", :default => "root"
|
20
21
|
method_option :buildnumber, :type => :string, :aliases => "-b", :desc => "The build number that is appended to the version", :required => false
|
22
|
+
method_option INCLUDE_FILES_PARAM, :type => :array, :aliases => "-i", :desc => "Glob(s) of files to include", :required => false
|
21
23
|
|
22
24
|
def package(file_or_directory)
|
23
|
-
raise "Only
|
25
|
+
raise "Only #{self.class.supported_sources.join(", ")} sources at the moment" unless self.class.supported_sources.include? options.source
|
24
26
|
raise "Only deb target at the moment" unless self.class.supported_targets.include? options.target
|
25
27
|
package_options = {}
|
26
|
-
{:workdir => :work_dir , :destination => :destination, :owner => :owner, :group => :group, :buildnumber => :build_number}.each do |in_field, out_field|
|
28
|
+
{:workdir => :work_dir , :destination => :destination, :owner => :owner, :group => :group, :buildnumber => :build_number, INCLUDE_FILES_PARAM => :include_files}.each do |in_field, out_field|
|
27
29
|
package_options[out_field] = options[in_field] if options[in_field]
|
28
30
|
end
|
29
31
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module HasOptionMethods
|
2
|
+
|
3
|
+
module ClassMethods
|
4
|
+
def option_method(name, default_value = nil)
|
5
|
+
define_method name do
|
6
|
+
options[name.to_sym] || default_value
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :options
|
12
|
+
def self.included(base)
|
13
|
+
base.extend(ClassMethods)
|
14
|
+
end
|
15
|
+
end
|
data/lib/gpm/io_helpers.rb
CHANGED
@@ -18,7 +18,7 @@ end
|
|
18
18
|
def read_file_contents(files,base_directory)
|
19
19
|
file_contents = {}
|
20
20
|
files.each do |f|
|
21
|
-
path = File.join(base_directory,f)
|
21
|
+
path = File.expand_path(File.join(base_directory,f))
|
22
22
|
permissions = File.lstat(path).mode % 4096
|
23
23
|
file_contents[FilePathAndPermissions.new(f,permissions)] = File.read(path) if File.file?(path)
|
24
24
|
end
|
data/lib/gpm/packaging_task.rb
CHANGED
@@ -3,19 +3,19 @@ class PackagingTask
|
|
3
3
|
def self.class_for_source(source_name)
|
4
4
|
require_relative "source"
|
5
5
|
require_relative "source/#{source_name}"
|
6
|
-
|
6
|
+
Source.const_get(source_name.capitalize)
|
7
7
|
end
|
8
8
|
|
9
9
|
def self.class_for_target(target_name)
|
10
10
|
require_relative "target"
|
11
11
|
require_relative "target/#{target_name}"
|
12
|
-
|
12
|
+
Target.const_get(target_name.capitalize)
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.create(file_or_directory, source_name, target_name, options = {})
|
16
16
|
options[:work_dir] ||= Dir.mktmpdir
|
17
17
|
source_class = class_for_source(source_name)
|
18
|
-
source = source_class.
|
18
|
+
source = source_class::Factory.new(file_or_directory, options).create
|
19
19
|
|
20
20
|
target_class = class_for_target(target_name)
|
21
21
|
target = target_class.new(options[:work_dir], options)
|
data/lib/gpm/source.rb
CHANGED
@@ -1,8 +1,43 @@
|
|
1
1
|
require 'pathname'
|
2
2
|
require_relative 'file_path_and_permissions'
|
3
|
+
require_relative 'source/files_providers/files_from_directory_provider'
|
4
|
+
require_relative 'has_option_methods'
|
3
5
|
|
4
6
|
module Source
|
5
7
|
class Base
|
8
|
+
class Factory
|
9
|
+
include HasOptionMethods
|
10
|
+
attr_reader :directory
|
11
|
+
option_method :include_files,[]
|
12
|
+
def initialize(directory, options = {})
|
13
|
+
@directory = directory
|
14
|
+
@options = options
|
15
|
+
end
|
16
|
+
def create
|
17
|
+
raise "Cannot instantiate source type base."
|
18
|
+
end
|
19
|
+
def files_provider
|
20
|
+
Source::CompositeFilesProvider.new(*files_providers)
|
21
|
+
end
|
22
|
+
GLOB_REGEXP = /(?:\(([^)]+)\))?(.*)/
|
23
|
+
def files_providers
|
24
|
+
base_providers = [Source::FilesFromDirectoryProvider.create_from_directory(File.join(directory, '_package_'), directory)]
|
25
|
+
include_files.each do |include_files_entry|
|
26
|
+
directory, glob = include_files_entry.match(GLOB_REGEXP).to_a[1..-1]
|
27
|
+
directory = File.expand_path(directory || "", self.directory)
|
28
|
+
base_providers << Source::FilesFromDirectoryProvider.create_from_glob(directory ,glob)
|
29
|
+
end
|
30
|
+
base_providers
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
def self.constant_field(name,value)
|
36
|
+
define_method(name) do
|
37
|
+
value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
6
41
|
DEFAULTS = {
|
7
42
|
# Default version is 1.0 in case nobody told us a specific version.
|
8
43
|
:version => "1.0",
|
@@ -26,10 +61,22 @@ module Source
|
|
26
61
|
:description => "no description given"
|
27
62
|
}
|
28
63
|
DEFAULTS.each do |field, default_value|
|
29
|
-
|
30
|
-
default_value
|
31
|
-
end
|
64
|
+
constant_field field, default_value
|
32
65
|
end
|
66
|
+
|
67
|
+
include HasOptionMethods
|
68
|
+
attr_reader :files_provider
|
69
|
+
|
70
|
+
def initialize(files_provider,options={})
|
71
|
+
@options=options
|
72
|
+
@files_provider=files_provider
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
%w(owner group destination build_number).each do |method|
|
77
|
+
option_method method
|
78
|
+
end
|
79
|
+
|
33
80
|
def maintainer
|
34
81
|
# Default maintainer if none given.
|
35
82
|
if @maintainer.nil? or @maintainer.empty?
|
@@ -43,6 +90,7 @@ module Source
|
|
43
90
|
else
|
44
91
|
# TODO(sissel): Maybe support using 'git config' for a default as well?
|
45
92
|
# git config --get user.name, etc can be useful.
|
93
|
+
# Maybe use 'whoami', in case we are not in a git repository?
|
46
94
|
#
|
47
95
|
# Otherwise default to user@currenthost
|
48
96
|
@maintainer = "<#{ENV["USER"]}@#{Socket.gethostname}>"
|
@@ -54,5 +102,13 @@ module Source
|
|
54
102
|
file_name = FilePathAndPermissions.new(file_name) unless file_name.kind_of? FilePathAndPermissions
|
55
103
|
file_contents.include? file_name
|
56
104
|
end
|
105
|
+
|
106
|
+
def file_contents
|
107
|
+
files_provider.nil? ? {} : files_provider.file_contents
|
108
|
+
end
|
109
|
+
|
110
|
+
def files
|
111
|
+
files_provider.files
|
112
|
+
end
|
57
113
|
end
|
58
114
|
end
|
data/lib/gpm/source/bundler.rb
CHANGED
@@ -2,25 +2,28 @@ require_relative 'gem'
|
|
2
2
|
require_relative 'files_providers/files_from_bundler_directory_provider'
|
3
3
|
module Source
|
4
4
|
class Bundler < Source::Gem
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
5
|
+
|
6
|
+
class Factory < Source::Gem::Factory
|
7
|
+
def directory
|
8
|
+
File.absolute_path(File.dirname(gem_file))
|
9
|
+
end
|
10
|
+
def gemspec
|
11
|
+
Dir[File.join(directory,'*.gemspec')].first
|
12
|
+
end
|
13
|
+
def create
|
14
|
+
Source::Bundler.new(metadata, files_provider, options)
|
15
|
+
end
|
16
|
+
def files_providers
|
17
|
+
super + [FilesFromBundlerDirectoryProvider.new(File.expand_path(gem_file), gemspec)]
|
18
|
+
end
|
14
19
|
end
|
15
|
-
|
20
|
+
|
21
|
+
|
16
22
|
def initialize(*args)
|
17
23
|
super
|
18
24
|
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
def dependencies
|
23
|
-
["libc6", "ruby"]
|
24
|
-
end
|
25
|
+
|
26
|
+
constant_field :architecture, "native"
|
27
|
+
constant_field :dependencies, ["libc6", "ruby"]
|
25
28
|
end
|
26
29
|
end
|
@@ -1,23 +1,16 @@
|
|
1
1
|
module Source
|
2
|
-
class CompositeFilesProvider
|
2
|
+
class CompositeFilesProvider < FilesProvider
|
3
3
|
def initialize(*file_providers)
|
4
4
|
@file_providers = file_providers
|
5
5
|
end
|
6
6
|
|
7
|
-
def files
|
8
|
-
@file_providers.inject([]) do |merged, file_provider|
|
9
|
-
files = file_provider.files
|
10
|
-
raise "duplicate filename found in different file providers" unless (merged & files).empty?
|
11
|
-
merged + files
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
7
|
def file_contents
|
16
8
|
@file_providers.inject({}) do |merged, file_provider|
|
17
9
|
contents = file_provider.file_contents
|
18
|
-
|
10
|
+
same_files_with_different_content = (merged.keys & contents.keys).find_all {|f| merged[f] != contents[f]}
|
11
|
+
raise "duplicate filenames with different content found in different file providers: #{same_files_with_different_content}" unless same_files_with_different_content.empty?
|
19
12
|
merged.merge contents
|
20
13
|
end
|
21
14
|
end
|
22
15
|
end
|
23
|
-
end
|
16
|
+
end
|
@@ -1,29 +1,23 @@
|
|
1
|
-
require_relative 'files_from_directory_provider'
|
2
|
-
require_relative 'composite_files_provider'
|
3
|
-
require_relative 'files_from_gem_directory_provider'
|
4
1
|
require_relative 'vendored_gems_installer'
|
5
|
-
require_relative '
|
2
|
+
require_relative 'files_from_directory_provider'
|
6
3
|
require 'bundler'
|
7
4
|
|
8
5
|
module Source
|
9
|
-
class FilesFromBundlerDirectoryProvider <
|
10
|
-
|
6
|
+
class FilesFromBundlerDirectoryProvider < FilesFromDirectoryProvider
|
7
|
+
|
11
8
|
def initialize(gemfile,gemspec,vendored_gems_installer = nil)
|
12
9
|
raise "Must give me a Gemfile, not #{gemfile.inspect}" unless File.basename(gemfile)=="Gemfile"
|
13
|
-
metadata = Source::Gem.read_metadata(gemspec)
|
14
|
-
super(File.dirname(gemfile),metadata.files)
|
15
|
-
@gemfile = gemfile
|
16
|
-
@gemspec = gemspec
|
17
10
|
@vendored_gems_installer = vendored_gems_installer || Source::VendoredGemsInstaller.new(gemfile)
|
18
11
|
@installed = false
|
19
|
-
end
|
20
12
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
13
|
+
super(File.dirname(gemfile), [File.basename(gemfile),File.basename(gemspec),'Gemfile.lock','.bundle/config'])
|
14
|
+
end
|
15
|
+
def files_to_provide
|
16
|
+
bundled_files = nil
|
17
|
+
Dir.chdir(directory) do
|
18
|
+
bundled_files = Dir["vendor/bundle/**/*"]
|
25
19
|
end
|
26
|
-
|
20
|
+
super + bundled_files
|
27
21
|
end
|
28
22
|
|
29
23
|
def file_contents
|
@@ -31,10 +25,7 @@ module Source
|
|
31
25
|
@vendored_gems_installer.install!
|
32
26
|
@installed = true
|
33
27
|
end
|
34
|
-
|
35
|
-
super_contents
|
28
|
+
super
|
36
29
|
end
|
37
|
-
|
38
|
-
|
39
30
|
end
|
40
31
|
end
|
@@ -2,15 +2,30 @@ require_relative 'files_provider'
|
|
2
2
|
|
3
3
|
module Source
|
4
4
|
class FilesFromDirectoryProvider < FilesProvider
|
5
|
-
|
5
|
+
#This is a factory method that constructs a FilesFromDirectoryProvider that
|
6
|
+
#will provide all files below directory but strip their paths such that they
|
7
|
+
#appear as relative to the base_directory
|
8
|
+
def self.create_from_directory(directory=".", base_directory=nil)
|
9
|
+
return create_from_glob(directory, '**/*', base_directory)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.create_from_glob(directory=nil, glob='**/*', base_directory=nil)
|
13
|
+
directory ||= '.'
|
14
|
+
base_directory ||= directory
|
15
|
+
base_path = Pathname.new(base_directory)
|
16
|
+
files = Dir[File.join(directory, glob)].collect {|file| Pathname.new(file).relative_path_from(base_path).to_s }
|
17
|
+
new(base_directory, files)
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_reader :directory, :files_to_provide
|
21
|
+
|
22
|
+
def initialize(directory,files_to_provide)
|
6
23
|
@directory = directory
|
7
|
-
@
|
24
|
+
@files_to_provide = files_to_provide
|
8
25
|
end
|
9
26
|
|
10
27
|
def file_contents
|
11
|
-
|
12
|
-
files = Dir[File.join(@directory, '**', '*')].collect {|file| Pathname.new(file).relative_path_from(base_path).to_s }
|
13
|
-
read_file_contents(files, @base_directory)
|
28
|
+
read_file_contents files_to_provide, directory
|
14
29
|
end
|
15
30
|
end
|
16
31
|
end
|
@@ -22,7 +22,7 @@ module Source
|
|
22
22
|
ENV["BUNDLE_GEMFILE"] = gemfile
|
23
23
|
ENV["PWD"] = directory
|
24
24
|
FileUtils.rm_rf('.bundle')
|
25
|
-
["bundle install","bundle install --deployment --verbose"].each do |c| # --standalone
|
25
|
+
["bundle install","bundle install --deployment --verbose --without development test"].each do |c| # --standalone
|
26
26
|
command_result = `#{c}`
|
27
27
|
raise "#{c.inspect} failed:\n#{command_result}" unless $?.success?
|
28
28
|
end
|
data/lib/gpm/source/gem.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative '../source'
|
2
|
-
require_relative 'files_providers/
|
2
|
+
require_relative 'files_providers/files_from_directory_provider'
|
3
|
+
require_relative 'files_providers/composite_files_provider'
|
3
4
|
require "rubygems/package"
|
4
5
|
require "rubygems"
|
5
6
|
require 'zlib'
|
@@ -51,27 +52,41 @@ class Gem < Base
|
|
51
52
|
metadata
|
52
53
|
end
|
53
54
|
|
54
|
-
|
55
|
-
|
55
|
+
class Factory < Source::Base::Factory
|
56
|
+
attr_reader :gem_file, :options
|
57
|
+
def initialize(gem_file, options = {})
|
58
|
+
super(File.expand_path(File.dirname(gem_file)), options)
|
59
|
+
@gem_file = gem_file
|
60
|
+
end
|
61
|
+
def gemspec
|
62
|
+
@gem_file
|
63
|
+
end
|
64
|
+
def metadata
|
65
|
+
Source::Gem.read_metadata(gemspec)
|
66
|
+
end
|
67
|
+
def create
|
68
|
+
Source::Gem.new(metadata, files_provider, options)
|
69
|
+
end
|
56
70
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
71
|
+
def files_providers
|
72
|
+
fp = nil
|
73
|
+
Dir.chdir(File.dirname(gem_file)) do
|
74
|
+
if gemspec.end_with?('.gem')
|
75
|
+
File.open(gem_file, 'r') do |f|
|
76
|
+
fp = FilesFromGemProvider.new(f.read)
|
77
|
+
end
|
78
|
+
elsif gemspec.end_with?('.gemspec')
|
79
|
+
fp = FilesFromDirectoryProvider.new(directory, metadata.files+[File.basename(gem_file)])
|
62
80
|
end
|
63
|
-
elsif gem_file.end_with?('.gemspec')
|
64
|
-
files_provider = FilesFromGemDirectoryProvider.new(File.expand_path(File.dirname(gem_file)), metadata.files+[File.basename(gem_file)])
|
65
81
|
end
|
82
|
+
super + [fp]
|
66
83
|
end
|
67
|
-
new(metadata, files_provider, options)
|
68
84
|
end
|
69
85
|
|
70
|
-
attr_reader :metadata
|
86
|
+
attr_reader :metadata
|
71
87
|
def initialize(metadata, files_provider = nil, options = {})
|
72
88
|
@metadata = metadata
|
73
|
-
|
74
|
-
@options = options
|
89
|
+
super(files_provider, options)
|
75
90
|
end
|
76
91
|
|
77
92
|
%w(description license summary version).each do |method|
|
@@ -80,11 +95,6 @@ class Gem < Base
|
|
80
95
|
end
|
81
96
|
end
|
82
97
|
|
83
|
-
%w(owner group destination build_number).each do |method|
|
84
|
-
define_method method do
|
85
|
-
@options[method.to_sym]
|
86
|
-
end
|
87
|
-
end
|
88
98
|
{:maintainer => :author, :url => :homepage}.each do |out_field, in_field|
|
89
99
|
define_method out_field do
|
90
100
|
metadata.send(in_field)
|
@@ -96,11 +106,9 @@ class Gem < Base
|
|
96
106
|
"rubygem-#{name_provider.name}"
|
97
107
|
end
|
98
108
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
'Languages/Development/Ruby'
|
103
|
-
end
|
109
|
+
# TODO: this will be different for different
|
110
|
+
# package managers. Need to decide how to handle this.
|
111
|
+
constant_field :category, 'Languages/Development/Ruby'
|
104
112
|
|
105
113
|
def email
|
106
114
|
result = metadata.email
|
@@ -134,11 +142,5 @@ class Gem < Base
|
|
134
142
|
end
|
135
143
|
return dependencies + ["libc6", "ruby"]
|
136
144
|
end
|
137
|
-
def file_contents
|
138
|
-
files_provider.nil? ? {} : files_provider.file_contents
|
139
|
-
end
|
140
|
-
def files
|
141
|
-
files_provider.files
|
142
|
-
end
|
143
145
|
end
|
144
146
|
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require_relative '../has_option_methods'
|
2
|
+
require_relative '../has_directories'
|
3
|
+
require_relative 'files_providers/composite_files_provider'
|
4
|
+
require 'xmlsimple'
|
5
|
+
|
6
|
+
module Source
|
7
|
+
class PomFileReader
|
8
|
+
include HasDirectories
|
9
|
+
include HasOptionMethods
|
10
|
+
def initialize(pomfile,options)
|
11
|
+
@logger = create_logger
|
12
|
+
@options = options
|
13
|
+
@pomfile = pomfile
|
14
|
+
end
|
15
|
+
|
16
|
+
option_method :work_dir
|
17
|
+
|
18
|
+
def read
|
19
|
+
in_directory work_dir do
|
20
|
+
XmlSimple.xml_in(effective_pom)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def raw_pom
|
25
|
+
@pomfile
|
26
|
+
end
|
27
|
+
|
28
|
+
def effective_pom
|
29
|
+
result = tempfile
|
30
|
+
extracted_pom = raw_pom
|
31
|
+
@logger.info "Invoking maven to generate effective POM in : mvn help:effective-pom -Doutput=#{result} -f #{extracted_pom}"
|
32
|
+
mvn_output = `mvn help:effective-pom -Doutput=#{File.join(File.expand_path(Dir.getwd),result)} -f #{extracted_pom}`
|
33
|
+
exit_code = $?
|
34
|
+
unless exit_code.to_i == 0
|
35
|
+
@logger.error "Maven failed with exit status #{exit_code}."
|
36
|
+
@logger.error "Maven output was:\n==========\n#{mvn_output}"
|
37
|
+
raise "Failed to invoke maven to generate effective pom."
|
38
|
+
end
|
39
|
+
result
|
40
|
+
end
|
41
|
+
|
42
|
+
def tempfile
|
43
|
+
"effective_pom.xml"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class Maven < Base
|
48
|
+
class Factory < Source::Base::Factory
|
49
|
+
def initialize(pomfile, options={})
|
50
|
+
@pomfile = File.expand_path(pomfile)
|
51
|
+
@effective_pom_file_reader = effective_pom_file_reader_class.new(@pomfile, options)
|
52
|
+
super(File.dirname(@pomfile),options)
|
53
|
+
end
|
54
|
+
|
55
|
+
def effective_pom_file_reader_class
|
56
|
+
PomFileReader
|
57
|
+
end
|
58
|
+
|
59
|
+
def create
|
60
|
+
Maven.new(files_provider,options,@effective_pom_file_reader)
|
61
|
+
end
|
62
|
+
|
63
|
+
def files_providers
|
64
|
+
super + [FilesFromDirectoryProvider.new(directory, [File.basename(@pomfile)])]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.from_pom(method_name,*path_in_pom)
|
69
|
+
define_method(method_name) do
|
70
|
+
self.class.recursive_lookup(effective_pom,*path_in_pom) || Source::Base::DEFAULTS[method_name]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def initialize(files_provider,options,effective_pom_reader)
|
75
|
+
@effective_pom_reader = effective_pom_reader
|
76
|
+
super(files_provider, options)
|
77
|
+
end
|
78
|
+
|
79
|
+
from_pom :name, "artifactId", 0
|
80
|
+
from_pom :version, "version", 0
|
81
|
+
from_pom :maintainer, "developers", 0, "developer", 0, "name", 0
|
82
|
+
from_pom :email, "developers", 0, "developer", 0, "email", 0
|
83
|
+
from_pom :description, "description", 0
|
84
|
+
from_pom :license, "licenses", 0, "license", 0, "name", 0
|
85
|
+
from_pom :url, "url", 0
|
86
|
+
constant_field :category, "Languages/Development/Java"
|
87
|
+
constant_field :architecture, "all"
|
88
|
+
|
89
|
+
private
|
90
|
+
def effective_pom
|
91
|
+
@effective_pom ||= @effective_pom_reader.read
|
92
|
+
@effective_pom
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.recursive_lookup(target,*path)
|
96
|
+
if path.nil? || path.empty?
|
97
|
+
return target
|
98
|
+
elsif target.respond_to? :[]
|
99
|
+
first,*other=path
|
100
|
+
recursive_lookup(target[first],*other)
|
101
|
+
else
|
102
|
+
nil
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative '../source'
|
2
|
+
require_relative 'maven'
|
3
|
+
|
4
|
+
require 'archive/zip'
|
5
|
+
module Source
|
6
|
+
|
7
|
+
class PomFromWarFileReader < PomFileReader
|
8
|
+
POM_FILE_NAME = %r{^META-INF/maven/.*/pom\.xml$}
|
9
|
+
|
10
|
+
def initialize(warfile,options)
|
11
|
+
super(nil,options)
|
12
|
+
@warfile=warfile
|
13
|
+
end
|
14
|
+
|
15
|
+
def raw_pom
|
16
|
+
@logger.info "Extracting raw pom from #{warfile}..."
|
17
|
+
Archive::Zip.open(warfile) do |f|
|
18
|
+
#inspect war file to find pom.xml
|
19
|
+
pom_file_entries = f.select { |entry| entry.ftype == :file && entry.zip_path =~ POM_FILE_NAME }
|
20
|
+
raise "Wrong number of POM files (#{pom_file_entries.size}):\n #{pom_file_entries.join("\n")}" unless pom_file_entries.size == 1
|
21
|
+
#Write it to temporary file to maven can use it
|
22
|
+
extract_target = Tempfile.new("from_pom", work_dir).path
|
23
|
+
pom_file_entries.first.extract(:file_path => extract_target)
|
24
|
+
#Return the name of the temporary file
|
25
|
+
extract_target
|
26
|
+
end
|
27
|
+
end
|
28
|
+
private
|
29
|
+
attr_reader :warfile
|
30
|
+
end
|
31
|
+
|
32
|
+
module War
|
33
|
+
class Factory < Source::Base::Factory
|
34
|
+
def initialize(warfile, options={})
|
35
|
+
@warfile = File.expand_path(warfile)
|
36
|
+
@effective_pom_file_reader = effective_pom_file_reader_class.new(@warfile, options)
|
37
|
+
super(File.dirname(@warfile),options)
|
38
|
+
end
|
39
|
+
|
40
|
+
def effective_pom_file_reader_class
|
41
|
+
PomFromWarFileReader
|
42
|
+
end
|
43
|
+
|
44
|
+
def create
|
45
|
+
Maven.new(files_provider,options,@effective_pom_file_reader)
|
46
|
+
end
|
47
|
+
|
48
|
+
def files_providers
|
49
|
+
super + [FilesFromDirectoryProvider.new(directory, [File.basename(@warfile)])]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/gpm/target.rb
CHANGED
@@ -4,12 +4,17 @@ require 'logger'
|
|
4
4
|
require 'active_support/core_ext/array'
|
5
5
|
require 'active_support/core_ext/class'
|
6
6
|
require_relative 'file_path_and_permissions'
|
7
|
+
require_relative 'has_directories'
|
8
|
+
require_relative 'has_option_methods'
|
7
9
|
|
8
10
|
require_relative 'target/generate_from_templates'
|
9
11
|
require_relative 'target/zip_directories'
|
10
12
|
require_relative 'io_helpers'
|
11
13
|
module Target
|
12
14
|
class Base
|
15
|
+
include HasDirectories
|
16
|
+
include HasOptionMethods
|
17
|
+
|
13
18
|
PHASES = [:file_creation, :packaging]
|
14
19
|
def self.phase_steps_names
|
15
20
|
PHASES.collect {|p| field_name_for_steps p }
|
@@ -44,7 +49,7 @@ module Target
|
|
44
49
|
def create_package(source)
|
45
50
|
@origin_dir = Dir.getwd
|
46
51
|
FileUtils.mkdir_p package_dir
|
47
|
-
|
52
|
+
in_directory package_dir do
|
48
53
|
self.class.phase_steps_names.each do |phase_name|
|
49
54
|
steps_for_phase = self.class.send(phase_name)
|
50
55
|
steps_for_phase.each do |step, description|
|
data/lib/gpm/target/deb.rb
CHANGED
@@ -45,19 +45,21 @@ class Target::Deb < Target::Base
|
|
45
45
|
end
|
46
46
|
def clean_package_name(name)
|
47
47
|
if name =~ /[A-Z]/
|
48
|
-
@logger.
|
48
|
+
@logger.info("Debian tools (dpkg/apt) don't do well with packages " \
|
49
49
|
"that use capital letters in the name. In some cases it will " \
|
50
50
|
"automatically downcase them, in others it will not. It is confusing." \
|
51
51
|
"Best to not use any capital letters at all.")
|
52
52
|
name = name.downcase
|
53
53
|
end
|
54
54
|
|
55
|
-
|
56
|
-
|
55
|
+
to_dash = /[._\s]/
|
56
|
+
if name =~ (to_dash)
|
57
|
+
@logger.info("Package name '#{name}' includes strange characters, (underscores or whitespace, e.g.) converting" \
|
57
58
|
" to dashes")
|
58
|
-
name = name.gsub(
|
59
|
+
name = name.gsub(to_dash, "-")
|
59
60
|
end
|
60
61
|
|
62
|
+
|
61
63
|
return name
|
62
64
|
end
|
63
65
|
def architecture
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative 'step_plugin'
|
2
2
|
require_relative '../file_path_and_permissions'
|
3
|
+
require 'zlib'
|
3
4
|
module GenerateFromTemplates
|
4
5
|
include StepPlugin
|
5
6
|
def self.included(base)
|
@@ -50,7 +51,7 @@ module GenerateFromTemplates
|
|
50
51
|
contents = template.result(source.instance_eval{ binding() })
|
51
52
|
if file.end_with?(".gz")
|
52
53
|
zipped = ""
|
53
|
-
gz = Zlib::GzipWriter.new(StringIO.new(zipped))
|
54
|
+
gz = ::Zlib::GzipWriter.new(StringIO.new(zipped))
|
54
55
|
gz.write contents
|
55
56
|
gz.close
|
56
57
|
contents = zipped
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Package: <%= name %>
|
2
2
|
Version: <%= "#{epoch}:" if epoch %><%= version %><%= build_number && '-b'+build_number.to_s %>
|
3
3
|
Architecture: <%= architecture %>
|
4
|
-
Maintainer: <%= maintainer
|
4
|
+
Maintainer: <%= maintainer.to_s.empty? ? "unknown" : maintainer %><%= email.to_s.empty? ? " <unknown@unknown.com>" : " <#{email}>" %>
|
5
5
|
<% if !dependencies.empty? -%>
|
6
6
|
<% properdeps = dependencies.collect { |d| fix_dependency(d) }.flatten -%>
|
7
7
|
Depends: <%= properdeps.flatten.join(", ") %>
|
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gpm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
|
-
-
|
8
|
+
- crealytics GmbH
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-10-07 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
16
|
-
requirement: &
|
16
|
+
requirement: &70850580 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70850580
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: thor
|
27
|
-
requirement: &
|
27
|
+
requirement: &70850210 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.14.6
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70850210
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: activesupport
|
38
|
-
requirement: &
|
38
|
+
requirement: &70849950 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,32 @@ dependencies:
|
|
43
43
|
version: 3.1.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70849950
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: xml-simple
|
49
|
+
requirement: &70849700 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.1.0
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70849700
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: archive-zip
|
60
|
+
requirement: &70849460 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 0.4.0
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70849460
|
47
69
|
- !ruby/object:Gem::Dependency
|
48
70
|
name: i18n
|
49
|
-
requirement: &
|
71
|
+
requirement: &70835610 !ruby/object:Gem::Requirement
|
50
72
|
none: false
|
51
73
|
requirements:
|
52
74
|
- - ! '>='
|
@@ -54,10 +76,10 @@ dependencies:
|
|
54
76
|
version: '0'
|
55
77
|
type: :runtime
|
56
78
|
prerelease: false
|
57
|
-
version_requirements: *
|
79
|
+
version_requirements: *70835610
|
58
80
|
- !ruby/object:Gem::Dependency
|
59
81
|
name: cucumber
|
60
|
-
requirement: &
|
82
|
+
requirement: &70835320 !ruby/object:Gem::Requirement
|
61
83
|
none: false
|
62
84
|
requirements:
|
63
85
|
- - ~>
|
@@ -65,10 +87,10 @@ dependencies:
|
|
65
87
|
version: 1.0.2
|
66
88
|
type: :development
|
67
89
|
prerelease: false
|
68
|
-
version_requirements: *
|
90
|
+
version_requirements: *70835320
|
69
91
|
- !ruby/object:Gem::Dependency
|
70
92
|
name: aruba
|
71
|
-
requirement: &
|
93
|
+
requirement: &70835050 !ruby/object:Gem::Requirement
|
72
94
|
none: false
|
73
95
|
requirements:
|
74
96
|
- - ~>
|
@@ -76,10 +98,10 @@ dependencies:
|
|
76
98
|
version: 0.4.3
|
77
99
|
type: :development
|
78
100
|
prerelease: false
|
79
|
-
version_requirements: *
|
101
|
+
version_requirements: *70835050
|
80
102
|
- !ruby/object:Gem::Dependency
|
81
103
|
name: guard
|
82
|
-
requirement: &
|
104
|
+
requirement: &70834760 !ruby/object:Gem::Requirement
|
83
105
|
none: false
|
84
106
|
requirements:
|
85
107
|
- - ~>
|
@@ -87,10 +109,10 @@ dependencies:
|
|
87
109
|
version: 0.7.0
|
88
110
|
type: :development
|
89
111
|
prerelease: false
|
90
|
-
version_requirements: *
|
112
|
+
version_requirements: *70834760
|
91
113
|
- !ruby/object:Gem::Dependency
|
92
114
|
name: guard-cucumber
|
93
|
-
requirement: &
|
115
|
+
requirement: &70834470 !ruby/object:Gem::Requirement
|
94
116
|
none: false
|
95
117
|
requirements:
|
96
118
|
- - ~>
|
@@ -98,10 +120,10 @@ dependencies:
|
|
98
120
|
version: 0.6.3
|
99
121
|
type: :development
|
100
122
|
prerelease: false
|
101
|
-
version_requirements: *
|
123
|
+
version_requirements: *70834470
|
102
124
|
- !ruby/object:Gem::Dependency
|
103
125
|
name: guard-bundler
|
104
|
-
requirement: &
|
126
|
+
requirement: &70834170 !ruby/object:Gem::Requirement
|
105
127
|
none: false
|
106
128
|
requirements:
|
107
129
|
- - ~>
|
@@ -109,10 +131,10 @@ dependencies:
|
|
109
131
|
version: 0.1.3
|
110
132
|
type: :development
|
111
133
|
prerelease: false
|
112
|
-
version_requirements: *
|
134
|
+
version_requirements: *70834170
|
113
135
|
- !ruby/object:Gem::Dependency
|
114
136
|
name: guard-rspec
|
115
|
-
requirement: &
|
137
|
+
requirement: &70833840 !ruby/object:Gem::Requirement
|
116
138
|
none: false
|
117
139
|
requirements:
|
118
140
|
- - ~>
|
@@ -120,10 +142,10 @@ dependencies:
|
|
120
142
|
version: 0.4.5
|
121
143
|
type: :development
|
122
144
|
prerelease: false
|
123
|
-
version_requirements: *
|
145
|
+
version_requirements: *70833840
|
124
146
|
- !ruby/object:Gem::Dependency
|
125
147
|
name: fakefs
|
126
|
-
requirement: &
|
148
|
+
requirement: &70833470 !ruby/object:Gem::Requirement
|
127
149
|
none: false
|
128
150
|
requirements:
|
129
151
|
- - ~>
|
@@ -131,10 +153,10 @@ dependencies:
|
|
131
153
|
version: 0.4.0
|
132
154
|
type: :development
|
133
155
|
prerelease: false
|
134
|
-
version_requirements: *
|
156
|
+
version_requirements: *70833470
|
135
157
|
- !ruby/object:Gem::Dependency
|
136
158
|
name: simplecov
|
137
|
-
requirement: &
|
159
|
+
requirement: &70833180 !ruby/object:Gem::Requirement
|
138
160
|
none: false
|
139
161
|
requirements:
|
140
162
|
- - ~>
|
@@ -142,19 +164,20 @@ dependencies:
|
|
142
164
|
version: 0.4.2
|
143
165
|
type: :development
|
144
166
|
prerelease: false
|
145
|
-
version_requirements: *
|
167
|
+
version_requirements: *70833180
|
146
168
|
description: Convert directories, rpms, python eggs, rubygems, and more to rpms, debs,
|
147
169
|
solaris packages and more. Win at package management without wasting pointless hours
|
148
170
|
debugging bad rpm specs!
|
149
|
-
email:
|
171
|
+
email: info@crealytics.de
|
150
172
|
executables:
|
151
173
|
- gpm
|
152
174
|
extensions: []
|
153
175
|
extra_rdoc_files: []
|
154
176
|
files:
|
155
177
|
- lib/gpm/cli.rb
|
178
|
+
- lib/gpm/source/war.rb
|
179
|
+
- lib/gpm/source/maven.rb
|
156
180
|
- lib/gpm/source/files_providers/composite_files_provider.rb
|
157
|
-
- lib/gpm/source/files_providers/files_from_gem_directory_provider.rb
|
158
181
|
- lib/gpm/source/files_providers/overrides_permissions.rb
|
159
182
|
- lib/gpm/source/files_providers/vendored_gems_installer.rb
|
160
183
|
- lib/gpm/source/files_providers/files_from_bundler_directory_provider.rb
|
@@ -165,7 +188,9 @@ files:
|
|
165
188
|
- lib/gpm/packaging_task.rb
|
166
189
|
- lib/gpm/gpm_logging.rb
|
167
190
|
- lib/gpm/file_path_and_permissions.rb
|
191
|
+
- lib/gpm/has_option_methods.rb
|
168
192
|
- lib/gpm/target.rb
|
193
|
+
- lib/gpm/has_directories.rb
|
169
194
|
- lib/gpm/source.rb
|
170
195
|
- lib/gpm/io_helpers.rb
|
171
196
|
- lib/gpm/target/generate_from_templates.rb
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require_relative 'files_provider'
|
2
|
-
module Source
|
3
|
-
class FilesFromGemDirectoryProvider < FilesProvider
|
4
|
-
attr_reader :directory
|
5
|
-
def initialize(directory,files)
|
6
|
-
@directory = directory
|
7
|
-
@files = files
|
8
|
-
end
|
9
|
-
def file_contents
|
10
|
-
read_file_contents @files, @directory
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|