Fix deleted files not getting removed after complete updates

Mozilla uses a `precomplete` file to delete local files when doing a
complete update, but since Zotero 5 in 2017 we've just been bundling an
empty file, which has meant that deleted or moved files have been left
behind. Among other things, this has likely been the primary cause of
Safari App Extension post-update brokenness for many years.

Incremental updates weren't affected, since those include explicit
removal instructions for moving from the given build to the latest one.

This restores proper generation of the `precomplete` file during builds,
using the Mozilla script added in 74ec6620e.

Separately, we'll update the `removed-file` for each platform to remove
files that should've been removed during previous updates.

Fixes #3133
This commit is contained in:
Dan Stillman 2024-07-25 01:54:57 -04:00
parent 9a43e8f057
commit ef2cceba7e

View file

@ -541,11 +541,23 @@ if [ $BUILD_MAC == 1 ]; then
# Delete extraneous files # Delete extraneous files
find "$CONTENTSDIR" -depth -type d -name .git -exec rm -rf {} \; find "$CONTENTSDIR" -depth -type d -name .git -exec rm -rf {} \;
find "$CONTENTSDIR" \( -name .DS_Store -or -name update.rdf \) -exec rm -f {} \; find "$CONTENTSDIR" \( -name .DS_Store -or -name update.rdf \) -exec rm -f {} \;
# Copy over removed-files and make a precomplete file here since it needs to be stable for the # Add Safari App Extension -- this depends on signing but needs to be done before generating
# signature. This is done in build_autocomplete.sh for other platforms. # the precomplete file
cp "$CALLDIR/update-packaging/removed-files_mac" "$CONTENTSDIR/Resources/removed-files" if [[ $SIGN == 1 ]] && [[ -n "$SAFARI_APPEX" ]] && [[ -d "$SAFARI_APPEX" ]]; then
touch "$CONTENTSDIR/Resources/precomplete" mkdir "$APPDIR/Contents/PlugIns"
cp -R $SAFARI_APPEX "$APPDIR/Contents/PlugIns/ZoteroSafariExtension.appex"
fi
# Copy over removed-files and make a precomplete file
pushd "$CONTENTSDIR/Resources/"
cp "$CALLDIR/update-packaging/removed-files_mac" removed-files
python3 "$CALLDIR/scripts/createprecomplete.py"
if [ ! -s precomplete ]; then
echo "precomplete file not created -- aborting" 2>&1
exit 1
fi
popd
# Sign # Sign
if [ $SIGN == 1 ]; then if [ $SIGN == 1 ]; then
@ -565,15 +577,14 @@ if [ $BUILD_MAC == 1 ]; then
find "$APPDIR/Contents" -name '*.app' -exec /usr/bin/codesign --force --options runtime --entitlements "$entitlements_file" --sign "$DEVELOPER_ID" {} \; find "$APPDIR/Contents" -name '*.app' -exec /usr/bin/codesign --force --options runtime --entitlements "$entitlements_file" --sign "$DEVELOPER_ID" {} \;
/usr/bin/codesign --force --options runtime --entitlements "$entitlements_file" --sign "$DEVELOPER_ID" "$APPDIR/Contents/MacOS/zotero" /usr/bin/codesign --force --options runtime --entitlements "$entitlements_file" --sign "$DEVELOPER_ID" "$APPDIR/Contents/MacOS/zotero"
# Bundle and sign Safari App Extension # Sign Safari App Extension
# #
# Even though it's signed by Xcode, we sign it again to make sure it matches the parent app signature # Even though it's signed by Xcode, we sign it again to make sure it matches the parent app signature
if [[ -n "$SAFARI_APPEX" ]] && [[ -d "$SAFARI_APPEX" ]]; then if [ -d "$APPDIR/Contents/PlugIns/ZoteroSafariExtension.appex" ]; then
echo echo
# Extract entitlements, which differ from parent app # Extract entitlements, which differ from parent app
/usr/bin/codesign -d --entitlements :"$BUILD_DIR/safari-entitlements.plist" $SAFARI_APPEX /usr/bin/codesign -d --entitlements :"$BUILD_DIR/safari-entitlements.plist" $SAFARI_APPEX
mkdir "$APPDIR/Contents/PlugIns"
cp -R $SAFARI_APPEX "$APPDIR/Contents/PlugIns/ZoteroSafariExtension.appex"
# Add suffix to appex bundle identifier # Add suffix to appex bundle identifier
if [ $UPDATE_CHANNEL == "beta" ] || [ $UPDATE_CHANNEL == "dev" ] || [ $UPDATE_CHANNEL == "source" ]; then if [ $UPDATE_CHANNEL == "beta" ] || [ $UPDATE_CHANNEL == "dev" ] || [ $UPDATE_CHANNEL == "source" ]; then
perl -pi -e "s/org\.zotero\.SafariExtensionApp\.SafariExtension/org.zotero.SafariExtensionApp.SafariExtension-$UPDATE_CHANNEL/" "$APPDIR/Contents/PlugIns/ZoteroSafariExtension.appex/Contents/Info.plist" perl -pi -e "s/org\.zotero\.SafariExtensionApp\.SafariExtension/org.zotero.SafariExtensionApp.SafariExtension-$UPDATE_CHANNEL/" "$APPDIR/Contents/PlugIns/ZoteroSafariExtension.appex/Contents/Info.plist"
@ -735,6 +746,16 @@ if [ $BUILD_WIN == 1 ]; then
find "$APPDIR" \( -name .DS_Store -or -name '.git*' -or -name '.travis.yml' -or -name update.rdf -or -name '*.bak' \) -exec rm -f {} \; find "$APPDIR" \( -name .DS_Store -or -name '.git*' -or -name '.travis.yml' -or -name update.rdf -or -name '*.bak' \) -exec rm -f {} \;
find "$APPDIR" \( -name '*.exe' -or -name '*.dll' \) -exec chmod 755 {} \; find "$APPDIR" \( -name '*.exe' -or -name '*.dll' \) -exec chmod 755 {} \;
# Copy over removed-files and make a precomplete file
pushd "$APPDIR"
cp "$CALLDIR/update-packaging/removed-files_$arch" removed-files
python3 "$CALLDIR/scripts/createprecomplete.py"
if [ ! -s precomplete ]; then
echo "precomplete file not created -- aborting" 2>&1
exit 1
fi
popd
if [ $PACKAGE -eq 1 ]; then if [ $PACKAGE -eq 1 ]; then
if [ $WIN_NATIVE -eq 1 ]; then if [ $WIN_NATIVE -eq 1 ]; then
echo "Creating Windows installer" echo "Creating Windows installer"
@ -862,6 +883,16 @@ if [ $BUILD_LINUX == 1 ]; then
find "$APPDIR" -depth -type d -name .git -exec rm -rf {} \; find "$APPDIR" -depth -type d -name .git -exec rm -rf {} \;
find "$APPDIR" \( -name .DS_Store -or -name update.rdf \) -exec rm -f {} \; find "$APPDIR" \( -name .DS_Store -or -name update.rdf \) -exec rm -f {} \;
# Copy over removed-files and make a precomplete file
pushd "$APPDIR"
cp "$CALLDIR/update-packaging/removed-files_$arch" removed-files
python3 "$CALLDIR/scripts/createprecomplete.py"
if [ ! -s precomplete ]; then
echo "precomplete file not created -- aborting" 2>&1
exit 1
fi
popd
if [ $PACKAGE == 1 ]; then if [ $PACKAGE == 1 ]; then
# Create tar # Create tar
rm -f "$DIST_DIR/Zotero-${VERSION}_linux-$arch.tar.bz2" rm -f "$DIST_DIR/Zotero-${VERSION}_linux-$arch.tar.bz2"