Download raw body.
gotwebd: templatefy gotweb_render_blame
On 23-01-13 09:47AM, Omar Polo wrote: > finally, at least :) Nice :) > Had to move `struct blame_line' to the header for it to be visible and > typedef the callback because was painful to type. > > no functional change intended. > > ok? ok with or without the following tiny style nit. Please consider prefixing the `render_blame_line_fn` typedef with "got_", and using the existing "_cb" suffix convention for callbacks: typedef int (*got_render_blame_line_cb)(struct template *, const char *, struct blame_line *, int, int); > diff /home/op/w/got > commit - 69525b4e7234cc5d81905e84a67d9b1768606e34 > path + /home/op/w/got > blob - 6ee4848f094c2566d8233b5aefa8fbbaabc158e9 > file + gotwebd/got_operations.c > --- gotwebd/got_operations.c > +++ gotwebd/got_operations.c > @@ -1027,13 +1027,6 @@ struct blame_line { > return 0; > } > > -struct blame_line { > - int annotated; > - char *id_str; > - char *committer; > - char datebuf[11]; /* YYYY-MM-DD + NUL */ > -}; > - > struct blame_cb_args { > struct blame_line *lines; > int nlines; > @@ -1043,6 +1036,7 @@ struct blame_cb_args { > FILE *f; > struct got_repository *repo; > struct request *c; > + render_blame_line_fn cb; > }; > > static const struct got_error * > @@ -1053,14 +1047,11 @@ got_gotweb_blame_cb(void *arg, int nlines, int lineno, > struct blame_cb_args *a = arg; > struct blame_line *bline; > struct request *c = a->c; > - struct transport *t = c->t; > - struct repo_dir *repo_dir = t->repo_dir; > - char *line = NULL, *eline = NULL; > + char *line = NULL; > size_t linesize = 0; > off_t offset; > struct tm tm; > time_t committer_time; > - int r; > > if (nlines != a->nlines || > (lineno != -1 && lineno < 1) || lineno > a->nlines) > @@ -1105,76 +1096,26 @@ got_gotweb_blame_cb(void *arg, int nlines, int lineno, > } > > while (a->lineno_cur <= a->nlines && bline->annotated) { > - char *smallerthan, *at, *nl, *committer; > - size_t len; > - > if (getline(&line, &linesize, a->f) == -1) { > if (ferror(a->f)) > err = got_error_from_errno("getline"); > break; > } > > - committer = bline->committer; > - smallerthan = strchr(committer, '<'); > - if (smallerthan && smallerthan[1] != '\0') > - committer = smallerthan + 1; > - at = strchr(committer, '@'); > - if (at) > - *at = '\0'; > - len = strlen(committer); > - if (len >= 9) > - committer[8] = '\0'; > + if (a->cb(c->tp, line, bline, a->nlines_prec, > + a->lineno_cur) == -1) > + break; > > - nl = strchr(line, '\n'); > - if (nl) > - *nl = '\0'; > - > - err = gotweb_escape_html(&eline, line); > - if (err) > - goto done; > - > - if (fcgi_printf(c, "<div class='blame_wrapper'>" > - "<div class='blame_number'>%.*d</div>" > - "<div class='blame_hash'>", > - a->nlines_prec, a->lineno_cur) == -1) > - goto done; > - > - r = gotweb_link(c, &(struct gotweb_url){ > - .action = DIFF, > - .index_page = -1, > - .page = -1, > - .path = repo_dir->name, > - .commit = bline->id_str, > - }, "%.8s", bline->id_str); > - if (r == -1) > - goto done; > - > - r = fcgi_printf(c, > - "</div>" > - "<div class='blame_date'>%s</div>" > - "<div class='blame_author'>%s</div>" > - "<div class='blame_code'>%s</div>" > - "</div>", /* .blame_wrapper */ > - bline->datebuf, > - committer, > - eline); > - if (r == -1) > - goto done; > - > a->lineno_cur++; > bline = &a->lines[a->lineno_cur - 1]; > - > - free(eline); > - eline = NULL; > } > done: > free(line); > - free(eline); > return err; > } > > const struct got_error * > -got_output_file_blame(struct request *c) > +got_output_file_blame(struct request *c, render_blame_line_fn cb) > { > const struct got_error *error = NULL; > struct transport *t = c->t; > @@ -1194,6 +1135,7 @@ got_output_file_blame(struct request *c) > TAILQ_INIT(&refs); > bca.f = NULL; > bca.lines = NULL; > + bca.cb = cb; > > if (asprintf(&path, "%s%s%s", qs->folder ? qs->folder : "", > qs->folder ? "/" : "", qs->file) == -1) { > blob - dadd1ae79464caf377f53bb82de16886cdeb9df9 > file + gotwebd/gotweb.c > --- gotwebd/gotweb.c > +++ gotwebd/gotweb.c > @@ -93,7 +93,6 @@ static const struct got_error *gotweb_render_blame(str > struct server *, const char *, int); > static const struct got_error *gotweb_get_clone_url(char **, struct server *, > const char *, int); > -static const struct got_error *gotweb_render_blame(struct request *); > > static void gotweb_free_querystring(struct querystring *); > static void gotweb_free_repo_dir(struct repo_dir *); > @@ -245,11 +244,13 @@ render: > > switch(qs->action) { > case BLAME: > - error = gotweb_render_blame(c); > + error = got_get_repo_commits(c, 1); > if (error) { > log_warnx("%s: %s", __func__, error->msg); > goto err; > } > + if (gotweb_render_blame(c->tp) == -1) > + goto done; > break; > case BLOB: > if (gotweb_render_blob(c->tp, blob) == -1) > @@ -974,59 +975,6 @@ static const struct got_error * > return error; > } > > -static const struct got_error * > -gotweb_render_blame(struct request *c) > -{ > - const struct got_error *error = NULL; > - struct transport *t = c->t; > - struct repo_commit *rc = NULL; > - char *age = NULL, *msg = NULL; > - int r; > - > - error = got_get_repo_commits(c, 1); > - if (error) > - return error; > - > - rc = TAILQ_FIRST(&t->repo_commits); > - > - error = gotweb_get_time_str(&age, rc->committer_time, TM_LONG); > - if (error) > - goto done; > - error = gotweb_escape_html(&msg, rc->commit_msg); > - if (error) > - goto done; > - > - r = fcgi_printf(c, "<div id='blame_title_wrapper'>\n" > - "<div id='blame_title'>Blame</div>\n" > - "</div>\n" /* #blame_title_wrapper */ > - "<div id='blame_content'>\n" > - "<div id='blame_header_wrapper'>\n" > - "<div id='blame_header'>\n" > - "<div class='header_age_title'>Date:</div>\n" > - "<div class='header_age'>%s</div>\n" > - "<div id='header_commit_msg_title'>Message:</div>\n" > - "<div id='header_commit_msg'>%s</div>\n" > - "</div>\n" /* #blame_header */ > - "</div>\n" /* #blame_header_wrapper */ > - "<div class='dotted_line'></div>\n" > - "<div id='blame'>\n", > - age, > - msg); > - if (r == -1) > - goto done; > - > - error = got_output_file_blame(c); > - if (error) > - goto done; > - > - fcgi_printf(c, "</div>\n" /* #blame */ > - "</div>\n"); /* #blame_content */ > -done: > - free(age); > - free(msg); > - return error; > -} > - > const struct got_error * > gotweb_escape_html(char **escaped_html, const char *orig_html) > { > blob - 2b26cfe7719c3bdd3462b9c0934f59fbcaac5aed > file + gotwebd/gotwebd.h > --- gotwebd/gotwebd.h > +++ gotwebd/gotwebd.h > @@ -143,6 +143,13 @@ struct repo_dir { > uint8_t reserved; > }__attribute__((__packed__)); > > +struct blame_line { > + int annotated; > + char *id_str; > + char *committer; > + char datebuf[11]; /* YYYY-MM-DD + NUL */ > +}; > + > struct repo_dir { > char *name; > char *owner; > @@ -431,6 +438,9 @@ extern struct gotwebd *gotwebd_env; > > extern struct gotwebd *gotwebd_env; > > +typedef int (*render_blame_line_fn)(struct template *, const char *, > + struct blame_line *, int, int); > + > /* sockets.c */ > void sockets(struct privsep *, struct privsep_proc *); > void sockets_shutdown(void); > @@ -475,6 +485,7 @@ int gotweb_render_rss(struct template *); > int gotweb_render_diff(struct template *, FILE *); > int gotweb_render_branches(struct template *, struct got_reflist_head *); > int gotweb_render_summary(struct template *, struct got_reflist_head *); > +int gotweb_render_blame(struct template *); > int gotweb_render_rss(struct template *); > > /* parse.y */ > @@ -512,7 +523,8 @@ const struct got_error *got_output_file_blame(struct r > const struct got_error *got_output_file_blob(struct request *); > int got_output_blob_by_lines(struct template *, struct got_blob_object *, > int (*)(struct template *, const char *, size_t)); > -const struct got_error *got_output_file_blame(struct request *); > +const struct got_error *got_output_file_blame(struct request *, > + render_blame_line_fn); > > /* config.c */ > int config_setserver(struct gotwebd *, struct server *); > blob - 4ed5a74cc4f6b80c911b880ef2f0a628eed248c0 > file + gotwebd/pages.tmpl > --- gotwebd/pages.tmpl > +++ gotwebd/pages.tmpl > @@ -40,6 +40,8 @@ static int gotweb_render_tree_item(struct template *, > > static int gotweb_render_blob_line(struct template *, const char *, size_t); > static int gotweb_render_tree_item(struct template *, struct got_tree_entry *); > +static int blame_line(struct template *, const char *, struct blame_line *, > + int, int); > > static inline int diff_line(struct template *, char *); > static inline int tag_item(struct template *, struct repo_tag *); > @@ -870,6 +872,77 @@ gotweb_render_age(struct template *tp, time_t time, in > {{ render gotweb_render_branches(tp, refs) }} > {{ end }} > > +{{ define gotweb_render_blame(struct template *tp) }} > +{! > + const struct got_error *err; > + struct request *c = tp->tp_arg; > + struct transport *t = c->t; > + struct repo_commit *rc = TAILQ_FIRST(&t->repo_commits); > +!} > +<div id="blame_title_wrapper"> > + <div id="blame_title">Blame</div> > +</div> > +<div id="blame_content"> > + <div id="blame_header_wrapper"> > + <div id="blame_header"> > + <div class="header_age_title">Date:</div> > + <div class="header_age"> > + {{ render gotweb_render_age(tp, rc->committer_time, TM_LONG) }} > + </div> > + <div id="header_commit_msg_title">Message:</div> > + <div id="header_commit_msg">{{ rc->commit_msg }}</div> > + </div> > + </div> > + <div class="dotted_line"></div> > + <div id="blame"> > + {{ "\n" }} > + {! > + err = got_output_file_blame(c, &blame_line); > + if (err) { > + log_warnx("%s: got_output_file_blame: %s", __func__, > + err->msg); > + return (-1); > + } > + !} > + </div> > +</div> > +{{ end }} > + > +{{ define blame_line(struct template *tp, const char *line, > + struct blame_line *bline, int lprec, int lcur) }} > +{! > + struct request *c = tp->tp_arg; > + struct transport *t = c->t; > + struct repo_dir *repo_dir = t->repo_dir; > + char *committer, *s; > + struct gotweb_url url = { > + .action = DIFF, > + .index_page = -1, > + .page = -1, > + .path = repo_dir->name, > + .commit = bline->id_str, > + }; > + > + s = strchr(bline->committer, '<'); > + committer = s ? s + 1 : bline->committer; > + > + s = strchr(committer, '@'); > + if (s) > + *s = '\0'; > +!} > +<div class="blame_wrapper"> > + <div class="blame_number">{{ printf "%.*d", lprec, lcur }}</div> > + <div class="blame_hash"> > + <a href="{{ render gotweb_render_url(c, &url) }}"> > + {{ printf "%.8s", bline->id_str }} > + </a> > + </div> > + <div class="blame_date">{{ bline->datebuf }}</div> > + <div class="blame_author">{{ printf "%.9s", committer }}</div> > + <div class="blame_code">{{ line }}</div> > +</div> > +{{ end }} > + > {{ define gotweb_render_rss(struct template *tp) }} > {! > struct request *c = tp->tp_arg; > -- Mark Jamsek <fnc.bsdbox.org> GPG: F2FF 13DE 6A06 C471 CA80 E6E2 2930 DC66 86EE CF68
gotwebd: templatefy gotweb_render_blame