copernicium 0.0.3 → 0.1

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
  SHA1:
3
- metadata.gz: dba707602c7f877affc0641be13bd03bcf0148da
4
- data.tar.gz: 62c8ea960286bcf26035bc94fe437756efa88fdd
3
+ metadata.gz: 2f146d401e84291f4f694ae9beef84ad4ea96616
4
+ data.tar.gz: 4771750c664405faebaab54e82fba71988b22c98
5
5
  SHA512:
6
- metadata.gz: 6c07b40b065382971669a01444f0204e1ddef79ada08fb599b56b6b04d1ef9c6433a392be840823d7ba2ed86e5d66669564d5b5dedad4ef4591e5739deb91575
7
- data.tar.gz: e27a5d5060d7a074e031b44034a6ad735ee8a74c692f5a951d88d38eb5539fd3881fc8c9b6b9a5caf838e7bfb9949657e95c127c277e2423de9c4ce09e76e194
6
+ metadata.gz: 11a03dc13faefeebc2e6070b2fd08da6d83ef658b5e543c1fb5340e02da2f4fca8d54651686ee1e309d83c8234a7c7c9c4fbd9cf86a346e51681e457f7c11e44
7
+ data.tar.gz: dffba98e39a8189a75f4cfde1ae9fd998d209dd61e87f8c6af7bb94735b95ff60a82094551fec411b1991140b17fb4933dbd09ca16428bb5fc3b148e9d718ffa
data/bin/cn CHANGED
@@ -6,6 +6,5 @@ require_relative "../lib/required.rb"
6
6
 
7
7
  include Copernicium::Driver
8
8
 
9
- Copernicium::Driver.setup
10
9
  Copernicium::Driver.run(ARGV)
11
10
 
data/lib/RevLog.rb CHANGED
@@ -26,12 +26,29 @@
26
26
 
27
27
  module Copernicium
28
28
  module RevLog
29
+ # called when including RevLog
30
+ # dont make any new folders
29
31
  def RevLog.setup(root = Dir.pwd)
30
- @@root = root
31
- @@cop_path = File.join(@@root, '.cn')
32
+ @@cop_path = File.join(root, '.cn')
32
33
  @@rev_path = File.join(@@cop_path, 'revs')
33
- @@log_path = File.join(@@cop_path, 'logmap.yaml')
34
- @@hash_path = File.join(@@cop_path, 'hashmap.yaml')
34
+ @@log_path = File.join(@@cop_path, 'logmap')
35
+ @@hash_path = File.join(@@cop_path, 'hashmap')
36
+ if File.exist?(@@log_path) && File.exist?(@@hash_path)
37
+ @@logmap = hash_array.merge(YAML.load_file(@@log_path))
38
+ @@hashmap = hash_array.merge(YAML.load_file(@@hash_path))
39
+ else
40
+ @@logmap = hash_array
41
+ @@hashmap = hash_array
42
+ end
43
+ end
44
+
45
+ # called when running the unit tests
46
+ # create a new folder for testing
47
+ def RevLog.setup_tester(root = Dir.pwd)
48
+ @@cop_path = File.join(root, '.cn')
49
+ @@rev_path = File.join(@@cop_path, 'revs')
50
+ @@log_path = File.join(@@cop_path, 'logmap')
51
+ @@hash_path = File.join(@@cop_path, 'hashmap')
35
52
  Dir.mkdir(@@cop_path) unless Dir.exist?(@@cop_path)
36
53
  Dir.mkdir(@@rev_path) unless Dir.exist?(@@rev_path)
37
54
  if File.exist?(@@log_path) && File.exist?(@@hash_path)
@@ -74,11 +91,11 @@ module Copernicium
74
91
 
75
92
 
76
93
  def RevLog.get_file(id)
77
- file_path = File.join(@@rev_path, id)
94
+ file_path = File.join(@@rev_path, id.to_s)
78
95
  if File.exist? file_path
79
96
  File.open(file_path, 'r') { |f| return f.read }
80
97
  else
81
- raise Exception, 'Invalid id!'
98
+ raise Exception, 'RevLog: invalid file revision id!'.red
82
99
  end
