gpm 0.0.1

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 ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+
4
+ require "rubygems"
5
+ $: << File.join(File.dirname(__FILE__), "..", "lib")
6
+ require "gpm/cli"
7
+
8
+ GpmCli.start
@@ -0,0 +1,23 @@
1
+ require 'thor'
2
+ require_relative 'packaging_task'
3
+ class GpmCli < Thor
4
+
5
+ # gpm package -s <source type> -t <target type> [options]
6
+ desc "package APP_DIRECTORY_OR_FILE", "package the given app"
7
+ method_option :source, :type => :string, :aliases => "-s"
8
+ method_option :target, :type => :string, :aliases => "-t"
9
+ method_option :workdir, :type => :string, :aliases => "-wd"
10
+ method_option :destination, :type => :string, :aliases => "-d"
11
+
12
+ def package(file_or_directory)
13
+ raise "Only gem or bundler source at the moment" unless ["gem","bundler"].include? options.source
14
+ raise "Only deb target at the moment" unless options.target == "deb"
15
+ package_options = {}
16
+ {:workdir => :work_dir , :destination => :destination}.each do |in_field, out_field|
17
+ package_options[out_field] = options[in_field] if options[in_field]
18
+ end
19
+
20
+ PackagingTask.create(file_or_directory, options.source, options.target, package_options).run
21
+ end
22
+
23
+ end
@@ -0,0 +1,19 @@
1
+ class FilePathAndPermissions < Delegator
2
+ attr_reader :permissions
3
+ def initialize(path, permissions = "0444")
4
+ @path = path
5
+ @permissions = permissions
6
+ end
7
+
8
+ def to_s
9
+ @path
10
+ end
11
+
12
+ def __getobj__
13
+ @path
14
+ end
15
+
16
+ def __setobj__(path)
17
+ @path = path
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ class PackagingTask
2
+ def self.create(file_or_directory, source_name, target_name, options = {})
3
+ options[:work_dir] ||= Dir.mktmpdir
4
+ require_relative "source"
5
+ require_relative "source/#{source_name}"
6
+ source_class = Kernel.const_get("Source").const_get(source_name.capitalize)
7
+ source = source_class.create(file_or_directory)
8
+
9
+ require_relative "target"
10
+ require_relative "target/#{target_name}"
11
+ target_class = Kernel.const_get("Target").const_get(target_name.capitalize)
12
+ target = target_class.new(options[:work_dir], options)
13
+ new(source,target)
14
+ end
15
+
16
+ def initialize(source,target)
17
+ @source = source
18
+ @target = target
19
+ end
20
+
21
+ def run
22
+ @target.create_package(@source)
23
+ end
24
+
25
+ end
@@ -0,0 +1,55 @@
1
+ module Source
2
+ class Base
3
+ DEFAULTS = {
4
+ # Default version is 1.0 in case nobody told us a specific version.
5
+ :version => "1.0",
6
+ :iteration => nil,
7
+ :epoch => nil,
8
+ # If architecture is nil, the target package should provide a default.
9
+ # Special 'architecture' values include "all" (aka rpm's noarch, debian's all)
10
+ # Another special includes "native" which will be the current platform's arch.
11
+ :architecture => nil,
12
+ :dependencies => [],
13
+ :provides => [],
14
+ :replaces => [],
15
+ :conflicts => [],
16
+ :scripts => [],
17
+ :config_files => [],
18
+ :settings => {},
19
+ :url => "http://nourlgiven.example.com/no/url/given",
20
+ :category => "default",
21
+ :license => "unknown",
22
+ :maintainer => nil,
23
+ :description => "no description given"
24
+ }
25
+ DEFAULTS.each do |field, default_value|
26
+ define_method field do
27
+ default_value
28
+ end
29
+ end
30
+ def maintainer
31
+ # Default maintainer if none given.
32
+ if @maintainer.nil? or @maintainer.empty?
33
+ # Reference
34
+ # http://www.debian.org/doc/manuals/maint-guide/first.en.html
35
+ # http://wiki.debian.org/DeveloperConfiguration
36
+ # https://github.com/jordansissel/fpm/issues/37
37
+ if ENV.include?("DEBEMAIL") and ENV.include?("DEBFULLNAME")
38
+ # Use DEBEMAIL and DEBFULLNAME as the default maintainer if available.
39
+ @maintainer = "#{ENV["DEBFULLNAME"]} <#{ENV["DEBEMAIL"]}>"
40
+ else
41
+ # TODO(sissel): Maybe support using 'git config' for a default as well?
42
+ # git config --get user.name, etc can be useful.
43
+ #
44
+ # Otherwise default to user@currenthost
45
+ @maintainer = "<#{ENV["USER"]}@#{Socket.gethostname}>"
46
+ end
47
+ end
48
+ end
49
+ end
50
+ class FilesProvider
51
+ def files
52
+ file_contents.keys
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,55 @@
1
+ require_relative 'gem'
2
+ require 'bundler'
3
+
4
+
5
+ class Source::Bundler < Source::Gem
6
+
7
+ class FilesFromBundlerDirectoryProvider < Source::Gem::FilesFromGemDirectoryProvider
8
+
9
+ attr_reader :gemfile,:gemspec
10
+ def initialize(gemfile,gemspec)
11
+ super(File.dirname(gemfile),Source::Gem.read_metadata(gemspec).files)
12
+ @gemfile = gemfile
13
+ @gemspec = gemspec
14
+ end
15
+ def file_contents
16
+ backup_fields = ["PATH","GEM_PATH"]
17
+ bundled_files = []
18
+ directory = File.dirname(@gemfile)
19
+ old_env = ENV.to_hash
20
+ Dir.chdir(directory) do
21
+ Bundler.with_clean_env do
22
+ old_env.each {|k,_| ENV.delete k}
23
+ ENV["BUNDLE_GEMFILE"] = @gemfile
24
+ ENV["PWD"] = directory
25
+ backup_fields.each {|f| ENV[f] = old_env[f]}
26
+ FileUtils.rm_rf('.bundle')
27
+ ["bundle install","bundle install --deployment --verbose"].each do |c| # --standalone
28
+ puts c,`#{c}`
29
+ end
30
+ end
31
+ bundled_files = Dir["vendor/bundle/**/*"]
32
+ end
33
+ old_env.each {|k,v| ENV[k] = v}
34
+ super_contents = super.merge(read_file_contents(bundled_files+[File.basename(gemfile),File.basename(gemspec),'Gemfile.lock'], directory))
35
+ super_contents
36
+ end
37
+ end
38
+
39
+ def self.create(gemfile)
40
+ gemspec = Dir[File.join(File.dirname(gemfile),'*.gemspec')].first
41
+ metadata = read_metadata(gemspec)
42
+
43
+ new(metadata,FilesFromBundlerDirectoryProvider.new(File.expand_path(gemfile), gemspec))
44
+ end
45
+
46
+ def initialize(*args)
47
+ super
48
+ end
49
+ def architecture
50
+ "native"
51
+ end
52
+ def dependencies
53
+ ["libc6"]
54
+ end
55
+ end
@@ -0,0 +1,143 @@
1
+ require_relative '../source'
2
+ require "rubygems/package"
3
+ require "rubygems"
4
+ require 'zlib'
5
+
6
+ class Source::Gem < Source::Base
7
+ class FilesFromGemProvider < Source::FilesProvider
8
+ def initialize(contents)
9
+ @gem_file_contents = contents
10
+ end
11
+ def file_contents
12
+ return {} unless @gem_file_contents
13
+ tar_files = tar_files(StringIO.new(@gem_file_contents))
14
+ reader = Zlib::GzipReader.new(StringIO.new(tar_files["data.tar.gz"]))
15
+ contents = tar_files(reader)
16
+ reader.close
17
+ contents
18
+ end
19
+ def tar_files(io)
20
+ tar_reader = Gem::Package::TarReader.new(io)
21
+ tar_files = {}
22
+ tar_reader.each do |entry|
23
+ tar_files[entry.full_name] = entry.read
24
+ end
25
+ tar_reader.close
26
+ tar_files
27
+ end
28
+ end
29
+
30
+ class FilesFromGemDirectoryProvider < Source::FilesProvider
31
+ attr_reader :directory
32
+ def initialize(directory,files)
33
+ @directory = directory
34
+ @files = files
35
+ end
36
+ def file_contents
37
+ read_file_contents @files, @directory
38
+ end
39
+ def read_file_contents(files,base_directory)
40
+ file_contents = {}
41
+ files.each do |f|
42
+ path = File.join(base_directory,f)
43
+ file_contents[f] = File.read(path) if File.file?(path)
44
+ end
45
+ file_contents
46
+ end
47
+ end
48
+
49
+ def self.read_metadata(gem_file)
50
+ metadata = nil
51
+
52
+ Dir.chdir(File.dirname(gem_file)) do
53
+ if gem_file.end_with?('.gem')
54
+ contents = nil
55
+ File.open(gem_file, 'r') do |f|
56
+ ::Gem::Package.open(f, 'r') do |gem|
57
+ metadata = gem.metadata
58
+ end
59
+ end
60
+ elsif gem_file.end_with?('.gemspec')
61
+ metadata = Gem::Specification.load(gem_file)
62
+ end
63
+ end
64
+ metadata
65
+ end
66
+
67
+ def self.create(gem_file)
68
+ metadata = self.read_metadata(gem_file)
69
+
70
+ files_provider = nil
71
+ Dir.chdir(File.dirname(gem_file)) do
72
+ if gem_file.end_with?('.gem')
73
+ File.open(gem_file, 'r') do |f|
74
+ files_provider = FilesFromGemProvider.new(f.read)
75
+ end
76
+ elsif gem_file.end_with?('.gemspec')
77
+ files_provider = FilesFromGemDirectoryProvider.new(File.expand_path(File.dirname(gem_file)), metadata.files+[File.basename(gem_file)])
78
+ end
79
+ end
80
+ new(metadata, files_provider)
81
+ end
82
+
83
+ attr_reader :metadata, :files_provider
84
+ def initialize(metadata, files_provider = nil)
85
+ @metadata = metadata
86
+ @files_provider = files_provider
87
+ end
88
+
89
+ %w(description license summary version email).each do |method|
90
+ define_method method do
91
+ metadata.send(method)
92
+ end
93
+ end
94
+ {:maintainer => :author, :url => :homepage}.each do |out_field, in_field|
95
+ define_method out_field do
96
+ metadata.send(in_field)
97
+ end
98
+ end
99
+
100
+ def name(name_provider=nil)
101
+ name_provider ||= metadata
102
+ "rubygem-#{name_provider.name}"
103
+ end
104
+
105
+ def category
106
+ # TODO: this will be different for different
107
+ # package managers. Need to decide how to handle this.
108
+ 'Languages/Development/Ruby'
109
+ end
110
+
111
+ def architecture
112
+ # if the gemspec has extensions defined, then this should be a 'native' arch.
113
+ if !metadata.extensions.empty?
114
+ "native"
115
+ else
116
+ "all"
117
+ end
118
+ end
119
+
120
+ def dependencies
121
+ dependencies = []
122
+ metadata.runtime_dependencies.map do |dep|
123
+ # rubygems 1.3.5 doesn't have 'Gem::Dependency#requirement'
124
+ if dep.respond_to?(:requirement)
125
+ reqs = dep.requirement.to_s.gsub(/,/, '')
126
+ else
127
+ reqs = dep.version_requirements
128
+ end
129
+
130
+ # Some reqs can be ">= a, < b" versions, let's handle that.
131
+ reqs.to_s.split(/, */).each do |req|
132
+ dependencies << "#{name(dep)} #{req}"
133
+ end
134
+ end
135
+ dependencies
136
+ 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
+ end
@@ -0,0 +1,88 @@
1
+ require 'tmpdir'
2
+ require 'fileutils'
3
+ require 'logger'
4
+ require 'active_support/core_ext/array'
5
+ require 'active_support/core_ext/class'
6
+ require_relative 'file_path_and_permissions'
7
+
8
+ require_relative 'target/generate_from_templates'
9
+ require_relative 'target/zip_directories'
10
+ module Target
11
+ class Base
12
+ PHASES = [:file_creation, :packaging]
13
+ def self.phase_steps_names
14
+ PHASES.collect {|p| field_name_for_steps p }
15
+ end
16
+ def self.field_name_for_steps(phase)
17
+ "#{phase}_steps".to_sym
18
+ end
19
+ def self.steps_for_phase(phase)
20
+ self.send(field_name_for_steps(phase))
21
+ end
22
+ class_inheritable_array *phase_steps_names
23
+ phase_steps_names.each {|p| self.send("#{p}=".to_sym,[])}
24
+
25
+ include GenerateFromTemplates
26
+ include ZipDirectories
27
+ attr_reader :work_dir, :options
28
+ def initialize(work_dir, options = {})
29
+ @work_dir = work_dir
30
+ @logger = ::Logger.new(STDERR)
31
+ @options = options
32
+ end
33
+
34
+ def type
35
+ self.class.name.downcase.gsub("target::","")
36
+ end
37
+
38
+ def package_dir
39
+ File.join(work_dir,'package_files')
40
+ end
41
+
42
+ def create_package(source)
43
+ @origin_dir = Dir.getwd
44
+ FileUtils.mkdir_p package_dir
45
+ ::Dir.chdir(package_dir) do
46
+ self.class.phase_steps_names.each do |steps|
47
+ self.class.send(steps).each do |step|
48
+ instance_exec *([source][0,step.parameters.size]), &step
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ def write_file_contents(file_contents)
55
+ file_contents.each do |file_name, content|
56
+ FileUtils.mkdir_p(File.dirname(file_name))
57
+ File.open(file_name,"w") do |file|
58
+ file.print content
59
+ end
60
+ File.chmod(file_name.permissions, file_name.to_s) if file_name.is_a? FilePathAndPermissions
61
+ end
62
+ end
63
+
64
+ def write_file_contents_in_directory(file_contents,directory)
65
+ FileUtils.mkdir_p directory
66
+ Dir.chdir(directory) do
67
+ write_file_contents(file_contents)
68
+ end
69
+ end
70
+
71
+ def tar_directory(directory, options = {})
72
+ FileUtils.mkdir_p(directory)
73
+ ::Dir.chdir(directory) do
74
+ tar(File.join('..',directory.gsub('.dir','')),[''], options)
75
+ end
76
+ end
77
+
78
+ def tar(output, files, options={})
79
+ exec("tar -zcf #{output} #{files.map{ |f| "./#{f}" }.join(" ")} "+options.collect {|k,v| "--#{k}=#{v}"}.join(" "))
80
+ end
81
+
82
+ def exec(*args)
83
+ puts args.join(" ")
84
+ success = system(*args)
85
+ puts "#{args.join(" ")} did not complete successfully!" unless success
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,131 @@
1
+ require_relative '../target'
2
+ require 'erb'
3
+ require 'delegate'
4
+ require_relative 'step_plugin'
5
+
6
+ class Target::Deb < Target::Base
7
+ include StepPlugin
8
+ class DebianSourceWrapper < Delegator
9
+ def initialize(source)
10
+ super
11
+ @delegate_sd_obj = source || raise("nil source")
12
+ @logger = ::Logger.new(STDERR)
13
+ end
14
+
15
+ def __getobj__
16
+ @delegate_sd_obj # return object we are delegating to, required
17
+ end
18
+
19
+ def __setobj__(source)
20
+ @delegate_sd_obj = source # change delegation object, a feature we're providing
21
+ end
22
+
23
+ def name
24
+ clean_package_name(__getobj__.name)
25
+ end
26
+ def clean_package_name(name)
27
+ if name =~ /[A-Z]/
28
+ @logger.warn("Debian tools (dpkg/apt) don't do well with packages " \
29
+ "that use capital letters in the name. In some cases it will " \
30
+ "automatically downcase them, in others it will not. It is confusing." \
31
+ "Best to not use any capital letters at all.")
32
+ name = name.downcase
33
+ end
34
+
35
+ if name.include?("_")
36
+ @logger.info("Package name '#{name}' includes underscores, converting" \
37
+ " to dashes")
38
+ name = name.gsub(/[_]/, "-")
39
+ end
40
+
41
+ return name
42
+ end
43
+ def architecture
44
+ architecture = __getobj__.architecture
45
+ if architecture.nil? or architecture == "native"
46
+ # Default architecture should be 'native' which we'll need
47
+ # to ask the system about.
48
+ arch = %x{dpkg --print-architecture}.chomp
49
+ if $?.exitstatus != 0
50
+ arch = %x{uname -m}.chomp
51
+ @logger.warn("Can't find 'dpkg' tool (need it to get default " \
52
+ "architecture!). Please specificy --architecture " \
53
+ "specifically. (Defaulting now to #{arch})")
54
+ end
55
+ arch
56
+ elsif architecture == "x86_64"
57
+ # Debian calls x86_64 "amd64"
58
+ "amd64"
59
+ else
60
+ architecture
61
+ end
62
+ end # def architecture
63
+
64
+ def default_output
65
+ name_and_version = "#{name}_#{version}"
66
+ architecture_and_type = "#{architecture}.#{type}"
67
+ if iteration
68
+ "#{name_and_version}-#{iteration}_#{architecture_and_type}"
69
+ else
70
+ "#{name_and_version}_#{architecture_and_type}"
71
+ end
72
+ end # def default_output
73
+ def fix_dependency(dep)
74
+ if dep =~ /[\(,\|]/
75
+ # Don't "fix" ones that could appear well formed already.
76
+ else
77
+ da = dep.split(/ +/)
78
+ if da.size > 1
79
+ # Convert strings 'foo >= bar' to 'foo (>= bar)'
80
+ dep = "#{da[0]} (#{da[1]} #{da[2]})"
81
+ end
82
+ end
83
+
84
+ name_re = /^[^ \(]+/
85
+ name = dep[name_re]
86
+ name = clean_package_name(name)
87
+
88
+
89
+ # Convert gem ~> X.Y.Z to '>= X.Y.Z' and << X.Y+1.0
90
+ if dep =~ /\(~>/
91
+ name, version = dep.gsub(/[()~>]/, "").split(/ +/)[0..1]
92
+ nextversion = version.split(".").collect { |v| v.to_i }
93
+ l = nextversion.length
94
+ nextversion[l-2] += 1
95
+ nextversion[l-1] = 0
96
+ nextversion = nextversion.join(".")
97
+ return ["#{name} (>= #{version})", "#{name} (<< #{nextversion})"]
98
+ # ignore iterations for = dependencies if flag specified
99
+ elsif (m = dep.match(/(\S+)\s+\(= (.+)\)/)) && self.settings[:ignore_iteration]
100
+ name, version = m[1..2]
101
+ nextversion = version.split('.').collect { |v| v.to_i }
102
+ nextversion[-1] += 1
103
+ nextversion = nextversion.join(".")
104
+ return ["#{name} (>= #{version})", "#{name} (<< #{nextversion})"]
105
+ else
106
+ return dep
107
+ end
108
+ end
109
+ def type
110
+ "deb"
111
+ end
112
+ end
113
+
114
+ def all_binaries
115
+ Dir["**/*.so"]
116
+ end
117
+
118
+ in_phase(:file_creation) { exec("strip --strip-unneeded #{all_binaries.join(' ')}") unless all_binaries.empty? }
119
+ in_phase(:file_creation) { exec("chrpath --delete #{all_binaries.join(' ')}") unless all_binaries.empty? }
120
+ in_phase(:packaging) {|source| exec("ar -qc ../#{source.default_output} debian-binary control.tar.gz data.tar.gz") }
121
+ in_phase(:packaging) {|source| FileUtils.cp("../#{source.default_output}",@origin_dir) }
122
+
123
+ def create_package(source)
124
+ super(DebianSourceWrapper.new(source))
125
+ end
126
+ def write_files_to_package_dir(source)
127
+ super
128
+ write_file_contents_in_directory source.file_contents, File.join("data.tar.gz.dir",options[:destination] || "")
129
+ end
130
+
131
+ end
@@ -0,0 +1,56 @@
1
+ require_relative 'step_plugin'
2
+ require_relative '../file_path_and_permissions'
3
+ module GenerateFromTemplates
4
+ include StepPlugin
5
+ in_phase(:file_creation) { |source| write_files_to_package_dir(source) }
6
+
7
+ def template_paths
8
+ @template_paths ||= Dir["#{template_dir}/**/*.erb"]
9
+ end
10
+
11
+ def template_dir
12
+ File.expand_path("../../../templates/#{type}/", File.dirname(__FILE__))
13
+ end
14
+
15
+ def template_files
16
+ template_paths.map {|tp| tp.gsub(/#{template_dir}\//,"")}
17
+ end
18
+
19
+ def templates
20
+ Hash[*template_paths.map {|file| FilePathAndPermissions.new(file.gsub(/#{template_dir}\//,"").gsub(".erb",""),File.new(file).lstat.mode)}.zip(template_paths.map do |template_file|
21
+ tpl = File.read(template_file)
22
+ ::ERB.new(tpl, nil, "-")
23
+ end).flatten]
24
+ end
25
+
26
+ def file_contents_from_templates(source)
27
+ Hash[*templates.map {|file,template| [packaged_file_name(file,source),file_content(template, source, file)]}.flatten]
28
+ end
29
+
30
+ def write_files_to_package_dir(source)
31
+ write_file_contents_in_directory file_contents_from_templates(source), '.'
32
+ end
33
+
34
+ REPLACEMENT_REGEXP = /__(\w+)__/
35
+ def packaged_file_name(file_name,source)
36
+ to_replace = file_name.scan(REPLACEMENT_REGEXP).flatten
37
+ to_replace.each do |replace|
38
+ file_name = file_name.gsub("__#{replace}__",source.send(replace.to_sym))
39
+ end
40
+ file_name
41
+ end
42
+
43
+ def file_content(template, source, file)
44
+ contents = template.result(source.instance_eval{ binding() })
45
+ basename = File.basename(file)
46
+ if file.end_with?(".gz")
47
+ zipped = ""
48
+ gz = Zlib::GzipWriter.new(StringIO.new(zipped))
49
+ gz.write contents
50
+ gz.close
51
+ contents = zipped
52
+ end
53
+ contents
54
+ end
55
+
56
+ end
@@ -0,0 +1,22 @@
1
+ module StepPlugin
2
+ def self.included(base)
3
+ if base.is_a? Class
4
+ def base.in_phase(phase, &block)
5
+ self.steps_for_phase(phase) << block
6
+ end
7
+ elsif base.is_a? Module
8
+ def base.in_phase(phase, &block)
9
+ @phase_blocks||= {}
10
+ @phase_blocks[phase] ||= []
11
+ @phase_blocks[phase] << block
12
+ end
13
+ def base.included(clazz)
14
+ @phase_blocks.each do |phase, blocks|
15
+ blocks.each do |block|
16
+ clazz.steps_for_phase(phase) << block
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'step_plugin'
2
+ module ZipDirectories
3
+ include StepPlugin
4
+ in_phase(:packaging) do
5
+ Dir["*.tar.gz.dir"].each do |tar_gz_dir|
6
+ tar_directory(tar_gz_dir, :group=>"root",:owner=>"root")
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,28 @@
1
+ Package: <%= name %>
2
+ Version: <%= "#{epoch}:" if epoch %><%= version %><%= iteration && '-'+iteration.to_s %>
3
+ Architecture: <%= architecture %>
4
+ Maintainer: <%= maintainer or "<unknown>" %><%= " <#{email}>".gsub(" <>","") %>
5
+ <% if !dependencies.empty? -%>
6
+ <% properdeps = dependencies.collect { |d| fix_dependency(d) }.flatten -%>
7
+ Depends: <%= properdeps.flatten.join(", ") %>
8
+ <% end -%>
9
+ <% if !conflicts.empty? -%>
10
+ Conflicts: <%= conflicts.join(", ") %>
11
+ <% end -%>
12
+ <% if !provides.empty? -%>
13
+ Provides: <%= provides.join(", ") %>
14
+ <% end -%>
15
+ <% if !replaces.empty? -%>
16
+ <% properrepl = replaces.collect { |d| fix_dependency(d) }.flatten -%>
17
+ Replaces: <%= properrepl.flatten.join(", ") %>
18
+ <% end -%>
19
+ Standards-Version: 3.9.1
20
+ Section: <%= category or "unknown" %>
21
+ Priority: extra
22
+ Homepage: <%= url or "http://nourlgiven.example.com/" %>
23
+ <% lines = (description or "no description given").split("\n") -%>
24
+ <% firstline, *remainder = lines -%>
25
+ Description: <%= firstline %>
26
+ <% if remainder.any? -%>
27
+ <%= remainder.collect { |l| l =~ /^ *$/ ? " ." : " #{l}" }.join("\n") %>
28
+ <% end -%>
@@ -0,0 +1 @@
1
+ <%= name %> (<%= version %>) unstable; urgency=low
@@ -0,0 +1 @@
1
+ 2.0
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gpm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Martin Mauch
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-08-16 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json
16
+ requirement: &76126640 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *76126640
25
+ - !ruby/object:Gem::Dependency
26
+ name: thor
27
+ requirement: &76124890 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 0.14.6
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *76124890
36
+ - !ruby/object:Gem::Dependency
37
+ name: activesupport
38
+ requirement: &76124160 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *76124160
47
+ - !ruby/object:Gem::Dependency
48
+ name: i18n
49
+ requirement: &76115690 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *76115690
58
+ - !ruby/object:Gem::Dependency
59
+ name: cucumber
60
+ requirement: &76115270 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: 1.0.2
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *76115270
69
+ - !ruby/object:Gem::Dependency
70
+ name: aruba
71
+ requirement: &76114730 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: 0.4.3
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *76114730
80
+ - !ruby/object:Gem::Dependency
81
+ name: guard
82
+ requirement: &76114270 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: 0.5.1
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *76114270
91
+ - !ruby/object:Gem::Dependency
92
+ name: guard-cucumber
93
+ requirement: &76113790 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ~>
97
+ - !ruby/object:Gem::Version
98
+ version: 0.5.2
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *76113790
102
+ - !ruby/object:Gem::Dependency
103
+ name: guard-bundler
104
+ requirement: &76113160 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 0.1.3
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *76113160
113
+ - !ruby/object:Gem::Dependency
114
+ name: guard-rspec
115
+ requirement: &76112590 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ~>
119
+ - !ruby/object:Gem::Version
120
+ version: 0.4.0
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: *76112590
124
+ description: Convert directories, rpms, python eggs, rubygems, and more to rpms, debs,
125
+ solaris packages and more. Win at package management without wasting pointless hours
126
+ debugging bad rpm specs!
127
+ email: mauch@crealytics.de
128
+ executables:
129
+ - gpm
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - lib/gpm/cli.rb
134
+ - lib/gpm/source/bundler.rb
135
+ - lib/gpm/source/gem.rb
136
+ - lib/gpm/packaging_task.rb
137
+ - lib/gpm/file_path_and_permissions.rb
138
+ - lib/gpm/target.rb
139
+ - lib/gpm/source.rb
140
+ - lib/gpm/target/generate_from_templates.rb
141
+ - lib/gpm/target/deb.rb
142
+ - lib/gpm/target/zip_directories.rb
143
+ - lib/gpm/target/step_plugin.rb
144
+ - bin/gpm
145
+ - templates/deb/data.tar.gz.dir/usr/share/doc/__name__/copyright.erb
146
+ - templates/deb/data.tar.gz.dir/usr/share/doc/__name__/changelog.gz.erb
147
+ - templates/deb/control.tar.gz.dir/md5sums.erb
148
+ - templates/deb/control.tar.gz.dir/control.erb
149
+ - templates/deb/debian-binary.erb
150
+ homepage: https://github.com/crealytics/gpm
151
+ licenses: []
152
+ post_install_message:
153
+ rdoc_options: []
154
+ require_paths:
155
+ - lib
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ none: false
159
+ requirements:
160
+ - - ! '>='
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ required_rubygems_version: !ruby/object:Gem::Requirement
164
+ none: false
165
+ requirements:
166
+ - - ! '>='
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ requirements: []
170
+ rubyforge_project:
171
+ rubygems_version: 1.8.7
172
+ signing_key:
173
+ specification_version: 3
174
+ summary: gpm - Grand Package Manager
175
+ test_files: []