Ticket #1225 (closed defect: fixed)

Opened 8 years ago

Last modified 8 years ago

pbin archives should restore hard links efficiently (instead of making multiple copies)

Reported by: chutz Owned by:
Priority: Sometime Milestone:
Component: clients/cave Version: 0.72.0
Keywords: Cc:
Blocked By: Blocking:
Distribution: Gentoo


Packages installed via a binary do not preserve hard links while installing the package directly from the source repository does preserve the hard links.

I see that gnu tar, and even bsdtar are capable of maintaining hard links, so it seems that Paludis should be able to do the same, too.


  1. Git installed from a source repo to the root system. /usr/bin/git-receive-pack has 109 links
    > stat /usr/bin/git-receive-pack
      File: `/usr/bin/git-receive-pack'
      Size: 1314360         Blocks: 2568       IO Block: 4096   regular file
    Device: fd01h/64769d    Inode: 3171604     Links: 109
    Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2012-02-25 21:27:48.539721714 +0900
    Modify: 2012-02-25 21:27:50.959721299 +0900
    Change: 2012-02-25 21:27:55.429720538 +0900
     Birth: -
  1. A PBIN of git, which contains no hard link information
    > tar tvf /tmp/desktop-bin--dev-vcs--git-  | grep -e bin/git-receive -e bin/git-upload-archive
    -rwxr-xr-x root/root   1314360 2012-02-25 20:33 usr/bin/git-receive-pack
    -rwxr-xr-x root/root   1314360 2012-02-25 20:33 usr/bin/git-upload-archive
    -rw-r--r-- root/root    171923 2012-02-25 20:33 usr/lib64/debug/usr/bin/git-receive-pack.debug
  1. libarchive *can* archive hardlinks efficiently (version 3.0.3 here)
    > bsdtar  -cf - --format gnutar -C / usr/bin/git usr/bin/git-receive-pack usr/bin/git-upload-archive  | tar tv
    -rwxr-xr-x root/root   1314360 2012-02-25 21:27 usr/bin/git
    hrwxr-xr-x root/root         0 2012-02-25 21:27 usr/bin/git-receive-pack link to usr/bin/git
    hrwxr-xr-x root/root         0 2012-02-25 21:27 usr/bin/git-upload-archive link to usr/bin/git

Change History

comment:1 Changed 8 years ago by ciaranm

Can you figure out how to get libarchive to do that when using the library?

comment:2 Changed 8 years ago by chutz

Much to my surprise it was easier than expected.

I installed git from a binary package and now my /usr/bin/git has 109 links, as it should. And the binary package itself is considerably smaller:

$ ls -hgG desktop-bin--dev-vcs--git-*
-rw-r--r--+ 1  69M Feb 25 15:14 desktop-bin--dev-vcs--git-
-rw-r--r--+ 1 4.3M Feb 26 18:30 desktop-bin--dev-vcs--git-

All I had to update was the archiver. On extraction, tar can handle the hardlinks itself.

I have not tried this with the other archive formats, though I would expect it to still work. I did try the following, though, and it seems okay:

$ touch f1; ln f1 f2; mkdir out
$ bsdtar -cf - --format pax f? | /usr/libexec/paludis/utils/unpaxinate img /dev/stdin out
$ stat -c %i:%n out/f1 out/f2

Here is the patch:

The following changes since commit 8f4f01deaf9fad78ec0a6c9cd5928855109a054c:

  Don't try to dodoc directories. (2012-02-21 15:05:28 +0000)

are available in the git repository at:
  git://github.com/chutzimir/paludis.git pbin-hardlinks

Georgi Georgiev (1):
      Support hardlinks in pbins

 paludis/tar_extras.cc |   35 +++++++++++++++++++++++++----------
 1 files changed, 25 insertions(+), 10 deletions(-)

comment:3 Changed 8 years ago by ciaranm

  • Status changed from new to closed
  • Resolution set to fixed

Thanks. I added in a missing archive_entry_linkresolver_free.

Note: See TracTickets for help on using tickets.