83
100
  end
84
101
 
data/lib/banners.rb CHANGED
@@ -7,6 +7,7 @@ class String
7
7
  end
8
8
 
9
9
  def reset() colorize(0,0) end
10
+ def ugn() colorize(32,4) end
10
11
  def blu() colorize(34,0) end
11
12
  def yel() colorize(33,0) end
12
13
  def grn() colorize(32,0) end
@@ -15,32 +16,35 @@ end
15
16
 
16
17
  # create large constant strings
17
18
 
19
+ TOP_BANNER = 'Copernicium (cn) - simple DVCS'.ugn
20
+
18
21
  HELP_BANNER = <<-EOS
19
- Copernicium (cn) - simple DVCS
22
+ #{TOP_BANNER}
20
23
 
21
- Starting out:
24
+ #{'Starting out:'.grn}
22
25
  init - create a new repository
23
26
  status - check repo status
27
+ history - show repo commits
24
28
  help - show more commands
25
29
  EOS
26
30
 
27
31
 
28
32
  COMMAND_BANNER = <<-EOS
29
33
  #{HELP_BANNER}
30
- Commands:
31
- clean [files]
34
+ #{'Commands'.grn}
35
+ clean [files] [commit/branch]
32
36
  commit [files] -m <message>
33
- checkout [files] <commit id>
34
- branch [opt] [branchname]
37
+ checkout <commit id> [files]
38
+ branch [opt] [branch]
35
39
  -r | rename current branch
36
40
  -c | create a new branch
37
41
  -d | delete a branch
38
42
  merge <branch name>
39
43
  clone <remote url>
40
- push [remote name]
41
- pull [remote name]
44
+ push <remote user>
45
+ pull <remote user>
42
46
 
43
- Options:
47
+ #{'Options'.grn}
44
48
  -v: print version
45
49
  -h: show help
46
50
 
@@ -48,6 +52,16 @@ Note: [optional] <required>
48
52
 
49
53
  EOS
50
54
 
51
- REPO_WARNING = <<-EOS
55
+
56
+ IN_REPO_WARNING = <<-EOS
57
+ You are currently in a Copernicium repo... `cn init` is not valid here!
58
+ EOS
59
+
60
+ NO_REPO_WARNING = <<-EOS
52
61
  You are not currently in a Copernicium repo... run `cn init` to create one!
53
62
  EOS
63
+
64
+ AUTHOR_BANNER = <<-EOS
65
+ todo
66
+ EOS
67
+
data/lib/pushpull.rb CHANGED
@@ -2,47 +2,56 @@
2
2
  # CSC 253
3
3
  # PushPull Module
4
4
  # November 6, 2015
5
- require 'net/ssh'
6
- require 'net/scp'
7
5
 
8
6
 
9
7
  module Copernicium
10
- class PushPull
8
+ # How to use for Push, Pull and Clone:
9
+ # Push - cn push <user> <repo.host:/dir/of/repo> <branch-name>
10
+ # Pull - cn pull <user> <repo.host:/dir/of/repo> <branch-name>
11
+ # Clone - cn clone <user> <repo.host:/dir/of/repo>
12
+ class UIComm
13
+ end
11
14
 
15
+ module PushPull
16
+ include Repos # needed for calling their methods
12
17
  # Chris's edit
13
18
  # Takes in Ethan's UICommandCommunicator object and calls
14
19
  # a method based on the command
15
- def UICommandParser(ui_comm)
20
+ #
21
+ # Fields in UIComm and what they are for me:
22
+ # @opts - user
23
+ # @repo - repo.host:/path/to/repo
24
+ # @rev - branch name
25
+ def PushPull.UICommandParser(ui_comm)
16
26
  case ui_comm.command
17
27
  when "clone"
18
- #clone()
19
- when "merge"
20
- # do merge stuff
28
+ clone(ui_comm.repo, ui_comm.opts.first)
21
29
  when "push"
22
- #push(ui_comm.)
30
+ push(ui_comm.repo, ui_comm.rev, ui_comm.opts.first)
23
31
  when "pull"
