diff options
Diffstat (limited to '')
| -rw-r--r-- | ui-summary.c | 61 | 
1 files changed, 31 insertions, 30 deletions
| diff --git a/ui-summary.c b/ui-summary.c index ffad4f2..2f8a822 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -95,70 +95,71 @@ void cgit_print_summary()  	html("</table>");  } -void cgit_print_repo_readme(char *path) +/* The caller must free filename and ref after calling this. */ +void cgit_parse_readme(const char *readme, const char *path, char **filename, char **ref, struct cgit_repo *repo)  { -	char *slash, *tmp, *colon, *ref; -	int free_filename = 0; +	const char *slash, *colon; -	if (!ctx.repo->readme || !(*ctx.repo->readme)) -		return; +	*filename = NULL; +	*ref = NULL; -	ref = NULL; +	if (!readme || !(*readme)) +		return;  	/* Check if the readme is tracked in the git repo. */ -	colon = strchr(ctx.repo->readme, ':'); +	colon = strchr(readme, ':');  	if (colon && strlen(colon) > 1) { -		*colon = '\0';  		/* If it starts with a colon, we want to use  		 * the default branch */ -		if (colon == ctx.repo->readme && ctx.repo->defbranch) -			ref = ctx.repo->defbranch; +		if (colon == readme && repo->defbranch) +			*ref = xstrdup(repo->defbranch);  		else -			ref = ctx.repo->readme; -		ctx.repo->readme = colon + 1; -		if (!(*ctx.repo->readme)) -			return; +			*ref = xstrndup(readme, colon - readme); +		readme = colon + 1;  	}  	/* Prepend repo path to relative readme path unless tracked. */ -	if (!ref && *ctx.repo->readme != '/') -		ctx.repo->readme = fmtalloc("%s/%s", ctx.repo->path, -						ctx.repo->readme); +	if (!(*ref) && *readme != '/') +		readme = fmtalloc("%s/%s", repo->path, readme);  	/* If a subpath is specified for the about page, make it relative -	 * to the directory containing the configured readme. -	 */ +	 * to the directory containing the configured readme. */  	if (path) { -		slash = strrchr(ctx.repo->readme, '/'); +		slash = strrchr(readme, '/');  		if (!slash) {  			if (!colon)  				return;  			slash = colon;  		} -		free_filename = 1; -		tmp = xmalloc(slash - ctx.repo->readme + 1 + strlen(path) + 1); -		strncpy(tmp, ctx.repo->readme, slash - ctx.repo->readme + 1); -		strcpy(tmp + (slash - ctx.repo->readme + 1), path); +		*filename = xmalloc(slash - readme + 1 + strlen(path) + 1); +		strncpy(*filename, readme, slash - readme + 1); +		strcpy(*filename + (slash - readme + 1), path);  	} else -		tmp = ctx.repo->readme; +		*filename = xstrdup(readme); +} + +void cgit_print_repo_readme(char *path) +{ +	char *filename, *ref; +	cgit_parse_readme(ctx.repo->readme, path, &filename, &ref, ctx.repo);  	/* Print the calculated readme, either from the git repo or from the  	 * filesystem, while applying the about-filter.  	 */  	html("<div id='summary'>");  	if (ctx.repo->about_filter) { -		ctx.repo->about_filter->argv[1] = tmp; +		ctx.repo->about_filter->argv[1] = filename;  		cgit_open_filter(ctx.repo->about_filter);  	}  	if (ref) -		cgit_print_file(tmp, ref); +		cgit_print_file(filename, ref);  	else -		html_include(tmp); +		html_include(filename);  	if (ctx.repo->about_filter) {  		cgit_close_filter(ctx.repo->about_filter);  		ctx.repo->about_filter->argv[1] = NULL;  	}  	html("</div>"); -	if (free_filename) -		free(tmp); +	free(filename); +	free(ref);  } | 
