gitdocs 0.5.0.pre5 → 0.5.0.pre6
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 +8 -8
- data/CHANGELOG +6 -0
- data/README.md +1 -1
- data/lib/gitdocs/configuration.rb +1 -1
- data/lib/gitdocs/repository.rb +45 -24
- data/lib/gitdocs/runner.rb +2 -1
- data/lib/gitdocs/version.rb +1 -1
- data/lib/gitdocs/views/settings.haml +0 -5
- data/test/integration/full_sync_test.rb +0 -1
- data/test/repository_test.rb +112 -200
- data/test/runner_test.rb +13 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZGUwYWI0Y2RjMTNjZGU4YzMzMzkxMTcxOTQ3OGQ2YWY0ZGNmZjg3MA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MjZhNjUxNGM4Yjc2Nzk1NWRkYjJiNjNlNzYyNTA3NGEzNjFkMTcyNw==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NWY0NTMyOTQ1NGJhMTg5OTY3OWNhMGE4MzFhYjJjNzA1N2Y4YTgzMWIwMTE4
|
10
|
+
NDZkMWIzMzFlYzNhYzc5MjAyMmQ3NGJiMzY3ZDliMzhkMTE5ZWQxNjE3MTk3
|
11
|
+
Y2E4YTIzZTU2ODg3N2Y5YjRmNDFiNzM1MzZhMzczN2E4Yzk0ODI=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ODFiYjQ4ZmI3NWVlNzU5ZWY5NDQ3Mzk4OGRhMGNmMWQ5ZDBjNGNmYjcyYzM2
|
14
|
+
N2RhMzZlZDExYzYyOTMyZWE4OWVkYTA1N2Y1NDRiMmFjYTM4YmM3N2QzZWUw
|
15
|
+
OTRlZWZkOGJlMDg1MGQ4NGY4OThjOGRhN2Q1MjI5NzAyODcyZjA=
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
0.5.0.pre6 (May 24th 2014)
|
2
|
+
|
3
|
+
* Remove the load_browser_on_startup config option (@acant)
|
4
|
+
* Stop the addition of extra conflict markers (@acant)
|
5
|
+
* Separate the commit and push methods in repository (@acant)
|
6
|
+
|
1
7
|
0.5.0.pre5 (May 14th 2014)
|
2
8
|
|
3
9
|
* Cleanup behavior on empty commits
|
data/README.md
CHANGED
@@ -197,7 +197,7 @@ but provide the features that makes Dropbox great. If you are interested in othe
|
|
197
197
|
* [git-sync](http://tychoish.com/essay/git-sync/) manual git syncing tool,
|
198
198
|
which also use XMPP notifications
|
199
199
|
* [git-annex-assistant](http://git-annex.branchable.com/design/assistant/)
|
200
|
-
directory sync tool based on [git-annex](http://git-annex.branchable.com/). (written in
|
200
|
+
directory sync tool based on [git-annex](http://git-annex.branchable.com/). (written in Haskell)
|
201
201
|
* [BitTorrent Sync](http://www.bittorrent.com/sync) BitTorrent based syncing
|
202
202
|
tool, not open source or publicly defined protocol
|
203
203
|
* [StrongSync](https://secure.expandrive.com/strongsync) Dropbox clone utility,
|
data/lib/gitdocs/repository.rb
CHANGED
@@ -172,39 +172,46 @@ class Gitdocs::Repository
|
|
172
172
|
@rugged.index.reload
|
173
173
|
return e.err unless @rugged.index.conflicts?
|
174
174
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
175
|
+
# Collect all the index entries by their paths.
|
176
|
+
index_path_entries = Hash.new { |h, k| h[k] = Array.new }
|
177
|
+
@rugged.index.map do |index_entry|
|
178
|
+
index_path_entries[index_entry[:path]].push(index_entry)
|
179
|
+
end
|
180
|
+
|
181
|
+
# Filter to only the conflicted entries.
|
182
|
+
conflicted_path_entries = index_path_entries.delete_if { |_k, v| v.length == 1 }
|
183
|
+
|
184
|
+
conflicted_path_entries.each_pair do |path, index_entries|
|
185
|
+
# Write out the different versions of the conflicted file.
|
186
|
+
index_entries.each do |index_entry|
|
187
|
+
filename, extension = index_entry[:path].scan(/(.*?)(|\.[^\.]+)$/).first
|
188
|
+
author = ' original' if index_entry[:stage] == 1
|
189
|
+
short_oid = index_entry[:oid][0..6]
|
190
|
+
new_filename = "#{filename} (#{short_oid}#{author})#{extension}"
|
191
|
+
File.open(File.join(root, new_filename), 'wb') do |f|
|
192
|
+
f.write(Rugged::Blob.lookup(@rugged, index_entry[:oid]).content)
|
193
|
+
end
|
183
194
|
end
|
184
195
|
|
185
|
-
|
196
|
+
# And remove the original.
|
197
|
+
FileUtils.remove(File.join(root, path), force: true)
|
186
198
|
end
|
187
199
|
|
188
|
-
|
189
|
-
conflicted_paths.each { |path| FileUtils.remove(File.join(root, path), force: true) }
|
190
|
-
|
191
|
-
# NOTE: leave the commit until the next push
|
200
|
+
# NOTE: Let commit be handled by the next regular commit.
|
192
201
|
|
193
|
-
|
202
|
+
conflicted_path_entries.keys
|
194
203
|
end
|
195
204
|
|
196
|
-
# Commit
|
205
|
+
# Commit the working directory
|
206
|
+
#
|
207
|
+
# @param [String] message
|
197
208
|
#
|
198
209
|
# @return [nil] if the repository is invalid
|
199
|
-
# @return [
|
200
|
-
|
201
|
-
# @return [String] if there is an error return the message
|
202
|
-
# @return [:ok] if commited and pushed without errors or conflicts
|
203
|
-
def push(last_synced_oid, message='Auto-commit from gitdocs')
|
210
|
+
# @return [Boolean] whether a commit was made or not
|
211
|
+
def commit(message)
|
204
212
|
return nil unless valid?
|
205
|
-
return :no_remote unless has_remote?
|
206
213
|
|
207
|
-
#
|
214
|
+
# Mark any empty directories so they will be committed
|
208
215
|
Find.find(root).each do |path|
|
209
216
|
Find.prune if File.basename(path) == '.git'
|
210
217
|
if File.directory?(path) && Dir.entries(path).count == 2
|
@@ -228,16 +235,30 @@ class Gitdocs::Repository
|
|
228
235
|
end
|
229
236
|
@rugged.index.write
|
230
237
|
@grit.commit_index(message)
|
238
|
+
true
|
239
|
+
else
|
240
|
+
false
|
231
241
|
end
|
242
|
+
end
|
243
|
+
|
244
|
+
# Push the repository
|
245
|
+
#
|
246
|
+
# @return [nil] if the repository is invalid
|
247
|
+
# @return [:no_remote] if the remote is not yet set
|
248
|
+
# @return [:nothing] if there was nothing to do
|
249
|
+
# @return [String] if there is an error return the message
|
250
|
+
# @return [:ok] if committed and pushed without errors or conflicts
|
251
|
+
def push
|
252
|
+
return nil unless valid?
|
253
|
+
return :no_remote unless has_remote?
|
232
254
|
|
233
255
|
return :nothing if current_oid.nil?
|
234
256
|
|
235
|
-
if
|
257
|
+
if remote_branch.nil? || remote_branch.tip.oid != current_oid
|
236
258
|
begin
|
237
259
|
@grit.git.push({ raise: true }, @remote_name, @branch_name)
|
238
260
|
:ok
|
239
261
|
rescue Grit::Git::CommandFailed => e
|
240
|
-
return :nothing if last_synced_oid.nil?
|
241
262
|
return :conflict if e.err[/\[rejected\]/]
|
242
263
|
e.err # return the output on error
|
243
264
|
end
|
data/lib/gitdocs/runner.rb
CHANGED
@@ -102,7 +102,8 @@ module Gitdocs
|
|
102
102
|
message = 'Auto-commit from gitdocs'
|
103
103
|
end
|
104
104
|
|
105
|
-
|
105
|
+
@repository.commit(message)
|
106
|
+
result = @repository.push
|
106
107
|
|
107
108
|
return if result.nil? || result == :no_remote || result == :nothing
|
108
109
|
level, title, message = case result
|
data/lib/gitdocs/version.rb
CHANGED
@@ -8,11 +8,6 @@
|
|
8
8
|
%dt Web Frontend Port
|
9
9
|
%dd
|
10
10
|
%input{:type =>'input', :name=>"config[web_frontend_port]", :value => conf.global.web_frontend_port }
|
11
|
-
%p
|
12
|
-
%input{:type =>'hidden', :value => '0', :name=>"config[load_browser_on_startup]"}
|
13
|
-
%input{:type =>'checkbox', :value => '1', :name=>"config[load_browser_on_startup]", :checked => conf.global.load_browser_on_startup ? 'checked' : nil}
|
14
|
-
%span Open browser on startup?
|
15
|
-
|
16
11
|
%h2 Shares
|
17
12
|
- conf.shares.each_with_index do |share, idx|
|
18
13
|
%div{:id => "share-#{idx}", :class => "share #{idx % 2 == 0 ? 'even' : 'odd'}"}
|
@@ -9,7 +9,6 @@ describe 'fully synchronizing repositories' do
|
|
9
9
|
configuration.shares.each do |share|
|
10
10
|
share.update_attributes(polling_interval: 0.1, notification: false)
|
11
11
|
end
|
12
|
-
configuration.global.update_attributes(load_browser_on_startup: false)
|
13
12
|
|
14
13
|
start_cmd = 'gitdocs start --debug --pid=gitdocs.pid --port 7777'
|
15
14
|
run(start_cmd, 15)
|
data/test/repository_test.rb
CHANGED
@@ -276,6 +276,31 @@ describe Gitdocs::Repository do
|
|
276
276
|
it { subject ; local_file_content('file1 (7bfce5c)').must_equal 'dead' }
|
277
277
|
end
|
278
278
|
|
279
|
+
describe 'when there is a conflict, with additional files' do
|
280
|
+
before do
|
281
|
+
bare_commit(
|
282
|
+
remote_repo,
|
283
|
+
'file1', 'dead',
|
284
|
+
'second commit',
|
285
|
+
'author@example.com', 'A U Thor'
|
286
|
+
)
|
287
|
+
bare_commit(
|
288
|
+
remote_repo,
|
289
|
+
'file2', 'foo',
|
290
|
+
'second commit',
|
291
|
+
'author@example.com', 'A U Thor'
|
292
|
+
)
|
293
|
+
write_and_commit('file1', 'beef', 'conflict commit', author1)
|
294
|
+
end
|
295
|
+
|
296
|
+
it { subject.must_equal ['file1'] }
|
297
|
+
it { subject ; commit_count(local_repo).must_equal 2 }
|
298
|
+
it { subject ; local_file_count.must_equal 3 }
|
299
|
+
it { subject ; local_file_content('file1 (f6ea049 original)').must_equal 'foobar' }
|
300
|
+
it { subject ; local_file_content('file1 (18ed963)').must_equal 'beef' }
|
301
|
+
it { subject ; local_file_content('file2').must_equal 'foo' }
|
302
|
+
end
|
303
|
+
|
279
304
|
describe 'when there is a non-conflicted local commit' do
|
280
305
|
before { write_and_commit('file1', 'beef', 'conflict commit', author1) }
|
281
306
|
it { subject.must_equal :ok }
|
@@ -298,8 +323,8 @@ describe Gitdocs::Repository do
|
|
298
323
|
end
|
299
324
|
end
|
300
325
|
|
301
|
-
describe '#
|
302
|
-
subject { repository.
|
326
|
+
describe '#commit' do
|
327
|
+
subject { repository.commit('message') }
|
303
328
|
|
304
329
|
let(:path_or_share) { stub(
|
305
330
|
path: local_repo_path,
|
@@ -308,244 +333,129 @@ describe Gitdocs::Repository do
|
|
308
333
|
) }
|
309
334
|
|
310
335
|
describe 'when invalid' do
|
311
|
-
let(:last_oid) { nil }
|
312
336
|
let(:path_or_share) { 'tmp/unit/missing' }
|
313
337
|
it { subject.must_be_nil }
|
314
338
|
end
|
315
339
|
|
316
|
-
describe '
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
describe 'remote exists with no commits' do
|
322
|
-
before { create_local_repo_with_remote }
|
323
|
-
|
324
|
-
describe 'last sync is nil' do
|
325
|
-
let(:last_oid) { nil }
|
326
|
-
|
327
|
-
describe 'and there is an error on push' do
|
328
|
-
# Simulate an error occurring during the push
|
329
|
-
before do
|
330
|
-
Grit::Git.any_instance.stubs(:push).raises(
|
331
|
-
Grit::Git::CommandFailed.new('', 1, '')
|
332
|
-
)
|
333
|
-
end
|
334
|
-
it { subject.must_equal :nothing }
|
335
|
-
it { subject ; commit_count(local_repo).must_equal 0 }
|
336
|
-
end
|
340
|
+
describe 'no previous commits' do
|
341
|
+
describe 'nothing to commit' do
|
342
|
+
it { subject.must_equal false }
|
343
|
+
end
|
337
344
|
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
end
|
343
|
-
it { subject ; commit_count(local_repo).must_equal 1 }
|
344
|
-
it { subject ; commit_count(remote_repo).must_equal 1 }
|
345
|
-
it { subject.must_equal :nothing }
|
345
|
+
describe 'changes to commit' do
|
346
|
+
before do
|
347
|
+
write('file1', 'foobar')
|
348
|
+
mkdir('directory')
|
346
349
|
end
|
350
|
+
it { subject.must_equal true }
|
351
|
+
it { subject ; local_file_exist?('directory/.gitignore').must_equal true }
|
352
|
+
it { subject ; commit_count(local_repo).must_equal 1 }
|
353
|
+
it { subject ; head_commit(local_repo).message.must_equal "message\n" }
|
354
|
+
it { subject ; local_repo_clean?.must_equal true }
|
355
|
+
end
|
356
|
+
end
|
347
357
|
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
it { subject.must_equal :ok }
|
354
|
-
it { subject ; commit_count(local_repo).must_equal 1 }
|
355
|
-
it { subject ; commit_count(remote_repo).must_equal 1 }
|
356
|
-
it { subject ; head_commit(remote_repo).message.must_equal "message\n" }
|
357
|
-
it { subject ; head_tree_files(remote_repo).count.must_equal 2 }
|
358
|
-
it { subject ; head_tree_files(remote_repo).must_include 'directory' }
|
359
|
-
it { subject ; head_tree_files(remote_repo).must_include '.hidden_empty' }
|
360
|
-
it { subject ; Dir.glob("#{local_repo_path}/**/.gitignore", File::FNM_DOTMATCH).count.must_equal 2 }
|
361
|
-
end
|
358
|
+
describe 'previous commits' do
|
359
|
+
before do
|
360
|
+
write_and_commit('file1', 'foobar', 'initial commit', author1)
|
361
|
+
write_and_commit('file2', 'deadbeef', 'second commit', author1)
|
362
|
+
end
|
362
363
|
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
write('directory/.hidden', '')
|
367
|
-
end
|
368
|
-
it { subject.must_equal :ok }
|
369
|
-
it { subject ; local_file_exist?('directory', '.gitignore').must_equal false }
|
370
|
-
it { subject ; commit_count(local_repo).must_equal 1 }
|
371
|
-
it { subject ; commit_count(remote_repo).must_equal 1 }
|
372
|
-
it { subject ; head_commit(remote_repo).message.must_equal "message\n" }
|
373
|
-
it { subject ; head_tree_files(remote_repo).count.must_equal 1 }
|
374
|
-
it { subject ; head_tree_files(remote_repo).must_include 'directory' }
|
375
|
-
end
|
364
|
+
describe 'nothing to commit' do
|
365
|
+
it { subject.must_equal false }
|
366
|
+
end
|
376
367
|
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
it { subject ; head_tree_files(remote_repo).count.must_equal 1 }
|
384
|
-
it { subject ; head_tree_files(remote_repo).must_include 'file2' }
|
368
|
+
describe 'changes to commit' do
|
369
|
+
before do
|
370
|
+
write('file1', 'foobar')
|
371
|
+
FileUtils.rm_rf(File.join(local_repo_path, 'file2'))
|
372
|
+
write('file3', 'foobar')
|
373
|
+
mkdir('directory')
|
385
374
|
end
|
375
|
+
it { subject.must_equal true }
|
376
|
+
it { subject ; local_file_exist?('directory/.gitignore').must_equal true }
|
377
|
+
it { subject ; commit_count(local_repo).must_equal 3 }
|
378
|
+
it { subject ; head_commit(local_repo).message.must_equal "message\n" }
|
379
|
+
it { subject ; local_repo_clean?.must_equal true }
|
386
380
|
end
|
381
|
+
end
|
382
|
+
end
|
387
383
|
|
388
|
-
|
389
|
-
|
384
|
+
describe '#push' do
|
385
|
+
subject { repository.push }
|
390
386
|
|
391
|
-
|
392
|
-
|
393
|
-
|
387
|
+
let(:path_or_share) { stub(
|
388
|
+
path: local_repo_path,
|
389
|
+
remote_name: 'origin',
|
390
|
+
branch_name: 'master'
|
391
|
+
) }
|
394
392
|
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
end
|
400
|
-
it { subject.must_equal 'error message' }
|
401
|
-
end
|
393
|
+
describe 'when invalid' do
|
394
|
+
let(:path_or_share) { 'tmp/unit/missing' }
|
395
|
+
it { subject.must_be_nil }
|
396
|
+
end
|
402
397
|
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
end
|
398
|
+
describe 'when no remote' do
|
399
|
+
it { subject.must_equal :no_remote }
|
400
|
+
end
|
407
401
|
|
408
|
-
|
409
|
-
|
410
|
-
bare_commit(remote_repo, 'file1', 'dead', 'commit', 'A U Thor', 'author@example.com')
|
411
|
-
write('file1', 'beef')
|
412
|
-
end
|
413
|
-
it { subject ; commit_count(local_repo).must_equal 1 }
|
414
|
-
it { subject ; commit_count(remote_repo).must_equal 1 }
|
415
|
-
it { subject.must_equal :conflict }
|
416
|
-
end
|
402
|
+
describe 'remote exists with no commits' do
|
403
|
+
before { create_local_repo_with_remote }
|
417
404
|
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
it { subject ; commit_count(local_repo).must_equal 1 }
|
422
|
-
it { subject ; commit_count(remote_repo).must_equal 1 }
|
423
|
-
it { subject ; head_commit(remote_repo).message.must_equal "message\n" }
|
424
|
-
it { subject ; head_tree_files(remote_repo).count.must_equal 1 }
|
425
|
-
it { subject ; head_tree_files(remote_repo).must_include 'file2' }
|
426
|
-
end
|
405
|
+
describe 'and no local commits' do
|
406
|
+
it { subject.must_equal :nothing }
|
407
|
+
it { subject ; commit_count(remote_repo).must_equal 0 }
|
427
408
|
end
|
428
|
-
end
|
429
409
|
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
describe 'last sync is nil' do
|
434
|
-
let(:last_oid) { nil }
|
410
|
+
describe 'and a local commit' do
|
411
|
+
before { write_and_commit('file2', 'foobar', 'commit', author1) }
|
435
412
|
|
436
|
-
describe 'and
|
413
|
+
describe 'and the push fails' do
|
437
414
|
# Simulate an error occurring during the push
|
438
415
|
before do
|
439
|
-
Grit::Git.any_instance.stubs(:push)
|
440
|
-
Grit::Git::CommandFailed.new('', 1, '')
|
441
|
-
)
|
442
|
-
end
|
443
|
-
it { subject.must_equal :nothing }
|
444
|
-
it { subject ; commit_count(local_repo).must_equal 1 }
|
445
|
-
end
|
446
|
-
|
447
|
-
describe 'and there is a conflicted file to push' do
|
448
|
-
before do
|
449
|
-
bare_commit(remote_repo, 'file1', 'dead', 'commit', 'A U Thor', 'author@example.com')
|
450
|
-
write('file1', 'beef')
|
451
|
-
end
|
452
|
-
it { subject ; commit_count(local_repo).must_equal 2 }
|
453
|
-
it { subject ; commit_count(remote_repo).must_equal 2 }
|
454
|
-
it { subject.must_equal :nothing }
|
455
|
-
end
|
456
|
-
|
457
|
-
describe 'and there are empty directories to push' do
|
458
|
-
before do
|
459
|
-
mkdir('directory')
|
460
|
-
mkdir('.hidden_empty')
|
416
|
+
Grit::Git.any_instance.stubs(:push)
|
417
|
+
.raises(Grit::Git::CommandFailed.new('', 1, 'error message'))
|
461
418
|
end
|
462
|
-
it { subject.must_equal
|
463
|
-
it { subject ; commit_count(local_repo).must_equal 2 }
|
464
|
-
it { subject ; commit_count(remote_repo).must_equal 2 }
|
465
|
-
it { subject ; head_commit(remote_repo).message.must_equal "message\n" }
|
466
|
-
it { subject ; head_tree_files(remote_repo).count.must_equal 3 }
|
467
|
-
it { subject ; head_tree_files(remote_repo).must_include 'file1' }
|
468
|
-
it { subject ; head_tree_files(remote_repo).must_include 'directory' }
|
469
|
-
it { subject ; head_tree_files(remote_repo).must_include '.hidden_empty' }
|
470
|
-
it { subject ; Dir.glob("#{local_repo_path}/**/.gitignore", File::FNM_DOTMATCH).count.must_equal 2 }
|
419
|
+
it { subject.must_equal 'error message' }
|
471
420
|
end
|
472
421
|
|
473
|
-
describe 'and
|
474
|
-
before do
|
475
|
-
mkdir('directory')
|
476
|
-
write('directory/.hidden', '')
|
477
|
-
end
|
422
|
+
describe 'and the push succeeds' do
|
478
423
|
it { subject.must_equal :ok }
|
479
|
-
it { subject ;
|
480
|
-
it { subject ; commit_count(local_repo).must_equal 2 }
|
481
|
-
it { subject ; commit_count(remote_repo).must_equal 2 }
|
482
|
-
it { subject ; head_commit(remote_repo).message.must_equal "message\n" }
|
483
|
-
it { subject ; head_tree_files(remote_repo).count.must_equal 2 }
|
484
|
-
it { subject ; head_tree_files(remote_repo).must_include 'file1' }
|
485
|
-
it { subject ; head_tree_files(remote_repo).must_include 'directory' }
|
424
|
+
it { subject ; commit_count(remote_repo).must_equal 1 }
|
486
425
|
end
|
426
|
+
end
|
427
|
+
end
|
487
428
|
|
488
|
-
|
489
|
-
|
490
|
-
it { subject.must_equal :ok }
|
491
|
-
it { subject ; commit_count(local_repo).must_equal 2 }
|
492
|
-
it { subject ; commit_count(remote_repo).must_equal 2 }
|
493
|
-
it { subject ; head_commit(remote_repo).message.must_equal "message\n" }
|
494
|
-
it { subject ; head_tree_files(remote_repo).count.must_equal 1 }
|
495
|
-
it { subject ; head_tree_files(remote_repo).must_include 'file1' }
|
496
|
-
end
|
429
|
+
describe 'remote exists with commits' do
|
430
|
+
before { create_local_repo_with_remote_with_commit }
|
497
431
|
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
it { subject ; commit_count(local_repo).must_equal 2 }
|
502
|
-
it { subject ; commit_count(remote_repo).must_equal 2 }
|
503
|
-
it { subject ; head_commit(remote_repo).message.must_equal "message\n" }
|
504
|
-
it { subject ; head_tree_files(remote_repo).count.must_equal 2 }
|
505
|
-
it { subject ; head_tree_files(remote_repo).must_include 'file1' }
|
506
|
-
it { subject ; head_tree_files(remote_repo).must_include 'file2' }
|
507
|
-
end
|
432
|
+
describe 'and no local commits' do
|
433
|
+
it { subject.must_equal :nothing }
|
434
|
+
it { subject ; commit_count(remote_repo).must_equal 1 }
|
508
435
|
end
|
509
436
|
|
510
|
-
describe '
|
511
|
-
|
437
|
+
describe 'and a local commit' do
|
438
|
+
before { write_and_commit('file2', 'foobar', 'commit', author1) }
|
512
439
|
|
513
|
-
describe 'and
|
440
|
+
describe 'and the push fails' do
|
441
|
+
# Simulate an error occurring during the push
|
514
442
|
before do
|
515
|
-
|
516
|
-
|
517
|
-
# Simulate an error occurring during the push
|
518
|
-
Grit::Git.any_instance.stubs(:push).raises(
|
519
|
-
Grit::Git::CommandFailed.new('', 1, 'error message')
|
520
|
-
)
|
443
|
+
Grit::Git.any_instance.stubs(:push)
|
444
|
+
.raises(Grit::Git::CommandFailed.new('', 1, 'error message'))
|
521
445
|
end
|
522
446
|
it { subject.must_equal 'error message' }
|
523
447
|
end
|
524
448
|
|
525
|
-
describe 'and
|
526
|
-
|
527
|
-
it { subject ; commit_count(local_repo).must_equal 1 }
|
528
|
-
end
|
449
|
+
describe 'and the push conflicts' do
|
450
|
+
before { bare_commit(remote_repo, 'file2', 'dead', 'commit', 'A U Thor', 'author@example.com') }
|
529
451
|
|
530
|
-
describe 'and there is a conflicted commit to push' do
|
531
|
-
before do
|
532
|
-
bare_commit(remote_repo, 'file1', 'dead', 'commit', 'A U Thor', 'author@example.com')
|
533
|
-
write('file1', 'beef')
|
534
|
-
end
|
535
|
-
it { subject ; commit_count(local_repo).must_equal 2 }
|
536
452
|
it { subject ; commit_count(remote_repo).must_equal 2 }
|
537
453
|
it { subject.must_equal :conflict }
|
538
454
|
end
|
539
455
|
|
540
|
-
describe 'and
|
541
|
-
before { write('file2', 'foobar') }
|
456
|
+
describe 'and the push succeeds' do
|
542
457
|
it { subject.must_equal :ok }
|
543
|
-
it { subject ; commit_count(local_repo).must_equal 2 }
|
544
458
|
it { subject ; commit_count(remote_repo).must_equal 2 }
|
545
|
-
it { subject ; head_commit(remote_repo).message.must_equal "message\n" }
|
546
|
-
it { subject ; head_tree_files(remote_repo).count.must_equal 2 }
|
547
|
-
it { subject ; head_tree_files(remote_repo).must_include 'file1' }
|
548
|
-
it { subject ; head_tree_files(remote_repo).must_include 'file2' }
|
549
459
|
end
|
550
460
|
end
|
551
461
|
end
|
@@ -766,18 +676,20 @@ describe Gitdocs::Repository do
|
|
766
676
|
|
767
677
|
# NOTE: This method is ignoring hidden files.
|
768
678
|
def local_file_count
|
769
|
-
files = Dir.chdir(local_repo_path)
|
770
|
-
Dir.glob('*')
|
771
|
-
end
|
679
|
+
files = Dir.chdir(local_repo_path) { Dir.glob('*') }
|
772
680
|
files.count
|
773
681
|
end
|
774
682
|
|
683
|
+
def local_repo_clean?
|
684
|
+
local_repo.diff_workdir(local_repo.head.target, include_untracked: true).deltas.empty?
|
685
|
+
end
|
686
|
+
|
775
687
|
def local_file_exist?(*path_elements)
|
776
688
|
File.exist?(File.join(local_repo_path, *path_elements))
|
777
689
|
end
|
778
690
|
|
779
691
|
def local_file_content(*path_elements)
|
780
|
-
local_file_exist?
|
692
|
+
return nil unless local_file_exist?
|
781
693
|
File.read(File.join(local_repo_path, *path_elements))
|
782
694
|
end
|
783
695
|
end
|
data/test/runner_test.rb
CHANGED
@@ -63,7 +63,13 @@ describe 'gitdocs runner' do
|
|
63
63
|
describe '#push_changes' do
|
64
64
|
subject { runner.push_changes }
|
65
65
|
|
66
|
-
before
|
66
|
+
before do
|
67
|
+
repository.expects(:commit)
|
68
|
+
.with('Auto-commit from gitdocs')
|
69
|
+
.returns(push_result)
|
70
|
+
repository.expects(:push)
|
71
|
+
.returns(push_result)
|
72
|
+
end
|
67
73
|
|
68
74
|
describe 'when invalid' do
|
69
75
|
let(:push_result) { nil }
|
@@ -98,12 +104,15 @@ describe 'gitdocs runner' do
|
|
98
104
|
it { subject.must_equal nil }
|
99
105
|
end
|
100
106
|
|
101
|
-
describe 'when
|
107
|
+
describe 'when push is ok' do
|
102
108
|
let(:push_result) { :ok }
|
103
109
|
before do
|
104
110
|
runner.instance_variable_set(:@last_synced_revision, :oid)
|
105
|
-
repository.stubs(:current_oid)
|
106
|
-
|
111
|
+
repository.stubs(:current_oid)
|
112
|
+
.returns(:next_oid)
|
113
|
+
repository.stubs(:author_count)
|
114
|
+
.with(:oid)
|
115
|
+
.returns('Alice' => 1, 'Bob' => 2)
|
107
116
|
notifier.expects(:info)
|
108
117
|
.with('Pushed 3 changes', "'root_path' has been pushed")
|
109
118
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitdocs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.0.
|
4
|
+
version: 0.5.0.pre6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Hull
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-05-
|
12
|
+
date: 2014-05-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: joshbuddy-guard
|