fpm 0.2.35 → 0.3.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/lib/fpm.rb CHANGED
@@ -5,6 +5,7 @@ require "fpm/package"
5
5
  require "fpm/target/deb"
6
6
  require "fpm/target/rpm"
7
7
  require "fpm/target/solaris"
8
+ require "fpm/target/puppet"
8
9
 
9
10
  require "fpm/source"
10
11
  require "fpm/source/dir"
@@ -1,4 +1,6 @@
1
- require 'fileutils'
1
+ require "fileutils"
2
+ require "pathname"
3
+
2
4
  class FPM::Builder
3
5
  # where is the package's root?
4
6
  def root
@@ -27,6 +29,9 @@ class FPM::Builder
27
29
  attr_reader :source
28
30
 
29
31
  def initialize(settings, paths=[])
32
+ @logger = Logger.new(STDERR)
33
+ @logger.level = $DEBUG ? Logger::DEBUG : Logger::WARN
34
+
30
35
  @working_dir = Dir.pwd
31
36
  root = settings.chdir || '.'
32
37
  paths = ['.'] if paths.empty?
@@ -84,6 +89,21 @@ class FPM::Builder
84
89
  ::Dir.chdir root do
85
90
  @source.make_tarball!(tar_path, builddir)
86
91
 
92
+ # Hack to unpack before generating the spec, etc.
93
+ # Need to formalize this feature.
94
+ # Perhaps something like @package.prepare
95
+ if @package.respond_to?(:unpack_data_to)
96
+ data_tarball = File.join(builddir, "data.tar.gz")
97
+ Dir.chdir(builddir) do
98
+ FileUtils.mkdir_p(@package.unpack_data_to)
99
+ system("gzip -d #{data_tarball}")
100
+ Dir.chdir(@package.unpack_data_to) do
101
+ @source.root = Dir.pwd
102
+ system("tar -xf #{data_tarball.gsub(/\.gz$/, "")}")
103
+ end
104
+ end
105
+ end
106
+
87
107
  generate_md5sums if @package.needs_md5sums
88
108
  generate_specfile
89
109
  edit_specfile if @edit
@@ -118,23 +138,29 @@ class FPM::Builder
118
138
  # TODO: [Jay] make this better.
119
139
  private
120
140
  def package_class_for(type)
121
- type = FPM::Target::constants.find { |c| c.downcase.to_s == type }
122
- if !type
141
+ realtype = FPM::Target.constants.find { |c| c.downcase.to_s == type }
142
+ if !realtype
143
+ valid_types = FPM::Target.constants.collect { |c| c.downcase }
144
+ @logger.fatal("No such package target type #{type.inspect}; " \
145
+ "Valid types: #{valid_types.join(", ")}")
123
146
  raise ArgumentError, "unknown package type #{type.inspect}"
124
147
  end
125
148
 
126
- return FPM::Target.const_get(type)
149
+ return FPM::Target.const_get(realtype)
127
150
  end
128
151
 
129
152
  # TODO: [Jay] make this better.
130
153
  private
131
154
  def source_class_for(type)
132
- type = FPM::Source::constants.find { |c| c.downcase.to_s == type }
133
- if !type
155
+ realtype = FPM::Source::constants.find { |c| c.downcase.to_s == type }
156
+ if !realtype
157
+ valid_types = FPM::Source.constants.collect { |c| c.downcase }
158
+ @logger.fatal("No such package source type #{type.inspect}; " \
159
+ "Valid types: #{valid_types.join(", ")}")
134
160
  raise ArgumentError, "unknown package type #{type.inspect}"
135
161
  end
136
162
 
137
- return FPM::Source.const_get(type)
163
+ return FPM::Source.const_get(realtype)
138
164
  end
139
165
 
140
166
  private
@@ -145,13 +171,13 @@ class FPM::Builder
145
171
 
146
172
  private
147
173
  def generate_specfile
148
- File.open(@package.specfile(builddir), "w") do |f|
149
- f.puts @package.render_spec
150
- end
174
+ @package.generate_specfile(builddir)
151
175
  end
152
176
 
153
177
  private
154
178
  def edit_specfile
179
+ # TODO(sissel): support editing multiple files for targets like
180
+ # puppet which generate multiple manifests.
155
181
  editor = ENV['FPM_EDITOR'] || ENV['EDITOR'] || 'vi'
