#include "lib/manifest.h"
#include "debug.h"
-int rpmcliPackagesTotal = 0;
-int rpmcliHashesCurrent = 0;
-int rpmcliHashesTotal = 0;
-int rpmcliProgressCurrent = 0;
-int rpmcliProgressTotal = 0;
+static int rpmcliPackagesTotal = 0;
+static int rpmcliHashesCurrent = 0;
+static int rpmcliHashesTotal = 0;
+static int rpmcliProgressCurrent = 0;
+static int rpmcliProgressTotal = 0;
/**
* Print a CLI progress bar.
{
int hashesNeeded;
- rpmcliHashesTotal = (isatty (STDOUT_FILENO) ? 44 : 50);
+ rpmcliHashesTotal = (isatty (STDOUT_FILENO) ? 34 : 40);
if (rpmcliHashesCurrent != rpmcliHashesTotal) {
float pct = (total ? (((float) amount) / total) : 1.0);
else
vsflags = rpmExpandNumeric("%{?_vsflags_install}");
- if (ia->qva_flags & VERIFY_DIGEST)
+ if (rpmcliQueryFlags & VERIFY_DIGEST)
vsflags |= _RPMVSF_NODIGESTS;
- if (ia->qva_flags & VERIFY_SIGNATURE)
+ if (rpmcliQueryFlags & VERIFY_SIGNATURE)
vsflags |= _RPMVSF_NOSIGNATURES;
- if (ia->qva_flags & VERIFY_HDRCHK)
+ if (rpmcliQueryFlags & VERIFY_HDRCHK)
vsflags |= RPMVSF_NOHDRCHK;
return vsflags;
void * data)
{
Header h = (Header) arg;
- char * s;
int flags = (int) ((long)data);
void * rc = NULL;
const char * filename = (const char *)key;
static FD_t fd = NULL;
+ static int state = -1;
switch (what) {
case RPMCALLBACK_INST_OPEN_FILE:
break;
case RPMCALLBACK_INST_START:
+ case RPMCALLBACK_UNINST_START:
+ if (state != what) {
+ state = what;
+ if (flags & INSTALL_HASH) {
+ if (what == RPMCALLBACK_INST_START) {
+ fprintf(stdout, _("Updating / installing...\n"));
+ } else {
+ fprintf(stdout, _("Cleaning up / removing...\n"));
+ }
+ fflush(stdout);
+ }
+ }
+
rpmcliHashesCurrent = 0;
if (h == NULL || !(flags & INSTALL_LABEL))
break;
- /* @todo Remove headerFormat() on a progress callback. */
if (flags & INSTALL_HASH) {
- s = headerFormat(h, "%{NAME}", NULL);
+ char *s = headerGetAsString(h, RPMTAG_NEVR);
if (isatty (STDOUT_FILENO))
- fprintf(stdout, "%4d:%-23.23s", rpmcliProgressCurrent + 1, s);
+ fprintf(stdout, "%4d:%-33.33s", rpmcliProgressCurrent + 1, s);
else
- fprintf(stdout, "%-28.28s", s);
+ fprintf(stdout, "%-38.38s", s);
(void) fflush(stdout);
- s = _free(s);
+ free(s);
} else {
- s = headerFormat(h, "%{NAME}-%{VERSION}-%{RELEASE}", NULL);
+ char *s = headerGetAsString(h, RPMTAG_NEVRA);
fprintf(stdout, "%s\n", s);
(void) fflush(stdout);
- s = _free(s);
+ free(s);
}
break;
+ case RPMCALLBACK_INST_STOP:
+ break;
+
case RPMCALLBACK_TRANS_PROGRESS:
case RPMCALLBACK_INST_PROGRESS:
+ case RPMCALLBACK_UNINST_PROGRESS:
if (flags & INSTALL_PERCENT)
fprintf(stdout, "%%%% %f\n", (double) (total
? ((((float) amount) / total) * 100)
rpmcliHashesCurrent = 0;
rpmcliProgressTotal = 1;
rpmcliProgressCurrent = 0;
+ rpmcliPackagesTotal = total;
+ state = what;
if (!(flags & INSTALL_LABEL))
break;
if (flags & INSTALL_HASH)
- fprintf(stdout, "%-28s", _("Preparing..."));
+ fprintf(stdout, "%-38s", _("Preparing..."));
else
- fprintf(stdout, "%s\n", _("Preparing packages for installation..."));
+ fprintf(stdout, "%s\n", _("Preparing packages..."));
(void) fflush(stdout);
break;
rpmcliProgressCurrent = 0;
break;
- case RPMCALLBACK_UNINST_PROGRESS:
- break;
- case RPMCALLBACK_UNINST_START:
- break;
case RPMCALLBACK_UNINST_STOP:
break;
case RPMCALLBACK_UNPACK_ERROR:
break;
case RPMCALLBACK_SCRIPT_ERROR:
break;
+ case RPMCALLBACK_SCRIPT_START:
+ break;
+ case RPMCALLBACK_SCRIPT_STOP:
+ break;
case RPMCALLBACK_UNKNOWN:
default:
break;
}
struct rpmEIU {
- Header h;
int numFailed;
int numPkgs;
char ** pkgURL;
int numRPMS;
int numSRPMS;
char ** sourceURL;
- int isSource;
int argc;
char ** argv;
rpmRelocation * relocations;
int rc;
/* Try to read a package manifest. */
- FD_t fd = Fopen(*eiu->fnp, "r.fpio");
+ FD_t fd = Fopen(*eiu->fnp, "r.ufdio");
if (fd == NULL || Ferror(fd)) {
rpmlog(RPMLOG_ERR, _("open of %s failed: %s\n"), *eiu->fnp,
Fstrerror(fd));
return rc;
}
-static int tryReadHeader(rpmts ts, struct rpmEIU * eiu, rpmVSFlags vsflags)
+static int tryReadHeader(rpmts ts, struct rpmEIU * eiu, Header * hdrp)
{
- rpmVSFlags tvsflags;
-
/* Try to read the header from a package file. */
FD_t fd = Fopen(*eiu->fnp, "r.ufdio");
if (fd == NULL || Ferror(fd)) {
}
/* Read the header, verifying signatures (if present). */
- tvsflags = rpmtsSetVSFlags(ts, vsflags);
- eiu->rpmrc = rpmReadPackageFile(ts, fd, *eiu->fnp, &eiu->h);
- tvsflags = rpmtsSetVSFlags(ts, tvsflags);
+ eiu->rpmrc = rpmReadPackageFile(ts, fd, *eiu->fnp, hdrp);
Fclose(fd);
fd = NULL;
/* On --freshen, verify package is installed and newer */
-static int checkFreshenStatus(rpmts ts, struct rpmEIU * eiu)
+static int checkFreshenStatus(rpmts ts, Header h)
{
rpmdbMatchIterator mi = NULL;
- const char * name = headerGetString(eiu->h, RPMTAG_NAME);
- Header oldH;
- int count;
+ const char * name = headerGetString(h, RPMTAG_NAME);
+ const char *arch = headerGetString(h, RPMTAG_ARCH);
+ Header oldH = NULL;
if (name != NULL)
- mi = rpmtsInitIterator(ts, RPMTAG_NAME, name, 0);
- count = rpmdbGetIteratorCount(mi);
+ mi = rpmtsInitIterator(ts, RPMDBI_NAME, name, 0);
+ if (rpmtsColor(ts) && arch)
+ rpmdbSetIteratorRE(mi, RPMTAG_ARCH, RPMMIRE_DEFAULT, arch);
+
while ((oldH = rpmdbNextIterator(mi)) != NULL) {
- if (rpmVersionCompare(oldH, eiu->h) < 0)
- continue;
- /* same or newer package already installed */
- count = 0;
- break;
- }
- mi = rpmdbFreeIterator(mi);
- if (count == 0) {
- eiu->h = headerFree(eiu->h);
- return -1;
+ /* Package is newer than those currently installed. */
+ if (rpmVersionCompare(oldH, h) < 0)
+ break;
}
- /* Package is newer than those currently installed. */
- return 1;
+ rpmdbFreeIterator(mi);
+ return (oldH != NULL);
}
/** @todo Generalize --freshen policies. */
int rc;
int i;
- if (fileArgv == NULL) goto exit;
+ vsflags = setvsFlags(ia);
+ ovsflags = rpmtsSetVSFlags(ts, (vsflags | RPMVSF_NEEDPAYLOAD));
- rpmcliPackagesTotal = 0;
+ if (fileArgv == NULL) goto exit;
(void) rpmtsSetFlags(ts, ia->transFlags);
relocations = ia->relocations;
- vsflags = setvsFlags(ia);
- ovsflags = rpmtsSetVSFlags(ts, (vsflags | RPMVSF_NEEDPAYLOAD));
-
setNotifyFlag(ia, ts);
if ((eiu->relocations = relocations) != NULL) {
*eiu->fnp != NULL;
eiu->fnp++, eiu->prevx++)
{
+ Header h = NULL;
const char * fileName;
rpmlog(RPMLOG_DEBUG, "============== %s\n", *eiu->fnp);
(void) urlPath(*eiu->fnp, &fileName);
- if (tryReadHeader(ts, eiu, vsflags) == RPMRC_FAIL)
+ if (tryReadHeader(ts, eiu, &h) == RPMRC_FAIL)
continue;
if (eiu->rpmrc == RPMRC_NOTFOUND) {
}
}
- eiu->isSource = headerIsSource(eiu->h);
-
- if (eiu->isSource) {
+ if (headerIsSource(h)) {
rpmlog(RPMLOG_DEBUG, "\tadded source package [%d]\n",
eiu->numSRPMS);
eiu->sourceURL = xrealloc(eiu->sourceURL,
if (eiu->relocations) {
struct rpmtd_s prefixes;
- headerGet(eiu->h, RPMTAG_PREFIXES, &prefixes, HEADERGET_DEFAULT);
+ headerGet(h, RPMTAG_PREFIXES, &prefixes, HEADERGET_DEFAULT);
if (rpmtdCount(&prefixes) == 1) {
eiu->relocations->oldPath = xstrdup(rpmtdGetString(&prefixes));
rpmtdFreeData(&prefixes);
} else {
rpmlog(RPMLOG_ERR, _("package %s is not relocatable\n"),
- headerGetString(eiu->h, RPMTAG_NAME));
+ headerGetString(h, RPMTAG_NAME));
eiu->numFailed++;
goto exit;
}
}
if (ia->installInterfaceFlags & INSTALL_FRESHEN)
- if (checkFreshenStatus(ts, eiu) != 1)
+ if (checkFreshenStatus(ts, h) != 1) {
+ headerFree(h);
continue;
+ }
- rc = rpmtsAddInstallElement(ts, eiu->h, (fnpyKey)fileName,
+ rc = rpmtsAddInstallElement(ts, h, (fnpyKey)fileName,
(ia->installInterfaceFlags & INSTALL_UPGRADE) != 0,
relocations);
- /* XXX reference held by transaction set */
- eiu->h = headerFree(eiu->h);
+ headerFree(h);
if (eiu->relocations)
eiu->relocations->oldPath = _free(eiu->relocations->oldPath);
eiu->numFailed++;
goto exit;
break;
- case 2:
- rpmlog(RPMLOG_ERR,
- _("file %s requires a newer version of RPM\n"),
- *eiu->fnp);
- eiu->numFailed++;
- goto exit;
- break;
default:
eiu->numFailed++;
goto exit;
free(eiu);
rpmtsEmpty(ts);
+ rpmtsSetVSFlags(ts, ovsflags);
return rc;
}
vsflags = setvsFlags(ia);
ovsflags = rpmtsSetVSFlags(ts, vsflags);
- /* XXX suggest mechanism only meaningful when installing */
- ia->transFlags |= RPMTRANS_FLAG_NOSUGGEST;
-
(void) rpmtsSetFlags(ts, ia->transFlags);
-#ifdef NOTYET /* XXX no callbacks on erase yet */
setNotifyFlag(ia, ts);
-#endif
qfmt = rpmExpand("%{?_query_all_fmt}\n", NULL);
for (arg = argv; *arg; arg++) {
- rpmdbMatchIterator mi;
- int matches = 0;
+ rpmdbMatchIterator mi = rpmtsInitIterator(ts, RPMDBI_LABEL, *arg, 0);
+ int matches = rpmdbGetIteratorCount(mi);
int erasing = 1;
- /* Iterator count isn't reliable with labels, count manually... */
- mi = rpmtsInitIterator(ts, RPMDBI_LABEL, *arg, 0);
- while (rpmdbNextIterator(mi) != NULL) {
- matches++;
- }
- rpmdbFreeIterator(mi);
-
if (! matches) {
rpmlog(RPMLOG_ERR, _("package %s is not installed\n"), *arg);
numFailed++;
erasing = 0;
}
- mi = rpmtsInitIterator(ts, RPMDBI_LABEL, *arg, 0);
while ((h = rpmdbNextIterator(mi)) != NULL) {
if (erasing) {
(void) rpmtsAddEraseElement(ts, h, -1);
free(nevra);
}
}
- mi = rpmdbFreeIterator(mi);
}
+ rpmdbFreeIterator(mi);
}
free(qfmt);
numFailed = rpmcliTransaction(ts, ia, numPackages);
exit:
rpmtsEmpty(ts);
+ rpmtsSetVSFlags(ts, ovsflags);
return numFailed;
}
rpmtsSetVSFlags(ts, (specFilePtr) ? (rpmtsVSFlags(ts) | RPMVSF_NEEDPAYLOAD) : rpmtsVSFlags(ts));
rpmRC rpmrc = rpmInstallSourcePackage(ts, fd, specFilePtr, cookie);
rc = (rpmrc == RPMRC_OK ? 0 : 1);
- ovsflags = rpmtsSetVSFlags(ts, ovsflags);
+ rpmtsSetVSFlags(ts, ovsflags);
}
if (rc != 0) {
rpmlog(RPMLOG_ERR, _("%s cannot be installed\n"), arg);