fpm 0.2.35 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
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