cnvrg 0.6.3 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c1eb2a526f32419697a93b9927b01ec1327588db
4
- data.tar.gz: cbc3517d2341d6a1905190a6a6f99bfa1e1df20c
3
+ metadata.gz: 88c66150eee5e836d00d2cbf4983ab978b227f6f
4
+ data.tar.gz: 28ff50dfd3e535e640ebd5d7a2333dc55f954176
5
5
  SHA512:
6
- metadata.gz: 9287cf89d3440a871737dd037c2bc5b3dc6ebc2457ea31cfbd1156d022891460977d44a5993f06620d396ec9604ce5786ba63e957672773dac32a259a2792b45
7
- data.tar.gz: 66a9c63f4adccb2720d9cbee9b7f17ac79cedda0e9389bd9300b830c02292ad03259eec1c42e427ea095df1bffe1fa5496d1239d96fe37ce5b207041def87b82
6
+ metadata.gz: d5276cacdecc9b1860e1f1a966d93186b9c5ff00320f53d65cf4bed39ac67ff4ba927a73d232cd98fd3d54a3deb237dde92289079d648583bf30a7672ffdf975
7
+ data.tar.gz: 9c84dca4965fc101de56e573fbd655e290c34c068c9d0598b524a82436ddb332af02228407e8c7c517734a992ad67ba489b64d2d35092deb248ce59cdff03455
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
- require "pty"
2
+ require "pty" unless !!(RUBY_PLATFORM =~ /mswin32|mingw32/)
3
+
3
4
  require 'etc'
4
5
  require 'parallel'
5
6
  require 'netrc'
@@ -844,6 +845,7 @@ module Cnvrg
844
845
  :starting_at => 0,
845
846
  :total => files_count,
846
847
  :autofinish => true)
848
+
847
849
  while files['keys'].length > 0
848
850
  @files.download_multiple_files_s3(files, dataset_home, progressbar: progressbar)
849
851
  downloaded_files += files['keys'].length
@@ -1922,8 +1924,10 @@ module Cnvrg
1922
1924
  log_start(__method__, args, options)
1923
1925
  log_message('Syncing dataset', Thor::Shell::Color::BLUE, !options["verbose"])
1924
1926
  if !force and !init
1925
- invoke :download_data_new,[verbose,true, commit, all_files], :new_branch=>new_branch, :direct=>false, :force =>force
1927
+ # w(verbose=false, new_branch=false,sync=false, commit=nil,all_files=true)
1928
+ invoke :download_data_new,[verbose, new_branch, true, commit, all_files], :new_branch=>new_branch, :direct=>false, :force =>force
1926
1929
  end
1930
+ # w(new_branch, verbose,sync,force, tags, chunk_size)
1927
1931
  invoke :upload_data_new,[new_branch, verbose,true,force, tags, chunk_size], :new_branch=>new_branch,
1928
1932
  :direct=>false, :force =>force, :sync =>true, :tags =>tags, :parallel => parallel
1929
1933
 
@@ -1936,6 +1940,7 @@ module Cnvrg
1936
1940
  method_option :tags, :type => :boolean, :aliases => ["--tags"], :desc => "upload file tags", :default => false
1937
1941
  method_option :parallel, :type => :numeric, :aliases => ["-p", "--parallel"], :desc => "uparallel upload at the same time", :default => 15
1938
1942
  def upload_data_new(new_branch, verbose,sync,force, tags, chunk_size)
1943
+ begin
1939
1944
  commit = invoke :start_commit_data,[], :new_branch=> new_branch, :direct=>false, :force =>force, :chunk_size => chunk_size
1940
1945
  upload_res = invoke :upload_data_files,[commit],:new_branch=>new_branch, :verbose =>verbose, :force =>force, :sync =>sync, :chunk_size => chunk_size
1941
1946
  if upload_res < 0
@@ -1962,11 +1967,21 @@ module Cnvrg
1962
1967
  log_message('There was some error in uploading Tags', Thor::Shell::Color::RED)
1963
1968
  end
1964
1969
  end
