On Mon, Oct 17, 2016 at 11:25 AM, Andreas Beckmann <a...@debian.org> wrote:
> On 2016-10-17 11:13, Alexander Thomas wrote:
>> Because I don't know what was the use case for the submitter of that
>> hard-linking patch, it is safest to preserve it, but make it optional
>> with a new --hard-link switch that is only relevant together with
>> --existing-chroot. This is also very easy to implement, it only
> Looks ok from my point, maybe the documentation of --existing-chroot
> could mention the new option.
> Regarding your use case: why don't you use chroot tarballs? IMO, tar xfz
> might be faster than cp -a.

We benchmarked it and on our trusty old build server, cp -a was faster.

Here's a small update that mentions --hard-link in --existing-chroot.


Alexander Thomas
diff --git a/piuparts.1.txt b/piuparts.1.txt
index a857f4d..80ae746 100644
--- a/piuparts.1.txt
+++ b/piuparts.1.txt
@@ -90,7 +90,7 @@ The tarball can be created with the '-s' option, or you can use one that *pbuild
 *-e* 'dirname', *--existing-chroot*='dirname'::
   Use the specified directory as source for the new chroot, instead of building
   a new one with debootstrap. This is similar to '--basetgz', but the contents
-  are not archived.
+  are not archived. See also the --hard-link option.
   Use the "testdebs" repository to override the packages in the distupgrade
@@ -111,6 +111,11 @@ The tarball can be created with the '-s' option, or you can use one that *pbuild
   Takes a comma separated list of package names and can be given multiple
+  When the --existing-chroot option is used, and the source directory is on the
+  same filesystem, hard-link files instead of copying them. This is faster, but
+  any modifications to files will be reflected in the originals.
 *-i* 'filename', *--ignore*='filename'::
   Add a filename to the list of filenames to be ignored when comparing changes before and after installation. By default, piuparts ignores files that always change during a package installation and uninstallation, such as *dpkg* status files. The filename should be relative to the root of the chroot (e.g., _var/lib/dpkg/status_). This option can be used as many times as necessary.
diff --git a/piuparts.py b/piuparts.py
index f69c955..dbf2b18 100644
--- a/piuparts.py
+++ b/piuparts.py
@@ -178,6 +178,7 @@ class Settings:
         self.lvm_snapshot_size = "1G"
         self.adt_virt = None
         self.existing_chroot = None
+        self.hard_link = False
         self.schroot = None
         self.end_meta = None
         self.save_end_meta = None
@@ -873,7 +874,7 @@ class Chroot:
         """Create chroot from an existing one."""
         # if on same device, make hard link
         cmd = ["cp"]
-        if os.stat(dirname).st_dev == os.stat(self.name).st_dev:
+        if settings.hard_link and os.stat(dirname).st_dev == os.stat(self.name).st_dev:
             cmd += ["-al"]
             logging.debug("Hard linking %s to %s" % (dirname, self.name))
@@ -2768,6 +2769,11 @@ def parse_command_line():
                            "chroot, instead of building a new one with " +
+    parser.add_option("--hard-link", default=False,
+                      action='store_true',
+                      help="When using --existing-chroot, and the source dir is on the same"
+                           "filesystem, hard-link files instead of copying them.")
     parser.add_option("-i", "--ignore", action="append", metavar="FILENAME",
                       help="Add FILENAME to list of filenames to be " +
@@ -3017,6 +3023,7 @@ def parse_command_line():
     settings.lvm_volume = opts.lvm_volume
     settings.lvm_snapshot_size = opts.lvm_snapshot_size
     settings.existing_chroot = opts.existing_chroot
+    settings.hard_link = opts.hard_link
     settings.schroot = opts.schroot
     settings.end_meta = opts.end_meta
     settings.save_end_meta = opts.save_end_meta

Reply via email to