cnvrg 1.6.21 → 1.6.22

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
  SHA256:
3
- metadata.gz: 82961f200868479b73c2b80dfb2fc4a0973b2ed52798ae6fdd2d3296d3f815c0
4
- data.tar.gz: 1ecf89c6eaa659c2f8479353bf4a2c564655e5d6c50ad922551889672bedf70f
3
+ metadata.gz: edee87a5b2d2c1693d36ddcfeb992b4e87a88521988e6335844ab522401cee46
4
+ data.tar.gz: bd0286b12dc83235c57bcf64726d2af6860608e0a061c885888bf044129d1ab0
5
5
  SHA512:
6
- metadata.gz: 23cb859d1ccdfd397c3942655b1e41fc651f5596d92ca0c90c552b03b0d178fd207272139bbcba2381dc4e69480a6ada5e072ac607f8c20b78e71d8725d34d8c
7
- data.tar.gz: 51f782aa51de9b3c46af30c320bfe6344eb0eb86104461cf675cfa5ecafb870b580147a51dd00a35de528f603b2fd60af116387a5dc56eddb5122bd76215c058
6
+ metadata.gz: e1421a63d3a34350f181deaead9c9b5f1cebe91f75f675a81d2a0cb49de0990d690efc08ba9e8ef74315b44041889ed093e19fbf4a9a271ec0f1394b39c45748
7
+ data.tar.gz: 67872a7abe1dbac6d001c28c4a556c0b8c09b153dade45eb6a6e54ed318a804235e089504c5e2e409cef27dde5235ea1ab35d7a239bc7aefad976ce60969e111
@@ -1212,16 +1212,10 @@ module Cnvrg
1212
1212
  dir = dir[0..-2] if dir.end_with? '/'
1213
1213
  dir = dir[1..-1] if dir.start_with? '/'
1214
1214
 
1215
- progressbar = ProgressBar.create(:title => "Upload Progress",
1216
- :progress_mark => '=',
1217
- :format => "%b>>%i| %p%% %t",
1218
- :starting_at => 0,
1219
- :total => @files.size,
1220
- :autofinish => true)
1221
1215
  @files.each_slice(chunk_size).each do |list_files|
1222
1216
  temp_tree = @dataset.generate_chunked_idx(list_files, prefix: dir)
1223
1217
  #will throw a signal exception if something goes wrong.
1224
- @datafiles.upload_multiple_files(@commit, temp_tree, force: true, progressbar: progressbar, prefix: dir)
1218
+ @datafiles.upload_multiple_files(@commit, temp_tree, force: true, prefix: dir, total: @files.size)
1225
1219
  end
1226
1220
  res = @datafiles.put_commit(@commit)
1227
1221
  unless res.is_success?
@@ -1951,12 +1945,11 @@ module Cnvrg
1951
1945
  log_message('Syncing dataset', Thor::Shell::Color::BLUE, !options["verbose"])
1952
1946
  if !force and !init
1953
1947
  # w(verbose=false, new_branch=false,sync=false, commit=nil,all_files=true)
1954
- invoke :download_data_new,[verbose, new_branch, true, commit, all_files], :new_branch=>new_branch, :direct=>false, :force =>force
1948
+ total_deleted, total_downloaded = invoke :download_data_new,[verbose, new_branch, true, commit, all_files], :new_branch=>new_branch, :direct=>false, :force =>force
1955
1949
  end
1956
-
1957
1950
  # w(new_branch, verbose,sync,force, tags, chunk_size)
1958
- invoke :upload_data_new,[new_branch, verbose, true, force, tags, chunk_size, message:message], :new_branch=>new_branch,
1959
- :direct=>false, :force =>force, :sync =>true, :tags =>tags, :parallel => parallel, :message => message
1951
+ invoke :upload_data_new,[new_branch, verbose, true, force, tags, chunk_size, message:message, total_deleted: total_deleted, total_downloaded: total_downloaded],
1952
+ :new_branch=>new_branch, :direct=>false, :force =>force, :sync =>true, :tags =>tags, :parallel => parallel, :message => message
1960
1953
 
1961
1954
  end
1962
1955
  desc 'upload_data_new', 'upload_data_new', :hide => true
@@ -1968,31 +1961,69 @@ module Cnvrg
1968
1961
  method_option :parallel, :type => :numeric, :aliases => ["-p", "--parallel"], :desc => "uparallel upload at the same time", :default => 15
1969
1962
  method_option :message, :type => :string, :aliases => ["--message"], :desc => "create commit with message", :default => nil
1970
1963
 
1971
- def upload_data_new(new_branch, verbose, sync, force, tags, chunk_size, message:nil)
1964
+ def upload_data_new(new_branch, verbose, sync, force, tags, chunk_size, message:nil, total_deleted: 0, total_downloaded: 0)
1972
1965
  begin
