au 0.1.1 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 747b7a38e077a90fcae85a25a41debea6a9c66f6e8c66605e4d298268bdd21cd
4
- data.tar.gz: 82a01914628d92827535d2d587681d260e73369133366c752ce4985895e8dd7d
3
+ metadata.gz: aa95d04570850dee2f2925f15f73e3bcec71cece8d85fd3a96eed234615df6e9
4
+ data.tar.gz: a2ad2985e381758e42dda23e14781d47fcb16dabcf2539a720e67c5823f1fb0b
5
5
  SHA512:
6
- metadata.gz: b82d4e806d17cf8c6429967461e437612a7927931a1db214a387e870ade5458e6f2e4e58f4a9f41b0989b9e725e0b78247a5a7c96f2dc6e1109173436e6a978b
7
- data.tar.gz: 2917e2d460448b99a06308e2e1daed33a89a03ffc5bc3828611e1cea0ecaeba0eb9d0b8e4f325326649537ae1b079bd15b007bd1725444a3851bacb17c4322eb
6
+ metadata.gz: 0a3430e195cd66c77a7b8e6228e459d6c75fa3bb0d42f4d1e305d152b37b6c63d714e05a2410314d2144916e6871202576ecc2089d66b1fa56aebb2c8064e5ef
7
+ data.tar.gz: 07d9fa7e97ca6b3f80937ee5a0e16d3e2480935fe11e5caf62708030b7d4ef7c2b07125f97245d1bcb856b7c3ac68fd84648e2d5816e2dc3ac5372f0622e9945
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- au (0.1.1)
4
+ au (0.2.0)
5
5
  colorize
6
6
  thor
7
7
 
data/README.md CHANGED
@@ -26,7 +26,7 @@ To install
26
26
  **any older version will error**. If your system comes with an older version, please either
