detect name and description - stagit-gopher - A git gopher frontend. (mirror) | |
git clone git://bitreich.org/stagit-gopher/ git://enlrupgkhuxnvlhsf6lc3fziv5h2h… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
commit 3872d9e902722b0c85c7f5c6ef8975389167e7d9 | |
parent 7294b10b65ff8a91bd330108af98441ec4a05307 | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Sat, 5 Dec 2015 20:59:14 +0100 | |
detect name and description | |
Diffstat: | |
M urmoms.c | 82 +++++++++++++++++++++++------… | |
1 file changed, 62 insertions(+), 20 deletions(-) | |
--- | |
diff --git a/urmoms.c b/urmoms.c | |
@@ -1,4 +1,5 @@ | |
#include <err.h> | |
+#include <libgen.h> | |
#include <limits.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
@@ -8,12 +9,11 @@ | |
static git_repository *repo; | |
-static const char *relpath = ""; | |
-static const char *name = ""; | |
-static const char *description = ""; | |
- | |
+static const char *relpath; | |
static const char *repodir = "."; | |
+static char name[255]; | |
+static char description[255]; | |
static int hasreadme, haslicense; | |
FILE * | |
@@ -28,6 +28,41 @@ efopen(const char *name, const char *flags) | |
return fp; | |
} | |
+void | |
+concat(FILE *fp1, FILE *fp2) | |
+{ | |
+ char buf[BUFSIZ]; | |
+ size_t n; | |
+ | |
+ while ((n = fread(buf, 1, sizeof(buf), fp1))) { | |
+ fwrite(buf, 1, n, fp2); | |
+ | |
+ if (feof(fp1) || ferror(fp1) || ferror(fp2)) | |
+ break; | |
+ } | |
+} | |
+ | |
+/* Some implementations of basename(3) return a pointer to a static | |
+ * internal buffer (OpenBSD). Others modify the contents of `path` (POSIX). | |
+ * This is a wrapper function that is compatible with both versions. | |
+ * The program will error out if basename(3) failed, this can only happen | |
+ * with the OpenBSD version. */ | |
+char * | |
+xbasename(const char *path) | |
+{ | |
+ char *p, *b; | |
+ | |
+ if (!(p = strdup(path))) | |
+ err(1, "strdup"); | |
+ if (!(b = basename(p))) | |
+ err(1, "basename"); | |
+ if (!(b = strdup(b))) | |
+ err(1, "strdup"); | |
+ free(p); | |
+ | |
+ return b; | |
+} | |
+ | |
static void | |
printtime(FILE *fp, const git_time * intime, const char *prefix) | |
{ | |
@@ -98,7 +133,7 @@ writeheader(FILE *fp) | |
"<html dir=\"ltr\" lang=\"en\"><head>" | |
"<meta http-equiv=\"Content-Type\" content=\"text/html; charse… | |
"<meta http-equiv=\"Content-Language\" content=\"en\" />"); | |
- fprintf(fp, "<title>%s - %s</title>", name, description); | |
+ fprintf(fp, "<title>%s%s%s</title>", name, description[0] ? " - " : ""… | |
fprintf(fp, "<link rel=\"stylesheet\" type=\"text/css\" href=\"style.c… | |
"</head><body><center>"); | |
fprintf(fp, "<h1><img src=\"%slogo.png\" alt=\"\" /> %s</h1>", relpath… | |
@@ -187,26 +222,12 @@ writebranches(FILE *fp) | |
} | |
#endif | |
-void | |
-concat(FILE *fp1, FILE *fp2) | |
-{ | |
- char buf[BUFSIZ]; | |
- size_t n; | |
- | |
- while ((n = fread(buf, 1, sizeof(buf), fp1))) { | |
- fwrite(buf, 1, n, fp2); | |
- | |
- if (feof(fp1) || ferror(fp1) || ferror(fp2)) | |
- break; | |
- } | |
-} | |
- | |
int | |
main(int argc, char *argv[]) | |
{ | |
const git_error *e = NULL; | |
FILE *fp, *fpread; | |
- char path[PATH_MAX]; | |
+ char path[PATH_MAX], *p; | |
int status; | |
if (argc != 2) { | |
@@ -223,6 +244,26 @@ main(int argc, char *argv[]) | |
exit(status); | |
} | |
+ /* use directory name as name */ | |
+ p = xbasename(repodir); | |
+ snprintf(name, sizeof(name), "%s", p); | |
+ free(p); | |
+ | |
+ /* read description or .git/description */ | |
+ snprintf(path, sizeof(path), "%s%s%s", | |
+ repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "descript… | |
+ if (!(fpread = fopen(path, "r+b"))) { | |
+ snprintf(path, sizeof(path), "%s%s%s", | |
+ repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "… | |
+ fpread = fopen(path, "r+b"); | |
+ } | |
+ if (fpread) { | |
+ if (!fgets(description, sizeof(description), fpread)) | |
+ description[0] = '\0'; | |
+ fclose(fpread); | |
+ } | |
+ | |
+ /* read LICENSE */ | |
snprintf(path, sizeof(path), "%s%s%s", | |
repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "LICENSE"… | |
if ((fpread = fopen(path, "r+b"))) { | |
@@ -239,6 +280,7 @@ main(int argc, char *argv[]) | |
haslicense = 1; | |
} | |
+ /* read README */ | |
snprintf(path, sizeof(path), "%s%s%s", | |
repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "README"); | |
if ((fpread = fopen(path, "r+b"))) { |