1) fixed relocations

2) let the relocation stuff omit files by path

CVS patchset: 2714
CVS date: 1999/01/19 03:01:52
This commit is contained in:
ewt 1999-01-19 03:01:52 +00:00
parent 74b036680c
commit 8c45431632
1 changed files with 89 additions and 75 deletions

View File

@ -37,7 +37,8 @@ static void psAppend(rpmProblemSet probs, rpmProblemType type,
static int archOkay(Header h);
static int osOkay(Header h);
static Header relocateFileList(struct availablePackage * alp,
rpmProblemSet probs, Header h);
rpmProblemSet probs, Header h,
enum fileActions * actions);
static int psTrim(rpmProblemSet filter, rpmProblemSet target);
static int sharedCmp(const void * one, const void * two);
static enum fileActions decideFileFate(char * filespec, short dbMode,
@ -64,7 +65,7 @@ void handleOverlappedFiles(struct fileInfo * fi, hashTable ht,
int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
void * notifyData, rpmProblemSet okProbs,
rpmProblemSet * newProbs, int flags) {
int i, j, numPackages;
int i, j;
struct availableList * al = &ts->addedPackages;
int rc, ourrc = 0;
int instFlags = 0, rmFlags = 0;
@ -79,7 +80,6 @@ int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
struct fileInfo * flList, * fi;
struct sharedFileInfo * shared, * sharedList;
int numShared;
int pkgNum;
int flEntries;
int last;
int beingRemoved;
@ -99,7 +99,7 @@ int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
*newProbs = probs;
hdrs = alloca(sizeof(*hdrs) * al->size);
for (pkgNum = 0, alp = al->list; pkgNum < al->size; pkgNum++, alp++) {
for (alp = al->list; (alp - al->list) < al->size; alp++) {
if (!archOkay(alp->h))
psAppend(probs, RPMPROB_BADARCH, alp->key, alp->h, NULL, NULL);
@ -117,8 +117,6 @@ int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
dbiFreeIndexRecord(dbi);
}
hdrs[pkgNum] = relocateFileList(alp, probs, alp->h);
if (headerGetEntry(alp->h, RPMTAG_FILENAMES, NULL, NULL, &fileCount))
totalFileCount += fileCount;
}
@ -134,20 +132,30 @@ int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
}
}
flList = alloca(sizeof(*flList) * (al->size + ts->numRemovedPackages));
flEntries = al->size + ts->numRemovedPackages;
flList = alloca(sizeof(*flList) * (flEntries));
ht = htCreate(totalFileCount * 2, 0, fpHashFunction, fpEqual);
fi = flList;
/* FIXME?: we'd be better off assembling one very large file list and
calling fpLookupList only once. I'm not sure that the speedup is
worth the trouble though. */
for (pkgNum = 0, alp = al->list; pkgNum < al->size; pkgNum++, alp++) {
fi->h = alp->h;
if (!headerGetEntryMinMemory(fi->h, RPMTAG_FILENAMES, NULL,
(void *) &fi->fl, &fi->fc))
for (fi = flList, alp = al->list; (alp - al->list) < al->size;
fi++, alp++) {
if (!headerGetEntryMinMemory(alp->h, RPMTAG_FILENAMES, NULL,
(void *) NULL, &fi->fc)) {
fi->fc = 0;
fi->h = alp->h;
continue;
}
fi->actions = calloc(sizeof(*fi->actions), fi->fc);
fi->h = hdrs[alp - al->list] = relocateFileList(alp, probs, alp->h,
fi->actions);
headerGetEntryMinMemory(fi->h, RPMTAG_FILENAMES, NULL,
(void *) &fi->fl, &fi->fc);
headerGetEntryMinMemory(fi->h, RPMTAG_FILEMD5S, NULL,
(void *) &fi->fmd5s, NULL);
headerGetEntryMinMemory(fi->h, RPMTAG_FILELINKTOS, NULL,
@ -158,14 +166,12 @@ int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
(void *) &fi->fflags, NULL);
fi->type = ADDED;
fi->actions = malloc(sizeof(*fi->actions) * fi->fc);
fi->fps = alloca(fi->fc * sizeof(*fi->fps));
fi->ap = alp;
fi->replaced = NULL;
fi++;
}
for (i = 0; i < ts->numRemovedPackages; i++) {
for (i = 0; i < ts->numRemovedPackages; i++, fi++) {
fi->type = REMOVED;
fi->record = ts->removedPackages[i];
fi->h = rpmdbGetRecord(ts->db, fi->record);
@ -175,6 +181,7 @@ int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
}
if (!headerGetEntryMinMemory(fi->h, RPMTAG_FILENAMES, NULL,
(void *) &fi->fl, &fi->fc)) {
fi->fc = 0;
continue;
}
headerGetEntryMinMemory(fi->h, RPMTAG_FILEFLAGS, NULL,
@ -186,18 +193,14 @@ int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
headerGetEntryMinMemory(fi->h, RPMTAG_FILESTATES, NULL,
(void *) &fi->fstates, NULL);
fi->actions = malloc(sizeof(*fi->actions) * fi->fc);
fi->actions = calloc(sizeof(*fi->actions), fi->fc);
fi->fps = alloca(fi->fc * sizeof(*fi->fps));
fi++;
}
flEntries = fi - flList;
for (pkgNum = 0, fi = flList; pkgNum < flEntries; pkgNum++, fi++) {
for (fi = flList; (fi - flList) < flEntries; fi++) {
fpLookupList(fi->fl, fi->fps, fi->fc, 1);
for (i = 0; i < fi->fc; i++) {
htAddEntry(ht, fi->fps + i, fi);
fi->actions[i] = UNKNOWN;
}
}
@ -208,7 +211,7 @@ int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
chdir("/");
chroot(ts->root);
for (pkgNum = 0, fi = flList; pkgNum < flEntries; pkgNum++, fi++) {
for (fi = flList; (fi - flList) < flEntries; fi++) {
matches = malloc(sizeof(*matches) * fi->fc);
if (rpmdbFindFpList(ts->db, fi->fps, matches, fi->fc)) return 1;
@ -263,17 +266,15 @@ int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
htFree(ht);
numPackages = 0;
for (pkgNum = 0, alp = al->list; pkgNum < al->size; pkgNum++, alp++) {
if (alp->h != flList[numPackages].h) continue;
fi = flList + numPackages;
free(fi->fl);
if (fi->type == ADDED) {
free(fi->fmd5s);
free(fi->flinks);
for (alp = al->list, fi = flList; (alp - al->list) < al->size;
alp++, fi++) {
if (fi->fc) {
free(fi->fl);
if (fi->type == ADDED) {
free(fi->fmd5s);
free(fi->flinks);
}
}
numPackages++;
}
if ((flags & RPMTRANS_FLAG_BUILD_PROBS) ||
@ -282,64 +283,61 @@ int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
for (i = 0; i < al->size; i++)
headerFree(hdrs[i]);
numPackages = 0;
for (pkgNum = 0, alp = al->list; pkgNum < al->size; pkgNum++, alp++) {
if (alp->h != flList[numPackages].h) continue;
fi = flList + numPackages;
free(fi->actions);
for (alp = al->list, fi = flList; (alp - al->list) < al->size;
alp++, fi++) {
if (fi->fc)
free(fi->actions);
}
return al->size + ts->numRemovedPackages;
}
numPackages = 0;
for (pkgNum = 0, alp = al->list; pkgNum < al->size; pkgNum++, alp++, fi++) {
if (al->list[pkgNum].fd) {
fd = al->list[pkgNum].fd;
for (alp = al->list, fi = flList; (alp - al->list) < al->size;
alp++, fi++) {
if (alp->fd) {
fd = alp->fd;
} else {
fd = notify(fi->h, RPMCALLBACK_INST_OPEN_FILE, 0, 0,
al->list[pkgNum].key, notifyData);
alp->key, notifyData);
if (fd) {
Header h;
headerFree(hdrs[pkgNum]);
headerFree(hdrs[alp - al->list]);
rc = rpmReadPackageHeader(fd, &h, NULL, NULL, NULL);
if (rc) {
notify(fi->h, RPMCALLBACK_INST_CLOSE_FILE, 0, 0,
al->list[pkgNum].key, notifyData);
alp->key, notifyData);
ourrc++;
fd = NULL;
} else {
hdrs[pkgNum] = relocateFileList(alp, probs, h);
hdrs[alp - al->list] =
relocateFileList(alp, probs, h, NULL);
headerFree(h);
}
}
}
if (fd) {
fi = flList + numPackages;
if (installBinaryPackage(ts->root, ts->db, fd, hdrs[pkgNum],
instFlags, notify, notifyData,
al->list[pkgNum].key, fi->actions,
fi->replaced))
if (installBinaryPackage(ts->root, ts->db, fd,
hdrs[alp - al->list], instFlags, notify,
notifyData, alp->key, fi->actions,
fi->replaced))
ourrc++;
} else {
ourrc++;
}
headerFree(hdrs[pkgNum]);
headerFree(hdrs[alp - al->list]);
if (alp->h == flList[numPackages].h) {
if (fi->fc)
free(fi->actions);
numPackages++;
}
if (!al->list[pkgNum].fd && fd)
notify(fi->h, RPMCALLBACK_INST_CLOSE_FILE, 0, 0,
al->list[pkgNum].key, notifyData);
if (!alp->fd && fd)
notify(fi->h, RPMCALLBACK_INST_CLOSE_FILE, 0, 0, alp->key,
notifyData);
}
fi = flList + numPackages;
/* fi is left at the first package which is to be removed */
for (i = 0; i < ts->numRemovedPackages; i++, fi++) {
if (removeBinaryPackage(ts->root, ts->db, ts->removedPackages[i],
rmFlags, fi->actions))
@ -444,7 +442,8 @@ void rpmProblemSetFree(rpmProblemSet probs) {
}
static Header relocateFileList(struct availablePackage * alp,
rpmProblemSet probs, Header origH) {
rpmProblemSet probs, Header origH,
enum fileActions * actions) {
int numValid, numRelocations;
int i, j, madeSwap, rc;
rpmRelocation * nextReloc, * relocations = NULL;
@ -452,10 +451,12 @@ static Header relocateFileList(struct availablePackage * alp,
rpmRelocation tmpReloc;
char ** validRelocations, ** actualRelocations;
char ** names;
char ** origNames;
int len, newLen;
char * newName;
int_32 fileCount;
Header h;
int relocated = 0;
if (!rawRelocations) return headerLink(origH);
h = headerCopy(origH);
@ -475,17 +476,21 @@ static Header relocateFileList(struct availablePackage * alp,
for (i = 0; i < numRelocations; i++) {
/* FIXME: default relocations (oldPath == NULL) need to be handled
int the UI, not rpmlib */
in the UI, not rpmlib */
relocations[i].oldPath =
alloca(strlen(rawRelocations[i].oldPath) + 1);
strcpy(relocations[i].oldPath, rawRelocations[i].oldPath);
stripTrailingSlashes(relocations[i].oldPath);
relocations[i].newPath =
alloca(strlen(rawRelocations[i].newPath) + 1);
strcpy(relocations[i].newPath, rawRelocations[i].newPath);
stripTrailingSlashes(relocations[i].newPath);
if (rawRelocations[i].newPath) {
relocations[i].newPath =
alloca(strlen(rawRelocations[i].newPath) + 1);
strcpy(relocations[i].newPath, rawRelocations[i].newPath);
stripTrailingSlashes(relocations[i].newPath);
} else {
relocations[i].newPath = NULL;
}
for (j = 0; j < numValid; j++)
if (!strcmp(validRelocations[j],
@ -533,8 +538,6 @@ static Header relocateFileList(struct availablePackage * alp,
headerGetEntry(h, RPMTAG_FILENAMES, NULL, (void **) &names,
&fileCount);
headerAddEntry(h, RPMTAG_FILENAMES, RPM_STRING_ARRAY_TYPE, names,
fileCount);
/* go through things backwards so that /usr/local relocations take
precedence over /usr ones */
@ -556,17 +559,28 @@ static Header relocateFileList(struct availablePackage * alp,
} while (rc > 0 && nextReloc);
if (!rc) {
newName = alloca(newLen + strlen(names[i]) + 1);
strcpy(newName, nextReloc->newPath);
strcat(newName, names[i] + len);
rpmMessage(RPMMESS_DEBUG, _("relocating %s to %s\n"),
names[i], newName);
names[i] = newName;
if (nextReloc->newPath) {
newName = alloca(newLen + strlen(names[i]) + 1);
strcpy(newName, nextReloc->newPath);
strcat(newName, names[i] + len);
rpmMessage(RPMMESS_DEBUG, _("relocating %s to %s\n"),
names[i], newName);
names[i] = newName;
relocated = 1;
} else if (actions) {
actions[i] = SKIP;
}
}
}
headerModifyEntry(h, RPMTAG_FILENAMES, RPM_STRING_ARRAY_TYPE,
names, fileCount);
if (relocated) {
headerGetEntry(h, RPMTAG_FILENAMES, NULL, &origNames, NULL);
headerAddEntry(h, RPMTAG_ORIGFILENAMES, RPM_STRING_ARRAY_TYPE,
origNames, fileCount);
free(origNames);
headerModifyEntry(h, RPMTAG_FILENAMES, RPM_STRING_ARRAY_TYPE,
names, fileCount);
}
free(names);