27
27
  update your Ruby installation or use [rbenv](https://github.com/rbenv/rbenv). You may need to use `sudo`. Additionally, if you are on an outdated Ruby installation, please make sure your load path is updated for Ruby executable.
28
28
 
29
- ## Usage
29
+ ## Design Document
30
30
 
31
31
  A simple get-started [tutorial video](https://www.useloom.com/share/6372bf5d22b8482299f3c788559d4173).
32
32
 
@@ -96,6 +96,8 @@ Again, this project requires Ruby 2.5.0 or higher.
96
96
 
97
97
  Unit specs are written in RSpec. Use `bundle exec rspec` to run all unit specs.
98
98
 
99
+ Use `ruby -Ilib:test test/integration_test.rb` to run integration test.
100
+
99
101
  To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
100
102
 
101
103
  ## Dependencies
data/bin/au CHANGED
@@ -86,7 +86,7 @@ module Au
86
86
 
87
87
  desc "heads", "Show current HEAD"
88
88
  def heads
89
- Repository.instance.heads
89
+ puts Repository.instance.heads
90
90
  end
91
91
 
92
92
  desc "diff PATH", "Diff between tracked version and current version"
@@ -142,28 +142,23 @@ module Au
142
142
 
143
143
  desc "pull REMOTE_PATH", "Pull changes from remote repo"
144
144
  def pull(remote_repo_root)
145
- remote = nil
146
145
  begin
147
- remote = Repository.instance(remote_repo_root, false)
148
- rescue
149
- puts "Remote path is invalid!"
150
- return
146
+ remote = Repository.new(remote_repo_root, false)
147
+ Repository.instance.pull(remote)
148
+ rescue => e
149
+ puts e.message
151
150
  end
152
- Repository.instance.pull(remote)
153
151
  end
154
152
 
155
153
  desc "push REMOTE_PATH", "Push changes to remote repo"
156
154
  def push(remote_repo_root)
157
- remote = nil
158
155
  begin
159
- remote = Repository.instance(remote_repo_root, false)
160
- rescue
161
- puts "Remote path is invalid!"
162
- return
156
+ remote = Repository.new(remote_repo_root, false)
157
+ Repository.instance.push(remote)
158
+ rescue => e
159
+ puts e.message
163
160
  end
164
- Repository.instance.push(remote)
165
161
  end
166
-
167
162
  end
168
163
  end
169
164
 
data/lib/au.rb CHANGED
@@ -7,6 +7,6 @@ require 'au/models/diff'
7
7
  require 'au/models/document'
8
8
  require 'au/models/repository'
9
9
  require 'au/models/staging'
10
-
10
+ require 'pry'
11
11
  module Au
12
12
  end
@@ -217,9 +217,10 @@ module Au
217
217
 
218
218
  private
219
219
 
220
- def self.db(repo_path = nil)
220
+ def self.db(repo_path = Repository.path)
221
221
  # in this pstore file, each key is a commit id
222
- @db ||= PStore.new(File.join(Repository.path(repo_path), 'commits.pstore'))
222
+ @db ||= {}
223
+ @db[repo_path] ||= PStore.new(File.join(repo_path, 'commits.pstore'))
223
224
  end
224
225
 
225
226
  def self.build_commit_id
@@ -97,7 +97,7 @@ module Au
97
97
 
98
98
  def pull(remote_repo)
99
99
  # Initialize local and remote db and commit list
100
- remote_commit_db = Commit.db(remote_repo.root)
100
+ remote_commit_db = Commit.db(remote_repo.path)
101
101
  remote_commit_list = remote_commit_db.transaction do
102
102
  remote_commit_db.roots
103
103
  end
@@ -124,31 +124,35 @@ module Au
124
124
 
125
125
  # Find documents and their diff_id in those commits that only existed remotely
126
126
  remote_diff_id_to_add_list = {}
127
- commits_to_add.each do |commit|
128
- commit[:doc_diff_ids].each do |doc_path, diff_id|
127
+ commits_to_add.each do |_, commit|
128
+ commit[:doc_diff_ids].each do |doc_path, diff_id|
129
129
  remote_diff_id_to_add_list[doc_path] = diff_id
130
130
  end
131
131
  end
132
132
 
133
- # Write these information to remote
133
+ # Write these information to local
134
134
  remote_diff_id_to_add_list.each do |doc_path, diff_id|
135
135
  diff_pstore_remote = PStore.new(diff_db_name_remote(doc_path, remote_repo.path))
136
136
  diff_pstore_remote.transaction(true) do
137
137
  diff_pstore_local = PStore.new(diff_db_name_remote(doc_path, @path))
138
138
  diff_pstore_local.transaction do
139
- if diff_pstore_local[doc_path] == nil
140
- diff_pstore_local[doc_path] = diff_pstore_remote[doc_path]
141
- elsif diff_pstore_local[doc_path] != diff_pstore_remote[doc_path]
139
+ if diff_pstore_local[diff_id] == nil
140
+ diff_pstore_local[diff_id] = diff_pstore_remote[diff_id]
141
+ elsif diff_pstore_local[diff_id] != diff_pstore_remote[diff_id]
142
142
  raise "Error: Remote and local reposiroty have different content in a same diff"
143
143
  end
144
144
  end
145
145
  end
146
146
  end
147
+
148
+ # Find heads that only exist on remote repo
149
+ heads_to_add = remote_repo.heads.reject{|x| heads.include?(x)}
150
+ heads_to_add.each{|x| update_leaves_pstore(x)}
147
151
  end
148
152
 
149
153
  def push(remote_repo)
150
154
  # Initialize local and remote db and commit list
151
- remote_commit_db = Commit.db(remote_repo.root)
155
+ remote_commit_db = Commit.db(remote_repo.path)
152
156
  remote_commit_list = remote_commit_db.transaction do
153
157
  remote_commit_db.roots
154
158
  end
@@ -164,8 +168,8 @@ module Au
164
168
  # Find commits that only exist locally
165
169
  commit_id_to_add_list = local_commit_list.reject{|x| remote_commit_list.include?(x)}
166
170
  commits_to_add = {}
167
- remote_commit_db.transaction(true) do
168
- commit_id_to_add_list.each{|commit_id| commits_to_add[commit_id] = remote_commit_db[commit_id]}
171
+ local_commit_db.transaction(true) do
172
+ commit_id_to_add_list.each{|commit_id| commits_to_add[commit_id] = local_commit_db[commit_id]}
169
173
  end
170
174
 
171
175
  # Write those commits to remote commit db
@@ -175,8 +179,8 @@ module Au
175
179
 
176
180
  # Find documents and their diff_id in those commits that only existed locally
177
181
  local_diff_id_to_add_list = {}
178
- commits_to_add.each do |commit|
179
- commit[:doc_diff_ids].each do |doc_path, diff_id|
182
+ commits_to_add.each do |_, commit|
183
+ commit[:doc_diff_ids].each do |doc_path, diff_id|
180
184
  local_diff_id_to_add_list[doc_path] = diff_id
181
185
  end
182
186
  end
@@ -187,14 +191,17 @@ module Au
187
191
  diff_pstore_local.transaction(true) do
188
192
  diff_pstore_remote = PStore.new(diff_db_name_remote(doc_path, remote_repo.path))
189
193
  diff_pstore_remote.transaction do
190
- if diff_pstore_remote[doc_path] == nil
191
- diff_pstore_remote[doc_path] = diff_pstore_local[doc_path]
192
- elsif diff_pstore_local[doc_path] != diff_pstore_remote[doc_path]
194
+ if diff_pstore_remote[diff_id] == nil
195
+ diff_pstore_remote[diff_id] = diff_pstore_local[diff_id]
196
+ elsif diff_pstore_local[diff_id] != diff_pstore_remote[diff_id]
193
197
  raise "Error: Remote and local reposiroty have different content in a same diff"
194
198
  end
195
199
  end
196
200
  end
197
201
  end
202
+ # Find heads that only exist on remote repo
203
+ heads_to_add = heads.reject{|x| remote_repo.heads.include?(x)}
204
+ heads_to_add.each{|x| remote_repo.update_leaves_pstore(x)}
198
205
  end
199
206
 
200
207
  # def clone
@@ -207,20 +214,30 @@ module Au
207
214
  end
208
215
  end
209
216
 
210
- private
211
-
212
- def diff_db_name_remote(file_path, remote_path)
213
- paths = [Repository(remote_path, false).path, "diff_#{file_path.gsub('/', '.')}.pstore"].compact
214
- File.join(*paths)
215
- end
216
-
217
-
218
217
  def update_head_var
219
218
  @head = @head_pstore.transaction(true) do
220
219
  @head_pstore[:head]
221
220
  end
222
221
  end
223
222
 
223
+ def update_leaves_pstore(commit_id)
224
+ @leaves_pstore.transaction do
225
+ commit = Commit.find(commit_id)
226
+ if commit
227
+ parent_commit_id_1, parent_commit_id_2 = commit.parent_id_1, commit.parent_id_2
228
+ @leaves_pstore.delete(parent_commit_id_1)
229
+ @leaves_pstore.delete(parent_commit_id_2)
230
+ @leaves_pstore[commit_id] = 1
231
+ end
232
+ end
233
+ end
234
+
235
+ private
236
+ def diff_db_name_remote(file_path, remote_path)
237
+ paths = [remote_path, "diff_#{file_path.gsub('/', '.')}.pstore"].compact
238
+ File.join(*paths)
239
+ end
240
+
224
241
  def update_head_pstore(commit_id)
225
242
  @head = @head_pstore.transaction do
226
243
  @head_pstore[:head] = commit_id
@@ -239,18 +256,6 @@ module Au
239
256
  end
240
257
  end
241
258
 
242
- def update_leaves_pstore(commit_id)
243
- @leaves_pstore.transaction do
244
- commit = Commit.find(commit_id)
245
- if commit
246
- parent_commit_id_1, parent_commit_id_2 = commit.parent_id_1, commit.parent_id_2
247
- @leaves_pstore.delete(parent_commit_id_1)
248
- @leaves_pstore.delete(parent_commit_id_2)
249
- @leaves_pstore[commit_id] = 1
250
- end
251
- end
252
- end
253
-
254
259
  def self.resolve_conflict_fname
255
260
  File.join(Repository.instance.path, 'resolve_conflict')
256
261
  end
@@ -24,9 +24,10 @@ module Au
24
24
 
25
25
  def self.stage(relative_paths, last_commit = Repository.head)
26
26
  relative_paths = relative_paths.each_with_object([]) do |staged_path, accum|
27
- if File.directory?(staged_path)
28
- Dir.glob('**/*', base: staged_path) do |sub_path|
29
- accum << (File.join(staged_path, sub_path)) unless File.directory?(sub_path)
27
+ if File.directory?(File.join(Repository.root, staged_path))
28
+ Dir.glob('**/*', base: File.join(Repository.root, staged_path)) do |sub_path|
29
+ accum << (File.join(staged_path, sub_path)) unless File.directory?(File.join(
30
+ Repository.root, staged_path, sub_path))
30
31
  end
31
32
  else
32
33
  accum << staged_path
@@ -1,3 +1,3 @@
1
1
  module Au
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: au
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edward Du