summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.css27
-rwxr-xr-xtests/t0104-tree.sh4
-rw-r--r--ui-tree.c31
3 files changed, 34 insertions, 28 deletions
diff --git a/cgit.css b/cgit.css
index 7928c2f..068c37b 100644
--- a/cgit.css
+++ b/cgit.css
@@ -223,52 +223,57 @@ a.ls-blob, a.ls-dir, a.ls-mod {
td.ls-size {
text-align: right;
font-family: monospace;
width: 10em;
}
td.ls-mode {
font-family: monospace;
width: 10em;
}
table.blob {
margin-top: 0.5em;
border-top: solid 1px black;
}
-table.blob td.no {
- border-right: solid 1px black;
+table.blob td.lines {
+ margin: 0; padding: 0;
+ vertical-align: top;
color: black;
+}
+
+table.blob td.linenumbers {
+ margin: 0; padding: 0;
+ vertical-align: top;
+ border-right: 1px solid gray;
background-color: #eee;
- text-align: right;
}
-table.blob td.no a {
- color: black;
+table.blob pre {
+ padding: 0; margin: 0;
}
-table.blob td.no a:hover {
- color: black;
+table.blob a.no {
+ color: gray;
+ text-align: right;
text-decoration: none;
}
-table.blob td.txt {
- white-space: pre;
- font-family: monospace;
- padding-left: 0.5em;
+table.blob a.no a:hover {
+ color: black;
}
table.nowrap td {
white-space: nowrap;
}
table.commit-info {
border-collapse: collapse;
margin-top: 1.5em;
}
table.commit-info th {
text-align: left;
font-weight: normal;
padding: 0.1em 1em 0.1em 0.1em;
vertical-align: top;
diff --git a/tests/t0104-tree.sh b/tests/t0104-tree.sh
index 33f4eb0..2ce1251 100755
--- a/tests/t0104-tree.sh
+++ b/tests/t0104-tree.sh
@@ -1,33 +1,33 @@
#!/bin/sh
. ./setup.sh
prepare_tests "Check content on tree page"
run_test 'generate bar/tree' 'cgit_url "bar/tree" >trash/tmp'
run_test 'find file-1' 'grep -e "file-1" trash/tmp'
run_test 'find file-50' 'grep -e "file-50" trash/tmp'
run_test 'generate bar/tree/file-50' 'cgit_url "bar/tree/file-50" >trash/tmp'
run_test 'find line 1' '
- grep -e "<a id=.n1. name=.n1. href=.#n1.>1</a>" trash/tmp
+ grep -e "<a class=.no. id=.n1. name=.n1. href=.#n1.>1</a>" trash/tmp
'
run_test 'no line 2' '
- ! grep -e "<a id=.n2. name=.n2. href=.#n2.>2</a>" trash/tmp
+ ! grep -e "<a class=.no. id=.n2. name=.n2. href=.#n2.>2</a>" trash/tmp
'
run_test 'generate foo+bar/tree' 'cgit_url "foo%2bbar/tree" >trash/tmp'
run_test 'verify a+b link' '
grep -e "/foo+bar/tree/a+b" trash/tmp
'
run_test 'generate foo+bar/tree?h=1+2' 'cgit_url "foo%2bbar/tree&h=1%2b2" >trash/tmp'
run_test 'verify a+b?h=1+2 link' '
grep -e "/foo+bar/tree/a+b?h=1%2b2" trash/tmp
'
tests_done
diff --git a/ui-tree.c b/ui-tree.c
index 9876c99..2a8625c 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -5,73 +5,74 @@
* Licensed under GNU General Public License v2
* (see COPYING for full license text)
*/
#include "cgit.h"
#include "html.h"
#include "ui-shared.h"
char *curr_rev;
char *match_path;
int header = 0;
static void print_object(const unsigned char *sha1, char *path)
{
enum object_type type;
char *buf;
- unsigned long size, lineno, start, idx;
- const char *linefmt = "<tr><td class='no'><a id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a></td><td class='txt'>";
+ unsigned long size, lineno, idx;
+ const char *numberfmt = "<a class='no' id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a>\n";
type = sha1_object_info(sha1, &size);
if (type == OBJ_BAD) {
cgit_print_error(fmt("Bad object name: %s",
sha1_to_hex(sha1)));
return;
}
buf = read_sha1_file(sha1, &type, &size);
if (!buf) {
cgit_print_error(fmt("Error reading object %s",
sha1_to_hex(sha1)));
return;
}
html(" (");
cgit_plain_link("plain", NULL, NULL, ctx.qry.head,
curr_rev, path);
- htmlf(")<br/>blob: %s", sha1_to_hex(sha1));
+ htmlf(")<br/>blob: %s\n", sha1_to_hex(sha1));
html("<table summary='blob content' class='blob'>\n");
+ html("<tr>\n");
+
+ html("<td class='linenumbers'><pre>");
idx = 0;
- start = 0;
lineno = 0;
- while(idx < size) {
+ htmlf(numberfmt, ++lineno);
+ while(idx < size - 1) { // skip absolute last newline
if (buf[idx] == '\n') {
- buf[idx] = '\0';
- htmlf(linefmt, ++lineno);
- html_txt(buf + start);
- html("</td></tr>\n");
- start = idx + 1;
+ htmlf(numberfmt, ++lineno);
}
idx++;
}
- if (start < idx) {
- htmlf(linefmt, ++lineno);
- html_txt(buf + start);
- }
- html("</td></tr>\n");
+ html("</pre></td>\n");
+
+ html("<td class='lines'><pre><code>");
+ html_txt(buf);
+ html("</code></pre></td>\n");
+
+ html("</tr>\n");
html("</table>\n");
}
static int ls_item(const unsigned char *sha1, const char *base, int baselen,
const char *pathname, unsigned int mode, int stage,
void *cbdata)
{
char *name;
char *fullpath;
enum object_type type;
unsigned long size = 0;
name = xstrdup(pathname);
fullpath = fmt("%s%s%s", ctx.qry.path ? ctx.qry.path : "",
ctx.qry.path ? "/" : "", name);