rpmFileTypes ft = rpmfiWhatis(rpmfiFModeIndex(fi, fx));
rpmFileTypes oft = rpmfiWhatis(rpmfiFModeIndex(ofi, ofx));
struct stat sb;
+ char *fn = NULL;
if (oft == XDIR) {
/* We can't handle directory changing to anything else */
if (ft != XDIR)
rConflicts = 1;
+ } else if (oft == LINK) {
+ /* We can't correctly handle directory symlink changing to directory */
+ if (ft == XDIR) {
+ fn = rpmfiFNIndex(fi, fx);
+ if (stat(fn, &sb) == 0 && S_ISDIR(sb.st_mode))
+ rConflicts = 1;
+ }
}
/*
* already been changed to the new type, we should be ok afterall.
*/
if (rConflicts) {
- char *fn = rpmfiFNIndex(fi, fx);
+ if (fn == NULL)
+ fn = rpmfiFNIndex(fi, fx);
if (lstat(fn, &sb) || rpmfiWhatis(sb.st_mode) == ft)
rConflicts = 0;
- free(fn);
}
+ free(fn);
return rConflicts;
}
AT_CLEANUP
# ------------------------------
-# Replace symlink with a directory - the upgrade succeeds but leaves an
-# orphan directory that the symlink now points to. Should verify the
-# result more carefully...
+# Replace symlink with a directory
AT_SETUP([rpm -U replacing symlink with directory])
AT_KEYWORDS([install])
AT_CHECK([
runroot rpm -U "${TOPDIR}"/RPMS/noarch/symlinktest-1.0-1.noarch.rpm
runroot rpm -U "${TOPDIR}"/RPMS/noarch/symlinktest-1.0-2.noarch.rpm
],
-[0],
+[2],
[],
-[])
+[ file /usr/share/symlinktest from install of symlinktest-1.0-2.noarch conflicts with file from package symlinktest-1.0-1.noarch
+])
AT_CLEANUP
[])
AT_CLEANUP
-# XXX: this "succeeds" but with bogus results
AT_SETUP([upgrade directory link to directory])
AT_KEYWORDS([install])
AT_CHECK([
runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
readlink "${tf}"
runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
-test -d "${tf}"
],
-[0],
+[2],
[zoo
],
-[])
+[ file /opt/foo from install of replacetest-2.0-1.noarch conflicts with file from package replacetest-1.0-1.noarch
+])
AT_CLEANUP
AT_SETUP([upgrade empty directory to empty directory])