1973
- commit = invoke :start_commit_data,[], :new_branch=> new_branch, :direct=>false, :force =>force, :chunk_size => chunk_size, :message => message
1974
- upload_res = invoke :upload_data_files,[commit],:new_branch=>new_branch, :verbose =>verbose, :force =>force, :sync =>sync, :chunk_size => chunk_size
1975
- if upload_res < 0
1976
- return
1977
- end
1978
- invoke :end_commit_data,[commit, success: true, uploaded_files: upload_res], :new_branch=>new_branch, :force =>force
1979
- if tags
1980
- log_message('Uploading Tags', Thor::Shell::Color::BLUE)
1981
- dataset_dir = is_cnvrg_dir(Dir.pwd)
1982
- @dataset = Dataset.new(dataset_dir)
1983
- begin
1984
- tag_file = File.open(options[:tags], "r+")
1985
- status = @dataset.upload_tags_via_yml(tag_file)
1986
- rescue
1987
- log_message('Tags file not found', Thor::Shell::Color::RED)
1966
+ commit, files_list = invoke :start_commit_data,[], :new_branch=> new_branch, :direct=>false, :force =>force, :chunk_size => chunk_size, :message => message
1967
+ files_to_upload, upload_errors = invoke :upload_data_files,[commit, files_list: files_list],:new_branch=>new_branch, :verbose =>verbose, :force =>force, :sync =>sync, :chunk_size => chunk_size
1968
+
1969
+ upload_size = files_to_upload + upload_errors.try(:size) rescue 0
1970
+
1971
+ if files_to_upload <= 0
1972
+ check = Helpers.checkmark
1973
+ log_message("#{check} Data sync finished", Thor::Shell::Color::GREEN)
1974
+ if total_deleted > 0
1975
+ log_message("#{total_deleted} files deleted successfully.", Thor::Shell::Color::GREEN)
1976
+ end
1977
+
1978
+ if total_downloaded > 0
1979
+ log_message("#{total_downloaded} files downloaded successfully.", Thor::Shell::Color::GREEN)
1980
+ end
1981
+
1982
+ if upload_errors.try(:size) > 0
1983
+ log_message("#{upload_errors.try(:size)}/#{upload_size} files didn't upload:", Thor::Shell::Color::RED)
1984
+ upload_errors.each do |file_hash|
1985
+ log_message("#{file_hash[:absolute_path]}", Thor::Shell::Color::RED)
1986
+ end
1987
+ end
1988
+
1989
+ if upload_errors.blank? and total_downloaded == 0 and total_deleted == 0
1990
+ Cnvrg::CLI.log_message("You are up to date", Thor::Shell::Color::GREEN)
1991
+ end
1988
1992
  return
1989
1993
  end
1990
- if status
1991
- log_message('Tags are successfully uploaded', Thor::Shell::Color::GREEN)
1992
- else
1993
- log_message('There was some error in uploading Tags', Thor::Shell::Color::RED)
1994
+ invoke :end_commit_data,[commit, success: true, uploaded_files: files_to_upload], :new_branch=>new_branch, :force =>force
1995
+ if tags
1996
+ log_message('Uploading Tags', Thor::Shell::Color::BLUE)
1997
+ dataset_dir = is_cnvrg_dir(Dir.pwd)
1998
+ @dataset = Dataset.new(dataset_dir)
1999
+ begin
2000
+ tag_file = File.open(options[:tags], "r+")
2001
+ status = @dataset.upload_tags_via_yml(tag_file)
2002
+ rescue
2003
+ log_message('Tags file not found', Thor::Shell::Color::RED)
2004
+ return
2005
+ end
2006
+ if status
2007
+ log_message('Tags are successfully uploaded', Thor::Shell::Color::GREEN)
2008
+ else
2009
+ log_message('There was some error in uploading Tags', Thor::Shell::Color::RED)
2010
+ end
2011
+ end
2012
+ if total_deleted > 0
2013
+ log_message("#{total_deleted} files deleted successfully.", Thor::Shell::Color::GREEN)
2014
+ end
2015
+
2016
+ if total_downloaded > 0
2017
+ log_message("#{total_downloaded} files downloaded successfully.", Thor::Shell::Color::GREEN)
2018
+ end
2019
+
2020
+ log_message("#{files_to_upload}/#{upload_size} files uploaded successfully.", Thor::Shell::Color::GREEN)
2021
+ if upload_errors.try(:size) > 0
2022
+ log_message("#{upload_errors.try(:size)}/#{upload_size} files didn't upload:", Thor::Shell::Color::RED)
2023
+ upload_errors.each do |file_hash|
2024
+ log_message("#{file_hash[:absolute_path]}", Thor::Shell::Color::RED)
2025
+ end
1994
2026
  end
1995
- end
1996
2027
  rescue => e
1997
2028
  Cnvrg::CLI.log_message(e.message, 'red')
1998
2029
  Cnvrg::Logger.log_error(e)
@@ -2022,17 +2053,16 @@ module Cnvrg
2022
2053
  verify_logged_in(true)
2023
2054
  log_start(__method__, args, options)
2024
2055
  dataset_dir = is_cnvrg_dir(Dir.pwd)
