copernicium 0.0.3 → 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/required.rb CHANGED
@@ -12,10 +12,10 @@ require 'net/scp' # Needed for file transfer between servers
12
12
 
13
13
  # coperncicium files
14
14
 
15
- require_relative "banners"
16
- require_relative "RevLog"
17
- require_relative "repos"
18
- require_relative "pushpull"
19
- require_relative "workspace"
20
- require_relative "ui"
15
+ require_relative 'banners'
16
+ require_relative 'RevLog'
17
+ require_relative 'repos'
18
+ require_relative 'pushpull'
19
+ require_relative 'workspace'
20
+ require_relative 'ui'
21
21
 
data/lib/ui.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # user interface module - parse and execute commands
2
2
  # integrates all modules, central module
3
3
 
4
- VERSION = "0.0.3"
4
+ VERSION = "0.1"
5
5
 
6
6
  module Copernicium
7
7
  # Communication object that will pass commands to backend modules
@@ -9,7 +9,7 @@ module Copernicium
9
9
  # rev - revision indicator (commit #, branch name, HEAD, etc.)
10
10
  # repo - URL/path to a remote repository
11
11
  class UIComm
12
- attr_reader :command, :files, :rev, :cmt_msg, :repo, :opts
12
+ attr_accessor :command, :files, :rev, :cmt_msg, :repo, :opts
13
13
  def initialize(command: nil, files: nil, rev: nil,
14
14
  cmt_msg: nil, repo: nil, opts: nil)
15
15
  @cmt_msg = cmt_msg
@@ -21,16 +21,11 @@ module Copernicium
21
21
  end
22
22
  end
23
23
 
24
+ # todo - consider refactoring some UIComm usage
24
25
  # main driver for the command line user interface
25
26
  module Driver
26
27
  include Repos # needed to get branch and history info
27
28
  include Workspace # needed for most high level commands
28
- def setup
29
- Repos.setup
30
- RevLog.setup
31
- Workspace.setup
32
- end
33
-
34
29
  # Executes the required action for a given user command.
35
30
  #
36
31
  # Parameters:
@@ -55,36 +50,42 @@ module Copernicium
55
50
  # if no arguments given show help information
56
51
  pexit COMMAND_BANNER, 0 if (cmd == '-h' || cmd == 'help')
57
52
 
58
- # if not in a repo, warn them, tell how to create
59
- puts REPO_WARNING.yel if (noroot? && cmd != 'init')
60
-
61
- # Handle standard commands
62
- case cmd
63
- when 'init'
64
- init args
65
- when 'status'
66
- status args
67
- when 'history'
68
- history args
69
- when 'branch'
70
- branch args
71
- when 'clean'
72
- clean args
73
- when 'clone'
74
- clone args
75
- when 'commit'
76
- commit args
77
- when 'checkout'
78
- checkout args
79
- when 'merge'
80
- merge args
81
- when 'push'
82
- push args
83
- when 'pull'
84
- pull args
85
- else # handle an unrecognized argument, show help and exit
86
- pexit "Unrecognized command #{cmd}\n" + COMMAND_BANNER, 1
87
- end
53
+ # create the cn project, else already in one
54
+ if cmd == 'init'
55
+ noroot?? init(args) : puts(IN_REPO_WARNING.yel, getroot)
56
+ elsif noroot? # if not in a repo, warn them, tell how to create
57
+ puts NO_REPO_WARNING.yel
58
+ else # now, assume we are in a copernicum project
59
+ Workspace.setup
60
+
61
+ # Handle all other commands
62
+ case cmd
63
+ when 'status'
64
+ status args
65
+ when 'history'
66
+ history args
67
+ when 'branch'
68
+ branch args
69
+ when 'clean'
70
+ clean args
71
+ when 'clone'
72
+ clone args
73
+ when 'commit'
74
+ commit args
75
+ when 'checkout'
76
+ checkout args
77
+ when 'merge'
78
+ merge args
79
+ when 'push'
80
+ push args
81
+ when 'pull'
82
+ pull args
83
+ when 'init'
84
+ # fall through - init handled above, before case statement
85
+ else # handle an unrecognized argument, show help and exit
86
+ pexit "Unrecognized command #{cmd}\n" + COMMAND_BANNER, 1
87
+ end
88
+ end # case
88
89
  end # run
89
90
 
90
91
  # Print and exit with a specific code
@@ -95,114 +96,152 @@ module Copernicium
95
96
 
96
97
  # Get some info from the user when they dont specify it
