summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2010-12-08 11:23:48 -0800
committerZac Medico <zmedico@gentoo.org>2010-12-08 11:23:48 -0800
commitf8cb556ac6680b8e3d8c3090c3cb7abae04cb242 (patch)
treed9e804a19b57a48355ace49b3f1551ffcd088092
parent4c47e5857515ea69150fb1d7731e4a6c88b4476e (diff)
downloadportage-f8cb556ac6680b8e3d8c3090c3cb7abae04cb242.tar.gz
portage-f8cb556ac6680b8e3d8c3090c3cb7abae04cb242.tar.bz2
portage-f8cb556ac6680b8e3d8c3090c3cb7abae04cb242.zip
Preserve existing hardlinks during merge.
The previous code created hardlinks rather aggressively, which was helpful as a workaround for lack of hardlinks in tarballs created by quickpkg due to bug #185305. Since bug #338509, quickpkg tarballs preserve hardlinks, so there's no need for aggressive hardlink creation. Therefore, simply preserve existing hardlinks during merge, by comparison of st_dev and st_ino from the source files.
-rw-r--r--pym/portage/dbapi/vartree.py27
1 files changed, 8 insertions, 19 deletions
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
index d3704b598..d269e93ea 100644
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@ -3762,25 +3762,14 @@ class dblink(object):
# whether config protection or not, we merge the new file the
# same way. Unless moveme=0 (blocking directory)
if moveme:
- # Do not hardlink files unless they are in the same
- # directory, since otherwise tar may not be able to
- # extract a tarball of the resulting hardlinks due to
- # 'Invalid cross-device link' errors (depends on layout of
- # mount points). Also, don't hardlink zero-byte files since
- # it doesn't save any space, and don't hardlink
- # CONFIG_PROTECTed files since config files shouldn't be
- # hardlinked to eachother (for example, shadow installs
- # several identical config files inside /etc/pam.d/).
- parent_dir = os.path.dirname(myrealdest)
- hardlink_key = (parent_dir, mymd5, mystat.st_size,
- mystat.st_mode, mystat.st_uid, mystat.st_gid)
-
- hardlink_candidates = None
- if not protected and mystat.st_size != 0:
- hardlink_candidates = self._md5_merge_map.get(hardlink_key)
- if hardlink_candidates is None:
- hardlink_candidates = []
- self._md5_merge_map[hardlink_key] = hardlink_candidates
+ # Create hardlinks only for source files that already exist
+ # as hardlinks (having identical st_dev and st_ino).
+ hardlink_key = (mystat.st_dev, mystat.st_ino)
+
+ hardlink_candidates = self._md5_merge_map.get(hardlink_key)
+ if hardlink_candidates is None:
+ hardlink_candidates = []
+ self._md5_merge_map[hardlink_key] = hardlink_candidates
mymtime = movefile(mysrc, mydest, newmtime=thismtime,
sstat=mystat, mysettings=self.settings,