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