1.1 --- a/plover-gtk/packageset.c Sat Feb 20 12:11:02 2010 +0000
1.2 +++ b/plover-gtk/packageset.c Fri Apr 30 20:37:08 2010 +0100
1.3 @@ -34,6 +34,7 @@
1.4 struct razor_root *root;
1.5 struct razor_set *set;
1.6 GSList *packages;
1.7 + int no_details;
1.8 } PloverPackageSetPrivate;
1.9
1.10 #define PLOVER_PACKAGE_SET_GET_PRIVATE(obj)\
1.11 @@ -84,6 +85,9 @@
1.12
1.13 static void plover_package_set_init(PloverPackageSet *set)
1.14 {
1.15 + PloverPackageSetPrivate *priv;
1.16 + priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set);
1.17 + priv->no_details=-1;
1.18 }
1.19
1.20 PloverPackageSet *plover_package_set_new(void)
1.21 @@ -118,27 +122,60 @@
1.22 }
1.23
1.24 PloverPackageSet *plover_package_set_new_from_repository(const char *base,
1.25 - GError **err)
1.26 + struct razor_relocations *relocations,GError **err)
1.27 {
1.28 +#if HAVE_FCHDIR
1.29 int fd;
1.30 +#else
1.31 + size_t wd_len;
1.32 + char *wd;
1.33 +#endif
1.34 gchar *s;
1.35 + struct razor_set *reloc;
1.36 PloverPackageSet *set;
1.37 PloverPackageSetPrivate *priv;
1.38 set=plover_package_set_new();
1.39 priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set);
1.40 +#if HAVE_FCHDIR
1.41 fd=open(".",O_RDONLY);
1.42 +#else
1.43 + wd_len=32;
1.44 + wd=malloc(wd_len);
1.45 + while (!getcwd(wd,wd_len) && errno==ERANGE)
1.46 + {
1.47 + free(wd);
1.48 + wd_len*=2;
1.49 + wd=malloc(wd_len);
1.50 + }
1.51 +#endif
1.52 s=g_build_filename(base,"repodata",NULL);
1.53 if (chdir(s)<0)
1.54 {
1.55 g_set_error(err,G_FILE_ERROR,g_file_error_from_errno(errno),
1.56 "%s: %s",s,g_strerror(errno));
1.57 g_object_unref(set);
1.58 +#if HAVE_FCHDIR
1.59 + close(fd);
1.60 +#else
1.61 + free(wd);
1.62 +#endif
1.63 return NULL;
1.64 }
1.65 g_free(s);
1.66 priv->set=plover_razor_set_create_from_yum("..");
1.67 +#if HAVE_FCHDIR
1.68 fchdir(fd);
1.69 close(fd);
1.70 +#else
1.71 + chdir(wd);
1.72 + free(wd);
1.73 +#endif
1.74 + if (priv->set && relocations)
1.75 + {
1.76 + reloc=plover_relocate_packages(priv->set,base,relocations);
1.77 + razor_set_destroy(priv->set);
1.78 + priv->set=reloc;
1.79 + }
1.80 if (!priv->set)
1.81 {
1.82 g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED,
1.83 @@ -169,3 +206,44 @@
1.84 }
1.85 return priv->packages;
1.86 }
1.87 +
1.88 +/*
1.89 + * Some versions of razor have a bug which causes all detail strings
1.90 + * to be discarded. If such a version of razor is used to install or
1.91 + * update a package, then all the detail strings for the installed
1.92 + * set will be lost. This function tests for this condition and can
1.93 + * be used to present something more useful than blank details.
1.94 + */
1.95 +
1.96 +gboolean plover_package_set_get_no_details(PloverPackageSet *set)
1.97 +{
1.98 + PloverPackageSetPrivate *priv;
1.99 + PloverPackage *package;
1.100 + GSList *packages,*link;
1.101 + g_return_val_if_fail(PLOVER_IS_PACKAGE_SET(set),FALSE);
1.102 + priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set);
1.103 + if (priv->no_details<0)
1.104 + {
1.105 + packages=plover_package_set_get_packages(set);
1.106 + if (packages)
1.107 + {
1.108 + priv->no_details=0;
1.109 + for(link=packages;link;link=link->next)
1.110 + {
1.111 + package=link->data;
1.112 + priv->no_details+=2;
1.113 + if (*plover_package_get_summary(package))
1.114 + priv->no_details--;
1.115 + if (*plover_package_get_license(package))
1.116 + priv->no_details--;
1.117 + if (*plover_package_get_description(package))
1.118 + priv->no_details--;
1.119 + if (*plover_package_get_URL(package))
1.120 + priv->no_details--;
1.121 + }
1.122 + if (priv->no_details<0) /* More than 50% of strings present */
1.123 + priv->no_details=0;
1.124 + }
1.125 + }
1.126 + return priv->no_details>0;
1.127 +}