r10kdiff 0.0.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.
- checksums.yaml +7 -0
- data/bin/r10kdiff +4 -0
- data/lib/r10kdiff.rb +192 -0
- metadata +49 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0deb8c2c9bdcc5b28d0cf420f7f5c04bd2212acb
|
4
|
+
data.tar.gz: 8d728630df39ef6ca6aab098672d51a1ab58ec08
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f9434954c64aa497c4a5fcfa31af68b7c816c30f7c5ad8f6412936e566508f7811294031c72af40cd0e2201d70dba464df93bd60d0f3c2f7cf0da46e5b2f94de
|
7
|
+
data.tar.gz: 0b2efcade52590742f3e6e64e08c6de712391314867717cf1569989a23629e1b30fa5d8e717c74cdb73aeff16019bb118671a56ed8519a7e9ac0b0239f14e50c
|
data/bin/r10kdiff
ADDED
data/lib/r10kdiff.rb
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
module R10kDiff
|
5
|
+
class PuppetfileDSL
|
6
|
+
def initialize(puppetfile_text)
|
7
|
+
@forge = 'forge.puppetlabs.com'
|
8
|
+
@modules = {}
|
9
|
+
eval(puppetfile_text)
|
10
|
+
end
|
11
|
+
attr_reader :modules
|
12
|
+
|
13
|
+
def forge(name)
|
14
|
+
@forge = name
|
15
|
+
end
|
16
|
+
|
17
|
+
def mod(name, args={})
|
18
|
+
args = {:ref => args} if args.is_a? String
|
19
|
+
args[:ref] = "master" unless args[:ref]
|
20
|
+
args[:forge] = "https://#{@forge}/#{name}"
|
21
|
+
@modules[name] = PuppetModule.new name, args
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class PuppetModule
|
26
|
+
def initialize(name, ref:nil, git:nil, forge:nil)
|
27
|
+
@name = name
|
28
|
+
@ref = ref
|
29
|
+
@git = git
|
30
|
+
@forge = forge
|
31
|
+
end
|
32
|
+
attr_reader :name, :ref
|
33
|
+
|
34
|
+
def git?
|
35
|
+
!!@git
|
36
|
+
end
|
37
|
+
|
38
|
+
def different?(other_module)
|
39
|
+
# Note that forge & git r10k modules have different naming convention so
|
40
|
+
# we don't need to compare url (forge is user/modulename and git is just
|
41
|
+
# modulename with :git attr as the url of the module
|
42
|
+
@ref != other_module.ref
|
43
|
+
end
|
44
|
+
|
45
|
+
def pretty_version_diff(other_module, include_url)
|
46
|
+
basic_compare = "#{ref} -> #{other_module.ref}"
|
47
|
+
|
48
|
+
# special case for github - generate compate url
|
49
|
+
if git? && other_module.git? && include_url
|
50
|
+
return "#{name} #{git_https}/compare/#{ref}...#{other_module.ref}"
|
51
|
+
|
52
|
+
elsif include_url
|
53
|
+
return "#{name} #{basic_compare} (#{web_url})"
|
54
|
+
else
|
55
|
+
return "#{name} #{basic_compare}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def pretty_version(include_url)
|
60
|
+
basic_string = "#{name} at #{ref}"
|
61
|
+
if include_url
|
62
|
+
return "#{basic_string} (#{web_url})"
|
63
|
+
else
|
64
|
+
return basic_string
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
def git_https
|
70
|
+
if @git.start_with? "https://"
|
71
|
+
return @git
|
72
|
+
elsif @git.start_with? "git://"
|
73
|
+
return @git.gsub(/^git:/, "https:")
|
74
|
+
elsif @git.start_with? "git@"
|
75
|
+
return @git.gsub(":", "/").gsub(/^git@/, "https://").gsub(/.git$/, "")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def web_url
|
80
|
+
return git? ? git_https : @forge
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class PuppetfileDiff
|
85
|
+
# Represents the difference between the puppetfile from one commit to another
|
86
|
+
def initialize(oldfile, newfile)
|
87
|
+
@oldfile = oldfile
|
88
|
+
@newfile = newfile
|
89
|
+
end
|
90
|
+
|
91
|
+
def changes
|
92
|
+
changed_modules = []
|
93
|
+
modules_in_common = Set.new(@oldfile.modules.keys).intersection Set.new(@newfile.modules.keys)
|
94
|
+
modules_in_common.each do |name|
|
95
|
+
new_module = @newfile.modules[name]
|
96
|
+
old_module = @oldfile.modules[name]
|
97
|
+
changed_modules << [old_module, new_module] if new_module.different? old_module
|
98
|
+
end
|
99
|
+
changed_modules
|
100
|
+
end
|
101
|
+
|
102
|
+
def additions
|
103
|
+
additions = []
|
104
|
+
@newfile.modules.each do |name, new_module|
|
105
|
+
additions << new_module unless @oldfile.modules[name]
|
106
|
+
end
|
107
|
+
additions
|
108
|
+
end
|
109
|
+
|
110
|
+
def removals
|
111
|
+
removals = []
|
112
|
+
@oldfile.modules.each do |name, old_module|
|
113
|
+
removals << old_module unless @newfile.modules[name]
|
114
|
+
end
|
115
|
+
removals
|
116
|
+
end
|
117
|
+
|
118
|
+
def print_differences(include_url)
|
119
|
+
# Print the additions, removals, and changes
|
120
|
+
output = []
|
121
|
+
puppetfile_changes = false
|
122
|
+
if removals.length > 0
|
123
|
+
puppetfile_changes = true
|
124
|
+
output << "Remove:"
|
125
|
+
end
|
126
|
+
removals.each do |old|
|
127
|
+
output << " #{old.pretty_version(include_url)}"
|
128
|
+
end
|
129
|
+
|
130
|
+
if additions.length > 0
|
131
|
+
puppetfile_changes = true
|
132
|
+
output << "Add:"
|
133
|
+
end
|
134
|
+
additions.each do |new|
|
135
|
+
output << " #{new.pretty_version(include_url)}"
|
136
|
+
end
|
137
|
+
|
138
|
+
if changes.length > 0
|
139
|
+
puppetfile_changes = true
|
140
|
+
output << "Change:"
|
141
|
+
end
|
142
|
+
changes.each do |old, new|
|
143
|
+
output << " #{new.pretty_version_diff(old, include_url)}"
|
144
|
+
end
|
145
|
+
|
146
|
+
if !puppetfile_changes
|
147
|
+
output << "No changes in Puppetfile"
|
148
|
+
end
|
149
|
+
|
150
|
+
output.each { |x| puts x }
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
class Commandline
|
155
|
+
def self.run
|
156
|
+
include_urls = false
|
157
|
+
opt_parser = OptionParser.new do |opt|
|
158
|
+
|
159
|
+
opt.banner = <<-EOF
|
160
|
+
Usage: r10kdiff [previous-ref] [current-ref]
|
161
|
+
|
162
|
+
Run from a git repository containing a Puppetfile.
|
163
|
+
|
164
|
+
previous-ref and current-ref are the git refs to compare
|
165
|
+
(optional, default to origin/BRANCH and BRANCH
|
166
|
+
where BRANCH is the currently checked-out git branch name)
|
167
|
+
|
168
|
+
EOF
|
169
|
+
opt.on("-h", "--help", "show help dialogue") do
|
170
|
+
puts opt_parser
|
171
|
+
exit
|
172
|
+
end
|
173
|
+
opt.on("-u", "--urls", "Include urls and github compare links in output") do
|
174
|
+
include_urls = true
|
175
|
+
end
|
176
|
+
end
|
177
|
+
opt_parser.parse!
|
178
|
+
|
179
|
+
if ARGV.length >= 2
|
180
|
+
oldref = ARGV[0]
|
181
|
+
newref = ARGV[1]
|
182
|
+
else # default to checked-out branch & its corresponding branch on origin
|
183
|
+
branch_name = File.basename `git symbolic-ref HEAD`.chomp
|
184
|
+
oldref = "origin/#{branch_name}"
|
185
|
+
newref = branch_name
|
186
|
+
end
|
187
|
+
oldfile_raw = PuppetfileDSL.new(`git show #{oldref}:Puppetfile`)
|
188
|
+
newfile_raw = PuppetfileDSL.new(`git --no-pager show #{newref}:Puppetfile`)
|
189
|
+
PuppetfileDiff.new(oldfile_raw, newfile_raw).print_differences(include_urls)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: r10kdiff
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Danny Cosson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-03-15 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A small script for comparing r10k Puppetfiles between different git refs.
|
14
|
+
It's helpful for a development workflow with puppet r10k and Github as the output
|
15
|
+
is slightly nicer than 'git diff' and it can generate github compare links for the
|
16
|
+
full changesets represented by a change to a Puppetfile.
|
17
|
+
email: cosson@venmo.com
|
18
|
+
executables:
|
19
|
+
- r10kdiff
|
20
|
+
extensions: []
|
21
|
+
extra_rdoc_files: []
|
22
|
+
files:
|
23
|
+
- lib/r10kdiff.rb
|
24
|
+
- bin/r10kdiff
|
25
|
+
homepage: https://github.com/dcosson/r10kdiff
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata: {}
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - '>='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 2.0.14
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: Compare r10k Puppetfiles
|
49
|
+
test_files: []
|