git-duet 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -0
- data/.ruby-version +1 -1
- data/.travis.yml +11 -17
- data/LICENSE +1 -1
- data/README.md +69 -48
- data/Rakefile +2 -4
- data/bin/rubymine-git-wrapper +8 -0
- data/file.txt +0 -0
- data/git-duet.gemspec +11 -9
- data/lib/git/duet/version.rb +1 -1
- data/spec/lib/git/duet/author_mapper_spec.rb +39 -51
- data/spec/lib/git/duet/cli_spec.rb +12 -12
- data/spec/lib/git/duet/command_methods_spec.rb +10 -10
- data/spec/lib/git/duet/duet_command_spec.rb +28 -26
- data/spec/lib/git/duet/pre_commit_command_spec.rb +6 -6
- data/spec/lib/git/duet/solo_command_spec.rb +49 -43
- metadata +10 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50d7af1c799d72430af337f3ebce7f5594628022
|
4
|
+
data.tar.gz: 8efc2502e7dbcf5048c208dc38dffef004b10ae8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e36a169a110dbef6344c8f4c58dce163c4e83c432be772136a07095f84ba2ba80037da6bf2f8ba016c9211e92d23341ccae7209c502dc808aa3fd6063e0a1862
|
7
|
+
data.tar.gz: c579fc838fe6616f768cf28a25e29a6d7e6c9a56ef050dc56f20d014305e4af3f289062718b0b7d8d3247337d5bf7bc73574cf8a70105d25b6ea372add205c85
|
data/.rubocop.yml
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.
|
1
|
+
2.1.3
|
data/.travis.yml
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
---
|
1
2
|
language: ruby
|
2
3
|
env:
|
3
4
|
global:
|
@@ -8,25 +9,18 @@ matrix:
|
|
8
9
|
rvm:
|
9
10
|
- 1.9.3
|
10
11
|
- 2.0.0
|
11
|
-
- 2.1.
|
12
|
+
- 2.1.3
|
12
13
|
- jruby-19mode
|
13
14
|
before_script:
|
14
|
-
- git clone https://github.com/sstephenson/bats.git
|
15
|
-
- cd bats && sudo ./install.sh /usr/local
|
15
|
+
- "git clone https://github.com/sstephenson/bats.git"
|
16
|
+
- "cd bats && sudo ./install.sh /usr/local"
|
16
17
|
script:
|
17
18
|
- bundle exec rake
|
18
|
-
- bats test
|
19
|
+
- bundle exec bats test
|
19
20
|
notifications:
|
20
|
-
email:
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
on:
|
27
|
-
tags: true
|
28
|
-
repo: modcloth/git-duet
|
29
|
-
addons:
|
30
|
-
code_climate:
|
31
|
-
repo_token:
|
32
|
-
secure: A/K+dw6//V8WkB4PapKa1BqEGbwxWbhvHSCFKe+CnHSJ19vDbij2C1x8uzh3NpYTI+B9a5/p9r0B8AmVFI2hKU5CIdGiqMd+sEMM/OzSBeMTIO8d0NKJRfJEGH9yRSlka3cpwLMKmbdPorYnI0iKdVvWLabPhzneK8qYCgHMSWw=
|
21
|
+
email:
|
22
|
+
recipients:
|
23
|
+
- dan@meatballhat.com
|
24
|
+
- jesse.szwedko@gmail.com
|
25
|
+
- rafael.colton@gmail.com
|
26
|
+
- sheenathejunglegirl@gmail.com
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# Git Duet
|
2
2
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/git-duet.png)](http://badge.fury.io/rb/git-duet)
|
4
|
-
[![Build Status](https://travis-ci.org/
|
4
|
+
[![Build Status](https://travis-ci.org/meatballhat/git-duet.png?branch=master)](https://travis-ci.org/meatballhat/git-duet)
|
5
5
|
[![Code Climate](https://codeclimate.com/repos/52b6ea7089af7e2ddc0b1f3c/badges/cc96e2278280922e2a3f/gpa.png)](https://codeclimate.com/repos/52b6ea7089af7e2ddc0b1f3c/feed)
|
6
6
|
[![Dependency
|
7
|
-
Status](https://gemnasium.com/
|
7
|
+
Status](https://gemnasium.com/meatballhat/git-duet.png)](https://gemnasium.com/meatballhat/git-duet)
|
8
8
|
|
9
9
|
Pair harmoniously! Working in a pair doesn't mean you've both lost your
|
10
10
|
identity. Git Duet helps with blaming/praising by using stuff that's
|
@@ -15,9 +15,9 @@ identities.
|
|
15
15
|
|
16
16
|
Install it with `gem`:
|
17
17
|
|
18
|
-
|
18
|
+
``` bash
|
19
19
|
gem install git-duet
|
20
|
-
|
20
|
+
```
|
21
21
|
|
22
22
|
## Usage
|
23
23
|
|
@@ -27,55 +27,57 @@ Make an authors file with email domain, or if you're already using
|
|
27
27
|
[git pair](https://github.com/pivotal/git_scripts), just symlink your
|
28
28
|
`~/.pairs` file over to `~/.git-authors`.
|
29
29
|
|
30
|
-
|
30
|
+
``` yaml
|
31
31
|
authors:
|
32
32
|
jd: Jane Doe; jane
|
33
33
|
fb: Frances Bar
|
34
34
|
email:
|
35
35
|
domain: awesometown.local
|
36
|
-
|
36
|
+
```
|
37
37
|
|
38
38
|
`git duet` will use the `git pair` YAML structure if it has to (the
|
39
39
|
difference is the top-level key being `pairs` instead of `authors`,) e.g.:
|
40
40
|
|
41
|
-
|
41
|
+
``` yaml
|
42
42
|
pairs:
|
43
43
|
jd: Jane Doe; jane
|
44
44
|
fb: Frances Bar
|
45
45
|
email:
|
46
46
|
domain: awesometown.local
|
47
|
-
|
47
|
+
```
|
48
48
|
|
49
49
|
If you want your authors file to live somwhere else, just tell
|
50
50
|
Git Duet about it via the `GIT_DUET_AUTHORS_FILE` environmental
|
51
51
|
variable, e.g.:
|
52
52
|
|
53
|
-
|
53
|
+
``` bash
|
54
54
|
export GIT_DUET_AUTHORS_FILE=$HOME/.secret-squirrel/git-authors
|
55
55
|
# ...
|
56
56
|
git duet jd am
|
57
|
-
|
57
|
+
```
|
58
58
|
|
59
59
|
### Workflow stuff
|
60
60
|
|
61
61
|
Set the author and committer via `git duet`:
|
62
62
|
|
63
|
-
|
63
|
+
``` bash
|
64
64
|
git duet jd fb
|
65
|
-
|
65
|
+
```
|
66
66
|
|
67
67
|
When you're ready to commit, use `git duet-commit` (or add an alias like
|
68
68
|
a normal person. Something like `dci = duet-commit` should work.)
|
69
69
|
|
70
|
-
|
70
|
+
``` bash
|
71
71
|
git duet-commit -v [any other git options]
|
72
|
-
|
72
|
+
# or...
|
73
|
+
git dci -v [any other git options]
|
74
|
+
```
|
73
75
|
|
74
76
|
When you're done pairing, set the author back to yourself with `git solo`:
|
75
77
|
|
76
|
-
|
78
|
+
``` bash
|
77
79
|
git solo jd
|
78
|
-
|
80
|
+
```
|
79
81
|
|
80
82
|
### Global Config Support
|
81
83
|
|
@@ -83,13 +85,13 @@ If you're jumping between projects and don't want to think about
|
|
83
85
|
managing them all individually, you can operate on the global git
|
84
86
|
config:
|
85
87
|
|
86
|
-
|
88
|
+
``` bash
|
87
89
|
git solo -g jd
|
88
|
-
|
90
|
+
```
|
89
91
|
|
90
|
-
|
92
|
+
``` bash
|
91
93
|
git duet --global jd fb
|
92
|
-
|
94
|
+
```
|
93
95
|
|
94
96
|
### Email Configuration
|
95
97
|
|
@@ -97,30 +99,30 @@ By default, email addresses are constructed from the first initial and
|
|
97
99
|
last name ( *or* optional username after a `;`) plus email domain, e.g.
|
98
100
|
with the following authors file:
|
99
101
|
|
100
|
-
|
102
|
+
``` yaml
|
101
103
|
pairs:
|
102
104
|
jd: Jane Doe; jane
|
103
105
|
fb: Frances Bar
|
104
106
|
email:
|
105
107
|
domain: eternalstench.bog.local
|
106
|
-
|
108
|
+
```
|
107
109
|
|
108
110
|
After invoking:
|
109
111
|
|
110
|
-
|
112
|
+
``` bash
|
111
113
|
git duet jd fb
|
112
|
-
|
114
|
+
```
|
113
115
|
|
114
116
|
Then the configured email addresses will show up like this:
|
115
117
|
|
116
|
-
|
118
|
+
``` bash
|
117
119
|
git config user.email
|
118
120
|
# -> jane@eternalstench.bog.local
|
119
121
|
git config duet.env.git-author-email
|
120
122
|
# -> jane@eternalstench.bog.local
|
121
123
|
git config duet.env.git-committer-email
|
122
124
|
# -> f.bar@eternalstench.bog.local
|
123
|
-
|
125
|
+
```
|
124
126
|
|
125
127
|
A custom email template may be provided via the `email_template` config
|
126
128
|
variable. The template should be a valid ERB string and the variables
|
@@ -128,35 +130,35 @@ available are `author` which is the full first and last name value
|
|
128
130
|
associated with each set of initials, `initials` which are the initials
|
129
131
|
key, and `username` which is the part following `;` in the author value.
|
130
132
|
|
131
|
-
|
133
|
+
``` yaml
|
132
134
|
pairs:
|
133
135
|
jd: Jane Doe
|
134
136
|
fb: Frances Bar
|
135
137
|
email_template: '<%= "#{author.gsub(/ /, "-").downcase}@hamster.local" =%>'
|
136
|
-
|
138
|
+
```
|
137
139
|
|
138
140
|
After invoking:
|
139
141
|
|
140
|
-
|
142
|
+
``` bash
|
141
143
|
git duet jd fb
|
142
|
-
|
144
|
+
```
|
143
145
|
|
144
146
|
Then the configured email addresses will show up like this:
|
145
147
|
|
146
|
-
|
148
|
+
``` bash
|
147
149
|
git config user.email
|
148
150
|
# -> jane-doe@hamster.local
|
149
151
|
git config duet.env.git-author-email
|
150
152
|
# -> jane-doe@hamster.local
|
151
153
|
git config duet.env.git-committer-email
|
152
154
|
# -> frances-bar@hamster.local
|
153
|
-
|
155
|
+
```
|
154
156
|
|
155
157
|
If there are any exceptions to either the default format or a provided
|
156
158
|
`email_template` config var, explicitly setting email addresses by
|
157
159
|
initials is supported.
|
158
160
|
|
159
|
-
|
161
|
+
``` yaml
|
160
162
|
pairs:
|
161
163
|
jd: Jane Doe; jane
|
162
164
|
fb: Frances Bar
|
@@ -164,35 +166,35 @@ email:
|
|
164
166
|
domain: awesometown.local
|
165
167
|
email_addresses:
|
166
168
|
jd: jane@awesome.local
|
167
|
-
|
169
|
+
```
|
168
170
|
|
169
171
|
Then Jane Doe's email will show up like this:
|
170
172
|
|
171
|
-
|
173
|
+
``` bash
|
172
174
|
git solo jd
|
173
175
|
# ...
|
174
176
|
git config user.email
|
175
177
|
# -> jane@awesome.local
|
176
|
-
|
178
|
+
```
|
177
179
|
|
178
180
|
Alternatively, if you have some other preferred way to look up email
|
179
181
|
addresses by initials, name or username, just use that instead:
|
180
182
|
|
181
|
-
|
183
|
+
``` bash
|
182
184
|
export GIT_DUET_EMAIL_LOOKUP_COMMAND="$HOME/bin/custom-ldap-thingy"
|
183
185
|
# ... do work
|
184
186
|
git duet jd fb
|
185
187
|
# ... observe emails being set via the specified executable
|
186
|
-
|
188
|
+
```
|
187
189
|
|
188
190
|
The initials, name, and username will be passed as arguments to the
|
189
191
|
lookup executable. Anything written to standard output will be used as
|
190
192
|
the email address:
|
191
193
|
|
192
|
-
|
194
|
+
``` bash
|
193
195
|
$HOME/bin/custom-ldap-thingy 'jd' 'Jane Doe' 'jane'
|
194
196
|
# -> doej@behemoth.company.local
|
195
|
-
|
197
|
+
```
|
196
198
|
|
197
199
|
If nothing is returned on standard output, email construction falls back
|
198
200
|
to the decisions described above.
|
@@ -221,10 +223,10 @@ initials, use `git duet-pre-commit` in your pre-commit hook:
|
|
221
223
|
|
222
224
|
*(in $REPO_ROOT/.git/hooks/pre-commit)*
|
223
225
|
|
224
|
-
|
226
|
+
``` bash
|
225
227
|
#!/bin/bash
|
226
228
|
exec git duet-pre-commit
|
227
|
-
|
229
|
+
```
|
228
230
|
|
229
231
|
The `duet-pre-commit` command will exit with a non-zero status if the
|
230
232
|
cached author and committer settings are missing or stale. The default
|
@@ -232,23 +234,42 @@ staleness cutoff is [20 minutes](http://en.wikipedia.org/wiki/Pomodoro_Technique
|
|
232
234
|
but may be configured via the `GIT_DUET_SECONDS_AGO_STALE` environmental variable,
|
233
235
|
which should be an integer of seconds, e.g.:
|
234
236
|
|
235
|
-
|
237
|
+
``` bash
|
236
238
|
export GIT_DUET_SECONDS_AGO_STALE=60
|
237
239
|
# ... do work for more than a minute
|
238
240
|
git commit -v
|
239
241
|
# ... pre-commit hook fires
|
240
|
-
|
242
|
+
```
|
241
243
|
|
242
244
|
If you want to use the default hook (as shown above), install it while
|
243
245
|
in your repo like so:
|
244
246
|
|
245
|
-
|
247
|
+
``` bash
|
246
248
|
git duet-install-hook
|
247
|
-
|
249
|
+
```
|
248
250
|
|
249
251
|
Don't worry if you forgot you already had a `pre-commit` hook installed.
|
250
252
|
The `git duet-install-hook` command will refuse to overwrite it.
|
251
253
|
|
254
|
+
### RubyMine integration
|
255
|
+
|
256
|
+
In order to have the author and committer properly set when committing
|
257
|
+
via RubyMine, a git wrapper executable may be used to override any
|
258
|
+
executions of `git commit`. Such an executable is available in the Git
|
259
|
+
Duet repository, and may be installed somewhere in your `$PATH` like so:
|
260
|
+
|
261
|
+
``` bash
|
262
|
+
\curl -Ls -o ~/bin/rubymine-git-wrapper https://raw.github.com/meatballhat/git-duet/master/bin/rubymine-git-wrapper
|
263
|
+
chmod +x ~/bin/rubymine-git-wrapper
|
264
|
+
```
|
265
|
+
|
266
|
+
Given an install location of `~/bin/rubymine-git-wrapper` as shown
|
267
|
+
above, you would then update your RubyMine setting in
|
268
|
+
*Preferences* => *Version Control* => *Git* to set
|
269
|
+
**Path to Git executable** to the full path of
|
270
|
+
`~/bin/rubymine-git-wrapper` (with the `~` expanded).
|
271
|
+
See issue #8 for more details.
|
272
|
+
|
252
273
|
## Compatibility
|
253
274
|
|
254
275
|
Git Duet has been tested on a bunch of platform/interpreter combinations
|
@@ -258,8 +279,8 @@ While JRuby works it is not recommended as the VM startup time is
|
|
258
279
|
usually longer than it takes most Git Duet commands to execute.
|
259
280
|
|
260
281
|
If you experience badness, please [let us know via
|
261
|
-
email](mailto:
|
262
|
-
github](https://github.com/
|
282
|
+
email](mailto:dan@meatballhat.com) or pretty please [create an issue on
|
283
|
+
github](https://github.com/meatballhat/git-duet/issues/new).
|
263
284
|
|
264
285
|
## Contributing
|
265
286
|
|
data/Rakefile
CHANGED
@@ -3,11 +3,9 @@
|
|
3
3
|
require 'bundler/gem_tasks'
|
4
4
|
|
5
5
|
require 'rspec/core/rake_task'
|
6
|
+
require 'rubocop/rake_task'
|
6
7
|
|
7
|
-
|
8
|
-
task :rubocop do
|
9
|
-
sh('rubocop --format simple') { |r, _| r || abort }
|
10
|
-
end
|
8
|
+
RuboCop::RakeTask.new
|
11
9
|
|
12
10
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
13
11
|
t.rspec_opts = '--format documentation'
|
data/file.txt
ADDED
File without changes
|
data/git-duet.gemspec
CHANGED
@@ -9,25 +9,27 @@ Gem::Specification.new do |gem|
|
|
9
9
|
'Sheena McCoy'
|
10
10
|
]
|
11
11
|
gem.email = %w(
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
dan@meatballhat.com
|
13
|
+
jesse.szwedko@gmail.com
|
14
|
+
rafael.colton@gmail.com
|
15
|
+
sheenathejunglegirl@gmail.com
|
16
16
|
)
|
17
|
-
gem.description =
|
17
|
+
gem.description = 'Pair programming git identity thingy'
|
18
18
|
gem.summary = "Pair harmoniously! Decide who's driving. " \
|
19
19
|
"Commit along the way. Don't make a mess of " \
|
20
20
|
'the repository history.'
|
21
|
-
gem.homepage = 'https://github.com/
|
21
|
+
gem.homepage = 'https://github.com/meatballhat/git-duet'
|
22
22
|
gem.license = 'MIT'
|
23
23
|
|
24
|
-
gem.files = `git ls-files`.split(
|
25
|
-
gem.executables = gem.files.grep(/^bin\//)
|
24
|
+
gem.files = `git ls-files -z`.split("\x00")
|
25
|
+
gem.executables = gem.files.grep(/^bin\//)
|
26
|
+
.map { |f| File.basename(f) }
|
27
|
+
.reject { |n| n =~ /rubymine-git-wrapper/ }
|
26
28
|
gem.test_files = gem.files.grep(/^spec\//)
|
27
29
|
gem.name = 'git-duet'
|
28
30
|
gem.require_paths = %w(lib)
|
29
31
|
gem.version = Git::Duet::VERSION
|
30
|
-
gem.required_ruby_version = '>= 1.9
|
32
|
+
gem.required_ruby_version = '>= 1.9'
|
31
33
|
|
32
34
|
gem.add_development_dependency 'rake'
|
33
35
|
gem.add_development_dependency 'rspec'
|
data/lib/git/duet/version.rb
CHANGED
@@ -27,18 +27,18 @@ describe Git::Duet::AuthorMapper do
|
|
27
27
|
it 'uses an authors file given at initialization' do
|
28
28
|
instance = described_class
|
29
29
|
.new('/blarggie/blarggie/new/friend/.git-authors')
|
30
|
-
instance.authors_file
|
31
|
-
.
|
30
|
+
expect(instance.authors_file)
|
31
|
+
.to eq('/blarggie/blarggie/new/friend/.git-authors')
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'uses the `GIT_DUET_AUTHORS_FILE` if provided' do
|
35
35
|
ENV['GIT_DUET_AUTHORS_FILE'] = '/fizzle/bizzle/.git-authors'
|
36
36
|
instance = described_class.new
|
37
|
-
instance.authors_file.
|
37
|
+
expect(instance.authors_file).to eq('/fizzle/bizzle/.git-authors')
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'falls back to using `~/.git-authors` for the author map' do
|
41
|
-
subject.authors_file.
|
41
|
+
expect(subject.authors_file).to eq(File.join(ENV['HOME'], '.git-authors'))
|
42
42
|
end
|
43
43
|
|
44
44
|
it 'lets missing author errors bubble up' do
|
@@ -46,41 +46,33 @@ describe Git::Duet::AuthorMapper do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'maps initials to name -> email pairs' do
|
49
|
-
subject.map('jd').fetch('jd')
|
50
|
-
name: 'Jane Doe',
|
51
|
-
email: 'jane@awesome.biz'
|
52
|
-
}
|
49
|
+
expect(subject.map('jd').fetch('jd'))
|
50
|
+
.to eq(name: 'Jane Doe', email: 'jane@awesome.biz')
|
53
51
|
end
|
54
52
|
|
55
53
|
it 'constructs default emails from first initial and last name + domain' do
|
56
|
-
subject.map('hb').
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
}
|
61
|
-
}
|
54
|
+
expect(subject.map('hb')).to eq('hb' => {
|
55
|
+
name: 'Hampton Bones',
|
56
|
+
email: 'h.bones@awesometown.me'
|
57
|
+
})
|
62
58
|
end
|
63
59
|
|
64
60
|
it 'constructs emails from optional username (if given) + domain' do
|
65
|
-
subject.map('fb').
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
}
|
70
|
-
}
|
61
|
+
expect(subject.map('fb')).to eq('fb' => {
|
62
|
+
name: 'Frances Bar',
|
63
|
+
email: 'frances@awesometown.me'
|
64
|
+
})
|
71
65
|
end
|
72
66
|
|
73
67
|
it 'uses an explicitly-configured email address if given' do
|
74
|
-
subject.map('jd').
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
}
|
79
|
-
}
|
68
|
+
expect(subject.map('jd')).to eq('jd' => {
|
69
|
+
name: 'Jane Doe',
|
70
|
+
email: 'jane@awesome.biz'
|
71
|
+
})
|
80
72
|
end
|
81
73
|
|
82
74
|
it 'maps any number of initials to name -> email pairs' do
|
83
|
-
subject.map('jd', 'fb', 'qx', 'hb').
|
75
|
+
expect(subject.map('jd', 'fb', 'qx', 'hb')).to eq(
|
84
76
|
'jd' => {
|
85
77
|
name: 'Jane Doe',
|
86
78
|
email: 'jane@awesome.biz'
|
@@ -97,38 +89,34 @@ describe Git::Duet::AuthorMapper do
|
|
97
89
|
name: 'Hampton Bones',
|
98
90
|
email: 'h.bones@awesometown.me'
|
99
91
|
}
|
100
|
-
|
92
|
+
)
|
101
93
|
end
|
102
94
|
|
103
95
|
context 'when using a `~/.pairs` config' do
|
104
96
|
before :each do
|
105
|
-
subject.
|
106
|
-
|
107
|
-
'
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
'
|
114
|
-
|
115
|
-
|
116
|
-
'
|
117
|
-
'jd' => 'jane@awesome.biz'
|
118
|
-
}
|
97
|
+
allow(subject).to receive(:cfg).and_return(
|
98
|
+
'pairs' => {
|
99
|
+
'jd' => 'Jane Doe; jdoe',
|
100
|
+
'fb' => 'Frances Bar; frances',
|
101
|
+
'qx' => 'Quincy Xavier; qx',
|
102
|
+
'hb' => 'Hampton Bones'
|
103
|
+
},
|
104
|
+
'email' => {
|
105
|
+
'domain' => 'awesometown.me'
|
106
|
+
},
|
107
|
+
'email_addresses' => {
|
108
|
+
'jd' => 'jane@awesome.biz'
|
119
109
|
}
|
120
110
|
)
|
121
111
|
end
|
122
112
|
|
123
113
|
it 'maps initials to name -> email pairs' do
|
124
|
-
subject.map('jd').fetch('jd')
|
125
|
-
name: 'Jane Doe',
|
126
|
-
email: 'jane@awesome.biz'
|
127
|
-
}
|
114
|
+
expect(subject.map('jd').fetch('jd'))
|
115
|
+
.to eq(name: 'Jane Doe', email: 'jane@awesome.biz')
|
128
116
|
end
|
129
117
|
|
130
118
|
it 'maps any number of initials to name -> email pairs' do
|
131
|
-
subject.map('jd', 'fb', 'qx', 'hb').
|
119
|
+
expect(subject.map('jd', 'fb', 'qx', 'hb')).to eq(
|
132
120
|
'jd' => {
|
133
121
|
name: 'Jane Doe',
|
134
122
|
email: 'jane@awesome.biz'
|
@@ -145,7 +133,7 @@ describe Git::Duet::AuthorMapper do
|
|
145
133
|
name: 'Hampton Bones',
|
146
134
|
email: 'h.bones@awesometown.me'
|
147
135
|
}
|
148
|
-
|
136
|
+
)
|
149
137
|
end
|
150
138
|
end
|
151
139
|
|
@@ -160,20 +148,20 @@ describe Git::Duet::AuthorMapper do
|
|
160
148
|
|
161
149
|
before :each do
|
162
150
|
subject.instance_variable_set(:@cfg, nil)
|
163
|
-
IO.
|
151
|
+
allow(IO).to receive(:read).with(bad_path).and_raise(
|
164
152
|
Errno::ENOENT.new("No such file or directory - #{bad_path}")
|
165
153
|
)
|
166
154
|
end
|
167
155
|
|
168
156
|
it 'warns about missing authors file' do
|
169
|
-
$stderr.
|
157
|
+
expect($stderr).to receive(:puts).with(
|
170
158
|
/Missing or corrupt authors file.*#{bad_path}/i
|
171
159
|
)
|
172
160
|
expect { subject.map('zzz') }.to raise_error
|
173
161
|
end
|
174
162
|
|
175
163
|
it 'raises a ScriptDieError' do
|
176
|
-
$stderr.
|
164
|
+
allow($stderr).to receive(:puts)
|
177
165
|
expect { subject.map('zzz') }.to raise_error(Git::Duet::ScriptDieError)
|
178
166
|
end
|
179
167
|
end
|
@@ -8,7 +8,7 @@ describe Git::Duet::Cli do
|
|
8
8
|
subject(:cli) { described_class }
|
9
9
|
|
10
10
|
it 'responds to `.main`' do
|
11
|
-
cli.
|
11
|
+
expect(cli).to respond_to(:run)
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'requires the prog name and argv array' do
|
@@ -20,28 +20,28 @@ describe Git::Duet::Cli do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'returns the exit status from any script error deaths' do
|
23
|
-
cli.
|
24
|
-
cli.run('git-solo', %w(ty -q)).
|
23
|
+
allow(cli).to receive(:solo).and_raise(Git::Duet::ScriptDieError.new(99))
|
24
|
+
expect(cli.run('git-solo', %w(ty -q))).to eq(99)
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'runs `solo` when the progname matches /solo$/' do
|
28
|
-
Git::Duet::SoloCommand.
|
29
|
-
solo.
|
30
|
-
|
28
|
+
allow(Git::Duet::SoloCommand).to receive(:new).and_return(
|
29
|
+
double('solo').tap { |solo| expect(solo).to receive(:execute!) }
|
30
|
+
)
|
31
31
|
cli.run('git-solo', %w(jd -q))
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'runs `duet` when progname matches /duet$/' do
|
35
|
-
Git::Duet::DuetCommand.
|
36
|
-
duet.
|
37
|
-
|
35
|
+
allow(Git::Duet::DuetCommand).to receive(:new).and_return(
|
36
|
+
double('duet').tap { |duet| expect(duet).to receive(:execute!) }
|
37
|
+
)
|
38
38
|
cli.run('git-duet', %w(jd fb -q))
|
39
39
|
end
|
40
40
|
|
41
41
|
it 'runs `pre_commit` when progname matches /pre-commit$/' do
|
42
|
-
Git::Duet::PreCommitCommand.
|
43
|
-
pc.
|
44
|
-
|
42
|
+
allow(Git::Duet::PreCommitCommand).to receive(:new).and_return(
|
43
|
+
double('pre-commit').tap { |pc| expect(pc).to receive(:execute!) }
|
44
|
+
)
|
45
45
|
cli.run('git-duet-pre-commit', %w(-q))
|
46
46
|
end
|
47
47
|
end
|
@@ -17,26 +17,26 @@ describe Git::Duet::CommandMethods do
|
|
17
17
|
|
18
18
|
before :each do
|
19
19
|
[:info, :error].each do |m|
|
20
|
-
subject.
|
20
|
+
allow(subject).to receive(m)
|
21
21
|
end
|
22
|
-
subject.
|
22
|
+
allow(subject).to receive(:in_repo_root) do |&block|
|
23
23
|
block.call
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'writes env vars to a custom git config tree' do
|
28
|
-
subject.
|
28
|
+
expect(subject).to receive(:`)
|
29
29
|
.with("git config #{Git::Duet::Config.namespace}.fizzle-baz 'awesome'")
|
30
|
-
subject.
|
30
|
+
expect(subject).to receive(:`)
|
31
31
|
.with("git config #{Git::Duet::Config.namespace}.oh-snarf 'mumra'")
|
32
|
-
subject.
|
32
|
+
expect(subject).to receive(:`)
|
33
33
|
.with(/^git config #{Git::Duet::Config.namespace}.mtime \d+/)
|
34
34
|
subject.send(:write_env_vars)
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'explodes if a subshell returns non-zero' do
|
38
|
-
subject.
|
39
|
-
$CHILD_STATUS.
|
38
|
+
allow(subject).to receive(:`)
|
39
|
+
expect($CHILD_STATUS).to receive(:exitstatus).and_return(1)
|
40
40
|
expect { subject.send(:exec_check, 'ls hamsters') }
|
41
41
|
.to raise_error(StandardError)
|
42
42
|
end
|
@@ -47,13 +47,13 @@ describe Git::Duet::CommandMethods do
|
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'writes env vars to a custom global git config tree' do
|
50
|
-
subject.
|
50
|
+
expect(subject).to receive(:`)
|
51
51
|
.with("git config --global #{Git::Duet::Config.namespace}" \
|
52
52
|
".fizzle-baz 'awesome'")
|
53
|
-
subject.
|
53
|
+
expect(subject).to receive(:`)
|
54
54
|
.with("git config --global #{Git::Duet::Config.namespace}" \
|
55
55
|
".oh-snarf 'mumra'")
|
56
|
-
subject.
|
56
|
+
expect(subject).to receive(:`)
|
57
57
|
.with(/^git config --global #{Git::Duet::Config.namespace}.mtime \d+/)
|
58
58
|
subject.send(:write_env_vars)
|
59
59
|
end
|
@@ -10,15 +10,17 @@ describe Git::Duet::DuetCommand do
|
|
10
10
|
subject(:cmd) { described_class.new(alpha, omega) }
|
11
11
|
|
12
12
|
before :each do
|
13
|
-
cmd.
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
allow(cmd).to receive(:author_mapper).and_return(
|
14
|
+
double('author mapper').tap do |am|
|
15
|
+
allow(am).to receive(:map).and_return(author_mapping)
|
16
|
+
end
|
17
|
+
)
|
18
|
+
allow(cmd).to receive(:`).and_return('')
|
19
|
+
allow(cmd).to receive(:report_env_vars)
|
20
|
+
allow(Dir).to receive(:chdir) do |&block|
|
19
21
|
block.call
|
20
22
|
end
|
21
|
-
File.
|
23
|
+
allow(File).to receive(:open) do |_, _, &block|
|
22
24
|
block.call(double('outfile').as_null_object)
|
23
25
|
end
|
24
26
|
end
|
@@ -28,42 +30,42 @@ describe Git::Duet::DuetCommand do
|
|
28
30
|
end
|
29
31
|
|
30
32
|
it 'responds to `execute!`' do
|
31
|
-
cmd.
|
33
|
+
expect(cmd).to respond_to(:execute!)
|
32
34
|
end
|
33
35
|
|
34
36
|
it '(privately) responds to `write_env_vars`' do
|
35
|
-
cmd.private_methods.map(&:to_sym).
|
37
|
+
expect(cmd.private_methods.map(&:to_sym)).to include(:write_env_vars)
|
36
38
|
end
|
37
39
|
|
38
40
|
it 'sets the alpha name as git config user.name' do
|
39
|
-
cmd.
|
40
|
-
cmd.
|
41
|
+
allow(cmd).to receive(:`).with(/git config user\.email/)
|
42
|
+
expect(cmd).to receive(:`)
|
41
43
|
.with("git config user.name '#{author_mapping[alpha][:name]}'")
|
42
44
|
cmd.execute!
|
43
45
|
end
|
44
46
|
|
45
47
|
it 'sets the alpha email as git config user.email' do
|
46
|
-
cmd.
|
47
|
-
cmd.
|
48
|
+
allow(cmd).to receive(:`).with(/git config user\.name/)
|
49
|
+
expect(cmd).to receive(:`)
|
48
50
|
.with("git config user.email '#{author_mapping[alpha][:email]}'")
|
49
51
|
cmd.execute!
|
50
52
|
end
|
51
53
|
|
52
54
|
it 'reports env vars to $stdout' do
|
53
|
-
cmd.
|
54
|
-
$stdout.
|
55
|
+
expect(cmd).to receive(:report_env_vars).and_call_original
|
56
|
+
expect($stdout).to receive(:puts)
|
55
57
|
.with(/^GIT_AUTHOR_NAME='#{author_mapping[alpha][:name]}'/)
|
56
|
-
$stdout.
|
58
|
+
expect($stdout).to receive(:puts)
|
57
59
|
.with(/^GIT_AUTHOR_EMAIL='#{author_mapping[alpha][:email]}'/)
|
58
|
-
$stdout.
|
60
|
+
expect($stdout).to receive(:puts)
|
59
61
|
.with(/^GIT_COMMITTER_NAME='#{author_mapping[omega][:name]}'/)
|
60
|
-
$stdout.
|
62
|
+
expect($stdout).to receive(:puts)
|
61
63
|
.with(/^GIT_COMMITTER_EMAIL='#{author_mapping[omega][:email]}'/)
|
62
64
|
cmd.execute!
|
63
65
|
end
|
64
66
|
|
65
67
|
it 'sets the alpha as author and omega as committer in custom git config' do
|
66
|
-
cmd.
|
68
|
+
expect(cmd).to receive(:write_env_vars)
|
67
69
|
cmd.execute!
|
68
70
|
end
|
69
71
|
|
@@ -72,7 +74,7 @@ describe Git::Duet::DuetCommand do
|
|
72
74
|
let(:"#{author_type}") { 'brzzzt' }
|
73
75
|
|
74
76
|
it 'aborts' do
|
75
|
-
cmd.
|
77
|
+
allow(cmd).to receive(:error).and_return(nil)
|
76
78
|
expect { cmd.execute! }.to raise_error(Git::Duet::ScriptDieError)
|
77
79
|
end
|
78
80
|
end
|
@@ -82,17 +84,17 @@ describe Git::Duet::DuetCommand do
|
|
82
84
|
subject(:cmd) { described_class.new(alpha, omega, false, true) }
|
83
85
|
|
84
86
|
it 'sets the alpha name as global git config user.name' do
|
85
|
-
cmd.
|
87
|
+
allow(cmd).to receive(:`).with(/git config --global user\.email/)
|
86
88
|
alpha_name = author_mapping[alpha][:name]
|
87
|
-
cmd.
|
89
|
+
expect(cmd).to receive(:`)
|
88
90
|
.with("git config --global user.name '#{alpha_name}'")
|
89
91
|
cmd.execute!
|
90
92
|
end
|
91
93
|
|
92
94
|
it 'sets the alpha email as global git config user.email' do
|
93
|
-
cmd.
|
95
|
+
allow(cmd).to receive(:`).with(/git config --global user\.name/)
|
94
96
|
alpha_email = author_mapping[alpha][:email]
|
95
|
-
cmd.
|
97
|
+
expect(cmd).to receive(:`)
|
96
98
|
.with("git config --global user.email '#{alpha_email}'")
|
97
99
|
cmd.execute!
|
98
100
|
end
|
@@ -111,11 +113,11 @@ describe Git::Duet::DuetCommand do
|
|
111
113
|
#{Git::Duet::Config.namespace}.mtime 138039#{rand(1000..9999)}
|
112
114
|
EOF
|
113
115
|
|
114
|
-
cmd.
|
116
|
+
allow(cmd).to receive(:`)
|
115
117
|
.with("git config --get-regexp #{Git::Duet::Config.namespace}") do
|
116
118
|
git_config_output
|
117
119
|
end
|
118
|
-
$stdout.
|
120
|
+
expect($stdout).to receive(:puts).with(git_config_output)
|
119
121
|
|
120
122
|
cmd.execute!
|
121
123
|
end
|
@@ -5,7 +5,7 @@ describe Git::Duet::PreCommitCommand do
|
|
5
5
|
subject(:cmd) { described_class.new(true) }
|
6
6
|
|
7
7
|
before :each do
|
8
|
-
cmd.
|
8
|
+
allow(cmd).to receive(:in_repo_root) do |&block|
|
9
9
|
block.call
|
10
10
|
end
|
11
11
|
@old_seconds_ago_stale = ENV.delete('GIT_DUET_SECONDS_AGO_STALE')
|
@@ -21,19 +21,19 @@ describe Git::Duet::PreCommitCommand do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'does nothing if the env cache is not stale' do
|
24
|
-
cmd.
|
24
|
+
allow(cmd).to receive(:exec_check)
|
25
25
|
.with(/git config #{Git::Duet::Config.namespace}.git/)
|
26
|
-
cmd.
|
26
|
+
allow(cmd).to receive(:exec_check)
|
27
27
|
.with("git config #{Git::Duet::Config.namespace}.mtime")
|
28
28
|
.and_return(Time.now.to_i)
|
29
|
-
cmd.
|
29
|
+
expect(cmd).to_not receive(:explode!)
|
30
30
|
cmd.execute!
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'explodes if the env cache does not exist' do
|
34
|
-
cmd.
|
34
|
+
allow(cmd).to receive(:exec_check)
|
35
35
|
.with(/git config #{Git::Duet::Config.namespace}.git/)
|
36
|
-
cmd.
|
36
|
+
allow(cmd).to receive(:exec_check)
|
37
37
|
.with("git config #{Git::Duet::Config.namespace}.mtime")
|
38
38
|
.and_raise(StandardError)
|
39
39
|
expect { cmd.execute! }.to raise_error(Git::Duet::ScriptDieError)
|
@@ -10,12 +10,14 @@ describe Git::Duet::SoloCommand do
|
|
10
10
|
subject(:cmd) { described_class.new(soloist) }
|
11
11
|
|
12
12
|
before :each do
|
13
|
-
cmd.
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
cmd.
|
13
|
+
allow(cmd).to receive(:author_mapper).and_return(
|
14
|
+
double('author mapper').tap do |am|
|
15
|
+
allow(am).to receive(:map).and_return(author_mapping)
|
16
|
+
end
|
17
|
+
)
|
18
|
+
allow(cmd).to receive(:`).and_return('')
|
19
|
+
allow(cmd).to receive(:report_env_vars)
|
20
|
+
allow(cmd).to receive(:in_repo_root) do |&block|
|
19
21
|
block.call
|
20
22
|
end
|
21
23
|
end
|
@@ -25,64 +27,68 @@ describe Git::Duet::SoloCommand do
|
|
25
27
|
end
|
26
28
|
|
27
29
|
it 'responds to `execute!`' do
|
28
|
-
cmd.
|
30
|
+
expect(cmd).to respond_to(:execute!)
|
29
31
|
end
|
30
32
|
|
31
33
|
it '(privately) responds to `write_env_vars`' do
|
32
|
-
cmd.private_methods.map(&:to_sym).
|
34
|
+
expect(cmd.private_methods.map(&:to_sym)).to include(:write_env_vars)
|
33
35
|
end
|
34
36
|
|
35
37
|
it 'sets the soloist name as git config user.name' do
|
36
|
-
cmd.
|
37
|
-
cmd.
|
38
|
-
|
38
|
+
allow(cmd).to receive(:`).with(/git config user\.email/)
|
39
|
+
allow(cmd).to receive(:`).with(
|
40
|
+
/git config --unset-all #{Git::Duet::Config.namespace}/
|
41
|
+
)
|
42
|
+
expect(cmd).to receive(:`)
|
39
43
|
.with("git config user.name '#{author_mapping[soloist][:name]}'")
|
40
44
|
cmd.execute!
|
41
45
|
end
|
42
46
|
|
43
47
|
it 'sets the soloist email as git config user.email' do
|
44
|
-
cmd.
|
45
|
-
cmd.
|
46
|
-
|
48
|
+
allow(cmd).to receive(:`).with(/git config user\.name/)
|
49
|
+
allow(cmd).to receive(:`).with(
|
50
|
+
/git config --unset-all #{Git::Duet::Config.namespace}/
|
51
|
+
)
|
52
|
+
expect(cmd).to receive(:`)
|
47
53
|
.with("git config user.email '#{author_mapping[soloist][:email]}'")
|
48
54
|
cmd.execute!
|
49
55
|
end
|
50
56
|
|
51
57
|
it 'unsets the committer name' do
|
52
|
-
cmd.
|
53
|
-
cmd.
|
54
|
-
cmd.
|
58
|
+
allow(cmd).to receive(:`).with(/git config user\.name/)
|
59
|
+
allow(cmd).to receive(:`).with(/git config user\.email/)
|
60
|
+
allow(cmd).to receive(:`)
|
55
61
|
.with(/git config --unset-all #{Git::Duet::Config
|
56
62
|
.namespace}.git-committer-email/)
|
57
|
-
cmd.
|
63
|
+
expect(cmd).to receive(:`)
|
58
64
|
.with("git config --unset-all #{Git::Duet::Config
|
59
65
|
.namespace}.git-committer-name")
|
60
66
|
cmd.execute!
|
61
67
|
end
|
62
68
|
|
63
69
|
it 'unsets the committer email' do
|
64
|
-
cmd.
|
65
|
-
cmd.
|
66
|
-
cmd.
|
70
|
+
allow(cmd).to receive(:`).with(/git config user\.name/)
|
71
|
+
allow(cmd).to receive(:`).with(/git config user\.email/)
|
72
|
+
allow(cmd).to receive(:`)
|
67
73
|
.with(/git config --unset-all #{Git::Duet::Config
|
68
74
|
.namespace}.git-committer-name/)
|
69
|
-
cmd.
|
75
|
+
expect(cmd).to receive(:`)
|
70
76
|
.with("git config --unset-all #{Git::Duet::Config
|
71
77
|
.namespace}.git-committer-email")
|
72
78
|
cmd.execute!
|
73
79
|
end
|
74
80
|
|
75
81
|
it 'reports env vars to $stdout' do
|
76
|
-
cmd.
|
77
|
-
$stdout.
|
82
|
+
allow(cmd).to receive(:report_env_vars).and_call_original
|
83
|
+
expect($stdout).to receive(:puts)
|
78
84
|
.with(/^GIT_AUTHOR_NAME='#{author_mapping[soloist][:name]}'/)
|
79
|
-
$stdout.
|
85
|
+
expect($stdout).to receive(:puts)
|
80
86
|
.with(/^GIT_AUTHOR_EMAIL='#{author_mapping[soloist][:email]}'/)
|
81
87
|
cmd.execute!
|
82
88
|
end
|
83
89
|
|
84
90
|
it 'sets the soloist as author in custom git config' do
|
85
|
-
cmd.
|
91
|
+
expect(cmd).to receive(:write_env_vars)
|
86
92
|
cmd.execute!
|
87
93
|
end
|
88
94
|
|
@@ -90,7 +96,7 @@ describe Git::Duet::SoloCommand do
|
|
90
96
|
let(:soloist) { 'bzzzrt' }
|
91
97
|
|
92
98
|
it 'aborts' do
|
93
|
-
cmd.
|
99
|
+
allow(cmd).to receive(:error).and_return(nil)
|
94
100
|
expect { cmd.execute! }.to raise_error(Git::Duet::ScriptDieError)
|
95
101
|
end
|
96
102
|
end
|
@@ -105,11 +111,11 @@ describe Git::Duet::SoloCommand do
|
|
105
111
|
#{Git::Duet::Config.namespace}.mtime 138039#{rand(1000..9999)}
|
106
112
|
EOF
|
107
113
|
|
108
|
-
cmd.
|
114
|
+
allow(cmd).to receive(:`)
|
109
115
|
.with("git config --get-regexp #{Git::Duet::Config.namespace}") do
|
110
116
|
git_config_output
|
111
117
|
end
|
112
|
-
$stdout.
|
118
|
+
expect($stdout).to receive(:puts).with(git_config_output)
|
113
119
|
|
114
120
|
cmd.execute!
|
115
121
|
end
|
@@ -119,48 +125,48 @@ describe Git::Duet::SoloCommand do
|
|
119
125
|
subject(:cmd) { described_class.new(soloist, false, true) }
|
120
126
|
|
121
127
|
it 'sets the soloist name as global git config user.name' do
|
122
|
-
cmd.
|
123
|
-
cmd.
|
128
|
+
allow(cmd).to receive(:`).with(/git config --global user\.email/)
|
129
|
+
allow(cmd).to receive(:`)
|
124
130
|
.with(/git config --global --unset-all #{Git::Duet::Config.namespace}/)
|
125
131
|
soloist_name = author_mapping[soloist][:name]
|
126
|
-
cmd.
|
132
|
+
expect(cmd).to receive(:`)
|
127
133
|
.with("git config --global user.name '#{soloist_name}'")
|
128
134
|
cmd.execute!
|
129
135
|
end
|
130
136
|
|
131
137
|
it 'sets the soloist email as global git config user.email' do
|
132
|
-
cmd.
|
133
|
-
cmd.
|
138
|
+
allow(cmd).to receive(:`).with(/git config --global user\.name/)
|
139
|
+
allow(cmd).to receive(:`)
|
134
140
|
.with(/git config --global --unset-all #{Git::Duet::Config.namespace}/)
|
135
141
|
soloist_email = author_mapping[soloist][:email]
|
136
|
-
cmd.
|
142
|
+
expect(cmd).to receive(:`)
|
137
143
|
.with("git config --global user.email '#{soloist_email}'")
|
138
144
|
cmd.execute!
|
139
145
|
end
|
140
146
|
|
141
147
|
it 'unsets the global committer name' do
|
142
|
-
cmd.
|
143
|
-
cmd.
|
144
|
-
cmd.
|
148
|
+
allow(cmd).to receive(:`).with(/git config --global user\.name/)
|
149
|
+
allow(cmd).to receive(:`).with(/git config --global user\.email/)
|
150
|
+
allow(cmd).to receive(:`)
|
145
151
|
.with(
|
146
152
|
/git config --global --unset-all #{Git::Duet::Config
|
147
153
|
.namespace}.git-committer-email/
|
148
154
|
)
|
149
|
-
cmd.
|
155
|
+
expect(cmd).to receive(:`)
|
150
156
|
.with('git config --global --unset-all ' \
|
151
157
|
"#{Git::Duet::Config.namespace}.git-committer-name")
|
152
158
|
cmd.execute!
|
153
159
|
end
|
154
160
|
|
155
161
|
it 'unsets the global committer email' do
|
156
|
-
cmd.
|
157
|
-
cmd.
|
158
|
-
cmd.
|
162
|
+
allow(cmd).to receive(:`).with(/git config --global user\.name/)
|
163
|
+
allow(cmd).to receive(:`).with(/git config --global user\.email/)
|
164
|
+
allow(cmd).to receive(:`)
|
159
165
|
.with(
|
160
166
|
/git config --global --unset-all #{Git::Duet::Config
|
161
167
|
.namespace}.git-committer-name/
|
162
168
|
)
|
163
|
-
cmd.
|
169
|
+
expect(cmd).to receive(:`)
|
164
170
|
.with('git config --global --unset-all ' \
|
165
171
|
"#{Git::Duet::Config.namespace}.git-committer-email")
|
166
172
|
cmd.execute!
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-duet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dan Buch
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2014-
|
14
|
+
date: 2014-10-07 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rake
|
@@ -99,10 +99,10 @@ dependencies:
|
|
99
99
|
version: '0'
|
100
100
|
description: Pair programming git identity thingy
|
101
101
|
email:
|
102
|
-
-
|
103
|
-
-
|
104
|
-
-
|
105
|
-
-
|
102
|
+
- dan@meatballhat.com
|
103
|
+
- jesse.szwedko@gmail.com
|
104
|
+
- rafael.colton@gmail.com
|
105
|
+
- sheenathejunglegirl@gmail.com
|
106
106
|
executables:
|
107
107
|
- git-duet
|
108
108
|
- git-duet-commit
|
@@ -128,6 +128,8 @@ files:
|
|
128
128
|
- bin/git-duet-install-hook
|
129
129
|
- bin/git-duet-pre-commit
|
130
130
|
- bin/git-solo
|
131
|
+
- bin/rubymine-git-wrapper
|
132
|
+
- file.txt
|
131
133
|
- git-duet.gemspec
|
132
134
|
- lib/git-duet.rb
|
133
135
|
- lib/git/duet.rb
|
@@ -155,7 +157,7 @@ files:
|
|
155
157
|
- test/git-duet.bats
|
156
158
|
- test/git-solo.bats
|
157
159
|
- test/test_helper.bash
|
158
|
-
homepage: https://github.com/
|
160
|
+
homepage: https://github.com/meatballhat/git-duet
|
159
161
|
licenses:
|
160
162
|
- MIT
|
161
163
|
metadata: {}
|
@@ -167,7 +169,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
167
169
|
requirements:
|
168
170
|
- - ">="
|
169
171
|
- !ruby/object:Gem::Version
|
170
|
-
version: 1.9
|
172
|
+
version: '1.9'
|
171
173
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
174
|
requirements:
|
173
175
|
- - ">="
|