git-duet 0.5.0 → 0.5.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +15 -0
- data/.travis.yml +5 -2
- data/README.md +24 -4
- data/git-duet.gemspec +4 -4
- data/lib/git/duet/author_mapper.rb +3 -3
- data/lib/git/duet/cli.rb +16 -58
- data/lib/git/duet/cli_options.rb +70 -0
- data/lib/git/duet/duet_command.rb +2 -1
- data/lib/git/duet/version.rb +1 -1
- data/spec/lib/git/duet/author_mapper_spec.rb +1 -1
- data/spec/lib/git/duet/cli_spec.rb +44 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5a7119cb29f7c28cbb125f4f33013cbb8cff6dc
|
4
|
+
data.tar.gz: 6b6a786fa89f95717f22295979b1921dde224f2c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b48834810702670b620f63783b30a6ff53c0e6e4bdf33be742046f95b9bf221b9e179665533a31b784454f5129c24835b20628c8b808f1aa29b334be1969aed
|
7
|
+
data.tar.gz: dc1a039596092cffa2810c63c7aa1636c386f19aab13813bdf8c2183daadcea134012e38c95a8b5cde4a8d3b17b19c2285edbc760f0c52ca1553fccf392a9688
|
data/.rubocop.yml
CHANGED
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
+
# on 2015-05-23 12:02:33 -0700 using RuboCop version 0.31.0.
|
3
|
+
# The point is for the user to remove these configuration records
|
4
|
+
# one by one as the offenses are removed from the code base.
|
5
|
+
# Note that changes in the inspected code, or installation of new
|
6
|
+
# versions of RuboCop, may require this file to be generated again.
|
7
|
+
|
8
|
+
# Offense count: 1
|
9
|
+
Metrics/AbcSize:
|
10
|
+
Max: 17
|
11
|
+
|
12
|
+
# Offense count: 1
|
13
|
+
# Configuration parameters: CountComments.
|
14
|
+
Metrics/ModuleLength:
|
15
|
+
Max: 109
|
data/.travis.yml
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
---
|
2
2
|
language: ruby
|
3
|
+
sudo: false
|
3
4
|
env:
|
4
5
|
global:
|
5
6
|
- COVERAGE=1
|
7
|
+
- PATH="$HOME/bin:$PATH"
|
6
8
|
matrix:
|
7
9
|
allow_failures:
|
8
10
|
- rvm: jruby-19mode
|
@@ -12,8 +14,9 @@ rvm:
|
|
12
14
|
- 2.1.3
|
13
15
|
- jruby-19mode
|
14
16
|
before_script:
|
15
|
-
-
|
16
|
-
-
|
17
|
+
- mkdir -p $HOME/bin
|
18
|
+
- git clone https://github.com/sstephenson/bats.git
|
19
|
+
- cd bats && ./install.sh $HOME
|
17
20
|
script:
|
18
21
|
- bundle exec rake
|
19
22
|
- bundle exec bats test
|
data/README.md
CHANGED
@@ -93,6 +93,21 @@ git solo -g jd
|
|
93
93
|
git duet --global jd fb
|
94
94
|
```
|
95
95
|
|
96
|
+
If you do this habitually, you can set the `GIT_DUET_GLOBAL` environment
|
97
|
+
variable to `true` to always operate on the global git config:
|
98
|
+
|
99
|
+
``` bash
|
100
|
+
export GIT_DUET_GLOBAL=true
|
101
|
+
git solo jd
|
102
|
+
```
|
103
|
+
|
104
|
+
``` bash
|
105
|
+
GIT_DUET_GLOBAL=true git duet jd fb
|
106
|
+
```
|
107
|
+
|
108
|
+
You can also set it to `false` to always operate on the local config, even if
|
109
|
+
the global flag is used.
|
110
|
+
|
96
111
|
### Email Configuration
|
97
112
|
|
98
113
|
By default, email addresses are constructed from the first initial and
|
@@ -134,7 +149,7 @@ key, and `username` which is the part following `;` in the author value.
|
|
134
149
|
pairs:
|
135
150
|
jd: Jane Doe
|
136
151
|
fb: Frances Bar
|
137
|
-
email_template: '<%= "#{author.gsub(/ /, "-").downcase}@hamster.local"
|
152
|
+
email_template: '<%= "#{author.gsub(/ /, "-").downcase}@hamster.local" %>'
|
138
153
|
```
|
139
154
|
|
140
155
|
After invoking:
|
@@ -286,6 +301,11 @@ github](https://github.com/meatballhat/git-duet/issues/new).
|
|
286
301
|
|
287
302
|
1. Fork it
|
288
303
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
289
|
-
3.
|
290
|
-
4.
|
291
|
-
|
304
|
+
3. Implement!
|
305
|
+
4. Run the tests
|
306
|
+
1. RSpec `bundle exec rake spec`
|
307
|
+
2. Rubocop `bundle exec rake rubocop`
|
308
|
+
3. [Bats](https://github.com/sstephenson/bats) `bundle exec rake install && bundle exec bats test` (if you have added new files, `git add` them before installing)
|
309
|
+
5. Commit your changes (`git dci -am 'Added some feature'`)
|
310
|
+
6. Push to the branch (`git push origin my-new-feature`)
|
311
|
+
7. Create new Pull Request
|
data/git-duet.gemspec
CHANGED
@@ -22,10 +22,10 @@ Gem::Specification.new do |gem|
|
|
22
22
|
gem.license = 'MIT'
|
23
23
|
|
24
24
|
gem.files = `git ls-files -z`.split("\x00")
|
25
|
-
gem.executables = gem.files.grep(
|
26
|
-
|
27
|
-
|
28
|
-
gem.test_files = gem.files.grep(
|
25
|
+
gem.executables = gem.files.grep(%r{^bin/})
|
26
|
+
.map { |f| File.basename(f) }
|
27
|
+
.reject { |n| n =~ /rubymine-git-wrapper/ }
|
28
|
+
gem.test_files = gem.files.grep(%r{^spec/})
|
29
29
|
gem.name = 'git-duet'
|
30
30
|
gem.require_paths = %w(lib)
|
31
31
|
gem.version = Git::Duet::VERSION
|
@@ -10,10 +10,10 @@ module Git
|
|
10
10
|
|
11
11
|
def initialize(authors_file = nil, email_lookup = nil)
|
12
12
|
@authors_file = authors_file ||
|
13
|
-
|
14
|
-
|
13
|
+
ENV['GIT_DUET_AUTHORS_FILE'] ||
|
14
|
+
File.join(ENV['HOME'], '.git-authors')
|
15
15
|
@email_lookup = email_lookup ||
|
16
|
-
|
16
|
+
ENV['GIT_DUET_EMAIL_LOOKUP_COMMAND']
|
17
17
|
end
|
18
18
|
|
19
19
|
def map(*initials_list)
|
data/lib/git/duet/cli.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# vim:fileencoding=utf-8
|
2
2
|
require 'optparse'
|
3
3
|
require 'git/duet'
|
4
|
+
require 'git/duet/cli_options'
|
4
5
|
require 'git/duet/script_die_error'
|
5
6
|
|
6
7
|
module Git
|
@@ -8,9 +9,7 @@ module Git
|
|
8
9
|
class Cli
|
9
10
|
class << self
|
10
11
|
def run(prog, argv)
|
11
|
-
|
12
|
-
.sub(/^git-duet-/, '').sub(/^git-/, '').tr('-', '_')
|
13
|
-
send(method_name, parse_options(method_name, argv.clone))
|
12
|
+
invoke(File.basename(prog), argv.clone, ENV)
|
14
13
|
0
|
15
14
|
rescue NoMethodError
|
16
15
|
raise ScriptError, 'How did you get here???'
|
@@ -20,67 +19,26 @@ module Git
|
|
20
19
|
|
21
20
|
private
|
22
21
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
22
|
+
def invoke(prog_name, args, environment)
|
23
|
+
method_name = prog_name
|
24
|
+
.sub(/^git-duet-/, '')
|
25
|
+
.sub(/^git-/, '')
|
26
|
+
.tr('-', '_')
|
27
|
+
options = CliOptions.parse_options(method_name, args)
|
28
|
+
if environment['GIT_DUET_GLOBAL']
|
29
|
+
options[:global] = parse_boolean(environment['GIT_DUET_GLOBAL'])
|
29
30
|
end
|
31
|
+
send(method_name, options)
|
30
32
|
end
|
31
33
|
|
32
|
-
def
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
options[:quiet] = true
|
38
|
-
end
|
39
|
-
yield opts, options if block_given?
|
40
|
-
end.parse!(argv)
|
41
|
-
[leftover_argv, options]
|
42
|
-
end
|
43
|
-
|
44
|
-
def parse_solo_options(argv)
|
45
|
-
parse_options_with_positional_args(
|
46
|
-
argv, '<soloist-initials>') do |leftover_argv, options|
|
47
|
-
options[:soloist] = leftover_argv.first
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def parse_duet_options(argv)
|
52
|
-
parse_options_with_positional_args(
|
53
|
-
argv,
|
54
|
-
'<alpha-initials> <omega-initials>'
|
55
|
-
) do |leftover_argv, options|
|
56
|
-
options[:alpha], options[:omega] = leftover_argv[0..1]
|
34
|
+
def parse_boolean(s)
|
35
|
+
case s
|
36
|
+
when 'true' then true
|
37
|
+
when 'false' then false
|
38
|
+
else fail ArgumentError, "must be 'true' or 'false': #{s}"
|
57
39
|
end
|
58
40
|
end
|
59
41
|
|
60
|
-
def parse_options_with_positional_args(argv, usage)
|
61
|
-
leftover_argv, options = with_common_opts(
|
62
|
-
argv, 'Usage: __PROG__ [options] ' << usage
|
63
|
-
) do |opts, options_hash|
|
64
|
-
opts.on('-g', '--global', 'Change global git config') do |_|
|
65
|
-
options_hash[:global] = true
|
66
|
-
end
|
67
|
-
end
|
68
|
-
yield leftover_argv, options
|
69
|
-
options
|
70
|
-
end
|
71
|
-
|
72
|
-
def parse_generic_options(argv)
|
73
|
-
with_common_opts(argv, 'Usage: __PROG__').last
|
74
|
-
end
|
75
|
-
|
76
|
-
def parse_commit_options(argv)
|
77
|
-
opts_argv = []
|
78
|
-
opts_argv << '-q' if argv.delete('-q')
|
79
|
-
options = with_common_opts(opts_argv, 'Usage: __PROG__').last
|
80
|
-
options[:passthrough_args] = argv
|
81
|
-
options
|
82
|
-
end
|
83
|
-
|
84
42
|
def solo(options)
|
85
43
|
require 'git/duet/solo_command'
|
86
44
|
Git::Duet::SoloCommand.new(
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Git
|
2
|
+
module Duet
|
3
|
+
class CliOptions
|
4
|
+
class << self
|
5
|
+
def parse_options(method_name, argv)
|
6
|
+
case method_name
|
7
|
+
when 'pre_commit', 'install_hook'
|
8
|
+
parse_generic_options(argv)
|
9
|
+
else
|
10
|
+
send("parse_#{method_name}_options", argv)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def with_common_opts(argv, banner)
|
17
|
+
options = {}
|
18
|
+
leftover_argv = OptionParser.new do |opts|
|
19
|
+
opts.banner = banner.gsub(/__PROG__/, opts.program_name)
|
20
|
+
opts.on('-q', 'Silence output') do |_|
|
21
|
+
options[:quiet] = true
|
22
|
+
end
|
23
|
+
yield opts, options if block_given?
|
24
|
+
end.parse!(argv)
|
25
|
+
[leftover_argv, options]
|
26
|
+
end
|
27
|
+
|
28
|
+
def parse_solo_options(argv)
|
29
|
+
parse_options_with_positional_args(
|
30
|
+
argv, '<soloist-initials>') do |leftover_argv, options|
|
31
|
+
options[:soloist] = leftover_argv.first
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def parse_duet_options(argv)
|
36
|
+
parse_options_with_positional_args(
|
37
|
+
argv,
|
38
|
+
'<alpha-initials> <omega-initials>'
|
39
|
+
) do |leftover_argv, options|
|
40
|
+
options[:alpha], options[:omega] = leftover_argv[0..1]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def parse_options_with_positional_args(argv, usage)
|
45
|
+
leftover_argv, options = with_common_opts(
|
46
|
+
argv, 'Usage: __PROG__ [options] ' << usage
|
47
|
+
) do |opts, options_hash|
|
48
|
+
opts.on('-g', '--global', 'Change global git config') do |_|
|
49
|
+
options_hash[:global] = true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
yield leftover_argv, options
|
53
|
+
options
|
54
|
+
end
|
55
|
+
|
56
|
+
def parse_generic_options(argv)
|
57
|
+
with_common_opts(argv, 'Usage: __PROG__').last
|
58
|
+
end
|
59
|
+
|
60
|
+
def parse_commit_options(argv)
|
61
|
+
opts_argv = []
|
62
|
+
opts_argv << '-q' if argv.delete('-q')
|
63
|
+
options = with_common_opts(opts_argv, 'Usage: __PROG__').last
|
64
|
+
options[:passthrough_args] = argv
|
65
|
+
options
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -9,7 +9,8 @@ module Git
|
|
9
9
|
include Git::Duet::CommandMethods
|
10
10
|
|
11
11
|
def initialize(alpha, omega, quiet = false, global = false)
|
12
|
-
@alpha
|
12
|
+
@alpha = alpha
|
13
|
+
@omega = omega
|
13
14
|
@quiet = !!quiet
|
14
15
|
@global = !!global
|
15
16
|
@author_mapper = Git::Duet::AuthorMapper.new
|
data/lib/git/duet/version.rb
CHANGED
@@ -26,7 +26,7 @@ describe Git::Duet::AuthorMapper do
|
|
26
26
|
|
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
30
|
expect(instance.authors_file)
|
31
31
|
.to eq('/blarggie/blarggie/new/friend/.git-authors')
|
32
32
|
end
|
@@ -44,4 +44,48 @@ describe Git::Duet::Cli do
|
|
44
44
|
)
|
45
45
|
cli.run('git-duet-pre-commit', %w(-q))
|
46
46
|
end
|
47
|
+
|
48
|
+
it 'defaults to loud and local when running `solo`' do
|
49
|
+
allow(Git::Duet::SoloCommand)
|
50
|
+
.to receive(:new).with('jd', be_falsey, be_falsey)
|
51
|
+
.and_return(double('solo').as_null_object)
|
52
|
+
cli.run('git-solo', %w(jd))
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'parses options for quietness and globality when running `solo`' do
|
56
|
+
allow(Git::Duet::SoloCommand)
|
57
|
+
.to receive(:new).with('jd', be_truthy, be_truthy)
|
58
|
+
.and_return(double('solo').as_null_object)
|
59
|
+
cli.run('git-solo', %w(jd -q -g))
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'defaults to loud and local when running `duet`' do
|
63
|
+
allow(Git::Duet::DuetCommand)
|
64
|
+
.to receive(:new).with('jd', 'fb', be_falsey, be_falsey)
|
65
|
+
.and_return(double('duet').as_null_object)
|
66
|
+
cli.run('git-duet', %w(jd fb))
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'parses options for quietness and globality when running `duet`' do
|
70
|
+
allow(Git::Duet::DuetCommand)
|
71
|
+
.to receive(:new).with('jd', 'fb', be_truthy, be_truthy)
|
72
|
+
.and_return(double('duet').as_null_object)
|
73
|
+
cli.run('git-duet', %w(jd fb -q -g))
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'respects the environment about global issues when running `solo`' do
|
77
|
+
stub_const('ENV', 'GIT_DUET_GLOBAL' => 'true')
|
78
|
+
allow(Git::Duet::SoloCommand)
|
79
|
+
.to receive(:new).with('cp', anything, be_truthy)
|
80
|
+
.and_return(double('solo').as_null_object)
|
81
|
+
cli.run('git-solo', %w(cp))
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'respects the environment about global issues when running `duet`' do
|
85
|
+
stub_const('ENV', 'GIT_DUET_GLOBAL' => 'true')
|
86
|
+
allow(Git::Duet::DuetCommand)
|
87
|
+
.to receive(:new).with('cp', 'g', anything, be_truthy)
|
88
|
+
.and_return(double('duet').as_null_object)
|
89
|
+
cli.run('git-duet', %w(cp g))
|
90
|
+
end
|
47
91
|
end
|
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.5.
|
4
|
+
version: 0.5.1
|
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:
|
14
|
+
date: 2015-05-23 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rake
|
@@ -116,6 +116,7 @@ files:
|
|
116
116
|
- ".jrubyrc"
|
117
117
|
- ".rspec"
|
118
118
|
- ".rubocop.yml"
|
119
|
+
- ".rubocop_todo.yml"
|
119
120
|
- ".ruby-version"
|
120
121
|
- ".simplecov"
|
121
122
|
- ".travis.yml"
|
@@ -135,6 +136,7 @@ files:
|
|
135
136
|
- lib/git/duet.rb
|
136
137
|
- lib/git/duet/author_mapper.rb
|
137
138
|
- lib/git/duet/cli.rb
|
139
|
+
- lib/git/duet/cli_options.rb
|
138
140
|
- lib/git/duet/command_methods.rb
|
139
141
|
- lib/git/duet/commit_command.rb
|
140
142
|
- lib/git/duet/config.rb
|