2025
- direct = options[:direct]
2026
2056
  new_branch = options["new_branch"] || false
2027
2057
  force = options["force"] || false
2028
2058
  chunk_size = options["chunk_size"] || false
2029
2059
  message = options["message"]
2030
- commit_sha1 = nil
2031
2060
  @dataset = Dataset.new(dataset_dir)
2032
2061
  @dataset.backup_idx
2033
2062
  @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug, dataset: @dataset)
2034
2063
  next_commit = @dataset.get_next_commit #if there was a partial commit..
2035
- chunks = (@dataset.list_all_files.length.to_f / chunk_size).ceil
2064
+ files_list = @dataset.list_all_files
2065
+ chunks = (files_list.length.to_f / chunk_size).ceil
2036
2066
  resp = @files.start_commit(new_branch, force, chunks: chunks, dataset: @dataset, message: message)
2037
2067
  if !resp['result']['can_commit']
2038
2068
  log_message("Cant upload files because a new version of this dataset exists, please download it or upload with --force", Thor::Shell::Color::RED)
@@ -2043,7 +2073,7 @@ module Cnvrg
2043
2073
  @dataset.set_partial_commit(next_commit)
2044
2074
  end
2045
2075
  @dataset.set_next_commit(commit_sha1)
2046
- return commit_sha1
2076
+ return commit_sha1, files_list
2047
2077
  end
2048
2078
 
2049
2079
 
@@ -2066,7 +2096,7 @@ module Cnvrg
2066
2096
  @dataset.revert_next_commit #removes the next commit
2067
2097
  log_message("#{check} Dataset is up to date", Thor::Shell::Color::GREEN)
2068
2098
  else
2069
- log_message("#{check} Data files were updated successfully", Thor::Shell::Color::GREEN)
2099
+ log_message("#{check} Data sync finished", Thor::Shell::Color::GREEN)
2070
2100
  @dataset.remove_next_commit #takes the next commit and put it as current commit
2071
2101
  @dataset.set_partial_commit(nil)
2072
2102
  @dataset.backup_idx
@@ -2119,55 +2149,53 @@ module Cnvrg
2119
2149
  # method_option :tags_yml, :type => :boolean, :aliases => ["--file_tag_yml"], :default => false
2120
2150
  method_option :parallel, :type => :numeric, :aliases => ["-p", "--parallel"], :desc => "uparallel upload at the same time", :default => 15
2121
2151
 
2122
- def upload_data_files(new_commit, *files)
2152
+ def upload_data_files(new_commit, files_list: [])
2123
2153
  begin
2124
- verify_logged_in(true)
2125
- log_start(__method__, args, options)
2126
- dataset_dir = is_cnvrg_dir(Dir.pwd)
2127
- @dataset = Dataset.new(dataset_dir)
2128
- @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug, dataset: @dataset)
2129
- new_commit ||= @dataset.get_next_commit
2130
- partial_commit = @dataset.get_partial_commit
2131
- if new_commit.blank?
2132
- log_message("You must specify commit, run start_commit to create new commit", Thor::Shell::Color::RED)
2133
- return false
2134
- end
2135
- force = options[:force] || false
2136
- chunk_size = options[:chunk_size]
2137
- chunk_size = [chunk_size, 1].max
2138
- new_branch = options["new_branch"] || false
2139
- new_tree = {}
2140
- force = options["force"] || false
2141
- parallel_threads = options["parallel"] || ParallelThreads
2142
- all_files = @dataset.list_all_files
2143
- progressbar = ProgressBar.create(:title => "Upload Progress",
2144
- :progress_mark => '=',
2145
- :format => "%b>>%i| %p%% %t",
2146
- :starting_at => 0,
2147
- :total => all_files.length,
2148
- :autofinish => true)
2149
- files_uploaded = 0
2150
- all_files.each_slice(chunk_size).each do |list_files|
2151
- Cnvrg::Logger.log_info("Uploading files into #{@dataset.slug}, #{files_uploaded} files uploaded")
2152
- temp_tree = @dataset.generate_chunked_idx(list_files, threads: parallel_threads)
2153
- upload_resp = @files.upload_multiple_files(new_commit, temp_tree,
2154
- threads: parallel_threads,
2155
- force: force,
2156
- new_branch: new_branch,
2157
- progressbar: progressbar,
2158
- partial_commit: partial_commit)
2159
-
2160
- files_uploaded += upload_resp
2161
- temp_tree.each do |k, v|
2162
- new_tree[k] = (v.present?) ? {sha1: v.try(:fetch, :sha1, nil), commit_time: nil} : nil
2163
- end
2164
- end
2165
- @dataset.write_tree(new_tree) #we dont want to re-run it every time so just on finish.
2154
+ verify_logged_in(true)
2155
+ log_start(__method__, args, options)
2156
+ dataset_dir = is_cnvrg_dir(Dir.pwd)
2157
+ @dataset = Dataset.new(dataset_dir)
2158
+ @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug, dataset: @dataset)
2159
+ new_commit ||= @dataset.get_next_commit
2160
+ partial_commit = @dataset.get_partial_commit
2161
+ if new_commit.blank?
2162
+ log_message("You must specify commit, run start_commit to create new commit", Thor::Shell::Color::RED)
2163
+ return false
2164
+ end
2165
+ chunk_size = options[:chunk_size]
2166
+ chunk_size = [chunk_size, 1].max
2167
+ new_branch = options["new_branch"] || false
2168
+ new_tree = {}
2169
+ force = options["force"] || false
2170
+ parallel_threads = options["parallel"] || ParallelThreads
2171
+ all_files = files_list
2172
+ all_files = @dataset.list_all_files if files_list.blank?
2173
+ files_uploaded = 0
2174
+ upload_errors = []
2175
+
2176
+ all_files.each_slice(chunk_size).each do |list_files|
2177
+ Cnvrg::Logger.log_info("Uploading files into #{@dataset.slug}, #{files_uploaded} files uploaded")
2178
+ temp_tree = @dataset.generate_chunked_idx(list_files, threads: parallel_threads)
2179
+ upload_resp, upload_error_files = @files.upload_multiple_files(new_commit, temp_tree,
2180
+ threads: parallel_threads,
2181
+ force: force,
2182
+ new_branch: new_branch,
2183
+ partial_commit: partial_commit,
2184
+ total: all_files.length)
2185
+
2186
+ files_uploaded += upload_resp
2187
+ upload_errors += upload_error_files if upload_error_files.present?
2188
+ temp_tree.each do |k, v|
2189
+ new_tree[k] = (v.present?) ? {sha1: v.try(:fetch, :sha1, nil), commit_time: nil} : nil
2190
+ end
2191
+ end
2192
+
2193
+ @dataset.write_tree(new_tree) #we dont want to re-run it every time so just on finish.
2166
2194
  rescue => e
