capillary 0.1.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.
- data/Gemfile +3 -0
- data/Gemfile.lock +22 -0
- data/README +44 -0
- data/Rakefile +8 -0
- data/bin/capillary +6 -0
- data/lib/capillary.rb +19 -0
- data/lib/capillary/commit.rb +60 -0
- data/lib/capillary/log_parser.rb +70 -0
- data/lib/capillary/version.rb +21 -0
- data/test/capillary/commit_test.rb +69 -0
- data/test/capillary/log_parser_test.rb +201 -0
- data/test/fixtures/complex_graph_no_ff.txt +10 -0
- data/test/fixtures/first_commit.txt +1 -0
- data/test/fixtures/parent_commit.txt +1 -0
- data/test/fixtures/third_commit.txt +3 -0
- data/test/fixtures/two_merged_branches.txt +4 -0
- data/test/test_helper.rb +20 -0
- metadata +132 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
capillary (0.1.1)
|
5
|
+
json (~> 1.5.1)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
json (1.5.1)
|
11
|
+
mini_shoulda (0.3.0)
|
12
|
+
minitest (~> 2.1.0)
|
13
|
+
minitest (2.1.0)
|
14
|
+
|
15
|
+
PLATFORMS
|
16
|
+
ruby
|
17
|
+
|
18
|
+
DEPENDENCIES
|
19
|
+
capillary!
|
20
|
+
json (~> 1.5.1)
|
21
|
+
mini_shoulda (~> 0.3.0)
|
22
|
+
minitest (~> 2.0)
|
data/README
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
Capillary.rb
|
2
|
+
============
|
3
|
+
|
4
|
+
Capillary parses the output of Git log and produces a beautiful
|
5
|
+
graphical representation of your repository's history - similar to
|
6
|
+
gitk and `git log --graph`, except beautiful.
|
7
|
+
|
8
|
+
Capillary consists of two parts:
|
9
|
+
|
10
|
+
* capillary.rb: which parses the output from Git log data and
|
11
|
+
generates a JSON representation of it, usable from
|
12
|
+
* capillary.js: the javascript library doing the presentation
|
13
|
+
|
14
|
+
The emitted JSON
|
15
|
+
----------------
|
16
|
+
|
17
|
+
Capillary.rb emits a JSON array consisting of JSON objects in the
|
18
|
+
following form (starting with id=0):
|
19
|
+
|
20
|
+
[[{
|
21
|
+
sha: "251367a",
|
22
|
+
refnames: ["HEAD", "origin/master", "origin/HEAD", "master"],
|
23
|
+
message: "Whitespace fix",
|
24
|
+
id: 1
|
25
|
+
}, {
|
26
|
+
sha: "854e061",
|
27
|
+
refnames: ["origin/unified-messaging-api", "unified-messaging-api"],
|
28
|
+
message: "Resolve merge conflict from master",
|
29
|
+
id: 2
|
30
|
+
}]];
|
31
|
+
|
32
|
+
Input to capillary.rb
|
33
|
+
---------------------
|
34
|
+
|
35
|
+
Capillary parses output from Git, in the format as specified in
|
36
|
+
test/fixtures/single_commit.txt. This output was generated from Git using the
|
37
|
+
following command:
|
38
|
+
|
39
|
+
git log --all --pretty=format:"%H§%P§%ad§%ae§%d§%s§"
|
40
|
+
|
41
|
+
The name
|
42
|
+
--------
|
43
|
+
|
44
|
+
Look it up: http://www.google.com/search?aq=f&ie=UTF-8&q=capillary
|
data/Rakefile
ADDED
data/bin/capillary
ADDED
data/lib/capillary.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2011 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero 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
|
+
# This program 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 Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
require "capillary/version"
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2011 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero 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
|
+
# This program 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 Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
require "time"
|
19
|
+
|
20
|
+
module Capillary
|
21
|
+
class Commit
|
22
|
+
attr_accessor :id, :parent_ids, :committed_at, :message, :committer_email
|
23
|
+
attr_reader :ref_names
|
24
|
+
LOG_SEPARATOR = "§"
|
25
|
+
|
26
|
+
# Creates an instance from Git output
|
27
|
+
def self.parse(git_line)
|
28
|
+
parts = git_line.split(LOG_SEPARATOR)
|
29
|
+
result = new
|
30
|
+
result.id = parts[0]
|
31
|
+
result.parent_ids = parts[1].split(" ")
|
32
|
+
result.committed_at = Time.parse(parts[2])
|
33
|
+
result.committer_email = parts[3]
|
34
|
+
result.ref_names = parts[4]
|
35
|
+
result.message = parts[5]
|
36
|
+
result
|
37
|
+
end
|
38
|
+
|
39
|
+
def ref_names=(spec)
|
40
|
+
if spec == ""
|
41
|
+
@ref_names = nil
|
42
|
+
else
|
43
|
+
@ref_names = spec.gsub(/[\(\)]/,"").split(/,\s?/)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_hash
|
48
|
+
{ "id" => id,
|
49
|
+
"parent_ids" => parent_ids,
|
50
|
+
"commited_at" => committed_at,
|
51
|
+
"committer_email" => committer_email,
|
52
|
+
"ref_names" => ref_names,
|
53
|
+
"message" => message }
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_json
|
57
|
+
JSON.unparse(to_hash)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2011 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero 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
|
+
# This program 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 Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
require "json"
|
19
|
+
require "capillary/commit"
|
20
|
+
|
21
|
+
module Capillary
|
22
|
+
class LogParser
|
23
|
+
attr_reader :branches
|
24
|
+
|
25
|
+
def initialize
|
26
|
+
@commit_count = 0
|
27
|
+
@branches = []
|
28
|
+
end
|
29
|
+
|
30
|
+
def <<(commit)
|
31
|
+
commit = Capillary::Commit.parse(commit) if String === commit
|
32
|
+
|
33
|
+
commit.parent_ids.each do |parent_id|
|
34
|
+
place_commit(CommitNode.new(@commit_count, commit, parent_id))
|
35
|
+
@commit_count += 1
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_json
|
40
|
+
JSON.unparse(branches.collect { |b| b.collect { |c| c.to_hash } })
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
def place_commit(commit)
|
45
|
+
placed = branches.inject(false) do |placed, branch|
|
46
|
+
if branch.last.parent_id == commit.id
|
47
|
+
branch << commit
|
48
|
+
placed = true
|
49
|
+
end
|
50
|
+
|
51
|
+
placed
|
52
|
+
end
|
53
|
+
|
54
|
+
branches << [commit] unless placed
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class CommitNode
|
59
|
+
attr_reader :seq_id, :commit, :parent_id
|
60
|
+
|
61
|
+
def initialize(seq_id, commit, parent_id)
|
62
|
+
@seq_id = seq_id
|
63
|
+
@commit = commit
|
64
|
+
@parent_id = parent_id
|
65
|
+
end
|
66
|
+
|
67
|
+
def id; commit.id; end
|
68
|
+
def to_hash; commit.to_hash.merge({ "seq_id" => seq_id }); end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2011 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero 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
|
+
# This program 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 Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
module Capillary
|
20
|
+
VERSION = "0.1.1"
|
21
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2011 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero 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
|
+
# This program 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 Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
require "test_helper"
|
20
|
+
require "capillary/commit"
|
21
|
+
|
22
|
+
class CommitTest < MiniTest::Spec
|
23
|
+
context "Parsing a commit line" do
|
24
|
+
setup do
|
25
|
+
git_line = fixture("first_commit.txt")
|
26
|
+
@commit = Capillary::Commit.parse(git_line)
|
27
|
+
end
|
28
|
+
|
29
|
+
should "extract the commit sha" do
|
30
|
+
assert_equal "a7cf78bfff06d52b5b0aa021508b44c00cad067a", @commit.id
|
31
|
+
end
|
32
|
+
|
33
|
+
should "extract parent(s)" do
|
34
|
+
assert_equal(["db75ad82d678d51b29709d26af64d4a85b6f8071"], @commit.parent_ids)
|
35
|
+
end
|
36
|
+
|
37
|
+
should "extract the commit time" do
|
38
|
+
assert_equal(Time.parse("2011-07-13 07:55:47 +0200"), @commit.committed_at)
|
39
|
+
end
|
40
|
+
|
41
|
+
should "extract the committer email" do
|
42
|
+
assert_equal "chris@example.com", @commit.committer_email
|
43
|
+
end
|
44
|
+
|
45
|
+
should "extract the commit message" do
|
46
|
+
assert_equal "And this is commit 10 Merge branch 'topic'", @commit.message
|
47
|
+
end
|
48
|
+
|
49
|
+
should "include specified ref names" do
|
50
|
+
assert_equal(["master","refactor"], @commit.ref_names)
|
51
|
+
end
|
52
|
+
|
53
|
+
should "not include non-specified ref names" do
|
54
|
+
@commit.ref_names = ""
|
55
|
+
assert_nil @commit.ref_names
|
56
|
+
end
|
57
|
+
|
58
|
+
should "convert commit to JSON" do
|
59
|
+
assert_equal JSON.parse(@commit.to_json), {
|
60
|
+
"id" => "a7cf78bfff06d52b5b0aa021508b44c00cad067a",
|
61
|
+
"parent_ids" => ["db75ad82d678d51b29709d26af64d4a85b6f8071"],
|
62
|
+
"commited_at" => "Wed Jul 13 07:55:47 +0200 2011",
|
63
|
+
"committer_email" => "chris@example.com",
|
64
|
+
"ref_names" => ["master", "refactor"],
|
65
|
+
"message" => "And this is commit 10 Merge branch 'topic'"
|
66
|
+
}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,201 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2011 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero 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
|
+
# This program 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 Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
require "test_helper"
|
20
|
+
require "capillary/log_parser"
|
21
|
+
|
22
|
+
class LogParserTest < MiniTest::Spec
|
23
|
+
# * a7cf78bfff06d52b5b0aa021508b44c00cad067a
|
24
|
+
# * db75ad82d678d51b29709d26af64d4a85b6f8071
|
25
|
+
context "A linear graph" do
|
26
|
+
setup do
|
27
|
+
first_line = Capillary::Commit.parse(fixture("first_commit.txt"))
|
28
|
+
second_line = Capillary::Commit.parse(fixture("parent_commit.txt"))
|
29
|
+
@log_parser = Capillary::LogParser.new
|
30
|
+
@log_parser << first_line
|
31
|
+
@log_parser << second_line
|
32
|
+
end
|
33
|
+
|
34
|
+
should "have one branch" do
|
35
|
+
assert_equal 1, @log_parser.branches.size
|
36
|
+
end
|
37
|
+
|
38
|
+
should "index the commits correctly" do
|
39
|
+
branch = @log_parser.branches.first
|
40
|
+
ids = branch.map { |commit| commit.seq_id }
|
41
|
+
assert_equal([0, 1], ids)
|
42
|
+
end
|
43
|
+
|
44
|
+
should "collect the shas in correct order" do
|
45
|
+
shas = @log_parser.branches.first.map { |commit| commit.id }
|
46
|
+
assert_equal(["a7cf78bfff06d52b5b0aa021508b44c00cad067a","db75ad82d678d51b29709d26af64d4a85b6f8071"], shas)
|
47
|
+
end
|
48
|
+
|
49
|
+
should "render JSON" do
|
50
|
+
result = JSON.parse(@log_parser.to_json)
|
51
|
+
assert_equal(1, result.size)
|
52
|
+
commits = result.first
|
53
|
+
assert_equal(2, commits.size)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# *
|
58
|
+
# |\
|
59
|
+
# | *
|
60
|
+
# * |
|
61
|
+
# | |
|
62
|
+
context "Two merged branches" do
|
63
|
+
setup do
|
64
|
+
fixtures = fixture("two_merged_branches.txt").split("\n")
|
65
|
+
@lines = [Capillary::Commit.parse(fixtures[0]),
|
66
|
+
Capillary::Commit.parse(fixtures[1]),
|
67
|
+
Capillary::Commit.parse(fixtures[2])]
|
68
|
+
|
69
|
+
@log_parser = Capillary::LogParser.new
|
70
|
+
@log_parser << @lines[0]
|
71
|
+
@log_parser << @lines[1]
|
72
|
+
@log_parser << @lines[2]
|
73
|
+
end
|
74
|
+
|
75
|
+
should "have two branches" do
|
76
|
+
assert_equal 2, @log_parser.branches.size
|
77
|
+
end
|
78
|
+
|
79
|
+
should "have two commits in the first branch" do
|
80
|
+
first_branch = @log_parser.branches.first
|
81
|
+
assert_equal 2, first_branch.size
|
82
|
+
end
|
83
|
+
|
84
|
+
should "have two commits in the second branch" do
|
85
|
+
last_branch = @log_parser.branches.last
|
86
|
+
assert_equal 2, last_branch.size
|
87
|
+
end
|
88
|
+
|
89
|
+
should "put the right commits in the right branch" do
|
90
|
+
branches = @log_parser.branches
|
91
|
+
|
92
|
+
assert_equal @lines[0].id, branches[0][0].id
|
93
|
+
assert_equal @lines[2].id, branches[0][1].id
|
94
|
+
|
95
|
+
assert_equal @lines[0].id, branches[1][0].id
|
96
|
+
assert_equal @lines[1].id, branches[1][1].id
|
97
|
+
end
|
98
|
+
|
99
|
+
should "render JSON" do
|
100
|
+
result = JSON.parse(@log_parser.to_json)
|
101
|
+
assert_equal(2, result.size)
|
102
|
+
assert_equal(2, result.first.size)
|
103
|
+
assert_equal(2, result.last.size)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
#
|
108
|
+
# 0
|
109
|
+
# |\
|
110
|
+
# | 0
|
111
|
+
# | |
|
112
|
+
# | 0
|
113
|
+
# | |\
|
114
|
+
# | | 0
|
115
|
+
# | | |\
|
116
|
+
# | 0 | |
|
117
|
+
# | | | |
|
118
|
+
# | | | 0
|
119
|
+
# | | | |
|
120
|
+
# | | 0 |
|
121
|
+
# | | | |
|
122
|
+
# | 0 | |
|
123
|
+
# | | | |
|
124
|
+
# | | | 0
|
125
|
+
# | | |/
|
126
|
+
# | | 0
|
127
|
+
# | | |
|
128
|
+
context "Complex graph merged with --no-ff" do
|
129
|
+
setup do
|
130
|
+
fixtures = fixture("complex_graph_no_ff.txt").split("\n")
|
131
|
+
@log_parser = Capillary::LogParser.new
|
132
|
+
@lines = []
|
133
|
+
|
134
|
+
fixtures.reject { |f| f.strip == "" }.each do |fixture|
|
135
|
+
@lines << Capillary::Commit.parse(fixture)
|
136
|
+
@log_parser << @lines.last
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
should "have four branches" do
|
141
|
+
assert_equal 4, @log_parser.branches.size
|
142
|
+
end
|
143
|
+
|
144
|
+
should "have one commit in the first branch" do
|
145
|
+
branch = @log_parser.branches.first
|
146
|
+
assert_equal 1, branch.size
|
147
|
+
end
|
148
|
+
|
149
|
+
should "have five commits in the second branch" do
|
150
|
+
branch = @log_parser.branches[1]
|
151
|
+
assert_equal 5, branch.size
|
152
|
+
end
|
153
|
+
|
154
|
+
should "have four commits in the third branch" do
|
155
|
+
branch = @log_parser.branches[2]
|
156
|
+
assert_equal 4, branch.size
|
157
|
+
end
|
158
|
+
|
159
|
+
should "have four commits in the fourth branch" do
|
160
|
+
branch = @log_parser.branches[3]
|
161
|
+
assert_equal 4, branch.size
|
162
|
+
end
|
163
|
+
|
164
|
+
should "put the right commits in the right branch" do
|
165
|
+
branches = @log_parser.branches
|
166
|
+
|
167
|
+
assert_equal @lines[0].id, branches[0][0].id
|
168
|
+
assert_equal @lines[0].id, branches[1][0].id
|
169
|
+
assert_equal @lines[2].id, branches[2][0].id
|
170
|
+
assert_equal @lines[3].id, branches[3][0].id
|
171
|
+
end
|
172
|
+
|
173
|
+
should "render JSON" do
|
174
|
+
result = JSON.parse(@log_parser.to_json)
|
175
|
+
|
176
|
+
assert_equal(4, result.size)
|
177
|
+
assert_equal(1, result.first.size)
|
178
|
+
assert_equal(5, result[1].size)
|
179
|
+
assert_equal(4, result[2].size)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
context "Streaming parser" do
|
184
|
+
setup do
|
185
|
+
@lines = fixture("complex_graph_no_ff.txt").split("\n")
|
186
|
+
@log = Capillary::LogParser.new
|
187
|
+
end
|
188
|
+
|
189
|
+
should "add parsed line" do
|
190
|
+
@log << Capillary::Commit.parse(@lines[0])
|
191
|
+
|
192
|
+
assert_equal 2, @log.branches.length
|
193
|
+
end
|
194
|
+
|
195
|
+
should "add raw line" do
|
196
|
+
@log << @lines[0]
|
197
|
+
|
198
|
+
assert_equal 2, @log.branches.length
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
82114b2e3b1b5241167faeffd9bcfaa4fbc1e19c§eab56eadbb2c475e0d3ec5a5d32939600865f868 f9eb74cb5aff19119549335ade867a2b97a1f192§Wed Jul 13 19:05:18 2011 +0200§christian@gitorious.org§ (HEAD, master)§Merge branch 'branch2'§
|
2
|
+
f9eb74cb5aff19119549335ade867a2b97a1f192§9e3304e57349493fe311ca45d4e7d60173831f53§Wed Jul 13 16:23:59 2011 +0200§christian@gitorious.org§ (branch2)§Commit #2/branch #2§
|
3
|
+
9e3304e57349493fe311ca45d4e7d60173831f53§dfbb8f1790f05f5fb30dc23da93111626a9bf8f1 e1ef4ee181cba23d93a3513f246e3d5d7ae97a6b§Wed Jul 13 16:23:44 2011 +0200§christian@gitorious.org§§Commit #3/branch #2, merge 3->2§
|
4
|
+
e1ef4ee181cba23d93a3513f246e3d5d7ae97a6b§1e260b557384ddec5e8f862705fdecf3c5515c98 61291e76367a8ec47a1f9e2647dfecf0e80d5b41§Wed Jul 13 16:22:55 2011 +0200§christian@gitorious.org§ (branch3)§Commit #4/branch #3, merge 4->3§
|
5
|
+
dfbb8f1790f05f5fb30dc23da93111626a9bf8f1§563d5292c32c733add5997d24dac25ee05ec06f7§Wed Jul 13 16:08:56 2011 +0200§christian@gitorious.org§§Commit #5/branch #2§
|
6
|
+
61291e76367a8ec47a1f9e2647dfecf0e80d5b41§c97d4784e631f6451b5a3b541aea11faf51ae5f5§Wed Jul 13 16:08:40 2011 +0200§christian@gitorious.org§ (branch4)§Commit #6/branch #4§
|
7
|
+
1e260b557384ddec5e8f862705fdecf3c5515c98§8798362ef2ab68c46cc09bdf2951cf4d0994caa9§Wed Jul 13 16:08:28 2011 +0200§christian@gitorious.org§§Commit #7/branch #3§
|
8
|
+
563d5292c32c733add5997d24dac25ee05ec06f7§eab56eadbb2c475e0d3ec5a5d32939600865f868§Wed Jul 13 16:08:09 2011 +0200§christian@gitorious.org§§Commit #8/branch #2§
|
9
|
+
c97d4784e631f6451b5a3b541aea11faf51ae5f5§8798362ef2ab68c46cc09bdf2951cf4d0994caa9§Wed Jul 13 16:07:52 2011 +0200§christian@gitorious.org§§Commit #9/branch #4§
|
10
|
+
8798362ef2ab68c46cc09bdf2951cf4d0994caa9§eab56eadbb2c475e0d3ec5a5d32939600865f868§Wed Jul 13 16:07:32 2011 +0200§christian@gitorious.org§§Commit #10/branch #3§
|
@@ -0,0 +1 @@
|
|
1
|
+
a7cf78bfff06d52b5b0aa021508b44c00cad067a§db75ad82d678d51b29709d26af64d4a85b6f8071§2011-07-13 07:55:47 +0200§chris@example.com§(master, refactor)§And this is commit 10 Merge branch 'topic'§
|
@@ -0,0 +1 @@
|
|
1
|
+
db75ad82d678d51b29709d26af64d4a85b6f8071§a7cf78bfff06d52b5b0aa021508b44c00cad067a§2011-07-13 07:55:47 +0200§chris@example.com§(master, refactor)§Adding some magic powers to the witch§
|
@@ -0,0 +1,3 @@
|
|
1
|
+
dfa624cc5f5cd7951526bbce93f273d0644d60c4§eddad9a65f2d673f92f02b97e4bdc34357263c87§2011-07-13 13:00:00 +0200§marius@gitorious.org§ (HEAD, master)§A third commit§
|
2
|
+
e34585780eab510da518f3dd55282de42c7f0297§eddad9a65f2d673f92f02b97e4bdc34357263c87§2011-07-13 12:59:38 +0200§marius@gitorious.org§ (Another)§Another commit§
|
3
|
+
eddad9a65f2d673f92f02b97e4bdc34357263c87§§2011-07-13 12:59:18 +0200§marius@gitorious.org§§Initial commit§
|
@@ -0,0 +1,4 @@
|
|
1
|
+
c3cdee5e70272c2be977063e42346402de10c0fb§cf860e9b74b11100db4bf2db639089832dcd7549 cfa5ba7818834630cea5419987038456051cbc79§2011-07-13 13:05:32 +0200§marius@gitorious.org§ (HEAD, master)§Merge branch 'refactor'§
|
2
|
+
cfa5ba7818834630cea5419987038456051cbc79§fa7674e8bfb3779a1d66d3200786d322a2ded020§2011-07-13 13:05:24 +0200§marius@gitorious.org§ (refactor)§Commit på branch§
|
3
|
+
cf860e9b74b11100db4bf2db639089832dcd7549§fa7674e8bfb3779a1d66d3200786d322a2ded020§2011-07-13 13:05:12 +0200§marius@gitorious.org§§Nederste synlige commit på master§
|
4
|
+
fa7674e8bfb3779a1d66d3200786d322a2ded020§§2011-07-13 13:04:07 +0200§marius@gitorious.org§§Initial commit, we won't use this in our test§
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler/setup"
|
3
|
+
require "minitest/autorun"
|
4
|
+
require "mini_shoulda"
|
5
|
+
|
6
|
+
module Fixtures
|
7
|
+
def fixture(filename)
|
8
|
+
File.read(File.join(File.expand_path(File.dirname(__FILE__)), "fixtures", filename))
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module Deferred
|
13
|
+
def deferred_context(name)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class MiniTest::Spec
|
18
|
+
include Fixtures
|
19
|
+
extend Deferred
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capillary
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 25
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Marius Mathiesen
|
14
|
+
- Christian Johansen
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2011-07-14 00:00:00 +02:00
|
20
|
+
default_executable:
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
name: json
|
24
|
+
prerelease: false
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ~>
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 1
|
31
|
+
segments:
|
32
|
+
- 1
|
33
|
+
- 5
|
34
|
+
- 1
|
35
|
+
version: 1.5.1
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id001
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: minitest
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
hash: 3
|
47
|
+
segments:
|
48
|
+
- 2
|
49
|
+
- 0
|
50
|
+
version: "2.0"
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: mini_shoulda
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 19
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
- 3
|
65
|
+
- 0
|
66
|
+
version: 0.3.0
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
69
|
+
description: Capillary works in conjunction with capillary.js, which outputs a beautiful graphical representation of your repository history
|
70
|
+
email:
|
71
|
+
- marius@gitorious.org
|
72
|
+
- christian@gitorious.org
|
73
|
+
executables:
|
74
|
+
- capillary
|
75
|
+
extensions: []
|
76
|
+
|
77
|
+
extra_rdoc_files: []
|
78
|
+
|
79
|
+
files:
|
80
|
+
- Gemfile
|
81
|
+
- Gemfile.lock
|
82
|
+
- README
|
83
|
+
- Rakefile
|
84
|
+
- bin/capillary
|
85
|
+
- lib/capillary.rb
|
86
|
+
- lib/capillary/commit.rb
|
87
|
+
- lib/capillary/log_parser.rb
|
88
|
+
- lib/capillary/version.rb
|
89
|
+
- test/capillary/commit_test.rb
|
90
|
+
- test/capillary/log_parser_test.rb
|
91
|
+
- test/fixtures/complex_graph_no_ff.txt
|
92
|
+
- test/fixtures/first_commit.txt
|
93
|
+
- test/fixtures/parent_commit.txt
|
94
|
+
- test/fixtures/third_commit.txt
|
95
|
+
- test/fixtures/two_merged_branches.txt
|
96
|
+
- test/test_helper.rb
|
97
|
+
has_rdoc: true
|
98
|
+
homepage: http://gitorious.org/capillary
|
99
|
+
licenses: []
|
100
|
+
|
101
|
+
post_install_message:
|
102
|
+
rdoc_options: []
|
103
|
+
|
104
|
+
require_paths:
|
105
|
+
- lib
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
hash: 3
|
112
|
+
segments:
|
113
|
+
- 0
|
114
|
+
version: "0"
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
hash: 3
|
121
|
+
segments:
|
122
|
+
- 0
|
123
|
+
version: "0"
|
124
|
+
requirements: []
|
125
|
+
|
126
|
+
rubyforge_project: capillary
|
127
|
+
rubygems_version: 1.3.7
|
128
|
+
signing_key:
|
129
|
+
specification_version: 3
|
130
|
+
summary: Capillary generates a JSON payload from Git log output
|
131
|
+
test_files: []
|
132
|
+
|