copernicium 0.1.1 → 0.1.2

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: ae0586e9cb32a7e0eb7923e268009975564a89bf
4
- data.tar.gz: 173bdc7cef1f59e1b5ab9d42806b9a0c3425ea82
3
+ metadata.gz: fd3e9247c74ce89252cccb9a53e801ffed973358
4
+ data.tar.gz: eb9c7868a7271ad1b679edea4532f5c1dac3265f
5
5
  SHA512:
6
- metadata.gz: 0ceb1bc12e11397be06875f4ebd7e61b6587313d7a02153019d0dd57b3f938df6d4d822e6d49d7593322684f8266190acf5f0c750b763b73785fe5365dde1311
7
- data.tar.gz: 0c3da8661659f3827cd400603d398f3a72f7e876e0026b0fa9e108213f19bca9d9dbd41405d25688cf0aef3db55fef1f33bf9a4d0a5b146610c0a6f83eb8f284
6
+ metadata.gz: 22c2ad848204714087cc28d43cac3608dbeed48a874b1b47f287d68200a5fbc9436d7305909cb0d923e35d2600b5912103dde8bf832f7f384aab4ff3929e45c8
7
+ data.tar.gz: a5780ed3510d641f84ca8d80e9ef6573f65636ccdb91e9b8ff8f75f3f0a652d986acc0f9742f2134140dd6321f5c777caf452478a001d01b0defc7f13ca02337
data/lib/RevLog.rb CHANGED
@@ -125,14 +125,6 @@ module Copernicium
125
125
  File.open(@@log_path, 'w') { |f| f.write(@@logmap.to_yaml) }
126
126
  File.open(@@hash_path, 'w') { |f| f.write(@@hashmap.to_yaml) }
127
127
  end
128
-
129
- # def RevLog.alterFile(fileObject, fileReferenceString, versionReferenceString)
130
- # end
131
-
132
- # def RevLog.deleteFileVersion(fileReferenceString, versionReferenceString)
133
- # end
134
-
135
- # def RevLog.viewFileHistory(fileReferenceString)
136
- # end
137
128
  end
138
129
  end
130
+
data/lib/pushpull.rb CHANGED
@@ -2,39 +2,56 @@
2
2
  # CSC 253
3
3
  # PushPull Module
4
4
  # November 6, 2015
5
-
5
+ #
6
+ # How to use for Push, Pull and Clone:
7
+ # Push - cn push <user> <repo.host:/dir/of/repo> <branch-name>
8
+ # Pull - cn pull <user> <repo.host:/dir/of/repo> <branch-name>
9
+ # Clone - cn clone <user> <repo.host:/dir/of/repo>
10
+ # assumes that the user has ssh keys to the remote server setup
6
11
 
7
12
  module Copernicium
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
14
-
13
+ include Workspace
15
14
  module PushPull
16
- include Repos # needed for calling their methods
17
- # Chris's edit
18
- # Takes in Ethan's UICommandCommunicator object and calls
19
- # a method based on the command
20
- #
21
15
  # Fields in UIComm and what they are for me:
22
16
  # @opts - user
23
17
  # @repo - repo.host:/path/to/repo
18
+ # @repo - :/path/to/repo
24
19
  # @rev - branch name
25
- def PushPull.UICommandParser(ui_comm)
26
- case ui_comm.command
20
+ def PushPull.UICommandParser(comm)
21
+ # handle parsing out remote info
22
+ remote = comm.repo.split(':')
23
+ if remote.length == 2
24
+ @@host = remote[0]
25
+ @@path = remote[1]
26
+ elsif remote.length == 1
27
+ @@host = "cycle3.csug.rochester.edu"
28
+ @@path = remote[0].sub!(/^:/, '')
29
+ else
30
+ raise 'Remote host information not given'.red
31
+ end
32
+
33
+ @@user = comm.opts
34
+ case comm.command
27
35
  when "clone"
28
- clone(ui_comm.repo, ui_comm.opts.first)
36
+ clone
29
37
  when "push"
30
- push(ui_comm.repo, ui_comm.rev, ui_comm.opts.first)
38
+ push
31
39
  when "pull"
32
- pull(ui_comm.repo, ui_comm.rev, ui_comm.opts.first)
40
+ pull
41
+ when 'test'
42
+ # avoid error while doing unit testing
33
43
  else
34
44
  raise "Error: Invalid command supplied to PushPull".red
35
45
  end
36
46
  end
37
47
 
