You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-09-12 18:50:20 -07:00
Huge rewrite of patchupdate.py, use script based method to apply patches, deprecation of Makefile based method.
This commit is contained in:
272
debian/tools/patchinstall.sh.in
vendored
Normal file
272
debian/tools/patchinstall.sh.in
vendored
Normal file
@@ -0,0 +1,272 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Script to automatically install all Wine Staging patches
|
||||
#
|
||||
# Copyright (C) 2015 Sebastian Lackner
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2.1 of the License, or (at your option) any later version.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
#
|
||||
|
||||
# Show usage information
|
||||
usage()
|
||||
{{
|
||||
echo ""
|
||||
echo "Usage: ./patchinstall.sh [DESTDIR=path] [--all] [-W patchset] [patchset ...]"
|
||||
echo ""
|
||||
echo "Autogenerated script to apply all Wine Staging patches on your Wine"
|
||||
echo "source tree. This script replaces and enhances the old method of"
|
||||
echo "using a Makefile."
|
||||
echo ""
|
||||
echo "Configuration:"
|
||||
echo " DESTDIR=path Specify the path to the wine source tree"
|
||||
echo " --all Select all patches"
|
||||
echo " --help Display this help and exit"
|
||||
echo " --no-autoupdate Do not apply patchlist and don't auto-update files"
|
||||
echo " -W patchset Exclude a specific patchset"
|
||||
echo ""
|
||||
echo "Backends:"
|
||||
echo " --backend=patch Use regular 'patch' utility to apply patches (default)"
|
||||
echo " --backend=git Use 'git am' to apply patches"
|
||||
echo ""
|
||||
}}
|
||||
|
||||
# Critical error, abort
|
||||
abort()
|
||||
{{
|
||||
echo "ERROR: $1" >&2
|
||||
exit 1
|
||||
}}
|
||||
|
||||
{patch_helpers}
|
||||
|
||||
# Default settings
|
||||
patch_enable_all 0
|
||||
enable_autoupdate=1
|
||||
patchlist="/dev/null"
|
||||
backend="patch"
|
||||
enable=1
|
||||
|
||||
if [ "$#" -eq 0 ]; then
|
||||
abort "No commandline arguments given, don't know what to do."
|
||||
fi
|
||||
|
||||
while [ "$#" -gt 0 ]; do
|
||||
if patch_enable "$1" "$enable"; then
|
||||
shift
|
||||
enable=1
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ "$enable" -ne 1 ]; then
|
||||
abort "Wrong use of -W commandline argument, expected patchname."
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
DESTDIR=*)
|
||||
DESTDIR="${{1#*=}}"
|
||||
shift
|
||||
;;
|
||||
|
||||
--all)
|
||||
patch_enable_all 1
|
||||
shift
|
||||
;;
|
||||
|
||||
--backend=*)
|
||||
backend="${{1#*=}}"
|
||||
shift
|
||||
;;
|
||||
|
||||
--help)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
|
||||
--no-autoupdate)
|
||||
enable_autoupdate=0
|
||||
shift
|
||||
;;
|
||||
|
||||
-W)
|
||||
enable=2
|
||||
shift
|
||||
;;
|
||||
|
||||
*)
|
||||
abort "Unknown commandline argument $1"
|
||||
exit 1
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "$enable" -ne 1 ]; then
|
||||
abort "Missing argument for -W, expected patchname."
|
||||
fi
|
||||
|
||||
# Apply the patches using gitapply.sh, a small wrapper around 'patch'
|
||||
if [ "$backend" == "patch" ]; then
|
||||
|
||||
patch_apply ()
|
||||
{{
|
||||
echo "Applying $1"
|
||||
if ! ../debian/tools/gitapply.sh -d "$DESTDIR" < "$1"; then
|
||||
abort "Failed to apply patch, aborting!"
|
||||
fi
|
||||
}}
|
||||
|
||||
# GIT backend - apply patches using 'git am'
|
||||
elif [ "$backend" == "git" ]; then
|
||||
|
||||
patch_apply ()
|
||||
{{
|
||||
echo "Applying $1"
|
||||
if ! cat "$1" | (cd "$DESTDIR" && git am); then
|
||||
abort "Failed to apply patch, aborting!"
|
||||
fi
|
||||
}}
|
||||
|
||||
# Stacked GIT backend - import the patches (mainly for developers)
|
||||
elif [ "$backend" == "stg" ]; then
|
||||
|
||||
enable_autoupdate=0
|
||||
abort "Not implemented."
|
||||
|
||||
else
|
||||
abort "Selected backend $backend not supported."
|
||||
fi
|
||||
|
||||
|
||||
{patch_resolver}
|
||||
|
||||
|
||||
if [ -z "$DESTDIR" -a -f ./tools/make_requests ]; then
|
||||
DESTDIR="$(pwd)"
|
||||
|
||||
elif [ ! -f "$DESTDIR/tools/make_requests" ]; then
|
||||
abort "DESTDIR does not point to the Wine source tree."
|
||||
fi
|
||||
|
||||
# To make sure we find all the patches and tools switch to the patches directory now
|
||||
script="$(readlink -f "$0")"
|
||||
curdir="$(dirname "$script")"
|
||||
if ! cd "$curdir"; then
|
||||
abort "Failed to change working directory to $curdir."
|
||||
fi
|
||||
|
||||
# If autoupdate is enabled then create a tempfile to keep track of all patches
|
||||
if [ "$enable_autoupdate" -eq 1 ]; then
|
||||
patchlist=$(mktemp)
|
||||
if [ ! -f "$patchlist" ]; then
|
||||
echo "ERROR: Unable to create temporary file for patchlist." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
{patch_apply}
|
||||
|
||||
|
||||
if [ "$enable_autoupdate" -eq 1 ]; then
|
||||
|
||||
# Generate a temporary patch containing the patchlist and apply it
|
||||
patch_data=$(cat "$patchlist" | sort)
|
||||
patch_lines=$(echo "$patch_data" | wc -l)
|
||||
if [ ! -z "$patch_data" ]; then
|
||||
patch_lines=$((${{patch_lines}}+23))
|
||||
cat > "$patchlist" <<EOF
|
||||
From: Wine Staging Team <webmaster@fds-team.de>
|
||||
Subject: Autogenerated patch list.
|
||||
|
||||
diff --git a/include/wine/library.h b/include/wine/library.h
|
||||
--- a/include/wine/library.h
|
||||
+++ b/include/wine/library.h
|
||||
@@ -43,6 +43,7 @@ extern const char *wine_get_data_dir(void);
|
||||
extern const char *wine_get_server_dir(void);
|
||||
extern const char *wine_get_user_name(void);
|
||||
extern const char *wine_get_version(void);
|
||||
+extern const void *wine_get_patches(void);
|
||||
extern const char *wine_get_build_id(void);
|
||||
extern void wine_init_argv0_path( const char *argv0 );
|
||||
extern void wine_exec_wine_binary( const char *name, char **argv, const char *env_var );
|
||||
diff --git a/libs/wine/config.c b/libs/wine/config.c
|
||||
index a273502..0a3182f 100644
|
||||
--- a/libs/wine/config.c
|
||||
+++ b/libs/wine/config.c
|
||||
@@ -478,6 +478,${{patch_lines}} @@ const char *wine_get_version(void)
|
||||
return PACKAGE_VERSION;
|
||||
}}
|
||||
|
||||
+static const struct
|
||||
+{{
|
||||
+ const char *author;
|
||||
+ const char *subject;
|
||||
+ int revision;
|
||||
+}}
|
||||
+wine_patch_data[] =
|
||||
+{{
|
||||
${{patch_data}}
|
||||
+ {{ NULL, NULL, 0 }}
|
||||
+}};
|
||||
+
|
||||
+/* return the applied non-standard patches */
|
||||
+const void *wine_get_patches(void)
|
||||
+{{
|
||||
+ return &wine_patch_data[0];
|
||||
+}}
|
||||
+
|
||||
/* return the build id string */
|
||||
const char *wine_get_build_id(void)
|
||||
{{
|
||||
diff --git a/libs/wine/wine.def b/libs/wine/wine.def
|
||||
index ed315bd..5b42029 100644
|
||||
--- a/libs/wine/wine.def
|
||||
+++ b/libs/wine/wine.def
|
||||
@@ -83,6 +83,7 @@ EXPORTS
|
||||
wine_get_sortkey
|
||||
wine_get_user_name
|
||||
wine_get_version
|
||||
+ wine_get_patches
|
||||
wine_init
|
||||
wine_init_argv0_path
|
||||
wine_is_dbcs_leadbyte
|
||||
diff --git a/libs/wine/wine.map b/libs/wine/wine.map
|
||||
index 2159fac..7cb2918 100644
|
||||
--- a/libs/wine/wine.map
|
||||
+++ b/libs/wine/wine.map
|
||||
@@ -90,6 +90,7 @@ WINE_1.0
|
||||
wine_get_ss;
|
||||
wine_get_user_name;
|
||||
wine_get_version;
|
||||
+ wine_get_patches;
|
||||
wine_init;
|
||||
wine_init_argv0_path;
|
||||
wine_is_dbcs_leadbyte;
|
||||
EOF
|
||||
patch_apply "$patchlist"
|
||||
fi
|
||||
rm "$patchlist"
|
||||
|
||||
# Other autogenerated changes
|
||||
pushd "$DESTDIR" > /dev/null
|
||||
if ! autoreconf -f; then
|
||||
abort "'autoreconf -f' failed."
|
||||
fi
|
||||
if ! ./tools/make_requests; then
|
||||
abort "'./tools/make_requests' failed."
|
||||
fi
|
||||
popd
|
||||
fi
|
||||
|
||||
# Success
|
||||
exit 0
|
Reference in New Issue
Block a user