diff options
author | Zac Medico <zmedico@gentoo.org> | 2010-12-08 11:23:48 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2010-12-08 11:23:48 -0800 |
commit | f8cb556ac6680b8e3d8c3090c3cb7abae04cb242 (patch) | |
tree | d9e804a19b57a48355ace49b3f1551ffcd088092 | |
parent | 4c47e5857515ea69150fb1d7731e4a6c88b4476e (diff) | |
download | portage-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.py | 27 |
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, |