about summary refs log tree commit diff
path: root/cgit.c
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2013-05-25 16:32:37 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2013-05-25 20:33:28 +0200
commitcd4c77d989983778432363061e99219f034c3717 (patch)
treea394b7960e7105c7dbcb130721298a49d49b8a75 /cgit.c
parentui-summary: Pass filename to about-filter (diff)
downloadcgit-pink-cd4c77d989983778432363061e99219f034c3717.tar.gz
cgit-pink-cd4c77d989983778432363061e99219f034c3717.zip
readme: Accept multiple candidates and test them.
The readme variable may now contain multiple space deliminated entries,
which per usual are either a filepath or a git ref filepath. If multiple
are specified, cgit will now select the first one in the list that
exists. This is to make it easier to specify multiple default readme
types in the main cgitrc file and have them automatically get applied to
each repo based on what exists.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to '')
-rw-r--r--cgit.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/cgit.c b/cgit.c
index 04682be..f738b83 100644
--- a/cgit.c
+++ b/cgit.c
@@ -14,6 +14,8 @@
 #include "html.h"
 #include "ui-shared.h"
 #include "ui-stats.h"
+#include "ui-blob.h"
+#include "ui-summary.h"
 #include "scan-tree.h"
 
 const char *cgit_version = CGIT_VERSION;
@@ -469,6 +471,38 @@ static char *guess_defbranch(void)
 	return xstrdup(ref + 11);
 }
 
+static void choose_readme(struct cgit_repo *repo)
+{
+	char *entry, *filename, *ref;
+
+	/* If there's no space, we skip the possibly expensive
+	 * selection process. */
+	if (!repo->readme || !strchr(repo->readme, ' '))
+		return;
+
+	for (entry = strtok(repo->readme, " "); entry; entry = strtok(NULL, " ")) {
+		cgit_parse_readme(entry, NULL, &filename, &ref, repo);
+		if (!(*filename)) {
+			free(filename);
+			free(ref);
+			continue;
+		}
+		if (*ref && cgit_ref_path_exists(filename, ref)) {
+			free(filename);
+			free(ref);
+			break;
+		}
+		if (!access(filename, R_OK)) {
+			free(filename);
+			free(ref);
+			break;
+		}
+		free(filename);
+		free(ref);
+	}
+	repo->readme = entry;
+}
+
 static int prepare_repo_cmd(struct cgit_context *ctx)
 {
 	unsigned char sha1[20];
@@ -537,6 +571,7 @@ static int prepare_repo_cmd(struct cgit_context *ctx)
 	}
 	sort_string_list(&ctx->repo->submodules);
 	cgit_prepare_repo_env(ctx->repo);
+	choose_readme(ctx->repo);
 	return 0;
 }