pre-inst/pre-inst.c
changeset 98 71127797ca73
parent 96 d2d88f14283e
child 99 0121592e2512
     1.1 --- a/pre-inst/pre-inst.c	Wed Jul 15 11:54:06 2020 +0100
     1.2 +++ b/pre-inst/pre-inst.c	Wed Jul 15 16:04:47 2020 +0100
     1.3 @@ -26,6 +26,7 @@
     1.4  #include <stdlib.h>
     1.5  #include <stdio.h>
     1.6  #include <string.h>
     1.7 +#include <errno.h>
     1.8  #include <lua.h>
     1.9  #include <razor.h>
    1.10  #include <plover/plover.h>
    1.11 @@ -90,10 +91,16 @@
    1.12  #endif
    1.13  unsigned pre_install_thread(void *data)
    1.14  {
    1.15 +    gboolean changed;
    1.16      int retval;
    1.17      const char *repository=data;
    1.18      gchar *s,*uri;
    1.19      char *install[]={"plover-gtkui",NULL};
    1.20 +    char **pkgs=install;
    1.21 +    struct comps *comps;
    1.22 +    struct comps_group *group;
    1.23 +    struct comps_requirement *pkg;
    1.24 +    struct plover_vector *packages=NULL;
    1.25      GError *error=NULL;
    1.26      plover__uri_handler_init();
    1.27      prefix=plover_pre_install_prefix();
    1.28 @@ -110,9 +117,44 @@
    1.29  	g_free(prefix);
    1.30  	return -1;
    1.31      }
    1.32 -    retval=!plover_install_uri(repository,prefix,install,&error);
    1.33 +    s=g_strconcat(repository,"/repodata/comps.xml",NULL);
    1.34 +    comps=plover_comps_new_from_uri(s,&error);
    1.35 +    retval=!comps;
    1.36 +    g_free(s);
    1.37 +    if (!retval)
    1.38 +    {
    1.39 +	group=plover_comps_lookup_group(comps,"installer");
    1.40 +	if (group)
    1.41 +	{
    1.42 +	    packages=plover_vector_new();
    1.43 +	    do
    1.44 +	    {
    1.45 +		changed=FALSE;
    1.46 +		for(pkg=group->packages;pkg;pkg=pkg->next)
    1.47 +		{
    1.48 +		    if (plover_vector_contains(packages,pkg->name))
    1.49 +			continue;
    1.50 +		    if (pkg->type==COMPS_REQUIREMENT_DEFAULT ||
    1.51 +		      pkg->type==COMPS_REQUIREMENT_MANDATORY ||
    1.52 +		      pkg->type==COMPS_REQUIREMENT_CONDITIONAL &&
    1.53 +		      plover_vector_contains(packages,pkg->requires))
    1.54 +		    {
    1.55 +			changed=TRUE;
    1.56 +			plover_vector_append(packages,pkg->name);
    1.57 +		    }
    1.58 +		}
    1.59 +	    } while(changed);
    1.60 +	    pkgs=packages->strings;
    1.61 +	}
    1.62 +    }
    1.63 +    if (!retval)
    1.64 +	retval=!plover_install_uri(repository,prefix,pkgs,&error);
    1.65      if (!retval)
    1.66  	retval=!plover_update_uri(repository,prefix,NULL,&error);
    1.67 +    if (packages)
    1.68 +	plover_vector_free(packages);
    1.69 +    if (comps)
    1.70 +	plover_comps_free(comps);
    1.71      if (error)
    1.72      {
    1.73  	fprintf(stderr,"%s\n",error->message);