97
98
  def get(info)
98
- puts "Note: #{info} not specified. Enter #{info} to continue."
99
+ puts "Note: #{info} not specified. Enter #{info} to continue.".yel
99
100
  gets.chomp # read a line from user, and return it
100
101
  end
101
102
 
102
103
  # create a new copernicium repository
103
104
  def init(args)
104
105
  if args.empty?
105
- Workspace.create_project
106
+ root = Workspace.create_project
106
107
  else # init into a folder
107
- Workspace.create_project args.first
108
+ root = Workspace.create_project args.first
108
109
  end
109
- puts "Created Copernicium repo in " + Dir.pwd.grn
110
+ puts "Created Copernicium repo: ".grn + root
110
111
  UIComm.new(command: 'init', opts: args)
111
112
  end
112
113
 
113
114
  # show the current repos status
114
115
  def status(args)
115
- ui = UIComm.new(command: 'status', opts: args)
116
116
  st = Workspace.status
117
- st[0].each { |f| puts "Added:\t".grn + f }
118
- st[1].each { |f| puts "Edited:\t".yel + f }
119
- st[2].each { |f| puts "Removed:\t".red + f }
120
- ui
121
- end
122
-
123
- # check whether a specific branch exists
124
- def isbranch?(branch)
125
- Repos.branches.include? branch
117
+ if st.all?(&:empty?)
118
+ puts "No changes since last commit | ".grn +
119
+ (Repos.current_snaps.last.time + ' | ').yel +
120
+ Repos.current_snaps.last.msg
121
+ else
122
+ st[0].each { |f| puts "Added: ".grn + f }
123
+ st[1].each { |f| puts "Edited: ".yel + f }
124
+ st[2].each { |f| puts "Removed: ".red + f }
125
+ end
126
126
  end
127
127
 
128
128
  # create and switch to a new branch
129
129
  def create_branch(branch)
130
130
  new_branch_hash = Repos.make_branch branch
131
131
  Repos.update_branch branch
132
- puts "Created new branch '#{branch}' with head #{new_branch_hash}".grn
132
+ puts "Created branch #{branch} ".grn + " with head #{new_branch_hash}"
133
133
  end
134
134
 
135
135
  def branch(args)
136
- branch = args.first
136
+ branch = args.shift
137
137
  if branch.nil? # show all branches
138
+ puts "Current: ".grn + Repos.current
138
139
  puts "Branches: ".grn + Repos.branches.join(' ')
140
+
139
141
  elsif branch == '-c' # try to create a new branch
140
- # If branch name not specified, get it from the user
141
- branch = args[1]
142
+ branch = args.first # get from the user
142
143
  branch = get "new branch name" if branch.nil?
143
-
144
- # Create and switch to the new branch
145
144
  create_branch branch
145
+
146
146
  elsif branch == '-r' # rename the current branch
147
- # If branch name not specified, get it from the user
148
- newname = args[1]
147
+ newname = args.first # get if not specified
149
148
  newname = get "new name for current branch" if newname.nil?
150
-
151
- oldname = Repos.branch
152
-
153
- # Create and switch to a new branch with the given name
149
+ oldname = Repos.current
154
150
  create_branch newname
155
-
156
- # Delete the branch with the old name
157
151
  Repos.delete_branch oldname
158
152
  puts "Deleted branch '#{oldname}'".grn
159
153
  puts "Renamed branch '#{oldname}' to '#{newname}'".grn
154
+
160
155
  elsif branch == '-d' # Delete the specified branch
161
- # If branch name not specified, get it from the user
162
- branch = args[1]
156
+ branch = args.first # If not specified, get
163
157
  branch = get "branch to delete" if branch.nil?
164
-
165
- # Do not delete the current branch
166
- if branch == Repos.branch
167
- pexit "Cannot delete the current branch!".red, 1
158
+ if branch == Repos.current
159
+ puts "Cannot delete the current branch!".red
160
+ else # Delete the specified branch
161
+ Repos.delete_branch branch
162
+ puts "Deleted branch '#{branch}'".grn
168
163
  end
169
164
 
170
- # Delete the specified branch
171
- Repos.delete_branch branch
172
- puts "Deleted branch '#{branch}'".grn
173
- elsif isbranch? branch # switch branch
174
- Repos.update_branch branch
175
- else # branch does not exist, create it, switch to it
165
+ elsif Repos.has_branch? branch # switch branch (branch <branch name>)
166
+ Repos.update_branch branch
167
+ puts "Current: ".grn + Repos.current
168
+
169
+ else # create it, switch to it
176
170
  Repos.create_branch branch
