| Age | Commit message (Collapse) | Author | Lines |
|
A module-link template takes the path as the tree names it, so a path
holding a space or a byte past ASCII gave an href that broke there. The
url is now encoded the way a clone url is.
|
|
The plain, snapshot and blob pages sent a name such as café.txt raw in
filename, which a client may read as ISO-8859-1. RFC 6266 has such a
name sent again as filename*, percent-encoded in UTF-8, for a client
that knows the form, with filename first for one that does not. The
extended form carries UTF-8 alone, so a name that is not valid UTF-8
keeps the plain filename by itself.
|
|
An href carried git://example.org/dépôt.git as it was, and the space
of "with space" too, neither of which a url may hold. html_url_path
would also encode the plus of git+ssh, which breaks the scheme, and the
percent of an escape the url was written with, so a whole url gets a
helper that encodes only the bytes RFC 3986 allows nowhere.
|
|
The shared repository "with space" listed git://example.org/with and
space.git as two clone urls, and the head linked the first alone. The
manual calls clone-url a list of templates, so the list is now split
before each template is expanded. A clone-prefix was right already, as
the url is joined to it after the split.
|
|
The query parser takes an offset as low as -1, which the stats page
reads as every author, so the index clamps it for itself, as the log
and refs pages already do.
|
|
Git's build swaps in an fopen that refuses a directory, but only where
it defines FREAD_READS_DIRECTORIES, and not every system's build does.
There a directory opened, and only a failed read(2) reported it. POSIX
leaves that failure to the system, and one that read the raw entries
would have parsed them as settings.
|
|
A value cgit does not know as a period turns the statistics page off,
so a typo such as "decade" read the same as leaving stats off on
purpose. The empty value stays quiet because a cached repolist writes
it for a repository that turned stats off.
|
|
git's read_mailmap_blob inflates the whole blob, so a pusher could make
every page of a repository read as much as they liked. git reads a
note and the .gitmodules file whole as well, and capping those would
mean bounding the lookups where the log, commit and tree pages make
them, so the manual names them instead. Nothing tested that
mailmap.file and mailmap.blob are ignored either.
|
|
A followed diff kept every path that started with the requested one,
so following small.c took small.cpp in as well. A path now has to be
the requested one or lie below it, as the pathspec of an unfollowed
diff matches.
|
|
With follow set the diff runs over the whole commit and show_filepair
applies the path, so the header read (limited to '') whether or not a
path was given.
|
|
The listing judges binary by the first 8000 bytes, as git does, while
the blame page and the file view look for a NUL anywhere, since one
past that window would end a Lua filter's output early. The listing
keeps the cheap sniff, because the whole-blob check would inflate
every blob it names, so a file whose NUL lies past the window gets a
blame link that ends on "Blob is binary". The test pins that trade, so
a change to either side has to face it.
|
|
It scrolls sideways like the hex dump, with nothing inside a keyboard
can reach, so it takes focus and the shared focus ring the same way.
|
|
|
|
Chrome and Firefox already let an overflowing box take focus, with
their own ring, but WebKit does not. The table takes focus on a mouse
click as well, where focus-visible keeps the ring off.
|
|
The file view's table only sets the line numbers beside the code, and
the unified diff's is a single cell holding every file.
|
|
|
|
LuaJIT and Lua 5.1 leave print's line in stdio's buffer until cgit
exits, after the end of the page.
|
|
|
|
cgit.conf was read only after Git's Makefile, which had already settled
NO_REGEX and the other options it tests as it read them, so setting one
there changed nothing in Git's part of the build. The second read stays
for the defaults Git assigns outright, such as CC and CFLAGS. A "+="
there now appends twice to a variable nothing resets in between, such
as CGIT_CFLAGS, which only repeats the flag.
|
|
|
|
A scanned repository is read back from the cached list under the global
settings, so a setting that only differed from them by being off, or by
naming the default value, came back as the global one. branch-sort was
written only for age, per-path module links not at all, and a filter a
repository turned off left no line behind.
Writing an empty value for a filter turned off makes the list depend on
whether each global filter is set, so the scan key names that too.
|
|
The cached list wrote "[no description]" like any other description,
so once read back it no longer counted as the placeholder and became
the meta description of every repository without one. Repositories
read back from the list are also marked as having had their
description file read, since the scan already did, so the index does
not open those files again on every request.
|
|
The page cache counts a cache-size of 0 or less as off, but scan-path
cached its list for any value other than 0, so a negative one still
wrote a list into cache-root.
|
|
|
|
The login page stands in for any page of the repository, so it named
the description and owner of one the visitor may not see, including
one hidden from the index. The site's own description fills the
line, as on the index, so the header keeps its height.
|
|
|
|
|
|
|
|
The tree page read the gitlink's commit as a blob, which outside the
repository is a bad object id and inside it is the commit's raw text.
|
|
|
|
The config error page had a title of its own, in the reverse order,
and now takes the same one as any other 404, since its message
already says the repository failed to open.
|
|
The link named only id, so for a diff between two commits it led to
a patch of the newer one alone, and without an id it lost the branch
as well and led to the default branch's tip.
|
|
The blame page answers 404 for a symlink, since git blames a regular
file alone, and it refuses a binary file and one past max-blob-size,
yet a tree listing offered blame for all of them, and so did a
symlink's own page. Each row already knows its size, and git calls a
file binary by its first 8000 bytes alone, which a stream reads
without inflating the rest. With blame on, a listing of 2,000
delta-packed files went from about 11 to 15 ms.
|
|
|
|
|
|
|
|
The snapshot page refuses to work a revision out of a name holding a
slash, since that name becomes the top directory of the archive, so
every link for a ref like release/2.0 answered 404. The ref now goes
in the link as the id, and the archive unpacks into the repository's
own prefix, as any snapshot asked for by id does.
|
|
A diff limited to the new name cannot see the old one, so the
diffstat's link for a renamed file, the commit page reached from that
file's log, and the file's rawdiff and patch all showed every line as
added. A path the old tree lacks is now diffed across the whole commit
with rename detection aimed at it alone, the way git blame looks for a
rename, so it is compared with the commit's deleted files and nothing
else. Doing it in cgit_diff_tree keeps the log's counts for that commit
in step with the page they link to.
The rawdiff and patch pages leave the diff to git's own output, so for
them that search finds the old name, and both names go into the limit
with rename detection on.
|
|
A LUA_PKGCONFIG that pkg-config could not resolve, with no LUA_LIBS or
LUA_CFLAGS given, still claimed to link with it and then failed on
lua.h, and a build that found no pkg-config dropped Lua with no hint
of why. A warning rather than an error lets the build go on, since
flags supplied another way, such as CGIT_LIBS in cgit.conf, may still
make it link.
|
|
The 404 page names only the repository and nothing reached the log, so
a mistyped repo.path left no trace of the path cgit had tried.
|
|
Only a scanned repository fell back to its description file, so one
listed in cgitrc without repo.desc showed "[no description]" however
its file read. repo.desc may follow repo.path, so the file is read
where a page shows the description, which also spares every other
request the reads.
|
|
atoi reads "yes" or "true" as 0, so repo.hide=yes, or cgit.hide true
in a scanned repository's git config, silently did nothing. The values
keep that meaning, since honouring them now would hide repositories on
upgrade, but each one is logged with its file and line.
|
|
A missing or unreadable cgitrc left only "No repositories found" and an
empty log, the commonest first mistake with no trace of its cause. A
scanned repository's own cgitrc stays quiet, since most have none.
|
|
"The cache" promises that a negative ttl never expires, but no age was
ever below a negative cache-scan-ttl, so every request started a
background rescan.
|
|
readdir hands entries back in whatever order the filesystem keeps
them, so proj111 could come before proj105 and a section could start
twice. section-sort is off by default to keep the order written in
cgitrc, and a scan has none to keep.
|
|
Two cgitrc files sharing a cache-root read one list, so strict-export
and trust-scan-config set in one applied to the other, and a changed
setting stayed stale until the list expired. The first request after
an upgrade scans again, and the files under the old names are never
read.
|
|
getpwuid leaves errno alone for a uid with no passwd entry, so a scan
logged "Unable to read the owner" with "Success" as the reason for each
repository such a uid owns.
|
|
|
|
release_revisions frees revs->mailmap, and the log page points it at the
static list cgit_mailmap returns, so every log of a repository with
enable-mailmap aborted. A walk whose setup failed holds commits that are
already freed, so releasing it could free them twice.
|
|
|