summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOscar Benedito <oscar@oscarbenedito.com>2020-09-10 17:42:18 +0200
committerOscar Benedito <oscar@oscarbenedito.com>2020-09-10 19:23:55 +0200
commitd833220215f924e6b165a949640af450975fb3af (patch)
tree3fd9276ad80768ee11aa155c28f7cf3458329997
parentecd0f6fb42cc6ca1ed4d9756a1e1cd4f04f8df0a (diff)
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.
-rw-r--r--stagit.c38
-rw-r--r--style.css5
2 files changed, 40 insertions, 3 deletions
diff --git a/stagit.c b/stagit.c
index f33431d..bcd5002 100644
--- 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
index b9614b4..2544e84 100644
--- 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;
}