copernicium 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cffaf1f93a4556043ac0a484ef0e10c24f7ea692
4
- data.tar.gz: 41ece5cd459baf3690d2701e153b232293f3a433
3
+ metadata.gz: c7ec43a07b4f3d15b9d556319b6d7afd72e5cc7f
4
+ data.tar.gz: ed07ade71e83ac560723852e8b81bfee6dc58946
5
5
  SHA512:
6
- metadata.gz: 215e18ebaa93fb182b3ea4407bbf266cee5004baef77e1ff195cbcd32061a7314e7c49b02b1f762482c950436c495b802f302d8d2bf976c0b17518bd17d5444c
7
- data.tar.gz: ebf39e146f63bc17bc70de329ea98c2b5f0cbea79f6a4aa620f9f21719f96879ea7737864e34a2d747ee75861ba2c5f9daad1c9a6f55c81a509a6a95a324f265
6
+ metadata.gz: a7f2f92fbb43d8d08babd1d201396ca896f7e4e9418d8ea3c6fd1ae2dc4e0df6a2b52c9899ac57e58d1bc3578ceaa6b1794d3efbb1a08bafd4d278fef50e2062
7
+ data.tar.gz: 563d55b11341b39786aeea08cf535677476c7bc96ba6d08ea8c4c2577a5c499baa1c52a2655eb41eba4b31f85f2e565bfbb9f7afe609b8cc5a440e8a412780b8
data/lib/RevLog.rb CHANGED
@@ -26,37 +26,35 @@
26
26
 
27
27
  module Copernicium
28
28
  class RevLog
29
- def initialize(project_path)
30
- @project_path = project_path
31
- @cop_path = File.join(project_path, ".cop")
32
- @log_path = File.join(@cop_path, "logmap.yaml")
33
- @hash_path = File.join(@cop_path, "hashmap.yaml")
34
- if File.exist?(@log_path) and File.exist?(@hash_path) then
35
- @logmap = default_hash_factory.merge(YAML.load_file(@log_path))
36
- @hashmap = default_hash_factory.merge(YAML.load_file(@hash_path))
29
+ def initialize(root)
30
+ @root = root
31
+ @cop_path = File.join(root, '.cn')
32
+ @log_path = File.join(@cop_path, 'logmap.yaml')
33
+ @hash_path = File.join(@cop_path, 'hashmap.yaml')
34
+ if File.exist?(@log_path) && File.exist?(@hash_path)
35
+ @logmap = hash_array.merge(YAML.load_file(@log_path))
36
+ @hashmap = hash_array.merge(YAML.load_file(@hash_path))
37
37
  else
38
- @logmap = default_hash_factory()
39
- @hashmap = default_hash_factory()
40
- unless File.exist?(@cop_path)
41
- Dir.mkdir(@cop_path)
42
- end
38
+ @logmap = hash_array
39
+ @hashmap = hash_array
40
+ Dir.mkdir(@cop_path) unless File.exist?(@cop_path)
43
41
  end
44
42
  end
45
43
 
46
- def default_hash_factory()
47
- Hash.new {[]}
48
- end
44
+ def hash_array
45
+ Hash.new {[]}
46
+ end
49
47
 
50
48
  def add_file(file_name, content)
51
49
  hash = hash_file(file_name, content)