156
182
  system("#{editor} '#{package.specfile(builddir)}'")
157
183
  unless File.size? package.specfile(builddir)
@@ -1,6 +1,7 @@
1
1
  require "fpm/namespace"
2
2
  require "socket" # for Socket.gethostname
3
3
  require "logger"
4
+ require "find" # for Find.find (directory walking)
4
5
 
5
6
  class FPM::Package
6
7
  # The name of this package
@@ -61,6 +62,7 @@ class FPM::Package
61
62
  def initialize(source)
62
63
  @source = source
63
64
  @logger = Logger.new(STDERR)
65
+ @logger.level = $DEBUG ? Logger::DEBUG : Logger::WARN
64
66
 
65
67
  @name = source[:name] # || fail
66
68
 
@@ -106,40 +108,41 @@ class FPM::Package
106
108
  @scripts = source[:scripts]
107
109
  end # def initialize
108
110
 
109
- def generate_specfile(builddir, paths)
110
- spec = template.result(binding)
111
- File.open(specfile(builddir), "w") { |f| f.puts spec }
112
- end # def generate_specfile
113
-
114
111
  # nobody needs md5sums by default.
115
112
  def needs_md5sums
116
113
  false
117
114
  end # def needs_md5sums
118
115
 
119
- #def generate_md5sums(builddir, paths)
120
- #md5sums = self.checksum(paths)
121
- #File.open("#{builddir}/md5sums", "w") { |f| f.puts md5sums }
122
- #md5sums
123
- #end # def generate_md5sums
124
-
125
116
  # TODO [Jay]: make this better...?
126
117
  def type
127
118
  self.class.name.split(':').last.downcase
128
119
  end # def type
129
120
 
130
- def template
131
- @template ||= begin
132
- tpl = File.read(
133
- "#{FPM::DIRS[:templates]}/#{type}.erb"
134
- )
135
- ERB.new(tpl, nil, "<>")
136
- end
121
+ def template(path=nil)
122
+ path ||= "#{type}.erb"
123
+ @logger.info("Reading template: #{path}")
124
+ tpl = File.read("#{FPM::DIRS[:templates]}/#{path}")
125
+ return ERB.new(tpl, nil, "-")
137
126
  end # def template
138
127
 
139
128
  def render_spec
129
+ # find all files in paths given.
130
+ paths = []
131
+ @source.paths.each do |path|
132
+ Find.find(path) { |p| paths << p }
133
+ end
134
+ #@logger.info(:paths => paths.sort)
140
135
  template.result(binding)
141
136
  end # def render_spec
142
137
 
138
+ # Default specfile generator just makes one specfile, whatever that is for
139
+ # this package.
140
+ def generate_specfile(builddir)
141
+ File.open(specfile(builddir), "w") do |f|
142
+ f.puts render_spec
143
+ end
144
+ end # def generate_specfile
145
+
143
146
  def default_output
144
147
  if iteration
145
148
  "#{name}-#{version}-#{iteration}.#{architecture}.#{type}"
@@ -147,4 +150,17 @@ class FPM::Package
147
150
  "#{name}-#{version}.#{architecture}.#{type}"
148
151
  end
149
152
  end # def default_output
150
- end
153
+
154
+ def fixpath(path)
155
+ if path.first != "/"
156
+ path = File.join(@source.root, path)
157
+ end
158
+ return path if File.symlink?(path)
159
+ @logger.info(:fixpath => path)
160
+ realpath = Pathname.new(path).realpath.to_s
161
+ re = Regexp.new("^#{Regexp.escape(@source.root)}")
162
+ realpath.gsub!(re, "")
163
+ @logger.info(:fixpath_result => realpath)
164
+ return realpath
165
+ end # def fixpath
166
+ end # class FPM::Package
@@ -23,8 +23,12 @@ class FPM::Source
23
23
  end
24
24
 
25
25
  attr_reader :paths
26
- attr_reader :root
26
+ attr_accessor :root
27
+
27
28
  def initialize(paths, root, params={})
29
+ @logger = Logger.new(STDERR)
30
+ @logger.level = $DEBUG ? Logger::DEBUG : Logger::WARN
31
+
28
32
  @paths = paths
29
33
  @root = root
30
34
 
@@ -2,18 +2,17 @@ require "fpm/source"
2
2
 
3
3
  class FPM::Source::RPM < FPM::Source
4
4
  def get_metadata
