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. Regards, -- 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. *--distupgrade-to-testdebs*:: 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 times. +*--hard-link*:: + 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)) else: @@ -2768,6 +2769,11 @@ def parse_command_line(): "chroot, instead of building a new one with " + "debootstrap") + 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", default=[], 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