48
+ # tell user to set up their ssh keys
49
+ def connection_failure(str = '')
50
+ puts "Connection error while: ".red + str
51
+ puts "Make sure SSH keys are setup.".yel
52
+ false
53
+ end
54
+
38
55
  # Function: connect()
39
56
  #
40
57
  # Description:
@@ -43,58 +60,13 @@ module Copernicium
43
60
  #
44
61
  # remote: the remote server, formatted "my.server"
45
62
  # user: the user to connect as
46
- def PushPull.connect(remote, user, &block)
47
- exit_code = false
48
- puts 'inside PushPull connect'.blu
49
- if(block.nil?)
50
- begin
51
- puts 'inside PushPull connect nil block path'.grn
52
- Net::SSH.start(remote, user) do |ssh|
53
- puts ssh.exec!("echo Successful Connection!")
54
- exit_code = true
55
- end
56
- rescue
57
- begin
58
- print "Username for remote repo?: "
59
- user = (STDIN.readline).strip
60
-
61
- print "Password for #{user}: "
62
- passwd = (STDIN.noecho(&:gets)).strip
63
- puts
64
-
65
- Net::SSH.start(remote, user, :password => passwd) do |ssh|
66
- puts ssh.exec!("echo Successful Connection!")
67
- exit_code = true
68
- end
69
- rescue
70
- raise "Unsuccessful Connection".red
71
- end
72
- end
73
- else
74
- begin
75
- Net::SSH.start(remote, user) do |ssh|
76
- yield ssh
77
- end
78
- exit_code = true
79
- rescue
80
- begin
81
- print "Username for remote repo: "
82
- user = (STDIN.readline).strip
83
-
84
- print "Password for #{user}: "
85
- passwd = (STDIN.noecho(&:gets)).strip
86
- puts
87
-
88
- Net::SSH.start(remote, user, :password => passwd) do |ssh|
89
- yield ssh
90
- end
91
- exit_code = true
92
- rescue
93
- raise "Unable to execute command!".red
94
- end
95
- end
63
+ def PushPull.connect
64
+ begin
65
+ Net::SSH.start(@@host, @@user) { |scp| yield scp }
66
+ true
67
+ rescue
68
+ connection_failure 'trying to execute a command'
96
69
  end
97
- return exit_code
98
70
  end
99
71
 
100
72
  # Function: transfer()
@@ -104,29 +76,12 @@ module Copernicium
104
76
  #
105
77
  # remote: the remote server and directory to pull from, formatted "my.server"
106
78
  # user: the user to connect as
107
- def PushPull.transfer(remote, user, &block)
108
- exit_code = false
79
+ def PushPull.transfer
109
80
  begin
110
- Net::SCP.start(remote, user) do |scp|
111
- yield scp
112
- end
113
- exit_code = true
81
+ Net::SCP.start(@@host, @@user) { |scp| yield scp }
82
+ true
114
83
  rescue
115
- begin
116
- print "Username for remote repo: "
117
- user = (STDIN.readline).strip
118
-
119
- print "Password for #{user}: "
120
- passwd = (STDIN.noecho(&:gets)).strip
121
- puts
122
-
123
- Net::SCP.start(remote, user, :passwd => passwd) do |scp|
124
- yield scp
125
- end
126
- exit_code = true
127
- rescue
128
- raise "Unable to upload file!".red
129
- end
84
+ connection_failure 'trying to upload a file'
130
85
  end
131
86
  end
132
87
 
@@ -139,56 +94,25 @@ module Copernicium
139
94
  # dest: what we want of the branch, not needed for blocked calls
140
95
  # local: where we want to put the file, not needed for blocked calls
141
96
  # user: the user to connect as
142
- def PushPull.fetch(remote, dest, local, user, &block)
143
- exit_code = false
144
- if(block.nil?)
97
+ def PushPull.fetch(local = Dir.pwd, &block)
98
+ if block.nil? # we are cloning a repo in this section of code
145
99
  begin
146
- Net::SCP.start(remote, user, :password => passwd) do |scp|
147
- scp.download!(dest, local, :recursive => true)
148
- end
149
- exit_code = true
150
- rescue
151
- begin
152
- print "Username for remote repo: "
153
- user = (STDIN.readline).strip
154
-
155
- print "Password for #{user}: "
156
- passwd = (STDIN.noecho(&:gets)).strip
157
- puts
158
-
159
- Net::SCP.start(remote, user, :password => passwd) do |scp|
160
- scp.download!(dest, local, :recursive => true)
161
- end
162
- exit_code = true
163
- rescue
164
- raise "Unable to fetch file(s)!".red
100
+ Net::SCP.start(@@host, @@user) do |scp|
101
+ scp.download!(@@path, local, :recursive => true)
165
102
  end
