Download raw body.
[rfc] tog ref 'd' keymap to toggle date
As mentioned in the recent tog thread, a potential use of the 'd' keymap in the ref view is to show the last modified date of each entry. I figured it was quick enough to demonstrate with a patch. diff --git a/tog/tog.1 b/tog/tog.1 index e8c907d8..46ee7375 100644 --- a/tog/tog.1 +++ b/tog/tog.1 @@ -468,6 +468,8 @@ currently selected reference. Open a .Cm tree view showing the tree resolved via the currently selected reference. +.It Cm d +Show last modified date of each displayed reference. .It Cm i Show object IDs for all non-symbolic references displayed in the .Cm ref diff --git a/tog/tog.c b/tog/tog.c index 4f498030..a447aee5 100644 --- a/tog/tog.c +++ b/tog/tog.c @@ -468,7 +468,7 @@ struct tog_ref_view_state { struct tog_reflist_entry *first_displayed_entry; struct tog_reflist_entry *last_displayed_entry; struct tog_reflist_entry *selected_entry; - int nrefs, ndisplayed, selected, show_ids, sort_by_date; + int nrefs, ndisplayed, selected, show_date, show_ids, sort_by_date; struct got_repository *repo; struct tog_reflist_entry *matched_entry; struct tog_colors colors; @@ -6233,10 +6233,45 @@ show_ref_view(struct tog_view *view) n = 0; while (re && limit > 0) { char *line = NULL; + char ymd[13]; /* YYYY-MM-DD + " " + NUL */ + if (s->show_date) { + struct got_commit_object *ci; + struct got_tag_object *tag; + struct got_object_id *id; + struct tm tm; + time_t t; + + err = got_ref_resolve(&id, s->repo, re->ref); + if (err) + return err; + err = got_object_open_as_tag(&tag, s->repo, id); + if (err) { + if (err->code != GOT_ERR_OBJ_TYPE) { + free(id); + return err; + } + err = got_object_open_as_commit(&ci, s->repo, + id); + if (err) { + free(id); + return err; + } + t = got_object_commit_get_committer_time(ci); + got_object_commit_close(ci); + } else { + t = got_object_tag_get_tagger_time(tag); + got_object_tag_close(tag); + } + free(id); + if (gmtime_r(&t, &tm) == NULL) + return got_error_from_errno("gmtime_r"); + if (strftime(ymd, sizeof(ymd), "%G-%m-%d ", &tm) == 0) + return got_error(GOT_ERR_NO_SPACE); + } if (got_ref_is_symbolic(re->ref)) { - if (asprintf(&line, "%s -> %s", - got_ref_get_name(re->ref), + if (asprintf(&line, "%s%s -> %s", s->show_date ? + ymd : "", got_ref_get_name(re->ref), got_ref_get_symref_target(re->ref)) == -1) return got_error_from_errno("asprintf"); } else if (s->show_ids) { @@ -6250,8 +6285,9 @@ show_ref_view(struct tog_view *view) free(id); return err; } - if (asprintf(&line, "%s: %s", - got_ref_get_name(re->ref), id_str) == -1) { + if (asprintf(&line, "%s%s: %s", s->show_date ? ymd : "", + got_ref_get_name(re->ref), + s->show_ids ? id_str : "") == -1) { err = got_error_from_errno("asprintf"); free(id); free(id_str); @@ -6259,11 +6295,9 @@ show_ref_view(struct tog_view *view) } free(id); free(id_str); - } else { - line = strdup(got_ref_get_name(re->ref)); - if (line == NULL) - return got_error_from_errno("strdup"); - } + } else if (asprintf(&line, "%s%s", s->show_date ? ymd : "", + got_ref_get_name(re->ref)) == -1) + return got_error_from_errno("asprintf"); err = format_line(&wline, &width, line, view->ncols, 0); if (err) { @@ -6347,6 +6381,9 @@ input_ref_view(struct tog_view **new_view, struct tog_view *view, int ch) int begin_x = 0, n, nscroll = view->nlines - 1; switch (ch) { + case 'd': + s->show_date = !s->show_date; + break; case 'i': s->show_ids = !s->show_ids; break; -- Mark Jamsek GPG: F2FF 13DE 6A06 C471 CA80 E6E2 2930 DC66 86EE CF68
[rfc] tog ref 'd' keymap to toggle date