diff options
author | Eskil Heyn Olsen <eskil@eazel.com> | 2001-02-01 10:49:04 +0000 |
---|---|---|
committer | Eskil Heyn Olsen <eskil@src.gnome.org> | 2001-02-01 10:49:04 +0000 |
commit | d9cc084ea1217dce048b00f5b32614b15205b7e8 (patch) | |
tree | cf8917fd809381bde50ce4e0e112b5832b78666f /components | |
parent | 33f219c3e08f31fb1489af13247c25d1cb9b3e91 (diff) | |
download | nautilus-d9cc084ea1217dce048b00f5b32614b15205b7e8.tar.gz |
This patch is temporarily going to break a few things, will sync up with
2001-02-01 Eskil Heyn Olsen <eskil@eazel.com>
This patch is temporarily going to break a few things, will sync
up with Robey tomorrow. Eg. eazel-install (cli tool) now sigsegvs
on error.
* components/rpmview/nautilus-rpm-view-install.c:
s/packagedata_destroy/gtk_object_unref/
* components/rpmview/nautilus-rpm-view.c:
(nautilus_rpm_view_destroy):
s/packagedata_destroy/gtk_object_unref/
* components/services/install/command-line/eazel-alt-install-corba.
c: (eazel_preflight_check_signal):
If there were problems, abort.
* components/services/install/command-line/eazel-test-softcat.c:
(main):
* components/services/install/lib/eazel-install-corba-callback.c:
(impl_download_progress), (impl_download_failed), (impl_dep_check),
(impl_install_progress), (impl_uninstall_progress),
(impl_md5_check_failed):
* components/services/install/lib/eazel-install-corba.c:
(impl_Eazel_Install_simple_query):
s/packagedata_destroy/gtk_object_unref/
* components/services/install/lib/eazel-install-logic.c:
(eazel_install_download_packages),
(eazel_install_check_for_file_conflicts), (ei_revert_transaction),
(eazel_install_do_transaction_all_files_check),
(eazel_install_prune_packages), (eazel_install_fetch_dependencies),
(eazel_install_do_file_conflict_check),
(eazel_uninstall_upward_traverse),
(eazel_uninstall_downward_traverse),
(eazel_uninstall_check_for_install):
ifdeffed out a lot of old code that's no longer used, but it still
compiles. logic.c will soon be entirely removed.
s/packagedata_destroy/gtk_object_unref/
Uninstall stuff uses the new PackageBreaks objects.
* components/services/install/lib/eazel-install-logic2.c:
(dump_tree_helper), (eazel_install_check_existing_packages),
(get_softcat_info), (dedupe_foreach_depends), (is_satisfied),
(check_update_for_no_more_file_conflicts), (check_tree_helper),
(find_break_by_package_name), (add_file_conflict),
(check_no_two_packages_has_same_file),
(package_is_upgrading_and_doesnt_need_file),
(check_conflicts_against_already_installed_packages),
(check_feature_consistency), (install_packages_helper):
Nicer output.
Fixes 6172 and 6173.
s/packagedata_destroy/gtk_object_unref/
* components/services/install/lib/eazel-install-protocols.c:
Removed unused define
* components/services/install/lib/eazel-install-rpm-glue.c:
(eazel_install_do_rpm_dependency_check):
More code ifdeffed out, see comment for eazel-install-logic.c
* components/services/install/lib/eazel-install-xml-package-list.c:
(parse_package), (eazel_install_packagedata_to_xml_int),
(eazel_install_packagelist_to_xml), (osd_parse_shared):
Use the new PackageBreak objects.
* components/services/install/lib/eazel-package-system-rpm3.c:
(make_rpm_argument_list), (rpm_packagedata_new_from_file),
(eazel_package_system_rpm3_query_impl),
(eazel_package_system_rpm3_compare_version):
s/packagedata_destroy/gtk_object_unref/
* components/services/install/lib/eazel-package-system-types.h:
* components/services/install/lib/eazel-package-system-types.c:
(categorydata_destroy_foreach), (packagedependency_new),
(packagedependency_copy), (packagedependency_destroy),
(packagedata_finalize), (packagedata_class_initialize),
(packagedata_initialize), (packagedata_copy),
(packagedata_remove_soft_dep), (packagedata_get_readable_name),
(packagedata_add_pack_to), (packagedata_add_to_breaks),
(packagedata_add_pack_to_soft_depends),
(packagedata_add_pack_to_modifies), (packagedata_list_prune),
(add_string_list), (dump_package_break_list),
(packagedata_dump_int), (packagebreaks_finalize),
(packagebreaks_class_initialize), (packagebreaks_initialize),
(packagebreaks_get_type), (packagebreaks_new),
(packagebreaks_set_package), (packagebreaks_get_package),
(packagefileconflict_finalize),
(packagefileconflict_class_initialize),
(packagefileconflict_initialize), (packagefileconflict_get_type),
(packagefileconflict_new), (packagefeaturemissing_finalize),
(packagefeaturemissing_class_initialize),
(packagefeaturemissing_initialize),
(packagefeaturemissing_get_type), (packagefeaturemissing_new):
s/packagedata_destroy/gtk_object_unref/
Wrote some objects representing package breakage.
* components/services/install/lib/eazel-package-system.c:
(eazel_package_system_is_installed):
s/packagedata_destroy/gtk_object_unref/
* components/services/install/lib/eazel-softcat.c:
(eazel_softcat_available_update):
Fixed the function so it matches the intended semantics
* components/services/install/nautilus-view/nautilus-service-instal
l-view.c: (nautilus_service_install_view_update_from_uri):
s/packagedata_destroy/gtk_object_unref/
Merge from PR3 branch
2001-01-26 Eskil Olsen <eskil@eazel.com>
reviewed by: Ramiri Estrugo <ramiro@eazel.com>
* components/services/install/command-line/eazel-test-packsys.c:
(test_version_compare):
Testing the Mozilla hack...
* components/services/install/lib/eazel-package-system-rpm3.c:
(eazel_package_system_rpm3_compare_version):
Special case for Mxx versions because rpmvercmp is not obeying
the laws of mathematics...
* components/services/install/lib/eazel-softcat.c:
(get_search_url_for_package):
Fix for 6055 - no longer use hardcoded RedHat62 as distro.
Diffstat (limited to 'components')
20 files changed, 769 insertions, 275 deletions
diff --git a/components/rpmview/nautilus-rpm-view-install.c b/components/rpmview/nautilus-rpm-view-install.c index d5487e361..69528fad9 100644 --- a/components/rpmview/nautilus-rpm-view-install.c +++ b/components/rpmview/nautilus-rpm-view-install.c @@ -28,10 +28,6 @@ #include "libtrilobite/libtrilobite.h" #include "nautilus-rpm-view-private.h" -/* don't try to access a remote server for install */ -#define DEFAULT_SERVICES_HOST "" -#define DEFAULT_SERVICES_PORT 80 - #define OAF_ID "OAFIID:trilobite_eazel_install_service:8ff6e815-1992-437c-9771-d932db3b4a17" static void @@ -252,7 +248,7 @@ nautilus_rpm_view_install_done (EazelInstallCallback *service, detailed, GTK_WINDOW (window)); - /* gnome_dialog_run_and_close (d); */ + gnome_dialog_run_and_close (d); g_free (terse); g_free (dialog_title); g_free (detailed); @@ -268,9 +264,8 @@ nautilus_rpm_view_install_done (EazelInstallCallback *service, CORBA_exception_free (&ev); } - nautilus_rpm_view_finished_working (rpm_view); - + tmp = g_strdup (nautilus_rpm_view_get_uri (rpm_view)); nautilus_rpm_view_load_uri (rpm_view, tmp); g_free (tmp); @@ -388,6 +383,29 @@ preflight_check (EazelInstallCallback *cb, const GList *packages, return TRUE; } +static void +nautilus_rpm_view_set_server (NautilusRPMView *rpm_view, + EazelInstallCallback *cb, + CORBA_Environment *ev) +{ + int port; + char *host, *p; + + /* get default host/port */ + host = g_strdup (trilobite_get_services_address ()); + if ((p = strchr (host, ':')) != NULL) { + *p = 0; + } + /* always go for the no auth port */ + port = 80; + + GNOME_Trilobite_Eazel_Install__set_server (eazel_install_callback_corba_objref (cb), host, ev); + GNOME_Trilobite_Eazel_Install__set_server_port (eazel_install_callback_corba_objref (cb), port, ev); + + /* For now always set auth to FALSE, so users are not required to + login to services to install local rpm files */ + GNOME_Trilobite_Eazel_Install__set_auth (eazel_install_callback_corba_objref (cb), FALSE, ev); +} void nautilus_rpm_view_install_package_callback (GtkWidget *widget, @@ -417,9 +435,8 @@ nautilus_rpm_view_install_package_callback (GtkWidget *widget, rpm_view->details->root_client = set_root_client (eazel_install_callback_bonobo (cb), rpm_view); GNOME_Trilobite_Eazel_Install__set_protocol (eazel_install_callback_corba_objref (cb), GNOME_Trilobite_Eazel_PROTOCOL_HTTP, &ev); - GNOME_Trilobite_Eazel_Install__set_server (eazel_install_callback_corba_objref (cb), DEFAULT_SERVICES_HOST, &ev); - GNOME_Trilobite_Eazel_Install__set_server_port (eazel_install_callback_corba_objref (cb), DEFAULT_SERVICES_PORT, &ev); - + nautilus_rpm_view_set_server (rpm_view, cb, &ev); + gtk_signal_connect (GTK_OBJECT (cb), "download_progress", nautilus_rpm_view_download_progress_signal, rpm_view); gtk_signal_connect (GTK_OBJECT (cb), "install_progress", nautilus_rpm_view_install_progress_signal, rpm_view); gtk_signal_connect (GTK_OBJECT (cb), "dependency_check", nautilus_rpm_view_dependency_check, rpm_view); @@ -432,7 +449,7 @@ nautilus_rpm_view_install_package_callback (GtkWidget *widget, eazel_install_callback_install_packages (cb, categories, NULL, &ev); /* Leak the categories here */ - + CORBA_exception_free (&ev); } diff --git a/components/rpmview/nautilus-rpm-view.c b/components/rpmview/nautilus-rpm-view.c index 3245f6cc2..78ba94819 100644 --- a/components/rpmview/nautilus-rpm-view.c +++ b/components/rpmview/nautilus-rpm-view.c @@ -395,7 +395,7 @@ nautilus_rpm_view_destroy (GtkObject *object) #ifdef EAZEL_SERVICES pack = (PackageData *) gtk_object_get_data (GTK_OBJECT (rpm_view), "packagedata"); if (pack) { - packagedata_destroy (pack, TRUE); + gtk_object_unref (GTK_OBJECT (pack)); } if (rpm_view->details->root_client) { diff --git a/components/services/install-view/nautilus-service-install-view.c b/components/services/install-view/nautilus-service-install-view.c index 2cd4db4b8..747d2ec12 100644 --- a/components/services/install-view/nautilus-service-install-view.c +++ b/components/services/install-view/nautilus-service-install-view.c @@ -1506,7 +1506,7 @@ nautilus_service_install_view_update_from_uri (NautilusServiceInstallView *view, pack = (PackageData*) gtk_object_get_data (GTK_OBJECT (view), "packagedata"); if (pack != NULL) { /* Destroy the old */ - packagedata_destroy (pack, TRUE); + gtk_object_unref (GTK_OBJECT (pack)); } /* find the package data for the package we're about to install */ diff --git a/components/services/install/command-line/eazel-alt-install-corba.c b/components/services/install/command-line/eazel-alt-install-corba.c index 6c704b7b4..dc171cd1f 100644 --- a/components/services/install/command-line/eazel-alt-install-corba.c +++ b/components/services/install/command-line/eazel-alt-install-corba.c @@ -526,6 +526,8 @@ eazel_preflight_check_signal (EazelInstallCallback *service, { const GList *iterator; + if (cases) return FALSE; + fprintf (stdout, "About to %s a total of %d packages, %dKb\n", arg_erase ? "uninstall" : "install", total_packages, total_bytes/1024); diff --git a/components/services/install/command-line/eazel-test-packsys.c b/components/services/install/command-line/eazel-test-packsys.c index cbcb3bfbc..faa1a0878 100644 --- a/components/services/install/command-line/eazel-test-packsys.c +++ b/components/services/install/command-line/eazel-test-packsys.c @@ -113,6 +113,15 @@ test_is_installed (EazelPackageSystem *packsys) static void test_version_compare (EazelPackageSystem *packsys) { + g_message ("version compare M1 is %s", + eazel_package_system_compare_version (packsys, "M18", "M17") > 0 ? "ok" : "FAILED"); + g_message ("version compare M2 is %s", + eazel_package_system_compare_version (packsys, "M17", "M18") < 0 ? "ok" : "FAILED"); + g_message ("version compare M3 is %s", + eazel_package_system_compare_version (packsys, "M18", "0.7") < 0 ? "ok" : "FAILED"); + g_message ("version compare M4 is %s", + eazel_package_system_compare_version (packsys, "0.7", "M18") > 0 ? "ok" : "FAILED"); + g_message ("version compare 1 is %s", eazel_package_system_compare_version (packsys, "1.0", "1.1") < 0 ? "ok" : "FAILED"); g_message ("version compare 2 is %s", diff --git a/components/services/install/command-line/eazel-test-softcat.c b/components/services/install/command-line/eazel-test-softcat.c index cc4a025de..46c8dca51 100644 --- a/components/services/install/command-line/eazel-test-softcat.c +++ b/components/services/install/command-line/eazel-test-softcat.c @@ -125,7 +125,7 @@ main (int argc, char **argv) info = packagedata_dump (newpack, arg_verbose ? TRUE : FALSE); printf ("%s\n", info); g_free (info); - packagedata_destroy (newpack, TRUE); + gtk_object_unref (GTK_OBJECT (newpack)); } else { printf ("No new package available.\n"); } @@ -142,7 +142,7 @@ main (int argc, char **argv) } package_list = g_list_remove (package_list, package); - packagedata_destroy (package, TRUE); + gtk_object_unref (GTK_OBJECT (package)); } return 0; diff --git a/components/services/install/lib/eazel-install-corba-callback.c b/components/services/install/lib/eazel-install-corba-callback.c index 2115a1824..e9ffaf76c 100644 --- a/components/services/install/lib/eazel-install-corba-callback.c +++ b/components/services/install/lib/eazel-install-corba-callback.c @@ -79,7 +79,7 @@ impl_download_progress (impl_POA_GNOME_Trilobite_Eazel_InstallCallback *servant, pack = packagedata_from_corba_packagedatastruct (*corbapack); gtk_signal_emit (GTK_OBJECT (servant->object), signals[DOWNLOAD_PROGRESS], pack, amount, total); - packagedata_destroy (pack, TRUE); + gtk_object_unref (GTK_OBJECT (pack)); } static CORBA_boolean @@ -124,7 +124,7 @@ impl_download_failed (impl_POA_GNOME_Trilobite_Eazel_InstallCallback *servant, pack = packagedata_from_corba_packagedatastruct (*corbapack); gtk_signal_emit (GTK_OBJECT (servant->object), signals[DOWNLOAD_FAILED], pack); - packagedata_destroy (pack, TRUE); + gtk_object_unref (GTK_OBJECT (pack)); } static void @@ -137,8 +137,8 @@ impl_dep_check (impl_POA_GNOME_Trilobite_Eazel_InstallCallback *servant, pack = packagedata_from_corba_packagedatastruct (*corbapack); needs = packagedata_from_corba_packagedatastruct (*corbaneeds); gtk_signal_emit (GTK_OBJECT (servant->object), signals[DEPENDENCY_CHECK], pack, needs); - packagedata_destroy (pack, TRUE); - packagedata_destroy (needs, TRUE); + gtk_object_unref (GTK_OBJECT (pack)); + gtk_object_unref (GTK_OBJECT (needs)); } static void @@ -156,7 +156,7 @@ impl_install_progress (impl_POA_GNOME_Trilobite_Eazel_InstallCallback *servant, package_num, num_packages, package_size_completed, package_size_total, total_size_completed, total_size); - packagedata_destroy (pack, TRUE); + gtk_object_unref (GTK_OBJECT (pack)); } static void @@ -169,7 +169,7 @@ impl_uninstall_progress (impl_POA_GNOME_Trilobite_Eazel_InstallCallback *servant PackageData *pack; pack = packagedata_from_corba_packagedatastruct (*corbapack); gtk_signal_emit (GTK_OBJECT (servant->object), signals[UNINSTALL_PROGRESS], pack, amount, total); - packagedata_destroy (pack, TRUE); + gtk_object_unref (GTK_OBJECT (pack)); } static void @@ -181,7 +181,7 @@ impl_md5_check_failed (impl_POA_GNOME_Trilobite_Eazel_InstallCallback *servant, PackageData *pack; pack = packagedata_from_corba_packagedatastruct (*corbapack); gtk_signal_emit (GTK_OBJECT (servant->object), signals[MD5_CHECK_FAILED], pack, actual_md5); - packagedata_destroy (pack, TRUE); + gtk_object_unref (GTK_OBJECT (pack)); } static void diff --git a/components/services/install/lib/eazel-install-corba.c b/components/services/install/lib/eazel-install-corba.c index 2252f9976..f091d41ce 100644 --- a/components/services/install/lib/eazel-install-corba.c +++ b/components/services/install/lib/eazel-install-corba.c @@ -493,7 +493,7 @@ impl_Eazel_Install_simple_query (impl_POA_GNOME_Trilobite_Eazel_Install *servant result = GNOME_Trilobite_Eazel_PackageDataStructList__alloc (); (*result) = corba_packagedatastructlist_from_packagedata_list (tmp_result); - g_list_foreach (tmp_result, (GFunc)packagedata_destroy, GINT_TO_POINTER (TRUE)); + g_list_foreach (tmp_result, (GFunc)gtk_object_unref, NULL); return result; } diff --git a/components/services/install/lib/eazel-install-logic.c b/components/services/install/lib/eazel-install-logic.c index 792ddc019..38dbc9922 100644 --- a/components/services/install/lib/eazel-install-logic.c +++ b/components/services/install/lib/eazel-install-logic.c @@ -71,12 +71,12 @@ static gboolean eazel_install_download_packages (EazelInstall *service, gboolean toplevel, GList **packages, GList **failed_packages); - +#if 0 static gboolean eazel_install_check_for_file_conflicts (EazelInstall *service, PackageData *pack, GList **breaks, GList **requires); - +#endif static void eazel_install_prune_packages (EazelInstall *service, PackageData *pack, ...); @@ -174,6 +174,9 @@ eazel_install_download_packages (EazelInstall *service, GList **packages, GList **failed_packages) { + g_assert_not_reached (); + return TRUE; +#if 0 GList *iterator; gboolean result = TRUE; GList *remove_list = NULL; @@ -285,8 +288,9 @@ eazel_install_download_packages (EazelInstall *service, } return result; +#endif } - +#if 0 /* This function checks all files in pack->provides, and checks if another already installed package owns this file. @@ -366,7 +370,7 @@ eazel_install_check_for_file_conflicts (EazelInstall *service, g_list_find_custom (*requires, owner->name, (GCompareFunc)eazel_install_package_name_compare)) { /* trilobite_debug ("already breaking %s", owner->name); */ - packagedata_destroy (owner, TRUE); + gtk_object_unref (GTK_OBJECT (owner)); owner = NULL; continue; } @@ -390,7 +394,7 @@ eazel_install_check_for_file_conflicts (EazelInstall *service, } else { /* else it's the same package and it's okay */ /* so FREE IT YOU SICK MONKEY! */ - packagedata_destroy (owner, TRUE); + gtk_object_unref (GTK_OBJECT (owner)); } } /* free the _simple_query result list */ @@ -404,6 +408,7 @@ eazel_install_check_for_file_conflicts (EazelInstall *service, } return result; } +#endif static gboolean eazel_install_do_install_packages (EazelInstall *service, @@ -569,7 +574,7 @@ ei_revert_transaction (EazelInstall *service, eazel_install_set_update (service, TRUE); cat->packages = upgrade; result |= ei_install_packages (service, categories); - g_list_foreach (upgrade, (GFunc)packagedata_destroy, GINT_TO_POINTER (TRUE)); + g_list_foreach (upgrade, (GFunc)gtk_object_unref, NULL); } return result; @@ -691,6 +696,9 @@ static gboolean eazel_install_do_transaction_all_files_check (EazelInstall *service, GList **packages) { + g_assert_not_reached (); + return FALSE; +#if 0 gboolean result = TRUE; GList *iterator; GList *conflicts = NULL; /* PackageRequirements. ->package is the first found package @@ -763,11 +771,12 @@ eazel_install_do_transaction_all_files_check (EazelInstall *service, trilobite_debug ("Conflict between %s and %s", req->package->name, req->required->name); req->package->status = PACKAGE_FILE_CONFLICT; req->required->status = PACKAGE_FILE_CONFLICT; - packagedata_add_pack_to_breaks (req->package, req->required); + Xpackagedata_add_pack_to_breaks (req->package, req->required); eazel_install_prune_packages (service, req->package, packages, NULL); } return result; +#endif } @@ -1018,7 +1027,7 @@ eazel_install_prune_packages (EazelInstall *service, for (iterator = pruned; iterator; iterator = g_list_next (iterator)) { PackageData *pack; pack = (PackageData*)iterator->data; - packagedata_destroy (pack, TRUE); + gtk_object_unref (GTK_OBJECT (pack)); }; */ @@ -1026,7 +1035,7 @@ eazel_install_prune_packages (EazelInstall *service, va_end (ap); } - +#if 0 static void eazel_install_add_to_extras_foreach (char *key, GList *list, GList **extrapackages) { @@ -1038,7 +1047,7 @@ eazel_install_add_to_extras_foreach (char *key, GList *list, GList **extrapackag } g_list_free (list); } - +#endif /* This function tests wheter "package" and "dep" @@ -1126,6 +1135,9 @@ eazel_install_fetch_dependencies (EazelInstall *service, GList **failedpackages, GList *requirements) { + g_assert_not_reached (); + return FALSE; +#if 0 GList *iterator; /* Contains the packages downloaded when handling the list of requirements */ GList *extras_in_this_batch = NULL; @@ -1150,7 +1162,7 @@ eazel_install_fetch_dependencies (EazelInstall *service, tmp = packagedata_get_readable_name (pack); trilobite_debug ("%s already failed, will not download it's requirements", tmp); g_free (tmp); - packagedata_destroy (dep, TRUE); + gtk_object_unref (GTK_OBJECT (dep)); continue; } @@ -1193,7 +1205,7 @@ eazel_install_fetch_dependencies (EazelInstall *service, if (pack_entry) { PackageData *evil_package = packagedata_copy ((PackageData*)(pack_entry->data), FALSE); - packagedata_add_pack_to_breaks (dep, evil_package); + Xpackagedata_add_pack_to_breaks (dep, evil_package); trilobite_debug ("Circular dependency caused by %s-%s-%s at 0x%p", evil_package->name, evil_package->version, @@ -1241,7 +1253,7 @@ eazel_install_fetch_dependencies (EazelInstall *service, I suspect that adding this to adding evil_package to pack's breaks might yield a more pleasant tree */ PackageData *evil_package = (PackageData*)pack_entry->data; - packagedata_add_pack_to_breaks (evil_package, dep); + Xpackagedata_add_pack_to_breaks (evil_package, dep); evil_package->status = PACKAGE_BREAKS_DEPENDENCY; } else { trilobite_debug ("This is also Bad: I cannot set the funky break list"); @@ -1354,6 +1366,7 @@ eazel_install_fetch_dependencies (EazelInstall *service, } else { return TRUE; } +#endif } static void @@ -1465,6 +1478,8 @@ eazel_install_do_file_conflict_check (EazelInstall *service, GList **failedpackages, GList **requirements) { + g_assert_not_reached (); +#if 0 GList *iterator; GList *tmp_failed = NULL; @@ -1491,8 +1506,8 @@ eazel_install_do_file_conflict_check (EazelInstall *service, if (g_list_find_custom (*packages, required_pack->name, (GCompareFunc)eazel_install_package_name_compare)) { - trilobite_debug ("but we're updating it (requirement)"); - /* packagedata_destroy (broken_package, FALSE); */ + trilobite_debug ("but we'e updating it (requirement)"); + /* gtk_object_unref (GTK_OBJECT (broken_package)); */ } else { PackageRequirement *req; req = packagerequirement_new (pack, required_pack); @@ -1510,10 +1525,10 @@ eazel_install_do_file_conflict_check (EazelInstall *service, broken_package->name, (GCompareFunc)eazel_install_package_name_compare)) { trilobite_debug ("but we're updating it"); - /* packagedata_destroy (broken_package, FALSE); */ + /* gtk_object_unref (GTK_OBJECT (broken_package)); */ } else { fail_it = TRUE; - packagedata_add_pack_to_breaks (pack, broken_package); + Xpackagedata_add_pack_to_breaks (pack, broken_package); } } if (fail_it) { @@ -1532,6 +1547,7 @@ eazel_install_do_file_conflict_check (EazelInstall *service, (*failedpackages) = g_list_prepend (*failedpackages, cpack); (*packages) = g_list_remove (*packages, cpack); } +#endif } /* @@ -1747,14 +1763,19 @@ eazel_uninstall_upward_traverse (EazelInstall *service, if (g_list_find_custom (*breaks, (gpointer)requiredby->name, (GCompareFunc)eazel_install_package_name_compare)) { trilobite_debug ("skip %s", requiredby->name); - packagedata_destroy (requiredby, TRUE); + gtk_object_unref (GTK_OBJECT (requiredby)); requiredby = NULL; continue; } */ /* Guess not, mark it as breaking (and that pack is the offender */ - packagedata_add_pack_to_breaks (pack, requiredby); + { + PackageFeatureMissing *breakage = packagefeaturemissing_new (); + packagebreaks_set_package (PACKAGEBREAKS (breakage), requiredby); + packagedata_add_to_breaks (pack, PACKAGEBREAKS (breakage)); + gtk_object_unref (GTK_OBJECT (requiredby)); + } (*breaks) = g_list_prepend ((*breaks), requiredby); /* If the package has not been failed yet (and is a toplevel), @@ -1859,7 +1880,7 @@ eazel_uninstall_downward_traverse (EazelInstall *service, PACKAGE_FILL_NO_DIRS_IN_PROVIDES); packagedata_list_prune (&second_matches, *packages, TRUE, TRUE); packagedata_list_prune (&second_matches, *requires, TRUE, TRUE); - packagedata_destroy (tmp_pack, TRUE); + gtk_object_unref (GTK_OBJECT (tmp_pack)); /* Iterate over all packages that match the required package */ for (second_match_iterator = second_matches; @@ -1873,7 +1894,7 @@ eazel_uninstall_downward_traverse (EazelInstall *service, g_list_find_custom (*packages, isrequired->name, (GCompareFunc)eazel_install_package_name_compare)) { trilobite_debug ("skipped %s", isrequired->name); - packagedata_destroy (isrequired, TRUE);\ + gtk_object_unref (GTK_OBJECT (isrequired));\ isrequired = NULL; continue; } @@ -1903,11 +1924,10 @@ eazel_uninstall_downward_traverse (EazelInstall *service, isrequired->name); print_package_list ("BY", third_matches, FALSE); g_list_foreach (third_matches, - (GFunc)packagedata_destroy, - GINT_TO_POINTER (TRUE)); + (GFunc)gtk_object_unref, NULL); g_list_free (third_matches); third_matches = NULL; - packagedata_destroy (isrequired, TRUE); + gtk_object_unref (GTK_OBJECT (isrequired)); isrequired = NULL; } else { trilobite_debug ("Also nuking %s", isrequired->name); @@ -1928,7 +1948,7 @@ eazel_uninstall_downward_traverse (EazelInstall *service, headerFree (hd); } - g_list_foreach (matches, (GFunc)packagedata_destroy, GINT_TO_POINTER (TRUE)); + g_list_foreach (matches, (GFunc)gtk_object_unref, NULL); g_list_free (matches); matches = NULL; } @@ -1982,7 +2002,7 @@ eazel_uninstall_check_for_install (EazelInstall *service, any = TRUE; result = g_list_prepend (result, matched); } else { - packagedata_destroy (matched, TRUE); + gtk_object_unref (GTK_OBJECT (matched)); } } @@ -2008,7 +2028,7 @@ eazel_uninstall_check_for_install (EazelInstall *service, trilobite_debug ("g_list_length (*packages) = %d", g_list_length (*packages)); trilobite_debug ("g_list_length (result) = %d", g_list_length (result)); - g_list_foreach (*packages, (GFunc)packagedata_destroy, FALSE); + g_list_foreach (*packages, (GFunc)gtk_object_unref, NULL); g_list_free (*packages); (*packages) = result; diff --git a/components/services/install/lib/eazel-install-logic2.c b/components/services/install/lib/eazel-install-logic2.c index 147ee8d8d..c056967ac 100644 --- a/components/services/install/lib/eazel-install-logic2.c +++ b/components/services/install/lib/eazel-install-logic2.c @@ -43,7 +43,7 @@ 0x4 enables random spewing 0x8 enables dumping the final tree */ -#define EI2_DEBUG 0xff +#define EI2_DEBUG 0x0 #define PATCH_FOR_SOFTCAT_BUG 1 #define MUST_HAVE PACKAGE_FILL_NO_DIRS_IN_PROVIDES @@ -74,21 +74,22 @@ dump_tree_helper (GList *packages, char *indent, GList *path) } name = packagedata_get_readable_name (pack); - trilobite_debug ("%s%p (%s) %s %s%s", + trilobite_debug ("%s%p (%s) %s %s%s %s", indent, pack, name, pack->eazel_id, - pack->fillflag & MUST_HAVE ? "filled" : "not filled", - pack->status == PACKAGE_CANNOT_OPEN ? " but failed" : ""); + (pack->fillflag & MUST_HAVE) ? "filled" : "not filled", + (pack->status == PACKAGE_CANNOT_OPEN) ? " but failed" : "", + pack->md5); tmp = g_strdup_printf ("%s ", indent); - if (g_list_find_custom (path, name, (GCompareFunc)strcmp)) { - trilobite_debug ("%s... %p %s recurses .., softcat is probably in flux", indent, pack, pack->name); + if (g_list_find (path, pack)) { + trilobite_debug ("%s... %p %s recurses ..", indent, pack, pack->name); } else { - path = g_list_prepend (path, name); + path = g_list_prepend (path, pack); dump_tree_helper (pack->depends, tmp, path); + path = g_list_remove (path, pack); } - path = g_list_remove (path, name); g_free (name); g_free (tmp); } @@ -288,7 +289,7 @@ eazel_install_check_existing_packages (EazelInstall *service, #if EI2_DEBUG & 0x4 trilobite_debug ("%s already marked as modified", existing_package->name); #endif - packagedata_destroy (existing_package, TRUE); + gtk_object_unref (GTK_OBJECT (existing_package)); existing_package = NULL; continue; } @@ -307,7 +308,7 @@ eazel_install_check_existing_packages (EazelInstall *service, #endif if (pack->minor && existing_package->minor) { #if EI2_DEBUG & 0x4 - trilobite_debug ("minors are %s and %s (installed)", + trilobite_debug ("minors are %s for new and %s for installed)", pack->minor, existing_package->minor); #endif res = eazel_package_system_compare_version (service->private->package_system, @@ -319,7 +320,7 @@ eazel_install_check_existing_packages (EazelInstall *service, This is a patch, it should be res=1, revert when softcat is updated to have revisions for all packages (post PR3) */ - res = 0; + res = 1; } else { /* Eh, do nothing just to be safe */ res = 0; @@ -496,12 +497,8 @@ get_softcat_info (EazelInstall *service, if (result != NO_SOFTCAT_HIT) { PackageData *p1 = NULL; - if ((*package)->eazel_id == NULL) { - (*package)->eazel_id = g_strdup_printf ("%s-%s-%s", - (*package)->name, (*package)->version, (*package)->minor); - } - - p1 = g_hash_table_lookup (service->private->dedupe_hash, (*package)->eazel_id); + g_assert ((*package)->md5); + p1 = g_hash_table_lookup (service->private->dedupe_hash, (*package)->md5); if (p1) { #if EI2_DEBUG & 0x4 @@ -520,7 +517,7 @@ get_softcat_info (EazelInstall *service, case EAZEL_INSTALL_STATUS_UPGRADES: gtk_object_ref (GTK_OBJECT (*package)); g_hash_table_insert (service->private->dedupe_hash, - (*package)->eazel_id, + (*package)->md5, *package); break; case EAZEL_INSTALL_STATUS_DOWNGRADES: @@ -596,22 +593,23 @@ dedupe_foreach_depends (PackageDependency *d, p1 = d->package; - if (p1->eazel_id == NULL) { - /* softcat didn't have this package */ + if (p1->md5 == NULL) { + /* Package info not received from SoftCat */ return; } if (~p1->fillflag & MUST_HAVE) { PackageData *p11; - p11 = g_hash_table_lookup (service->private->dedupe_hash, p1->eazel_id); + p11 = g_hash_table_lookup (service->private->dedupe_hash, p1->md5); + if (p11) { gtk_object_ref (GTK_OBJECT (p11)); gtk_object_unref (GTK_OBJECT (p1)); d->package = p11; } else { gtk_object_ref (GTK_OBJECT (p1)); - g_hash_table_insert (service->private->dedupe_hash, p1->eazel_id, p1); + g_hash_table_insert (service->private->dedupe_hash, p1->md5, p1); dedupe_foreach (p1, service); } } @@ -673,6 +671,9 @@ is_satisfied (EazelInstall *service, trilobite_debug ("is_satisfied? %p %s", dep->package, dep->package->name); trilobite_debug ("\t -> already filled, must be ok"); +#else + g_message ("checking dependency for %s (already checked)", + dep->package->name); #endif return FALSE; @@ -683,6 +684,10 @@ is_satisfied (EazelInstall *service, trilobite_debug ("is_satisfied? %p %s %s %s", dep->package, dep->package->name, sense_str, (dep->version != NULL ? dep->version : "")); +#else + g_message ("checking dependency %s %s %s", + dep->package->name, sense_str, + (dep->version != NULL ? dep->version : "")); #endif key = g_strdup_printf ("%s/%s/%s", dep->package->name, sense_str, (dep->version != NULL ? dep->version : "")); @@ -743,6 +748,8 @@ is_satisfied (EazelInstall *service, if (result) { #if EI2_DEBUG & 0x4 trilobite_debug ("\t--> feature is satisfied"); +#else + g_message ("\tok"); #endif g_hash_table_insert (service->private->dep_ok_hash, key, @@ -751,6 +758,8 @@ is_satisfied (EazelInstall *service, } else { #if EI2_DEBUG & 0x4 trilobite_debug ("\t--> feature not satisfied"); +#else + g_message ("\tnot ok"); #endif g_hash_table_insert (service->private->dep_ok_hash, key, @@ -883,6 +892,27 @@ void check_feature_consistency (EazelInstall *service, GList *packages); void check_conflicts_against_already_installed_packages (EazelInstall *service, GList *packages); void check_tree_for_conflicts (EazelInstall *service, GList **packages, GList **extra_packages); +static gboolean +check_update_for_no_more_file_conflicts (PackageFileConflict *conflict, + PackageData *pack_update) +{ + GList *iterator; + + g_assert (IS_PACKAGEFILECONFLICT (conflict)); + g_assert (conflict->files); + g_assert (g_list_length (conflict->files)); + + for (iterator = conflict->files; iterator; iterator = g_list_next (iterator)) { + char *filename = (char*)iterator->data; + if (g_list_find_custom (pack_update->provides, + filename, + (GCompareFunc)strcmp)) { + return FALSE; + } + } + return TRUE; +} + static void check_tree_helper (EazelInstall *service, PackageData *pack, @@ -890,6 +920,7 @@ check_tree_helper (EazelInstall *service, GList **path) { GList *iterator; + GList *remove = NULL; if (g_list_find (*path, pack)) { #if EI2_DEBUG & 0x4 @@ -903,22 +934,62 @@ check_tree_helper (EazelInstall *service, #endif if (pack->status == PACKAGE_FILE_CONFLICT) { #if EI2_DEBUG & 0x4 - trilobite_debug ("reviving %s", pack->name); + trilobite_debug ("trying to revive %s", pack->name); #endif - pack->status = PACKAGE_PARTLY_RESOLVED; for (iterator = pack->breaks; iterator; iterator = g_list_next (iterator)) { - PackageData *pack_broken = PACKAGEDATA (iterator->data); - /* reset pack_broken to some sane values */ - pack_broken->status = PACKAGE_UNKNOWN_STATUS; - pack_broken->fillflag = PACKAGE_FILL_INVALID; - g_free (pack_broken->version); - pack_broken->version = NULL; - g_free (pack_broken->minor); - pack_broken->minor = NULL; - (*extra_packages) = g_list_prepend (*extra_packages, pack_broken); + PackageBreaks *breakage = PACKAGEBREAKS (iterator->data); + + if (IS_PACKAGEFILECONFLICT (breakage)) { + PackageFileConflict *conflict = PACKAGEFILECONFLICT (breakage); + PackageData *pack_broken = packagebreaks_get_package (breakage); + PackageData *pack_update = NULL; + + /* reset pack_broken to some sane values */ + if (eazel_softcat_available_update (service->private->softcat, + pack_broken, + &pack_update, + MUST_HAVE)) { + if (check_update_for_no_more_file_conflicts (conflict, pack_update)) { +#if EI2_DEBUG & 0x4 + 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; + remove = g_list_prepend (remove, breakage); + pack->status = PACKAGE_PARTLY_RESOLVED; + } else { +#if EI2_DEBUG & 0x4 + trilobite_debug ("%s still has conflict", pack_update->name); +#else + g_message ("available update to %s does not solves conflict", + pack_update->name); +#endif + } + } + } + } + + /* Now nuke the successfully revived PackageBreaks */ + for (iterator = remove; iterator; iterator = g_list_next (iterator)) { + PackageBreaks *breakage = PACKAGEBREAKS (iterator->data); + gtk_object_unref (GTK_OBJECT (breakage)); + pack->breaks = g_list_remove (pack->breaks, breakage); + } + g_list_free (remove); + + /* if no breaks were unrevived, null out the list */ + if (g_list_length (pack->breaks)==0) { + g_list_free (pack->breaks); + pack->breaks = NULL; } - g_list_free (pack->breaks); - pack->breaks = NULL; } for (iterator = pack->depends; iterator; iterator = g_list_next (iterator)) { @@ -956,6 +1027,40 @@ check_tree_for_conflicts (EazelInstall *service, #endif } +static int +find_break_by_package_name (PackageBreaks *breaks, PackageData *pack) +{ + return eazel_install_package_compare (packagebreaks_get_package (breaks), + pack); +} + +static void +add_file_conflict (PackageData *pack, + PackageData *broken, + char *filename) +{ + GList *prev; + prev = g_list_find_custom (pack->breaks, + broken, + (GCompareFunc)find_break_by_package_name); + pack->status = PACKAGE_FILE_CONFLICT; + + if (prev) { + PackageFileConflict *conflict = PACKAGEFILECONFLICT (prev->data); + conflict->files = g_list_prepend (conflict->files, g_strdup (filename)); + } else { + PackageFileConflict *conflict = packagefileconflict_new (); + + pack->status = PACKAGE_FILE_CONFLICT; + broken->status = PACKAGE_FILE_CONFLICT; + + packagebreaks_set_package (PACKAGEBREAKS (conflict), broken); + conflict->files = g_list_prepend (conflict->files, g_strdup (filename)); + packagedata_add_to_breaks (pack, PACKAGEBREAKS (conflict)); + //gtk_object_unref (GTK_OBJECT (conflict)); + } +} + /* make sure none of the packages we're installing will share files add code to check that no two packages provides the same file @@ -981,13 +1086,11 @@ check_no_two_packages_has_same_file (EazelInstall *service, GList *packages) { GHashTable *file_table; /* filename(char *) -> package(PackageData *) */ - GList *broken_packages; /* (PackageData *) packages known to have conflicts already */ GList *iter, *iter_file; PackageData *pack, *pack_other; char *filename; GList *flat_packages; - broken_packages = NULL; flat_packages = flatten_packagedata_dependency_tree (packages); if (eazel_install_get_force (service) || @@ -1001,7 +1104,7 @@ check_no_two_packages_has_same_file (EazelInstall *service, file_table = g_hash_table_new (g_str_hash, g_str_equal); #if EI2_DEBUG & 0x4 - trilobite_debug ("-> no_two_packages conflict check begins (%d packages)", g_list_length (flat_packages)); + trilobite_debug ("-> no-two-packages conflict check begins (%d unique packages)", g_list_length (flat_packages)); #endif for (iter = g_list_first (flat_packages); iter != NULL; iter = g_list_next (iter)) { @@ -1010,9 +1113,8 @@ check_no_two_packages_has_same_file (EazelInstall *service, pack = PACKAGEDATA (iter->data); -#if EI2_DEBUG & 0x4 - trilobite_debug ("checking %s", pack->name); -#endif + g_message ("file uniqueness checking %s", pack->name); + for (iter_file = g_list_first (pack->provides); iter_file != NULL; iter_file = g_list_next (iter_file)) { filename = (char *)(iter_file->data); @@ -1030,20 +1132,14 @@ check_no_two_packages_has_same_file (EazelInstall *service, /* Only report it once in the debug log or we'll spam to eternity on some * large broken packages... */ if (! reported_yet) { - trilobite_debug ("file conflict 1: %s from package %s is also in %s", - filename, pack->name, pack_other->name); + g_message ("Duplicate file : %s occurs in %s and %s", + filename, pack->name, pack_other->name); reported_yet = TRUE; } else { other_conflicts++; } - - /* 'pack' broke 'pack_other', but only if 'pack_other' isn't already broken */ - if (! g_list_find (broken_packages, pack_other)) { - broken_packages = g_list_prepend (broken_packages, pack_other); - packagedata_add_pack_to_breaks (pack, pack_other); - pack->status = PACKAGE_FILE_CONFLICT; - pack_other->status = PACKAGE_FILE_CONFLICT; - } + add_file_conflict (pack, pack_other, filename); + gtk_object_unref (GTK_OBJECT (pack_other)); } else { /* file is okay */ g_hash_table_insert (file_table, filename, pack); @@ -1055,8 +1151,9 @@ check_no_two_packages_has_same_file (EazelInstall *service, } /* let's free all this crap, unlike last time (cough cough) :) */ - g_list_free (broken_packages); + /* elements in flat_packages are not to be unreffed */ g_list_free (flat_packages); + /* the hashentries point to strings inside the packagedata objects */ g_hash_table_destroy (file_table); #if EI2_DEBUG & 0x4 @@ -1073,6 +1170,7 @@ package_is_upgrading_and_doesnt_need_file (PackageData *pack, GList *packages, c PackageData *pack_upgrade; GList *item, *item2; + /* Hmmm, would eazel_install_package_compare be better ? */ item = g_list_find_custom (packages, pack->name, (GCompareFunc)eazel_install_package_name_compare); if (item != NULL) { @@ -1132,7 +1230,7 @@ check_conflicts_against_already_installed_packages (EazelInstall *service, flat_packages = flatten_packagedata_dependency_tree (packages); #if EI2_DEBUG & 0x4 - trilobite_debug ("-> file conflict check begins (%d packages)", g_list_length (flat_packages)); + trilobite_debug ("-> file conflict check begins (%d unique packages)", g_list_length (flat_packages)); #endif for (iter = g_list_first (flat_packages); iter != NULL; iter = g_list_next (iter)) { @@ -1142,9 +1240,7 @@ check_conflicts_against_already_installed_packages (EazelInstall *service, continue; } -#if EI2_DEBUG & 0x4 - trilobite_debug ("checking %s", pack->name); -#endif + g_message ("file conflict checking %s", pack->name); pack->conflicts_checked = TRUE; for (iter_file = g_list_first (pack->provides); iter_file != NULL; iter_file = g_list_next (iter_file)) { @@ -1178,23 +1274,16 @@ check_conflicts_against_already_installed_packages (EazelInstall *service, continue; } - trilobite_debug ("file conflict 2: %s from %s conflicts with %p %s", - filename, pack->name, pack_owner, pack_owner->name); + g_message ("file conflict : package %s already provides %s also provided by %s", + pack_owner->name, filename, pack->name); if (package_is_upgrading_and_doesnt_need_file (pack_owner, flat_packages, filename)) { /* the owner of this file is a package that we're upgrading, and the * new version no longer has this file, so everything's okay. */ - trilobite_debug ("...but it's okay, we're upgrading %s and it ditched that file", + g_message ("...but it's okay, we're upgrading %s and it ditched that file", pack_owner->name); } else { - /* boo */ - pack->status = PACKAGE_FILE_CONFLICT; - /* did we already mark this in ->breaks ? */ - if (g_list_find_custom (pack->breaks, pack_owner->name, - (GCompareFunc)eazel_install_package_name_compare)==NULL) { - pack_owner->status = PACKAGE_FILE_CONFLICT; - packagedata_add_pack_to_breaks (pack, pack_owner); - } + add_file_conflict (pack, pack_owner, filename); } gtk_object_unref (GTK_OBJECT (pack_owner)); } @@ -1208,9 +1297,7 @@ check_conflicts_against_already_installed_packages (EazelInstall *service, g_list_free (flat_packages); } -/* FIXME: bugzilla.eazel.com 5277 (still need to test this) - add code to check that no features are lost, and if, that they're not required - +/* hash<char*, PackageData> Hfeat; for each p in packages { @@ -1303,6 +1390,7 @@ check_feature_consistency (EazelInstall *service, EAZEL_PACKAGE_SYSTEM_QUERY_REQUIRES, PACKAGE_FILL_NO_DIRS_IN_PROVIDES); 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); #if EI2_DEBUG & 0x4 @@ -1311,13 +1399,11 @@ check_feature_consistency (EazelInstall *service, pack, pack->name, pack_modified, pack_modified->name); #endif - /* FIXME 5277 and 5721 more here - For me to finish this, I need softcat to emit - features in the xml - */ pack_broken->status = PACKAGE_DEPENDENCY_FAIL; pack->status = PACKAGE_BREAKS_DEPENDENCY; - packagedata_add_pack_to_breaks (pack, pack_broken); + packagebreaks_set_package (PACKAGEBREAKS (feature_missing), pack_broken); + feature_missing->features = g_list_prepend (feature_missing->features, g_strdup (feature)); + packagedata_add_to_breaks (pack, PACKAGEBREAKS (feature_missing)); gtk_object_unref (GTK_OBJECT (pack_broken)); } g_list_free (required_by); @@ -1541,6 +1627,10 @@ install_packages_helper (EazelInstall *service, #if EI2_DEBUG & 0x8 trilobite_debug ("FINAL TREE BEGIN"); dump_tree (*packages); + if (*extra_packages) { + trilobite_debug ("EXTRA PACKAGES BEGIN"); + dump_tree (*extra_packages); + } trilobite_debug ("FINAL TREE END"); #endif diff --git a/components/services/install/lib/eazel-install-object.c b/components/services/install/lib/eazel-install-object.c index 691365a69..a9a7ff61c 100644 --- a/components/services/install/lib/eazel-install-object.c +++ b/components/services/install/lib/eazel-install-object.c @@ -1447,7 +1447,7 @@ eazel_install_emit_preflight_check (EazelInstall *service, if (eazel_install_get_ei2 (service) || pack->toplevel) { packages_in_signal = g_list_prepend (packages_in_signal, pack); - } + } } gtk_signal_emit (GTK_OBJECT (service), diff --git a/components/services/install/lib/eazel-install-protocols.c b/components/services/install/lib/eazel-install-protocols.c index 34c3776e6..59656f382 100644 --- a/components/services/install/lib/eazel-install-protocols.c +++ b/components/services/install/lib/eazel-install-protocols.c @@ -50,9 +50,6 @@ #include <libgnomevfs/gnome-vfs.h> #endif /* EAZEL_INSTALL_SLIM */ -/* evil evil hack because RPM doesn't understand that a package for i386 is still okay to run on i686! */ -#define ASSUME_ix86_IS_i386 - typedef struct { EazelInstall *service; const PackageData *package; diff --git a/components/services/install/lib/eazel-install-rpm-glue.c b/components/services/install/lib/eazel-install-rpm-glue.c index 29074866c..8816308a3 100644 --- a/components/services/install/lib/eazel-install-rpm-glue.c +++ b/components/services/install/lib/eazel-install-rpm-glue.c @@ -79,6 +79,7 @@ packagedata_new_from_rpm_conflict_reversed (struct rpmDependencyConflict conflic return result; } +#if 0 /* Adds the headers to the package system set */ @@ -204,7 +205,7 @@ eazel_install_rpm_create_requirement (EazelInstall *service, } } } - +#endif /* This is the function to do the RPM system dependency check */ void @@ -213,6 +214,8 @@ eazel_install_do_rpm_dependency_check (EazelInstall *service, GList **failedpackages, GList **requirements) { + g_assert_not_reached (); +#if 0 int iterator; rpmTransactionSet set; int num_conflicts; @@ -239,7 +242,7 @@ eazel_install_do_rpm_dependency_check (EazelInstall *service, rpmdepCheck (set, &conflicts, &num_conflicts); eazel_package_system_rpm3_close_dbs (EAZEL_PACKAGE_SYSTEM_RPM3 (service->private->package_system)); - /* FIXME bugzilla.eazel.com 1512: + /* FIXME bugzilla.eazel.com 1512 (BUG OBSOLETED, DON'T REOPEN <eskil, 20010129>) This piece of code is rpm specific. It has some generic algorithm for doing the dep stuff, but it's rpm entangled */ @@ -463,4 +466,5 @@ eazel_install_do_rpm_dependency_check (EazelInstall *service, trilobite_debug ("eazel_install_do_rpm_dependency_check ended with %d fails and %d requirements", g_list_length (*failedpackages), g_list_length (*requirements)); +#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 f86aa5f69..1af479bcb 100644 --- a/components/services/install/lib/eazel-install-xml-package-list.c +++ b/components/services/install/lib/eazel-install-xml-package-list.c @@ -125,10 +125,17 @@ parse_package (xmlNode* package, gboolean set_toplevel) { depend = parse_package (dep, FALSE); packagedata_add_pack_to_soft_depends (rv, depend); } else if (g_strcasecmp (dep->name, "BREAKS") == 0) { + /* FIXME: bugzilla.eazel.com 1542 + This needs to parse all of the stuff, letting robey handle + this as part of bug 1542. Right now I just get the borked + package, the files/feature info is lost + */ PackageData* depend; - + PackageBreaks *breakage = packagebreaks_new (); + depend = parse_package (dep, FALSE); - packagedata_add_pack_to_breaks (rv, depend); + packagebreaks_set_package (breakage, depend); + packagedata_add_to_breaks (rv, breakage); } else if (g_strcasecmp (dep->name, "MODIFIES") == 0) { PackageData* depend; @@ -552,6 +559,7 @@ eazel_install_packagedata_to_xml_int (const PackageData *pack, } else { root = xmlNewNode (NULL, "PACKAGE"); } + node = xmlNewChild (root, NULL, "NAME", pack->name); node = xmlNewChild (root, NULL, "VERSION", pack->version); node = xmlNewChild (root, NULL, "MINOR", pack->minor); @@ -594,32 +602,32 @@ eazel_install_packagedata_to_xml_int (const PackageData *pack, } node = xmlNewChild (root, NULL, "PROVIDES", tmp); } - + for (iterator = pack->depends; iterator; iterator = iterator->next) { - 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, + 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", root, include_provides, path); - (*path) = g_list_remove (*path, ((PackageDependency*)iterator->data)->package); + (*path) = g_list_remove (*path, PACKAGEDEPENDENCY (iterator->data)->package); } } for (iterator = pack->soft_depends; iterator; iterator = iterator->next) { - eazel_install_packagedata_to_xml ((PackageData*)iterator->data, + eazel_install_packagedata_to_xml (PACKAGEDATA (iterator->data), "SOFT_DEPEND", root, include_provides); } for (iterator = pack->breaks; iterator; iterator = iterator->next) { - eazel_install_packagedata_to_xml ((PackageData*)iterator->data, + eazel_install_packagedata_to_xml (packagebreaks_get_package (PACKAGEBREAKS (iterator->data)), "BREAKS", root, include_provides); } for (iterator = pack->modifies; iterator; iterator = iterator->next) { - eazel_install_packagedata_to_xml ((PackageData*)iterator->data, + eazel_install_packagedata_to_xml (PACKAGEDATA (iterator->data), "MODIFIES", root, include_provides); @@ -648,7 +656,7 @@ eazel_install_packagelist_to_xml (GList *packages, gboolean include_provides) { node = xmlNewNode (NULL, "PACKAGES"); for (iterator = packages; iterator; iterator = iterator->next) { xmlAddChild (node, - eazel_install_packagedata_to_xml ((PackageData*)iterator->data, + eazel_install_packagedata_to_xml (PACKAGEDATA (iterator->data), NULL, NULL, include_provides) ); } @@ -900,7 +908,6 @@ osd_parse_shared (xmlDocPtr doc) if (g_strcasecmp (child->name, "SOFTPKG") == 0) { PackageData *pack; pack = osd_parse_softpkg (child); - g_message (packagedata_dump (pack, FALSE)); if (pack) { result = g_list_prepend (result, pack); } else { diff --git a/components/services/install/lib/eazel-package-system-rpm3.c b/components/services/install/lib/eazel-package-system-rpm3.c index 450d530c6..b5dc87db8 100644 --- a/components/services/install/lib/eazel-package-system-rpm3.c +++ b/components/services/install/lib/eazel-package-system-rpm3.c @@ -207,6 +207,9 @@ make_rpm_argument_list (EazelPackageSystemRpm3 *system, if (op == EAZEL_PACKAGE_SYSTEM_OPERATION_UNINSTALL) { (*args) = g_list_prepend (*args, g_strdup ("-e")); } else { +#ifdef USE_PERCENT + (*args) = g_list_prepend (*args, g_strdup ("--percent")); +#endif if (flags & EAZEL_PACKAGE_SYSTEM_OPERATION_DOWNGRADE) { (*args) = g_list_prepend (*args, g_strdup ("--oldpackage")); } @@ -943,11 +946,13 @@ rpm_packagedata_new_from_file (EazelPackageSystemRpm3 *system, PackageData *pack; pack = packagedata_new (); + if (rpm_packagedata_fill_from_file (system, pack, file, detail_level)==FALSE) { trilobite_debug ("RPM3 unable to fill from file '%s'", file); gtk_object_unref (GTK_OBJECT (pack)); pack = NULL; } + return pack; } @@ -1051,7 +1056,7 @@ eazel_package_system_rpm3_query_impl (EazelPackageSystemRpm3 *system, pack, (GCompareFunc)eazel_install_package_compare)!=NULL) { info (system, "%s already in set", pack->name); - packagedata_destroy (pack, TRUE); + gtk_object_unref (GTK_OBJECT (pack)); } else { (*result) = g_list_prepend (*result, pack); } @@ -1536,7 +1541,13 @@ eazel_package_system_rpm3_compare_version (EazelPackageSystem *system, const char *a, const char *b) { - return rpmvercmp (a, b); + int result; + result = rpmvercmp (a, b); + /* Special bandaid for M18 <> 0.7 mozilla versions */ + if (isdigit (*a) && *b=='M') { + if (result < 0) { result = abs (result); } + } + return result; } /***************************************** diff --git a/components/services/install/lib/eazel-package-system-types.c b/components/services/install/lib/eazel-package-system-types.c index b20ccd340..cc02173f3 100644 --- a/components/services/install/lib/eazel-package-system-types.c +++ b/components/services/install/lib/eazel-package-system-types.c @@ -144,7 +144,7 @@ categorydata_destroy_foreach (CategoryData *cd, gpointer ununsed) g_return_if_fail (cd != NULL); if (g_list_length (cd->packages)) { - g_list_foreach (cd->packages, (GFunc)packagedata_destroy, GINT_TO_POINTER (TRUE)); + g_list_foreach (cd->packages, (GFunc)gtk_object_unref, NULL); } g_list_free (cd->packages); cd->packages = NULL; @@ -194,61 +194,50 @@ categorylist_flatten_to_packagelist (GList *categories) } /*************************************************************************************************/ -static void -packagedata_class_initialize (PackageDataClass *klass) + +PackageDependency * +packagedependency_new (void) { - GtkObjectClass *object_class; + PackageDependency *dep; - object_class = (GtkObjectClass*)klass; - object_class->finalize = packagedata_finalize; + dep = g_new0 (PackageDependency, 1); + dep->package = NULL; + dep->version = NULL; + return dep; } -static void -packagedata_initialize (PackageData *package) { - g_assert (package!=NULL); - g_assert (IS_PACKAGEDATA (package)); - +PackageDependency * +packagedependency_copy (const PackageDependency *dep, gboolean deep) +{ + PackageDependency *newdep; -#ifdef DEBUG_PACKAGE_ALLOCS - package_allocs ++; - if (report_all) trilobite_debug ("package_allocs inced to %d (0x%p)", package_allocs, package); - if (!at_exit_registered) { - atexit (&at_exit_package_data_info); - at_exit_registered = TRUE; + newdep = g_new0 (PackageDependency, 1); + newdep->sense = dep->sense; + newdep->version = g_strdup (dep->version); + if (dep->package != NULL) { + newdep->package = packagedata_copy (dep->package, deep); } - packages_allocated = g_list_prepend (packages_allocated, package); -#endif /* DEBUG_PACKAGE_ALLOCS */ - - package->name = NULL; - package->version = NULL; - package->minor = NULL; - package->archtype = NULL; - package->source_package = FALSE; - package->summary = NULL; - package->description = NULL; - package->bytesize = 0; - package->filesize = 0; - package->distribution = trilobite_get_distribution (); - package->filename = NULL; - package->eazel_id = NULL; - package->suite_id = NULL; - package->remote_url = NULL; - package->conflicts_checked = FALSE; - package->install_root = NULL; - package->provides = NULL; - package->soft_depends = NULL; - package->breaks = NULL; - package->modifies = NULL; - package->depends = NULL; - package->status = PACKAGE_UNKNOWN_STATUS; - package->modify_status = PACKAGE_MOD_UNTOUCHED; - package->md5 = NULL; - package->packsys_struc = NULL; - package->features = NULL; - package->fillflag = PACKAGE_FILL_INVALID; + return newdep; } void +packagedependency_destroy (PackageDependency *dep) +{ + if (dep->package) { + gtk_object_unref (GTK_OBJECT (dep->package)); + } + dep->package = NULL; + g_free (dep->version); + dep->version = NULL; + dep->sense = 0; + g_free (dep); +} + +/********************************************************************************** + GTK+ crap for PackageData objects + **********************************************************************************/ + +static void packagedata_finalize (GtkObject *obj) { PackageData *pack = PACKAGEDATA (obj); @@ -310,19 +299,18 @@ packagedata_finalize (GtkObject *obj) g_list_foreach (pack->depends, (GFunc)packagedependency_destroy, GINT_TO_POINTER (FALSE)); 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; g_list_foreach (pack->modifies, (GFunc)gtk_object_unref, NULL); g_list_free (pack->modifies); - - pack->soft_depends = NULL; - pack->depends = NULL; - pack->breaks = NULL; pack->modifies = NULL; if (pack->packsys_struc) { @@ -335,42 +323,58 @@ packagedata_finalize (GtkObject *obj) } } -PackageDependency * -packagedependency_new (void) +static void +packagedata_class_initialize (PackageDataClass *klass) { - PackageDependency *dep; + GtkObjectClass *object_class; - dep = g_new0 (PackageDependency, 1); - dep->package = NULL; - dep->version = NULL; - return dep; + object_class = (GtkObjectClass*)klass; + object_class->finalize = packagedata_finalize; } -PackageDependency * -packagedependency_copy (const PackageDependency *dep, gboolean deep) -{ - PackageDependency *newdep; +static void +packagedata_initialize (PackageData *package) { + g_assert (package!=NULL); + g_assert (IS_PACKAGEDATA (package)); - newdep = g_new0 (PackageDependency, 1); - newdep->sense = dep->sense; - newdep->version = g_strdup (dep->version); - if (dep->package != NULL) { - newdep->package = packagedata_copy (dep->package, deep); - } - return newdep; -} -void -packagedependency_destroy (PackageDependency *dep) -{ - if (dep->package) { - gtk_object_unref (GTK_OBJECT (dep->package)); +#ifdef DEBUG_PACKAGE_ALLOCS + package_allocs ++; + if (report_all) trilobite_debug ("package_allocs inced to %d (0x%p)", package_allocs, package); + if (!at_exit_registered) { + atexit (&at_exit_package_data_info); + at_exit_registered = TRUE; } - dep->package = NULL; - g_free (dep->version); - dep->version = NULL; - dep->sense = 0; - g_free (dep); + packages_allocated = g_list_prepend (packages_allocated, package); +#endif /* DEBUG_PACKAGE_ALLOCS */ + + package->name = NULL; + package->version = NULL; + package->minor = NULL; + package->archtype = NULL; + package->source_package = FALSE; + package->summary = NULL; + package->description = NULL; + package->bytesize = 0; + package->filesize = 0; + package->distribution = trilobite_get_distribution (); + package->filename = NULL; + package->eazel_id = NULL; + package->suite_id = NULL; + package->remote_url = NULL; + package->conflicts_checked = FALSE; + package->install_root = NULL; + package->provides = NULL; + package->soft_depends = NULL; + package->breaks = NULL; + package->modifies = NULL; + package->depends = NULL; + package->status = PACKAGE_UNKNOWN_STATUS; + package->modify_status = PACKAGE_MOD_UNTOUCHED; + package->md5 = NULL; + package->packsys_struc = NULL; + package->features = NULL; + package->fillflag = PACKAGE_FILL_INVALID; } GtkType @@ -411,6 +415,8 @@ packagedata_new () return package; } +/**********************************************************************************/ + GList * packagedata_list_copy (const GList *list, gboolean deep) { @@ -461,6 +467,7 @@ packagedata_copy (const PackageData *pack, gboolean deep) result->install_root = g_strdup (pack->install_root); result->eazel_id = g_strdup (pack->eazel_id); result->suite_id = g_strdup (pack->suite_id); + result->md5 = g_strdup (pack->md5); result->toplevel = pack->toplevel; result->status = pack->status; @@ -476,7 +483,11 @@ packagedata_copy (const PackageData *pack, gboolean 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); - result->breaks = packagedata_list_copy (pack->breaks, TRUE); + + /* Sloppy, just ref and copy the pointer rather then copying the + object */ + g_list_foreach (pack->breaks, (GFunc)gtk_object_ref, NULL); + result->breaks = g_list_copy (pack->breaks); for (ptr = pack->provides; ptr; ptr = g_list_next (ptr)) { result->provides = g_list_prepend (result->provides, g_strdup (ptr->data)); @@ -560,18 +571,6 @@ packagedata_fill_in_missing (PackageData *package, const PackageData *full_packa } void -packagedata_destroy (PackageData *pack, gboolean deep) -{ - if (deep) { - g_list_foreach (pack->soft_depends, (GFunc)packagedata_destroy, GINT_TO_POINTER (deep)); - g_list_foreach (pack->breaks, (GFunc)packagedata_destroy, GINT_TO_POINTER (deep)); - g_list_foreach (pack->modifies, (GFunc)packagedata_destroy, GINT_TO_POINTER (deep)); - } - - gtk_object_unref (GTK_OBJECT (pack)); -} - -void packagedata_remove_soft_dep (PackageData *remove, PackageData *from) { @@ -580,7 +579,7 @@ packagedata_remove_soft_dep (PackageData *remove, trilobite_debug ("removing %s from %s's deps", remove->name, from->name); from->soft_depends = g_list_remove (from->soft_depends, remove); - packagedata_destroy (remove, TRUE); + gtk_object_unref (GTK_OBJECT (remove)); } const char* @@ -647,13 +646,13 @@ packagedata_get_readable_name (const PackageData *pack) } else if ((pack->name != NULL) && (pack->version != NULL)) { /* This is a hack to shorten EazelSourceSnapshot names into the build date/time */ - if (strstr (pack->version, "Eazel")!=NULL && strstr (pack->version, ".200") != NULL) { + if (strstr (pack->version, "Eazel")!=NULL && strstr (pack->minor, ".200") != NULL) { char *month[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; char *temp, *temp2; int mo, da, ho, mi; /* this crap is too long to display ! */ - temp = g_strdup (pack->version); + temp = g_strdup (pack->minor); temp2 = strstr (temp, ".200"); strcpy (temp2, "ESS"); temp2 += strlen (".200x"); @@ -824,18 +823,17 @@ packagedata_modstatus_str_to_enum (const char *st) } static void -packagedata_add_pack_to (GList **list, PackageData *pack) { - (*list) = g_list_prepend (*list, pack); - gtk_object_ref (GTK_OBJECT (pack)); +packagedata_add_pack_to (GList **list, GtkObject *b) { + gtk_object_ref (b); + (*list) = g_list_prepend (*list, b); } void -packagedata_add_pack_to_breaks (PackageData *pack, PackageData *b) +packagedata_add_to_breaks (PackageData *pack, PackageBreaks *b) { g_assert (pack); g_assert (b); - g_assert(pack != b); - packagedata_add_pack_to (&pack->breaks, b); + packagedata_add_pack_to (&pack->breaks, GTK_OBJECT (b)); } void @@ -844,7 +842,7 @@ packagedata_add_pack_to_soft_depends (PackageData *pack, PackageData *b) g_assert (pack); g_assert (b); g_assert (pack != b); - packagedata_add_pack_to (&pack->soft_depends, b); + packagedata_add_pack_to (&pack->soft_depends, GTK_OBJECT (b)); } void @@ -853,7 +851,7 @@ packagedata_add_pack_to_modifies (PackageData *pack, PackageData *b) g_assert (pack); g_assert (b); g_assert (pack != b); - packagedata_add_pack_to (&pack->modifies, b); + packagedata_add_pack_to (&pack->modifies, GTK_OBJECT (b)); } static void @@ -916,7 +914,7 @@ packagedata_list_prune (GList **input, if (in_it && in) { (*input) = g_list_remove (*input, in); if (destroy) { - packagedata_destroy (in, deep); + gtk_object_unref (GTK_OBJECT (in)); } } } @@ -1295,6 +1293,44 @@ dump_package_deplist (GString *out, const GList *list, gboolean deep, int indent } /* useful debugging tool: dump a packagedata struct into a string */ + +static void +add_string_list (GString *out, GList *list, int indent, char *title) +{ + GList *fit; + for (fit = list; fit; fit = g_list_next (fit)) { + gstr_indent (out, indent); + g_string_sprintfa (out, "\t%s : %s\n", title, (char*)fit->data); + } +} + +static void +dump_package_break_list (GString *out, GList *breaks, gboolean deep, int indent) +{ + GList *iterator; + + for (iterator = breaks; iterator; iterator = g_list_next (iterator)) { + PackageBreaks *breakage = PACKAGEBREAKS (iterator->data); + char *readable_name = packagedata_get_readable_name (packagebreaks_get_package (breakage)); + + gstr_indent (out, indent); + + g_string_sprintfa (out, "Breaks : %s\n", readable_name); + if (IS_PACKAGEFEATUREMISSING (breakage)) { + add_string_list (out, + PACKAGEFILECONFLICT (breakage)->files, + indent, + "FeautureMissing"); + } else if (IS_PACKAGEFILECONFLICT (breakage)) { + add_string_list (out, + PACKAGEFEATUREMISSING (breakage)->features, + indent, + "FeautureMissing"); + } + + } +} + static char * packagedata_dump_int (const PackageData *package, gboolean deep, int indent) { @@ -1408,7 +1444,7 @@ packagedata_dump_int (const PackageData *package, gboolean deep, int indent) if (package->breaks != NULL) { gstr_indent (out, indent); g_string_sprintfa (out, "Breaks: "); - dump_package_list (out, package->breaks, deep, indent); + dump_package_break_list (out, package->breaks, deep, indent); g_string_sprintfa (out, "\n"); } @@ -1424,3 +1460,223 @@ packagedata_dump (const PackageData *package, gboolean deep) { return packagedata_dump_int (package, deep, 0); } + + +/********************************************************************************** + GTK+ crap for PackageBreaks objects + **********************************************************************************/ + +static void +packagebreaks_finalize (GtkObject *obj) +{ + PackageBreaks *breaks = PACKAGEBREAKS (obj); + gtk_object_unref (GTK_OBJECT (breaks->__package)); + trilobite_debug ("I'm DYING! %p", obj); +} + +static void +packagebreaks_class_initialize (PackageBreaksClass *klass) +{ + GtkObjectClass *object_class; + + object_class = (GtkObjectClass*)klass; + object_class->finalize = packagebreaks_finalize; +} + +static void +packagebreaks_initialize (PackageBreaks *breaks) +{ + g_assert (breaks); + g_assert (IS_PACKAGEBREAKS (breaks)); + breaks->__package = NULL; +} + +GtkType +packagebreaks_get_type (void) +{ + static GtkType object_type = 0; + + /* First time it's called ? */ + if (!object_type) + { + static const GtkTypeInfo object_info = + { + "PackageBreaks", + sizeof (PackageBreaks), + sizeof (PackageBreaksClass), + (GtkClassInitFunc) packagebreaks_class_initialize, + (GtkObjectInitFunc) packagebreaks_initialize, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + object_type = gtk_type_unique (gtk_object_get_type (), &object_info); + } + + return object_type; +} + +PackageBreaks* +packagebreaks_new (void) +{ + PackageBreaks *result; + + result = PACKAGEBREAKS (gtk_object_new (TYPE_PACKAGEBREAKS, NULL)); + gtk_object_ref (GTK_OBJECT (result)); + gtk_object_sink (GTK_OBJECT (result)); + + return result; +} +void +packagebreaks_set_package (PackageBreaks *breaks, + PackageData *pack) +{ + if (breaks->__package) { + gtk_object_unref (GTK_OBJECT (pack)); + } + gtk_object_ref (GTK_OBJECT (pack)); + breaks->__package = pack; +} + +PackageData * +packagebreaks_get_package (PackageBreaks *breaks) +{ + return breaks->__package; +} + +/**********************************************************************************/ + +/********************************************************************************** + GTK+ crap for PackageFileConflict objects + **********************************************************************************/ + +static void +packagefileconflict_finalize (GtkObject *obj) +{ + PackageFileConflict *conflict = PACKAGEFILECONFLICT (obj); + g_list_foreach (conflict->files, (GFunc)g_free, NULL); +} + +static void +packagefileconflict_class_initialize (PackageFileConflictClass *klass) +{ + GtkObjectClass *object_class; + + object_class = (GtkObjectClass*)klass; + object_class->finalize = packagefileconflict_finalize; +} + +static void +packagefileconflict_initialize (PackageFileConflict *fileconflict) +{ + g_assert (fileconflict); + g_assert (IS_PACKAGEFILECONFLICT (fileconflict)); +} + +GtkType +packagefileconflict_get_type (void) +{ + static GtkType object_type = 0; + + /* First time it's called ? */ + if (!object_type) + { + static const GtkTypeInfo object_info = + { + "PackageFileConflict", + sizeof (PackageFileConflict), + sizeof (PackageFileConflictClass), + (GtkClassInitFunc) packagefileconflict_class_initialize, + (GtkObjectInitFunc) packagefileconflict_initialize, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + object_type = gtk_type_unique (packagebreaks_get_type (), &object_info); + } + + return object_type; +} + +PackageFileConflict* +packagefileconflict_new (void) +{ + PackageFileConflict *result; + + result = PACKAGEFILECONFLICT (gtk_object_new (TYPE_PACKAGEFILECONFLICT, NULL)); + gtk_object_ref (GTK_OBJECT (result)); + gtk_object_sink (GTK_OBJECT (result)); + + return result; +} + +/**********************************************************************************/ + +/********************************************************************************** + GTK+ crap for PackageFeatureMissing objects + **********************************************************************************/ + +static void +packagefeaturemissing_finalize (GtkObject *obj) +{ + PackageFeatureMissing *conflict = PACKAGEFEATUREMISSING (obj); + g_list_foreach (conflict->features, (GFunc)g_free, NULL); +} + +static void +packagefeaturemissing_class_initialize (PackageFeatureMissingClass *klass) +{ + GtkObjectClass *object_class; + + object_class = (GtkObjectClass*)klass; + object_class->finalize = packagefeaturemissing_finalize; +} + +static void +packagefeaturemissing_initialize (PackageFeatureMissing *breaks) +{ + g_assert (breaks); + g_assert (IS_PACKAGEFEATUREMISSING (breaks)); +} + +GtkType +packagefeaturemissing_get_type (void) +{ + static GtkType object_type = 0; + + /* First time it's called ? */ + if (!object_type) + { + static const GtkTypeInfo object_info = + { + "PackageFeatureMissing", + sizeof (PackageFeatureMissing), + sizeof (PackageFeatureMissingClass), + (GtkClassInitFunc) packagefeaturemissing_class_initialize, + (GtkObjectInitFunc) packagefeaturemissing_initialize, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + object_type = gtk_type_unique (packagebreaks_get_type (), &object_info); + } + + return object_type; +} + +PackageFeatureMissing* +packagefeaturemissing_new (void) +{ + PackageFeatureMissing *result; + + result = PACKAGEFEATUREMISSING (gtk_object_new (TYPE_PACKAGEFEATUREMISSING, NULL)); + gtk_object_ref (GTK_OBJECT (result)); + gtk_object_sink (GTK_OBJECT (result)); + + return result; +} + +/**********************************************************************************/ diff --git a/components/services/install/lib/eazel-package-system-types.h b/components/services/install/lib/eazel-package-system-types.h index 4c2733355..4428f0cb7 100644 --- a/components/services/install/lib/eazel-package-system-types.h +++ b/components/services/install/lib/eazel-package-system-types.h @@ -186,7 +186,7 @@ struct _PackageData { char* description; GList* soft_depends; GList* depends; /* GList<PackageDependency *> */ - GList* breaks; + GList* breaks; /* GList<PackageBreaks*> */ char *filename; char *remote_url; /* url where we can get this rpm */ @@ -246,7 +246,6 @@ struct _PackageData { PackageData* packagedata_new (void); GtkType packagedata_get_type (void); -void packagedata_finalize (GtkObject *obj); PackageData* packagedata_new_from_file (const char *file); PackageData* packagedata_copy (const PackageData *pack, gboolean deep); @@ -267,14 +266,8 @@ char *packagedata_get_readable_name (const PackageData *pack); from a given package, real meanign name[-version-[release]] string */ char *packagedata_get_name (const PackageData *pack); -void packagedata_destroy (PackageData *pd, gboolean deep); - int packagedata_hash_equal (PackageData *a, PackageData *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_modifies (PackageData *pack, PackageData *b); - GList *flatten_packagedata_dependency_tree (GList *packages); /* all elements in "remove_list" that matches elements in "input" list @@ -309,9 +302,85 @@ void packagedependency_destroy (PackageDependency *dep); #define PACKAGEDEPENDENCY(obj) ((PackageDependency*)(obj)) #define IS_PACKAGEDEPENDENCY(obj) (1) + +/*************************************************************************************************/ + +#define TYPE_PACKAGEBREAKS (packagebreaks_get_type ()) +#define PACKAGEBREAKS(obj) (GTK_CHECK_CAST ((obj), TYPE_PACKAGEBREAKS, PackageBreaks)) +#define PACKAGEBREAKS_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_PACKAGEBREAKS, PackageBreaksClass)) +#define IS_PACKAGEBREAKS(obj) (GTK_CHECK_TYPE ((obj), TYPE_PACKAGEBREAKS)) +#define IS_PACKAGEBREAKS_CLASS(klass)(GTK_CHECK_CLASS_TYPE ((klass), TYPE_PACKAGEBREAKS)) + +typedef struct _PackageBreaks PackageBreaks; +typedef struct _PackageBreaksClass PackageBreaksClass; + +struct _PackageBreaksClass { + GtkObjectClass parent_class; +}; + +struct _PackageBreaks { + GtkObject parent; + PackageData *__package; +}; + +PackageBreaks* packagebreaks_new (void); +GtkType packagebreaks_get_type (void); +void packagebreaks_set_package (PackageBreaks *breaks, PackageData *pack); +PackageData *packagebreaks_get_package (PackageBreaks *breaks); + +#define TYPE_PACKAGEFILECONFLICT (packagefileconflict_get_type ()) +#define PACKAGEFILECONFLICT(obj) (GTK_CHECK_CAST ((obj), TYPE_PACKAGEFILECONFLICT, PackageFileConflict)) +#define PACKAGEFILECONFLICT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_PACKAGEFILECONFLICT, PackageFileConflictClass)) +#define IS_PACKAGEFILECONFLICT(obj) (GTK_CHECK_TYPE ((obj), TYPE_PACKAGEFILECONFLICT)) +#define IS_PACKAGEFILECONFLICT_CLASS(klass)(GTK_CHECK_CLASS_TYPE ((klass), TYPE_PACKAGEFILECONFLICT)) + +typedef struct _PackageFileConflict PackageFileConflict; +typedef struct _PackageFileConflictClass PackageFileConflictClass; + +struct _PackageFileConflictClass { + PackageBreaksClass parent_class; +}; + +struct _PackageFileConflict { + PackageBreaks parent; + GList *files; +}; + +PackageFileConflict* packagefileconflict_new (void); +GtkType packagefileconflict_get_type (void); + +#define TYPE_PACKAGEFEATUREMISSING (packagefeaturemissing_get_type ()) +#define PACKAGEFEATUREMISSING(obj) (GTK_CHECK_CAST ((obj), TYPE_PACKAGEFEATUREMISSING, PackageFeatureMissing)) +#define PACKAGEFEATUREMISSING_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_PACKAGEFEATUREMISSING, PackageFeatureMissingClass)) +#define IS_PACKAGEFEATUREMISSING(obj) (GTK_CHECK_TYPE ((obj), TYPE_PACKAGEFEATUREMISSING)) +#define IS_PACKAGEFEATUREMISSING_CLASS(klass)(GTK_CHECK_CLASS_TYPE ((klass), TYPE_PACKAGEFEATUREMISSING)) + +typedef struct _PackageFeatureMissing PackageFeatureMissing; +typedef struct _PackageFeatureMissingClass PackageFeatureMissingClass; + +struct _PackageFeatureMissingClass { + PackageBreaksClass parent_class; +}; + +struct _PackageFeatureMissing { + PackageBreaks parent; + GList *features; +}; + +PackageFeatureMissing* packagefeaturemissing_new (void); +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_modifies (PackageData *pack, PackageData *b); + /*************************************************************************************************/ +/* FIXME: deprecating eazel-install-logic.c will also deprecate this structure */ - /* OBSOLETE */ typedef struct { PackageData *package; PackageData *required; diff --git a/components/services/install/lib/eazel-package-system.c b/components/services/install/lib/eazel-package-system.c index d77d3c89a..baf5d7d0a 100644 --- a/components/services/install/lib/eazel-package-system.c +++ b/components/services/install/lib/eazel-package-system.c @@ -212,7 +212,7 @@ eazel_package_system_is_installed (EazelPackageSystem *package_system, } else { result = TRUE; } - g_list_foreach (matches, (GFunc)packagedata_destroy, GINT_TO_POINTER (TRUE)); + g_list_foreach (matches, (GFunc)gtk_object_unref, NULL); } g_list_free (matches); diff --git a/components/services/install/lib/eazel-softcat.c b/components/services/install/lib/eazel-softcat.c index 1766613e2..293183072 100644 --- a/components/services/install/lib/eazel-softcat.c +++ b/components/services/install/lib/eazel-softcat.c @@ -502,7 +502,7 @@ get_search_url_for_package (EazelSoftCat *softcat, const PackageData *package, i if (dist.name != DISTRO_UNKNOWN) { dist_name = trilobite_get_distribution_name (dist, TRUE, TRUE); - add_to_url (url, "&distro=", "RedHat62"); + add_to_url (url, "&distro=", dist_name); g_free (dist_name); } /* FIXME: should let them specify a protocol other than http, someday */ @@ -657,16 +657,28 @@ out: gboolean eazel_softcat_available_update (EazelSoftCat *softcat, PackageData *oldpack, PackageData **newpack, int fill_flags) { - *newpack = packagedata_new (); - (*newpack)->name = g_strdup (oldpack->name); - (*newpack)->version = g_strdup (oldpack->version); - (*newpack)->distribution = oldpack->distribution; - (*newpack)->archtype = g_strdup (oldpack->archtype); - - if (eazel_softcat_get_info (softcat, *newpack, EAZEL_SOFTCAT_SENSE_GT, fill_flags) != EAZEL_SOFTCAT_SUCCESS) { - packagedata_destroy (*newpack, TRUE); - *newpack = NULL; - return FALSE; - } - return TRUE; + PackageData *tmp_pack; + gboolean result = TRUE; + + tmp_pack = packagedata_new (); + tmp_pack->name = g_strdup (oldpack->name); + tmp_pack->version = g_strdup (oldpack->version); + tmp_pack->distribution = oldpack->distribution; + tmp_pack->archtype = g_strdup (oldpack->archtype); + + if (eazel_softcat_get_info (softcat, tmp_pack, EAZEL_SOFTCAT_SENSE_GT, fill_flags) != EAZEL_SOFTCAT_SUCCESS) { + result = FALSE; + } + + if (newpack!=NULL && result==TRUE) { + (*newpack) = tmp_pack; + } else { + gtk_object_unref (GTK_OBJECT (tmp_pack)); + /* Null in case it's givin */ + if (newpack!=NULL) { + (*newpack) = NULL; + } + } + + return result; } diff --git a/components/services/install/nautilus-view/nautilus-service-install-view.c b/components/services/install/nautilus-view/nautilus-service-install-view.c index 2cd4db4b8..747d2ec12 100644 --- a/components/services/install/nautilus-view/nautilus-service-install-view.c +++ b/components/services/install/nautilus-view/nautilus-service-install-view.c @@ -1506,7 +1506,7 @@ nautilus_service_install_view_update_from_uri (NautilusServiceInstallView *view, pack = (PackageData*) gtk_object_get_data (GTK_OBJECT (view), "packagedata"); if (pack != NULL) { /* Destroy the old */ - packagedata_destroy (pack, TRUE); + gtk_object_unref (GTK_OBJECT (pack)); } /* find the package data for the package we're about to install */ |