cnvrg 0.3.6 → 0.3.8

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: 3f314a2eaa98e7dc70b1c2cf84cc935921a0601c
4
- data.tar.gz: bdd778e228e5d73f652843b2aae7ab6dfe6a4a54
3
+ metadata.gz: 14812c074d9b241c639f215c82da967e632a5b4c
4
+ data.tar.gz: 68845b081b102ec1d06499a09e3e576a00a89e65
5
5
  SHA512:
6
- metadata.gz: 163f6104da853f34810b685a738be1caae9d7f4da348c6c971b30daeb12360a46f177600d592db47fdc99bdaed85b98d9db2fb3a2f0a6a3327683e3d4b9f5a7e
7
- data.tar.gz: e104de7d5bd6b151f2bcdffb43f17537ecbaf4b97e53d923a15076e1eaabf8d90df1b808f67c6c1b2609a5a6d70366eb36fcf00b74583bbf1eccccab48c6ef9f
6
+ metadata.gz: ce3a5373033f6a01bab5e0eb9d839e3a6a3b7d1b15576a996e1c00e5d6ef091e9ac6ac50a320379aa9f7ac691b16f8caacc3116b5bd79c4f3c464fbf17878c23
7
+ data.tar.gz: 2d1ece161322402bd3922b52f0e0371577eeade4c650d037c7956d13c04a3ce701647ff45f45c4c5415006b6e0a6c33f12bda2ddbbb9103c0a0802a49b3438d6
@@ -44,6 +44,7 @@ Gem::Specification.new do |spec|
44
44
  spec.add_runtime_dependency 'activesupport', '~> 5.0'
45
45
  spec.add_runtime_dependency 'ruby-progressbar'
46
46
  spec.add_runtime_dependency 'net-ssh'
47
+ spec.add_runtime_dependency 'down'
47
48
 
48
49
 
49
50
 
@@ -44,24 +44,33 @@ module Cnvrg
44
44
 
45
45
  @user, @pass = n[Cnvrg::Helpers.netrc_domain]
46
46
  begin
47
- conn = Faraday.new
47
+ if !Helpers.is_verify_ssl
48
+
49
+ conn = Faraday.new "#{endpoint_uri}", :ssl => {:verify => false}
50
+ else
51
+ conn = Faraday.new "#{endpoint_uri}"
52
+ end
48
53
  conn.headers['Auth-Token'] = @pass
49
54
  conn.headers['User-Agent'] = "#{Cnvrg::API::USER_AGENT}"
50
-
51
55
  case method
52
- when 'GET'
53
- response = conn.get "#{endpoint_uri}/#{resource}"
54
-
56
+ when 'GET'
57
+ response = conn.get "#{resource}", data
58
+ if response.to_hash[:status] == 404
59
+ return false
60
+ end
55
61
  if parse_request == true
56
62
  JSON.parse(response.body)
57
63
  else
58
64
  response
59
65
  end
60
- when 'POST'
66
+ when 'POST'
61
67
  conn.options.timeout = 420
62
68
  conn.options.open_timeout =420
63
- response = conn.post "#{endpoint_uri}/#{resource}", data
69
+ response = conn.post "#{resource}", data
64
70
 
71
+ if response.to_hash[:status] == 404
72
+ return false
73
+ end
65
74
  if parse_request == true
66
75
  JSON.parse(response.body)
67
76
  else
@@ -72,10 +81,14 @@ module Cnvrg
72
81
  fr.headers['Auth-Token'] = @pass
73
82
  fr.headers['User-Agent'] = "#{Cnvrg::API::USER_AGENT}"
74
83
  fr.headers["Content-Type"] = "multipart/form-data"
84
+ if !Helpers.is_verify_ssl
85
+ fr.ssl.verify = false
86
+ end
75
87
 
76
88
 
77
89
  fr.request :multipart
78
90
  fr.request :url_encoded
91
+ fr.request :retry, max: 2, interval: 0.05,interval_randomness: 0.5, backoff_factor: 2
79
92
  fr.adapter :net_http
80
93
  end
81
94
  conn.options.timeout = 420
@@ -100,6 +113,9 @@ module Cnvrg
100
113
  response = conn.post "#{endpoint_uri}/#{resource}", data
101
114
 
102
115
  FileUtils.rm_rf(temp_path)
116
+ if response.to_hash[:status] == 404
117
+ return false
118
+ end
103
119
 
104
120
 
105
121
  if parse_request == true
@@ -109,7 +125,9 @@ module Cnvrg
109
125
  end
110
126
  when 'DELETE'
111
127
  response = conn.delete "#{endpoint_uri}/#{resource}", data
112
-
128
+ if response.to_hash[:status] == 404
129
+ return false
130
+ end
113
131
  if parse_request == true
114
132
  JSON.parse(response.body)
115
133
  else
@@ -51,6 +51,11 @@ module Cnvrg
51
51
 
52
52
  if url.scheme == 'https'
53
53
  http.use_ssl = true
54
+ if !Helpers.is_verify_ssl
55
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
56
+ end
57
+
58
+
54
59
  end
55
60
  req = Net::HTTP::Post.new(url.request_uri)
56
61
 
@@ -60,6 +60,7 @@ class Thor
60
60
 
61
61
  end
62
62
 
63
+
63
64
  # Let Thor::Options parse the options first, so it can remove
64
65
  # declared options from the array. This will leave us with
65
66
  # a list of arguments that weren't declared.
@@ -193,12 +194,16 @@ module Cnvrg
193
194
  map %w(-v --version) => :version
194
195
 
195
196
  desc 'api', 'set api url, e.g cnvrg --api "https://cnvrg.io/api"'
197
+ method_option :verify_ssl, :type => :boolean, :aliases => ["-s", "--verify_ssl"], :default => true
196
198
 
197
199
  def set_api_url(url)
200
+ log_handler()
201
+ log_start(__method__, args, options)
198
202
  home_dir = File.expand_path('~')
199
203
  if !url.end_with? "/api"
200
204
  url = url + "/api"
201
205
  end
206
+ verify_ssl = options["verify_ssl"]
202
207
  begin
203
208
  if !File.directory? home_dir + "/.cnvrg"
204
209
  FileUtils.mkdir_p([home_dir + "/.cnvrg", home_dir + "/.cnvrg/tmp"])
@@ -207,42 +212,34 @@ module Cnvrg
207
212
  FileUtils.touch [home_dir + "/.cnvrg/config.yml"]
208
213
  end
209
214
  compression_path = "#{File.expand_path('~')}/.cnvrg/tmp"
210
-
211
215
  begin
212
- config = YAML.load_file(home_dir + "/.cnvrg/config.yml")
216
+ config = YAML.load_file(home_dir+"/.cnvrg/config.yml")
213
217
  if !config
214
- config = {owner: "", username: "", version_last_check: get_start_day(), api: url, compression_path: compression_path, }
215
-
218
+ config = {owner: "", username: "", version_last_check: get_start_day(), api: url, compression_path: compression_path ,verify_ssl: verify_ssl }
216
219
  end
220
+
221
+
217
222
  rescue
218
- config = {owner: "", username: "", version_last_check: get_start_day(), api: url, compression_path: compression_path}
223
+ config = {owner: "", username: "", version_last_check: get_start_day(), api: url, compression_path: compression_path ,verify_ssl: verify_ssl }
219
224
  end
220
- owner = config.to_h[:owner]
221
225
 
222
226
  say "Setting default api to be: #{url}", Thor::Shell::Color::BLUE
223
227
  if config.empty?
224
- config = {owner: "", username: "", version_last_check: get_start_day(), api: url, compression_path: compression_path}
228
+ config = {owner: "", username: "", version_last_check: get_start_day(), api: url, compression_path: compression_path, verify_ssl: verify_ssl }
225
229
  else
226
230
  if !config.to_h[:compression_path].nil?
227
231
  compression_path = config.to_h[:compression_path]
228
232
  end
229
- config = {owner: config.to_h[:owner], username: config.to_h[:username], version_last_check: config.to_h[:version_last_check], api: url, compression_path: compression_path}
233
+ config = {owner: config.to_h[:owner], username: config.to_h[:username], version_last_check: config.to_h[:version_last_check], api: url, compression_path: compression_path, verify_ssl: verify_ssl}
230
234
  end
231
- # res = Cnvrg::API.request("/users/#{owner}/custom_api", 'POST', {custom_api: url})
232
- # if Cnvrg::CLI.is_response_success(res, false)
233
235
 
234
236
  checks = Helpers.checkmark
237
+ File.open(home_dir+"/.cnvrg/config.yml", "w+") { |f| f.write config.to_yaml }
235
238
 
236
-
237
- File.open(home_dir + "/.cnvrg/config.yml", "w+") {|f| f.write config.to_yaml}
238
239
  say "#{checks} Done", Thor::Shell::Color::GREEN
239
- # else
240
- # say "Couldn't set default api, contact help@cnvrg.io", Thor::Shell::Color::RED
241
- # exit(1)
242
- #
243
- # end
244
240
 
245
241
  rescue => e
242
+ log_error(e)
246
243
  say "Couldn't set default api, contact help@cnvrg.io", Thor::Shell::Color::RED
247
244
  end
248
245
  end
@@ -272,6 +269,16 @@ module Cnvrg
272
269
  say "Done"
273
270
  rescue
274
271
  say "ERROR", Thor::Shell::Color::RED
272
+ File.open(home_dir+"/.cnvrg/config.yml", "w+") { |f| f.write config.to_yaml }
273
+ say "#{checks} Done", Thor::Shell::Color::GREEN
274
+ # else
275
+ # say "Couldn't set default api, contact help@cnvrg.io", Thor::Shell::Color::RED
276
+ # exit(1)
277
+ #
278
+ # end
279
+
280
+ rescue => e
281
+ say "Couldn't set default api, contact help@cnvrg.io", Thor::Shell::Color::RED
275
282
  end
276
283
  end
277
284
 
@@ -553,7 +560,7 @@ module Cnvrg
553
560
 
554
561
  def new(project_name)
555
562
  begin
556
- verify_logged_in(false)
563
+ verify_logged_in(false)
557
564
  log_start(__method__, args, options)
558
565
  clean = options["clean"]
559
566
  docker_image = options["docker_image"]
@@ -568,8 +575,8 @@ module Cnvrg
568
575
  exit(1)
569
576
 
570
577
  end
571
- if Project.create(project_name, clean, with_docker = docker)
572
- path = Dir.pwd + "/" + project_name
578
+ if Project.create(project_name, clean, with_docker=docker)
579
+ path = Dir.pwd + "/" + project_name
573
580
  @project = Project.new(path)
574
581
  @project.generate_idx
575
582
  if docker
@@ -635,42 +642,6 @@ module Cnvrg
635
642
  end
636
643
  end
637
644
 