24
- #pull(ui_comm.branchname,)
32
+ pull(ui_comm.repo, ui_comm.rev, ui_comm.opts.first)
25
33
  else
26
- print "Error: Invalid command supplied to PushPull!" # Bad error handling, will fix later
27
- return nil
34
+ raise "Error: Invalid command supplied to PushPull".red
28
35
  end
29
36
  end
30
37
 
31
38
  # Function: connect()
32
39
  #
33
40
  # Description:
34
- # a net/ssh wrapper, if given a block will execute block on server, otherwise tests connection.
41
+ # a net/ssh wrapper, if given a block will execute block on server,
42
+ # otherwise tests connection.
35
43
  #
36
44
  # remote: the remote server, formatted "my.server"
37
45
  # user: the user to connect as
38
- def connect(remote, user, &block)
46
+ def PushPull.connect(remote, user, &block)
39
47
  exit_code = false
48
+ puts 'inside PushPull connect'.blu
40
49
  if(block.nil?)
41
50
  begin
51
+ puts 'inside PushPull connect nil block path'.grn
42
52
  Net::SSH.start(remote, user) do |ssh|
43
- result = ssh.exec!("echo Successful Connection!")
44
- puts result
45
- exit_code = true;
53
+ puts ssh.exec!("echo Successful Connection!")
54
+ exit_code = true
46
55
  end
47
56
  rescue
48
57
  begin
@@ -54,12 +63,11 @@ module Copernicium
54
63
  puts
55
64
 
56
65
  Net::SSH.start(remote, user, :password => passwd) do |ssh|
57
- result = ssh.exec!("echo Successful Connection!")
58
- puts result
59
- exit_code = true;
66
+ puts ssh.exec!("echo Successful Connection!")
67
+ exit_code = true
60
68
  end
61
69
  rescue
62
- puts "Unsuccessful Connection"
70
+ raise "Unsuccessful Connection".red
63
71
  end
64
72
  end
65
73
  else
@@ -67,7 +75,7 @@ module Copernicium
67
75
  Net::SSH.start(remote, user) do |ssh|
68
76
  yield ssh
69
77
  end
70
- exit_code = true;
78
+ exit_code = true
71
79
  rescue
72
80
  begin
73
81
  print "Username for remote repo: "
@@ -80,9 +88,9 @@ module Copernicium
80
88
  Net::SSH.start(remote, user, :password => passwd) do |ssh|
81
89
  yield ssh
82
90
  end
83
- exit_code = true;
91
+ exit_code = true
84
92
  rescue
85
- puts "Unable to execute command!"
93
+ raise "Unable to execute command!".red
86
94
  end
87
95
  end
88
96
  end
@@ -94,9 +102,9 @@ module Copernicium
94
102
  # Description:
95
103
  # a net/scp wrapper to copy to server
96
104
  #
97
- # remote: the remote server and directory to pull from, formatted "my.server:/the/location/we/want"
105
+ # remote: the remote server and directory to pull from, formatted "my.server"
98
106
  # user: the user to connect as
99
- def transfer(remote, user, &block)
107
+ def PushPull.transfer(remote, user, &block)
100
108
  exit_code = false
101
109
  begin
102
110
  Net::SCP.start(remote, user) do |scp|
@@ -117,7 +125,7 @@ module Copernicium
117
125
  end
118
126
  exit_code = true
119
127
  rescue
120
- puts "Unable to upload file!"
128
+ raise "Unable to upload file!".red
121
129
  end
122
130
  end
123
131
  end
@@ -131,7 +139,7 @@ module Copernicium
131
139
  # dest: what we want of the branch, not needed for blocked calls
132
140
  # local: where we want to put the file, not needed for blocked calls
133
141
  # user: the user to connect as
134
- def fetch(remote, dest, local, user, &block)
142
+ def PushPull.fetch(remote, dest, local, user, &block)
135
143
  exit_code = false
136
144
  if(block.nil?)
137
145
  begin
@@ -153,7 +161,7 @@ module Copernicium
153
161
  end
154
162
  exit_code = true
