ctucx.git: stagit

ctucx' stagit fork

commit d833220215f924e6b165a949640af450975fb3af
parent ecd0f6fb42cc6ca1ed4d9756a1e1cd4f04f8df0a
Author: Oscar Benedito <oscar@oscarbenedito.com>
Date: Thu, 10 Sep 2020 17:42:18 +0200

Improve directory navigation UX

Current directory path is now shown and navigation to parent directory
has been added. The style for directory entries has changed to
diferentiate from files.
2 files changed, 40 insertions(+), 3 deletions(-)
M
stagit.c
|
38
+++++++++++++++++++++++++++++++++++---
M
style.css
|
5
+++++
diff --git a/stagit.c b/stagit.c
@@ -1020,15 +1020,41 @@ writefilestree(FILE *fp, git_tree *tree, const char *path)
 	git_off_t filesize;
 	FILE *fp_subtree;
 	const char *entryname, *oldrelpath;
-	char filepath[PATH_MAX], rawpath[PATH_MAX], entrypath[PATH_MAX], tmp[PATH_MAX];
+	char filepath[PATH_MAX], rawpath[PATH_MAX], entrypath[PATH_MAX], tmp[PATH_MAX], tmp2[PATH_MAX];
+	char* parent;
 	size_t count, i;
 	int lc, r, rf, ret;
 
+	if (strlen(path) > 0) {
+		fputs("<h2>Directory: ", fp);
+		xmlencode(fp, path, strlen(path));
+		fputs("</h2>\n", fp);
+	}
+
 	fputs("<table id=\"files\"><thead>\n<tr>"
 			"<td><b>Mode</b></td><td><b>Name</b></td>"
 			"<td class=\"num\" align=\"right\"><b>Size</b></td>"
 			"</tr>\n</thead><tbody>\n", fp);
 
+	if (strlen(path) > 0) {
+		if (strlcpy(tmp, path, sizeof(tmp)) >= sizeof(tmp))
+			errx(1, "path truncated: '%s'", path);
+		parent = strrchr(tmp, '/');
+		if (parent == NULL)
+			parent = "files";
+		else {
+			*parent = '\0';
+			parent = strrchr(tmp, '/');
+			if (parent == NULL)
+				parent = tmp;
+			else
+				++parent;
+		}
+		fputs("<tr><td>d---------</td><td><a class=\"dir\" href=\"../", fp);
+		xmlencode(fp, parent, strlen(parent));
+		fputs(".html\">..</a></td><td class=\"num\" align=\"right\"></td></tr>\n", fp);
+	}
+
 	count = git_tree_entrycount(tree);
 	for (i = 0; i < count; i++) {
 		if (!(entry = git_tree_entry_byindex(tree, i)) ||

@@ -1063,7 +1089,10 @@ writefilestree(FILE *fp, git_tree *tree, const char *path)
 				oldrelpath = relpath;
 				relpath = tmp;
 				fp_subtree = efopen(filepath, "w");
-				writeheader(fp_subtree, "Files");
+				strlcpy(tmp2, "Files - ", sizeof(tmp2));
+				if (strlcat(tmp2, entrypath, sizeof(tmp2)) >= sizeof(tmp2))
+					errx(1, "path truncated: '%s'", tmp2);
+				writeheader(fp_subtree, tmp2);
 				/* NOTE: recurses */
 				ret = writefilestree(fp_subtree, (git_tree *)obj,
 				                     entrypath);

@@ -1081,7 +1110,10 @@ writefilestree(FILE *fp, git_tree *tree, const char *path)
 
 			fputs("<tr><td>", fp);
 			fputs(filemode(git_tree_entry_filemode(entry)), fp);
-			fprintf(fp, "</td><td><a href=\"%s", relpath);
+			fputs("</td><td><a ", fp);
+			if (git_object_type(obj) == GIT_OBJ_TREE)
+				fputs("class=\"dir\" ", fp);
+			fprintf(fp, "href=\"%s", relpath);
 			xmlencode(fp, filepath, strlen(filepath));
 			fputs("\">", fp);
 			xmlencode(fp, entryname, strlen(entryname));
diff --git a/style.css b/style.css
@@ -65,6 +65,11 @@ a {
 	margin: 0;
 }
 
+#files .dir {
+	font-weight: bold;
+	text-decoration: none;
+}
+
 .url {
 	font-family: monospace;
 }