638
- desc 'set_image', 'set_image for a project'
639
-
640
- def set_image(docker_image)
641
- verify_logged_in(false)
642
- log_start(__method__, args, options)
643
- working_dir = is_cnvrg_dir
644
- local_images = Docker::Image.all
645
- docker_image_local = local_images.map {|x| x.info["RepoTags"]}.flatten.select {|y| y.include? docker_image}.flatten
646
- if docker_image_local.size == 0
647
-
648
- if yes? "Image wasn't found locally, pull image from cnvrg repository?", Thor::Shell::Color::YELLOW
649
- image = pull(docker_image)
650
- if image
651
- say "downloaded image: #{docker_image}"
652
- @image = Images.new(working_dir, docker_image)
653
- else
654
- say "Could not set image, image was not found", Thor::Shell::Color::RED
655
- exit(1)
656
- end
657
- else
658
- say "Could nset image, image was not found", Thor::Shell::Color::RED
659
- exit(1)
660
-
661
- end
662
- elsif docker_image_local.size == 1
663
- say "found image: #{docker_image_local[0]}, setting it up..", Thor::Shell::Color::BLUE
664
- @image = Images.new(working_dir, docker_image_local[0])
665
- elsif docker_image_local.size > 1
666
- say "found #{docker_image_local.size} images, choose the image name you want to use", Thor::Shell::Color::BLUE
667
- image_name = ask "#{docker_image_local.join("\n")}\n", Thor::Shell::Color::BLUE
668
- image_name = image_name.strip
669
- @image = Images.new(working_dir, image_name)
670
- end
671
- @image.update_image_activity(nil, nil)
672
-
673
- end
674
645
 
675
646
  desc 'link', 'Link current directory to a new cnvrg project'
676
647
  method_option :sync, :type => :boolean, :aliases => ["-s"], :default => false
@@ -793,24 +764,51 @@ module Cnvrg
793
764
  exit(1)
794
765
  end
795
766
  end
767
+ desc 'data delete', 'delete dataset'
768
+ def delete_data(dataset_slug)
769
+ begin
770
+ verify_logged_in(false)
771
+ log_start(__method__, args, options)
772
+ owner = CLI.get_owner
773
+ response = Dataset.delete(dataset_slug, owner)
796
774
 
797
- desc 'data clone', 'Clone dataset'
798
- method_option :commit, :type => :string, :aliases => ["-c", "--commit"], :default => ""
799
- method_option :remote, :type => :boolean, :aliases => ["-r", "--remote"], :default => false
775
+ if Cnvrg::CLI.is_response_success(response)
776
+ log_message("Successfully deleted dataset: #{dataset_slug}", Thor::Shell::Color::GREEN)
777
+ else
778
+ log_message("Error while tying to delete dataset: #{response["messages"]}", Thor::Shell::Color::RED)
800
779
 
801
780
 
802
- def clone_data(dataset_url)
781
+ end
782
+
783
+ rescue => e
784
+ log_error(e)
785
+ rescue SignalException
786
+
787
+ say "\nAborting"
788
+ exit(1)
789
+ end
790
+ end
791
+
792
+ desc 'data clone', 'Clone dataset'
793
+ method_option :commit, :type => :string, :aliases => ["-c", "--commit"], :default => ""
794
+ method_option :only_tree, :type => :boolean, :aliases => ["-t", "--tree"], :default => false
795
+ def clone_data(dataset_url,only_tree=false,commit=nil)
803
796
  begin
804
797
  verify_logged_in(false)
805
798
  log_start(__method__, args, options)
799
+ commit = options["commit"] || commit
800
+ only_tree = options["only_tree"] || only_tree
801
+
802
+
806
803
  url_parts = dataset_url.split("/")
807
804
  project_index = Cnvrg::Helpers.look_for_in_path(dataset_url, "datasets")
808
805
  slug = url_parts[project_index + 1]
809
806
  owner = url_parts[project_index - 1]
810
- response = Cnvrg::API.request("users/#{owner}/datasets/#{slug}/clone", 'GET')
811
-
812
- Cnvrg::CLI.is_response_success(response)
807
+ response = Cnvrg::API.request("users/#{owner}/datasets/#{slug}/clone", 'POST',{ commit: commit})
808
+ Cnvrg::CLI.is_response_success(response,true)
813
809
  dataset_name = response["result"]["name"]
810
+ dataset_home = Dir.pwd+"/"+dataset_name
811
+
814
812
 
815
813
  if (Dir.exists? dataset_name)
816
814
  log_message("Error: Conflict with dir #{dataset_name}", Thor::Shell::Color::RED)
@@ -822,35 +820,88 @@ module Cnvrg
822
820
  end
823
821
  if Dataset.clone(owner, dataset_name, slug)
824
822
  log_message("Cloning #{dataset_name}", Thor::Shell::Color::BLUE)
823
+ @files = Cnvrg::Datafiles.new(owner, slug)
825
824
 
826
- commit_to_clone = options["commit"] || nil
827
- working_dir = "#{Dir.pwd}/#{dataset_name}"
828
- @dataset = Dataset.new(working_dir)
829
- @dataset.generate_idx()
825
+ successful_changes = []
826
+ log_message("Downloading files", Thor::Shell::Color::BLUE)
827
+ commit = response["result"]["commit"]
828
+ idx = {commit: response["result"]["commit"], tree: response["result"]["tree"]}
829
+ File.open(dataset_home + "/.cnvrg/idx.yml", "w+") {|f| f.write idx.to_yaml}
830
+ if !response["result"]["tree"].nil?
831
+ parallel_options = {
832
+ :progress => {
833
+ :title => "Download Progress",
834
+ :progress_mark => '=',
835
+ :format => "%b>>%i| %p%% %t",
836
+ :starting_at => 0,
837
+ :total => response["result"]["tree"].size,
838
+ :autofinish => true
839
+ },
840
+ in_threads: ParallelThreads
841
+ }
842
+ begin
843
+ is_success = true
830
844
 
845
+ Parallel.map((response["result"]["tree"]), parallel_options) do |f|
831
846
 
