--- rpm-4.0.2/lib/rpmlib.h~ Sun May 26 07:47:04 2002 +++ rpm-4.0.2/lib/rpmlib.h Sun May 26 07:55:51 2002 @@ -320,6 +320,7 @@ RPMFILE_GHOST = (1 << 6), /*!< from %%ghost */ RPMFILE_LICENSE = (1 << 7), /*!< from %%license */ - RPMFILE_README = (1 << 8) /*!< from %%readme */ + RPMFILE_README = (1 << 8), /*!< from %%readme */ + RPMFILE_EXCLUDE = (1 << 9) /*!< from %%exclude */ } rpmfileAttrs; #define RPMFILE_MULTILIB_SHIFT 9 #define RPMFILE_MULTILIB(N) ((N) << RPMFILE_MULTILIB_SHIFT) --- rpm-4.0.2/build/files.c~ Sun May 26 07:47:04 2002 +++ rpm-4.0.2/build/files.c Sun May 26 08:19:18 2002 @@ -685,6 +685,7 @@ { "%dir", 0 }, /* XXX why not RPMFILE_DIR? */ { "%doc", RPMFILE_DOC }, { "%ghost", RPMFILE_GHOST }, + { "%exclude", RPMFILE_EXCLUDE }, { "%readme", RPMFILE_README }, { "%license", RPMFILE_LICENSE }, { "%multilib", 0 }, @@ -986,12 +987,20 @@ clp = *cpioList = xmalloc(sizeof(**cpioList) * fl->fileListRecsUsed); for (flp = fl->fileList, count = fl->fileListRecsUsed; count > 0; flp++, count--) { - if ((count > 1) && !strcmp(flp->fileURL, flp[1].fileURL)) { - rpmError(RPMERR_BADSPEC, _("File listed twice: %s\n"), - flp->fileURL); - fl->processingFailed = 1; - } + if ((count > 1) && !strcmp(flp->fileURL, flp[1].fileURL)) { + if (!((flp->flags | flp[1].flags) & RPMFILE_EXCLUDE)) { + rpmError(RPMERR_BADSPEC, _("File listed twice: %s\n"), + flp->fileURL); + fl->processingFailed = 1; + } else { + flp->flags |= RPMFILE_EXCLUDE; + flp[1].flags |= RPMFILE_EXCLUDE; + } + } + /* Skip files that were marked with %exclude. */ + if (flp->flags & RPMFILE_EXCLUDE) continue; + if (flp->flags & RPMFILE_MULTILIB_MASK) multiLibMask |= (1 << ((flp->flags & RPMFILE_MULTILIB_MASK))