#include "repo_susetags.h"
#include "repo_content.h"
#endif
+#ifdef SUSE
+#include "repo_autopattern.h"
+#endif
#include "solv_xfopen.h"
#ifdef FEDORA
int metadata_expire;
char **components;
int ncomponents;
-
unsigned char cookie[32];
+ int extcookieset;
unsigned char extcookie[32];
int incomplete;
};
#define TYPE_PLAINDIR 3
#define TYPE_DEBIAN 4
-#ifndef NOSYSTEM
static int
read_repoinfos_sort(const void *ap, const void *bp)
{
const struct repoinfo *b = bp;
return strcmp(a->alias, b->alias);
}
-#endif
#if defined(SUSE) || defined(FEDORA)
#endif
-#ifdef NOSYSTEM
-struct repoinfo *
-read_repoinfos(Pool *pool, int *nrepoinfosp)
-{
- *nrepoinfosp = 0;
- return 0;
-}
-#endif
-
void
free_repoinfos(struct repoinfo *repoinfos, int nrepoinfos)
{
char buf[1024];
const unsigned char *sum;
- void *h;
+ Chksum *h;
int l;
h = solv_chksum_create(chksumtype);
{
Pool *sigpool = pool_create();
#if defined(ENABLE_PUBKEY) && defined(ENABLE_RPMDB)
- Repo *repo = repo_create(sigpool, "rpmdbkeys");
+ Repo *repo = repo_create(sigpool, "pubkeys");
repo_add_rpmdb_pubkeys(repo, 0);
#endif
return sigpool;
calc_checksum_fp(FILE *fp, Id chktype, unsigned char *out)
{
char buf[4096];
- void *h = solv_chksum_create(chktype);
+ Chksum *h = solv_chksum_create(chktype);
int l;
solv_chksum_add(h, CHKSUM_IDENT, strlen(CHKSUM_IDENT));
void
calc_checksum_stat(struct stat *stb, Id chktype, unsigned char *cookie, unsigned char *out)
{
- void *h = solv_chksum_create(chktype);
+ Chksum *h = solv_chksum_create(chktype);
solv_chksum_add(h, CHKSUM_IDENT, strlen(CHKSUM_IDENT));
if (cookie)
solv_chksum_add(h, cookie, 32);
fclose(fp);
return 0;
}
- if (cookie && memcmp(cookie, mycookie, sizeof(mycookie)))
+ if (cookie && memcmp(cookie, mycookie, sizeof(mycookie)) != 0)
{
fclose(fp);
return 0;
{
memcpy(cinfo->cookie, mycookie, sizeof(mycookie));
memcpy(cinfo->extcookie, myextcookie, sizeof(myextcookie));
+ cinfo->extcookieset = 1;
}
if (mark)
futimens(fileno(fp), 0); /* try to set modification time */
}
void
-writecachedrepo(Repo *repo, Repodata *info, const char *repoext, unsigned char *cookie)
+writecachedrepo(Repo *repo, Repodata *repodata, const char *repoext, unsigned char *cookie)
{
FILE *fp;
int i, fd;
if (i < repo->end)
onepiece = 0;
- if (!info)
+ if (!repodata)
repo_write(repo, fp);
else if (repoext)
- repodata_write(info, fp);
+ repodata_write(repodata, fp);
else
{
int oldnrepodata = repo->nrepodata;
repo->nrepodata = oldnrepodata > 2 ? 2 : oldnrepodata; /* XXX: do this right */
repo_write(repo, fp);
repo->nrepodata = oldnrepodata;
- onepiece = 0;
+ onepiece = 0; /* don't bother for the added file provides */
}
if (!repoext && cinfo)
{
- if (!cinfo->extcookie[0])
+ if (!cinfo->extcookieset)
{
/* create the ext cookie and append it */
/* we just need some unique ID */
if (!fstat(fileno(fp), &stb))
memset(&stb, 0, sizeof(stb));
calc_checksum_stat(&stb, REPOKEY_TYPE_SHA256, cookie, cinfo->extcookie);
- if (cinfo->extcookie[0] == 0)
- cinfo->extcookie[0] = 1;
+ cinfo->extcookieset = 1;
}
if (fwrite(cinfo->extcookie, 32, 1, fp) != 1)
{
int flags = REPO_USE_LOADING|REPO_EXTEND_SOLVABLES;
/* make sure repodata contains complete repo */
/* (this is how repodata_write saves it) */
- repodata_extend_block(info, repo->start, repo->end - repo->start);
- info->state = REPODATA_LOADING;
+ repodata_extend_block(repodata, repo->start, repo->end - repo->start);
+ repodata->state = REPODATA_LOADING;
if (strcmp(repoext, "DL") != 0)
flags |= REPO_LOCALPOOL;
repo_add_solv(repo, fp, flags);
- info->state = REPODATA_AVAILABLE; /* in case the load failed */
+ repodata->state = REPODATA_AVAILABLE; /* in case the load failed */
}
fclose(fp);
}
printf("%s\n", pool_errstr(repo->pool));
return 0;
}
- writecachedrepo(repo, data, ext, cinfo->extcookie);
+ if (cinfo->extcookieset)
+ writecachedrepo(repo, data, ext, cinfo->extcookie);
return 1;
}
return 0;
}
fclose(fp);
- writecachedrepo(repo, data, ext, cinfo->extcookie);
+ if (cinfo->extcookieset)
+ writecachedrepo(repo, data, ext, cinfo->extcookie);
return 1;
}
#endif
#endif
repo = repo_create(pool, "@System");
+ memset(&stb, 0, sizeof(stb));
#if defined(ENABLE_RPMDB) && (defined(SUSE) || defined(FEDORA))
printf("rpm database:");
if (stat(pool_prepend_rootdir_tmp(pool, "/var/lib/rpm/Packages"), &stb))
if (stat(pool_prepend_rootdir_tmp(pool, "/var/lib/dpkg/status"), &stb))
memset(&stb, 0, sizeof(stb));
#endif
-#ifdef NOSYSTEM
- printf("no installed database:");
- memset(&stb, 0, sizeof(stb));
-#endif
calc_checksum_stat(&stb, REPOKEY_TYPE_SHA256, 0, installedcookie);
if (usecachedrepo(repo, 0, installedcookie, 0))
printf(" cached\n");
#if defined(ENABLE_RPMDB) && (defined(SUSE) || defined(FEDORA))
# if defined(ENABLE_SUSEREPO) && defined(PRODUCTS_PATH)
- if (repo_add_products(repo, PRODUCTS_PATH, REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR))
+ if (repo_add_products(repo, PRODUCTS_PATH, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR))
{
fprintf(stderr, "product reading failed: %s\n", pool_errstr(pool));
exit(1);
}
# endif
# if defined(ENABLE_APPDATA)
- if (repo_add_appdata_dir(repo, APPDATA_PATH, REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR))
+ if (repo_add_appdata_dir(repo, APPDATA_PATH, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR))
{
fprintf(stderr, "appdata reading failed: %s\n", pool_errstr(pool));
exit(1);
}
# endif
ofp = fopen(calccachepath(repo, 0, 0), "r");
- if (repo_add_rpmdb_reffp(repo, ofp, REPO_REUSE_REPODATA | REPO_USE_ROOTDIR))
+ if (repo_add_rpmdb_reffp(repo, ofp, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR))
{
fprintf(stderr, "installed db: %s\n", pool_errstr(pool));
exit(1);
fclose(ofp);
#endif
#if defined(ENABLE_DEBIAN) && defined(DEBIAN)
- if (repo_add_debdb(repo, REPO_REUSE_REPODATA | REPO_USE_ROOTDIR))
+ if (repo_add_debdb(repo, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR))
{
fprintf(stderr, "installed db: %s\n", pool_errstr(pool));
exit(1);
}
#endif
+ repo_internalize(repo);
writecachedrepo(repo, 0, 0, installedcookie);
}
pool_set_installed(pool, repo);
if (repo->nrepodata < 2)
continue;
cinfo = repo->appdata;
+ if (repo != pool->installed && !cinfo)
+ continue;
if (cinfo && cinfo->incomplete)
continue;
data = repo_id2repodata(repo, 1);
#endif
+#ifdef SUSE
+static void
+add_autopackages(Pool *pool)
+{
+ int i;
+ Repo *repo;
+ FOR_REPOS(i, repo)
+ repo_add_autopattern(repo, 0);
+}
+#endif
+
#if defined(SUSE) || defined(FEDORA)
static void
add_patchjobs(Pool *pool, Queue *job)
int i;
/* XXX: use mountpoints here */
+ memset(duc, 0, sizeof(duc));
duc[0].path = "/";
duc[1].path = "/usr/share/man";
duc[2].path = "/sbin";
queue_init(&repofilter);
queue_init(&kindfilter);
queue_init(&archfilter);
- while (argc > 2)
+ while (argc > 1)
{
- if (!strcmp(argv[1], "-r") || !strcmp(argv[1], "--repo"))
+ if (!strcmp(argv[1], "-i"))
+ {
+ queue_push2(&repofilter, SOLVER_SOLVABLE_REPO | SOLVER_SETREPO, pool->installed->repoid);
+ argc--;
+ argv++;
+ }
+ else if (argc > 2 && (!strcmp(argv[1], "-r") || !strcmp(argv[1], "--repo")))
{
const char *rname = argv[2], *rp;
Id repoid = 0;
argc -= 2;
argv += 2;
}
- else if (!strcmp(argv[1], "--arch"))
+ else if (argc > 2 && !strcmp(argv[1], "--arch"))
{
- if (!strcmp(argv[2], "src") || !strcmp(argv[2], "nosrc"))
+ if (!strcmp(argv[2], "src") || !strcmp(argv[2], "nosrc"))
archfilter_src = 1;
queue_push2(&archfilter, SOLVER_SOLVABLE_PROVIDES, pool_rel2id(pool, 0, pool_str2id(pool, argv[2], 1), REL_ARCH, 1));
argc -= 2;
argv += 2;
}
- else if (!strcmp(argv[1], "-t") || !strcmp(argv[1], "--type"))
+ else if (argc > 2 && (!strcmp(argv[1], "-t") || !strcmp(argv[1], "--type")))
{
const char *kind = argv[2];
if (!strcmp(kind, "srcpackage"))
if (pool->disttype == DISTTYPE_RPM)
addfileprovides(pool);
#endif
+#ifdef SUSE
+ add_autopackages(pool);
+#endif
pool_createwhatprovides(pool);
if (keyname)