2167
2195
  Cnvrg::Logger.log_error(e)
2168
2196
  raise e
2169
2197
  end
2170
- return files_uploaded
2198
+ return files_uploaded, upload_errors.try(:flatten).try(:compact)
2171
2199
  end
2172
2200
 
2173
2201
 
@@ -2435,52 +2463,51 @@ module Cnvrg
2435
2463
  dataset_dir = is_cnvrg_dir(Dir.pwd)
2436
2464
  @dataset = Dataset.new(dataset_dir)
2437
2465
  @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug, dataset: @dataset)
2438
- all_files = all_files
2439
- @dataset.generate_idx
2440
2466
  res = @dataset.compare_idx_download(all_files: all_files, desired_commit: commit)
2441
2467
  unless CLI.is_response_success(res, false)
2442
2468
  log_message("Cant find the desired commit, please check it or try to download without it.", Thor::Shell::Color::RED)
2443
2469
  exit(1)
2444
2470
  end
2445
- result = res["result"]["tree"]
2446
- commit = res["result"]["commit"]
2447
- can_commit = res["result"]["can_commit"] || false #can commit means that our next commit is newer than the latest commit
2448
- # so if can_commit is true it means that we have to be up-to-date with the dataset.
2449
- update_total = [result['added'], result["updated_on_server"], result["conflicts"], result["deleted"]].compact.flatten.size
2471
+ result = res["result"]
2472
+ tree = result["tree"]
2473
+ commit = result["commit"]
2474
+ update_total = [tree['added'], tree["updated_on_server"], tree["conflicts"], tree["deleted"]].compact.flatten.size
2450
2475
  successful_changes = 0
2451
- if update_total == 0 or can_commit
2452
- log_message("Dataset is up to date", Thor::Shell::Color::GREEN) if !sync
2453
- return true
2454
- elsif options["verbose"]
2455
- log_message("Downloading #{update_total} files", Thor::Shell::Color::BLUE)
2476
+ if update_total == 0
2477
+ log_message("Dataset is up to date", Thor::Shell::Color::GREEN, !sync)
2478
+ return 0, 0
2456
2479
  else
2480
+ log_message("Downloading #{update_total} files", Thor::Shell::Color::BLUE, options["verbose"])
2457
2481
  log_message("Syncing Dataset", Thor::Shell::Color::BLUE, !sync)
2458
2482
  end
2459
- Cnvrg::Logger.log_info("Current commit: #{@dataset.get_current_commit}, destination commit: #{commit}")
2460
- Cnvrg::Logger.log_info("Compare idx res: #{result}")
2483
+ Cnvrg::Logger.log_info("Current commit: #{@dataset.last_local_commit}, destination commit: #{commit}")
2484
+ Cnvrg::Logger.log_info("Compare idx res: #{tree}")
2461
2485
  progressbar = ProgressBar.create(:title => "Download Progress",
2462
- :progress_mark => '=',
2463
- :format => "%b>>%i| %p%% %t",
2464
- :starting_at => 0,
2465
- :total => update_total,
2466
- :autofinish => true)
2467
- conflicts = @files.mark_conflicts(result)
2486
+ :progress_mark => '=',
2487
+ :format => "%b>>%i| %p%% %t",
2488
+ :starting_at => 0,
2489
+ :total => update_total,
2490
+ :autofinish => true)
2468
2491
 
