git-process 0.9.1.pre3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/.gitignore +16 -0
  2. data/.rspec +3 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +22 -0
  5. data/Gemfile.lock +56 -0
  6. data/LICENSE +22 -0
  7. data/README.md +80 -0
  8. data/Rakefile +16 -0
  9. data/bin/git-new-fb +21 -0
  10. data/bin/git-pull-request +21 -0
  11. data/bin/git-sync +21 -0
  12. data/bin/git-to-master +21 -0
  13. data/git-process.gemspec +21 -0
  14. data/lib/git-process/abstract-error-builder.rb +46 -0
  15. data/lib/git-process/git-abstract-merge-error-builder.rb +115 -0
  16. data/lib/git-process/git-branch.rb +86 -0
  17. data/lib/git-process/git-branches.rb +53 -0
  18. data/lib/git-process/git-lib.rb +413 -0
  19. data/lib/git-process/git-merge-error.rb +31 -0
  20. data/lib/git-process/git-new-fb-options.rb +34 -0
  21. data/lib/git-process/git-process-error.rb +10 -0
  22. data/lib/git-process/git-process-options.rb +82 -0
  23. data/lib/git-process/git-process.rb +194 -0
  24. data/lib/git-process/git-pull-request-options.rb +42 -0
  25. data/lib/git-process/git-rebase-error.rb +31 -0
  26. data/lib/git-process/git-status.rb +72 -0
  27. data/lib/git-process/git-sync-options.rb +34 -0
  28. data/lib/git-process/git-to-master-options.rb +18 -0
  29. data/lib/git-process/github-client.rb +73 -0
  30. data/lib/git-process/github-service.rb +156 -0
  31. data/lib/git-process/parked-changes-error.rb +32 -0
  32. data/lib/git-process/pull-request.rb +38 -0
  33. data/lib/git-process/uncommitted-changes-error.rb +15 -0
  34. data/lib/git-process/version.rb +12 -0
  35. data/spec/FileHelpers.rb +18 -0
  36. data/spec/GitRepoHelper.rb +86 -0
  37. data/spec/git-abstract-merge-error-builder_spec.rb +113 -0
  38. data/spec/git-lib_spec.rb +118 -0
  39. data/spec/git-process_spec.rb +328 -0
  40. data/spec/git-status_spec.rb +101 -0
  41. data/spec/github-service_spec.rb +209 -0
  42. data/spec/pull-request_spec.rb +57 -0
  43. data/spec/spec_helper.rb +1 -0
  44. metadata +133 -0