1965
-
1966
- if upload_res
1967
- invoke :end_commit_data,[commit] , :new_branch=>new_branch, :force =>force
1968
- end
1969
-
1970
+ rescue => e
1971
+ say "\nAborting", Thor::Shell::Color::BLUE
1972
+ dataset_dir = is_cnvrg_dir(Dir.pwd)
1973
+ return false if dataset_dir.blank?
1974
+ @dataset = Dataset.new(dataset_dir)
1975
+ @dataset.revert_to_last_commit
1976
+ return false
1977
+ rescue SignalException
1978
+ say "\nAborting", Thor::Shell::Color::BLUE
1979
+ dataset_dir = is_cnvrg_dir(Dir.pwd)
1980
+ return false if dataset_dir.blank?
1981
+ @dataset = Dataset.new(dataset_dir)
1982
+ @dataset.revert_to_last_commit
1983
+ return false
1984
+ end
1970
1985
  end
1971
1986
 
1972
1987
  desc 'start_commit', 'start data commit'
@@ -2014,18 +2029,7 @@ module Cnvrg
2014
2029
  puts commit_sha1
2015
2030
  end
2016
2031
  return commit_sha1
2017
- rescue => e
2018
- if commit_sha1.present?
2019
- @dataset.set_next_commit(commit_sha1)
2020
- end
2021
- rescue SignalException
2022
- log_message("Aborting..", Thor::Shell::Color::YELLOW)
2023
- if commit_sha1.present?
2024
- @dataset.set_next_commit(commit_sha1)
2025
- end
2026
- exit(1)
2027
2032
  end
2028
-
2029
2033
  end
2030
2034
  desc 'end_commit', 'start data commit'
2031
2035
  method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
@@ -2049,18 +2053,9 @@ module Cnvrg
2049
2053
  log_message("#{check} Data files were updated successfully", Thor::Shell::Color::GREEN)
2050
2054
  @dataset.set_next_commit(resp["result"]["commit_sha1"]) # no need fo rboth methods FIX
2051
2055
  @dataset.remove_next_commit()
2052
-
2053
2056
  end
2054
-
2055
2057
  end
2056
- rescue => e
2057
- puts e
2058
- rescue SignalException
2059
- @dataset.set_next_commit(commit)
2060
- log_message("Aborting", Thor::Shell::Color::YELLOW)
2061
- exit(1)
2062
2058
  end
2063
-
2064
2059
  end
2065
2060
  desc 'list_files', 'list files in dataset'
2066
2061
  method_option :json, :type => :boolean, :aliases => ["-j","--json"],:default => true, :desc => "response as json"
@@ -2137,12 +2132,13 @@ module Cnvrg
2137
2132
  files_uploaded = 0
2138
2133
  all_files.each_slice(chunk_size).each do |list_files|
2139
2134
  temp_tree = @dataset.generate_chunked_idx(list_files, threads: parallel_threads)
2135
+
2140
2136
  upload_resp = @files.upload_multiple_files(new_commit, temp_tree, threads: parallel_threads, force: force, new_branch: new_branch, progressbar: progressbar)
2141
2137
 
2142
2138
  if upload_resp.is_a? Cnvrg::Result
2143
2139
  log_message(upload_resp.msg, upload_resp.msg_color)
2144
-
2145
- return -1
2140
+ raise SignalException.new(upload_resp.msg)
2141
+ # return -1
2146
2142
 
2147
2143
  else
2148
2144
  files_uploaded += upload_resp
@@ -2155,9 +2151,6 @@ module Cnvrg
2155
2151
  @dataset.write_idx(new_tree, new_commit)
2156
2152
  end
2157
2153
  return files_uploaded
2158
- rescue Exception => e
2159
- puts e
2160
- return false
2161
2154
  end
2162
2155
 
2163
2156
  # local_idx = @dataset.generate_idx
@@ -2522,7 +2515,6 @@ module Cnvrg
2522
2515
  rescue SignalException
2523
2516
  log_message("Couldn't upload, Rolling Back all changes.", Thor::Shell::Color::RED)
2524
2517
  @files.rollback_commit(commit_sha1)
2525
-
2526
2518
  return false
2527
2519
  end
2528
2520
  end
@@ -2767,30 +2759,30 @@ module Cnvrg
2767
2759
  dataset_dir = is_cnvrg_dir(Dir.pwd)
2768
2760
  @dataset = Dataset.new(dataset_dir)
2769
2761
  @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug)
2770
- commit_to_download = commit
2771
- local_idx = @dataset.generate_idx
2772
2762
  all_files = all_files
