diff options
| -rw-r--r-- | Makefile | 11 | ||||
| -rw-r--r-- | cache.c | 2 | ||||
| -rw-r--r-- | cgit.h | 1 | ||||
| -rw-r--r-- | cgitrc | 2 | ||||
| -rw-r--r-- | cmd.c | 7 | ||||
| m--------- | git | 0 | ||||
| -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 | 
10 files changed, 175 insertions, 7 deletions
| @@ -4,7 +4,7 @@ CGIT_SCRIPT_PATH = /var/www/htdocs/cgit  CGIT_CONFIG = /etc/cgitrc  CACHE_ROOT = /var/cache/cgit  SHA1_HEADER = <openssl/sha.h> -GIT_VER = 1.5.6 +GIT_VER = 1.6.0.rc1  GIT_URL = http://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.bz2  # @@ -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-clone.o  OBJECTS += ui-commit.o @@ -75,7 +76,7 @@ ifdef NEEDS_LIBICONV  endif -.PHONY: all git test install uninstall clean force-version get-git +.PHONY: all libgit test install uninstall clean force-version get-git  all: cgit @@ -92,17 +93,15 @@ CFLAGS += -DCGIT_SCRIPT_NAME='"$(CGIT_SCRIPT_NAME)"'  CFLAGS += -DCGIT_CACHE_ROOT='"$(CACHE_ROOT)"' -cgit: $(OBJECTS) git/libgit.a git/xdiff/lib.a +cgit: $(OBJECTS) libgit  	$(QUIET_CC)$(CC) $(CFLAGS) -o cgit $(OBJECTS) $(EXTLIBS)  cgit.o: VERSION  -include $(OBJECTS:.o=.d) -git/libgit.a: git +libgit:  	$(QUIET_SUBDIR0)git $(QUIET_SUBDIR1) libgit.a - -git/xdiff/lib.a: git  	$(QUIET_SUBDIR0)git $(QUIET_SUBDIR1) xdiff/lib.a  test: all @@ -416,7 +416,7 @@ int cache_ls(const char *path)  				  fullname, strerror(err), err);  			continue;  		} -		printf("%s %s %10lld %s\n", +		printf("%s %s %10zd %s\n",  		       name,  		       sprintftime("%Y-%m-%d %H:%M:%S",  				   slot.cache_st.st_mtime), @@ -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"  /* @@ -44,6 +44,8 @@  ## print all tags.  #summary-tags=0 +## Enable/disable display of localtime vs. GMT. Set to 1 for localtime. +#local-time=0  ## The "Idle" column on the repository index page can read a timestamp  ## from the specified agefile (if this file cannot be found, the mtime @@ -10,6 +10,7 @@  #include "cmd.h"  #include "cache.h"  #include "ui-shared.h" +#include "ui-atom.h"  #include "ui-blob.h"  #include "ui-clone.h"  #include "ui-commit.h" @@ -29,6 +30,11 @@ static void HEAD_fn(struct cgit_context *ctx)  	cgit_clone_head(ctx);  } +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) @@ -125,6 +131,7 @@ struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx)  {  	static struct cgit_cmd cmds[] = {  		def_cmd(HEAD, 1, 0), +		def_cmd(atom, 1, 0),  		def_cmd(about, 0, 1),  		def_cmd(blob, 1, 0),  		def_cmd(commit, 1, 1), diff --git a/git b/git -Subproject 93310a40eb022a0e36e7c618921931d8ffc31fd +Subproject 8e1db3871c767cb17b5e0eeb7bea8d967821a05 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 a2e0dd2..4818e70 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) @@ -436,6 +451,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"); @@ -453,6 +469,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 c5ce056..747f092 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); | 
