Repository navigation
Steam downloads: a redistributable's file no longer replaces the game's own copy - #576
Merged
intraducine merged 1 commit intoNov 6, 2026
Conversation
…'s own copy 8f93433 makes the last depot that lists a file the only one that writes it, as Valve's client does. It compares file names only. Since ddc6c2a, the same prepare() also plans the Steamworks Common Redistributables depots a game names, into their owner's folder (steamapps/common/ Steamworks Shared). They are planned after the game's own depots. So when a game's depot and a redistributable depot list the same relative name (for example _CommonRedist\vcredist\2019\VC_redist.x64.exe), the two files in two folders were treated as one. The game's copy got an empty path: it was never downloaded into the game's folder, and a repair never checked it. The log counted it as an overlap. The rule now compares names within one install folder. Depots that share the game's folder (DLC, language and update depots) behave as before. check-depot-overlap.py has not compiled since it came in with 8f93433: it builds a DepotPlan without installURL and passes installURL to prepare(), the shape from before ddc6c2a. It now builds against the current code. It also has a two-folder case: the game and the redistributable each keep their copy, in their own folder. With main's DepotDownloader.swift that case fails ("the game's own copy is not written to its folder"), while the same-folder cases still pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: NevesHenry <henriquereisneves@hotmail.com>
intraducine
approved these changes
Nov 6, 2026
intraducine
left a comment
Collaborator
There was a problem hiding this comment.
Reviewed the changed code and both prepare() callers. The host check passes at 7635994 and fails against current main for the two-folder case. Same-folder depot replacement still passes. All 13 CI checks completed successfully or were skipped as expected, including the full app build. This is a distinct download fix, so it does not need consolidation. No real Steam download or device run was performed in this review.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
In short
The later-depot-wins rule from 8f93433 compares file names only, across install folders. Since ddc6c2a the same plan also holds the Steamworks Common Redistributables depots, which go to their owner's folder (Steamworks Shared) and are planned after the game's own depots. A game file with the same relative name as a redistributable file (for example
_CommonRedist\vcredist\2019\VC_redist.x64.exe) was then never written to the game's folder, and a repair never checked it.Details
tests/host/check-depot-overlap.pyhas not compiled since it came in with 8f93433: it buildsDepotPlanand callsprepare()in the shape from before ddc6c2a. It now builds against the current code and has a two-folder case (game + Steamworks Shared).No kill switch: this only changes which depot writes a file when two folders list the same name, and 8f93433 had none either.
Validation
Linux, Swift 6.4.1:
check-depot-overlap.pypasses.DepotDownloader.swiftand the new check:FAIL: the game's own copy is not written to its folderandFAIL: pending chunks across two folders: [[1],[0]]; the same-folder cases still pass.missing argument for parameter 'installURL').No device test and no real download: I don't know a game whose depot and a redistributable depot list the same path, so the impact is from reading the code.
AI disclosure: this change and description were written with Claude Code.
🤖 Generated with Claude Code