diggit 3.0.3 → 3.0.5
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 +4 -4
- data/CHANGELOG.md +9 -0
- data/bin/dgit +2 -0
- data/lib/dgit.rb +2 -0
- data/lib/dgit/core.rb +22 -8
- data/lib/dgit/entries.rb +9 -6
- data/lib/dgit/log.rb +2 -0
- data/lib/dgit/plugins.rb +8 -3
- data/lib/dgit/version.rb +3 -1
- data/plugins/addon/db.rb +4 -2
- data/plugins/addon/out.rb +4 -2
- data/plugins/addon/r.rb +2 -0
- data/plugins/addon/src_opt.rb +3 -1
- data/plugins/analysis/cloc.rb +3 -0
- data/plugins/analysis/cloc_per_file.rb +3 -0
- data/plugins/analysis/conflict_merge.rb +7 -1
- data/plugins/analysis/diff_extractor.rb +79 -0
- data/plugins/analysis/git_graph.rb +61 -0
- data/plugins/analysis/javadoc.rb +24 -17
- data/plugins/analysis/words.rb +2 -0
- data/plugins/analysis/yard_dup.rb +6 -2
- data/spec/cli_spec.rb +2 -0
- data/spec/core_spec.rb +2 -0
- data/spec/dgit/plugins/addon/test_addon.rb +2 -0
- data/spec/dgit/plugins/analysis/duplicate_analysis.rb +2 -0
- data/spec/dgit/plugins/analysis/my_module/duplicate_analysis.rb +2 -0
- data/spec/dgit/plugins/analysis/my_module/other_analysis.rb +2 -0
- data/spec/dgit/plugins/analysis/test_analysis.rb +2 -0
- data/spec/dgit/plugins/analysis/test_analysis_with_addon.rb +2 -0
- data/spec/dgit/plugins/analysis/test_analysis_with_clean_error.rb +2 -0
- data/spec/dgit/plugins/analysis/test_analysis_with_error.rb +2 -0
- data/spec/dgit/plugins/analysis/test_analysis_with_sources_options.rb +2 -0
- data/spec/dgit/plugins/join/test_join.rb +2 -0
- data/spec/dgit/plugins/join/test_join_with_addon.rb +2 -0
- data/spec/dgit/plugins/join/test_join_with_clean_error.rb +2 -0
- data/spec/dgit/plugins/join/test_join_with_error.rb +2 -0
- data/spec/spec_helper.rb +5 -3
- metadata +10 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 81fec8c5e4a7863093a7567a1a8f9264f6c64103dc2b4cbe91627fd17336af72
|
4
|
+
data.tar.gz: 99bb44395681d891bdfaf95e20091c5c5a1de5a27f686fc980b531d6ebf51a19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ab104838efaf730b13437caaa57be9ccee935b2525fbdad726d609d9952c4b3c0db9d5ab993d0dff7e4b0045e0439b7531d60fe10ca589fc11fb86f65bb9195
|
7
|
+
data.tar.gz: 9db2fb9809038b59cc3f4493d10dbf9d8962f2710b294ede584c1bfb5cbf511751e115653a0126b5cff4601e8baedb475a723c6948eaaa6d1fbf6e30776bd6a3
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# Changelog of Diggit
|
2
2
|
|
3
|
+
### Version 3.0.5
|
4
|
+
* Dummy version to fix travis errors
|
5
|
+
|
6
|
+
### Version 3.0.4
|
7
|
+
* New graph analysis
|
8
|
+
* New diff extractor analysis
|
9
|
+
* Updated dependencies
|
10
|
+
* Upgrade min ruby version to 2.4
|
11
|
+
|
3
12
|
### Version 3.0.3
|
4
13
|
* New yard analysis
|
5
14
|
* Add code of conduct
|
data/bin/dgit
CHANGED
data/lib/dgit.rb
CHANGED
data/lib/dgit/core.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This file is part of Diggit.
|
2
4
|
#
|
3
5
|
# Diggit is free software: you can redistribute it and/or modify
|
@@ -41,6 +43,7 @@ class String
|
|
41
43
|
# @return [String]
|
42
44
|
def camel_case
|
43
45
|
return self if self !~ /_/ && self =~ /[A-Z]+.*/
|
46
|
+
|
44
47
|
split('_').map(&:capitalize).join
|
45
48
|
end
|
46
49
|
|
@@ -62,7 +65,7 @@ end
|
|
62
65
|
|
63
66
|
module Diggit
|
64
67
|
class Source
|
65
|
-
DEFAULT_BRANCH = "origin/master"
|
68
|
+
DEFAULT_BRANCH = "origin/master"
|
66
69
|
|
67
70
|
attr_reader :url, :repository, :entry, :oid
|
68
71
|
|
@@ -76,6 +79,7 @@ module Diggit
|
|
76
79
|
|
77
80
|
def full_url
|
78
81
|
return @url if @oid.eql?(DEFAULT_BRANCH)
|
82
|
+
|
79
83
|
"#{@url}|#{@oid}"
|
80
84
|
end
|
81
85
|
|
@@ -100,6 +104,7 @@ module Diggit
|
|
100
104
|
|
101
105
|
def load_repository
|
102
106
|
raise "Source not cloned #{url}." if @entry.new?
|
107
|
+
|
103
108
|
@repository = Rugged::Repository.new(folder)
|
104
109
|
@repository.checkout(@oid, { strategy: :force })
|
105
110
|
end
|
@@ -123,10 +128,12 @@ module Diggit
|
|
123
128
|
|
124
129
|
def sources_by_ids(*ids)
|
125
130
|
return sources if ids.empty?
|
131
|
+
|
126
132
|
source_array = sources
|
127
133
|
result = []
|
128
134
|
ids.each do |id|
|
129
135
|
raise "No such source index #{id}." if id >= source_array.length
|
136
|
+
|
130
137
|
result << source_array[id]
|
131
138
|
end
|
132
139
|
result
|
@@ -184,6 +191,7 @@ module Diggit
|
|
184
191
|
|
185
192
|
def get_analyses(*names)
|
186
193
|
return analyses if names.empty?
|
194
|
+
|
187
195
|
analyses.select { |a| names.include?(a.simple_name) }
|
188
196
|
end
|
189
197
|
|
@@ -208,6 +216,7 @@ module Diggit
|
|
208
216
|
|
209
217
|
def get_joins(*names)
|
210
218
|
return joins if names.empty?
|
219
|
+
|
211
220
|
joins.select { |j| joins.include?(j.simple_name) }
|
212
221
|
end
|
213
222
|
|
@@ -237,6 +246,7 @@ module Diggit
|
|
237
246
|
plugin = search_plugin(name, type)
|
238
247
|
raise "Plugin #{name} not found." unless plugin
|
239
248
|
return plugin.new(Dig.it.options) if instance
|
249
|
+
|
240
250
|
plugin
|
241
251
|
end
|
242
252
|
|
@@ -261,6 +271,7 @@ module Diggit
|
|
261
271
|
plugins = ObjectSpace.each_object(Class).select { |c| c < base_class && c.simple_name == name }
|
262
272
|
|
263
273
|
raise "No plugin #{name} of kind #{type} found." if plugins.empty?
|
274
|
+
|
264
275
|
warn "Ambiguous plugin name: several plugins of kind #{type} named #{name} were found." if plugins.size > 1
|
265
276
|
|
266
277
|
@plugins[name] = plugins[0]
|
@@ -301,11 +312,11 @@ module Diggit
|
|
301
312
|
# @!attribute [r] plugin_loader
|
302
313
|
# @return [PluginLoader] utility classes to load plugins.
|
303
314
|
class Dig
|
304
|
-
DGIT_FOLDER = ".dgit"
|
305
|
-
DGIT_SOURCES = "sources"
|
306
|
-
DGIT_CONFIG = "config"
|
307
|
-
DGIT_OPTIONS = "options"
|
308
|
-
DGIT_JOURNAL = "journal"
|
315
|
+
DGIT_FOLDER = ".dgit"
|
316
|
+
DGIT_SOURCES = "sources"
|
317
|
+
DGIT_CONFIG = "config"
|
318
|
+
DGIT_OPTIONS = "options"
|
319
|
+
DGIT_JOURNAL = "journal"
|
309
320
|
|
310
321
|
private_constant :DGIT_SOURCES, :DGIT_CONFIG, :DGIT_OPTIONS, :DGIT_JOURNAL
|
311
322
|
|
@@ -317,6 +328,7 @@ module Diggit
|
|
317
328
|
# @return [Dig] the instance.
|
318
329
|
def self.it
|
319
330
|
raise "Diggit has not been initialized." if @diggit.nil?
|
331
|
+
|
320
332
|
@diggit
|
321
333
|
end
|
322
334
|
|
@@ -348,6 +360,7 @@ module Diggit
|
|
348
360
|
end
|
349
361
|
FileUtils.mkdir(File.expand_path('sources', folder)) unless File.exist?(File.expand_path('sources', folder))
|
350
362
|
return if File.exist?(File.expand_path("plugins", folder))
|
363
|
+
|
351
364
|
FileUtils.mkdir_p(File.expand_path("plugins", folder))
|
352
365
|
FileUtils.mkdir_p(File.expand_path("plugins/analysis", folder))
|
353
366
|
FileUtils.mkdir_p(File.expand_path("plugins/addon", folder))
|
@@ -373,6 +386,7 @@ module Diggit
|
|
373
386
|
# @return [Dig] a diggit object.
|
374
387
|
def initialize(folder)
|
375
388
|
raise "Folder #{folder} is not a diggit folder." unless File.exist?(File.expand_path(DGIT_FOLDER, folder))
|
389
|
+
|
376
390
|
@plugin_loader = PluginLoader.instance
|
377
391
|
@folder = folder
|
378
392
|
end
|
@@ -471,11 +485,11 @@ module Diggit
|
|
471
485
|
private
|
472
486
|
|
473
487
|
def clean_mode?(mode)
|
474
|
-
|
488
|
+
%i[rerun clean].include?(mode)
|
475
489
|
end
|
476
490
|
|
477
491
|
def run_mode?(mode)
|
478
|
-
|
492
|
+
%i[rerun run].include?(mode)
|
479
493
|
end
|
480
494
|
|
481
495
|
def clean(runnable, placeholder)
|
data/lib/dgit/entries.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This file is part of Diggit.
|
2
4
|
#
|
3
5
|
# Diggit is free software: you can redistribute it and/or modify
|
@@ -24,10 +26,10 @@ module Diggit
|
|
24
26
|
attr_reader :error
|
25
27
|
|
26
28
|
# Set the error of the entry.
|
27
|
-
# @param
|
29
|
+
# @param err [Exception, nil] the error, to indicate an absence of error, pass +nil+.
|
28
30
|
# @return [void]
|
29
|
-
def error=(
|
30
|
-
@error =
|
31
|
+
def error=(err)
|
32
|
+
@error = err.nil? ? nil : ErrorEntry.new(err)
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
@@ -57,9 +59,9 @@ module Diggit
|
|
57
59
|
# @return [Boolean]
|
58
60
|
def has?(runnable_or_string, state = :all)
|
59
61
|
name = retrieve_name(runnable_or_string)
|
60
|
-
return @performed.count { |e| e.name == name }
|
61
|
-
return @canceled.count { |e| e.name == name }
|
62
|
-
return (@performed + @canceled).count { |e| e.name == name }
|
62
|
+
return @performed.count { |e| e.name == name }.positive? if state == :performed
|
63
|
+
return @canceled.count { |e| e.name == name }.positive? if state == :canceled
|
64
|
+
return (@performed + @canceled).count { |e| e.name == name }.positive? if state == :all
|
63
65
|
end
|
64
66
|
|
65
67
|
# Remove a runnable from all the entries.
|
@@ -75,6 +77,7 @@ module Diggit
|
|
75
77
|
|
76
78
|
def retrieve_name(runnable_or_string)
|
77
79
|
return runnable_or_string if runnable_or_string.is_a? String
|
80
|
+
|
78
81
|
runnable_or_string.name
|
79
82
|
end
|
80
83
|
end
|
data/lib/dgit/log.rb
CHANGED
data/lib/dgit/plugins.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This file is part of Diggit.
|
2
4
|
#
|
3
5
|
# Diggit is free software: you can redistribute it and/or modify
|
@@ -43,12 +45,13 @@ module Diggit
|
|
43
45
|
end
|
44
46
|
|
45
47
|
# Returns the value of a plugin option
|
46
|
-
# @param
|
48
|
+
# @param namespace [Symbol] the name of the option's namespace
|
47
49
|
# @param opt [Symbol] the name of the option
|
48
50
|
# @param default [Object] the default value
|
49
51
|
# @return [Object]
|
50
|
-
def read_option(
|
51
|
-
return @options[
|
52
|
+
def read_option(namespace, opt, default)
|
53
|
+
return @options[namespace][opt] if @options.key?(namespace) && @options[namespace].key?(opt)
|
54
|
+
|
52
55
|
default
|
53
56
|
end
|
54
57
|
end
|
@@ -102,6 +105,7 @@ module Diggit
|
|
102
105
|
def self.required_addons
|
103
106
|
base_addons = superclass < Runnable ? superclass.required_addons : []
|
104
107
|
return base_addons if @required_addons.nil?
|
108
|
+
|
105
109
|
base_addons + @required_addons
|
106
110
|
end
|
107
111
|
end
|
@@ -149,6 +153,7 @@ module Diggit
|
|
149
153
|
|
150
154
|
def self.required_analyses
|
151
155
|
return [] if @required_analyses.nil?
|
156
|
+
|
152
157
|
@required_analyses
|
153
158
|
end
|
154
159
|
end
|
data/lib/dgit/version.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This file is part of Diggit.
|
2
4
|
#
|
3
5
|
# Diggit is free software: you can redistribute it and/or modify
|
@@ -16,5 +18,5 @@
|
|
16
18
|
# Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
17
19
|
|
18
20
|
module Diggit
|
19
|
-
VERSION = '3.0.
|
21
|
+
VERSION = '3.0.5'
|
20
22
|
end
|
data/plugins/addon/db.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This file is part of Diggit.
|
2
4
|
#
|
3
5
|
# Diggit is free software: you can redistribute it and/or modify
|
@@ -22,8 +24,8 @@ require 'mongo'
|
|
22
24
|
# @!attribute [r] client
|
23
25
|
# @return [Mongo::Client] the mongodb client object.
|
24
26
|
class Db < Diggit::Addon
|
25
|
-
DEFAULT_SERVER = '127.0.0.1:27017'
|
26
|
-
DEFAULT_DB = 'diggit'
|
27
|
+
DEFAULT_SERVER = '127.0.0.1:27017'
|
28
|
+
DEFAULT_DB = 'diggit'
|
27
29
|
|
28
30
|
attr_reader :client
|
29
31
|
|
data/plugins/addon/out.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This file is part of Diggit.
|
2
4
|
#
|
3
5
|
# Diggit is free software: you can redistribute it and/or modify
|
@@ -25,8 +27,8 @@
|
|
25
27
|
class Out < Diggit::Addon
|
26
28
|
attr_reader :out, :tmp
|
27
29
|
|
28
|
-
DEFAULT_OUT = 'out'
|
29
|
-
DEFAULT_TMP = 'tmp'
|
30
|
+
DEFAULT_OUT = 'out'
|
31
|
+
DEFAULT_TMP = 'tmp'
|
30
32
|
|
31
33
|
def initialize(*args)
|
32
34
|
super
|
data/plugins/addon/r.rb
CHANGED
data/plugins/addon/src_opt.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This file is part of Diggit.
|
2
4
|
#
|
3
5
|
# Diggit is free software: you can redistribute it and/or modify
|
@@ -26,7 +28,7 @@
|
|
26
28
|
# }
|
27
29
|
# ```
|
28
30
|
class SrcOpt < Diggit::Addon
|
29
|
-
SOURCES_OPTIONS_FILE = 'sources_options'
|
31
|
+
SOURCES_OPTIONS_FILE = 'sources_options'
|
30
32
|
|
31
33
|
def initialize(*args)
|
32
34
|
super
|
data/plugins/analysis/cloc.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This file is part of Diggit.
|
2
4
|
#
|
3
5
|
# Diggit is free software: you can redistribute it and/or modify
|
@@ -32,6 +34,7 @@ class Cloc < Diggit::Analysis
|
|
32
34
|
repo.checkout(c.oid, { strategy: %i[force remove_untracked] })
|
33
35
|
cloc = `cloc #{@source.folder} --progress-rate=0 --quiet --yaml`
|
34
36
|
next if cloc.empty?
|
37
|
+
|
35
38
|
yaml = YAML.safe_load(cloc.lines[2..-1].join)
|
36
39
|
yaml.delete('header')
|
37
40
|
output = { source: @source.url, commit: c.oid, cloc: yaml }
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This file is part of Diggit.
|
2
4
|
#
|
3
5
|
# Diggit is free software: you can redistribute it and/or modify
|
@@ -26,6 +28,7 @@ class ClocPerFile < Diggit::Analysis
|
|
26
28
|
folder = File.expand_path(@source.folder)
|
27
29
|
cloc = `cloc #{folder} --progress-rate=0 --quiet --by-file --yaml --script-lang=Python,python`
|
28
30
|
return if cloc.empty?
|
31
|
+
|
29
32
|
yaml = YAML.safe_load(cloc.lines[2..-1].join)
|
30
33
|
yaml.delete('header')
|
31
34
|
yaml.delete('SUM')
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This file is part of Diggit.
|
2
4
|
#
|
3
5
|
# Diggit is free software: you can redistribute it and/or modify
|
@@ -25,7 +27,7 @@ require 'yaml'
|
|
25
27
|
class ConflictMerge < Diggit::Analysis
|
26
28
|
require_addons 'out'
|
27
29
|
|
28
|
-
DIFF3 = 'diff3'
|
30
|
+
DIFF3 = 'diff3'
|
29
31
|
|
30
32
|
def initialize(options)
|
31
33
|
super(options)
|
@@ -39,10 +41,12 @@ class ConflictMerge < Diggit::Analysis
|
|
39
41
|
out_dir = out.out_path_for_analysis(self, commit.oid)
|
40
42
|
parents = commit.parents
|
41
43
|
next unless parents.size > 1
|
44
|
+
|
42
45
|
left = parents[0]
|
43
46
|
right = parents[1]
|
44
47
|
base_oid = repo.merge_base(left, right)
|
45
48
|
next if base_oid.nil?
|
49
|
+
|
46
50
|
base = repo.lookup(base_oid)
|
47
51
|
%w[m b l r].each { |p| FileUtils.mkdir_p(File.join(out_dir, p)) }
|
48
52
|
populate_merge_directory(out_dir, commit, base, left, right)
|
@@ -52,6 +56,7 @@ class ConflictMerge < Diggit::Analysis
|
|
52
56
|
def populate_merge_directory(out_dir, commit, base, left, right)
|
53
57
|
commit.tree.walk_blobs(:preorder) do |r, e|
|
54
58
|
next if base.tree.get_entry_by_oid(e[:oid])
|
59
|
+
|
55
60
|
oids = find_oids(r, e[:name], base, left, right)
|
56
61
|
next if oids[:left].nil? || oids[:right].nil? # This would result in a trivial merge
|
57
62
|
|
@@ -92,6 +97,7 @@ class ConflictMerge < Diggit::Analysis
|
|
92
97
|
def find_oid(tree, components, name)
|
93
98
|
components.each { |c| tree = repo.lookup(tree[c][:oid]) unless tree.nil? || tree[c].nil? }
|
94
99
|
return nil if tree.nil? || tree[name].nil?
|
100
|
+
|
95
101
|
tree[name][:oid]
|
96
102
|
end
|
97
103
|
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
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 2019 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
+
|
20
|
+
require 'yaml'
|
21
|
+
|
22
|
+
# List all diffs from a repository.
|
23
|
+
class DiffExtractor < Diggit::Analysis
|
24
|
+
require_addons 'out'
|
25
|
+
|
26
|
+
ALLOWED_EXTENSIONS = ['.java', '.rb', '.js'].freeze
|
27
|
+
|
28
|
+
def initialize(options)
|
29
|
+
super(options)
|
30
|
+
end
|
31
|
+
|
32
|
+
def run
|
33
|
+
walker = Rugged::Walker.new(repo)
|
34
|
+
walker.sorting(Rugged::SORT_TOPO | Rugged::SORT_REVERSE)
|
35
|
+
walker.push(repo.head.name)
|
36
|
+
walker.each do |commit|
|
37
|
+
out_dir = out.out_path_for_analysis(self, commit.oid)
|
38
|
+
parents = commit.parents
|
39
|
+
next unless parents.size == 1
|
40
|
+
|
41
|
+
parent = parents[0]
|
42
|
+
populate_diff_directory(out_dir, commit, parent)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def populate_diff_directory(out_dir, commit, parent)
|
47
|
+
directories_created = false
|
48
|
+
diff = parent.diff(commit)
|
49
|
+
diff.each_delta do |delta_entry|
|
50
|
+
next unless delta_entry.status == :modified
|
51
|
+
next unless ALLOWED_EXTENSIONS.include?(File.extname(delta_entry.new_file[:path]))
|
52
|
+
|
53
|
+
unless directories_created
|
54
|
+
FileUtils.mkdir_p(File.join(out_dir, 'src'))
|
55
|
+
FileUtils.mkdir_p(File.join(out_dir, 'dst'))
|
56
|
+
directories_created = true
|
57
|
+
end
|
58
|
+
flat_name = flatten_name(delta_entry.new_file[:path])
|
59
|
+
write(delta_entry.new_file[:oid], flat_name, File.join(out_dir, 'src'))
|
60
|
+
write(delta_entry.old_file[:oid], flat_name, File.join(out_dir, 'dst'))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def write(oid, name, out_dir)
|
65
|
+
write_file repo.lookup(oid).content, name, out_dir
|
66
|
+
end
|
67
|
+
|
68
|
+
def write_file(data, name, out_dir)
|
69
|
+
File.write(File.join(out_dir, name), data)
|
70
|
+
end
|
71
|
+
|
72
|
+
def flatten_name(name)
|
73
|
+
name.gsub(/_/, '__').gsub(%r{/}, '_')
|
74
|
+
end
|
75
|
+
|
76
|
+
def clean
|
77
|
+
out.clean_analysis(self)
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
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 2018 Jean-Rémy Falleri <jr.falleri@gmail.com>
|
19
|
+
|
20
|
+
class GitGraph < Diggit::Analysis
|
21
|
+
require_addons 'out'
|
22
|
+
|
23
|
+
def initialize(options)
|
24
|
+
super(options)
|
25
|
+
end
|
26
|
+
|
27
|
+
def run
|
28
|
+
FileUtils.mkdir_p(out.out_path_for_analysis(self))
|
29
|
+
file = out.out_path_for_analysis(self, "graph.dot")
|
30
|
+
File.open(file, 'w') do |f|
|
31
|
+
f.puts "digraph repository {"
|
32
|
+
f.puts "\tnode [shape=rect, color=lightblue2, style=filled];"
|
33
|
+
append_dot_nodes(f)
|
34
|
+
append_dot_links(f)
|
35
|
+
f.puts "}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def append_dot_nodes(file)
|
40
|
+
init_walker.each do |commit|
|
41
|
+
file.puts "\tc_#{commit.oid} [label=\"#{commit.oid.to_s[0..6]}\"];"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def append_dot_links(file)
|
46
|
+
init_walker.each do |commit|
|
47
|
+
commit.parents.each { |parent| file.puts "\tc_#{commit.oid} -> c_#{parent.oid};" }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def init_walker
|
52
|
+
walker = Rugged::Walker.new(repo)
|
53
|
+
walker.sorting(Rugged::SORT_TOPO | Rugged::SORT_REVERSE)
|
54
|
+
walker.push(repo.head.name)
|
55
|
+
walker
|
56
|
+
end
|
57
|
+
|
58
|
+
def clean
|
59
|
+
out.clean_analysis(self)
|
60
|
+
end
|
61
|
+
end
|
data/plugins/analysis/javadoc.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This file is part of Diggit.
|
2
4
|
#
|
3
5
|
# Diggit is free software: you can redistribute it and/or modify
|
@@ -77,10 +79,11 @@ class Javadoc < Diggit::Analysis
|
|
77
79
|
|
78
80
|
m.xpath("MarkerAnnotation/SimpleName/@label").each do |k|
|
79
81
|
next unless k.to_s.casecmp("override")
|
82
|
+
|
80
83
|
javadoc['override'] = true
|
81
84
|
override_count += 1
|
82
85
|
|
83
|
-
if m.xpath("Javadoc/TagElement/TagElement[@label='@inheritDoc']").count
|
86
|
+
if m.xpath("Javadoc/TagElement/TagElement[@label='@inheritDoc']").count.positive?
|
84
87
|
javadoc['inheritDoc'] = true
|
85
88
|
override_inherit_count += 1
|
86
89
|
end
|
@@ -100,20 +103,24 @@ class Javadoc < Diggit::Analysis
|
|
100
103
|
res
|
101
104
|
end
|
102
105
|
|
103
|
-
def method_id(
|
106
|
+
def method_id(method)
|
104
107
|
res = ""
|
105
|
-
modifiers =
|
108
|
+
modifiers = method.xpath("Modifier/@label")
|
106
109
|
res += "#{modifiers} " unless modifiers.empty?
|
107
|
-
res += "#{type(
|
108
|
-
|
110
|
+
res += "#{type(method)} #{method.at_xpath('SimpleName/@label')}("
|
111
|
+
param_list = method.xpath("SingleVariableDeclaration").map do |p|
|
112
|
+
"#{type(p)} #{p.at_xpath('SimpleName/@label')}"
|
113
|
+
end
|
114
|
+
params = param_list.join(',')
|
109
115
|
res += "#{params})"
|
110
116
|
res
|
111
117
|
end
|
112
118
|
|
113
|
-
def type(
|
114
|
-
return
|
115
|
-
return
|
116
|
-
return
|
119
|
+
def type(element)
|
120
|
+
return element.at_xpath('SimpleType/@label').to_s unless element.at_xpath('SimpleType').nil?
|
121
|
+
return element.at_xpath('PrimitiveType/@label').to_s unless element.at_xpath('PrimitiveType').nil?
|
122
|
+
return element.at_xpath('ArrayType/@label').to_s unless element.at_xpath('ArrayType').nil?
|
123
|
+
|
117
124
|
""
|
118
125
|
end
|
119
126
|
|
@@ -130,9 +137,9 @@ class Javadoc < Diggit::Analysis
|
|
130
137
|
doc
|
131
138
|
end
|
132
139
|
|
133
|
-
def get_params(
|
140
|
+
def get_params(method)
|
134
141
|
data = {}
|
135
|
-
|
142
|
+
method.xpath("Javadoc/TagElement[@label='@param']").each do |p|
|
136
143
|
data[p.at_xpath("SimpleName/@label").to_s] = [] if data[p.at_xpath("SimpleName/@label").to_s].nil?
|
137
144
|
|
138
145
|
data[p.at_xpath("SimpleName/@label").to_s].push(p.xpath("TextElement/@label").to_s)
|
@@ -140,20 +147,20 @@ class Javadoc < Diggit::Analysis
|
|
140
147
|
data
|
141
148
|
end
|
142
149
|
|
143
|
-
def get_links(
|
144
|
-
|
150
|
+
def get_links(method)
|
151
|
+
method.xpath("Javadoc/TagElement/TagElement[@label='@link']").map { |p| p.xpath('QualifiedName/@label').to_s }
|
145
152
|
end
|
146
153
|
|
147
|
-
def get_throws(
|
154
|
+
def get_throws(method)
|
148
155
|
throws = {}
|
149
|
-
|
156
|
+
method.xpath("Javadoc/TagElement[@label='@throws']").each do |p|
|
150
157
|
throws[p.at_xpath("SimpleName/@label").to_s] = p.xpath("TextElement/@label").to_s
|
151
158
|
end
|
152
159
|
throws
|
153
160
|
end
|
154
161
|
|
155
|
-
def get_see(
|
156
|
-
|
162
|
+
def get_see(method)
|
163
|
+
method.xpath("Javadoc/TagElement[@label='@see']/MethodRef").map { |p| p.xpath('SimpleName/@label').to_s }
|
157
164
|
end
|
158
165
|
|
159
166
|
def count_classes(doc)
|
data/plugins/analysis/words.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This file is part of Diggit.
|
2
4
|
#
|
3
5
|
# Diggit is free software: you can redistribute it and/or modify
|
@@ -41,6 +43,7 @@ class YardDup < Diggit::Analysis
|
|
41
43
|
insert_to_map("@main #{obj.docstring}", doc_hash, obj) unless obj.docstring.empty?
|
42
44
|
obj.tags.each do |tag|
|
43
45
|
next if tag.nil?
|
46
|
+
|
44
47
|
tag_tokens = []
|
45
48
|
tag_tokens << "@#{tag.tag_name}" unless tag.tag_name.nil?
|
46
49
|
tag_tokens << tag.types.join(',') unless tag.types.nil? || tag.types.empty?
|
@@ -54,8 +57,8 @@ class YardDup < Diggit::Analysis
|
|
54
57
|
write_near_miss(File.join(out_dir, "near-miss.txt"), doc_hash)
|
55
58
|
end
|
56
59
|
|
57
|
-
def similarity(
|
58
|
-
d_norm = Levenshtein.distance(
|
60
|
+
def similarity(left, right)
|
61
|
+
d_norm = Levenshtein.distance(left, right).to_f / [left.size.to_f, right.size.to_f].max
|
59
62
|
1 - d_norm
|
60
63
|
end
|
61
64
|
|
@@ -98,6 +101,7 @@ class YardDup < Diggit::Analysis
|
|
98
101
|
def write_near_miss(file, doc_hash)
|
99
102
|
keys = doc_hash.each_key.to_a
|
100
103
|
return if keys.size < 2
|
104
|
+
|
101
105
|
File.open(file, 'w') do |f|
|
102
106
|
(0..(keys.size - 2)).each do |i|
|
103
107
|
key1 = keys[i]
|
data/spec/cli_spec.rb
CHANGED
data/spec/core_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This file is part of Diggit.
|
2
4
|
#
|
3
5
|
# Diggit is free software: you can redistribute it and/or modify
|
@@ -20,9 +22,9 @@ Coveralls.wear!
|
|
20
22
|
|
21
23
|
require_relative('../lib/dgit')
|
22
24
|
|
23
|
-
TEST_URL = 'https://github.com/jrfaller/test-git.git|0a8267929977bf800ababb6ae1bf3b0ed08827a4'
|
24
|
-
TEST_URL_INFO1 = 'https://github.com/jrfaller/test-git.git'
|
25
|
-
TEST_URL_INFO2 = '0a8267929977bf800ababb6ae1bf3b0ed08827a4'
|
25
|
+
TEST_URL = 'https://github.com/jrfaller/test-git.git|0a8267929977bf800ababb6ae1bf3b0ed08827a4'
|
26
|
+
TEST_URL_INFO1 = 'https://github.com/jrfaller/test-git.git'
|
27
|
+
TEST_URL_INFO2 = '0a8267929977bf800ababb6ae1bf3b0ed08827a4'
|
26
28
|
|
27
29
|
RSpec.configure do |config|
|
28
30
|
config.before(:all) do
|
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: 3.0.
|
4
|
+
version: 3.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean-Rémy Falleri
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2019-11-12 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: formatador
|
@@ -109,14 +109,14 @@ dependencies:
|
|
109
109
|
requirements:
|
110
110
|
- - "~>"
|
111
111
|
- !ruby/object:Gem::Version
|
112
|
-
version: '
|
112
|
+
version: '13'
|
113
113
|
type: :development
|
114
114
|
prerelease: false
|
115
115
|
version_requirements: !ruby/object:Gem::Requirement
|
116
116
|
requirements:
|
117
117
|
- - "~>"
|
118
118
|
- !ruby/object:Gem::Version
|
119
|
-
version: '
|
119
|
+
version: '13'
|
120
120
|
- !ruby/object:Gem::Dependency
|
121
121
|
name: redcarpet
|
122
122
|
requirement: !ruby/object:Gem::Requirement
|
@@ -174,7 +174,7 @@ dependencies:
|
|
174
174
|
version: '0'
|
175
175
|
- - ">="
|
176
176
|
- !ruby/object:Gem::Version
|
177
|
-
version: 0.9.
|
177
|
+
version: 0.9.20
|
178
178
|
type: :development
|
179
179
|
prerelease: false
|
180
180
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -184,7 +184,7 @@ dependencies:
|
|
184
184
|
version: '0'
|
185
185
|
- - ">="
|
186
186
|
- !ruby/object:Gem::Version
|
187
|
-
version: 0.9.
|
187
|
+
version: 0.9.20
|
188
188
|
description: Diggit is an agile tool that allows you to analyze git repositories.
|
189
189
|
email: jr.falleri@gmail.com
|
190
190
|
executables:
|
@@ -209,6 +209,8 @@ files:
|
|
209
209
|
- plugins/analysis/cloc.rb
|
210
210
|
- plugins/analysis/cloc_per_file.rb
|
211
211
|
- plugins/analysis/conflict_merge.rb
|
212
|
+
- plugins/analysis/diff_extractor.rb
|
213
|
+
- plugins/analysis/git_graph.rb
|
212
214
|
- plugins/analysis/javadoc.rb
|
213
215
|
- plugins/analysis/words.rb
|
214
216
|
- plugins/analysis/yard_dup.rb
|
@@ -240,15 +242,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
240
242
|
requirements:
|
241
243
|
- - "~>"
|
242
244
|
- !ruby/object:Gem::Version
|
243
|
-
version: '2.
|
245
|
+
version: '2.4'
|
244
246
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
245
247
|
requirements:
|
246
248
|
- - ">="
|
247
249
|
- !ruby/object:Gem::Version
|
248
250
|
version: '0'
|
249
251
|
requirements: []
|
250
|
-
|
251
|
-
rubygems_version: 2.7.5
|
252
|
+
rubygems_version: 3.0.3
|
252
253
|
signing_key:
|
253
254
|
specification_version: 4
|
254
255
|
summary: A Git repository analysis tool.
|