When restoring all files from a backup directory, try a mass link (or copy) first, as it is much faster. It is however not portable and may thus fail. If it fails, fallback to per-file processing, which always works.
This change results in a huge performance boost on systems where the cp command supports all the required options (which includes all systems using GNU coreutils.) Signed-off-by: Jean Delvare <[email protected]> Reviewed-by: Raphael Hertzog <[email protected]> --- quilt/scripts/backup-files.in | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) --- a/quilt/scripts/backup-files.in +++ b/quilt/scripts/backup-files.in @@ -170,12 +170,28 @@ restore_all() fi if [ -s "$NONEMPTY_FILES" ]; then - xargs -0 rm -f < "$NONEMPTY_FILES" + # Try a mass link (or copy) first, as it is much faster. + # It is however not portable and may thus fail. If it fails, + # fallback to per-file processing, which always works. + local target_dir=$PWD opt_l=-l + [ -n "$OPT_NOLINKS" ] && opt_l=-p - while read -d $'\0' -r - do - restore_fast "${REPLY#./}" - done < "$NONEMPTY_FILES" + if (cd "$OPT_PREFIX" && \ + xargs -0 cp $opt_l --parents --remove-destination \ + --target-directory="$target_dir" \ + < "$NONEMPTY_FILES" 2> /dev/null); then + while read -d $'\0' -r + do + $ECHO "Restoring ${REPLY#./}" + done < "$NONEMPTY_FILES" + else + xargs -0 rm -f < "$NONEMPTY_FILES" + + while read -d $'\0' -r + do + restore_fast "${REPLY#./}" + done < "$NONEMPTY_FILES" + fi if [ -n "$OPT_TOUCH" ]; then xargs -0 touch -c < "$NONEMPTY_FILES" _______________________________________________ Quilt-dev mailing list [email protected] http://lists.nongnu.org/mailman/listinfo/quilt-dev
