[PATCH 1/4] WIP progress, isatty(2), hidden progress lnies for GIT_TEST_CHECK_PROGRESS
Show changes to 10 files +49 −45
builtin/blame.c, builtin/fsck.c, builtin/index-pack.c, builtin/log.c, builtin/prune.c, builtin/unpack-objects.c, preload-index.c, progress.c, progress.h, read-cache.c
diff --git a/builtin/blame.c b/builtin/blame.c
index 641523ff9a..5efb920dd4 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -944,8 +944,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
if (show_progress > 0)
die(_("--progress can't be used with --incremental or porcelain formats"));
show_progress = 0;
- } else if (show_progress < 0)
- show_progress = isatty(2);
+ }
if (0 < abbrev && abbrev < hexsz)
/* one more abbrev length is needed for the boundary commit */
@@ -1153,8 +1152,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
sb.found_guilty_entry = &found_guilty_entry;
sb.found_guilty_entry_data = π
- if (show_progress)
- pi.progress = start_delayed_progress(_("Blaming lines"), sb.num_lines);
+ pi.progress = start_delayed_progress_if_tty(_("Blaming lines"), sb.num_lines, show_progress);
assign_blame(&sb, opt);
diff --git a/builtin/fsck.c b/builtin/fsck.c
index b42b6fe21f..78e799f748 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -185,8 +185,7 @@ static int traverse_reachable(void)
struct progress *progress = NULL;
unsigned int nr = 0;
int result = 0;
- if (show_progress)
- progress = start_delayed_progress(_("Checking connectivity"), 0);
+ progress = start_delayed_progress_if_tty(_("Checking connectivity"), 0, show_progress);
while (pending.nr) {
result |= traverse_one_object(object_array_pop(&pending));
display_progress(progress, ++nr);
@@ -653,8 +652,7 @@ static void fsck_object_dir(const char *path)
if (verbose)
fprintf_ln(stderr, _("Checking object directory"));
- if (show_progress)
- progress = start_progress(_("Checking object directories"), 256);
+ progress = start_progress_if_tty(_("Checking object directories"), 256, show_progress);
for_each_loose_file_in_objdir(path, fsck_loose, fsck_cruft, fsck_subdir,
progress);
@@ -789,8 +787,6 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
if (check_strict)
fsck_obj_options.strict = 1;
- if (show_progress == -1)
- show_progress = isatty(2);
if (verbose)
show_progress = 0;
@@ -825,7 +821,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
total += p->num_objects;
}
- progress = start_progress(_("Checking objects"), total);
+ progress = start_progress_if_tty(_("Checking objects"), total, show_progress);
}
for (p = get_all_packs(the_repository); p;
p = p->next) {
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 3fbc5d7077..0caabe237e 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -258,8 +258,8 @@ static unsigned check_objects(void)
max = get_max_object_index();
- if (verbose)
- progress = start_delayed_progress(_("Checking objects"), max);
+ progress = start_delayed_progress_if_tty(_("Checking objects"), max,
+ verbose ? 1 : 0);
for (i = 0; i < max; i++) {
foreign_nr += check_object(get_indexed_object(i));
@@ -1157,10 +1157,9 @@ static void parse_pack_objects(unsigned char *hash)
struct object_id ref_delta_oid;
struct stat st;
- if (verbose)
- progress = start_progress(
- from_stdin ? _("Receiving objects") : _("Indexing objects"),
- nr_objects);
+ progress = start_progress_if_tty(
+ from_stdin ? _("Receiving objects") : _("Indexing objects"),
+ nr_objects, verbose ? 1 : 0);
for (i = 0; i < nr_objects; i++) {
struct object_entry *obj = &objects[i];
void *data = unpack_raw_entry(obj, &ofs_delta->offset,
@@ -1235,9 +1234,10 @@ static void resolve_deltas(void)
QSORT(ofs_deltas, nr_ofs_deltas, compare_ofs_delta_entry);
QSORT(ref_deltas, nr_ref_deltas, compare_ref_delta_entry);
- if (verbose || show_resolving_progress)
- progress = start_progress(_("Resolving deltas"),
- nr_ref_deltas + nr_ofs_deltas);
+ /* TODO: breaks 5309.3 and .4 */
+ progress = start_progress_if_tty(_("Resolving deltas"),
+ nr_ref_deltas + nr_ofs_deltas,
+ verbose || show_resolving_progress ? 1 : 0);
nr_dispatched = 0;
base_cache_limit = delta_base_cache_limit * nr_threads;
diff --git a/builtin/log.c b/builtin/log.c
index 6102893fcc..41bcd4d0fb 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -2154,8 +2154,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
}
rev.add_signoff = do_signoff;
- if (show_progress)
- progress = start_delayed_progress(_("Generating patches"), total);
+ progress = start_delayed_progress_if_tty(_("Generating patches"), total,
+ show_progress);
while (0 <= --nr) {
int shown;
display_progress(progress, total - nr);
diff --git a/builtin/prune.c b/builtin/prune.c
index 02c6ab7cba..2ee1baf40d 100644
--- a/builtin/prune.c
+++ b/builtin/prune.c
@@ -41,8 +41,7 @@ static void perform_reachability_traversal(struct rev_info *revs)
if (initialized)
return;
- if (show_progress)
- progress = start_delayed_progress(_("Checking connectivity"), 0);
+ progress = start_delayed_progress_if_tty(_("Checking connectivity"), 0, show_progress);
mark_reachable_objects(revs, 1, expire, progress);
stop_progress(&progress);
initialized = 1;
@@ -164,8 +163,6 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
die("unrecognized argument: %s", name);
}
- if (show_progress == -1)
- show_progress = isatty(2);
if (exclude_promisor_objects) {
fetch_if_missing = 0;
revs.exclude_promisor_objects = 1;
diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c
index 4a9466295b..8517522a31 100644
--- a/builtin/unpack-objects.c
+++ b/builtin/unpack-objects.c
@@ -14,7 +14,7 @@
#include "decorate.h"
#include "fsck.h"
-static int dry_run, quiet, recover, has_errors, strict;
+static int dry_run, quiet = -1, recover, has_errors, strict;
static const char unpack_usage[] = "git unpack-objects [-n] [-q] [-r] [--strict]";
/* We always read in 4kB chunks. */
@@ -500,8 +500,8 @@ static void unpack_all(void)
ntohl(hdr->hdr_version));
use(sizeof(struct pack_header));
- if (!quiet)
- progress = start_progress(_("Unpacking objects"), nr_objects);
+ progress = start_progress_if_tty(_("Unpacking objects"), nr_objects,
+ quiet ? 0 : -1);
CALLOC_ARRAY(obj_list, nr_objects);
for (i = 0; i < nr_objects; i++) {
unpack_one(i);
diff --git a/preload-index.c b/preload-index.c
index e5529a5863..aae6e4a042 100644
--- a/preload-index.c
+++ b/preload-index.c
@@ -121,10 +121,9 @@ void preload_index(struct index_state *index,
memset(&data, 0, sizeof(data));
memset(&pd, 0, sizeof(pd));
- if (refresh_flags & REFRESH_PROGRESS && isatty(2)) {
- pd.progress = start_delayed_progress(_("Refreshing index"), index->cache_nr);
- pthread_mutex_init(&pd.mutex, NULL);
- }
+ pd.progress = start_delayed_progress_if_tty(_("Refreshing index"),index->cache_nr,
+ refresh_flags & REFRESH_PROGRESS ? -1 : 0);
+ pthread_mutex_init(&pd.mutex, NULL);
for (i = 0; i < threads; i++) {
struct thread_data *p = data+i;
diff --git a/progress.c b/progress.c
index 034d50cd6b..99e130f1eb 100644
--- a/progress.c
+++ b/progress.c
@@ -43,6 +43,7 @@ struct progress {
struct strbuf counters_sb;
int title_len;
int split;
+ int hidden;
};
static volatile sig_atomic_t progress_update;
@@ -123,6 +124,8 @@ static void display(struct progress *progress, uint64_t n, const char *done)
progress->last_value = n;
+ if (progress->hidden)
+ return;
if (progress->delay && (!progress_update || --progress->delay))
return;
@@ -261,15 +264,23 @@ void display_progress(struct progress *progress, uint64_t n)
}
static struct progress *start_progress_delay(const char *title, uint64_t total,
- unsigned delay, unsigned sparse)
+ unsigned delay, unsigned sparse,
+ int show)
{
struct progress *progress;
test_check_progress = git_env_bool("GIT_TEST_CHECK_PROGRESS", 0);
+
+ if (show == -1)
+ show = isatty(STDERR_FILENO);
+
if (test_check_progress && current_progress)
BUG("progress \"%s\" is still active when starting new progress \"%s\"",
current_progress->title, title);
+ if (!show && !test_check_progress)
+ return NULL;
+
progress = xmalloc(sizeof(*progress));
current_progress = progress;
progress->title = title;
@@ -283,6 +294,7 @@ static struct progress *start_progress_delay(const char *title, uint64_t total,
strbuf_init(&progress->counters_sb, 0);
progress->title_len = utf8_strwidth(title);
progress->split = 0;
+ progress->hidden = !show;
set_progress_signal();
trace2_region_enter("progress", title, the_repository);
return progress;
@@ -298,14 +310,14 @@ static int get_default_delay(void)
return delay_in_secs;
}
-struct progress *start_delayed_progress(const char *title, uint64_t total)
+struct progress *start_delayed_progress_if_tty(const char *title, uint64_t total, int show)
{
- return start_progress_delay(title, total, get_default_delay(), 0);
+ return start_progress_delay(title, total, get_default_delay(), 0, show);
}
-struct progress *start_progress(const char *title, uint64_t total)
+struct progress *start_progress_if_tty(const char *title, uint64_t total, int show)
{
- return start_progress_delay(title, total, 0, 0);
+ return start_progress_delay(title, total, 0, 0, show);
}
/*
@@ -319,13 +331,13 @@ struct progress *start_progress(const char *title, uint64_t total)
*/
struct progress *start_sparse_progress(const char *title, uint64_t total)
{
- return start_progress_delay(title, total, 0, 1);
+ return start_progress_delay(title, total, 0, 1, 1);
}
struct progress *start_delayed_sparse_progress(const char *title,
uint64_t total)
{
- return start_progress_delay(title, total, get_default_delay(), 1);
+ return start_progress_delay(title, total, get_default_delay(), 1, 1);
}
static void finish_if_sparse(struct progress *progress)
diff --git a/progress.h b/progress.h
index f1913acf73..7c3bdd3d63 100644
--- a/progress.h
+++ b/progress.h
@@ -13,9 +13,11 @@ void progress_test_force_update(void);
void display_throughput(struct progress *progress, uint64_t total);
void display_progress(struct progress *progress, uint64_t n);
-struct progress *start_progress(const char *title, uint64_t total);
+#define start_progress(title, total) start_progress_if_tty((title), (total), 1)
+struct progress *start_progress_if_tty(const char *title, uint64_t total, int show);
struct progress *start_sparse_progress(const char *title, uint64_t total);
-struct progress *start_delayed_progress(const char *title, uint64_t total);
+#define start_delayed_progress(title, total) start_delayed_progress_if_tty((title), (total), 1)
+struct progress *start_delayed_progress_if_tty(const char *title, uint64_t total, int show);
struct progress *start_delayed_sparse_progress(const char *title,
uint64_t total);
void stop_progress(struct progress **progress);
diff --git a/read-cache.c b/read-cache.c
index 1b3c2eb408..c3fc797639 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -1567,9 +1567,9 @@ int refresh_index(struct index_state *istate, unsigned int flags,
int t2_sum_lstat = 0;
int t2_sum_scan = 0;
- if (flags & REFRESH_PROGRESS && isatty(2))
- progress = start_delayed_progress(_("Refresh index"),
- istate->cache_nr);
+ progress = start_delayed_progress_if_tty(_("Refresh index"),
+ istate->cache_nr,
+ flags & REFRESH_PROGRESS ? -1 : 0);
trace_performance_enter();
modified_fmt = in_porcelain ? "M\t%s\n" : "%s: needs update\n";