Download raw body.
breadcumbs for gotwebd
On Wed, Nov 29, 2023 at 05:47:57PM +0100, Omar Polo wrote:
> I have this, and various other things that will follow, applied on my
> instance: <https://git.omarpolo.com>.
>
> Navigating through trees in gotwebd is a bit unpleasant since there is
> no '..' entry to navigate upward, so once one is inside a tree view the
> only options are to either use the browser history or editing the query
> string.
>
> This adds the 'breadcumbs' in the top line, along with the repository
> name. I think it's fitting to have them there. It also shows the user
> what the current path is, something that is not showed elsewhere.
>
> (this is not an excuse for maybe adding in the future a '..' entry in the
> tree view)
Agreed
>
> ok?
Yes please. Very handy.
>
> diff /home/op/w/got
> commit - 1267d012ff46a0020babeb79733d400a56402867
> path + /home/op/w/got
> blob - d04e49122cc951bb2815072249af493a694624f3
> file + gotwebd/pages.tmpl
> --- gotwebd/pages.tmpl
> +++ gotwebd/pages.tmpl
> @@ -42,6 +42,7 @@ enum gotweb_ref_tm {
> TM_LONG,
> };
>
> +static int breadcumbs(struct template *);
> static int datetime(struct template *, time_t, int);
> static int gotweb_render_blob_line(struct template *, const char *, size_t);
> static int gotweb_render_tree_item(struct template *, struct got_tree_entry *);
> @@ -56,6 +57,23 @@ static inline int branch(struct template *, struct got
> static inline int rss_tag_item(struct template *, struct repo_tag *);
> static inline int rss_author(struct template *, char *);
>
> +static inline char *
> +nextsep(char *s, char **t)
> +{
> + char *q;
> +
> + while (*s == '/')
> + s++;
> + *t = s;
> + if (*s == '\0')
> + return NULL;
> +
> + q = strchr(s, '/');
> + if (q == NULL)
> + q = strchr(s, '\0');
> + return q;
> +}
> +
> !}
>
> {{ define datetime(struct template *tp, time_t t, int fmt) }}
> @@ -82,6 +100,59 @@ static inline int rss_author(struct template *, char *
> </time>
> {{ end }}
>
> +{{ define breadcumbs(struct template *tp) }}
> +{!
> + struct request *c = tp->tp_arg;
> + struct querystring *qs = c->t->qs;
> + struct gotweb_url url;
> + const char *folder = qs->folder;
> + char *t, *s = NULL, *dir = NULL;
> + char ch;
> +
> + memset(&url, 0, sizeof(url));
> + url.index_page = -1;
> + url.page = -1;
> + url.action = TREE;
> + url.path = qs->path;
> + url.commit = qs->commit;
> +
> + if (folder && *folder != '\0') {
> + while (*folder == '/')
> + folder++;
> + dir = strdup(folder);
> + if (dir == NULL)
> + return (-1);
> + s = dir;
> + }
> +!}
> + {{ " / " }}
> + <a href="{{ render gotweb_render_url(c, &url) }}">tree</a>
> + {{ " / " }}
> + {{ if dir }}
> + {{ while (s = nextsep(s, &t)) != NULL }}
> + {!
> + ch = *s;
> + *s = '\0';
> + url.folder = dir;
> + !}
> +
> + <a href="{{ render gotweb_render_url(c, &url) }}">
> + {{ t }}
> + </a>
> + {{ " / " }}
> +
> + {! *s = ch; !}
> + {{ end }}
> + {{ end }}
> +
> + {{ if qs->file }}
> + {{ qs->file }}
> + {{ end}}
> +
> + {{ finally }}
> + {! free(dir); !}
> +{{ end }}
> +
> {{ define gotweb_render_page(struct template *tp,
> int (*body)(struct template *)) }}
> {!
> @@ -132,7 +203,9 @@ static inline int rss_author(struct template *, char *
> {{ qs->path }}
> </a>
> {{ end }}
> - {{ if qs->action != INDEX }}
> + {{ if qs->action == TREE || qs->action == BLOB }}
> + {{ render breadcumbs(tp) }}
> + {{ else if qs->action != INDEX }}
> {{ " / " }}{{ gotweb_action_name(qs->action) }}
> {{ end }}
> </div>
>
breadcumbs for gotwebd