cgit/ui-atom.c
Christian Hesse a6da40bf84 git: update to v2.41.0
Update to git version v2.41.0, with lots of changes...
This requires changes for these upstream commits:

* 60ff56f50372c1498718938ef504e744fe011ffb
  banned.h: mark `strtok()` and `strtok_r()` as banned

* 52acddf36c8cb3778ab2098a0d95cc2e375a4069
  string-list: multi-delimiter `string_list_split_in_place()`

* d850b7a545fcfbd97460a921c7f7c59d933eb0f7
  cocci: apply the "cache.h" part of "the_repository.pending"

* cb338c23d6d518947bf6f7240bf30e2ec232bd3b
  cocci: apply the "commit-reach.h" part of "the_repository.pending"

* ecb5091fd4301ac647db0bd2504112b38f7ee06d
  cocci: apply the "commit.h" part of "the_repository.pending"

* 085390328f5fe1dfba67039b1fd6cc51546a4e41
  cocci: apply the "diff.h" part of "the_repository.pending"

* bc726bd075929aab6b3e09d4dd5c2b0726fd5350
  cocci: apply the "object-store.h" part of "the_repository.pending"

* bab821646a74c446370fa8d01ca851f247df5033
  cocci: apply the "pretty.h" part of "the_repository.pending"

* afe27c889429438829bc8818ed17e4960bd3ef02
  cocci: apply the "packfile.h" part of "the_repository.pending"

* 12cb1c10a64170a5d600dd1c6c8abfeec105fb6b
  cocci: apply the "refs.h" part of "the_repository.pending"

* 035c7de9e9ea11d26df5f9e4bb117f91ed11a9fd
  cocci: apply the "revision.h" part of "the_repository.pending"

... and some more I missed to list 😜 - for example the move and cleanup
of headers and includes (see changes in `cgit.h`) comes to mind...

Signed-off-by: Christian Hesse <mail@eworm.de>
2023-06-01 12:00:43 +02:00

158 lines
3.7 KiB
C

/* ui-atom.c: functions for atom feeds
*
* Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
*
* Licensed under GNU General Public License v2
* (see COPYING for full license text)
*/
#include "cgit.h"
#include "ui-atom.h"
#include "html.h"
#include "ui-shared.h"
static void add_entry(struct commit *commit, const char *host)
{
char delim = '&';
char *hex;
char *mail, *t, *t2;
struct commitinfo *info;
info = cgit_parse_commit(commit);
hex = oid_to_hex(&commit->object.oid);
html("<entry>\n");
html("<title>");
html_txt(info->subject);
html("</title>\n");
html("<updated>");
html_txt(show_date(info->committer_date, 0,
date_mode_from_type(DATE_ISO8601_STRICT)));
html("</updated>\n");
html("<author>\n");
if (info->author) {
html("<name>");
html_txt(info->author);
html("</name>\n");
}
if (info->author_email && !ctx.cfg.noplainemail) {
mail = xstrdup(info->author_email);
t = strchr(mail, '<');
if (t)
t++;
else
t = mail;
t2 = strchr(t, '>');
if (t2)
*t2 = '\0';
html("<email>");
html_txt(t);
html("</email>\n");
free(mail);
}
html("</author>\n");
html("<published>");
html_txt(show_date(info->author_date, 0,
date_mode_from_type(DATE_ISO8601_STRICT)));
html("</published>\n");
if (host) {
char *pageurl;
html("<link rel='alternate' type='text/html' href='");
html(cgit_httpscheme());
html_attr(host);
pageurl = cgit_pageurl(ctx.repo->url, "commit", NULL);
html_attr(pageurl);
if (ctx.cfg.virtual_root)
delim = '?';
html_attrf("%cid=%s", delim, hex);
html("'/>\n");
free(pageurl);
}
html("<id>");
html_txtf("urn:%s:%s", the_hash_algo->name, hex);
html("</id>\n");
html("<content type='text'>\n");
html_txt(info->msg);
html("</content>\n");
html("</entry>\n");
cgit_free_commitinfo(info);
}
void cgit_print_atom(char *tip, const char *path, int max_count)
{
char *host;
const char *argv[] = {NULL, tip, NULL, NULL, NULL};
struct commit *commit;
struct rev_info rev;
int argc = 2;
bool first = true;
if (ctx.qry.show_all)
argv[1] = "--all";
else if (!tip)
argv[1] = ctx.qry.head;
if (path) {
argv[argc++] = "--";
argv[argc++] = path;
}
repo_init_revisions(the_repository, &rev, NULL);
rev.abbrev = DEFAULT_ABBREV;
rev.commit_format = CMIT_FMT_DEFAULT;
rev.verbose_header = 1;
rev.show_root_diff = 0;
rev.max_count = max_count;
setup_revisions(argc, argv, &rev, NULL);
prepare_revision_walk(&rev);
host = cgit_hosturl();
ctx.page.mimetype = "text/xml";
ctx.page.charset = "utf-8";
cgit_print_http_headers();
html("<feed xmlns='http://www.w3.org/2005/Atom'>\n");
html("<title>");
html_txt(ctx.repo->name);
if (path) {
html("/");
html_txt(path);
}
if (tip && !ctx.qry.show_all) {
html(", branch ");
html_txt(tip);
}
html("</title>\n");
html("<subtitle>");
html_txt(ctx.repo->desc);
html("</subtitle>\n");
if (host) {
char *fullurl = cgit_currentfullurl();
char *repourl = cgit_repourl(ctx.repo->url);
html("<id>");
html_txtf("%s%s%s", cgit_httpscheme(), host, fullurl);
html("</id>\n");
html("<link rel='self' href='");
html_attrf("%s%s%s", cgit_httpscheme(), host, fullurl);
html("'/>\n");
html("<link rel='alternate' type='text/html' href='");
html_attrf("%s%s%s", cgit_httpscheme(), host, repourl);
html("'/>\n");
free(fullurl);
free(repourl);
}
while ((commit = get_revision(&rev)) != NULL) {
if (first) {
html("<updated>");
html_txt(show_date(commit->date, 0,
date_mode_from_type(DATE_ISO8601_STRICT)));
html("</updated>\n");
first = false;
}
add_entry(commit, host);
release_commit_memory(the_repository->parsed_objects, commit);
commit->parents = NULL;
}
html("</feed>\n");
free(host);
}