103
+ true
104
+ rescue # no ssh keys are setup, die
105
+ connection_failure 'trying to copy a file'
166
106
  end
167
- else
107
+
108
+ else # fetch more than one file or folder
168
109
  begin
169
- Net::SCP.start(remote, user, :password => passwd) do |scp|
170
- yield scp
171
- end
172
- exit_code = true
110
+ Net::SCP.start(@@host, @@user) { |scp| yield scp }
111
+ true
173
112
  rescue
174
- begin
175
- print "Username for remote repo: "
176
- user = (STDIN.readline).strip
177
-
178
- print "Password for #{user}: "
179
- passwd = (STDIN.noecho(&:gets)).strip
180
- puts
181
-
182
- Net::SCP.start(remote, user, :password => passwd) do |scp|
183
- yield scp
184
- end
185
- exit_code = true
186
- rescue
187
- raise "Unable to fetch file(s)!".red
188
- end
113
+ connection_failure "trying to fetch files"
189
114
  end
190
115
  end
191
- return exit_code
192
116
  end
193
117
 
194
118
  # Function: push()
@@ -199,52 +123,27 @@ module Copernicium
199
123
  # remote: the remote server and directory to push to, formatted "my.server:/the/location/we/want"
200
124
  # branch: the branch that we are pushing to
201
125
  # user: the user to connect as
202
- def PushPull.push(remote, branch, user)
203
- # check contents of folder for .cn, fail if not present and remove otherwise
204
- dest = remote.split(':')
205
- if(dest.length != 2)
206
- dest = dest.insert(0, "cycle3.csug.rochester.edu")
207
- end
208
- contents = Dir.entries(Dir.pwd)
209
- if(!content.include? '.cn')
210
- puts 'failed to push to remote, not an initialized Copernicium repo'
211
- return
212
- else
213
- contents = contents.delete_if{|x| (x.eql? '.cn') || (x.eql? '.') || (x.eql? '..')}
214
- end
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
220
- connect(dest[0], user) do |session|
221
- session.exec!("cd #{dest[1]}")
222
- result = session.exec!('ls .cn')
223
- if(result.strip.eql? '')
224
- puts 'remote directory not a Copernicium repo'
225
- return
226
- end
227
- session.exec!("cn branch .temp_push_#{user}")
228
- session.exec!("find . ! -name \".cn\" -exec rm -r {} \\;")
229
-
230
- # Move the files over to the remote branch
231
- transfer(dest[0], user) do |scp|
232
- contents.each do |x|
233
- scp.upload!(Dir.pwd+'/'+x, dest[1], :recursive => true)
234
- end
126
+ def PushPull.push
127
+ transfer do |session|
128
+ # uploading our history to remote
129
+ session.upload!("#{Dir.pwd}/.cn/history",
130
+ "#{@@path}/.cn/merging_#{@@user}")
131
+
132
+ # uploading our .cn info to remote
133
+ %w{revs snap}.each do |file|
134
+ session.upload!("#{Dir.pwd}/.cn/#{file}",
135
+ "#{@@path}/.cn/#{file}",
136
+ :recursive => true)
235
137
  end
138
+ end # session
236
139
 
237
- # Commit the files and merge the branches
238
- session.exec!('cn add .')
239
- session.exec!('cn commit -m \'Temp commit for push\'')
240
- session.exec!("cn checkout #{branch}")
241
- session.exec!("cn merge .temp_push_#{user}")
242
- session.exec!("cn branch -d .temp_push_#{user}")
140
+ connect do |session|
141
+ session.exec!("cd #{@@path}")
142
+ puts session.exec!("cn update #{@@user}")
243
143
  end
244
-
245
- puts "Successfully pushed to #{remote}"
246
144
  end
247
145
 
146
+
248
147
  # Function: pull()
249
148
  #
250
149
  # Description:
@@ -253,56 +152,24 @@ module Copernicium
253
152
  # remote: the remote server and directory to push to, formatted "my.server:/the/location/we/want"
254
153
  # branch: the branch that we are pushing to
255
154
  # user: the user to connect as