5
- self[:name] = %x{rpm -q --qf '%{name}' -p #{@paths.first}}
5
+ @rpm = @paths.first
6
+ self[:name] = %x{rpm -q --qf '%{name}' -p #{@rpm}}.chomp
6
7
 
7
- self[:version] = %x{rpm -q --qf '%{version}' -p #{@paths.first}}
8
- self[:iteration] = %x{rpm -q --qf '%{release}' -p #{@paths.first}}
9
- self[:summary] = %x{rpm -q --qf '%{summary}' -p #{@paths.first}}
10
- #self[:description] = %x{rpm -q --qf '%{description}' -p #{@paths.first}}
11
- self[:dependencies] = %x{rpm -qRp #{@paths.first}}.split("\n")\
8
+ self[:version] = %x{rpm -q --qf '%{version}' -p #{@rpm}}.chomp
9
+ self[:iteration] = %x{rpm -q --qf '%{release}' -p #{@rpm}}.chomp
10
+ self[:summary] = %x{rpm -q --qf '%{summary}' -p #{@rpm}}.chomp
11
+ #self[:description] = %x{rpm -q --qf '%{description}' -p #{@rpm}}
12
+ self[:dependencies] = %x{rpm -qRp #{@rpm}}.split("\n")\
12
13
  .collect { |line| line.strip }
13
14
 
14
- @rpm = @paths.first
15
- @paths = %x{rpm -qlp #{@paths.first}}.split("\n")
16
-
15
+ @paths = %x{rpm -qlp #{@rpm}}.split("\n")
17
16
  end
18
17
 
19
18
  def make_tarball!(tar_path, builddir)
@@ -21,7 +20,7 @@ class FPM::Source::RPM < FPM::Source
21
20
  ::Dir.mkdir(tmpdir)
22
21
  system("rpm2cpio #{@rpm} | (cd #{tmpdir}; cpio -i --make-directories)")
23
22
  tar(tar_path, ".", tmpdir)
24
-
23
+ @paths = ["."]
25
24
  # TODO(sissel): Make a helper method.
26
25
  system(*["gzip", "-f", tar_path])
27
26
  end
@@ -14,7 +14,7 @@ class FPM::Target::Deb < FPM::Package
14
14
  # to ask the system about.
15
15
  arch = %x{dpkg --print-architecture}.chomp
16
16
  if $?.exitstatus != 0
17
- arch = %x{uname -m}
17
+ arch = %x{uname -m}.chomp
18
18
  @logger.warn("Can't find 'dpkg' tool (need it to get default " \
19
19
  "architecture!). Please specificy --architecture " \
20
20
  "specifically. (Defaulting now to #{arch})")
@@ -104,6 +104,14 @@ class FPM::Target::Deb < FPM::Package
104
104
  dep = "#{da[0]} (#{da[1]} #{da[2]})"
105
105
  end
106
106
 
107
+ name_re = /^[^ \(]+/
108
+ name = dep[name_re]
109
+ if name =~ /[A-Z]/
110
+ @logger.warn("Downcasing dependnecy '#{name}' because deb packages " \
111
+ " don't work so good with uppercase names")
112
+ dep.gsub!(name_re) { |n| n.downcase }
113
+ end
114
+
107
115
  # Convert gem ~> X.Y.Z to '>= X.Y.Z' and << X.Y+1.0
108
116
  if dep =~ /\(~>/
109
117
  name, version = dep.gsub(/[()~>]/, "").split(/ +/)[0..1]
@@ -116,5 +124,5 @@ class FPM::Target::Deb < FPM::Package
116
124
  return dep
117
125
  end
118
126
  end # def fix_dependency
119
- end # class FPM::Deb
127
+ end # class FPM::Target::Deb
120
128
 
@@ -0,0 +1,122 @@
1
+ require "erb"
2
+ require "fpm/namespace"
3
+ require "fpm/package"
4
+ require "fpm/errors"
5
+ require "etc"
6
+ require "ftools"
7
+
8
+ # TODO(sissel): Add dependency checking support.
9
+ # IIRC this has to be done as a 'checkinstall' step.
10
+ class FPM::Target::Puppet < FPM::Package
11
+ def architecture
12
+ case @architecture
13
+ when nil, "native"
14
+ @architecture = %x{uname -m}.chomp
15
+ end
16
+ return @architecture
17
+ end # def architecture
18
+
19
+ # Default specfile generator just makes one specfile, whatever that is for
20
+ # this package.
21
+ def generate_specfile(builddir)
22
+ paths = []
23
+ @logger.info("PWD: #{File.join(builddir, unpack_data_to)}")
24
+ fileroot = File.join(builddir, unpack_data_to)
25
+ Dir.chdir(fileroot) do
26
+ Find.find(".") do |p|
27
+ next if p == "."
28
+ paths << p
29
+ end
30
+ end
31
+ @logger.info(paths[-1])
32
+ manifests = %w{package.pp package/remove.pp}
33
+
34
+ ::Dir.mkdir(File.join(builddir, "manifests"))
35
+ manifests.each do |manifest|
36
+ dir = File.join(builddir, "manifests", File.dirname(manifest))
37
+ @logger.info("manifests targeting: #{dir}")
38
+ ::Dir.mkdir(dir) if !File.directory?(dir)
39
+
40
+ File.open(File.join(builddir, "manifests", manifest), "w") do |f|
41
+ @logger.info("manifest: #{f.path}")
42
+ template = template(File.join("puppet", "#{manifest}.erb"))
43
+ ::Dir.chdir(fileroot) do
44
+ f.puts template.result(binding)
45
+ end
46
+ end
47
+ end
48
+ end # def generate_specfile
49
+
50
+ def unpack_data_to
51
+ "files"
52
+ end
53
+
54
+ def build!(params)
55
+ # TODO(sissel): Support these somehow, perhaps with execs and files.
56
+ self.scripts.each do |name, path|
57
+ case name
58
+ when "pre-install"
59
+ when "post-install"
60
+ when "pre-uninstall"
61
+ when "post-uninstall"
62
+ end # case name
63
+ end # self.scripts.each
64
+
65
+ if File.exists?(params[:output])
66
+ # TODO(sissel): Allow folks to choose output?
67
+ @logger.error("Puppet module directory '#{params[:output]}' already " \
68
+ "exists. Delete it or choose another output (-p flag)")
69
+ end
70
+
71
+ ::Dir.mkdir(params[:output])
72
+ builddir = ::Dir.pwd
73
+
74
+ # Copy 'files' from builddir to :output/files
75
+ Find.find("files", "manifests") do |path|
76
+ @logger.info("Copying path: #{path}")
77
+ if File.directory?(path)
78
+ ::Dir.mkdir(File.join(params[:output], path))
79
+ else
80
+ File.copy(path, File.join(params[:output], path))
81
+ end
82
+ end
83
+ end # def build!
84
+
85
+ # The directory we create should just be the name of the package as the
86
+ # module name
87
+ def default_output
88
+ name
89
+ end # def default_output
90
+
91
+ # This method is used by the puppet manifest template
92
+ def puppetsort(hash)
93
+ # TODO(sissel): Implement sorting that follows the puppet style guide
94
+ # Such as, 'ensure' goes first, etc.
95
+ return hash.to_a
96
+ end # def puppetsort
97
+
98
+ # Helper for user lookup
99
+ def uid2user(uid)
100
+ begin
101
+ pwent = Etc.getpwuid(uid)
102
+ return pwent.name
103
+ rescue ArgumentError => e
104
+ # Invalid user id? No user? Return the uid.
105
+ @logger.warn("Failed to find username for uid #{uid}")
106
+ return uid.to_s
107
+ end
108
+ end # def uid2user
109
+
110
+ # Helper for group lookup
111
+ def gid2group(gid)
112
+ begin
113
+ grent = Etc.getgrgid(gid)
114
+ return grent.name
115
+ rescue ArgumentError => e
116
+ # Invalid user id? No user? Return the uid.
117
+ @logger.warn("Failed to find group for gid #{gid}")
118
+ return gid.to_s
119
+ end
120
+ end # def uid2user
121
+ end # class FPM::Target::Puppet
122
+
@@ -45,6 +45,5 @@ class FPM::Target::Rpm < FPM::Package
45
45
  # This should only output one rpm, should we verify this?
46
46
  system("mv", path, params[:output])
47
47
  end
48
-
49
- end
50
- end
48
+ end # def build!
49
+ end # class FPM::Target::RPM
@@ -2,20 +2,26 @@ Package: <%= name %>
2
2
  Version: <%= "#{epoch}:" if epoch %><%= version %><%= iteration && '-'+iteration.to_s %>
3
3
  Architecture: <%= architecture %>
4
4
  Maintainer: <%= maintainer or "<unknown>" %>
5
- <% if !dependencies.empty? %>
6
- <% properdeps = dependencies.collect { |d| fix_dependency(d) }.flatten %>
5
+ <% if !dependencies.empty? -%>
6
+ <% properdeps = dependencies.collect { |d| fix_dependency(d) }.flatten -%>
7
7
  Depends: <%= properdeps.flatten.join(", ") %>
8
- <% end %>
9
- <% if !provides.empty? %>
10
- Provides: <%= provides.join(", ") %>
11
- <% end %>
12
- <% if !replaces.empty? %>
13
- <% properrepl = replaces.collect { |d| fix_dependency(d) }.flatten %>
8
+ <% end -%>
9
+ <% if !provides.empty? -%>
10
+ Provides: <%= provides.join(", ") -%>
11
+ <% end -%>
12
+ <% if !replaces.empty? -%>
13
+ <% properrepl = replaces.collect { |d| fix_dependency(d) }.flatten -%>
14
14
  Replaces: <%= properrepl.flatten.join(", ") %>
15
- <% end %>
15
+ <% end -%>
16
16
  Standards-Version: 3.9.1
17
17
  Section: <%= category or "unknown" %>
18
18
  Priority: extra
19
19
  Homepage: <%= url or "http://nourlgiven.example.com/" %>
20
- Description: <%= description or "no description given" %>
20
+ Description: <%= name %> (FPM-generated package)
21
+ <% max_len = 74 -%>
22
+ <% if description -%>
23
+ <%= description.gsub(/^$/, ".").gsub(/(.{1,#{max_len}})( +|$)\n?|(.{#{max_len}})/," \\1\\3\n") %>
24
+ <% else -%>
25
+ <%= "no description given" %>
26
+ <% end -%>
21
27
 
@@ -0,0 +1,34 @@
1
+ # TODO(sissel): implement 'anti' class for this package.
2
+ class <%= name %>::package {
3
+ $version = "<%= version %>"
4
+ $iteration = "<%= iteration %>"
5
+
6
+ file {
7
+ <% paths.each do |path|
8
+ stat = File.lstat(path)
9
+ params = {}
10
+ if stat.directory?
11
+ params[:ensure] = "directory"
12
+ elsif stat.symlink?
13
+ params[:ensure] = "link"
14
+ params[:target] = File.readlink(path)
15
+ stat = File.stat(path)
16
+ else
17
+ params[:ensure] = "file"
18
+ params[:source] = "puppet:///modules/#{name}/#{path}"
19
+ end
20
+
21
+ if params[:ensure] != "link"
22
+ params[:owner] = uid2user(stat.uid)
23
+ params[:group] = gid2group(stat.gid)
24
+ params[:mode] = sprintf("%04o", stat.mode & 0777)
25
+ end
26
+
27
+ settings = puppetsort(params).collect { |k,v| "#{k} => \"#{v}\"" }.join(",\n ")
28
+ -%>
29
+ # <%= stat.inspect %>
30
+ "<%= fixpath(path) %>":
31
+ <%= settings %>;
32
+ <% end # paths.each -%>
33
+ }
34
+ }
@@ -0,0 +1,13 @@
1
+ class <%= name %>::package::remove {
2
+ $version = "<%= version %>"
3
+ $iteration = "<%= iteration %>"
4
+
5
+ fail("DO NOT USE THIS. IT IS NOT WELL DEFINED YET.")
6
+
7
+ file {
8
+ <% paths.each do |path| -%>
9
+ "<%= fixpath(path) %>":
10
+ ensure => absent;
11
+ <% end # paths.each -%>
12
+ }
13
+ }
@@ -1,10 +1,10 @@
1
1
  Name: <%= name %>
2
2
  Version: <%= version %>
3
- <% if epoch %>
3
+ <% if epoch -%>
4
4
  Epoch: <%= epoch %>
5
- <% end %>
5
+ <% end -%>
6
6
  Release: <%= iteration or 1 %>
7
- <%# use the first line of the description as the summary %>
7
+ <%# use the first line of the description as the summary -%>
8
8
  Summary: <%= description.split("\n").first %>
9
9
  BuildArch: <%= architecture %>
10
10
  AutoReqProv: no
@@ -13,13 +13,13 @@ Group: <%= category %>
13
13
  <%#
14
14
  TODO: [Jay] rpms require a license
15
15
  let's detect it intelligently
16
- %>
16
+ -%>
17
17
  License: <%= license %>
18
18
  URL: <%= url or "http://nourlgiven.example.com/" %>
19
19
  Source0: %{_sourcedir}/data.tar.gz
20
20
  BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
21
21
 
22
- <% if !dependencies.empty? %>
22
+ <% if !dependencies.empty? -%>
23
23
  <%
24
24
  properdeps = dependencies.collect do |d|
25
25
  # Convert gem ~> X.Y.Z to '>= X.Y.Z' and < X.Y+1.0
@@ -40,18 +40,17 @@ BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
40
40
  d
41
41
  end
42
42
  end
43
- %>Requires: <%= properdeps.join(", ") %>
44
- <% end %>
45
- <% provides.each do |prov| %>
43
+ -%>Requires: <%= properdeps.join(", ") %>
44
+ <% end -%>
45
+ <% provides.each do |prov| -%>
46
46
  Provides: <%= prov %>
47
- <% end %>
48
- <%# The closes equivalent in RPM to "replaces" is "Obsoletes" %>
49
- <% replaces.each do |repl| %>
47
+ <% end -%>
48
+ <% replaces.each do |repl| -%>
49
+ <%# The closes equivalent in RPM to "replaces" is "Obsoletes" -%>
50
50
  Obsoletes: <%= repl %>
51
- <% end %>
52
-
51
+ <% end -%>
53
52
  <%# rpm rejects descriptions with blank lines (even between content), so hack
54
- around it by replacing blank lines with ' .' %>
53
+ around it by replacing blank lines with ' .' -%>
55
54
  %description
56
55
  <%= description.gsub(/^\s*$/, " .") %>
57
56
 
@@ -62,7 +61,7 @@ Obsoletes: <%= repl %>
62
61
  # some rpm implementations delete the build dir and then recreate it by
63
62
  # default, for some reason. Whatever, let's work around it.
64
63
  cd $RPM_BUILD_ROOT
65
- tar -zvxf %SOURCE0
64
+ tar -zxf %SOURCE0
66
65
 
67
66
  %install
68
67
  #noop
@@ -70,30 +69,30 @@ tar -zvxf %SOURCE0
70
69
  %clean
71
70
  rm -rf $RPM_BUILD_ROOT
72
71
 
73
- <% if scripts["pre-install"] %>
72
+ <% if scripts["pre-install"] -%>
74
73
  %pre
75
74
  <%= File.read(scripts["pre-install"]) %>
76
- <% end %>
77
75
 
78
- <% if scripts["post-install"] %>
76
+ <% end -%>
77
+ <% if scripts["post-install"] -%>
79
78
  %post
80
79
  <%= File.read(scripts["post-install"]) %>
81
- <% end %>
82
80
 
83
- <% if scripts["pre-uninstall"] %>
81
+ <% end -%>
82
+ <% if scripts["pre-uninstall"] -%>
84
83
  %preun
85
84
  <%= File.read(scripts["pre-uninstall"]) %>
86
- <% end %>
87
85
 
88
- <% if scripts["post-uninstall"] %>
86
+ <% end -%>
87
+ <% if scripts["post-uninstall"] -%>
89
88
  %postun
90
89
  <%= File.read(scripts["post-uninstall"]) %>
91
- <% end %>
92
90
 
91
+ <% end -%>
93
92
  %files
94
93
  %defattr(-,root,root,-)
95
- <%# Trim leading '.' from paths if they are './blah...' %>
96
- <%# Also ensure paths start with '/' %>
94
+ <%# Trim leading '.' from paths if they are './blah...' -%>
95
+ <%# Also ensure paths start with '/' -%>
97
96
  <%= @source.paths.collect { |p| p.gsub(/^\.\//, "/").gsub(/^[^\/]/, "/\\0") }.join("\n") %>
98
97
 
99
98
  %changelog
@@ -7,9 +7,9 @@ NAME=<%= name %>
7
7
  ARCH=<%= architecture %>
8
8
  VERSION=<%= version %><%= iteration && "-" + iteration.to_s %>
9
9
  CATEGORY=application
10
- <%# pkginfo(4) says DESC is max 256 characters %>
10
+ <%# pkginfo(4) says DESC is max 256 characters -%>
11
11
  DESC=<%= description.split("\n").first[0..255] or "no description given" %>
12
12
  VENDOR=<%= maintainer %>
13
- <%# Take maintainer of "Foo <bar@baz.com>" and use "bar@baz.com" %>
13
+ <%# Take maintainer of "Foo <bar@baz.com>" and use "bar@baz.com" -%>
14
14
  EMAIL=<%= maintainer[/<.+>/].gsub(/[<>]/, "") %>
15
15
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fpm
3
3
  version: !ruby/object:Gem::Version
4
- hash: 81
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 35
10
- version: 0.2.35
8
+ - 3
9
+ - 1
10
+ version: 0.3.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jordan Sissel
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-06-15 00:00:00 -07:00
18
+ date: 2011-06-20 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: "0"
33
33
  type: :runtime
34
34
  version_requirements: *id001
35
- description: Turn directories into packages. Fix broken packages. Win the package building game.
35
+ description: Convert directories, rpms, python eggs, rubygems, and more to rpms, debs, solaris packages and more. Win at package management without wasting pointless hours debugging bad rpm specs!
36
36
  email: jls@semicomplete.com
37
37
  executables:
38
38
  - fpm
@@ -42,38 +42,39 @@ extensions: []
42
42
  extra_rdoc_files: []
43
43
 
44
44
  files:
45
- - lib/rpm/tag.rb
46
- - lib/rpm/namespace.rb
47
- - lib/rpm/lead.rb
48
- - lib/rpm/header.rb
49
- - lib/rpm/rpmfile.rb
50
45
  - lib/fpm/builder.rb
51
- - lib/fpm/errors.rb
46
+ - lib/fpm/target/puppet.rb
47
+ - lib/fpm/target/solaris.rb
48
+ - lib/fpm/target/rpm.rb
49
+ - lib/fpm/target/deb.rb
50
+ - lib/fpm/rubyfixes.rb
52
51
  - lib/fpm/flags.rb
53
- - lib/fpm/namespace.rb
52
+ - lib/fpm/errors.rb
54
53
  - lib/fpm/source.rb
55
- - lib/fpm/rubyfixes.rb
56
- - lib/fpm/source/python.rb
54
+ - lib/fpm/namespace.rb
55
+ - lib/fpm/package.rb
56
+ - lib/fpm/program.rb
57
+ - lib/fpm/source/gem.rb
57
58
  - lib/fpm/source/npm.rb
58
- - lib/fpm/source/dir.rb
59
+ - lib/fpm/source/python.rb
59
60
  - lib/fpm/source/rpm.rb
60
- - lib/fpm/source/pyfpm/__init__.pyc
61
- - lib/fpm/source/pyfpm/get_metadata.pyc
62
- - lib/fpm/source/pyfpm/get_metadata.py
63
- - lib/fpm/source/pyfpm/__init__.py
61
+ - lib/fpm/source/dir.rb
64
62
  - lib/fpm/source/tar.rb
65
- - lib/fpm/source/gem.rb
66
- - lib/fpm/target/solaris.rb
67
- - lib/fpm/target/deb.rb
68
- - lib/fpm/target/rpm.rb
69
- - lib/fpm/program.rb
70
- - lib/fpm/package.rb
63
+ - lib/fpm/source/pyfpm/__init__.py
64
+ - lib/fpm/source/pyfpm/get_metadata.py
65
+ - lib/rpm/tag.rb
66
+ - lib/rpm/rpmfile.rb
67
+ - lib/rpm/lead.rb
68
+ - lib/rpm/namespace.rb
69
+ - lib/rpm/header.rb
71
70
  - lib/fpm.rb
72
71
  - bin/fpm
73
72
  - bin/fpm-npm
74
- - templates/solaris.erb
75
- - templates/rpm.erb
73
+ - templates/puppet/package.pp.erb
74
+ - templates/puppet/package/remove.pp.erb
76
75
  - templates/deb.erb
76
+ - templates/rpm.erb
77
+ - templates/solaris.erb
77
78
  - LICENSE
78
79
  - CONTRIBUTORS
79
80
  - CHANGELIST
@@ -108,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
109
  requirements: []
109
110
 
110
111
  rubyforge_project:
111
- rubygems_version: 1.5.1
112
+ rubygems_version: 1.6.2
112
113
  signing_key:
113
114
  specification_version: 3
114
115
  summary: fpm - package building and mangling