twig 1.4 → 1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.md +15 -0
- data/README.md +17 -4
- data/bin/twig-gh-open +1 -1
- data/bin/twig-gh-open-issue +1 -1
- data/bin/twig-gh-update +1 -1
- data/bin/twig-help +1 -1
- data/bin/twig-init-completion-bash +22 -3
- data/bin/twig-rebase +1 -1
- data/lib/twig.rb +23 -13
- data/lib/twig/branch.rb +24 -9
- data/lib/twig/cli.rb +84 -25
- data/lib/twig/commit_time.rb +10 -0
- data/lib/twig/display.rb +9 -0
- data/lib/twig/options.rb +88 -46
- data/lib/twig/subcommands.rb +26 -0
- data/lib/twig/system.rb +9 -0
- data/lib/twig/version.rb +1 -1
- data/spec/spec_helper.rb +7 -0
- data/spec/twig/branch_spec.rb +134 -60
- data/spec/twig/cli_spec.rb +247 -156
- data/spec/twig/commit_time_spec.rb +20 -18
- data/spec/twig/display_spec.rb +108 -57
- data/spec/twig/github_spec.rb +90 -73
- data/spec/twig/options_spec.rb +311 -152
- data/spec/twig/subcommands_spec.rb +29 -0
- data/spec/twig/system_spec.rb +36 -0
- data/spec/twig/util_spec.rb +20 -20
- data/spec/twig_spec.rb +103 -76
- data/twig.gemspec +9 -6
- metadata +17 -11
data/lib/twig/commit_time.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
class Twig
|
2
|
+
|
3
|
+
# Stores a branch's last commit time and its relative time representation.
|
2
4
|
class CommitTime
|
3
5
|
|
4
6
|
def initialize(time, time_ago)
|
@@ -13,6 +15,10 @@ class Twig
|
|
13
15
|
sub(' hours', 'h').
|
14
16
|
sub(' minutes', 'm').
|
15
17
|
sub(' seconds', 's')
|
18
|
+
|
19
|
+
# Keep only the most significant units in the relative time
|
20
|
+
time_ago_parts = @time_ago.split(/\s+/)
|
21
|
+
@time_ago = "#{time_ago_parts[0]} #{time_ago_parts[-1]}".gsub(/,/, '')
|
16
22
|
end
|
17
23
|
|
18
24
|
def to_i
|
@@ -24,6 +30,10 @@ class Twig
|
|
24
30
|
"#{time_string} (#{@time_ago})"
|
25
31
|
end
|
26
32
|
|
33
|
+
def iso8601
|
34
|
+
@time.iso8601
|
35
|
+
end
|
36
|
+
|
27
37
|
def <=>(other)
|
28
38
|
to_i <=> other.to_i
|
29
39
|
end
|
data/lib/twig/display.rb
CHANGED
@@ -137,6 +137,15 @@ class Twig
|
|
137
137
|
line
|
138
138
|
end
|
139
139
|
|
140
|
+
def branches_json
|
141
|
+
require 'json'
|
142
|
+
|
143
|
+
data = {
|
144
|
+
'branches' => branches.map { |branch| branch.to_hash }
|
145
|
+
}
|
146
|
+
data.to_json
|
147
|
+
end
|
148
|
+
|
140
149
|
def format_string(string, options)
|
141
150
|
# Options:
|
142
151
|
# - `:color`: `nil` by default. Accepts a key from `COLORS`.
|
data/lib/twig/options.rb
CHANGED
@@ -5,61 +5,96 @@ class Twig
|
|
5
5
|
DEPRECATED_CONFIG_PATH = '~/.twigrc'
|
6
6
|
MIN_PROPERTY_WIDTH = 3
|
7
7
|
|
8
|
-
def
|
9
|
-
config_path = File.expand_path(
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
$stderr.puts "
|
14
|
-
|
8
|
+
def readable_config_file_path
|
9
|
+
config_path = File.expand_path(CONFIG_PATH)
|
10
|
+
|
11
|
+
if File.exists?(config_path)
|
12
|
+
unless File.readable?(config_path)
|
13
|
+
$stderr.puts "Warning: #{CONFIG_PATH} is not readable."
|
14
|
+
return # Stop if file exists but is not readable
|
15
|
+
end
|
16
|
+
else
|
17
|
+
config_path = File.expand_path(DEPRECATED_CONFIG_PATH)
|
18
|
+
|
19
|
+
if File.exists?(config_path)
|
20
|
+
if File.readable?(config_path)
|
21
|
+
$stderr.puts "DEPRECATED: #{DEPRECATED_CONFIG_PATH} is deprecated. " <<
|
22
|
+
"Please rename it to #{CONFIG_PATH}."
|
23
|
+
else
|
24
|
+
$stderr.puts "DEPRECATED: #{DEPRECATED_CONFIG_PATH} is deprecated. " <<
|
25
|
+
"Please rename it to #{CONFIG_PATH} and make it readable."
|
26
|
+
return # Stop if file exists but is not readable
|
27
|
+
end
|
15
28
|
else
|
16
|
-
return
|
29
|
+
return # Stop if neither file exists
|
17
30
|
end
|
18
31
|
end
|
19
32
|
|
33
|
+
config_path
|
34
|
+
end
|
35
|
+
|
36
|
+
def parse_config_file(config_path)
|
37
|
+
lines = []
|
38
|
+
|
20
39
|
File.open(config_path) do |file|
|
21
|
-
|
22
|
-
|
40
|
+
lines = file.read.split("\n")
|
41
|
+
end
|
23
42
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
43
|
+
lines.inject({}) do |opts, line|
|
44
|
+
line = line.strip
|
45
|
+
next opts if line =~ /^#/
|
46
|
+
|
47
|
+
key, value = line.split(':', 2)
|
48
|
+
key = key ? key.strip : ''
|
28
49
|
|
29
|
-
|
50
|
+
if !key.empty? && value
|
51
|
+
opts[key] = value.strip
|
52
|
+
elsif !line.empty?
|
53
|
+
$stderr.puts %{Warning: Invalid line "#{line}" in #{config_path}. } <<
|
54
|
+
%{Expected format: `key: value`}
|
30
55
|
end
|
31
56
|
|
32
|
-
opts
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
57
|
+
opts
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def read_config_file!
|
62
|
+
config_path = readable_config_file_path
|
63
|
+
return unless config_path
|
64
|
+
|
65
|
+
options = parse_config_file(config_path)
|
66
|
+
options.each do |key, value|
|
67
|
+
case key
|
68
|
+
|
69
|
+
# Filtering branches:
|
70
|
+
when 'branch'
|
71
|
+
set_option(:branch, value)
|
72
|
+
when 'max-days-old'
|
73
|
+
set_option(:max_days_old, value)
|
74
|
+
when /^except-/
|
75
|
+
property_name = key.sub(/^except-/, '').to_sym
|
76
|
+
set_option(:property_except, property_name => value)
|
77
|
+
when /^only-/
|
78
|
+
property_name = key.sub(/^only-/, '').to_sym
|
79
|
+
set_option(:property_only, property_name => value)
|
80
|
+
|
81
|
+
# Displaying branches:
|
82
|
+
when 'format'
|
83
|
+
set_option(:format, value)
|
84
|
+
when 'header-style'
|
85
|
+
set_option(:header_style, value)
|
86
|
+
when 'reverse'
|
87
|
+
set_option(:reverse, value)
|
88
|
+
when /-width$/
|
89
|
+
property_name = key.sub(/-width$/, '').to_sym
|
90
|
+
set_option(:property_width, property_name => value)
|
91
|
+
|
92
|
+
# GitHub integration:
|
93
|
+
when 'github-api-uri-prefix'
|
94
|
+
set_option(:github_api_uri_prefix, value)
|
95
|
+
when 'github-uri-prefix'
|
96
|
+
set_option(:github_uri_prefix, value)
|
61
97
|
|
62
|
-
end
|
63
98
|
end
|
64
99
|
end
|
65
100
|
end
|
@@ -70,7 +105,14 @@ class Twig
|
|
70
105
|
if all_branch_names.include?(value)
|
71
106
|
options[:branch] = value
|
72
107
|
else
|
73
|
-
abort %{The branch
|
108
|
+
abort %{The branch `#{value}` could not be found.}
|
109
|
+
end
|
110
|
+
|
111
|
+
when :format
|
112
|
+
if value == 'json'
|
113
|
+
options[:format] = value.to_sym
|
114
|
+
else
|
115
|
+
abort %{The format `#{value}` is not supported; only `json` is supported.}
|
74
116
|
end
|
75
117
|
|
76
118
|
when :github_api_uri_prefix, :github_uri_prefix
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Twig
|
2
|
+
module Subcommands
|
3
|
+
|
4
|
+
BIN_PREFIX = 'twig-'
|
5
|
+
|
6
|
+
def self.all_names
|
7
|
+
bin_paths = []
|
8
|
+
|
9
|
+
bin_dir_paths.each do |bin_dir_path|
|
10
|
+
path_pattern = File.join(bin_dir_path, BIN_PREFIX + '*')
|
11
|
+
Dir.glob(path_pattern) do |bin_path|
|
12
|
+
bin_paths << File.basename(bin_path)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
bin_paths.uniq.sort.map do |bin_path|
|
17
|
+
bin_path.sub(Regexp.new('^' << BIN_PREFIX), '')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.bin_dir_paths
|
22
|
+
ENV['PATH'].split(':')
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
data/lib/twig/system.rb
ADDED
data/lib/twig/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
data/spec/twig/branch_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
describe Twig::Branch do
|
@@ -27,37 +28,37 @@ describe Twig::Branch do
|
|
27
28
|
end
|
28
29
|
|
29
30
|
it 'returns the union of properties for all branches' do
|
30
|
-
Twig.
|
31
|
+
expect(Twig).to receive(:run).with('git config --list').and_return(@config)
|
31
32
|
|
32
33
|
result = Twig::Branch.all_property_names
|
33
|
-
result.
|
34
|
+
expect(result).to eq(%w[test0 test1 test2])
|
34
35
|
end
|
35
36
|
|
36
37
|
it 'handles branch names that contain dots' do
|
37
38
|
@config << 'branch.dot1.dot2.dot3.dotproperty=dotvalue'
|
38
|
-
Twig.
|
39
|
+
expect(Twig).to receive(:run).with('git config --list').and_return(@config)
|
39
40
|
|
40
41
|
result = Twig::Branch.all_property_names
|
41
|
-
result.
|
42
|
+
expect(result).to eq(%w[dotproperty test0 test1 test2])
|
42
43
|
end
|
43
44
|
|
44
45
|
it 'handles branch names that contain equal signs' do
|
45
46
|
@config << 'branch.eq1=eq2=eq3.eqproperty=eqvalue'
|
46
|
-
Twig.
|
47
|
+
expect(Twig).to receive(:run).with('git config --list').and_return(@config)
|
47
48
|
|
48
49
|
result = Twig::Branch.all_property_names
|
49
|
-
result.
|
50
|
+
expect(result).to eq(%w[eqproperty test0 test1 test2])
|
50
51
|
end
|
51
52
|
|
52
53
|
it 'skips path values with an equal sign but no value' do
|
53
54
|
@config << 'foo_path='
|
54
|
-
Twig.
|
55
|
+
expect(Twig).to receive(:run).with('git config --list').and_return(@config)
|
55
56
|
result = Twig::Branch.all_property_names
|
56
|
-
result.
|
57
|
+
expect(result).not_to include('foo_path')
|
57
58
|
end
|
58
59
|
|
59
60
|
it 'memoizes the result' do
|
60
|
-
Twig.
|
61
|
+
expect(Twig).to receive(:run).once.and_return(@config)
|
61
62
|
2.times { Twig::Branch.all_property_names }
|
62
63
|
end
|
63
64
|
end
|
@@ -65,24 +66,65 @@ describe Twig::Branch do
|
|
65
66
|
describe '#initialize' do
|
66
67
|
it 'requires a name' do
|
67
68
|
branch = Twig::Branch.new('test')
|
68
|
-
branch.name.
|
69
|
+
expect(branch.name).to eq('test')
|
69
70
|
|
70
|
-
|
71
|
-
|
72
|
-
|
71
|
+
expect { Twig::Branch.new }.to raise_exception
|
72
|
+
expect { Twig::Branch.new(nil) }.to raise_exception
|
73
|
+
expect { Twig::Branch.new('') }.to raise_exception
|
73
74
|
end
|
74
75
|
|
75
76
|
it 'accepts a last commit time' do
|
76
77
|
commit_time = Twig::CommitTime.new(Time.now, '99 days ago')
|
77
78
|
branch = Twig::Branch.new('test', :last_commit_time => commit_time)
|
78
|
-
branch.last_commit_time.
|
79
|
+
expect(branch.last_commit_time).to eq(commit_time)
|
79
80
|
end
|
80
81
|
end
|
81
82
|
|
82
83
|
describe '#to_s' do
|
83
84
|
it 'returns the branch name' do
|
84
85
|
branch = Twig::Branch.new('test')
|
85
|
-
branch.to_s.
|
86
|
+
expect(branch.to_s).to eq('test')
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe '#to_hash' do
|
91
|
+
before :each do
|
92
|
+
@branch = Twig::Branch.new('test')
|
93
|
+
time = Time.parse('2000-01-01 18:30 UTC')
|
94
|
+
commit_time = Twig::CommitTime.new(time, '')
|
95
|
+
@time_string = time.iso8601
|
96
|
+
allow(@branch).to receive(:last_commit_time) { commit_time }
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'returns the hash for a branch with properties' do
|
100
|
+
expect(Twig::Branch).to receive(:all_property_names) { %w[foo bar] }
|
101
|
+
expect(@branch).to receive(:get_properties) do
|
102
|
+
{ 'foo' => 'foo!', 'bar' => 'bar!' }
|
103
|
+
end
|
104
|
+
|
105
|
+
result = @branch.to_hash
|
106
|
+
|
107
|
+
expect(result).to eq(
|
108
|
+
'name' => 'test',
|
109
|
+
'last-commit-time' => @time_string,
|
110
|
+
'properties' => {
|
111
|
+
'foo' => 'foo!',
|
112
|
+
'bar' => 'bar!'
|
113
|
+
}
|
114
|
+
)
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'returns the hash for a branch with no properties' do
|
118
|
+
expect(Twig::Branch).to receive(:all_property_names) { %w[foo bar] }
|
119
|
+
expect(@branch).to receive(:get_properties).and_return({})
|
120
|
+
|
121
|
+
result = @branch.to_hash
|
122
|
+
|
123
|
+
expect(result).to eq(
|
124
|
+
'name' => 'test',
|
125
|
+
'last-commit-time' => @time_string,
|
126
|
+
'properties' => {}
|
127
|
+
)
|
86
128
|
end
|
87
129
|
end
|
88
130
|
|
@@ -92,11 +134,23 @@ describe Twig::Branch do
|
|
92
134
|
end
|
93
135
|
|
94
136
|
it 'removes whitespace from branch property names' do
|
95
|
-
@branch.sanitize_property(' foo bar ').
|
137
|
+
expect(@branch.sanitize_property(' foo bar ')).to eq('foobar')
|
96
138
|
end
|
97
139
|
|
98
140
|
it 'removes underscores from branch property names' do
|
99
|
-
@branch.sanitize_property('__foo_bar__').
|
141
|
+
expect(@branch.sanitize_property('__foo_bar__')).to eq('foobar')
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
describe '#escaped_property_names' do
|
146
|
+
before :each do
|
147
|
+
@branch = Twig::Branch.new('test')
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'converts an array of property names into an array of regexps' do
|
151
|
+
property_names = %w[test.1 test.2]
|
152
|
+
result = @branch.escaped_property_names(property_names)
|
153
|
+
expect(result).to eq(%w[test\\.1 test\\.2])
|
100
154
|
end
|
101
155
|
end
|
102
156
|
|
@@ -114,29 +168,41 @@ describe Twig::Branch do
|
|
114
168
|
"branch.#{@branch}.test1 value1",
|
115
169
|
"branch.#{@branch}.test2 value2"
|
116
170
|
].join("\n")
|
117
|
-
Twig.
|
171
|
+
expect(Twig).to receive(:run).
|
118
172
|
with(%{git config --get-regexp "branch.#{@branch}.(test1|test2)$"}).
|
119
173
|
and_return(git_result)
|
120
174
|
|
121
175
|
result = @branch.get_properties(%w[test1 test2])
|
122
|
-
result.
|
176
|
+
expect(result).to eq(properties)
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'returns properties for a branch with UTF-8 characters in its name' do
|
180
|
+
branch = Twig::Branch.new('utf8_{・ิω・ิ}')
|
181
|
+
properties = { 'test1' => 'value1' }
|
182
|
+
git_result = "branch.#{branch}.test1 value1"
|
183
|
+
expect(Twig).to receive(:run).
|
184
|
+
with(%{git config --get-regexp "branch.#{branch}.(test1)$"}).
|
185
|
+
and_return(git_result)
|
186
|
+
|
187
|
+
result = branch.get_properties(%w[test1])
|
188
|
+
expect(result).to eq(properties)
|
123
189
|
end
|
124
190
|
|
125
191
|
it 'returns an empty hash if no property names are given' do
|
126
|
-
Twig.
|
192
|
+
expect(Twig).not_to receive(:run)
|
127
193
|
|
128
194
|
result = @branch.get_properties([])
|
129
|
-
result.
|
195
|
+
expect(result).to eq({})
|
130
196
|
end
|
131
197
|
|
132
198
|
it 'returns an empty hash if no matching property names are found' do
|
133
199
|
git_result = ''
|
134
|
-
Twig.
|
200
|
+
expect(Twig).to receive(:run).
|
135
201
|
with(%{git config --get-regexp "branch.#{@branch}.(test1|test2)$"}).
|
136
202
|
and_return(git_result)
|
137
203
|
|
138
204
|
result = @branch.get_properties(%w[test1 test2])
|
139
|
-
result.
|
205
|
+
expect(result).to eq({})
|
140
206
|
end
|
141
207
|
|
142
208
|
it 'removes whitespace from property names' do
|
@@ -145,12 +211,12 @@ describe Twig::Branch do
|
|
145
211
|
property_value = 'bar'
|
146
212
|
properties = { property_name => property_value }
|
147
213
|
git_result = "branch.#{@branch}.#{property_name} #{property_value}"
|
148
|
-
Twig.
|
214
|
+
expect(Twig).to receive(:run).
|
149
215
|
with(%{git config --get-regexp "branch.#{@branch}.(#{property_name})$"}).
|
150
216
|
and_return(git_result)
|
151
217
|
|
152
218
|
result = @branch.get_properties([bad_property_name])
|
153
|
-
result.
|
219
|
+
expect(result).to eq(properties)
|
154
220
|
end
|
155
221
|
|
156
222
|
it 'excludes properties whose values are empty strings' do
|
@@ -158,17 +224,17 @@ describe Twig::Branch do
|
|
158
224
|
"branch.#{@branch}.test1 value1",
|
159
225
|
"branch.#{@branch}.test2"
|
160
226
|
].join("\n")
|
161
|
-
Twig.
|
227
|
+
expect(Twig).to receive(:run).
|
162
228
|
with(%{git config --get-regexp "branch.#{@branch}.(test1|test2)$"}).
|
163
229
|
and_return(git_result)
|
164
230
|
|
165
231
|
result = @branch.get_properties(%w[test1 test2])
|
166
|
-
result.
|
232
|
+
expect(result).to eq('test1' => 'value1')
|
167
233
|
end
|
168
234
|
|
169
235
|
it 'raises an error if any property name is an empty string' do
|
170
236
|
property_name = ' '
|
171
|
-
Twig.
|
237
|
+
expect(Twig).not_to receive(:run)
|
172
238
|
|
173
239
|
begin
|
174
240
|
@branch.get_properties(['test1', property_name])
|
@@ -176,7 +242,9 @@ describe Twig::Branch do
|
|
176
242
|
expected_exception = exception
|
177
243
|
end
|
178
244
|
|
179
|
-
expected_exception.message.
|
245
|
+
expect(expected_exception.message).to eq(
|
246
|
+
Twig::Branch::EMPTY_PROPERTY_NAME_ERROR
|
247
|
+
)
|
180
248
|
end
|
181
249
|
end
|
182
250
|
|
@@ -188,24 +256,24 @@ describe Twig::Branch do
|
|
188
256
|
it 'returns a property value' do
|
189
257
|
property = 'test'
|
190
258
|
value = 'value'
|
191
|
-
@branch.
|
259
|
+
expect(@branch).to receive(:get_properties).
|
192
260
|
with([property]).
|
193
261
|
and_return(property => value)
|
194
262
|
|
195
263
|
result = @branch.get_property(property)
|
196
|
-
result.
|
264
|
+
expect(result).to eq(value)
|
197
265
|
end
|
198
266
|
|
199
267
|
it 'removes whitespace from branch property names' do
|
200
268
|
bad_property = ' foo foo '
|
201
269
|
property = 'foofoo'
|
202
270
|
value = 'bar'
|
203
|
-
@branch.
|
271
|
+
expect(@branch).to receive(:get_properties).
|
204
272
|
with([property]).
|
205
273
|
and_return(property => value)
|
206
274
|
|
207
275
|
result = @branch.get_property(bad_property)
|
208
|
-
result.
|
276
|
+
expect(result).to eq(value)
|
209
277
|
end
|
210
278
|
end
|
211
279
|
|
@@ -217,13 +285,13 @@ describe Twig::Branch do
|
|
217
285
|
it 'sets a property value' do
|
218
286
|
property = 'test'
|
219
287
|
value = 'value'
|
220
|
-
Twig.
|
288
|
+
expect(Twig).to receive(:run).
|
221
289
|
with(%{git config branch.#{@branch}.#{property} "#{value}"}) do
|
222
290
|
`(exit 0)`; value # Set `$?` to `0`
|
223
291
|
end
|
224
292
|
|
225
293
|
result = @branch.set_property(property, value)
|
226
|
-
result.
|
294
|
+
expect(result).to include(
|
227
295
|
%{Saved property "#{property}" as "#{value}" for branch "#{@branch}"}
|
228
296
|
)
|
229
297
|
end
|
@@ -231,7 +299,7 @@ describe Twig::Branch do
|
|
231
299
|
it 'raises an error if Git cannot set the property value' do
|
232
300
|
property = 'test'
|
233
301
|
value = 'value'
|
234
|
-
Twig.
|
302
|
+
allow(Twig).to receive(:run) { `(exit 1)`; value } # Set `$?` to `1`
|
235
303
|
|
236
304
|
begin
|
237
305
|
@branch.set_property(property, value)
|
@@ -239,7 +307,7 @@ describe Twig::Branch do
|
|
239
307
|
expected_exception = exception
|
240
308
|
end
|
241
309
|
|
242
|
-
expected_exception.message.
|
310
|
+
expect(expected_exception.message).to include(
|
243
311
|
%{Could not save property "#{property}" as "#{value}" for branch "#{@branch}"}
|
244
312
|
)
|
245
313
|
end
|
@@ -247,7 +315,7 @@ describe Twig::Branch do
|
|
247
315
|
it 'raises an error if the property name is an empty string' do
|
248
316
|
property = ' '
|
249
317
|
value = 'value'
|
250
|
-
Twig.
|
318
|
+
expect(Twig).not_to receive(:run)
|
251
319
|
|
252
320
|
begin
|
253
321
|
@branch.set_property(property, value)
|
@@ -255,13 +323,15 @@ describe Twig::Branch do
|
|
255
323
|
expected_exception = exception
|
256
324
|
end
|
257
325
|
|
258
|
-
expected_exception.message.
|
326
|
+
expect(expected_exception.message).to eq(
|
327
|
+
Twig::Branch::EMPTY_PROPERTY_NAME_ERROR
|
328
|
+
)
|
259
329
|
end
|
260
330
|
|
261
331
|
it 'raises an error if trying to set a reserved branch property' do
|
262
332
|
property = 'merge'
|
263
333
|
value = 'NOOO'
|
264
|
-
Twig.
|
334
|
+
expect(Twig).not_to receive(:run)
|
265
335
|
|
266
336
|
begin
|
267
337
|
@branch.set_property(property, value)
|
@@ -269,7 +339,7 @@ describe Twig::Branch do
|
|
269
339
|
expected_exception = exception
|
270
340
|
end
|
271
341
|
|
272
|
-
expected_exception.message.
|
342
|
+
expect(expected_exception.message).to include(
|
273
343
|
%{Can't modify the reserved property "#{property}"}
|
274
344
|
)
|
275
345
|
end
|
@@ -277,7 +347,7 @@ describe Twig::Branch do
|
|
277
347
|
it 'raises an error if trying to set a branch property to an empty string' do
|
278
348
|
property = 'test'
|
279
349
|
value = ''
|
280
|
-
Twig.
|
350
|
+
expect(Twig).not_to receive(:run)
|
281
351
|
|
282
352
|
begin
|
283
353
|
@branch.set_property(property, value)
|
@@ -285,7 +355,7 @@ describe Twig::Branch do
|
|
285
355
|
expected_exception = exception
|
286
356
|
end
|
287
357
|
|
288
|
-
expected_exception.message.
|
358
|
+
expect(expected_exception.message).to include(
|
289
359
|
%{Can't set a branch property to an empty string}
|
290
360
|
)
|
291
361
|
end
|
@@ -294,13 +364,13 @@ describe Twig::Branch do
|
|
294
364
|
bad_property = ' foo foo '
|
295
365
|
property = 'foofoo'
|
296
366
|
value = 'bar'
|
297
|
-
Twig.
|
367
|
+
expect(Twig).to receive(:run).
|
298
368
|
with(%{git config branch.#{@branch}.#{property} "#{value}"}) do
|
299
369
|
`(exit 0)`; value # Set `$?` to `0`
|
300
370
|
end
|
301
371
|
|
302
372
|
result = @branch.set_property(bad_property, value)
|
303
|
-
result.
|
373
|
+
expect(result).to include(
|
304
374
|
%{Saved property "#{property}" as "#{value}" for branch "#{@branch}"}
|
305
375
|
)
|
306
376
|
end
|
@@ -309,13 +379,13 @@ describe Twig::Branch do
|
|
309
379
|
bad_property = 'foo_foo'
|
310
380
|
property = 'foofoo'
|
311
381
|
value = 'bar'
|
312
|
-
Twig.
|
382
|
+
expect(Twig).to receive(:run).
|
313
383
|
with(%{git config branch.#{@branch}.#{property} "#{value}"}) do
|
314
384
|
`(exit 0)`; value # Set `$?` to `0`
|
315
385
|
end
|
316
386
|
|
317
387
|
result = @branch.set_property(bad_property, value)
|
318
|
-
result.
|
388
|
+
expect(result).to include(
|
319
389
|
%{Saved property "#{property}" as "#{value}" for branch "#{@branch}"}
|
320
390
|
)
|
321
391
|
end
|
@@ -324,13 +394,13 @@ describe Twig::Branch do
|
|
324
394
|
property = 'test'
|
325
395
|
bad_value = ' foo '
|
326
396
|
value = 'foo'
|
327
|
-
Twig.
|
397
|
+
expect(Twig).to receive(:run).
|
328
398
|
with(%{git config branch.#{@branch}.#{property} "#{value}"}) do
|
329
399
|
`(exit 0)`; value # Set `$?` to `0`
|
330
400
|
end
|
331
401
|
|
332
402
|
result = @branch.set_property(property, bad_value)
|
333
|
-
result.
|
403
|
+
expect(result).to include(
|
334
404
|
%{Saved property "#{property}" as "#{value}" for branch "#{@branch}"}
|
335
405
|
)
|
336
406
|
end
|
@@ -343,12 +413,13 @@ describe Twig::Branch do
|
|
343
413
|
|
344
414
|
it 'unsets a branch property' do
|
345
415
|
property = 'test'
|
346
|
-
@branch.
|
347
|
-
|
416
|
+
expect(@branch).to receive(:get_property).
|
417
|
+
with(property).and_return('value')
|
418
|
+
expect(Twig).to receive(:run).
|
348
419
|
with(%{git config --unset branch.#{@branch}.#{property}})
|
349
420
|
|
350
421
|
result = @branch.unset_property(property)
|
351
|
-
result.
|
422
|
+
expect(result).to include(
|
352
423
|
%{Removed property "#{property}" for branch "#{@branch}"}
|
353
424
|
)
|
354
425
|
end
|
@@ -356,12 +427,13 @@ describe Twig::Branch do
|
|
356
427
|
it 'removes whitespace from branch property names' do
|
357
428
|
bad_property = ' foo foo '
|
358
429
|
property = 'foofoo'
|
359
|
-
@branch.
|
360
|
-
|
430
|
+
expect(@branch).to receive(:get_property).
|
431
|
+
with(property).and_return('value')
|
432
|
+
expect(Twig).to receive(:run).
|
361
433
|
with(%{git config --unset branch.#{@branch}.#{property}})
|
362
434
|
|
363
435
|
result = @branch.unset_property(bad_property)
|
364
|
-
result.
|
436
|
+
expect(result).to include(
|
365
437
|
%{Removed property "#{property}" for branch "#{@branch}"}
|
366
438
|
)
|
367
439
|
end
|
@@ -369,8 +441,8 @@ describe Twig::Branch do
|
|
369
441
|
it 'raises an error if the property name is an empty string' do
|
370
442
|
bad_property = ' '
|
371
443
|
property = ''
|
372
|
-
@branch.
|
373
|
-
Twig.
|
444
|
+
expect(@branch).not_to receive(:get_property)
|
445
|
+
expect(Twig).not_to receive(:run)
|
374
446
|
|
375
447
|
begin
|
376
448
|
@branch.unset_property(bad_property)
|
@@ -378,12 +450,14 @@ describe Twig::Branch do
|
|
378
450
|
expected_exception = exception
|
379
451
|
end
|
380
452
|
|
381
|
-
expected_exception.message.
|
453
|
+
expect(expected_exception.message).to eq(
|
454
|
+
Twig::Branch::EMPTY_PROPERTY_NAME_ERROR
|
455
|
+
)
|
382
456
|
end
|
383
457
|
|
384
458
|
it 'raises an error if the branch does not have the given property' do
|
385
459
|
property = 'test'
|
386
|
-
@branch.
|
460
|
+
expect(@branch).to receive(:get_property).with(property).and_return(nil)
|
387
461
|
|
388
462
|
begin
|
389
463
|
@branch.unset_property(property)
|
@@ -391,7 +465,7 @@ describe Twig::Branch do
|
|
391
465
|
expected_exception = exception
|
392
466
|
end
|
393
467
|
|
394
|
-
expected_exception.message.
|
468
|
+
expect(expected_exception.message).to include(
|
395
469
|
%{The branch "#{@branch}" does not have the property "#{property}"}
|
396
470
|
)
|
397
471
|
end
|