155
163
  rescue
156
- puts "Unable to fetch file(s)!"
164
+ raise "Unable to fetch file(s)!".red
157
165
  end
158
166
  end
159
167
  else
@@ -176,7 +184,7 @@ module Copernicium
176
184
  end
177
185
  exit_code = true
178
186
  rescue
179
- puts "Unable to fetch file(s)!"
187
+ raise "Unable to fetch file(s)!".red
180
188
  end
181
189
  end
182
190
  end
@@ -191,9 +199,12 @@ module Copernicium
191
199
  # remote: the remote server and directory to push to, formatted "my.server:/the/location/we/want"
192
200
  # branch: the branch that we are pushing to
193
201
  # user: the user to connect as
194
- def push(remote, branch, user)
202
+ def PushPull.push(remote, branch, user)
195
203
  # check contents of folder for .cn, fail if not present and remove otherwise
196
- dest = remote.split(':');
204
+ dest = remote.split(':')
205
+ if(dest.length != 2)
206
+ dest = dest.insert(0, "cycle3.csug.rochester.edu")
207
+ end
197
208
  contents = Dir.entries(Dir.pwd)
198
209
  if(!content.include? '.cn')
199
210
  puts 'failed to push to remote, not an initialized Copernicium repo'
@@ -202,6 +213,10 @@ module Copernicium
202
213
  contents = contents.delete_if{|x| (x.eql? '.cn') || (x.eql? '.') || (x.eql? '..')}
203
214
  end
204
215
 
216
+ # todo - check if branch exists on the remote server
217
+ # if so, dump contents and save a new commit saying pushed from user
218
+ # else, create branch and dump files, then make a new commit saying
219
+ # created branch
205
220
  connect(dest[0], user) do |session|
206
221
  session.exec!("cd #{dest[1]}")
207
222
  result = session.exec!('ls .cn')
@@ -222,9 +237,9 @@ module Copernicium
222
237
  # Commit the files and merge the branches
223
238
  session.exec!('cn add .')
224
239
  session.exec!('cn commit -m \'Temp commit for push\'')
225
- session.exec!('cn checkout #{branch}')
240
+ session.exec!("cn checkout #{branch}")
226
241
  session.exec!("cn merge .temp_push_#{user}")
227
- session.exec!("cn branch -r temp_push_#{user}")
242
+ session.exec!("cn branch -d .temp_push_#{user}")
228
243
  end
229
244
 
230
245
  puts "Successfully pushed to #{remote}"
@@ -238,10 +253,13 @@ module Copernicium
238
253
  # remote: the remote server and directory to push to, formatted "my.server:/the/location/we/want"
239
254
  # branch: the branch that we are pushing to
240
255
  # user: the user to connect as
241
- def pull(remote, branch, user)
256
+ def PushPull.pull(remote, branch, user)
242
257
  # check contents of folder for .cn, fail if not present and remove otherwise
243
258
  crbr = Repos.new.current_branch() # assumed function
244
- dest = remote.split(':');
259
+ dest = remote.split(':')
260
+ if(dest.length != 2)
261
+ dest = dest.insert(0, "cycle3.csug.rochester.edu")
262
+ end
245
263
  contents = Dir.entries(Dir.pwd)
246
264
  if(!content.include? '.cn')
247
265
  puts 'failed to pull from remote, not an initialized Copernicium repo'
@@ -262,6 +280,7 @@ module Copernicium
262
280
  session.exec!("cn checkout #{branch}")
263
281
  collection = session.exec!("ls | cat")
264
282
  end
283
+
265
284
  collection = collection.split('\n')
266
285
  if(!collection.include? '.cn')
267
286
  puts 'failed to pull from remote, remote folder not an initialized Copernicium repo'
@@ -280,7 +299,7 @@ module Copernicium
280
299
  system "cn commit -m \'Temp commit for pull\'"
281
300
  system "cn checkout #{crbr}"
282
301
  system "cn merge .temp_pull_#{user}"
283
- system "cn branch -r .temp_pull_#{user}"
302
+ system "cn branch -d .temp_pull_#{user}"
284
303
  puts "Successfully pulled from #{remote}"
