Fix display of submodules in directory listing
Refactor directory listing code
This commit is contained in:
parent
e06adbbeb9
commit
4a7a591fe4
1
cgit.mk
1
cgit.mk
@ -99,6 +99,7 @@ CGIT_OBJ_NAMES += themed/themed.o
|
||||
CGIT_OBJ_NAMES += themed/mincrypt_sha256.o
|
||||
|
||||
CGIT_THEMED_INPUTS += $(CGIT_PREFIX)themed/base.html
|
||||
CGIT_THEMED_INPUTS += $(CGIT_PREFIX)themed/tree_common.html
|
||||
CGIT_THEMED_INPUTS += $(CGIT_PREFIX)themed/index.html
|
||||
CGIT_THEMED_INPUTS += $(CGIT_PREFIX)themed/commit.html
|
||||
CGIT_THEMED_INPUTS += $(CGIT_PREFIX)themed/diff.html
|
||||
|
@ -1,32 +1,8 @@
|
||||
{! #include "../ui-blob.h" !}
|
||||
|
||||
{% block ls_item_impl(const struct object_id *oid, struct strbuf *base, const char *pathname, unsigned mode, void *cbdata) %}
|
||||
{!
|
||||
unsigned long size = 0;
|
||||
if (!S_ISGITLINK(mode)) {
|
||||
oid_object_info(the_repository, oid, &size);
|
||||
}
|
||||
!}
|
||||
<div class="pl-3 pr-1 py-2 border-t border-gray-300">
|
||||
{% if S_ISDIR(mode) %}
|
||||
{# Heroicons solid folder #}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="size-5 text-blue-400 mt-[0.1rem]"><path d="M19.5 21a3 3 0 0 0 3-3v-4.5a3 3 0 0 0-3-3h-15a3 3 0 0 0-3 3V18a3 3 0 0 0 3 3h15ZM1.5 10.146V6a3 3 0 0 1 3-3h5.379a2.25 2.25 0 0 1 1.59.659l2.122 2.121c.14.141.331.22.53.22H19.5a3 3 0 0 1 3 3v1.146A4.483 4.483 0 0 0 19.5 9h-15a4.483 4.483 0 0 0-3 1.146Z" /></svg>
|
||||
{% else %}
|
||||
{# Heroicons outline document #}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-5 text-gray-500 mt-[0.1rem]"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z" /></svg>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="pr-3 py-2 border-t border-gray-300">
|
||||
<a href="{! cgit_shared_reporevlink_url("tree", ctx.qry.head, ctx.qry.oid, pathname); !}" class="hover:text-blue-600 hover:underline">
|
||||
{{ pathname }}
|
||||
</a>
|
||||
</div>
|
||||
<div class="pr-3 py-2 border-t border-gray-300 text-gray-500 font-mono">{! cgit_print_filemode(mode); !}</div>
|
||||
<div class="pr-3 py-2 border-t border-gray-300 text-gray-500 text-end">{% if !S_ISDIR(mode) %}{{ size|%ld }}{% endif %}</div>
|
||||
{% endblock %}
|
||||
{!
|
||||
int ls_item(const struct object_id *oid, struct strbuf *base, const char *pathname, unsigned mode, void *cbdata) {
|
||||
ls_item_impl(oid, base, pathname, mode, cbdata);
|
||||
tree_listing_item(oid, base, pathname, mode, true); /* from tree_common.html */
|
||||
return 0;
|
||||
}
|
||||
!}
|
||||
|
@ -17,35 +17,6 @@
|
||||
</nav>
|
||||
<div class="grid grid-cols-[auto_1fr_auto_auto] border border-gray-300 rounded-md mb-4">
|
||||
{% endblock %}
|
||||
{% block tree_content_directory_item(const struct object_id *oid, struct strbuf *base, const char *pathname, unsigned mode, int child_idx) %}
|
||||
{# Directory listing entry #}
|
||||
{!
|
||||
unsigned long size = 0;
|
||||
if (!S_ISGITLINK(mode)) {
|
||||
oid_object_info(the_repository, oid, &size);
|
||||
}
|
||||
|
||||
struct strbuf fullpath = STRBUF_INIT;
|
||||
strbuf_addf(&fullpath, "%s%s", base->buf, pathname);
|
||||
!}
|
||||
<div class="pl-3 pr-1 py-2{% if child_idx > 0 %} border-t border-gray-300{% endif %}">
|
||||
{% if S_ISDIR(mode) %}
|
||||
{# Heroicons solid folder #}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="size-5 text-blue-400 mt-[0.1rem]"><path d="M19.5 21a3 3 0 0 0 3-3v-4.5a3 3 0 0 0-3-3h-15a3 3 0 0 0-3 3V18a3 3 0 0 0 3 3h15ZM1.5 10.146V6a3 3 0 0 1 3-3h5.379a2.25 2.25 0 0 1 1.59.659l2.122 2.121c.14.141.331.22.53.22H19.5a3 3 0 0 1 3 3v1.146A4.483 4.483 0 0 0 19.5 9h-15a4.483 4.483 0 0 0-3 1.146Z" /></svg>
|
||||
{% else %}
|
||||
{# Heroicons outline document #}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-5 text-gray-500 mt-[0.1rem]"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z" /></svg>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="pr-3 py-2{% if child_idx > 0 %} border-t border-gray-300{% endif %}">
|
||||
<a href="{! cgit_shared_reporevlink_url("tree", ctx.qry.head, ctx.qry.oid, fullpath.buf); !}" class="hover:text-blue-600 hover:underline">
|
||||
{{ pathname }}
|
||||
</a>
|
||||
</div>
|
||||
<div class="pr-3 py-2{% if child_idx > 0 %} border-t border-gray-300{% endif %} text-gray-500 font-mono">{! cgit_print_filemode(mode); !}</div>
|
||||
<div class="pr-3 py-2{% if child_idx > 0 %} border-t border-gray-300{% endif %} text-gray-500 text-end">{% if !S_ISDIR(mode) %}{{ size|%ld }}{% endif %}</div>
|
||||
{! strbuf_release(&fullpath); !}
|
||||
{% endblock %}
|
||||
{% block tree_content_directory_footer %}
|
||||
{# Footer for directory listing #}
|
||||
</div>
|
||||
@ -112,8 +83,14 @@
|
||||
if (strcmp(walk_tree_ctx->match_path, buffer.buf)) {
|
||||
// Not the target path, so continue to walk the tree
|
||||
strbuf_release(&buffer);
|
||||
|
||||
if (S_ISGITLINK(mode)) {
|
||||
// Never recurse into submodules
|
||||
return 0;
|
||||
} else {
|
||||
return READ_TREE_RECURSIVE;
|
||||
}
|
||||
}
|
||||
|
||||
// This is the target path
|
||||
if (S_ISDIR(mode)) {
|
||||
@ -140,7 +117,7 @@
|
||||
strbuf_addstr(&buffer, "/");
|
||||
|
||||
if (!strcmp(buffer.buf, base->buf)) {
|
||||
tree_content_directory_item(oid, base, pathname, mode, walk_tree_ctx->directory_child_idx);
|
||||
tree_listing_item(oid, base, pathname, mode, walk_tree_ctx->directory_child_idx > 0);
|
||||
walk_tree_ctx->directory_child_idx++;
|
||||
}
|
||||
strbuf_release(&buffer);
|
||||
|
46
themed/tree_common.html
Normal file
46
themed/tree_common.html
Normal file
@ -0,0 +1,46 @@
|
||||
{% block tree_listing_item(const struct object_id *oid, struct strbuf *base, const char *pathname, unsigned mode, bool border_above) %}
|
||||
{# Directory listing entry #}
|
||||
{!
|
||||
unsigned long size = 0;
|
||||
if (!S_ISGITLINK(mode)) {
|
||||
oid_object_info(the_repository, oid, &size);
|
||||
}
|
||||
|
||||
struct strbuf fullpath = STRBUF_INIT;
|
||||
strbuf_addf(&fullpath, "%s%s", base->buf, pathname);
|
||||
!}
|
||||
<div class="pl-3 pr-1 py-2{% if border_above %} border-t border-gray-300{% endif %}">
|
||||
{# File icon #}
|
||||
{% if S_ISGITLINK(mode) %}
|
||||
{# Heroicons solid folder #}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="size-5 text-gray-500 mt-[0.1rem]"><path d="M19.5 21a3 3 0 0 0 3-3v-4.5a3 3 0 0 0-3-3h-15a3 3 0 0 0-3 3V18a3 3 0 0 0 3 3h15ZM1.5 10.146V6a3 3 0 0 1 3-3h5.379a2.25 2.25 0 0 1 1.59.659l2.122 2.121c.14.141.331.22.53.22H19.5a3 3 0 0 1 3 3v1.146A4.483 4.483 0 0 0 19.5 9h-15a4.483 4.483 0 0 0-3 1.146Z" /></svg>
|
||||
{% elif S_ISDIR(mode) %}
|
||||
{# Heroicons solid folder #}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="size-5 text-blue-400 mt-[0.1rem]"><path d="M19.5 21a3 3 0 0 0 3-3v-4.5a3 3 0 0 0-3-3h-15a3 3 0 0 0-3 3V18a3 3 0 0 0 3 3h15ZM1.5 10.146V6a3 3 0 0 1 3-3h5.379a2.25 2.25 0 0 1 1.59.659l2.122 2.121c.14.141.331.22.53.22H19.5a3 3 0 0 1 3 3v1.146A4.483 4.483 0 0 0 19.5 9h-15a4.483 4.483 0 0 0-3 1.146Z" /></svg>
|
||||
{% else %}
|
||||
{# Heroicons outline document #}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-5 text-gray-500 mt-[0.1rem]"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z" /></svg>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="pr-3 py-2{% if border_above %} border-t border-gray-300{% endif %}">
|
||||
{# File name and link #}
|
||||
{% if S_ISGITLINK(mode) %}
|
||||
{! cgit_submodule_link("ls-mod", fullpath.buf, pathname, oid_to_hex(oid)); !}
|
||||
{% else %}
|
||||
<a href="{! cgit_shared_reporevlink_url("tree", ctx.qry.head, ctx.qry.oid, fullpath.buf); !}" class="hover:text-blue-600 hover:underline">
|
||||
{{ pathname }}
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="pr-3 py-2{% if border_above %} border-t border-gray-300{% endif %} text-gray-500 font-mono">
|
||||
{# Mode #}
|
||||
{! cgit_print_filemode(mode); !}
|
||||
</div>
|
||||
<div class="pr-3 py-2{% if border_above %} border-t border-gray-300{% endif %} text-gray-500 text-end">
|
||||
{# File size #}
|
||||
{% if !S_ISGITLINK(mode) && !S_ISDIR(mode) %}
|
||||
{{ size|%ld }}
|
||||
{% endif %}
|
||||
</div>
|
||||
{! strbuf_release(&fullpath); !}
|
||||
{% endblock %}
|
@ -118,7 +118,7 @@ static void print_dir_entry(const struct object_id *oid, const char *base,
|
||||
fullpath[strlen(fullpath) - 1] = 0;
|
||||
html(" <li>");
|
||||
if (S_ISGITLINK(mode)) {
|
||||
cgit_submodule_link(NULL, fullpath, oid_to_hex(oid));
|
||||
cgit_submodule_link(NULL, fullpath, NULL, oid_to_hex(oid));
|
||||
} else
|
||||
cgit_plain_link(path, NULL, NULL, ctx.qry.head, ctx.qry.oid,
|
||||
fullpath);
|
||||
|
@ -675,7 +675,7 @@ static struct string_list_item *lookup_path(struct string_list *list,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void cgit_submodule_link(const char *class, char *path, const char *rev)
|
||||
void cgit_submodule_link(const char *class, char *path, const char *display_name, const char *rev)
|
||||
{
|
||||
struct string_list *list;
|
||||
struct string_list_item *item;
|
||||
@ -710,14 +710,14 @@ void cgit_submodule_link(const char *class, char *path, const char *rev)
|
||||
html_attrf(ctx.repo->module_link, dir, rev);
|
||||
}
|
||||
html("'>");
|
||||
html_txt(path);
|
||||
html_txt(display_name ? display_name : path);
|
||||
html("</a>");
|
||||
} else {
|
||||
html("<span");
|
||||
if (class)
|
||||
htmlf(" class='%s'", class);
|
||||
html(">");
|
||||
html_txt(path);
|
||||
html_txt(display_name ? display_name : path);
|
||||
html("</span>");
|
||||
}
|
||||
html_txtf(" @ %.7s", rev);
|
||||
|
@ -62,7 +62,7 @@ extern void cgit_stats_link(const char *name, const char *title,
|
||||
extern void cgit_object_link(struct object *obj);
|
||||
|
||||
extern void cgit_submodule_link(const char *class, char *path,
|
||||
const char *rev);
|
||||
const char *display_name, const char *rev);
|
||||
|
||||
extern void cgit_print_layout_start(void);
|
||||
extern void cgit_print_layout_end(void);
|
||||
|
@ -240,7 +240,7 @@ static int ls_item(const struct object_id *oid, struct strbuf *base,
|
||||
cgit_print_filemode(mode);
|
||||
html("</td><td>");
|
||||
if (S_ISGITLINK(mode)) {
|
||||
cgit_submodule_link("ls-mod", fullpath.buf, oid_to_hex(oid));
|
||||
cgit_submodule_link("ls-mod", fullpath.buf, NULL, oid_to_hex(oid));
|
||||
} else if (S_ISDIR(mode)) {
|
||||
write_tree_link(oid, name, walk_tree_ctx->curr_rev,
|
||||
&fullpath);
|
||||
|
Loading…
x
Reference in New Issue
Block a user