diggit 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/bin/dgit +166 -157
- data/lib/dgit.rb +4 -5
- data/lib/dgit/core.rb +18 -12
- data/lib/dgit/log.rb +1 -2
- data/lib/dgit/plugins.rb +29 -6
- data/lib/dgit/version.rb +1 -2
- data/plugins/addon/db.rb +10 -5
- data/plugins/addon/out.rb +0 -1
- data/plugins/addon/r.rb +0 -1
- data/plugins/addon/src_opt.rb +35 -0
- data/plugins/analysis/cloc.rb +14 -8
- data/plugins/analysis/cloc_per_file.rb +48 -0
- data/plugins/analysis/tex.rb +48 -0
- data/spec/core_spec.rb +32 -4
- data/spec/dgit/plugins/addon/test_addon.rb +0 -1
- data/spec/dgit/plugins/analysis/duplicate_analysis.rb +0 -1
- data/spec/dgit/plugins/analysis/my_module/duplicate_analysis.rb +0 -1
- data/spec/dgit/plugins/analysis/my_module/other_analysis.rb +0 -1
- data/spec/dgit/plugins/analysis/test_analysis.rb +0 -1
- data/spec/dgit/plugins/analysis/test_analysis_with_addon.rb +0 -1
- data/spec/dgit/plugins/analysis/test_analysis_with_error.rb +0 -1
- data/spec/dgit/plugins/analysis/test_analysis_with_sources_options.rb +34 -0
- data/spec/dgit/plugins/join/test_join.rb +2 -7
- data/spec/dgit/plugins/join/test_join_with_addon.rb +6 -1
- data/spec/spec_helper.rb +1 -1
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea02ededd6c7a3836496975d8d994a75e131c4dc
|
4
|
+
data.tar.gz: efb7cd6e4cabca46c43449a71de61ed52b9233e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4eddd07d9a7102df17b2b8841d3f3c10ef11c1c60cb3d035cf43c3af5bcdc91c4adb5caa4ed814ab8d74dc97c8f6ff41ed0c98d43af3f9e76395163cb85d861
|
7
|
+
data.tar.gz: 59a4947128381985ad25d2b27aaa52b12ec48362c4cda8c0b885919fdab9504d54579dc15f29e5f841682e20c536e9e622c36df86fd82980d64a36dfa7e4bd13
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Changelog of Diggit
|
2
2
|
|
3
|
+
### Version 2.0.2
|
4
|
+
* Fixed analysis cleaning
|
5
|
+
* Fixed error in gemspec
|
6
|
+
* Now rspec is launched after rubocop.
|
7
|
+
* Dgit binary now takes a `-f` flag to indicates folder
|
8
|
+
* It is now possible to deletes joins and analyses from a dgit folder
|
9
|
+
* The `clone` commands has been renamed `clones` for consistency sake
|
10
|
+
|
3
11
|
### Version 2.0.1
|
4
12
|
* Removed `errors`command, merged with subcommands of `sources`
|
5
13
|
* Added a lot of documentation
|
data/bin/dgit
CHANGED
@@ -17,202 +17,211 @@
|
|
17
17
|
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#
|
19
19
|
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
20
|
-
#
|
21
20
|
|
22
21
|
require 'gli'
|
23
22
|
require_relative '../lib/dgit'
|
24
23
|
|
25
|
-
|
24
|
+
module Diggit
|
25
|
+
include GLI::App
|
26
26
|
|
27
|
-
|
27
|
+
extend self
|
28
|
+
program_desc 'A git repository analysis tool.'
|
28
29
|
|
29
|
-
switch [:v, :verbose], default_value: false, negatable: false, desc: "Indicates if the debug information are visible."
|
30
|
+
switch [:v, :verbose], default_value: false, negatable: false, desc: "Indicates if the debug information are visible."
|
31
|
+
flag [:f, :folder], default_value: ".", desc: "Path to the diggit folder. Default: current folder."
|
30
32
|
|
31
|
-
version Diggit::VERSION
|
33
|
+
version Diggit::VERSION
|
32
34
|
|
33
|
-
subcommand_option_handling :normal
|
34
|
-
arguments :strict
|
35
|
+
subcommand_option_handling :normal
|
36
|
+
arguments :strict
|
35
37
|
|
36
|
-
desc 'Init a diggit folder.'
|
37
|
-
skips_pre
|
38
|
-
command :init do |c|
|
39
|
-
|
40
|
-
|
41
|
-
|
38
|
+
desc 'Init a diggit folder.'
|
39
|
+
skips_pre
|
40
|
+
command :init do |c|
|
41
|
+
c.action do |globals, _options, _args|
|
42
|
+
Diggit::Dig.init_dir globals[:f]
|
43
|
+
Log.ok "Diggit folder initialized."
|
44
|
+
end
|
42
45
|
end
|
43
|
-
end
|
44
46
|
|
45
|
-
desc 'Display the status of the diggit folder.'
|
46
|
-
command :status do |c|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
47
|
+
desc 'Display the status of the diggit folder.'
|
48
|
+
command :status do |c|
|
49
|
+
c.action do |_global_options, _options, _args|
|
50
|
+
Log.info "Config"
|
51
|
+
Log.info "======"
|
52
|
+
Log.info "- Analyses: #{Diggit::Dig.it.config.get_analyses.join(', ')}"
|
53
|
+
Log.info "- Joins: #{Diggit::Dig.it.config.get_joins.join(', ')}"
|
54
|
+
Log.info ""
|
55
|
+
Log.info "Journal"
|
56
|
+
Log.info "======="
|
57
|
+
Log.info "- New sources:"
|
58
|
+
Log.indent do
|
59
|
+
Log.ok "* Ok: #{Diggit::Dig.it.journal.sources_by_state(:new).size}"
|
60
|
+
Log.error "* Error: #{Diggit::Dig.it.journal.sources_by_state(:new, true).size}"
|
61
|
+
end
|
62
|
+
Log.info "- Cloned sources:"
|
63
|
+
Log.indent do
|
64
|
+
Log.ok "* Ok: #{Diggit::Dig.it.journal.sources_by_state(:cloned).size}"
|
65
|
+
Log.error "* Error: #{Diggit::Dig.it.journal.sources_by_state(:cloned, true).size}"
|
66
|
+
end
|
64
67
|
end
|
65
68
|
end
|
66
|
-
end
|
67
69
|
|
68
|
-
desc 'Manage the sources of the diggit folder.'
|
69
|
-
command :sources do |c|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
70
|
+
desc 'Manage the sources of the diggit folder.'
|
71
|
+
command :sources do |c|
|
72
|
+
c.desc 'List the sources.'
|
73
|
+
c.command :list do |list|
|
74
|
+
list.action do |_global_options, _options, _args|
|
75
|
+
sources = Diggit::Dig.it.journal.sources
|
76
|
+
sources.each_index do |idx|
|
77
|
+
msg = "#{idx} #{sources[idx].url} (#{sources[idx].state})"
|
78
|
+
sources[idx].error? ? Log.error(msg) : Log.ok(msg)
|
79
|
+
end
|
77
80
|
end
|
78
81
|
end
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
82
|
+
c.desc 'Add a source.'
|
83
|
+
c.arg_name 'url'
|
84
|
+
c.command :add do |add|
|
85
|
+
add.action do |_global_options, _options, args|
|
86
|
+
Diggit::Dig.it.journal.add_source args[0]
|
87
|
+
end
|
85
88
|
end
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
89
|
+
c.desc 'Import sources from a file.'
|
90
|
+
c.arg_name 'file'
|
91
|
+
c.command :import do |import|
|
92
|
+
import.action do |_global_options, _options, args|
|
93
|
+
File.open(args[0]).each { |line| Diggit::Dig.it.journal.add_source(line) }
|
94
|
+
end
|
92
95
|
end
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
96
|
+
c.desc 'Display all sources in error.'
|
97
|
+
c.command :errors do |errors|
|
98
|
+
errors.action do |_global_options, _options, _args|
|
99
|
+
sources = Diggit::Dig.it.journal.sources
|
100
|
+
sources.each_index do |idx|
|
101
|
+
msg = "#{idx} #{sources[idx].url} (#{sources[idx].state})"
|
102
|
+
Log.error msg if sources[idx].error?
|
103
|
+
end
|
101
104
|
end
|
102
105
|
end
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
106
|
+
c.desc 'Display information on a source'
|
107
|
+
c.arg_name 'id'
|
108
|
+
c.command :info do |info|
|
109
|
+
info.action do |_global_options, _options, args|
|
110
|
+
src = Diggit::Dig.it.journal.sources_by_ids(args[0].to_i)[0]
|
111
|
+
url = "URL: #{src.url}"
|
112
|
+
src.error? ? Log.error(url) : Log.info(url)
|
113
|
+
Log.info "State: #{src.state}"
|
114
|
+
Log.info "Performed analyses: #{src.performed_analyses.join(', ')}" unless src.performed_analyses.empty?
|
115
|
+
Log.error "Ongoing analyses: #{src.ongoing_analyses.join(', ')}" unless src.ongoing_analyses.empty?
|
116
|
+
if src.error?
|
117
|
+
error = src.error
|
118
|
+
Log.indent do
|
119
|
+
Log.error error[:message]
|
120
|
+
Log.info error[:backtrace].join("\n")
|
121
|
+
end
|
119
122
|
end
|
120
123
|
end
|
121
124
|
end
|
125
|
+
c.default_command :list
|
122
126
|
end
|
123
|
-
c.default_command :list
|
124
|
-
end
|
125
127
|
|
126
|
-
desc 'Manage the joins of the diggit folder.'
|
127
|
-
command :joins do |c|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
128
|
+
desc 'Manage the joins of the diggit folder.'
|
129
|
+
command :joins do |c|
|
130
|
+
c.desc 'List the joins'
|
131
|
+
c.command :list do |list|
|
132
|
+
list.action do |_global_options, _options, _args|
|
133
|
+
Diggit::Dig.it.config.get_joins.each { |a| Log.info a.name }
|
134
|
+
end
|
132
135
|
end
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
136
|
+
c.desc 'Add a join.'
|
137
|
+
c.arg_name 'name'
|
138
|
+
c.command :add do |add|
|
139
|
+
add.action do |_global_options, _options, args|
|
140
|
+
Diggit::Dig.it.config.add_join args[0]
|
141
|
+
end
|
139
142
|
end
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
must_match: { "run" => :run, "clean" => :clean, "rerun" => :rerun }, default_value: :run
|
147
|
-
perform.action do |_global_options, options, _args|
|
148
|
-
Diggit::Dig.it.join(options[:s], options[:a], options[:m])
|
143
|
+
c.desc 'Delete a join.'
|
144
|
+
c.arg_name 'name'
|
145
|
+
c.command :del do |del|
|
146
|
+
del.action do |_global_options, _options, args|
|
147
|
+
Diggit::Dig.it.config.del_join args[0]
|
148
|
+
end
|
149
149
|
end
|
150
|
+
c.desc 'Perform joins.'
|
151
|
+
c.command :perform do |perform|
|
152
|
+
perform.flag [:s, :sources], desc: "list of sources", type: Array, default_value: []
|
153
|
+
perform.flag [:a, :analyses], desc: "list of analyses", type: Array, default_value: []
|
154
|
+
perform.flag [:m, :mode], desc: "running mode",
|
155
|
+
must_match: { "run" => :run, "clean" => :clean, "rerun" => :rerun }, default_value: :run
|
156
|
+
perform.action do |_global_options, options, _args|
|
157
|
+
Diggit::Dig.it.join(options[:s], options[:a], options[:m])
|
158
|
+
end
|
159
|
+
end
|
160
|
+
c.default_command :list
|
150
161
|
end
|
151
|
-
c.default_command :list
|
152
|
-
end
|
153
162
|
|
154
|
-
desc 'Manage the analyses of the diggit folder.'
|
155
|
-
command :analyses do |c|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
163
|
+
desc 'Manage the analyses of the diggit folder.'
|
164
|
+
command :analyses do |c|
|
165
|
+
c.desc 'List the analyses'
|
166
|
+
c.command :list do |list|
|
167
|
+
list.action do |_global_options, _options, _args|
|
168
|
+
Diggit::Dig.it.config.get_analyses.each { |a| Log.info a.name }
|
169
|
+
end
|
160
170
|
end
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
171
|
+
c.desc 'Add an analysis.'
|
172
|
+
c.arg_name 'name'
|
173
|
+
c.command :add do |add|
|
174
|
+
add.action do |_global_options, _options, args|
|
175
|
+
Diggit::Dig.it.config.add_analysis args[0]
|
176
|
+
end
|
167
177
|
end
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
178
|
+
c.desc 'Delete an analysis.'
|
179
|
+
c.arg_name 'name'
|
180
|
+
c.command :del do |del|
|
181
|
+
del.action do |_global_options, _options, args|
|
182
|
+
Diggit::Dig.it.config.del_analysis args[0]
|
183
|
+
end
|
174
184
|
end
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
185
|
+
c.desc 'Perform analyses.'
|
186
|
+
c.command :perform do |perform|
|
187
|
+
perform.flag [:s, :sources], desc: "list of sources", type: Array, default_value: []
|
188
|
+
perform.flag [:a, :analyses], desc: "list of analyses", type: Array, default_value: []
|
189
|
+
perform.flag [:m, :mode], desc: "running mode",
|
190
|
+
must_match: { "run" => :run, "clean" => :clean, "rerun" => :rerun }, default_value: :run
|
191
|
+
perform.action do |_global_options, options, _args|
|
192
|
+
Diggit::Dig.it.analyze(options[:s], options[:a], options[:m])
|
193
|
+
end
|
184
194
|
end
|
195
|
+
c.default_command :list
|
185
196
|
end
|
186
|
-
c.default_command :list
|
187
|
-
end
|
188
197
|
|
189
|
-
desc 'Manage clone actions.'
|
190
|
-
command :
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
198
|
+
desc 'Manage clone actions.'
|
199
|
+
command :clones do |c|
|
200
|
+
c.desc 'Perform the clones.'
|
201
|
+
c.command :perform do |perform|
|
202
|
+
perform.flag [:s, :sources], desc: "list of sources", type: Array, default_value: []
|
203
|
+
perform.action do |_global_options, options, _args|
|
204
|
+
Diggit::Dig.it.clone(*options[:s])
|
205
|
+
end
|
196
206
|
end
|
207
|
+
c.default_command :perform
|
208
|
+
end
|
209
|
+
pre do |globals, _command, _options, _args|
|
210
|
+
Diggit::Dig.init globals[:f]
|
211
|
+
Log.level = :fine if globals[:v]
|
212
|
+
true
|
197
213
|
end
|
198
|
-
c.default_command :perform
|
199
|
-
end
|
200
214
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
true
|
205
|
-
end
|
215
|
+
post do |_global, _command, _options, _args|
|
216
|
+
# Post logic here, skips_post to skip commands
|
217
|
+
end
|
206
218
|
|
207
|
-
|
208
|
-
|
209
|
-
|
219
|
+
on_error do |exception|
|
220
|
+
Log.error "Error running diggit."
|
221
|
+
Log.error exception.message
|
222
|
+
Log.info exception.backtrace.join("\n")
|
223
|
+
false
|
224
|
+
end
|
210
225
|
|
211
|
-
|
212
|
-
Log.error "Error running diggit."
|
213
|
-
Log.error exception.message
|
214
|
-
Log.info exception.backtrace.join("\n")
|
215
|
-
false
|
226
|
+
exit run(ARGV)
|
216
227
|
end
|
217
|
-
|
218
|
-
exit run(ARGV)
|
data/lib/dgit.rb
CHANGED
@@ -16,9 +16,8 @@
|
|
16
16
|
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
#
|
18
18
|
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
-
#
|
20
19
|
|
21
|
-
require_relative
|
22
|
-
require_relative
|
23
|
-
require_relative
|
24
|
-
require_relative
|
20
|
+
require_relative 'dgit/core'
|
21
|
+
require_relative 'dgit/plugins'
|
22
|
+
require_relative 'dgit/version'
|
23
|
+
require_relative 'dgit/log'
|
data/lib/dgit/core.rb
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
#
|
18
18
|
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
-
#
|
19
|
+
# Copyright 2015 Matthieu Foucault <foucaultmatthieu@gmail.com>
|
20
20
|
|
21
21
|
require 'oj'
|
22
22
|
require 'rugged'
|
@@ -113,6 +113,11 @@ module Diggit
|
|
113
113
|
@entry[:ongoing_analyses]
|
114
114
|
end
|
115
115
|
|
116
|
+
def clean_analysis(analysis)
|
117
|
+
performed_analyses.delete_if { |e| e == analysis.name }
|
118
|
+
ongoing_analyses.delete_if { |e| e == analysis.name }
|
119
|
+
end
|
120
|
+
|
116
121
|
def clone
|
117
122
|
if File.exist?(folder)
|
118
123
|
Rugged::Repository.new(folder)
|
@@ -120,6 +125,7 @@ module Diggit
|
|
120
125
|
Rugged::Repository.clone_at(url, folder)
|
121
126
|
end
|
122
127
|
self.state = :cloned
|
128
|
+
self.error = nil
|
123
129
|
rescue => e
|
124
130
|
Log.error "Error cloning #{url}."
|
125
131
|
self.error = Journal.dump_error(e)
|
@@ -226,11 +232,11 @@ module Diggit
|
|
226
232
|
end
|
227
233
|
|
228
234
|
def to_hash
|
229
|
-
{ analyses: @analyses.map(&:
|
235
|
+
{ analyses: @analyses.map(&:simple_name), joins: @joins.map(&:simple_name) }
|
230
236
|
end
|
231
237
|
|
232
238
|
def add_analysis(name)
|
233
|
-
load_analysis(name) unless @analyses.map(&:
|
239
|
+
load_analysis(name) unless @analyses.map(&:simple_name).include?(name)
|
234
240
|
Dig.it.save_config
|
235
241
|
end
|
236
242
|
|
@@ -239,17 +245,17 @@ module Diggit
|
|
239
245
|
end
|
240
246
|
|
241
247
|
def del_analysis(name)
|
242
|
-
@analyses.delete_if { |a| a.
|
248
|
+
@analyses.delete_if { |a| a.simple_name == name }
|
243
249
|
Dig.it.save_config
|
244
250
|
end
|
245
251
|
|
246
252
|
def get_analyses(*names)
|
247
253
|
return analyses if names.empty?
|
248
|
-
analyses.select { |a| names.include?(a.
|
254
|
+
analyses.select { |a| names.include?(a.simple_name) }
|
249
255
|
end
|
250
256
|
|
251
257
|
def add_join(name)
|
252
|
-
load_join(name) unless @joins.map(&:
|
258
|
+
load_join(name) unless @joins.map(&:simple_name).include?(name)
|
253
259
|
Dig.it.save_config
|
254
260
|
end
|
255
261
|
|
@@ -258,13 +264,13 @@ module Diggit
|
|
258
264
|
end
|
259
265
|
|
260
266
|
def del_join(name)
|
261
|
-
@joins.delete_if { |j| j.
|
267
|
+
@joins.delete_if { |j| j.simple_name == name }
|
262
268
|
Dig.it.save_config
|
263
269
|
end
|
264
270
|
|
265
271
|
def get_joins(*names)
|
266
272
|
return joins if names.empty?
|
267
|
-
joins.select { |j| joins.include?(j.
|
273
|
+
joins.select { |j| joins.include?(j.simple_name) }
|
268
274
|
end
|
269
275
|
|
270
276
|
def self.empty_config
|
@@ -303,7 +309,7 @@ module Diggit
|
|
303
309
|
end
|
304
310
|
|
305
311
|
def self.plugin_paths(name, type, root)
|
306
|
-
Dir.glob(File.join(root, 'plugins', type.to_s, '**', "#{name}.rb"))
|
312
|
+
Dir.glob(File.join(root, 'plugins', type.to_s, '**{,/*/**}', "#{name}.rb"))
|
307
313
|
end
|
308
314
|
|
309
315
|
# Constructor. Should not be called directly. Use {.instance} instead.
|
@@ -386,7 +392,7 @@ module Diggit
|
|
386
392
|
end
|
387
393
|
|
388
394
|
# Initialize and return the diggit instance into the given folder.
|
389
|
-
# @param folder the path to the folder.
|
395
|
+
# @param folder [String] the path to the folder.
|
390
396
|
# @return [Dig] the instance.
|
391
397
|
def self.init(folder = '.')
|
392
398
|
@diggit = Dig.new(folder)
|
@@ -401,7 +407,7 @@ module Diggit
|
|
401
407
|
# It creates a +sources+ folder.
|
402
408
|
# It creates a +plugins+ folder.
|
403
409
|
# Directory creation is skipped if folder already exist.
|
404
|
-
# @param folder the path to the folder.
|
410
|
+
# @param folder [String] the path to the folder.
|
405
411
|
# @return [void]
|
406
412
|
def self.init_dir(folder = '.')
|
407
413
|
dgit_folder = File.expand_path(DGIT_FOLDER, folder)
|
@@ -541,7 +547,7 @@ module Diggit
|
|
541
547
|
|
542
548
|
def clean_analysis(s, a)
|
543
549
|
a.clean
|
544
|
-
s.
|
550
|
+
s.clean_analysis(a)
|
545
551
|
ensure
|
546
552
|
save_journal
|
547
553
|
end
|
data/lib/dgit/log.rb
CHANGED
@@ -16,7 +16,6 @@
|
|
16
16
|
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
#
|
18
18
|
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
-
#
|
20
19
|
|
21
20
|
require 'formatador'
|
22
21
|
|
@@ -48,7 +47,7 @@ class Formatador
|
|
48
47
|
end
|
49
48
|
|
50
49
|
def self.visible(method)
|
51
|
-
target
|
50
|
+
target = method.to_sym
|
52
51
|
if target == :ok || target == :error || target == :info
|
53
52
|
true
|
54
53
|
elsif (target == :warn || target == :debug) && level == :fine
|
data/lib/dgit/plugins.rb
CHANGED
@@ -16,7 +16,6 @@
|
|
16
16
|
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
#
|
18
18
|
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
-
#
|
20
19
|
|
21
20
|
require_relative 'core'
|
22
21
|
|
@@ -33,13 +32,27 @@ module Diggit
|
|
33
32
|
@options = options
|
34
33
|
end
|
35
34
|
|
35
|
+
# Returns the name of the plugin class
|
36
|
+
# @return [String]
|
36
37
|
def name
|
37
38
|
self.class.name
|
38
39
|
end
|
39
40
|
|
41
|
+
# Returns the name of the plugin class
|
42
|
+
# @return [String]
|
40
43
|
def self.name
|
41
44
|
to_s.underscore
|
42
45
|
end
|
46
|
+
|
47
|
+
# Returns the value of a plugin option
|
48
|
+
# @param ns [Symbol] the name of the option's namespace
|
49
|
+
# @param opt [Symbol] the name of the option
|
50
|
+
# @param default [Object] the default value
|
51
|
+
# @return [Object]
|
52
|
+
def read_option(ns, opt, default)
|
53
|
+
return @options[ns][opt] if @options.key?(ns) && @options[ns].key?(opt)
|
54
|
+
default
|
55
|
+
end
|
43
56
|
end
|
44
57
|
|
45
58
|
class Addon < Plugin
|
@@ -48,7 +61,9 @@ module Diggit
|
|
48
61
|
end
|
49
62
|
end
|
50
63
|
|
51
|
-
# Base class for analyses and joins.
|
64
|
+
# Base class for analyses and joins.
|
65
|
+
# Runnables can be runned or cleaned.
|
66
|
+
# A clean of a runnable should always work, even if it has never been run.
|
52
67
|
# These methods have to be implemented in the subclasses.
|
53
68
|
# Addons can be made available to a runnable through a call to {.require\_addons}.
|
54
69
|
# Addons can be accessed through the addons attribute, and they contain
|
@@ -81,7 +96,7 @@ module Diggit
|
|
81
96
|
|
82
97
|
# Add an addon as a required addon.
|
83
98
|
#
|
84
|
-
# @param names Array<String> the names of addons to require.
|
99
|
+
# @param names [Array<String>] the names of addons to require.
|
85
100
|
# They correspond to the name of their class with underscore case.
|
86
101
|
# @return [void]
|
87
102
|
def self.require_addons(*names)
|
@@ -89,8 +104,9 @@ module Diggit
|
|
89
104
|
end
|
90
105
|
|
91
106
|
def self.required_addons
|
92
|
-
|
93
|
-
@required_addons
|
107
|
+
base_addons = superclass < Runnable ? superclass.required_addons : []
|
108
|
+
return base_addons if @required_addons.nil?
|
109
|
+
base_addons + @required_addons
|
94
110
|
end
|
95
111
|
end
|
96
112
|
|
@@ -128,7 +144,7 @@ module Diggit
|
|
128
144
|
|
129
145
|
# Add an analysis as a required analysis.
|
130
146
|
#
|
131
|
-
# @param names Array<String> the names of analyses to require.
|
147
|
+
# @param names [Array<String>] the names of analyses to require.
|
132
148
|
# They correspond to the name of their class with underscore case.
|
133
149
|
# @return [void]
|
134
150
|
def self.require_analyses(*names)
|
@@ -169,5 +185,12 @@ module Diggit
|
|
169
185
|
super(options)
|
170
186
|
@source = nil
|
171
187
|
end
|
188
|
+
|
189
|
+
# Returns the rugged repository associated to the source.
|
190
|
+
#
|
191
|
+
# @return [Rugged::Repository]
|
192
|
+
def repo
|
193
|
+
@source.repository
|
194
|
+
end
|
172
195
|
end
|
173
196
|
end
|
data/lib/dgit/version.rb
CHANGED
data/plugins/addon/db.rb
CHANGED
@@ -16,7 +16,6 @@
|
|
16
16
|
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
#
|
18
18
|
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
-
#
|
20
19
|
|
21
20
|
require 'mongo'
|
22
21
|
|
@@ -26,14 +25,20 @@ require 'mongo'
|
|
26
25
|
# @!attribute [r] db
|
27
26
|
# @return [Mongo::DB] the mongo database object.
|
28
27
|
class Db < Diggit::Addon
|
29
|
-
|
28
|
+
DEFAULT_SERVER = '127.0.0.1:27017'
|
29
|
+
DEFAULT_DB = 'diggit'
|
30
30
|
|
31
31
|
attr_reader :client
|
32
32
|
|
33
33
|
def initialize(*args)
|
34
34
|
super
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
Mongo::Logger.logger.level = ::Logger::FATAL
|
36
|
+
server = read_option(:mongo, :server, DEFAULT_SERVER)
|
37
|
+
db = read_option(:mongo, :db, DEFAULT_DB)
|
38
|
+
@client = Mongo::Client.new([server], database: db)
|
39
|
+
end
|
40
|
+
|
41
|
+
def insert(collection, data)
|
42
|
+
client[collection].bulk_write(data.map { |d| { insert_one: d } }, ordered: true) unless data.empty?
|
38
43
|
end
|
39
44
|
end
|
data/plugins/addon/out.rb
CHANGED
@@ -16,7 +16,6 @@
|
|
16
16
|
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
#
|
18
18
|
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
-
#
|
20
19
|
|
21
20
|
# A output addon for Diggit. The name of the addon is :output, and can be reached in the
|
22
21
|
# addons hash. This addon might use an :output hash in the global options. In this hash, the
|
data/plugins/addon/r.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This file is part of Diggit.
|
4
|
+
#
|
5
|
+
# Diggit is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# Diggit is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#
|
18
|
+
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
+
# Copyright 2015 Matthieu Foucault <foucaultmatthieu@gmail.com>
|
20
|
+
|
21
|
+
# Manages options that are specific to a given source
|
22
|
+
class SrcOpt < Diggit::Addon
|
23
|
+
SOURCES_OPTIONS_FILE = 'sources_options'
|
24
|
+
|
25
|
+
def initialize(*args)
|
26
|
+
super
|
27
|
+
sources_options_path = Diggit::Dig.it.config_path(SOURCES_OPTIONS_FILE)
|
28
|
+
@sources_options = {}
|
29
|
+
@sources_options = Oj.load_file(sources_options_path) if File.exist? sources_options_path
|
30
|
+
end
|
31
|
+
|
32
|
+
def [](source)
|
33
|
+
@sources_options[source.url]
|
34
|
+
end
|
35
|
+
end
|
data/plugins/analysis/cloc.rb
CHANGED
@@ -16,7 +16,6 @@
|
|
16
16
|
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
#
|
18
18
|
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
-
#
|
20
19
|
|
21
20
|
require 'yaml'
|
22
21
|
|
@@ -28,15 +27,22 @@ class Cloc < Diggit::Analysis
|
|
28
27
|
end
|
29
28
|
|
30
29
|
def run
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
30
|
+
walker = Rugged::Walker.new(repo)
|
31
|
+
walker.sorting(Rugged::SORT_TOPO | Rugged::SORT_REVERSE)
|
32
|
+
walker.push(repo.head.name)
|
33
|
+
walker.each do |c|
|
34
|
+
repo.checkout(c.oid, { strategy: [:force, :remove_untracked] })
|
35
|
+
cloc = `cloc #{@source.folder} --progress-rate=0 --quiet --yaml`
|
36
|
+
next if cloc.empty?
|
37
|
+
yaml = YAML.load(cloc.lines[2..-1].join)
|
38
|
+
yaml.delete('header')
|
39
|
+
output = { source: @source.url, commit: c.oid, cloc: yaml }
|
40
|
+
db.client['cloc'].insert_one(output)
|
41
|
+
end
|
37
42
|
end
|
38
43
|
|
39
44
|
def clean
|
40
|
-
db.client['cloc'].find({ source: @source.url }).
|
45
|
+
db.client['cloc'].find({ source: @source.url }).delete_many
|
46
|
+
repo.checkout('master')
|
41
47
|
end
|
42
48
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This file is part of Diggit.
|
4
|
+
#
|
5
|
+
# Diggit is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# Diggit is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#
|
18
|
+
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
+
# Copyright 2015 Matthieu Foucault <foucaultmatthieu@gmail.com>
|
20
|
+
|
21
|
+
class ClocPerFile < Diggit::Analysis
|
22
|
+
require_addons 'db', 'src_opt'
|
23
|
+
|
24
|
+
def run
|
25
|
+
commit_oid = src_opt[@source]["cloc-commit-id"] unless src_opt[@source].nil?
|
26
|
+
commit_oid = 'HEAD' if commit_oid.nil?
|
27
|
+
repo.checkout(commit_oid, { strategy: [:force, :remove_untracked] })
|
28
|
+
folder = File.expand_path(@source.folder)
|
29
|
+
cloc = `cloc #{folder} --progress-rate=0 --quiet --by-file --yaml --script-lang=Python,python`
|
30
|
+
return if cloc.empty?
|
31
|
+
yaml = YAML.load(cloc.lines[2..-1].join)
|
32
|
+
yaml.delete('header')
|
33
|
+
yaml.delete('SUM')
|
34
|
+
cloc_a = []
|
35
|
+
yaml.each do |key, value|
|
36
|
+
# transform the hash so the filenames are not keys anymore (as they may contain a '.' it is incompatible with mongo)
|
37
|
+
path = File.expand_path(key).gsub(folder, '').gsub(%r{^/}, '')
|
38
|
+
cloc_a << value.merge({ path: path })
|
39
|
+
end
|
40
|
+
output = { source: @source.url, commit_oid: commit_oid.to_s, cloc: cloc_a }
|
41
|
+
col = db.client['cloc-file']
|
42
|
+
col.insert_one(output)
|
43
|
+
end
|
44
|
+
|
45
|
+
def clean
|
46
|
+
db.client['cloc-file'].find({ source: @source.url }).delete_one
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This file is part of Diggit.
|
4
|
+
#
|
5
|
+
# Diggit is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# Diggit is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#
|
18
|
+
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
+
|
20
|
+
require 'fileutils'
|
21
|
+
|
22
|
+
class Tex < Diggit::Analysis
|
23
|
+
require_addons 'out'
|
24
|
+
|
25
|
+
def initialize(options)
|
26
|
+
super(options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def run
|
30
|
+
walker = Rugged::Walker.new(repo)
|
31
|
+
walker.sorting(Rugged::SORT_TOPO | Rugged::SORT_REVERSE)
|
32
|
+
walker.push(repo.head.name)
|
33
|
+
walker.each do |c|
|
34
|
+
repo.checkout(c.oid, { strategy: [:force, :remove_untracked] })
|
35
|
+
words = Dir["**/*.tex"].reduce(0) { |a, e| a + `cat "#{e}" | wc -w`.to_i }
|
36
|
+
File.open(file, 'a') { |f| f.puts("#{source.url};#{c.oid};#{words}\n") }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def clean
|
41
|
+
FileUtils.rm_rf(file)
|
42
|
+
repo.checkout("master")
|
43
|
+
end
|
44
|
+
|
45
|
+
def file
|
46
|
+
"#{out.out}/words.csv"
|
47
|
+
end
|
48
|
+
end
|
data/spec/core_spec.rb
CHANGED
@@ -16,7 +16,6 @@
|
|
16
16
|
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
#
|
18
18
|
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
-
#
|
20
19
|
|
21
20
|
require 'spec_helper'
|
22
21
|
require 'fileutils'
|
@@ -110,9 +109,10 @@ RSpec.describe Diggit::Dig do
|
|
110
109
|
|
111
110
|
it "should perform analyses in order" do
|
112
111
|
Diggit::Dig.it.config.add_analysis("test_analysis")
|
112
|
+
expect_any_instance_of(TestAnalysis).to receive(:run)
|
113
113
|
Diggit::Dig.it.config.add_analysis("test_analysis_with_addon")
|
114
|
+
expect_any_instance_of(TestAnalysisWithAddon).to receive(:run)
|
114
115
|
Diggit::Dig.it.analyze
|
115
|
-
# expect(TestAnalysis.state).to eq("runned")
|
116
116
|
expect(Diggit::Dig.it.journal.sources_by_ids(0)[0].all_analyses).to eq(%w(test_analysis test_analysis_with_addon))
|
117
117
|
Diggit::Dig.init("spec/dgit")
|
118
118
|
expect(Diggit::Dig.it.journal.sources_by_ids(0)[0].all_analyses).to eq(%w(test_analysis test_analysis_with_addon))
|
@@ -130,10 +130,38 @@ RSpec.describe Diggit::Dig do
|
|
130
130
|
it "should perform joins" do
|
131
131
|
Diggit::Dig.it.config.add_join("test_join")
|
132
132
|
Diggit::Dig.it.config.add_join("test_join_with_addon")
|
133
|
+
expect_any_instance_of(TestJoin).to receive(:run)
|
134
|
+
expect_any_instance_of(TestJoinWithAddon).not_to receive(:run)
|
133
135
|
Diggit::Dig.it.join
|
134
136
|
expect(Diggit::Dig.it.journal.join?("test_join")).to be true
|
135
|
-
expect(TestJoin.sources.size).to eq 1
|
136
|
-
expect(TestJoin.sources[0].url).to eq TEST_URL
|
137
137
|
expect(Diggit::Dig.it.journal.join?("test_join_with_addon")).to be false
|
138
138
|
end
|
139
|
+
|
140
|
+
it "should clean joins" do
|
141
|
+
expect_any_instance_of(TestJoin).to receive(:clean)
|
142
|
+
expect_any_instance_of(TestJoinWithAddon).to receive(:clean)
|
143
|
+
Diggit::Dig.it.join([], [], :clean)
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should clean analyses" do
|
147
|
+
expect_any_instance_of(TestAnalysis).to receive(:clean)
|
148
|
+
expect_any_instance_of(TestAnalysisWithAddon).to receive(:clean)
|
149
|
+
Diggit::Dig.it.analyze([], [], :clean)
|
150
|
+
expect(Diggit::Dig.it.journal.sources_by_ids(0)[0].all_analyses).to eq([])
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should read source options" do
|
154
|
+
File.open("spec/dgit/.dgit/sources_options", "w") do |f|
|
155
|
+
f.write('{
|
156
|
+
"https://github.com/jrfaller/test-git.git":{
|
157
|
+
"myOption":"myValue"
|
158
|
+
}
|
159
|
+
}')
|
160
|
+
end
|
161
|
+
|
162
|
+
Diggit::Dig.it.config.add_analysis("test_analysis_with_sources_options")
|
163
|
+
expect { Diggit::Dig.it.analyze }.to output(/myValue/).to_stdout
|
164
|
+
Diggit::Dig.it.analyze([], [], :clean)
|
165
|
+
Diggit::Dig.it.config.del_analysis("test_analysis_with_sources_options")
|
166
|
+
end
|
139
167
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This file is part of Diggit.
|
4
|
+
#
|
5
|
+
# Diggit is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# Diggit is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#
|
18
|
+
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
+
#
|
20
|
+
|
21
|
+
class TestAnalysisWithSourcesOptions < Diggit::Analysis
|
22
|
+
require_addons "src_opt"
|
23
|
+
|
24
|
+
def initialize(*args)
|
25
|
+
super(args)
|
26
|
+
end
|
27
|
+
|
28
|
+
def run
|
29
|
+
p(src_opt[@source]["myOption"])
|
30
|
+
end
|
31
|
+
|
32
|
+
def clean
|
33
|
+
end
|
34
|
+
end
|
@@ -16,18 +16,13 @@
|
|
16
16
|
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
#
|
18
18
|
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
-
#
|
20
19
|
|
21
20
|
class TestJoin < Diggit::Join
|
22
21
|
require_analyses 'test_analysis'
|
23
22
|
|
24
|
-
|
25
|
-
attr_accessor :sources
|
23
|
+
def run
|
26
24
|
end
|
27
25
|
|
28
|
-
|
29
|
-
|
30
|
-
def run
|
31
|
-
self.class.sources = @sources
|
26
|
+
def clean
|
32
27
|
end
|
33
28
|
end
|
@@ -16,9 +16,14 @@
|
|
16
16
|
# along with Diggit. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
#
|
18
18
|
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
-
#
|
20
19
|
|
21
20
|
class TestJoinWithAddon < Diggit::Join
|
22
21
|
require_addons 'test_addon'
|
23
22
|
require_analyses 'test_analysis_with_error'
|
23
|
+
|
24
|
+
def run
|
25
|
+
end
|
26
|
+
|
27
|
+
def clean
|
28
|
+
end
|
24
29
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: diggit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean-Rémy Falleri
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-10-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rugged
|
@@ -173,7 +173,10 @@ files:
|
|
173
173
|
- plugins/addon/db.rb
|
174
174
|
- plugins/addon/out.rb
|
175
175
|
- plugins/addon/r.rb
|
176
|
+
- plugins/addon/src_opt.rb
|
176
177
|
- plugins/analysis/cloc.rb
|
178
|
+
- plugins/analysis/cloc_per_file.rb
|
179
|
+
- plugins/analysis/tex.rb
|
177
180
|
- spec/core_spec.rb
|
178
181
|
- spec/dgit/plugins/addon/test_addon.rb
|
179
182
|
- spec/dgit/plugins/analysis/duplicate_analysis.rb
|
@@ -182,6 +185,7 @@ files:
|
|
182
185
|
- spec/dgit/plugins/analysis/test_analysis.rb
|
183
186
|
- spec/dgit/plugins/analysis/test_analysis_with_addon.rb
|
184
187
|
- spec/dgit/plugins/analysis/test_analysis_with_error.rb
|
188
|
+
- spec/dgit/plugins/analysis/test_analysis_with_sources_options.rb
|
185
189
|
- spec/dgit/plugins/join/test_join.rb
|
186
190
|
- spec/dgit/plugins/join/test_join_with_addon.rb
|
187
191
|
- spec/spec_helper.rb
|
@@ -205,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
205
209
|
version: '0'
|
206
210
|
requirements: []
|
207
211
|
rubyforge_project:
|
208
|
-
rubygems_version: 2.4.5
|
212
|
+
rubygems_version: 2.4.5.1
|
209
213
|
signing_key:
|
210
214
|
specification_version: 4
|
211
215
|
summary: A Git repository analysis tool.
|