177
171
  end
178
172
  end
179
173
 
180
174
  def push(args)
181
- UIComm.new(command: 'push', opts: args)
182
- # todo - make call to pushpull, push remote
175
+ # Command usage is:
176
+ # cn push <user> <repo.host:/dir/of/repo> <branch-name>
177
+ #
178
+ # If username not given, get it from the user.
179
+ user = args[0]
180
+ if user.nil?
181
+ user = get "username for push"
182
+ # Make sure username is the first arg, since PushPull is expecting this.
183
+ args << user
184
+ end
185
+
186
+ remote = args[1]
187
+ remote = get "remote path to push to (format: <repo.host:/dir/of/repo>)" if remote.nil?
188
+
189
+ branchname = args[2]
190
+ branchname = get "remote branch to push to" if branchname.nil?
191
+
192
+ comm = UIComm.new(command: 'push', opts: args, repo: remote, rev: branchname)
193
+ # Do the push
194
+ PushPull.UICommandParser(comm)
195
+
196
+ comm
183
197
  end
184
198
 
185
199
  def pull(args)
186
- UIComm.new(command: 'pull', opts: args)
187
- #def pull(remote, branch', remote_dir)
188
- # todo - make call to pushpull, pull remote
200
+ # Command usage is:
201
+ # cn pull <user> <repo.host:/dir/of/repo> <branch-name>
202
+ #
203
+ # If username not given, get it from the user.
204
+ user = args[0]
205
+ if user.nil?
206
+ user = get "username for pull"
207
+ # Make sure username is the first arg, since PushPull is expecting this.
208
+ args << user
209
+ end
210
+
211
+ remote = args[1]
212
+ remote = get "remote path to pull from (format: <repo.host:/dir/of/repo>)" if remote.nil?
213
+
214
+ branchname = args[2]
215
+ branchname = get "remote branch to pull from" if branchname.nil?
216
+
217
+ comm = UIComm.new(command: 'pull', opts: args, repo: remote, rev: branchname)
218
+ # Do the pull
219
+ PushPull.UICommandParser(comm)
220
+
221
+ comm
189
222
  end
190
223
 
224
+ # Take in a revision (snaptshot) id or branch
225
+ # Doesnt support file checkouts at this time
191
226
  def checkout(args)
192
227
  if args.empty?
193
- rev = get 'branch or revision'
228
+ rev = get 'branch or commit id'
194
229
  else
195
230
  rev = args.shift
196
231
  files = args
197
232
  end
198
233
 
199
- # if it is a branch, get the last head of it
200
- rev = Repos.history(rev).last.id if isbranch? rev
234
+ # if 'head' keyword, grab the head
235
+ if rev == 'head'
236
+ rev = Repos.current_head
237
+ elsif Repos.has_branch? rev
238
+ branch = rev
239
+ rev = Repos.history(rev).last
240
+ end
201
241
 
202
242
  # call workspace checkout the given / branch
203
- ui = UIComm.new(command: 'checkout', rev: rev, files: files)
204
- Workspace.checkout(ui)
205
- ui
243
+ Workspace.checkout(UIComm.new(rev: rev, files: files))
244
+ Repos.update_branch branch unless branch.nil?
206
245
  end
207
246
 
208
247
  def clean(args = [])
@@ -212,15 +251,23 @@ module Copernicium
212
251
  end
213
252
 
214
253
  def clone(args)
215
- if args.empty?
216
- repo = get 'repo url to clone'
217
- else
218
- repo = args.first
254
+ # Command usage is:
255
+ # cn clone <user> <repo.host:/dir/of/repo>
256
+ user = args.first
257
+ if user.nil?
258
+ user = get "username for clone"
259
+ # Make sure username is first arg, since PushPull is expecting this.
260
+ args << user
219
261
  end
220
262
 
221
- # todo - actually clone remote locally
263
+ repo = args[1]
264
+ repo = get "repo url to clone (format: <repo.host:/dir/of/repo>)" if repo.nil?
265
+
266
+ comm = UIComm.new(command: 'clone', opts: args, repo: repo)
267
+ # Do the clone
268
+ PushPull.UICommandParser(comm)
222
269
 
223
- UIComm.new(command: 'clone', repo: repo)
270
+ comm
224
271
  end
225
272
 
226
273
  def commit(args)
@@ -239,27 +286,40 @@ module Copernicium
239
286
 
