Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 23 additions & 13 deletions lib/application_manager/task.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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)
Expand Down