corl 0.4.0 → 0.4.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/Gemfile +5 -10
- data/Gemfile.lock +13 -11
- data/README.rdoc +1 -1
- data/Rakefile +3 -3
- data/VERSION +1 -1
- data/bin/corl +2 -54
- data/bootstrap/bootstrap.sh +91 -0
- data/bootstrap/lib/shell/LICENSE.txt +674 -0
- data/bootstrap/lib/shell/command.sh +214 -0
- data/bootstrap/lib/shell/filesystem.sh +139 -0
- data/bootstrap/lib/shell/load.sh +73 -0
- data/bootstrap/lib/shell/os.sh +67 -0
- data/bootstrap/lib/shell/script.sh +160 -0
- data/bootstrap/lib/shell/starter.sh +64 -0
- data/bootstrap/lib/shell/validators.sh +50 -0
- data/bootstrap/os/ubuntu/00_base.sh +5 -0
- data/bootstrap/os/ubuntu/01_git.sh +5 -0
- data/bootstrap/os/ubuntu/05_ruby.sh +7 -0
- data/bootstrap/os/ubuntu/06_puppet.sh +38 -0
- data/bootstrap/os/ubuntu/10_corl.sh +9 -0
- data/corl.gemspec +61 -124
- data/lib/{corl → CORL}/action/bootstrap.rb +13 -7
- data/lib/CORL/action/exec.rb +39 -0
- data/lib/CORL/action/image.rb +31 -0
- data/lib/{corl → CORL}/action/images.rb +1 -1
- data/lib/CORL/action/lookup.rb +34 -0
- data/lib/{corl → CORL}/action/machines.rb +1 -1
- data/lib/CORL/action/provision.rb +31 -0
- data/lib/{corl → CORL}/action/seed.rb +3 -3
- data/lib/{corl → CORL}/action/spawn.rb +2 -2
- data/lib/CORL/action/start.rb +31 -0
- data/lib/CORL/action/stop.rb +31 -0
- data/lib/{corl → CORL}/configuration/file.rb +1 -1
- data/lib/{corl → CORL}/event/puppet.rb +1 -1
- data/lib/{corl → CORL}/extension/puppetloader.rb +1 -1
- data/lib/{corl → CORL}/machine/fog.rb +3 -3
- data/lib/{corl → CORL}/machine/physical.rb +2 -2
- data/lib/{corl → CORL}/network/default.rb +1 -1
- data/lib/{corl → CORL}/node/aws.rb +0 -4
- data/lib/{corl → CORL}/node/google.rb +0 -4
- data/lib/{corl → CORL}/node/local.rb +1 -1
- data/lib/{corl → CORL}/node/rackspace.rb +0 -4
- data/lib/{corl → CORL}/provisioner/puppetnode.rb +1 -14
- data/lib/{corl → CORL}/provisioner/puppetnode/resource.rb +0 -0
- data/lib/{corl → CORL}/provisioner/puppetnode/resource_group.rb +0 -0
- data/lib/{corl → CORL}/template/environment.rb +1 -1
- data/lib/core/facade.rb +49 -0
- data/lib/{corl_core → core}/mixin/action/keypair.rb +10 -10
- data/lib/{corl_core → core}/mixin/lookup.rb +0 -0
- data/lib/{corl_core → core}/mod/hiera_backend.rb +0 -0
- data/lib/{corl_core/mixin/action/node.rb → core/plugin/action.rb} +66 -33
- data/lib/{corl_core → core}/plugin/configuration.rb +2 -2
- data/lib/{corl/node → core/plugin}/fog.rb +5 -1
- data/lib/{corl_core → core}/plugin/machine.rb +2 -2
- data/lib/{corl_core → core}/plugin/network.rb +4 -4
- data/lib/{corl_core → core}/plugin/node.rb +11 -9
- data/lib/{corl_core → core}/plugin/provisioner.rb +2 -2
- data/lib/{corl_core → core}/util/ssh.rb +1 -1
- data/lib/corl.rb +53 -112
- data/lib/puppet/parser/functions/ensure.rb +0 -4
- data/locales/en.yml +55 -148
- metadata +84 -222
- data/lib/corl/action/add.rb +0 -69
- data/lib/corl/action/clone.rb +0 -40
- data/lib/corl/action/create.rb +0 -55
- data/lib/corl/action/exec.rb +0 -41
- data/lib/corl/action/extract.rb +0 -49
- data/lib/corl/action/image.rb +0 -30
- data/lib/corl/action/lookup.rb +0 -35
- data/lib/corl/action/provision.rb +0 -37
- data/lib/corl/action/remove.rb +0 -51
- data/lib/corl/action/save.rb +0 -53
- data/lib/corl/action/start.rb +0 -37
- data/lib/corl/action/stop.rb +0 -30
- data/lib/corl/action/update.rb +0 -37
- data/lib/corl/command/shell.rb +0 -164
- data/lib/corl/event/regex.rb +0 -52
- data/lib/corl/project/git.rb +0 -465
- data/lib/corl/project/github.rb +0 -108
- data/lib/corl/template/json.rb +0 -16
- data/lib/corl/template/wrapper.rb +0 -16
- data/lib/corl/template/yaml.rb +0 -16
- data/lib/corl/translator/json.rb +0 -27
- data/lib/corl/translator/yaml.rb +0 -27
- data/lib/corl_core/codes.rb +0 -107
- data/lib/corl_core/config.rb +0 -337
- data/lib/corl_core/config/collection.rb +0 -57
- data/lib/corl_core/config/options.rb +0 -70
- data/lib/corl_core/core.rb +0 -59
- data/lib/corl_core/corl.rb +0 -254
- data/lib/corl_core/errors.rb +0 -84
- data/lib/corl_core/facade.rb +0 -126
- data/lib/corl_core/gems.rb +0 -72
- data/lib/corl_core/manager.rb +0 -425
- data/lib/corl_core/mixin/action/commit.rb +0 -58
- data/lib/corl_core/mixin/action/project.rb +0 -53
- data/lib/corl_core/mixin/action/push.rb +0 -52
- data/lib/corl_core/mixin/config/collection.rb +0 -53
- data/lib/corl_core/mixin/config/ops.rb +0 -53
- data/lib/corl_core/mixin/config/options.rb +0 -39
- data/lib/corl_core/mixin/macro/object_interface.rb +0 -361
- data/lib/corl_core/mixin/macro/plugin_interface.rb +0 -380
- data/lib/corl_core/mixin/settings.rb +0 -46
- data/lib/corl_core/mixin/sub_config.rb +0 -148
- data/lib/corl_core/mod/hash.rb +0 -29
- data/lib/corl_core/plugin/action.rb +0 -381
- data/lib/corl_core/plugin/base.rb +0 -374
- data/lib/corl_core/plugin/command.rb +0 -98
- data/lib/corl_core/plugin/event.rb +0 -53
- data/lib/corl_core/plugin/extension.rb +0 -12
- data/lib/corl_core/plugin/project.rb +0 -927
- data/lib/corl_core/plugin/template.rb +0 -80
- data/lib/corl_core/plugin/translator.rb +0 -38
- data/lib/corl_core/util/cli.rb +0 -352
- data/lib/corl_core/util/data.rb +0 -404
- data/lib/corl_core/util/disk.rb +0 -114
- data/lib/corl_core/util/git.rb +0 -47
- data/lib/corl_core/util/interface.rb +0 -319
- data/lib/corl_core/util/liquid.rb +0 -17
- data/lib/corl_core/util/package.rb +0 -93
- data/lib/corl_core/util/shell.rb +0 -239
- data/spec/corl_core/interface_spec.rb +0 -489
data/lib/corl/action/update.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
|
2
|
-
module CORL
|
3
|
-
module Action
|
4
|
-
class Update < Plugin::Action
|
5
|
-
|
6
|
-
include Mixin::Action::Project
|
7
|
-
|
8
|
-
#-----------------------------------------------------------------------------
|
9
|
-
# Update action interface
|
10
|
-
|
11
|
-
def normalize
|
12
|
-
super('corl update')
|
13
|
-
|
14
|
-
codes :project_failure => 20
|
15
|
-
end
|
16
|
-
|
17
|
-
#-----------------------------------------------------------------------------
|
18
|
-
# Action operations
|
19
|
-
|
20
|
-
def parse(parser)
|
21
|
-
project_options(parser, true, true)
|
22
|
-
end
|
23
|
-
|
24
|
-
#---
|
25
|
-
|
26
|
-
def execute
|
27
|
-
super do |node, network, status|
|
28
|
-
info('corl.core.actions.update.start')
|
29
|
-
|
30
|
-
project = project_load(Dir.pwd, true)
|
31
|
-
status = code.project_failure unless project
|
32
|
-
status
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
data/lib/corl/command/shell.rb
DELETED
@@ -1,164 +0,0 @@
|
|
1
|
-
|
2
|
-
module CORL
|
3
|
-
module Command
|
4
|
-
class Shell < Plugin::Command
|
5
|
-
|
6
|
-
#-----------------------------------------------------------------------------
|
7
|
-
# Command plugin interface
|
8
|
-
|
9
|
-
def normalize
|
10
|
-
super
|
11
|
-
command = executable(self)
|
12
|
-
|
13
|
-
logger.info("Setting command executable to #{command}")
|
14
|
-
set(:command, command)
|
15
|
-
end
|
16
|
-
|
17
|
-
#-----------------------------------------------------------------------------
|
18
|
-
# Command operations
|
19
|
-
|
20
|
-
def build(components = {}, overrides = nil, override_key = false)
|
21
|
-
command = string(components[:command])
|
22
|
-
flags = array( components.has_key?(:flags) ? components[:flags] : [] )
|
23
|
-
data = string_map(hash( components.has_key?(:data) ? components[:data] : {} ))
|
24
|
-
args = array( components.has_key?(:args) ? components[:args] : [] )
|
25
|
-
subcommand = hash( components.has_key?(:subcommand) ? components[:subcommand] : {} )
|
26
|
-
|
27
|
-
override_key = command unless override_key
|
28
|
-
override_key = override_key.to_sym
|
29
|
-
|
30
|
-
command_string = command.dup
|
31
|
-
subcommand_string = ''
|
32
|
-
|
33
|
-
escape_characters = /[\'\"]+/
|
34
|
-
escape_replacement = '\"'
|
35
|
-
|
36
|
-
dash_pattern = /^([\-]+)/
|
37
|
-
assignment_pattern = /\=$/
|
38
|
-
|
39
|
-
logger.info("Building command #{command}")
|
40
|
-
logger.debug("Command flags: #{flags.inspect}")
|
41
|
-
logger.debug("Command options: #{data.inspect}")
|
42
|
-
logger.debug("Command arguments: #{args.inspect}")
|
43
|
-
logger.debug("Command has sub command") unless subcommand.empty?
|
44
|
-
|
45
|
-
logger.debug("Overrides: #{overrides.inspect}")
|
46
|
-
logger.debug("Override key: #{override_key}")
|
47
|
-
|
48
|
-
# Flags
|
49
|
-
if overrides && overrides.has_key?(:flags)
|
50
|
-
if overrides[:flags].is_a?(Hash)
|
51
|
-
if overrides[:flags].has_key?(override_key)
|
52
|
-
flags = array(overrides[:flags][override_key])
|
53
|
-
end
|
54
|
-
else
|
55
|
-
flags = array(overrides[:flags])
|
56
|
-
end
|
57
|
-
end
|
58
|
-
flags.each do |flag|
|
59
|
-
flag = string(flag)
|
60
|
-
if ! flag.empty?
|
61
|
-
if flag.match(dash_pattern)
|
62
|
-
dashes = $1
|
63
|
-
else
|
64
|
-
dashes = ( flag.size == 1 ? '-' : '--' )
|
65
|
-
end
|
66
|
-
command_string << " #{dashes}#{flag}"
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
# Data
|
71
|
-
if overrides && overrides.has_key?(:data)
|
72
|
-
if overrides[:data].has_key?(override_key)
|
73
|
-
data = hash(overrides[:data][override_key])
|
74
|
-
else
|
75
|
-
override = true
|
76
|
-
overrides[:data].each do |key, value|
|
77
|
-
if ! value.is_a?(String)
|
78
|
-
override = false
|
79
|
-
end
|
80
|
-
end
|
81
|
-
data = hash(overrides[:data]) if override
|
82
|
-
end
|
83
|
-
end
|
84
|
-
data.each do |key, value|
|
85
|
-
key = string(key)
|
86
|
-
value = string(value).strip.sub(escape_characters, escape_replacement)
|
87
|
-
|
88
|
-
if key.match(dash_pattern)
|
89
|
-
dashes = $1
|
90
|
-
else
|
91
|
-
dashes = ( key.size == 1 ? '-' : '--' )
|
92
|
-
end
|
93
|
-
space = ( key.match(assignment_pattern) ? '' : ' ' )
|
94
|
-
|
95
|
-
command_string << " #{dashes}#{key}#{space}\"#{value}\""
|
96
|
-
end
|
97
|
-
|
98
|
-
# Arguments
|
99
|
-
if overrides && overrides.has_key?(:args)
|
100
|
-
unless overrides[:args].empty?
|
101
|
-
if overrides[:args].is_a?(Hash)
|
102
|
-
if overrides[:args].has_key?(override_key)
|
103
|
-
args = array(overrides[:args][override_key])
|
104
|
-
end
|
105
|
-
else
|
106
|
-
args = array(overrides[:args])
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
args.each do |arg|
|
111
|
-
arg = string(arg).sub(escape_characters, escape_replacement)
|
112
|
-
|
113
|
-
unless arg.empty?
|
114
|
-
command_string << " \"#{arg}\""
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
# Subcommand
|
119
|
-
subcommand_overrides = ( overrides ? overrides[:subcommand] : nil )
|
120
|
-
if subcommand && subcommand.is_a?(Hash) && ! subcommand.empty?
|
121
|
-
subcommand_string = build(subcommand, subcommand_overrides)
|
122
|
-
end
|
123
|
-
|
124
|
-
command_string = (command_string + ' ' + subcommand_string).strip
|
125
|
-
|
126
|
-
logger.debug("Rendered command: #{command_string}")
|
127
|
-
return command_string
|
128
|
-
end
|
129
|
-
|
130
|
-
#---
|
131
|
-
|
132
|
-
def exec(options = {}, overrides = nil)
|
133
|
-
config = Config.ensure(options)
|
134
|
-
|
135
|
-
logger.info("Executing command #{command}")
|
136
|
-
|
137
|
-
config[:ui] = @ui
|
138
|
-
result = Util::Shell.connection.exec(build(export, overrides), config) do |op, command, data|
|
139
|
-
block_given? ? yield(op, command, data) : true
|
140
|
-
end
|
141
|
-
|
142
|
-
logger.warn("Command #{command} failed to execute") unless result.status == CORL.code.success
|
143
|
-
return result
|
144
|
-
end
|
145
|
-
|
146
|
-
#-----------------------------------------------------------------------------
|
147
|
-
# Utilities
|
148
|
-
|
149
|
-
def executable(options)
|
150
|
-
config = Config.ensure(options)
|
151
|
-
|
152
|
-
if config.get(:corl, false)
|
153
|
-
return 'corl ' + config[:corl]
|
154
|
-
|
155
|
-
elsif config.get(:vagrant, false)
|
156
|
-
return 'vagrant ' + config[:vagrant]
|
157
|
-
|
158
|
-
elsif config.get(:command, false)
|
159
|
-
return config[:command]
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
data/lib/corl/event/regex.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
|
2
|
-
module CORL
|
3
|
-
module Event
|
4
|
-
class Regex < Plugin::Event
|
5
|
-
|
6
|
-
#-----------------------------------------------------------------------------
|
7
|
-
# Regular expression event interface
|
8
|
-
|
9
|
-
def normalize
|
10
|
-
super
|
11
|
-
|
12
|
-
if get(:string)
|
13
|
-
myself.pattern = delete(:string)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
#-----------------------------------------------------------------------------
|
18
|
-
# Property accessors / modifiers
|
19
|
-
|
20
|
-
def pattern(default = '')
|
21
|
-
return get(:pattern, default)
|
22
|
-
end
|
23
|
-
|
24
|
-
#---
|
25
|
-
|
26
|
-
def pattern=pattern
|
27
|
-
set(:pattern, string(pattern))
|
28
|
-
end
|
29
|
-
|
30
|
-
#-----------------------------------------------------------------------------
|
31
|
-
# Operations
|
32
|
-
|
33
|
-
def render
|
34
|
-
return "#{name}:#{pattern}"
|
35
|
-
end
|
36
|
-
|
37
|
-
#---
|
38
|
-
|
39
|
-
def check(source)
|
40
|
-
if pattern.empty?
|
41
|
-
logger.warn("Can not check regex pattern because it is empty")
|
42
|
-
else
|
43
|
-
success = source.match(/#{pattern}/)
|
44
|
-
|
45
|
-
logger.debug("Checking regex event with pattern #{pattern}: #{success.inspect}")
|
46
|
-
return success
|
47
|
-
end
|
48
|
-
return true
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
data/lib/corl/project/git.rb
DELETED
@@ -1,465 +0,0 @@
|
|
1
|
-
|
2
|
-
module CORL
|
3
|
-
module Project
|
4
|
-
class Git < Plugin::Project
|
5
|
-
|
6
|
-
#-----------------------------------------------------------------------------
|
7
|
-
# Project plugin interface
|
8
|
-
|
9
|
-
def normalize
|
10
|
-
super
|
11
|
-
end
|
12
|
-
|
13
|
-
#-----------------------------------------------------------------------------
|
14
|
-
# Git interface (local)
|
15
|
-
|
16
|
-
def ensure_git(reset = false)
|
17
|
-
if reset || @git_lib.nil?
|
18
|
-
@git_lib = nil
|
19
|
-
|
20
|
-
if directory.empty?
|
21
|
-
logger.warn("Can not manage Git project at #{directory} as it does not exist")
|
22
|
-
else
|
23
|
-
logger.debug("Ensuring Git instance to manage #{directory}")
|
24
|
-
@git_lib = Util::Git.new(directory)
|
25
|
-
|
26
|
-
if ! @git_lib.nil? && get(:create, false)
|
27
|
-
unless File.directory?(directory) && @git_lib.git.exist?
|
28
|
-
FileUtils.mkdir_p(directory) unless File.directory?(directory)
|
29
|
-
@git_lib.git.init({ :bare => false })
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
return myself
|
35
|
-
end
|
36
|
-
protected :ensure_git
|
37
|
-
|
38
|
-
#-----------------------------------------------------------------------------
|
39
|
-
# Checks
|
40
|
-
|
41
|
-
def can_persist?
|
42
|
-
ensure_git
|
43
|
-
return true unless @git_lib.nil?
|
44
|
-
return false
|
45
|
-
end
|
46
|
-
|
47
|
-
#---
|
48
|
-
|
49
|
-
def top?(path)
|
50
|
-
git_dir = File.join(path, '.git')
|
51
|
-
if File.exist?(git_dir)
|
52
|
-
return true if File.directory?(git_dir)
|
53
|
-
elsif File.exist?(path) && (path =~ /\.git$/ && File.exist?(File.join(path, 'HEAD')))
|
54
|
-
return true
|
55
|
-
end
|
56
|
-
return false
|
57
|
-
end
|
58
|
-
|
59
|
-
#---
|
60
|
-
|
61
|
-
def subproject?(path)
|
62
|
-
git_dir = File.join(path, '.git')
|
63
|
-
if File.exist?(git_dir)
|
64
|
-
unless File.directory?(git_dir)
|
65
|
-
git_dir = Util::Disk.read(git_dir)
|
66
|
-
unless git_dir.nil?
|
67
|
-
git_dir = git_dir.gsub(/^gitdir\:\s*/, '').strip
|
68
|
-
return true if File.directory?(git_dir)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
return false
|
73
|
-
end
|
74
|
-
|
75
|
-
#---
|
76
|
-
|
77
|
-
def project_directory?(path, require_top_level = false)
|
78
|
-
path = File.expand_path(path)
|
79
|
-
git_dir = File.join(path, '.git')
|
80
|
-
|
81
|
-
if File.exist?(git_dir)
|
82
|
-
if File.directory?(git_dir)
|
83
|
-
return true
|
84
|
-
elsif ! require_top_level
|
85
|
-
git_dir = Util::Disk.read(git_dir)
|
86
|
-
unless git_dir.nil?
|
87
|
-
git_dir = git_dir.gsub(/^gitdir\:\s*/, '').strip
|
88
|
-
return true if File.directory?(git_dir)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
elsif File.exist?(path) && (path =~ /\.git$/ && File.exist?(File.join(path, 'HEAD')))
|
92
|
-
return true
|
93
|
-
end
|
94
|
-
return false
|
95
|
-
end
|
96
|
-
|
97
|
-
#---
|
98
|
-
|
99
|
-
def new?(reset = false)
|
100
|
-
if get(:new, nil).nil? || reset
|
101
|
-
set(:new, git.native(:rev_parse, { :all => true }).empty?)
|
102
|
-
end
|
103
|
-
get(:new, false)
|
104
|
-
end
|
105
|
-
|
106
|
-
#-----------------------------------------------------------------------------
|
107
|
-
# Property accessors / modifiers
|
108
|
-
|
109
|
-
def lib
|
110
|
-
return @git_lib
|
111
|
-
end
|
112
|
-
|
113
|
-
#---
|
114
|
-
|
115
|
-
def git
|
116
|
-
return lib.git if can_persist?
|
117
|
-
return nil
|
118
|
-
end
|
119
|
-
protected :git
|
120
|
-
|
121
|
-
#---
|
122
|
-
|
123
|
-
def set_location(directory)
|
124
|
-
super do
|
125
|
-
ensure_git(true)
|
126
|
-
end
|
127
|
-
return myself
|
128
|
-
end
|
129
|
-
|
130
|
-
#---
|
131
|
-
|
132
|
-
def config(name, options = {})
|
133
|
-
return super do |config|
|
134
|
-
git.config(config.export, name)
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
#---
|
139
|
-
|
140
|
-
def set_config(name, value, options = {})
|
141
|
-
return super do |config, processed_value|
|
142
|
-
git.config(config.export, name, processed_value)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
#---
|
147
|
-
|
148
|
-
def delete_config(name, options = {})
|
149
|
-
return super do |config|
|
150
|
-
git.config(config.import({ :remove_section => true }).export, name)
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
#---
|
155
|
-
|
156
|
-
def subproject_config(options = {})
|
157
|
-
return super do |config|
|
158
|
-
result = {}
|
159
|
-
|
160
|
-
if new?
|
161
|
-
logger.debug("Project has no sub project configuration yet (has not been committed to)")
|
162
|
-
else
|
163
|
-
commit = lib.commit(revision)
|
164
|
-
blob = commit.tree/'.gitmodules' unless commit.nil?
|
165
|
-
|
166
|
-
if blob
|
167
|
-
logger.debug("Houston, we have a Git blob!")
|
168
|
-
|
169
|
-
lines = blob.data.gsub(/\r\n?/, "\n" ).split("\n")
|
170
|
-
current = nil
|
171
|
-
|
172
|
-
lines.each do |line|
|
173
|
-
if line =~ /^\[submodule "(.+)"\]$/
|
174
|
-
current = $1
|
175
|
-
result[current] = {}
|
176
|
-
result[current]['id'] = (commit.tree/current).id
|
177
|
-
|
178
|
-
logger.debug("Reading: #{current}")
|
179
|
-
|
180
|
-
elsif line =~ /^\t(\w+) = (.+)$/
|
181
|
-
result[current][$1] = $2
|
182
|
-
result[current]['id'] = (commit.tree/$2).id if $1 == 'path'
|
183
|
-
end
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
result
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
#-----------------------------------------------------------------------------
|
192
|
-
# Basic Git operations
|
193
|
-
|
194
|
-
def load_revision
|
195
|
-
return super do
|
196
|
-
if new?
|
197
|
-
logger.debug("Project has no current revision yet (has not been committed to)")
|
198
|
-
nil
|
199
|
-
|
200
|
-
else
|
201
|
-
current_revision = git.native(:rev_parse, { :abbrev_ref => true }, 'HEAD').strip
|
202
|
-
|
203
|
-
logger.debug("Current revision: #{current_revision}")
|
204
|
-
current_revision
|
205
|
-
end
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
#---
|
210
|
-
|
211
|
-
def checkout(revision)
|
212
|
-
return super do |success|
|
213
|
-
if new?
|
214
|
-
logger.debug("Project can not be checked out (has not been committed to)")
|
215
|
-
else
|
216
|
-
unless lib.bare
|
217
|
-
success = safe_exec(false) do
|
218
|
-
git.checkout({ :raise => true }, revision)
|
219
|
-
end
|
220
|
-
end
|
221
|
-
end
|
222
|
-
success
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
#---
|
227
|
-
|
228
|
-
def commit(files = '.', options = {})
|
229
|
-
return super do |config, time, user, message|
|
230
|
-
safe_exec(false) do
|
231
|
-
git.reset({}, 'HEAD') # Clear the index so we get a clean commit
|
232
|
-
|
233
|
-
files = array(files)
|
234
|
-
|
235
|
-
logger.debug("Adding files to Git index")
|
236
|
-
|
237
|
-
git.add({ :raise => true }, files) # Get all added and updated files
|
238
|
-
git.add({ :update => true, :raise => true }, files) # Get all deleted files
|
239
|
-
|
240
|
-
commit_options = {
|
241
|
-
:raise => true,
|
242
|
-
:m => "#{time} by <#{user}> - #{message}",
|
243
|
-
:allow_empty => config.get(:allow_empty, false)
|
244
|
-
}
|
245
|
-
commit_options[:author] = config[:author] if config.get(:author, false)
|
246
|
-
|
247
|
-
logger.debug("Composing commit options: #{commit_options.inspect}")
|
248
|
-
git.commit(commit_options)
|
249
|
-
|
250
|
-
new?(true)
|
251
|
-
end
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
|
-
#-----------------------------------------------------------------------------
|
256
|
-
# Subproject operations
|
257
|
-
|
258
|
-
def load_subprojects(options = {})
|
259
|
-
return super do |project_path, data|
|
260
|
-
File.exist?(File.join(project_path, '.git'))
|
261
|
-
end
|
262
|
-
end
|
263
|
-
|
264
|
-
#---
|
265
|
-
|
266
|
-
def add_subproject(path, url, revision, options = {})
|
267
|
-
return super do |config|
|
268
|
-
safe_exec(false) do
|
269
|
-
branch_options = ''
|
270
|
-
branch_options = [ '-b', config[:revision] ] if config.get(:revision, false)
|
271
|
-
|
272
|
-
path = config[:path]
|
273
|
-
url = config[:url]
|
274
|
-
|
275
|
-
git.submodule({ :raise => true }, 'add', *branch_options, url, path)
|
276
|
-
|
277
|
-
config.set(:files, [ '.gitmodules', path ])
|
278
|
-
end
|
279
|
-
end
|
280
|
-
end
|
281
|
-
|
282
|
-
#---
|
283
|
-
|
284
|
-
def delete_subproject(path)
|
285
|
-
return super do |config|
|
286
|
-
safe_exec(false) do
|
287
|
-
path = config[:path]
|
288
|
-
submodule_key = "submodule.#{path}"
|
289
|
-
|
290
|
-
logger.debug("Deleting Git configurations for #{submodule_key}")
|
291
|
-
delete_config(submodule_key)
|
292
|
-
delete_config(submodule_key, { :file => '.gitmodules' })
|
293
|
-
|
294
|
-
logger.debug("Cleaning Git index cache for #{path}")
|
295
|
-
git.rm({ :cached => true }, path)
|
296
|
-
|
297
|
-
logger.debug("Removing Git submodule directories")
|
298
|
-
FileUtils.rm_rf(File.join(directory, path))
|
299
|
-
FileUtils.rm_rf(File.join(git.git_dir, 'modules', path))
|
300
|
-
|
301
|
-
config.set(:files, [ '.gitmodules', path ])
|
302
|
-
end
|
303
|
-
end
|
304
|
-
end
|
305
|
-
|
306
|
-
#---
|
307
|
-
|
308
|
-
def update_subprojects
|
309
|
-
return super do
|
310
|
-
safe_exec(false) do
|
311
|
-
git.submodule({ :raise => true, :timeout => false }, 'update', '--init', '--recursive')
|
312
|
-
end
|
313
|
-
end
|
314
|
-
end
|
315
|
-
|
316
|
-
#-----------------------------------------------------------------------------
|
317
|
-
# Remote operations
|
318
|
-
|
319
|
-
def init_remotes
|
320
|
-
return super do
|
321
|
-
origin_url = config('remote.origin.url').strip
|
322
|
-
|
323
|
-
logger.debug("Original origin remote url: #{origin_url}")
|
324
|
-
origin_url
|
325
|
-
end
|
326
|
-
end
|
327
|
-
|
328
|
-
#---
|
329
|
-
|
330
|
-
def remote(name)
|
331
|
-
return super do
|
332
|
-
url = config("remote.#{name}.url").strip
|
333
|
-
url.empty? ? nil : url
|
334
|
-
end
|
335
|
-
end
|
336
|
-
|
337
|
-
#---
|
338
|
-
|
339
|
-
def set_remote(name, url)
|
340
|
-
return super do |processed_url|
|
341
|
-
safe_exec(false) do
|
342
|
-
git.remote({ :raise => true }, 'add', name.to_s, processed_url)
|
343
|
-
end
|
344
|
-
end
|
345
|
-
end
|
346
|
-
|
347
|
-
#---
|
348
|
-
|
349
|
-
def add_remote_url(name, url, options = {})
|
350
|
-
return super do |config, processed_url|
|
351
|
-
safe_exec(false) do
|
352
|
-
git.remote({
|
353
|
-
:raise => true,
|
354
|
-
:add => true,
|
355
|
-
:delete => config.get(:delete, false),
|
356
|
-
:push => config.get(:push, false)
|
357
|
-
}, 'set-url', name.to_s, processed_url)
|
358
|
-
end
|
359
|
-
end
|
360
|
-
end
|
361
|
-
|
362
|
-
#---
|
363
|
-
|
364
|
-
def delete_remote(name)
|
365
|
-
return super do
|
366
|
-
if config("remote.#{name}.url").empty?
|
367
|
-
logger.debug("Project can not delete remote #{name} because it does not exist yet")
|
368
|
-
true
|
369
|
-
else
|
370
|
-
safe_exec(false) do
|
371
|
-
git.remote({ :raise => true }, 'rm', name.to_s)
|
372
|
-
end
|
373
|
-
end
|
374
|
-
end
|
375
|
-
end
|
376
|
-
|
377
|
-
#---
|
378
|
-
|
379
|
-
def syncronize(cloud, options = {})
|
380
|
-
return super do |config|
|
381
|
-
config.init(:remote_path, '/var/git')
|
382
|
-
config.set(:add, true)
|
383
|
-
end
|
384
|
-
end
|
385
|
-
|
386
|
-
#-----------------------------------------------------------------------------
|
387
|
-
# SSH operations
|
388
|
-
|
389
|
-
def pull(remote = :origin, options = {})
|
390
|
-
return super do |config, processed_remote|
|
391
|
-
flags = []
|
392
|
-
flags << :tags if config.get(:tags, true)
|
393
|
-
|
394
|
-
result = CORL.command({
|
395
|
-
:command => :git,
|
396
|
-
:data => { 'git-dir=' => git.git_dir },
|
397
|
-
:subcommand => {
|
398
|
-
:command => :pull,
|
399
|
-
:flags => flags,
|
400
|
-
:args => [ processed_remote, config.get(:revision, get(:revision, :master)) ]
|
401
|
-
}
|
402
|
-
}, config.get(:provider, :shell)).exec(config) do |op, command, data|
|
403
|
-
block_given? ? yield(op, command, data) : true
|
404
|
-
end
|
405
|
-
|
406
|
-
if result.status == CORL.code.success
|
407
|
-
new?(true)
|
408
|
-
true
|
409
|
-
else
|
410
|
-
false
|
411
|
-
end
|
412
|
-
end
|
413
|
-
end
|
414
|
-
|
415
|
-
#---
|
416
|
-
|
417
|
-
def push(remote = :edit, options = {})
|
418
|
-
return super do |config, processed_remote|
|
419
|
-
push_branch = config.get(:revision, '')
|
420
|
-
|
421
|
-
flags = []
|
422
|
-
flags << :all if push_branch.empty?
|
423
|
-
flags << :tags if ! push_branch.empty? && config.get(:tags, true)
|
424
|
-
|
425
|
-
result = CORL.command({
|
426
|
-
:command => :git,
|
427
|
-
:data => { 'git-dir=' => git.git_dir },
|
428
|
-
:subcommand => {
|
429
|
-
:command => :push,
|
430
|
-
:flags => flags,
|
431
|
-
:args => [ processed_remote, push_branch ]
|
432
|
-
}
|
433
|
-
}, config.get(:provider, :shell)).exec(config) do |op, command, data|
|
434
|
-
block_given? ? yield(op, command, data) : true
|
435
|
-
end
|
436
|
-
|
437
|
-
result.status == CORL.code.success
|
438
|
-
end
|
439
|
-
end
|
440
|
-
|
441
|
-
#-----------------------------------------------------------------------------
|
442
|
-
# Utilities
|
443
|
-
|
444
|
-
def translate_url(host, path, options = {})
|
445
|
-
return super do |config|
|
446
|
-
user = config.get(:user, 'git')
|
447
|
-
auth = config.get(:auth, true)
|
448
|
-
|
449
|
-
user + (auth ? '@' : '://') + host + (auth ? ':' : '/') + path
|
450
|
-
end
|
451
|
-
end
|
452
|
-
|
453
|
-
#---
|
454
|
-
|
455
|
-
def translate_edit_url(url, options = {})
|
456
|
-
return super do |config|
|
457
|
-
if matches = url.strip.match(/^(https?|git)\:\/\/([^\/]+)\/(.+)/)
|
458
|
-
protocol, host, path = matches.captures
|
459
|
-
translate_url(host, path, config.import({ :auth => true }))
|
460
|
-
end
|
461
|
-
end
|
462
|
-
end
|
463
|
-
end
|
464
|
-
end
|
465
|
-
end
|