"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Tracey Emery <tracey@traceyemery.net>
Subject:
Re: got status -q
To:
gameoftrees@openbsd.org
Date:
Tue, 14 Sep 2021 07:38:56 -0600

Download raw body.

Thread
  • Tracey Emery:

    got status -q

    • Stefan Sperling:

      got status -q

      • Tracey Emery:

        got status -q

On Tue, Sep 14, 2021 at 10:50:07AM +0200, Stefan Sperling wrote:
> On Mon, Sep 13, 2021 at 04:48:19PM -0600, Tracey Emery wrote:
> > On Mon, Sep 13, 2021 at 11:23:42PM +0200, Stefan Sperling wrote:
> > > On Mon, Sep 13, 2021 at 03:19:13PM -0600, Tracey Emery wrote:
> > > > Perhaps this needs to be something like `got status -S ?` instead of -q.
> > > > With -s, we show the selected, with -S we supress the selected?
> > > 
> > > That would make more sense than -q, yes.
> > 
> > Yeah, I think this is an improvement. No regress.
> > 
> > Thoughts?
> 
> Looks great.
> 
> We should add a corresponding test case to regress/cmdline/status.sh
> so this feature won't be silently broken at some point in the future.

Yeah, I was thinking about that and also wanted to add a -q for update
and checkout as well.

I'll commit this then and start looking at the tests.

>  
> > diff 4ad4a1ec452e58730b6d841ae6a044ff53827e15 /home/tracey/src/got
> > blob - 562571621fea9038dfaca7cfec630342fde17210
> > file + got/got.1
> > --- got/got.1
> > +++ got/got.1
> > @@ -658,7 +658,7 @@ Silence progress output.
> >  .It Cm up
> >  Short alias for
> >  .Cm update .
> > -.It Cm status Oo Fl I Oc Oo Fl s Ar status-codes Oc Op Ar path ...
> > +.It Cm status Oo Fl I Oc Oo Fl s Ar status-codes Oc Oo Fl q Oc Op Ar path ...
> >  Show the current modification status of files in a work tree,
> >  using the following status codes:
> >  .Bl -column YXZ description
> > @@ -711,6 +711,14 @@ argument.
> >  Any combination of codes from the above list of possible status codes
> >  may be specified.
> >  For staged files, status codes displayed in either column will be matched.
> > +.It Fl S Ar status-codes
> > +Suppress the output of files with a modification status matching any of the
> > +single-character status codes contained in the
> > +.Ar status-codes
> > +argument.
> > +Any combination of codes from the above list of possible status codes
> > +may be specified.
> > +For staged files, status codes displayed in either column will be matched.
> >  .El
> >  .Pp
> >  For compatibility with
> > blob - e0fa2127a56f4fd45394cbea92d0f7cbe3ce866f
> > file + got/got.c
> > --- got/got.c
> > +++ got/got.c
> > @@ -5224,31 +5224,51 @@ done:
> >  __dead static void
> >  usage_status(void)
> >  {
> > -	fprintf(stderr, "usage: %s status [-I] [-s status-codes ] [path ...]\n",
> > -	    getprogname());
> > +	fprintf(stderr, "usage: %s status [-I] [-s status-codes ] "
> > +	    "[-S status-codes] [path ...]\n", getprogname());
> >  	exit(1);
> >  }
> >  
> > +struct got_status_arg {
> > +	char *status_codes;
> > +	int suppress;
> > +};
> > +
> >  static const struct got_error *
> >  print_status(void *arg, unsigned char status, unsigned char staged_status,
> >      const char *path, struct got_object_id *blob_id,
> >      struct got_object_id *staged_blob_id, struct got_object_id *commit_id,
> >      int dirfd, const char *de_name)
> >  {
> > +	struct got_status_arg *st = arg;
> > +
> >  	if (status == staged_status && (status == GOT_STATUS_DELETE))
> >  		status = GOT_STATUS_NO_CHANGE;
> > -	if (arg) {
> > -		char *status_codes = arg;
> > -		size_t ncodes = strlen(status_codes);
> > -		int i;
> > +	if (st != NULL && st->status_codes) {
> > +		size_t ncodes = strlen(st->status_codes);
> > +		int i, j = 0;
> > +
> >  		for (i = 0; i < ncodes ; i++) {
> > -			if (status == status_codes[i] ||
> > -			    staged_status == status_codes[i])
> > -				break;
> > +			if (st->suppress) {
> > +				if (status == st->status_codes[i] ||
> > +				    staged_status == st->status_codes[i]) {
> > +					j++;
> > +					continue;
> > +				}
> > +			} else {
> > +				if (status == st->status_codes[i] ||
> > +				    staged_status == st->status_codes[i])
> > +					break;
> > +			}
> >  		}
> > +
> > +		if (st->suppress && j == 0)
> > +			goto print;
> > +
> >  		if (i == ncodes)
> >  			return NULL;
> >  	}
> > +print:
> >  	printf("%c%c %s\n", status, staged_status, path);
> >  	return NULL;
> >  }
> > @@ -5259,14 +5279,19 @@ cmd_status(int argc, char *argv[])
> >  	const struct got_error *error = NULL;
> >  	struct got_repository *repo = NULL;
> >  	struct got_worktree *worktree = NULL;
> > -	char *cwd = NULL, *status_codes = NULL;;
> > +	struct got_status_arg st;
> > +	char *cwd = NULL;
> >  	struct got_pathlist_head paths;
> >  	struct got_pathlist_entry *pe;
> >  	int ch, i, no_ignores = 0;
> >  
> >  	TAILQ_INIT(&paths);
> >  
> > -	while ((ch = getopt(argc, argv, "Is:")) != -1) {
> > +	memset(&st, 0, sizeof(st));
> > +	st.status_codes = NULL;
> > +	st.suppress = 0;
> > +
> > +	while ((ch = getopt(argc, argv, "Is:S:")) != -1) {
> >  		switch (ch) {
> >  		case 'I':
> >  			no_ignores = 1;
> > @@ -5289,8 +5314,12 @@ cmd_status(int argc, char *argv[])
> >  					    optarg[i]);
> >  				}
> >  			}
> > -			status_codes = optarg;
> > +			st.status_codes = optarg;
> >  			break;
> > +		case 'S':
> > +			st.status_codes = optarg;
> > +			st.suppress = 1;
> > +			break;
> >  		default:
> >  			usage_status();
> >  			/* NOTREACHED */
> > @@ -5333,7 +5362,7 @@ cmd_status(int argc, char *argv[])
> >  		goto done;
> >  
> >  	error = got_worktree_status(worktree, &paths, repo, no_ignores,
> > -	    print_status, status_codes, check_cancelled, NULL);
> > +	    print_status, &st, check_cancelled, NULL);
> >  done:
> >  	TAILQ_FOREACH(pe, &paths, entry)
> >  		free((char *)pe->path);
> > 
> > 

-- 

Tracey Emery