256
- def PushPull.pull(remote, branch, user)
257
- # check contents of folder for .cn, fail if not present and remove otherwise
258
- crbr = Repos.new.current_branch() # assumed function
259
- dest = remote.split(':')
260
- if(dest.length != 2)
261
- dest = dest.insert(0, "cycle3.csug.rochester.edu")
262
- end
263
- contents = Dir.entries(Dir.pwd)
264
- if(!content.include? '.cn')
265
- puts 'failed to pull from remote, not an initialized Copernicium repo'
266
- return
267
- else
268
- contents = contents.delete_if{|x| (x.eql? '.cn') || (x.eql? '.') || (x.eql? '..')}
269
- end
270
-
271
- # create a new branch and clean it in prep for the incoming files
272
- system "cn branch .temp_pull_#{user}"
273
- contents.each do |x|
274
- system "rm -r #{x}"
275
- end
276
-
277
- # get the file list from the remote directory
278
- connect(dest[0], user) do |session|
279
- session.exec!("cd #{dest[1]}")
280
- session.exec!("cn checkout #{branch}")
281
- collection = session.exec!("ls | cat")
282
- end
283
-
284
- collection = collection.split('\n')
285
- if(!collection.include? '.cn')
286
- puts 'failed to pull from remote, remote folder not an initialized Copernicium repo'
287
- return
288
- else
289
- collection = collection.delete_if{|x| (x.eql? '.cn') || (x.eql? '.') || (x.eql? '..')}
290
- end
291
-
292
- # fetch the files from the remote directory and merge them to the branch
293
- fetch(dest[0], nil, nil, user) do |scp|
294
- collection.each do |x|
295
- scp.download!(dest[1]+'/'+x, Dir.pwd, :recursive => true)
155
+ def PushPull.pull
156
+ fetch do |session|
157
+ # uploading our history to remote
158
+ session.download!("#{@@path}/.cn/merging_#{@@user}",
159
+ "#{Dir.pwd}/.cn/history")
160
+
161
+ # uploading our .cn info to remote
162
+ %w{revs snap}.each do |file|
163
+ session.download!("#{@@path}/.cn/#{file}",
164
+ "#{Dir.pwd}/.cn/#{file}",
165
+ :recursive => true)
296
166
  end
297
167
  end
298
- system "cn add ."
299
- system "cn commit -m \'Temp commit for pull\'"
300
- system "cn checkout #{crbr}"
301
- system "cn merge .temp_pull_#{user}"
302
- system "cn branch -d .temp_pull_#{user}"
303
- puts "Successfully pulled from #{remote}"
168
+ system "cn update", @@user
169
+ puts "Remote #{@@repo} pulled.".grn
304
170
  end
305
171
 
172
+
306
173
  # Function: clone()
307
174
  #
308
175
  # Description:
@@ -310,20 +177,12 @@ module Copernicium
310
177
  #
311
178
  # remote: the remote server and directory to push to, formatted "my.server:/the/location/we/want"
312
179
  # user: the user to connect as
313
- def PushPull.clone(remote, user = nil)
314
- exit_code = false
315
- dest = remote.split(':')
316
- if(dest.length != 2)
317
- dest = dest.insert(0, "cycle3.csug.rochester.edu")
318
- end
180
+ def PushPull.clone
319
181
  begin
320
- fetch(dest[0], dest[1], Dir.pwd, user)
321
- exit_code = true
182
+ PushPull.fetch
322
183
  rescue
323
- puts "Failed to clone the remote branch!".red
184
+ connection_failure 'trying to clone a repo'
324
185
  end
325
-
326
- return exit_code
327
186
  end
328
187
  end
329
188
  end
data/lib/repos.rb CHANGED
@@ -262,6 +262,41 @@ module Copernicium
262
262
  @@history.delete(branch)
263
263
  update_history
264
264
  end
265
+
266
+ # FOR PUSHPULL UPDATE
267
+ def Repos.update(comm = UIComm.new)
268
+ merge_name = File.join(@@copn,'merging_',comm.ops)
269
+ status = "Remote is either up-to-date or ahead of local"
270
+
271
+ if File.exist?(merge_name)
272
+ merger = YAML.load File.read(merge_name)
273
+
274
+ # merge @@history with merger hash
275
+ merger.each do |key, val|
276
+ if @@history.keys.include? key
277
+ val.each_with_index do |snap, index|
278
+ if @@history[key][index].nil?
279
+ @@history[key] += val[index..-1]
280
+ status = "Updated remote successfully"
281
+ elsif @@history[key][index] == snap
282
+ next
283
+ elsif @@history[key][index] != snap
284
+ @@history[key] += val[index..-1]
285
+ status = "Merged remote history with local"
286
+ end
287
+ end
288
+ else
289
+ @@history[key] = val
290
+ end
291
+ end
292
+
293
+ File.delete(merge_name)
294
+ update_history
295
+ puts status
296
+ else
297
+ puts 'Error updating: '.red + merge_name + 'doesnt exist.'
298
+ end
299
+ end # update
265
300
  end # Repos
