From 27291bd5fcd6e069551f82865ec3fc3de69a4239 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi>
Date: Tue, 21 Mar 2023 15:06:54 +0200
Subject: [PATCH] fetch: improve --link handling

Handle file: URLs correctly, and don't do linkat() syscall if
it is a remote repository.

Also account the file size to progress always.
---
 src/app_fetch.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/app_fetch.c b/src/app_fetch.c
index 1f05a80f..f9fdcf10 100644
--- a/src/app_fetch.c
+++ b/src/app_fetch.c
@@ -191,10 +191,10 @@ static int fetch_package(struct apk_database *db, const char *match, struct apk_
 		os = apk_ostream_to_fd(STDOUT_FILENO);
 	} else {
 		if ((ctx->flags & FETCH_LINK) && urlfd >= 0) {
-			if (linkat(urlfd, url,
-				   ctx->outdir_fd, filename,
-				   AT_SYMLINK_FOLLOW) == 0)
-				return 0;
+			const char *urlfile = apk_url_local_file(url);
+			if (urlfile &&
+			    linkat(urlfd, urlfile, ctx->outdir_fd, filename, AT_SYMLINK_FOLLOW) == 0)
+				goto done;
 		}
 		os = apk_ostream_to_file(ctx->outdir_fd, filename, 0644);
 		if (IS_ERR(os)) {
@@ -214,13 +214,13 @@ static int fetch_package(struct apk_database *db, const char *match, struct apk_
 	apk_istream_close(is);
 	r = apk_ostream_close(os);
 	if (r) goto err;
-
-	ctx->done += pkg->size;
-	return 0;
+	goto done;
 
 err:
 	apk_err(out, PKG_VER_FMT ": %s", PKG_VER_PRINTF(pkg), apk_error_str(r));
 	ctx->errors++;
+done:
+	ctx->done += pkg->size;
 	return 0;
 }
 
-- 
GitLab