Merge branch 'tc/transport-verbosity'

* tc/transport-verbosity:
  transport: update flags to be in running order
  fetch and pull: learn --progress
  push: learn --progress
  transport->progress: use flag authoritatively
  clone: support multiple levels of verbosity
  push: support multiple levels of verbosity
  fetch: refactor verbosity option handling into transport.[ch]
  Documentation/git-push: put --quiet before --verbose
  Documentation/git-pull: put verbosity options before merge/fetch ones
  Documentation/git-clone: mention progress in -v

Conflicts:
	transport.h
This commit is contained in:
Junio C Hamano 2010-03-15 00:58:42 -07:00
commit 53997a30f8
12 changed files with 92 additions and 41 deletions

View File

@ -78,9 +78,16 @@ ifndef::git-pull[]
-q:: -q::
--quiet:: --quiet::
Pass --quiet to git-fetch-pack and silence any other internally Pass --quiet to git-fetch-pack and silence any other internally
used git commands. used git commands. Progress is not reported to the standard error
stream.
-v:: -v::
--verbose:: --verbose::
Be verbose. Be verbose.
endif::git-pull[] endif::git-pull[]
--progress::
Progress status is reported on the standard error stream
by default when it is attached to a terminal, unless -q
is specified. This flag forces progress status even if the
standard error stream is not directed to a terminal.

View File

@ -102,7 +102,8 @@ objects from the source repository into a pack in the cloned repository.
--verbose:: --verbose::
-v:: -v::
Run verbosely. Run verbosely. Does not affect the reporting of progress status
to the standard error stream.
--progress:: --progress::
Progress status is reported on the standard error stream Progress status is reported on the standard error stream

View File

@ -31,6 +31,16 @@ in a state that is hard to back out of in the case of a conflict.
OPTIONS OPTIONS
------- -------
-q::
--quiet::
This is passed to both underlying git-fetch to squelch reporting of
during transfer, and underlying git-merge to squelch output during
merging.
-v::
--verbose::
Pass --verbose to git-fetch and git-merge.
Options related to merging Options related to merging
~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -146,14 +146,21 @@ useful if you write an alias or script around 'git push'.
receiver share many of the same objects in common. The default is receiver share many of the same objects in common. The default is
\--thin. \--thin.
-q::
--quiet::
Suppress all output, including the listing of updated refs,
unless an error occurs. Progress is not reported to the standard
error stream.
-v:: -v::
--verbose:: --verbose::
Run verbosely. Run verbosely.
-q:: --progress::
--quiet:: Progress status is reported on the standard error stream
Suppress all output, including the listing of updated refs, by default when it is attached to a terminal, unless -q
unless an error occurs. is specified. This flag forces progress status even if the
standard error stream is not directed to a terminal.
include::urls-remotes.txt[] include::urls-remotes.txt[]

View File

@ -67,6 +67,7 @@ option can be used to override --squash.
Synonyms to --stat and --no-stat; these are deprecated and will be Synonyms to --stat and --no-stat; these are deprecated and will be
removed in the future. removed in the future.
ifndef::git-pull[]
-q:: -q::
--quiet:: --quiet::
Operate quietly. Operate quietly.
@ -74,6 +75,7 @@ option can be used to override --squash.
-v:: -v::
--verbose:: --verbose::
Be verbose. Be verbose.
endif::git-pull[]
-X <option>:: -X <option>::
--strategy-option=<option>:: --strategy-option=<option>::

View File

