bugspots 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -2,3 +2,4 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
+ .rbenv-version
data/README.md CHANGED
@@ -10,15 +10,15 @@ Point bugspots at any git repo and it will identify the hotspots for you.
10
10
 
11
11
  ```
12
12
  $> gem install bugspots
13
- $> git bugspots /path/to/repo
14
- $> git bugspots . # (in current git directory)
13
+ $> bugspots /path/to/repo
14
+ $> git bugspots (in root of current git project, --help for options)
15
15
  ```
16
16
 
17
17
  ## Results
18
18
 
19
19
  ```
20
20
  $> cd /your/git/repo
21
- $> git bugspots .
21
+ $> git bugspots -d 500
22
22
 
23
23
  .. example output ..
24
24
 
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
4
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
5
+
6
+ require 'bugspots'
7
+ require 'optparse'
8
+
9
+ ARGV << '--help' if ARGV.empty?
10
+
11
+ options = {}
12
+ OptionParser.new do |opts|
13
+ opts.banner = "Usage: bugspots /path/to/git/repo"
14
+
15
+ # Option: Set Branch
16
+ opts.on('-b', '--branch [name]', 'branch to crawl') do |b|
17
+ options[:branch] = b.to_s
18
+ end
19
+
20
+ # Option: Set Depth
21
+ opts.on('-d', '--depth [depth]', 'depth of log crawl (integer)') do |d|
22
+ options[:depth] = d.to_i
23
+ end
24
+
25
+ # Option: Set Bugfix Indicator
26
+ opts.on('-w', '--words ["w1,w2"]', 'bugfix indicator word list, ie: "fixes,closed"') do |words|
27
+ options[:regex] = Regexp.new(words.split(',').join('|'))
28
+ end
29
+
30
+ # Option: Set Bugfix Indicator
31
+ opts.on('-r', '--regex [regex]', Regexp, 'bugfix indicator regex, ie: "fix(es|ed)?" or "/fixes #(\d+)/i"') do |regex|
32
+ options[:regex] = regex
33
+ end
34
+
35
+ # Option: Set Timestamp Display
36
+ opts.on('--display-timestamps', 'show timestamps of each identified fix commit') do |dt|
37
+ options[:display_timestamps] = true
38
+ end
39
+ end.parse!
40
+
41
+ # Set a reasonable default of depth
42
+ options[:depth] ||= 500
43
+
44
+ # Set master as the default branch
45
+ options[:branch] ||= "master"
46
+
47
+ puts "Scanning #{ARGV[0]} repo".foreground(:green)
48
+
49
+ begin
50
+ fixes, spots = Bugspots.scan(ARGV[0], options[:branch], options[:depth], options[:regex])
51
+
52
+ puts "\tFound #{fixes.size} bugfix commits, with #{spots.size} hotspots:".foreground(:yellow)
53
+ puts
54
+
55
+ puts "\tFixes:".foreground(:green).underline
56
+ fixes.each do |fix|
57
+ message = "\t\t- "
58
+ message << "#{fix.date} " if options[:display_timestamps]
59
+ message << "#{fix.message}"
60
+ puts message.foreground(:yellow)
61
+ end
62
+
63
+ puts "\n"
64
+ puts "\tHotspots:".foreground(:green).underline
65
+ spots.each do |spot|
66
+ puts "\t\t#{spot.score}".foreground(:red) + " - #{spot.file}".foreground(:yellow)
67
+ end
68
+
69
+ rescue Grit::InvalidGitRepositoryError
70
+ puts "Invalid Git repository - please run from or specify the full path to the root of the project.".foreground(:red)
71
+ end
@@ -1,61 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
4
- $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
5
-
6
- require 'bugspots'
7
- require 'optparse'
8
-
9
- ARGV << '--help' if ARGV.empty?
10
-
11
- options = {}
12
- OptionParser.new do |opts|
13
- opts.banner = "Usage: bugspots /path/to/git/repo"
14
-
15
- # Option: Set Branch
16
- opts.on('-b', '--branch [name]', 'branch to crawl') do |b|
17
- options[:branch] = b.to_s
18
- end
19
-
20
- # Option: Set Depth
21
- opts.on('-d', '--depth [depth]', 'depth of log crawl (integer)') do |d|
22
- options[:depth] = d.to_i
23
- end
24
-
25
- # Option: Set Bugfix Indicator
26
- opts.on('-w', '--words ["w1,w2"]', 'bugfix indicator, ie: "fixes,closed"') do |words|
27
- options[:words] = words
28
- end
29
-
30
- # Option: Set Timestamp Display
31
- opts.on('--display-timestamps', 'show timestamps of each identified fix commit') do |dt|
32
- options[:display_timestamps] = true
33
- end
34
- end.parse!
35
-
36
- # Set a reasonable default of depth
37
- options[:depth] ||= 500
38
-
39
- # Set master as the default branch
40
- options[:branch] ||= "master"
41
-
42
- puts "Scanning #{ARGV[0]} repo".foreground(:green)
43
-
44
- fixes, spots = Bugspots.scan(ARGV[0], options[:branch], options[:depth], options[:words])
45
-
46
- puts "\tFound #{fixes.size} bugfix commits, with #{spots.size} hotspots:".foreground(:yellow)
47
- puts
48
-
49
- puts "\tFixes:".foreground(:green).underline
50
- fixes.each do |fix|
51
- message = "\t\t- "
52
- message << "#{fix.date} " if options[:display_timestamps]
53
- message << "#{fix.message}"
54
- puts message.foreground(:yellow)
3
+ if ARGV.empty? or not Dir.exists? ARGV[0]
4
+ ARGV.unshift Dir.pwd
55
5
  end
56
6
 
57
- puts "\n"
58
- puts "\tHotspots:".foreground(:green).underline
59
- spots.each do |spot|
60
- puts "\t\t#{spot.score}".foreground(:red) + " - #{spot.file}".foreground(:yellow)
61
- end
7
+ exec("bugspots #{ARGV.join(' ')}")
@@ -5,19 +5,19 @@ module Bugspots
5
5
  Fix = Struct.new(:message, :date, :files)
6
6
  Spot = Struct.new(:file, :score)
7
7
 
8
- def self.scan(repo, branch = "master", depth = 500, words = nil)
8
+ def self.scan(repo, branch = "master", depth = 500, regex = nil)
9
9
  repo = Grit::Repo.new(repo)
10
+ unless repo.branches.find { |e| e.name == branch }
11
+ raise ArgumentError, "no such branch in the repo: #{branch}"
12
+ end
10
13
  fixes = []
11
14
 
12
- if words
13
- message_matchers = /#{words.split(',').join('|')}/
14
- else
15
- message_matchers = /fix(es|ed)?|close(s|d)?/i
16
- end
15
+ regex ||= /fix(es|ed)?|close(s|d)?/i
17
16
 
17
+ tree = repo.tree(branch)
18
18
  repo.commits(branch, depth).each do |commit|
19
- if commit.message =~ message_matchers
20
- files = commit.stats.files.map {|s| s.first}
19
+ if commit.message =~ regex
20
+ files = commit.stats.files.map {|s| s.first}.select{ |s| tree/s }
21
21
  fixes << Fix.new(commit.short_message, commit.date, files)
22
22
  end
23
23
  end
@@ -1,3 +1,3 @@
1
1
  module Bugspots
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bugspots
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-03 00:00:00.000000000 Z
12
+ date: 2012-01-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: grit
16
- requirement: &2156994600 !ruby/object:Gem::Requirement
16
+ requirement: &2153130800 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2156994600
24
+ version_requirements: *2153130800
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rainbow
27
- requirement: &2156992780 !ruby/object:Gem::Requirement
27
+ requirement: &2153129280 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,11 +32,12 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2156992780
35
+ version_requirements: *2153129280
36
36
  description: Implementation of simple bug prediction hotspot heuristic
37
37
  email:
38
38
  - ilya@igvita.com
39
39
  executables:
40
+ - bugspots
40
41
  - git-bugspots
41
42
  extensions: []
42
43
  extra_rdoc_files: []
@@ -45,6 +46,7 @@ files:
45
46
  - Gemfile
46
47
  - README.md
47
48
  - Rakefile
49
+ - bin/bugspots
48
50
  - bin/git-bugspots
49
51
  - bugspots.gemspec
50
52
  - lib/bugspots.rb