285
304
  end
286
305
 
@@ -291,18 +310,21 @@ module Copernicium
291
310
  #
292
311
  # remote: the remote server and directory to push to, formatted "my.server:/the/location/we/want"
293
312
  # user: the user to connect as
294
- def clone(remote, user = nil)
313
+ def PushPull.clone(remote, user = nil)
295
314
  exit_code = false
296
315
  dest = remote.split(':')
316
+ if(dest.length != 2)
317
+ dest = dest.insert(0, "cycle3.csug.rochester.edu")
318
+ end
297
319
  begin
298
- fetch(dest[0], dest[1], Dir.pwd, user)
299
- exit_code = true;
320
+ fetch(dest[0], dest[1], Dir.pwd, user)
321
+ exit_code = true
300
322
  rescue
301
- puts "Failed to clone the remote branch!"
323
+ puts "Failed to clone the remote branch!".red
302
324
  end
303
325
 
304
326
  return exit_code
305
327
  end
306
-
307
328
  end
308
329
  end
330
+
data/lib/repos.rb CHANGED
@@ -28,104 +28,115 @@
28
28
  # delete_branch: delete a branch
29
29
  # in - branch name
30
30
  # out - exit status code
31
+ # note: @@history is a hash array of snapshot ids, which is saved as
32
+ # .cn/history to persist between calls to the copernicium tool
31
33
 
32
34
  module Copernicium
33
35
  class Snapshot
34
- attr_accessor :id, :files
35
- # id is computed after creation
36
- def initialize(files = [])
37
- @@files = files
38
- @@id = id
36
+ attr_accessor :id, :files, :msg, :date
37
+ # todo - doesnt support merging. consider adding parents field
38
+ def initialize(files = [], msg = 'null', date = nil)
39
+ @date = (date.nil?? DateTime.now : date)
40
+ @files = files
41
+ @msg = msg
42
+
43
+ # hash self and assign as the id value
44
+ @id = Digest::SHA256.hexdigest Marshal.dump(self)
45
+ end
46
+
47
+ def time
48
+ @date.strftime("%m/%d/%Y %I:%M%p")
39
49
  end
40
50
  end
41
51
 
42
52
  module Repos
43
53
  include RevLog # needs diffing and merging
54
+ # read in file of snapshot ids (.cn/history)
44
55
  # check the current branch (.cn/branch)
45
- # read in file of snapshots (.cn/history)
46
- def Repos.setup(root = Dir.pwd, branch = 'master')
47
- @@root = root
48
- @@copn = File.join(@@root, '.cn')
49
- @@repo = File.join(@@copn, 'repo')
50
- @@bpath = File.join(@@repo, 'branch')
51
- @@spath = File.join(@@repo, 'history')
52
- Dir.mkdir(@@copn) unless Dir.exist?(@@copn)
53
- Dir.mkdir(@@repo) unless Dir.exist?(@@repo)
54
-
55
- # check if files exist, read them
56
- if File.exist?(@@spath) && File.exist?(@@bpath)
57
- @@branches = Marshal.load readFile(@@spath)
58
- @@branch = readFile(@@bpath)
59
- else # use defaults
60
- @@branches = {branch => []}
61
- @@branch = branch
62
- end
63
-
64
- # check if files exist, read them
65
- if File.exist?(@@spath) && File.exist?(@@bpath)
66
- @@branches = Marshal.load readFile(@@spath)
67
- @@branch = readFile(@@bpath)
68
- else # use defaults
69
- @@branches = {branch => []}
70
- @@branch = branch
71
- end
56
+ def Repos.setup(root = Dir.pwd)
57
+ @@copn = File.join(root, '.cn')
58
+ @@snap = File.join(@@copn, 'snap')
59
+ @@head = File.join(@@copn, 'branch')
60
+ @@hist = File.join(@@copn, 'history')
61
+
62
+ # read history from disk
63
+ @@branch = File.read(@@head)
64
+ @@history = YAML.load File.read(@@hist)
65
+ @@brsnaps = Repos.get_branch @@branch
72
66
  end
