summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--ui-tree.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/ui-tree.c b/ui-tree.c
index 79332fc..e27e796 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -62,96 +62,99 @@ static void print_object(const unsigned char *sha1, char *path)
62 62
63 63
64static int ls_item(const unsigned char *sha1, const char *base, int baselen, 64static int ls_item(const unsigned char *sha1, const char *base, int baselen,
65 const char *pathname, unsigned int mode, int stage, 65 const char *pathname, unsigned int mode, int stage,
66 void *cbdata) 66 void *cbdata)
67{ 67{
68 char *name; 68 char *name;
69 char *fullpath; 69 char *fullpath;
70 enum object_type type; 70 enum object_type type;
71 unsigned long size = 0; 71 unsigned long size = 0;
72 72
73 name = xstrdup(pathname); 73 name = xstrdup(pathname);
74 fullpath = fmt("%s%s%s", ctx.qry.path ? ctx.qry.path : "", 74 fullpath = fmt("%s%s%s", ctx.qry.path ? ctx.qry.path : "",
75 ctx.qry.path ? "/" : "", name); 75 ctx.qry.path ? "/" : "", name);
76 76
77 if (!S_ISGITLINK(mode)) { 77 if (!S_ISGITLINK(mode)) {
78 type = sha1_object_info(sha1, &size); 78 type = sha1_object_info(sha1, &size);
79 if (type == OBJ_BAD) { 79 if (type == OBJ_BAD) {
80 htmlf("<tr><td colspan='3'>Bad object: %s %s</td></tr>", 80 htmlf("<tr><td colspan='3'>Bad object: %s %s</td></tr>",
81 name, 81 name,
82 sha1_to_hex(sha1)); 82 sha1_to_hex(sha1));
83 return 0; 83 return 0;
84 } 84 }
85 } 85 }
86 86
87 html("<tr><td class='ls-mode'>"); 87 html("<tr><td class='ls-mode'>");
88 cgit_print_filemode(mode); 88 cgit_print_filemode(mode);
89 html("</td><td>"); 89 html("</td><td>");
90 if (S_ISGITLINK(mode)) { 90 if (S_ISGITLINK(mode)) {
91 htmlf("<a class='ls-mod' href='"); 91 htmlf("<a class='ls-mod' href='");
92 html_attr(fmt(ctx.repo->module_link, 92 html_attr(fmt(ctx.repo->module_link,
93 name, 93 name,
94 sha1_to_hex(sha1))); 94 sha1_to_hex(sha1)));
95 html("'>"); 95 html("'>");
96 html_txt(name); 96 html_txt(name);
97 html("</a>"); 97 html("</a>");
98 } else if (S_ISDIR(mode)) { 98 } else if (S_ISDIR(mode)) {
99 cgit_tree_link(name, NULL, "ls-dir", ctx.qry.head, 99 cgit_tree_link(name, NULL, "ls-dir", ctx.qry.head,
100 curr_rev, fullpath); 100 curr_rev, fullpath);
101 } else { 101 } else {
102 cgit_tree_link(name, NULL, "ls-blob", ctx.qry.head, 102 cgit_tree_link(name, NULL, "ls-blob", ctx.qry.head,
103 curr_rev, fullpath); 103 curr_rev, fullpath);
104 } 104 }
105 htmlf("</td><td class='ls-size'>%li</td>", size); 105 htmlf("</td><td class='ls-size'>%li</td>", size);
106 106
107 html("<td>"); 107 html("<td>");
108 cgit_log_link("log", NULL, "button", ctx.qry.head, curr_rev, 108 cgit_log_link("log", NULL, "button", ctx.qry.head, curr_rev,
109 fullpath, 0, NULL, NULL); 109 fullpath, 0, NULL, NULL);
110 if (ctx.repo->max_stats)
111 cgit_stats_link("stats", NULL, "button", ctx.qry.head,
112 fullpath);
110 html("</td></tr>\n"); 113 html("</td></tr>\n");
111 free(name); 114 free(name);
112 return 0; 115 return 0;
113} 116}
114 117
115static void ls_head() 118static void ls_head()
116{ 119{
117 html("<table summary='tree listing' class='list'>\n"); 120 html("<table summary='tree listing' class='list'>\n");
118 html("<tr class='nohover'>"); 121 html("<tr class='nohover'>");
119 html("<th class='left'>Mode</th>"); 122 html("<th class='left'>Mode</th>");
120 html("<th class='left'>Name</th>"); 123 html("<th class='left'>Name</th>");
121 html("<th class='right'>Size</th>"); 124 html("<th class='right'>Size</th>");
122 html("<th/>"); 125 html("<th/>");
123 html("</tr>\n"); 126 html("</tr>\n");
124 header = 1; 127 header = 1;
125} 128}
126 129
127static void ls_tail() 130static void ls_tail()
128{ 131{
129 if (!header) 132 if (!header)
130 return; 133 return;
131 html("</table>\n"); 134 html("</table>\n");
132 header = 0; 135 header = 0;
133} 136}
134 137
135static void ls_tree(const unsigned char *sha1, char *path) 138static void ls_tree(const unsigned char *sha1, char *path)
136{ 139{
137 struct tree *tree; 140 struct tree *tree;
138 141
139 tree = parse_tree_indirect(sha1); 142 tree = parse_tree_indirect(sha1);
140 if (!tree) { 143 if (!tree) {
141 cgit_print_error(fmt("Not a tree object: %s", 144 cgit_print_error(fmt("Not a tree object: %s",
142 sha1_to_hex(sha1))); 145 sha1_to_hex(sha1)));
143 return; 146 return;
144 } 147 }
145 148
146 ls_head(); 149 ls_head();
147 read_tree_recursive(tree, "", 0, 1, NULL, ls_item, NULL); 150 read_tree_recursive(tree, "", 0, 1, NULL, ls_item, NULL);
148 ls_tail(); 151 ls_tail();
149} 152}
150 153
151 154
152static int walk_tree(const unsigned char *sha1, const char *base, int baselen, 155static int walk_tree(const unsigned char *sha1, const char *base, int baselen,
153 const char *pathname, unsigned mode, int stage, 156 const char *pathname, unsigned mode, int stage,
154 void *cbdata) 157 void *cbdata)
155{ 158{
156 static int state; 159 static int state;
157 static char buffer[PATH_MAX]; 160 static char buffer[PATH_MAX];