From Fedora Project Wiki
(→‎Replacing a directory with a symlink or vice versa: restructure so we can add more content)
(try and avoid being in this situation in the first place)
Line 2: Line 2:


Due to a known limitation with RPM, it is not possible to replace a directory with a symlink, nor is it possible to replace a symlink with a directory, without RPM producing file conflict errors while trying to install the package.  For more information on the issues involved, refer to [https://bugzilla.redhat.com/show_bug.cgi?id=447156 bug 447156] and [https://bugzilla.redhat.com/show_bug.cgi?id=646523 bug 646523].
Due to a known limitation with RPM, it is not possible to replace a directory with a symlink, nor is it possible to replace a symlink with a directory, without RPM producing file conflict errors while trying to install the package.  For more information on the issues involved, refer to [https://bugzilla.redhat.com/show_bug.cgi?id=447156 bug 447156] and [https://bugzilla.redhat.com/show_bug.cgi?id=646523 bug 646523].
=== Try to avoid the problem in the first place ===
While its obviously not possible to foresee all the cases where the need might arise, when the need '''''is''''' foreseeable, such as with bundled libraries, it'd be better to use a symlink from the start, as the symlink target can be changed more easily.  For instance, if you have a bundled libfoo library inside the packages directory structure, place it in a eg, libfoo.bundled directory and make libfoo a symlink to that. When the bundling is eventually removed, you just need to drop the directory and change the symlink to point to the corresponding system library directory, without resorting to the scriptlets described below.


=== %pretrans workarounds ===   
=== %pretrans workarounds ===   

Revision as of 02:58, 22 February 2014

Replacing a directory with a symlink or vice versa

Due to a known limitation with RPM, it is not possible to replace a directory with a symlink, nor is it possible to replace a symlink with a directory, without RPM producing file conflict errors while trying to install the package. For more information on the issues involved, refer to bug 447156 and bug 646523.

Try to avoid the problem in the first place

While its obviously not possible to foresee all the cases where the need might arise, when the need is foreseeable, such as with bundled libraries, it'd be better to use a symlink from the start, as the symlink target can be changed more easily. For instance, if you have a bundled libfoo library inside the packages directory structure, place it in a eg, libfoo.bundled directory and make libfoo a symlink to that. When the bundling is eventually removed, you just need to drop the directory and change the symlink to point to the corresponding system library directory, without resorting to the scriptlets described below.

%pretrans workarounds

To work around this problem, you must include a %pretrans scriptlet written in lua that manually performs the conversion prior to RPM attempting to install the package. Please use whichever of the two following snippets is necessary in packages that need this transition, replacing <path to dir> with the path to the directory that is being converted.

Scriptlet to replace a directory with a symlink

%pretrans -p <lua>
st = posix.stat("<path to dir>")
if st and st.type == "directory" then
  os.execute("rm -rf <path to dir>")
end

Scriptlet to replace a symlink with a directory

%pretrans -p <lua>
st=posix.stat("<path to dir>")
if st and st.type == "link" then
  os.remove("<path to dir>")
  posix.mkdir("<path to dir>")
end