266
301
  end # Copernicium
267
302
 
data/lib/required.rb CHANGED
@@ -15,7 +15,7 @@ require 'net/scp' # Needed for file transfer between servers
15
15
  require_relative 'banners'
16
16
  require_relative 'RevLog'
17
17
  require_relative 'repos'
18
- require_relative 'pushpull'
19
18
  require_relative 'workspace'
19
+ require_relative 'pushpull'
20
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.1.1"
4
+ VERSION = "0.1.2"
5
5
 
6
6
  module Copernicium
7
7
  # Communication object that will pass commands to backend modules
@@ -52,6 +52,8 @@ module Copernicium
52
52
  # create the cn project, else already in one
53
53
  if cmd == 'init'
54
54
  noroot?? init(args) : puts(IN_REPO_WARNING.yel, getroot)
55
+ elsif cmd == 'clone' # allow cloning a new repo
56
+ clone args
55
57
  elsif noroot? # if not in a repo, warn them, tell how to create
56
58
  puts NO_REPO_WARNING.yel
57
59
  else # now, assume we are in a copernicum project
@@ -67,8 +69,6 @@ module Copernicium
67
69
  branch args
68
70
  when 'clean'
69
71
  clean args
70
- when 'clone'
71
- clone args
72
72
  when 'commit'
73
73
  commit args
74
74
  when 'checkout'
@@ -79,6 +79,8 @@ module Copernicium
79
79
  push args
80
80
  when 'pull'
81
81
  pull args
82
+ when 'update'
83
+ update args
82
84
  when 'init'
83
85
  # fall through - init handled above, before case statement
84
86
  else # handle an unrecognized argument, show help and exit
@@ -249,23 +251,16 @@ module Copernicium
249
251
  ui
250
252
  end
251
253
 
254
+ # usage: cn clone <user> <repo.host:/dir/of/repo>
252
255
  def clone(args)
253
- # Command usage is:
254
- # cn clone <user> <repo.host:/dir/of/repo>
255
- user = args.first
256
- if user.nil?
257
- user = get "username for clone"
258
- # Make sure username is first arg, since PushPull is expecting this.
259
- args << user
260
- end
256
+ user = args.shift
257
+ user = get "username for clone" if user.nil?
261
258
 
262
- repo = args[1]
263
- repo = get "repo url to clone (format: <repo.host:/dir/of/repo>)" if repo.nil?
259
+ repo = args.first
260
+ repo = get "url to clone (format: <repo.host:/dir/of/repo>)" if repo.nil?
264
261
 
265
- comm = UIComm.new(command: 'clone', opts: args, repo: repo)
266
- # Do the clone
262
+ comm = UIComm.new(command: 'clone', opts: user, repo: repo)
267
263
  PushPull.UICommandParser(comm)
268
-
269
264
  comm
270
265
  end
271
266
 
@@ -297,7 +292,7 @@ module Copernicium
297
292
 
298
293
  def merge(args)
299
294
  if args.empty?
300
- rev = get 'single commit or branch to merge'
295
+ rev = get 'branch to merge'
301
296
  else
302
297
  rev = args.first
303
298
  end
@@ -305,21 +300,23 @@ module Copernicium
305
300
  # If rev is a branch name, resolve it to a rev ID.
306
301
  if Repos.has_branch? rev
307
302
  rev = (Repos.history rev).last
308
- end
309
-
310
- conflicts = Workspace.merge(rev)
311
-
312
- # If there were any conflicts, display them to the user.
313
- if not conflicts.nil?
314
-
315
- conflicts.each do |conflict|
316
- puts " #{conflict}".red
303
+ conflicts = Workspace.merge(rev)
304
+ unless conflicts.nil?
305
+ conflicts.each { |conflict| puts "Conflict: ".red + conflict }
317
306
  end
307
+ else # branch not found
308
+ puts "Branch not found: ".red + rev
318
309
  end
310
+ end
319
311
 
320
- # Don't return a UIComm object, since we didn't use one for any of the
321
- # backend calls.
312
+ def update(args)
313
+ if args.empty?
314
+ username = get "user to update to"
315
+ else
316
+ username = args.first
317
+ end
318
+ Repos.update(UIComm.new(command: 'update', ops: username))
322
319
  end
323
320
  end # Driver
324
- end
321
+ end # Copernicium
325
322
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: copernicium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.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-12-07 00:00:00.000000000 Z
11
+ date: 2015-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diffy