merge(3p/git): Merge git upstream at v2.26.2
This commit is contained in:
commit
5229c9b232
1006 changed files with 149006 additions and 60819 deletions
76
third_party/git/progress.c
vendored
76
third_party/git/progress.c
vendored
|
@ -14,6 +14,7 @@
|
|||
#include "strbuf.h"
|
||||
#include "trace.h"
|
||||
#include "utf8.h"
|
||||
#include "config.h"
|
||||
|
||||
#define TP_IDX_MAX 8
|
||||
|
||||
|
@ -45,6 +46,19 @@ struct progress {
|
|||
|
||||
static volatile sig_atomic_t progress_update;
|
||||
|
||||
/*
|
||||
* These are only intended for testing the progress output, i.e. exclusively
|
||||
* for 'test-tool progress'.
|
||||
*/
|
||||
int progress_testing;
|
||||
uint64_t progress_test_ns = 0;
|
||||
void progress_test_force_update(void); /* To silence -Wmissing-prototypes */
|
||||
void progress_test_force_update(void)
|
||||
{
|
||||
progress_update = 1;
|
||||
}
|
||||
|
||||
|
||||
static void progress_interval(int signum)
|
||||
{
|
||||
progress_update = 1;
|
||||
|
@ -55,6 +69,9 @@ static void set_progress_signal(void)
|
|||
struct sigaction sa;
|
||||
struct itimerval v;
|
||||
|
||||
if (progress_testing)
|
||||
return;
|
||||
|
||||
progress_update = 0;
|
||||
|
||||
memset(&sa, 0, sizeof(sa));
|
||||
|
@ -72,6 +89,10 @@ static void set_progress_signal(void)
|
|||
static void clear_progress_signal(void)
|
||||
{
|
||||
struct itimerval v = {{0,},};
|
||||
|
||||
if (progress_testing)
|
||||
return;
|
||||
|
||||
setitimer(ITIMER_REAL, &v, NULL);
|
||||
signal(SIGALRM, SIG_IGN);
|
||||
progress_update = 0;
|
||||
|
@ -88,6 +109,7 @@ static void display(struct progress *progress, uint64_t n, const char *done)
|
|||
const char *tp;
|
||||
struct strbuf *counters_sb = &progress->counters_sb;
|
||||
int show_update = 0;
|
||||
int last_count_len = counters_sb->len;
|
||||
|
||||
if (progress->delay && (!progress_update || --progress->delay))
|
||||
return;
|
||||
|
@ -115,21 +137,27 @@ static void display(struct progress *progress, uint64_t n, const char *done)
|
|||
if (show_update) {
|
||||
if (is_foreground_fd(fileno(stderr)) || done) {
|
||||
const char *eol = done ? done : "\r";
|
||||
size_t clear_len = counters_sb->len < last_count_len ?
|
||||
last_count_len - counters_sb->len + 1 :
|
||||
0;
|
||||
/* The "+ 2" accounts for the ": ". */
|
||||
size_t progress_line_len = progress->title_len +
|
||||
counters_sb->len + 2;
|
||||
int cols = term_columns();
|
||||
|
||||
term_clear_line();
|
||||
if (progress->split) {
|
||||
fprintf(stderr, " %s%s", counters_sb->buf,
|
||||
eol);
|
||||
} else if (!done &&
|
||||
/* The "+ 2" accounts for the ": ". */
|
||||
term_columns() < progress->title_len +
|
||||
counters_sb->len + 2) {
|
||||
fprintf(stderr, "%s:\n %s%s",
|
||||
progress->title, counters_sb->buf, eol);
|
||||
fprintf(stderr, " %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",
|
||||
progress->title, (int) clear_len, "",
|
||||
counters_sb->buf, eol);
|
||||
progress->split = 1;
|
||||
} else {
|
||||
fprintf(stderr, "%s: %s%s", progress->title,
|
||||
counters_sb->buf, eol);
|
||||
fprintf(stderr, "%s: %s%*s", progress->title,
|
||||
counters_sb->buf, (int) clear_len, eol);
|
||||
}
|
||||
fflush(stderr);
|
||||
}
|
||||
|
@ -147,6 +175,14 @@ static void throughput_string(struct strbuf *buf, uint64_t total,
|
|||
strbuf_humanise_rate(buf, rate * 1024);
|
||||
}
|
||||
|
||||
static uint64_t progress_getnanotime(struct progress *progress)
|
||||
{
|
||||
if (progress_testing)
|
||||
return progress->start_ns + progress_test_ns;
|
||||
else
|
||||
return getnanotime();
|
||||
}
|
||||
|
||||
void display_throughput(struct progress *progress, uint64_t total)
|
||||
{
|
||||
struct throughput *tp;
|
||||
|
@ -157,7 +193,7 @@ void display_throughput(struct progress *progress, uint64_t total)
|
|||
return;
|
||||
tp = progress->throughput;
|
||||
|
||||
now_ns = getnanotime();
|
||||
now_ns = progress_getnanotime(progress);
|
||||
|
||||
if (!tp) {
|
||||
progress->throughput = tp = xcalloc(1, sizeof(*tp));
|
||||
|
@ -232,9 +268,19 @@ static struct progress *start_progress_delay(const char *title, uint64_t total,
|
|||
return progress;
|
||||
}
|
||||
|
||||
static int get_default_delay(void)
|
||||
{
|
||||
static int delay_in_secs = -1;
|
||||
|
||||
if (delay_in_secs < 0)
|
||||
delay_in_secs = git_env_ulong("GIT_PROGRESS_DELAY", 2);
|
||||
|
||||
return delay_in_secs;
|
||||
}
|
||||
|
||||
struct progress *start_delayed_progress(const char *title, uint64_t total)
|
||||
{
|
||||
return start_progress_delay(title, total, 2, 0);
|
||||
return start_progress_delay(title, total, get_default_delay(), 0);
|
||||
}
|
||||
|
||||
struct progress *start_progress(const char *title, uint64_t total)
|
||||
|
@ -259,7 +305,7 @@ struct progress *start_sparse_progress(const char *title, uint64_t total)
|
|||
struct progress *start_delayed_sparse_progress(const char *title,
|
||||
uint64_t total)
|
||||
{
|
||||
return start_progress_delay(title, total, 2, 1);
|
||||
return start_progress_delay(title, total, get_default_delay(), 1);
|
||||
}
|
||||
|
||||
static void finish_if_sparse(struct progress *progress)
|
||||
|
@ -289,7 +335,7 @@ void stop_progress_msg(struct progress **p_progress, const char *msg)
|
|||
struct throughput *tp = progress->throughput;
|
||||
|
||||
if (tp) {
|
||||
uint64_t now_ns = getnanotime();
|
||||
uint64_t now_ns = progress_getnanotime(progress);
|
||||
unsigned int misecs, rate;
|
||||
misecs = ((now_ns - progress->start_ns) * 4398) >> 32;
|
||||
rate = tp->curr_total / (misecs ? misecs : 1);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue