From: Toon Claes <toon@iotcl.com>
To: git@vger.kernel.org
Cc: Toon Claes <toon@iotcl.com>
Subject: [PATCH v2 7/7] http: silence stderr when progress is enabled
Date: Wed, 19 Feb 2025 15:30:25 +0100 [thread overview]
Message-ID: <20250219-toon-bundleuri-progress-v2-7-a84e7ffa921a@iotcl.com> (raw)
In-Reply-To: <20250219-toon-bundleuri-progress-v2-0-a84e7ffa921a@iotcl.com>
To download bundle URI bundles over HTTP(s), git-clone(1) spawns a
git-remote-http(1) subprocess. Because clone can continue without
bundles, all errors sent by the child process over stderr are
suppressed.
In previous commits, we've added progress output in the child process,
and this happens over stderr, so we can no longer silence stderr. But in
case a bundle could not be downloaded, the user sees the following
messages:
fatal: failed to download file at URL 'http://127.0.0.1:5558/bundle-5.bundle'
warning: failed to download bundle from URI 'http://127.0.0.1:5558/bundle-5.bundle'
Here the child git-remote-http(1) prints a "fatal" error and then the
parent git-clone(1) prints a "warning". This is confusing to the user.
Instead of suppressing stderr from the parent process, like we did
before, modify stderr to write to /dev/null in the child process itself,
while keep using the original stderr for progress logging only.
Signed-off-by: Toon Claes <toon@iotcl.com>
---
http.c | 5 ++++-
progress.c | 17 +++++++++++++----
progress.h | 1 +
3 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/http.c b/http.c
index 5517863808..5c0c6ef204 100644
--- a/http.c
+++ b/http.c
@@ -2133,7 +2133,10 @@ static int http_request(const char *url,
http_follow_config == HTTP_FOLLOW_INITIAL)
curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 1);
if (options && options->progress) {
- progress = start_progress(the_repository, _("Downloading via HTTP"), 0);
+ progress = start_progress(the_repository,
+ _("Downloading via HTTP"), 0);
+ progress_set_fd(progress, fileno(stderr));
+ freopen("/dev/null", "w", stderr);
curl_easy_setopt(slot->curl, CURLOPT_NOPROGRESS, 0L);
curl_easy_setopt(slot->curl, CURLOPT_XFERINFODATA, progress);
diff --git a/progress.c b/progress.c
index 89abb231ae..1955262000 100644
--- a/progress.c
+++ b/progress.c
@@ -40,6 +40,7 @@ struct progress {
const char *title;
uint64_t last_value;
uint64_t total;
+ int fd;
unsigned last_percent;
unsigned delay;
unsigned sparse;
@@ -144,7 +145,9 @@ static void display(struct progress *progress, uint64_t n, const char *done)
}
if (show_update) {
- if (is_foreground_fd(fileno(stderr)) || done) {
+ int fd = progress->fd ? progress->fd : fileno(stderr);
+
+ if (is_foreground_fd(fd) || done) {
const char *eol = done ? done : "\r";
size_t clear_len = counters_sb->len < last_count_len ?
last_count_len - counters_sb->len + 1 :
@@ -155,17 +158,17 @@ static void display(struct progress *progress, uint64_t n, const char *done)
int cols = term_columns();
if (progress->split) {
- fprintf(stderr, " %s%*s", counters_sb->buf,
+ dprintf(fd, " %s%*s", counters_sb->buf,
(int) clear_len, eol);
} else if (!done && cols < progress_line_len) {
clear_len = progress->title_len + 1 < cols ?
cols - progress->title_len - 1 : 0;
- fprintf(stderr, "%s:%*s\n %s%s",
+ dprintf(fd, "%s:%*s\n %s%s",
progress->title, (int) clear_len, "",
counters_sb->buf, eol);
progress->split = 1;
} else {
- fprintf(stderr, "%s: %s%*s", progress->title,
+ dprintf(fd, "%s: %s%*s", progress->title,
counters_sb->buf, (int) clear_len, eol);
}
fflush(stderr);
@@ -287,6 +290,12 @@ void progress_set_total(struct progress *progress, uint64_t total)
progress->total = total;
}
+void progress_set_fd(struct progress *progress, int fd)
+{
+ if (progress)
+ progress->fd = fd;
+}
+
static int get_default_delay(void)
{
static int delay_in_secs = -1;
diff --git a/progress.h b/progress.h
index 2e1bd738c2..f12c82adc4 100644
--- a/progress.h
+++ b/progress.h
@@ -16,6 +16,7 @@ void progress_test_force_update(void);
void display_throughput(struct progress *progress, uint64_t total);
void display_progress(struct progress *progress, uint64_t n);
void progress_set_total(struct progress *progress, uint64_t total);
+void progress_set_fd(struct progress *progress, int fd);
struct progress *start_progress(struct repository *r,
const char *title, uint64_t total);
struct progress *start_sparse_progress(struct repository *r,
--
2.48.1.658.g4767266eb4
next prev parent reply other threads:[~2025-02-19 14:30 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-08 12:44 [PATCH 0/4] bundle-uri: show progress when downloading from bundle URIs Toon Claes
2024-05-08 12:44 ` [PATCH 1/4] progress: add function to set total Toon Claes
2024-05-08 12:44 ` [PATCH 2/4] http: add the ability to log progress Toon Claes
2024-05-08 16:52 ` Eric Sunshine
2024-05-09 16:34 ` Jeff King
2024-05-09 16:51 ` Junio C Hamano
2024-05-09 17:04 ` Jeff King
2024-05-09 16:52 ` Jeff King
2024-05-08 12:44 ` [PATCH 3/4] remote-curl: optionally show progress for HTTP get Toon Claes
2024-05-08 22:29 ` Junio C Hamano
2024-05-08 12:44 ` [PATCH 4/4] bundle-uri: enable git-remote-https progress Toon Claes
2024-05-09 16:46 ` Jeff King
2025-02-14 11:26 ` Toon Claes
2025-02-21 7:36 ` Jeff King
2024-05-08 23:49 ` [PATCH 0/4] bundle-uri: show progress when downloading from bundle URIs Junio C Hamano
2025-02-19 14:30 ` [PATCH v2 0/7] Show " Toon Claes
2025-02-19 14:30 ` [PATCH v2 1/7] progress: add function to set total Toon Claes
2025-02-21 7:43 ` Jeff King
2025-02-19 14:30 ` [PATCH v2 2/7] progress: allow pure-throughput progress meters Toon Claes
2025-02-19 14:30 ` [PATCH v2 3/7] http: turn off curl signals Toon Claes
2025-02-19 14:30 ` [PATCH v2 4/7] http: add the ability to log progress Toon Claes
2025-02-19 14:30 ` [PATCH v2 5/7] remote-curl: optionally show progress for HTTP get Toon Claes
2025-02-19 14:30 ` [PATCH v2 6/7] bundle-uri: enable git-remote-https progress Toon Claes
2025-02-19 14:30 ` Toon Claes [this message]
2025-02-21 7:48 ` [PATCH v2 7/7] http: silence stderr when progress is enabled Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250219-toon-bundleuri-progress-v2-7-a84e7ffa921a@iotcl.com \
--to=toon@iotcl.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).