2492
+ conflicts = @files.mark_conflicts(tree)
2469
2493
  log_message("Found some conflicts, check .conflict files.", Thor::Shell::Color::BLUE) if conflicts > 0
2470
- update_res = @files.download_files_in_chunks(result["updated_on_server"], progress: progressbar) if result["updated_on_server"].present?
2471
- added_res = @files.download_files_in_chunks(result["added"], progress: progressbar) if result["added"].present?
2472
- # conflict_res = @files.download_files_in_chunks(result["conflicts"], conflict: true) if result["conflicts"].present?
2473
- deleted = result["deleted"].to_a
2494
+ update_res = @files.download_files_in_chunks(tree["updated_on_server"], progress: progressbar) if tree["updated_on_server"].present?
2495
+ added_res = @files.download_files_in_chunks(tree["added"], progress: progressbar) if tree["added"].present?
2496
+ deleted = tree["deleted"].to_a
2474
2497
  delete_res = @files.delete_commit_files_local(deleted)
2475
- progressbar.progress += deleted.size if progressbar.present?
2498
+
2476
2499
  if !delete_res
2477
2500
  log_message("Couldn't delete #{deleted.join(" ")}", Thor::Shell::Color::RED)
2478
2501
  log_message("Couldn't download, Rolling Back all changes.", Thor::Shell::Color::RED)
2479
2502
  exit(1)
2480
2503
  end
2504
+
2505
+ progressbar.progress += deleted.size if progressbar.present? and deleted.size > 0
2506
+
2481
2507
  success = (update_res.blank? or update_res.is_success?)
2482
2508
  success &= (delete_res.blank? or delete_res.is_success?)
2483
2509
  success &= (added_res.blank? or added_res.is_success?)
2510
+
2484
2511
  if success
2485
2512
  # update idx with latest commit
2486
2513
  @dataset.update_idx_with_commit!(commit)
@@ -2490,17 +2517,24 @@ module Cnvrg
2490
2517
  log_message(successful_changes.join("\n"), Thor::Shell::Color::GREEN)
2491
2518
  log_message("Total of #{successful_changes.size} / #{update_total} files.", Thor::Shell::Color::GREEN)
2492
2519
  else
2493
- log_message("#{check} Downloaded changes successfully", Thor::Shell::Color::GREEN, ((sync or options["sync"]) ? false : true))
2520
+ log_message("#{check} Downloaded changes successfully", Thor::Shell::Color::GREEN, !sync)
2494
2521
  end
2495
- return true
2522
+
2523
+ total_deleted = deleted.try(:size)
2524
+ total_downloaded = tree["added"].try(:size) || 0
2525
+ total_downloaded += tree["updated_on_server"].try(:size) if tree["updated_on_server"].present?
2526
+
2527
+ return total_deleted, total_downloaded
2528
+ else
2529
+ return []
2496
2530
  end
2497
2531
  rescue SignalException => e
2498
2532
  Cnvrg::Logger.log_error(e)
2499
2533
  say "\nAborting", Thor::Shell::Color::BLUE
2500
2534
  exit(1)
2501
2535
  rescue => e
2502
- log_message("Error occurred, \nAborting", Thor::Shell::Color::BLUE)
2503
2536
  Cnvrg::Logger.log_error(e)
2537
+ log_message("Error occurred, \nAborting", Thor::Shell::Color::RED)
2504
2538
  exit(1)
2505
2539
  end
2506
2540
  end
@@ -3386,10 +3420,6 @@ module Cnvrg
3386
3420
  output_dir = "output"
3387
3421
  end
3388
3422
  image = options["image"] || nil
3389
- if image.blank?
3390
- image = "cnvrg"
3391
- end
3392
-
3393
3423
  forced_commit = nil
3394
3424
  if sync_before and !project.is_git
3395
3425
  if force
@@ -5491,7 +5521,7 @@ module Cnvrg
5491
5521
  end
5492
5522
  end
5493
5523
 
5494
- def self.log_message(message, type = Thor::Shell::Color::BLUE, to_print: true)
5524
+ def self.log_message(message, type = Thor::Shell::Color::BLUE)
5495
5525
  if $LOG.blank?
5496
5526
  ### handle case when $LOG is not initialized
5497
5527
  CLI.new.log_handler
@@ -5513,11 +5543,12 @@ module Cnvrg
5513
5543
  color = nil
5514
5544
  $LOG.info message: message, type: "unknown"
5515
5545
  end
5516
- say "#{color}#{message}#{Thor::Shell::Color::CLEAR}" if to_print
5546
+ say "#{color}#{message}#{Thor::Shell::Color::CLEAR}"
5517
5547
  end
5518
5548
 
5519
5549
  def log_message(message, type=Thor::Shell::Color::GREEN, to_print = true)
