summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEskil Heyn Olsen <eskil@eazel.com>2001-02-21 05:42:56 +0000
committerEskil Heyn Olsen <eskil@src.gnome.org>2001-02-21 05:42:56 +0000
commit690b999e959a47aea3bb16e934bed5e7095895f3 (patch)
tree42c073a28e948f5e43e59465bd9531d03e865c26
parent882daf039419be81b9873f4aad7b922e2dd66f43 (diff)
downloadnautilus-690b999e959a47aea3bb16e934bed5e7095895f3.tar.gz
reviewed in part by: Robey Pointer <robey@eazel.com>
2001-02-20 Eskil Heyn Olsen <eskil@eazel.com> reviewed in part by: Robey Pointer <robey@eazel.com> This patch fixes bug 6458, 5722, 6602, 6788 and 5826. Removed soft_depends from PacakgeData. This has some major changes in the logic, and (taaadaa) is fairly untestet because of the sorry state of the testservers these days. This will most likely no longer work with services.eazel.com, but only with the newest server code. * components/rpmview/nautilus-rpm-view-install.c: (get_detailed_errors_foreach), (get_detailed_errors): Fixed to parse PackageBreaks objects. * components/services/install/lib/eazel-install-logic2.c: (dump_tree_helper), (prune_failed_packages_helper), (eazel_install_check_existing_packages), (get_softcat_info), (is_satisfied), (is_satisfied_from_package_list), (is_satisfied_features), (check_dependencies_foreach), (check_dependencies), (check_tree_helper), (check_no_two_packages_has_same_file), (check_conflicts_against_already_installed_packages), (check_feature_consistency), (do_file_conflict_check), (do_dep_check_internal), (download_packages), (get_packages_with_mod_flag), (eazel_uninstall_upward_traverse), (eazel_uninstall_check_for_install), (eazel_uninstall_globber), (install_packages), (uninstall_packages): Ouput status in the tree dump. Improved the way I fail ALREADY_INSTALLED packages. Check the new package system error field in check_existing. Get_info don't check for fillflag to decide if softcat success was ok, since suites don't get the fillflag. Don't try and dedupe suite objects. Mark packages already installed with same version as CANCELLED. If a ALREADYINSTALLED package is cancelled due to install options (upgrade/downgrade), set a data field called "cancelled" to represent. Added a (currently not fully functional) check to see if a dependency is solved by the current work set (bug 6809). is_satisfied now uses is_satisfied_from_packages before checking if dependency is installed. Modified check_dependencies_foreach to pass around the package list. No longer do dependency check on cancelled packages (bug 6485). Don't package depcheck packages with suite_id, treat it's contents at comming toplevel packages. Output crack sentence when trying to revice PackageFeatureMissing breaks (file bug 6811) Don't file uniqueness or file conflict check suites. Fixed a bug in the feature_consistency, required a new query enum in eazelpackagesystem query call. Spewed out some comments. Always add children of a suite to K. Check download status (bug 5722) Commented out expand_package_suites. get_packages_with_mod_flag can now parse down into ->depends. Nicyfied debug output. * components/services/install/lib/eazel-install-protocols.c: (gnome_vfs_xfer_callback), (gnome_vfs_fetch_remote_file), (eazel_install_fetch_package): No longer use rpmvercmp. Define flag to make all downloads fail (to test failed downloads). Note when VFS is lying about bytes_copied. Removed some ancient code. * components/services/install/lib/eazel-install-xml-package-list.c: (parse_package), (eazel_install_packagedata_to_xml_int): Removed soft_depends. * components/services/install/lib/eazel-package-system-rpm3-private .h: * components/services/install/lib/eazel-package-system-rpm3.c: (eazel_package_system_rpm3_db_locked), (eazel_package_system_rpm3_dbs_locked), (eazel_package_system_rpm3_open_dbs), (eazel_package_system_rpm3_packagedata_fill_from_header), (eazel_package_system_rpm3_query_foreach), (eazel_package_system_rpm3_query_requires_feature), (eazel_package_system_rpm3_query), (eazel_package_system_rpm3_verify): Did the db lock check voodoo. Added REQUIRES_FEATURE query enum. Loads features from a given file (bug 5826) * components/services/install/lib/eazel-package-system-types.h: * components/services/install/lib/eazel-package-system-types.c: (packagedata_finalize), (packagedata_initialize), (packagedata_copy), (packagedata_fill_in_missing), (packagedata_remove_soft_dep), (packagedata_add_pack_to_depends), (eazel_install_package_name_compare), (packagedata_dump_int): Good bye soft_depends. * components/services/install/lib/eazel-package-system.c: (eazel_package_system_load_implementation), (eazel_package_system_load_package), (eazel_package_system_query), (eazel_package_system_fail_all_packages), (eazel_package_system_install), (eazel_package_system_uninstall), (eazel_package_system_verify), (eazel_package_system_initialize), (eazel_package_system_new_with_id): Fixed 6788. Added REQUIRES_FEATURE query enum. * components/services/install/lib/eazel-package-system.h: * components/services/install/lib/eazel-softcat.c: (eazel_softcat_get_info): Fixed some suite_id majick.
-rw-r--r--ChangeLog110
-rw-r--r--components/rpmview/nautilus-rpm-view-install.c18
-rw-r--r--components/services/docs/installer-rpm-cases6
-rw-r--r--components/services/install/lib/eazel-install-logic2.c516
-rw-r--r--components/services/install/lib/eazel-install-problem.c9
-rw-r--r--components/services/install/lib/eazel-install-protocols.c105
-rw-r--r--components/services/install/lib/eazel-install-xml-package-list.c9
-rw-r--r--components/services/install/lib/eazel-package-system-rpm3-private.h9
-rw-r--r--components/services/install/lib/eazel-package-system-rpm3.c164
-rw-r--r--components/services/install/lib/eazel-package-system-types.c24
-rw-r--r--components/services/install/lib/eazel-package-system-types.h4
-rw-r--r--components/services/install/lib/eazel-package-system.c97
-rw-r--r--components/services/install/lib/eazel-package-system.h20
-rw-r--r--components/services/install/lib/eazel-softcat.c57
14 files changed, 832 insertions, 316 deletions
diff --git a/ChangeLog b/ChangeLog
index 63bc2a727..8ca1a5073 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,113 @@
+2001-02-20 Eskil Heyn Olsen <eskil@eazel.com>
+
+ reviewed in part by: Robey Pointer <robey@eazel.com>
+
+ This patch fixes bug 6458, 5722, 6602, 6788 and 5826.
+ Removed soft_depends from PacakgeData.
+
+ This has some major changes in the logic, and (taaadaa) is fairly
+ untestet because of the sorry state of the testservers these
+ days. This will most likely no longer work with
+ services.eazel.com, but only with the newest server code.
+
+ * components/rpmview/nautilus-rpm-view-install.c:
+ (get_detailed_errors_foreach), (get_detailed_errors):
+ Fixed to parse PackageBreaks objects.
+
+ * components/services/install/lib/eazel-install-logic2.c:
+ (dump_tree_helper), (prune_failed_packages_helper),
+ (eazel_install_check_existing_packages), (get_softcat_info),
+ (is_satisfied), (is_satisfied_from_package_list),
+ (is_satisfied_features), (check_dependencies_foreach),
+ (check_dependencies), (check_tree_helper),
+ (check_no_two_packages_has_same_file),
+ (check_conflicts_against_already_installed_packages),
+ (check_feature_consistency), (do_file_conflict_check),
+ (do_dep_check_internal), (download_packages),
+ (get_packages_with_mod_flag), (eazel_uninstall_upward_traverse),
+ (eazel_uninstall_check_for_install), (eazel_uninstall_globber),
+ (install_packages), (uninstall_packages):
+ Ouput status in the tree dump.
+ Improved the way I fail ALREADY_INSTALLED packages.
+ Check the new package system error field in check_existing.
+ Get_info don't check for fillflag to decide if softcat success was
+ ok, since suites don't get the fillflag.
+ Don't try and dedupe suite objects.
+ Mark packages already installed with same version as CANCELLED.
+ If a ALREADYINSTALLED package is cancelled due to install options
+ (upgrade/downgrade), set a data field called "cancelled" to
+ represent.
+ Added a (currently not fully functional) check to see if a
+ dependency is solved by the current work set (bug 6809).
+ is_satisfied now uses is_satisfied_from_packages before checking
+ if dependency is installed.
+ Modified check_dependencies_foreach to pass around the package
+ list.
+ No longer do dependency check on cancelled packages (bug 6485).
+ Don't package depcheck packages with suite_id, treat it's contents
+ at comming toplevel packages.
+ Output crack sentence when trying to revice PackageFeatureMissing
+ breaks (file bug 6811)
+ Don't file uniqueness or file conflict check suites.
+ Fixed a bug in the feature_consistency, required a new query enum
+ in eazelpackagesystem query call.
+ Spewed out some comments.
+ Always add children of a suite to K.
+ Check download status (bug 5722)
+ Commented out expand_package_suites.
+ get_packages_with_mod_flag can now parse down into ->depends.
+ Nicyfied debug output.
+
+ * components/services/install/lib/eazel-install-protocols.c:
+ (gnome_vfs_xfer_callback), (gnome_vfs_fetch_remote_file),
+ (eazel_install_fetch_package):
+ No longer use rpmvercmp.
+ Define flag to make all downloads fail (to test failed downloads).
+ Note when VFS is lying about bytes_copied.
+ Removed some ancient code.
+
+ * components/services/install/lib/eazel-install-xml-package-list.c:
+ (parse_package), (eazel_install_packagedata_to_xml_int):
+ Removed soft_depends.
+
+ * components/services/install/lib/eazel-package-system-rpm3-private
+ .h:
+ * components/services/install/lib/eazel-package-system-rpm3.c:
+ (eazel_package_system_rpm3_db_locked),
+ (eazel_package_system_rpm3_dbs_locked),
+ (eazel_package_system_rpm3_open_dbs),
+ (eazel_package_system_rpm3_packagedata_fill_from_header),
+ (eazel_package_system_rpm3_query_foreach),
+ (eazel_package_system_rpm3_query_requires_feature),
+ (eazel_package_system_rpm3_query),
+ (eazel_package_system_rpm3_verify):
+ Did the db lock check voodoo.
+ Added REQUIRES_FEATURE query enum.
+ Loads features from a given file (bug 5826)
+
+ * components/services/install/lib/eazel-package-system-types.h:
+ * components/services/install/lib/eazel-package-system-types.c:
+ (packagedata_finalize), (packagedata_initialize),
+ (packagedata_copy), (packagedata_fill_in_missing),
+ (packagedata_remove_soft_dep), (packagedata_add_pack_to_depends),
+ (eazel_install_package_name_compare), (packagedata_dump_int):
+ Good bye soft_depends.
+
+ * components/services/install/lib/eazel-package-system.c:
+ (eazel_package_system_load_implementation),
+ (eazel_package_system_load_package), (eazel_package_system_query),
+ (eazel_package_system_fail_all_packages),
+ (eazel_package_system_install), (eazel_package_system_uninstall),
+ (eazel_package_system_verify), (eazel_package_system_initialize),
+ (eazel_package_system_new_with_id):
+ Fixed 6788.
+ Added REQUIRES_FEATURE query enum.
+
+ * components/services/install/lib/eazel-package-system.h:
+ * components/services/install/lib/eazel-softcat.c:
+ (eazel_softcat_get_info):
+ Fixed some suite_id majick.
+
2001-02-20 Gene Z. Ragan <gzr@eazel.com>
Fixed bug 6029, No option to mount zip drive in desktop menu.
diff --git a/components/rpmview/nautilus-rpm-view-install.c b/components/rpmview/nautilus-rpm-view-install.c
index 61ac5a488..949a378a8 100644
--- a/components/rpmview/nautilus-rpm-view-install.c
+++ b/components/rpmview/nautilus-rpm-view-install.c
@@ -92,8 +92,20 @@ nautilus_rpm_view_download_failed (EazelInstallCallback *service,
}
static void
-get_detailed_errors_foreach (const PackageData *pack, GString *message)
+get_detailed_errors_foreach (const gpointer data, GString *message)
{
+ PackageData *pack;
+
+ if (IS_PACKAGEDATA (data)) {
+ pack = PACKAGEDATA (data);
+ } else if (IS_PACKAGEBREAKS (data)) {
+ PackageBreaks *breakage = PACKAGEBREAKS (data);
+ pack = packagebreaks_get_package (breakage);
+ } else {
+ PackageDependency *dep = PACKAGEDEPENDENCY (data);
+ pack = dep->package;
+ }
+
switch (pack->status) {
case PACKAGE_UNKNOWN_STATUS:
case PACKAGE_CANCELLED:
@@ -122,7 +134,7 @@ get_detailed_errors_foreach (const PackageData *pack, GString *message)
case PACKAGE_RESOLVED:
break;
}
- g_list_foreach (pack->soft_depends, (GFunc)get_detailed_errors_foreach, message);
+ g_list_foreach (pack->depends, (GFunc)get_detailed_errors_foreach, message);
g_list_foreach (pack->modifies, (GFunc)get_detailed_errors_foreach, message);
g_list_foreach (pack->breaks, (GFunc)get_detailed_errors_foreach, message);
}
@@ -139,7 +151,7 @@ get_detailed_errors (const PackageData *pack, int installing)
} else {
g_string_sprintfa (message, _("Uninstalling %s failed because of the following issue(s):\n"), pack->name);
}
- g_list_foreach (pack->soft_depends, (GFunc)get_detailed_errors_foreach, message);
+ g_list_foreach (pack->depends, (GFunc)get_detailed_errors_foreach, message);
g_list_foreach (pack->modifies, (GFunc)get_detailed_errors_foreach, message);
g_list_foreach (pack->breaks, (GFunc)get_detailed_errors_foreach, message);
diff --git a/components/services/docs/installer-rpm-cases b/components/services/docs/installer-rpm-cases
index 694edb94a..359218ba9 100644
--- a/components/services/docs/installer-rpm-cases
+++ b/components/services/docs/installer-rpm-cases
@@ -103,3 +103,9 @@ name-version-release (A) (FILE_CONFLICT/UNTOUCHED)
\b-name-version-release (B) (FILE_CONFLICT/UNTOUCHED)
Problem : <A package> had a file conflict with <B package>
+
+---
+Description : updating package A will break B
+
+---
+Description :
diff --git a/components/services/install/lib/eazel-install-logic2.c b/components/services/install/lib/eazel-install-logic2.c
index 18bac4839..b8f9da6fa 100644
--- a/components/services/install/lib/eazel-install-logic2.c
+++ b/components/services/install/lib/eazel-install-logic2.c
@@ -84,13 +84,15 @@ dump_tree_helper (GList *packages, char *indent, GList *path, GList **touched)
name,
pack->eazel_id);
} else {
- trilobite_debug ("%s%p (%s) %s %s%s %s",
+ trilobite_debug ("%s%p (%s) %s %s%s %s %s",
indent,
pack,
name,
pack->eazel_id,
- (pack->fillflag & MUST_HAVE) ? "filled" : "not filled",
+ (pack->fillflag & MUST_HAVE) ? "filled" :
+ (pack->suite_id != NULL) ? "suite" : "not filled",
(pack->status == PACKAGE_CANNOT_OPEN) ? " but failed" : "",
+ packagedata_status_enum_to_str (pack->status),
pack->toplevel ? "TOP":"");
tmp = g_strdup_printf ("%s ", indent);
if (g_list_find (path, pack)) {
@@ -198,14 +200,27 @@ prune_failed_packages_helper (EazelInstall *service,
pack, pack->name,
packagedata_status_enum_to_str (pack->status));
#endif
+ /* If package is already installed, check if the service
+ settings requires us to fail it */
+ if (pack->status == PACKAGE_ALREADY_INSTALLED) {
+ gboolean cancel_package;
+ cancel_package = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (pack), "cancelled"));
+#if EI2_DEBUG & 0x4
+ trilobite_debug ("Package cancel status == %d", cancel_package);
+#endif
+ if (cancel_package == 0) {
+ return;
+ }
+ }
+ /* Recursion check */
if (g_list_find (*path, pack)) {
#if EI2_DEBUG & 0x4
trilobite_debug ("... %p %s recurses .., softcat is probably in flux", pack, pack->name);
#endif
return;
}
-
+
if (pack->status != PACKAGE_PARTLY_RESOLVED) {
#if EI2_DEBUG & 0x4
trilobite_debug ("subpruner kill root %s because of %s", root->name, pack->name);
@@ -287,6 +302,24 @@ eazel_install_check_existing_packages (EazelInstall *service,
pack->name,
EAZEL_PACKAGE_SYSTEM_QUERY_MATCHES,
MODIFY_MUST_HAVE);
+
+ /* If error, handle it */
+ if (service->private->package_system->err) {
+#if EI2_DEBUG & 0x4
+ switch (service->private->package_system->err->e) {
+ case EazelPackageSystemError_DB_ACCESS:
+ if (strcmp (service->private->package_system->err->u.db_access.path,
+ service->private->cur_root)==0) {
+ trilobite_debug ("some package dbs is locked by another process",
+ service->private->package_system->err->u.db_access.pid);
+ pack->status = PACKAGE_CANCELLED;
+ g_free (service->private->package_system->err);
+ return EAZEL_INSTALL_STATUS_QUO;
+ break;
+ }
+ }
+#endif
+ }
if (existing_packages) {
/* Get the existing package, set it's modify flag and add it */
GList *iterator;
@@ -471,9 +504,8 @@ eazel_install_check_existing_packages (EazelInstall *service,
packagedata_add_pack_to_modifies (pack, survivor);
survivor->status = PACKAGE_RESOLVED;
- } else {
- pack->status = PACKAGE_ALREADY_INSTALLED;
- }
+ }
+ pack->status = PACKAGE_ALREADY_INSTALLED;
gtk_object_unref (GTK_OBJECT (survivor));
}
@@ -520,6 +552,16 @@ typedef enum {
void get_package_info (EazelInstall *service, GList *packages);
GetSoftCatResult get_softcat_info (EazelInstall *service, PackageData **pack);
+static void
+add_to_dedupe_hash (EazelInstall *service,
+ PackageData *package)
+{
+ gtk_object_ref (GTK_OBJECT (package));
+ g_hash_table_insert (service->private->dedupe_hash,
+ package->md5,
+ package);
+}
+
GetSoftCatResult
get_softcat_info (EazelInstall *service,
PackageData **package)
@@ -531,11 +573,13 @@ get_softcat_info (EazelInstall *service,
g_assert (service);
g_assert (EAZEL_IS_INSTALL (service));
- if ((*package)->fillflag == MUST_HAVE) {
- /* Package is already filled */
+ if ((*package)->fillflag & MUST_HAVE) {
+ /* Package is already filled, set result to OK and toggle packages status */
result = SOFTCAT_HIT_OK;
+ (*package)->status = PACKAGE_PARTLY_RESOLVED;
} else {
if ((*package)->filename) {
+ /* Package already has a filename, load info from disk */
if (g_file_test ((*package)->filename, G_FILE_TEST_ISFILE) &&
access ((*package)->filename, R_OK)==0) {
PackageData *loaded_package;
@@ -556,6 +600,7 @@ get_softcat_info (EazelInstall *service,
result = SOFTCAT_HIT_OK;
}
} else {
+ /* Otherwise get info from SoftCat */
EazelSoftCatError err;
/* if package->version is set, we want get_info to get the exact
@@ -565,7 +610,8 @@ get_softcat_info (EazelInstall *service,
EAZEL_SOFTCAT_SENSE_EQ,
MUST_HAVE);
- if ((err==EAZEL_SOFTCAT_SUCCESS) && ((*package)->fillflag & MUST_HAVE)) {
+ /* if ((err==EAZEL_SOFTCAT_SUCCESS) && ((*package)->fillflag & MUST_HAVE)) { */
+ if (err==EAZEL_SOFTCAT_SUCCESS) {
result = SOFTCAT_HIT_OK;
(*package)->status = PACKAGE_PARTLY_RESOLVED;
} else {
@@ -574,7 +620,7 @@ get_softcat_info (EazelInstall *service,
}
}
}
- if (result != NO_SOFTCAT_HIT) {
+ if ((result != NO_SOFTCAT_HIT) && ((*package)->suite_id == NULL)) {
PackageData *p1 = NULL;
g_assert ((*package)->md5);
@@ -590,55 +636,56 @@ get_softcat_info (EazelInstall *service,
(*package) = p1;
} else {
EazelInstallStatus status;
- gboolean accept = TRUE;
status = eazel_install_check_existing_packages (service, *package);
+
switch (status) {
case EAZEL_INSTALL_STATUS_NEW_PACKAGE:
- accept = TRUE;
+ add_to_dedupe_hash (service, *package);
break;
case EAZEL_INSTALL_STATUS_UPGRADES:
if (eazel_install_get_update (service)) {
- accept = TRUE;
+ add_to_dedupe_hash (service, *package);
} else {
- accept = FALSE;
+ gtk_object_set_data (GTK_OBJECT (*package),
+ "cancelled",
+ GINT_TO_POINTER (1));
}
break;
case EAZEL_INSTALL_STATUS_DOWNGRADES:
if (eazel_install_get_downgrade (service)) {
- accept = TRUE;
+ add_to_dedupe_hash (service, *package);
} else {
- accept = FALSE;
+ gtk_object_set_data (GTK_OBJECT (*package),
+ "cancelled",
+ GINT_TO_POINTER (1));
}
break;
case EAZEL_INSTALL_STATUS_QUO:
- accept = FALSE;
- break;
- }
- if (accept) {
- gtk_object_ref (GTK_OBJECT (*package));
- g_hash_table_insert (service->private->dedupe_hash,
- (*package)->md5,
- *package);
- } else {
- (*package)->status = PACKAGE_ALREADY_INSTALLED;
+ gtk_object_set_data (GTK_OBJECT (*package),
+ "cancelled",
+ GINT_TO_POINTER (1));
result = PACKAGE_SKIPPED;
+ break;
}
}
}
return result;
}
-static void
-get_package_info_foreach (PackageData *package,
- EazelInstall *service)
+static GetSoftCatResult
+get_package_info_foreach (EazelInstall *service,
+ PackageData *package)
{
+ GetSoftCatResult result;
+
g_assert (service);
g_assert (EAZEL_IS_INSTALL (service));
g_assert (package);
g_assert (IS_PACKAGEDATA (package));
-
- switch (get_softcat_info (service, &package)) {
+
+ result = get_softcat_info (service, &package);
+ switch (result) {
case NO_SOFTCAT_HIT:
trilobite_debug ("Could not get info from SoftwareCatalog ");
break;
@@ -653,16 +700,21 @@ get_package_info_foreach (PackageData *package,
#endif
break;
}
+ return result;
}
void
get_package_info (EazelInstall *service,
GList *packages)
{
+ GList *iterator;
+
g_assert (service);
g_assert (EAZEL_IS_INSTALL (service));
- g_list_foreach (packages, (GFunc)get_package_info_foreach, service);
+ for (iterator = packages; iterator; iterator = g_list_next (iterator)) {
+ get_package_info_foreach (service, PACKAGEDATA (iterator->data));
+ }
}
/***********************************************************************************/
@@ -739,12 +791,20 @@ dedupe (EazelInstall *service,
/* This is the code to remove already satisfied dependencies */
void check_dependencies (EazelInstall *service, GList *packages);
-void check_dependencies_foreach (PackageData *package, EazelInstall *service);
-gboolean is_satisfied (EazelInstall *service, PackageDependency *dep);
-gboolean is_satisfied_features (EazelInstall *service, PackageData *package);
+void check_dependencies_foreach (EazelInstall *service, GList *packages, PackageData *package);
+gboolean is_satisfied (EazelInstall *service, GList *packages, PackageDependency *dep);
+gboolean is_satisfied_features (EazelInstall *service, GList *packages, PackageData *package);
+gboolean is_satisfied_from_package_list (EazelInstall *service, GList *packages, PackageDependency *dep);
+
+/*
+ FIXME: bugzilla.eazel.com 6809
+ is_satisfied_from_package_list is flawed since it 1) looks also at unresolved deps,
+ should only look at partly_resolved 2) is only looks at the current workset, and not the complete
+ (ie. everything at the current level, but now upwards */
gboolean
is_satisfied (EazelInstall *service,
+ GList *packages,
PackageDependency *dep)
{
char *key;
@@ -815,32 +875,48 @@ is_satisfied (EazelInstall *service,
break;
}
default: {
+ /* If dependency has name and version, first check workset, then packages on system,
+ and use the dependency's version/sense */
if (dep->package->name && dep->version) {
- if (eazel_package_system_is_installed (service->private->package_system,
- service->private->cur_root,
- dep->package->name,
- dep->version,
- NULL,
- dep->sense)) {
+ if (is_satisfied_from_package_list (service, packages, dep)) {
+#if EI2_DEBUG & 0x4
+ trilobite_debug ("\t--> present with version in workset");
+#endif
+ result = TRUE;
+ } else if (eazel_package_system_is_installed (service->private->package_system,
+ service->private->cur_root,
+ dep->package->name,
+ dep->version,
+ NULL,
+ dep->sense)) {
#if EI2_DEBUG & 0x4
trilobite_debug ("\t--> installed with version");
#endif
result = TRUE;
}
- } else if (dep->package->name &&
- eazel_package_system_is_installed (service->private->package_system,
- service->private->cur_root,
- dep->package->name,
- NULL,
- NULL,
- EAZEL_SOFTCAT_SENSE_ANY)) {
+ } else if (dep->package->name) {
+ /* Else check for name in workset and then amongst installed packages,
+ using sense ANY */
+ if (is_satisfied_from_package_list (service, packages, dep)) {
#if EI2_DEBUG & 0x4
- trilobite_debug ("\t--> installed");
+ trilobite_debug ("\t--> present in workset");
#endif
- result = TRUE;
+ result = TRUE;
+ } else if (eazel_package_system_is_installed (service->private->package_system,
+ service->private->cur_root,
+ dep->package->name,
+ NULL,
+ NULL,
+ EAZEL_SOFTCAT_SENSE_ANY)) {
+#if EI2_DEBUG & 0x4
+ trilobite_debug ("\t--> installed");
+#endif
+ result = TRUE;
+ }
} else {
-
- if (dep->package->features && is_satisfied_features (service, dep->package)) {
+ /* If package dependency didn't have a name, but has features, check if features
+ are installed */
+ if (dep->package->features && is_satisfied_features (service, packages, dep->package)) {
#if EI2_DEBUG & 0x4
trilobite_debug ("\t--> features of package are satisfied");
#endif
@@ -875,8 +951,60 @@ is_satisfied (EazelInstall *service,
return result;
}
+gboolean
+is_satisfied_from_package_list (EazelInstall *service,
+ GList *packages,
+ PackageDependency *dep)
+{
+ GList *iterator;
+ GList *flat_packages;
+ gboolean result = FALSE;
+
+ flat_packages = flatten_packagedata_dependency_tree (packages);
+
+#if EI2_DEBUG & 0x4
+ trilobite_debug ("\t--> is_satisfied_from_packages %s from %d packages",
+ dep->package->name, g_list_length (packages));
+#endif
+ for (iterator = flat_packages; iterator; iterator = g_list_next (iterator)) {
+ PackageData *p = PACKAGEDATA (iterator->data);
+ trilobite_debug ("\t\t --> checking %s %s %s",
+ p->name,
+ packagedata_status_enum_to_str (p->status),
+ p->fillflag == MUST_HAVE ? "filled" : "not filled");
+ if (p->status == PACKAGE_PARTLY_RESOLVED &&
+ (p->fillflag == MUST_HAVE) &&
+ p->name &&
+ (strcmp (p->name, dep->package->name)==0)) {
+ trilobite_debug ("\t\t --> foo");
+ if (dep->version) {
+ int res;
+ res = eazel_package_system_compare_version (service->private->package_system,
+ dep->version,p->version);
+ if (res==0 && dep->sense & EAZEL_SOFTCAT_SENSE_EQ) {
+ result = TRUE;
+ break;
+ } else if (res < 0 && dep->sense & EAZEL_SOFTCAT_SENSE_LT) {
+ result = TRUE;
+ break;
+ } else if (res > 0 && dep->sense & EAZEL_SOFTCAT_SENSE_GT) {
+ result = TRUE;
+ break;
+ }
+ } else {
+ result = TRUE;
+ break;
+ }
+ }
+ }
+
+ g_list_free (flat_packages);
+ return result;
+}
+
gboolean
is_satisfied_features (EazelInstall *service,
+ GList *packages,
PackageData *package)
{
gboolean result = TRUE;
@@ -940,8 +1068,9 @@ is_satisfied_features (EazelInstall *service,
}
void
-check_dependencies_foreach (PackageData *package,
- EazelInstall *service)
+check_dependencies_foreach (EazelInstall *service,
+ GList *packages,
+ PackageData *package)
{
GList *remove = NULL;
GList *iterator;
@@ -951,18 +1080,29 @@ check_dependencies_foreach (PackageData *package,
g_assert (package);
g_assert (IS_PACKAGEDATA (package));
- /*
- FIXME: bugzilla.eazel.com 6485
- This is the initial fix for 6485, but I'll also need
- to evaporate ->depends, lest the next depcheck step begins
- depchekking the packages in ->depends, and treat them like
- new installs which is definitely non-optimial (actually
- it's really bad)
-
- if (package->status == PACKAGE_CANCELLED) {
+ /* If the package was cancelled, don't process it's dependencies */
+ if (package->status == PACKAGE_CANCELLED ||
+ (package->status == PACKAGE_ALREADY_INSTALLED && package->modifies==NULL)) {
+ g_list_foreach (package->depends, (GFunc)packagedependency_destroy, NULL);
+ g_list_free (package->depends);
+ package->depends = NULL;
return;
}
- */
+
+ if (package->suite_id!=NULL) {
+ for (iterator = package->depends; iterator; iterator = g_list_next (iterator)) {
+ PackageDependency *dep = PACKAGEDEPENDENCY (iterator->data);
+ dep->package->fillflag = PACKAGE_FILL_INVALID;
+ g_list_foreach (dep->package->depends, (GFunc)packagedependency_destroy, NULL);
+ dep->package->depends = NULL;
+ }
+#if EI2_DEBUG & 0x4
+ trilobite_debug ("skipping suite %p %s", package, package->suite_id);
+#else
+ g_message ("Skipping suite %s", package->suite_id);
+#endif
+ }
+
#if EI2_DEBUG & 0x4
trilobite_debug ("check deps for %p %s", package, package->name);
@@ -973,7 +1113,7 @@ check_dependencies_foreach (PackageData *package,
for (iterator = package->depends; iterator; iterator = g_list_next (iterator)) {
PackageDependency *dep = PACKAGEDEPENDENCY (iterator->data);
- if (dep->package->name && strcmp (dep->package->name, package->name)==0) {
+ if (dep->package->name && package->name && strcmp (dep->package->name, package->name)==0) {
char *name_a, *name_b;
name_a = packagedata_get_readable_name (package);
@@ -988,7 +1128,7 @@ check_dependencies_foreach (PackageData *package,
package->status = PACKAGE_CANCELLED;
remove = g_list_prepend (remove, dep);
} else {
- if (is_satisfied (service, dep)) {
+ if (is_satisfied (service, packages, dep)) {
remove = g_list_prepend (remove, dep);
} else {
eazel_install_emit_dependency_check (service, package, dep);
@@ -1013,10 +1153,14 @@ void
check_dependencies (EazelInstall *service,
GList *packages)
{
+ GList *iterator;
+
g_assert (service);
g_assert (EAZEL_INSTALL (service));
- g_list_foreach (packages, (GFunc)check_dependencies_foreach, service);
+ for (iterator = packages; iterator; iterator = g_list_next (iterator)) {
+ check_dependencies_foreach (service, packages, PACKAGEDATA (iterator->data));
+ }
#if EI2_DEBUG & 0x1
trilobite_debug ("post dep_check tree");
@@ -1161,28 +1305,26 @@ check_tree_helper (EazelInstall *service,
for (iterator = pack->breaks; iterator; iterator = g_list_next (iterator)) {
PackageBreaks *breakage = PACKAGEBREAKS (iterator->data);
- if (IS_PACKAGEFILECONFLICT (breakage)) {
- PackageFileConflict *conflict = PACKAGEFILECONFLICT (breakage);
- PackageData *pack_broken = packagebreaks_get_package (breakage);
- PackageData *pack_update = NULL;
- gboolean update_available = FALSE;
-
- if (check_if_related_package (service,
- pack,
- pack_broken)) {
- char *a, *b;
+ PackageData *pack_broken = packagebreaks_get_package (breakage);
+ PackageData *pack_update = NULL;
+ gboolean update_available = FALSE;
+
+ if (check_if_related_package (service,
+ pack,
+ pack_broken)) {
+ char *a, *b;
a = packagedata_get_readable_name (pack);
b = packagedata_get_readable_name (pack_broken);
g_message ("%s is related to %s",
a, b);
-
+
/* Create the pack_update */
pack_update = packagedata_new ();
pack_update->name = g_strdup (pack_broken->name);
pack_update->version = g_strdup (pack->version);
pack_update->distribution = pack_broken->distribution;
pack_update->archtype = g_strdup (pack_broken->archtype);
-
+
/* Try and get the info */
if (eazel_softcat_get_info (service->private->softcat,
pack_update,
@@ -1198,47 +1340,57 @@ check_tree_helper (EazelInstall *service,
g_free (a);
g_free (b);
- } else {
- update_available =
- eazel_softcat_available_update (service->private->softcat,
- pack_broken,
- &pack_update,
- UPDATE_MUST_HAVE);
- }
+ } else {
+ update_available =
+ eazel_softcat_available_update (service->private->softcat,
+ pack_broken,
+ &pack_update,
+ UPDATE_MUST_HAVE);
+ }
+
+ if (update_available) {
+ gboolean proceed = TRUE;
- if (update_available) {
- if (check_update_for_no_more_file_conflicts (conflict, pack_update)) {
+ if (IS_PACKAGEFILECONFLICT (breakage)) {
+ PackageFileConflict *conflict = PACKAGEFILECONFLICT (breakage);
+
+ if (!check_update_for_no_more_file_conflicts (conflict, pack_update)) {
+ proceed = FALSE;
+ }
+ } else if (IS_PACKAGEFEATUREMISSING (breakage)) {
+ /* FIXME: bugzilla.eazel.com 6811 */
+ }
+ if (proceed) {
#if EI2_DEBUG & 0x4
- trilobite_debug ("adding %s to packages to be installed",
- pack_update->name);
+ trilobite_debug ("adding %s to packages to be installed",
+ pack_update->name);
#else
- g_message ("updating %s to version %s-%s solves conflict",
- pack_update->name, pack_update->version,
- pack_update->minor);
-#endif
- /* ref the package and add it to the extra_packages list */
- gtk_object_ref (GTK_OBJECT (pack_update));
- (*extra_packages) = g_list_prepend (*extra_packages,
- pack_update);
- pack_update->status = PACKAGE_PARTLY_RESOLVED;
+ g_message ("updating %s to version %s-%s solves conflict",
+ pack_update->name, pack_update->version,
+ pack_update->minor);
+#endif
+ /* ref the package and add it to the extra_packages list */
+ gtk_object_ref (GTK_OBJECT (pack_update));
+ (*extra_packages) = g_list_prepend (*extra_packages,
+ pack_update);
+ pack_update->status = PACKAGE_PARTLY_RESOLVED;
remove = g_list_prepend (remove, breakage);
/* reset pack_broken to some sane values */
pack->status = PACKAGE_PARTLY_RESOLVED;
pack_update->toplevel = TRUE;
- } else {
+ } else {
#if EI2_DEBUG & 0x4
- trilobite_debug ("%s still has conflict", pack_update->name);
+ trilobite_debug ("%s still has conflict", pack_update->name);
#else
- g_message ("available update to %s (%s-%s) does not solves conflict",
- pack_update->name,
- pack_update->version, pack_update->minor);
+ g_message ("available update to %s (%s-%s) does not solves conflict",
+ pack_update->name,
+ pack_update->version, pack_update->minor);
#endif
- gtk_object_unref (GTK_OBJECT (pack_update));
- }
- } else {
- g_message (_("could not revive %s"), pack->name);
+ gtk_object_unref (GTK_OBJECT (pack_update));
}
- }
+ } else {
+ g_message (_("could not revive %s"), pack->name);
+ }
}
/* Now nuke the successfully revived PackageBreaks */
@@ -1377,6 +1529,10 @@ check_no_two_packages_has_same_file (EazelInstall *service,
pack = PACKAGEDATA (iter->data);
+ if (pack->suite_id) {
+ continue;
+ }
+
g_message ("file uniqueness checking %s", pack->name);
eazel_install_emit_file_uniqueness_check (service, pack);
@@ -1492,7 +1648,7 @@ check_conflicts_against_already_installed_packages (EazelInstall *service,
for (iter = g_list_first (flat_packages); iter != NULL; iter = g_list_next (iter)) {
pack = PACKAGEDATA (iter->data);
- if (pack->conflicts_checked) {
+ if (pack->conflicts_checked || pack->suite_id) {
continue;
}
@@ -1647,8 +1803,14 @@ check_feature_consistency (EazelInstall *service,
required_by = eazel_package_system_query (service->private->package_system,
service->private->cur_root,
feature,
- EAZEL_PACKAGE_SYSTEM_QUERY_REQUIRES,
+ EAZEL_PACKAGE_SYSTEM_QUERY_REQUIRES_FEATURE,
PACKAGE_FILL_NO_DIRS_IN_PROVIDES);
+
+#if EI2_DEBUG & 0x4
+ if (g_list_length (required_by)==0) {
+ trilobite_debug ("but noone uses it...");
+ }
+#endif
for (break_it = required_by; break_it; break_it = g_list_next (break_it)) {
PackageFeatureMissing *feature_missing = packagefeaturemissing_new ();
PackageData *pack_broken = PACKAGEDATA (break_it->data);
@@ -1685,17 +1847,27 @@ check_feature_consistency (EazelInstall *service,
#endif
}
+
+/* Main conflict entry point */
void
do_file_conflict_check (EazelInstall *service,
GList **packages,
GList **extra_packages)
{
+ /* Check that no two packages in the work set provides the
+ same files */
check_no_two_packages_has_same_file (service, *packages);
+ /* If so, prune them no, no point in trying to update */
prune_failed_packages (service, packages);
+ /* Check for file conflicts against already installed packages,
+ if conflicts, try and revive */
check_conflicts_against_already_installed_packages (service, *packages);
check_tree_for_conflicts (service, packages, extra_packages);
+ /* If packages were revived (added to extra_packages,
+ exit and we'll be recursed, otherwise check
+ feature consistency */
if (extra_packages && (*extra_packages==NULL)) {
check_feature_consistency (service, *packages);
prune_failed_packages (service, packages);
@@ -1736,8 +1908,9 @@ do_dep_check_internal (EazelInstall *service,
get_package_info (service, packages);
dedupe (service, packages);
check_dependencies (service, packages);
+
+ /* we might have received a "stop" callback recently */
if (service->private->cancel_download) {
- /* we might have received a "stop" callback recently */
return;
}
@@ -1746,7 +1919,9 @@ do_dep_check_internal (EazelInstall *service,
GList *diterator;
for (diterator = PACKAGEDATA(iterator->data)->depends; diterator; diterator = g_list_next (diterator)) {
PackageDependency *dep = PACKAGEDEPENDENCY (diterator->data);
- if (~dep->package->fillflag & MUST_HAVE) {
+ if (((~dep->package->fillflag & MUST_HAVE) ||
+ (PACKAGEDATA(iterator->data)->suite_id)) &&
+ (g_list_find (K, dep->package)==NULL)) {
K = g_list_prepend (K, dep->package);
}
}
@@ -1773,14 +1948,15 @@ do_dep_check (EazelInstall *service,
/* This is the download stuff */
-void download_packages (EazelInstall *service, GList *packages);
+gboolean download_packages (EazelInstall *service, GList *packages);
-void
+gboolean
download_packages (EazelInstall *service,
GList *packages)
{
GList *flat_packages;
GList *iterator;
+ gboolean result = TRUE;
flat_packages = flatten_packagedata_dependency_tree (packages);
g_message ("downloading %d packages", g_list_length (packages));
@@ -1789,14 +1965,20 @@ download_packages (EazelInstall *service,
for (iterator = flat_packages; iterator; iterator = g_list_next (iterator)) {
PackageData *pack = PACKAGEDATA (iterator->data);
if (pack->filename == NULL) {
- eazel_install_fetch_package (service, pack);
+ if (eazel_install_fetch_package (service, pack) == FALSE) {
+ result = FALSE;
+ break;
+ }
if (service->private->cancel_download) {
+ result = FALSE;
break;
}
}
}
g_list_free (flat_packages);
+
+ return result;
}
/***********************************************************************************/
@@ -1930,6 +2112,7 @@ set_toplevel (PackageData *package,
package->toplevel = TRUE;
}
+#if 0
static void
expand_package_suites (EazelInstall *service, GList **packages)
{
@@ -1959,6 +2142,7 @@ expand_package_suites (EazelInstall *service, GList **packages)
}
*packages = newlist;
}
+#endif
/***********************************************************************************/
/* This is the revert majick */
@@ -1973,13 +2157,18 @@ get_packages_with_mod_flag (GList *packages,
res = NULL;
for (it = packages; it; it = g_list_next (it)) {
PackageData *pack;
- pack = (PackageData*)it->data;
+ if (IS_PACKAGEDATA (it->data)) {
+ pack = PACKAGEDATA (it->data);
+ } else if (IS_PACKAGEDEPENDENCY (it->data)) {
+ pack = PACKAGEDEPENDENCY (it->data)->package;
+ }
+
if (pack->modify_status == mod) {
res = g_list_prepend (res, pack);
}
- if (pack->soft_depends) {
+ if (pack->depends) {
res = g_list_concat (res,
- get_packages_with_mod_flag (pack->soft_depends, mod));
+ get_packages_with_mod_flag (pack->depends, mod));
}
if (pack->modifies) {
res = g_list_concat (res,
@@ -2050,13 +2239,15 @@ eazel_uninstall_upward_traverse (EazelInstall *service,
dep check
for all break, add to packages and recurse
*/
-
- trilobite_debug ("in eazel_uninstall_upward_traverse");
+#if EI2_DEBUG & 0x4
+ trilobite_debug ("--> eazel_uninstall_upward_traverse");
+#endif
g_assert (packages!=NULL);
g_assert (*packages!=NULL);
g_assert (breaks!=NULL);
g_assert (*breaks==NULL);
+ g_assert (failed!=NULL);
/* Open the package system */
@@ -2070,7 +2261,9 @@ eazel_uninstall_upward_traverse (EazelInstall *service,
GList *b_iterator = NULL;
/* Get the packages required by pack */
- trilobite_debug ("checking reqs by %p %s", pack, rpmname_from_packagedata (pack));
+#if EI2_DEBUG & 0x4
+ trilobite_debug ("\t checking requirements by %p %s", pack, rpmname_from_packagedata (pack));
+#endif
matches = eazel_package_system_query (service->private->package_system,
service->private->cur_root,
pack,
@@ -2083,15 +2276,19 @@ eazel_uninstall_upward_traverse (EazelInstall *service,
requiredby->status = PACKAGE_DEPENDENCY_FAIL;
pack->status = PACKAGE_BREAKS_DEPENDENCY;
- trilobite_debug ("%p %s requires %p %s",
+#if EI2_DEBUG & 0x4
+ trilobite_debug ("\t %p %s requires %p %s",
requiredby, requiredby->name,
pack, pack->name);
+#else
+ g_message ("%s requires %s", requiredby_name, pack->name);
+#endif
/* If the broken package is in packages, just continue */
- if (g_list_find_custom (*packages, requiredby,
- (GCompareFunc)eazel_install_package_compare)) {
+ if (g_list_find_custom (*packages, requiredby->name,
+ (GCompareFunc)eazel_install_package_name_compare)) {
#if EI2_DEBUG & 0x4
- trilobite_debug ("skip %p %s", requiredby, requiredby->name);
+ trilobite_debug ("\t skip %p %s", requiredby, requiredby->name);
#endif
continue;
}
@@ -2102,7 +2299,7 @@ eazel_uninstall_upward_traverse (EazelInstall *service,
(GCompareFunc)eazel_install_package_compare) == NULL) {
PackageFeatureMissing *breakage = packagefeaturemissing_new ();
#if EI2_DEBUG & 0x4
- trilobite_debug ("Adding %p %s to breaks", requiredby, requiredby->name);
+ trilobite_debug ("\t Adding %p %s to breaks", requiredby, requiredby->name);
#endif
(*breaks) = g_list_prepend ((*breaks), requiredby);
packagebreaks_set_package (PACKAGEBREAKS (breakage), requiredby);
@@ -2138,7 +2335,9 @@ eazel_uninstall_upward_traverse (EazelInstall *service,
(*packages) = g_list_remove (*packages, iterator->data);
}
- trilobite_debug ("out eazel_uninstall_upward_traverse");
+#if EI2_DEBUG & 0x4
+ trilobite_debug ("<-- eazel_uninstall_upward_traverse");
+#endif
}
static void
@@ -2150,9 +2349,11 @@ eazel_uninstall_check_for_install (EazelInstall *service,
GList *remove = NULL;
GList *result = NULL;
- trilobite_debug ("in eazel_uninstall_check_for_install");
+#if EI2_DEBUG & 0x4
+ trilobite_debug ("--> eazel_uninstall_check_for_install");
+#endif
g_assert (packages);
- trilobite_debug ("g_list_length (*packages) = %d", g_list_length (*packages));
+
for (iterator = *packages; iterator; iterator = g_list_next (iterator)) {
PackageData *pack = (PackageData*)iterator->data;
@@ -2166,6 +2367,9 @@ eazel_uninstall_check_for_install (EazelInstall *service,
pack->toplevel = TRUE;
result = g_list_prepend (result, pack);
} else {
+#if EI2_DEBUG & 0x4
+ trilobite_debug ("\t %p %s is not installed", pack, pack->name);
+#endif
pack->status = PACKAGE_CANNOT_OPEN;
remove = g_list_prepend (remove, pack);
}
@@ -2178,13 +2382,12 @@ eazel_uninstall_check_for_install (EazelInstall *service,
g_list_free (remove);
remove = NULL;
- trilobite_debug ("g_list_length (*packages) = %d", g_list_length (*packages));
- trilobite_debug ("g_list_length (result) = %d", g_list_length (result));
-
g_list_free (*packages);
(*packages) = result;
- trilobite_debug ("out eazel_uninstall_check_for_install");
+#if EI2_DEBUG & 0x4
+ trilobite_debug ("<-- eazel_uninstall_check_for_install");
+#endif
}
/* Calls the upward and downward traversal */
@@ -2202,18 +2405,17 @@ eazel_uninstall_globber (EazelInstall *service,
add all from &tmp to packages
*/
- trilobite_debug ("in eazel_uninstall_globber");
+ trilobite_debug ("--> eazel_uninstall_globber");
tmp = NULL;
eazel_uninstall_check_for_install (service, packages, failed);
for (iterator = *failed; iterator; iterator = g_list_next (iterator)) {
- trilobite_debug ("not installed %p %s",
- (PackageData*)iterator->data, ((PackageData*)iterator->data)->name);
eazel_install_emit_uninstall_failed (service, (PackageData*)iterator->data);
}
g_list_foreach (*failed, (GFunc)gtk_object_unref, NULL);
g_list_free (*failed);
+ (*failed)=NULL;
/* If there are still packages and we're not forcing,
do upwards traversel */
@@ -2221,7 +2423,7 @@ eazel_uninstall_globber (EazelInstall *service,
eazel_uninstall_upward_traverse (service, packages, failed, &tmp);
#if EI2_DEBUG & 0x4
- if (*failed) {
+ if (g_list_length (*failed)) {
trilobite_debug ("FAILED");
dump_tree (*failed);
}
@@ -2237,7 +2439,7 @@ eazel_uninstall_globber (EazelInstall *service,
g_list_free (tmp);
}
- trilobite_debug ("out eazel_uninstall_glob");
+ trilobite_debug ("<-- eazel_uninstall_glob");
}
@@ -2255,7 +2457,11 @@ install_packages (EazelInstall *service, GList *categories)
eazel_softcat_reset_server_update_flag (service->private->softcat);
packages = packagedata_list_copy (categorylist_flatten_to_packagelist (categories), TRUE);
+
+ /*
expand_package_suites (service, &packages);
+ */
+
g_list_foreach (packages, (GFunc)set_toplevel, service);
do {
extra_packages = NULL;
@@ -2276,20 +2482,22 @@ install_packages (EazelInstall *service, GList *categories)
#if EI2_DEBUG & 0x4
trilobite_debug ("emit_preflight returned true");
#endif
- /* FIXME: bugzilla.eazel.com 5722
- download could fail, do the download func needs to
- be able to fail the operation... */
- download_packages (service, packages);
- if (eazel_install_get_force (service) == FALSE) {
- if (!check_md5_on_files (service, packages)) {
- go_ahead = FALSE;
+ if (download_packages (service, packages)) {
+ if (eazel_install_get_force (service) == FALSE) {
+ if (!check_md5_on_files (service, packages)) {
+ go_ahead = FALSE;
+ }
}
- }
- if (go_ahead) {
- /* Execute the operation */
- if (execute (service, packages, EAZEL_PACKAGE_SYSTEM_OPERATION_INSTALL, flags)) {
- result = EAZEL_INSTALL_INSTALL_OK;
- }
+ if (go_ahead) {
+ /* Execute the operation */
+ if (execute (service, packages, EAZEL_PACKAGE_SYSTEM_OPERATION_INSTALL, flags)) {
+ result = EAZEL_INSTALL_INSTALL_OK;
+ }
+ }
+ } else {
+ /* FIXME: bugzilla.eazel.com 5722
+ download could fail, do the download func needs to
+ be able to fail the operation... */
}
}
}
@@ -2314,7 +2522,7 @@ uninstall_packages (EazelInstall *service, GList *categories)
eazel_softcat_reset_server_update_flag (service->private->softcat);
- trilobite_debug (" --> uninstall_all_packages");
+ trilobite_debug ("--> uninstall_packages");
packages = packagedata_list_copy (categorylist_flatten_to_packagelist (categories), TRUE);
eazel_uninstall_globber (service, &packages, &failed);
@@ -2332,7 +2540,7 @@ uninstall_packages (EazelInstall *service, GList *categories)
trilobite_debug ("uninstall returns returning %s",
result == EAZEL_INSTALL_UNINSTALL_OK ? "OK" : "FAILED");
- trilobite_debug (" <-- uninstall_all_packages");
+ trilobite_debug ("<-- uninstall_all_packages");
return result;
}
diff --git a/components/services/install/lib/eazel-install-problem.c b/components/services/install/lib/eazel-install-problem.c
index f3c2e3c7b..6409fda20 100644
--- a/components/services/install/lib/eazel-install-problem.c
+++ b/components/services/install/lib/eazel-install-problem.c
@@ -46,6 +46,7 @@ typedef struct {
GList *errors;
GList *path;
GList *packs;
+ GList *handled;
} GetErrorsForEachData;
#ifdef EIP_DEBUG
@@ -122,6 +123,10 @@ get_detailed_messages_foreach (GtkObject *foo, GetErrorsForEachData *data)
g_assert_not_reached ();
}
+ if (g_list_find (data->handled, pack)) {
+ return;
+ }
+
if (data->path) {
previous_pack = (PackageData*)(data->path->data);
top_pack = (PackageData*)(g_list_last (data->path)->data);
@@ -251,6 +256,9 @@ get_detailed_messages_foreach (GtkObject *foo, GetErrorsForEachData *data)
/* Create the path list */
data->path = g_list_prepend (data->path, pack);
+ data->handled = g_list_prepend (data->handled, pack);
+
+ g_message ("handled %p %s", pack, packagedata_get_readable_name (pack));
if (pack->status != PACKAGE_CANCELLED) {
g_list_foreach (pack->depends, (GFunc)get_detailed_messages_foreach, data);
@@ -1212,6 +1220,7 @@ eazel_install_problem_tree_to_case (EazelInstallProblem *problem,
data.problem = problem;
data.errors = (*output);
data.path = NULL;
+ data.handled = NULL;
pack_copy = packagedata_copy (pack, TRUE);
problem->in_step_problem_mode = FALSE;
diff --git a/components/services/install/lib/eazel-install-protocols.c b/components/services/install/lib/eazel-install-protocols.c
index 6bdc513e2..ed7e8fbe9 100644
--- a/components/services/install/lib/eazel-install-protocols.c
+++ b/components/services/install/lib/eazel-install-protocols.c
@@ -40,9 +40,7 @@
#include "eazel-package-system.h"
-/* We use rpmvercmp to compare versions... */
-#include <rpm/rpmlib.h>
-#include <rpm/misc.h>
+#undef EIP_FAIL_ALL_DOWNLOADS
#include <libtrilobite/trilobite-core-utils.h>
@@ -295,6 +293,18 @@ gnome_vfs_xfer_callback (GnomeVFSXferProgressInfo *info,
case GNOME_VFS_XFER_PHASE_OPENTARGET:
return TRUE;
case GNOME_VFS_XFER_PHASE_COPYING:
+#ifdef EIP_FAIL_ALL_DOWNLOADS
+ if (info->bytes_copied > 1024*8) {
+ return FALSE;
+ }
+#endif /* EIP_FAIL_ALL_DOWNLOADS */
+
+ if (info->bytes_copied > info->file_size) {
+ g_warning ("VFS bug: lying about filesize, copying %ld > %ld",
+ (glong)info->bytes_copied,
+ (glong)info->file_size);
+ return TRUE;
+ }
if (initial_emit && info->file_size>0) {
initial_emit = FALSE;
eazel_install_emit_download_progress (service,
@@ -315,18 +325,16 @@ gnome_vfs_xfer_callback (GnomeVFSXferProgressInfo *info,
}
- /*
- g_message ("Transferring `%s' to `%s' (file %ld/%ld, byte %ld/%ld in file, "
+/*
+ g_message ("Transferring (file %ld/%ld, byte %ld/%ld in file, "
"%" GNOME_VFS_SIZE_FORMAT_STR "/%" GNOME_VFS_SIZE_FORMAT_STR " total)",
- info->source_name,
- info->target_name,
info->file_index,
info->files_total,
(glong) info->bytes_copied,
(glong) info->file_size,
info->total_bytes_copied,
info->bytes_total);
- */
+*/
return TRUE;
case GNOME_VFS_XFER_PHASE_CLOSESOURCE:
return TRUE;
@@ -379,13 +387,14 @@ gnome_vfs_fetch_remote_file (EazelInstall *service,
/* this will always be a file: uri */
t_file = g_strdup_printf ("file://%s", target_file_premove);
- trilobite_debug ("gnome_vfs_xfer_uri ( %s %s )", url, t_file);
+ trilobite_debug ("downloading %s", url);
src_uri = gnome_vfs_uri_new (url);
g_assert (src_uri != NULL);
if (eazel_install_get_ssl_rename (service)) {
trilobite_debug ("ssl renaming %s to localhost", gnome_vfs_uri_get_host_name (src_uri));
gnome_vfs_uri_set_host_name (src_uri, "localhost");
+ gnome_vfs_uri_set_host_port (src_uri, eazel_install_get_server_port (service));
}
dest_uri = gnome_vfs_uri_new (target_file_premove);
@@ -651,6 +660,7 @@ eazel_install_fetch_package (EazelInstall *service,
result = FALSE;
}
}
+/*
if (version) {
if (rpmvercmp (package->version, version)<0) {
g_warning (_("Downloaded package does not have the correct version"));
@@ -659,6 +669,7 @@ eazel_install_fetch_package (EazelInstall *service,
result = FALSE;
}
}
+*/
}
}
@@ -671,7 +682,6 @@ eazel_install_fetch_package (EazelInstall *service,
service->private->downloaded_files = g_list_prepend (service->private->downloaded_files,
g_strdup (targetname));
}
- trilobite_debug ("%s resolved v2", package->name);
} else {
g_warning (_("File download failed"));
unlink (targetname);
@@ -685,78 +695,3 @@ eazel_install_fetch_package (EazelInstall *service,
}
-static void
-flatten_tree_func (PackageData *pack, GList **out)
-{
- trilobite_debug (" --- %s", pack->name);
- *out = g_list_append (*out, pack);
- g_list_foreach (pack->soft_depends, (GFunc)flatten_tree_func, out);
- g_list_free (pack->soft_depends);
- pack->soft_depends = NULL;
-}
-
-/* this was never used yet */
-#if 0
-/* given a list of packages with incomplete info (for example, the initial bootstrap install list),
- * go ask for real info and compile a new list of packages.
- */
-static GList *
-eazel_install_fetch_definitive_package_info (EazelInstall *service, PackageData *pack)
-{
- char *search_url = NULL;
- char *body = NULL;
- int length;
- GList *treelist;
- GList *out;
-
- search_url = get_search_url_for_package (service, RPMSEARCH_ENTRY_NAME, pack);
- if (search_url == NULL) {
- trilobite_debug ("No search URL");
- return NULL;
- }
-
- trilobite_debug ("Search URL: %s", search_url);
- trilobite_setenv ("GNOME_VFS_HTTP_USER_AGENT", trilobite_get_useragent_string (NULL), TRUE);
-
- if (! trilobite_fetch_uri (search_url, &body, &length)) {
- g_free (search_url);
- trilobite_debug ("Couldn't fetch search URL");
- return NULL;
- }
-
- trilobite_debug ("parse osd");
- treelist = parse_osd_xml_from_memory (body, length);
- g_free (search_url);
- g_free (body);
-
- /* the install lib will spaz if we give it the dependencies in their tree form. :( */
- trilobite_debug (">>> package '%s' => %d packages", pack->name, g_list_length (treelist));
- out = NULL;
- g_list_foreach (treelist, (GFunc)flatten_tree_func, &out);
-
-dump_packages (out);
- return out;
-}
-
-void
-eazel_install_fetch_definitive_category_info (EazelInstall *service, CategoryData *category)
-{
- GList *iter;
- GList *real_packages = NULL;
- GList *packlist;
-
- for (iter = g_list_first (category->packages); iter != NULL; iter = g_list_next (iter)) {
- packlist = eazel_install_fetch_definitive_package_info (service, (PackageData *)(iter->data));
- if (packlist != NULL) {
- real_packages = g_list_concat (real_packages, packlist);
- packagedata_destroy ((PackageData *)(iter->data), TRUE);
- } else {
- /* fetch of real URL failed, so just add the original package info */
- real_packages = g_list_append (real_packages, (PackageData *)(iter->data));
- }
- }
-
- g_list_free (category->packages);
- category->packages = real_packages;
-}
-#endif
diff --git a/components/services/install/lib/eazel-install-xml-package-list.c b/components/services/install/lib/eazel-install-xml-package-list.c
index ac4ef2787..9f981a253 100644
--- a/components/services/install/lib/eazel-install-xml-package-list.c
+++ b/components/services/install/lib/eazel-install-xml-package-list.c
@@ -114,17 +114,18 @@ parse_package (xmlNode* package, gboolean set_toplevel) {
}
/* Dependency Lists */
- rv->soft_depends = NULL;
rv->breaks = NULL;
rv->modifies = NULL;
dep = package->xmlChildrenNode;
while (dep) {
- if (g_strcasecmp (dep->name, "SOFT_DEPEND") == 0) {
+ if (g_strcasecmp (dep->name, "DEPENDENCY") == 0) {
+ PackageDependency *dependency = g_new0 (PackageDependency, 1);
PackageData* depend;
depend = parse_package (dep, FALSE);
- packagedata_add_pack_to_soft_depends (rv, depend);
+ dependency->package = depend;
+ packagedata_add_pack_to_depends (rv, dependency);
} else if (g_strcasecmp (dep->name, "MODIFIES") == 0) {
PackageData* depend;
@@ -596,7 +597,7 @@ eazel_install_packagedata_to_xml_int (const PackageData *pack,
if (g_list_find (*path, PACKAGEDEPENDENCY (iterator->data)->package) == NULL) {
(*path) = g_list_prepend (*path, PACKAGEDEPENDENCY (iterator->data)->package);
eazel_install_packagedata_to_xml_int (PACKAGEDEPENDENCY (iterator->data)->package,
- "SOFT_DEPEND",
+ "DEPENDENCY",
root,
include_provides,
path);
diff --git a/components/services/install/lib/eazel-package-system-rpm3-private.h b/components/services/install/lib/eazel-package-system-rpm3-private.h
index af8ac4b46..ccef9eaa9 100644
--- a/components/services/install/lib/eazel-package-system-rpm3-private.h
+++ b/components/services/install/lib/eazel-package-system-rpm3-private.h
@@ -27,7 +27,7 @@
#include "eazel-package-system-rpm3.h"
#include <rpm/rpmlib.h>
-void eazel_package_system_rpm3_open_dbs (EazelPackageSystemRpm3 *system);
+gboolean eazel_package_system_rpm3_open_dbs (EazelPackageSystemRpm3 *system);
gboolean eazel_package_system_rpm3_close_dbs (EazelPackageSystemRpm3 *system);
gboolean eazel_package_system_rpm3_free_dbs (EazelPackageSystemRpm3 *system);
void eazel_package_system_rpm3_create_dbs (EazelPackageSystemRpm3 *system, GList*);
@@ -72,6 +72,11 @@ void eazel_package_system_rpm3_query_requires (EazelPackageSystemRpm3 *system,
const gpointer *key,
int detail_level,
GList **result);
+void eazel_package_system_rpm3_query_requires_feature (EazelPackageSystemRpm3 *system,
+ const char *dbpath,
+ const gpointer *key,
+ int detail_level,
+ GList **result);
struct RpmQueryPiggyBag {
EazelPackageSystemRpm3 *system;
@@ -83,7 +88,7 @@ struct RpmQueryPiggyBag {
struct _EazelPackageSystemRpm3Private
{
- GList *dbpaths; /* GList*<EazelPackageSystemDbPath> */
+ GList *dbpaths; /* GList*< pair < char *dbpath, char *root> > */
GHashTable *db_to_root;
GHashTable *dbs;
diff --git a/components/services/install/lib/eazel-package-system-rpm3.c b/components/services/install/lib/eazel-package-system-rpm3.c
index a4abf811a..e6535f4b8 100644
--- a/components/services/install/lib/eazel-package-system-rpm3.c
+++ b/components/services/install/lib/eazel-package-system-rpm3.c
@@ -46,6 +46,16 @@
#ifdef HAVE_RPM
+#ifdef HAVE_RPM_30
+#define A_DB_FILE "packages.rpm"
+#elif HAVE_RPM_40
+#define A_DB_FILE "Packages"
+#endif
+
+#ifndef A_DB_FILE
+#error Unknown DB system
+#endif
+
#include <gnome.h>
#include <locale.h>
#include "eazel-package-system-rpm3-private.h"
@@ -653,6 +663,82 @@ eazel_package_system_rpm3_create_dbs (EazelPackageSystemRpm3 *system,
rpmReadConfigFiles ("/usr/lib/rpm/rpmrc", NULL);
}
+/* This is not a safe way of lockchecking,
+ since after the check, a process may still gain
+ a lock on a_file.
+ This is not a major problem, as the case we're looking
+ for is when a process is running from start */
+static gboolean
+eazel_package_system_rpm3_db_locked (EazelPackageSystemRpm3 *system,
+ char *dbpath)
+{
+ char *a_file;
+ struct flock lock;
+ int fd;
+ gboolean result = FALSE;
+
+ lock.l_type = F_RDLCK;
+ lock.l_start = 0;
+ lock.l_whence = 0;
+ lock.l_len = 0;
+
+ a_file = g_strdup_printf ("%s/%s", dbpath, A_DB_FILE);
+ fd = open (a_file, O_RDONLY);
+
+ /* verbose (system, "lock checking %s", a_file); */
+
+ if (fd == -1) {
+ /* fail (system, "Could not get lock info for %s during open phase", a_file); */
+ } else {
+ if (fcntl (fd, F_SETLK, &lock)) {
+ fail (system, "Could not get lock for %s", a_file);
+ result = TRUE;
+ if (EAZEL_PACKAGE_SYSTEM (system)->err==NULL) {
+ EAZEL_PACKAGE_SYSTEM (system)->err = g_new0 (EazelPackageSystemError, 1);
+ EAZEL_PACKAGE_SYSTEM (system)->err->e = EazelPackageSystemError_DB_ACCESS;
+ EAZEL_PACKAGE_SYSTEM (system)->err->u.db_access.pid = lock.l_pid;
+ EAZEL_PACKAGE_SYSTEM (system)->err->u.db_access.path = dbpath;
+ }
+ } else {
+ result = FALSE;
+ }
+ }
+
+ close (fd);
+ g_free (a_file);
+
+ return result;
+}
+
+static gboolean
+eazel_package_system_rpm3_dbs_locked (EazelPackageSystemRpm3 *system)
+{
+ GList *iterator;
+ gboolean result = FALSE;
+ GList *remove = NULL;
+
+ for (iterator = system->private->dbpaths; iterator; iterator = g_list_next (g_list_next (iterator))) {
+ char *path;
+ char *foo = g_list_next (iterator)->data;
+
+ path = (char*)iterator->data;
+ if (eazel_package_system_rpm3_db_locked (system, path)) {
+ result = TRUE;
+ fail (system, "Removed %s since it's locked", path);
+ remove = g_list_prepend (remove, path);
+ remove = g_list_prepend (remove, foo);
+ }
+ }
+
+ for (iterator = remove; iterator; iterator = g_list_next (iterator)) {
+ system->private->dbpaths = g_list_remove (system->private->dbpaths, iterator->data);
+ g_hash_table_remove (system->private->db_to_root, iterator->data);
+ }
+ g_list_free (remove);
+
+ return result;
+}
+
static void
rpm_open_db (char *dbpath,
char *root,
@@ -675,16 +761,26 @@ rpm_open_db (char *dbpath,
}
}
-void
+gboolean
eazel_package_system_rpm3_open_dbs (EazelPackageSystemRpm3 *system)
{
g_assert (system);
g_assert (EAZEL_IS_PACKAGE_SYSTEM_RPM3 (system));
g_assert (system->private->dbs);
+ if (eazel_package_system_rpm3_dbs_locked (system)) {
+ g_warning ("Some db's are locked!");
+ }
+
+ if (g_hash_table_size (system->private->db_to_root) == 0) {
+ return FALSE;
+ }
+
g_hash_table_foreach (system->private->db_to_root,
(GHFunc)rpm_open_db,
system);
+
+ return TRUE;
}
static gboolean
@@ -838,19 +934,22 @@ eazel_package_system_rpm3_packagedata_fill_from_header (EazelPackageSystemRpm3 *
} else {
fullname = g_strdup (names[index]);
}
+#if 0
+ fprintf (stderr, "file_modes[%s] = 0%o %s\n",
+ fullname, file_modes[index],
+ (file_modes[index] & 040000) ? "DIR" : "file" );
+#endif
+
if (detail_level & PACKAGE_FILL_NO_DIRS_IN_PROVIDES) {
if (file_modes[index] & 040000) {
g_free (fullname);
fullname = NULL;
}
-#if 0
- fprintf (stderr, "file_modes[%s] = 0%o %s\n",
- fullname, file_modes[index],
- (file_modes[index] & 040000) ? "DIR" : "file" );
-#endif
}
if (fullname) {
- /* trilobite_debug ("%s provides %s", pack->name, fullname);*/
+#if 0
+ fprintf (stderr, "%s provides %s\n", pack->name, fullname);
+#endif
pack->provides = g_list_prepend (pack->provides, fullname);
}
}
@@ -920,8 +1019,24 @@ eazel_package_system_rpm3_packagedata_fill_from_header (EazelPackageSystemRpm3 *
free ((void*)requires_version);
}
- /* FIXME: bugzilla.eazel.com 5826
- Load in the features of the package */
+
+ if (~detail_level & PACAKGE_FILL_NO_FEATURES) {
+ const char **provides_name;
+ int count;
+ int index;
+
+ headerGetEntry (hd,
+ RPMTAG_PROVIDENAME, NULL,
+ (void**)&provides_name,
+ &count);
+
+ for (index = 0; index < count; index++) {
+ pack->features = g_list_prepend (pack->features,
+ g_strdup (provides_name[index]));
+ }
+
+ free ((void*)provides_name);
+ }
}
static gboolean
@@ -1158,6 +1273,13 @@ eazel_package_system_rpm3_query_foreach (char *dbpath,
pig->detail_level,
pig->result);
break;
+ case EAZEL_PACKAGE_SYSTEM_QUERY_REQUIRES_FEATURE:
+ eazel_package_system_rpm3_query_requires_feature (pig->system,
+ dbpath,
+ pig->key,
+ pig->detail_level,
+ pig->result);
+ break;
case EAZEL_PACKAGE_SYSTEM_QUERY_SUBSTR:
eazel_package_system_rpm3_query_substr (pig->system,
dbpath,
@@ -1211,6 +1333,21 @@ eazel_package_system_rpm3_query_requires (EazelPackageSystemRpm3 *system,
}
}
+void
+eazel_package_system_rpm3_query_requires_feature (EazelPackageSystemRpm3 *system,
+ const char *dbpath,
+ const gpointer *key,
+ int detail_level,
+ GList **result)
+{
+ (EAZEL_PACKAGE_SYSTEM_RPM3_CLASS (GTK_OBJECT (system)->klass)->query_impl) (EAZEL_PACKAGE_SYSTEM (system),
+ dbpath,
+ (gpointer)key,
+ EAZEL_PACKAGE_SYSTEM_QUERY_REQUIRES,
+ detail_level,
+ result);
+}
+
GList*
eazel_package_system_rpm3_query (EazelPackageSystemRpm3 *system,
const char *dbpath,
@@ -1230,7 +1367,10 @@ eazel_package_system_rpm3_query (EazelPackageSystemRpm3 *system,
pig.detail_level = detail_level;
pig.result = &result;
- eazel_package_system_rpm3_open_dbs (system);
+ if (!eazel_package_system_rpm3_open_dbs (system)) {
+ return NULL;
+ }
+
if (dbpath==NULL) {
g_hash_table_foreach (system->private->dbs,
(GHFunc)(EAZEL_PACKAGE_SYSTEM_RPM3_CLASS (GTK_OBJECT (system)->klass)->query_foreach),
@@ -1639,7 +1779,9 @@ eazel_package_system_rpm3_verify (EazelPackageSystemRpm3 *system,
info (system, "eazel_package_system_rpm3_verify");
- eazel_package_system_rpm3_open_dbs (system);
+ if (!eazel_package_system_rpm3_open_dbs (system)) {
+ return FALSE;
+ }
for (iterator = packages; iterator; iterator = g_list_next (iterator)) {
PackageData *pack = (PackageData*)iterator->data;
info[0] ++;
diff --git a/components/services/install/lib/eazel-package-system-types.c b/components/services/install/lib/eazel-package-system-types.c
index 537d28d24..d70f89858 100644
--- a/components/services/install/lib/eazel-package-system-types.c
+++ b/components/services/install/lib/eazel-package-system-types.c
@@ -320,10 +320,6 @@ packagedata_finalize (GtkObject *obj)
g_list_free (pack->depends);
pack->depends = NULL;
- g_list_foreach (pack->soft_depends, (GFunc)gtk_object_unref, NULL);
- g_list_free (pack->soft_depends);
- pack->soft_depends = NULL;
-
g_list_foreach (pack->breaks, (GFunc)gtk_object_unref, NULL);
g_list_free (pack->breaks);
pack->breaks = NULL;
@@ -394,7 +390,6 @@ packagedata_initialize (PackageData *package) {
package->conflicts_checked = FALSE;
package->install_root = NULL;
package->provides = NULL;
- package->soft_depends = NULL;
package->breaks = NULL;
package->modifies = NULL;
package->depends = NULL;
@@ -510,7 +505,6 @@ packagedata_copy (const PackageData *pack, gboolean deep)
result->md5 = g_strdup (pack->md5);
if (deep) {
- result->soft_depends = packagedata_list_copy (pack->soft_depends, TRUE);
result->depends = packagedata_deplist_copy (pack->depends, TRUE);
result->modifies = packagedata_list_copy (pack->modifies, TRUE);
@@ -589,12 +583,9 @@ packagedata_fill_in_missing (PackageData *package, const PackageData *full_packa
package->features = g_list_reverse (package->features);
}
if (! (fill_flags & PACKAGE_FILL_NO_DEPENDENCIES)) {
- g_list_foreach (package->soft_depends, (GFunc)gtk_object_unref, NULL);
g_list_foreach (package->depends, (GFunc)packagedependency_destroy, GINT_TO_POINTER (FALSE));
- package->soft_depends = NULL;
package->depends = NULL;
- package->soft_depends = packagedata_list_copy (full_package->soft_depends, TRUE);
package->depends = packagedata_deplist_copy (full_package->depends, TRUE);
}
package->fillflag = fill_flags;
@@ -608,7 +599,6 @@ packagedata_remove_soft_dep (PackageData *remove,
g_assert (from);
trilobite_debug ("removing %s from %s's deps", remove->name, from->name);
- from->soft_depends = g_list_remove (from->soft_depends, remove);
gtk_object_unref (GTK_OBJECT (remove));
}
@@ -872,12 +862,11 @@ packagedata_add_to_breaks (PackageData *pack, PackageBreaks *b)
}
void
-packagedata_add_pack_to_soft_depends (PackageData *pack, PackageData *b)
+packagedata_add_pack_to_depends (PackageData *pack, PackageDependency *b)
{
g_assert (pack);
g_assert (b);
- g_assert (pack != b);
- packagedata_add_pack_to (&pack->soft_depends, GTK_OBJECT (b));
+ pack->depends = g_list_prepend (pack->depends, b);
}
void
@@ -995,6 +984,9 @@ int
eazel_install_package_name_compare (PackageData *pack,
char *name)
{
+ if (pack->name == NULL) {
+ return -1;
+ }
return strcmp (pack->name, name);
}
@@ -1481,12 +1473,6 @@ packagedata_dump_int (const PackageData *package, gboolean deep, int indent)
g_string_sprintfa (out, "\n");
}
- if (package->soft_depends != NULL) {
- gstr_indent (out, indent);
- g_string_sprintfa (out, "Soft (old) depends: ");
- dump_package_list (out, package->soft_depends, deep, indent);
- g_string_sprintfa (out, "\n");
- }
if (package->depends != NULL) {
gstr_indent (out, indent);
g_string_sprintfa (out, "Depends: ");
diff --git a/components/services/install/lib/eazel-package-system-types.h b/components/services/install/lib/eazel-package-system-types.h
index 4a109ea70..d0e125e2c 100644
--- a/components/services/install/lib/eazel-package-system-types.h
+++ b/components/services/install/lib/eazel-package-system-types.h
@@ -187,7 +187,6 @@ struct _PackageData {
char* summary;
char* description;
- GList* soft_depends;
GList* depends; /* GList<PackageDependency *> */
GList* breaks; /* GList<PackageBreaks*> */
@@ -303,6 +302,7 @@ PackageDependency *packagedependency_new (void);
PackageDependency *packagedependency_copy (const PackageDependency *dep, gboolean deep);
void packagedependency_destroy (PackageDependency *dep);
+/* WAAH! */
#define PACKAGEDEPENDENCY(obj) ((PackageDependency*)(obj))
#define IS_PACKAGEDEPENDENCY(obj) (1)
@@ -383,7 +383,7 @@ GtkType packagefeaturemissing_get_type (void);
void packagedata_add_to_breaks (PackageData *pack, PackageBreaks *b);
void packagedata_add_pack_to_breaks (PackageData *pack, PackageData *b);
-void packagedata_add_pack_to_soft_depends (PackageData *pack, PackageData *b);
+void packagedata_add_pack_to_depends (PackageData *pack, PackageDependency *b);
void packagedata_add_pack_to_modifies (PackageData *pack, PackageData *b);
/*************************************************************************************************/
diff --git a/components/services/install/lib/eazel-package-system.c b/components/services/install/lib/eazel-package-system.c
index 15eec8b93..ef61eb792 100644
--- a/components/services/install/lib/eazel-package-system.c
+++ b/components/services/install/lib/eazel-package-system.c
@@ -29,7 +29,7 @@
#include <libtrilobite/trilobite-core-utils.h>
#include <libtrilobite/trilobite-md5-tools.h>
-#define EPS_DEBUG 1
+#undef EPS_DEBUG
enum {
START,
@@ -113,7 +113,7 @@ eazel_package_system_load_implementation (EazelPackageSystemId id, GList *roots)
break;
#endif
default:
- g_assert_not_reached ();
+ trilobite_debug ("EPS: Unsupported System");
};
if (module==NULL) {
@@ -237,13 +237,17 @@ eazel_package_system_load_package (EazelPackageSystem *system,
{
PackageData *result = NULL;
char md5[16];
+
EPS_SANE_VAL (system, NULL);
- g_assert (system->private->load_package);
- result = (*system->private->load_package) (system, in_package, filename, detail_level);
- if (result) {
- trilobite_md5_get_digest_from_file (filename, md5);
- result->md5 = g_strdup (trilobite_md5_get_string_from_md5_digest (md5));
+
+ if (system->private->load_package) {
+ result = (*system->private->load_package) (system, in_package, filename, detail_level);
+ if (result) {
+ trilobite_md5_get_digest_from_file (filename, md5);
+ result->md5 = g_strdup (trilobite_md5_get_string_from_md5_digest (md5));
+ }
}
+
return result;
}
@@ -255,13 +259,32 @@ eazel_package_system_query (EazelPackageSystem *system,
int detail_level)
{
GList *result = NULL;
+
EPS_SANE_VAL (system, NULL);
- g_assert (system->private->query);
- g_assert (key);
- result = (*system->private->query) (system, root, key, flag, detail_level);
+
+ if (system->private->query) {
+ g_assert (key);
+ result = (*system->private->query) (system, root, key, flag, detail_level);
+ }
+
return result;
}
+static void
+eazel_package_system_fail_all_packages (EazelPackageSystem *system,
+ EazelPackageSystemOperation op,
+ GList *packages)
+{
+ GList *iterator;
+
+ for (iterator = packages; iterator; iterator = g_list_next (iterator)) {
+ PackageData *p = PACKAGEDATA (iterator->data);
+ eazel_package_system_emit_start (system, op, p);
+ eazel_package_system_emit_failed (system, op, p);
+ eazel_package_system_emit_end (system, op, p);
+ }
+}
+
void
eazel_package_system_install (EazelPackageSystem *system,
const char *root,
@@ -269,15 +292,20 @@ eazel_package_system_install (EazelPackageSystem *system,
unsigned long flags)
{
EPS_SANE (system);
- g_assert (system->private->install);
-
- /* If we're in test mode, disable FORCE just to trigger
- any potiental errors */
- if (flags & EAZEL_PACKAGE_SYSTEM_OPERATION_TEST) {
- (*system->private->install) (system, root, packages,
- flags & ~EAZEL_PACKAGE_SYSTEM_OPERATION_FORCE);
+
+ if (system->private->install) {
+ /* If we're in test mode, disable FORCE just to trigger
+ any potiental errors */
+ if (flags & EAZEL_PACKAGE_SYSTEM_OPERATION_TEST) {
+ (*system->private->install) (system, root, packages,
+ flags & ~EAZEL_PACKAGE_SYSTEM_OPERATION_FORCE);
+ } else {
+ (*system->private->install) (system, root, packages, flags);
+ }
} else {
- (*system->private->install) (system, root, packages, flags);
+ eazel_package_system_fail_all_packages (system,
+ EAZEL_PACKAGE_SYSTEM_OPERATION_INSTALL,
+ packages);
}
}
@@ -288,8 +316,14 @@ eazel_package_system_uninstall (EazelPackageSystem *system,
unsigned long flags)
{
EPS_SANE (system);
- g_assert (system->private->uninstall);
- (*system->private->uninstall) (system, root, packages, flags);
+
+ if (system->private->uninstall) {
+ (*system->private->uninstall) (system, root, packages, flags);
+ } else {
+ eazel_package_system_fail_all_packages (system,
+ EAZEL_PACKAGE_SYSTEM_OPERATION_UNINSTALL,
+ packages);
+ }
}
gboolean
@@ -298,8 +332,14 @@ eazel_package_system_verify (EazelPackageSystem *system,
GList* packages)
{
EPS_SANE_VAL (system, FALSE);
- g_assert (system->private->verify);
- return (*system->private->verify) (system, dbpath, packages);
+ if (system->private->verify) {
+ return (*system->private->verify) (system, dbpath, packages);
+ } else {
+ eazel_package_system_fail_all_packages (system,
+ EAZEL_PACKAGE_SYSTEM_OPERATION_VERIFY,
+ packages);
+ return FALSE;
+ }
}
int
@@ -487,6 +527,7 @@ eazel_package_system_initialize (EazelPackageSystem *system) {
g_assert (EAZEL_IS_PACKAGE_SYSTEM (system));
system->private = g_new0 (EazelPackageSystemPrivate, 1);
+ system->err = NULL;
}
GtkType
@@ -537,7 +578,17 @@ eazel_package_system_new_real ()
EazelPackageSystem *
eazel_package_system_new_with_id (EazelPackageSystemId id, GList *roots)
{
- return eazel_package_system_load_implementation (id, roots);
+ EazelPackageSystem *result;
+
+ result = eazel_package_system_load_implementation (id, roots);
+
+ /* If we failed (eg. unsupported system id), return
+ an empty object */
+ if (result == NULL) {
+ result = eazel_package_system_new_real ();
+ }
+
+ return result;
}
/*
diff --git a/components/services/install/lib/eazel-package-system.h b/components/services/install/lib/eazel-package-system.h
index 7dba2ffe4..54e94d4fd 100644
--- a/components/services/install/lib/eazel-package-system.h
+++ b/components/services/install/lib/eazel-package-system.h
@@ -52,6 +52,7 @@ typedef enum {
EAZEL_PACKAGE_SYSTEM_QUERY_OWNS,
EAZEL_PACKAGE_SYSTEM_QUERY_PROVIDES,
EAZEL_PACKAGE_SYSTEM_QUERY_REQUIRES,
+ EAZEL_PACKAGE_SYSTEM_QUERY_REQUIRES_FEATURE,
EAZEL_PACKAGE_SYSTEM_QUERY_MATCHES,
EAZEL_PACKAGE_SYSTEM_QUERY_SUBSTR
} EazelPackageSystemQueryEnum;
@@ -95,12 +96,28 @@ typedef enum {
EAZEL_PACKAGE_SYSTEM_DEBUG_VERBOSE = 0xffff
} EazelPackageSystemDebug;
-typedef struct _EazelPackageSystemPrivate EazelPackageSystemPrivate;
+/* I hate myself for this... please, give me exceptions! */
+typedef enum {
+ EazelPackageSystemError_DB_ACCESS
+} EazelPackageSystemErrorEnum;
+
+typedef struct _EazelPackageSystemError EazelPackageSystemError;
+struct _EazelPackageSystemError {
+ EazelPackageSystemErrorEnum e;
+ union {
+ struct {
+ const char *path;
+ pid_t pid;
+ } db_access;
+ } u;
+};
+typedef struct _EazelPackageSystemPrivate EazelPackageSystemPrivate;
struct _EazelPackageSystem
{
GtkObject parent;
EazelPackageSystemPrivate *private;
+ EazelPackageSystemError *err;
};
EazelPackageSystemId eazel_package_system_suggest_id (void);
@@ -141,6 +158,5 @@ gboolean eazel_package_system_verify (EazelPackageSystem *packag
int eazel_package_system_compare_version (EazelPackageSystem *package_system,
const char *a,
const char *b);
-
#endif /* EAZEL_PACKAGE_SYSTEM_PUBLIC_H */
diff --git a/components/services/install/lib/eazel-softcat.c b/components/services/install/lib/eazel-softcat.c
index 27ec0d77e..c7700a5bf 100644
--- a/components/services/install/lib/eazel-softcat.c
+++ b/components/services/install/lib/eazel-softcat.c
@@ -589,6 +589,7 @@ get_search_url_for_package (EazelSoftCat *softcat, const PackageData *package, i
/* directories will end with '/' */
/* TEMPORARY FIXME: to work around a very odd bug in softcat, throw away duplicate filenames */
+
static void
remove_directories_from_provides_list (PackageData *pack)
{
@@ -725,17 +726,51 @@ eazel_softcat_get_info (EazelSoftCat *softcat, PackageData *package, int sense_f
}
if (g_list_length (packages) > 1) {
- g_warning ("softcat query returned %d results!", g_list_length (packages));
- g_list_foreach (packages, (GFunc)gtk_object_unref, NULL);
- g_list_free (packages);
- err = EAZEL_SOFTCAT_ERROR_MULTIPLE_RESPONSES;
- return err;
- }
-
- full_package = PACKAGEDATA (packages->data);
- packagedata_fill_in_missing (package, full_package, fill_flags);
- if (fill_flags & PACKAGE_FILL_NO_DIRS_IN_PROVIDES) {
- remove_directories_from_provides_list (package);
+ if (package->suite_id) {
+ /* More than one package returned and we queried on a suite Id.
+ Make deps and put into "package", remember to strip dirs in
+ provides if needed */
+ GList *iterator;
+
+ trilobite_debug ("softcat query returned suite with %d elements",
+ g_list_length (packages));
+ for (iterator = packages; iterator; iterator = g_list_next (iterator)) {
+ PackageData *pack = PACKAGEDATA (iterator->data);
+ PackageDependency *dep = g_new0 (PackageDependency, 1);
+
+ if (fill_flags & PACKAGE_FILL_NO_DIRS_IN_PROVIDES) {
+ remove_directories_from_provides_list (pack);
+ }
+ gtk_object_ref (GTK_OBJECT (pack));
+ pack->fillflag = fill_flags;
+
+ dep->package = pack;
+ dep->version = g_strdup (pack->version);
+
+ if (dep->version) {
+ /* FIXME: should a suite be EQ or GE ? If GE, any newer version
+ that's already installed will be ok, if EQ, the suites depends
+ on an exact version */
+ dep->sense = EAZEL_SOFTCAT_SENSE_GE;
+ } else {
+ dep->sense = EAZEL_SOFTCAT_SENSE_ANY;
+ }
+
+ packagedata_add_pack_to_depends (package, dep);
+ }
+ } else {
+ g_warning ("softcat query returned %d results!", g_list_length (packages));
+ err = EAZEL_SOFTCAT_ERROR_MULTIPLE_RESPONSES;
+ g_list_foreach (packages, (GFunc)gtk_object_unref, NULL);
+ g_list_free (packages);
+ return err;
+ }
+ } else {
+ full_package = PACKAGEDATA (packages->data);
+ packagedata_fill_in_missing (package, full_package, fill_flags);
+ if (fill_flags & PACKAGE_FILL_NO_DIRS_IN_PROVIDES) {
+ remove_directories_from_provides_list (package);
+ }
}
g_list_foreach (packages, (GFunc)gtk_object_unref, NULL);
g_list_free (packages);