2773
- res = @dataset.compare_idx_download(commit=commit_to_download.presence, local_idx= local_idx,all_files=all_files)
2763
+ res = @dataset.compare_idx_download(all_files: all_files, desired_commit: commit)
2764
+ unless CLI.is_response_success(res, false)
2765
+ log_message("Cant find the desired commit, please check it or try to download without it.", Thor::Shell::Color::RED)
2766
+ exit(1)
2767
+ end
2774
2768
  result = res["result"]["tree"]
2775
2769
  commit = res["result"]["commit"]
2776
- if result["updated_on_server"].empty? and result["conflicts"].empty? and result["deleted"].empty?
2777
- log_message("Dataset is up to date", Thor::Shell::Color::GREEN, ((options["sync"] or sync) ? false : true))
2778
- return true
2779
- end
2780
- update_total = result["updated_on_server"].size + result["conflicts"].size + result["deleted"].size
2781
- successful_changes = 0
2782
- if update_total ==1
2783
- log_message("Downloading #{update_total} file", Thor::Shell::Color::BLUE, !sync)
2784
- elsif update_total == 0
2785
- log_message("Dataset is up to date", Thor::Shell::Color::GREEN, !sync)
2770
+ update_total = [result['added'], result["updated_on_server"], result["conflicts"], result["deleted"]].compact.flatten.size
2771
+ successful_changes = 0
2772
+ if update_total == 0
2773
+ log_message("Dataset is up to date", Thor::Shell::Color::GREEN) if !sync
2786
2774
  return true
2787
2775
  elsif options["verbose"]
2788
2776
  log_message("Downloading #{update_total} files", Thor::Shell::Color::BLUE)
2789
2777
  else
2790
2778
  log_message("Syncing Dataset", Thor::Shell::Color::BLUE, !sync)
2791
2779
  end
2780
+ conflicts = @files.mark_conflicts(result)
2781
+
2782
+ log_message("Found some conflicts, check .conflict files.", Thor::Shell::Color::BLUE) if conflicts > 0
2792
2783
  update_res = @files.download_files_in_chunks(result["updated_on_server"]) if result["updated_on_server"].present?
2793
- conflict_res = @files.download_files_in_chunks(result["conflicts"], conflict: true) if result["conflicts"].present?
2784
+ added_res = @files.download_files_in_chunks(result["added"]) if result["added"].present?
2785
+ # conflict_res = @files.download_files_in_chunks(result["conflicts"], conflict: true) if result["conflicts"].present?
2794
2786
  deleted = result["deleted"].to_a
2795
2787
  delete_res = @files.delete_commit_files_local(deleted)
2796
2788
  if !delete_res
@@ -2798,7 +2790,10 @@ module Cnvrg
2798
2790
  log_message("Couldn't download, Rolling Back all changes.", Thor::Shell::Color::RED)
2799
2791
  exit(1)
2800
2792
  end
2801
- if [update_res.is_success?, delete_res.is_success?, (conflict_res.blank? or conflict_res.is_success?)].all?
2793
+ success = (update_res.blank? or update_res.is_success?)
2794
+ success &= (delete_res.blank? or delete_res.is_success?)
2795
+ success &= (added_res.blank? or added_res.is_success?)
2796
+ if success
2802
2797
  # update idx with latest commit
2803
2798
  @dataset.update_idx_with_commit!(commit)
2804
2799
  check = Helpers.checkmark()
@@ -2809,17 +2804,15 @@ module Cnvrg
2809
2804
  else
2810
2805
  log_message("#{check} Downloaded changes successfully", Thor::Shell::Color::GREEN, ((sync or options["sync"]) ? false : true))
2811
2806
  end
2812
- return true
2813
- else
2814
- @dataset.update_idx_with_commit!(commit_to_download)
2807
+ return true
2815
2808
  end
2809
+ rescue SignalException
2810
+ say "\nAborting", Thor::Shell::Color::BLUE
2811
+ exit(1)
2816
2812
  rescue => e
2817
2813
  log_message("Error occurred, \nAborting", Thor::Shell::Color::BLUE)
2818
2814
  log_error(e)
2819
2815
  exit(1)
2820
- rescue SignalException
2821
- say "\nAborting", Thor::Shell::Color::BLUE
2822
- exit(1)
2823
2816
  end
2824
2817
  end
2825
2818
 
@@ -3339,10 +3332,15 @@ module Cnvrg
3339
3332
  options_hash = Hash[options]