5520
- CLI.log_message(message, type, to_print: to_print)
5550
+ return if not to_print
5551
+ CLI.log_message(message, type)
5521
5552
  end
5522
5553
 
5523
5554
  def log_error(e)
@@ -114,33 +114,52 @@ module Cnvrg
114
114
  end
115
115
 
116
116
 
117
- def upload_multiple_files(commit_sha1, tree, threads: ParallelThreads, force: false, new_branch: false, progressbar: nil, prefix: '', partial_commit: nil)
117
+ def upload_multiple_files(commit_sha1, tree, threads: ParallelThreads, force: false, new_branch: false, prefix: '', partial_commit: nil, total: nil)
118
118
  begin
119
- cli=CLI.new
120
119
  Cnvrg::Logger.log_info("Sending Upload Files request")
121
- upload_resp = Cnvrg::API.request(@base_resource + "upload_files", 'POST_JSON', {commit_sha1: commit_sha1, tree: tree, force: force, is_branch: new_branch, partial_commit: partial_commit})
122
- unless Cnvrg::CLI.is_response_success(upload_resp, false)
120
+ error = nil
121
+ upload_resp = nil
122
+ 10.times do
123
+ upload_resp = Cnvrg::API.request(@base_resource + "upload_files", 'POST_JSON', {commit_sha1: commit_sha1, tree: tree, force: force, is_branch: new_branch, partial_commit: partial_commit})
124
+ if Cnvrg::CLI.is_response_success(upload_resp, false)
125
+ error = nil
126
+ break
127
+ end
128
+ error = upload_resp
123
129
  Cnvrg::Logger.log_method(bind: binding)
124
- raise Exception.new("Got an error message from server, #{upload_resp.try(:fetch, "message")}")
130
+ Cnvrg::CLI.log_info("Got an error message from server, #{upload_resp.try(:fetch, "message")}, trying again")
125
131
  end
132
+ raise Exception.new("Can't upload data files: #{error["message"]}") if error.present?
133
+
126
134
  Cnvrg::Logger.log_info("Uploading files")
127
135
  results = upload_resp['result'].with_indifferent_access
136
+
128
137
  if results['files'].blank?
129
- progressbar.progress += tree.keys.length if progressbar.present?
130
- return 0
138
+ return 0, []
139
+ end
140
+
141
+ if @temp_upload_progressbar.blank?
142
+ @temp_upload_progressbar = ProgressBar.create(:title => "Upload Progress",
143
+ :progress_mark => '=',
144
+ :format => "%b>>%i| %p%% %t",
145
+ :starting_at => 0,
146
+ :total => total,
147
+ :autofinish => true)
131
148
  end
149
+
132
150
  files = results['files']
133
- progressbar.progress += tree.keys.length - files.length if progressbar.present?
151
+ upload_error_files = []
152
+ @temp_upload_progressbar.progress += tree.keys.length - files.length if @temp_upload_progressbar.present?
134
153
  Parallel.map((files.keys), in_threads: threads) do |k|
135
154
  o = tree[k].merge(files[k])
136
155
  success = upload_single_file(o)
137
156
  if not success
157
+ upload_error_files << {absolute_path: o[:absolute_path]}
138
158
  files.except!(k)
139
159
  tree.except!(k)
140
- cli.log_message("Error while uploading file: #{o[:absolute_path]}", Thor::Shell::Color::RED)
141
160
  Cnvrg::Logger.log_error_message("Error while upload single file #{o["path"]}")
142
161
  end
143
- progressbar.progress += 1 if progressbar.present?
162
+ @temp_upload_progressbar.progress += 1 if @temp_upload_progressbar.present?
144
163
  end
145
164
  blob_ids = files.values.map {|f| f['bv_id']}
146
165
  if blob_ids.present?
@@ -153,25 +172,21 @@ module Cnvrg
153
172
  end
154
173
  end
155
174
  Cnvrg::Logger.log_info("Upload Success")
156
- return files.keys.length
175
+ return files.try(:keys).try(:length), upload_error_files
157
176
  rescue => e
158
177
  Cnvrg::Logger.log_method(bind: binding)
159
178
  Cnvrg::Logger.log_error(e)
160
179
  raise e
161
180
  end
162
-
163
181
  end
164
182
 
165
183
  def upload_single_file(file)
166
184
  begin
167
- cli = CLI.new
168
185
  file = file.as_json
169
186
  Cnvrg::Logger.log_info("Uploading #{file["absolute_path"]}")
170
- success = @downloader.upload(file["path"], file["absolute_path"])
171
- return false if not success
187
+ @downloader.safe_upload(file["path"], file["absolute_path"])
172
188
  Cnvrg::Logger.log_info("#{file["absolute_path"]} uploaded.")
173
189
  rescue => e
174
- cli.log_message(e.message, Thor::Shell::Color::RED)
175
190
  Cnvrg::Logger.log_error_message("Error while upload single file #{file["path"]}")
176
191
  Cnvrg::Logger.log_error(e)
177
192
  return false
