git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Kong Lucien <Lucien.Kong@ensimag.imag.fr>
Cc: git@vger.kernel.org, Matthieu.Moy@grenoble-inp.fr,
	Duperray Valentin <Valentin.Duperray@ensimag.imag.fr>,
	Jonas Franck <Franck.Jonas@ensimag.imag.fr>,
	Nguy Thomas <Thomas.Nguy@ensimag.imag.fr>,
	Nguyen Huynh Khoi Nguyen Lucien 
	<Huynh-Khoi-Nguyen.Nguyen@ensimag.imag.fr>
Subject: Re: [PATCHv2 1/2] wt-status: better advices for git status
Date: Sun, 27 May 2012 21:57:23 -0700	[thread overview]
Message-ID: <7v1um47vik.fsf@alter.siamese.dyndns.org> (raw)
In-Reply-To: <1338035905-24166-1-git-send-email-Lucien.Kong@ensimag.imag.fr> (Kong Lucien's message of "Sat, 26 May 2012 14:38:24 +0200")

Kong Lucien <Lucien.Kong@ensimag.imag.fr> writes:
Kong Lucien <Lucien.Kong@ensimag.imag.fr> writes:

> This patch provides more information about your current state after a git status command (in the cases of conflicts, before and after they are resolved, a rebase or a bisect process).
> This would help users to know what they are currently doing, in a more accurate way.

Please fix these overlong lines.

The description is unclear what problem it tries to solve and how,
and invites many questions.  Does it add more lines at the top?  At
the bottom?  How verbosely?  By pushing down existing information by
adding extra lines somewhere, the existing output lines may be made
harder to read, but how badly?  How does this affect "status
-s/status --porcelain" output?  What does the new code do to figure
out the "current state"?  By heuristics?  How often does the
heuristics get it wrong and in what circumstances?


> diff --git a/wt-status.c b/wt-status.c
> index dd6d8c4..9839280 100644
> --- a/wt-status.c
> +++ b/wt-status.c
> @@ -15,6 +15,7 @@
>  
>  static char default_wt_status_colors[][COLOR_MAXLEN] = {
>  	GIT_COLOR_NORMAL, /* WT_STATUS_HEADER */
> +	GIT_COLOR_NORMAL, /* WT_STATUS_IN_PROGRESS */
>  	GIT_COLOR_GREEN,  /* WT_STATUS_UPDATED */
>  	GIT_COLOR_RED,    /* WT_STATUS_CHANGED */
>  	GIT_COLOR_RED,    /* WT_STATUS_UNTRACKED */

Why add new stuff in the middle, not at the end?

> @@ -728,6 +729,92 @@ static void wt_status_print_tracking(struct wt_status *s)
>  	color_fprintf_ln(s->fp, color(WT_STATUS_HEADER, s), "#");
>  }
>  
> +static void wt_status_print_in_progress(struct wt_status *s)
> +{
> +	int i;
> +	const char *c = color(WT_STATUS_IN_PROGRESS, s);
> +	const char *git_dir = getenv(GIT_DIR_ENVIRONMENT);
> +	const char* path;

> +	int unmerged_state = 0;
> +	int rebase_state = 0;
> +	int rebase_interactive_state = 0;
> +	int am_state = 0;
> +	int bisect_state = 0;

These are not independent (you cannot be in bisect and am at the
same time).  Why five independent variables?

> +	int conflict = 0;

How is this different from "unmerged"?

> +	for (i = 0; i < s->change.nr; i++) {
> +		struct wt_status_change_data *d;
> +		struct string_list_item *it;
> +		it = &(s->change.items[i]);
> +		d = it->util;
> +		if (d->stagemask) {
> +			conflict = 1;
> +			continue;
> +		}
> +	}

That "continue" looks like a no-op.  Mental note: conflict seems to
remember if there was any path that was unmerged.

> +	path = mkpath("%s/MERGE_HEAD", git_dir);
> +	if (!access(path, R_OK))
> +		unmerged_state = 1;

Ahh, so "unmerged" is "conflicted during merge" (as opposed to
rebase_state is "conflicted during rebase")?  Doesn't the naming
sound odd?  If it were "merge_state", it might have made a bit more
sense (but again, these are not independent conditions, so multiple
variables do not make sense).

> +	path = mkpath("%s/rebase-apply", git_dir);
> +	if (!access(path, R_OK)) {
> +		path = mkpath("%s/rebase-apply/applying", git_dir);
> +		if (!access(path, R_OK))
> +			am_state = 1;
> +		else
> +			rebase_state = 1;
> +	}
> +	else {
> +		path = mkpath("%s/rebase-merge", git_dir);
> +		if (!access(path, R_OK)) {
> +			path = mkpath("%s/rebase-merge/interactive", git_dir);
> +			if (!access(path, R_OK))
> +				rebase_interactive_state = 1;
> +			else
> +				rebase_state = 1;
> +		}
> +	}

The above if/else makes it clear that if you are in "am" you can
never be in "rebase -i", but doesn't it strike you odd that the
check for MERGE_HEAD is not cascaded the same way?  I.e. if you know
you are in "merge", you cannot be "am" nor "rebase", but you check
the latter anyway even after you know you are in "merge".

> +	path = mkpath("%s/BISECT_LOG", git_dir);
> +	if (!access(path, R_OK))
> +		bisect_state = 1;

Likewise.

> +	if(bisect_state) {

s/if/if /;

> +		status_printf_ln(s, c, _("You are currently bisecting."));
> +		status_printf_ln(s, c, _("To get back to the original branch run \"git bisect reset\""));
> +		wt_status_print_trailer(s);
> +	}
> +
> +	if(unmerged_state) {

Likewise.

> +		if (conflict)
> +			status_printf_ln(s, c, _("You have unmerged paths: fix conflicts and then commit the result."));
> +		else
> +			status_printf_ln(s, c, _("You are still merging, run \"git commit\" to conclude merge."));
> +		wt_status_print_trailer(s);
> +	}

It is annoying that the above does things in random order, i.e.

	if (are we in X)
        	set state to X
	if (are we in Y)
        	set state to Y
	else if (are we in Z)
		set state to Z
	if (are we in W)
		set state to W

	if (Z)
        	say things about Z
	if (X)
		say things about X
	if (Y)
		say things about Y


Such a code structure invites bugs and missed cases (e.g. you do not
seem to say anything after you detect that you are in "am").


> +	if(rebase_state || rebase_interactive_state) {
> +		if (conflict) {
> +			status_printf_ln(s, c, _("You are currently rebasing: fix conflicts and then run \"git rebase -- continue\"."));
> +			status_printf_ln(s, c, _("If you would prefer to skip this patch, instead run \"git rebase --skip\"."));
> +			status_printf_ln(s, c, _("To check out  the original branch and stop rebasing run \"git rebase --abort\"."));
> +		}
> +		else {

	if (...) {
		...
	} else {
		...
	}

> +			if (rebase_state)

Why extra level of nesting?

> +				status_printf_ln(s, c, _("You are currently rebasing: all conflicts fixed; run \"git rebase --continue\"."));
> +			else {
> +				status_printf_ln(s, c, _("You are currently editing in a rebase progress."));
> +				status_printf_ln(s, c, _("You can amend the commit with"));
> +				status_printf_ln(s, c, _("	git commit --amend"));
> +				status_printf_ln(s, c, _("Once you are satisfied with your changes, run"));
> +				status_printf_ln(s, c, _("	git rebase --continue"));
> +			}

I am not sure if this level of verbosity is a good thing, given that
you are adding this near the very beginning of the output.  When you
have many conflicted or modified paths, these advice messages will
scroll off the top.

Oh, another thing.  Perhaps these (both detection logic and output)
should be protected with a new advise.* configuration variable, no?

  parent reply	other threads:[~2012-05-28  4:57 UTC|newest]

Thread overview: 97+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-24  9:37 [PATCH/RFC] t7512-status-warnings.sh : better advices for git status Kong Lucien
2012-05-24 17:31 ` Matthieu Moy
2012-05-26 12:38 ` [PATCHv2 1/2] wt-status: " Kong Lucien
2012-05-26 12:38   ` [PATCHv2 2/2] t7512-status-warnings.sh: " Kong Lucien
2012-05-27 12:57     ` Matthieu Moy
2012-05-28  8:43     ` Matthieu Moy
2012-05-26 13:01   ` [PATCHv2 1/2] wt-status: " Nguyen Thai Ngoc Duy
2012-05-26 17:17     ` NGUY Thomas
2012-05-27 12:58     ` Matthieu Moy
2012-05-27 13:10   ` Matthieu Moy
2012-05-28  4:57   ` Junio C Hamano [this message]
2012-05-28  7:05     ` Matthieu Moy
2012-05-30  4:27       ` Junio C Hamano
2012-05-28 10:54     ` konglu
2012-05-28 17:36   ` [PATCHv3 1/2] wt-status.*: better advices for git status added Kong Lucien
2012-05-28 17:36     ` [PATCHv3 2/2] t7512-status-warnings.sh: better advices for git status Kong Lucien
2012-05-28 20:36       ` Matthieu Moy
2012-05-28 20:23     ` [PATCHv3 1/2] wt-status.*: better advices for git status added Matthieu Moy
2012-05-29 19:22     ` Junio C Hamano
2012-05-30 11:09       ` konglu
2012-05-30 17:24         ` Junio C Hamano
2012-05-31  6:47         ` Matthieu Moy
2012-05-30 13:23     ` [PATCHv4 1/3] " Kong Lucien
2012-05-30 13:23       ` [PATCHv4 2/3] t7512-status-warnings.sh: better advices for git status Kong Lucien
2012-05-30 13:23       ` [PATCHv4 3/3] Advices about 'git rm' during conflicts (unmerged paths) more relevant Kong Lucien
2012-05-30 18:44         ` Junio C Hamano
2012-05-30 21:50           ` konglu
2012-05-31  7:06         ` Matthieu Moy
2012-05-31  7:59           ` konglu
2012-05-30 18:26       ` [PATCHv4 1/3] wt-status.*: better advices for git status added Junio C Hamano
2012-05-30 19:06         ` Junio C Hamano
2012-05-31  6:42         ` Matthieu Moy
2012-05-31  6:44           ` Matthieu Moy
2012-05-31  6:29       ` Matthieu Moy
2012-05-31  6:34         ` Andrew Ardill
2012-05-31 15:15       ` [PATCHv5 " Kong Lucien
2012-05-31 15:15         ` [PATCHv5 2/3] t7512-status-help.sh: better advices for git status Kong Lucien
2012-05-31 15:15         ` [PATCHv5 3/3] status: don't suggest "git rm" or "git add" if not appropriate Kong Lucien
2012-06-01  8:55           ` Matthieu Moy
2012-06-01 12:15           ` Phil Hord
2012-06-01 14:08             ` konglu
2012-06-01 16:38               ` Junio C Hamano
2012-05-31 21:36         ` [PATCHv5 1/3] wt-status.*: better advices for git status added Junio C Hamano
2012-06-01  9:16           ` konglu
2012-06-01  9:26             ` Matthieu Moy
2012-06-01 14:50               ` Junio C Hamano
2012-06-01 16:51             ` Junio C Hamano
2012-06-01 19:39               ` konglu
2012-06-01  8:42         ` Matthieu Moy
2012-06-01 11:27           ` konglu
2012-06-01 12:40             ` Phil Hord
2012-06-01 16:57               ` Junio C Hamano
2012-06-04 18:00                 ` Phil Hord
2012-06-03 18:30         ` [PATCHv6 1/4] " Kong Lucien
2012-06-03 18:30           ` [PATCHv6 2/4] t7512-status-help.sh: better advices for git status Kong Lucien
2012-06-03 21:18             ` Junio C Hamano
2012-06-04 10:04               ` konglu
2012-06-04 15:04                 ` Junio C Hamano
2012-06-04 22:07                 ` Junio C Hamano
2012-06-03 18:30           ` [PATCHv6 3/4] status: don't suggest "git rm" or "git add" if not appropriate Kong Lucien
2012-06-03 19:34             ` Matthieu Moy
2012-06-03 18:30           ` [PATCHv6 4/4] status: better advices when splitting a commit (during rebase -i) Kong Lucien
2012-06-03 22:00             ` Junio C Hamano
2012-06-04 15:35             ` Phil Hord
2012-06-05  9:13               ` konglu
2012-06-03 21:06           ` [PATCHv6 1/4] wt-status.*: better advices for git status added Junio C Hamano
2012-06-04  9:51             ` konglu
2012-06-04 14:54               ` Junio C Hamano
2012-06-04 17:19           ` [PATCHv7 " Kong Lucien
2012-06-04 17:19             ` [PATCHv7 2/4] t7512-status-help.sh: better advices for git status Kong Lucien
2012-06-04 21:02               ` Matthieu Moy
2012-06-04 23:12               ` Junio C Hamano
2012-06-04 17:19             ` [PATCHv7 3/4] status: don't suggest "git rm" or "git add" if not appropriate Kong Lucien
2012-06-04 17:19             ` [PATCHv7 4/4] status: better advices when splitting a commit (during rebase -i) Kong Lucien
2012-06-04 23:01             ` [PATCHv7 1/4] wt-status.*: better advices for git status added Junio C Hamano
2012-06-05 10:32               ` konglu
2012-06-05 11:33                 ` Matthieu Moy
2012-06-05 20:21             ` [PATCHv8 " Lucien Kong
2012-06-05 20:21               ` [PATCHv8 2/4] t7512-status-help.sh: better advices for git status Lucien Kong
2012-06-05 20:21               ` [PATCHv8 3/4] status: don't suggest "git rm" or "git add" if not appropriate Lucien Kong
2012-06-05 20:21               ` [PATCHv8 4/4] status: better advices when splitting a commit (during rebase -i) Lucien Kong
2012-06-05 21:16                 ` Junio C Hamano
2012-06-08  9:29                   ` konglu
2012-06-08 15:05                     ` Junio C Hamano
2012-06-07 13:17               ` [PATCHv9 1/4] wt-status.*: better advices for git status added Lucien Kong
2012-06-07 13:17                 ` [PATCHv9 2/4] t7512-status-help.sh: better advices for git status Lucien Kong
2012-06-07 13:17                 ` [PATCHv9 3/4] status: don't suggest "git rm" or "git add" if not appropriate Lucien Kong
2012-06-07 13:17                 ` [PATCHv9 4/4] status: better advices when splitting a commit (during rebase -i) Lucien Kong
2012-06-07 18:07                   ` Junio C Hamano
2012-06-07 20:42                   ` Junio C Hamano
2012-06-07 21:05                     ` konglu
2012-06-10 11:17                 ` [PATCHv10 1/4] wt-status.*: better advices for git status added Lucien Kong
2012-06-10 11:17                   ` [PATCHv10 2/4] t7512-status-help.sh: better advices for git status Lucien Kong
2012-06-10 11:17                   ` [PATCHv10 3/4] status: don't suggest "git rm" or "git add" if not appropriate Lucien Kong
2012-06-10 11:17                   ` [PATCHv10 4/4] status: better advices when splitting a commit (during rebase -i) Lucien Kong
2012-06-11 20:21                     ` Junio C Hamano
2012-06-12  7:14                       ` konglu

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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7v1um47vik.fsf@alter.siamese.dyndns.org \
    --to=gitster@pobox.com \
    --cc=Franck.Jonas@ensimag.imag.fr \
    --cc=Huynh-Khoi-Nguyen.Nguyen@ensimag.imag.fr \
    --cc=Lucien.Kong@ensimag.imag.fr \
    --cc=Matthieu.Moy@grenoble-inp.fr \
    --cc=Thomas.Nguy@ensimag.imag.fr \
    --cc=Valentin.Duperray@ensimag.imag.fr \
    --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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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).