gpm 0.1.9 → 0.3.0
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.
- 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
|