@@ -815,6 +830,7 @@ module Cnvrg
815
830
  end
816
831
  return true
817
832
  end
833
+
818
834
  def delete_commit_files_local(deleted)
819
835
  begin
820
836
  FileUtils.rm_rf(deleted) unless (deleted.nil? or deleted.empty?)
@@ -822,9 +838,6 @@ module Cnvrg
822
838
  rescue => e
823
839
  return Cnvrg::Result.new(false, '')
824
840
  end
825
-
826
- return Cnvrg::Result.new(true, '')
827
-
828
841
  end
829
842
 
830
843
  def download_dir(dataset_home, absolute_path)
@@ -869,6 +882,7 @@ module Cnvrg
869
882
  Cnvrg::CLI.is_response_success(response, true)
870
883
  return response
871
884
  end
885
+
872
886
  def start_commit(new_branch,force=false,delete_commit=nil, chunks: 0, dataset: @dataset, message:nil)
873
887
  begin
874
888
  #if we are pushing with force or to branch we dont need to send current/next commit cause we want to
@@ -876,14 +890,13 @@ module Cnvrg
876
890
  idx = (force || new_branch) ? {} : dataset.get_idx
877
891
  commit = idx[:commit]
878
892
  next_commit = idx[:next_commit]
879
- response = Cnvrg::API.request("#{base_resource}/commit/start", 'POST', {dataset_slug: @dataset_slug, new_branch: new_branch,force:force,
880
- username: @owner,current_commit: commit, next_commit: next_commit, total_chunks: chunks, message: message})
881
- Cnvrg::CLI.is_response_success(response, true)
882
- return response
893
+ response = Cnvrg::API.request("#{base_resource}/commit/start", 'POST', {dataset_slug: @dataset_slug, new_branch: new_branch,force:force,
894
+ username: @owner,current_commit: commit, next_commit: next_commit, total_chunks: chunks, message: message})
895
+ Cnvrg::CLI.is_response_success(response, true)
896
+ return response
883
897
  rescue => e
884
898
  return false
885
899
  end
886
-
887
900
  end
888
901
 
889
902
  def end_commit(commit_sha1,force, success: true, uploaded_files: 0 )
@@ -103,8 +103,12 @@ module Cnvrg
103
103
 
104
104
  def backup_idx
105
105
  Cnvrg::Logger.log_info("Backup idx")
106
- idx = self.get_idx
107
- File.open("#{self.local_path}/.cnvrg/idx.yml.backup", 'w') {|f| f.write idx.to_yaml}
106
+ if File.exists? "#{self.local_path}/.cnvrg/idx.yml"
107
+ FileUtils.cp "#{self.local_path}/.cnvrg/idx.yml", "#{self.local_path}/.cnvrg/idx.yml.backup"
108
+ else
109
+ idx = {commit: nil, tree: {}}
110
+ File.open("#{self.local_path}/.cnvrg/idx.yml.backup", 'w') {|f| f.write idx.to_yaml}
111
+ end
108
112
  end
109
113
 
110
114
  def restore_idx
@@ -780,14 +784,6 @@ module Cnvrg
780
784
  File.open("#{self.local_path}/.cnvrg/idx.yml", 'w') {|f| f.write idx_hash.to_yaml}
781
785
  end
782
786
 
783
- def get_current_commit()
784
- if !File.exist? "#{self.local_path}/.cnvrg/idx.yml"
785
- return nil
786
- end
787
- idx_hash = YAML.load_file("#{self.local_path}/.cnvrg/idx.yml")
788
- return idx_hash[:commit]
789
- end
790
-
791
787
  def compare_commit(commit)
792
788
  if commit.nil? or commit.empty?
793
789
  commit = last_local_commit
@@ -2,6 +2,8 @@
2
2
  module Cnvrg
3
3
  module Downloader
4
4
  OLD_SERVER_VERSION_MESSAGE = "Your server version is not relevant for this cli version please contact support for further help."
5
+ MAXIMUM_BACKOFF = 64
6
+ RETRIES = ENV['UPLOAD_FILE_RETRIES'].try(:to_i) || 20
5
7
  attr_accessor :bucket, :client
6
8
  class Client
7
9
  def initialize(params)
@@ -41,6 +43,35 @@ module Cnvrg
41
43
  Cnvrg::Helpers.decrypt(@key, @iv, str)
42
44
  end
43
45
 
46
+ def safe_upload(storage_path, local_path)
47
+ n = 1
48
+ error = nil
49
+ while n <= RETRIES
50
+ begin
51
+ self.upload(storage_path, local_path)
52
+ error = nil
53
+ break
54
+ rescue => e
55
+ backoff_time_seconds = backoff_time(n)
56
+
57
+ message = "Got error: #{e.class.name} with message: #{e.message} while uploading a single file: #{local_path}, retry: #{n} of: #{RETRIES}"
58
+ if n < RETRIES
59
+ message += ", next retry in: #{backoff_time_seconds} seconds"
60
+ else
61
+ message += ", done retry, continuing to the next file"
62
+ end
63
+ Cnvrg::Logger.log_error_message(message)
64
+
65
+ sleep backoff_time_seconds
66
+
67
+ n += 1
68
+ error = e
69
+ end
70
+ end
71
+ raise error if error.present?
72
+ true
73
+ end
74
+
44
75
  def self.factory(params)