@ -37,18 +37,17 @@ static const char * const builtin_clone_usage[] = {
NULL NULL
}; };
static int option_quiet, option_no_checkout, option_bare, option_mirror; static int option_no_checkout, option_bare, option_mirror;
static int option_local, option_no_hardlinks, option_shared, option_recursive; static int option_local, option_no_hardlinks, option_shared, option_recursive;
static char *option_template, *option_reference, *option_depth; static char *option_template, *option_reference, *option_depth;
static char *option_origin = NULL; static char *option_origin = NULL;
static char *option_branch = NULL; static char *option_branch = NULL;
static char *option_upload_pack = "git-upload-pack"; static char *option_upload_pack = "git-upload-pack";
static int option_verbose; static int option_verbosity;
static int option_progress; static int option_progress;
static struct option builtin_clone_options[] = { static struct option builtin_clone_options[] = {
OPT__QUIET(&option_quiet), OPT__VERBOSITY(&option_verbosity),
OPT__VERBOSE(&option_verbose),
OPT_BOOLEAN(0, "progress", &option_progress, OPT_BOOLEAN(0, "progress", &option_progress,
"force progress reporting"), "force progress reporting"),
OPT_BOOLEAN('n', "no-checkout", &option_no_checkout, OPT_BOOLEAN('n', "no-checkout", &option_no_checkout,
@ -462,7 +461,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
die("could not create leading directories of '%s'", git_dir); die("could not create leading directories of '%s'", git_dir);
set_git_dir(make_absolute_path(git_dir)); set_git_dir(make_absolute_path(git_dir));
init_db(option_template, option_quiet ? INIT_DB_QUIET : 0); init_db(option_template, (option_verbosity < 0) ? INIT_DB_QUIET : 0);
/* /*
* At this point, the config exists, so we do not need the * At this point, the config exists, so we do not need the
@ -526,13 +525,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
transport_set_option(transport, TRANS_OPT_DEPTH, transport_set_option(transport, TRANS_OPT_DEPTH,
option_depth); option_depth);
if (option_quiet) transport_set_verbosity(transport, option_verbosity, option_progress);
transport->verbose = -1;
else if (option_verbose)
transport->verbose = 1;
if (option_progress)
transport->progress = 1;
if (option_upload_pack) if (option_upload_pack)
transport_set_option(transport, TRANS_OPT_UPLOADPACK, transport_set_option(transport, TRANS_OPT_UPLOADPACK,
@ -641,7 +634,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
opts.update = 1; opts.update = 1;
opts.merge = 1; opts.merge = 1;
opts.fn = oneway_merge; opts.fn = oneway_merge;
opts.verbose_update = !option_quiet; opts.verbose_update = (option_verbosity > 0);
opts.src_index = &the_index; opts.src_index = &the_index;
opts.dst_index = &the_index; opts.dst_index = &the_index;

View File

@ -28,6 +28,7 @@ enum {
}; };
static int all, append, dry_run, force, keep, multiple, prune, update_head_ok, verbosity; static int all, append, dry_run, force, keep, multiple, prune, update_head_ok, verbosity;
static int progress;
static int tags = TAGS_DEFAULT; static int tags = TAGS_DEFAULT;
static const char *depth; static const char *depth;
static const char *upload_pack; static const char *upload_pack;
@ -57,6 +58,7 @@ static struct option builtin_fetch_options[] = {
OPT_BOOLEAN('k', "keep", &keep, "keep downloaded pack"), OPT_BOOLEAN('k', "keep", &keep, "keep downloaded pack"),
OPT_BOOLEAN('u', "update-head-ok", &update_head_ok, OPT_BOOLEAN('u', "update-head-ok", &update_head_ok,
"allow updating of HEAD ref"), "allow updating of HEAD ref"),
OPT_BOOLEAN(0, "progress", &progress, "force progress reporting"),
OPT_STRING(0, "depth", &depth, "DEPTH", OPT_STRING(0, "depth", &depth, "DEPTH",
"deepen history of shallow clone"), "deepen history of shallow clone"),
OPT_END() OPT_END()
@ -845,10 +847,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv)
die("Where do you want to fetch from today?"); die("Where do you want to fetch from today?");
transport = transport_get(remote, NULL); transport = transport_get(remote, NULL);
if (verbosity >= 2) transport_set_verbosity(transport, verbosity, progress);
transport->verbose = verbosity <= 3 ? verbosity : 3;
if (verbosity < 0)
transport->verbose = -1;
if (upload_pack) if (upload_pack)
set_option(TRANS_OPT_UPLOADPACK, upload_pack); set_option(TRANS_OPT_UPLOADPACK, upload_pack);
if (keep) if (keep)

View File

@ -17,6 +17,8 @@ static const char * const push_usage[] = {
static int thin; static int thin;
static int deleterefs; static int deleterefs;
static const char *receivepack; static const char *receivepack;
static int verbosity;
static int progress;
static const char **refspec; static const char **refspec;
static int refspec_nr; static int refspec_nr;
@ -105,13 +107,16 @@ static int push_with_options(struct transport *transport, int flags)
{ {
int err; int err;
int nonfastforward; int nonfastforward;
transport_set_verbosity(transport, verbosity, progress);
if (receivepack) if (receivepack)
transport_set_option(transport, transport_set_option(transport,
TRANS_OPT_RECEIVEPACK, receivepack); TRANS_OPT_RECEIVEPACK, receivepack);
if (thin) if (thin)
transport_set_option(transport, TRANS_OPT_THIN, "yes"); transport_set_option(transport, TRANS_OPT_THIN, "yes");
if (flags & TRANSPORT_PUSH_VERBOSE) if (verbosity > 0)
fprintf(stderr, "Pushing to %s\n", transport->url); fprintf(stderr, "Pushing to %s\n", transport->url);
err = transport_push(transport, refspec_nr, refspec, flags, err = transport_push(transport, refspec_nr, refspec, flags,
&nonfastforward); &nonfastforward);
@ -204,8 +209,7 @@ int cmd_push(int argc, const char **argv, const char *prefix)
int rc; int rc;
const char *repo = NULL; /* default repository */ const char *repo = NULL; /* default repository */
struct option options[] = { struct option options[] = {
OPT_BIT('q', "quiet", &flags, "be quiet", TRANSPORT_PUSH_QUIET), OPT__VERBOSITY(&verbosity),
OPT_BIT('v', "verbose", &flags, "be verbose", TRANSPORT_PUSH_VERBOSE),
OPT_STRING( 0 , "repo", &repo, "repository", "repository"), OPT_STRING( 0 , "repo", &repo, "repository", "repository"),
OPT_BIT( 0 , "all", &flags, "push all refs", TRANSPORT_PUSH_ALL), OPT_BIT( 0 , "all", &flags, "push all refs", TRANSPORT_PUSH_ALL),
OPT_BIT( 0 , "mirror", &flags, "mirror all refs", OPT_BIT( 0 , "mirror", &flags, "mirror all refs",
@ -220,6 +224,7 @@ int cmd_push(int argc, const char **argv, const char *prefix)
OPT_STRING( 0 , "exec", &receivepack, "receive-pack", "receive pack program"), OPT_STRING( 0 , "exec", &receivepack, "receive-pack", "receive pack program"),
OPT_BIT('u', "set-upstream", &flags, "set upstream for git pull/status", OPT_BIT('u', "set-upstream", &flags, "set upstream for git pull/status",
TRANSPORT_PUSH_SET_UPSTREAM), TRANSPORT_PUSH_SET_UPSTREAM),
OPT_BOOLEAN(0, "progress", &progress, "force progress reporting"),
OPT_END() OPT_END()
}; };

View File

@ -38,7 +38,7 @@ test -z "$(git ls-files -u)" || die_conflict
test -f "$GIT_DIR/MERGE_HEAD" && die_merge test -f "$GIT_DIR/MERGE_HEAD" && die_merge
strategy_args= diffstat= no_commit= squash= no_ff= ff_only= strategy_args= diffstat= no_commit= squash= no_ff= ff_only=
log_arg= verbosity= log_arg= verbosity= progress=
merge_args= merge_args=
curr_branch=$(git symbolic-ref -q HEAD) curr_branch=$(git symbolic-ref -q HEAD)
curr_branch_short=$(echo "$curr_branch" | sed "s|refs/heads/||") curr_branch_short=$(echo "$curr_branch" | sed "s|refs/heads/||")
@ -50,6 +50,8 @@ do
verbosity="$verbosity -q" ;; verbosity="$verbosity -q" ;;
-v|--verbose) -v|--verbose)
verbosity="$verbosity -v" ;; verbosity="$verbosity -v" ;;
--progress)
progress=--progress ;;
-n|--no-stat|--no-summary) -n|--no-stat|--no-summary)
diffstat=--no-stat ;; diffstat=--no-stat ;;
--stat|--summary) --stat|--summary)
@ -214,7 +216,7 @@ test true = "$rebase" && {
done done
} }
orig_head=$(git rev-parse -q --verify HEAD) orig_head=$(git rev-parse -q --verify HEAD)
git fetch $verbosity --update-head-ok "$@" || exit 1 git fetch $verbosity $progress --update-head-ok "$@" || exit 1
curr_head=$(git rev-parse -q --verify HEAD) curr_head=$(git rev-parse -q --verify HEAD)
if test -n "$orig_head" && test "$curr_head" != "$orig_head" if test -n "$orig_head" && test "$curr_head" != "$orig_head"

