msi: Remove empty directories as part of the RemoveFiles action.
This commit is contained in:
parent
9f303c8942
commit
fd5887e5a9
@ -597,11 +597,10 @@ static UINT ITERATE_RemoveFiles(MSIRECORD *row, LPVOID param)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
lstrcpyW(path, dir);
|
|
||||||
PathAddBackslashW(path);
|
|
||||||
|
|
||||||
if (filename)
|
if (filename)
|
||||||
{
|
{
|
||||||
|
lstrcpyW(path, dir);
|
||||||
|
PathAddBackslashW(path);
|
||||||
lstrcatW(path, filename);
|
lstrcatW(path, filename);
|
||||||
|
|
||||||
TRACE("Deleting misc file: %s\n", debugstr_w(path));
|
TRACE("Deleting misc file: %s\n", debugstr_w(path));
|
||||||
@ -609,8 +608,8 @@ static UINT ITERATE_RemoveFiles(MSIRECORD *row, LPVOID param)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TRACE("Removing misc directory: %s\n", debugstr_w(path));
|
TRACE("Removing misc directory: %s\n", debugstr_w(dir));
|
||||||
RemoveDirectoryW(path);
|
RemoveDirectoryW(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
@ -628,6 +627,9 @@ UINT ACTION_RemoveFiles( MSIPACKAGE *package )
|
|||||||
static const WCHAR query[] = {
|
static const WCHAR query[] = {
|
||||||
'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
|
'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
|
||||||
'`','R','e','m','o','v','e','F','i','l','e','`',0};
|
'`','R','e','m','o','v','e','F','i','l','e','`',0};
|
||||||
|
static const WCHAR folder_query[] = {
|
||||||
|
'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
|
||||||
|
'`','C','r','e','a','t','e','F','o','l','d','e','r','`',0};
|
||||||
|
|
||||||
r = MSI_DatabaseOpenViewW(package->db, query, &view);
|
r = MSI_DatabaseOpenViewW(package->db, query, &view);
|
||||||
if (r == ERROR_SUCCESS)
|
if (r == ERROR_SUCCESS)
|
||||||
@ -636,10 +638,14 @@ UINT ACTION_RemoveFiles( MSIPACKAGE *package )
|
|||||||
msiobj_release(&view->hdr);
|
msiobj_release(&view->hdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r = MSI_DatabaseOpenViewW(package->db, folder_query, &view);
|
||||||
|
if (r == ERROR_SUCCESS)
|
||||||
|
msiobj_release(&view->hdr);
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry )
|
LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry )
|
||||||
{
|
{
|
||||||
MSIRECORD *uirow;
|
MSIRECORD *uirow;
|
||||||
LPWSTR uipath, p;
|
LPWSTR dir, uipath, p;
|
||||||
|
|
||||||
if ( file->state == msifs_installed )
|
if ( file->state == msifs_installed )
|
||||||
ERR("removing installed file %s\n", debugstr_w(file->TargetPath));
|
ERR("removing installed file %s\n", debugstr_w(file->TargetPath));
|
||||||
@ -655,8 +661,17 @@ UINT ACTION_RemoveFiles( MSIPACKAGE *package )
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
TRACE("removing %s\n", debugstr_w(file->File) );
|
TRACE("removing %s\n", debugstr_w(file->File) );
|
||||||
if ( !DeleteFileW( file->TargetPath ) )
|
if (!DeleteFileW( file->TargetPath ))
|
||||||
TRACE("failed to delete %s\n", debugstr_w(file->TargetPath));
|
{
|
||||||
|
WARN("failed to delete %s\n", debugstr_w(file->TargetPath));
|
||||||
|
}
|
||||||
|
/* FIXME: check persistence for each directory */
|
||||||
|
else if (r && (dir = strdupW( file->TargetPath )))
|
||||||
|
{
|
||||||
|
if ((p = strrchrW( dir, '\\' ))) *p = 0;
|
||||||
|
RemoveDirectoryW( dir );
|
||||||
|
msi_free( dir );
|
||||||
|
}
|
||||||
file->state = msifs_missing;
|
file->state = msifs_missing;
|
||||||
|
|
||||||
/* the UI chunk */
|
/* the UI chunk */
|
||||||
|
@ -5139,11 +5139,8 @@ static void test_publish(void)
|
|||||||
/* no UnpublishFeatures */
|
/* no UnpublishFeatures */
|
||||||
r = MsiInstallProductA(msifile, "REMOVE=ALL");
|
r = MsiInstallProductA(msifile, "REMOVE=ALL");
|
||||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
ok(!pf_exists("msitest\\maximus"), "File deleted\n");
|
ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
|
||||||
todo_wine
|
ok(!pf_exists("msitest"), "Directory not deleted\n");
|
||||||
{
|
|
||||||
ok(!pf_exists("msitest"), "File deleted\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
|
state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
|
||||||
ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
|
ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
|
||||||
@ -5218,7 +5215,7 @@ static void test_publish(void)
|
|||||||
r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature");
|
r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature");
|
||||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
todo_wine ok(pf_exists("msitest\\maximus"), "File deleted\n");
|
todo_wine ok(pf_exists("msitest\\maximus"), "File deleted\n");
|
||||||
ok(pf_exists("msitest"), "File deleted\n");
|
todo_wine ok(pf_exists("msitest"), "Directory deleted\n");
|
||||||
|
|
||||||
state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
|
state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
|
||||||
ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
|
ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state);
|
||||||
@ -5322,10 +5319,7 @@ static void test_publish(void)
|
|||||||
r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature,montecristo");
|
r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature,montecristo");
|
||||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
|
ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
|
||||||
todo_wine
|
ok(!pf_exists("msitest"), "Directory not deleted\n");
|
||||||
{
|
|
||||||
ok(!pf_exists("msitest"), "File not deleted\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
|
state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
|
||||||
ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
|
ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
|
||||||
@ -5400,10 +5394,7 @@ static void test_publish(void)
|
|||||||
r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
|
r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
|
||||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
|
ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
|
||||||
todo_wine
|
ok(!pf_exists("msitest"), "Directory not deleted\n");
|
||||||
{
|
|
||||||
ok(!pf_exists("msitest"), "File not deleted\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
|
state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}");
|
||||||
ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
|
ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state);
|
||||||
@ -5617,10 +5608,7 @@ static void test_publishsourcelist(void)
|
|||||||
r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
|
r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL");
|
||||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
|
ok(!pf_exists("msitest\\maximus"), "File not deleted\n");
|
||||||
todo_wine
|
ok(!pf_exists("msitest"), "Directory not deleted\n");
|
||||||
{
|
|
||||||
ok(!pf_exists("msitest"), "File not deleted\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* make sure 'Program Files\msitest' is removed */
|
/* make sure 'Program Files\msitest' is removed */
|
||||||
delete_pfmsitest_files();
|
delete_pfmsitest_files();
|
||||||
@ -6977,10 +6965,7 @@ static void test_MsiConfigureProductEx(void)
|
|||||||
ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
|
||||||
ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
|
||||||
ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
|
||||||
todo_wine
|
ok(!delete_pf("msitest", FALSE), "Directory not removed\n");
|
||||||
{
|
|
||||||
ok(!delete_pf("msitest", FALSE), "File not removed\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* product has been removed */
|
/* product has been removed */
|
||||||
r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
|
r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
|
||||||
@ -7005,10 +6990,7 @@ static void test_MsiConfigureProductEx(void)
|
|||||||
ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
|
||||||
ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
|
||||||
ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
|
||||||
todo_wine
|
ok(!delete_pf("msitest", FALSE), "Directory not removed\n");
|
||||||
{
|
|
||||||
ok(!delete_pf("msitest", FALSE), "File not removed\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* product has been removed */
|
/* product has been removed */
|
||||||
r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
|
r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}",
|
||||||
@ -7035,10 +7017,7 @@ static void test_MsiConfigureProductEx(void)
|
|||||||
ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
|
||||||
ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
|
||||||
ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
|
||||||
todo_wine
|
ok(!delete_pf("msitest", FALSE), "Directory not removed\n");
|
||||||
{
|
|
||||||
ok(!delete_pf("msitest", FALSE), "File not removed\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
create_database(msifile, mcp_tables, sizeof(mcp_tables) / sizeof(msi_table));
|
create_database(msifile, mcp_tables, sizeof(mcp_tables) / sizeof(msi_table));
|
||||||
|
|
||||||
@ -7085,10 +7064,7 @@ static void test_MsiConfigureProductEx(void)
|
|||||||
ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
|
||||||
ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
|
||||||
ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
|
||||||
todo_wine
|
ok(!delete_pf("msitest", FALSE), "Directory not removed\n");
|
||||||
{
|
|
||||||
ok(!delete_pf("msitest", FALSE), "File not removed\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* install the product, machine */
|
/* install the product, machine */
|
||||||
r = MsiInstallProductA(msifile, "ALLUSERS=1 INSTALLLEVEL=10 PROPVAR=42");
|
r = MsiInstallProductA(msifile, "ALLUSERS=1 INSTALLLEVEL=10 PROPVAR=42");
|
||||||
@ -7149,10 +7125,7 @@ static void test_MsiConfigureProductEx(void)
|
|||||||
ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n");
|
||||||
ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
|
||||||
ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
|
||||||
todo_wine
|
|
||||||
{
|
|
||||||
ok(!delete_pf("msitest", FALSE), "File not removed\n");
|
ok(!delete_pf("msitest", FALSE), "File not removed\n");
|
||||||
}
|
|
||||||
|
|
||||||
DeleteFileA(msifile);
|
DeleteFileA(msifile);
|
||||||
RegCloseKey(source);
|
RegCloseKey(source);
|
||||||
@ -7191,10 +7164,7 @@ static void test_missingcomponent(void)
|
|||||||
ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n");
|
||||||
ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
|
ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n");
|
||||||
ok(!pf_exists("msitest\\beryllium"), "File installed\n");
|
ok(!pf_exists("msitest\\beryllium"), "File installed\n");
|
||||||
todo_wine
|
ok(!delete_pf("msitest", FALSE), "Directory not removed\n");
|
||||||
{
|
|
||||||
ok(!delete_pf("msitest", FALSE), "File not removed\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
DeleteFileA(msifile);
|
DeleteFileA(msifile);
|
||||||
DeleteFileA("msitest\\hydrogen");
|
DeleteFileA("msitest\\hydrogen");
|
||||||
@ -8268,7 +8238,7 @@ static void test_register_font(void)
|
|||||||
r = MsiInstallProductA(msifile, "REMOVE=ALL");
|
r = MsiInstallProductA(msifile, "REMOVE=ALL");
|
||||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
|
||||||
|
|
||||||
todo_wine ok(!delete_pf("msitest", FALSE), "directory not removed\n");
|
ok(!delete_pf("msitest", FALSE), "directory not removed\n");
|
||||||
|
|
||||||
ret = RegQueryValueExA(key, "msi test font", NULL, NULL, NULL, NULL);
|
ret = RegQueryValueExA(key, "msi test font", NULL, NULL, NULL, NULL);
|
||||||
ok(ret == ERROR_FILE_NOT_FOUND, "unexpected result %d\n", ret);
|
ok(ret == ERROR_FILE_NOT_FOUND, "unexpected result %d\n", ret);
|
||||||
@ -8362,7 +8332,7 @@ static void test_register_typelib(void)
|
|||||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
|
||||||
|
|
||||||
ok(!delete_pf("msitest\\typelib.dll", TRUE), "file not removed\n");
|
ok(!delete_pf("msitest\\typelib.dll", TRUE), "file not removed\n");
|
||||||
todo_wine ok(!delete_pf("msitest", FALSE), "directory not removed\n");
|
ok(!delete_pf("msitest", FALSE), "directory not removed\n");
|
||||||
|
|
||||||
delete_test_files();
|
delete_test_files();
|
||||||
}
|
}
|
||||||
@ -8425,7 +8395,7 @@ static void test_publish_components(void)
|
|||||||
ok(res == ERROR_FILE_NOT_FOUND, "unexpected result %d\n", res);
|
ok(res == ERROR_FILE_NOT_FOUND, "unexpected result %d\n", res);
|
||||||
|
|
||||||
ok(!delete_pf("msitest\\english.txt", TRUE), "file not removed\n");
|
ok(!delete_pf("msitest\\english.txt", TRUE), "file not removed\n");
|
||||||
todo_wine ok(!delete_pf("msitest", FALSE), "directory not removed\n");
|
ok(!delete_pf("msitest", FALSE), "directory not removed\n");
|
||||||
delete_test_files();
|
delete_test_files();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8529,7 +8499,7 @@ static void test_remove_registry_values(void)
|
|||||||
RegDeleteKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine");
|
RegDeleteKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine");
|
||||||
|
|
||||||
ok(!delete_pf("msitest\\registry.txt", TRUE), "file not removed\n");
|
ok(!delete_pf("msitest\\registry.txt", TRUE), "file not removed\n");
|
||||||
todo_wine ok(!delete_pf("msitest", FALSE), "directory not removed\n");
|
ok(!delete_pf("msitest", FALSE), "directory not removed\n");
|
||||||
delete_test_files();
|
delete_test_files();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user