@@ -0,0 +1,12 @@
1
+ module Git
2
+ module Process
3
+ module Version
4
+ MAJOR = 0
5
+ MINOR = 9
6
+ PATCH = 1
7
+ BUILD = 'pre3'
8
+
9
+ STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ require 'tmpdir'
2
+ include FileUtils
3
+
4
+ module FileHelpers
5
+ TEST_DIR = File.dirname(__FILE__)
6
+
7
+ def dir_files(dir)
8
+ Dir.entries(dir).grep(/^[^.]/)
9
+ end
10
+
11
+
12
+ def compare_files(file1name, file2name)
13
+ str1 = IO.read(file1name)
14
+ str2 = IO.read(file2name)
15
+ str1.should == str2
16
+ end
17
+
18
+ end
@@ -0,0 +1,86 @@
1
+ require 'FileHelpers'
2
+ require 'git-lib'
3
+
4
+ module GitRepoHelper
5
+
6
+
7
+ def gitlib
8
+ @gitlib ||= Git::GitLib.new(tmpdir, :log_level => log_level)
9
+ end
10
+
11
+
12
+ def gitprocess
13
+ @gitprocess ||= Git::Process.new(nil, gitlib)
14
+ end
15
+
16
+
17
+ def tmpdir
18
+ @tmpdir ||= Dir.mktmpdir
19
+ end
20
+
21
+
22
+ def commit_count
23
+ gitlib.log_count
24
+ end
25
+
26
+
27
+ def log_level
28
+ Logger::ERROR
29
+ end
30
+
31
+
32
+ def logger
33
+ gitlib.logger
34
+ end
35
+
36
+
37
+ def create_files(file_names)
38
+ Dir.chdir(gitlib.workdir) do |dir|
39
+ file_names.each do |fn|
40
+ gitlib.logger.debug {"Creating #{dir}/#{fn}"}
41
+ FileUtils.touch fn
42
+ end
43
+ end
44
+ gitlib.add(file_names)
45
+ end
46
+
47
+
48
+ def change_file(filename, contents, lib = gitlib)
49
+ Dir.chdir(lib.workdir) do
50
+ File.open(filename, 'w') {|f| f.puts contents}
51
+ end
52
+ end
53
+
54
+
55
+ def change_file_and_add(filename, contents, lib = gitlib)
56
+ change_file(filename, contents, lib)
57
+ lib.add(filename)
58
+ end
59
+
60
+
61
+ def change_file_and_commit(filename, contents, lib = gitlib)
62
+ change_file_and_add(filename, contents, lib)
63
+ lib.commit("#{filename} - #{contents}")
64
+ end
65
+
66
+
67
+ def clone(branch='master', &block)
68
+ td = Dir.mktmpdir
69
+ gl = Git::GitLib.new(td, :log_level => log_level)
70
+ gl.add_remote('origin', "file://#{tmpdir}")
71
+ gl.fetch
72
+ gl.checkout(branch, :new_branch => "origin/#{branch}")
73
+ if block_given?
74
+ begin
75
+ block.arity < 1 ? gl.instance_eval(&block) : block.call(gl)
76
+ rescue => exp
77
+ rm_rf(gl.workdir)
78
+ raise exp
79
+ end
80
+ nil
81
+ else
82
+ gl
83
+ end
84
+ end
85
+
86
+ end
@@ -0,0 +1,113 @@
1
+ require 'git-abstract-merge-error-builder'
2
+
3
+ describe Git::AbstractMergeErrorBuilder do
4
+
5
+ def builder
6
+ unless @builder
7
+ @builder = Object.new
8
+ @builder.extend(Git::AbstractMergeErrorBuilder)
9
+ @builder.stub(:lib).and_return(lib)
10
+ @builder.stub(:continue_command).and_return(nil)
11
+ @builder.stub(:error_message).and_return('')
12
+ end
13
+ @builder
14
+ end
15
+
16
+
17
+ def lib
18
+ unless @lib
19
+ @lib = double('lib')
20
+ @lib.stub(:rerere_enabled?).and_return(true)
21
+ @lib.stub(:rerere_autoupdate?).and_return(true)
22
+ @lib.stub(:status).and_return(status)
23
+ end
24
+ @lib
25
+ end
26
+
27
+
28
+ def status
29
+ unless @status
30
+ @status = double('status')
31
+ @status.stub(:unmerged).and_return([])
32
+ @status.stub(:modified).and_return([])
33
+ @status.stub(:added).and_return([])
34
+ end
35
+ @status
36
+ end
37
+
38
+
39
+ def match_commands(expected)
40
+ commands = builder.commands
41
+ expected.each do |e|
42
+ commands.slice!(0).should == e
43
+ end
44
+ commands.should be_empty
45
+ end
46
+
47
+
48
+ it "merged with rerere.enabled false" do
49
+ lib.stub(:rerere_enabled?).and_return(false)
50
+ status.stub(:unmerged).and_return(['a', 'b c'])
51
+ status.stub(:modified).and_return(['a', 'b c'])
52
+
53
+ builder.resolved_files.should == []
54
+ builder.unresolved_files.should == ['a', 'b c']
55
+ match_commands [
56
+ 'git config --global rerere.enabled true',
57
+ 'git mergetool a b\ c',
58
+ '# Verify \'a\' merged correctly.',
59
+ '# Verify \'b c\' merged correctly.',
60
+ 'git add a b\ c',
61
+ ]
62
+ end
63
+
64
+
65
+ it "merged with rerere.enabled true and auto-handled AND autoupdated a file" do
66
+ status.stub(:unmerged).and_return(['a', 'b c'])
67
+ status.stub(:modified).and_return(['a', 'b c'])
68
+ builder.stub(:error_message).and_return("\nResolved 'a' using previous resolution.\n")
69
+
70
+ builder.resolved_files.should == ['a']
71
+ builder.unresolved_files.should == ['b c']
72
+ match_commands [
73
+ '# Verify that \'rerere\' did the right thing for \'a\'.',
74
+ 'git mergetool b\ c',
75
+ '# Verify \'b c\' merged correctly.',
76
+ 'git add b\ c',
77
+ ]
78
+ end
79
+
80
+
81
+ it "merged with rerere.enabled true and auto-handled and not autoupdated a file" do
82
+ lib.stub(:rerere_autoupdate?).and_return(false)
83
+ status.stub(:unmerged).and_return(['a', 'b c'])
84
+ status.stub(:modified).and_return(['a', 'b c'])
85
+ builder.stub(:error_message).and_return("\nResolved 'a' using previous resolution.\n")
86
+
87
+ builder.resolved_files.should == ['a']
88
+ builder.unresolved_files.should == ['b c']
89
+ match_commands [
90
+ '# Verify that \'rerere\' did the right thing for \'a\'.',
91
+ 'git add a',
92
+ 'git mergetool b\ c',
93
+ '# Verify \'b c\' merged correctly.',
94
+ 'git add b\ c',
95
+ ]
96
+ end
97
+
98
+
99
+ it "merged with a file added in both branches" do
100
+ lib.stub(:rerere_autoupdate?).and_return(false)
101
+ status.stub(:unmerged).and_return(['a'])
102
+ status.stub(:modified).and_return(['b'])
103
+ status.stub(:added).and_return(['a', 'c'])
104
+
105
+ builder.resolved_files.should == []
106
+ builder.unresolved_files.should == ['a']
107
+ match_commands [
108
+ '# \'a\' was added in both branches; Fix the conflict.',
109
+ 'git add a',
110
+ ]
111
+ end
112
+
113
+ end
@@ -0,0 +1,118 @@
1
+ require 'git-lib'
2
+ require 'GitRepoHelper'
3
+
4
+ describe Git::GitLib do
5
+
6
+ describe "branches" do
7
+ include GitRepoHelper
8
+
9
+ it "list all the branches" do
10
+ create_files(['.gitignore'])
11
+ gitlib.commit('initial')
12
+
13
+ gitlib.branch('ba', :base_branch => 'master')
14
+ gitlib.branch('bb', :base_branch => 'master')
15
+ gitlib.branch('origin/master', :base_branch => 'master')
16
+
17
+ gitlib.branches.names.should == ['ba', 'bb', 'master', 'origin/master']
18
+ end
19
+
20
+ end
21
+
22
+
23
+ describe "branch" do
24
+ attr_reader :lib
25
+
26
+ before(:each) do
27
+ @lib = Git::GitLib.new(nil)
28
+ end
29
+
30
+
31
+ it "should create a branch with default base" do
32
+ lib.stub(:command).with(:branch, ['test_branch', 'master'])
33
+ lib.branch('test_branch')
34
+ end
35
+
36
+
37
+ it "should create a branch with explicit base" do
38
+ lib.stub(:command).with(:branch, ['test_branch', 'other_branch'])
39
+ lib.branch('test_branch', :base_branch => 'other_branch')
40
+ end
41
+
42
+
43
+ it "should delete a branch without force" do
44
+ lib.stub(:command).with(:branch, ['-d', 'test_branch'])
45
+ lib.branch('test_branch', :delete => true)
46
+ end
47
+
48
+
49
+ it "should delete a branch with force" do
50
+ lib.stub(:command).with(:branch, ['-D', 'test_branch'])
51
+ lib.branch('test_branch', :delete => true, :force => true)
52
+ end
53
+
54
+ end
55
+
56
+
57
+ describe "push" do
58
+ attr_reader :lib
59
+
60
+ before(:each) do
61
+ @lib = Git::GitLib.new(nil, :git => double('git'))
62
+ end
63
+
64
+
65
+ def log_level
66
+ Logger::ERROR
67
+ end
68
+
69
+
70
+ it "should push local branch to remote" do
71
+ lib.should_receive(:command).with(:push, ['remote', 'local_branch:test_branch'])
72
+
73
+ lib.push('remote', 'local_branch', 'test_branch')
74
+ end
75
+
76
+
77
+ it "should push current branch to remote" do
78
+ lib.stub(:command).with(:branch, ['-a', '--no-color']).and_return("* my_branch\n")
79
+ lib.should_receive(:command).with(:push, ['remote', 'my_branch:my_branch'])
80
+
81
+ lib.push('remote', 'my_branch', nil)
82
+ end
83
+
84
+
85
+ it "should remove named branch on remote" do
86
+ lib.should_receive(:command).with(:push, ['remote', '--delete', 'my_branch'])
87
+
88
+ lib.push('remote', 'my_branch', nil, :delete => true)
89
+ end
90
+
91
+
92
+ it "should remove current branch on remote" do
93
+ lib.should_receive(:command).with(:push, ['remote', '--delete', 'my_branch'])
94
+
95
+ lib.push('remote', nil, nil, :delete => 'my_branch')
96
+ end
97
+
98
+
99
+ # it "should create a branch with explicit base" do
100
+ # lib.stub(:command).with(:branch, ['test_branch', 'other_branch'])
101
+ # lib.branch('test_branch', :base_branch => 'other_branch')
102
+ # end
103
+
104
+
105
+ # it "should delete a branch without force" do
106
+ # lib.stub(:command).with(:branch, ['-d', 'test_branch'])
107
+ # lib.branch('test_branch', :delete => true)
108
+ # end
109
+
110
+
111
+ # it "should delete a branch with force" do
112
+ # lib.stub(:command).with(:branch, ['-D', 'test_branch'])
113
+ # lib.branch('test_branch', :delete => true, :force => true)
114
+ # end
115
+
116
+ end
117
+
118
+ end
@@ -0,0 +1,328 @@
1
+ require 'git-process'
2
+ require 'GitRepoHelper'
3
+
4
+ describe Git::Process do
5
+ include GitRepoHelper
6
+
7
+ before(:each) do
8
+ create_files(['.gitignore'])
9
+ gitlib.commit('initial')
10
+ end
11
+
12
+
13
+ after(:each) do
14
+ rm_rf(tmpdir)
15
+ end
16
+
17
+
18
+ describe "rebase to master" do
19
+
20
+ def log_level
21
+ Logger::ERROR
22
+ end
23
+
24
+
25
+ it "should work easily for a simple rebase" do
26
+ gitlib.checkout('fb', :new_branch => 'master')
27
+ change_file_and_commit('a', '')
28
+
29
+ commit_count.should == 2
30
+
31
+ gitlib.checkout('master')
32
+ change_file_and_commit('b', '')
33
+
34
+ gitlib.checkout('fb')
35
+
36
+ gitprocess.rebase_to_master
37
+
38
+ commit_count.should == 3
39
+ end
40
+
41
+
42
+ it "should work for a rebase after a rerere merge" do
43
+ # Make sure rerere is enabled
44
+ gitlib.rerere_enabled(true, false)
45
+ gitlib.rerere_autoupdate(false, false)
46
+
47
+ # Create the file to conflict on
48
+ change_file_and_commit('a', '')
49
+
50
+ # In the new branch, give it a new value
51
+ gitlib.checkout('fb', :new_branch => 'master') do
52
+ change_file_and_commit('a', 'hello')
53
+ end
54
+
55
+ # Change the value as well in the origional branch
56
+ gitlib.checkout('master') do
57
+ change_file_and_commit('a', 'goodbye')
58
+ end
59
+
60
+ # Merge in the new branch; don't error-out because will auto-fix.
61
+ gitlib.checkout('fb') do
62
+ gitlib.merge('master') rescue
63
+ change_file_and_commit('a', 'merged')
64
+ end
65
+
66
+ # Make another change on master
67
+ gitlib.checkout('master') do
68
+ change_file_and_commit('b', '')
69
+ end
70
+
71
+ # Go back to the branch and try to rebase
72
+ gitlib.checkout('fb')
73
+
74
+ begin
75
+ gitprocess.rebase_to_master
76
+ raise "Should have raised RebaseError"
77
+ rescue Git::Process::RebaseError => exp
78
+ exp.resolved_files.should == ['a']
79
+ exp.unresolved_files.should == []
80
+
81
+ exp.commands.length.should == 3
82
+ exp.commands[0].should match /^# Verify/
83
+ exp.commands[1].should == 'git add a'
84
+ exp.commands[2].should == 'git rebase --continue'
85
+ end
86
+ end
87
+
88
+ end
89
+
90
+
91
+ describe "remove current feature branch" do
92
+
93
+ def log_level
94
+ Logger::ERROR
95
+ end
96
+
97
+
98
+ describe "when handling the parking branch" do
99
+
100
+ it "should create it based on origin/master" do
101
+ gitlib.branch('fb', :base_branch => 'master')
102
+ clone('fb') do |gl|
103
+ gp = Git::Process.new(nil, gl)
104
+ gp.remove_feature_branch
105
+ gl.branches.current.name.should == '_parking_'
106
+ end
107
+ end
108
+
109
+
110
+ it "should move it to the new origin/master if it already exists and is clean" do
111
+ gitlib.branch('origin/master', :base_branch => 'master')
112
+ gitlib.branch('_parking_', :base_branch => 'origin/master')
113
+ change_file_and_commit('a', '') # still on 'master'
114
+
115
+ gitlib.checkout('fb', :new_branch => 'origin/master')
116
+
117
+ gitprocess.remove_feature_branch
118
+
119
+ gitlib.branches.current.name.should == '_parking_'
120
+ end
121
+
122
+
123
+ it "should move it to the new origin/master if it already exists and changes are part of the current branch" do
124
+ gitlib.branch('origin/master', :base_branch => 'master')
125
+
126
+ gitlib.checkout('_parking_', :new_branch => 'origin/master') do
127
+ change_file_and_commit('a', '')
128
+ end
129
+
130
+ gitlib.branch('fb', :base_branch => '_parking_')
131
+
132
+ gitlib.checkout('origin/master') do
133
+ gitlib.merge('fb')
134
+ end
135
+
136
+ gitlib.checkout('fb')
137
+
138
+ gitprocess.remove_feature_branch
139
+ gitlib.branches.current.name.should == '_parking_'
140
+ end
141
+
142
+
143
+ it "should move it out of the way if it has unaccounted changes on it" do
144
+ gitlib.branch('origin/master', :base_branch => 'master')
145
+ gitlib.checkout('_parking_', :new_branch => 'origin/master')
146
+ change_file_and_commit('a', '')
147
+ gitlib.checkout('fb', :new_branch => 'origin/master')
148
+
149
+ gitlib.branches.include?('_parking_OLD_').should be_false
150
+ gitprocess.remove_feature_branch
151
+ gitlib.branches.include?('_parking_OLD_').should be_true
152
+ gitlib.branches.current.name.should == '_parking_'
153
+ end
154
+
155
+ end
156
+
157
+
158
+ it "should delete the old local branch when it has been merged into origin/master" do
159
+ gitlib.branch('origin/master', :base_branch => 'master')
160
+ change_file_and_commit('a', '') # still on 'master'
161
+
162
+ gitlib.checkout('fb', :new_branch => 'origin/master')
163
+ gitlib.branches.include?('fb').should be_true
164
+ gitprocess.remove_feature_branch
165
+ gitlib.branches.include?('fb').should be_false
166
+ gitlib.branches.current.name.should == '_parking_'
167
+ end
168
+
169
+
170
+ it "should raise an error when the local branch has not been merged into origin/master" do
171
+ gitlib.branch('origin/master', :base_branch => 'master')
172
+ gitlib.checkout('fb', :new_branch => 'origin/master')
173
+ change_file_and_commit('a', '') # on 'fb'
174
+
175
+ gitlib.branches.include?('fb').should be_true
176
+ expect {gitprocess.remove_feature_branch}.should raise_error Git::Process::GitProcessError
177
+ end
178
+
179
+
180
+ it "should delete the old remote branch" do
181
+ change_file_and_commit('a', '')
182
+
183
+ gitlib.branch('fb', :base_branch => 'master')
184
+
185
+ clone('fb') do |gl|
186
+ gl.branches.include?('origin/fb').should be_true
187
+ Git::Process.new(nil, gl).remove_feature_branch
188
+ gl.branches.include?('origin/fb').should be_false
189
+ gitlib.branches.include?('fb').should be_false
190
+ gl.branches.current.name.should == '_parking_'
191
+ end
192
+ end
193
+
194
+
195
+ describe "when used while on _parking_" do
196
+
197
+ it 'should fail #rebase_to_master' do
198
+ gitlib.checkout('_parking_', :new_branch => 'master')
199
+ change_file_and_commit('a', '')
200
+
201
+ expect {gitprocess.rebase_to_master}.should raise_error Git::Process::ParkedChangesError
202
+ end
203
+
204
+
205
+ it 'should fail #sync_with_server' do
206
+ gitlib.checkout('_parking_', :new_branch => 'master')
207
+ change_file_and_commit('a', '')
208
+
209
+ expect {gitprocess.sync_with_server(false, false)}.should raise_error Git::Process::ParkedChangesError
210
+ end
211
+
212
+ end
213
+
214
+ end
215
+
216
+
217
+ describe "#new_feature_branch" do
218
+
219
+ def log_level
220
+ Logger::ERROR
221
+ end
222
+
223
+
224
+ it "should create the named branch against origin/master" do
225
+ gitlib.branch('origin/master', :base_branch => 'master')
226
+
227
+ new_branch = gitprocess.new_feature_branch('test_branch')
228
+
229
+ new_branch.name.should == 'test_branch'
230
+ new_branch.sha.should == gitlib.branches['origin/master'].sha
231
+ end
232
+
233
+
234
+ it "should bring committed changes on _parking_ over to the new branch" do
235
+ gitlib.branch('origin/master', :base_branch => 'master')
236
+ gitlib.checkout('_parking_', :new_branch => 'master')
237
+ change_file_and_commit('a', '')
238
+ change_file_and_commit('b', '')
239
+
240
+ new_branch = gitprocess.new_feature_branch('test_branch')
241
+
242
+ new_branch.name.should == 'test_branch'
243
+ Dir.chdir(gitlib.workdir) do |dir|
244
+ File.exists?('a').should be_true
245
+ File.exists?('b').should be_true
246
+ end
247
+
248
+ gitlib.branches.parking.should be_nil
249
+ end
250
+
251
+
252
+ it "should bring new/uncommitted changes on _parking_ over to the new branch" do
253
+ gitlib.branch('origin/master', :base_branch => 'master')
254
+ gitlib.checkout('_parking_', :new_branch => 'master')
255
+ change_file_and_commit('a', '')
256
+ change_file_and_add('b', '')
257
+ change_file('c', '')
258
+
259
+ new_branch = gitprocess.new_feature_branch('test_branch')
260
+
261
+ new_branch.name.should == 'test_branch'
262
+ Dir.chdir(gitlib.workdir) do |dir|
263
+ File.exists?('a').should be_true
264
+ File.exists?('b').should be_true
265
+ File.exists?('c').should be_true
266
+ end
267
+
268
+ gitlib.branches.parking.should be_nil
269
+ end
270
+
271
+ end
272
+
273
+
274
+ describe "#sync_with_server" do
275
+
276
+ def log_level
277
+ Logger::ERROR
278
+ end
279
+
280
+
281
+ it "should work when pushing with fast-forward" do
282
+ change_file_and_commit('a', '')
283
+
284
+ gitlib.branch('fb', :base_branch => 'master')
285
+
286
+ clone('fb') do |gl|
287
+ change_file_and_commit('a', 'hello', gl)
288
+ gl.branches.include?('origin/fb').should be_true
289
+ Git::Process.new(nil, gl).sync_with_server(false, false)
290
+ gl.branches.include?('origin/fb').should be_true
291
+ gitlib.branches.include?('fb').should be_true
292
+ end
293
+ end
294
+
295
+
296
+ it "should fail when pushing with non-fast-forward and no force" do
297
+ change_file_and_commit('a', '')
298
+
299
+ gitlib.branch('fb', :base_branch => 'master')
300
+
301
+ clone('fb') do |gl|
302
+ gitlib.checkout('fb') do
303
+ change_file_and_commit('a', 'hello', gitlib)
304
+ end
305
+
306
+ expect {Git::Process.new(nil, gl).sync_with_server(false, false)}.should raise_error Git::GitExecuteError
307
+ end
308
+ end
309
+
310
+
311
+ it "should work when pushing with non-fast-forward and force" do
312
+ change_file_and_commit('a', '')
313
+
314
+ gitlib.branch('fb', :base_branch => 'master')
315
+
316
+ clone('fb') do |gl|
317
+ gitlib.checkout('fb') do
318
+ change_file_and_commit('a', 'hello', gitlib)
319
+ end
320
+
321
+ # expect {Git::Process.new(nil, gl).sync_with_server(false, true)}.should_not raise_error Git::GitExecuteError
322
+ Git::Process.new(nil, gl).sync_with_server(false, true)
323
+ end
324
+ end
325
+
326
+ end
327
+
328
+ end