240
287
  # perform the commit, with workspace
241
288
  ui = UIComm.new(command: 'commit', files: files, cmt_msg: message)
242
- Workspace.commit(ui)
289
+ puts "New commit: ".grn + Workspace.commit(ui)
243
290
  ui
244
291
  end
245
292
 
246
293
  def history(args)
247
- puts Repos.history
294
+ Repos.current_snaps.reverse_each do |snap|
295
+ puts (snap.time + ' | ') .grn + (snap.id + ' | ').yel + snap.msg
296
+ end
248
297
  end
249
298
 
250
299
  def merge(args)
251
300
  if args.empty?
252
- puts 'I need a commit or branch to merge.'
253
301
  rev = get 'single commit or branch to merge'
254
- else # use given
302
+ else
255
303
  rev = args.first
256
- # get all branchs, see if arg is in it.
257
- # if so, look up snapshot of <branch> head
258
- # TODO - parse whether given arg is a branch name, else assume snap id
259
- # todo - call repos merge command
260
- # todo show conflicting files
261
- UIComm.new(command: 'merge', rev: rev)
262
304
  end
305
+
306
+ # If rev is a branch name, resolve it to a rev ID.
307
+ if Repos.has_branch? rev
308
+ rev = (Repos.history rev).last
309
+ end
310
+
311
+ conflicts = Workspace.merge(rev)
312
+
313
+ # If there were any conflicts, display them to the user.
314
+ if not conflicts.nil?
315
+
316
+ conflicts.each do |conflict|
317
+ puts " #{conflict}".red
318
+ end
319
+ end
320
+
321
+ # Don't return a UIComm object, since we didn't use one for any of the
322
+ # backend calls.
263
323
  end
264
324
  end # Driver
265
325
  end
data/lib/workspace.rb CHANGED
@@ -18,49 +18,58 @@ module Copernicium
18
18
  end
19
19
 
20
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
39
- end
21
+ def last() @history.last end
22
+ end # FileObj
23
+
40
24
 
25
+ # todo - @@files really should be a Hash, with paths as keys, then rather than
26
+ # using indices.
41
27
  module Workspace
42
28
  include Repos # needed for keeping track of history
43
- def Workspace.setup(bname = 'master')
44
- @@files = []
29
+ def Workspace.setup
45
30
  @@cwd = Dir.pwd
46
31
  @@root = (noroot?? @@cwd : getroot)
32
+ @@root.sub!(@@cwd, '.')
47
33
  @@copn = File.join(@@root, '.cn')
48
- Dir.mkdir(@@copn) unless Dir.exist?(@@copn)
49
- @@cwd.sub!(@@root, '.')
50
- @@branch = bname
34
+ @@snap = File.join(@@copn, 'snap')
35
+ @@revs = File.join(@@copn, 'revs')
51
36
  RevLog.setup @@root
52
37
  Repos.setup @@root
38
+ @@files = Repos.current_files
39
+ @@branch = Repos.current
53
40
  end
54
41
 
55
42
  # create a new copernicium project
56
- def Workspace.create_project(location = Dir.pwd)
57
- Dir.mkdir location if !File.exists? location
43
+ def Workspace.create_project(location = Dir.pwd, branch = 'master')
44
+ Dir.mkdir location unless Dir.exist? location
58
45
  Dir.chdir location
59
- errmsg = 'Copernicium folder (.cn) not found, could not create.'.red
60
- pexit errmsg, 1 if noroot?
46
+
47
+ # create our copernicium folders
48
+ @@copn = File.join('.', '.cn')
49
+ @@snap = File.join(@@copn, 'snap')
50
+ @@revs = File.join(@@copn, 'revs')
51
+ @@head = File.join(@@copn, 'branch')
52
+ @@hist = File.join(@@copn, 'history')
53
+ Dir.mkdir(@@copn) unless Dir.exist?(@@copn)
54
+ Dir.mkdir(@@snap) unless Dir.exist?(@@snap)
55
+ Dir.mkdir(@@revs) unless Dir.exist?(@@revs)
56
+
57
+ # make default branch, history
58
+ hist = YAML.dump({branch => []})
59
+ File.write @@head, branch
60
+ File.write @@hist, hist
61
+
62
+ if Dir.exist?(@@copn)
63
+ location # return where we made the repo
64
+ else # something has gone horribly wrong
65
+ raise 'Could not create or find a Copernicium folder (.cn).'.red
66
+ end
61
67
  end
62
68
 
