gitdocs 0.5.0.pre2 → 0.5.0.pre3
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 -0
- data/lib/gitdocs/repository.rb +18 -12
- data/lib/gitdocs/version.rb +1 -1
- data/test/integration/full_sync_test.rb +28 -20
- data/test/integration/test_helper.rb +76 -1
- data/test/repository_test.rb +12 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MWMzMjFmOGM0ZDE0OTBhMjVlNmIxYzIzNGZhODFhOGYyZDhiN2YyYw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NmFmYWFiOWE2M2Y0YTVkNDVlMThmY2UwZmNkNjNjZWM1YjE5NDVkMg==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YmM0ODM5NWM2ODg0OTc3YWEyMTZmNWIyYWI3NDBmZjQxODg4OTdiNjFiYjU1
|
10
|
+
OWRhZWNhNzljOWIzY2Q3MmNmZjYzNThiMTY5NWQ1NTJlYWMyN2RjZDliYTc2
|
11
|
+
MDRhOTg0ZTlmYmRkYWM5MjA0Zjk1ODA1ZjE0NjBkZGYwMjEyZDI=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZjQxM2EwMDNhY2RkMGUwNjMzMTVmMmM4YWNkZTkwMGZhNDYzYTQzMGQyZjUw
|
14
|
+
ZTdlMDg2NjgzZjU0NmNiZDA4ZmQwYWU3MWI3YjYxMDk4MzM5Y2I3MzU0ODI3
|
15
|
+
M2E1ZGNhNTNhMDg1MGYwYjYzNjU3ZmE3NDFjYzk2YjgxZTZhNzY=
|
data/CHANGELOG
CHANGED
@@ -1,6 +1,12 @@
|
|
1
|
+
0.5.0.pre3 (3/30/2014)
|
2
|
+
|
3
|
+
* Eliminate sleep from sync integration test (@acant)
|
4
|
+
* More rugged git conversion this time for the "push"
|
5
|
+
|
1
6
|
0.5.0.pre2 (3/9/2014)
|
2
7
|
|
3
8
|
* Convert to use rugged and Grit (@acant)
|
9
|
+
* Removed automatically opening the UI on start (@aqtrans)
|
4
10
|
|
5
11
|
0.5.0.pre1 (11/25/2013)
|
6
12
|
|
data/README.md
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
[](http://badge.fury.io/rb/gitdocs)
|
4
4
|
[](https://codeclimate.com/github/bazaarlabs/gitdocs)
|
5
|
+
[](https://travis-ci.org/nesquena/gitdocs)
|
5
6
|
|
6
7
|
Open-source dropbox alternative powered by git. Collaborate on files and tasks without any extra hassle.
|
7
8
|
gitdocs will automatically keep everyone's repos in sync by pushing and pulling changes.
|
data/lib/gitdocs/repository.rb
CHANGED
@@ -191,20 +191,26 @@ class Gitdocs::Repository
|
|
191
191
|
return :no_remote unless has_remote?
|
192
192
|
|
193
193
|
#add and commit
|
194
|
-
|
195
|
-
|
196
|
-
|
194
|
+
Dir.glob(File.join(root, '**', '*'))
|
195
|
+
.select { |x| File.directory?(x) && Dir.glob("#{x}/*").empty? }
|
196
|
+
.each { |x| FileUtils.touch(File.join(x, '.gitignore')) }
|
197
|
+
Dir.chdir(root) do
|
198
|
+
@rugged.index.add_all
|
199
|
+
@rugged.index.update_all
|
200
|
+
end
|
201
|
+
@rugged.index.write
|
202
|
+
@grit.commit_index(message) if @rugged.index.count
|
203
|
+
|
204
|
+
remote_branch = Rugged::Branch.lookup(@rugged, "#{@remote_name}/#{@branch_name}", :remote)
|
197
205
|
|
198
|
-
if last_synced_oid.nil? ||
|
199
|
-
|
200
|
-
|
206
|
+
if last_synced_oid.nil? || remote_branch.nil? || remote_branch.tip.oid != @rugged.head.target
|
207
|
+
begin
|
208
|
+
@grit.git.push({ raise: true }, @remote_name, @branch_name)
|
201
209
|
:ok
|
202
|
-
|
203
|
-
:nothing
|
204
|
-
|
205
|
-
|
206
|
-
else
|
207
|
-
out # return the output on error
|
210
|
+
rescue Grit::Git::CommandFailed => e
|
211
|
+
return :nothing if last_synced_oid.nil?
|
212
|
+
return :conflict if e.err[/\[rejected\]/]
|
213
|
+
e.err # return the output on error
|
208
214
|
end
|
209
215
|
else
|
210
216
|
:nothing
|
data/lib/gitdocs/version.rb
CHANGED
@@ -19,49 +19,57 @@ describe 'fully synchronizing repositories' do
|
|
19
19
|
|
20
20
|
it 'should sync new files' do
|
21
21
|
write_file('clone1/newfile', 'testing')
|
22
|
+
wait_for_clean_workdir('clone1')
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
check_exact_file_content('clone2/newfile', 'testing')
|
27
|
-
check_exact_file_content('clone3/newfile', 'testing')
|
24
|
+
wait_for_exact_file_content('clone1/newfile', 'testing')
|
25
|
+
wait_for_exact_file_content('clone2/newfile', 'testing')
|
26
|
+
wait_for_exact_file_content('clone3/newfile', 'testing')
|
28
27
|
end
|
29
28
|
|
30
29
|
it 'should sync changes to an existing file' do
|
31
30
|
write_file('clone1/file', 'testing')
|
32
|
-
|
31
|
+
wait_for_clean_workdir('clone1')
|
33
32
|
|
33
|
+
wait_for_exact_file_content('clone3/file', 'testing')
|
34
34
|
append_to_file('clone3/file', "\nfoobar")
|
35
|
+
wait_for_clean_workdir('clone3')
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
check_exact_file_content('clone3/file', "testing\nfoobar")
|
37
|
+
wait_for_exact_file_content('clone1/file', "testing\nfoobar")
|
38
|
+
wait_for_exact_file_content('clone2/file', "testing\nfoobar")
|
39
|
+
wait_for_exact_file_content('clone3/file', "testing\nfoobar")
|
40
40
|
end
|
41
41
|
|
42
42
|
it 'should sync empty directories' do
|
43
43
|
in_current_dir { _mkdir('clone1/empty_dir') }
|
44
|
-
|
44
|
+
wait_for_clean_workdir('clone1')
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
)
|
46
|
+
wait_for_directory('clone1/empty_dir')
|
47
|
+
wait_for_directory('clone2/empty_dir')
|
48
|
+
wait_for_directory('clone3/empty_dir')
|
50
49
|
end
|
51
50
|
|
52
51
|
it 'should mark unresolvable conflicts' do
|
53
52
|
write_file('clone1/file', 'testing')
|
54
|
-
|
53
|
+
wait_for_clean_workdir('clone1')
|
55
54
|
|
56
55
|
append_to_file('clone2/file', 'foobar')
|
57
56
|
append_to_file('clone3/file', 'deadbeef')
|
57
|
+
wait_for_clean_workdir('clone2')
|
58
|
+
wait_for_clean_workdir('clone3')
|
58
59
|
|
59
|
-
sleep
|
60
|
+
# HACK: Leaving in the sleep and standard checks.
|
61
|
+
# Trying to wait for the conflicts to be resolved does not seem to
|
62
|
+
# be working consistently when run on TravisCI. Hopefully this will.
|
63
|
+
sleep(6)
|
60
64
|
in_current_dir do
|
61
65
|
# Remember expected file counts include '.', '..', and '.git'
|
62
|
-
|
63
|
-
|
64
|
-
|
66
|
+
assert_includes(5..6, Dir.entries('clone1').count)
|
67
|
+
assert_includes(5..6, Dir.entries('clone2').count)
|
68
|
+
assert_includes(5..6, Dir.entries('clone3').count)
|
65
69
|
end
|
70
|
+
# TODO: Want to convert to these methods in the future
|
71
|
+
# wait_for_conflict_markers('clone1/file')
|
72
|
+
# wait_for_conflict_markers('clone2/file')
|
73
|
+
# wait_for_conflict_markers('clone3/file')
|
66
74
|
end
|
67
75
|
end
|
@@ -4,6 +4,7 @@ $LOAD_PATH.unshift File.expand_path('../../lib')
|
|
4
4
|
require 'gitdocs'
|
5
5
|
require 'aruba'
|
6
6
|
require 'aruba/api'
|
7
|
+
require 'timeout'
|
7
8
|
|
8
9
|
module MiniTest::Aruba
|
9
10
|
class ArubaApiWrapper
|
@@ -91,6 +92,78 @@ module Helper
|
|
91
92
|
abs_path
|
92
93
|
end
|
93
94
|
|
95
|
+
def wait_for_clean_workdir(path)
|
96
|
+
dirty = true
|
97
|
+
Timeout.timeout(10) do
|
98
|
+
while dirty
|
99
|
+
begin
|
100
|
+
sleep(0.1)
|
101
|
+
rugged = Rugged::Repository.new(abs_current_dir(path))
|
102
|
+
dirty = !rugged.diff_workdir(rugged.head.target, include_untracked: true).deltas.empty?
|
103
|
+
rescue Rugged::ReferenceError
|
104
|
+
nil
|
105
|
+
rescue Rugged::InvalidError
|
106
|
+
nil
|
107
|
+
rescue Rugged::RepositoryError
|
108
|
+
nil
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
rescue Timeout::Error
|
113
|
+
assert(false, "#{path} workdir is still dirty")
|
114
|
+
end
|
115
|
+
|
116
|
+
def wait_for_exact_file_content(file, exact_content)
|
117
|
+
in_current_dir do
|
118
|
+
begin
|
119
|
+
Timeout.timeout(10) do
|
120
|
+
sleep(0.1) until File.exist?(file) && IO.read(file) == exact_content
|
121
|
+
end
|
122
|
+
rescue Timeout::Error
|
123
|
+
nil
|
124
|
+
end
|
125
|
+
|
126
|
+
assert(File.exist?(file), "Missing #{file}")
|
127
|
+
actual_content = IO.read(file)
|
128
|
+
assert(
|
129
|
+
actual_content == exact_content,
|
130
|
+
"Expected #{file} content: #{exact_content}\nActual content #{actual_content}"
|
131
|
+
)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def wait_for_directory(path)
|
136
|
+
in_current_dir do
|
137
|
+
begin
|
138
|
+
Timeout.timeout(10) { sleep(0.1) until Dir.exist?(path) }
|
139
|
+
rescue Timeout::Error
|
140
|
+
nil
|
141
|
+
end
|
142
|
+
|
143
|
+
assert(Dir.exist?(path), "Missing #{path}")
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def wait_for_conflict_markers(path)
|
148
|
+
in_current_dir do
|
149
|
+
begin
|
150
|
+
Timeout.timeout(10) { sleep(0.1) if File.exist?(path) }
|
151
|
+
rescue Timeout::Error
|
152
|
+
nil
|
153
|
+
ensure
|
154
|
+
assert(!File.exist?(path), "#{path} should have been removed")
|
155
|
+
end
|
156
|
+
|
157
|
+
begin
|
158
|
+
Timeout.timeout(10) { sleep(0.1) if Dir.glob("#{path} (*)").empty? }
|
159
|
+
rescue Timeout::Error
|
160
|
+
nil
|
161
|
+
ensure
|
162
|
+
assert(!Dir.glob("#{path} (*)").empty?, "#{path} conflict marks should have been created")
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
94
167
|
def gitdocs_add(path = 'local')
|
95
168
|
add_cmd = "gitdocs add #{path} --pid=gitdocs.pid"
|
96
169
|
run_simple(add_cmd, true, 15)
|
@@ -100,9 +173,11 @@ module Helper
|
|
100
173
|
|
101
174
|
def git_clone_and_gitdocs_add(remote_path, *clone_paths)
|
102
175
|
clone_paths.each do |clone_path|
|
176
|
+
abs_clone_path = abs_current_dir(clone_path)
|
177
|
+
FileUtils.rm_rf(abs_clone_path)
|
103
178
|
repo = Rugged::Repository.clone_at(
|
104
179
|
"file://#{remote_path}",
|
105
|
-
|
180
|
+
abs_clone_path
|
106
181
|
)
|
107
182
|
repo.config['user.email'] = 'afish@example.com'
|
108
183
|
repo.config['user.name'] = 'Art T. Fish'
|
data/test/repository_test.rb
CHANGED
@@ -285,8 +285,12 @@ describe Gitdocs::Repository do
|
|
285
285
|
let(:last_oid) { nil }
|
286
286
|
|
287
287
|
describe 'and there is an error on push' do
|
288
|
-
#
|
289
|
-
before
|
288
|
+
# Simulate an error occurring during the push
|
289
|
+
before do
|
290
|
+
Grit::Git.any_instance.stubs(:push).raises(
|
291
|
+
Grit::Git::CommandFailed.new('', 1, '')
|
292
|
+
)
|
293
|
+
end
|
290
294
|
it { subject.must_equal :nothing }
|
291
295
|
end
|
292
296
|
|
@@ -339,10 +343,13 @@ describe Gitdocs::Repository do
|
|
339
343
|
describe 'and this is an error on the push' do
|
340
344
|
before do
|
341
345
|
write('file2', 'foobar')
|
342
|
-
|
343
|
-
|
346
|
+
|
347
|
+
# Simulate an error occurring during the push
|
348
|
+
Grit::Git.any_instance.stubs(:push).raises(
|
349
|
+
Grit::Git::CommandFailed.new('', 1, 'error message')
|
350
|
+
)
|
344
351
|
end
|
345
|
-
it { subject.
|
352
|
+
it { subject.must_equal 'error message' }
|
346
353
|
end
|
347
354
|
|
348
355
|
describe 'and this is nothing to push' do
|
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.pre3
|
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-03-
|
12
|
+
date: 2014-03-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: joshbuddy-guard
|