modulesync 0.6.1 → 0.7.2
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 +7 -0
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/.rubocop.yml +16 -0
- data/.rubocop_todo.yml +75 -0
- data/.travis.yml +16 -0
- data/CHANGELOG.md +44 -6
- data/Gemfile +5 -0
- data/README.md +21 -2
- data/Rakefile +14 -4
- data/bin/msync +3 -3
- data/features/cli.feature +18 -0
- data/features/hook.feature +28 -0
- data/features/step_definitions/git_steps.rb +24 -0
- data/features/update.feature +501 -37
- data/lib/modulesync.rb +96 -50
- data/lib/modulesync/cli.rb +47 -107
- data/lib/modulesync/constants.rb +5 -5
- data/lib/modulesync/git.rb +48 -54
- data/lib/modulesync/hook.rb +25 -21
- data/lib/modulesync/renderer.rb +5 -11
- data/lib/modulesync/settings.rb +41 -0
- data/lib/modulesync/util.rb +3 -9
- data/modulesync.gemspec +14 -11
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/modulesync/settings_spec.rb +25 -0
- metadata +80 -36
data/lib/modulesync/hook.rb
CHANGED
@@ -1,36 +1,40 @@
|
|
1
|
+
require 'modulesync'
|
2
|
+
|
1
3
|
module ModuleSync
|
2
|
-
|
3
|
-
|
4
|
+
class Hook
|
5
|
+
attr_reader :hook_file, :namespace, :branch, :args
|
6
|
+
|
7
|
+
def initialize(hook_file, options = [])
|
8
|
+
@hook_file = hook_file
|
9
|
+
@namespace = options['namespace']
|
10
|
+
@branch = options['branch']
|
11
|
+
@args = options['hook_args']
|
12
|
+
end
|
4
13
|
|
5
|
-
def
|
6
|
-
|
7
|
-
hook_args = ''
|
8
|
-
hook_args <<= " -n #{args[:namespace]}" if args[:namespace]
|
9
|
-
hook_args <<= " -b #{args[:branch]}" if args[:branch]
|
10
|
-
hook = <<EOF
|
14
|
+
def content(arguments)
|
15
|
+
<<-EOF
|
11
16
|
#!/usr/bin/env bash
|
12
17
|
|
13
18
|
current_branch=\`git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,'\`
|
14
19
|
git_dir=\`git rev-parse --show-toplevel\`
|
15
20
|
message=\`git log -1 --format=%B\`
|
16
|
-
msync -m "\$message"#{
|
21
|
+
msync -m "\$message" #{arguments}
|
17
22
|
EOF
|
18
|
-
File.open("#{repo}/#{HOOK_FILE}", 'w') do |file|
|
19
|
-
file.write(hook)
|
20
|
-
end
|
21
23
|
end
|
22
24
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
def activate
|
26
|
+
hook_args = []
|
27
|
+
hook_args << "-n #{namespace}" if namespace
|
28
|
+
hook_args << "-b #{branch}" if branch
|
29
|
+
hook_args << args if args
|
27
30
|
|
28
|
-
|
29
|
-
|
30
|
-
activate(args)
|
31
|
-
else
|
32
|
-
deactivate(args[:configs])
|
31
|
+
File.open(hook_file, 'w') do |file|
|
32
|
+
file.write(content(hook_args.join(' ')))
|
33
33
|
end
|
34
34
|
end
|
35
|
+
|
36
|
+
def deactivate
|
37
|
+
File.delete(hook_file) if File.exist?(hook_file)
|
38
|
+
end
|
35
39
|
end
|
36
40
|
end
|
data/lib/modulesync/renderer.rb
CHANGED
@@ -3,9 +3,8 @@ require 'find'
|
|
3
3
|
|
4
4
|
module ModuleSync
|
5
5
|
module Renderer
|
6
|
-
|
7
6
|
class ForgeModuleFile
|
8
|
-
def initialize(configs= {})
|
7
|
+
def initialize(configs = {})
|
9
8
|
@configs = configs
|
10
9
|
end
|
11
10
|
end
|
@@ -18,24 +17,19 @@ module ModuleSync
|
|
18
17
|
end
|
19
18
|
|
20
19
|
def self.remove(file)
|
21
|
-
if File.
|
22
|
-
File.delete(file)
|
23
|
-
end
|
20
|
+
File.delete(file) if File.exist?(file)
|
24
21
|
end
|
25
22
|
|
26
|
-
def self.render(
|
27
|
-
ForgeModuleFile.new(configs).render
|
23
|
+
def self.render(_template, configs = {})
|
24
|
+
ForgeModuleFile.new(configs).render
|
28
25
|
end
|
29
26
|
|
30
27
|
def self.sync(template, to_file)
|
31
28
|
path = to_file.rpartition('/').first
|
32
|
-
|
33
|
-
FileUtils.mkdir_p(path)
|
34
|
-
end
|
29
|
+
FileUtils.mkdir_p(path) unless path.empty?
|
35
30
|
File.open(to_file, 'w') do |file|
|
36
31
|
file.write(template)
|
37
32
|
end
|
38
33
|
end
|
39
|
-
|
40
34
|
end
|
41
35
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
module ModuleSync
|
3
|
+
# Encapsulate a configs for a module, providing easy access to its parts
|
4
|
+
class Settings
|
5
|
+
attr_reader :global_defaults, :defaults, :module_defaults, :module_configs, :additional_settings
|
6
|
+
|
7
|
+
def initialize(global_defaults, defaults, module_defaults, module_configs, additional_settings)
|
8
|
+
@global_defaults = global_defaults
|
9
|
+
@defaults = defaults
|
10
|
+
@module_defaults = module_defaults
|
11
|
+
@module_configs = module_configs
|
12
|
+
@additional_settings = additional_settings
|
13
|
+
end
|
14
|
+
|
15
|
+
def build_file_configs(filename)
|
16
|
+
global_defaults.merge(defaults[filename] || {}).merge(module_defaults).merge(module_configs[filename] || {}).merge(additional_settings)
|
17
|
+
end
|
18
|
+
|
19
|
+
def managed?(filename)
|
20
|
+
Pathname.new(filename).ascend do |v|
|
21
|
+
configs = build_file_configs(v.to_s)
|
22
|
+
return false if configs['unmanaged']
|
23
|
+
end
|
24
|
+
true
|
25
|
+
end
|
26
|
+
|
27
|
+
# given a list of existing files in the repo, return everything that we might want to act on
|
28
|
+
def managed_files(file_list)
|
29
|
+
(file_list | defaults.keys | module_configs.keys).select do |f|
|
30
|
+
(f != ModuleSync::GLOBAL_DEFAULTS_KEY) && managed?(f)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# returns a list of files that should not be touched
|
35
|
+
def unmanaged_files(file_list)
|
36
|
+
(file_list | defaults.keys | module_configs.keys).select do |f|
|
37
|
+
(f != ModuleSync::GLOBAL_DEFAULTS_KEY) && !managed?(f)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/modulesync/util.rb
CHANGED
@@ -2,6 +2,9 @@ require 'yaml'
|
|
2
2
|
|
3
3
|
module ModuleSync
|
4
4
|
module Util
|
5
|
+
def self.symbolize_keys(hash)
|
6
|
+
hash.inject({}) { |memo, (k, v)| memo[k.to_sym] = v; memo }
|
7
|
+
end
|
5
8
|
|
6
9
|
def self.parse_config(config_file)
|
7
10
|
if File.exist?(config_file)
|
@@ -13,12 +16,3 @@ module ModuleSync
|
|
13
16
|
end
|
14
17
|
end
|
15
18
|
end
|
16
|
-
|
17
|
-
class Hash
|
18
|
-
#take keys of hash and transform those to a symbols
|
19
|
-
def self.transform_keys_to_symbols(value)
|
20
|
-
return value if not value.is_a?(Hash)
|
21
|
-
hash = value.inject({}){|memo,(k,v)| memo[k.to_sym] = Hash.transform_keys_to_symbols(v); memo}
|
22
|
-
return hash
|
23
|
-
end
|
24
|
-
end
|
data/modulesync.gemspec
CHANGED
@@ -4,23 +4,26 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'modulesync'
|
7
|
-
spec.version = '0.
|
8
|
-
spec.authors = ['
|
9
|
-
spec.email = ['
|
10
|
-
spec.summary =
|
11
|
-
spec.description =
|
12
|
-
spec.homepage =
|
13
|
-
spec.license =
|
7
|
+
spec.version = '0.7.2'
|
8
|
+
spec.authors = ['Vox Pupuli']
|
9
|
+
spec.email = ['voxpupuli@groups.io']
|
10
|
+
spec.summary = 'Puppet Module Synchronizer'
|
11
|
+
spec.description = 'Utility to synchronize common files across puppet modules in Github.'
|
12
|
+
spec.homepage = 'http://github.com/voxpupuli/modulesync'
|
13
|
+
spec.license = 'Apache-2.0'
|
14
14
|
|
15
15
|
spec.files = `git ls-files -z`.split("\x0")
|
16
16
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
-
spec.require_paths = [
|
18
|
+
spec.require_paths = ['lib']
|
19
19
|
|
20
|
-
spec.add_development_dependency
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
20
|
+
spec.add_development_dependency 'aruba'
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.6'
|
22
|
+
spec.add_development_dependency 'rake'
|
23
|
+
spec.add_development_dependency 'rspec'
|
24
|
+
spec.add_development_dependency 'rubocop'
|
23
25
|
|
24
26
|
spec.add_runtime_dependency 'git', '~>1.2'
|
25
27
|
spec.add_runtime_dependency 'puppet-blacksmith', '~>3.0'
|
28
|
+
spec.add_runtime_dependency 'thor'
|
26
29
|
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'modulesync'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ModuleSync::Settings do
|
4
|
+
subject do
|
5
|
+
ModuleSync::Settings.new(
|
6
|
+
{},
|
7
|
+
{},
|
8
|
+
{},
|
9
|
+
{ 'Rakefile' => { 'unmanaged' => true },
|
10
|
+
:global => { 'global' => 'value' },
|
11
|
+
'Gemfile' => { 'key' => 'value' }, },
|
12
|
+
{}
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
it { is_expected.not_to eq nil }
|
17
|
+
it { expect(subject.managed?('Rakefile')).to eq false }
|
18
|
+
it { expect(subject.managed?('Rakefile/foo')).to eq false }
|
19
|
+
it { expect(subject.managed?('Gemfile')).to eq true }
|
20
|
+
it { expect(subject.managed?('Gemfile/foo')).to eq true }
|
21
|
+
it { expect(subject.managed_files([])).to eq ['Gemfile'] }
|
22
|
+
it { expect(subject.managed_files(%w(Rakefile Gemfile other_file))).to eq %w(Gemfile other_file) }
|
23
|
+
it { expect(subject.unmanaged_files([])).to eq ['Rakefile'] }
|
24
|
+
it { expect(subject.unmanaged_files(%w(Rakefile Gemfile other_file))).to eq ['Rakefile'] }
|
25
|
+
end
|
metadata
CHANGED
@@ -1,106 +1,140 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: modulesync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.7.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
|
-
-
|
7
|
+
- Vox Pupuli
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2017-02-13 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: aruba
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
14
27
|
- !ruby/object:Gem::Dependency
|
15
28
|
name: bundler
|
16
29
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
30
|
requirements:
|
19
|
-
- - ~>
|
31
|
+
- - "~>"
|
20
32
|
- !ruby/object:Gem::Version
|
21
33
|
version: '1.6'
|
22
34
|
type: :development
|
23
35
|
prerelease: false
|
24
36
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
37
|
requirements:
|
27
|
-
- - ~>
|
38
|
+
- - "~>"
|
28
39
|
- !ruby/object:Gem::Version
|
29
40
|
version: '1.6'
|
30
41
|
- !ruby/object:Gem::Dependency
|
31
42
|
name: rake
|
32
43
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
44
|
requirements:
|
35
|
-
- -
|
45
|
+
- - ">="
|
36
46
|
- !ruby/object:Gem::Version
|
37
47
|
version: '0'
|
38
48
|
type: :development
|
39
49
|
prerelease: false
|
40
50
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
51
|
requirements:
|
43
|
-
- -
|
52
|
+
- - ">="
|
44
53
|
- !ruby/object:Gem::Version
|
45
54
|
version: '0'
|
46
55
|
- !ruby/object:Gem::Dependency
|
47
|
-
name:
|
56
|
+
name: rspec
|
48
57
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
58
|
requirements:
|
51
|
-
- -
|
59
|
+
- - ">="
|
52
60
|
- !ruby/object:Gem::Version
|
53
61
|
version: '0'
|
54
62
|
type: :development
|
55
63
|
prerelease: false
|
56
64
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
65
|
requirements:
|
59
|
-
- -
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
60
81
|
- !ruby/object:Gem::Version
|
61
82
|
version: '0'
|
62
83
|
- !ruby/object:Gem::Dependency
|
63
84
|
name: git
|
64
85
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
86
|
requirements:
|
67
|
-
- - ~>
|
87
|
+
- - "~>"
|
68
88
|
- !ruby/object:Gem::Version
|
69
89
|
version: '1.2'
|
70
90
|
type: :runtime
|
71
91
|
prerelease: false
|
72
92
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
93
|
requirements:
|
75
|
-
- - ~>
|
94
|
+
- - "~>"
|
76
95
|
- !ruby/object:Gem::Version
|
77
96
|
version: '1.2'
|
78
97
|
- !ruby/object:Gem::Dependency
|
79
98
|
name: puppet-blacksmith
|
80
99
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
100
|
requirements:
|
83
|
-
- - ~>
|
101
|
+
- - "~>"
|
84
102
|
- !ruby/object:Gem::Version
|
85
103
|
version: '3.0'
|
86
104
|
type: :runtime
|
87
105
|
prerelease: false
|
88
106
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
107
|
requirements:
|
91
|
-
- - ~>
|
108
|
+
- - "~>"
|
92
109
|
- !ruby/object:Gem::Version
|
93
110
|
version: '3.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: thor
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
94
125
|
description: Utility to synchronize common files across puppet modules in Github.
|
95
126
|
email:
|
96
|
-
-
|
127
|
+
- voxpupuli@groups.io
|
97
128
|
executables:
|
98
129
|
- msync
|
99
130
|
extensions: []
|
100
131
|
extra_rdoc_files: []
|
101
132
|
files:
|
102
|
-
- .gitignore
|
103
|
-
- .
|
133
|
+
- ".gitignore"
|
134
|
+
- ".rspec"
|
135
|
+
- ".rubocop.yml"
|
136
|
+
- ".rubocop_todo.yml"
|
137
|
+
- ".travis.yml"
|
104
138
|
- CHANGELOG.md
|
105
139
|
- Gemfile
|
106
140
|
- LICENSE
|
@@ -108,6 +142,9 @@ files:
|
|
108
142
|
- Rakefile
|
109
143
|
- bin/msync
|
110
144
|
- contrib/openstack-commit-msg-hook.sh
|
145
|
+
- features/cli.feature
|
146
|
+
- features/hook.feature
|
147
|
+
- features/step_definitions/git_steps.rb
|
111
148
|
- features/support/env.rb
|
112
149
|
- features/update.feature
|
113
150
|
- lib/modulesync.rb
|
@@ -116,33 +153,40 @@ files:
|
|
116
153
|
- lib/modulesync/git.rb
|
117
154
|
- lib/modulesync/hook.rb
|
118
155
|
- lib/modulesync/renderer.rb
|
156
|
+
- lib/modulesync/settings.rb
|
119
157
|
- lib/modulesync/util.rb
|
120
158
|
- modulesync.gemspec
|
121
|
-
|
159
|
+
- spec/spec_helper.rb
|
160
|
+
- spec/unit/modulesync/settings_spec.rb
|
161
|
+
homepage: http://github.com/voxpupuli/modulesync
|
122
162
|
licenses:
|
123
|
-
- Apache
|
163
|
+
- Apache-2.0
|
164
|
+
metadata: {}
|
124
165
|
post_install_message:
|
125
166
|
rdoc_options: []
|
126
167
|
require_paths:
|
127
168
|
- lib
|
128
169
|
required_ruby_version: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
170
|
requirements:
|
131
|
-
- -
|
171
|
+
- - ">="
|
132
172
|
- !ruby/object:Gem::Version
|
133
173
|
version: '0'
|
134
174
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
|
-
none: false
|
136
175
|
requirements:
|
137
|
-
- -
|
176
|
+
- - ">="
|
138
177
|
- !ruby/object:Gem::Version
|
139
178
|
version: '0'
|
140
179
|
requirements: []
|
141
180
|
rubyforge_project:
|
142
|
-
rubygems_version:
|
181
|
+
rubygems_version: 2.4.5
|
143
182
|
signing_key:
|
144
|
-
specification_version:
|
183
|
+
specification_version: 4
|
145
184
|
summary: Puppet Module Synchronizer
|
146
185
|
test_files:
|
186
|
+
- features/cli.feature
|
187
|
+
- features/hook.feature
|
188
|
+
- features/step_definitions/git_steps.rb
|
147
189
|
- features/support/env.rb
|
148
190
|
- features/update.feature
|
191
|
+
- spec/spec_helper.rb
|
192
|
+
- spec/unit/modulesync/settings_spec.rb
|