James Hawkins : msi:
Only remove a file if the version to be installed is strictly newer
than the old file .
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Aug 11 04:58:47 CDT 2006
Module: wine
Branch: master
Commit: 5d37be9e56e9b875142a93a7af0671f2d9bc2947
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=5d37be9e56e9b875142a93a7af0671f2d9bc2947
Author: James Hawkins <truiken at gmail.com>
Date: Thu Aug 10 13:53:08 2006 -0700
msi: Only remove a file if the version to be installed is strictly newer than the old file.
---
dlls/msi/files.c | 24 ++++++++++++++++++++++++
dlls/msi/tests/package.c | 11 ++++-------
2 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/dlls/msi/files.c b/dlls/msi/files.c
index 443e6c3..7f1c4db 100644
--- a/dlls/msi/files.c
+++ b/dlls/msi/files.c
@@ -823,6 +823,24 @@ UINT ACTION_DuplicateFiles(MSIPACKAGE *p
return rc;
}
+/* compares the version of a file read from the filesystem and
+ * the version specified in the File table
+ */
+static int msi_compare_file_version( MSIFILE *file )
+{
+ WCHAR version[MAX_PATH];
+ DWORD size;
+ UINT r;
+
+ size = MAX_PATH;
+ version[0] = '\0';
+ r = MsiGetFileVersionW( file->TargetPath, version, &size, NULL, NULL );
+ if ( r != ERROR_SUCCESS )
+ return 0;
+
+ return lstrcmpW( version, file->Version );
+}
+
UINT ACTION_RemoveFiles( MSIPACKAGE *package )
{
MSIFILE *file;
@@ -843,6 +861,12 @@ UINT ACTION_RemoveFiles( MSIPACKAGE *pac
if ( file->state != msifs_present )
continue;
+ /* only remove a file if the version to be installed
+ * is strictly newer than the old file
+ */
+ if ( msi_compare_file_version( file ) >= 0 )
+ continue;
+
TRACE("removing %s\n", debugstr_w(file->File) );
if ( !DeleteFileW( file->TargetPath ) )
ERR("failed to delete %s\n", debugstr_w(file->TargetPath) );
diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c
index 3ff7b0f..55b2e1c 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -1938,13 +1938,10 @@ static void test_removefiles(void)
r = MsiDoAction( hpkg, "RemoveFiles");
ok( r == ERROR_SUCCESS, "remove files failed\n");
- todo_wine
- {
- ok(DeleteFileA("hydrogen.txt"), "Expected hydrogen.txt to exist\n");
- ok(DeleteFileA("lithium.txt"), "Expected lithium.txt to exist\n");
- ok(DeleteFileA("beryllium.txt"), "Expected beryllium.txt to exist\n");
- ok(DeleteFileA("carbon.txt"), "Expected carbon.txt to exist\n");
- }
+ ok(DeleteFileA("hydrogen.txt"), "Expected hydrogen.txt to exist\n");
+ ok(DeleteFileA("lithium.txt"), "Expected lithium.txt to exist\n");
+ ok(DeleteFileA("beryllium.txt"), "Expected beryllium.txt to exist\n");
+ ok(DeleteFileA("carbon.txt"), "Expected carbon.txt to exist\n");
ok(DeleteFileA("helium.txt"), "Expected helium.txt to exist\n");
ok(DeleteFileA("boron.txt"), "Expected boron.txt to exist\n");
More information about the wine-cvs
mailing list