From: Tracey Emery Subject: Re: got status -q To: gameoftrees@openbsd.org Date: Tue, 14 Sep 2021 07:38:56 -0600 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