fpm-fry 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/cabin/nice_output.rb +16 -1
- data/lib/fpm/fry/block_enumerator.rb +6 -3
- data/lib/fpm/fry/channel.rb +13 -0
- data/lib/fpm/fry/chroot.rb +2 -2
- data/lib/fpm/fry/client.rb +81 -6
- data/lib/fpm/fry/command.rb +11 -31
- data/lib/fpm/fry/command/cook.rb +19 -51
- data/lib/fpm/fry/detector.rb +43 -98
- data/lib/fpm/fry/docker_file.rb +3 -11
- data/lib/fpm/fry/exec.rb +76 -0
- data/lib/fpm/fry/inspector.rb +70 -0
- data/lib/fpm/fry/joined_io.rb +1 -1
- data/lib/fpm/fry/plugin/edit_staging.rb +1 -1
- data/lib/fpm/fry/plugin/init.rb +71 -42
- data/lib/fpm/fry/plugin/service.rb +108 -49
- data/lib/fpm/fry/recipe.rb +46 -21
- data/lib/fpm/fry/recipe/builder.rb +26 -13
- data/lib/fpm/fry/source.rb +14 -12
- data/lib/fpm/fry/source/{package.rb → archive.rb} +68 -31
- data/lib/fpm/fry/source/dir.rb +2 -5
- data/lib/fpm/fry/source/git.rb +70 -43
- data/lib/fpm/fry/source/patched.rb +14 -10
- data/lib/fpm/fry/with_data.rb +34 -0
- data/lib/fpm/package/docker.rb +15 -0
- metadata +5 -4
- data/lib/fpm/fry/os_db.rb +0 -36
data/lib/fpm/fry/source/dir.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'fpm/fry/source'
|
2
|
+
require 'fpm/fry/exec'
|
2
3
|
require 'fileutils'
|
3
4
|
require 'digest'
|
4
5
|
module FPM; module Fry ; module Source
|
@@ -20,11 +21,7 @@ module FPM; module Fry ; module Source
|
|
20
21
|
def_delegators :package, :url, :logger, :file_map
|
21
22
|
|
22
23
|
def tar_io
|
23
|
-
|
24
|
-
logger.debug("Running tar",cmd: cmd, dir: dir)
|
25
|
-
::Dir.chdir(dir) do
|
26
|
-
return IO.popen(cmd)
|
27
|
-
end
|
24
|
+
Exec::popen('tar','-c','.', chdir: dir, logger: logger)
|
28
25
|
end
|
29
26
|
|
30
27
|
def copy_to(dst)
|
data/lib/fpm/fry/source/git.rb
CHANGED
@@ -1,16 +1,41 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'forwardable'
|
3
|
-
require '
|
3
|
+
require 'fpm/fry/exec'
|
4
4
|
require 'fpm/fry/source'
|
5
5
|
module FPM; module Fry ; module Source
|
6
|
+
# Used to build directly from git.
|
7
|
+
#
|
8
|
+
# @example in a recipe
|
9
|
+
# source 'https://github.com/ggreer/the_silver_searcher.git'
|
10
|
+
#
|
11
|
+
# It automatically recognizes the following url patterns:
|
12
|
+
#
|
13
|
+
# - git://…
|
14
|
+
# - git+…://…
|
15
|
+
# - user@host:….git
|
16
|
+
# - https://….git
|
17
|
+
# - https://git.…
|
18
|
+
#
|
6
19
|
class Git
|
7
20
|
|
8
|
-
REGEX = %r!\A(?:git:|\S+@\S+:\S+\.git\z|https
|
21
|
+
REGEX = %r!\A(?:git:|\S+@\S+:\S+\.git\z|https?:(?://git\.|.*\.git\z)|ssh:.*\.git\z|git\+[a-z0-9]+:)!
|
9
22
|
|
23
|
+
# @return [:git]
|
10
24
|
def self.name
|
11
25
|
:git
|
12
26
|
end
|
13
27
|
|
28
|
+
# Guesses if this url is a git url.
|
29
|
+
#
|
30
|
+
# @example not a git url
|
31
|
+
# FPM::Fry::Source::Git.guess( "bzr://something" ) #=> nil
|
32
|
+
#
|
33
|
+
# @example a git url
|
34
|
+
# FPM::Fry::Source::Git.guess( "git://something" ) #=> 4
|
35
|
+
#
|
36
|
+
# @param [URI,String] url
|
37
|
+
# @return [nil] when this uri doesn't match
|
38
|
+
# @return [Numeric] number of characters that were used
|
14
39
|
def self.guess( url )
|
15
40
|
Source::guess_regex(REGEX, url)
|
16
41
|
end
|
@@ -20,63 +45,63 @@ module FPM; module Fry ; module Source
|
|
20
45
|
|
21
46
|
def_delegators :package, :url, :rev, :logger, :file_map
|
22
47
|
|
23
|
-
def update
|
24
|
-
begin
|
25
|
-
if !File.exists? repodir
|
26
|
-
if (ecode = git('init', '--bare')) != 0
|
27
|
-
raise CacheFailed.new("Initializing git repository failed", exit_code: ecode)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
if (ecode = git('fetch','--depth=1', url.to_s, rev)) != 0
|
31
|
-
raise CacheFailed.new("Failed to fetch from remote", exit_code: ecode, url: url.to_s, rev: rev)
|
32
|
-
end
|
33
|
-
return self
|
34
|
-
rescue Errno::ENOENT
|
35
|
-
raise "Cannot find git binary. Is it installed?"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
48
|
def tar_io
|
40
|
-
|
41
|
-
logger.debug("Running git",cmd: cmd)
|
42
|
-
IO.popen(cmd)
|
49
|
+
Exec::popen(package.git, "--git-dir=#{repodir}",'archive','--format=tar','FETCH_HEAD', logger: logger)
|
43
50
|
end
|
44
51
|
|
45
52
|
def copy_to(dst)
|
46
|
-
|
47
|
-
|
48
|
-
|
53
|
+
Exec[
|
54
|
+
package.git, "--git-dir=#{repodir}", "--work-tree=#{dst}",'checkout','FETCH_HEAD','--','*',
|
55
|
+
chdir: dst, logger: logger
|
56
|
+
]
|
49
57
|
end
|
50
58
|
|
51
59
|
def cachekey
|
52
|
-
|
53
|
-
logger.debug("Running git",cmd: cmd)
|
54
|
-
return IO.popen(cmd).read.chomp
|
60
|
+
Exec::exec(package.git, "--git-dir=#{repodir}",'rev-parse','FETCH_HEAD^{tree}', logger: logger).chomp
|
55
61
|
end
|
56
62
|
private
|
57
|
-
def
|
58
|
-
|
63
|
+
def initialize(*_)
|
64
|
+
super
|
65
|
+
update
|
59
66
|
end
|
60
67
|
|
61
|
-
def
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
sin.close
|
66
|
-
out.each_line do |line|
|
67
|
-
logger.debug(line.chomp)
|
68
|
-
end
|
69
|
-
err.each_line do |line|
|
70
|
-
logger.debug(line.chomp)
|
68
|
+
def update
|
69
|
+
begin
|
70
|
+
if !File.exists? repodir
|
71
|
+
Exec::exec(package.git, "--git-dir=#{repodir}",'init', '--bare', description: "initializing git repository", logger: logger)
|
71
72
|
end
|
72
|
-
|
73
|
+
Exec::exec(package.git, "--git-dir=#{repodir}",'fetch','--depth=1', url.to_s, rev, description: 'fetching from remote', logger: logger)
|
74
|
+
return self
|
75
|
+
rescue => e
|
76
|
+
raise CacheFailed.new(e, url: url.to_s, rev: rev)
|
73
77
|
end
|
74
78
|
end
|
75
|
-
|
79
|
+
def repodir
|
80
|
+
File.join(tempdir,File.basename(url.path))
|
81
|
+
end
|
76
82
|
end
|
77
83
|
|
78
|
-
|
84
|
+
# @return [Cabin::Channel] logger
|
85
|
+
attr :logger
|
86
|
+
|
87
|
+
# @return [String] the git binary (default: "git")
|
88
|
+
attr :git
|
89
|
+
|
90
|
+
# @return [String] the git rev to pull (default "HEAD")
|
91
|
+
attr :rev
|
92
|
+
|
93
|
+
# @return [Hash<String,String>] the file map for generating a docker file
|
94
|
+
attr :file_map
|
95
|
+
|
96
|
+
# @return [URI] the uri to pull from
|
97
|
+
attr :url
|
79
98
|
|
99
|
+
# @param [URI] url the url to pull from
|
100
|
+
# @param [Hash] options
|
101
|
+
# @option options [Cabin::Channel] :logger (cabin default channel)
|
102
|
+
# @option options [String] :branch git branch to pull
|
103
|
+
# @option options [String] :tag git tag to pull
|
104
|
+
# @option options [Hash<String,String>] :file_map ({""=>""}) the file map to create the docker file from
|
80
105
|
def initialize( url, options = {} )
|
81
106
|
url = url.sub(/\A(\S+@\S+):(\S+\.git)\z/,'ssh://\1/\2')
|
82
107
|
@url = URI(url)
|
@@ -86,8 +111,10 @@ module FPM; module Fry ; module Source
|
|
86
111
|
@git = options[:git] || 'git'
|
87
112
|
end
|
88
113
|
|
114
|
+
# @param [String] tempdir
|
115
|
+
# @return [Cache]
|
89
116
|
def build_cache(tempdir)
|
90
|
-
Cache.new(self, tempdir)
|
117
|
+
Cache.new(self, tempdir)
|
91
118
|
end
|
92
119
|
|
93
120
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'fpm/fry/tar'
|
2
|
+
require 'fpm/fry/exec'
|
2
3
|
require 'digest'
|
3
4
|
module FPM; module Fry ; module Source
|
4
5
|
class Patched
|
@@ -40,8 +41,11 @@ module FPM; module Fry ; module Source
|
|
40
41
|
package.patches.each do |patch|
|
41
42
|
cmd = ['patch','-p1','-i',patch[:file]]
|
42
43
|
chdir = File.expand_path(patch.fetch(:chdir,'.'),workdir)
|
43
|
-
|
44
|
-
|
44
|
+
begin
|
45
|
+
Fry::Exec[*cmd, chdir: chdir, logger: logger]
|
46
|
+
rescue Exec::Failed => e
|
47
|
+
raise CacheFailed.new(e, patch: patch[:file])
|
48
|
+
end
|
45
49
|
end
|
46
50
|
File.rename(workdir, unpacked_tmpdir)
|
47
51
|
end
|
@@ -52,12 +56,7 @@ module FPM; module Fry ; module Source
|
|
52
56
|
|
53
57
|
def tar_io
|
54
58
|
update!
|
55
|
-
|
56
|
-
logger.debug("Running tar",cmd: cmd, dir: unpacked_tmpdir)
|
57
|
-
# IO.popen( ..., chdir: ... ) doesn't work on older ruby
|
58
|
-
::Dir.chdir(unpacked_tmpdir) do
|
59
|
-
return IO.popen(cmd)
|
60
|
-
end
|
59
|
+
return Exec::popen('tar','-c','.',chdir: unpacked_tmpdir, logger: logger)
|
61
60
|
end
|
62
61
|
|
63
62
|
def cachekey
|
@@ -76,11 +75,11 @@ module FPM; module Fry ; module Source
|
|
76
75
|
|
77
76
|
end
|
78
77
|
|
79
|
-
attr :inner, :patches
|
78
|
+
attr :inner, :logger, :patches
|
80
79
|
|
81
80
|
extend Forwardable
|
82
81
|
|
83
|
-
def_delegators :inner, :
|
82
|
+
def_delegators :inner, :file_map
|
84
83
|
|
85
84
|
def initialize( inner , options = {})
|
86
85
|
@inner = inner
|
@@ -98,6 +97,11 @@ module FPM; module Fry ; module Source
|
|
98
97
|
end
|
99
98
|
options
|
100
99
|
end
|
100
|
+
if @inner.respond_to? :logger
|
101
|
+
@logger = @inner.logger
|
102
|
+
else
|
103
|
+
@logger = Cabin::Channel.get
|
104
|
+
end
|
101
105
|
end
|
102
106
|
|
103
107
|
def build_cache(tmpdir)
|
data/lib/fpm/fry/with_data.rb
CHANGED
@@ -16,4 +16,38 @@ module FPM ; module Fry
|
|
16
16
|
return ex
|
17
17
|
end
|
18
18
|
|
19
|
+
# Adds a data method to an exception. This overrides initialize so it may
|
20
|
+
# not work everywhere.
|
21
|
+
module WithData
|
22
|
+
|
23
|
+
# @return [Hash] debugging/logging data
|
24
|
+
attr :data
|
25
|
+
|
26
|
+
# @overload initialize(data = {})
|
27
|
+
# @param data [Hash]
|
28
|
+
#
|
29
|
+
# @overload initialize(cause, data = {})
|
30
|
+
# If cause responds to #data the data will be merged.
|
31
|
+
# @param cause [Exception]
|
32
|
+
# @param data [Hash]
|
33
|
+
#
|
34
|
+
# @overload initialize(message, data = {})
|
35
|
+
# @param message [String]
|
36
|
+
# @param data [Hash]
|
37
|
+
#
|
38
|
+
def initialize(e=self.class.name, data = {})
|
39
|
+
if e.kind_of? Exception
|
40
|
+
if e.respond_to? :data
|
41
|
+
@data = e.data.merge(data)
|
42
|
+
else
|
43
|
+
@data = data.dup.freeze
|
44
|
+
end
|
45
|
+
super(e.message)
|
46
|
+
else
|
47
|
+
@data = data.dup.freeze
|
48
|
+
super(e.to_s)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
19
53
|
end ; end
|
data/lib/fpm/package/docker.rb
CHANGED
@@ -3,8 +3,12 @@ require 'fpm/package'
|
|
3
3
|
|
4
4
|
require 'fpm/fry/client'
|
5
5
|
|
6
|
+
# An {FPM::Package} that loads files from a docker container diff.
|
6
7
|
class FPM::Package::Docker < FPM::Package
|
7
8
|
|
9
|
+
# @param [Hash] options
|
10
|
+
# @option options [Cabin::Channel] :logger Logger
|
11
|
+
# @option options [FPM::Fry::Client] :client Docker client
|
8
12
|
def initialize( options = {} )
|
9
13
|
super()
|
10
14
|
if options[:logger]
|
@@ -18,10 +22,19 @@ class FPM::Package::Docker < FPM::Package
|
|
18
22
|
end
|
19
23
|
end
|
20
24
|
|
25
|
+
# Loads all files from a docker container with the given name to the staging
|
26
|
+
# path.
|
27
|
+
#
|
28
|
+
# @param [String] name docker container name
|
21
29
|
def input(name)
|
22
30
|
split( name, '**' => staging_path)
|
23
31
|
end
|
24
32
|
|
33
|
+
# Loads all files from a docker container into multiple paths defined by map
|
34
|
+
# param.
|
35
|
+
#
|
36
|
+
# @param [String] name docker container name
|
37
|
+
# @param [Hash<String,String>] map
|
25
38
|
def split( name, map )
|
26
39
|
changes = changes(name)
|
27
40
|
changes.remove_modified_leaves! do | kind, ml |
|
@@ -44,6 +57,7 @@ class FPM::Package::Docker < FPM::Package
|
|
44
57
|
directories.each do |chg|
|
45
58
|
client.copy(name, chg, fmap ,chown: false)
|
46
59
|
end
|
60
|
+
return nil
|
47
61
|
end
|
48
62
|
|
49
63
|
private
|
@@ -80,6 +94,7 @@ private
|
|
80
94
|
CREATED = 1
|
81
95
|
DELETED = 2
|
82
96
|
|
97
|
+
# @api private
|
83
98
|
class Node < Struct.new(:children, :kind)
|
84
99
|
|
85
100
|
def initialize
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fpm-fry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hannes Georg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: excon
|
@@ -70,8 +70,9 @@ files:
|
|
70
70
|
- lib/fpm/fry/command/cook.rb
|
71
71
|
- lib/fpm/fry/detector.rb
|
72
72
|
- lib/fpm/fry/docker_file.rb
|
73
|
+
- lib/fpm/fry/exec.rb
|
74
|
+
- lib/fpm/fry/inspector.rb
|
73
75
|
- lib/fpm/fry/joined_io.rb
|
74
|
-
- lib/fpm/fry/os_db.rb
|
75
76
|
- lib/fpm/fry/plugin.rb
|
76
77
|
- lib/fpm/fry/plugin/alternatives.rb
|
77
78
|
- lib/fpm/fry/plugin/config.rb
|
@@ -87,9 +88,9 @@ files:
|
|
87
88
|
- lib/fpm/fry/recipe/builder.rb
|
88
89
|
- lib/fpm/fry/recipe/error.rb
|
89
90
|
- lib/fpm/fry/source.rb
|
91
|
+
- lib/fpm/fry/source/archive.rb
|
90
92
|
- lib/fpm/fry/source/dir.rb
|
91
93
|
- lib/fpm/fry/source/git.rb
|
92
|
-
- lib/fpm/fry/source/package.rb
|
93
94
|
- lib/fpm/fry/source/patched.rb
|
94
95
|
- lib/fpm/fry/stream_parser.rb
|
95
96
|
- lib/fpm/fry/tar.rb
|
data/lib/fpm/fry/os_db.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
module FPM; module Fry
|
2
|
-
|
3
|
-
# Structure is
|
4
|
-
#
|
5
|
-
# <distribution> => {
|
6
|
-
# codenames: {
|
7
|
-
# <codename> => <version>
|
8
|
-
# },
|
9
|
-
# flavour: <flavour>
|
10
|
-
# }
|
11
|
-
OsDb = {
|
12
|
-
'centos' => {
|
13
|
-
codenames: {},
|
14
|
-
flavour: 'redhat'
|
15
|
-
},
|
16
|
-
|
17
|
-
'debian' => {
|
18
|
-
codenames: {
|
19
|
-
'lenny' => '5',
|
20
|
-
'squeeze' => '6',
|
21
|
-
'wheezy' => '7'
|
22
|
-
},
|
23
|
-
flavour: 'debian'
|
24
|
-
},
|
25
|
-
|
26
|
-
'ubuntu' => {
|
27
|
-
codenames: {
|
28
|
-
'precise' => '12.04',
|
29
|
-
'trusty' => '14.04',
|
30
|
-
'xenial' => '16.04'
|
31
|
-
},
|
32
|
-
flavour: 'debian'
|
33
|
-
}
|
34
|
-
}
|
35
|
-
|
36
|
-
end ; end
|