Skip to content

[Bug]: Overwriting seems to break starcraft mpq #174

@MikaMika

Description

@MikaMika

mpqcli version

0.10.0

Host OS

Linux

Installation method

Prebuilt binary

mpqcli command

mpqcli add --game starcraft1 --update --overwrite temp.mpq mpq

Expected behaviour

I'm downgrading the Starcraft mod Cosmonarchy to a previous version, that deletes some files in mpq dir and modifies others.
I'm checking git diff to see which files have been touched.
If I delete everything from that diff list, then mpqcli add will only have to add and things are working well.
If I delete only files with a D marker and let the M files being overwritten, then the mod errors.

Image

Actual behaviour / error output

Screenshot above:
"Data File Error"
The problem occured while trying to load a file
> unit\
> File not found.

Additional context

You may install Cosmonarchy using the Fraud Launcher with a Wine wrapper. I like to use Faugus Launcher for that. There is more than one way to do it, so let me know if you need more info.

update_mpq() {
    target=${1:-origin/HEAD}
    mpq=${2:-temp.mpq}
    dir=${3:-mpq}
    git fetch # in case target is origin/HEAD
    # this part uses tempfiles to make it easier to understand
    # pipes can be used instead:
    #git diff --name-status "HEAD..$target" | grep '^[DR]' | cut -f2 | grep "^$dir" | sed "s,$dir,," | tr / \\\\ | mpqcli remove "$mpq" -
    git diff --name-status "HEAD..$target" > gitdiff1.txt # list of diff files with status
    grep '^[DR]'              gitdiff1.txt > gitdiff2.txt # get Deleted and Renamed files only
    cut -f2                   gitdiff2.txt > gitdiff3.txt # get current path to file
    grep "^${dir%/}/"         gitdiff3.txt > gitdiff4.txt # get files only from the mpq dir
    sed "s,${dir%/}/,,"       gitdiff4.txt > gitdiff5.txt # remove mpq dir from path
    tr / \\\\               < gitdiff5.txt > gitdiff6.txt # "unix2dos" slash 2 backslash
    mpqcli remove "$mpq" -  < gitdiff6.txt
    #rm gitdiff*.txt                                       # remove tempfiles or keep as logs
    git restore .                                         # making sure switch will not complain
    git switch --detach "$target"                         # checking out files from target commit
    mpqcli add -g sc --update --overwrite "$mpq" "$dir" | grep -v ^.~ # hide [~] messages
    if [[ $? -ne 0 ]]; then # if mpqcli add failed is probably because archive needs to be created first
    mpqcli create --game starcraft1 --output "$mpq" "$dir" | grep -v ^.+ # hide [+] messages
    fi
}

COSMONARCHY=~/Faugus/default/drive_c/Cosmonarchy # Make sure you modify this according to your setup
UPGRADE=dc02de47bef61e82f7cbe7e17255ab4c7ee6b877
DOWNGRADE=f1ff5a71017a9498ac5d2b5a5df0ace78400b9bd

# Assuming you are doing this in a Wine prefix with StarCraft 1.16.1 already installed
# If not, download and unzip the following, then update the registry using the .bat file included
# https://mikamika.top/cm/dl/bw-lite.zip
mkdir -p "$COSMONARCHY"
git clone --filter=blob:none --no-checkout https://gitlab.com/the-no-frauds-club/cosmonarchy-bw-prerelease.git "$COSMONARCHY/Prerelease"
cd "$COSMONARCHY/Prerelease" || exit
# The following will create the archive since it does not exist yet
update_mpq $UPGRADE
# Launching the mod now would work fine
update_mpq $DOWNGRADE
# Launching after a downgrade would error
update_mpq $UPGRADE
# Going back to when the archive was created will work again

# Now let's try the opposite
rm temp.mpq
# Create an older archive works
update_mpq $DOWNGRADE
# Update it with newer version works
update_mpq $UPGRADE
# Downgrade back to when created works too
update_mpq $DOWNGRADE

I mentioned that deleting all files and then adding them instead of overwriting would work.
You can change the code above from grep '^[DR]' to grep '^[DRM]' to delete those Modified files and fix the script. Doing UPGRADE -> DOWNGRADE would work that way, but I'm highlighting the problem with --overwrite that I do not quite understand, only that it's giving different result.

Sorry again for a lengthy report. I hope the example will be clear enough. Thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions