diff --git a/lib/application_manager/task.rb b/lib/application_manager/task.rb index fc3756a..2831bba 100644 --- a/lib/application_manager/task.rb +++ b/lib/application_manager/task.rb @@ -112,6 +112,11 @@ def failed? @task_state == :failed end + # Helper method to normalize file paths for case-insensitive comparison + def normalize_path(path) + path.to_s.gsub("\\", "/").downcase + end + def failure_reason @task_failure_reason || "" end @@ -259,7 +264,7 @@ def build_package_list next if packages.detect do |pkg| pkg.category == "games" && pkg.subcategory == @app_id && - pkg.name == file.package && + pkg.name.to_s.casecmp?(file.package.to_s) && pkg.version == file.version end @@ -295,10 +300,8 @@ def verify_files @files.reverse.each do |file| break unless folder_exists - safe_file_name = file.name.gsub("\\", "/") - # Fix borked Data -> data 'cause Windows don't care about capitalization - safe_file_name.sub!("Data/", "data/") - + # Normalize file paths to handle case-insensitive comparisons + safe_file_name = normalize_path(file.name) file_path = "#{path}/#{safe_file_name}" processed_files += 1 @@ -383,9 +386,9 @@ def fetch_packages end package = @packages.find do |pkg| - pkg.category == rich.category && - pkg.subcategory == rich.subcategory && - "#{pkg.name}.zip" == rich.name && + pkg.category.to_s.casecmp?(rich.category.to_s) && + pkg.subcategory.to_s.casecmp?(rich.subcategory.to_s) && + "#{pkg.name}.zip".casecmp?(rich.name) && pkg.version == rich.version end @@ -747,13 +750,20 @@ def apply_patch(package, path) def unzip(package_path, path) stream = Zip::InputStream.new(File.open(package_path)) + extracted_files = {} # Track files we've already extracted to handle case conflicts while (entry = stream.get_next_entry) - - safe_file_name = entry.name.gsub("\\", "/") - # Fix borked Data -> data 'cause Windows don't care about capitalization - safe_file_name.sub!("Data/", "data/") - + # Normalize the path to handle case-insensitivity consistently + safe_file_name = normalize_path(entry.name.gsub("\\", "/")) + + # Skip if we've already extracted a file with this normalized path + if extracted_files[safe_file_name] + logger.debug(LOG_TAG) { "Skipping duplicate file (case-insensitive): #{entry.name}" } + next + end + + extracted_files[safe_file_name] = true + dir_path = "#{path}/#{File.dirname(safe_file_name)}" unless dir_path.end_with?("/.") || Dir.exist?(dir_path) FileUtils.mkdir_p(dir_path)