copernicium 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/cn +3 -2
- data/lib/RevLog.rb +43 -44
- data/lib/banners.rb +4 -0
- data/lib/pushpull.rb +226 -105
- data/lib/repos.rb +151 -79
- data/lib/required.rb +3 -5
- data/lib/ui.rb +128 -56
- data/lib/workspace.rb +121 -73
- metadata +25 -25
data/lib/workspace.rb
CHANGED
@@ -1,19 +1,7 @@
|
|
1
1
|
# workspace module - linfeng and qiguang
|
2
2
|
|
3
|
-
module Copernicium
|
4
|
-
def writeFile(path, content)
|
5
|
-
f = open(path, 'w')
|
6
|
-
f.write(content)
|
7
|
-
f.close
|
8
|
-
end
|
9
|
-
|
10
|
-
def readFile(path)
|
11
|
-
f = open(path, 'r')
|
12
|
-
txt = f.read
|
13
|
-
f.close
|
14
|
-
txt
|
15
|
-
end
|
16
3
|
|
4
|
+
module Copernicium
|
17
5
|
class FileObj
|
18
6
|
attr_reader :path, :history
|
19
7
|
def initialize(path, ids)
|
@@ -28,44 +16,80 @@ module Copernicium
|
|
28
16
|
@path == rhs.path
|
29
17
|
end
|
30
18
|
end
|
19
|
+
|
20
|
+
# returns most recent file id in the snapshot it was saved in
|
21
|
+
def last
|
22
|
+
@history.last
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# helper methods for file IO
|
27
|
+
def writeFile(path, content)
|
28
|
+
f = open(path, 'w')
|
29
|
+
f.write(content)
|
30
|
+
f.close
|
31
|
+
end
|
32
|
+
|
33
|
+
# helper methods for file IO
|
34
|
+
def readFile(path)
|
35
|
+
f = open(path, 'r')
|
36
|
+
txt = f.read
|
37
|
+
f.close
|
38
|
+
txt
|
31
39
|
end
|
32
40
|
|
33
|
-
|
34
|
-
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
41
|
+
module Workspace
|
42
|
+
include Repos # needed for keeping track of history
|
43
|
+
def Workspace.setup(bname = 'master')
|
44
|
+
@@files = []
|
45
|
+
@@cwd = Dir.pwd
|
46
|
+
@@root = (noroot?? @@cwd : getroot)
|
47
|
+
@@copn = File.join(@@root, '.cn')
|
48
|
+
Dir.mkdir(@@copn) unless Dir.exist?(@@copn)
|
49
|
+
@@cwd.sub!(@@root, '.')
|
50
|
+
@@branch = bname
|
51
|
+
RevLog.setup @@root
|
52
|
+
Repos.setup @@root
|
53
|
+
end
|
45
54
|
|
46
|
-
|
55
|
+
# create a new copernicium project
|
56
|
+
def Workspace.create_project(location = Dir.pwd)
|
57
|
+
Dir.mkdir location if !File.exists? location
|
58
|
+
Dir.chdir location
|
59
|
+
errmsg = 'Copernicium folder (.cn) not found, could not create.'.red
|
60
|
+
pexit errmsg, 1 if noroot?
|
47
61
|
end
|
48
62
|
|
49
|
-
# find
|
63
|
+
# find the root .cn folder
|
50
64
|
def getroot
|
65
|
+
cwd = Dir.pwd
|
51
66
|
max = 0
|
52
|
-
def
|
53
|
-
def
|
54
|
-
while max < 10 &&
|
67
|
+
def more_folders() Dir.pwd != '/' end
|
68
|
+
def root_found() Dir.exist? File.join(Dir.pwd, '.cn') end
|
69
|
+
while max < 10 && more_folders && !root_found
|
55
70
|
Dir.chdir(File.join(Dir.pwd, '..'))
|
56
71
|
max += 1
|
57
72
|
end
|
58
73
|
|
59
|
-
if
|
60
|
-
Dir.pwd
|
74
|
+
if root_found # return where cn was found
|
75
|
+
cnroot = Dir.pwd
|
76
|
+
Dir.chdir(cwd)
|
77
|
+
cnroot
|
61
78
|
else # directory not found
|
79
|
+
Dir.chdir(cwd)
|
62
80
|
nil
|
63
81
|
end
|
64
82
|
end
|
65
83
|
|
66
|
-
|
84
|
+
# tells us whether we are in a cn project or not
|
85
|
+
def noroot?
|
86
|
+
getroot.nil?
|
87
|
+
end
|
88
|
+
|
89
|
+
# workspace management
|
90
|
+
def Workspace.indexOf(x)
|
67
91
|
index = -1
|
68
|
-
|
92
|
+
@@files.each_with_index do |e,i|
|
69
93
|
if e.path == x
|
70
94
|
index = i
|
71
95
|
break
|
@@ -75,32 +99,34 @@ module Copernicium
|
|
75
99
|
end
|
76
100
|
|
77
101
|
# if include all the elements in list_files
|
78
|
-
def include?(files)
|
102
|
+
def Workspace.include?(files)
|
79
103
|
files.each { |x| return false if indexOf(x) == -1 }
|
80
104
|
true
|
81
105
|
end
|
82
106
|
|
83
|
-
# get all files currently in workspace
|
84
|
-
def ws_files
|
85
|
-
Dir[ File.join(
|
107
|
+
# get all files currently in workspace, except folders and .cn/*
|
108
|
+
def Workspace.ws_files
|
109
|
+
Dir[ File.join(@@root, '**', '*') ].reject do |p|
|
110
|
+
File.directory? p || File.join(@@root,'.cn').include?(p) == false
|
111
|
+
end
|
86
112
|
end
|
87
113
|
|
88
114
|
# Clear the current workspace
|
89
|
-
def clear
|
90
|
-
|
91
|
-
|
115
|
+
def Workspace.clear
|
116
|
+
@@files.each{ |x| File.delete(x.path) }
|
117
|
+
@@files = []
|
92
118
|
end
|
93
119
|
|
94
|
-
# reset first: delete them from disk and reset
|
120
|
+
# reset first: delete them from disk and reset @@files
|
95
121
|
# restore it with checkout() if we have had a branch name
|
96
122
|
# or it is the initial state, no commit and no checkout
|
97
123
|
# if list_files is nil, then rollback the list of files from the branch
|
98
124
|
# or rollback to the entire branch head pointed
|
99
|
-
def clean(comm)
|
100
|
-
if comm.files.empty?
|
101
|
-
clear
|
102
|
-
checkout
|
103
|
-
else #
|
125
|
+
def Workspace.clean(comm)
|
126
|
+
if comm.files.empty? # reset, checkout last commit
|
127
|
+
Workspace.clear
|
128
|
+
Workspace.checkout
|
129
|
+
else # files are not nil
|
104
130
|
|
105
131
|
# exit if the specified file is not in the workspace
|
106
132
|
return -1 if (self.include? comm.files) == false
|
@@ -109,7 +135,7 @@ module Copernicium
|
|
109
135
|
comm.files.each do |x|
|
110
136
|
File.delete(x)
|
111
137
|
idx = indexOf(x)
|
112
|
-
|
138
|
+
@@files.delete_at(idx) if !idx == -1
|
113
139
|
end
|
114
140
|
|
115
141
|
# if we have had a branch, first we get the latest snapshot of it
|
@@ -119,45 +145,46 @@ module Copernicium
|
|
119
145
|
end
|
120
146
|
|
121
147
|
# commit a list of files or the entire workspace to make a new snapshot
|
122
|
-
def commit(comm)
|
123
|
-
|
124
|
-
ws_files.each do |x|
|
148
|
+
def Workspace.commit(comm)
|
149
|
+
if comm.files.nil? # commit everything
|
150
|
+
Workspace.ws_files.each do |x|
|
125
151
|
if indexOf(x) == -1
|
126
152
|
content = readFile(x)
|
127
|
-
hash =
|
153
|
+
hash = RevLog.add_file(x, content)
|
128
154
|
fobj = FileObj.new(x, [hash,])
|
129
|
-
|
130
|
-
else
|
155
|
+
@@files.push(fobj)
|
156
|
+
else # file exists
|
131
157
|
content = readFile(x)
|
132
|
-
hash =
|
133
|
-
if
|
134
|
-
|
158
|
+
hash = RevLog.add_file(x, content)
|
159
|
+
if @@files[indexOf(x)].history[-1] != hash
|
160
|
+
@@files[indexOf(x)].history << hash
|
135
161
|
end
|
136
162
|
end
|
137
163
|
end
|
164
|
+
else # just commit certain files
|
138
165
|
end
|
139
|
-
|
166
|
+
Repos.make_snapshot(@@files) # return snapshot id
|
140
167
|
end
|
141
168
|
|
142
|
-
def checkout(comm
|
169
|
+
def Workspace.checkout(comm)
|
143
170
|
=begin
|
144
|
-
# just support
|
171
|
+
# just support revisions for now
|
145
172
|
# if argu is an Array Object, we assume it is a list of files to be added
|
146
|
-
# # to the workspace # we add the list of files to
|
173
|
+
# # to the workspace # we add the list of files to @@files regardless
|
147
174
|
# whether it has been in # it. that means there may be multiple versions
|
148
175
|
# of a file.
|
149
176
|
unless comm.files.nil?
|
150
177
|
list_files = comm.files
|
151
|
-
returned_snapshot =
|
178
|
+
returned_snapshot = Repos.get_snapshot(Repos.history.last)
|
152
179
|
list_files_last_commit = returned_snapshot.files
|
153
180
|
list_files_last_commit.each do |x|
|
154
181
|
if list_files.include? x.path
|
155
|
-
content =
|
182
|
+
content = RevLog.get_file(x.history.last)
|
156
183
|
idx = indexOf(x.path)
|
157
184
|
if idx == -1
|
158
|
-
|
185
|
+
@@files << x
|
159
186
|
else
|
160
|
-
|
187
|
+
@@files[idx] = x
|
161
188
|
end
|
162
189
|
writeFile(x.path, content)
|
163
190
|
end
|
@@ -168,21 +195,42 @@ module Copernicium
|
|
168
195
|
|
169
196
|
clear # reset workspace
|
170
197
|
|
171
|
-
#
|
198
|
+
# Dec. 3th, 2015 by Linfeng,
|
199
|
+
# for this command, the comm.rev should be a string representing the branch name
|
200
|
+
@@branch = comm.rev
|
201
|
+
Repos.update_branch(@@branch)
|
202
|
+
|
203
|
+
# if not snapshots exist, dont checkout
|
204
|
+
return -1 unless Repos.has_snapshots?
|
205
|
+
|
206
|
+
# if no snapshot files, dont checkout
|
207
|
+
snap = Repos.get_snapshot(comm.rev)
|
208
|
+
return -1 if snap.files.nil?
|
209
|
+
|
172
210
|
# object and finally push all files of it to the # workspace
|
173
|
-
|
211
|
+
snap.files.each do |file|
|
174
212
|
idx = indexOf(file.path)
|
213
|
+
puts file
|
175
214
|
if idx == -1
|
176
|
-
|
215
|
+
@@files << file
|
177
216
|
else
|
178
|
-
|
217
|
+
@@files[idx] = file
|
179
218
|
end
|
180
|
-
content =
|
219
|
+
content = RevLog.get_file(file.history.last)
|
181
220
|
writeFile(file.path, content)
|
182
221
|
end
|
183
222
|
end
|
184
223
|
|
185
|
-
|
224
|
+
# wrapper for Repos merge_snapshot, update workspace with result
|
225
|
+
def Workspace.merge(id)
|
226
|
+
# returns [{path => content}, [conflicting paths]]
|
227
|
+
Repos.merge_snapshot(id)
|
228
|
+
|
229
|
+
# todo update workspace with result
|
230
|
+
# todo return any conflicting files
|
231
|
+
end
|
232
|
+
|
233
|
+
def Workspace.status
|
186
234
|
added = []
|
187
235
|
edits = []
|
188
236
|
remov = []
|
@@ -192,13 +240,13 @@ module Copernicium
|
|
192
240
|
added << f
|
193
241
|
else # changed file?
|
194
242
|
x2 = readFile(f) # get the current version
|
195
|
-
x1 =
|
243
|
+
x1 = RevLog.get_file(@@files[idx].history.last)
|
196
244
|
edits << f if x1 != x2
|
197
245
|
end
|
198
246
|
end
|
199
247
|
|
200
248
|
# any deleted files from the last commit?
|
201
|
-
|
249
|
+
@@files.each { |f| remov << f.path unless (ws_files.include? f.path) }
|
202
250
|
|
203
251
|
[added, edits, remov]
|
204
252
|
end
|
metadata
CHANGED
@@ -1,113 +1,113 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: copernicium
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Team Copernicium
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-12-
|
11
|
+
date: 2015-12-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: diffy
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3.0'
|
20
|
-
- -
|
20
|
+
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: 3.0.7
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
-
- - ~>
|
27
|
+
- - "~>"
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '3.0'
|
30
|
-
- -
|
30
|
+
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 3.0.7
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: net-scp
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- - ~>
|
37
|
+
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
39
|
version: '1.2'
|
40
|
-
- -
|
40
|
+
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: 1.2.1
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- - ~>
|
47
|
+
- - "~>"
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: '1.2'
|
50
|
-
- -
|
50
|
+
- - ">="
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: 1.2.1
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
54
|
name: net-ssh
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
56
56
|
requirements:
|
57
|
-
- - ~>
|
57
|
+
- - "~>"
|
58
58
|
- !ruby/object:Gem::Version
|
59
59
|
version: '3.0'
|
60
|
-
- -
|
60
|
+
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: 3.0.1
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- - ~>
|
67
|
+
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '3.0'
|
70
|
-
- -
|
70
|
+
- - ">="
|
71
71
|
- !ruby/object:Gem::Version
|
72
72
|
version: 3.0.1
|
73
73
|
- !ruby/object:Gem::Dependency
|
74
74
|
name: minitest
|
75
75
|
requirement: !ruby/object:Gem::Requirement
|
76
76
|
requirements:
|
77
|
-
- - ~>
|
77
|
+
- - "~>"
|
78
78
|
- !ruby/object:Gem::Version
|
79
79
|
version: '5.8'
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 5.8.1
|
83
83
|
type: :development
|
84
84
|
prerelease: false
|
85
85
|
version_requirements: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - ~>
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '5.8'
|
90
|
-
- -
|
90
|
+
- - ">="
|
91
91
|
- !ruby/object:Gem::Version
|
92
92
|
version: 5.8.1
|
93
93
|
- !ruby/object:Gem::Dependency
|
94
94
|
name: minitest-reporters
|
95
95
|
requirement: !ruby/object:Gem::Requirement
|
96
96
|
requirements:
|
97
|
-
- - ~>
|
97
|
+
- - "~>"
|
98
98
|
- !ruby/object:Gem::Version
|
99
99
|
version: '1.1'
|
100
|
-
- -
|
100
|
+
- - ">="
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: 1.1.4
|
103
103
|
type: :development
|
104
104
|
prerelease: false
|
105
105
|
version_requirements: !ruby/object:Gem::Requirement
|
106
106
|
requirements:
|
107
|
-
- - ~>
|
107
|
+
- - "~>"
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: '1.1'
|
110
|
-
- -
|
110
|
+
- - ">="
|
111
111
|
- !ruby/object:Gem::Version
|
112
112
|
version: 1.1.4
|
113
113
|
description: A simple distributed version control system written in Ruby.
|
@@ -135,17 +135,17 @@ require_paths:
|
|
135
135
|
- lib
|
136
136
|
required_ruby_version: !ruby/object:Gem::Requirement
|
137
137
|
requirements:
|
138
|
-
- -
|
138
|
+
- - ">="
|
139
139
|
- !ruby/object:Gem::Version
|
140
140
|
version: '0'
|
141
141
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
|
-
- -
|
143
|
+
- - ">="
|
144
144
|
- !ruby/object:Gem::Version
|
145
145
|
version: '0'
|
146
146
|
requirements: []
|
147
147
|
rubyforge_project:
|
148
|
-
rubygems_version: 2.4.
|
148
|
+
rubygems_version: 2.4.5.1
|
149
149
|
signing_key:
|
150
150
|
specification_version: 4
|
151
151
|
summary: Simple DVCS in Ruby.
|