45
76
  params = params.as_json
46
77
  case params["storage"]
@@ -53,6 +84,18 @@ module Cnvrg
53
84
  return Cnvrg::Downloader::Clients::GcpClient.new(project_id: params["project_id"], credentials: params["credentials"], bucket_name: params["bucket_name"], sts: params["sts"])
54
85
  end
55
86
  end
87
+
88
+ private
89
+
90
+ def random_number_milliseconds
91
+ rand(1000) / 1000.0
92
+ end
93
+
94
+
95
+ def backoff_time(n)
96
+ return [((2**n)+random_number_milliseconds), MAXIMUM_BACKOFF].min
97
+ end
98
+
56
99
  end
57
100
  end
58
101
  end
@@ -21,28 +21,12 @@ module Cnvrg
21
21
 
22
22
  def upload(storage_path, local_path)
23
23
  begin
24
- try_upload_file(storage_path, local_path)
24
+ client.create_block_blob(@container, storage_path, File.open(local_path, "rb"))
25
25
  rescue => e
26
26
  raise e
27
27
  end
28
28
  end
29
29
 
30
- def try_upload_file(storage_path, local_path)
31
- c = 20
32
- error = nil
33
- while c > 0
34
- begin
35
- client.create_block_blob(@container, storage_path, File.open(local_path, "rb"))
36
- break
37
- rescue => e
38
- c -= 1
39
- error = e
40
- end
41
- end
42
- raise error if error.present?
43
- return true
44
- end
45
-
46
30
  def fetch_files(prefix: nil, marker: nil, limit: 10000)
47
31
  blobs = client.list_blobs(@container, prefix: prefix, max_results: limit, marker: marker)
48
32
  next_marker = blobs.continuation_token
@@ -53,7 +53,8 @@ module Cnvrg
53
53
  ### storage path is the path inside s3 (after the bucket)
54
54
  # local path is fullpath for the file /home/ubuntu/user.../hazilim.py
55
55
  o = aws_bucket.object(storage_path)
56
- o.upload_file(local_path, @upload_options)
56
+ success = o.upload_file(local_path, @upload_options)
57
+ return success
57
58
  rescue => e
58
59
  raise e
59
60
  end
@@ -880,6 +880,7 @@ module Cnvrg
880
880
  end
881
881
 
882
882
  end
883
+
883
884
  def delete_commit_files_local(deleted)
884
885
  begin
885
886
  FileUtils.rm_rf(deleted) unless (deleted.nil? or deleted.empty?)
@@ -887,16 +888,14 @@ module Cnvrg
887
888
  rescue => e
888
889
  return false
889
890
  end
891
+ end
890
892
 
891
- return true
892
-
893
+ def start_commit(new_branch,force:false, exp_start_commit:nil, job_slug: nil, job_type: nil, start_commit: nil, message: nil)
894
+ response = Cnvrg::API.request("#{base_resource}/commit/start", 'POST', {project_slug: @project_slug, new_branch: new_branch,force:force,
895
+ username: @owner, exp_start_commit:exp_start_commit, job_slug: job_slug, job_type: job_type, start_commit: start_commit, message: message})
896
+ Cnvrg::CLI.is_response_success(response,false)
897
+ return response
893
898
  end
894
- def start_commit(new_branch,force:false, exp_start_commit:nil, job_slug: nil, job_type: nil, start_commit: nil, message: nil)
895
- response = Cnvrg::API.request("#{base_resource}/commit/start", 'POST', {project_slug: @project_slug, new_branch: new_branch,force:force,
896
- username: @owner, exp_start_commit:exp_start_commit, job_slug: job_slug, job_type: job_type, start_commit: start_commit, message: message})
897
- Cnvrg::CLI.is_response_success(response,false)
898
- return response
899
- end
900
899
 
901
900
  def end_commit(commit_sha1,force:false,message:"")
902
901
  response = Cnvrg::API.request("#{base_resource}/commit/end", 'POST', {commit_sha1: commit_sha1,force:force,message:message})
@@ -1,3 +1,3 @@
1
1
  module Cnvrg
2
- VERSION = '1.6.21'
2
+ VERSION = '1.6.22'
3
3
  end
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: 1.6.21
4
+ version: 1.6.22
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yochay Ettun
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-02-05 00:00:00.000000000 Z
13
+ date: 2020-02-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -477,7 +477,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
477
477
  - !ruby/object:Gem::Version
478
478
  version: '0'
479
479
  requirements: []
480
- rubygems_version: 3.0.4
480
+ rubygems_version: 3.0.3
481
481
  signing_key:
482
482
  specification_version: 4
483
483
  summary: A CLI tool for interacting with cnvrg.io.