/* * Copyright (C) 2009, 2011, 2016 J. Ali Harlow * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #ifdef WIN32 #include #include #endif #include #include "config.h" #include "plover/plover.h" #include "whelk/whelk.h" LUALIB_API int luaopen_posix(lua_State *L); void setup(const char *argv0) { char *yum_uri,*local_database,*active_database,*alternate_database; gchar *s,*prefix,*distribution,*vendor_prefix; int ch,changed; struct comps *comps; struct comps_group *group; struct comps_requirement *pkg; struct plover_vector *packages=NULL; GError *error=NULL; s=plover_get_program(argv0); yum_uri=razor_path_to_uri(s); g_free(s); s=g_strconcat(yum_uri,"/repodata/comps.xml",NULL); comps=plover_comps_new_from_uri(s,&error); g_free(s); if (g_error_matches(error,PLOVER_RAZOR_ERROR, RAZOR_GENERAL_ERROR_UNSUPPORTED_ARCHIVE)) { g_clear_error(&error); free(yum_uri); s=plover_get_program_directory(argv0); yum_uri=razor_path_to_uri(s); g_free(s); s=g_strconcat(yum_uri,"/repodata/comps.xml",NULL); comps=plover_comps_new_from_uri(s,&error); } if (!comps) { fprintf(stderr,"%s\n",error->message); g_error_free(error); exit(1); } prefix=plover_comps_get_default_prefix(comps); if (prefix) { s=g_strconcat(prefix,"/var/lib/razor",NULL); local_database=razor_path_to_uri(s); g_free(s); } else local_database=NULL; switch(comps->database) { case COMPS_DATABASE_DISTRIBUTION_LOCAL: active_database=local_database; alternate_database=NULL; break; case COMPS_DATABASE_GLOBAL: active_database=NULL; alternate_database=local_database; break; } if (prefix) { distribution=g_strdup(comps->distribution); plover_comps_set_distribution(comps,NULL); vendor_prefix=plover_comps_get_default_prefix(comps); plover_comps_set_distribution(comps,distribution); g_free(distribution); razor_set_database_uri(alternate_database); if (plover_installed_files_match_prefix(vendor_prefix)==1) { printf("There is an existing installation under %s\n" "which is not compatible with this distribution. In order\n" "to continue, the existing installation must be uninstalled.\n" "Do you want to remove all packages in the existing installion? ", prefix); ch=getchar(); if (ch!='y' && ch!='Y' && ch!=EOF && ch!='\n') exit(1); while(ch!='\n' && ch!=EOF) ch=getchar(); if (plover_remove(NULL,&error)) { fprintf(stderr,"%s\n",error->message); g_error_free(error); exit(1); } } g_free(vendor_prefix); } razor_set_database_uri(active_database); free(local_database); if (prefix && !plover_installed_files_match_prefix(prefix)) { printf("The existing installation is not under %s\n" "In order to continue, all the existing packages must be removed.\n" "Do you want to remove all existing packages? ",prefix); ch=getchar(); if (ch!='y' && ch!='Y' && ch!=EOF && ch!='\n') exit(1); while(ch!='\n' && ch!=EOF) ch=getchar(); if (plover_remove(NULL,&error)) { fprintf(stderr,"%s\n",error->message); g_error_free(error); exit(1); } } group=plover_comps_lookup_group(comps,"base"); if (!group) { fprintf(stderr,"No base group found in comps.xml\n"); exit(1); } packages=plover_vector_new(); do { changed=0; for(pkg=group->packages;pkg;pkg=pkg->next) { if (plover_vector_contains(packages,pkg->name)) continue; if (pkg->type==COMPS_REQUIREMENT_DEFAULT || pkg->type==COMPS_REQUIREMENT_MANDATORY || pkg->type==COMPS_REQUIREMENT_CONDITIONAL && plover_vector_contains(packages,pkg->requires)) { changed++; plover_vector_append(packages,pkg->name); } } } while(changed); plover_comps_free(comps); if (!packages->len) { fprintf(stderr,"No packages to install\n"); exit(1); } if (!plover_install_uri(yum_uri,prefix,packages->strings,&error)) { fprintf(stderr,"%s\n",error->message); g_error_free(error); exit(1); } plover_vector_free(packages); g_free(prefix); free(yum_uri); } int main(int argc,char **argv) { GError *error=NULL; plover_exception_handler_init(); razor_set_lua_loader("posix",(void (*)())luaopen_posix); razor_set_lua_loader("whelk",(void (*)())luaopen_whelk); if (argc>1 && !strcmp(argv[1],"-u")) { if (!plover_remove(NULL,&error)) { fprintf(stderr,"%s\n",error->message); g_error_free(error); exit(1); } } else setup(argv[0]); exit(0); }