Rewrite of patch system to simplify mainting large patchsets.

This commit is contained in:
Sebastian Lackner 2014-07-25 22:08:08 +02:00
commit ef427399da
79 changed files with 1722 additions and 545 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*.ok
.depcache

View File

@ -1,23 +1,84 @@
wine-compholio
==============
The Wine "Compholio" Edition repository includes a variety of patches for Wine to run common Windows applications under Linux.
The Wine "Compholio" Edition repository includes a variety of patches for
Wine to run common Windows applications under Linux.
Current patches include:
These patches fix the following Wine bugs:
* Support for TransmitFile ([Wine Bug #5048](http://bugs.winehq.org/show_bug.cgi?id=5048 "Multiple applications and games need support for ws2_32 SIO_GET_EXTENSION_FUNCTION_POINTER TransmitFile (WSAID_TRANSMITFILE)"))
* Support for Junction Points ([Wine Bug #12401](http://bugs.winehq.org/show_bug.cgi?id=12401 "Support junction points, i.e. DeviceIoCtl(FSCTL_SET_REPARSE_POINT/FSCTL_GET_REPARSE_POINT)"))
* GetSecurityInfo returns NULL DACL for process object ([Wine Bug #15980](http://bugs.winehq.org/show_bug.cgi?id=15980 "Rhapsody 2 crashes on startup (GetSecurityInfo returns NULL DACL for process object)"))
* Workaround for TransactNamedPipe not being supported ([Wine Bug #17273](http://bugs.winehq.org/show_bug.cgi?id=17273 "Many apps and games need SetNamedPipeHandleState implementation (support for named pipe message mode)(FireFox+Flash, Win8/NET 4.x SDK/vcrun2012, WiX installers)"))
* Support for process ACLs ([Wine Bug #22006](http://bugs.winehq.org/show_bug.cgi?id=22006 "OpenProcess does not enforce ACL"))
* Return correct IMediaSeeking stream positions in quartz ([Wine Bug #23174](http://bugs.winehq.org/show_bug.cgi?id=23174 "Fallout 3: Diologue and Video/sound issues"))
* Add implementation of WTSEnumerateProcessesW ([Wine Bug #29903](http://bugs.winehq.org/show_bug.cgi?id=29903 "Some Microsoft debuggers fail to enumerate processes due to wtsapi32.WTSEnumerateProcessesW() being a stub (Microsoft Visual Studio 2005, DbgCLR from .NET 2.0 SDK)"))
* Fix race conditions and deadlocks in strmbase/quartz ([Wine Bug #31566](http://bugs.winehq.org/show_bug.cgi?id=31566 "Fallout 3: regression causes block at critical section when radio is enabled"))
* Support for stored file ACLs ([Wine Bug #31858](http://bugs.winehq.org/show_bug.cgi?id=31858 "Netflix on Firefox fails with Internet Connection Problem when loading bar is at 99%"))
* Implement an Arial replacement font ([Wine Bug #32323](http://bugs.winehq.org/show_bug.cgi?id=32323 "Netflix (Silverlight 4.x) and several .NET Framework 3.x/4.0 WPF apps require either Arial or Verdana to be installed"))
* Support for interface change notifications ([Wine Bug #32328](http://bugs.winehq.org/show_bug.cgi?id=32328 "Many .NET and Silverlight applications require SIO_ADDRESS_LIST_CHANGE for interface change notifications"))
* Support for inherited file ACLs ([Wine Bug #34406](http://bugs.winehq.org/show_bug.cgi?id=34406 "Finale Notepad 2012 doesn't copy/create user files on program start"))
Besides that the following additional changes are included:
* Support for interface change notifications ([Wine Bug #32328](http://bugs.winehq.org/show_bug.cgi?id=32328))
* Support for stored file ACLs ([Wine Bug #31858](http://bugs.winehq.org/show_bug.cgi?id=31858))
* Support for inherited file ACLs ([Wine Bug #34406](http://bugs.winehq.org/show_bug.cgi?id=34406))
* Support for Junction Points ([Wine Bug #12401](http://bugs.winehq.org/show_bug.cgi?id=12401))
* Support for TransmitFile ([Wine Bug #5048](http://bugs.winehq.org/show_bug.cgi?id=5048))
* Support for GetVolumePathName
* Implement an Arial replacement font ([Wine Bug #32323](http://bugs.winehq.org/show_bug.cgi?id=32323))
* Workaround for TransactNamedPipe not being supported ([Wine Bug #17273](http://bugs.winehq.org/show_bug.cgi?id=17273))
* Fix incorrect scaling for DECIMAL values in VarDecAdd ([Wine Bug #31269](http://bugs.winehq.org/show_bug.cgi?id=31269))
* Return NULL-terminated list of arguments in CommandLineToArgvW ([Wine Bug #22829](http://bugs.winehq.org/show_bug.cgi?id=22829))
* XEMBED support for embedding Wine windows inside Linux applications
* Reduced SetTimer minimum value from 15 ms to 5 ms (improves Silverlight framerates)
* Lockfree algorithm for filedescriptor cache (improves file access speed)
* Workaround for shlwapi URLs with relative paths
* Support for PulseAudio backend for audio
* Other Pipelight specific enhancements
* Reduced SetTimer minimum value from 15 ms to 5 ms (improves Silverlight framerates)
* Support for GetVolumePathName
* Support for PulseAudio backend for audio
* Workaround for shlwapi URLs with relative paths
* XEMBED support for embedding Wine windows inside Linux applications
### Compiling wine-compholio
In order to wine-compholio, please use the recommended Makefile based approach which
will automatically decide whether to use 'git apply' or 'gitapply.sh'. The following
instructions (based on the [Gentoo Wiki](https://wiki.gentoo.org/wiki/Netflix/Pipelight#Compiling_manually))
will give a short overview how to compile wine-compholio, but of course not explain
details. Make sure to install all required wine dependencies before proceeding.
As the first step please grab the latest Wine source:
```bash
wget http://prdownloads.sourceforge.net/wine/wine-1.7.22.tar.bz2
wget https://github.com/compholio/wine-compholio-daily/archive/v1.7.22.tar.gz
```
Extract the archives:
```bash
tar xvjf wine-1*.tar.bz2
cd wine-1*
tar xvzf ../v1.7.22.tar.gz --strip-components 1
```
And apply the patches:
```bash
make -C ./patches DESTDIR=$(pwd) install
```
Afterwards run configure (you can also specify a prefix if you don't want to install
wine-compholio system-wide):
```bash
./configure --with-xattr
```
Before you continue you should make sure that ./configure doesn't show any warnings
(look at the end of the output). If there are any warnings, this most likely means
that you're missing some important header files. Install them and repeat the ./configure
step until all problems are fixed.
Afterwards compile it (and grab a cup of coffee):
```bash
make
```
And install it (you only need sudo for a system-wide installation):
```bash
sudo make install
```
### Excluding patches
It is also possible to apply only a subset of the patches, for example if you're compiling
for a distribution where PulseAudio is not installed, or if you just don't like a specific
patchset. Please note that some patchsets depend on each other, and requesting an impossible
situation might result in a failure to apply all patches.
Lets assume you want to exclude the patchset in directory DIRNAME, then just invoke make like that:
```bash
make -C ./patches DESTDIR=$(pwd) install -W DIRNAME.ok
```

1
debian/changelog vendored
View File

@ -1,4 +1,5 @@
wine-compholio (1.7.23) UNRELEASED; urgency=low
* Rewrite of patch system to simplify mainting large patchsets.
* Fix failing Junction Point test.
* Fix possible race conditions in strmbase/quartz.
* Fix race condition between EndOfStream and Pause.

View File

@ -1,4 +1,23 @@
#!/usr/bin/env bash
#
# Wrapper to apply binary patches without git.
#
# Copyright (C) 2014 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
#
# Setup parser variables
nogit=0
@ -41,6 +60,12 @@ usage()
echo ""
}
gitsha1()
{
echo -en "blob $(du -b "$1" | cut -f1)\x00" | cat - "$1" | sha1sum | cut -d' ' -f1
}
# Parse environment variables
while [[ $# > 0 ]]; do
cmd="$1"; shift
@ -62,7 +87,8 @@ while [[ $# > 0 ]]; do
;;
-R)
abort "Reverse applying patches not supported yet with this patch tool."
echo "Reverse applying patches not supported yet with this tool." >&2
exit 1
;;
--help)
@ -82,10 +108,19 @@ if [ "$nogit" -eq 0 ] && command -v git >/dev/null 2>&1; then
exit 1
fi
# Check for missing depdencies
for dependency in awk chmod cut dd du gzip hexdump patch sha1sum; do
if ! command -v "$dependency" >/dev/null 2>&1; then
echo "Missing dependency: $dependency - please install this program and try again." >&2
exit 1
fi
done
# Detect BSD
if gzip -V 2>&1 | grep "BSD" &> /dev/null; then
echo "This script is not compatible with *BSD utilities." >&2
echo "Please install git, which provides the same functionality and will be used instead." >&2
exit 1;
echo "This script is not compatible with *BSD utilities. Please install git," >&2
echo "which provides the same functionality and will be used instead." >&2
exit 1
fi
# Decode base85 git data, prepend with a gzip header
@ -194,7 +229,7 @@ while IFS= read -r line; do
echo "$line" >> "$patch_tmpfile"
continue
elif [[ "$line" =~ ^old\ mode ]] || [[ "$line" =~ ^deleted\ file\ mode ]]; then
elif [ "${line:0:8}" == "old mode" ] || [ "${line:0:17}" == "deleted file mode" ]; then
# ignore
echo "$line" >> "$patch_tmpfile"
continue
@ -204,31 +239,25 @@ while IFS= read -r line; do
echo "$line" >> "$patch_tmpfile"
continue
elif [[ "$line" =~ ^new\ mode ]] || [[ "$line" =~ ^new\ file\ mode ]]; then
patch_errors+=("$lineno: unable to parse header line '$line'")
elif [ "${line:0:8}" == "new mode" ] || [ "${line:0:13}" == "new file mode" ]; then
patch_errors+=("$lineno: Unable to parse header line '$line'.")
patch_invalid=1
echo "$line" >> "$patch_tmpfile"
continue
elif [[ "$line" =~ ^copy\ from ]] || [[ "$line" =~ ^copy\ to ]]; then
patch_errors+=("$lineno: copy header not implemented yet")
elif [ "${line:0:9}" == "copy from" ] || [ "${line:0:7}" == "copy to" ]; then
patch_errors+=("$lineno: Copy header not implemented yet.")
patch_invalid=1
echo "$line" >> "$patch_tmpfile"
continue
elif [[ "$line" =~ ^rename\ old ]] || [[ "$line" =~ ^rename\ from ]]; then
patch_errors+=("$lineno: rename header not implemented yet")
elif [ "${line:0:7}" == "rename " ]; then
patch_errors+=("$lineno: Patch rename header not implemented yet.")
patch_invalid=1
echo "$line" >> "$patch_tmpfile"
continue
elif [[ "$line" =~ ^rename\ new ]] || [[ "$line" =~ ^rename\ to ]]; then
patch_errors+=("$lineno: rename header not implemented yet")
patch_invalid=1
echo "$line" >> "$patch_tmpfile"
continue
elif [[ "$line" =~ ^similarity\ index ]] || [[ "$line" =~ ^dissimilarity\ index ]]; then
elif [ "${line:0:16}" == "similarity index" ] || [ "${line:0:19}" == "dissimilarity index" ]; then
# ignore
echo "$line" >> "$patch_tmpfile"
continue
@ -239,8 +268,8 @@ while IFS= read -r line; do
echo "$line" >> "$patch_tmpfile"
continue
elif [[ "$line" =~ ^index\ ]]; then
patch_errors+=("$lineno: unable to parse header line '$line'")
elif [ "${line:0:6}" == "index " ]; then
patch_errors+=("$lineno: Unable to parse header line '$line'.")
patch_invalid=1
echo "$line" >> "$patch_tmpfile"
continue
@ -250,12 +279,12 @@ while IFS= read -r line; do
if [[ "$patch_oldname" =~ ^a/(.*)$ ]]; then
patch_oldname="${BASH_REMATCH[1]}"
elif [ "$patch_oldname" != "/dev/null" ]; then
abort "old name doesn't start with a/."
abort "Old name doesn't start with a/."
fi
if [[ "$patch_newname" =~ ^b/(.*)$ ]]; then
patch_newname="${BASH_REMATCH[1]}"
elif [ "$patch_newname" != "/dev/null" ]; then
abort "new name doesn't start with b/."
abort "New name doesn't start with b/."
fi
patch_mode=2
@ -269,12 +298,12 @@ while IFS= read -r line; do
if [[ "$line" == "GIT binary patch" ]]; then
if [ -z "$patch_oldsha1" ] || [ -z "$patch_newsha1" ]; then
patch_errors+=("$lineno: missing index header, sha1 sums required for binary patch")
patch_errors+=("$lineno: Missing index header, sha1 sums required for binary patch.")
patch_invalid=1
fi
if [ "$patch_oldname" != "$patch_newname" ]; then
patch_errors+=("$lineno: stripped old- and new name doesn't match")
patch_errors+=("$lineno: Stripped old- and new name doesn't match for binary patch.")
patch_invalid=1
fi
@ -286,7 +315,7 @@ while IFS= read -r line; do
patch_mode=100
continue
elif [[ "$line" =~ ^@@\ - ]]; then
elif [ "${line:0:4}" == "@@ -" ]; then
# We count the number of lines added/removed for informational purposes
patch_total_add=0
patch_total_rem=0
@ -294,10 +323,10 @@ while IFS= read -r line; do
patch_mode=200
# fall-through
elif [[ "$line" =~ ^diff\ --git\ ]]; then
elif [ "${line:0:11}" == "diff --git " ]; then
if [ "$patch_oldname" != "$patch_newname" ]; then
patch_errors+=("$lineno: stripped old- and new name doesn't match")
patch_errors+=("$lineno: Stripped old- and new name doesn't match.")
patch_invalid=1
fi
@ -328,7 +357,7 @@ while IFS= read -r line; do
# Check shasum if its not a patch creating a new file
if [ "$patch_oldsha1" != "0000000000000000000000000000000000000000" ] || [ "$binary_patch_type" == "delta" ] || [ -f "$patch_oldname" ]; then
if [ -f "$patch_oldname" ]; then
sha=$(echo -en "blob $(du -b "$patch_oldname" | cut -f1)\x00" | cat - "$patch_oldname" | sha1sum | cut -d' ' -f1)
sha=$(gitsha1 "$patch_oldname")
else
sha="0000000000000000000000000000000000000000"
fi
@ -403,13 +432,13 @@ while IFS= read -r line; do
while read cmd arg1 arg2; do
if [ "$cmd" == "S" ]; then
binary_patch_destsize="$arg2"
if [ "$arg1" -ne "$(du -b "$patch_oldname" | cut -f 1)" ]; then break; fi
[ "$arg1" -eq "$(du -b "$patch_oldname" | cut -f 1)" ] || break
elif [ "$cmd" == "1" ]; then
if ! dd if="$patch_oldname" bs=1 skip="$arg1" count="$arg2" >> "$decoded_tmpfile" 2>/dev/null; then break; fi
dd if="$patch_oldname" bs=1 skip="$arg1" count="$arg2" >> "$decoded_tmpfile" 2>/dev/null || break
elif [ "$cmd" == "2" ]; then
if ! dd if="$patch_tmpfile" bs=1 skip="$arg1" count="$arg2" >> "$decoded_tmpfile" 2>/dev/null; then break; fi
dd if="$patch_tmpfile" bs=1 skip="$arg1" count="$arg2" >> "$decoded_tmpfile" 2>/dev/null || break
elif [ "$cmd" == "E" ]; then
binary_patch_complete=1
@ -432,7 +461,7 @@ while IFS= read -r line; do
fi
# Check shasum if its not a patch creating a new file
sha=$(echo -en "blob $(du -b "$patch_tmpfile" | cut -f1)\x00" | cat - "$patch_tmpfile" | sha1sum | cut -d' ' -f1)
sha=$(gitsha1 "$patch_tmpfile")
if [ "$patch_newsha1" != "$sha" ]; then
echo "$lineno: Expected $patch_newsha1" >&2
echo "$lineno: Got $sha" >&2
@ -440,7 +469,7 @@ while IFS= read -r line; do
fi
if ! cp "$patch_tmpfile" "$patch_oldname"; then
abort "Unable to replace original file"
abort "Unable to replace original file."
fi
if [ ! -z "$patch_filemode" ]; then
chmod "${patch_filemode: -3}" "$patch_oldname" # we ignore failures for now
@ -471,6 +500,11 @@ while IFS= read -r line; do
patch_mode=201
continue
elif [ "${line:0:2}" == "\\ " ]; then
# ignore
echo "$line" >> "$patch_tmpfile"
continue
else
echo "patching $patch_newname"
@ -489,23 +523,23 @@ while IFS= read -r line; do
# These lines are part of a hunk, append it
echo "$line" >> "$patch_tmpfile"
if [ "$hunk_src_lines" -gt 0 ] && [ "$hunk_dst_lines" -gt 0 ] && [[ "$line" =~ ^\ ]]; then
if [ "${line:0:1}" == " " ] && [ "$hunk_src_lines" -gt 0 ] && [ "$hunk_dst_lines" -gt 0 ]; then
(( hunk_src_lines-- ))
(( hunk_dst_lines-- ))
elif [ "$hunk_src_lines" -gt 0 ] && [[ "$line" =~ ^- ]]; then
elif [ "${line:0:1}" == "-" ] && [ "$hunk_src_lines" -gt 0 ]; then
(( hunk_src_lines-- ))
(( patch_total_rem++ ))
elif [ "$hunk_dst_lines" -gt 0 ] && [[ "$line" =~ ^\+ ]]; then
elif [ "${line:0:1}" == "+" ] && [ "$hunk_dst_lines" -gt 0 ]; then
(( hunk_dst_lines-- ))
(( patch_total_add++ ))
elif [[ "$line" =~ ^\\\ ]]; then
elif [ "${line:0:2}" == "\\ " ]; then
continue # ignore "\\ No newline ..."
else
abort "Unexpected line in hunk"
abort "Unexpected line in hunk."
fi
# If it was the last line of this hunk then go back to mode 200
@ -544,7 +578,7 @@ while IFS= read -r line; do
patch_mode=1
continue
elif [[ "$line" =~ ^@@\ - ]] || [[ "$line" =~ ^---\ ]] || [[ "$line" =~ ^\+\+\+\ ]]; then
elif [ "${line:0:4}" == "@@ -" ] || [ "${line:0:4}" == "--- " ] || [ "${line:0:4}" == "+++ " ]; then
abort "Patch corrupted or not created with git."
fi
fi

View File

@ -1,21 +1,5 @@
#!/bin/sh
PATCH_DATA="";
for FILE in patches/*/*.def; do
UUID=$(echo "${FILE}" | sed -e 's|^.*/||g' -e 's|\.def$||g');
REVISION=$(cat "${FILE}" | sed -n 's|Revision: \(.*\)|\1|p');
AUTHOR=$(cat "${FILE}" | sed -n 's|Author: \(.*\)|\1|p');
TITLE=$(cat "${FILE}" | sed -n 's|Title: \(.*\)|\1|p');
if [ "${AUTHOR}" = "" ] && [ "${TITLE}" = "" ]; then
continue;
fi
if [ "${PATCH_DATA}" != "" ]; then
PATCH_DATA="${PATCH_DATA}
";
fi
PATCH_DATA="${PATCH_DATA}+ { \"${UUID}:${REVISION}\", \"${AUTHOR}\", \"${TITLE}\" },";
done
PATCH_DATA=$(cat);
PATCH_LINES=$(echo "${PATCH_DATA}" | wc -l);
PATCH_LINES=$((${PATCH_LINES}+20));

570
debian/tools/patchupdate.py vendored Executable file
View File

@ -0,0 +1,570 @@
#!/usr/bin/python
#
# Automatic patch dependency checker and Makefile/README.md generator.
#
# Copyright (C) 2014 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
#
from multiprocessing import Pool
from xml.dom import minidom
import contextlib
import hashlib
import itertools
import os
import patchutils
import pickle
import re
import subprocess
import sys
import textwrap
import urllib
# Cached information to speed up patch dependency checks
cached_patch_result = {}
class PatchUpdaterError(RuntimeError):
"""Failed to update patches."""
pass
class AuthorInfo(object):
def __init__(self):
self.author = ""
self.subject = ""
self.revision = ""
class PatchSet(object):
def __init__(self, name):
self.name = name
self.authors = []
self.fixes = []
self.changes = []
self.files = []
self.patches = []
self.modified_files = set()
self.depends = set()
self.verify_depends = set()
self.verify_time = None
def download(url):
"""Open a specific URL and return the content."""
with contextlib.closing(urllib.urlopen(url)) as fp:
return fp.read()
def read_patchsets(directory):
"""Read information about all patchsets in a given directory."""
def _iter_kv_from_file(filename):
with open(filename) as fp:
for line in fp:
if line.startswith("#"):
continue
tmp = line.split(":", 1)
if len(tmp) != 2:
yield None, None
else:
yield tmp[0].lower(), tmp[1].strip()
unique_id = itertools.count()
all_patches = {}
name_to_id = {}
all_bugs = []
# Read in sorted order (to ensure created Makefile doesn't change too much)
for name in sorted(os.listdir(directory)):
if name in [".", ".."]: continue
subdirectory = os.path.join(directory, name)
if not os.path.isdir(subdirectory): continue
patch = PatchSet(name)
# Enumerate .patch files in the given directory, enumerate individual patches and affected files
for f in sorted(os.listdir(subdirectory)):
if not f.endswith(".patch") or not os.path.isfile(os.path.join(subdirectory, f)):
continue
patch.files.append(f)
for p in patchutils.read_patch(os.path.join(subdirectory, f)):
patch.patches.append(p)
patch.modified_files.add(p.modified_file)
# No single patch within this directory, ignore it
if len(patch.patches) == 0:
del patch
continue
i = next(unique_id)
all_patches[i] = patch
name_to_id[name] = i
# Now read the definition files in a second step
for i, patch in all_patches.iteritems():
deffile = os.path.join(os.path.join(directory, patch.name), "definition")
if not os.path.isfile(deffile):
raise PatchUpdaterError("Missing definition file %s" % deffile)
info = AuthorInfo()
for key, val in _iter_kv_from_file(deffile):
if key is None:
if len(info.author) and len(info.subject) and len(info.revision):
patch.authors.append(info)
info = AuthorInfo()
continue
if key == "author":
if len(info.author): info.author += ", "
info.author += val
elif key == "subject" or key == "title":
if len(info.subject): info.subject += " "
info.subject += val
elif key == "revision":
if len(info.revision): info.revision += ", "
info.revision += val
elif key == "fixes":
r = re.match("^[0-9]+$", val)
if r:
bugid = int(val)
patch.fixes.append((bugid, None, None))
all_bugs.append(bugid)
continue
r = re.match("^\\[ *([0-9]+) *\\](.*)$", val)
if r:
bugid, description = int(r.group(1)), r.group(2).strip()
patch.fixes.append((bugid, None, description))
all_bugs.append(bugid)
continue
patch.fixes.append((None, None, val))
elif key == "depends":
if not name_to_id.has_key(val):
raise PatchUpdaterError("Definition file %s references unknown dependency %s" % (deffile, val))
patch.depends.add(name_to_id[val])
else:
print "WARNING: Ignoring unknown command in definition file %s: %s" % (deffile, line)
if len(info.author) and len(info.subject) and len(info.revision):
patch.authors.append(info)
# In a third step query information for the patches from Wine bugzilla
pool = Pool(8)
bug_short_desc = {None:None}
for bugid, data in zip(all_bugs, pool.map(download, ["http://bugs.winehq.org/show_bug.cgi?id=%d&ctype=xml&field=short_desc" % bugid for bugid in all_bugs])):
bug_short_desc[bugid] = minidom.parseString(data).getElementsByTagName('short_desc')[0].firstChild.data
# The following command triggers a (harmless) python bug, which would confuse the user:
# > Exception RuntimeError: RuntimeError('cannot join current thread',) in <Finalize object, dead> ignored
# To avoid that just keep the pool until it destroyed by the garbage collector.
# pool.close()
for i, patch in all_patches.iteritems():
patch.fixes = [(bugid, bug_short_desc[bugid], description) for bugid, dummy, description in patch.fixes]
return all_patches
def causal_time_combine(a, b):
"""Combines two timestamps into a new one."""
return [max(a, b) for a, b in zip(a, b)]
def causal_time_smaller(a, b):
"""Checks if timestamp a is smaller than timestamp b."""
return all([i <= j for i, j in zip(a,b)]) and any([i < j for i, j in zip(a,b)])
def causal_time_relation(all_patches, indices):
"""Checks if the patches with given indices are applied in a very specific order."""
def _pairs(a):
for i, j in enumerate(a):
for k in a[i+1:]:
yield (j, k)
for i, j in _pairs(indices):
if not (causal_time_smaller(all_patches[i].verify_time, all_patches[j].verify_time) or \
causal_time_smaller(all_patches[j].verify_time, all_patches[i].verify_time)):
return False
return True
def causal_time_permutations(all_patches, indices, filename):
"""Iterate over all possible permutations of patches affecting
a specific file, which are compatible with dependencies."""
for perm in itertools.permutations(indices):
for i, j in zip(perm[:-1], perm[1:]):
if causal_time_smaller(all_patches[j].verify_time, all_patches[i].verify_time):
break
else:
selected_patches = []
for i in perm:
selected_patches += [patch for patch in all_patches[i].patches if patch.modified_file == filename]
yield selected_patches
def contains_binary_patch(all_patches, indices, filename):
"""Checks if any patch with given indices affecting filename is a binary patch."""
for i in indices:
for patch in all_patches[i].patches:
if patch.modified_file == filename and patch.is_binary():
return True
return False
def load_patch_cache():
"""Load dictionary for cached patch dependency tests into cached_patch_result."""
global cached_patch_result
try:
with open("./.depcache") as fp:
cached_patch_result = pickle.load(fp)
except IOError:
cached_patch_result = {}
def save_patch_cache():
"""Save dictionary for cached patch depdency tests."""
with open("./.depcache", "wb") as fp:
pickle.dump(cached_patch_result, fp, pickle.HIGHEST_PROTOCOL)
def verify_patch_order(all_patches, indices, filename):
"""Checks if the dependencies are defined correctly by applying on the patches on a copy from the git tree."""
global cached_patch_result
# If one of patches is a binary patch, then we cannot / won't verify it - require dependencies in this case
if contains_binary_patch(all_patches, indices, filename):
if not causal_time_relation(all_patches, indices):
raise PatchUpdaterError("Because of binary patch modifying file %s the following patches need explicit dependencies: %s" %
(filename, ", ".join([all_patches[i].name for i in indices])))
return
# Grab original file from the wine git repository - please note we grab from origin/master, not the current branch
try:
with open(os.devnull, 'w') as devnull:
original_content = subprocess.check_output(["git", "show", "origin/master:%s" % filename],
cwd="./debian/tools/wine", stderr=devnull)
except subprocess.CalledProcessError as e:
if e.returncode != 128: raise # not found
original_content = ""
# Calculate hash of original content
original_content_hash = hashlib.sha256(original_content).digest()
# Check for possible ways to apply the patch
failed_to_apply = False
last_result_hash = None
for patches in causal_time_permutations(all_patches, indices, filename):
# Calculate unique hash based on the original content and the order in which the patches are applied
m = hashlib.sha256()
m.update(original_content_hash)
for patch in patches:
m.update(patch.hash())
unique_hash = m.digest()
# Fast path -> we know that it applies properly
if cached_patch_result.has_key(unique_hash):
result_hash = cached_patch_result[unique_hash]
else:
# Apply the patches (without fuzz)
try:
content = patchutils.apply_patch(original_content, patches, fuzz=0)
except patchutils.PatchApplyError:
if last_result_hash is not None:
break
# We failed to apply the patches, but don't know if it works at all - continue
failed_to_apply = True
continue
# Get hash of resulting file and add to cache
result_hash = hashlib.sha256(content).digest()
cached_patch_result[unique_hash] = result_hash
# First time we got a successful result
if last_result_hash is None:
last_result_hash = result_hash
if failed_to_apply: break
# All the other times: hash to match with previous attempt
elif last_result_hash != result_hash:
last_result_hash = None
break
if failed_to_apply and last_result_hash is None:
raise PatchUpdaterError("Changes to file %s don't apply on git source tree: %s" %
(filename, ", ".join([all_patches[i].name for i in indices])))
elif failed_to_apply or last_result_hash is None:
raise PatchUpdaterError("Depending on the order some changes to file %s dont't apply / lead to different results: %s" %
(filename, ", ".join([all_patches[i].name for i in indices])))
else:
assert len(last_result_hash) == 32
def verify_dependencies(all_patches):
"""Resolve dependencies, and afterwards run verify_patch_order() to check if everything applies properly."""
max_patches = max(all_patches.keys()) + 1
for i, patch in all_patches.iteritems():
patch.verify_depends = set(patch.depends)
patch.verify_time = [0]*max_patches
# Check for circular dependencies and perform modified vector clock algorithm
patches = dict(all_patches)
while len(patches):
to_delete = []
for i, patch in patches.iteritems():
if len(patch.verify_depends) == 0:
patch.verify_time[i] += 1
to_delete.append(i)
if len(to_delete) == 0:
raise PatchUpdaterError("Circular dependency in set of patches: %d" %
", ".join([patch.name for i, patch in patches.iteritems()]))
for j in to_delete:
for i, patch in patches.iteritems():
if i != j and j in patch.verify_depends:
patch.verify_time = causal_time_combine(patch.verify_time, patches[j].verify_time)
patch.verify_depends.remove(j)
del patches[j]
# Find out which files are modified by multiple patches
modified_files = {}
for i, patch in all_patches.iteritems():
for f in patch.modified_files:
if f not in modified_files:
modified_files[f] = []
modified_files[f].append(i)
# Iterate over pairs of patches, check for existing causal relationship
load_patch_cache()
try:
for f, indices in modified_files.iteritems():
verify_patch_order(all_patches, indices, f)
finally:
save_patch_cache()
def generate_makefile(all_patches, fp):
"""Generate Makefile for a specific set of patches."""
fp.write("#\n")
fp.write("# This file is automatically generated, DO NOT EDIT!\n")
fp.write("#\n")
fp.write("\n")
fp.write("CURDIR ?= ${.CURDIR}\n")
fp.write("PATCH := $(CURDIR)/../debian/tools/gitapply.sh -d $(DESTDIR)\n")
fp.write("\n")
fp.write("PATCHLIST :=\t%s\n" % " \\\n\t\t".join(["%s.ok" % patch.name for i, patch in all_patches.iteritems()]))
fp.write("\n")
fp.write(".PHONY: install\n")
fp.write("install:\n")
fp.write("\t@$(MAKE) apply; \\\n")
fp.write("\tstatus=$$?; \\\n")
fp.write("\trm -f *.ok; \\\n")
fp.write("\texit $$status\n")
fp.write("\n")
fp.write(".PHONY: apply\n")
fp.write("apply: $(PATCHLIST)\n")
fp.write("\tcat *.ok | sort | $(CURDIR)/../debian/tools/patchlist.sh | $(PATCH)\n")
fp.write("\tcd $(DESTDIR) && autoreconf -f\n")
fp.write("\tcd $(DESTDIR) && ./tools/make_requests\n")
fp.write("\n")
fp.write(".PHONY: clean\n")
fp.write("clean:\n")
fp.write("\trm -f *.ok\n")
fp.write("\n")
fp.write(".NOTPARALLEL:\n")
fp.write("\n")
for i, patch in all_patches.iteritems():
fp.write("# Patchset %s\n" % patch.name)
fp.write("# |\n")
fp.write("# | Included patches:\n")
# List all patches and their corresponding authors
for info in patch.authors:
if not info.subject: continue
s = []
if info.revision and info.revision != "1": s.append("rev %s" % info.revision)
if info.author: s.append("by %s" % info.author)
if len(s): s = " [%s]" % ", ".join(s)
fp.write("# | *\t%s\n" % "\n# | \t".join(textwrap.wrap(info.subject + s, 120)))
fp.write("# |\n")
# List all bugs fixed by this patchset
if any([bugid is not None for bugid, bugname, description in patch.fixes]):
fp.write("# | This patchset fixes the following Wine bugs:\n")
for bugid, bugname, description in patch.fixes:
if bugid is not None:
fp.write("# | *\t%s\n" % "\n# | \t".join(textwrap.wrap("[#%d] %s" % (bugid, bugname), 120)))
fp.write("# |\n")
# List all modified files
fp.write("# | Modified files: \n")
fp.write("# | *\t%s\n" % "\n# | \t".join(textwrap.wrap(", ".join(sorted(patch.modified_files)), 120)))
fp.write("# |\n")
# Generate dependencies and code to apply patches
depends = " ".join([""] + ["%s.ok" % all_patches[d].name for d in patch.depends]) if len(patch.depends) else ""
fp.write("%s.ok:%s\n" % (patch.name, depends))
for f in patch.files:
fp.write("\t$(PATCH) < %s\n" % os.path.join(patch.name, f))
# Create *.ok file (used to generate patchlist)
if len(patch.authors):
fp.write("\t( \\\n")
for info in patch.authors:
if not info.subject: continue
s = info.subject
if info.revision and info.revision != "1": s += " [rev %s]" % info.revision
fp.write("\t\techo \"+ { \\\"%s\\\", \\\"%s\\\", \\\"%s\\\" },\"; \\\n" % (patch.name, info.author, s))
fp.write("\t) > %s.ok\n" % patch.name)
else:
fp.write("\ttouch %s.ok\n" % patch.name)
fp.write("\n");
README_template = """wine-compholio
==============
The Wine \"Compholio\" Edition repository includes a variety of patches for
Wine to run common Windows applications under Linux.
These patches fix the following Wine bugs:
{bugs}
Besides that the following additional changes are included:
{fixes}
### Compiling wine-compholio
In order to wine-compholio, please use the recommended Makefile based approach which
will automatically decide whether to use 'git apply' or 'gitapply.sh'. The following
instructions (based on the [Gentoo Wiki](https://wiki.gentoo.org/wiki/Netflix/Pipelight#Compiling_manually))
will give a short overview how to compile wine-compholio, but of course not explain
details. Make sure to install all required wine dependencies before proceeding.
As the first step please grab the latest Wine source:
```bash
wget http://prdownloads.sourceforge.net/wine/wine-{version}.tar.bz2
wget https://github.com/compholio/wine-compholio-daily/archive/v{version}.tar.gz
```
Extract the archives:
```bash
tar xvjf wine-1*.tar.bz2
cd wine-1*
tar xvzf ../v{version}.tar.gz --strip-components 1
```
And apply the patches:
```bash
make -C ./patches DESTDIR=$(pwd) install
```
Afterwards run configure (you can also specify a prefix if you don't want to install
wine-compholio system-wide):
```bash
./configure --with-xattr
```
Before you continue you should make sure that ./configure doesn't show any warnings
(look at the end of the output). If there are any warnings, this most likely means
that you're missing some important header files. Install them and repeat the ./configure
step until all problems are fixed.
Afterwards compile it (and grab a cup of coffee):
```bash
make
```
And install it (you only need sudo for a system-wide installation):
```bash
sudo make install
```
### Excluding patches
It is also possible to apply only a subset of the patches, for example if you're compiling
for a distribution where PulseAudio is not installed, or if you just don't like a specific
patchset. Please note that some patchsets depend on each other, and requesting an impossible
situation might result in a failure to apply all patches.
Lets assume you want to exclude the patchset in directory DIRNAME, then just invoke make like that:
```bash
make -C ./patches DESTDIR=$(pwd) install -W DIRNAME.ok
```
"""
def generate_readme(all_patches, fp):
"""Generate README.md including information about specific patches and bugfixes."""
# Get list of all bugs
def _all_bugs():
all_bugs = []
for i, patch in all_patches.iteritems():
for (bugid, bugname, description) in patch.fixes:
if bugid is not None: all_bugs.append((bugid, bugname, description))
for (bugid, bugname, description) in sorted(all_bugs):
if description is None: description = bugname
yield "%s ([Wine Bug #%d](http://bugs.winehq.org/show_bug.cgi?id=%d \"%s\"))" % (description, bugid, bugid, bugname)
# Get list of all fixes
def _all_fixes():
all_fixes = []
for i, patch in all_patches.iteritems():
for (bugid, bugname, description) in patch.fixes:
if bugid is None: all_fixes.append(description)
for description in sorted(all_fixes):
yield description
# Create enumeration from list
def _enum(x):
return "* " + "\n* ".join(x)
# Read information from changelog
def _read_changelog():
with open("debian/changelog") as fp:
for line in fp:
r = re.match("^([a-zA-Z0-9][^(]*)\((.*)\) ([^;]*)", line)
if r: yield (r.group(1).strip(), r.group(2).strip(), r.group(3).strip())
# Get version number of the latest stable release
def _latest_stable_version():
for package, version, distro in _read_changelog():
if distro.lower() != "unreleased":
return version
fp.write(README_template.format(bugs=_enum(_all_bugs()), fixes=_enum(_all_fixes()), version=_latest_stable_version()))
if __name__ == "__main__":
if not os.path.isdir("./debian/tools/wine"):
raise RuntimeError("Please create a symlink to the wine repository in ./debian/tools/wine")
try:
all_patches = read_patchsets("./patches")
verify_dependencies(all_patches)
except PatchUpdaterError as e:
print ""
print "ERROR: %s" % e
print ""
exit(1)
with open("./patches/Makefile", "w") as fp:
generate_makefile(all_patches, fp)
with open("./README.md", "w") as fp:
generate_readme(all_patches, fp)

320
debian/tools/patchutils.py vendored Normal file
View File

@ -0,0 +1,320 @@
#!/usr/bin/python
#
# Python functions to read, split and apply patches.
#
# Copyright (C) 2014 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
#
import collections
import difflib
import hashlib
import itertools
import os
import re
import subprocess
import tempfile
class PatchParserError(RuntimeError):
"""Unable to parse patch file - either an unimplemented feature, or corrupted patch."""
pass
class PatchApplyError(RuntimeError):
"""Failed to apply/merge patch."""
pass
class PatchObject(object):
def __init__(self, filename):
self.extracted_patch = None
self.unique_hash = None
self.filename = filename
self.offset_begin = None
self.offset_end = None
self.isbinary = False
self.oldname = None
self.newname = None
self.modified_file = None
self.oldsha1 = None
self.newsha1 = None
self.newmode = None
def is_binary(self):
return self.isbinary
def read_chunks(self):
"""Iterates over arbitrary sized chunks of this patch."""
assert self.offset_end >= self.offset_begin
with open(self.filename) as fp:
fp.seek(self.offset_begin)
i = self.offset_end - self.offset_begin
while i > 0:
buf = fp.read(4096 if i > 4096 else i)
if buf == "": raise IOError("Unable to extract patch.")
yield buf
i -= len(buf)
def extract(self):
"""Create a temporary file containing the extracted patch."""
if not self.extracted_patch:
self.extracted_patch = tempfile.NamedTemporaryFile()
for chunk in self.read_chunks():
self.extracted_patch.write(chunk)
self.extracted_patch.flush()
return self.extracted_patch
def hash(self):
"""Hash the content of the patch."""
if not self.unique_hash:
m = hashlib.sha256()
for chunk in self.read_chunks():
m.update(chunk)
self.unique_hash = m.digest()
return self.unique_hash
def read_patch(filename):
"""Iterates over all patches contained in a file, and returns PatchObject objects."""
class _FileReader(object):
def __init__(self, filename):
self.filename = filename
self.fp = open(self.filename)
self.peeked = None
def close(self):
self.fp.close()
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
self.close()
def seek(self, pos):
"""Change the file cursor position."""
self.fp.seek(pos)
self.peeked = None
def tell(self):
"""Return the current file cursor position."""
if self.peeked is None:
return self.fp.tell()
return self.peeked[0]
def peek(self):
"""Read one line without changing the file cursor."""
if self.peeked is None:
pos = self.fp.tell()
tmp = self.fp.readline()
if len(tmp) == 0: return None
self.peeked = (pos, tmp)
return self.peeked[1]
def read(self):
"""Read one line from the file, and move the file cursor to the next line."""
if self.peeked is None:
tmp = self.fp.readline()
if len(tmp) == 0: return None
return tmp
tmp, self.peeked = self.peeked, None
return tmp[1]
def _read_single_patch(fp, oldname=None, newname=None):
"""Internal function to read a single patch from a file."""
patch = PatchObject(fp.filename)
patch.offset_begin = fp.tell()
patch.oldname = oldname
patch.newname = newname
# Skip over initial diff --git header
line = fp.peek()
if line.startswith("diff --git "):
assert fp.read() == line
# Read header
while True:
line = fp.peek()
if line is None:
break
elif line.startswith("--- "):
patch.oldname = line[4:].strip()
elif line.startswith("+++ "):
patch.newname = line[4:].strip()
elif line.startswith("old mode") or line.startswith("deleted file mode"):
pass # ignore
elif line.startswith("new mode "):
patch.newmode = line[9:].strip()
elif line.startswith("new file mode "):
patch.newmode = line[14:].strip()
elif line.startswith("new mode") or line.startswith("new file mode"):
raise PatchParserError("Unable to parse header line '%s'." % line)
elif line.startswith("copy from") or line.startswith("copy to"):
raise NotImplementedError("Patch copy header not implemented yet.")
elif line.startswith("rename "):
raise NotImplementedError("Patch rename header not implemented yet.")
elif line.startswith("similarity index") or line.startswith("dissimilarity index"):
pass # ignore
elif line.startswith("index "):
r = re.match("^index ([a-fA-F0-9]*)\.\.([a-fA-F0-9]*)", line)
if not r: raise PatchParserError("Unable to parse index header line '%s'." % line)
patch.oldsha1, patch.newsha1 = r.group(1), r.group(2)
else:
break
assert fp.read() == line
if patch.oldname is None or patch.newname is None:
raise PatchParserError("Missing old or new name.")
elif patch.oldname == "/dev/null" and patch.newname == "/dev/null":
raise PatchParserError("Old and new name is /dev/null?")
if patch.oldname.startswith("a/"):
patch.oldname = patch.oldname[2:]
elif patch.oldname != "/dev/null":
raise PatchParserError("Old name in patch doesn't start with a/.")
if patch.newname.startswith("b/"):
patch.newname = patch.newname[2:]
elif patch.newname != "/dev/null":
raise PatchParserError("New name in patch doesn't start with b/.")
if patch.newname != "/dev/null":
patch.modified_file = patch.newname
else:
patch.modified_file = patch.oldname
# Decide between binary and textual patch
if line is None or line.startswith("diff --git ") or line.startswith("--- "):
if oldname != newname:
raise PatchParserError("Stripped old- and new name doesn't match.")
elif line.startswith("@@ -"):
while True:
line = fp.peek()
if line is None or not line.startswith("@@ -"):
break
r = re.match("^@@ -(([0-9]+),)?([0-9]+) \+(([0-9]+),)?([0-9]+) @@", line)
if not r: raise PatchParserError("Unable to parse hunk header '%s'." % line)
srcpos = max(int(r.group(2)) - 1, 0) if r.group(2) else 0
dstpos = max(int(r.group(5)) - 1, 0) if r.group(5) else 0
srclines, dstlines = int(r.group(3)), int(r.group(6))
if srclines <= 0 and dstlines <= 0:
raise PatchParserError("Empty hunk doesn't make sense.")
assert fp.read() == line
while srclines > 0 or dstlines > 0:
line = fp.read()
if line is None:
raise PatchParserError("Truncated patch.")
elif line.startswith(" "):
if srclines == 0 or dstlines == 0:
raise PatchParserError("Corrupted patch.")
srclines -= 1
dstlines -= 1
elif line.startswith("-"):
if srclines == 0:
raise PatchParserError("Corrupted patch.")
srclines -= 1
elif line.startswith("+"):
if dstlines == 0:
raise PatchParserError("Corrupted patch.")
dstlines -= 1
elif line.startswith("\\ "):
pass # ignore
else:
raise PatchParserError("Unexpected line in hunk.")
while True:
line = fp.peek()
if line is None or not line.startswith("\\ "): break
assert fp.read() == line
elif line.rstrip() == "GIT binary patch":
if patch.oldsha1 is None or patch.newsha1 is None:
raise PatchParserError("Missing index header, sha1 sums required for binary patch.")
elif patch.oldname != patch.newname:
raise PatchParserError("Stripped old- and new name doesn't match for binary patch.")
assert fp.read() == line
line = fp.read()
if line is None: raise PatchParserError("Unexpected end of file.")
r = re.match("^(literal|delta) ([0-9]+)", line)
if not r: raise NotImplementedError("Only literal/delta patches are supported.")
patch.isbinary = True
# Skip over patch data
while True:
line = fp.read()
if line is None or line.strip() == "":
break
else:
raise PatchParserError("Unknown patch format.")
patch.offset_end = fp.tell()
return patch
with _FileReader(filename) as fp:
while True:
line = fp.peek()
if line is None:
break
elif line.startswith("diff --git "):
tmp = line.strip().split(" ")
if len(tmp) != 4: raise PatchParserError("Unable to parse git diff header line '%s'." % line)
yield _read_single_patch(fp, tmp[2].strip(), tmp[3].strip())
elif line.startswith("--- "):
yield _read_single_patch(fp)
elif line.startswith("@@ -") or line.startswith("+++ "):
raise PatchParserError("Patch didn't start with a git or diff header.")
else:
assert fp.read() == line
def apply_patch(content, patches, reverse=False, fuzz=2):
"""Apply a patch with optional fuzz - uses the commandline 'patch' utility."""
if not isinstance(patches, collections.Sequence):
patches = [patches]
contentfile = tempfile.NamedTemporaryFile(delete=False)
try:
contentfile.write(content)
contentfile.close()
for patch in patches:
patchfile = patch.extract()
cmdline = ["patch", "--batch", "--silent", "-r", "-"]
if reverse: cmdline.append("--reverse")
if fuzz != 2: cmdline.append("--fuzz=%d" % fuzz)
cmdline += [contentfile.name, patchfile.name]
with open(os.devnull, 'w') as devnull:
exitcode = subprocess.call(cmdline, stdout=devnull, stderr=devnull)
if exitcode != 0:
raise PatchApplyError("Failed to apply patch (exitcode %d)." % exitcode)
with open(contentfile.name) as fp:
content = fp.read()
finally:
os.unlink(contentfile.name)
return content

View File

@ -1,3 +0,0 @@
Revision: 1
Author: Sebastian Lackner
Title: Add commandline option --patches to show the patch list.

View File

@ -1,3 +0,0 @@
Revision: 1
Author: Michael Müller
Title: Add commandline option --check-libs to test if shared libraries are installed.

View File

@ -0,0 +1,7 @@
Author: Sebastian Lackner
Subject: Add commandline option --patches to show the patch list.
Revision: 1
Author: Michael Müller
Subject: Add commandline option --check-libs to test if shared libraries are installed.
Revision: 1

View File

@ -1,3 +0,0 @@
Revision: 2
Author: Erich E. Hoover
Title: Implement SIO_ADDRESS_LIST_CHANGE.

View File

@ -0,0 +1,4 @@
Author: Erich E. Hoover
Subject: Implement SIO_ADDRESS_LIST_CHANGE.
Revision: 2
Fixes: [32328] Support for interface change notifications

View File

@ -1,3 +0,0 @@
Revision: 6
Author: Erich E. Hoover
Title: Store and return security attributes with extended file attributes.

View File

@ -0,0 +1,5 @@
Author: Erich E. Hoover
Subject: Store and return security attributes with extended file attributes.
Revision: 6
Fixes: [31858] Support for stored file ACLs
Fixes: [34406] Support for inherited file ACLs

View File

@ -1,3 +0,0 @@
Revision: 1
Author: Sebastian Lackner
Title: Enable/disable windows when they are (un)mapped by foreign applications.

View File

@ -1,3 +0,0 @@
Revision: 1
Author: Sebastian Lackner
Title: Update gl_drawable for embedded windows.

View File

@ -0,0 +1,9 @@
Author: Sebastian Lackner
Subject: Enable/disable windows when they are (un)mapped by foreign applications.
Revision: 1
Author: Sebastian Lackner
Subject: Update gl_drawable for embedded windows.
Revision: 1
Fixes: XEMBED support for embedding Wine windows inside Linux applications

View File

@ -1,4 +0,0 @@
Revision: 1
Author: Sebastian Lackner
Title: Change return value of stub SetNamedPipeHandleState to TRUE.

View File

@ -0,0 +1,5 @@
Author: Sebastian Lackner
Subject: Change return value of stub SetNamedPipeHandleState to TRUE.
Revision: 1
Fixes: [17273] Workaround for TransactNamedPipe not being supported

View File

@ -1,7 +1,7 @@
From 8cb75a25d71c1ea659ce69fa74f725cd9b9a64f0 Mon Sep 17 00:00:00 2001
From 9c64dcb14a77b7b1835bb06e03c90c502a1109f0 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Sat, 8 Feb 2014 16:08:53 +0100
Subject: [PATCH 08/42] winmm: Load winealsa if winepulse is found
Date: Tue, 24 Jun 2014 08:48:45 +0200
Subject: [PATCH 08/43] winmm: Load winealsa if winepulse is found
Fixes midi on winepulse
---
@ -25,5 +25,5 @@ index c3b3674..56cfe35 100644
HeapFree(GetProcessHeap(), 0, drvA);
PropVariantClear(&pv);
--
1.8.5.2
2.0.0

View File

@ -1,13 +1,12 @@
From dac832bfc418de315808a109ab9adba0c5936be5 Mon Sep 17 00:00:00 2001
From 182d5c5625ea79c4506daa6856de158558de24d8 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Date: Sat, 8 Feb 2014 16:08:53 +0100
Subject: [PATCH 09/42] winepulse: Add initial stub for pulseaudio support
Date: Tue, 24 Jun 2014 08:48:45 +0200
Subject: [PATCH 09/43] winepulse: Add initial stub for pulseaudio support
---
Just the basic of initialization and pulseaudio mainloop support is
added here.
---
configure | 99 +++++++++++-
configure.ac | 32 +++-
dlls/mmdevapi/main.c | 2 +-
dlls/winepulse.drv/Makefile.in | 7 +
@ -18,171 +17,8 @@ added here.
create mode 100644 dlls/winepulse.drv/mmdevdrv.c
create mode 100644 dlls/winepulse.drv/winepulse.drv.spec
diff --git a/configure b/configure
index 246b888..d9f6ddd 100755
--- a/configure
+++ b/configure
@@ -653,6 +653,8 @@ OSS4_CFLAGS
ALSA_LIBS
GSTREAMER_LIBS
GSTREAMER_CFLAGS
+PULSEINCL
+PULSELIBS
GETTEXTPO_LIBS
Z_LIBS
FREETYPE_LIBS
@@ -824,6 +826,7 @@ with_osmesa
with_oss
with_png
with_pthread
+with_pulse
with_sane
with_tiff
with_v4l
@@ -1253,6 +1256,7 @@ enable_winemapi
enable_winemp3_acm
enable_wineoss_drv
enable_wineps_drv
+enable_winepulse_drv
enable_wineqtdecoder
enable_winex11_drv
enable_wing32
@@ -2079,6 +2083,7 @@ Optional Packages:
--without-oss do not use the OSS sound support
--without-png do not use PNG
--without-pthread do not use the pthread library
+ --without-pulse do not use PulseAudio sound support
--without-sane do not use SANE (scanner support)
--without-tiff do not use TIFF
--without-v4l do not use v4l1 (v4l support)
@@ -3320,6 +3325,12 @@ if test "${with_pthread+set}" = set; then :
fi
+# Check whether --with-pulse was given.
+if test "${with_pulse+set}" = set; then :
+ withval=$with_pulse;
+fi
+
+
# Check whether --with-sane was given.
if test "${with_sane+set}" = set; then :
withval=$with_sane;
@@ -12083,6 +12094,87 @@ esac
fi
fi
+PULSELIBS=""
+
+PULSEINCL=""
+
+if test "x$with_pulse" != "xno";
+then
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test "$PKG_CONFIG" != "false";
+ then
+ ac_pulse_libs="`$PKG_CONFIG --libs libpulse 2>/dev/null`"
+ ac_pulse_cflags="`$PKG_CONFIG --cflags-only-I libpulse 2>/dev/null`"
+
+ CPPFLAGS="$CPPFLAGS $ac_pulse_cflags"
+ for ac_header in pulse/pulseaudio.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "pulse/pulseaudio.h" "ac_cv_header_pulse_pulseaudio_h" "$ac_includes_default"
+if test "x$ac_cv_header_pulse_pulseaudio_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PULSE_PULSEAUDIO_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pa_stream_is_corked in -lpulse" >&5
+$as_echo_n "checking for pa_stream_is_corked in -lpulse... " >&6; }
+if ${ac_cv_lib_pulse_pa_stream_is_corked+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpulse $ac_pulse_libs $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pa_stream_is_corked ();
+int
+main ()
+{
+return pa_stream_is_corked ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pulse_pa_stream_is_corked=yes
+else
+ ac_cv_lib_pulse_pa_stream_is_corked=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pulse_pa_stream_is_corked" >&5
+$as_echo "$ac_cv_lib_pulse_pa_stream_is_corked" >&6; }
+if test "x$ac_cv_lib_pulse_pa_stream_is_corked" = xyes; then :
+
+$as_echo "#define HAVE_PULSEAUDIO 1" >>confdefs.h
+
+ PULSELIBS="$ac_pulse_libs"
+ PULSEINCL="$ac_pulse_cflags"
+fi
+
+
+fi
+
+done
+
+ fi
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+if test "$ac_cv_lib_pulse_pa_stream_is_corked" != "yes"; then :
+ case "x$with_pulse" in
+ x) as_fn_append wine_warnings "|libpulse ${notice_platform}development files not found or too old, Pulse won't be supported." ;;
+ xno) ;;
+ *) as_fn_error $? "libpulse ${notice_platform}development files not found or too old, Pulse won't be supported.
+This is an error since --with-pulse was requested." "$LINENO" 5 ;;
+esac
+fi
+
if test "x$with_gstreamer" != "xno"
then
if ${GSTREAMER_CFLAGS:+false} :; then :
@@ -13394,12 +13486,14 @@ fi
test -n "$ALSA_LIBS" || enable_winealsa_drv=${enable_winealsa_drv:-no}
test -n "$COREAUDIO_LIBS" || enable_winecoreaudio_drv=${enable_winecoreaudio_drv:-no}
+test -n "$PULSELIBS" || enable_winepulse_drv=${enable_winepulse_drv:-no}
test "x$ac_cv_member_oss_sysinfo_numaudioengines" = xyes || enable_wineoss_drv=${enable_wineoss_drv:-no}
test "$ac_cv_header_linux_joystick_h" = "yes" || enable_winejoystick_drv=${enable_winejoystick_drv:-no}
-if test "x$ALSA_LIBS$COREAUDIO_LIBS" = "x" -a \
+if test "x$ALSA_LIBS$COREAUDIO_LIBS$PULSELIBS" = "x" -a \
+if test "x$ALSALIBS$COREAUDIO$PULSELIBS" = "x" -a \
"x$ac_cv_member_oss_sysinfo_numaudioengines" != xyes -a \
- "x$with_alsa$with_coreaudio$with_oss" != xnonono
+ "x$with_alsa$with_coreaudio$with_oss$with_pulse" != xnononono
then
as_fn_append wine_warnings "|No sound system was found. Windows applications will be silent."
fi
@@ -17203,6 +17297,7 @@ wine_fn_config_dll winemp3.acm enable_winemp3_acm
wine_fn_config_dll wineoss.drv enable_wineoss_drv
wine_fn_config_dll wineps.drv enable_wineps_drv clean,po
wine_fn_config_dll wineps16.drv16 enable_win16
+wine_fn_config_dll winepulse.drv enable_winepulse_drv
wine_fn_config_dll wineqtdecoder enable_wineqtdecoder
wine_fn_config_dll winex11.drv enable_winex11_drv
wine_fn_config_dll wing.dll16 enable_win16
diff --git a/configure.ac b/configure.ac
index de807d2..ec3db46 100644
index eccf19c..d4939c7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -70,6 +70,7 @@ AC_ARG_WITH(oss, AS_HELP_STRING([--without-oss],[do not use the OSS sound
@ -193,7 +29,7 @@ index de807d2..ec3db46 100644
AC_ARG_WITH(sane, AS_HELP_STRING([--without-sane],[do not use SANE (scanner support)]))
AC_ARG_WITH(tiff, AS_HELP_STRING([--without-tiff],[do not use TIFF]))
AC_ARG_WITH(v4l, AS_HELP_STRING([--without-v4l],[do not use v4l1 (v4l support)]))
@@ -1512,6 +1513,30 @@ then
@@ -1516,6 +1517,30 @@ then
[GetText ${notice_platform}development files not found (or too old), po files can't be rebuilt.])
fi
@ -224,7 +60,7 @@ index de807d2..ec3db46 100644
dnl **** Check for gstreamer ****
if test "x$with_gstreamer" != "xno"
then
@@ -1730,13 +1755,15 @@ fi
@@ -1734,13 +1759,15 @@ fi
dnl **** Disable unsupported winmm drivers ****
test -n "$ALSA_LIBS" || enable_winealsa_drv=${enable_winealsa_drv:-no}
test -n "$COREAUDIO_LIBS" || enable_winecoreaudio_drv=${enable_winecoreaudio_drv:-no}
@ -242,7 +78,7 @@ index de807d2..ec3db46 100644
then
WINE_WARNING([No sound system was found. Windows applications will be silent.])
fi
@@ -3217,6 +3244,7 @@ WINE_CONFIG_DLL(winemp3.acm)
@@ -3235,6 +3262,7 @@ WINE_CONFIG_DLL(winemp3.acm)
WINE_CONFIG_DLL(wineoss.drv)
WINE_CONFIG_DLL(wineps.drv,,[clean,po])
WINE_CONFIG_DLL(wineps16.drv16,enable_win16)
@ -584,5 +420,5 @@ index 0000000..a089166
+@ stdcall -private GetAudioEndpoint(ptr ptr long ptr) AUDDRV_GetAudioEndpoint
+@ stdcall -private GetAudioSessionManager(ptr ptr) AUDDRV_GetAudioSessionManager
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From ac6de861806e5692fa004cb2c449feba95287323 Mon Sep 17 00:00:00 2001
From 66366363c2c99a359dfea648d2de409e362b5557 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Date: Sat, 8 Feb 2014 16:08:53 +0100
Subject: [PATCH 10/42] winepulse: Add format and period probing
Date: Tue, 24 Jun 2014 08:48:46 +0200
Subject: [PATCH 10/43] winepulse: Add format and period probing
---
dlls/winepulse.drv/mmdevdrv.c | 128 ++++++++++++++++++++++++++++++++++++++++++
@ -168,5 +168,5 @@ index d187bdc..40db26d 100644
UINT *num, UINT *def_index)
{
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 54c37abb982df8e5aefccfe2add2a05fa5707db8 Mon Sep 17 00:00:00 2001
From 26cd0e172f299c7e63c51af9f67035f4e5865822 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Date: Sat, 8 Feb 2014 16:08:53 +0100
Subject: [PATCH 11/42] winepulse: Add audioclient
Date: Tue, 24 Jun 2014 08:48:46 +0200
Subject: [PATCH 11/43] winepulse: Add audioclient
---
Without AudioRenderClient and AudioCaptureClient it won't work,
@ -1094,5 +1094,5 @@ index 40db26d..37d85ff 100644
IAudioSessionManager2 **out)
{
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 4191de925518baace7ad4c13a0c72750a91f1abd Mon Sep 17 00:00:00 2001
From 9cca5914bed2a12edcafc8cebf5918d51e2570de Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Date: Sat, 8 Feb 2014 16:08:54 +0100
Subject: [PATCH 12/42] winepulse: Add IAudioRenderClient and
Date: Tue, 24 Jun 2014 08:48:46 +0200
Subject: [PATCH 12/43] winepulse: Add IAudioRenderClient and
IAudioCaptureClient
---
@ -348,5 +348,5 @@ index 37d85ff..01cfd25 100644
IAudioSessionManager2 **out)
{
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 2e3b7073ee776ecbd5b186d8f146e80ef30775b8 Mon Sep 17 00:00:00 2001
From 6b97d362c570ec4a813db1d58574a94ad61f9015 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Date: Sat, 8 Feb 2014 16:08:54 +0100
Subject: [PATCH 13/42] winepulse: Add IAudioClock and IAudioClock2
Date: Tue, 24 Jun 2014 08:48:46 +0200
Subject: [PATCH 13/43] winepulse: Add IAudioClock and IAudioClock2
---
dlls/winepulse.drv/mmdevdrv.c | 172 ++++++++++++++++++++++++++++++++++++++++++
@ -205,5 +205,5 @@ index 01cfd25..3ed2288 100644
IAudioSessionManager2 **out)
{
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 85e33b703dd8c082af2b4a008215adca70308fc5 Mon Sep 17 00:00:00 2001
From 0f827300a5f9d66de488f43fa5f544e97335ea35 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Date: Sat, 8 Feb 2014 16:08:54 +0100
Subject: [PATCH 14/42] winepulse: Add audiostreamvolume
Date: Tue, 24 Jun 2014 08:48:46 +0200
Subject: [PATCH 14/43] winepulse: Add audiostreamvolume
---
Pulse allows streams to set volume, but for various reasons it's
@ -281,5 +281,5 @@ index 3ed2288..b7414c2 100644
IAudioSessionManager2 **out)
{
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From ca90d6371ca330a63447c4a67cda50d65d51a73b Mon Sep 17 00:00:00 2001
From 313c40a06e4b535ea524c0393c466a52d9c1e8eb Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Date: Sat, 8 Feb 2014 16:08:54 +0100
Subject: [PATCH 15/42] winepulse: Add session support
Date: Tue, 24 Jun 2014 08:48:46 +0200
Subject: [PATCH 15/43] winepulse: Add session support
---
Copied verbatim from winealsa
@ -932,5 +932,5 @@ index b7414c2..64ee62e 100644
+ return S_OK;
}
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From bef79b1cc995c36d4dccc6e7a7251f2954eef89a Mon Sep 17 00:00:00 2001
From 379ef856e7d5c5d691a8aabbb77a95dc3b0e6d9c Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Date: Sat, 8 Feb 2014 16:08:54 +0100
Subject: [PATCH 16/42] fix fdels trailing whitespaces
Date: Tue, 24 Jun 2014 08:48:46 +0200
Subject: [PATCH 16/43] fix fdels trailing whitespaces
Happy? :P
---
@ -31,5 +31,5 @@ index 64ee62e..5a71a3d 100644
if (*pos < This->clock_lastpos)
*pos = This->clock_lastpos;
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 8a7d39774081539935d060f405fc0f4f1718cb5b Mon Sep 17 00:00:00 2001
From 99756a89f015bdf24d42ef75b59736d2cfd930c5 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Date: Sat, 8 Feb 2014 16:08:54 +0100
Subject: [PATCH 17/42] winepulse v12
Date: Tue, 24 Jun 2014 08:48:46 +0200
Subject: [PATCH 17/43] winepulse v12
Changes since v11:
- Fix incorrect assertions which may fail on moving a capture device
@ -44,5 +44,5 @@ index 5a71a3d..960af3c 100644
copy = rem;
if (copy > src_len)
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 91657e70984483200e08c29ed9431027cf10db24 Mon Sep 17 00:00:00 2001
From 8bdeceb10d8f3d69cc6835e53d3a3137a276d756 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Date: Sat, 8 Feb 2014 16:08:54 +0100
Subject: [PATCH 18/42] winepulse v15: Add support for missing formats, and
Date: Tue, 24 Jun 2014 08:48:46 +0200
Subject: [PATCH 18/43] winepulse v15: Add support for missing formats, and
silence an error for missing format tags
---
@ -37,5 +37,5 @@ index 960af3c..f52f119 100644
This->ss.channels = This->map.channels;
if (!pa_channel_map_valid(&This->map) || This->ss.format == PA_SAMPLE_INVALID) {
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 7cdac1f6eb46245e55ed93b819c561da2380ccef Mon Sep 17 00:00:00 2001
From a3b41022c8746ecf5036adf6c5582f8fe1f7e7b4 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Date: Sat, 8 Feb 2014 16:08:54 +0100
Subject: [PATCH 19/42] winepulse v16: Add official warning wine doesn't want
Date: Tue, 24 Jun 2014 08:48:46 +0200
Subject: [PATCH 19/43] winepulse v16: Add official warning wine doesn't want
to support winepulse
And give an alternative place to ask for support.
@ -75,5 +75,5 @@ index f52f119..76a2e0e 100644
return E_UNEXPECTED;
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From d8b279f724839e5fbd5443e2d2a6f3e8f7c93dac Mon Sep 17 00:00:00 2001
From 384845108243ed6592df164f13e00dd88705b8bf Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Date: Sat, 8 Feb 2014 16:08:54 +0100
Subject: [PATCH 20/42] winepulse v17: Fix winmm tests
Date: Tue, 24 Jun 2014 08:48:47 +0200
Subject: [PATCH 20/43] winepulse v17: Fix winmm tests
Handle dwChannelMask = SPEAKER_ALL better so WAVE_FORMAT_EXTENSIBLE tests pass too
---
@ -121,5 +121,5 @@ index 76a2e0e..6e75674 100644
if (hr == S_OK || !out) {
CoTaskMemFree(closest);
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 4e4971813a136b9535b912fb95995b5b13dba8bb Mon Sep 17 00:00:00 2001
From e07df6656ffbccbf4974ca9103c5953f5ff090f3 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Sat, 8 Feb 2014 16:08:54 +0100
Subject: [PATCH 21/42] winepulse v18: Latency and compilation improvements
Date: Tue, 24 Jun 2014 08:48:47 +0200
Subject: [PATCH 21/43] winepulse v18: Latency and compilation improvements
Changes since v17:
- Remove clock_pulse interpolation
@ -203,5 +203,5 @@ index 6e75674..8e76826 100644
/* Make time never go backwards */
if (*pos < This->clock_lastpos)
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 7a2597d90627ce1bacf0e1969cc4b2eea4e1cd5d Mon Sep 17 00:00:00 2001
From a1e43cc033dd64d05bcfc6189b332227facc24cf Mon Sep 17 00:00:00 2001
From: Juergen Tretthahn <orson@orson.at>
Date: Sat, 8 Feb 2014 16:08:54 +0100
Subject: [PATCH 22/42] winepulse: API Compatibility with 1.5.2 onward, v2
Date: Tue, 24 Jun 2014 08:48:47 +0200
Subject: [PATCH 22/43] winepulse: API Compatibility with 1.5.2 onward, v2
V2: Add winepulse.drv.spec to commit too
V1: Original version
@ -110,5 +110,5 @@ index a089166..612bf46 100644
+@ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint
@ stdcall -private GetAudioSessionManager(ptr ptr) AUDDRV_GetAudioSessionManager
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From e8533a5bf1e137ccfbe8b44e5e6a645805de8d2b Mon Sep 17 00:00:00 2001
From cf251ef3bc965d723003723fc86a995ed0808c17 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Sat, 8 Feb 2014 16:08:54 +0100
Subject: [PATCH 23/42] winepulse: Fix low latency support
Date: Tue, 24 Jun 2014 08:48:47 +0200
Subject: [PATCH 23/43] winepulse: Fix low latency support
Some games request a 20 ms buffer and will only fill 20 ms.
Since 10 ms periods are too long in this case for winepulse,
@ -54,5 +54,5 @@ index b374b53..7c07f54 100644
return S_OK;
}
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 3487d764ca9c97a2f6b7898acf653a616c8c8dae Mon Sep 17 00:00:00 2001
From 94b06acf43a3687efabf329ab32190ebc54147e5 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Sat, 8 Feb 2014 16:08:55 +0100
Subject: [PATCH 24/42] winepulse: drop realtime priority before thread
Date: Tue, 24 Jun 2014 08:48:47 +0200
Subject: [PATCH 24/43] winepulse: drop realtime priority before thread
destruction
prevents having to handle a kernel RT Watchdog Timeout.
@ -23,5 +23,5 @@ index 7c07f54..ba68102 100644
pa_context_disconnect(pulse_ctx);
pa_context_unref(pulse_ctx);
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 7806b9b3fd846e8ce55e13ac4abdfeca4b26a270 Mon Sep 17 00:00:00 2001
From 363670394eb26ede216523dfbaca4c22032f35b8 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Sat, 8 Feb 2014 16:08:55 +0100
Subject: [PATCH 25/42] winepulse: remove bogus SetEvent from
Date: Tue, 24 Jun 2014 08:48:47 +0200
Subject: [PATCH 25/43] winepulse: remove bogus SetEvent from
pulse_started_callback
---
@ -25,5 +25,5 @@ index ba68102..68de00c 100644
static void pulse_rd_loop(ACImpl *This, size_t bytes)
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 78a28b81d51df9aebcd7b130f8535437af9df6fa Mon Sep 17 00:00:00 2001
From 5cfd0ad9a87b738a7bce79c966b476a682892506 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Sat, 8 Feb 2014 16:08:55 +0100
Subject: [PATCH 26/42] winepulse: disable the setevent part of the latency
Date: Tue, 24 Jun 2014 08:48:47 +0200
Subject: [PATCH 26/43] winepulse: disable the setevent part of the latency
hack
If you get playback glitches in skyrim or other games as a result of
@ -38,5 +38,5 @@ index 68de00c..643d55e 100644
return S_OK;
}
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 67159f14084007bfdd743b5e2194942e3fa1fe7a Mon Sep 17 00:00:00 2001
From b5e9e9af838afe41a7e82ba8c5c1e0c4bd5bd517 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Sat, 8 Feb 2014 16:08:55 +0100
Subject: [PATCH 27/42] winepulse v20: fix the checks in IsFormatSupported
Date: Tue, 24 Jun 2014 08:48:47 +0200
Subject: [PATCH 27/43] winepulse v20: fix the checks in IsFormatSupported
Thanks to DGhost001 for reporting and isolating the issue.
---
@ -24,5 +24,5 @@ index 643d55e..86dd10a 100644
CoTaskMemFree(closest);
if (out)
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From d563d66ef2dda02730d8211e9334906fd9daf2e2 Mon Sep 17 00:00:00 2001
From 2813e16dbbefcccbf4b8b29bf65c30e4d7f2605c Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Sat, 8 Feb 2014 16:08:55 +0100
Subject: [PATCH 28/42] winepulse: fixup IsFormatSupported calls
Date: Tue, 24 Jun 2014 08:48:47 +0200
Subject: [PATCH 28/43] winepulse: fixup IsFormatSupported calls
---
dlls/mmdevapi/tests/render.c | 164 +++++++++++++++++++++++++++++++++++++++
@ -409,5 +409,5 @@ index 86dd10a..554a9fc 100644
TRACE("returning: %08x %p\n", hr, out ? *out : NULL);
return hr;
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 50da53d33c85896f752802990aecf79fe29dc735 Mon Sep 17 00:00:00 2001
From e95e4533229ef499e6e2ecb793e3054b8be3809a Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Sat, 8 Feb 2014 16:08:55 +0100
Subject: [PATCH 29/42] winepulse v21: return early if padding didn't update
Date: Tue, 24 Jun 2014 08:48:48 +0200
Subject: [PATCH 29/43] winepulse v21: return early if padding didn't update
---
dlls/winepulse.drv/mmdevdrv.c | 5 ++++-
@ -24,5 +24,5 @@ index 554a9fc..a4575d5 100644
This->clock_written += oldpad - This->pad;
TRACE("New pad: %zu (-%zu)\n", This->pad / pa_frame_size(&This->ss), (oldpad - This->pad) / pa_frame_size(&This->ss));
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 5b3f36aed665d2edb524eda22908664442234184 Mon Sep 17 00:00:00 2001
From 0a2ea36a38fccd41fa3387be71fea39462e4102c Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Sat, 8 Feb 2014 16:08:55 +0100
Subject: [PATCH 30/42] winepulse: fix unneeded free in write..
Date: Tue, 24 Jun 2014 08:48:48 +0200
Subject: [PATCH 30/43] winepulse: fix unneeded free in write..
---
dlls/winepulse.drv/mmdevdrv.c | 6 +++++-
@ -32,5 +32,5 @@ index a4575d5..3ca68fd 100644
This->locked_ptr = NULL;
TRACE("Released %u, pad %zu\n", written_frames, This->pad / pa_frame_size(&This->ss));
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From fa89aaea30c0956c25a01ac8ad38fa4713bf47ca Mon Sep 17 00:00:00 2001
From 46f5df733fba376a7d6bbb3804fb25e108b760f0 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Sat, 8 Feb 2014 16:08:55 +0100
Subject: [PATCH 31/42] winepulse v23: fixup a invalid free in mmdevapi
Date: Tue, 24 Jun 2014 08:48:48 +0200
Subject: [PATCH 31/43] winepulse v23: fixup a invalid free in mmdevapi
array members of ids should be dynamically allocated, judging from valgrind output.
---
@ -47,5 +47,5 @@ index 3ca68fd..5b041a2 100644
(*keys)[0] = pulse_render_guid;
else
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 8fd7e21cea105091d14f36511317af643cb256be Mon Sep 17 00:00:00 2001
From 8d23cea7bd4c530d352d0358bb078e7c9eea4b43 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Sat, 8 Feb 2014 16:08:56 +0100
Subject: [PATCH 38/42] winepulse: use a pi-mutex for serialization.
Date: Tue, 24 Jun 2014 08:48:48 +0200
Subject: [PATCH 38/43] winepulse: use a pi-mutex for serialization.
The winepulse thread is realtime, to prevent blocking it indefinitely
use priority inheritance. Only initialize and release are potentially
@ -63,5 +63,5 @@ index 5b041a2..a09ce7f 100644
if (pulse_thread)
SetThreadPriority(pulse_thread, 0);
--
1.8.5.2
2.0.0

View File

@ -1,7 +1,7 @@
From 09d3be12108151fe6746f6f33a86b5fa2473e3dc Mon Sep 17 00:00:00 2001
From 0db6f5427a3a74f23c8833680a53df63cb1ab339 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Sat, 8 Feb 2014 16:08:56 +0100
Subject: [PATCH 39/42] winepulse: add support for IMarshal
Date: Tue, 24 Jun 2014 08:48:49 +0200
Subject: [PATCH 39/43] winepulse: add support for IMarshal
Fixes bug 32161 for winepulse. Based On Jeff Klein's patches for the
other drivers.
@ -133,5 +133,5 @@ index a09ce7f..f052a08 100644
return E_NOINTERFACE;
}
--
1.8.5.2
2.0.0

View File

@ -0,0 +1,29 @@
From 0f7b5851573569ddf40e36e48670bf9d09765920 Mon Sep 17 00:00:00 2001
From: Mark Harmstone <mark@harmstone.com>
Date: Tue, 24 Jun 2014 08:48:49 +0200
Subject: [PATCH 43/43] winepulse: handle stream create failing correctly
---
dlls/winepulse.drv/mmdevdrv.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c
index f052a08..e755e8a 100644
--- a/dlls/winepulse.drv/mmdevdrv.c
+++ b/dlls/winepulse.drv/mmdevdrv.c
@@ -701,6 +701,12 @@ static HRESULT pulse_stream_connect(ACImpl *This, UINT32 period_bytes) {
ret = InterlockedIncrement(&number);
sprintf(buffer, "audio stream #%i", ret);
This->stream = pa_stream_new(pulse_ctx, buffer, &This->ss, &This->map);
+
+ if (!This->stream) {
+ WARN("pa_stream_new returned error %i\n", pa_context_errno(pulse_ctx));
+ return AUDCLNT_E_ENDPOINT_CREATE_FAILED;
+ }
+
pa_stream_set_state_callback(This->stream, pulse_stream_state, This);
pa_stream_set_buffer_attr_callback(This->stream, pulse_attr_update, This);
pa_stream_set_moved_callback(This->stream, pulse_attr_update, This);
--
2.0.0

View File

@ -1,3 +0,0 @@
Revision: 3
Author: Maarten Lankhorst
Title: Winepulse patches extracted from https://launchpad.net/~ubuntu-wine/+archive/ppa/+files/wine1.7_1.7.19-0ubuntu2~trusty2.debian.tar.gz.

View File

@ -0,0 +1,4 @@
Author: Maarten Lankhorst
Subject: Winepulse patches extracted from https://launchpad.net/~ubuntu-wine/+archive/ubuntu/ppa/+files/wine1.7_1.7.21-0ubuntu1~ppa1.debian.tar.gz.
Revision: 4
Fixes: Support for PulseAudio backend for audio

View File

@ -0,0 +1,4 @@
Author: Erich E. Hoover
Subject: Implement GetVolumePathName.
Revision: 1
Fixes: Support for GetVolumePathName

View File

@ -1,3 +0,0 @@
Revision: 1
Author: Erich E. Hoover
Title: Implement GetVolumePathName.

View File

@ -1,4 +0,0 @@
Revision: 1
Author: Erich E. Hoover
Title: Support for junction points/reparse points.

View File

@ -0,0 +1,4 @@
Author: Erich E. Hoover
Subject: Support for junction points/reparse points.
Revision: 1
Fixes: [12401] Support for Junction Points

View File

@ -1,3 +0,0 @@
Revision: 1
Author: Erich E. Hoover
Title: Implement TransmitFile.

View File

@ -0,0 +1,4 @@
Author: Erich E. Hoover
Subject: Implement TransmitFile.
Revision: 1
Fixes: [5048] Support for TransmitFile

View File

@ -1,3 +0,0 @@
Revision: 1
Author: Torsten Kurbad
Title: Implement missing Arial font expected by Silverlight.

View File

@ -0,0 +1,4 @@
Author: Torsten Kurbad
Subject: Implement missing Arial font expected by Silverlight.
Revision: 1
Fixes: [32323] Implement an Arial replacement font

View File

@ -0,0 +1,4 @@
Author: Sebastian Lackner
Subject: Use lockfree implementation for get_cached_fd.
Revision: 4
Fixes: Lockfree algorithm for filedescriptor cache (improves file access speed)

View File

@ -1,3 +0,0 @@
Revision: 4
Author: Sebastian Lackner
Title: Use lockfree implementation for get_cached_fd.

View File

@ -1,3 +0,0 @@
Revision: 1
Author: Erich E. Hoover
Title: Add default security descriptor ownership and DACLs for processes.

View File

@ -0,0 +1,4 @@
Author: Erich E. Hoover
Subject: Add default security descriptor ownership and DACLs for processes.
Revision: 1
Fixes: [15980] GetSecurityInfo returns NULL DACL for process object

View File

@ -0,0 +1,4 @@
Author: Sebastian Lackner
Subject: Workaround for broken implementation of shlwapi url functions.
Revision: 1
Fixes: Workaround for shlwapi URLs with relative paths

View File

@ -1,3 +0,0 @@
Revision: 1
Author: Sebastian Lackner
Title: Workaround for broken implementation of shlwapi url functions.

View File

@ -1,3 +0,0 @@
Revision: 1
Author: Sebastian Lackner
Title: Partial implementation of WTSEnumerateProcessesW.

View File

@ -0,0 +1,4 @@
Author: Sebastian Lackner
Subject: Partial implementation of WTSEnumerateProcessesW.
Revision: 1
Fixes: [29903] Add implementation of WTSEnumerateProcessesW

View File

@ -0,0 +1,4 @@
Author: Joris van der Wel
Subject: Implement passing ACLs to CreateProcess.
Revision: 1
Fixes: [22006] Support for process ACLs

View File

@ -0,0 +1,4 @@
Author: Erich E. Hoover
Subject: Fix possible race conditions in strmbase/quartz.
Revision: 1
Fixes: [31566] Fix race conditions and deadlocks in strmbase/quartz

View File

@ -0,0 +1,4 @@
Author: Erich E. Hoover
Subject: Return correct IMediaSeeking stream positions in quartz.
Revision: 1
Fixes: [23174] Return correct IMediaSeeking stream positions in quartz

View File

@ -1,3 +0,0 @@
Revision: 2
Author: Michael Müller
Title: Decrease minimum SetTimer interval to 5 ms.

View File

@ -1,3 +0,0 @@
Revision: 1
Author: Michael Müller
Title: Allow changing strict draw ordering through an exported function.

View File

@ -1,4 +0,0 @@
Revision: 1
Author: Michael Müller
Title: Indicate direct rendering through OpenGL extension.

View File

@ -1,3 +0,0 @@
Revision: 1
Author: Sebastian Lackner
Title: Implement X11DRV_FLUSH_GDI_DISPLAY ExtEscape command.

View File

@ -0,0 +1,18 @@
Author: Michael Müller
Subject: Decrease minimum SetTimer interval to 5 ms.
Revision: 2
Author: Michael Müller
Subject: Allow changing strict draw ordering through an exported function.
Revision: 1
Author: Michael Müller
Subject: Indicate direct rendering through OpenGL extension.
Revision: 1
Author: Sebastian Lackner
Subject: Implement X11DRV_FLUSH_GDI_DISPLAY ExtEscape command.
Revision: 1
Fixes: Reduced SetTimer minimum value from 15 ms to 5 ms (improves Silverlight framerates)
Fixes: Other Pipelight specific enhancements

View File

@ -1,3 +0,0 @@
Revision: 1
Author: Sebastian Lackner
Title: kernel32: Silence repeated CompareStringEx FIXME.

View File

@ -1,4 +0,0 @@
Revision: 2
Author: Erich E. Hoover
Title: wined3d: Silence repeated resource_check_usage FIXME.

View File

@ -1,3 +0,0 @@
Revision: 1
Author: Sebastian Lackner
Title: wined3d: Silence repeated wined3d_swapchain_present FIXME.

View File

@ -0,0 +1,11 @@
Revision: 1
Author: Sebastian Lackner
Title: kernel32: Silence repeated CompareStringEx FIXME.
Revision: 2
Author: Erich E. Hoover
Title: wined3d: Silence repeated resource_check_usage FIXME.
Revision: 1
Author: Sebastian Lackner
Title: wined3d: Silence repeated wined3d_swapchain_present FIXME.

View File

@ -1,44 +1,441 @@
SUBDIRS=10-Missing_Fonts
#
# This file is automatically generated, DO NOT EDIT!
#
#PATCH:=patch -N -p0 --strip=1
#PATCH:=git apply
CURDIR ?= ${.CURDIR}
PATCH:=$(CURDIR)/../debian/tools/gitapply.sh
PATCH := $(CURDIR)/../debian/tools/gitapply.sh -d $(DESTDIR)
PATCHLIST := 00-Commandline.ok \
01-Address_Change_Notification.ok \
02-ACL_Extended_Attributes.ok \
04-XEMBED.ok \
05-Named_Pipe.ok \
06-winepulse.ok \
07-GetVolumePathName.ok \
08-Junction_Points.ok \
09-TransmitFile.ok \
10-Missing_Fonts.ok \
12-FD_Cache.ok \
13-Misc_ACL.ok \
14-UrlCombineW.ok \
15-wtsapi32.ok \
16-server-CreateProcess_ACLs.ok \
17-strmbase-Lock_Race_Conditions.ok \
18-quartz-MediaSeeking_Positions.ok \
97-Pipelight.ok \
98-Miscellaneous.ok
.PHONY: install
install:
# Update the list of patches
cd $(CURDIR)/..; ./debian/tools/generate-patchlist.sh > $(CURDIR)/patch-list.patch;
@$(MAKE) apply; \
status=$$?; \
rm -f *.ok; \
exit $$status
# Apply our patches to Wine
cd $(DESTDIR); \
for DIR in $$(find $(CURDIR) -type d | sort); do \
for FILE in $$(ls $$DIR | sort | grep '\.patch$$'); do \
SHORTNAME=$$(echo "$$DIR/$$FILE" | sed 's|$(CURDIR)|\.|g' ); \
printf "Applying patch '$$SHORTNAME'...\n"; \
$(PATCH) < $$DIR/$$FILE || exit 1; \
done \
done
.PHONY: apply
apply: $(PATCHLIST)
cat *.ok | sort | $(CURDIR)/../debian/tools/patchlist.sh | $(PATCH)
cd $(DESTDIR) && autoreconf -f
cd $(DESTDIR) && ./tools/make_requests
# Update the configure script
cd $(DESTDIR); autoreconf -f;
.PHONY: clean
clean:
rm -f *.ok
# Update the wineserver protocol request data
cd $(DESTDIR); ./tools/make_requests;
.NOTPARALLEL:
uninstall:
# Remove our patches from Wine
cd $(DESTDIR); \
for DIR in $$(find $(CURDIR) -type d | sort -r); do \
for FILE in $$(ls $$DIR | sort -r | grep '\.patch$$'); do \
SHORTNAME=$$(echo "$$DIR/$$FILE" | sed 's|$(CURDIR)|\.|g' ); \
printf "Reversing patch '$$SHORTNAME'...\n"; \
$(PATCH) -R < $$DIR/$$FILE || exit 1; \
done \
done
# Patchset 00-Commandline
# |
# | Included patches:
# | * Add commandline option --patches to show the patch list. [by Sebastian Lackner]
# | * Add commandline option --check-libs to test if shared libraries are installed. [by Michael Müller]
# |
# | Modified files:
# | * dlls/ntdll/misc.c, dlls/ntdll/ntdll.spec, include/wine/library.h, libs/wine/config.c, libs/wine/loader.c,
# | libs/wine/wine.def, libs/wine/wine.map, loader/main.c
# |
00-Commandline.ok:
$(PATCH) < 00-Commandline/0001-loader-Add-commandline-option-patches-to-show-the-pa.patch
$(PATCH) < 00-Commandline/0002-loader-Add-commandline-option-check-libs.patch
( \
echo "+ { \"00-Commandline\", \"Sebastian Lackner\", \"Add commandline option --patches to show the patch list.\" },"; \
echo "+ { \"00-Commandline\", \"Michael Müller\", \"Add commandline option --check-libs to test if shared libraries are installed.\" },"; \
) > 00-Commandline.ok
# Update the configure script
cd $(DESTDIR); autoreconf;
# Patchset 01-Address_Change_Notification
# |
# | Included patches:
# | * Implement SIO_ADDRESS_LIST_CHANGE. [rev 2, by Erich E. Hoover]
# |
# | This patchset fixes the following Wine bugs:
# | * [#32328] Many .NET and Silverlight applications require SIO_ADDRESS_LIST_CHANGE for interface change notifications
# |
# | Modified files:
# | * dlls/ws2_32/tests/sock.c, server/event.c, server/named_pipe.c, server/object.h, server/sock.c
# |
01-Address_Change_Notification.ok:
$(PATCH) < 01-Address_Change_Notification/0001-server-Implement-socket-specific-ioctl-routine.patch
$(PATCH) < 01-Address_Change_Notification/0002-server-Add-socket-side-support-for-the-interface-cha.patch
$(PATCH) < 01-Address_Change_Notification/0003-server-Add-blocked-support-for-SIO_ADDRESS_LIST_CHAN.patch
$(PATCH) < 01-Address_Change_Notification/0004-server-Implement-the-interface-change-notification-o.patch
$(PATCH) < 01-Address_Change_Notification/0005-ws2_32-Add-an-interactive-test-for-interface-change-.patch
( \
echo "+ { \"01-Address_Change_Notification\", \"Erich E. Hoover\", \"Implement SIO_ADDRESS_LIST_CHANGE. [rev 2]\" },"; \
) > 01-Address_Change_Notification.ok
# Update the wineserver protocol request data
cd $(DESTDIR); ./tools/make_requests;
# Patchset 02-ACL_Extended_Attributes
# |
# | Included patches:
# | * Store and return security attributes with extended file attributes. [rev 6, by Erich E. Hoover]
# |
# | This patchset fixes the following Wine bugs:
# | * [#31858] Netflix on Firefox fails with Internet Connection Problem when loading bar is at 99%
# | * [#34406] Finale Notepad 2012 doesn't copy/create user files on program start
# |
# | Modified files:
# | * configure.ac, dlls/advapi32/tests/security.c, dlls/shell32/shellpath.c, include/winnt.h, server/change.c, server/fd.c,
# | server/file.c, server/file.h
# |
02-ACL_Extended_Attributes.ok:
$(PATCH) < 02-ACL_Extended_Attributes/0001-server-Unify-the-storage-of-security-attributes-for-.patch
$(PATCH) < 02-ACL_Extended_Attributes/0002-server-Unify-the-retrieval-of-security-attributes-fo.patch
$(PATCH) < 02-ACL_Extended_Attributes/0003-server-Store-file-security-attributes-with-extended-.patch
$(PATCH) < 02-ACL_Extended_Attributes/0004-server-Store-user-and-group-inside-stored-extended-f.patch
$(PATCH) < 02-ACL_Extended_Attributes/0005-server-Retrieve-file-security-attributes-with-extend.patch
$(PATCH) < 02-ACL_Extended_Attributes/0006-server-Convert-return-of-file-security-masks-with-ge.patch
$(PATCH) < 02-ACL_Extended_Attributes/0007-server-Inherit-security-attributes-from-parent-direc.patch
$(PATCH) < 02-ACL_Extended_Attributes/0008-server-Inherit-security-attributes-from-parent-direc.patch
$(PATCH) < 02-ACL_Extended_Attributes/0009-shell32-Set-the-default-security-attributes-for-user.patch
$(PATCH) < 02-ACL_Extended_Attributes/0010-server-Add-compatibility-code-for-handling-the-old-m.patch
( \
echo "+ { \"02-ACL_Extended_Attributes\", \"Erich E. Hoover\", \"Store and return security attributes with extended file attributes. [rev 6]\" },"; \
) > 02-ACL_Extended_Attributes.ok
# Patchset 04-XEMBED
# |
# | Included patches:
# | * Enable/disable windows when they are (un)mapped by foreign applications. [by Sebastian Lackner]
# | * Update gl_drawable for embedded windows. [by Sebastian Lackner]
# |
# | Modified files:
# | * dlls/winex11.drv/event.c, dlls/winex11.drv/window.c
# |
04-XEMBED.ok:
$(PATCH) < 04-XEMBED/0001-winex11-Update-gl_drawable-for-embedded-windows.patch
$(PATCH) < 04-XEMBED/0002-winex11-Enable-disable-windows-when-they-are-un-mapped.patch
( \
echo "+ { \"04-XEMBED\", \"Sebastian Lackner\", \"Enable/disable windows when they are (un)mapped by foreign applications.\" },"; \
echo "+ { \"04-XEMBED\", \"Sebastian Lackner\", \"Update gl_drawable for embedded windows.\" },"; \
) > 04-XEMBED.ok
# Patchset 05-Named_Pipe
# |
# | Included patches:
# | * Change return value of stub SetNamedPipeHandleState to TRUE. [by Sebastian Lackner]
# |
# | This patchset fixes the following Wine bugs:
# | * [#17273] Many apps and games need SetNamedPipeHandleState implementation (support for named pipe message
# | mode)(FireFox+Flash, Win8/NET 4.x SDK/vcrun2012, WiX installers)
# |
# | Modified files:
# | * dlls/kernel32/sync.c
# |
05-Named_Pipe.ok:
$(PATCH) < 05-Named_Pipe/0001-kernel32-Change-return-value-of-stub-SetNamedPipeHandl.patch
( \
echo "+ { \"05-Named_Pipe\", \"Sebastian Lackner\", \"Change return value of stub SetNamedPipeHandleState to TRUE.\" },"; \
) > 05-Named_Pipe.ok
# Patchset 06-winepulse
# |
# | Included patches:
# | * Winepulse patches extracted from https://launchpad.net/~ubuntu-
# | wine/+archive/ubuntu/ppa/+files/wine1.7_1.7.21-0ubuntu1~ppa1.debian.tar.gz. [rev 4, by Maarten Lankhorst]
# |
# | Modified files:
# | * configure.ac, dlls/mmdevapi/main.c, dlls/mmdevapi/tests/render.c, dlls/winepulse.drv/Makefile.in,
# | dlls/winepulse.drv/mmdevdrv.c, dlls/winepulse.drv/winepulse.drv.spec, dlls/winmm/lolvldrv.c
# |
06-winepulse.ok:
$(PATCH) < 06-winepulse/0001-winmm-Load-winealsa-if-winepulse-is-found.patch
$(PATCH) < 06-winepulse/0002-winepulse-Add-initial-stub-for-pulseaudio-support.patch
$(PATCH) < 06-winepulse/0003-winepulse-Add-format-and-period-probing.patch
$(PATCH) < 06-winepulse/0004-winepulse-Add-audioclient.patch
$(PATCH) < 06-winepulse/0005-winepulse-Add-IAudioRenderClient-and-IAudioCaptureCl.patch
$(PATCH) < 06-winepulse/0006-winepulse-Add-IAudioClock-and-IAudioClock2.patch
$(PATCH) < 06-winepulse/0007-winepulse-Add-audiostreamvolume.patch
$(PATCH) < 06-winepulse/0008-winepulse-Add-session-support.patch
$(PATCH) < 06-winepulse/0009-fix-fdels-trailing-whitespaces.patch
$(PATCH) < 06-winepulse/0010-winepulse-v12.patch
$(PATCH) < 06-winepulse/0011-winepulse-v15-Add-support-for-missing-formats-and-si.patch
$(PATCH) < 06-winepulse/0012-winepulse-v16-Add-official-warning-wine-doesn-t-want.patch
$(PATCH) < 06-winepulse/0013-winepulse-v17-Fix-winmm-tests.patch
$(PATCH) < 06-winepulse/0014-winepulse-v18-Latency-and-compilation-improvements.patch
$(PATCH) < 06-winepulse/0015-winepulse-API-Compatibility-with-1.5.2-onward-v2.patch
$(PATCH) < 06-winepulse/0016-winepulse-Fix-low-latency-support.patch
$(PATCH) < 06-winepulse/0017-winepulse-drop-realtime-priority-before-thread-destr.patch
$(PATCH) < 06-winepulse/0018-winepulse-remove-bogus-SetEvent-from-pulse_started_c.patch
$(PATCH) < 06-winepulse/0019-winepulse-disable-the-setevent-part-of-the-latency-h.patch
$(PATCH) < 06-winepulse/0020-winepulse-v20-fix-the-checks-in-IsFormatSupported.patch
$(PATCH) < 06-winepulse/0021-winepulse-fixup-IsFormatSupported-calls.patch
$(PATCH) < 06-winepulse/0022-winepulse-v21-return-early-if-padding-didn-t-update.patch
$(PATCH) < 06-winepulse/0023-winepulse-fix-unneeded-free-in-write.patch
$(PATCH) < 06-winepulse/0024-winepulse-v23-fixup-a-invalid-free-in-mmdevapi.patch
$(PATCH) < 06-winepulse/0025-winepulse-use-a-pi-mutex-for-serialization.patch
$(PATCH) < 06-winepulse/0026-winepulse-add-support-for-IMarshal.patch
$(PATCH) < 06-winepulse/0027-winepulse-handle-stream-create-failing-correctly.patch
( \
echo "+ { \"06-winepulse\", \"Maarten Lankhorst\", \"Winepulse patches extracted from https://launchpad.net/~ubuntu-wine/+archive/ubuntu/ppa/+files/wine1.7_1.7.21-0ubuntu1~ppa1.debian.tar.gz. [rev 4]\" },"; \
) > 06-winepulse.ok
# Patchset 07-GetVolumePathName
# |
# | Included patches:
# | * Implement GetVolumePathName. [by Erich E. Hoover]
# |
# | Modified files:
# | * dlls/kernel32/tests/volume.c, dlls/kernel32/volume.c
# |
07-GetVolumePathName.ok:
$(PATCH) < 07-GetVolumePathName/0001-kernel32-Implement-GetVolumePathName.patch
$(PATCH) < 07-GetVolumePathName/0002-kernel32-Convert-GetVolumePathName-tests-into-a-list.patch
$(PATCH) < 07-GetVolumePathName/0003-kernel32-Add-a-bunch-more-GetVolumePathName-tests.patch
( \
echo "+ { \"07-GetVolumePathName\", \"Erich E. Hoover\", \"Implement GetVolumePathName.\" },"; \
) > 07-GetVolumePathName.ok
# Patchset 08-Junction_Points
# |
# | Included patches:
# | * Support for junction points/reparse points. [by Erich E. Hoover]
# |
# | This patchset fixes the following Wine bugs:
# | * [#12401] Support junction points, i.e. DeviceIoCtl(FSCTL_SET_REPARSE_POINT/FSCTL_GET_REPARSE_POINT)
# |
# | Modified files:
# | * dlls/kernel32/path.c, dlls/kernel32/volume.c, dlls/ntdll/file.c, dlls/ntdll/tests/file.c, include/ntifs.h
# |
08-Junction_Points.ok:
$(PATCH) < 08-Junction_Points/0001-ntdll-Add-support-for-junction-point-creation.patch
$(PATCH) < 08-Junction_Points/0002-ntdll-Add-support-for-reading-junction-points.patch
$(PATCH) < 08-Junction_Points/0003-ntdll-Add-support-for-deleting-junction-points.patch
$(PATCH) < 08-Junction_Points/0004-ntdll-Advertise-that-a-file-is-a-junction-point.patch
$(PATCH) < 08-Junction_Points/0005-kernel32-ntdll-Add-support-for-deleting-junction-poi.patch
$(PATCH) < 08-Junction_Points/0006-kernel32-Advertise-junction-point-support.patch
$(PATCH) < 08-Junction_Points/0007-ntdll-tests-Add-test-for-deleting-junction-point-tar.patch
( \
echo "+ { \"08-Junction_Points\", \"Erich E. Hoover\", \"Support for junction points/reparse points.\" },"; \
) > 08-Junction_Points.ok
# Patchset 09-TransmitFile
# |
# | Included patches:
# | * Implement TransmitFile. [by Erich E. Hoover]
# |
# | This patchset fixes the following Wine bugs:
# | * [#5048] Multiple applications and games need support for ws2_32 SIO_GET_EXTENSION_FUNCTION_POINTER TransmitFile
# | (WSAID_TRANSMITFILE)
# |
# | Modified files:
# | * dlls/ws2_32/socket.c, dlls/ws2_32/tests/sock.c, include/winsock.h, server/protocol.def, server/sock.c
# |
09-TransmitFile.ok:
$(PATCH) < 09-TransmitFile/0001-ws2_32-Add-stub-for-TransmitFile.patch
$(PATCH) < 09-TransmitFile/0002-ws2_32-Check-for-invalid-parameters-in-TransmitFile.patch
$(PATCH) < 09-TransmitFile/0003-ws2_32-Implement-a-basic-synchronous-TransmitFile.patch
$(PATCH) < 09-TransmitFile/0004-ws2_32-Add-asynchronous-support-for-TransmitFile.patch
$(PATCH) < 09-TransmitFile/0005-ws2_32-Add-support-for-TF_DISCONNECT-and-TF_REUSE_SO.patch
( \
echo "+ { \"09-TransmitFile\", \"Erich E. Hoover\", \"Implement TransmitFile.\" },"; \
) > 09-TransmitFile.ok
# Patchset 10-Missing_Fonts
# |
# | Included patches:
# | * Implement missing Arial font expected by Silverlight. [by Torsten Kurbad]
# |
# | This patchset fixes the following Wine bugs:
# | * [#32323] Netflix (Silverlight 4.x) and several .NET Framework 3.x/4.0 WPF apps require either Arial or Verdana to be
# | installed
# |
# | Modified files:
# | * fonts/Makefile.in, fonts/arial.sfd, fonts/arial.ttf
# |
10-Missing_Fonts.ok:
$(PATCH) < 10-Missing_Fonts/0001-fonts-Add-Liberation-Sans-as-an-Arial-replacement.patch
( \
echo "+ { \"10-Missing_Fonts\", \"Torsten Kurbad\", \"Implement missing Arial font expected by Silverlight.\" },"; \
) > 10-Missing_Fonts.ok
# Patchset 12-FD_Cache
# |
# | Included patches:
# | * Use lockfree implementation for get_cached_fd. [rev 4, by Sebastian Lackner]
# |
# | Modified files:
# | * dlls/ntdll/server.c
# |
12-FD_Cache.ok:
$(PATCH) < 12-FD_Cache/0001-ntdll-Use-lockfree-implementation-for-get_cached_fd.patch
( \
echo "+ { \"12-FD_Cache\", \"Sebastian Lackner\", \"Use lockfree implementation for get_cached_fd. [rev 4]\" },"; \
) > 12-FD_Cache.ok
# Patchset 13-Misc_ACL
# |
# | Included patches:
# | * Add default security descriptor ownership and DACLs for processes. [by Erich E. Hoover]
# |
# | This patchset fixes the following Wine bugs:
# | * [#15980] Rhapsody 2 crashes on startup (GetSecurityInfo returns NULL DACL for process object)
# |
# | Modified files:
# | * dlls/advapi32/tests/security.c, server/process.c, server/security.h, server/token.c
# |
13-Misc_ACL.ok:
$(PATCH) < 13-Misc_ACL/0001-server-Add-default-security-descriptor-ownership-for.patch
$(PATCH) < 13-Misc_ACL/0002-server-Add-default-security-descriptor-DACL-for-proc.patch
( \
echo "+ { \"13-Misc_ACL\", \"Erich E. Hoover\", \"Add default security descriptor ownership and DACLs for processes.\" },"; \
) > 13-Misc_ACL.ok
# Patchset 14-UrlCombineW
# |
# | Included patches:
# | * Workaround for broken implementation of shlwapi url functions. [by Sebastian Lackner]
# |
# | Modified files:
# | * dlls/shlwapi/tests/url.c, dlls/shlwapi/url.c
# |
14-UrlCombineW.ok:
$(PATCH) < 14-UrlCombineW/0001-shlwapi-tests-Add-additional-tests-for-UrlCombine-and-.patch
$(PATCH) < 14-UrlCombineW/0002-shlwapi-UrlCombineW-workaround-for-relative-paths.patch
( \
echo "+ { \"14-UrlCombineW\", \"Sebastian Lackner\", \"Workaround for broken implementation of shlwapi url functions.\" },"; \
) > 14-UrlCombineW.ok
# Patchset 15-wtsapi32
# |
# | Included patches:
# | * Partial implementation of WTSEnumerateProcessesW. [by Sebastian Lackner]
# |
# | This patchset fixes the following Wine bugs:
# | * [#29903] Some Microsoft debuggers fail to enumerate processes due to wtsapi32.WTSEnumerateProcessesW() being a stub
# | (Microsoft Visual Studio 2005, DbgCLR from .NET 2.0 SDK)
# |
# | Modified files:
# | * dlls/wtsapi32/tests/wtsapi.c, dlls/wtsapi32/wtsapi32.c
# |
15-wtsapi32.ok:
$(PATCH) < 15-wtsapi32/0001-wtsapi32-Partial-implementation-of-WTSEnumerateProce.patch
( \
echo "+ { \"15-wtsapi32\", \"Sebastian Lackner\", \"Partial implementation of WTSEnumerateProcessesW.\" },"; \
) > 15-wtsapi32.ok
# Patchset 16-server-CreateProcess_ACLs
# |
# | Included patches:
# | * Implement passing ACLs to CreateProcess. [by Joris van der Wel]
# |
# | This patchset fixes the following Wine bugs:
# | * [#22006] OpenProcess does not enforce ACL
# |
# | Modified files:
# | * dlls/advapi32/tests/security.c, dlls/kernel32/process.c, server/object.c, server/object.h, server/process.c,
# | server/protocol.def
# |
16-server-CreateProcess_ACLs.ok:
$(PATCH) < 16-server-CreateProcess_ACLs/0001-server-A-new-function-set_sd_defaults_from_token-try.patch
$(PATCH) < 16-server-CreateProcess_ACLs/0002-server-Support-sending-process-and-thread-security-d.patch
$(PATCH) < 16-server-CreateProcess_ACLs/0003-server-implement-passing-a-process-security-descript.patch
$(PATCH) < 16-server-CreateProcess_ACLs/0004-server-implement-passing-a-thread-security-descripto.patch
( \
echo "+ { \"16-server-CreateProcess_ACLs\", \"Joris van der Wel\", \"Implement passing ACLs to CreateProcess.\" },"; \
) > 16-server-CreateProcess_ACLs.ok
# Patchset 17-strmbase-Lock_Race_Conditions
# |
# | Included patches:
# | * Fix possible race conditions in strmbase/quartz. [by Erich E. Hoover]
# |
# | This patchset fixes the following Wine bugs:
# | * [#31566] Fallout 3: regression causes block at critical section when radio is enabled
# |
# | Modified files:
# | * dlls/quartz/dsoundrender.c, dlls/quartz/videorenderer.c, dlls/strmbase/renderer.c
# |
17-strmbase-Lock_Race_Conditions.ok:
$(PATCH) < 17-strmbase-Lock_Race_Conditions/0001-strmbase-Fix-race-condition-on-InputPin_BeginFlush-b.patch
$(PATCH) < 17-strmbase-Lock_Race_Conditions/0002-strmbase-Fix-race-condition-on-InputPin_EndFlush-bet.patch
$(PATCH) < 17-strmbase-Lock_Race_Conditions/0003-strmbase-Fix-race-condition-on-InputPin_EndOfStream-.patch
$(PATCH) < 17-strmbase-Lock_Race_Conditions/0004-quartz-Fix-race-condition-on-EndOfStream-between-csR.patch
$(PATCH) < 17-strmbase-Lock_Race_Conditions/0005-quartz-Fix-race-condition-on-EndFlush-between-csRend.patch
$(PATCH) < 17-strmbase-Lock_Race_Conditions/0006-quartz-Fix-race-condition-between-EndOfStream-and-Pa.patch
( \
echo "+ { \"17-strmbase-Lock_Race_Conditions\", \"Erich E. Hoover\", \"Fix possible race conditions in strmbase/quartz.\" },"; \
) > 17-strmbase-Lock_Race_Conditions.ok
# Patchset 18-quartz-MediaSeeking_Positions
# |
# | Included patches:
# | * Return correct IMediaSeeking stream positions in quartz. [by Erich E. Hoover]
# |
# | This patchset fixes the following Wine bugs:
# | * [#23174] Fallout 3: Diologue and Video/sound issues
# |
# | Modified files:
# | * dlls/quartz/filtergraph.c
# |
18-quartz-MediaSeeking_Positions.ok:
$(PATCH) < 18-quartz-MediaSeeking_Positions/0001-quartz-Include-the-stream-position-in-addition-to-th.patch
$(PATCH) < 18-quartz-MediaSeeking_Positions/0002-quartz-Implement-MediaSeeking_GetCurrentPosition-on-.patch
$(PATCH) < 18-quartz-MediaSeeking_Positions/0003-quartz-Implement-MediaSeeking_GetStopPosition-on-top.patch
$(PATCH) < 18-quartz-MediaSeeking_Positions/0004-quartz-Remove-unused-cache-of-MediaSeeking-stop-posi.patch
( \
echo "+ { \"18-quartz-MediaSeeking_Positions\", \"Erich E. Hoover\", \"Return correct IMediaSeeking stream positions in quartz.\" },"; \
) > 18-quartz-MediaSeeking_Positions.ok
# Patchset 97-Pipelight
# |
# | Included patches:
# | * Decrease minimum SetTimer interval to 5 ms. [rev 2, by Michael Müller]
# | * Allow changing strict draw ordering through an exported function. [by Michael Müller]
# | * Indicate direct rendering through OpenGL extension. [by Michael Müller]
# | * Implement X11DRV_FLUSH_GDI_DISPLAY ExtEscape command. [by Sebastian Lackner]
# |
# | Modified files:
# | * dlls/user32/message.c, dlls/wined3d/wined3d.spec, dlls/wined3d/wined3d_main.c, dlls/winex11.drv/init.c,
# | dlls/winex11.drv/opengl.c, dlls/winex11.drv/x11drv.h
# |
97-Pipelight.ok:
$(PATCH) < 97-Pipelight/0001-winex11-Implement-X11DRV_FLUSH_GDI_DISPLAY-ExtEscape-c.patch
$(PATCH) < 97-Pipelight/0002-user32-Decrease-minimum-SetTimer-interval-to-5-ms.patch
$(PATCH) < 97-Pipelight/0003-wined3d-allow-changing-strict-drawing-through-an-exp.patch
$(PATCH) < 97-Pipelight/0004-winex11.drv-Indicate-direct-rendering-through-OpenGL.patch
( \
echo "+ { \"97-Pipelight\", \"Michael Müller\", \"Decrease minimum SetTimer interval to 5 ms. [rev 2]\" },"; \
echo "+ { \"97-Pipelight\", \"Michael Müller\", \"Allow changing strict draw ordering through an exported function.\" },"; \
echo "+ { \"97-Pipelight\", \"Michael Müller\", \"Indicate direct rendering through OpenGL extension.\" },"; \
echo "+ { \"97-Pipelight\", \"Sebastian Lackner\", \"Implement X11DRV_FLUSH_GDI_DISPLAY ExtEscape command.\" },"; \
) > 97-Pipelight.ok
# Patchset 98-Miscellaneous
# |
# | Included patches:
# | * kernel32: Silence repeated CompareStringEx FIXME. [by Sebastian Lackner]
# | * wined3d: Silence repeated resource_check_usage FIXME. [rev 2, by Erich E. Hoover]
# | * wined3d: Silence repeated wined3d_swapchain_present FIXME. [by Sebastian Lackner]
# |
# | Modified files:
# | * dlls/kernel32/locale.c, dlls/wined3d/resource.c, dlls/wined3d/swapchain.c
# |
98-Miscellaneous.ok:
$(PATCH) < 98-Miscellaneous/0001-wined3d-Silence-repeated-resource_check_usage-FIXME.patch
$(PATCH) < 98-Miscellaneous/0002-kernel32-Silence-repeated-CompareStringEx-FIXME.patch
$(PATCH) < 98-Miscellaneous/0003-wined3d-Silence-repeated-wined3d_swapchain_present-F.patch
( \
echo "+ { \"98-Miscellaneous\", \"Sebastian Lackner\", \"kernel32: Silence repeated CompareStringEx FIXME.\" },"; \
echo "+ { \"98-Miscellaneous\", \"Erich E. Hoover\", \"wined3d: Silence repeated resource_check_usage FIXME. [rev 2]\" },"; \
echo "+ { \"98-Miscellaneous\", \"Sebastian Lackner\", \"wined3d: Silence repeated wined3d_swapchain_present FIXME.\" },"; \
) > 98-Miscellaneous.ok

View File

@ -1,91 +0,0 @@
From: "FDS-Team" <webmaster@fds-team.de>
Subject: Autogenerated patch list.
---
diff --git a/libs/wine/config.c b/libs/wine/config.c
index a273502..5fa0cd5 100644
--- a/libs/wine/config.c
+++ b/libs/wine/config.c
@@ -478,6 +478,46 @@ const char *wine_get_version(void)
return PACKAGE_VERSION;
}
+struct wine_patch {
+ const char *hash;
+ const char *author;
+ const char *title;
+} wine_patch_data[] = {
+ { "1b7ac850-5040-4d9e-8fde-9c483c3baf33:1", "Sebastian Lackner", "Add commandline option --patches to show the patch list." },
+ { "9e9a58e1-b226-4d4d-943b-be9a4c1dc525:1", "Michael Müller", "Add commandline option --check-libs to test if shared libraries are installed." },
+ { "8a366b6d-8ad6-4581-8aa9-66a03590a57b:2", "Erich E. Hoover", "Implement SIO_ADDRESS_LIST_CHANGE." },
+ { "92938b89-506b-430a-ba50-32de8b286e56:6", "Erich E. Hoover", "Store and return security attributes with extended file attributes." },
+ { "5d6bb7b5-ec88-4ed3-907d-9ad2173a2f88:1", "Sebastian Lackner", "Enable/disable windows when they are (un)mapped by foreign applications." },
+ { "94186fff-6dbf-44d0-8eb1-2463d1608a0f:1", "Sebastian Lackner", "Update gl_drawable for embedded windows." },
+ { "cbe240e8-2c58-430a-b61c-7fbb9d0e1e11:1", "Sebastian Lackner", "Change return value of stub SetNamedPipeHandleState to TRUE." },
+ { "00273da7-72f8-4025-9e96-0c2bc95dacdb:3", "Maarten Lankhorst", "Winepulse patches extracted from https://launchpad.net/~ubuntu-wine/+archive/ppa/+files/wine1.7_1.7.19-0ubuntu2~trusty2.debian.tar.gz." },
+ { "fbea4ef6-85ac-4524-b32d-fc9882b73e5a:1", "Erich E. Hoover", "Implement GetVolumePathName." },
+ { "4cd13e94-7f2d-11e3-b5eb-0090f5c75ad5:1", "Erich E. Hoover", "Support for junction points/reparse points." },
+ { "5fb1f5c8-7f17-11e3-9b62-0090f5c75ad5:1", "Erich E. Hoover", "Implement TransmitFile." },
+ { "3d7c4774-9e7f-11e3-9cfc-0090f5c75ad5:1", "Torsten Kurbad", "Implement missing Arial font expected by Silverlight." },
+ { "e7581ed7-12b3-4ed3-835b-5a62afbf9c85:4", "Sebastian Lackner", "Use lockfree implementation for get_cached_fd." },
+ { "3405aa34-f341-11e3-83ce-0090f5c75ad5:1", "Erich E. Hoover", "Add default security descriptor ownership and DACLs for processes." },
+ { "e46b26df-3c1b-419c-9579-f0d1e1c50bea:1", "Sebastian Lackner", "Workaround for broken implementation of shlwapi url functions." },
+ { "3790a2d5-f930-423e-9c03-f7fc1c1e0811:1", "Sebastian Lackner", "Partial implementation of WTSEnumerateProcessesW." },
+ { "a3f43350-092c-11e4-9b1e-0090f5c75ad5:1", "Joris van der Wel", "Implement passing ACLs to CreateProcess." },
+ { "c64ef9a8-0dd2-11e4-ab01-0090f5c75ad5:1", "Erich E. Hoover", "Fix possible race conditions in strmbase/quartz." },
+ { "748e5166-11ad-11e4-ae23-0090f5c75ad5:1", "Erich E. Hoover", "Return correct IMediaSeeking stream positions in quartz." },
+ { "0b21d7ac-0387-4493-aa38-fbafe3e749f5:2", "Michael Müller", "Decrease minimum SetTimer interval to 5 ms." },
+ { "2394843e-2bc4-4fa4-8368-1ef32093b89e:1", "Michael Müller", "Allow changing strict draw ordering through an exported function." },
+ { "255473fa-4e0a-4f51-952b-4deecc1a2181:1", "Michael Müller", "Indicate direct rendering through OpenGL extension." },
+ { "59bd38b7-bbdc-4cfd-9ccd-1c72c4ed84c0:1", "Sebastian Lackner", "Implement X11DRV_FLUSH_GDI_DISPLAY ExtEscape command." },
+ { "325645ba-d39d-4de4-9c94-3fe694eedaab:1", "Sebastian Lackner", "kernel32: Silence repeated CompareStringEx FIXME." },
+ { "acff3012-0f75-4710-9941-08b5ce4c61f3:2", "Erich E. Hoover", "wined3d: Silence repeated resource_check_usage FIXME." },
+ { "c7263660-be78-439b-979f-e745a8d87120:1", "Sebastian Lackner", "wined3d: Silence repeated wined3d_swapchain_present FIXME." },
+ { NULL, NULL, NULL }
+};
+
+/* 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;
diff --git a/include/wine/library.h b/include/wine/library.h
index 242bb69..aa9e585 100644
--- 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 );

View File

@ -2,12 +2,12 @@
# Installation: ln -s ../../precommit-hook.sh .git/hooks/pre-commit
git diff --cached --name-status | while read status file; do
if [[ "$file" =~ ^patches/ ]] || [[ "$file" =~ ^debian/tools/generate-patchlist.sh$ ]]; then
if [[ "$file" =~ ^patches/ ]] || [[ "$file" =~ ^debian/tools/ ]] || [[ "$file" =~ ^debian/changelog ]]; then
echo ""
echo "*** GENERATING patch-list.patch ***"
echo "*** UPDATING AUTOGENERATED FILES ***"
echo ""
debian/tools/generate-patchlist.sh > patches/patch-list.patch || exit 1
git add patches/patch-list.patch || exit 1
debian/tools/patchupdate.py || exit 1
git add patches/Makefile README.md || exit 1
break;
fi
done