52
- File.open(File.join(@cop_path, hash), "w") { |f|
50
+ File.open(File.join(@cop_path, hash), 'w') { |f|
53
51
  f.write(content)
54
52
  }
55
53
  @logmap[file_name] = @logmap[file_name] << {:time => Time.now,
56
54
  :hash => hash}
57
55
  @hashmap[hash] = @hashmap[hash] << {:time => Time.now,
58
56
  :filename => file_name}
59
- update_log_file()
57
+ update_log_file
60
58
  return hash
61
59
  end
62
60
 
@@ -64,13 +62,9 @@ module Copernicium
64
62
  def delete_file(file_id)
65
63
  begin
66
64
  file_name = @hashmap[file_id][0][:filename]
67
- @hashmap[file_id].delete_if { |e|
68
- e[:filename] == file_name
69
- }
70
- @logmap[file_name].delete_if { |e|
71
- e[:hash] == file_id
72
- }
73
- update_log_file()
65
+ @hashmap[file_id].delete_if { |e| e[:filename] == file_name }
66
+ @logmap[file_name].delete_if { |e| e[:hash] == file_id }
67
+ update_log_file
74
68
  File.delete(File.join(@cop_path, file_id))
75
69
  return 1
76
70
  rescue Exception
@@ -79,54 +73,41 @@ module Copernicium
79
73
  end
80
74
 
81
75
 
82
- def get_file(file_id)
83
- file_path = File.join(@cop_path, file_id)
84
- if File.exist?(file_path)
85
- File.open(file_path, "r") { |f|
86
- return f.read
87
- }
76
+ def get_file(id)
77
+ file_path = File.join(@cop_path, id)
78
+ if File.exist? file_path
79
+ File.open(file_path, 'r') { |f| return f.read }
88
80
  else
89
- raise Exception, "Invalid file_id!"
81
+ raise Exception, 'Invalid id!'
90
82
  end
91
83
  end
92
84
 
93
85
 
94
86
  def diff_files(file_id1, file_id2)
95
- return Diffy::Diff.new(get_file(file_id1),
96
- get_file(file_id2)).to_s()
87
+ Diffy::Diff.new(get_file(file_id1), get_file(file_id2)).to_s()
97
88
  end
98
89
 
99
90
  def hash_file(file_name, content)
100
91
  Digest::SHA256.hexdigest(file_name + content.to_s)
101
92
  end
102
93
 
103
- def merge(file_id1, file_id2)
104
- diff_a = Diffy::Diff.new(get_file(file_id1),
105
- get_file(file_id2)).each_chunk.to_a()
106
- if diff_a.all? { |d| d[0]!="-"}
107
- return get_file(file_id2)
108
- end
109
- # if diff_a.all? { |d| d[0]!="+"}
110
- # return get_file(file_id1)
111
- # end
112
- return diff_a
94
+ def merge(id1, id2)
95
+ diff_a = Diffy::Diff.new(get_file(id1), get_file(id2)).each_chunk.to_a
96
+ return get_file(id2) if diff_a.all? { |d| d[0]!='-'}
97
+ # return get_file(id1) if diff_a.all? { |d| d[0]!='+'}
98
+ diff_a
113
99
  end
114
100
 
115
101
  def history(file_name)
116
102
  hashs = []
117
- for m in @logmap[file_name]
118
- hashs << m[:hash]
119
- end
120
- return hashs
103
+ @logmap[file_name].each { |m| hashs << m[:hash] }
104
+ hashs
121
105
  end
122
106
 
123
- def update_log_file()
124
- File.open(File.join(@cop_path, "logmap.yaml"), "w") { |f|
125
- f.write(@logmap.to_yaml)
126
- }
127
- File.open(File.join(@cop_path, "hashmap.yaml"), "w") { |f|
128
- f.write(@hashmap.to_yaml)
129
- }
107
+ def update_log_file
108
+ # writeFile defined in workspace.rb
109
+ writeFile(File.join(@cop_path, 'logmap.yaml'), @logmap.to_yaml)
110
+ writeFile(File.join(@cop_path, 'hashmap.yaml'), @hashmap.to_yaml)
130
111
  end
131
112
 
132
113
  # def alterFile(fileObject, fileReferenceString, versionReferenceString)
data/lib/banners.rb CHANGED
@@ -1,23 +1,49 @@
1
- # file for large constant strings
1
+ # open up string class, enable terminal colors
2
+ # add some colors, windowing methods
2
3
 
4
+ class String
5
+ def colorize(color, mod)
6
+ "\033[#{mod};#{color};49m#{self}\033[0;0m"
7
+ end
8
+
9
+ def reset() colorize(0,0) end
10
+ def blu() colorize(34,0) end
11
+ def yel() colorize(33,0) end
12
+ def grn() colorize(32,0) end
13
+ def red() colorize(31,0) end
14
+ end
15
+
16
+ # create large constant strings
3
17
 
4
18
  HELP_BANNER = <<-EOS
5
- Copernicium - simple DVCS
19
+ Copernicium (cn) - simple DVCS
6
20
 
7
- Starting:
21
+ Starting out:
8
22
  init - create a new repository
9
23
  status - check repo status
24
+ help - show more commands
25
+ EOS
10
26
 
27
+
28
+ COMMAND_BANNER = <<-EOS
29
+ #{HELP_BANNER}
11
30
  Commands:
12
- commit <files> -m [message]
13
- checkout [branch name]
14
- merge [branch name]
15
- clone [remote url]
16
- push <remote name>
17
- pull <remote name>
31
+ clean [files]
32
+ commit [files] -m <message>
33
+ checkout [files] <commit id>
34
+ branch [opt] [branchname]
35
+ -r | rename current branch
36
+ -c | create a new branch
37
+ merge <branch name>
38
+ clone <remote url>
39
+ push [remote name]
40
+ pull [remote name]
18
41
 
19
42
  Options:
20
43
  -v: print version
21
44
  -h: show help
45
+
46
+ Note: [optional] <required>
47
+
22
48
  EOS
23
49
 
data/lib/pushpull.rb CHANGED
@@ -7,6 +7,25 @@
7
7
  module Copernicium
8
8
  class PushPull
9
9
 
10
+ # Chris's edit
11
+ # Takes in Ethan's UICommandCommunicator object and calls
12
+ # a method based on the command
13
+ def UICommandParser(ui_comm)
14
+ case ui_comm.command
15
+ when "clone"
16
+ #clone()
17
+ when "merge"
18
+ # do merge stuff
19
+ when "push"
20
+ #push(ui_comm.)
21
+ when "pull"
22
+ #pull(ui_comm.branchname,)
23
+ else
24
+ print "Error: Invalid command supplied to PushPull!" # Bad error handling, will fix later
25
+ return nil
26
+ end
27
+ end
28
+
10
29
  def connect(remote, user = nil, passwd = nil, &block)
11
30
  exit_code = false
12
31
  if(block.nil?)
data/lib/repos.rb CHANGED
@@ -1,14 +1,8 @@
1
- # repos module
2
-
3
- #require 'marshal'
4
- # Details from this link:
5
- # https://docs.google.com/document/d/1r3-NquhyRLbCncqTOQPwsznSZ-en6G6xzLbWIAmxhys/edit#heading=h.7pyingf1unu
6
-
7
-
8
1
  # Repos Top Level Function Definitions (Logan)
9
2
 
10
3
  # make_snapshot: Creates new snapshot from current files and versions
11
- # in - array of file objects. file object = array of all versions: {id, content}
4
+ # in - array of file objects. file object = array of all versions:
5
+ # {id, content}
12
6
  # out - hash id of snapshot
13
7
 
14
8
  # restore_snapshot: Set current file versions to specified snapshot
@@ -39,127 +33,133 @@
39
33
 
40
34
  module Copernicium
41
35
  class Snapshot
42
- def initialize(in_array)
43
- @files = in_array
44
- @id = ""
45
- # id = hash of in array?
36
+ attr_accessor :id, :files
37
+ # id is computed after creation
38
+ def initialize(files = [])
39
+ @files = files
40
+ @id = id
41
+ end
42
+ end
43
+
44
+ class Repos
45
+ attr_reader :snaps
46
+ # read in file of snapshots (.cn/history)
47
+ # check the current branch (.cn/branch)
48
+ def initialize(root, branch = 'master')
49
+ @root = root
50
+ @copn = File.join(@root, '.cn')
51
+ @bpath = File.join(@copn, 'branch')
52
+ @spath = File.join(@copn, 'history')
53
+
54
+ # check if files exist, read them
55
+ if File.exist?(@spath) && File.exist?(@bpath)
56
+ @snaps = Marshal.read readFile(@spath)
57
+ @branch = readFile(@bpath)
58
+ else # use defaults
59
+ @snaps = {branch => []}
60
+ @branch = branch
61
+ end
46
62
  end
47
63
 
48
- def set_id(in_id)
49
- @id = in_id
64
+ # returns the hash if of an object
65
+ def hasher(obj)
66
+ Digest::SHA256.hexdigest Marshal.dump(obj)
50
67
  end
51
68
 
52
- # drop get prefix?
53
- def get_id()
54
- @id
69
+ # array of hashes constructor
70
+ def hash_array
71
+ Hash.new {[]}
55
72
  end
56
73
 
57
- def get_files()
58
- @files
74
+ # Return string array of what branches we have
75
+ def branches
76
+ @snaps.keys
59
77
  end
60
- # Initialize hash at startup
61
- # Possible? Or problem with self object?
62
- end
63
78
 
64
- class Repos
65
- def initialize()
66
- # Create manifest
67
- # It's a list of snapshots in chronological order
68
- @manifest = {"default" => []}
69
- @curr_branch = "default"
70
- # what to do about branch IDs?
71
- # Read in project path and make manifest file?
72
- # Create current
79
+ def update_snap
80
+ writeFile(@spath, Marshal.dump(@snaps))
73
81
  end
74
82
 
75
- def manifest()
76
- @manifest
83
+ def update_branch
84
+ writeFile(@bpath, @branch)
77
85
  end
78
86
 
79
- def make_snapshot(file_array)
80
- # Return hash ID of snapshot
81
- new_snap = Snapshot.new(file_array)
82
- # Set ID, consider breaking up that line
83
- new_snap.set_id(Digest::SHA256.hexdigest(Marshal.dump(new_snap)))
84
- @manifest[@curr_branch].push(new_snap)
85
- # Update manifest file?
86
- return new_snap.get_id()
87
+ # Create snapshot, and return hash ID of snapshot
88
+ def make_snapshot(files = [])
89
+ snap = Snapshot.new(files)
90
+ snap.id = hasher snap
91
+ @snaps[@branch] << snap
92
+
93
+ # Update snaps file
94
+ update_snap
95
+ snap.id
87
96
  end
88
97
 
98
+ # Find snapshot, return snapshot (or just contents) given id
89
99
  def get_snapshot(target_id)
90
- # Return snapshot (or just contents) given id
91
- # Find snapshot
92
- found_index = @manifest[@curr_branch].index{ |x| x.get_id() == target_id }
93
- # Handle not found case
94
- # Return it
95
- if(found_index)
96
- return @manifest[@curr_branch][found_index]
100
+ found_index = @snaps[@branch].index { |x| x.id == target_id }
101
+ if found_index
102
+ @snaps[@branch][found_index]
97
103
  else
98
- return found_index
104
+ Snapshot.new
99
105
  end
100
- #return ret_snap
101
106
  end
102
107
 
103
- # Not sure how I'm gonna do this one
108
+ # Return comm object with status
109
+ # change files in workspace back to specified commit
110
+ # get clear the current workspace
111
+ # revert back to given commit
104
112
  def restore_snapshot(target_id)
105
- # Return comm object with status
106
- # Need a way to change files in workspace
107
- return 1
113
+ # todo
108
114
  end
109
115
 
110
- #def history(branch_name)
111
- def history()
112
- # Return array of snapshot IDs
113
- names_list = []
114
- @manifest[@curr_branch].each {|x| names_list.push(x.get_id())}
115
- return names_list
116
+ # Return array of snapshot IDs
117
+ def history(branch_name = nil)
118
+ snapids = []
119
+ if branch_name.nil?
120
+ @snaps[@branch].each {|x| snapids << x.id }
121
+ else
122
+ @snaps[branch_name].each{|x| snapids << x.id }
123
+ end
124
+ snapids
116
125
  end
117
126
 
127
+ # Find snapshot, delete from snaps/memory
118
128
  def delete_snapshot(target_id)
119
- # Return comm object with status
120
- # Find snapshot, delete from manifest/memory
121
- @manifest[@curr_branch].delete_if { |x| x.get_id() == target_id }
122
- # catch error
123
- # update manifest file?
129
+ @snaps[@branch].delete_if { |x| x.id == target_id }
130
+ update_snap
124
131
  end
125
132
 
126
- # Finds the files in snap1 that aren't in snap2, change this?
127
- # Consider using diffy?
133
+ # Return list of filenames and versions
128
134
  def diff_snapshots(id1, id2)
129
- # Return list of filenames and versions
130
- diff_files = []
135
+ diffed = []
136
+
131
137
  # Put in error catching
132
- files1 = get_snapshot(id1).get_files()
133
- files2 = get_snapshot(id2).get_files()
134
- # Find snapshot1 and snapshot2
135
- files1.each do |x|
136
- if(!files2.include?(x))
137
- diff_files.push(x)
138
- end
139
- end
140
- return diff_files
141
- # Use revlog diff on each set of files? Look at Diffy
142
- end
138
+ files1 = get_snapshot(id1).files
139
+ files2 = get_snapshot(id2).files
140
+
141
+ # Find difference between snapshot1 and snapshot2
142
+ files1.each { |x| diffed << x unless !files2.include?(x) }
143
143
 
144
- def make_branch(branch_name)
145
- # Return hash ID of new branch
146
- # Not sure where to store branches
147
- # What goes in to the hash?
148
- @manifest[branch_name] = @manifest[@curr_branch]
149
- @curr_branch = branch_name
150
- return 1
144
+ diffed
151
145
  end
152
146
 
153
- def delete_branch(branch_name)
154
- # Exit status code
155
- @manifest.delete("branch_name")
147
+ # Return hash ID of new branch
148
+ def make_branch(branch)
149
+ @snaps[branch] = @snaps[@branch]
150
+ @branch = branch
151
+ hasher 1
156
152
  end
157
153
 
158
- def clear()
159
- # Just a placeholder for now
154
+ # Merge the target branch into current
155
+ def merge_branch(branch)
156
+ # todo
160
157
  end
161
158
 
162
- end
159
+ # Exit status code
160
+ def delete_branch(branch)
161
+ @snaps.delete(branch)
162
+ end
163
+ end # repo class
163
164
  end
164
165
 
165
-
data/lib/required.rb CHANGED
@@ -9,6 +9,8 @@ require 'socket' # Socket needed for communicating over the network
9
9
  require 'io/console' # Needed to hide password at console
10
10
  require 'net/ssh' # Needed to communicate with the remote
11
11
  require 'net/scp' # Needed for file transfer between servers
12
+ #require 'marshal'
13
+
12
14
 
13
15
  # coperncicium files
14
16
 
data/lib/ui.rb CHANGED
@@ -2,9 +2,15 @@
2
2
  # integrates all modules, central module
3
3
 
4
4
 
5
- VERSION = "0.0.1"
5
+ VERSION = "0.0.2"
6
6
 
7
7
  module Copernicium
8
+ # Print and exit with a specific code
9
+ def pexit(msg, sig)
10
+ puts msg
11
+ exit sig
12
+ end
13
+
8
14
  class Driver
9
15
  # Get some info from the user when they dont specify it
10
16
  def get(info)
@@ -12,12 +18,6 @@ module Copernicium
12
18
  gets.chomp # read a line from user, and return it
13
19
  end
14
20
 
15
- # Print and exit with a specific code
16
- def pexit(msg, sig)
17
- puts msg
18
- exit sig
19
- end
20
-
21
21
  # Executes the required action for a given user command.
22
22
  #
23
23
  # Parameters:
@@ -37,7 +37,7 @@ module Copernicium
37
37
  cmd = args.shift
38
38
 
39
39
  # if no arguments given show help information
40
- pexit HELP_BANNER, 0 if cmd == '-h'
40
+ pexit COMMAND_BANNER, 0 if (cmd == '-h' || cmd == 'help')
41
41
 
42
42
  # if -v flag givem show version
43
43
  pexit VERSION, 0 if cmd == '-v'
@@ -48,6 +48,10 @@ module Copernicium
48
48
  init args
49
49
  when 'status'
50
50
  status args
51
+ when 'branch'
52
+ branch args
53
+ when 'clean'
54
+ clean args
51
55
  when 'clone'
52
56
  clone args
53
57
  when 'commit'
@@ -61,18 +65,34 @@ module Copernicium
61
65
  when 'pull'
62
66
  pull args
63
67
  else # handle an unrecognized argument, show help and exit
64
- pexit "Unrecognized command #{cmd}\n" + HELP_BANNER, 1
68
+ pexit "Unrecognized command #{cmd}\n" + COMMAND_BANNER, 1
65
69
  end
66
70
  end # run
67
71
 
68
72
  def init(args)
73
+ if args.nil?
74
+ Workspace.new
75
+ else # init into a folder
76
+ target = File.join Dir.pwd, args.join(' ')
77
+ Dir.mkdir target if !File.exists? target
78
+ Dir.chdir target
79
+ Workspace.new
80
+ end
81
+ puts "Created Copernicium repo in " + Dir.pwd
69
82
  UIComm.new(command: 'init', opts: args)
70
- # todo - make call to repos to create repo
71
83
  end
72
84
 
73
85
  def status(args)
74
- UIComm.new(command: 'status', opts: args)
75
- # todo - make call to workspace, get and show status
86
+ ui = UIComm.new(command: 'status', opts: args)
87
+ st = Workspace.new.status(ui)
88
+ puts "added:".grn + st[0].join(', ') unless st[0].empty?
89
+ puts "edited:".yel + st[1].join(', ') unless st[1].empty?
90
+ puts "removed:".red + st[2].join(', ') unless st[2].empty?
91
+ ui
92
+ end
93
+
94
+ def branch(args)
95
+ # todo - switch branches, create branches
76
96
  end
77
97
 
78
98
  def push(args)
@@ -93,12 +113,20 @@ module Copernicium
93
113
  files = args
94
114
  end
95
115
 
96
- # todo - call repos checkout the given / branch
97
116
  # todo - also, figure out if is branch or rev id
98
117
  # this can be done by checking if it is a branch, and if not, then just
99
118
  # assume it is a rev id. if it isnt, then something will break :/
100
119
 
101
- UIComm.new(command: 'checkout', rev: rev, files: files)
120
+ # call workspace checkout the given / branch
121
+ ui = UIComm.new(command: 'checkout', rev: rev, files: files)
122
+ Workspace.new.checkout(ui)
123
+ ui
124
+ end
125
+
126
+ def clean(args = [])
127
+ ui = UIComm.new(command: 'clean', files: args)
128
+ Workspace.new.clean(ui)
129
+ ui
102
130
  end
103
131
 
104
132
  def clone(args)
@@ -118,21 +146,26 @@ module Copernicium
118
146
  messflag = args.find_index('-m')
119
147
  if messflag.nil?
120
148
  message = get 'commit message'
121
- else # mash everything after -m into a single string
149
+ elsif message == 0 # commit everything
150
+ # mash everything after -m into a string
122
151
  message = args[messflag + 1..-1].join ' '
152
+ else # commit only some files
153
+ files = args[0..messflag - 1]
123
154
  end
124
155
 
125
- # todo parse file list, in case just commiting some files
126
- # todo call revlog, commit files
127
- # todo call repos, update commit
156
+ # specified the -m flag, but didnt give anything
157
+ message = get 'commit message' if message.nil?
128
158
 
129
- UIComm.new(command: 'commit', commit_message: message)
159
+ # perform the commit, with workspace
160
+ ui = UIComm.new(command: 'commit', files: files, commit_message: message)
161
+ Workspace.new.commit(ui)
162
+ ui
130
163
  end
131
164
 
132
165
  def merge(args)
133
166
  if args.empty?
134
- puts 'I need a commit to merge.'
135
- rev = get 'single commit to merge'
167
+ puts 'I need a commit or branch to merge.'
168
+ rev = get 'single commit or branch to merge'
136
169
  else # use given
137
170
  rev = args.first
138
171
  end
data/lib/workspace.rb CHANGED
@@ -1,12 +1,24 @@
1
- # This is the workspace module
2
- # The functions are clean, commit, checkout and status
1
+ # workspace module - linfeng and qiguang
3
2
 
4
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
+
5
17
  class FileObj
6
- attr_reader :path, :history_hash_ids
18
+ attr_reader :path, :history
7
19
  def initialize(path, ids)
20
+ @history = ids
8
21
  @path = path
9
- @history_hash_ids = ids
10
22
  end
11
23
 
12
24
  def ==(rhs)
@@ -19,30 +31,35 @@ module Copernicium
19
31
  end
20
32
 
21
33
  class Workspace
22
- def writeFile(path, content)
23
- f = open(path, 'w')
24
- f.write(content)
25
- f.close
26
- end
27
-
28
- def readFile(path)
29
- f = open(path, 'r')
30
- txt = f.read
31
- f.close
32
- txt
34
+ attr_reader :repos, :revlog
35
+ def initialize(bname = 'master')
36
+ @files = []
37
+ @cwd = Dir.pwd
38
+ @root = getroot
39
+ Dir.chdir(@cwd)
40
+ @root = @cwd if @root.nil?
41
+ @cwd.sub!(@root, '.')
42
+ @branch = bname
43
+ @repo = Repos.new(@cwd)
44
+ @revlog = RevLog.new(@cwd)
45
+
46
+ pexit 'Copernicium folder (.cn) not found.', 1 if @root.nil?
33
47
  end
34
48
 
35
- #private_class_method :writeFile
36
- #private_class_method :readFile
49
+ # find where the root .cn folder is
50
+ def getroot
51
+ max = 0
52
+ def notroot() Dir.pwd != '/' end
53
+ def notcn() File.exists? File.join(Dir.pwd, '.cn') end
54
+ while max < 10 && notroot && notcn
55
+ Dir.chdir(File.join(Dir.pwd, '..'))
56
+ max += 1
57
+ end
37
58
 
38
- def initialize(bname = 'master', rootdir = './workspace')
39
- @files = []
40
- @branch_name = bname
41
- @revlog = Copernicium::RevLog.new('.')
42
- @repos = Copernicium::Repos.new
43
- @root = rootdir
44
- if !File.directory?(@root)
45
- Dir.mkdir(@root)
59
+ if notcn # return where cn was found
60
+ Dir.pwd
61
+ else # directory not found
62
+ nil
46
63
  end
47
64
  end
48
65
 
@@ -58,70 +75,53 @@ module Copernicium
58
75
  end
59
76
 
60
77
  # if include all the elements in list_files
61
- def include?(list_files)
62
- list_files.each do |x|
63
- if indexOf(x) == -1
64
- return false
65
- end
66
- end
78
+ def include?(files)
79
+ files.each { |x| return false if indexOf(x) == -1 }
67
80
  true
68
81
  end
69
82
 
83
+ # get all files currently in workspace
84
+ def ws_files
85
+ Dir[ File.join(@root, '**', '*') ].reject { |p| File.directory? p }
86
+ end
87
+
88
+ # Clear the current workspace
89
+ def clear
90
+ @files.each{ |x| File.delete(x.path) }
91
+ @files = []
92
+ end
93
+
94
+ # reset first: delete them from disk and reset @files
95
+ # restore it with checkout() if we have had a branch name
96
+ # or it is the initial state, no commit and no checkout
70
97
  # if list_files is nil, then rollback the list of files from the branch
71
98
  # or rollback to the entire branch head pointed
72
99
  def clean(comm)
73
- list_files = comm.files
74
- if list_files.nil? # reset first: delete them from disk and reset @files
75
- @files.each{|x| File.delete(x.path)}
76
- @files = []
77
- # restore it with checkout() if we have had a branch name
78
- if @branch_name != ''
79
- # or it is the initial state, no commit and no checkout
80
- return checkout(@branch_name)
81
- else
82
- return 0
83
- end
100
+ if comm.files.empty?
101
+ clear # reset, checkout last commit
102
+ checkout
103
+ else # list_files are not nil
84
104
 
85
- else #list_files are not nil
86
- # check that every file need to be reset should have been recognized by the workspace
87
- #workspace_files_paths = @files.each{|x| x.path}
88
- return -1 if (self.include? list_files) == false
105
+ # exit if the specified file is not in the workspace
106
+ return -1 if (self.include? comm.files) == false
89
107
 
90
108
  # the actual action, delete all of them from the workspace first
91
- list_files.each do |x|
109
+ comm.files.each do |x|
92
110
  File.delete(x)
93
111
  idx = indexOf(x)
94
- if !idx==-1
95
- @files.delete_at(idx)
96
- end
112
+ @files.delete_at(idx) if !idx == -1
97
113
  end
98
114
 
99
115
  # if we have had a branch, first we get the latest snapshot of it
100
116
  # and then checkout with the restored version of them
101
- if @branch_name != ''
102
- return checkout(list_files)
103
- else
104
- return 0
105
- end
117
+ checkout
106
118
  end
107
119
  end
108
120
 
109
121
  # commit a list of files or the entire workspace to make a new snapshot
110
122
  def commit(comm)
111
- # for this commented version, we first get all files in the workspace and then add files from comm obj
112
- # it's not used at this time
113
- # Linfeng Song
114
- #list_files = @files.each{|x| x.path}
115
- #if comm.files != nil
116
- # comm.files.each do |x|
117
- # if indexOf(x) == -1
118
- # list_files.push(x)
119
- # end
120
- # end
121
- #end
122
- list_files = Dir[ File.join(@root, '**', '*') ].reject { |p| File.directory? p }
123
- if list_files != nil
124
- list_files.each do |x|
123
+ unless ws_files.empty?
124
+ ws_files.each do |x|
125
125
  if indexOf(x) == -1
126
126
  content = readFile(x)
127
127
  hash = @revlog.add_file(x, content)
@@ -130,82 +130,77 @@ module Copernicium
130
130
  else
131
131
  content = readFile(x)
132
132
  hash = @revlog.add_file(x, content)
133
- if @files[indexOf(x)].history_hash_ids[-1] != hash
134
- @files[indexOf(x)].history_hash_ids << hash
133
+ if @files[indexOf(x)].history[-1] != hash
134
+ @files[indexOf(x)].history << hash
135
135
  end
136
136
  end
137
137
  end
138
138
  end
139
- return @repos.make_snapshot(@files)
139
+ @repo.make_snapshot(@files) # return snapshot id
140
140
  end
141
141
 
142
- def checkout(comm)
143
- argu = comm.files
144
- # if argu is an Array Object, we assume it is a list of files to be added to the workspace
145
- if argu != nil
146
- # we add the list of files to @files regardless whether it has been in it.
147
- # that means there may be multiple versions of a file.
148
- list_files = argu
149
- snapshot_id = @repos.history()[-1]
150
- returned_snapshot = @repos.get_snapshot(snapshot_id)
151
- list_files_last_commit = returned_snapshot.get_files()
142
+ def checkout(comm = UIComm.new(rev: @branch))
143
+ =begin
144
+ # just support branches for now
145
+ # 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 @files regardless
147
+ # whether it has been in # it. that means there may be multiple versions
148
+ # of a file.
149
+ unless comm.files.nil?
150
+ list_files = comm.files
151
+ returned_snapshot = @repo.get_snapshot(@repo.history.last)
152
+ list_files_last_commit = returned_snapshot.files
152
153
  list_files_last_commit.each do |x|
153
154
  if list_files.include? x.path
154
- path = x.path
155
- content = @revlog.get_file(x.history_hash_ids[-1])
155
+ content = @revlog.get_file(x.history.last)
156
156
  idx = indexOf(x.path)
157
157
  if idx == -1
158
- @files.push(x)
158
+ @files << x
159
159
  else
160
160
  @files[idx] = x
161
161
  end
162
- writeFile(path,content)
162
+ writeFile(x.path, content)
163
163
  end
164
164
  end
165
- # if argu is not an Array, we assume it is a String, representing the branch name
166
- # we first get the last snapshot id of the branch, and then get the commit object
167
- # and finally push all files of it to the workspace
168
- else
169
- argu = comm.rev #branch name
170
- snapshot_id = @repos.history()[-1]
171
- snapshot_obj = @repos.get_snapshot(snapshot_id).get_files()
172
- snapshot_obj.each do |fff|
173
- idx = indexOf(fff.path)
174
- if idx == -1
175
- @files.push(fff)
176
- else
177
- @files[idx] = fff
178
- end
179
- path = fff.path
180
- content = @revlog.get_file(fff.history_hash_ids[-1])
181
- writeFile(path,content)
165
+ else # if argu is not an Array, we assume it is a String, representing the
166
+ end
167
+ =end
168
+
169
+ clear # reset workspace
170
+
171
+ # we first get the last snapshot id of the branch, and then get the commit
172
+ # object and finally push all files of it to the # workspace
173
+ @repo.get_snapshot(@repo.history.last).files.each do |file|
174
+ idx = indexOf(file.path)
175
+ if idx == -1
176
+ @files << file
177
+ else
178
+ @files[idx] = file
182
179
  end
180
+ content = @revlog.get_file(file.history.last)
181
+ writeFile(file.path, content)
183
182
  end
184
183
  end
185
184
 
186
185
  def status(comm)
187
- adds = []
188
- deletes = []
186
+ added = []
189
187
  edits = []
190
- wsFiles = Dir[ File.join(@root, '**', '*') ].reject { |p| File.directory? p }
191
- wsFiles.each do |f|
188
+ remov = []
189
+ ws_files.each do |f|
192
190
  idx = indexOf(f)
193
- if idx != -1
194
- x1 = @revlog.get_file(@files[idx].history_hash_ids[-1])
195
- x2 = readFile(f)
196
- if x1 != x2
197
- edits.push(f)
198
- end
199
- else
200
- adds.push(f)
191
+ if idx == -1 # new file
192
+ added << f
193
+ else # changed file?
194
+ x2 = readFile(f) # get the current version
195
+ x1 = @revlog.get_file(@files[idx].history.last)
196
+ edits << f if x1 != x2
201
197
  end
202
198
  end
203
- @files.each do |f|
204
- if ! (wsFiles.include? f.path)
205
- deletes.push(f.path)
206
- end
207
- end
208
- return [adds, edits, deletes]
199
+
200
+ # any deleted files from the last commit?
201
+ @files.each { |f| remov << f.path unless (ws_files.include? f.path) }
202
+
203
+ [added, edits, remov]
209
204
  end
210
205
  end
211
206
  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.1
4
+ version: 0.0.2
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-11-20 00:00:00.000000000 Z
11
+ date: 2015-12-02 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,12 +135,12 @@ 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: []