git_wrapper 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/.gitignore +5 -0
  2. data/Gemfile +4 -0
  3. data/README.md +74 -0
  4. data/Rakefile +1 -0
  5. data/git_wrapper.gemspec +21 -0
  6. data/lib/git_wrapper/commands/add.rb +21 -0
  7. data/lib/git_wrapper/commands/branch.rb +73 -0
  8. data/lib/git_wrapper/commands/checkout.rb +21 -0
  9. data/lib/git_wrapper/commands/commit.rb +21 -0
  10. data/lib/git_wrapper/commands/config.rb +26 -0
  11. data/lib/git_wrapper/commands/diff.rb +27 -0
  12. data/lib/git_wrapper/commands/fetch.rb +21 -0
  13. data/lib/git_wrapper/commands/git.rb +44 -0
  14. data/lib/git_wrapper/commands/init.rb +16 -0
  15. data/lib/git_wrapper/commands/log.rb +82 -0
  16. data/lib/git_wrapper/commands/merge.rb +16 -0
  17. data/lib/git_wrapper/commands/pull.rb +21 -0
  18. data/lib/git_wrapper/commands/push.rb +27 -0
  19. data/lib/git_wrapper/commands/remote.rb +49 -0
  20. data/lib/git_wrapper/commands/remove.rb +16 -0
  21. data/lib/git_wrapper/commands/reset.rb +36 -0
  22. data/lib/git_wrapper/commands/revert.rb +23 -0
  23. data/lib/git_wrapper/commands/shell.rb +67 -0
  24. data/lib/git_wrapper/commands/show.rb +40 -0
  25. data/lib/git_wrapper/commands/status.rb +17 -0
  26. data/lib/git_wrapper/commands/tag.rb +54 -0
  27. data/lib/git_wrapper/repository.rb +208 -0
  28. data/lib/git_wrapper/results/diff_name_status.rb +28 -0
  29. data/lib/git_wrapper/results/file_status.rb +21 -0
  30. data/lib/git_wrapper/results/log_info.rb +23 -0
  31. data/lib/git_wrapper/results/status_porcelain.rb +40 -0
  32. data/lib/git_wrapper/version.rb +3 -0
  33. data/lib/git_wrapper.rb +45 -0
  34. data/spec/repository_spec.rb +886 -0
  35. data/spec/spec_helper.rb +10 -0
  36. data/spec/status_porcelain_parser_spec.rb +78 -0
  37. data/spec/support/helpers/file_helper.rb +37 -0
  38. data/spec/support/matchers/git_status_matchers.rb +40 -0
  39. metadata +105 -0
