diff -r 8d3b1ddf789c -r 8b50be3e2998 plover-gtk/packageset.c --- a/plover-gtk/packageset.c Sat Feb 20 12:11:02 2010 +0000 +++ b/plover-gtk/packageset.c Fri Apr 30 20:37:08 2010 +0100 @@ -34,6 +34,7 @@ struct razor_root *root; struct razor_set *set; GSList *packages; + int no_details; } PloverPackageSetPrivate; #define PLOVER_PACKAGE_SET_GET_PRIVATE(obj)\ @@ -84,6 +85,9 @@ static void plover_package_set_init(PloverPackageSet *set) { + PloverPackageSetPrivate *priv; + priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set); + priv->no_details=-1; } PloverPackageSet *plover_package_set_new(void) @@ -118,27 +122,60 @@ } PloverPackageSet *plover_package_set_new_from_repository(const char *base, - GError **err) + struct razor_relocations *relocations,GError **err) { +#if HAVE_FCHDIR int fd; +#else + size_t wd_len; + char *wd; +#endif gchar *s; + struct razor_set *reloc; PloverPackageSet *set; PloverPackageSetPrivate *priv; set=plover_package_set_new(); priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set); +#if HAVE_FCHDIR fd=open(".",O_RDONLY); +#else + wd_len=32; + wd=malloc(wd_len); + while (!getcwd(wd,wd_len) && errno==ERANGE) + { + free(wd); + wd_len*=2; + wd=malloc(wd_len); + } +#endif s=g_build_filename(base,"repodata",NULL); if (chdir(s)<0) { g_set_error(err,G_FILE_ERROR,g_file_error_from_errno(errno), "%s: %s",s,g_strerror(errno)); g_object_unref(set); +#if HAVE_FCHDIR + close(fd); +#else + free(wd); +#endif return NULL; } g_free(s); priv->set=plover_razor_set_create_from_yum(".."); +#if HAVE_FCHDIR fchdir(fd); close(fd); +#else + chdir(wd); + free(wd); +#endif + if (priv->set && relocations) + { + reloc=plover_relocate_packages(priv->set,base,relocations); + razor_set_destroy(priv->set); + priv->set=reloc; + } if (!priv->set) { g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED, @@ -169,3 +206,44 @@ } return priv->packages; } + +/* + * Some versions of razor have a bug which causes all detail strings + * to be discarded. If such a version of razor is used to install or + * update a package, then all the detail strings for the installed + * set will be lost. This function tests for this condition and can + * be used to present something more useful than blank details. + */ + +gboolean plover_package_set_get_no_details(PloverPackageSet *set) +{ + PloverPackageSetPrivate *priv; + PloverPackage *package; + GSList *packages,*link; + g_return_val_if_fail(PLOVER_IS_PACKAGE_SET(set),FALSE); + priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set); + if (priv->no_details<0) + { + packages=plover_package_set_get_packages(set); + if (packages) + { + priv->no_details=0; + for(link=packages;link;link=link->next) + { + package=link->data; + priv->no_details+=2; + if (*plover_package_get_summary(package)) + priv->no_details--; + if (*plover_package_get_license(package)) + priv->no_details--; + if (*plover_package_get_description(package)) + priv->no_details--; + if (*plover_package_get_URL(package)) + priv->no_details--; + } + if (priv->no_details<0) /* More than 50% of strings present */ + priv->no_details=0; + } + } + return priv->no_details>0; +}