63
- # find the root .cn folder
69
+
70
+ # PROJECT HELPERS
71
+ #
72
+ # find the root .cn folder, or return nil if it doesnt exist
64
73
  def getroot
65
74
  cwd = Dir.pwd
66
75
  max = 0
@@ -82,174 +91,136 @@ module Copernicium
82
91
  end
83
92
 
84
93
  # tells us whether we are in a cn project or not
85
- def noroot?
86
- getroot.nil?
87
- end
94
+ def noroot?() getroot.nil? end
88
95
 
89
- # workspace management
96
+
97
+ # WORKSPACE MANAGEMENT
98
+ #
90
99
  def Workspace.indexOf(x)
91
- index = -1
92
- @@files.each_with_index do |e,i|
93
- if e.path == x
94
- index = i
95
- break
96
- end
100
+ @@files.each_with_index do |f, i|
101
+ return i if f.path == x
97
102
  end
98
- index
99
- end
100
-
101
- # if include all the elements in list_files
102
- def Workspace.include?(files)
103
- files.each { |x| return false if indexOf(x) == -1 }
104
- true
103
+ nil # x is not included in @@files
105
104
  end
106
105
 
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
106
+ # get array of filenamess currently in workspace, except folders and .cn/*
107
+ # todo - include files and files that start with a dot (.)
108
+ def Workspace.working_files
109
+ (Dir[ File.join(@@root, '**', '*') ].reject do |p|
110
+ File.directory? p || p.include?(@@copn)
111
+ end).map do |p|
112
+ p.sub!(/^\.\//, '') # delete leading './'
111
113
  end
112
114
  end
113
115
 
114
- # Clear the current workspace
116
+ # Clear the workspace
115
117
  def Workspace.clear
116
118
  @@files.each{ |x| File.delete(x.path) }
117
119
  @@files = []
118
120
  end
119
121
 
120
- # reset first: delete them from disk and reset @@files
121
- # restore it with checkout() if we have had a branch name
122
- # or it is the initial state, no commit and no checkout
123
- # if list_files is nil, then rollback the list of files from the branch
124
- # or rollback to the entire branch head pointed
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
122
+ # take in file object, restore
123
+ def Workspace.checkout_file(file)
124
+ idx = indexOf(file.path)
125
+ idx.nil?? @@files << file : @@files[idx] = file
126
+ File.write(file.path, RevLog.get_file(file.last))
127
+ end
130
128
 
131
- # exit if the specified file is not in the workspace
132
- return -1 if (self.include? comm.files) == false
129
+ # takes in a snapshot id, sets workspace to that snapshot
130
+ def Workspace.checkout(comm = UIComm.new)
131
+ comm.rev = Repos.current_head if comm.rev.nil?
132
+ if ! Repos.has_snapshots? # dont checkout
133
+ puts 'No snapshots yet! Commit something before checkout.'.red
134
+ elsif comm.files.nil? # checkout everything
135
+ Repos.get_snapshot(comm.rev).files.each do |file|
136
+ Workspace.checkout_file file
137
+ end
138
+ else # just checkout given files
139
+ Repos.get_snapshot(comm.rev).files.select { |f|
140
+ comm.files.include? f.path }.each do |file|
141
+ Workspace.checkout_file file
142
+ end
143
+ end
144
+ end
133
145
 
134
- # the actual action, delete all of them from the workspace first
146
+ # reset repo back to a given state
147
+ def Workspace.clean(comm = UIComm.new)
148
+ if comm.files.nil? # reset everything
149
+ Workspace.clear
150
+ else # files are not nil
135
151
  comm.files.each do |x|
136
- File.delete(x)
137
152
  idx = indexOf(x)
138
- @@files.delete_at(idx) if !idx == -1
153
+ if idx.nil?
154
+ puts "Cannot clean #{x}:".yel + " does not exist in snapshot"
155
+ else
156
+ @@files.delete_at(idx)
157
+ File.delete(x)
158
+ end
139
159
  end
140
-
141
- # if we have had a branch, first we get the latest snapshot of it
142
- # and then checkout with the restored version of them
143
- checkout
160
+ end
161
+ Workspace.checkout comm # cleanse state
162
+ end
163
+
164
+ def Workspace.commit_file(x)
165
+ puts 'Committing: '.grn + x
166
+ added, edits, remov = Workspace.status
167
+ if added.include? x
168
+ hash = RevLog.add_file(x, File.read(x))
169
+ @@files.push(FileObj.new x, [hash])
170
+ elsif edits.include? x
171
+ hash = RevLog.add_file(x, File.read(x))
172
+ @@files[indexOf x].history << hash
173
+ elsif remov.include? x
174
+ @@files.delete_at(indexOf x)
175
+ else
176
+ puts 'Failed, no changes: '.yel + x
144
177
  end
145
178
  end
146
179
 
147
180
  # commit a list of files or the entire workspace to make a new snapshot
148
- def Workspace.commit(comm)
181
+ def Workspace.commit(comm = UIComm.new)
149
182
  if comm.files.nil? # commit everything
150
- Workspace.ws_files.each do |x|
151
- if indexOf(x) == -1
152
- content = readFile(x)
153
- hash = RevLog.add_file(x, content)
154
- fobj = FileObj.new(x, [hash,])
155
- @@files.push(fobj)
156
- else # file exists
157
- content = readFile(x)
158
- hash = RevLog.add_file(x, content)
159
- if @@files[indexOf(x)].history[-1] != hash
160
- @@files[indexOf(x)].history << hash
161
- end
162
- end
183
+ Workspace.status.each do |st|
184
+ st.each { |x| Workspace.commit_file x }
163
185
  end
164
- else # just commit certain files
165
- end
166
- Repos.make_snapshot(@@files) # return snapshot id
167
- end
168
-
169
- def Workspace.checkout(comm)
170
- =begin
171
- # just support revisions for now
172
- # if argu is an Array Object, we assume it is a list of files to be added
173
- # # to the workspace # we add the list of files to @@files regardless
174
- # whether it has been in # it. that means there may be multiple versions
175
- # of a file.
176
- unless comm.files.nil?
177
- list_files = comm.files
178
- returned_snapshot = Repos.get_snapshot(Repos.history.last)
179
- list_files_last_commit = returned_snapshot.files
180
- list_files_last_commit.each do |x|
181
- if list_files.include? x.path
182
- content = RevLog.get_file(x.history.last)
183
- idx = indexOf(x.path)
184
- if idx == -1
185
- @@files << x
186
- else
187
- @@files[idx] = x
188
- end
189
- writeFile(x.path, content)
186
+ else comm.files.each do |x|
187
+ if File.exist? x
188
+ Workspace.commit_file(x)
189
+ else
190
+ puts "Cannot commit #{x}:".yel + " file does not exist"
190
191
  end
191
192
  end
192
- else # if argu is not an Array, we assume it is a String, representing the
193
- end
194
- =end
195
-
196
- clear # reset workspace
197
-
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
-
210
- # object and finally push all files of it to the # workspace
211
- snap.files.each do |file|
212
- idx = indexOf(file.path)
213
- puts file
214
- if idx == -1
215
- @@files << file
216
- else
217
- @@files[idx] = file
218
- end
219
- content = RevLog.get_file(file.history.last)
220
- writeFile(file.path, content)
221
193
  end
194
+ # todo - handle case of no changes, dont make a snapshot
195
+ Repos.make_snapshot(@@files, comm.cmt_msg) # return snapshot id
222
196
  end
223
197
 
224
198
  # wrapper for Repos merge_snapshot, update workspace with result
199
+ # returns [{path => content}, [conflicting paths]]
200
+ # todo update workspace with result
201
+ # todo return any conflicting files
225
202
  def Workspace.merge(id)
226
- # returns [{path => content}, [conflicting paths]]
227
203
  Repos.merge_snapshot(id)
228
-
229
- # todo update workspace with result
230
- # todo return any conflicting files
231
204
  end
232
205
 
233
206
  def Workspace.status
234
207
  added = []
235
208
  edits = []
236
209
  remov = []
237
- ws_files.each do |f|
210
+ working_files.each do |f|
238
211
  idx = indexOf(f)
239
- if idx == -1 # new file
212
+ if idx.nil? # new file
240
213
  added << f
241
- else # changed file?
242
- x2 = readFile(f) # get the current version
243
- x1 = RevLog.get_file(@@files[idx].history.last)
244
- edits << f if x1 != x2
214
+ else # changed file
215
+ edits << f if File.read(f) != RevLog.get_file(@@files[idx].last)
245
216
  end
246
217
  end
247
218
 
248
219
  # any deleted files from the last commit?
249
- @@files.each { |f| remov << f.path unless (ws_files.include? f.path) }
220
+ remov = @@files.map(&:path) - working_files
250
221
 
251
222
  [added, edits, remov]
252
223
  end
253
- end
254
- end
224
+ end # Workspace
225
+ end # Copernicium
255
226