832
- download_res = download_data(false, false, path = working_dir, in_dir = false)
833
- if !download_res
834
- exit(1)
835
- end
836
- Dataset.verify_cnvrgignore_exist(dataset_name, false)
847
+ relative_path = f[0].gsub(/^#{dataset_home}/, "")
848
+ if f[0].end_with? "/"
849
+ # dir
850
+ if @files.download_dir(dataset_home, relative_path)
851
+ successful_changes << relative_path
852
+ else
853
+ is_success =false
854
+ log_message("Could not create directory: #{f[0]}", Thor::Shell::Color::RED)
855
+ raise Parallel::Kill
856
+ end
857
+ else
858
+ # blob
859
+ if !only_tree
860
+
861
+ if @files.download_file_s3(f[0], relative_path, dataset_home, false, commit_sha1=commit)
862
+ successful_changes << relative_path
863
+ else
864
+ is_success =false
865
+ log_message("Could not download file: #{f[0]}", Thor::Shell::Color::RED)
866
+ raise Parallel::Kill
867
+ end
868
+ end
869
+ end
870
+ end
871
+ rescue Interrupt
872
+ is_success =false
873
+ log_message("Couldn't download", Thor::Shell::Color::RED)
874
+
875
+ exit(1)
876
+ end
837
877
 
838
878
 
879
+ end
839
880
  check = Helpers.checkmark
840
- log_message("#{check} Clone finished successfully", Thor::Shell::Color::GREEN)
881
+
882
+ successful_changes = response["result"]["tree"]
883
+ if !successful_changes.nil? and is_success
884
+ Dataset.verify_cnvrgignore_exist(dataset_name, false)
885
+
886
+ log_message("#{check} Clone finished successfully", Thor::Shell::Color::GREEN)
887
+ else
888
+ log_message("Couldn't download some files", Thor::Shell::Color::RED)
889
+
890
+ end
841
891
 
842
892
  else
843
- @dataset.revert(working_dir) unless @dataset.nil?
844
- log_message("Error creating dataset, please contact support.", Thor::Shell::Color::RED)
845
- exit(0)
893
+
894
+ log_message("Error: Couldn't create directory: #{dataset_name}", Thor::Shell::Color::RED)
895
+ exit(1)
846
896
  end
847
- rescue => e
848
- log_error(e)
849
897
  rescue SignalException
850
-
851
898
  say "\nAborting"
852
899
  exit(1)
853
900
  end
901
+
902
+
903
+
904
+
854
905
  end
855
906
 
856
907
  desc 'init_data_container', 'Init dataset directory', :hide => true
@@ -1029,6 +1080,8 @@ module Cnvrg
1029
1080
  end
1030
1081
 
1031
1082
 
1083
+
1084
+
1032
1085
  desc 'upload_data', 'Upload data files', :hide => true
1033
1086
  method_option :ignore, :type => :array, :aliases => ["-i", "--i"], :desc => "ignore following files"
1034
1087
  method_option :new_branch, :type => :boolean, :aliases => ["-nb", "--nb"], :desc => "create new branch of commits"
@@ -1152,7 +1205,7 @@ module Cnvrg
1152
1205
  update_count += result["deleted"].size
1153
1206
  end
1154
1207
  if update_count == update_total
1155
- res = @files.end_commit(commit_sha1)
1208
+ res = @files.end_commit(commit_sha1,false)
1156
1209
  if (Cnvrg::CLI.is_response_success(res, false))
1157
1210
  # save idx
1158
1211
  begin
@@ -1280,9 +1333,8 @@ module Cnvrg
1280
1333
  relative_path = f.gsub(/^#{@dataset.local_path + "/"}/, "")
1281
1334
  successful_updates << relative_path
1282
1335
  end
1283
- @dataset.update_idx_with_files_commits!((successful_deletions + successful_updates), commit_time)
1336
+ @dataset.update_idx_with_files_commits!((successful_deletions+successful_updates), commit_time)
1284
1337
 
1285
- @dataset.update_idx_with_commit!(commit_sha1)
1286
1338
  log_message("Compressing data", Thor::Shell::Color::BLUE)
1287
1339
 
1288
1340
  home_dir = File.expand_path('~')
@@ -1366,10 +1418,10 @@ module Cnvrg
1366
1418
  exit(0)
1367
1419
  rescue => e
1368
1420
  log_error(e)
1369
- if !Cnvrg::Helpers.internet_connection?
1370
- say "Seems there is no internet connection", Thor::Shell::Color::RED
1371
-
1372
- end
1421
+ # if !Cnvrg::Helpers.internet_connection?
1422
+ # say "Seems there is no internet connection", Thor::Shell::Color::RED
1423
+ #
1424
+ # end
1373
1425
  if File.exist? log_file
1374
1426
  @files.upload_data_log_file(log_file, log_file, commit_sha1)
1375
1427
  end
@@ -1428,12 +1480,16 @@ module Cnvrg
1428
1480
  if owner.nil? or owner.empty?
1429
1481
  owner = CLI.get_owner()
1430
1482
  end
1483
+
1431
1484
  result = @dataset.list(owner)
1432
- list = result["result"]["list"]
1485
+ Cnvrg::CLI.is_response_success(result)
1433
1486
 
1434
- print_table(list)
1487
+ list = result["result"]["list"]
1435
1488
 
1436
- end
1489
+ print_table(list)
1490
+
1491
+
1492
+ end
1437
1493
 
1438
1494
  desc 'data commits', 'List all commits for a specific dataset'
1439
1495
 
@@ -1640,7 +1696,7 @@ module Cnvrg
1640
1696
  new_branch = options["new_branch"] || false
1641
1697
  force = options["force"] || false
1642
1698
 
1643
- result = @project.compare_idx(new_branch, force: force)["result"]
1699
+ result = @project.compare_idx(new_branch,force:force)["result"]
1644
1700
  commit = result["commit"]
1645
1701
  result = result["tree"]
1646
1702
  log_message("Comparing local changes with remote version:", Thor::Shell::Color::BLUE)
@@ -1710,112 +1766,487 @@ module Cnvrg
1710
1766
  exit(1)
1711
1767
  end
1712
1768
  end
1769
+ desc 'sync_data_new', 'sync_data_new'
1770
+ method_option :verbose, :type => :boolean, :aliases => ["-v"], :default => false
1771
+ method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
1772
+ method_option :force, :type => :boolean, :aliases => ["-f","--force"], :default => false
1773
+ method_option :commit, :type => :string, :aliases => ["-c"], :desc => "download specified commit", :default => nil
1774
+ method_option :all_files, :type => :boolean, :aliases => ["--all"], :desc => "download specified commit", :default => true
1713
1775
 
1776
+ def sync_data_new(new_branch, force, verbose, commit, all_files)
1777
+ verify_logged_in(true)
1778
+ log_start(__method__, args, options)
1779
+ log_message('Syncing dataset', Thor::Shell::Color::BLUE, !options["verbose"])
1780
+ if !options[:force]
1781
+ invoke :download_data_new,[verbose,true, commit, all_files], :new_branch=>new_branch, :direct=>false, :force =>force
1782
+ end
1783
+ invoke :upload_data_new,[new_branch, verbose,true,force], :new_branch=>new_branch, :direct=>false, :force =>force, :sync =>true
1714
1784
 
1715
- desc 'upload', 'Upload updated files'
1716
- method_option :ignore, :type => :string, :aliases => ["-i"], :desc => "ignore following files", :default => ""
1717
- method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
1785
+ end
1786
+ desc 'upload_data_new', 'upload_data_new'
1718
1787
  method_option :verbose, :type => :boolean, :aliases => ["-v"], :default => false
1719
- method_option :sync, :type => :boolean, :aliases => ["-s"], :default => false
1720
- method_option :force, :type => :boolean, :aliases => ["-f", "--force"], :default => false
1721
- method_option :message, :type => :string, :aliases => ["-m", "--message"], :default => ""
1722
- method_option :deploy, :type => :boolean, :aliases => ["-d", "--deploy"], :default => false
1788
+ method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
1789
+ method_option :force, :type => :boolean, :aliases => ["-f","--force"], :default => false
1790
+ method_option :sync, :type => :boolean, :aliases => ["-s","--sync"], :default => false
1791
+ def upload_data_new(new_branch, verbose,sync,force)
1792
+ commit = invoke :start_commit_data,[], :new_branch=>new_branch, :direct=>false, :force =>force
1793
+
1794
+ upload_res = invoke :upload_data_files,[commit],:new_branch=>new_branch, :verbose =>verbose, :force =>force, :sync =>sync
1795
+ if upload_res
1796
+ invoke :end_commit_data,[commit] , :new_branch=>new_branch, :force =>force
1797
+ end
1723
1798
 
1724
- def upload(link = false, sync = false, direct = false, ignore_list = "")
1799
+ end
1800
+
1801
+ desc 'start_commit', 'start data commit'
1802
+ method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
1803
+ method_option :direct, :type => :boolean, :aliases => ["-d","--direct"], :desc => "was called directed", :default => true
1804
+ method_option :force, :type => :boolean, :aliases => ["-f","--force"], :default => false
1725
1805
 
1806
+ def start_commit_data()
1726
1807
  begin
1727
1808
  verify_logged_in(true)
1728
1809
  log_start(__method__, args, options)
1810
+ dataset_dir = is_cnvrg_dir(Dir.pwd)
1811
+ direct = options[:direct]
1812
+ new_branch = options["new_branch"] || false
1813
+ force = options["force"] || false
1814
+ commit_sha1 = nil
1815
+ @dataset = Dataset.new(dataset_dir)
1816
+ @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug)
1817
+ next_commit = @dataset.get_next_commit()
1818
+ if !next_commit.nil? and !next_commit.empty?
1819
+ resp = @files.get_commit(next_commit)
1820
+ if resp["result"]["status"].eql? "new"
1821
+ resp = @files.start_commit(new_branch,force)
1822
+ commit_sha1 = resp["result"]["commit_sha1"]
1729
1823
 
1730
- @project = Project.new(get_project_home)
1731
- commit_msg = options["message"]
1732
- if commit_msg.nil? or commit_msg.empty?
1733
- commit_msg = ""
1734
- end
1735
-
1736
- @files = Cnvrg::Files.new(@project.owner, @project.slug)
1737
- ignore = options[:ignore] || ""
1738
- force = options[:force] || false
1824
+ @dataset.set_next_commit(commit_sha1)
1739
1825
 
1740
- if ignore.nil? or ignore.empty?
1741
- ignore = ignore_list
1742
- end
1743
- data_ignore = data_dir_include()
1744
- if !data_ignore.nil?
1745
- if ignore.nil? or ignore.empty?
1746
- ignore = data_ignore
1747
1826
  else
1748
- ignore = "#{ignore},#{data_ignore}"
1749
- end
1750
- end
1751
- if !@project.update_ignore_list(ignore)
1752
- log_message("Couldn't append new ignore files to .cnvrgignore", Thor::Shell::Color::YELLOW)
1753
- end
1754
- new_branch = options["new_branch"] || false
1755
-
1756
- if options["sync"] or sync
1757
- new_branch_exp = @project.get_new_branch
1758
- if new_branch_exp
1759
- new_branch = new_branch_exp
1760
- end
1761
- end
1762
1827
 
1763
- result = @project.compare_idx(new_branch, force: force, deploy: options["deploy"])
1764
- commit = result["result"]["commit"]
1765
- if !link
1766
- if ((commit != @project.last_local_commit and !@project.last_local_commit.nil? and !result["result"]["tree"]["updated_on_server"].empty?) and !force)
1828
+ commit_sha1 = resp["result"]["commit_sha1"]
1767
1829
 
1768
- log_message("Remote server has an updated version, please run `cnvrg download` first, or alternatively: `cnvrg sync`", Thor::Shell::Color::BLUE)
1769
- exit(1)
1770
1830
  end
1831
+ else
1771
1832
 
1772
- log_message("Comparing local changes with remote version:", Thor::Shell::Color::BLUE, (options["verbose"]))
1833
+ resp = @files.start_commit(new_branch,force)
1834
+ commit_sha1 = resp["result"]["commit_sha1"]
1835
+
1836
+ @dataset.set_next_commit(commit_sha1)
1773
1837
  end
1774
- result = result["result"]["tree"]
1775
- # if result["added"].any? {|x| x.include? ".conflict"} or !result["conflicts"].empty?
1776
- # all = result["added"].select {|x| x.include? ".conflict"} +result["conflicts"].flatten
1777
- # if all.size == 1
1778
- # num = "conflict"
1779
- # else
1780
- # num = "conflicts"
1781
- # end
1782
- # say "Project contains #{all.size} #{num}:", Thor::Shell::Color::RED
1783
- # say "#{all.join("\n")}"
1784
- # say "Please fix #{num}, and retry", Thor::Shell::Color::RED
1785
- # exit(1)
1786
- #
1787
- # end
1788
- check = Helpers.checkmark()
1789
- if result["added"].empty? and result["updated_on_local"].empty? and result["deleted"].empty?
1790
- log_message("#{check} Project is up to date", Thor::Shell::Color::GREEN, (((options["sync"] or sync) and !direct) ? false : true))
1791
- return true
1838
+ if direct
1839
+ puts commit_sha1
1792
1840
  end
1793
- update_count = 0
1794
- update_total = result["added"].size + result["updated_on_local"].size + result["deleted"].size
1795
- successful_updates = []
1796
- successful_deletions = []
1797
- if options["verbose"]
1798
- if update_total == 1
1799
- log_message("Updating #{update_total} file", Thor::Shell::Color::BLUE)
1800
- else
1801
- log_message("Updating #{update_total} files", Thor::Shell::Color::BLUE)
1841
+ return commit_sha1
1842
+ rescue => e
1843
+ puts e
1844
+ if !commit_sha1.nil?
1845
+ @dataset.set_next_commit(commit_sha1)
1802
1846
  end
1803
- else
1804
- log_message("Syncing files", Thor::Shell::Color::BLUE, ((options["sync"] or sync)) ? false : true)
1847
+ rescue SignalException
1848
+ log_message("Aborting..", Thor::Shell::Color::YELLOW)
1849
+ if !commit_sha1.nil?
1805
1850
 
1851
+ @dataset.set_next_commit(commit_sha1)
1806
1852
  end
1807
- # Start commit
1808
- commit_sha1 = @files.start_commit(new_branch, force: force)["result"]["commit_sha1"]
1809
1853
 
1810
- # upload / update
1811
- begin
1854
+ exit(1)
1855
+ end
1812
1856
 
1813
- parallel_options = {
1814
- :progress => {
1815
- :title => "Upload Progress",
1816
- :progress_mark => '=',
1817
- :format => "%b>>%i| %p%% %t",
1818
- :starting_at => 0,
1857
+ end
1858
+ desc 'end_commit', 'start data commit'
1859
+ method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
1860
+ method_option :force, :type => :boolean, :aliases => ["-f","--force"], :default => false
1861
+
1862
+ def end_commit_data(commit)
1863
+ begin
1864
+ verify_logged_in(true)
1865
+ log_start(__method__, args, options)
1866
+ dataset_dir = is_cnvrg_dir(Dir.pwd)
1867
+ @dataset = Dataset.new(dataset_dir)
1868
+ @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug)
1869
+ force = options["force"] || false
1870
+
1871
+ resp = @files.end_commit(commit, force)
1872
+ if (resp and resp["result"])
1873
+ check = Helpers.checkmark()
1874
+ @dataset.remove_next_commit()
1875
+ log_message("#{check} Data files were updated successfully", Thor::Shell::Color::GREEN)
1876
+ end
1877
+
1878
+
1879
+ rescue => e
1880
+ puts e
1881
+ rescue SignalException
1882
+ @dataset.set_next_commit(commit)
1883
+ log_message("Aborting", Thor::Shell::Color::YELLOW)
1884
+ exit(1)
1885
+ end
1886
+
1887
+ end
1888
+ desc 'list_files', 'list files in dataset'
1889
+ method_option :json, :type => :boolean, :aliases => ["-j","--json"],:default => true, :desc => "response as json"
1890
+ method_option :commit, :type => :string, :aliases => ["-c","--commit"], :default => nil
1891
+
1892
+ def list_files_dataset()
1893
+ begin
1894
+ verify_logged_in(true)
1895
+ log_start(__method__, args, options)
1896
+ commit = options[:commit]
1897
+ as_json = options[:json]
1898
+ dataset_dir = is_cnvrg_dir(Dir.pwd)
1899
+ @dataset = Dataset.new(dataset_dir)
1900
+
1901
+ resp = @dataset.list_files(commit, as_json)
1902
+ if (resp and resp["result"])
1903
+ if as_json
1904
+ puts resp["result"]
1905
+ else
1906
+ print_table(resp["result"])
1907
+
1908
+ end
1909
+
1910
+ end
1911
+
1912
+
1913
+ rescue => e
1914
+ puts e
1915
+ rescue SignalException
1916
+ @dataset.set_next_commit(commit)
1917
+ log_message("Aborting", Thor::Shell::Color::YELLOW)
1918
+ exit(1)
1919
+ end
1920
+
1921
+ end
1922
+ desc 'upload_data', 'Upload updated files'
1923
+ method_option :ignore, :type => :string, :aliases => ["-i"], :desc => "ignore following files", :default => ""
1924
+ method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
1925
+ method_option :verbose, :type => :boolean, :aliases => ["-v"], :default => false
1926
+ method_option :sync, :type => :boolean, :aliases => ["-s"], :default => false
1927
+ method_option :force, :type => :boolean, :aliases => ["-f","--force"], :default => false
1928
+
1929
+ def upload_data_files(new_commit, *files)
1930
+
1931
+ begin
1932
+ verify_logged_in(true)
1933
+ log_start(__method__, args, options)
1934
+ dataset_dir = is_cnvrg_dir(Dir.pwd)
1935
+
1936
+ @dataset = Dataset.new(dataset_dir)
1937
+ @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug)
1938
+ next_commit = @dataset.get_next_commit()
1939
+
1940
+
1941
+ if (new_commit.nil? or new_commit.empty?) and next_commit.nil?
1942
+ log_message("You must specify commit, run start_commit to create new commit", Thor::Shell::Color::RED)
1943
+ exit(1)
1944
+ end
1945
+
1946
+ force = options[:force] || false
1947
+
1948
+ new_branch = options["new_branch"] || false
1949
+ log_message("Checking dataset", Thor::Shell::Color::BLUE) unless options[:sync]
1950
+ local_idx = @dataset.generate_idx
1951
+ result = @dataset.compare_idx(new_branch, commit=@dataset.last_local_commit, local_idx= local_idx, force=force, next_commit= next_commit)
1952
+
1953
+ commit_sha1 = result["result"]["commit"]
1954
+ if commit_sha1 != @dataset.last_local_commit and !@dataset.last_local_commit.nil? and !result["result"]["tree"]["updated_on_server"].empty?
1955
+ @dataset.remove_next_commit()
1956
+ @files.delete_commit(next_commit)
1957
+ log_message("Remote server has an updated version, please run `cnvrg data download` first or cnvrg data upload --new_branch", Thor::Shell::Color::BLUE)
1958
+ exit(1)
1959
+ end
1960
+ check = Helpers.checkmark()
1961
+
1962
+
1963
+ commit_time = result["result"]["commit_time"]
1964
+ already_uploaded = result["result"]["uploaded"]
1965
+ dirs_uploaded = []
1966
+ files_uploaded = []
1967
+ files_uploaded_names = []
1968
+ if !already_uploaded.nil? and !already_uploaded.empty?
1969
+
1970
+ dirs_uploaded = already_uploaded["dirs"]
1971
+ files_uploaded = already_uploaded["blobs"]
1972
+ if !files_uploaded.nil? and !files_uploaded.empty?
1973
+ files_uploaded_names = already_uploaded["blobs"].keys
1974
+ end
1975
+
1976
+ end
1977
+
1978
+ result = result["result"]["tree"]
1979
+ if result["added"].empty? and result["updated_on_local"].empty? and result["deleted"].empty?
1980
+ @files.delete_commit(next_commit)
1981
+
1982
+ log_message("#{check} Dataset is up to date", Thor::Shell::Color::GREEN, true)
1983
+ return false
1984
+ end
1985
+ log_message("Creating new commit for dataset: #{@dataset.slug}", Thor::Shell::Color::BLUE) unless options[:sync]
1986
+
1987
+
1988
+ # upload / update
1989
+ begin
1990
+
1991
+ parallel_options = {
1992
+ :progress => {
1993
+ :title => "Upload Progress",
1994
+ :progress_mark => '=',
1995
+ :format => "%b>>%i| %p%% %t",
1996
+ :starting_at => 0,
1997
+ :total => (result["added"] + result["updated_on_local"]).size,
1998
+ :autofinish => true
1999
+ },
2000
+ in_threads: ParallelThreads,
2001
+ isolation: true
2002
+ }
2003
+ successful_updates = []
2004
+ update_count =0
2005
+ update_total = (result["added"] + result["updated_on_local"] + result["deleted"]).size
2006
+
2007
+ if (result["added"] + result["updated_on_local"]).size > 0
2008
+ begin
2009
+ upload_result = Parallel.map((result["added"] + result["updated_on_local"]), parallel_options) do |f|
2010
+ absolute_path = "#{@dataset.local_path}/#{f}"
2011
+ relative_path = f.gsub(/^#{@dataset.local_path + "/"}/, "")
2012
+ if File.directory?(absolute_path)
2013
+ if dirs_uploaded.include? f
2014
+ #Already uploaded and didn't finish commit
2015
+ log_message("Already uploaded dir: #{f}", Thor::Shell::Color::BLUE, options["verbose"])
2016
+
2017
+ next
2018
+ end
2019
+ log_message("uploading dir: #{f}", Thor::Shell::Color::BLUE, options["verbose"])
2020
+
2021
+ resDir = @files.create_dir(absolute_path, relative_path, commit_sha1)
2022
+ if resDir
2023
+ update_count += 1
2024
+ successful_updates<< relative_path
2025
+ else
2026
+ log_message("Failed to upload directory: #{ relative_path }", Thor::Shell::Color::RED)
2027
+
2028
+ raise Parallel::Kill
2029
+ end
2030
+
2031
+ else
2032
+ if files_uploaded_names.include? f
2033
+ log_message("Already uploaded file: #{f}", Thor::Shell::Color::BLUE, options["verbose"])
2034
+
2035
+ next
2036
+ end
2037
+ log_message("uploading: #{f}", Thor::Shell::Color::BLUE, options["verbose"])
2038
+
2039
+ res = @files.upload_file(absolute_path, relative_path, commit_sha1)
2040
+ if res
2041
+ update_count += 1
2042
+
2043
+ successful_updates<< relative_path
2044
+ else
2045
+ log_message("Failed to upload: #{ File.basename(absolute_path) }", Thor::Shell::Color::RED)
2046
+
2047
+ raise Parallel::Kill
2048
+
2049
+ end
2050
+ end
2051
+ end
2052
+ rescue SignalException
2053
+ log_message("Exception while trying to upload, look at the log for more details", Thor::Shell::Color::RED)
2054
+
2055
+
2056
+ exit(1)
2057
+ end
2058
+ end
2059
+
2060
+ end
2061
+ successful_updates = upload_result.to_a + dirs_uploaded + files_uploaded_names
2062
+ successful_deletions =[]
2063
+
2064
+
2065
+ # delete
2066
+
2067
+ deleted = update_deleted(result["deleted"])
2068
+ begin
2069
+
2070
+ deleted_result = Parallel.map(deleted, in_threads: ParallelThreads) do |f|
2071
+
2072
+ relative_path = f.gsub(/^#{@dataset.local_path + "/"}/, "")
2073
+ if relative_path.end_with?("/")
2074
+ log_message("deleting dir: #{f}", Thor::Shell::Color::RED, options["verbose"])
2075
+
2076
+ if @files.delete_dir(f, relative_path, commit_sha1)
2077
+ successful_deletions << f
2078
+ else
2079
+ log_message("Failed to delete directory: #{ f }", Thor::Shell::Color::RED)
2080
+ raise Parallel::Kill
2081
+
2082
+ end
2083
+ else
2084
+ log_message("deleteing file: #{f}", Thor::Shell::Color::RED, options["verbose"])
2085
+
2086
+ if @files.delete_file(f, relative_path, commit_sha1)
2087
+ successful_deletions << f
2088
+
2089
+ else
2090
+ log_message("Failed to delete file: #{ f }", Thor::Shell::Color::RED)
2091
+ raise Parallel::Kill
2092
+
2093
+
2094
+ end
2095
+ end
2096
+ end
2097
+
2098
+
2099
+ successful_deletions += successful_deletions.select { |x| not x.nil? }
2100
+
2101
+
2102
+ successful_updates = successful_updates.select { |x| not x.nil? }
2103
+
2104
+ update_count = successful_updates.size
2105
+
2106
+ rescue SignalException
2107
+ say "User aborted", Thor::Shell::Color::RED
2108
+ exit(0)
2109
+ rescue => e
2110
+ log_message("Exception while trying to upload, look at the log for more details", Thor::Shell::Color::RED)
2111
+ log_error(e)
2112
+ exit(0)
2113
+ end
2114
+ if !result["deleted"].nil? and !result["deleted"].empty?
2115
+ update_count += result["deleted"].size
2116
+ end
2117
+
2118
+ if update_count == update_total
2119
+ begin
2120
+ @dataset.update_idx_with_files_commits!((successful_deletions+successful_updates), commit_time)
2121
+
2122
+ return true
2123
+ rescue => e
2124
+ log_message("Exception while trying to upload, look at the log for more details", Thor::Shell::Color::RED)
2125
+
2126
+ exit(1)
2127
+
2128
+ end
2129
+
2130
+ end
2131
+ rescue => e
2132
+
2133
+ log_message("Exception while trying to upload, look at the log for more details", Thor::Shell::Color::RED)
2134
+ log_error(e)
2135
+
2136
+ exit(1)
2137
+ rescue SignalException
2138
+
2139
+ say "\nAborting", Thor::Shell::Color::BLUE
2140
+ exit(1)
2141
+ end
2142
+
2143
+ end
2144
+
2145
+
2146
+ desc 'upload', 'Upload updated files'
2147
+ method_option :ignore, :type => :string, :aliases => ["-i"], :desc => "ignore following files", :default => ""
2148
+ method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
2149
+ method_option :verbose, :type => :boolean, :aliases => ["-v"], :default => false
2150
+ method_option :sync, :type => :boolean, :aliases => ["-s"], :default => false
2151
+ method_option :force, :type => :boolean, :aliases => ["-f", "--force"], :default => false
2152
+ method_option :message, :type => :string, :aliases => ["-m", "--message"], :default => ""
2153
+ method_option :deploy, :type => :boolean, :aliases => ["-d", "--deploy"], :default => false
2154
+
2155
+ def upload(link = false, sync = false, direct = false, ignore_list = "")
2156
+
2157
+ begin
2158
+ verify_logged_in(true)
2159
+ log_start(__method__, args, options)
2160
+
2161
+ @project = Project.new(get_project_home)
2162
+ commit_msg = options["message"]
2163
+ if commit_msg.nil? or commit_msg.empty?
2164
+ commit_msg = ""
2165
+ end
2166
+
2167
+ @files = Cnvrg::Files.new(@project.owner, @project.slug)
2168
+ ignore = options[:ignore] || ""
2169
+ force = options[:force] || false
2170
+
2171
+ if ignore.nil? or ignore.empty?
2172
+ ignore = ignore_list
2173
+ end
2174
+ data_ignore = data_dir_include()
2175
+ if !data_ignore.nil?
2176
+ if ignore.nil? or ignore.empty?
2177
+ ignore = data_ignore
2178
+ else
2179
+ ignore = "#{ignore},#{data_ignore}"
2180
+ end
2181
+ end
2182
+ if !@project.update_ignore_list(ignore)
2183
+ log_message("Couldn't append new ignore files to .cnvrgignore", Thor::Shell::Color::YELLOW)
2184
+ end
2185
+ new_branch = options["new_branch"] || false
2186
+
2187
+ if options["sync"] or sync
2188
+ new_branch_exp = @project.get_new_branch
2189
+ if new_branch_exp
2190
+ new_branch = new_branch_exp
2191
+ end
2192
+ end
2193
+
2194
+ result = @project.compare_idx(new_branch, force: force, deploy: options["deploy"])
2195
+ commit = result["result"]["commit"]
2196
+ if !link
2197
+ if ((commit != @project.last_local_commit and !@project.last_local_commit.nil? and !result["result"]["tree"]["updated_on_server"].empty?) and !force)
2198
+
2199
+ log_message("Remote server has an updated version, please run `cnvrg download` first, or alternatively: `cnvrg sync`", Thor::Shell::Color::BLUE)
2200
+ exit(1)
2201
+ end
2202
+
2203
+ log_message("Comparing local changes with remote version:", Thor::Shell::Color::BLUE, (options["verbose"]))
2204
+ end
2205
+ result = result["result"]["tree"]
2206
+ # if result["added"].any? {|x| x.include? ".conflict"} or !result["conflicts"].empty?
2207
+ # all = result["added"].select {|x| x.include? ".conflict"} +result["conflicts"].flatten
2208
+ # if all.size == 1
2209
+ # num = "conflict"
2210
+ # else
2211
+ # num = "conflicts"
2212
+ # end
2213
+ # say "Project contains #{all.size} #{num}:", Thor::Shell::Color::RED
2214
+ # say "#{all.join("\n")}"
2215
+ # say "Please fix #{num}, and retry", Thor::Shell::Color::RED
2216
+ # exit(1)
2217
+ #
2218
+ # end
2219
+ check = Helpers.checkmark()
2220
+ if result["added"].empty? and result["updated_on_local"].empty? and result["deleted"].empty?
2221
+ log_message("#{check} Project is up to date", Thor::Shell::Color::GREEN, (((options["sync"] or sync) and !direct) ? false : true))
2222
+ return true
2223
+ end
2224
+ update_count = 0
2225
+ update_total = result["added"].size + result["updated_on_local"].size + result["deleted"].size
2226
+ successful_updates = []
2227
+ successful_deletions = []
2228
+ if options["verbose"]
2229
+ if update_total == 1
2230
+ log_message("Updating #{update_total} file", Thor::Shell::Color::BLUE)
2231
+ else
2232
+ log_message("Updating #{update_total} files", Thor::Shell::Color::BLUE)
2233
+ end
2234
+ else
2235
+ log_message("Syncing files", Thor::Shell::Color::BLUE, ((options["sync"] or sync)) ? false : true)
2236
+
2237
+ end
2238
+ # Start commit
2239
+ commit_sha1 = @files.start_commit(new_branch, force: force)["result"]["commit_sha1"]
2240
+
2241
+ # upload / update
2242
+ begin
2243
+
2244
+ parallel_options = {
2245
+ :progress => {
2246
+ :title => "Upload Progress",
2247
+ :progress_mark => '=',
2248
+ :format => "%b>>%i| %p%% %t",
2249
+ :starting_at => 0,
1819
2250
  :total => (result["added"] + result["updated_on_local"]).size,
1820
2251
  :autofinish => true
1821
2252
  },
@@ -1931,78 +2362,309 @@ module Cnvrg
1931
2362
  update_count += result["deleted"].size
1932
2363
  end
1933
2364
 
1934
- if update_count == update_total
1935
- res = @files.end_commit(commit_sha1, force: force, message: commit_msg)
1936
- if (Cnvrg::CLI.is_response_success(res, false))
1937
- # save idx
1938
- begin
1939
- @project.update_idx_with_files_commits!((successful_deletions + successful_updates), res["result"]["commit_time"])
2365
+ if update_count == update_total
2366
+ res = @files.end_commit(commit_sha1, force: force, message: commit_msg)
2367
+ if (Cnvrg::CLI.is_response_success(res, false))
2368
+ # save idx
2369
+ begin
2370
+ @project.update_idx_with_files_commits!((successful_deletions + successful_updates), res["result"]["commit_time"])
2371
+
2372
+ @project.update_idx_with_commit!(commit_sha1)
2373
+ rescue => e
2374
+ @files.rollback_commit(commit_sha1)
2375
+ log_message("Couldn't commit updates, Rolling Back all changes.", Thor::Shell::Color::RED)
2376
+ log_error(e)
2377
+ exit(1)
2378
+
2379
+ end
2380
+ image = is_project_with_docker(Dir.pwd)
2381
+ if image and image.is_docker
2382
+ image.update_image_activity(commit_sha1, nil)
2383
+ end
2384
+
2385
+ if options["verbose"]
2386
+ log_message("#{check} Done", Thor::Shell::Color::BLUE)
2387
+ if successful_updates.size > 0
2388
+ successful_updates.flatten!
2389
+ log_message("Updated:", Thor::Shell::Color::GREEN)
2390
+ suc = successful_updates.map {|x| x = Helpers.checkmark() + " " + x}
2391
+ log_message(suc.join("\n"), Thor::Shell::Color::GREEN)
2392
+ end
2393
+ if successful_deletions.size > 0
2394
+ successful_deletions.flatten!
2395
+
2396
+ log_message("Deleted:", Thor::Shell::Color::GREEN)
2397
+ del = successful_updates.map {|x| x = Helpers.checkmark() + " " + x}
2398
+ log_message(del.join("\n"), Thor::Shell::Color::GREEN)
2399
+ end
2400
+ log_message("Total of #{update_count} / #{update_total} files.", Thor::Shell::Color::GREEN)
2401
+ else
2402
+ if (options["sync"] or sync) and direct
2403
+ log_message("#{check} Syncing project completed successfully", Thor::Shell::Color::GREEN)
2404
+
2405
+ else
2406
+ log_message("#{check} Changes were updated successfully", Thor::Shell::Color::GREEN)
2407
+
2408
+ end
2409
+
2410
+ end
2411
+
2412
+ else
2413
+ @files.rollback_commit(commit_sha1)
2414
+ log_message("Error: couldn't commit changes, Rolling Back all changes.", Thor::Shell::Color::RED)
2415
+ end
2416
+ else
2417
+ @files.rollback_commit(commit_sha1)
2418
+ log_message("Error: uploaded only: #{update_count} / #{update_total}, \n Rolling back", Thor::Shell::Color::RED)
2419
+
2420
+ end
2421
+ rescue => e
2422
+
2423
+ log_message("Error occurred, \nAborting", Thor::Shell::Color::RED)
2424
+ log_error(e)
2425
+ @files.rollback_commit(commit_sha1) unless commit_sha1.nil?
2426
+ puts e.message
2427
+
2428
+ exit(1)
2429
+ rescue SignalException
2430
+
2431
+ say "\nAborting", Thor::Shell::Color::BLUE
2432
+ say "\nRolling back all changes", Thor::Shell::Color::BLUE
2433
+ @files.rollback_commit(commit_sha1) unless commit_sha1.nil?
2434
+ exit(1)
2435
+ end
2436
+
2437
+ end
2438
+ desc 'download_file_data', 'Download one data files'
2439
+ method_option :verbose, :type => :boolean, :aliases => ["-v", "--verbose"], :default => false
2440
+ method_option :commit, :type => :string, :aliases => ["-c", "--commit"], :desc => "download specified commit", :default => nil
2441
+ method_option :link, :type => :boolean, :aliases => ["-l","--link"], :desc => "download specified commit", :default => false
2442
+ method_option :download_path, :type => :string, :aliases => ["-p", "--path"], :desc => "download specified commit", :default => ""
2443
+ method_option :remote, :type => :boolean, :aliases => ["-r","--remote"], :desc => "remote download", :default => false
2444
+ method_option :json, :type => :boolean, :aliases => ["-j","--json"],:default => false, :desc => "response as json"
2445
+
2446
+ def download_file_data(file_path, *dataset_path)
2447
+
2448
+ verify_logged_in(true)
2449
+ log_start(__method__, args, options)
2450
+ begin
2451
+ if dataset_path.nil? or dataset_path.empty?
2452
+ dataset_path = Dir.pwd
2453
+ elsif dataset_path.is_a? Array
2454
+ dataset_path = dataset_path[0]
2455
+ end
2456
+ dataset_dir = is_cnvrg_dir(dataset_path)
2457
+ @dataset = Dataset.new(dataset_dir)
2458
+ @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug)
2459
+ commit_to_download = options["commit"] || nil
2460
+ as_link = options["link"] || false
2461
+ download_path = options["path"]
2462
+ remote = options["remote"]
2463
+ as_json = options["json"]
2464
+ if remote
2465
+ download_path = "/data/#{@dataset.title}/"
2466
+
2467
+ else
2468
+ download_path = dataset_dir
2469
+ end
2470
+ if !as_json
2471
+
2472
+ log_message("Downloading file", Thor::Shell::Color::BLUE)
2473
+
2474
+ end
2475
+ res = @files.download_file_s3(file_path, file_path, download_path, conflict=false, commit_sha1=commit_to_download, as_link=as_link)
2476
+ if as_link
2477
+ puts res
2478
+ else
2479
+ if res
2480
+ if as_json
2481
+ response = {"status":"success"}
2482
+ puts response.to_json
2483
+ else
2484
+ log_message("#{Helpers.checkmark()} File #{file_path} was successfully downloaded", Thor::Shell::Color::GREEN)
2485
+
2486
+ end
2487
+ end
2488
+
2489
+
2490
+ end
2491
+
2492
+ rescue =>e
2493
+ log_message("Error occurred, \nAborting", Thor::Shell::Color::BLUE)
2494
+ log_error(e)
2495
+ exit(1)
2496
+ end
2497
+ end
2498
+
2499
+ desc 'download_data_new', 'Download updated files'
2500
+ method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
2501
+ method_option :verbose, :type => :boolean, :aliases => ["-v"], :default => false
2502
+ method_option :sync, :type => :boolean, :aliases => ["-s"], :default => false
2503
+ method_option :commit, :type => :string, :aliases => ["-c"], :desc => "download specified commit", :default => ""
2504
+ method_option :all_files, :type => :boolean, :aliases => ["--all"], :desc => "download specified commit", :default => false
2505
+
2506
+ begin
2507
+ def download_data_new(verbose=false,sync=false, commit=nil,all_files=true)
2508
+ verify_logged_in(true)
2509
+ log_start(__method__, args, options)
2510
+ dataset_dir = is_cnvrg_dir(Dir.pwd)
2511
+ @dataset = Dataset.new(dataset_dir)
2512
+ @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug)
2513
+ commit_to_download = commit
2514
+ local_idx = @dataset.generate_idx
2515
+ all_files = all_files
2516
+ if !commit_to_download.nil? and !commit_to_download.empty?
2517
+ res = @dataset.compare_idx_download( commit=commit_to_download, local_idx= local_idx,all_files=all_files)
2518
+ else
2519
+ res = @dataset.compare_idx_download( commit=nil, local_idx= local_idx,all_files=all_files)
2520
+
2521
+ end
2522
+
2523
+ result = res["result"]["tree"]
2524
+
2525
+ commit = res["result"]["commit"]
2526
+ if result["updated_on_server"].empty? and result["conflicts"].empty? and result["deleted"].empty?
2527
+ log_message("Dataset is up to date", Thor::Shell::Color::GREEN, ((options["sync"] or sync) ? false : true))
2528
+ return true
2529
+ end
2530
+ update_total = result["updated_on_server"].size + result["conflicts"].size + result["deleted"].size
2531
+
2532
+
2533
+ successful_changes = 0
2534
+ if update_total ==1
2535
+ log_message("Downloading #{update_total} file", Thor::Shell::Color::BLUE, !sync)
2536
+ elsif update_total == 0
2537
+ log_message("Dataset is up to date", Thor::Shell::Color::GREEN, !sync)
2538
+ return true
2539
+ elsif options["verbose"]
2540
+ log_message("Downloading #{update_total} files", Thor::Shell::Color::BLUE)
2541
+ else
2542
+ log_message("Syncing Dataset", Thor::Shell::Color::BLUE, !sync)
2543
+
2544
+ end
2545
+ parallel_options = {
2546
+ :progress => {
2547
+ :title => "Download Progress",
2548
+ :progress_mark => '=',
2549
+ :format => "%b>>%i| %p%% %t",
2550
+ :starting_at => 0,
2551
+ :total => result["updated_on_server"].size,
2552
+ :autofinish => true
2553
+ },
2554
+ in_threads: ParallelThreads
2555
+ }
2556
+ conflicts = 0
2557
+ if !result["conflicts"].empty?
2558
+ begin
2559
+
2560
+
2561
+ conflicts_result = Parallel.map(result["conflicts"], in_threads: ParallelThreads) do |f|
2562
+
2563
+ relative_path = f.gsub(/^#{@dataset.local_path}/, "")
2564
+ log_message("downloading: #{f}.conflict", Thor::Shell::Color::BLUE, verbose)
2565
+
2566
+ if @files.download_file_s3(f, relative_path, dataset_dir, conflict=true, commit_sha1=commit)
2567
+ conflicts +=1
2568
+ else
2569
+ log_message("Couldn't download: #{f}", Thor::Shell::Color::RED)
2570
+ raise Parallel::Kill
2571
+
2572
+ end
2573
+ end
2574
+ rescue Interrupt
2575
+
2576
+ log_message("Failed to download files", Thor::Shell::Color::RED)
2577
+
2578
+ exit(1)
2579
+ end
2580
+ end
2581
+
2582
+
2583
+ successful_changes += conflicts
2584
+ downloads = 0
2585
+ if !result["updated_on_server"].empty?
2586
+
2587
+ updated_on_server_result = Parallel.map(result["updated_on_server"], parallel_options) do |f|
2588
+ begin
2589
+ relative_path = f.gsub(/^#{@dataset.local_path}/, "")
2590
+ if f.end_with? "/"
2591
+ # dir
2592
+ if !all_files
2593
+ log_message("downloading dir: #{f}", Thor::Shell::Color::BLUE, verbose)
2594
+ if @files.download_dir(dataset_dir, relative_path)
2595
+ downloads +=1
2596
+ else
2597
+ log_message("Couldn't create directory: #{f}", Thor::Shell::Color::RED)
2598
+ raise Parallel::Kill
2599
+
1940
2600
 
1941
- @project.update_idx_with_commit!(commit_sha1)
1942
- rescue => e
1943
- @files.rollback_commit(commit_sha1)
1944
- log_message("Couldn't commit updates, Rolling Back all changes.", Thor::Shell::Color::RED)
1945
- log_error(e)
1946
- exit(1)
2601
+ end
2602
+ end
1947
2603
 
1948
- end
1949
- image = is_project_with_docker(Dir.pwd)
1950
- if image and image.is_docker
1951
- image.update_image_activity(commit_sha1, nil)
1952
- end
2604
+ else
2605
+ # blob
2606
+ log_message("downloading file: #{f}", Thor::Shell::Color::BLUE, verbose)
1953
2607
 
1954
- if options["verbose"]
1955
- log_message("#{check} Done", Thor::Shell::Color::BLUE)
1956
- if successful_updates.size > 0
1957
- successful_updates.flatten!
1958
- log_message("Updated:", Thor::Shell::Color::GREEN)
1959
- suc = successful_updates.map {|x| x = Helpers.checkmark() + " " + x}
1960
- log_message(suc.join("\n"), Thor::Shell::Color::GREEN)
1961
- end
1962
- if successful_deletions.size > 0
1963
- successful_deletions.flatten!
2608
+ if @files.download_file_s3(f, relative_path, dataset_dir,conflict=false, commit_sha1=commit)
2609
+ downloads +=1
1964
2610
 
1965
- log_message("Deleted:", Thor::Shell::Color::GREEN)
1966
- del = successful_updates.map {|x| x = Helpers.checkmark() + " " + x}
1967
- log_message(del.join("\n"), Thor::Shell::Color::GREEN)
2611
+ else
2612
+
2613
+ log_message("Couldn't download: #{f}", Thor::Shell::Color::RED)
2614
+ raise Parallel::Kill
2615
+
2616
+
2617
+ end
1968
2618
  end
1969
- log_message("Total of #{update_count} / #{update_total} files.", Thor::Shell::Color::GREEN)
1970
- else
1971
- if (options["sync"] or sync) and direct
1972
- log_message("#{check} Syncing project completed successfully", Thor::Shell::Color::GREEN)
2619
+ rescue Interrupt
2620
+ log_message("Couldn't download", Thor::Shell::Color::RED)
1973
2621
 
1974
- else
1975
- log_message("#{check} Changes were updated successfully", Thor::Shell::Color::GREEN)
2622
+ exit(1)
1976
2623
 
1977
2624
  end
1978
2625
 
1979
2626
  end
2627
+ successful_changes += downloads
2628
+
2629
+ end
2630
+
2631
+ deleted = result["deleted"].to_a
2632
+ delete_res = @files.delete_commit_files_local(deleted)
2633
+ if !delete_res
2634
+ log_message("Couldn't delete #{deleted.join(" ")}", Thor::Shell::Color::RED)
2635
+ log_message("Couldn't download, Rolling Back all changes.", Thor::Shell::Color::RED)
2636
+
2637
+ exit(1)
2638
+
2639
+ end
2640
+ successful_changes += deleted.size
2641
+
1980
2642
 
2643
+
2644
+ if update_total == successful_changes
2645
+ # update idx with latest commit
2646
+ @dataset.update_idx_with_commit!(commit)
2647
+ check = Helpers.checkmark()
2648
+
2649
+ if options["verbose"]
2650
+ log_message("#{check} Done, Downloaded:", Thor::Shell::Color::GREEN)
2651
+ log_message(successful_changes.join("\n"), Thor::Shell::Color::GREEN)
2652
+ log_message("Total of #{successful_changes.size} / #{update_total} files.", Thor::Shell::Color::GREEN)
1981
2653
  else
1982
- @files.rollback_commit(commit_sha1)
1983
- log_message("Error: couldn't commit changes, Rolling Back all changes.", Thor::Shell::Color::RED)
2654
+ log_message("#{check} Downloaded changes successfully", Thor::Shell::Color::GREEN, ((sync or options["sync"]) ? false : true))
1984
2655
  end
1985
- else
1986
- @files.rollback_commit(commit_sha1)
1987
- log_message("Error: uploaded only: #{update_count} / #{update_total}, \n Rolling back", Thor::Shell::Color::RED)
2656
+ return true
1988
2657
 
1989
2658
  end
1990
2659
  rescue => e
1991
2660
 
1992
- log_message("Error occurred, \nAborting", Thor::Shell::Color::RED)
2661
+ log_message("Error occurred, \nAborting", Thor::Shell::Color::BLUE)
1993
2662
  log_error(e)
1994
- @files.rollback_commit(commit_sha1) unless commit_sha1.nil?
1995
- puts e.message
1996
-
1997
2663
  exit(1)
1998
2664
  rescue SignalException
1999
-
2000
2665
  say "\nAborting", Thor::Shell::Color::BLUE
2001
- say "\nRolling back all changes", Thor::Shell::Color::BLUE
2002
- @files.rollback_commit(commit_sha1) unless commit_sha1.nil?
2003
2666
  exit(1)
2004
2667
  end
2005
-
2006
2668
  end
2007
2669
 
2008
2670
  desc 'download', 'Download updated files'
@@ -2219,6 +2881,8 @@ module Cnvrg
2219
2881
  end
2220
2882
 
2221
2883
 
2884
+
2885
+
2222
2886
  desc 'jump', 'jump to specific commit'
2223
2887
  method_option :remote, :type => :boolean, :aliases => ["-r", "--r"], :default => false
2224
2888
 
@@ -2428,7 +3092,9 @@ module Cnvrg
2428
3092
  method_option :ignore, :type => :string, :aliases => ["-i", "--ignore"], :desc => "ignore following files", :default => ""
2429
3093
  method_option :force, :type => :boolean, :aliases => ["-f", "--force"], :default => false
2430
3094
  method_option :sync_before_terminate, :type => :boolean, :aliases => ["-sbt", "--sync_before_terminate"], :default => false
2431
- method_option :periodic_sync, :type => :string, :aliases => ["-ps", "--perodic_sync"], :default => ""
3095
+ method_option :periodic_sync, :type => :string, :aliases => ["-ps", "--periodic_sync"], :default => nil #//15,30,45,60
3096
+ method_option :max_time, :type => :string, :aliases => [ "--max_time"], :default => nil
3097
+ method_option :dataset_only_tree, :type => :boolean, :aliases => [ "--dataset_only_tree"], :default => false
2432
3098
 
2433
3099
 
2434
3100
  def run(*cmd)
@@ -2451,6 +3117,8 @@ module Cnvrg
2451
3117
  sync_before_terminate = options["sync_before_terminate"]
2452
3118
  periodic_sync = options["periodic_sync"]
2453
3119
  force = options["force"]
3120
+ max_time = options["max_time"]
3121
+ dataset_only_tree = options["dataset_only_tree"]
2454
3122
 
2455
3123
  options_hash = Hash[options]
2456
3124
  real_options = []
@@ -2464,8 +3132,7 @@ module Cnvrg
2464
3132
  return
2465
3133
  else
2466
3134
  if !periodic_sync.nil? and !periodic_sync.empty?
2467
- if /^\d{2}m$/ === periodic_sync
2468
- periodic_sync = periodic_sync.gsub("m","")
3135
+ if /^\d{2}$/ === periodic_sync
2469
3136
  if !["15","30","45","60"].include? periodic_sync
2470
3137
  log_message("periodic sync can only be every 15m, 30m, 45m or 60m", Thor::Shell::Color::RED)
2471
3138
  exit(1)
@@ -2488,7 +3155,8 @@ module Cnvrg
2488
3155
  invoke :exec_remote, [cmd], :sync_before => sync_before, :sync_after => sync_after, :title => title, :machine_type => instance_type,
2489
3156
  :schedule => schedule, :log => log, :email_notification => email_notification, :upload_output => upload_output, :commit => commit,
2490
3157
  :image => image, :grid => grid, :data => data, :data_commit => data_commit, :ignore => ignore, :force => force, :sync_before_terminate => sync_before_terminate,
2491
- :periodic_sync => periodic_sync
3158
+ :max_time => max_time,
3159
+ :periodic_sync => periodic_sync, :dataset_only_tree=> dataset_only_tree
2492
3160
  return
2493
3161
  end
2494
3162
 
@@ -2523,7 +3191,6 @@ module Cnvrg
2523
3191
  method_option :sync_before_terminate, :type => :boolean, :aliases => ["-sbt", "--sync_before_terminate"], :default => false
2524
3192
  method_option :periodic_sync, :type => :string, :aliases => ["-ps", "--periodic_sync"], :default => ""
2525
3193
  def exec(*cmd)
2526
-
2527
3194
  log = []
2528
3195
  cpu_average = 0
2529
3196
  memory_average = 0
@@ -2834,190 +3501,6 @@ module Cnvrg
2834
3501
  exit(1)
2835
3502
  end
2836
3503
  end
2837
-
2838
- desc '', '', :hide => true
2839
- method_option :sync_before, :type => :boolean, :aliases => ["-sb", "--sb"], :default => true
2840
- method_option :sync_after, :type => :boolean, :aliases => ["-sa", "--sa"], :default => true
2841
- method_option :title, :type => :string, :aliases => ["-t", "--t"], :default => ""
2842
- method_option :log, :type => :boolean, :aliases => ["-l", "--l"], :default => false
2843
- method_option :email_notification, :type => :boolean, :aliases => ["-en", "--en"], :default => false
2844
- method_option :upload_output, :type => :string, :aliases => ["--uo", "-uo"], :default => ""
2845
-
2846
- def exec_docker(*cmd)
2847
- log = []
2848
- cpu_average = 0
2849
- memory_average = 0
2850
- verify_logged_in()
2851
- log_start(__method__, args, options)
2852
- project_home = "/home/ds/notebooks"
2853
- @project = Project.new(project_home)
2854
- sync_before = options["sync_before"]
2855
- sync_after = options["sync_after"]
2856
- print_log = options["log"]
2857
- title = options["title"]
2858
- email_notification = options["email_notification"]
2859
- upload_output = options["upload_output"]
2860
- time_to_upload = calc_output_time(upload_output)
2861
- @image = is_project_with_docker(project_home)
2862
-
2863
-
2864
- begin
2865
- start_commit = @project.last_local_commit
2866
- cmd = cmd.join("\s")
2867
-
2868
- log_message("Running: #{cmd}\n", Thor::Shell::Color::BLUE)
2869
-
2870
- @exp = Experiment.new(@project.owner, @project.slug)
2871
- machine_activity = @exp.get_machine_activity(project_home)
2872
-
2873
- platform = RUBY_PLATFORM
2874
- machine_name = Socket.gethostname
2875
- begin
2876
-
2877
- @exp.start(cmd, platform, machine_name, start_commit, title, email_notification, machine_activity, Dir.pwd)
2878
- unless @exp.slug.nil?
2879
- real = Time.now
2880
- exp_success = true
2881
- memory_total = []
2882
- cpu_total = []
2883
- start_loop = Time.now
2884
- begin
2885
- PTY.spawn(cmd) do |stdout, stdin, pid, stderr|
2886
- begin
2887
- stdout.each do |line|
2888
- cur_time = Time.now
2889
- monitor = %x{ps aux|awk '{print $2,$3,$4}'|grep #{pid} }
2890
- monitor_by = monitor.split(" ")
2891
- memory = monitor_by[2]
2892
- cpu = monitor_by[1]
2893
- memory_total << memory.to_f
2894
- cpu_total << cpu.to_f
2895
- real_time = Time.now - real
2896
-
2897
- cur_log = {time: cur_time,
2898
- message: line,
2899
- type: "stdout",
2900
- real: real_time}
2901
- if print_log
2902
- puts cur_log
2903
- end
2904
- log << cur_log
2905
-
2906
- begin
2907
- if time_to_upload != 0
2908
- if time_to_upload <= Time.now - start_loop
2909
- #upload current log
2910
- cpu_average = cpu_total.inject(0) {|sum, el| sum + el}.to_f / cpu_total.size
2911
- memory_average = memory_total.inject(0) {|sum, el| sum + el}.to_f / memory_total.size
2912
-
2913
- @exp.upload_temp_log(log, cpu_average, memory_average)
2914
- log = []
2915
- start_loop = Time.now
2916
- end
2917
-
2918
- end
2919
- rescue
2920
- log_message("Failed to upload ongoing results, continuing with experiment", Thor::Shell::Color::YELLOW)
2921
- end
2922
-
2923
- end
2924
-
2925
-
2926
- if stderr
2927
-
2928
- stderr.each do |err|
2929
-
2930
- log << {time: Time.now, message: err, type: "stderr"}
2931
- end
2932
- end
2933
-
2934
- rescue Errno::EIO => e
2935
- break
2936
- rescue Errno::ENOENT
2937
-
2938
- exp_success = false
2939
-
2940
- log_message("command \"#{cmd}\" couldn't be executed, verify command is valid", Thor::Shell::Color::RED)
2941
- rescue PTY::ChildExited
2942
- exp_success = false
2943
- log_message("The process exited!", Thor::Shell::Color::RED)
2944
- rescue => e
2945
- log_message("Error occurred, aborting", Thor::Shell::Color::RED)
2946
- log_error(e)
2947
- exit(0)
2948
- end
2949
- ::Process.wait pid
2950
- cpu_average = cpu_total.inject(0) {|sum, el| sum + el}.to_f / cpu_total.size
2951
- memory_average = memory_total.inject(0) {|sum, el| sum + el}.to_f / memory_total.size
2952
- exit_status = $?.exitstatus
2953
- if $?.exitstatus != 0
2954
- exp_success = false
2955
- end
2956
- if !exp_success
2957
- if !Cnvrg::Helpers.internet_connection?
2958
- wait_offline = agree "Seems like you're offline, wait until your'e back online?", Thor::Shell::Color::YELLOW
2959
- if wait_offline
2960
- log_message("Waiting until your'e online..", Thor::Shell::Color::BLUE)
2961
- while !Cnvrg::Helpers.internet_connection?
2962
- end
2963
- exit_status = 0
2964
- else
2965
- log_message("Experiment has failed, your'e computer is offline", Thor::Shell::Color::RED)
2966
- exit(0)
2967
- end
2968
- else
2969
-
2970
- end_commit = @project.last_local_commit
2971
- res = @exp.end(log, exit_status, end_commit, cpu_average, memory_average)
2972
- @image.update_image_activity(@project.last_local_commit, @exp.slug)
2973
- log_message("Experiment has failed, look at the log for more details or run cnvrg exec --log", Thor::Shell::Color::RED)
2974
- exit(0)
2975
- end
2976
-
2977
- end
2978
- if sync_after
2979
- log_message("Syncing project after running", Thor::Shell::Color::BLUE)
2980
- # Sync after run
2981
- download()
2982
- upload()
2983
- log_message("Done Syncing", Thor::Shell::Color::BLUE)
2984
- end
2985
- end_commit = @project.last_local_commit
2986
-
2987
- res = @exp.end(log, exit_status, end_commit, cpu_average, memory_average)
2988
- @image.update_image_activity(@project.last_local_commit, @exp.slug)
2989
-
2990
- check = Helpers.checkmark()
2991
- log_message("#{check} Done. Experiment's result: #{Cnvrg::Helpers.remote_url}/#{@project.owner}/projects/#{@project.slug}/experiments/#{@exp.slug}", Thor::Shell::Color::GREEN)
2992
- end
2993
- rescue => e
2994
- log_message("Couldn't run #{cmd}, check your input parameters", Thor::Shell::Color::RED)
2995
- log_error(e)
2996
- exit(1)
2997
- end
2998
-
2999
-
3000
- end
3001
-
3002
- end
3003
- rescue => e
3004
- log_message("Error occurred, Aborting", Thor::Shell::Color::RED)
3005
- log_error(e)
3006
-
3007
- rescue SignalException
3008
- exit_status = -1
3009
- end_commit = @project.last_local_commit
3010
- if !@exp.nil?
3011
-
3012
- res = @exp.end(log, exit_status, end_commit, cpu_average, memory_average)
3013
- end
3014
-
3015
- say "\nAborting"
3016
-
3017
- exit(1)
3018
- end
3019
- end
3020
-
3021
3504
  desc '', '', :hide => true
3022
3505
  method_option :sync_before, :type => :boolean, :aliases => ["-sb", "--sync_before"], :default => true
3023
3506
  method_option :sync_after, :type => :boolean, :aliases => ["-sa", "--sync_after"], :default => true
@@ -3034,6 +3517,10 @@ module Cnvrg
3034
3517
  method_option :data_commit, :type => :string, :aliases => ["--data_commit"], :default => ""
3035
3518
  method_option :ignore, :type => :string, :aliases => ["-i", "--ignore"], :desc => "ignore following files", :default => ""
3036
3519
  method_option :force, :type => :boolean, :aliases => ["-f", "--force"], :default => false
3520
+ method_option :max_time, :type => :string, :aliases => [ "--max_time"], :default => nil
3521
+ method_option :dataset_only_tree, :type => :boolean, :aliases => [ "--dataset_only_tree"], :default => false
3522
+ method_option :periodic_sync, :type => :string, :aliases => ["-ps", "--periodic_sync"], :default => nil
3523
+ method_option :sync_before_terminate, :type => :boolean, :aliases => ["-sbt", "--sync_before_terminate"], :default => false
3037
3524
 
3038
3525
  def exec_remote(*cmd)
3039
3526
  verify_logged_in(true)
@@ -3047,6 +3534,21 @@ module Cnvrg
3047
3534
  data_commit = options["data_commit"] || nil
3048
3535
  sync_before = options["sync_before"]
3049
3536
  force = options["force"]
3537
+ max_time = options["max_time"]
3538
+ if !max_time.nil? and !max_time.empty?
3539
+ max_time = max_time.to_i
3540
+ if max_time <=0
3541
+ log_message("Max time for experiment should be more than 0 minutess", Thor::Shell::Color::RED)
3542
+ exit(1)
3543
+ end
3544
+ end
3545
+ periodic_sync = options["periodic_sync"]
3546
+ sync_before_terminate = options["sync_before_terminate"]
3547
+ dataset_only_tree = options["dataset_only_tree"]
3548
+ ds_sync_options = 0
3549
+ if dataset_only_tree
3550
+ ds_sync_options = 1
3551
+ end
3050
3552
 
3051
3553
  instance_type = options["machine_type"] || nil
3052
3554
  schedule = options["schedule"] || ""
@@ -3081,7 +3583,7 @@ module Cnvrg
3081
3583
  end
3082
3584
 
3083
3585
  options_hash = Hash[options]
3084
- options_hash.except!("schedule", "machine_type", "image", "upload_output", "grid", "data", "data_commit", "local", "small", "medium", "large", "gpu", "gpuxl", "gpuxxl")
3586
+ options_hash.except!("schedule", "machine_type", "image", "upload_output", "grid", "data", "data_commit", "local", "small", "medium", "large", "gpu", "gpuxl", "gpuxxl","max_time","dataset_only_tree")
3085
3587
  exec_options = options_hash.map {|x| "--#{x[0]}=#{x[1]}"}.flatten.join(" ")
3086
3588
  command = "#{exec_options} #{remote} #{upload_output_option} #{cmd.flatten.join(" ")}"
3087
3589
  commit_to_run = options["commit"] || nil
@@ -3105,13 +3607,6 @@ module Cnvrg
3105
3607
  if instance_type.eql? "gpu" or instance_type.eql? "gpuxl"
3106
3608
  image_slug = "cnvrg_gpu"
3107
3609
  end
3108
- # default = yes? "use #{default_image_name} default image?", Thor::Shell::Color::YELLOW
3109
- # if default
3110
- # image = Images.new(working_dir, default_image_name)
3111
- # image_slug = image.image_slug
3112
- # else
3113
- # exit(0)
3114
- # end
3115
3610
  else
3116
3611
  image_slug = image.image_slug
3117
3612
  end
@@ -3135,7 +3630,8 @@ module Cnvrg
3135
3630
  end
3136
3631
  log_message("Running remote experiment", Thor::Shell::Color::BLUE)
3137
3632
  exp = Experiment.new(project.owner, project.slug)
3138
- res = exp.exec_remote(command, commit_to_run, instance_type, image_slug, schedule, local_timestamp, grid, path_to_cmd, data, data_commit)
3633
+ res = exp.exec_remote(command, commit_to_run, instance_type, image_slug, schedule, local_timestamp, grid, path_to_cmd, data, data_commit,
3634
+ periodic_sync, sync_before_terminate, max_time, ds_sync_options)
3139
3635
  if Cnvrg::CLI.is_response_success(res)
3140
3636
  # if res["result"]["machine"] == -1
3141
3637
  # say "There are no available machines", Thor::Shell::Color::BLUE
@@ -3194,7 +3690,6 @@ module Cnvrg
3194
3690
  exit(1)
3195
3691
  end
3196
3692
  end
3197
-
3198
3693
  desc 'deploy', 'Deploys model to production'
3199
3694
  method_option :small, :type => :boolean, :aliases => ["-sm", "--small"], :default => false
3200
3695
  method_option :medium, :type => :boolean, :aliases => ["-md", "--medium"], :default => false
@@ -3323,6 +3818,7 @@ module Cnvrg
3323
3818
  method_option :image, :type => :string, :aliases => ["-i", "--image"], :default => ""
3324
3819
  method_option :data, :type => :string, :aliases => ["-d", "--data"], :default => ""
3325
3820
  method_option :data_commit, :type => :string, :aliases => ["--data_commit"], :default => ""
3821
+ method_option :dataset_only_tree, :type => :boolean, :aliases => [ "--dataset_only_tree"], :default => false
3326
3822
 
3327
3823
 
3328
3824
  desc 'notebook', 'starts a notebook session remotely or locally'
@@ -3334,6 +3830,7 @@ module Cnvrg
3334
3830
  image = options["image"]
3335
3831
  data = options["data"]
3336
3832
  data_commit = options["data_commit"]
3833
+ dataset_only_tree = options["dataset_only_tree"]
3337
3834
  if local
3338
3835
  invoke :run_notebook, [], :notebook_dir => notebook_dir, :remote => false, :kernel => kernel, :image => image
3339
3836
  return
@@ -3343,7 +3840,7 @@ module Cnvrg
3343
3840
  instance_type = get_instance_type(instances)
3344
3841
 
3345
3842
  invoke :remote_notebook, [], :notebook_dir => notebook_dir, :kernel => kernel, :machine_type => instance_type, :image => image,
3346
- :data => data, :data_commit => data_commit
3843
+ :data => data, :data_commit => data_commit , :dataset_only_tree => dataset_only_tree
3347
3844
  return
3348
3845
 
3349
3846
  end
@@ -3462,6 +3959,7 @@ module Cnvrg
3462
3959
  method_option :data, :type => :string, :aliases => ["-d", "--data"], :default => ""
3463
3960
  method_option :data_commit, :type => :string, :aliases => ["--data_commit"], :default => ""
3464
3961
  method_option :commit, :type => :string, :aliases => ["--commit"], :default => ""
3962
+ method_option :dataset_only_tree, :type => :boolean, :aliases => [ "--dataset_only_tree"], :default => false
3465
3963
 
3466
3964
 
3467
3965
  def remote_notebook()
@@ -3474,7 +3972,11 @@ module Cnvrg
3474
3972
  data_commit = options["data_commit"]
3475
3973
  commit = options["commit"]
3476
3974
  notebook_type = options["notebook_type"]
3477
-
3975
+ dataset_only_tree = options["dataset_only_tree"]
3976
+ ds_sync_options = 0
3977
+ if dataset_only_tree
3978
+ ds_sync_options = 1
3979
+ end
3478
3980
 
3479
3981
  begin
3480
3982
  project = Project.new(working_dir)
@@ -3485,7 +3987,7 @@ module Cnvrg
3485
3987
  end
3486
3988
  invoke :sync, [false], []
3487
3989
  slug = ""
3488
- res = exp.remote_notebook(instance_type, commit, data, data_commit, notebook_type)
3990
+ res = exp.remote_notebook(instance_type, commit, data, data_commit, notebook_type,ds_sync_options)
3489
3991
  if Cnvrg::CLI.is_response_success(res)
3490
3992
  slug = res["result"]["notebook_url"]
3491
3993
  log_message("#{Helpers.checkmark} Notebook is ready: #{Cnvrg::Helpers.remote_url}/#{project.owner}/projects/#{project.slug}/notebook_sessions/show/#{slug}", Thor::Shell::Color::GREEN)
@@ -5059,7 +5561,6 @@ module Cnvrg
5059
5561
 
5060
5562
  def set_owner(owner, username, url)
5061
5563
  home_dir = File.expand_path('~')
5062
-
5063
5564
  begin
5064
5565
  if !File.directory? home_dir + "/.cnvrg"
5065
5566
  FileUtils.mkdir_p([home_dir + "/.cnvrg", home_dir + "/.cnvrg/tmp"])
@@ -5186,12 +5687,12 @@ module Cnvrg
5186
5687
 
5187
5688
  def self.is_response_success(response, should_exit = true)
5188
5689
  begin
5189
- if response.nil?
5190
- if !Cnvrg::Helpers.internet_connection?
5191
- say("<%= color('Error:You seems to be offline', RED) %>")
5192
- $LOG.error message: "offline connection", type: "error"
5193
-
5194
- end
5690
+ if response.nil? or !response
5691
+ # if !Cnvrg::Helpers.internet_connection?
5692
+ # say("<%= color('Error:You seems to be offline', RED) %>")
5693
+ # $LOG.error message: "offline connection", type: "error"
5694
+ #
5695
+ # end
5195
5696
  if should_exit
5196
5697
  exit(1)
5197
5698
  else
@@ -5214,12 +5715,15 @@ module Cnvrg
5214
5715
  end
5215
5716
  end
5216
5717
  return true
5217
- rescue => e
5218
- puts e.message
5219
- puts e.backtrace
5718
+ rescue => e
5719
+ puts e.message
5720
+ puts e.backtrace
5721
+ rescue SignalException
5722
+ say "Aborting"
5723
+ end
5724
+
5220
5725
  end
5221
5726
 
5222
- end
5223
5727
 
5224
5728
  def self.get_owner
5225
5729
  home_dir = File.expand_path('~')
@@ -5341,27 +5845,27 @@ module Cnvrg
5341
5845
 
5342
5846
  end
5343
5847
 
5848
+ def verify_logged_in(in_dir=true)
5849
+ begin
5850
+ log_handler()
5851
+ auth = Cnvrg::Auth.new
5852
+ unless auth.is_logged_in?
5853
+ say 'You\'re not logged in', Thor::Shell::Color::RED
5854
+ say 'Please log in via `cnvrg login`', Thor::Shell::Color::BLUE
5855
+ exit(1)
5856
+ end
5344
5857
 
5345
- def verify_logged_in(in_dir = true)
5346
- log_handler()
5347
- auth = Cnvrg::Auth.new
5348
- unless auth.is_logged_in?
5349
- say 'You\'re not logged in', Thor::Shell::Color::RED
5350
- say 'Please log in via `cnvrg login`', Thor::Shell::Color::BLUE
5351
- exit(1)
5352
- end
5353
-
5354
- # if !Helpers.internet_connection?
5355
- # wait_offline = agree "Seems like you're offline, wait until your'e back online?", Thor::Shell::Color::YELLOW
5356
- # if wait_offline
5357
- # say "Waiting until your'e online..", Thor::Shell::Color::BLUE
5358
- # while !Cnvrg::Helpers.internet_connection?
5359
- # end
5360
- # else
5361
- # say "you seem to be offline, please check your internet connection", Thor::Shell::Color::RED
5362
- # exit(0)
5363
- # end
5364
- # end
5858
+ # if !Helpers.internet_connection?
5859
+ # wait_offline = agree "Seems like you're offline, wait until your'e back online?", Thor::Shell::Color::YELLOW
5860
+ # if wait_offline
5861
+ # say "Waiting until your'e online..", Thor::Shell::Color::BLUE
5862
+ # while !Cnvrg::Helpers.internet_connection?
5863
+ # end
5864
+ # else
5865
+ # say "you seem to be offline, please check your internet connection", Thor::Shell::Color::RED
5866
+ # exit(0)
5867
+ # end
5868
+ # end
5365
5869
 
5366
5870
  config = YAML.load_file(File.expand_path('~') + "/.cnvrg/config.yml")
5367
5871
  version_date = config.to_h[:version_last_check]
@@ -5385,8 +5889,10 @@ module Cnvrg
5385
5889
  #verify tmp dirs exist
5386
5890
  home_dir = File.expand_path('~')
5387
5891
 
5388
- FileUtils.mkdir_p([home_dir + "/.cnvrg", home_dir + "/.cnvrg/tmp", home_dir + "/.cnvrg/tmp_files"])
5892
+ FileUtils.mkdir_p([home_dir+"/.cnvrg", home_dir+"/.cnvrg/tmp", home_dir+"/.cnvrg/tmp_files"])
5893
+ rescue SignalException
5389
5894
 
5895
+ end
5390
5896
 
5391
5897
  end
5392
5898
 
@@ -5746,29 +6252,10 @@ module Cnvrg
5746
6252
 
5747
6253
  end
5748
6254
 
5749
- def with_progress_bar
5750
- not_done = true
5751
- upload_progress_bar = ProgressBar.create(:title => "Upload progress",
5752
- :format => '%a <%B> %p%% %t',
5753
- :starting_at => 0,
5754
- :total => 600)
5755
- pb = Thread.new do
5756
- while not_done do
5757
- upload_progress_bar.increment
5758
- sleep(1)
5759
-
5760
- end
5761
- end
5762
-
5763
- yield.tap do # After yielding to the block, save the return value
5764
- not_done = false # Tell the thread to exit, cleaning up after itself…
5765
- pb.join # …and wait for it to do so.
5766
- end
5767
- end
5768
6255
  end
6256
+ end
5769
6257
 
5770
6258
 
5771
- end
5772
6259
  end
5773
6260
 
5774
6261