git_manager 0.0.0 → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/git_manager.rb +170 -19
- data/lib/logs/2012-08-21_00-00-01 +11 -0
- data/spec/git_manager_spec.rb +76 -26
- metadata +8 -6
data/lib/git_manager.rb
CHANGED
@@ -1,29 +1,180 @@
|
|
1
1
|
require 'rubygems'
|
2
|
+
|
3
|
+
# usage Git::Blames::Pending.new(
|
4
|
+
# :root => <root folder where build logs are located>
|
5
|
+
# :rspec => boolean specifying whether or
|
6
|
+
# not you want to run rspec now to get pending specs
|
7
|
+
# ).blame
|
8
|
+
# usage Git::Managed::Branch.new.delete_branches
|
9
|
+
|
2
10
|
module Git
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
def delete_branches
|
17
|
-
return false if @branches_to_delete.length == 0
|
18
|
-
@branches_to_delete.each do |branch|
|
19
|
-
delete_branch( branch.gsub /\s/, '' )
|
11
|
+
module Managed
|
12
|
+
class Branch
|
13
|
+
end
|
14
|
+
end
|
15
|
+
module Blames
|
16
|
+
def blame
|
17
|
+
self.tasks.each_pair do |key, attributes|
|
18
|
+
puts "\nPending Spec Information:"
|
19
|
+
puts " Description: #{key}"
|
20
|
+
puts " Contributors: #{attributes[:contributors].join(', ')}"
|
21
|
+
puts " File: #{attributes[:spec_file]}"
|
22
|
+
puts " Line: #{attributes[:line_number]}\n"
|
20
23
|
end
|
21
24
|
end
|
25
|
+
class Pending
|
26
|
+
end
|
27
|
+
class Blame
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Git::Managed::Branch
|
33
|
+
attr_accessor :branches, :current_branch, :branches_to_delete
|
34
|
+
def initialize
|
35
|
+
@branches = `git branch`.split /\n/
|
36
|
+
partition_branches
|
37
|
+
end
|
38
|
+
def partition_branches
|
39
|
+
@current_branch = @branches.select {|branch| branch.match /^\*/}.first
|
40
|
+
@branches_to_delete = @branches.select {|branch| branch != @current_branch }
|
41
|
+
@current_branch.chomp!
|
42
|
+
@current_branch.gsub! /\s|\*/, ''
|
43
|
+
end
|
22
44
|
|
23
|
-
|
24
|
-
|
45
|
+
def delete_branches
|
46
|
+
return false if @branches_to_delete.length == 0
|
47
|
+
@branches_to_delete.each do |branch|
|
48
|
+
delete_branch( branch.gsub /\s/, '' )
|
25
49
|
end
|
50
|
+
end
|
26
51
|
|
52
|
+
def delete_branch branch
|
53
|
+
`git branch -D #{branch}`
|
27
54
|
end
|
55
|
+
|
28
56
|
end
|
29
57
|
|
58
|
+
class Git::Blames::Pending
|
59
|
+
attr_accessor :tasks, :rspec_results
|
60
|
+
|
61
|
+
include Git::Blames
|
62
|
+
|
63
|
+
def initialize options = nil
|
64
|
+
if options.nil? || options[:root].nil? && !options[:rspec]
|
65
|
+
@root = "#{File.dirname(__FILE__)}/logs"
|
66
|
+
elsif options[:rspec]
|
67
|
+
find_pending_specs_by_rspec_results( rspec_results )
|
68
|
+
else
|
69
|
+
@root = options[:root]
|
70
|
+
find_pending_specs_by_logfile_name( "#{@root}/#{find_last_logfile_name}" )
|
71
|
+
end
|
72
|
+
find_contributors
|
73
|
+
end
|
74
|
+
|
75
|
+
def rspec_results
|
76
|
+
rspec_output = `rspec spec`
|
77
|
+
puts rspec_output
|
78
|
+
rspec_output
|
79
|
+
end
|
80
|
+
|
81
|
+
def find_contributors
|
82
|
+
# @tasks = Git::Blames::Pending.new.tasks
|
83
|
+
contributors = []
|
84
|
+
@tasks.each_pair do |key, attributes|
|
85
|
+
`git blame "#{attributes[:spec_file]}"`.each do |blame|
|
86
|
+
contributor = blame.split(")")[0].split("(")[1]
|
87
|
+
contributor = contributor.split(/\s+\d/)[0]
|
88
|
+
contributors.push( contributor )
|
89
|
+
end
|
90
|
+
@tasks[key][:contributors] = contributors.uniq
|
91
|
+
@tasks[key][:contributors].reject!{ |contributor| contributor == 'Not Committed Yet'}
|
92
|
+
end
|
93
|
+
@tasks
|
94
|
+
end
|
95
|
+
|
96
|
+
def found_pending_marker line
|
97
|
+
line.match( /^[\s\t]*Pending:/ )
|
98
|
+
end
|
99
|
+
|
100
|
+
def found_new_spec_marker line, status
|
101
|
+
( status == 'start' || status == 'updating spec data' ) && !line.match( /^[\s\t]*#/ )
|
102
|
+
end
|
103
|
+
|
104
|
+
def found_spec_details_marker line, status
|
105
|
+
( status == 'found new pending spec' || status == 'updating spec data' ) && line.match( /^[\s\t]*\#/ )
|
106
|
+
end
|
107
|
+
|
108
|
+
def find_last_logfile_name
|
109
|
+
begin
|
110
|
+
files = Dir.new @root
|
111
|
+
rescue => e
|
112
|
+
begin
|
113
|
+
Dir.mkdir @root
|
114
|
+
files = Dir.new @root
|
115
|
+
rescue
|
116
|
+
puts e
|
117
|
+
end
|
118
|
+
end
|
119
|
+
files.to_a.select { |log| log.match /\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}/ }.sort.last
|
120
|
+
end
|
121
|
+
|
122
|
+
def find_pending_specs_by_rspec_results spec_output
|
123
|
+
status = ''
|
124
|
+
@tasks = {}
|
125
|
+
task = {}
|
126
|
+
|
127
|
+
spec_output.each do |line|
|
128
|
+
puts "line = #{line}"
|
129
|
+
if found_pending_marker line
|
130
|
+
status = 'start'
|
131
|
+
|
132
|
+
elsif found_new_spec_marker line, status
|
133
|
+
status = 'found new pending spec'
|
134
|
+
task = {}
|
135
|
+
task[:name] = line.chomp
|
136
|
+
task[:details] = []
|
137
|
+
|
138
|
+
elsif found_spec_details_marker line, status
|
139
|
+
status = 'updating spec data'
|
140
|
+
if line.match /(spec.*)[:](\d+)/
|
141
|
+
task[:spec_file] = $1
|
142
|
+
task[:line_number] = $2
|
143
|
+
else
|
144
|
+
task[:details].push line.chomp
|
145
|
+
end
|
146
|
+
@tasks[task[:name]] = task
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def find_pending_specs_by_logfile_name logfile_name
|
152
|
+
logfile = File.new( logfile_name )
|
153
|
+
status = ''
|
154
|
+
@tasks = {}
|
155
|
+
task = {}
|
156
|
+
|
157
|
+
logfile.readlines.each do |line|
|
158
|
+
|
159
|
+
if found_pending_marker line
|
160
|
+
status = 'start'
|
161
|
+
|
162
|
+
elsif found_new_spec_marker line, status
|
163
|
+
status = 'found new pending spec'
|
164
|
+
task = {}
|
165
|
+
task[:name] = line.chomp
|
166
|
+
task[:details] = []
|
167
|
+
|
168
|
+
elsif found_spec_details_marker line, status
|
169
|
+
status = 'updating spec data'
|
170
|
+
if line.match /(spec.*)[:](\d+)/
|
171
|
+
task[:spec_file] = $1
|
172
|
+
task[:line_number] = $2
|
173
|
+
else
|
174
|
+
task[:details].push line.chomp
|
175
|
+
end
|
176
|
+
@tasks[task[:name]] = task
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Pending:
|
2
|
+
Fake test 1 spec/git_manager_spec.rb
|
3
|
+
# Test 123
|
4
|
+
# ./spec/git_manager_spec.rb:13
|
5
|
+
Fake test 2 spec/git_manager_spec.rb
|
6
|
+
# Test 123
|
7
|
+
# ./spec/git_manager_spec.rb:11
|
8
|
+
|
9
|
+
Finished in x minutes y seconds
|
10
|
+
z examples, 0 failures, 2 pending
|
11
|
+
Finished: SUCCESS
|
data/spec/git_manager_spec.rb
CHANGED
@@ -2,33 +2,83 @@ require 'rubygems'
|
|
2
2
|
require 'rspec'
|
3
3
|
require 'git_manager'
|
4
4
|
|
5
|
-
describe Git
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
5
|
+
describe Git do
|
6
|
+
describe Git::Managed::Branch do
|
7
|
+
before :each do
|
8
|
+
@git_manager = Git::Managed::Branch.new
|
9
|
+
end
|
10
|
+
it "has branches" do
|
11
|
+
@git_manager.branches.should_not be_nil
|
12
|
+
end
|
13
|
+
it "has branches array" do
|
14
|
+
@git_manager.branches.class.should == Array
|
15
|
+
end
|
16
|
+
it "knows about current branch" do
|
17
|
+
@git_manager.current_branch.should == 'master'
|
18
|
+
end
|
19
|
+
it "knows about branches to delete" do
|
20
|
+
@git_manager.branches_to_delete.should_not be_nil
|
21
|
+
end
|
22
|
+
it "aborts if branches to delete is empty" do
|
23
|
+
@git_manager.branches_to_delete = []
|
24
|
+
@git_manager.delete_branches.should == false
|
25
|
+
end
|
26
|
+
it "deltes branches to delete if NOT empty" do
|
27
|
+
@fake_branch_name = 'some_fake_branch'
|
28
|
+
Git::Managed::Branch.any_instance.stub(:delete_branch).and_return( true )
|
29
|
+
|
30
|
+
@git_manager.branches_to_delete = ['some_fake_branch']
|
31
|
+
@git_manager.delete_branches.should_not == false
|
32
|
+
end
|
17
33
|
end
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
34
|
+
|
35
|
+
describe Git::Blames::Pending do
|
36
|
+
before :each do
|
37
|
+
Git::Blames::Pending.any_instance.stub(:rspec_results){'mr huxtable'}
|
38
|
+
@test_01 = ' Fake test 1 spec/git_manager_spec.rb'
|
39
|
+
@test_02 = ' Fake test 2 spec/git_manager_spec.rb'
|
40
|
+
@git_blames_pending = Git::Blames::Pending.new(:root => './lib/logs')
|
41
|
+
@expected_tasks = {
|
42
|
+
@test_01 => {
|
43
|
+
:spec_file => 'spec/git_manager_spec.rb',
|
44
|
+
:details=>[" # Test 123"],
|
45
|
+
:line_number => '13',
|
46
|
+
:contributors => ['John Jimenez'],
|
47
|
+
:name => " Fake test 1 spec/git_manager_spec.rb"
|
48
|
+
},
|
49
|
+
@test_02 => {
|
50
|
+
:spec_file => 'spec/git_manager_spec.rb',
|
51
|
+
:details=>[" # Test 123"],
|
52
|
+
:line_number => '11',
|
53
|
+
:contributors => ['John Jimenez'],
|
54
|
+
:name => " Fake test 2 spec/git_manager_spec.rb"
|
55
|
+
}
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
it "collects pending specs as expected" do
|
60
|
+
@git_blames_pending.tasks[@test_01][:spec_file].should == @expected_tasks[@test_01][:spec_file]
|
61
|
+
@git_blames_pending.tasks[@test_02][:spec_file].should == @expected_tasks[@test_02][:spec_file]
|
62
|
+
end
|
28
63
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
64
|
+
it "collects pending spec line number as expected" do
|
65
|
+
@git_blames_pending.tasks[@test_01][:line_number].should == @expected_tasks[@test_01][:line_number]
|
66
|
+
@git_blames_pending.tasks[@test_02][:line_number].should == @expected_tasks[@test_02][:line_number]
|
67
|
+
end
|
68
|
+
|
69
|
+
it "collects pending spec name as expected" do
|
70
|
+
@git_blames_pending.tasks[@test_01][:spec_name].should == @expected_tasks[@test_01][:spec_name]
|
71
|
+
@git_blames_pending.tasks[@test_02][:spec_name].should == @expected_tasks[@test_02][:spec_name]
|
72
|
+
end
|
33
73
|
|
74
|
+
it "collects pending spec contributors as expected" do
|
75
|
+
@git_blames_pending.tasks[@test_01][:contributors].should == @expected_tasks[@test_01][:contributors]
|
76
|
+
@git_blames_pending.tasks[@test_02][:contributors].should == @expected_tasks[@test_02][:contributors]
|
77
|
+
end
|
34
78
|
|
79
|
+
it "collects pending spec details as expected" do
|
80
|
+
@git_blames_pending.tasks[@test_01][:details].should == @expected_tasks[@test_01][:details]
|
81
|
+
@git_blames_pending.tasks[@test_02][:details].should == @expected_tasks[@test_02][:details]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git_manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- kikuchiyo
|
@@ -15,10 +15,10 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-08-
|
18
|
+
date: 2012-08-21 00:00:00 Z
|
19
19
|
dependencies: []
|
20
20
|
|
21
|
-
description:
|
21
|
+
description: delete old git branches and blame pending specs
|
22
22
|
email: kikuchiyo6@gmail.com
|
23
23
|
executables: []
|
24
24
|
|
@@ -28,6 +28,7 @@ extra_rdoc_files: []
|
|
28
28
|
|
29
29
|
files:
|
30
30
|
- lib/git_manager.rb
|
31
|
+
- lib/logs/2012-08-21_00-00-01
|
31
32
|
- spec/git_manager_spec.rb
|
32
33
|
homepage: http://rubygems.org/gems/git_manager
|
33
34
|
licenses: []
|
@@ -61,6 +62,7 @@ rubyforge_project:
|
|
61
62
|
rubygems_version: 1.8.24
|
62
63
|
signing_key:
|
63
64
|
specification_version: 3
|
64
|
-
summary: manage git
|
65
|
+
summary: gem to manage git
|
65
66
|
test_files:
|
66
67
|
- spec/git_manager_spec.rb
|
68
|
+
has_rdoc:
|