Download raw body.
configurable diff algorithm for tog
On 22-07-01 12:15am, Stefan Sperling wrote: > Make the diff algorithm used by 'tog diff' and 'tog blame' configurable. > This allows people (like me) who prefer slow and tidy Patience diffs over > quick and ugly Myers diffs to tell tog about this preference. > > As a bonus, the diff algorithm can be toggled at run-time, in both the > diff view and the blame view, by pressing the A key. > > ok? Nice! Works as described. ok with or without tiny nit below > diff 4b752015b5208a96c2d1b6c1c6b8589884b8b2b6 f86afd0cdf59e0214d28ee1b07f98b12e63650e2 > commit - 4b752015b5208a96c2d1b6c1c6b8589884b8b2b6 > commit + f86afd0cdf59e0214d28ee1b07f98b12e63650e2 > blob - 728ba5ee9e20edbde20ed7f0c2ff1cbabad89c0b > blob + ed0412fd13daaa1ea18139730716db483ba49274 > --- tog/tog.1 > +++ tog/tog.1 > @@ -295,6 +295,12 @@ Find the Nth previous line which matches the current s > (default: 1). > .It Cm w > Toggle display of whitespace-only changes. > +.It Cm A > +Change the diff algorithm. > +Supported diff algorithms are Myers and Patience. > +This is a global setting which also affects the > +.Cm blame > +view. > .El > .Pp > The options for > @@ -379,6 +385,12 @@ Find the Nth next line which matches the current searc > .It Cm N > Find the Nth previous line which matches the current search pattern > (default: 1). > +.It Cm A > +Change the diff algorithm. > +Supported diff algorithms are Myers and Patience. > +This is a global setting which also affects the > +.Cm diff > +view. > .El > .Pp > The options for > @@ -560,7 +572,15 @@ work tree, use the repository path associated with thi > .El > .El > .Sh ENVIRONMENT > -.Bl -tag -width TOG_COLORS > +.Bl -tag -width TOG_DIFF_ALGORITHM > +.It Ev TOG_DIFF_ALGORITHM > +Determines the default diff algorithm used by > +.Nm . > +Valid values are > +.Dq patience > +and > +.Dq myers . > +If unset, the Myers diff algorithm will be used by default. > .It Ev TOG_COLORS > .Nm > shows colorized output if this variable is set to a non-empty value. > blob - 800384dacf0faed4893832dd2760af45e28cb8c7 > blob + 5249c995a3b1c894615555cce80987087f672a75 > --- tog/tog.c > +++ tog/tog.c > @@ -136,7 +136,17 @@ STAILQ_HEAD(tog_colors, tog_color); > > static struct got_reflist_head tog_refs = TAILQ_HEAD_INITIALIZER(tog_refs); > static struct got_reflist_object_id_map *tog_refs_idmap; > +static enum got_diff_algorithm tog_diff_algo = GOT_DIFF_ALGORITHM_MYERS; > > +static void > +switch_diff_algo(void) > +{ > + if (tog_diff_algo == GOT_DIFF_ALGORITHM_MYERS) > + tog_diff_algo = GOT_DIFF_ALGORITHM_PATIENCE; > + else > + tog_diff_algo = GOT_DIFF_ALGORITHM_MYERS; > +} > + > static const struct got_error * > tog_ref_cmp_by_name(void *arg, int *cmp, struct got_reference *re1, > struct got_reference* re2) > @@ -321,7 +331,6 @@ struct tog_diff_view_state { > int first_displayed_line; > int last_displayed_line; > int eof; > - enum got_diff_algorithm diff_algo; > int diff_context; > int ignore_whitespace; > int force_text_diff; > @@ -3966,13 +3975,13 @@ create_diff(struct tog_diff_view_state *s) > case GOT_OBJ_TYPE_BLOB: > err = got_diff_objects_as_blobs(&s->line_offsets, &s->nlines, > s->f1, s->f2, s->fd1, s->fd2, s->id1, s->id2, > - s->label1, s->label2, s->diff_algo, s->diff_context, > + s->label1, s->label2, tog_diff_algo, s->diff_context, > s->ignore_whitespace, s->force_text_diff, s->repo, s->f); > break; > case GOT_OBJ_TYPE_TREE: > err = got_diff_objects_as_trees(&s->line_offsets, &s->nlines, > s->f1, s->f2, s->fd1, s->fd2, s->id1, s->id2, NULL, "", "", > - s->diff_algo, s->diff_context, s->ignore_whitespace, > + tog_diff_algo, s->diff_context, s->ignore_whitespace, > s->force_text_diff, s->repo, s->f); > break; > case GOT_OBJ_TYPE_COMMIT: { > @@ -4008,7 +4017,7 @@ create_diff(struct tog_diff_view_state *s) > > err = got_diff_objects_as_commits(&s->line_offsets, &s->nlines, > s->f1, s->f2, s->fd1, s->fd2, s->id1, s->id2, NULL, > - s->diff_algo, s->diff_context, s->ignore_whitespace, > + tog_diff_algo, s->diff_context, s->ignore_whitespace, > s->force_text_diff, s->repo, s->f); > break; > } > @@ -4219,7 +4228,6 @@ open_diff_view(struct tog_view *view, struct got_objec > > s->first_displayed_line = 1; > s->last_displayed_line = view->nlines; > - s->diff_algo = GOT_DIFF_ALGORITHM_MYERS; > s->diff_context = diff_context; > s->ignore_whitespace = ignore_whitespace; > s->force_text_diff = force_text_diff; > @@ -4376,7 +4384,10 @@ input_diff_view(struct tog_view **new_view, struct tog > view->count = 0; > break; > case 'a': > + case 'A': > case 'w': > + if (ch == 'A') > + switch_diff_algo(); > if (ch == 'a') > s->force_text_diff = !s->force_text_diff; > if (ch == 'w') > @@ -4950,7 +4961,7 @@ blame_thread(void *arg) > goto done; > > err = got_blame(ta->path, a->commit_id, ta->repo, > - GOT_DIFF_ALGORITHM_MYERS, blame_cb, ta->cb_args, > + tog_diff_algo, blame_cb, ta->cb_args, > ta->cancel_cb, ta->cancel_arg, fd1, fd2, f1, f2); > if (err && err->code == GOT_ERR_CANCELLED) > err = NULL; > @@ -5455,6 +5466,18 @@ input_blame_view(struct tog_view **new_view, struct to > else > view->count = 0; > break; > + case 'A': > + view->count = 0; > + switch_diff_algo(); > + s->done = 1; > + thread_err = stop_blame(&s->blame); > + s->done = 0; > + if (thread_err) > + break; > + err = run_blame(view); > + if (err) > + break; > + break; We could drop the `if (err)` check here as we break already. > case 'c': > case 'p': { > struct got_object_id *id = NULL; > @@ -7839,6 +7862,7 @@ main(int argc, char *argv[]) > { "version", no_argument, NULL, 'V' }, > { NULL, 0, NULL, 0} > }; > + char *diff_algo_str = NULL; > > setlocale(LC_CTYPE, ""); > > @@ -7892,6 +7916,14 @@ main(int argc, char *argv[]) > } > } > > + diff_algo_str = getenv("TOG_DIFF_ALGORITHM"); > + if (diff_algo_str) { > + if (strcasecmp(diff_algo_str, "patience") == 0) > + tog_diff_algo = GOT_DIFF_ALGORITHM_PATIENCE; > + if (strcasecmp(diff_algo_str, "myers") == 0) > + tog_diff_algo = GOT_DIFF_ALGORITHM_MYERS; > + } > + > if (cmd == NULL) { > if (argc != 1) > usage(0, 1); > -- Mark Jamsek <fnc.bsdbox.org> GPG: F2FF 13DE 6A06 C471 CA80 E6E2 2930 DC66 86EE CF68
configurable diff algorithm for tog