3340
3333
 
3341
3334
  if local
3342
- invoke :exec, [cmd], :sync_before => sync_before, :sync_after => sync_after, :title => title,
3343
- :log => log, :email_notification => email_notification, :upload_output => upload_output,
3344
- :commit => commit, :image => image, :data => data, :data_commit => data_commit, :ignore => ignore, :force => force, :output_dir=>output_dir, :data_query=>data_query
3345
- return
3335
+ if Cnvrg::Helpers.windows?
3336
+ say "Windows is currently not supported for running experiments locally"
3337
+ return
3338
+ else
3339
+ invoke :exec, [cmd], :sync_before => sync_before, :sync_after => sync_after, :title => title,
3340
+ :log => log, :email_notification => email_notification, :upload_output => upload_output,
3341
+ :commit => commit, :image => image, :data => data, :data_commit => data_commit, :ignore => ignore, :force => force, :output_dir=>output_dir, :data_query=>data_query
3342
+ return
3343
+ end
3346
3344
  else
3347
3345
  if !periodic_sync.nil? and !periodic_sync.empty?
3348
3346
  if /^\d{2}$/ === periodic_sync
@@ -20,6 +20,39 @@ module Cnvrg
20
20
  @base_resource = "users/#{owner}/datasets/#{dataset_slug}/"
21
21
  end
22
22
 
23
+ def check_file_sha1(filename, org_sha1, tag: 'conflict')
24
+ file_loc = "#{Dir.pwd}/#{filename}"
25
+ sha1 = OpenSSL::Digest::SHA1.file(file_loc).hexdigest
26
+ return 0 if sha1 == org_sha1
27
+ FileUtils.cp(file_loc, "#{file_loc}.#{tag}")
28
+ return 1
29
+ end
30
+
31
+ def check_files_sha1(files, resolver, tag)
32
+ conflicts = 0
33
+ files.each do |file|
34
+ next if file.ends_with? '/'
35
+ sha1 = resolver.fetch(file, {}).fetch("sha1", nil)
36
+ conflicts += self.check_file_sha1(file, sha1, tag: tag)
37
+ end
38
+ conflicts
39
+ end
40
+
41
+ def mark_conflicts(results)
42
+ begin
43
+ updated = results["updated_on_server"]
44
+ deleted = results["deleted"]
45
+ resolver = results['resolved_files']
46
+ overall = 0
47
+ overall += self.check_files_sha1(updated, resolver, "conflict")
48
+ overall += self.check_files_sha1(deleted, resolver, "deleted")
49
+ overall
50
+ rescue => e
51
+ 0
52
+ end
53
+ end
54
+
55
+
23
56
  def upload_multiple_files(commit_sha1, tree, threads: ParallelThreads, force: false, new_branch: false, progressbar: nil)
24
57
  random_file_name = (0...8).map { (65 + rand(26)).chr }.join #needed to create a file for post_file..
25
58
  # each file have: {sha1: sha1, file_name: file_name, file_size: file_size, content_type: content_type, absolute_path, relative_path}
@@ -29,9 +62,9 @@ module Cnvrg
29
62
  upload_resp = Cnvrg::API.request(@base_resource + "upload_files", 'POST_JSON', {commit_sha1: commit_sha1, tree: tree, force: force, is_branch: new_branch})
30
63
  return Cnvrg::Result.new(false, "Failed to upload files") unless Cnvrg::CLI.is_response_success(upload_resp, false)
31
64
  results = upload_resp['result'].with_indifferent_access
32
- if results['files'].blank?
33
- return 0
34
- end
65
+ if results['files'].blank?
66
+ return 0
67
+ end
35
68
  props = Cnvrg::Helpers.get_s3_props(results)
36
69
  client = props[:client]
37
70
  bucket = props[:bucket]
@@ -45,7 +78,7 @@ module Cnvrg
45
78
  progressbar.progress += 1 if progressbar.present?
46
79
  end
47
80
  blob_ids = files.values.map{|f| f['bv_id']}
48
- dirs = tree.keys.select{|k| tree[k].nil? }
81
+ dirs = tree.keys.select{|k| tree[k].nil? } || []
49
82
  upload_resp = Cnvrg::API.request(@base_resource + "upload_files_save", "POST", {commit: commit_sha1, blob_ids: blob_ids, dirs: dirs})
