vcs2json 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cli/main.rb +1 -1
- data/lib/exceptions/ambigious_date.rb +8 -0
- data/lib/exceptions/could_not_find_format_of_date.rb +8 -0
- data/lib/exceptions/could_not_parse_date.rb +8 -0
- data/lib/exceptions/no_base_path.rb +8 -0
- data/lib/exceptions/no_date_field.rb +8 -0
- data/lib/exceptions/no_file_section.rb +8 -0
- data/lib/exceptions/no_time_data_in_chafiles_field.rb +8 -0
- data/lib/vcs2json/git.rb +109 -0
- data/lib/vcs2json/version.rb +1 -1
- data/lib/vcs2json_helper.rb +2 -0
- data/vcs2json.gemspec +1 -0
- metadata +25 -5
- data/lib/vcs2json/git/json.rb +0 -86
- data/lib/vcs2json/km/json.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 15d7ae8091e66e7a08873392edccfcbb5a97fdd2
|
4
|
+
data.tar.gz: d0b611ebafc4ced7993371f8836e1f9aa81e6cbd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74b531c87495036b5f7622fc58310d9a9cb81ebe1eee55e3aa2d293cd15702ec7dc46cfdbebf97c8b2843009491d78d6f1b5b5e6e16aa1ec3b69ede98bf2f18c
|
7
|
+
data.tar.gz: e3fa836d920cc77295a10de443419fdd11e8ddef8e901b94acf85343cb5daf6de41934df344b14ce507865952d87d78281e3b10e04206243ade963b6df3b6c7a
|
data/lib/cli/main.rb
CHANGED
@@ -8,7 +8,7 @@ module Vcs2JsonCLI
|
|
8
8
|
method_option :number, :aliases => '-n', :desc => "The number of commits to dump"
|
9
9
|
desc "git [options]","Make a dump of the change-history of system using git, output on stdout"
|
10
10
|
def git
|
11
|
-
Vcs2Json::Git.new(options).execute
|
11
|
+
$stdout.puts Vcs2Json::Git.new(options).execute
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
data/lib/vcs2json/git.rb
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
require_relative '../vcs2json_helper'
|
2
|
+
|
3
|
+
module Vcs2Json
|
4
|
+
class Git
|
5
|
+
def initialize(opts)
|
6
|
+
@opts = opts
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
# simply un-abbreviates the status code given by --name-status
|
11
|
+
def parse_status(abbreviated_status)
|
12
|
+
case abbreviated_status
|
13
|
+
when "A"
|
14
|
+
"added"
|
15
|
+
when "M"
|
16
|
+
"modified"
|
17
|
+
when "D"
|
18
|
+
"deleted"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
# attempts to parse an issue/bug id from the given commit message
|
24
|
+
def parse_issue(message)
|
25
|
+
if match = /(bug|issue) (?<id>\d+)/i.match(message)
|
26
|
+
return match[:id]
|
27
|
+
else
|
28
|
+
return ""
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def execute
|
34
|
+
before = @opts[:before].nil? ? '' : "--before=\"#{@opts[:before]}\""
|
35
|
+
after = @opts[:after].nil? ? '' : "--after=\"#{@opts[:after]}\""
|
36
|
+
number = @opts[:number].nil? ? '' : "-n #{@opts[:number]}"
|
37
|
+
options = "#{before} #{after} #{number} --no-merges"
|
38
|
+
|
39
|
+
# Generate separators between fields and commits
|
40
|
+
field_sep = Digest::SHA256.hexdigest Time.new.to_s + "field_sep"
|
41
|
+
commit_sep = Digest::SHA256.hexdigest Time.new.to_s + "commit_sep"
|
42
|
+
|
43
|
+
# Create a new hash that defaults to creating new hashes given hash[:key]
|
44
|
+
# so we can do 'commit[:commit][:author][:name] = .. ' without creating the :commit and :author hashes first
|
45
|
+
commits = Hash.new {|h,k| h[k] = Hash.new(&h.default_proc) }
|
46
|
+
|
47
|
+
#TODO: log this => print "Getting metadata on the commits..\r"
|
48
|
+
raw_commits = `git log #{options} --pretty=format:'%H#{field_sep}%cn#{field_sep}%ce#{field_sep}%cd#{field_sep}%ad#{field_sep}%B#{commit_sep}'`
|
49
|
+
commits_info = raw_commits.encode('UTF-8', :invalid => :replace).split(commit_sep)
|
50
|
+
|
51
|
+
commits_info.each do |commit|
|
52
|
+
fields = commit.split(field_sep)
|
53
|
+
sha = fields[0].delete("\n") #remove astray newlines
|
54
|
+
commits[sha][:sha] = sha
|
55
|
+
commits[sha][:name] = fields[1]
|
56
|
+
commits[sha][:email] = fields[2]
|
57
|
+
commits[sha][:date] = Time.parse fields[3]
|
58
|
+
commits[sha][:author_date] = Time.parse fields[4]
|
59
|
+
commits[sha][:message] = fields[5]
|
60
|
+
|
61
|
+
# attempt to parse an issue id from the commit message
|
62
|
+
if @opts.issue?
|
63
|
+
commits[commit[0]][:issue] = parse_issue(commits[sha][:message])
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
commits_changes_type = `git log --pretty=format:'#{field_sep}%H' --name-status #{options}`.split(field_sep)
|
69
|
+
commits_changes_type.each do |commit|
|
70
|
+
if !commit.empty?
|
71
|
+
lines = commit.split("\n")
|
72
|
+
sha = lines[0]
|
73
|
+
commits[sha][:changes][:all] = []
|
74
|
+
if lines.size > 1
|
75
|
+
lines[1..-1].each do |line|
|
76
|
+
if !line.empty?
|
77
|
+
file_info = line.split("\t")
|
78
|
+
file_name = file_info[1]
|
79
|
+
status = file_info[0]
|
80
|
+
commits[sha][:changes][:all] << file_name
|
81
|
+
commits[sha][:changes][:details][file_name][:filename] = file_name
|
82
|
+
commits[sha][:changes][:details][file_name][:status] = parse_status(status)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# create file_name -> integer mapping
|
90
|
+
mapping = Hash.new
|
91
|
+
index_counter = 0
|
92
|
+
commits.each do |sha,info|
|
93
|
+
integer_representation = []
|
94
|
+
info[:changes][:all].each do |file|
|
95
|
+
if mapping[file].nil?
|
96
|
+
mapping[file] = index_counter
|
97
|
+
index_counter += 1
|
98
|
+
end
|
99
|
+
integer_representation << mapping[file]
|
100
|
+
info[:changes][:details][file][:id] = mapping[file]
|
101
|
+
end
|
102
|
+
info[:changes][:all].clear
|
103
|
+
info[:changes][:all] = integer_representation
|
104
|
+
end
|
105
|
+
|
106
|
+
JSON.pretty_generate(commits.sort_by {|id,commit| commit[:date]}.reverse.map {|(sha,commit)| commit})
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
data/lib/vcs2json/version.rb
CHANGED
data/lib/vcs2json_helper.rb
CHANGED
data/vcs2json.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vcs2json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Rolfsnes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: chronic
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
description:
|
98
112
|
email:
|
99
113
|
- mail@thomasrolfsnes.com
|
@@ -114,8 +128,14 @@ files:
|
|
114
128
|
- bin/vcs2json
|
115
129
|
- lib/cli/cli_helper.rb
|
116
130
|
- lib/cli/main.rb
|
117
|
-
- lib/
|
118
|
-
- lib/
|
131
|
+
- lib/exceptions/ambigious_date.rb
|
132
|
+
- lib/exceptions/could_not_find_format_of_date.rb
|
133
|
+
- lib/exceptions/could_not_parse_date.rb
|
134
|
+
- lib/exceptions/no_base_path.rb
|
135
|
+
- lib/exceptions/no_date_field.rb
|
136
|
+
- lib/exceptions/no_file_section.rb
|
137
|
+
- lib/exceptions/no_time_data_in_chafiles_field.rb
|
138
|
+
- lib/vcs2json/git.rb
|
119
139
|
- lib/vcs2json/version.rb
|
120
140
|
- lib/vcs2json_helper.rb
|
121
141
|
- vcs2json.gemspec
|
@@ -139,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
159
|
version: '0'
|
140
160
|
requirements: []
|
141
161
|
rubyforge_project:
|
142
|
-
rubygems_version: 2.
|
162
|
+
rubygems_version: 2.4.6
|
143
163
|
signing_key:
|
144
164
|
specification_version: 4
|
145
165
|
summary: Create JSON dumps of change history from git etc.
|
data/lib/vcs2json/git/json.rb
DELETED
@@ -1,86 +0,0 @@
|
|
1
|
-
require_relative '../../vcs2json_helper'
|
2
|
-
|
3
|
-
module Vcs2Json
|
4
|
-
class Git
|
5
|
-
def initialize(opts)
|
6
|
-
@opts = opts
|
7
|
-
end
|
8
|
-
|
9
|
-
|
10
|
-
# simply un-abbreviates the status code given by --name-status
|
11
|
-
def parse_status(abbreviated_status)
|
12
|
-
case abbreviated_status
|
13
|
-
when "A"
|
14
|
-
"added"
|
15
|
-
when "M"
|
16
|
-
"modified"
|
17
|
-
when "D"
|
18
|
-
"deleted"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
|
23
|
-
# attempts to parse an issue/bug id from the given commit message
|
24
|
-
def parse_issue(message)
|
25
|
-
if match = /(bug|issue) (?<id>\d+)/i.match(message)
|
26
|
-
return match[:id]
|
27
|
-
else
|
28
|
-
return ""
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
def execute
|
34
|
-
before = @opts[:before].nil? ? '' : "--before=\"#{@opts[:before]}\""
|
35
|
-
after = @opts[:after].nil? ? '' : "--after=\"#{@opts[:after]}\""
|
36
|
-
number = @opts[:number].nil? ? '' : "-n #{@opts[:number]}"
|
37
|
-
options = "#{before} #{after} #{number} --no-merges"
|
38
|
-
|
39
|
-
# Generate separators between fields and commits
|
40
|
-
field_sep = Digest::SHA256.hexdigest Time.new.to_s + "field_sep"
|
41
|
-
commit_sep = Digest::SHA256.hexdigest Time.new.to_s + "commit_sep"
|
42
|
-
|
43
|
-
# Create a new hash that defaults to creating new hashes given hash[:key]
|
44
|
-
# so we can do 'commit[:commit][:author][:name] = .. ' without creating the :commit and :author hashes first
|
45
|
-
commits = Hash.new {|h,k| h[k] = Hash.new(&h.default_proc) }
|
46
|
-
|
47
|
-
#TODO: log this => print "Getting metadata on the commits..\r"
|
48
|
-
raw_commits = `git log #{options} --pretty=format:'%h#{field_sep}%cn#{field_sep}%ce#{field_sep}%cd#{field_sep}%ad#{field_sep}%B#{commit_sep}'`
|
49
|
-
commits_info = raw_commits.encode('UTF-8', :invalid => :replace).split(commit_sep)
|
50
|
-
|
51
|
-
commits_info.each do |commit|
|
52
|
-
fields = commit.split(field_sep)
|
53
|
-
sha = fields[0].delete("\n") #remove astray newlines
|
54
|
-
commits[sha][:sha] = sha
|
55
|
-
commits[sha][:name] = fields[1]
|
56
|
-
commits[sha][:email] = fields[2]
|
57
|
-
commits[sha][:date] = Time.parse fields[3]
|
58
|
-
commits[sha][:author_date] = Time.parse fields[4]
|
59
|
-
commits[sha][:message] = fields[5]
|
60
|
-
|
61
|
-
# attempt to parse an issue id from the commit message
|
62
|
-
if @opts.issue?
|
63
|
-
commits[commit[0]][:issue] = parse_issue(commits[sha][:message])
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
|
68
|
-
#TODO: log this => print "Adding info on files changed.. \r"
|
69
|
-
commits_changes_type = `git log --pretty=format:'%h' --name-status #{options}`.split("\n\n")
|
70
|
-
commits_changes_type.each do |commit|
|
71
|
-
lines = commit.split("\n")
|
72
|
-
sha = lines[0]
|
73
|
-
commits[sha][:changes][:all] = []
|
74
|
-
lines[1..-1].each do |line|
|
75
|
-
file_info = line.split("\t")
|
76
|
-
file_name = file_info[1]
|
77
|
-
status = file_info[0]
|
78
|
-
commits[sha][:changes][:all] << file_name
|
79
|
-
commits[sha][:changes][:details][file_name][:filename] = file_name
|
80
|
-
commits[sha][:changes][:details][file_name][:status] = parse_status(status)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
$stdout.puts JSON.pretty_generate(commits.sort_by {|id,commit| commit[:date]}.reverse.map {|(sha,commit)| commit})
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
data/lib/vcs2json/km/json.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
require_relative '../../vcs2json_helper'
|
2
|
-
|
3
|
-
module Tarma
|
4
|
-
module TransactionExtractor
|
5
|
-
##
|
6
|
-
# This is primarily a version history parser for KMs use of the Track tool
|
7
|
-
module Track
|
8
|
-
|
9
|
-
def initialize(opts)
|
10
|
-
self.opts = opts
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|