git_tracker 1.4.0 → 1.5.0
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/.gitignore +1 -8
- data/.rspec +0 -1
- data/CHANGELOG.md +21 -10
- data/README.md +37 -23
- data/Rakefile +58 -5
- data/git_tracker.gemspec +2 -3
- data/lib/git_tracker.rb +1 -2
- data/lib/git_tracker/runner.rb +4 -0
- data/lib/git_tracker/standalone.rb +1 -1
- data/lib/git_tracker/version.rb +1 -1
- data/spec/git_tracker/branch_spec.rb +11 -6
- data/spec/git_tracker/commit_message_spec.rb +34 -28
- data/spec/git_tracker/hook_spec.rb +10 -8
- data/spec/git_tracker/prepare_commit_message_spec.rb +7 -7
- data/spec/git_tracker/repository_spec.rb +3 -3
- data/spec/git_tracker/runner_spec.rb +12 -7
- data/spec/git_tracker/standalone_spec.rb +16 -16
- metadata +6 -21
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,19 +1,30 @@
|
|
1
1
|
### dev
|
2
|
-
[full changelog](https://github.com/
|
2
|
+
[full changelog](https://github.com/stevenharman/git_tracker/compare/v1.5.0...master)
|
3
|
+
|
4
|
+
### 1.5.0 / 2013-02-02
|
5
|
+
[full changelog](https://github.com/stevenharman/git_tracker/compare/v1.4.0...v1.5.0)
|
6
|
+
|
7
|
+
Enhancements
|
8
|
+
|
9
|
+
* Support installing via Homebrew: `brew install git-tracker`
|
10
|
+
* Generate standalone binary via `rake standalone:build`
|
11
|
+
|
12
|
+
### 1.4.0 / 2012-06-11
|
13
|
+
[full changelog](https://github.com/stevenharman/git_tracker/compare/v1.3.1...v1.4.0)
|
14
|
+
|
3
15
|
Enhancements
|
4
16
|
|
5
17
|
* Support Ruby 1.8.7
|
6
|
-
* Generate standalone binary via `rake git-tracker`
|
7
18
|
|
8
19
|
### 1.3.1 / 2012-04-23
|
9
|
-
[full changelog](https://github.com/
|
20
|
+
[full changelog](https://github.com/stevenharman/git_tracker/compare/v1.3.0...v1.3.1)
|
10
21
|
|
11
22
|
Bug fixes
|
12
23
|
|
13
24
|
* Bring back fourth Pivotal Tracker keyword, `delivered`
|
14
25
|
|
15
26
|
### 1.3.0 / 2012-04-23
|
16
|
-
[full changelog](https://github.com/
|
27
|
+
[full changelog](https://github.com/stevenharman/git_tracker/compare/v1.2.0...v1.3.0)
|
17
28
|
|
18
29
|
Enhancements
|
19
30
|
|
@@ -24,7 +35,7 @@ Bug fixes
|
|
24
35
|
* Pivotal Tracker keywords are case-insensitive
|
25
36
|
|
26
37
|
### 1.2.0 / 2012-04-21
|
27
|
-
[full changelog](https://github.com/
|
38
|
+
[full changelog](https://github.com/stevenharman/git_tracker/compare/v1.1.0...v1.2.0)
|
28
39
|
|
29
40
|
Enhancements
|
30
41
|
|
@@ -33,11 +44,11 @@ Enhancements
|
|
33
44
|
Bug fixes
|
34
45
|
|
35
46
|
* Exit with non-zero status code when a commit exists [issue
|
36
|
-
#3](https://github.com/
|
47
|
+
#3](https://github.com/stevenharman/git_tracker/issues/3)
|
37
48
|
* Exit with non-zero status code with not in a Git repository
|
38
49
|
|
39
50
|
### 1.1.0 / 2012-04-03
|
40
|
-
[full changelog](https://github.com/
|
51
|
+
[full changelog](https://github.com/stevenharman/git_tracker/compare/v1.0.0...v1.1.0)
|
41
52
|
|
42
53
|
Enhancements
|
43
54
|
|
@@ -47,16 +58,16 @@ Bug fixes
|
|
47
58
|
|
48
59
|
* Fix case-sensitivity issue w/English library
|
49
60
|
* Exit with non-zero status code with not in a Git repository [issue
|
50
|
-
#1](https://github.com/
|
61
|
+
#1](https://github.com/stevenharman/git_tracker/issues/1)
|
51
62
|
|
52
63
|
### 1.0.0 / 2012-03-31
|
53
|
-
[full changelog](https://github.com/
|
64
|
+
[full changelog](https://github.com/stevenharman/git_tracker/compare/v0.0.1...v1.0.0)
|
54
65
|
|
55
66
|
Enhancements
|
56
67
|
|
57
68
|
* Hook can install itself in a Git repository
|
58
69
|
|
59
70
|
### 0.0.1 / 2012-03-23
|
60
|
-
[full changelog](https://github.com/
|
71
|
+
[full changelog](https://github.com/stevenharman/git_tracker/compare/5fbbe061e721c1f86fdd5d78a4bfb4c61a0eaf5c...v0.0.1)
|
61
72
|
|
62
73
|
* Initial release
|
data/README.md
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
-
# GitTracker
|
1
|
+
# GitTracker
|
2
|
+
|
3
|
+
[](http://travis-ci.org/stevenharman/git_tracker)
|
4
|
+
[](https://gemnasium.com/stevenharman/git_tracker)
|
5
|
+
[](https://codeclimate.com/github/stevenharman/git_tracker)
|
2
6
|
|
3
7
|
*GitTracker*, or *git-tracker*, is a Git hook that will scan your current
|
4
8
|
branch name looking for something it recognizes as a [Pivotal Tracker][pt]
|
@@ -7,30 +11,38 @@ format][pt-format], to your commit message.
|
|
7
11
|
|
8
12
|
## Installation
|
9
13
|
|
10
|
-
|
14
|
+
### 1) Install the `git-tracker` executable
|
11
15
|
|
12
|
-
|
16
|
+
You need to get the `git-tracker` executable on your system, and then you need
|
17
|
+
to install the *git hook* into your local Git repository.
|
13
18
|
|
14
|
-
|
15
|
-
ready soon.
|
19
|
+
- via [Homebrew][homebrew] (preferred)
|
16
20
|
|
17
|
-
```bash
|
18
|
-
$
|
19
|
-
```
|
21
|
+
```bash
|
22
|
+
$ brew install git-tracker
|
23
|
+
```
|
24
|
+
|
25
|
+
- via [RubyGems][rubygems] (if you must)
|
26
|
+
|
27
|
+
```bash
|
28
|
+
$ gem install git_tracker
|
29
|
+
```
|
30
|
+
|
31
|
+
### 2) Install the hook
|
20
32
|
|
21
|
-
|
22
|
-
the hook into your local Git repository.
|
33
|
+
You need to add the hook into each repository where you want to use it.
|
23
34
|
|
24
35
|
```bash
|
25
36
|
# from inside a local Git repository
|
37
|
+
# for example: /path/to/repo/
|
26
38
|
$ git-tracker install
|
27
39
|
```
|
28
40
|
|
29
41
|
This will put the `prepare-commit-msg` hook in the `/path/to/repo/.git/hooks`
|
30
42
|
directory and make it executable.
|
31
43
|
|
32
|
-
**NOTE:**
|
33
|
-
|
44
|
+
**NOTE:** The hook needs to be installed just once for each repository in which
|
45
|
+
you will use it.
|
34
46
|
|
35
47
|
## Usage
|
36
48
|
|
@@ -38,7 +50,7 @@ With the hook installed in a repository, create branches being sure to include
|
|
38
50
|
the Pivotal Tracker story number in the branch name.
|
39
51
|
|
40
52
|
```bash
|
41
|
-
$ git checkout -b
|
53
|
+
$ git checkout -b a_useful_and_helpful_name_8675309
|
42
54
|
```
|
43
55
|
|
44
56
|
When you commit, Git will fire the hook which will find the story number in the
|
@@ -46,7 +58,7 @@ branch name and prepare your commit message so that it include the story number
|
|
46
58
|
in the special Pivotal Tracker syntax.
|
47
59
|
|
48
60
|
```bash
|
49
|
-
# on branch named `best_feature_ever
|
61
|
+
# on branch named `best_feature_ever-8675309`
|
50
62
|
$ git commit
|
51
63
|
```
|
52
64
|
|
@@ -59,7 +71,7 @@ the top)*
|
|
59
71
|
[#8675309]
|
60
72
|
# Please enter the commit message for your changes. Lines starting
|
61
73
|
# with '#' will be ignored, and an empty message aborts the commit.
|
62
|
-
# On branch best_feature_ever
|
74
|
+
# On branch best_feature_ever-8675309
|
63
75
|
# Changes to be committed:
|
64
76
|
# (use "git reset HEAD <file>..." to unstage)
|
65
77
|
#
|
@@ -76,7 +88,7 @@ If you pass a commit message on the command line the hook will still add the
|
|
76
88
|
story number, preceded by an empty line, to the end of your message.
|
77
89
|
|
78
90
|
```bash
|
79
|
-
# on branch named `best_feature_ever
|
91
|
+
# on branch named `best_feature_ever-8675309`
|
80
92
|
$ git commit -m'Look at this rad code, yo!'
|
81
93
|
```
|
82
94
|
|
@@ -92,7 +104,7 @@ However, if you include the story number in the Pivotal Tracker format in your
|
|
92
104
|
commit message, the hook will do nothing.
|
93
105
|
|
94
106
|
```bash
|
95
|
-
# on branch named `best_feature_ever
|
107
|
+
# on branch named `best_feature_ever-8675309`
|
96
108
|
$ git commit -m'[#8675309] Look at this rad code, yo!'
|
97
109
|
```
|
98
110
|
|
@@ -100,7 +112,7 @@ Results in this commit message:
|
|
100
112
|
|
101
113
|
|
102
114
|
```
|
103
|
-
[#
|
115
|
+
[#8675309] Look at this rad code, yo!
|
104
116
|
```
|
105
117
|
|
106
118
|
### Keywords
|
@@ -116,7 +128,7 @@ to the story ID in the commit message.
|
|
116
128
|
For example:
|
117
129
|
|
118
130
|
```bash
|
119
|
-
# on branch named `bug/
|
131
|
+
# on branch named `bug/redis_connection_not_initializing_8675309`
|
120
132
|
$ git commit -am "Change the redis connection string [Fixes]"
|
121
133
|
```
|
122
134
|
|
@@ -134,21 +146,23 @@ Change the redis connection string [Fixes]
|
|
134
146
|
name, optionally prefixing it with a hash (`#`). Examples:
|
135
147
|
|
136
148
|
- `best_feature_ever_#8675309`
|
137
|
-
- `
|
149
|
+
- `best-feature-ever-8675309`
|
138
150
|
- `8675309_best_feature_ever`
|
139
|
-
- `#
|
151
|
+
- `#8675309-best-feature-ever`
|
140
152
|
- `your_name/8675309_best_feature_ever`
|
141
153
|
- `your_name/#8675309_best_feature_ever`
|
142
154
|
|
143
155
|
## Contributing :octocat:
|
144
156
|
|
145
157
|
1. Fork it
|
146
|
-
2. Create your feature branch (`git checkout -b
|
158
|
+
2. Create your feature branch (`git checkout -b my_new_feature`)
|
147
159
|
3. Commit your changes (`git commit -am 'Added some feature'`)
|
148
|
-
4. Push to the branch (`git push origin
|
160
|
+
4. Push to the branch (`git push origin my_new_feature`)
|
149
161
|
5. Create new Pull Request
|
150
162
|
|
151
163
|
|
152
164
|
[pt]: https://www.pivotaltracker.com/
|
153
165
|
[pt-format]: https://www.pivotaltracker.com/help/api?version=v3#scm_post_commit_message_syntax
|
154
166
|
[tpope]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
|
167
|
+
[homebrew]: http://mxcl.github.com/homebrew
|
168
|
+
[rubygems]: http://rubygems.org/gems/git_tracker
|
data/Rakefile
CHANGED
@@ -1,12 +1,65 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
|
-
require '
|
3
|
-
require 'rspec/core/rake_task'
|
2
|
+
require File.expand_path('../lib/git_tracker/version', __FILE__)
|
4
3
|
|
5
|
-
|
6
|
-
|
4
|
+
# Skip these tasks when being installed by Homebrew
|
5
|
+
unless ENV['HOMEBREW_BREW_FILE']
|
7
6
|
|
8
|
-
|
7
|
+
require 'rspec/core/rake_task'
|
8
|
+
RSpec::Core::RakeTask.new(:spec)
|
9
|
+
task :default => :spec
|
10
|
+
|
11
|
+
# Rubygems tasks
|
12
|
+
namespace :gem do
|
13
|
+
require 'bundler/gem_tasks'
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Create tag v#{GitTracker::VERSION}, build, and push to GitHub, Rubygems, and Homebrew"
|
17
|
+
task :release => ['gem:release', 'standalone:homebrew']
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
# standalone and Homebrew
|
22
|
+
file 'git-tracker' => FileList.new('lib/git_tracker.rb', 'lib/git_tracker/*.rb') do |task|
|
9
23
|
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
10
24
|
require 'git_tracker/standalone'
|
11
25
|
GitTracker::Standalone.save(task.name)
|
12
26
|
end
|
27
|
+
|
28
|
+
namespace :standalone do
|
29
|
+
|
30
|
+
desc 'Build standalone script'
|
31
|
+
task :build => 'git-tracker'
|
32
|
+
|
33
|
+
desc 'Build and install standalone script'
|
34
|
+
task :install => 'standalone:build' do
|
35
|
+
prefix = ENV['PREFIX'] || ENV['prefix'] || '/usr/local'
|
36
|
+
|
37
|
+
FileUtils.mkdir_p "#{prefix}/bin"
|
38
|
+
FileUtils.cp 'git-tracker', "#{prefix}/bin", :preserve => true
|
39
|
+
end
|
40
|
+
|
41
|
+
task :homebrew do
|
42
|
+
Dir.chdir `brew --prefix`.chomp do
|
43
|
+
sh 'git checkout -q master'
|
44
|
+
sh 'git pull -q origin master'
|
45
|
+
|
46
|
+
formula_file = 'Library/Formula/git-tracker.rb'
|
47
|
+
sha = `curl -#L https://github.com/stevenharman/git_tracker/tarball/v#{GitTracker::VERSION} | shasum`.split(/\s+/).first
|
48
|
+
abort unless $?.success? and sha.length == 40
|
49
|
+
|
50
|
+
formula = File.read formula_file
|
51
|
+
formula.sub! /\bv\d+(\.\d+)*/, "v#{GitTracker::VERSION}"
|
52
|
+
formula.sub! /\b[0-9a-f]{40}\b/, sha
|
53
|
+
File.open(formula_file, 'w') {|f| f << formula }
|
54
|
+
|
55
|
+
branch = "git_tracker-v#{GitTracker::VERSION}"
|
56
|
+
sh "git checkout -q -B #{branch}"
|
57
|
+
sh "git commit -m 'upgrade git-tracker to v#{GitTracker::VERSION}' -- #{formula_file}"
|
58
|
+
sh "git push -u stevenharman #{branch}"
|
59
|
+
sh "hub pull-request 'upgrade git-tracker to v#{GitTracker::VERSION}'"
|
60
|
+
|
61
|
+
sh "git checkout -q master"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
data/git_tracker.gemspec
CHANGED
@@ -6,16 +6,15 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.version = GitTracker::VERSION
|
7
7
|
gem.authors = ["Steven Harman"]
|
8
8
|
gem.email = ["steveharman@gmail.com"]
|
9
|
-
gem.homepage = "https://github.com/
|
9
|
+
gem.homepage = "https://github.com/stevenharman/git_tracker"
|
10
10
|
gem.summary = %q{Teaching Git about Pivotal Tracker.}
|
11
11
|
gem.description = <<-EOF
|
12
12
|
Some simple tricks that make working with Pivotal Tracker even
|
13
13
|
better... and easier... um, besier!
|
14
14
|
EOF
|
15
15
|
|
16
|
-
gem.add_development_dependency "rspec", "~> 2.
|
16
|
+
gem.add_development_dependency "rspec", "~> 2.12"
|
17
17
|
gem.add_development_dependency "rspec-spies", "~> 2.0"
|
18
|
-
gem.add_development_dependency "pry", "~> 0.9"
|
19
18
|
gem.add_development_dependency "activesupport", "~> 3.2"
|
20
19
|
gem.add_development_dependency "rake"
|
21
20
|
|
data/lib/git_tracker.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
+
require 'git_tracker/version'
|
1
2
|
require 'git_tracker/hook'
|
2
3
|
require 'git_tracker/repository'
|
3
4
|
require 'git_tracker/prepare_commit_message'
|
4
5
|
require 'git_tracker/runner'
|
5
6
|
require 'git_tracker/branch'
|
6
7
|
require 'git_tracker/commit_message'
|
7
|
-
require 'git_tracker/version'
|
8
|
-
|
data/lib/git_tracker/runner.rb
CHANGED
data/lib/git_tracker/version.rb
CHANGED
@@ -29,31 +29,36 @@ describe GitTracker::Branch do
|
|
29
29
|
context 'Current branch has a story number' do
|
30
30
|
it 'finds the story that starts with a hash' do
|
31
31
|
stub_branch('refs/heads/a_very_descriptive_name_#8675309')
|
32
|
-
subject.story_number.
|
32
|
+
expect(subject.story_number).to eq('8675309')
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'finds the story without a leading hash' do
|
36
36
|
stub_branch('refs/heads/a_very_descriptive_name_1235309')
|
37
|
-
subject.story_number.
|
37
|
+
expect(subject.story_number).to eq('1235309')
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'finds the story following a forward hash' do
|
41
41
|
stub_branch('refs/heads/alindeman/8675309_got_her_number')
|
42
|
-
subject.story_number.
|
42
|
+
expect(subject.story_number).to eq('8675309')
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'finds the story in a branch with hyphens' do
|
46
|
+
stub_branch('refs/heads/stevenharman/got-her-number-8675309')
|
47
|
+
expect(subject.story_number).to eq('8675309')
|
43
48
|
end
|
44
49
|
end
|
45
50
|
|
46
51
|
context 'The current branch does not have a story number' do
|
47
52
|
it 'finds no story' do
|
48
|
-
stub_branch('refs/heads/
|
49
|
-
subject.story_number.
|
53
|
+
stub_branch('refs/heads/a_very_descriptive_name-without_a_#number')
|
54
|
+
expect(subject.story_number).to_not be
|
50
55
|
end
|
51
56
|
end
|
52
57
|
|
53
58
|
context 'Not on a branch (HEAD does not exist)' do
|
54
59
|
it 'finds no story' do
|
55
60
|
stub_branch('')
|
56
|
-
subject.story_number.
|
61
|
+
expect(subject.story_number).to_not be
|
57
62
|
end
|
58
63
|
end
|
59
64
|
end
|
@@ -9,7 +9,7 @@ describe GitTracker::CommitMessage do
|
|
9
9
|
let(:file) { 'COMMIT_EDITMSG' }
|
10
10
|
|
11
11
|
it 'requires path to the temporary commit message file' do
|
12
|
-
|
12
|
+
expect { GitTracker::CommitMessage.new }.to raise_error ArgumentError
|
13
13
|
end
|
14
14
|
|
15
15
|
def stub_commit_message(story_text)
|
@@ -20,13 +20,13 @@ describe GitTracker::CommitMessage do
|
|
20
20
|
%w[fix Fixed FIXES Complete completed completes FINISH finished Finishes Deliver delivered DELIVERS].each do |keyword|
|
21
21
|
it "detects the #{keyword} keyword" do
|
22
22
|
stub_commit_message("Did the darn thing. [#{keyword}]")
|
23
|
-
subject.keyword.
|
23
|
+
expect(subject.keyword).to eq(keyword)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'does not find the keyword when it does not exist' do
|
28
28
|
stub_commit_message('Did the darn thing. [Something]')
|
29
|
-
subject.keyword.
|
29
|
+
expect(subject.keyword).to_not be
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -34,57 +34,57 @@ describe GitTracker::CommitMessage do
|
|
34
34
|
context 'commit message contains the special Pivotal Tracker story syntax' do
|
35
35
|
it 'allows just the number' do
|
36
36
|
stub_commit_message('[#8675309]')
|
37
|
-
subject.
|
37
|
+
expect(subject).to be_mentions_story('8675309')
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'allows multiple numbers' do
|
41
41
|
stub_commit_message('[#99 #777 #8675309 #111222]')
|
42
|
-
subject.
|
43
|
-
subject.
|
44
|
-
subject.
|
45
|
-
subject.
|
42
|
+
expect(subject).to be_mentions_story('99')
|
43
|
+
expect(subject).to be_mentions_story('777')
|
44
|
+
expect(subject).to be_mentions_story('8675309')
|
45
|
+
expect(subject).to be_mentions_story('111222')
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'allows state change before number' do
|
49
49
|
stub_commit_message('[Fixes #8675309]')
|
50
|
-
subject.
|
50
|
+
expect(subject).to be_mentions_story('8675309')
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'allows state change after the number' do
|
54
54
|
stub_commit_message('[#8675309 Delivered]')
|
55
|
-
subject.
|
55
|
+
expect(subject).to be_mentions_story('8675309')
|
56
56
|
end
|
57
57
|
|
58
58
|
it 'allows surrounding text' do
|
59
59
|
stub_commit_message('derp de #herp [Fixes #8675309] de herp-ity derp')
|
60
|
-
subject.
|
60
|
+
expect(subject).to be_mentions_story('8675309')
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
64
|
context 'commit message doesn not contain the special Pivotal Tracker story syntax' do
|
65
65
|
it 'requires brackets' do
|
66
66
|
stub_commit_message('#8675309')
|
67
|
-
subject.
|
67
|
+
expect(subject).to_not be_mentions_story('8675309')
|
68
68
|
end
|
69
69
|
|
70
70
|
it 'requires a pound sign' do
|
71
71
|
stub_commit_message('[8675309]')
|
72
|
-
subject.
|
72
|
+
expect(subject).to_not be_mentions_story('8675309')
|
73
73
|
end
|
74
74
|
|
75
75
|
it 'does not allow the bare number' do
|
76
76
|
stub_commit_message('8675309')
|
77
|
-
subject.
|
77
|
+
expect(subject).to_not be_mentions_story('8675309')
|
78
78
|
end
|
79
79
|
|
80
80
|
it 'does not allow multiple state changes' do
|
81
81
|
stub_commit_message('[Fixes Deploys #8675309]')
|
82
|
-
subject.
|
82
|
+
expect(subject).to_not be_mentions_story('8675309')
|
83
83
|
end
|
84
84
|
|
85
85
|
it 'does not allow comments' do
|
86
86
|
stub_commit_message('#[#8675309]')
|
87
|
-
subject.
|
87
|
+
expect(subject).to_not be_mentions_story('8675309')
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
@@ -99,22 +99,21 @@ describe GitTracker::CommitMessage do
|
|
99
99
|
end
|
100
100
|
|
101
101
|
it 'handles no existing message' do
|
102
|
-
|
103
|
-
subject.append('[#8675309]')
|
104
|
-
|
105
|
-
fake_file.content.should == <<-COMMIT_MESSAGE.strip_heredoc
|
102
|
+
commit_message = <<-COMMIT_MESSAGE.strip_heredoc
|
106
103
|
|
107
104
|
|
108
105
|
[#8675309]
|
109
106
|
# some other comments
|
110
107
|
COMMIT_MESSAGE
|
111
|
-
end
|
112
108
|
|
113
|
-
|
114
|
-
stub_original_commit_message("A first line\n\nWith more here\n# other comments\n")
|
109
|
+
stub_original_commit_message("\n\n# some other comments\n")
|
115
110
|
subject.append('[#8675309]')
|
116
111
|
|
117
|
-
fake_file.content.
|
112
|
+
expect(fake_file.content).to eq(commit_message)
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'preserves existing messages' do
|
116
|
+
commit_message = <<-COMMIT_MESSAGE.strip_heredoc
|
118
117
|
A first line
|
119
118
|
|
120
119
|
With more here
|
@@ -122,13 +121,15 @@ describe GitTracker::CommitMessage do
|
|
122
121
|
[#8675309]
|
123
122
|
# other comments
|
124
123
|
COMMIT_MESSAGE
|
125
|
-
end
|
126
124
|
|
127
|
-
|
128
|
-
stub_original_commit_message("# comment #1\n# comment B\n# comment III")
|
125
|
+
stub_original_commit_message("A first line\n\nWith more here\n# other comments\n")
|
129
126
|
subject.append('[#8675309]')
|
130
127
|
|
131
|
-
fake_file.content.
|
128
|
+
expect(fake_file.content).to eq(commit_message)
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'preserves line breaks in comments' do
|
132
|
+
commit_message = <<-COMMIT_MESSAGE.strip_heredoc
|
132
133
|
|
133
134
|
|
134
135
|
[#8675309]
|
@@ -136,6 +137,11 @@ describe GitTracker::CommitMessage do
|
|
136
137
|
# comment B
|
137
138
|
# comment III
|
138
139
|
COMMIT_MESSAGE
|
140
|
+
|
141
|
+
stub_original_commit_message("# comment #1\n# comment B\n# comment III")
|
142
|
+
subject.append('[#8675309]')
|
143
|
+
|
144
|
+
expect(fake_file.content).to eq(commit_message)
|
139
145
|
end
|
140
146
|
end
|
141
147
|
end
|
@@ -3,7 +3,7 @@ require 'git_tracker/hook'
|
|
3
3
|
require 'active_support/core_ext/string/strip'
|
4
4
|
|
5
5
|
describe GitTracker::Hook do
|
6
|
-
subject { described_class }
|
6
|
+
subject(:hook) { described_class }
|
7
7
|
let(:root) { '/path/to/git/repo/toplevel' }
|
8
8
|
let(:hook_path) { File.join(root, '.git', 'hooks', 'prepare-commit-msg') }
|
9
9
|
|
@@ -13,8 +13,8 @@ describe GitTracker::Hook do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'installs to the root of the Git repository' do
|
16
|
-
|
17
|
-
|
16
|
+
hook.should_receive(:install_at).with(root)
|
17
|
+
hook.install
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -26,22 +26,24 @@ describe GitTracker::Hook do
|
|
26
26
|
|
27
27
|
it 'writes the hook into the hooks directory' do
|
28
28
|
File.should_receive(:open).with(hook_path, 'w')
|
29
|
-
|
29
|
+
hook.install_at(root)
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'makes the hook executable' do
|
33
|
-
|
34
|
-
fake_file.mode.
|
33
|
+
hook.install_at(root)
|
34
|
+
expect(fake_file.mode).to eq(0755)
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'writes the hook code in the hook file' do
|
38
|
-
|
39
|
-
fake_file.content.should == <<-HOOK_CODE.strip_heredoc
|
38
|
+
hook_code = <<-HOOK_CODE.strip_heredoc
|
40
39
|
#!/usr/bin/env bash
|
41
40
|
|
42
41
|
git-tracker prepare-commit-msg "$@"
|
43
42
|
|
44
43
|
HOOK_CODE
|
44
|
+
|
45
|
+
hook.install_at(root)
|
46
|
+
expect(fake_file.content).to eq(hook_code)
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
@@ -19,19 +19,19 @@ describe GitTracker::PrepareCommitMessage do
|
|
19
19
|
describe '.new' do
|
20
20
|
|
21
21
|
it 'requires the name of the commit message file' do
|
22
|
-
|
22
|
+
expect { subject.new }.to raise_error(ArgumentError)
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'remembers the name of the commit message file' do
|
26
|
-
subject.new('FILE1').file.
|
26
|
+
expect(subject.new('FILE1').file).to eq('FILE1')
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'optionally accepts a message source' do
|
30
|
-
hook = subject.new('FILE1', 'merge').source.
|
30
|
+
expect(hook = subject.new('FILE1', 'merge').source).to eq('merge')
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'optionally accepts the SHA-1 of a commit' do
|
34
|
-
hook = subject.new('FILE1', 'commit', 'abc1234').commit_sha.
|
34
|
+
expect(hook = subject.new('FILE1', 'commit', 'abc1234').commit_sha).to eq('abc1234')
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -45,7 +45,7 @@ describe GitTracker::PrepareCommitMessage do
|
|
45
45
|
let(:hook) { described_class.new('FILE2', 'commit', '60a086f3') }
|
46
46
|
|
47
47
|
it 'exits with status code 0' do
|
48
|
-
|
48
|
+
expect { hook.run }.to succeed
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -53,7 +53,7 @@ describe GitTracker::PrepareCommitMessage do
|
|
53
53
|
let(:story) { nil }
|
54
54
|
|
55
55
|
it 'exits without updating the commit message' do
|
56
|
-
|
56
|
+
expect { hook.run }.to succeed
|
57
57
|
GitTracker::CommitMessage.should_not have_received(:append)
|
58
58
|
end
|
59
59
|
end
|
@@ -90,7 +90,7 @@ describe GitTracker::PrepareCommitMessage do
|
|
90
90
|
end
|
91
91
|
|
92
92
|
it 'exits without updating the commit message' do
|
93
|
-
|
93
|
+
expect { hook.run }.to succeed
|
94
94
|
GitTracker::CommitMessage.should_not have_received(:append)
|
95
95
|
end
|
96
96
|
end
|
@@ -13,19 +13,19 @@ describe GitTracker::Repository do
|
|
13
13
|
|
14
14
|
it 'gets the path to the top-level directory of the local Repository' do
|
15
15
|
$?.stub(:exitstatus) { 0 }
|
16
|
-
subject.root.
|
16
|
+
expect(subject.root).to eq('/path/to/git/repo/root')
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'aborts when not in a git repository' do
|
20
20
|
$?.stub(:exitstatus) { 128 }
|
21
|
-
|
21
|
+
expect { subject.root }.to_not succeed
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
describe '.ensure_exists' do
|
26
26
|
it 'aborts when not in a git repository' do
|
27
27
|
$?.stub(:exitstatus) { 128 }
|
28
|
-
|
28
|
+
expect { subject.root }.to_not succeed
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -2,37 +2,42 @@ require 'spec_helper'
|
|
2
2
|
require 'git_tracker/runner'
|
3
3
|
|
4
4
|
describe GitTracker::Runner do
|
5
|
-
subject { described_class }
|
5
|
+
subject(:runner) { described_class }
|
6
6
|
let(:args) { ['a_file', 'the_source', 'sha1234'] }
|
7
7
|
|
8
8
|
describe '.execute' do
|
9
9
|
before do
|
10
|
-
|
10
|
+
runner.stub(:prepare_commit_msg) { true }
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'runs the hook, passing the args' do
|
14
|
-
|
15
|
-
|
14
|
+
runner.should_receive(:prepare_commit_msg).with(*args) { true }
|
15
|
+
runner.execute('prepare-commit-msg', *args)
|
16
16
|
end
|
17
17
|
|
18
18
|
# TODO: stop the abort from writing to stderr during tests?
|
19
19
|
it 'does not run hooks we do not know about' do
|
20
|
-
|
20
|
+
expect { runner.execute('non-existent-hook', *args) }.to_not succeed
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
describe '.prepare_commit_msg' do
|
25
25
|
it 'runs the hook, passing the args' do
|
26
26
|
GitTracker::PrepareCommitMessage.should_receive(:run).with(*args) { true }
|
27
|
-
|
27
|
+
runner.prepare_commit_msg(*args)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
describe '.install' do
|
32
32
|
it 'tells the hook to install itself' do
|
33
33
|
GitTracker::Hook.should_receive(:install)
|
34
|
-
|
34
|
+
runner.install
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
it '.test_command reports that it was run' do
|
39
|
+
runner.should_receive(:puts).with('git-tracker is here. How are you?')
|
40
|
+
runner.execute('test-command')
|
41
|
+
end
|
42
|
+
|
38
43
|
end
|
@@ -13,12 +13,12 @@ describe GitTracker::Standalone do
|
|
13
13
|
|
14
14
|
it 'saves to the named file' do
|
15
15
|
described_class.save('git-tracker')
|
16
|
-
File.size('./git-tracker').
|
16
|
+
expect(File.size('./git-tracker')).to be > 100
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'marks the binary as executable' do
|
20
20
|
described_class.save('git-tracker')
|
21
|
-
File.
|
21
|
+
expect(File).to be_executable('./git-tracker')
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -28,33 +28,33 @@ describe GitTracker::Standalone do
|
|
28
28
|
let(:standalone) { described_class.build(io).string }
|
29
29
|
|
30
30
|
it 'declares a shebang' do
|
31
|
-
subject.
|
31
|
+
expect(subject).to match(/#!.+/)
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'includes generated code notice' do
|
35
|
-
subject.
|
35
|
+
expect(subject).to include('This file is generated')
|
36
36
|
end
|
37
37
|
|
38
38
|
it 'inlines the code' do
|
39
|
-
subject.
|
40
|
-
subject.
|
41
|
-
subject.
|
42
|
-
subject.
|
43
|
-
subject.
|
44
|
-
subject.
|
45
|
-
subject.
|
39
|
+
expect(subject).to include('Hook')
|
40
|
+
expect(subject).to include('Repository')
|
41
|
+
expect(subject).to include('PrepareCommitMessage')
|
42
|
+
expect(subject).to include('Runner')
|
43
|
+
expect(subject).to include('Branch')
|
44
|
+
expect(subject).to include('CommitMessage')
|
45
|
+
expect(subject).to include('VERSION')
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'does not inline the standalone code' do
|
49
|
-
subject.
|
49
|
+
expect(subject).to_not include('module Standalone')
|
50
50
|
end
|
51
51
|
|
52
52
|
it 'includes the call to execute the hook' do
|
53
|
-
subject.
|
53
|
+
expect(subject).to include('GitTracker::Runner.execute(*ARGV)')
|
54
54
|
end
|
55
55
|
|
56
56
|
it 'excludes requiring git_tracker code' do
|
57
|
-
subject.
|
57
|
+
expect(subject).to_not match(/^require\s+["']git_tracker/)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -67,12 +67,12 @@ describe GitTracker::Standalone do
|
|
67
67
|
|
68
68
|
it 'uses user-level ruby binary when it is executable' do
|
69
69
|
File.stub(:executable?).with('/usr/bin/ruby') { true }
|
70
|
-
subject.ruby_executable.
|
70
|
+
expect(subject.ruby_executable).to eq('/usr/bin/ruby')
|
71
71
|
end
|
72
72
|
|
73
73
|
it 'uses rbconfig ruby when user-level ruby binary not executable' do
|
74
74
|
File.stub(:executable?).with('/usr/bin/ruby') { false }
|
75
|
-
subject.ruby_executable.
|
75
|
+
expect(subject.ruby_executable).to eq('/some/other/bin/ruby')
|
76
76
|
end
|
77
77
|
end
|
78
78
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git_tracker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '2.
|
21
|
+
version: '2.12'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '2.
|
29
|
+
version: '2.12'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: rspec-spies
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -43,22 +43,6 @@ dependencies:
|
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: '2.0'
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: pry
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ~>
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '0.9'
|
54
|
-
type: :development
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0.9'
|
62
46
|
- !ruby/object:Gem::Dependency
|
63
47
|
name: activesupport
|
64
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -131,7 +115,7 @@ files:
|
|
131
115
|
- spec/support/commit_message_helper.rb
|
132
116
|
- spec/support/fake_file.rb
|
133
117
|
- spec/support/matchers/exit_code_matchers.rb
|
134
|
-
homepage: https://github.com/
|
118
|
+
homepage: https://github.com/stevenharman/git_tracker
|
135
119
|
licenses: []
|
136
120
|
post_install_message:
|
137
121
|
rdoc_options: []
|
@@ -167,3 +151,4 @@ test_files:
|
|
167
151
|
- spec/support/commit_message_helper.rb
|
168
152
|
- spec/support/fake_file.rb
|
169
153
|
- spec/support/matchers/exit_code_matchers.rb
|
154
|
+
has_rdoc:
|