50
83
  return files.keys.length
51
84
  rescue => e
@@ -808,15 +841,16 @@ module Cnvrg
808
841
  (1..5).each do |i|
809
842
  response = Cnvrg::API.request("users/#{@owner}/datasets/#{@dataset_slug}/download_multi", 'POST', {files: files})
810
843
  next unless Cnvrg::CLI.is_response_success(response, false) #trying to api request 5 times.
811
- files = response['files']
844
+ files_to_download = response['files']
812
845
  data_home = "#{Dir.pwd}/#{response['name']}"
813
- res = download_multiple_files_s3(files, data_home, conflict: conflict)
846
+ res = download_multiple_files_s3(files_to_download, data_home, conflict: conflict)
814
847
  next unless res.is_success? #try again..
815
- return files['keys'].length
848
+ return files_to_download['keys'].length
816
849
  end
817
850
  end
818
851
 
819
852
  def download_multiple_chunks(commit, chunk_size=1000)
853
+ begin
820
854
  last_chunk_size = chunk_size
821
855
  q = { commit: commit, chunk_size: chunk_size}
822
856
  overall = 0
@@ -835,6 +869,9 @@ module Cnvrg
835
869
  end
836
870
  end
837
871
  Cnvrg::Result.new(true, "Cloned #{overall} files!")
872
+ rescue => e
873
+ Cnvrg::Result.new(false, "Cant download chunk")
874
+ end
838
875
  end
839
876
 
840
877
  def generate_parallel_idx
@@ -314,6 +314,17 @@ module Cnvrg
314
314
  return tree
315
315
  end
316
316
 
317
+ def revert_to_last_commit(commit: nil)
318
+ if commit.blank?
319
+ resp = Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/last_valid_commit", 'GET')
320
+ if CLI.is_response_success(resp, false)
321
+ commit = resp['result']['commit_sha1']
322
+ end
323
+ end
324
+ self.update_idx_with_commit(commit) if commit.present?
325
+ self.revert_next_commit
326
+ end
327
+
317
328
  def list_all_files
318
329
  list = Dir.glob("#{self.local_path}/**/*", File::FNM_DOTMATCH).reject { |x| (x =~ /\/\.{1,2}$/) or (x =~ /^#{self.local_path}\/\.cnvrg\/*/) or (x =~/^#{self.local_path}\/\.cnvrgignore.conflict*/) and not (x =~/^#{self.local_path}\/\.cnvrgignore/) }
319
330
  list_ignore = self.get_ignore_list()
@@ -423,15 +434,13 @@ module Cnvrg
423
434
  CLI.is_response_success(response,false)
424
435
  return response
425
436
  end
426
- def compare_idx_download(commit=last_local_commit,local_idx=nil,all=false)
427
- if local_idx.nil?
428
- local_idx = self.generate_idx
429
- end
437
+
438
+ def compare_idx_download(all_files: false, desired_commit: nil)
439
+ current_commit = self.last_local_commit
430
440
  ignore_list = self.send_ignore_list()
431
- response = Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/download_status", 'POST', {idx: local_idx, current_commit: commit, ignore:ignore_list,all_files:all})
432
- CLI.is_response_success(response,false)
433
- return response
441
+ return Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/download_status", 'POST', {current_commit: current_commit, ignore:ignore_list,all_files:all_files, desired_commit: desired_commit.presence})
434
442
  end
443
+
435
444
  def current_status(new_branch)
436
445
  commit=last_local_commit
437
446
  response = Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/status_current", 'POST', {current_commit: commit,new_branch: new_branch})
@@ -263,7 +263,8 @@ parameters:
263
263
  :http_open_timeout => 60, :retry_limit => 20)
264
264
  use_accelerate_endpoint = true
265
265
  else
266
- endpoint = Cnvrg::Helpers.decrypt(key,iv, files["endpoint"])
266
+
267
+ endpoint = Cnvrg::Helpers.decrypt(key,iv, files["endpoint_url"])
267
268
  client = Aws::S3::Client.new(
268
269
  :access_key_id =>access,
269
270
  :secret_access_key => secret,
@@ -1,4 +1,4 @@
1
1
  module Cnvrg
2
- VERSION = '0.6.3'
2
+ VERSION = '0.6.5'
3
3
  end
4
4
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cnvrg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yochay Ettun