View File

@ -279,9 +279,8 @@ static void standard_options(struct transport *t)
char buf[16]; char buf[16];
int n; int n;
int v = t->verbose; int v = t->verbose;
int no_progress = v < 0 || (!t->progress && !isatty(2));
set_helper_option(t, "progress", !no_progress ? "true" : "false"); set_helper_option(t, "progress", t->progress ? "true" : "false");
n = snprintf(buf, sizeof(buf), "%d", v + 1); n = snprintf(buf, sizeof(buf), "%d", v + 1);
if (n >= sizeof(buf)) if (n >= sizeof(buf))
@ -576,7 +575,6 @@ static int push_refs(struct transport *transport,
if (buf.len == 0) if (buf.len == 0)
return 0; return 0;
transport->verbose = flags & TRANSPORT_PUSH_VERBOSE ? 1 : 0;
standard_options(transport); standard_options(transport);
if (flags & TRANSPORT_PUSH_DRY_RUN) { if (flags & TRANSPORT_PUSH_DRY_RUN) {

View File

@ -526,7 +526,7 @@ static int fetch_refs_via_pack(struct transport *transport,
args.include_tag = data->options.followtags; args.include_tag = data->options.followtags;
args.verbose = (transport->verbose > 0); args.verbose = (transport->verbose > 0);
args.quiet = (transport->verbose < 0); args.quiet = (transport->verbose < 0);
args.no_progress = args.quiet || (!transport->progress && !isatty(2)); args.no_progress = !transport->progress;
args.depth = data->options.depth; args.depth = data->options.depth;
for (i = 0; i < nr_heads; i++) for (i = 0; i < nr_heads; i++)
@ -786,8 +786,8 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re
args.send_mirror = !!(flags & TRANSPORT_PUSH_MIRROR); args.send_mirror = !!(flags & TRANSPORT_PUSH_MIRROR);
args.force_update = !!(flags & TRANSPORT_PUSH_FORCE); args.force_update = !!(flags & TRANSPORT_PUSH_FORCE);
args.use_thin_pack = data->options.thin; args.use_thin_pack = data->options.thin;
args.verbose = !!(flags & TRANSPORT_PUSH_VERBOSE); args.verbose = (transport->verbose > 0);
args.quiet = !!(flags & TRANSPORT_PUSH_QUIET); args.quiet = (transport->verbose < 0);
args.dry_run = !!(flags & TRANSPORT_PUSH_DRY_RUN); args.dry_run = !!(flags & TRANSPORT_PUSH_DRY_RUN);
args.porcelain = !!(flags & TRANSPORT_PUSH_PORCELAIN); args.porcelain = !!(flags & TRANSPORT_PUSH_PORCELAIN);
@ -929,6 +929,8 @@ struct transport *transport_get(struct remote *remote, const char *url)
const char *helper; const char *helper;
struct transport *ret = xcalloc(1, sizeof(*ret)); struct transport *ret = xcalloc(1, sizeof(*ret));
ret->progress = isatty(2);
if (!remote) if (!remote)
die("No remote provided to transport_get()"); die("No remote provided to transport_get()");
@ -1028,6 +1030,25 @@ int transport_set_option(struct transport *transport,
return 1; return 1;
} }
void transport_set_verbosity(struct transport *transport, int verbosity,
int force_progress)
{
if (verbosity >= 2)
transport->verbose = verbosity <= 3 ? verbosity : 3;
if (verbosity < 0)
transport->verbose = -1;
/**
* Rules used to determine whether to report progress (processing aborts
* when a rule is satisfied):
*
* 1. Report progress, if force_progress is 1 (ie. --progress).
* 2. Don't report progress, if verbosity < 0 (ie. -q/--quiet ).
* 3. Report progress if isatty(2) is 1.
**/
transport->progress = force_progress || (verbosity >= 0 && isatty(2));
}
int transport_push(struct transport *transport, int transport_push(struct transport *transport,
int refspec_nr, const char **refspec, int flags, int refspec_nr, const char **refspec, int flags,
int *nonfastforward) int *nonfastforward)
@ -1046,8 +1067,8 @@ int transport_push(struct transport *transport,
transport->get_refs_list(transport, 1); transport->get_refs_list(transport, 1);
struct ref *local_refs = get_local_heads(); struct ref *local_refs = get_local_heads();
int match_flags = MATCH_REFS_NONE; int match_flags = MATCH_REFS_NONE;
int verbose = flags & TRANSPORT_PUSH_VERBOSE; int verbose = (transport->verbose > 0);
int quiet = flags & TRANSPORT_PUSH_QUIET; int quiet = (transport->verbose < 0);
int porcelain = flags & TRANSPORT_PUSH_PORCELAIN; int porcelain = flags & TRANSPORT_PUSH_PORCELAIN;
int pretend = flags & TRANSPORT_PUSH_DRY_RUN; int pretend = flags & TRANSPORT_PUSH_DRY_RUN;
int push_ret, ret, err; int push_ret, ret, err;

View File

@ -80,7 +80,12 @@ struct transport {
int (*disconnect)(struct transport *connection); int (*disconnect)(struct transport *connection);
char *pack_lockfile; char *pack_lockfile;
signed verbose : 3; signed verbose : 3;
/* Force progress even if stderr is not a tty */ /**
* Transports should not set this directly, and should use this
* value without having to check isatty(2), -q/--quiet
* (transport->verbose < 0), etc. - checking has already been done
* in transport_set_verbosity().
**/
unsigned progress : 1; unsigned progress : 1;
/* /*
* If transport is at least potentially smart, this points to * If transport is at least potentially smart, this points to
@ -94,10 +99,9 @@ struct transport {
#define TRANSPORT_PUSH_FORCE 2 #define TRANSPORT_PUSH_FORCE 2
#define TRANSPORT_PUSH_DRY_RUN 4 #define TRANSPORT_PUSH_DRY_RUN 4
#define TRANSPORT_PUSH_MIRROR 8 #define TRANSPORT_PUSH_MIRROR 8
#define TRANSPORT_PUSH_VERBOSE 16 #define TRANSPORT_PUSH_PORCELAIN 16
#define TRANSPORT_PUSH_PORCELAIN 32 #define TRANSPORT_PUSH_SET_UPSTREAM 32
#define TRANSPORT_PUSH_QUIET 64
#define TRANSPORT_PUSH_SET_UPSTREAM 128
#define TRANSPORT_SUMMARY_WIDTH (2 * DEFAULT_ABBREV + 3) #define TRANSPORT_SUMMARY_WIDTH (2 * DEFAULT_ABBREV + 3)
/* Returns a transport suitable for the url */ /* Returns a transport suitable for the url */
@ -129,6 +133,8 @@ struct transport *transport_get(struct remote *, const char *);
**/ **/
int transport_set_option(struct transport *transport, const char *name, int transport_set_option(struct transport *transport, const char *name,
const char *value); const char *value);
void transport_set_verbosity(struct transport *transport, int verbosity,
int force_progress);
int transport_push(struct transport *connection, int transport_push(struct transport *connection,
int refspec_nr, const char **refspec, int flags, int refspec_nr, const char **refspec, int flags,