@@ -0,0 +1,886 @@
1
+ require 'spec_helper'
2
+
3
+ describe GitWrapper, '-> Repository' do
4
+
5
+ before(:each) do
6
+ @file_helper = FileHelper.new
7
+ end
8
+
9
+ after(:each) do
10
+ @file_helper.remove_temp_folders
11
+ end
12
+
13
+ it 'Init repo' do
14
+ repo = Repository.new(@file_helper.create_temp_folder)
15
+ repo.init.should be_true
16
+ repo.log_output.last.should eq("Initialized empty Git repository in #{repo.location}/.git/\n")
17
+ end
18
+
19
+ it 'Init bare repo' do
20
+ repo = Repository.new(@file_helper.create_temp_folder)
21
+ repo.init_bare.should be_true
22
+ repo.log_output.last.should eq("Initialized empty Git repository in #{repo.location}/\n")
23
+ end
24
+
25
+ it 'Init repo in new folder' do
26
+ folder_name = @file_helper.create_temp_folder
27
+ repo = Repository.new(folder_name)
28
+ repo.init.should be_true
29
+ repo.location.should eq(folder_name)
30
+ Dir.exists?(repo.location).should be_true
31
+ FileUtils.rm_rf repo.location
32
+ end
33
+
34
+ it 'Is initialized repo' do
35
+ repo = Repository.new(@file_helper.create_temp_folder)
36
+ repo.initialized?.should be_false
37
+ repo.init
38
+ repo.initialized?.should be_true
39
+ repo.bare?.should be_false
40
+ end
41
+
42
+ it 'Is initialized bare repo' do
43
+ repo = Repository.new(@file_helper.create_temp_folder)
44
+ repo.initialized?.should be_false
45
+ repo.init_bare
46
+ repo.initialized?.should be_true
47
+ repo.bare?.should be_true
48
+ end
49
+
50
+ it 'Status into new repo' do
51
+ repo = Repository.new(@file_helper.create_temp_folder)
52
+ repo.init
53
+ repo.status.should be_empty
54
+ end
55
+
56
+ it 'Add one file into repo' do
57
+ repo = Repository.new(@file_helper.create_temp_folder)
58
+ repo.init
59
+
60
+ file1 = @file_helper.create_temp_file(repo.location, 'test')
61
+ file2 = @file_helper.create_temp_file(repo.location, 'test')
62
+
63
+ initial_status = repo.status
64
+ initial_status.should have(2).items
65
+ initial_status[0].should be_git_untracked(File.basename(file1))
66
+ initial_status[1].should be_git_untracked(File.basename(file2))
67
+
68
+ repo.add(file1).should be_true
69
+ repo.add('0123456.789').should be_false
70
+
71
+ final_status = repo.status
72
+ final_status.should have(2).items
73
+ final_status[0].should be_git_new_file(File.basename(file1))
74
+ final_status[1].should be_git_untracked(File.basename(file2))
75
+ end
76
+
77
+ it 'Add all files into repo' do
78
+ repo = Repository.new(@file_helper.create_temp_folder)
79
+ repo.init
80
+
81
+ file1 = @file_helper.create_temp_file(repo.location, 'test')
82
+ file2 = @file_helper.create_temp_file(repo.location, 'test')
83
+
84
+ initial_status = repo.status
85
+ initial_status.should have(2).items
86
+ initial_status[0].should be_git_untracked(File.basename(file1))
87
+ initial_status[1].should be_git_untracked(File.basename(file2))
88
+
89
+ repo.add_all.should be_true
90
+
91
+ final_status = repo.status
92
+ final_status.should have(2).items
93
+ final_status[0].should be_git_new_file(File.basename(file1))
94
+ final_status[1].should be_git_new_file(File.basename(file2))
95
+ end
96
+
97
+ it 'Commit repo' do
98
+ repo = Repository.new(@file_helper.create_temp_folder)
99
+ repo.init
100
+
101
+ file = @file_helper.create_temp_file(repo.location, 'test')
102
+
103
+ repo.status.first.should be_git_untracked(File.basename(file))
104
+ repo.add_all
105
+ repo.status.first.should be_git_new_file(File.basename(file))
106
+
107
+ repo.commit('comment').should be_true
108
+ repo.commit('comment').should be_false
109
+
110
+ repo.status.should be_empty
111
+ end
112
+
113
+ it 'Commit clean directory' do
114
+ repo = Repository.new(@file_helper.create_temp_folder)
115
+ repo.init
116
+
117
+ repo.commit('comment').should be_false
118
+ end
119
+
120
+ it 'Commt in name of another user' do
121
+ repo = Repository.new(@file_helper.create_temp_folder)
122
+ repo.init
123
+ @file_helper.create_temp_file(repo.location, 'test')
124
+ repo.add_all
125
+ repo.commit('first_commit', :author_name => 'another_author', :author_email => 'another_author@mail.com').should be_true
126
+
127
+ log = repo.log.first
128
+ log.author_name.should eq 'another_author'
129
+ end
130
+
131
+ it 'Delete file' do
132
+ repo = Repository.new(@file_helper.create_temp_folder)
133
+ repo.init
134
+
135
+ file = @file_helper.create_temp_file(repo.location, 'test')
136
+
137
+ repo.add_all
138
+ repo.commit('comments')
139
+ repo.status.should be_empty
140
+
141
+ repo.remove(File.basename(file)).should be_true
142
+ repo.status.first.should be_git_deleted(File.basename(file))
143
+
144
+ repo.remove('0123456.789').should be_false
145
+ end
146
+
147
+ it 'Add remote to repo' do
148
+ repo = Repository.new(@file_helper.create_temp_folder)
149
+ repo.init
150
+
151
+ repo.remotes.should be_empty
152
+
153
+ repo.add_remote('origin', @file_helper.create_temp_folder).should be_true
154
+ repo.add_remote('origin', '0123456789').should be_false
155
+
156
+ repo.remotes.should have(1).items
157
+ repo.remotes.first.should eq('origin')
158
+ end
159
+
160
+ it 'Remove remote from repo' do
161
+ repo = Repository.new(@file_helper.create_temp_folder)
162
+ repo.init
163
+
164
+ repo.remotes.should be_empty
165
+
166
+ repo.add_remote('origin', @file_helper.create_temp_folder)
167
+
168
+ repo.remotes.first.should eq('origin')
169
+
170
+ repo.remove_remote('origin').should be_true
171
+ repo.remove_remote('origin').should be_false
172
+
173
+ repo.remotes.should be_empty
174
+ end
175
+
176
+ it 'Pull from another repo' do
177
+ repo1 = Repository.new(@file_helper.create_temp_folder)
178
+ file_name1 = @file_helper.create_temp_file(repo1.location, 'test')
179
+ repo1.init
180
+ repo1.add_all
181
+ repo1.commit('...')
182
+
183
+ repo2 = Repository.new(@file_helper.create_temp_folder)
184
+ repo2.init
185
+ repo2.add_remote('origin', repo1.location)
186
+
187
+ file_name2 = "#{repo2.location}/#{File.basename(file_name1)}"
188
+
189
+ File.exist?(file_name2).should be_false
190
+
191
+ repo2.pull('origin').should be_true
192
+ repo2.pull('origin_2').should be_false
193
+
194
+ File.exist?(file_name2).should be_true
195
+ end
196
+
197
+ it 'Push into bare repo' do
198
+ repo1 = Repository.new(@file_helper.create_temp_folder)
199
+ repo1.init_bare
200
+
201
+ repo2 = Repository.new(@file_helper.create_temp_folder)
202
+ repo2.init
203
+ file_name1 = @file_helper.create_temp_file(repo2.location, 'test')
204
+
205
+ repo2.add_remote('origin', repo1.location)
206
+ repo2.add_all
207
+ repo2.commit('...')
208
+ repo2.push('origin').should be_true
209
+ repo2.push('origin_2').should be_false
210
+
211
+ repo3 = Repository.new(@file_helper.create_temp_folder)
212
+ repo3.init
213
+ repo3.add_remote('origin', repo1.location)
214
+
215
+ file_name2 = "#{repo3.location}/#{File.basename(file_name1)}"
216
+
217
+ File.exist?(file_name2).should be_false
218
+
219
+ repo3.pull('origin')
220
+
221
+ File.exist?(file_name2).should be_true
222
+ end
223
+
224
+ it 'Show base, mine and theirs version of a file' do
225
+ master_repo = Repository.new(@file_helper.create_temp_folder)
226
+ master_repo.init_bare
227
+
228
+ my_repo = Repository.new(@file_helper.create_temp_folder)
229
+ my_repo.init
230
+ my_repo.add_remote('origin', master_repo.location)
231
+ my_file = @file_helper.create_temp_file(my_repo.location, 'version base')
232
+ my_repo.add_all
233
+ my_repo.commit('base commit')
234
+ my_repo.push
235
+
236
+ their_repo = Repository.new(@file_helper.create_temp_folder)
237
+ their_repo.init
238
+ their_repo.add_remote('origin', master_repo.location)
239
+ their_repo.pull
240
+ their_file = "#{their_repo.location}/#{File.basename(my_file)}"
241
+ File.open(their_file, 'w') { |f| f.puts 'version theirs' }
242
+ their_repo.add_all
243
+ their_repo.commit('theris commit')
244
+ their_repo.push
245
+
246
+ File.open(my_file, 'w') { |f| f.puts 'version mine' }
247
+ my_repo.add_all
248
+ my_repo.commit('mine commit')
249
+
250
+ my_repo.pull.should be_false
251
+ my_repo.status.first.should be_git_merge_conflict(File.basename(my_file))
252
+
253
+ my_repo.show_base(File.basename(my_file)).should eq("version base\n")
254
+ my_repo.show_mine(File.basename(my_file)).should eq("version mine\n")
255
+ my_repo.show_theirs(File.basename(my_file)).should eq("version theirs\n")
256
+ end
257
+
258
+ it 'Show file from differente versions' do
259
+ repo = Repository.new(@file_helper.create_temp_folder)
260
+ repo.init
261
+
262
+ file_name = @file_helper.create_temp_file(repo.location, 'version 1')
263
+ repo.add_all
264
+ repo.commit 'first commit'
265
+
266
+ repo.checkout 'master', 'test'
267
+
268
+ File.open(file_name, 'w') { |f| f.puts 'version 2' }
269
+ repo.add_all
270
+ repo.commit 'seccond_commit'
271
+
272
+ repo.checkout 'master'
273
+
274
+ repo.show(File.basename(file_name)).should eq "version 1\n"
275
+ repo.show(File.basename(file_name), 'test').should eq "version 2\n"
276
+ end
277
+
278
+ it 'Show commit logs' do
279
+ repo = Repository.new(@file_helper.create_temp_folder)
280
+ repo.init
281
+
282
+ file_name1 = @file_helper.create_temp_file(repo.location, 'test')
283
+ file_name2 = @file_helper.create_temp_file(repo.location, 'test')
284
+
285
+ repo.add_all
286
+
287
+ repo.commit('first commit')
288
+
289
+ log = repo.log
290
+
291
+ log.should have(1).items
292
+ log.first.subject.should eq('first commit')
293
+ log.first.parents.should be_empty
294
+ log.first.merge?.should be_false
295
+
296
+ File.open(file_name1, 'w') { |f| f.puts 'test 2' }
297
+
298
+ repo.add_all
299
+ repo.commit('second commit')
300
+
301
+ repo.log(:file_name => File.basename(file_name1)).should have(2).items
302
+ repo.log(:file_name => File.basename(file_name2)).should have(1).items
303
+ end
304
+
305
+ it 'Show merge logs' do
306
+ repo = Repository.new(@file_helper.create_temp_folder)
307
+ repo.init
308
+
309
+ @file_helper.create_temp_file(repo.location, 'file1')
310
+ repo.add_all
311
+ repo.commit 'first commit'
312
+
313
+ repo.checkout 'master', 'test'
314
+
315
+ @file_helper.create_temp_file(repo.location, 'file2')
316
+ repo.add_all
317
+ repo.commit 'second commit'
318
+ second_commit = repo.log.first
319
+
320
+ repo.checkout 'master'
321
+
322
+ @file_helper.create_temp_file(repo.location, 'file2')
323
+ repo.add_all
324
+ repo.commit 'third commit'
325
+ third_commit = repo.log.first
326
+
327
+ repo.merge 'test'
328
+
329
+ log = repo.log.first
330
+ log.subject.should eq "Merge branch 'test'"
331
+ log.merge?.should be_true
332
+ log.parents.first.should eq third_commit.commit_hash
333
+ log.parents.last.should eq second_commit.commit_hash
334
+ end
335
+
336
+ it 'Show existent branches' do
337
+ origin = Repository.new(@file_helper.create_temp_folder)
338
+ origin.init_bare
339
+
340
+ repo = Repository.new(@file_helper.create_temp_folder)
341
+ repo.init
342
+ repo.add_remote 'origin', origin.location
343
+ @file_helper.create_temp_file(repo.location, 'test')
344
+
345
+ repo.branches.should be_empty
346
+
347
+ repo.add_all
348
+ repo.commit('first commit')
349
+ repo.push
350
+
351
+ branches = repo.branches
352
+ branches.should have(2).items
353
+ branches.should include('master')
354
+ branches.should include('remotes/origin/master')
355
+ end
356
+
357
+ it 'Create a new branch' do
358
+ repo = Repository.new(@file_helper.create_temp_folder)
359
+ repo.init
360
+ @file_helper.create_temp_file(repo.location, 'test')
361
+ repo.add_all
362
+ repo.commit('first commit')
363
+
364
+ repo.branch("branch1").should be_true
365
+
366
+ repo.branches.should include('branch1')
367
+ end
368
+
369
+ it 'Remove an existing branch' do
370
+ repo = Repository.new(@file_helper.create_temp_folder)
371
+ repo.init
372
+ @file_helper.create_temp_file(repo.location, 'test')
373
+ repo.add_all
374
+ repo.commit('first commit')
375
+
376
+ repo.branch("branch1")
377
+
378
+ repo.branches.should include('branch1')
379
+
380
+ repo.remove_branch('branch1').should be_true
381
+ repo.remove_branch('branch1').should be_false
382
+
383
+ repo.branches.should_not include('branch1')
384
+ end
385
+
386
+ it 'Get a current branch' do
387
+ repo = Repository.new(@file_helper.create_temp_folder)
388
+ repo.init
389
+ @file_helper.create_temp_file(repo.location, 'test')
390
+ repo.add_all
391
+ repo.commit('first commit')
392
+
393
+ repo.current_branch.should eq('master')
394
+
395
+ repo.branch("branch1")
396
+
397
+ repo.current_branch.should eq('master')
398
+
399
+ repo.checkout('branch1')
400
+
401
+ repo.current_branch.should eq('branch1')
402
+ end
403
+
404
+ it 'Branch an existing commit' do
405
+ repo = Repository.new(@file_helper.create_temp_folder)
406
+ repo.init
407
+ file_name = @file_helper.create_temp_file(repo.location, 'version master')
408
+ repo.add_all
409
+ repo.commit('first commit')
410
+
411
+ repo.checkout("master", "branch1");
412
+
413
+ File.open(file_name, 'w') { |f| f.puts 'version branch1' }
414
+
415
+ repo.add_all
416
+ repo.commit('version branch1')
417
+
418
+ repo.checkout('master')
419
+
420
+ File.open(file_name, 'r') do |f|
421
+ f.gets.should eq("version master\n")
422
+ end
423
+
424
+ repo.branch('branch2', 'branch1')
425
+ repo.checkout('branch2')
426
+
427
+ File.open(file_name, 'r') do |f|
428
+ f.gets.should eq("version branch1\n")
429
+ end
430
+ end
431
+
432
+ it 'Checkout an existing branch' do
433
+ repo = Repository.new(@file_helper.create_temp_folder)
434
+ repo.init
435
+ file_name = @file_helper.create_temp_file(repo.location, 'version master')
436
+ repo.add_all
437
+ repo.commit('commit master')
438
+
439
+ repo.current_branch.should eq('master')
440
+
441
+ repo.branch('branch1')
442
+ repo.checkout('branch1').should be_true
443
+ repo.checkout('0123456789').should be_false
444
+
445
+ repo.current_branch.should eq('branch1')
446
+ File.open(file_name, 'r') do |f|
447
+ f.gets.should eq("version master\n")
448
+ end
449
+
450
+ File.open(file_name, 'w') { |f| f.puts 'version branch1' }
451
+ repo.add_all
452
+ repo.commit('commit branch1')
453
+
454
+ repo.checkout('master')
455
+ repo.current_branch.should eq('master')
456
+ File.open(file_name, 'r') do |f|
457
+ f.gets.should eq("version master\n")
458
+ end
459
+
460
+ repo.checkout('branch1')
461
+ repo.current_branch.should eq('branch1')
462
+ File.open(file_name, 'r') do |f|
463
+ f.gets.should eq("version branch1\n")
464
+ end
465
+ end
466
+
467
+ it 'Checkout into a new branch' do
468
+ repo = Repository.new(@file_helper.create_temp_folder)
469
+ repo.init
470
+ @file_helper.create_temp_file(repo.location, 'version master')
471
+ repo.add_all
472
+ repo.commit('commit master')
473
+
474
+ repo.checkout('master', 'branch1').should be_true
475
+
476
+ repo.current_branch.should eq('branch1')
477
+ end
478
+
479
+ it 'Create a new tag' do
480
+ repo = Repository.new(@file_helper.create_temp_folder)
481
+ repo.init
482
+ @file_helper.create_temp_file(repo.location, 'test')
483
+ repo.add_all
484
+ repo.commit('first commit')
485
+
486
+ repo.tag('tag1').should be_true
487
+
488
+ repo.tags.should include('tag1')
489
+ end
490
+
491
+ it 'Remove an existing tag' do
492
+ repo = Repository.new(@file_helper.create_temp_folder)
493
+ repo.init
494
+ @file_helper.create_temp_file(repo.location, 'test')
495
+ repo.add_all
496
+ repo.commit('first commit')
497
+
498
+ repo.tag('tag1')
499
+
500
+ repo.tags.should include('tag1')
501
+
502
+ repo.remove_tag('tag1').should be_true
503
+ repo.remove_tag('tag1').should be_false
504
+
505
+ repo.tags.should_not include('tag1')
506
+ end
507
+
508
+ it 'Create a new tag from existing commit' do
509
+ repo = Repository.new(@file_helper.create_temp_folder)
510
+ repo.init
511
+ file_name = @file_helper.create_temp_file(repo.location, 'version master')
512
+ repo.add_all
513
+ repo.commit('commit master')
514
+
515
+ repo.checkout('master', 'branch1')
516
+
517
+ File.open(file_name, 'w') { |f| f.puts 'version branch1' }
518
+
519
+ repo.add_all
520
+ repo.commit('version branch1')
521
+
522
+ repo.tag('tag1', 'master').should be_true
523
+
524
+ repo.checkout('tag1', 'branch2')
525
+
526
+ File.open(file_name, 'r') do |f|
527
+ f.gets.should eq("version master\n")
528
+ end
529
+
530
+ repo.checkout('branch1')
531
+
532
+ File.open(file_name, 'r') do |f|
533
+ f.gets.should eq("version branch1\n")
534
+ end
535
+ end
536
+
537
+ it 'Merge two branches' do
538
+ repo = Repository.new(@file_helper.create_temp_folder)
539
+ repo.init
540
+ file_name1 = @file_helper.create_temp_file(repo.location, 'version master')
541
+ repo.add_all
542
+ repo.commit('commit master')
543
+
544
+ repo.checkout('master', 'branch1')
545
+
546
+ file_name2 = @file_helper.create_temp_file(repo.location, 'version branch1')
547
+
548
+ repo.add_all
549
+ repo.commit("commit branch 1")
550
+
551
+ repo.checkout("master")
552
+
553
+ File.exists?(file_name1).should be_true
554
+ File.exists?(file_name2).should be_false
555
+
556
+ repo.merge('branch1').should be_true
557
+
558
+ File.exists?(file_name1).should be_true
559
+ File.exists?(file_name2).should be_true
560
+ end
561
+
562
+ it 'Merge with conflicts' do
563
+ master_repo = Repository.new(@file_helper.create_temp_folder)
564
+ master_repo.init_bare
565
+
566
+ my_repo = Repository.new(@file_helper.create_temp_folder)
567
+ my_repo.init
568
+ my_repo.add_remote('origin', master_repo.location)
569
+ my_file = @file_helper.create_temp_file(my_repo.location, 'version base')
570
+ my_repo.add_all
571
+ my_repo.commit('base commit')
572
+ my_repo.push
573
+
574
+ their_repo = Repository.new(@file_helper.create_temp_folder)
575
+ their_repo.init
576
+ their_repo.add_remote('origin', master_repo.location)
577
+ their_repo.pull
578
+ their_file = "#{their_repo.location}/#{File.basename(my_file)}"
579
+ File.open(their_file, 'w') { |f| f.puts 'version theirs' }
580
+ their_repo.add_all
581
+ their_repo.commit('theris commit')
582
+ their_repo.push
583
+
584
+ File.open(my_file, 'w') { |f| f.puts 'version mine' }
585
+ my_repo.add_all
586
+ my_repo.commit('mine commit')
587
+
588
+ my_repo.fetch
589
+ my_repo.merge('origin/master').should be_false
590
+ my_repo.status.first.should be_git_merge_conflict(File.basename(my_file))
591
+
592
+ my_repo.show_base(File.basename(my_file)).should eq("version base\n")
593
+ my_repo.show_mine(File.basename(my_file)).should eq("version mine\n")
594
+ my_repo.show_theirs(File.basename(my_file)).should eq("version theirs\n")
595
+ end
596
+
597
+ it 'Fetch from remote' do
598
+ remote_repo = Repository.new(@file_helper.create_temp_folder)
599
+ remote_repo.init_bare
600
+
601
+ repo1 = Repository.new(@file_helper.create_temp_folder)
602
+ repo1.init
603
+ repo1.add_remote('origin', remote_repo.location)
604
+ @file_helper.create_temp_file(repo1.location, 'file 1')
605
+ repo1.add_all
606
+ repo1.commit('first commit')
607
+ repo1.push
608
+
609
+ repo2 = Repository.new(@file_helper.create_temp_folder)
610
+ repo2.init
611
+ repo2.add_remote('origin', remote_repo.location)
612
+ repo2.branches.should be_empty
613
+
614
+ repo2.fetch.should be_true
615
+
616
+ repo2.branches.should have(1).items
617
+ repo2.branches.should include('remotes/origin/master')
618
+ end
619
+
620
+ it 'Show diff file status between working tree and remote branch' do
621
+ remote_repo = Repository.new(@file_helper.create_temp_folder)
622
+ remote_repo.init_bare
623
+
624
+ repo1 = Repository.new(@file_helper.create_temp_folder)
625
+ repo1.init
626
+ repo1.add_remote('origin', remote_repo.location)
627
+ file1 = @file_helper.create_temp_file(repo1.location, 'file 1')
628
+ file2 = @file_helper.create_temp_file(repo1.location, 'file 2')
629
+ file3 = @file_helper.create_temp_file(repo1.location, 'file 3')
630
+ repo1.add_all
631
+ repo1.commit('first commit')
632
+ repo1.push
633
+
634
+ repo2 = Repository.new(@file_helper.create_temp_folder)
635
+ repo2.init
636
+ repo2.add_remote('origin', remote_repo.location)
637
+ repo2.pull
638
+
639
+ repo1.remove file1
640
+ File.open(file2, 'w') { |f| f.puts 'file 2 v.2' }
641
+ file4 = @file_helper.create_temp_file(repo1.location, 'file 3')
642
+ repo1.add_all
643
+ repo1.commit('second commit')
644
+ repo1.push
645
+
646
+ repo2.fetch.should be_true
647
+
648
+ diff = repo2.diff('origin/master')
649
+ diff.should have(3).items
650
+ diff.select { |d| d.file_name == File.basename(file1) }.first.status.should be(:new_file)
651
+ diff.select { |d| d.file_name == File.basename(file2) }.first.status.should be(:modified)
652
+ diff.select { |d| d.file_name == File.basename(file3) }.should be_empty
653
+ diff.select { |d| d.file_name == File.basename(file4) }.first.status.should be(:deleted)
654
+
655
+ diff_reverse = repo2.diff_reverse('origin/master')
656
+ diff_reverse.should have(3).items
657
+ diff_reverse.select { |d| d.file_name == File.basename(file1) }.first.status.should be(:deleted)
658
+ diff_reverse.select { |d| d.file_name == File.basename(file2) }.first.status.should be(:modified)
659
+ diff_reverse.select { |d| d.file_name == File.basename(file3) }.should be_empty
660
+ diff_reverse.select { |d| d.file_name == File.basename(file4) }.first.status.should be(:new_file)
661
+ end
662
+
663
+ it 'Revert a specific commit' do
664
+ repo = Repository.new(@file_helper.create_temp_folder)
665
+ repo.init
666
+
667
+ file1 = @file_helper.create_temp_file(repo.location, 'file_1')
668
+ file2 = @file_helper.create_temp_file(repo.location, 'file_2')
669
+
670
+ repo.add_all
671
+ repo.commit 'first commit'
672
+
673
+ file3 = @file_helper.create_temp_file(repo.location, 'file_3')
674
+ repo.remove file2
675
+
676
+ repo.add_all
677
+ repo.commit 'second commit'
678
+
679
+ File.exist?(file1).should be_true
680
+ File.exist?(file2).should be_false
681
+ File.exist?(file3).should be_true
682
+
683
+ last_log = repo.log.first
684
+ last_log.subject.should eq 'second commit'
685
+
686
+ repo.revert(last_log.commit_hash).should be_true
687
+
688
+ File.exist?(file1).should be_true
689
+ File.exist?(file2).should be_true
690
+ File.exist?(file3).should be_false
691
+ end
692
+
693
+ it 'Revert a specific merge' do
694
+ repo = Repository.new(@file_helper.create_temp_folder)
695
+ repo.init
696
+
697
+ file1 = @file_helper.create_temp_file(repo.location, 'file_1')
698
+ repo.add_all
699
+ repo.commit 'first commit'
700
+
701
+ repo.branch 'test'
702
+
703
+ file2 = @file_helper.create_temp_file(repo.location, 'file_2')
704
+ repo.add_all
705
+ repo.commit 'second commit'
706
+
707
+ repo.checkout 'test'
708
+
709
+ file3 = @file_helper.create_temp_file(repo.location, 'file_3')
710
+ repo.add_all
711
+ repo.commit 'third commit'
712
+
713
+ File.exist?(file1).should be_true
714
+ File.exist?(file2).should be_false
715
+ File.exist?(file3).should be_true
716
+
717
+ repo.checkout 'master'
718
+
719
+ File.exist?(file1).should be_true
720
+ File.exist?(file2).should be_true
721
+ File.exist?(file3).should be_false
722
+
723
+ repo.merge 'test'
724
+
725
+ File.exist?(file1).should be_true
726
+ File.exist?(file2).should be_true
727
+ File.exist?(file3).should be_true
728
+
729
+ last_log = repo.log.first
730
+ last_log.subject.should eq "Merge branch 'test'"
731
+
732
+ repo.revert(last_log.commit_hash).should be_true
733
+
734
+ File.exist?(file1).should be_true
735
+ File.exist?(file2).should be_true
736
+ File.exist?(file3).should be_false
737
+ end
738
+
739
+ it 'Reset index only' do
740
+ repo = Repository.new(@file_helper.create_temp_folder)
741
+ repo.init
742
+
743
+ file1 = @file_helper.create_temp_file(repo.location, 'file_1')
744
+ repo.add_all
745
+ repo.commit 'first commit'
746
+
747
+ file2 = @file_helper.create_temp_file(repo.location, 'file_2')
748
+ repo.add_all
749
+
750
+ File.exist?(file1).should be_true
751
+ File.exist?(file2).should be_true
752
+ repo.status.should have(1).items
753
+ repo.status.first.should be_git_new_file(File.basename(file2))
754
+
755
+ repo.reset.should be_true
756
+
757
+ File.exist?(file1).should be_true
758
+ File.exist?(file2).should be_true
759
+ repo.status.should have(1).items
760
+ repo.status.first.should be_git_untracked(File.basename(file2))
761
+ end
762
+
763
+ it 'Reset index and working tree (hard)' do
764
+ repo = Repository.new(@file_helper.create_temp_folder)
765
+ repo.init
766
+
767
+ file1 = @file_helper.create_temp_file(repo.location, 'file_1')
768
+ repo.add_all
769
+ repo.commit 'first commit'
770
+
771
+ file2 = @file_helper.create_temp_file(repo.location, 'file_2')
772
+ repo.add_all
773
+
774
+ File.exist?(file1).should be_true
775
+ File.exist?(file2).should be_true
776
+ repo.status.should have(1).items
777
+ repo.status.first.should be_git_new_file(File.basename(file2))
778
+
779
+ repo.reset(:mode => :hard).should be_true
780
+
781
+ File.exist?(file1).should be_true
782
+ File.exist?(file2).should be_false
783
+ repo.status.should be_empty
784
+ end
785
+
786
+ it 'Reset index only to specific commit' do
787
+ repo = Repository.new(@file_helper.create_temp_folder)
788
+ repo.init
789
+
790
+ file1 = @file_helper.create_temp_file(repo.location, 'file_1')
791
+ repo.add_all
792
+ repo.commit 'first commit'
793
+
794
+ file2 = @file_helper.create_temp_file(repo.location, 'file_2')
795
+ repo.add_all
796
+ repo.commit 'second commit'
797
+
798
+ file3 = @file_helper.create_temp_file(repo.location, 'file_2')
799
+ repo.add_all
800
+
801
+ File.exist?(file1).should be_true
802
+ File.exist?(file2).should be_true
803
+ File.exist?(file3).should be_true
804
+
805
+ repo.status.should have(1).items
806
+ repo.status.first.should be_git_new_file(File.basename(file3))
807
+
808
+ repo.log.should have(2).items
809
+ repo.log.first.subject.should eq 'second commit'
810
+
811
+ repo.reset(:commit => repo.log.last.commit_hash).should be_true
812
+
813
+ File.exist?(file1).should be_true
814
+ File.exist?(file2).should be_true
815
+ File.exist?(file3).should be_true
816
+
817
+ repo.status.should have(2).items
818
+ repo.status.first.should be_git_untracked(File.basename(file2))
819
+ repo.status.last.should be_git_untracked(File.basename(file3))
820
+
821
+ repo.log.should have(1).items
822
+ repo.log.first.subject.should eq 'first commit'
823
+ end
824
+
825
+ it 'Reset index and working tree (hard) to specific commit' do
826
+ repo = Repository.new(@file_helper.create_temp_folder)
827
+ repo.init
828
+
829
+ file1 = @file_helper.create_temp_file(repo.location, 'file_1')
830
+ repo.add_all
831
+ repo.commit 'first commit'
832
+
833
+ file2 = @file_helper.create_temp_file(repo.location, 'file_2')
834
+ repo.add_all
835
+ repo.commit 'second commit'
836
+
837
+ file3 = @file_helper.create_temp_file(repo.location, 'file_2')
838
+ repo.add_all
839
+
840
+ File.exist?(file1).should be_true
841
+ File.exist?(file2).should be_true
842
+ File.exist?(file3).should be_true
843
+
844
+ repo.status.should have(1).items
845
+ repo.status.first.should be_git_new_file(File.basename(file3))
846
+
847
+ repo.log.should have(2).items
848
+ repo.log.first.subject.should eq 'second commit'
849
+
850
+ repo.reset(:mode => :hard, :commit => repo.log.last.commit_hash).should be_true
851
+
852
+ File.exist?(file1).should be_true
853
+ File.exist?(file2).should be_false
854
+ File.exist?(file3).should be_false
855
+
856
+ repo.status.should be_empty
857
+
858
+ repo.log.should have(1).items
859
+ repo.log.first.subject.should eq 'first commit'
860
+ end
861
+
862
+ it 'Config user and email' do
863
+ repo = Repository.new(@file_helper.create_temp_folder)
864
+ repo.init
865
+
866
+ repo.config('user.name', 'user_test').should be_true
867
+ repo.config('user.email', 'user_test@mail.com').should be_true
868
+
869
+ repo.config('user.name').should eq 'user_test'
870
+ repo.config('user.email').should eq 'user_test@mail.com'
871
+ end
872
+
873
+ it 'Log specific user on commit' do
874
+ repo = Repository.new(@file_helper.create_temp_folder)
875
+ repo.init
876
+
877
+ repo.config('user.name', 'user_test').should be_true
878
+
879
+ @file_helper.create_temp_file(repo.location, 'file')
880
+ repo.add_all
881
+ repo.commit 'test'
882
+
883
+ repo.log.first.commiter_name.should eq 'user_test'
884
+ end
885
+
886
+ end