Thread (20 messages) flat view 20 messages, 7 authors, 2016-06-15

Re: [RFC/PATCH] shortstatus v1

From: Jeff King <hidden>
Date: 2016-06-15 22:46:08

On Tue, Feb 10, 2009 at 01:51:07AM +0100, Tuncer Ayaz wrote:
As discussed recently I started taking Junio's shortstatus patch
from October 25th 2008 and integrated it into current master.

This revision does work as advertised by Junio and v0 also did.
I did a simple test with this:

  mkdir repo && cd repo && git init &&
  touch unchanged changed changed-staged deleted deleted-staged &&
  git add . && git commit -m one &&
  echo changes >changed &&
  echo changes >changed-staged && git add changed-staged &&
  rm deleted &&
  git rm deleted-staged &&
  git shortstatus

The output is:

           changed
  M           changed-staged
           deleted
  D           deleted-staged

Some comments:

  1. Is the staggered indentation intentional? It looks awful, and the
     only use I can think of is to separate unstaged from staged
     changes. But surely there must be a more obvious way of doing so.

  2. Why do staged changes get a letter marking what happened, but
     unstaged changes do not?

  3. What advantage does this have over just doing:

       (git diff --name-status;
        git diff --cached --name-status) | sort -k2
Right now this is basically Junio's shortstatus
from Oct 25th 2008 with no substantial change
except a line or two.
This is not a very helpful commit message. What is it supposed to do?
What does the output look like? Why is it implemented this way? If Junio
sent a patch in October and it isn't substantially changed, why wasn't
it accepted then?
+static const char * const builtin_shortstatus_usage[] = {
+	"git shortstatus [options] [--] <filepattern>...",
+	NULL
+};
Really? Doing "git shortstatus subdir" seems not to affect the output,
nor does "git shortstatus I totally made up these command line
arguments".

What options are available? It looks like this is intimately tied with
"commit", which I think is one of the _shortcomings_ of the current
status. It means the command line options are non-intuitive for what
people generally want to say: "what is changed, possibly limiting to
some path".
+	OPT_BOOLEAN(0, "mini", &mini, "print mini shortstatus"),
So now "git status --mini" doesn't complain, but it doesn't seem to
actually do anything.
+	argc = parse_and_validate_options(argc, argv, builtin_shortstatus_usage, prefix);
Ah, I see the source of the option issues. You parse with the commit
options, but then you don't actually respect any of them. You would want
a totally separate set of options for shortstatus. In fact, I really
don't see what point there is in putting it with the 'commit' code at
all.
+	if (mini) {
+		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;
+			switch (d->index_status) {
+				case DIFF_STATUS_ADDED:
+					a = 1;
+					break;
+				case 0:
+				case DIFF_STATUS_COPIED:
+				case DIFF_STATUS_DELETED:
+				case DIFF_STATUS_MODIFIED:
+				case DIFF_STATUS_RENAMED:
+				case DIFF_STATUS_TYPE_CHANGED:
+					c = 1;
+					break;
+				default:
+				case DIFF_STATUS_UNKNOWN:
+				case DIFF_STATUS_UNMERGED:
+					u = 1;
+					break;
+			}
+		}
+		if (c)
+			printf("*");
+		if (a)
+			printf("+");
+		if (u)
+			printf("?");
Isn't this a bit heavy-handed? If you really just want to know "are
there any changes", can't you run a custom diff with EXIT_CODE and QUIET
set, which will bail when it sees the first change, saving you a lot of
useless computation?
+	} else {
+		for (i = 0; i < s.change.nr; i++) {
+			struct wt_status_change_data *d;
+			struct string_list_item *it;
+			char pfx[1 + 3 + 1 + 1];
Holy magic numbers, Batman.

-Peff
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help