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 CHANGED
@@ -2,7 +2,7 @@
2
2
  #
3
3
 
4
4
  require "rubygems"
5
- $: << File.join(File.dirname(__FILE__), "..", "lib")
5
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
6
6
  require "gpm/cli"
7
7
 
8
8
  GpmCli.start
@@ -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 gem or bundler source at the moment" unless self.class.supported_sources.include? options.source
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,7 @@
1
+ module HasDirectories
2
+ def in_directory(directory_identifier)
3
+ ::Dir.chdir(directory_identifier) do
4
+ yield
5
+ end
6
+ end
7
+ end
@@ -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
@@ -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
@@ -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
- Kernel.const_get("Source").const_get(source_name.capitalize)
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
- Kernel.const_get("Target").const_get(target_name.capitalize)
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.create(file_or_directory, options)
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)
@@ -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
- define_method field do
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
@@ -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
- def self.create(gemfile, options = {})
6
- directory = File.absolute_path(File.dirname(gemfile))
7
- gemspec = Dir[File.join(directory,'*.gemspec')].first
8
- metadata = read_metadata(gemspec)
9
-
10
- bundler_provider = FilesFromBundlerDirectoryProvider.new(File.expand_path(gemfile), gemspec)
11
- package_path = File.join(directory, '_package_')
12
- package_scripts_provider = Source::FilesFromDirectoryProvider.new(package_path, directory)
13
- new(metadata, Source::CompositeFilesProvider.new(bundler_provider, package_scripts_provider), options)
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
- def architecture
20
- "native"
21
- end
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
- raise "duplicate filename found in different file providers: #{(merged.keys & contents.keys)}" unless (merged.keys & contents.keys).empty?
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 '../gem'
2
+ require_relative 'files_from_directory_provider'
6
3
  require 'bundler'
7
4
 
8
5
  module Source
9
- class FilesFromBundlerDirectoryProvider < FilesFromGemDirectoryProvider
10
- attr_reader :gemfile,:gemspec
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
- def bundled_files
22
- files = nil
23
- Dir.chdir(File.dirname(@gemfile)) do
24
- files = Dir["vendor/bundle/**/*"]
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
- files
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
- super_contents = super.merge(read_file_contents(bundled_files+[File.basename(gemfile),File.basename(gemspec),'Gemfile.lock','.bundle/config'], directory))
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
- def initialize(directory=".", base_directory=nil)
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
- @base_directory = base_directory || directory
24
+ @files_to_provide = files_to_provide
8
25
  end
9
26
 
10
27
  def file_contents
11
- base_path = Pathname.new(@base_directory)
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
@@ -1,5 +1,6 @@
1
1
  require_relative '../source'
2
- require_relative 'files_providers/files_from_gem_directory_provider'
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
- def self.create(gem_file, options = {})
55
- metadata = self.read_metadata(gem_file)
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
- files_provider = nil
58
- Dir.chdir(File.dirname(gem_file)) do
59
- if gem_file.end_with?('.gem')
60
- File.open(gem_file, 'r') do |f|
61
- files_provider = FilesFromGemProvider.new(f.read)
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, :files_provider
86
+ attr_reader :metadata
71
87
  def initialize(metadata, files_provider = nil, options = {})
72
88
  @metadata = metadata
73
- @files_provider = files_provider
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
- def category
100
- # TODO: this will be different for different
101
- # package managers. Need to decide how to handle this.
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
@@ -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
- ::Dir.chdir(package_dir) do
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|
@@ -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.warn("Debian tools (dpkg/apt) don't do well with packages " \
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
- if name.include?("_")
56
- @logger.debug("Package name '#{name}' includes underscores, converting" \
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 or "<unknown>" %><%= " <#{email}>".gsub(" <>","") %>
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.1.9
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
- - Martin Mauch
8
+ - crealytics GmbH
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-21 00:00:00.000000000Z
12
+ date: 2011-10-07 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
16
- requirement: &73079020 !ruby/object:Gem::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: *73079020
24
+ version_requirements: *70850580
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: thor
27
- requirement: &73078640 !ruby/object:Gem::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: *73078640
35
+ version_requirements: *70850210
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: activesupport
38
- requirement: &73078380 !ruby/object:Gem::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: *73078380
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: &73078180 !ruby/object:Gem::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: *73078180
79
+ version_requirements: *70835610
58
80
  - !ruby/object:Gem::Dependency
59
81
  name: cucumber
60
- requirement: &73077900 !ruby/object:Gem::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: *73077900
90
+ version_requirements: *70835320
69
91
  - !ruby/object:Gem::Dependency
70
92
  name: aruba
71
- requirement: &73077650 !ruby/object:Gem::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: *73077650
101
+ version_requirements: *70835050
80
102
  - !ruby/object:Gem::Dependency
81
103
  name: guard
82
- requirement: &73077420 !ruby/object:Gem::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: *73077420
112
+ version_requirements: *70834760
91
113
  - !ruby/object:Gem::Dependency
92
114
  name: guard-cucumber
93
- requirement: &73077180 !ruby/object:Gem::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: *73077180
123
+ version_requirements: *70834470
102
124
  - !ruby/object:Gem::Dependency
103
125
  name: guard-bundler
104
- requirement: &73076950 !ruby/object:Gem::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: *73076950
134
+ version_requirements: *70834170
113
135
  - !ruby/object:Gem::Dependency
114
136
  name: guard-rspec
115
- requirement: &73076710 !ruby/object:Gem::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: *73076710
145
+ version_requirements: *70833840
124
146
  - !ruby/object:Gem::Dependency
125
147
  name: fakefs
126
- requirement: &73076480 !ruby/object:Gem::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: *73076480
156
+ version_requirements: *70833470
135
157
  - !ruby/object:Gem::Dependency
136
158
  name: simplecov
137
- requirement: &73076230 !ruby/object:Gem::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: *73076230
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: mauch@crealytics.de
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