Download raw body.
gotwebd: wip: side-by-side diffs
Hello, This is an attempt at rendering diffs side-by-side in gotwebd. I've found that, sometimes, they're useful to read some kinds of diffs (it's a matter of preference, some people seems to really like and want them always.) To keep it simple, I'm not using cookies or whatnot; in the diff page there is now an extra link "Diff side by side" which will re-render the diff in the different format. I'm using an extra query parameter for this. Also, the side-by-side view won't work on text browsers. The way to maybe have them working on w3m would require a table, but i'm not sure it's semantically the right thing to do, so w3m users will have to keep reading unified diffs :) What do you think? P.S.: remember to install the new css file and clear the browse cache when testing this diff. diff /home/op/w/got path + /home/op/w/got commit - d07b17ba19c434be14cc50b320ca154fa92a100f blob - ea4cdedb51cb3f930bbc483b0f82bc9590a180b6 file + gotwebd/files/htdocs/gotwebd/gotweb.css --- gotwebd/files/htdocs/gotwebd/gotweb.css +++ gotwebd/files/htdocs/gotwebd/gotweb.css @@ -41,6 +41,26 @@ pre { margin: 0; } +.diff.side-by-side { + margin: 1rem; +} + +.diff.side-by-side p { + margin: 0; + display: flex; +} + +.diff.side-by-side code { + flex: 1; + white-space: pre-wrap; +} + +.diff.side-by-side code + code { + border-left-width: 1px; + border-left-color: LightSlateGray; + border-left-style: solid; +} + .diff_minus, .diff_submodule { color: magenta; } commit - d07b17ba19c434be14cc50b320ca154fa92a100f blob - 1a1a8770b26108d09399eb43a781fa0e4d63c1b9 file + gotwebd/gotweb.c --- gotwebd/gotweb.c +++ gotwebd/gotweb.c @@ -63,6 +63,7 @@ static const struct querystring_keys querystring_keys[ { "headref", HEADREF }, { "index_page", INDEX_PAGE }, { "path", PATH }, + { "sidebyside", SIDEBYSIDE }, }; static const struct action_keys action_keys[] = { @@ -690,6 +691,9 @@ qa_found: goto done; } break; + case SIDEBYSIDE: + qs->sidebyside = !strcmp(value, "true"); + break; } /* entry found */ @@ -1079,6 +1083,12 @@ gotweb_render_url(struct request *c, struct gotweb_url sep = "&"; } + if (url->sidebyside) { + if (tp_writef(c->tp, "%ssidebyside=true", sep) == -1) + return -1; + sep = "&"; + } + return 0; } commit - d07b17ba19c434be14cc50b320ca154fa92a100f blob - f6a54900f231bcf8db79e76bbea47944ab3a713a file + gotwebd/gotwebd.h --- gotwebd/gotwebd.h +++ gotwebd/gotwebd.h @@ -368,6 +368,7 @@ struct gotwebd { struct gotweb_url { int action; int index_page; + int sidebyside; const char *commit; const char *file; const char *folder; @@ -383,6 +384,7 @@ struct querystring { char *headref; int index_page; char *path; + int sidebyside; }; struct querystring_keys { @@ -403,6 +405,7 @@ enum querystring_elements { HEADREF, INDEX_PAGE, PATH, + SIDEBYSIDE, }; enum query_actions { commit - d07b17ba19c434be14cc50b320ca154fa92a100f blob - cd49228ec99471205e216489a687095f309e2ee8 file + gotwebd/pages.tmpl --- gotwebd/pages.tmpl +++ gotwebd/pages.tmpl @@ -939,6 +939,13 @@ nextsep(char *s, char **t) .index_page = -1, .path = qs->path, .commit = rc->commit_id, + }, diff_sidebyside_url = { + .action = DIFF, + .index_page = -1, + .path = qs->path, + .commit = qs->commit, + .sidebyside = 1, + .headref = qs->headref, }; memcpy(&patch_url, &tree_url, sizeof(patch_url)); @@ -973,15 +980,31 @@ nextsep(char *s, char **t) <a href="{{ render gotweb_render_url(c, &tree_url) }}"> Tree </a> + {{" | "}} + <a href="{{ render gotweb_render_url(c, &diff_sidebyside_url) }}"> + Diff side by side + </a> </dd> </dl> </div> <hr /> - <pre id="diff"> - {{ while (linelen = getline(&line, &linesize, fp)) != -1 }} - {{ render diff_line(tp, line) }} - {{ end }} - </pre> + + {{ if qs->sidebyside }} + <section class="diff side-by-side"> + {{ else }} + <pre id="diff"> + {{ end }} + + {{ while (linelen = getline(&line, &linesize, fp)) != -1 }} + {{ render diff_line(tp, line) }} + {{ end }} + + {{ if qs->sidebyside }} + </section> + {{ else }} + </pre> + {{ end }} + </div> {{ finally }} {! free(line); !} @@ -989,6 +1012,8 @@ nextsep(char *s, char **t) {{ define diff_line(struct template *tp, char *line )}} {! + struct request *c = tp->tp_arg; + struct querystring *qs = c->t->qs; const char *color = NULL; char *nl; @@ -1014,7 +1039,22 @@ nextsep(char *s, char **t) if (nl) *nl = '\0'; !} -<span class="diff_line {{ color }}">{{ line }}</span>{{"\n"}} + {{ if qs->sidebyside }} + <p class="diff_line {{ color }}"> + {{ if *line == '+' && strncmp(line, "+++ ", 4) /* XXX */ }} + <code class="diff_empty"></code><code>{{ line }}</code> + {{ else if *line == '-' && strncmp(line, "--- ", 4) /* XXX */ }} + <code>{{ line }}</code><code class="diff_empty"></code> + {{ else if *line == ' ' }} + <code>{{ line }}</code><code>{{ line }}</code> + {{ else }} + <code>{{ line }}</code> + {{ end }} + </p> + {{ else }} + <span class="diff_line {{ color }}">{{ line }}</span> + {{ end }} + {{"\n"}} {{ end }} {{ define gotweb_render_branches(struct template *tp,
gotwebd: wip: side-by-side diffs