73
67
 
74
- # helper methods for file IO
75
- def writeFile(path, content)
76
- f = open(path, 'w')
77
- f.write(content)
78
- f.close
79
- end
68
+ # unit testing version - create folders for this code
69
+ def Repos.setup_tester(root = Dir.pwd, branch = 'master')
70
+ @@copn = File.join(root, '.cn')
71
+ @@snap = File.join(@@copn, 'snap')
72
+ @@revs = File.join(@@copn, 'revs')
73
+ @@head = File.join(@@copn, 'branch')
74
+ @@hist = File.join(@@copn, 'history')
75
+
76
+ # create folders for testing this module
77
+ Dir.mkdir(@@copn) unless Dir.exist?(@@copn)
78
+ Dir.mkdir(@@snap) unless Dir.exist?(@@snap)
79
+ Dir.mkdir(@@revs) unless Dir.exist?(@@revs)
80
80
 
81
- # helper methods for file IO
82
- def readFile(path)
83
- f = open(path, 'r')
84
- txt = f.read
85
- f.close
86
- txt
81
+ # default new
82
+ @@branch = branch
83
+ @@history = {branch => []}
84
+ RevLog.setup
87
85
  end
88
86
 
89
- # check if any snapshots exist, if not exit
90
- def Repos.has_snapshots?
91
- ! Repos.history(@@branch).empty?
87
+ # check whether a specific branch exists
88
+ def Repos.has_branch?(branch)
89
+ Repos.branches.include? branch
92
90
  end
93
91
 
94
- def Repos.hash_array
95
- Hash.new {[]}
92
+ # check if any snapshots exist for the current branch
93
+ def Repos.has_snapshots?
94
+ not Repos.history(@@branch).empty?
96
95
  end
97
96
 
98
- # returns the hash of an object
97
+ # Return hash of an object
99
98
  def Repos.hasher(obj)
100
99
  Digest::SHA256.hexdigest Marshal.dump(obj)
101
100
  end
102
101
 
103
- # Return string array of what branches we have
104
- def Repos.branches
105
- @@branches.keys
102
+ # helper to add snap to history
103
+ def Repos.update_history
104
+ File.write @@hist, YAML.dump(@@history) # write history
105
+ end
106
+
107
+ # Return array of snapshot IDs
108
+ def Repos.history(branch = nil)
109
+ if branch.nil? # return a list of unique all commits
110
+ (@@history.inject([]) { |o, x| o + x.last }).uniq
111
+ elsif Repos.has_branch? branch # just return the stored history
112
+ @@history[branch]
113
+ else # no commits yet
114
+ []
115
+ end
106
116
  end
107
117
 
108
- # Create and return snapshot
109
- def Repos.make_snapshot(files = [])
110
- snap = Snapshot.new(files)
111
- snap.id = hasher snap
112
- @@branches[@@branch] << snap
118
+ # Create and return snapshot id
119
+ def Repos.make_snapshot(files = [], msg = 'nil')
120
+ snap = Snapshot.new(files, msg)
121
+ @@history[@@branch] << snap.id
113
122
 
114
123
  # Update snaps file
115
- update_snap
124
+ update_snap snap
125
+ update_history
116
126
  snap.id
117
127
  end
118
128
 
119
129
  # helper to write a snapshot, saving a new commit
120
- def Repos.update_snap
121
- writeFile @@spath, Marshal.dump(@@branches)
130
+ # marshal serializes the class instance to a string
131
+ def Repos.update_snap(snap)
132
+ File.write File.join(@@snap, snap.id), YAML.dump(snap)
122
133
  end
123
134
 
124
- # todo - Check to make sure id is from a different branch
125
135
  # Merge the target snapshot into HEAD snapshot of the current branch
136
+ # todo - Check to make sure id is from a different branch
126
137
  def Repos.merge_snapshot(id)
127
138
  # run diff to get conflicts
128
- current = @@branches[@@branch].last
139
+ current = @@history[@@branch].last
129
140
  difference = diff_snapshots(current.id, id)
130
141
  conflicts = difference[1]
131
142
 
