Class: U3d::LinuxInstaller

Inherits:
BaseInstaller show all
Defined in:
lib/u3d/installer.rb

Overview

rubocop:disable ClassLength

Instance Method Summary collapse

Methods inherited from BaseInstaller

#installed_sorted_by_versions, #sanitize_installs

Instance Method Details

#install(file_path, version, installation_path: nil, info: nil) ⇒ Object

rubocop:disable PerceivedComplexity



300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
# File 'lib/u3d/installer.rb', line 300

def install(file_path, version, installation_path: nil, info: nil)
  # rubocop:enable UnusedMethodArgument, PerceivedComplexity
  extension = File.extname(file_path)

  raise "Installation of #{extension} files is not supported on Linux" unless ['.zip', '.po', '.sh', '.xz', '.pkg'].include? extension
  if extension == '.sh'
    path = installation_path || DEFAULT_LINUX_INSTALL
    install_sh(file_path, installation_path: path)
  elsif extension == '.xz'
    new_path = File.join(DEFAULT_LINUX_INSTALL, format(UNITY_DIR_LINUX, version: version))
    path = installation_path || new_path
    install_xz(file_path, installation_path: path)
  elsif extension == '.pkg'
    new_path = File.join(DEFAULT_LINUX_INSTALL, format(UNITY_DIR_LINUX, version: version))
    path = installation_path || new_path
    install_pkg(file_path, installation_path: path)
  elsif extension == '.po'
    install_po(file_path, version, info: info)
  elsif extension == '.zip'
    install_zip(file_path, version, info: info)
  end

  # Forces sanitation for installation of 'weird' versions eg 5.6.1xf1Linux
  unity = installed.select { |u| u.version == version }.first
  if unity
    sanitize_install(unity)
  else
    UI.error "Unity was not installed properly"
  end
end

#install_pkg(file, installation_path: nil) ⇒ Object



361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
# File 'lib/u3d/installer.rb', line 361

def install_pkg(file, installation_path: nil)
  raise 'Missing installation_path' unless installation_path
  raise 'Only able to install pkg on top of existing Unity installs' unless File.exist? installation_path
  raise 'Missing 7z' if `which 7z`.empty?

  Dir.mktmpdir do |tmp_dir|
    UI.verbose "Working in tmp dir #{tmp_dir}"

    command = "7z -aos -t* -o#{tmp_dir.shellescape} e #{file.shellescape}"
    U3dCore::CommandExecutor.execute(command: command)

    target_location = pkg_install_path(installation_path, "#{tmp_dir}/PackageInfo")

    # raise "Path for #{target_location} already exists" if path File.exist? target_location

    command = "cd #{target_location.shellescape}; gzip -dc #{tmp_dir}/Payload | cpio -i '*' -"
    command = "mkdir -p #{target_location.shellescape}; #{command}" # unless File.directory? installation_path

    U3dCore::CommandExecutor.execute(command: command, admin: true)
  end
rescue StandardError => e
  UI.verbose(e.backtrace.join("\n"))
  UI.error "Failed to install pkg file #{file} at #{installation_path}: #{e}"
else
  UI.success 'Installation successful'
end

#install_sh(file, installation_path: nil) ⇒ Object



331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
# File 'lib/u3d/installer.rb', line 331

def install_sh(file, installation_path: nil)
  cmd = file.shellescape

  U3dCore::CommandExecutor.execute(command: "chmod a+x #{cmd}")

  if installation_path
    command = "cd #{installation_path.shellescape}; #{cmd}"
    command = "mkdir -p #{installation_path.shellescape}; #{command}" unless File.directory? installation_path
    U3dCore::CommandExecutor.execute(command: command, admin: true)
  else
    U3dCore::CommandExecutor.execute(command: cmd, admin: true)
  end
rescue StandardError => e
  UI.error "Failed to install sh file #{file} at #{installation_path}: #{e}"
else
  UI.success 'Installation successful'
end

#install_xz(file, installation_path: nil) ⇒ Object



349
350
351
352
353
354
355
356
357
358
359
# File 'lib/u3d/installer.rb', line 349

def install_xz(file, installation_path: nil)
  raise 'Missing installation_path' unless installation_path

  command = "cd #{installation_path.shellescape}; tar xf #{file.shellescape}"
  command = "mkdir -p #{installation_path.shellescape}; #{command}" unless File.directory? installation_path
  U3dCore::CommandExecutor.execute(command: command, admin: true)
rescue StandardError => e
  UI.error "Failed to install xz file #{file} at #{installation_path}: #{e}"
else
  UI.success 'Installation successful'
end

#installedObject



294
295
296
297
# File 'lib/u3d/installer.rb', line 294

def installed
  paths = (list_installed_paths + debian_installed_paths).uniq
  paths.map { |path| LinuxInstallation.new(root_path: path) }
end

#sanitize_install(unity, long: false, dry_run: false) ⇒ Object



283
284
285
286
287
288
289
290
291
292
# File 'lib/u3d/installer.rb', line 283

def sanitize_install(unity, long: false, dry_run: false)
  source_path = File.expand_path(unity.root_path)
  parent = File.expand_path('..', source_path)
  dir_name = format(long ? UNITY_DIR_LINUX_LONG : UNITY_DIR_LINUX,
                    version: unity.version, build_number: unity.build_number)
  new_path = File.join(parent, dir_name)

  moved = U3dCore::AdminTools.move_os_file(:linux, source_path, new_path, dry_run: dry_run)
  unity.root_path = new_path if moved && !dry_run
end

#uninstall(unity: nil) ⇒ Object



388
389
390
391
392
393
394
395
396
# File 'lib/u3d/installer.rb', line 388

def uninstall(unity: nil)
  UI.verbose("Uninstalling Unity at '#{unity.root_path}'...")
  command = "rm -r #{unity.root_path}"
  U3dCore::CommandExecutor.execute(command: command, admin: true)
rescue StandardError => e
  UI.error "Failed to uninstall unity at #{unity.path}: #{e}"
else
  UI.success "Successfully uninstalled '#{unity.root_path}'"
end