break;
case FA_COPYIN:
case FA_CREATE:
-assert(rpmteType(fi->te) == TR_ADDED);
+ if (rpmteType(fi->te) == TR_ADDED)
+ rpmfiSetFState(fi, i, RPMFILE_STATE_NORMAL);
break;
case FA_SKIPNSTATE:
- if (fi->fstates && rpmteType(fi->te) == TR_ADDED)
- fi->fstates[i] = RPMFILE_STATE_NOTINSTALLED;
+ if (rpmteType(fi->te) == TR_ADDED)
+ rpmfiSetFState(fi, i, RPMFILE_STATE_NOTINSTALLED);
break;
case FA_SKIPNETSHARED:
- if (fi->fstates && rpmteType(fi->te) == TR_ADDED)
- fi->fstates[i] = RPMFILE_STATE_NETSHARED;
+ if (rpmteType(fi->te) == TR_ADDED)
+ rpmfiSetFState(fi, i, RPMFILE_STATE_NETSHARED);
break;
case FA_SKIPCOLOR:
- if (fi->fstates && rpmteType(fi->te) == TR_ADDED)
- fi->fstates[i] = RPMFILE_STATE_WRONGCOLOR;
+ if (rpmteType(fi->te) == TR_ADDED)
+ rpmfiSetFState(fi, i, RPMFILE_STATE_WRONGCOLOR);
break;
case FA_BACKUP:
_hgfi(h, RPMTAG_FILEDEPENDSN, &td, scareFlags, fi->fddictn);
}
- /* XXX States not needed by TR_REMOVED */
+ /*
+ * For installed packages, get the states here. For to-be-installed
+ * packages fi->fstates is lazily created through rpmfiSetFState().
+ * XXX file states not needed at all by TR_REMOVED.
+ */
_hgfi(h, RPMTAG_FILESTATES, &td, defFlags, fi->fstates);
- if (fi->fstates == NULL) {
- fi->fstates = xmalloc(sizeof(*fi->fstates) * fi->fc);
- /* XXX means we show state "normal" when package not even installed */
- memset(fi->fstates, RPMFILE_STATE_NORMAL, fi->fc);
- }
_hgfi(h, RPMTAG_FILECAPS, &td, defFlags, fi->fcaps);
return fi;
}
+void rpmfiSetFState(rpmfi fi, int ix, rpmfileState state)
+{
+ if (fi != NULL && ix >= 0 && ix < fi->fc) {
+ if (fi->fstates == NULL) {
+ fi->fstates = xmalloc(sizeof(*fi->fstates) * fi->fc);
+ memset(fi->fstates, RPMFILE_STATE_MISSING, fi->fc);
+ }
+ fi->fstates[ix] = state;
+ }
+}
RPM_GNUC_INTERNAL
rpmfi rpmfiUpdateState(rpmfi fi, rpmts ts, rpmte p);
+RPM_GNUC_INTERNAL
+void rpmfiSetFState(rpmfi fi, int ix, rpmfileState state);
+
#endif /* _RPMFI_INTERNAL_H */