@@ -139,30 +150,20 @@ module Copernicium
139
150
 
140
151
  # Find snapshot and return snapshot from id
141
152
  def Repos.get_snapshot(id)
142
- @@branches.keys.each do |br|
143
- @@branches[br].each do |sn|
144
- return sn if sn.id == id
153
+ @@history.each do |branch, snapids|
154
+ snapids.each do |snapid|
155
+ return YAML.load_file(File.join(@@snap, id)) if snapid == id
145
156
  end
146
157
  end
147
158
 
148
- raise "Snapshot not found in this repo."
149
- end
150
-
151
- # Return array of snapshot IDs
152
- def Repos.history(branch = nil)
153
- snapids = []
154
- if branch.nil?
155
- @@branches[@@branch].each { |x| snapids << x.id }
156
- elsif
157
- @@branches[branch].each { |x| snapids << x.id }
158
- end
159
- snapids
159
+ raise "Repos: snapshot #{id} not found in this repo.".red
160
160
  end
161
161
 
162
162
  # Find snapshot, delete from snaps/memory
163
163
  def Repos.delete_snapshot(id)
164
- @@branches[@@branch].delete_if { |x| x.id == id }
165
- update_snap
164
+ @@history[@@branch].delete_if { |x| x == id }
165
+ File.delete File.join(@@snap, id)
166
+ update_history
166
167
  end
167
168
 
168
169
  #diff_snapshots needs to catch both files in snap1 that aren’t and snap2 and
@@ -190,8 +191,8 @@ module Copernicium
190
191
  id2 = files2[f2_index].last
191
192
 
192
193
  # get file contents
193
- content1 = get_file(id1)
194
- content2 = get_file(id2)
194
+ content1 = RevLog.get_file(id1)
195
+ content2 = RevLog.get_file(id2)
195
196
 
196
197
  # check if the file content for each path is the same
197
198
  if content1 == content2
@@ -214,23 +215,52 @@ module Copernicium
214
215
  array1.select { |x| !array2.any? { |y| x == y } }
215
216
  end
216
217
 
217
- # BRANCHING
218
- def current() @@branches end
219
218
 
220
- # Return hash ID of new branch
219
+ # ADDITIONAL MODULE ACCESS INTERFACES
220
+ #
221
+ # return the current branch we are on now (string name)
222
+ def current() @@branch end
223
+
224
+ # return the snap id of branch head
225
+ def current_head() @@history[@@branch].last end
226
+
227
+ # return the array of our branches snapshots
228
+ def current_snaps() @@brsnaps end
229
+
230
+ # return the files in the latest snapshot
231
+ def current_files() Repos.has_snapshots?? @@brsnaps.last.files : [] end
232
+
233
+ # Return string array of what branches we have
234
+ def branches() @@history.keys end
235
+
236
+
237
+ # BRANCHING FUNCTIONALITY
238
+ #
239
+ # Create and return hash ID of new branch
221
240
  def Repos.make_branch(branch)
222
- @@branches[branch] = @@branches[@@branch]
241
+ @@history[branch] = @@history[@@branch].inject([]) { |n, o| n << o }
223
242
  @@branch = branch
224
- hasher @@branches[branch]
243
+ update_history
244
+ hasher @@history[branch]
225
245
  end
226
246
 
227
247
  def Repos.update_branch(branch)
228
- writeFile(@@bpath, branch)
248
+ File.write(@@head, branch)
229
249
  @@branch = branch
230
250
  end
231
251
 
252
+ # From the branch names, get the history, ant build the array of snapshots
253
+ # This is different than the history branch which just contains ids
254
+ def Repos.get_branch(branch)
255
+ Repos.history(branch).inject([]) do |hist, snapid|
256
+ hist << Repos.get_snapshot(snapid)
257
+ end
258
+ end
259
+
260
+ # todo - also delete snapshots unique to this branch
232
261
  def Repos.delete_branch(branch)
233
- @@branches.delete(branch)
262
+ @@history.delete(branch)
263
+ update_history
234
264
  end
235
265
  end # Repos
236
266
  end # Copernicium