|
Packit Service |
ff689b |
/*
|
|
Packit Service |
ff689b |
* Copyright (c) 2007, Novell Inc.
|
|
Packit Service |
ff689b |
*
|
|
Packit Service |
ff689b |
* This program is licensed under the BSD license, read LICENSE.BSD
|
|
Packit Service |
ff689b |
* for further information
|
|
Packit Service |
ff689b |
*/
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
/*
|
|
Packit Service |
ff689b |
* mergesolv
|
|
Packit Service |
ff689b |
*
|
|
Packit Service |
ff689b |
*/
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
#include <sys/types.h>
|
|
Packit Service |
ff689b |
#include <unistd.h>
|
|
Packit Service |
ff689b |
#include <stdio.h>
|
|
Packit Service |
ff689b |
#include <stdlib.h>
|
|
Packit Service |
ff689b |
#include <string.h>
|
|
Packit Service |
ff689b |
#include <assert.h>
|
|
Packit Service |
ff689b |
#include <getopt.h>
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
#include "pool.h"
|
|
Packit Service |
ff689b |
#include "repo_solv.h"
|
|
Packit Service |
ff689b |
#ifdef SUSE
|
|
Packit Service |
ff689b |
#include "repo_autopattern.h"
|
|
Packit Service |
ff689b |
#endif
|
|
Packit Service |
ff689b |
#include "common_write.h"
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
static void
|
|
Packit Service |
ff689b |
usage()
|
|
Packit Service |
ff689b |
{
|
|
Packit Service |
ff689b |
fprintf(stderr, "\nUsage:\n"
|
|
Packit Service |
ff689b |
"mergesolv [file] [file] [...]\n"
|
|
Packit Service |
ff689b |
" merges multiple solv files into one and writes it to stdout\n"
|
|
Packit Service |
ff689b |
);
|
|
Packit Service |
ff689b |
exit(0);
|
|
Packit Service |
ff689b |
}
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
static int
|
|
Packit Service |
ff689b |
loadcallback (Pool *pool, Repodata *data, void *vdata)
|
|
Packit Service |
ff689b |
{
|
|
Packit Service |
ff689b |
FILE *fp;
|
|
Packit Service |
ff689b |
const char *location = repodata_lookup_str(data, SOLVID_META, REPOSITORY_LOCATION);
|
|
Packit Service |
ff689b |
int r;
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
if (!location)
|
|
Packit Service |
ff689b |
return 0;
|
|
Packit Service |
ff689b |
fprintf(stderr, "Loading SOLV file %s\n", location);
|
|
Packit Service |
ff689b |
fp = fopen (location, "r");
|
|
Packit Service |
ff689b |
if (!fp)
|
|
Packit Service |
ff689b |
{
|
|
Packit Service |
ff689b |
perror(location);
|
|
Packit Service |
ff689b |
return 0;
|
|
Packit Service |
ff689b |
}
|
|
Packit Service |
ff689b |
r = repo_add_solv(data->repo, fp, REPO_USE_LOADING|REPO_LOCALPOOL);
|
|
Packit Service |
ff689b |
fclose(fp);
|
|
Packit Service |
ff689b |
return r ? 0 : 1;
|
|
Packit Service |
ff689b |
}
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
int
|
|
Packit Service |
ff689b |
main(int argc, char **argv)
|
|
Packit Service |
ff689b |
{
|
|
Packit Service |
ff689b |
Pool *pool;
|
|
Packit Service |
ff689b |
Repo *repo;
|
|
Packit Service |
ff689b |
int with_attr = 0;
|
|
Packit Service |
ff689b |
#ifdef SUSE
|
|
Packit Service |
ff689b |
int add_auto = 0;
|
|
Packit Service |
ff689b |
#endif
|
|
Packit Service |
ff689b |
int c;
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
pool = pool_create();
|
|
Packit Service |
ff689b |
repo = repo_create(pool, "<mergesolv>");
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
while ((c = getopt(argc, argv, "ahX")) >= 0)
|
|
Packit Service |
ff689b |
{
|
|
Packit Service |
ff689b |
switch (c)
|
|
Packit Service |
ff689b |
{
|
|
Packit Service |
ff689b |
case 'h':
|
|
Packit Service |
ff689b |
usage();
|
|
Packit Service |
ff689b |
break;
|
|
Packit Service |
ff689b |
case 'a':
|
|
Packit Service |
ff689b |
with_attr = 1;
|
|
Packit Service |
ff689b |
break;
|
|
Packit Service |
ff689b |
case 'X':
|
|
Packit Service |
ff689b |
#ifdef SUSE
|
|
Packit Service |
ff689b |
add_auto = 1;
|
|
Packit Service |
ff689b |
#endif
|
|
Packit Service |
ff689b |
break;
|
|
Packit Service |
ff689b |
default:
|
|
Packit Service |
ff689b |
usage();
|
|
Packit Service |
ff689b |
exit(1);
|
|
Packit Service |
ff689b |
}
|
|
Packit Service |
ff689b |
}
|
|
Packit Service |
ff689b |
if (with_attr)
|
|
Packit Service |
ff689b |
pool_setloadcallback(pool, loadcallback, 0);
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
for (; optind < argc; optind++)
|
|
Packit Service |
ff689b |
{
|
|
Packit Service |
ff689b |
FILE *fp;
|
|
Packit Service |
ff689b |
if ((fp = fopen(argv[optind], "r")) == NULL)
|
|
Packit Service |
ff689b |
{
|
|
Packit Service |
ff689b |
perror(argv[optind]);
|
|
Packit Service |
ff689b |
exit(1);
|
|
Packit Service |
ff689b |
}
|
|
Packit Service |
ff689b |
if (repo_add_solv(repo, fp, 0))
|
|
Packit Service |
ff689b |
{
|
|
Packit Service |
ff689b |
fprintf(stderr, "repo %s: %s\n", argv[optind], pool_errstr(pool));
|
|
Packit Service |
ff689b |
exit(1);
|
|
Packit Service |
ff689b |
}
|
|
Packit Service |
ff689b |
fclose(fp);
|
|
Packit Service |
ff689b |
}
|
|
Packit Service |
ff689b |
#ifdef SUSE
|
|
Packit Service |
ff689b |
if (add_auto)
|
|
Packit Service |
ff689b |
repo_add_autopattern(repo, 0);
|
|
Packit Service |
ff689b |
#endif
|
|
Packit Service |
ff689b |
tool_write(repo, stdout);
|
|
Packit Service |
ff689b |
pool_free(pool);
|
|
Packit Service |
ff689b |
return 0;
|
|
Packit Service |
ff689b |
}
|