plover-gtk/packageset.c
changeset 11 0987519d94ba
parent 9 8d3b1ddf789c
child 13 b0a35bae4961
     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 +}