setup/setup.c
author J. Ali Harlow <ali@juiblex.co.uk>
Wed Jun 22 17:04:28 2016 +0100 (2016-06-22)
changeset 44 43ffed8669ce
parent 31 a53fcb780468
child 61 31fb35727621
permissions -rw-r--r--
Port to razor 0.6.3.60
     1 /*
     2  * Copyright (C) 2009, 2011  J. Ali Harlow <ali@juiblex.co.uk>
     3  *
     4  * This program is free software; you can redistribute it and/or modify
     5  * it under the terms of the GNU General Public License as published by
     6  * the Free Software Foundation; either version 2 of the License, or
     7  * (at your option) any later version.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License along
    15  * with this program; if not, write to the Free Software Foundation, Inc.,
    16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    17  */
    18 
    19 #include <stdlib.h>
    20 #include <stdio.h>
    21 #include <string.h>
    22 #include <limits.h>
    23 #ifdef WIN32
    24 #include <windows.h>
    25 #include <shlobj.h>
    26 #endif
    27 #include <lua.h>
    28 #include "config.h"
    29 #include "plover/plover.h"
    30 #include "whelk/whelk.h"
    31 
    32 LUALIB_API int luaopen_posix(lua_State *L);
    33 
    34 void setup(const char *argv0)
    35 {
    36     char *path;
    37     gchar *s,*prefix;
    38     int ch,changed;
    39     struct comps *comps;
    40     struct comps_group *group;
    41     struct comps_requirement *pkg;
    42     struct plover_vector *packages=NULL;
    43     GError *error=NULL;
    44     path=plover_get_program_directory(argv0);
    45     s=g_strconcat(path,"/repodata/comps.xml",NULL);
    46     comps=plover_comps_new_from_file(s);
    47     if (!comps)
    48     {
    49 	perror(s);
    50 	exit(1);
    51     }
    52     g_free(s);
    53     prefix=plover_default_prefix_for_vendor(comps->vendor);
    54     if (!plover_installed_files_match_prefix(prefix))
    55     {
    56 	printf("The existing installation is not under %s\n"
    57 	  "In order to continue, all the existing packages must be removed.\n"
    58 	  "Do you want to remove all existing packages? ",prefix);
    59 	ch=getchar();
    60 	if (ch!='y' && ch!='Y' && ch!=EOF && ch!='\n')
    61 	    exit(1);
    62 	while(ch!='\n' && ch!=EOF)
    63 	    ch=getchar();
    64 	if (plover_remove(NULL,&error))
    65 	{
    66 	    fprintf(stderr,"%s\n",error->message);
    67 	    g_error_free(error);
    68 	    exit(1);
    69 	}
    70     }
    71     group=plover_comps_lookup_group(comps,"base");
    72     if (!group)
    73     {
    74 	fprintf(stderr,"No base group found in comps.xml\n");
    75 	exit(1);
    76     }
    77     packages=plover_vector_new();
    78     do
    79     {
    80 	changed=0;
    81 	for(pkg=group->packages;pkg;pkg=pkg->next)
    82 	{
    83 	    if (plover_vector_contains(packages,pkg->name))
    84 		continue;
    85 	    if (pkg->type==COMPS_REQUIREMENT_DEFAULT ||
    86 	      pkg->type==COMPS_REQUIREMENT_MANDATORY ||
    87 	      pkg->type==COMPS_REQUIREMENT_CONDITIONAL &&
    88 	      plover_vector_contains(packages,pkg->requires))
    89 	    {
    90 		changed++;
    91 		plover_vector_append(packages,pkg->name);
    92 	    }
    93 	}
    94     } while(changed);
    95     plover_comps_free(comps);
    96     if (!packages->len)
    97     {
    98 	fprintf(stderr,"No packages to install\n");
    99 	exit(1);
   100     }
   101     if (!plover_install(path,prefix,packages->strings,&error))
   102     {
   103 	fprintf(stderr,"%s\n",error->message);
   104 	g_error_free(error);
   105 	exit(1);
   106     }
   107     plover_vector_free(packages);
   108     g_free(prefix);
   109     free(path);
   110 }
   111 
   112 int main(int argc,char **argv)
   113 {
   114     GError *error=NULL;
   115     plover_exception_handler_init();
   116     razor_set_lua_loader("posix",(void (*)())luaopen_posix);
   117     razor_set_lua_loader("whelk",(void (*)())luaopen_whelk);
   118     if (argc>1 && !strcmp(argv[1],"-u"))
   119     {
   120 	if (!plover_remove(NULL,&error))
   121 	{
   122 	    fprintf(stderr,"%s\n",error->message);
   123 	    g_error_free(error);
   124 	    exit(1);
   125 	}
   126     }
   127     else
   128 	setup(argv[0]);
   129     exit(0);
   130 }