diff options
| author | Lars Hjemli <hjemli@gmail.com> | 2008-08-06 09:50:10 +0200 | 
|---|---|---|
| committer | Lars Hjemli <hjemli@gmail.com> | 2008-08-06 09:50:10 +0200 | 
| commit | e352a013aed6e925a10a92916500c7deccf1410a (patch) | |
| tree | 7c49bf453bee4f624025d62bae92b4926bf83bfe | |
| parent | 3c71f597cc932992d5c44196e90f4675a1d54e77 (diff) | |
| parent | b2a3d31e8839b53a623b4c99124c2c637d0e3cbb (diff) | |
Merge branch 'lh/atom'
| -rw-r--r-- | Makefile | 1 | ||||
| -rw-r--r-- | cgit.h | 1 | ||||
| -rw-r--r-- | cmd.c | 7 | ||||
| -rw-r--r-- | ui-atom.c | 129 | ||||
| -rw-r--r-- | ui-atom.h | 6 | ||||
| -rw-r--r-- | ui-shared.c | 23 | ||||
| -rw-r--r-- | ui-shared.h | 1 | 
7 files changed, 168 insertions, 0 deletions
| @@ -55,6 +55,7 @@ OBJECTS += configfile.o  OBJECTS += html.o  OBJECTS += parsing.o  OBJECTS += shared.o +OBJECTS += ui-atom.o  OBJECTS += ui-blob.o  OBJECTS += ui-commit.o  OBJECTS += ui-diff.o @@ -24,6 +24,7 @@   */  #define FMT_LONGDATE "%Y-%m-%d %H:%M:%S (%Z)"  #define FMT_SHORTDATE "%Y-%m-%d" +#define FMT_ATOMDATE "%Y-%m-%dT%H:%M:%SZ"  /* @@ -10,6 +10,7 @@  #include "cmd.h"  #include "cache.h"  #include "ui-shared.h" +#include "ui-atom.h"  #include "ui-blob.h"  #include "ui-commit.h"  #include "ui-diff.h" @@ -22,6 +23,11 @@  #include "ui-tag.h"  #include "ui-tree.h" +static void atom_fn(struct cgit_context *ctx) +{ +	cgit_print_atom(ctx->qry.head, ctx->qry.path, 10); +} +  static void about_fn(struct cgit_context *ctx)  {  	if (ctx->repo) @@ -102,6 +108,7 @@ static void tree_fn(struct cgit_context *ctx)  struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx)  {  	static struct cgit_cmd cmds[] = { +		def_cmd(atom, 1, 0),  		def_cmd(about, 0, 1),  		def_cmd(blob, 1, 0),  		def_cmd(commit, 1, 1), diff --git a/ui-atom.c b/ui-atom.c new file mode 100644 index 0000000..a6ea3ee --- /dev/null +++ b/ui-atom.c @@ -0,0 +1,129 @@ +/* ui-atom.c: functions for atom feeds + * + * Copyright (C) 2008 Lars Hjemli + * + * Licensed under GNU General Public License v2 + *   (see COPYING for full license text) + */ + +#include "cgit.h" +#include "html.h" +#include "ui-shared.h" + +void add_entry(struct commit *commit, char *host) +{ +	char delim = '&'; +	char *hex; +	char *mail, *t, *t2; +	struct commitinfo *info; + +	info = cgit_parse_commit(commit); +	hex = sha1_to_hex(commit->object.sha1); +	html("<entry>\n"); +	html("<title>"); +	html_txt(info->subject); +	html("</title>\n"); +	html("<updated>"); +	cgit_print_date(info->author_date, FMT_ATOMDATE, ctx.cfg.local_time); +	html("</updated>\n"); +	html("<author>\n"); +	if (info->author) { +		html("<name>"); +		html_txt(info->author); +		html("</name>\n"); +	} +	if (info->author_email) { +		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>"); +	cgit_print_date(info->author_date, FMT_ATOMDATE, ctx.cfg.local_time); +	html("</published>\n"); +	if (host) { +		html("<link rel='alternate' type='text/html' href='http://"); +		html_attr(host); +		html_attr(cgit_pageurl(ctx.repo->url, "commit", NULL)); +		if (ctx.cfg.virtual_root) +			delim = '?'; +		htmlf("%cid=%s", delim, hex); +		html("'/>\n"); +	} +	htmlf("<id>%s</id>\n", hex); +	html("<content type='text'>\n"); +	html_txt(info->msg); +	html("</content>\n"); +	html("<content type='xhtml'>\n"); +	html("<div xmlns='http://www.w3.org/1999/xhtml'>\n"); +	html("<pre>\n"); +	html_txt(info->msg); +	html("</pre>\n"); +	html("</div>\n"); +	html("</content>\n"); +	html("</entry>\n"); +	cgit_free_commitinfo(info); +} + + +void cgit_print_atom(char *tip, 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; + +	if (!tip) +		argv[1] = ctx.qry.head; + +	if (path) { +		argv[argc++] = "--"; +		argv[argc++] = path; +	} + +	init_revisions(&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(&ctx); +	html("<feed xmlns='http://www.w3.org/2005/Atom'>\n"); +	html("<title>"); +	html_txt(ctx.repo->name); +	html("</title>\n"); +	html("<subtitle>"); +	html_txt(ctx.repo->desc); +	html("</subtitle>\n"); +	if (host) { +		html("<link rel='alternate' type='text/html' href='http://"); +		html_attr(host); +		html_attr(cgit_repourl(ctx.repo->url)); +		html("'/>\n"); +	} +	while ((commit = get_revision(&rev)) != NULL) { +		add_entry(commit, host); +		free(commit->buffer); +		commit->buffer = NULL; +		free_commit_list(commit->parents); +		commit->parents = NULL; +	} +	html("</feed>\n"); +} diff --git a/ui-atom.h b/ui-atom.h new file mode 100644 index 0000000..749ffd3 --- /dev/null +++ b/ui-atom.h @@ -0,0 +1,6 @@ +#ifndef UI_ATOM_H +#define UI_ATOM_H + +extern void cgit_print_atom(char *tip, char *path, int max_count); + +#endif diff --git a/ui-shared.c b/ui-shared.c index 197ee37..37c60b2 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -34,6 +34,21 @@ void cgit_print_error(char *msg)  	html("</div>\n");  } +char *cgit_hosturl() +{ +	char *host, *port; + +	host = getenv("SERVER_NAME"); +	if (!host) +		return NULL; +	port = getenv("SERVER_PORT"); +	if (port && atoi(port) != 80) +		host = xstrdup(fmt("%s:%d", host, atoi(port))); +	else +		host = xstrdup(host); +	return host; +} +  char *cgit_rooturl()  {  	if (ctx.cfg.virtual_root) @@ -428,6 +443,7 @@ void cgit_print_http_headers(struct cgit_context *ctx)  void cgit_print_docstart(struct cgit_context *ctx)  { +	char *host = cgit_hosturl();  	html(cgit_doctype);  	html("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n");  	html("<head>\n"); @@ -445,6 +461,13 @@ void cgit_print_docstart(struct cgit_context *ctx)  		html_attr(ctx->cfg.favicon);  		html("'/>\n");  	} +	if (host && ctx->repo) { +		html("<link rel='alternate' title='Atom feed' href='http://"); +		html_attr(cgit_hosturl()); +		html_attr(cgit_fileurl(ctx->repo->url, "atom", ctx->qry.path, +				       fmt("h=%s", ctx->qry.head))); +		html("' type='application/atom+xml'/>"); +	}  	html("</head>\n");  	html("<body>\n");  } diff --git a/ui-shared.h b/ui-shared.h index 07da4b4..f4123d3 100644 --- a/ui-shared.h +++ b/ui-shared.h @@ -1,6 +1,7 @@  #ifndef UI_SHARED_H  #define UI_SHARED_H +extern char *cgit_hosturl();  extern char *cgit_repourl(const char *reponame);  extern char *cgit_fileurl(const char *reponame, const char *pagename,  			  const char *filename, const char *query); | 
