summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore5
-rw-r--r--0001-clone-fix-directory-traversal.patch62
-rw-r--r--0001-t0107-support-older-and-or-non-GNU-tar.patch77
-rw-r--r--0001-use-highlight-3-by-default.patch28
-rw-r--r--README-SELinux.md29
-rw-r--r--README.SELinux21
-rw-r--r--cgit-0.9.1-highlightv3.patch13
-rw-r--r--cgit-1.2.3-update-to-git-2.34.1.patch1003
-rw-r--r--cgit.spec299
-rw-r--r--cgitrc69
-rw-r--r--gpgkey-96E07AF25771955980DAD10020D04E5A713660A7.asc144
-rw-r--r--gpgkey-AB9942E6D4A4CFC3412620A749FC7012A5DE03AE.asc446
-rw-r--r--sources6
13 files changed, 2021 insertions, 181 deletions
diff --git a/.gitignore b/.gitignore
index 35ede9f..390a007 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,8 @@
*~
*.rpm
-*.tar.gz
+*.tar.asc
+*.tar.sign
*.tar.xz
-/.build*.log
/cgit-*/
+/gpgkey-*.gpg
/results_cgit/
diff --git a/0001-clone-fix-directory-traversal.patch b/0001-clone-fix-directory-traversal.patch
deleted file mode 100644
index 9f647f2..0000000
--- a/0001-clone-fix-directory-traversal.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From 53efaf30b50f095cad8c160488c74bba3e3b2680 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 3 Aug 2018 15:46:11 +0200
-Subject: [PATCH] clone: fix directory traversal
-
-This was introduced in the initial version of this code, way back when
-in 2008.
-
-$ curl http://127.0.0.1/cgit/repo/objects/?path=../../../../../../../../../etc/passwd
-root:x:0:0:root:/root:/bin/sh
-...
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Reported-by: Jann Horn <jannh@google.com>
----
- ui-clone.c | 23 +++++++++++++++++++----
- 1 file changed, 19 insertions(+), 4 deletions(-)
-
-diff --git a/ui-clone.c b/ui-clone.c
-index 2c1ac3d..6ba8f36 100644
---- a/ui-clone.c
-+++ b/ui-clone.c
-@@ -92,17 +92,32 @@ void cgit_clone_info(void)
-
- void cgit_clone_objects(void)
- {
-- if (!ctx.qry.path) {
-- cgit_print_error_page(400, "Bad request", "Bad request");
-- return;
-- }
-+ char *p;
-+
-+ if (!ctx.qry.path)
-+ goto err;
-
- if (!strcmp(ctx.qry.path, "info/packs")) {
- print_pack_info();
- return;
- }
-
-+ /* Avoid directory traversal by forbidding "..", but also work around
-+ * other funny business by just specifying a fairly strict format. For
-+ * example, now we don't have to stress out about the Cygwin port.
-+ */
-+ for (p = ctx.qry.path; *p; ++p) {
-+ if (*p == '.' && *(p + 1) == '.')
-+ goto err;
-+ if (!isalnum(*p) && *p != '/' && *p != '.' && *p != '-')
-+ goto err;
-+ }
-+
- send_file(git_path("objects/%s", ctx.qry.path));
-+ return;
-+
-+err:
-+ cgit_print_error_page(400, "Bad request", "Bad request");
- }
-
- void cgit_clone_head(void)
---
-2.18.0
-
diff --git a/0001-t0107-support-older-and-or-non-GNU-tar.patch b/0001-t0107-support-older-and-or-non-GNU-tar.patch
new file mode 100644
index 0000000..5a03859
--- /dev/null
+++ b/0001-t0107-support-older-and-or-non-GNU-tar.patch
@@ -0,0 +1,77 @@
+From bd6f5683f6cde4212364354b3139c1d521f40f39 Mon Sep 17 00:00:00 2001
+From: Todd Zullinger <tmz@pobox.com>
+Date: Tue, 29 Dec 2020 14:18:01 -0500
+Subject: tests: t0107: support older and/or non-GNU tar
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The untar tests for various compression algorithms use shortcut options
+from GNU tar to handle decompression. These options may not be provided
+by non-GNU tar nor even by slightly older GNU tar versions which ship on
+many systems.
+
+An example of the latter case is the --zstd option. This was added in
+GNU tar-1.32 (2019-02-23)¹. This version of tar is not provided by
+CentOS/RHEL, in particular. In Debian, --zstd has been backported to
+the tar-1.30 release.
+
+Avoid the requirement on any specific implementations or versions of tar
+by piping decompressed output to tar. This is compatible with older GNU
+tar releases as well as tar implementations from other vendors. (It may
+also be a slight benefit that this more closely matches what the
+snapshot creation code does.)
+
+¹ Technically, the --zstd option was first released in tar-1.31
+ (2019-01-02), but this release was very short-lived and is no longer
+ listed on the GNU Tar release page.
+
+Signed-off-by: Todd Zullinger <tmz@pobox.com>
+Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
+---
+ tests/t0107-snapshot.sh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/tests/t0107-snapshot.sh b/tests/t0107-snapshot.sh
+index 89b9159..0811ec4 100755
+--- a/tests/t0107-snapshot.sh
++++ b/tests/t0107-snapshot.sh
+@@ -25,7 +25,7 @@ test_expect_success 'verify gzip format' '
+
+ test_expect_success 'untar' '
+ rm -rf master &&
+- tar -xzf master.tar.gz
++ gzip -dc master.tar.gz | tar -xf -
+ '
+
+ test_expect_success 'count files' '
+@@ -66,7 +66,7 @@ test_expect_success LZIP 'verify lzip format' '
+
+ test_expect_success LZIP 'untar' '
+ rm -rf master &&
+- tar --lzip -xf master.tar.lz
++ lzip -dc master.tar.lz | tar -xf -
+ '
+
+ test_expect_success LZIP 'count files' '
+@@ -107,7 +107,7 @@ test_expect_success XZ 'verify xz format' '
+
+ test_expect_success XZ 'untar' '
+ rm -rf master &&
+- tar --xz -xf master.tar.xz
++ xz -dc master.tar.xz | tar -xf -
+ '
+
+ test_expect_success XZ 'count files' '
+@@ -148,7 +148,7 @@ test_expect_success ZSTD 'verify zstd format' '
+
+ test_expect_success ZSTD 'untar' '
+ rm -rf master &&
+- tar --zstd -xf master.tar.zst
++ zstd -dc master.tar.zst | tar -xf -
+ '
+
+ test_expect_success ZSTD 'count files' '
+--
+cgit v1.2.3-11-g984f
+
diff --git a/0001-use-highlight-3-by-default.patch b/0001-use-highlight-3-by-default.patch
new file mode 100644
index 0000000..4263113
--- /dev/null
+++ b/0001-use-highlight-3-by-default.patch
@@ -0,0 +1,28 @@
+From fc155711420fd305e5b6570b61ef605a99ba30c7 Mon Sep 17 00:00:00 2001
+From: Kevin Fenzi <kevin@scrye.com>
+Date: Sat, 17 Nov 2012 10:53:33 -0700
+Subject: [PATCH] use highlight-3 by default
+
+All Fedora and EL releases have highlight-3.x except for EL-5. Make it
+the default.
+---
+ filters/syntax-highlighting.sh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/filters/syntax-highlighting.sh b/filters/syntax-highlighting.sh
+index 840bc34..5033f58 100755
+--- a/filters/syntax-highlighting.sh
++++ b/filters/syntax-highlighting.sh
+@@ -115,7 +115,7 @@ EXTENSION="${BASENAME##*.}"
+ # found (for example) on EPEL 6.
+ #
+ # This is for version 2
+-exec highlight --force -f -I -X -S "$EXTENSION" 2>/dev/null
++#exec highlight --force -f -I -X -S "$EXTENSION" 2>/dev/null
+
+ # This is for version 3
+-#exec highlight --force -f -I -O xhtml -S "$EXTENSION" 2>/dev/null
++exec highlight --force -f -I -O xhtml -S "$EXTENSION" 2>/dev/null
+--
+2.32.0
+
diff --git a/README-SELinux.md b/README-SELinux.md
new file mode 100644
index 0000000..32ce880
--- /dev/null
+++ b/README-SELinux.md
@@ -0,0 +1,29 @@
+If your system has SELinux enabled, you must enable the `httpd_enable_cgi`
+boolean:
+
+ # setsebool -P httpd_enable_cgi 1
+
+Additionally, the git repositories need to be accessible to cgit. This is
+handled automatically for repositories in the default path, `/var/lib/git`.
+
+If you have created `/var/lib/git` manually or have existing content in that
+directory, you may need to run `restorecon` to reset the SELinux context:
+
+ # restorecon -RF /var/lib/git
+
+If your repositories are in a different path, `/srv/git`, for example, you can
+set the proper context using `semanage`:
+
+ # semanage fcontext -a -e /var/lib/git /srv/git
+
+This sets the context of `/srv/git` equal to the default context of
+`/var/lib/git`.
+
+If you have other confined daemons that need to access the git repositories,
+you may want to use `public_content_t` or `public_content_rw_t` instead:
+
+ # semanage fcontext -a -t public_content_t "/srv/git(/.*)?"
+
+Then use `restorecon` to update the contexts:
+
+ # restorecon -RF /srv/git
diff --git a/README.SELinux b/README.SELinux
deleted file mode 100644
index 1f63c62..0000000
--- a/README.SELinux
+++ /dev/null
@@ -1,21 +0,0 @@
-If you use SELinux, you need to ensure that the httpd_enable_cgi boolean is
-set properly. This can be done via the command line, e.g.:
-
- # setsebool -P httpd_enable_cgi 1
-
-Or you can use the graphical tool system-config-selinux, via System ->
-Administration -> SELinux Management on the Gnome menu.
-
-Additionally, the git repositories need to be readable by the cgi. This is
-handled automatically for repositories in the default path, /var/lib/git. If
-your repositories are in a different path, /srv/git, for example, you can set
-the proper context using semanage:
-
- # semanage fcontext -a -t @CGIT_CONTEXT@ "/srv/git(/.*)?"
-
-If you have other confined daemons that need to access the git repositories,
-you may want to use public_content_t, or public_content_rw_t instead.
-
-Then use restorecon to update the contexts:
-
- # restorecon -RF /srv/git
diff --git a/cgit-0.9.1-highlightv3.patch b/cgit-0.9.1-highlightv3.patch
deleted file mode 100644
index df06a81..0000000
--- a/cgit-0.9.1-highlightv3.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff -Nur cgit-0.9.1.orig/filters/syntax-highlighting.sh cgit-0.9.1/filters/syntax-highlighting.sh
---- cgit-0.9.1.orig/filters/syntax-highlighting.sh 2012-11-14 17:28:59.000000000 -0700
-+++ cgit-0.9.1/filters/syntax-highlighting.sh 2012-11-17 10:47:07.870778180 -0700
-@@ -53,7 +53,7 @@
- # found (for example) on EPEL 6.
- #
- # This is for version 2
--exec highlight --force -f -I -X -S "$EXTENSION" 2>/dev/null
-+#exec highlight --force -f -I -X -S "$EXTENSION" 2>/dev/null
-
- # This is for version 3
--#exec highlight --force -f -I -O xhtml -S "$EXTENSION" 2>/dev/null
-+exec highlight --force -f -I -O xhtml -S "$EXTENSION" 2>/dev/null
diff --git a/cgit-1.2.3-update-to-git-2.34.1.patch b/cgit-1.2.3-update-to-git-2.34.1.patch
new file mode 100644
index 0000000..3e47d41
--- /dev/null
+++ b/cgit-1.2.3-update-to-git-2.34.1.patch
@@ -0,0 +1,1003 @@
+From 0462f08d8508978256118769b3e6dc89773a1367 Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Mon, 9 Mar 2020 09:51:05 +0100
+Subject: [PATCH] git: update to v2.26.0
+
+Update to git version v2.26.0.
+
+No changes required.
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index 49109ad..b50159f 100644
+--- a/Makefile
++++ b/Makefile
+@@ -14,7 +14,7 @@ htmldir = $(docdir)
+ pdfdir = $(docdir)
+ mandir = $(prefix)/share/man
+ SHA1_HEADER = <openssl/sha.h>
+-GIT_VER = 2.25.1
++GIT_VER = 2.26.0
+ GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+ INSTALL = install
+ COPYTREE = cp -r
+From f780396c0afa6015a05025c6404a560252605319 Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Tue, 2 Jun 2020 10:10:15 +0200
+Subject: [PATCH] git: update to v2.27.0
+
+Update to git version v2.27.0.
+
+No changes required.
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index b50159f..5c8fa8c 100644
+--- a/Makefile
++++ b/Makefile
+@@ -14,7 +14,7 @@ htmldir = $(docdir)
+ pdfdir = $(docdir)
+ mandir = $(prefix)/share/man
+ SHA1_HEADER = <openssl/sha.h>
+-GIT_VER = 2.26.0
++GIT_VER = 2.27.0
+ GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+ INSTALL = install
+ COPYTREE = cp -r
+From 205837d4684f331afa93c946cbdfa1fa9b3d1ce9 Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Mon, 27 Jul 2020 20:36:14 +0200
+Subject: [PATCH] git: update to v2.28.0
+
+Update to git version v2.28.0.
+
+No changes required.
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index 5c8fa8c..84822f0 100644
+--- a/Makefile
++++ b/Makefile
+@@ -14,7 +14,7 @@ htmldir = $(docdir)
+ pdfdir = $(docdir)
+ mandir = $(prefix)/share/man
+ SHA1_HEADER = <openssl/sha.h>
+-GIT_VER = 2.27.0
++GIT_VER = 2.28.0
+ GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+ INSTALL = install
+ COPYTREE = cp -r
+From 629659d2cffbf059374fc53e6400ff0bebe1ddde Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Tue, 6 Oct 2020 16:32:08 +0200
+Subject: [PATCH] git: update to v2.29.0
+
+Update to git version v2.29.0, this requires changes for these
+upstream commits:
+
+* dbbcd44fb47347a3fdbee88ea21805b7f4ac0b98
+ strvec: rename files from argv-array to strvec
+
+* 873cd28a8b17ff21908c78c7929a7615f8c94992
+ argv-array: rename to strvec
+
+* d70a9eb611a9d242c1d26847d223b8677609305b
+ strvec: rename struct fields
+
+* 6a67c759489e1025665adf78326e9e0d0981bab5
+ test-lib-functions: restrict test_must_fail usage
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ Makefile | 2 +-
+ cgit.h | 2 +-
+ tests/t0109-gitconfig.sh | 2 +-
+ ui-blame.c | 10 +++++-----
+ ui-log.c | 30 +++++++++++++++---------------
+ ui-snapshot.c | 24 ++++++++++++------------
+ 6 files changed, 35 insertions(+), 35 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 84822f0..c947b63 100644
+--- a/Makefile
++++ b/Makefile
+@@ -14,7 +14,7 @@ htmldir = $(docdir)
+ pdfdir = $(docdir)
+ mandir = $(prefix)/share/man
+ SHA1_HEADER = <openssl/sha.h>
+-GIT_VER = 2.28.0
++GIT_VER = 2.29.0
+ GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+ INSTALL = install
+ COPYTREE = cp -r
+diff --git a/cgit.h b/cgit.h
+index 7ec46b4..f5db364 100644
+--- a/cgit.h
++++ b/cgit.h
+@@ -14,7 +14,7 @@
+ #include <tag.h>
+ #include <diff.h>
+ #include <diffcore.h>
+-#include <argv-array.h>
++#include <strvec.h>
+ #include <refs.h>
+ #include <revision.h>
+ #include <log-tree.h>
+diff --git a/tests/t0109-gitconfig.sh b/tests/t0109-gitconfig.sh
+index 8cee75c..189ef28 100755
+--- a/tests/t0109-gitconfig.sh
++++ b/tests/t0109-gitconfig.sh
+@@ -25,7 +25,7 @@ test_no_home_access () {
+ -E CGIT_CONFIG="$PWD/cgitrc" \
+ -E QUERY_STRING="url=$1" \
+ -e access -f -o strace.out cgit &&
+- test_must_fail grep "$non_existent_path" strace.out
++ ! grep "$non_existent_path" strace.out
+ }
+
+ test_no_home_access_success() {
+diff --git a/ui-blame.c b/ui-blame.c
+index f28eea0..c3662bb 100644
+--- a/ui-blame.c
++++ b/ui-blame.c
+@@ -10,7 +10,7 @@
+ #include "ui-blame.h"
+ #include "html.h"
+ #include "ui-shared.h"
+-#include "argv-array.h"
++#include "strvec.h"
+ #include "blame.h"
+
+
+@@ -104,7 +104,7 @@ static void print_object(const struct object_id *oid, const char *path,
+ enum object_type type;
+ char *buf;
+ unsigned long size;
+- struct argv_array rev_argv = ARGV_ARRAY_INIT;
++ struct strvec rev_argv = STRVEC_INIT;
+ struct rev_info revs;
+ struct blame_scoreboard sb;
+ struct blame_origin *o;
+@@ -124,11 +124,11 @@ static void print_object(const struct object_id *oid, const char *path,
+ return;
+ }
+
+- argv_array_push(&rev_argv, "blame");
+- argv_array_push(&rev_argv, rev);
++ strvec_push(&rev_argv, "blame");
++ strvec_push(&rev_argv, rev);
+ init_revisions(&revs, NULL);
+ revs.diffopt.flags.allow_textconv = 1;
+- setup_revisions(rev_argv.argc, rev_argv.argv, &revs, NULL);
++ setup_revisions(rev_argv.nr, rev_argv.v, &revs, NULL);
+ init_scoreboard(&sb);
+ sb.revs = &revs;
+ sb.repo = the_repository;
+diff --git a/ui-log.c b/ui-log.c
+index 2939c01..fd07409 100644
+--- a/ui-log.c
++++ b/ui-log.c
+@@ -10,7 +10,7 @@
+ #include "ui-log.h"
+ #include "html.h"
+ #include "ui-shared.h"
+-#include "argv-array.h"
++#include "strvec.h"
+
+ static int files, add_lines, rem_lines, lines_counted;
+
+@@ -366,23 +366,23 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern
+ {
+ struct rev_info rev;
+ struct commit *commit;
+- struct argv_array rev_argv = ARGV_ARRAY_INIT;
++ struct strvec rev_argv = STRVEC_INIT;
+ int i, columns = commit_graph ? 4 : 3;
+ int must_free_tip = 0;
+
+ /* rev_argv.argv[0] will be ignored by setup_revisions */
+- argv_array_push(&rev_argv, "log_rev_setup");
++ strvec_push(&rev_argv, "log_rev_setup");
+
+ if (!tip)
+ tip = ctx.qry.head;
+ tip = disambiguate_ref(tip, &must_free_tip);
+- argv_array_push(&rev_argv, tip);
++ strvec_push(&rev_argv, tip);
+
+ if (grep && pattern && *pattern) {
+ pattern = xstrdup(pattern);
+ if (!strcmp(grep, "grep") || !strcmp(grep, "author") ||
+ !strcmp(grep, "committer")) {
+- argv_array_pushf(&rev_argv, "--%s=%s", grep, pattern);
++ strvec_pushf(&rev_argv, "--%s=%s", grep, pattern);
+ } else if (!strcmp(grep, "range")) {
+ char *arg;
+ /* Split the pattern at whitespace and add each token
+@@ -390,14 +390,14 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern
+ * rev-list options. Also, replace the previously
+ * pushed tip (it's no longer relevant).
+ */
+- argv_array_pop(&rev_argv);
++ strvec_pop(&rev_argv);
+ while ((arg = next_token(&pattern))) {
+ if (*arg == '-') {
+ fprintf(stderr, "Bad range expr: %s\n",
+ arg);
+ break;
+ }
+- argv_array_push(&rev_argv, arg);
++ strvec_push(&rev_argv, arg);
+ }
+ }
+ }
+@@ -412,22 +412,22 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern
+ }
+
+ if (commit_graph && !ctx.qry.follow) {
+- argv_array_push(&rev_argv, "--graph");
+- argv_array_push(&rev_argv, "--color");
++ strvec_push(&rev_argv, "--graph");
++ strvec_push(&rev_argv, "--color");
+ graph_set_column_colors(column_colors_html,
+ COLUMN_COLORS_HTML_MAX);
+ }
+
+ if (commit_sort == 1)
+- argv_array_push(&rev_argv, "--date-order");
++ strvec_push(&rev_argv, "--date-order");
+ else if (commit_sort == 2)
+- argv_array_push(&rev_argv, "--topo-order");
++ strvec_push(&rev_argv, "--topo-order");
+
+ if (path && ctx.qry.follow)
+- argv_array_push(&rev_argv, "--follow");
+- argv_array_push(&rev_argv, "--");
++ strvec_push(&rev_argv, "--follow");
++ strvec_push(&rev_argv, "--");
+ if (path)
+- argv_array_push(&rev_argv, path);
++ strvec_push(&rev_argv, path);
+
+ init_revisions(&rev, NULL);
+ rev.abbrev = DEFAULT_ABBREV;
+@@ -436,7 +436,7 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern
+ rev.show_root_diff = 0;
+ rev.ignore_missing = 1;
+ rev.simplify_history = 1;
+- setup_revisions(rev_argv.argc, rev_argv.argv, &rev, NULL);
++ setup_revisions(rev_argv.nr, rev_argv.v, &rev, NULL);
+ load_ref_decorations(NULL, DECORATE_FULL_REFS);
+ rev.show_decorations = 1;
+ rev.grep_filter.ignore_case = 1;
+diff --git a/ui-snapshot.c b/ui-snapshot.c
+index 556d3ed..18361a6 100644
+--- a/ui-snapshot.c
++++ b/ui-snapshot.c
+@@ -13,32 +13,32 @@
+
+ static int write_archive_type(const char *format, const char *hex, const char *prefix)
+ {
+- struct argv_array argv = ARGV_ARRAY_INIT;
++ struct strvec argv = STRVEC_INIT;
+ const char **nargv;
+ int result;
+- argv_array_push(&argv, "snapshot");
+- argv_array_push(&argv, format);
++ strvec_push(&argv, "snapshot");
++ strvec_push(&argv, format);
+ if (prefix) {
+ struct strbuf buf = STRBUF_INIT;
+ strbuf_addstr(&buf, prefix);
+ strbuf_addch(&buf, '/');
+- argv_array_push(&argv, "--prefix");
+- argv_array_push(&argv, buf.buf);
++ strvec_push(&argv, "--prefix");
++ strvec_push(&argv, buf.buf);
+ strbuf_release(&buf);
+ }
+- argv_array_push(&argv, hex);
++ strvec_push(&argv, hex);
+ /*
+ * Now we need to copy the pointers to arguments into a new
+ * structure because write_archive will rearrange its arguments
+ * which may result in duplicated/missing entries causing leaks
+- * or double-frees in argv_array_clear.
++ * or double-frees in strvec_clear.
+ */
+- nargv = xmalloc(sizeof(char *) * (argv.argc + 1));
+- /* argv_array guarantees a trailing NULL entry. */
+- memcpy(nargv, argv.argv, sizeof(char *) * (argv.argc + 1));
++ nargv = xmalloc(sizeof(char *) * (argv.nr + 1));
++ /* strvec guarantees a trailing NULL entry. */
++ memcpy(nargv, argv.v, sizeof(char *) * (argv.nr + 1));
+
+- result = write_archive(argv.argc, nargv, NULL, the_repository, NULL, 0);
+- argv_array_clear(&argv);
++ result = write_archive(argv.nr, nargv, NULL, the_repository, NULL, 0);
++ strvec_clear(&argv);
+ free(nargv);
+ return result;
+ }
+From fe99c76ee477f91d6d983486491603109c7b2599 Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Tue, 27 Oct 2020 10:39:46 +0100
+Subject: [PATCH] git: update to v2.29.1
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Update to git version v2.29.1. No functional change, but we want latest
+and greated version number, no? 😜
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index c947b63..eb60388 100644
+--- a/Makefile
++++ b/Makefile
+@@ -14,7 +14,7 @@ htmldir = $(docdir)
+ pdfdir = $(docdir)
+ mandir = $(prefix)/share/man
+ SHA1_HEADER = <openssl/sha.h>
+-GIT_VER = 2.29.0
++GIT_VER = 2.29.1
+ GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+ INSTALL = install
+ COPYTREE = cp -r
+From b1739247b17524460282f63fa240b3f34501e000 Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Fri, 30 Oct 2020 22:22:32 +0100
+Subject: [PATCH] git: update to v2.29.2
+
+Update to git version v2.29.2.
+
+No changes required.
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index eb60388..1a8f496 100644
+--- a/Makefile
++++ b/Makefile
+@@ -14,7 +14,7 @@ htmldir = $(docdir)
+ pdfdir = $(docdir)
+ mandir = $(prefix)/share/man
+ SHA1_HEADER = <openssl/sha.h>
+-GIT_VER = 2.29.1
++GIT_VER = 2.29.2
+ GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+ INSTALL = install
+ COPYTREE = cp -r
+From cef27b670a66c9840bb6120260864e4b3a701dc2 Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Mon, 28 Dec 2020 23:27:13 +0100
+Subject: [PATCH] git: update to v2.30.0
+
+Update to git version v2.30.0, this requires changes for these
+upstream commits:
+
+* 88894aaeeae92e8cb41143cc2e045f50289dc790
+ blame: simplify 'setup_scoreboard' interface
+
+* 1fbfdf556f2abc708183caca53ae4e2881b46ae2
+ banned.h: mark non-reentrant gmtime, etc as banned
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ Makefile | 2 +-
+ cache.c | 6 +++---
+ ui-blame.c | 3 ++-
+ ui-shared.c | 9 +++++----
+ ui-stats.c | 48 ++++++++++++++++++++++++------------------------
+ 5 files changed, 35 insertions(+), 33 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 1a8f496..6dfc003 100644
+--- a/Makefile
++++ b/Makefile
+@@ -14,7 +14,7 @@ htmldir = $(docdir)
+ pdfdir = $(docdir)
+ mandir = $(prefix)/share/man
+ SHA1_HEADER = <openssl/sha.h>
+-GIT_VER = 2.29.2
++GIT_VER = 2.30.0
+ GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+ INSTALL = install
+ COPYTREE = cp -r
+diff --git a/cache.c b/cache.c
+index 2c70be7..55199e8 100644
+--- a/cache.c
++++ b/cache.c
+@@ -401,12 +401,12 @@ int cache_process(int size, const char *path, const char *key, int ttl,
+ static char *sprintftime(const char *format, time_t time)
+ {
+ static char buf[64];
+- struct tm *tm;
++ struct tm tm;
+
+ if (!time)
+ return NULL;
+- tm = gmtime(&time);
+- strftime(buf, sizeof(buf)-1, format, tm);
++ gmtime_r(&time, &tm);
++ strftime(buf, sizeof(buf)-1, format, &tm);
+ return buf;
+ }
+
+diff --git a/ui-blame.c b/ui-blame.c
+index cfab7fb..ec1d888 100644
+--- a/ui-blame.c
++++ b/ui-blame.c
+@@ -132,7 +132,8 @@ static void print_object(const struct object_id *oid, const char *path,
+ init_scoreboard(&sb);
+ sb.revs = &revs;
+ sb.repo = the_repository;
+- setup_scoreboard(&sb, path, &o);
++ sb.path = path;
++ setup_scoreboard(&sb, &o);
+ o->suspects = blame_entry_prepend(NULL, 0, sb.num_lines, o);
+ prio_queue_put(&sb.commits, o->commit);
+ blame_origin_decref(o);
+diff --git a/ui-shared.c b/ui-shared.c
+index 151ac17..acd8ab5 100644
+--- a/ui-shared.c
++++ b/ui-shared.c
+@@ -22,10 +22,11 @@ static char *http_date(time_t t)
+ static char month[][4] =
+ {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
+- struct tm *tm = gmtime(&t);
+- return fmt("%s, %02d %s %04d %02d:%02d:%02d GMT", day[tm->tm_wday],
+- tm->tm_mday, month[tm->tm_mon], 1900 + tm->tm_year,
+- tm->tm_hour, tm->tm_min, tm->tm_sec);
++ struct tm tm;
++ gmtime_r(&t, &tm);
++ return fmt("%s, %02d %s %04d %02d:%02d:%02d GMT", day[tm.tm_wday],
++ tm.tm_mday, month[tm.tm_mon], 1900 + tm.tm_year,
++ tm.tm_hour, tm.tm_min, tm.tm_sec);
+ }
+
+ void cgit_print_error(const char *fmt, ...)
+diff --git a/ui-stats.c b/ui-stats.c
+index 7272a61..09b3625 100644
+--- a/ui-stats.c
++++ b/ui-stats.c
+@@ -166,7 +166,7 @@ static void add_commit(struct string_list *authors, struct commit *commit,
+ struct authorstat *authorstat;
+ struct string_list *items;
+ char *tmp;
+- struct tm *date;
++ struct tm date;
+ time_t t;
+ uintptr_t *counter;
+
+@@ -180,9 +180,9 @@ static void add_commit(struct string_list *authors, struct commit *commit,
+ authorstat = author->util;
+ items = &authorstat->list;
+ t = info->committer_date;
+- date = gmtime(&t);
+- period->trunc(date);
+- tmp = xstrdup(period->pretty(date));
++ gmtime_r(&t, &date);
++ period->trunc(&date);
++ tmp = xstrdup(period->pretty(&date));
+ item = string_list_insert(items, tmp);
+ counter = (uintptr_t *)&item->util;
+ if (*counter)
+@@ -215,15 +215,15 @@ static struct string_list collect_stats(const struct cgit_period *period)
+ int argc = 3;
+ time_t now;
+ long i;
+- struct tm *tm;
++ struct tm tm;
+ char tmp[11];
+
+ time(&now);
+- tm = gmtime(&now);
+- period->trunc(tm);
++ gmtime_r(&now, &tm);
++ period->trunc(&tm);
+ for (i = 1; i < period->count; i++)
+- period->dec(tm);
+- strftime(tmp, sizeof(tmp), "%Y-%m-%d", tm);
++ period->dec(&tm);
++ strftime(tmp, sizeof(tmp), "%Y-%m-%d", &tm);
+ argv[2] = xstrdup(fmt("--since=%s", tmp));
+ if (ctx.qry.path) {
+ argv[3] = "--";
+@@ -261,21 +261,21 @@ static void print_combined_authorrow(struct string_list *authors, int from,
+ struct string_list_item *date;
+ time_t now;
+ long i, j, total, subtotal;
+- struct tm *tm;
++ struct tm tm;
+ char *tmp;
+
+ time(&now);
+- tm = gmtime(&now);
+- period->trunc(tm);
++ gmtime_r(&now, &tm);
++ period->trunc(&tm);
+ for (i = 1; i < period->count; i++)
+- period->dec(tm);
++ period->dec(&tm);
+
+ total = 0;
+ htmlf("<tr><td class='%s'>%s</td>", leftclass,
+ fmt(name, to - from + 1));
+ for (j = 0; j < period->count; j++) {
+- tmp = period->pretty(tm);
+- period->inc(tm);
++ tmp = period->pretty(&tm);
++ period->inc(&tm);
+ subtotal = 0;
+ for (i = from; i <= to; i++) {
+ author = &authors->items[i];
+@@ -300,20 +300,20 @@ static void print_authors(struct string_list *authors, int top,
+ struct string_list_item *date;
+ time_t now;
+ long i, j, total;
+- struct tm *tm;
++ struct tm tm;
+ char *tmp;
+
+ time(&now);
+- tm = gmtime(&now);
+- period->trunc(tm);
++ gmtime_r(&now, &tm);
++ period->trunc(&tm);
+ for (i = 1; i < period->count; i++)
+- period->dec(tm);
++ period->dec(&tm);
+
+ html("<table class='stats'><tr><th>Author</th>");
+ for (j = 0; j < period->count; j++) {
+- tmp = period->pretty(tm);
++ tmp = period->pretty(&tm);
+ htmlf("<th>%s</th>", tmp);
+- period->inc(tm);
++ period->inc(&tm);
+ }
+ html("<th>Total</th></tr>\n");
+
+@@ -329,10 +329,10 @@ static void print_authors(struct string_list *authors, int top,
+ items = &authorstat->list;
+ total = 0;
+ for (j = 0; j < period->count; j++)
+- period->dec(tm);
++ period->dec(&tm);
+ for (j = 0; j < period->count; j++) {
+- tmp = period->pretty(tm);
+- period->inc(tm);
++ tmp = period->pretty(&tm);
++ period->inc(&tm);
+ date = string_list_lookup(items, tmp);
+ if (!date)
+ html("<td>0</td>");
+From 4ffadc1e0c589f9bcfb4a721f5625914ef2d496d Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Wed, 10 Feb 2021 16:13:53 +0100
+Subject: [PATCH] git: update to v2.30.1
+
+Update to git version v2.30.1, no additional changes required.
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index 6dfc003..a4e597b 100644
+--- a/Makefile
++++ b/Makefile
+@@ -14,7 +14,7 @@ htmldir = $(docdir)
+ pdfdir = $(docdir)
+ mandir = $(prefix)/share/man
+ SHA1_HEADER = <openssl/sha.h>
+-GIT_VER = 2.30.0
++GIT_VER = 2.30.1
+ GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+ INSTALL = install
+ COPYTREE = cp -r
+From d889cae811f27a052317ac5aea23890cba414760 Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Mon, 15 Mar 2021 22:48:26 +0100
+Subject: [PATCH] git: update to v2.31.0
+
+Update to git version v2.31.0, this requires changes for these
+upstream commits:
+
+* 36a317929b8f0c67d77d54235f2d20751c576cbb
+ refs: switch peel_ref() to peel_iterated_oid()
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ Makefile | 2 +-
+ ui-log.c | 7 ++++---
+ 2 files changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index a4e597b..11b437b 100644
+--- a/Makefile
++++ b/Makefile
+@@ -14,7 +14,7 @@ htmldir = $(docdir)
+ pdfdir = $(docdir)
+ mandir = $(prefix)/share/man
+ SHA1_HEADER = <openssl/sha.h>
+-GIT_VER = 2.30.1
++GIT_VER = 2.31.0
+ GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+ INSTALL = install
+ COPYTREE = cp -r
+diff --git a/ui-log.c b/ui-log.c
+index 6914f75..20774bf 100644
+--- a/ui-log.c
++++ b/ui-log.c
+@@ -65,8 +65,9 @@ void show_commit_decorations(struct commit *commit)
+ return;
+ html("<span class='decoration'>");
+ while (deco) {
+- struct object_id peeled;
++ struct object_id oid_tag, peeled;
+ int is_annotated = 0;
++
+ strlcpy(buf, prettify_refname(deco->name), sizeof(buf));
+ switch(deco->type) {
+ case DECORATION_NONE:
+@@ -79,8 +80,8 @@ void show_commit_decorations(struct commit *commit)
+ ctx.qry.showmsg, 0);
+ break;
+ case DECORATION_REF_TAG:
+- if (!peel_ref(deco->name, &peeled))
+- is_annotated = !oidcmp(&commit->object.oid, &peeled);
++ if (!read_ref(deco->name, &oid_tag) && !peel_iterated_oid(&oid_tag, &peeled))
++ is_annotated = !oideq(&oid_tag, &peeled);
+ cgit_tag_link(buf, NULL, is_annotated ? "tag-annotated-deco" : "tag-deco", buf);
+ break;
+ case DECORATION_REF_REMOTE:
+From 6dbbffe01533a91c79c4497c80f46af8e1581e25 Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Tue, 18 May 2021 21:54:23 +0200
+Subject: [PATCH] git: update to v2.31.1
+
+Update to git version v2.31.1, no additional changes required.
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index 11b437b..abc52bc 100644
+--- a/Makefile
++++ b/Makefile
+@@ -14,7 +14,7 @@ htmldir = $(docdir)
+ pdfdir = $(docdir)
+ mandir = $(prefix)/share/man
+ SHA1_HEADER = <openssl/sha.h>
+-GIT_VER = 2.31.0
++GIT_VER = 2.31.1
+ GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+ INSTALL = install
+ COPYTREE = cp -r
+From 5258c297ba6fb604ae1415fbc19a3fe42457e49e Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Tue, 18 May 2021 22:49:13 +0200
+Subject: [PATCH] git: update to v2.32.0
+
+Update to git version v2.32.0, this requires changes for these
+upstream commits:
+
+* 47957485b3b731a7860e0554d2bd12c0dce1c75a
+ tree.h API: simplify read_tree_recursive() signature
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ Makefile | 2 +-
+ ui-blame.c | 9 +++------
+ ui-blob.c | 20 ++++++++------------
+ ui-plain.c | 7 +++----
+ ui-tree.c | 21 ++++++++-------------
+ 5 files changed, 23 insertions(+), 36 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index abc52bc..d13c5bd 100644
+--- a/Makefile
++++ b/Makefile
+@@ -14,7 +14,7 @@ htmldir = $(docdir)
+ pdfdir = $(docdir)
+ mandir = $(prefix)/share/man
+ SHA1_HEADER = <openssl/sha.h>
+-GIT_VER = 2.31.1
++GIT_VER = 2.32.0
+ GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+ INSTALL = install
+ COPYTREE = cp -r
+diff --git a/ui-blame.c b/ui-blame.c
+index ec1d888..03136f7 100644
+--- a/ui-blame.c
++++ b/ui-blame.c
+@@ -221,8 +221,7 @@ cleanup:
+ }
+
+ static int walk_tree(const struct object_id *oid, struct strbuf *base,
+- const char *pathname, unsigned mode, int stage,
+- void *cbdata)
++ const char *pathname, unsigned mode, void *cbdata)
+ {
+ struct walk_tree_context *walk_tree_ctx = cbdata;
+
+@@ -291,10 +290,8 @@ void cgit_print_blame(void)
+ walk_tree_ctx.match_baselen = (path_items.match) ?
+ basedir_len(path_items.match) : -1;
+
+- read_tree_recursive(the_repository,
+- repo_get_commit_tree(the_repository, commit),
+- "", 0, 0,
+- &paths, walk_tree, &walk_tree_ctx);
++ read_tree(the_repository, repo_get_commit_tree(the_repository, commit),
++ &paths, walk_tree, &walk_tree_ctx);
+ if (!walk_tree_ctx.state)
+ cgit_print_error_page(404, "Not found", "Not found");
+ else if (walk_tree_ctx.state == 2)
+diff --git a/ui-blob.c b/ui-blob.c
+index f76c641..c10ae42 100644
+--- a/ui-blob.c
++++ b/ui-blob.c
+@@ -19,7 +19,7 @@ struct walk_tree_context {
+ };
+
+ static int walk_tree(const struct object_id *oid, struct strbuf *base,
+- const char *pathname, unsigned mode, int stage, void *cbdata)
++ const char *pathname, unsigned mode, void *cbdata)
+ {
+ struct walk_tree_context *walk_tree_ctx = cbdata;
+
+@@ -56,9 +56,9 @@ int cgit_ref_path_exists(const char *path, const char *ref, int file_only)
+ goto done;
+ if (oid_object_info(the_repository, &oid, &size) != OBJ_COMMIT)
+ goto done;
+- read_tree_recursive(the_repository,
+- repo_get_commit_tree(the_repository, lookup_commit_reference(the_repository, &oid)),
+- "", 0, 0, &paths, walk_tree, &walk_tree_ctx);
++ read_tree(the_repository,
++ repo_get_commit_tree(the_repository, lookup_commit_reference(the_repository, &oid)),
++ &paths, walk_tree, &walk_tree_ctx);
+
+ done:
+ free(path_items.match);
+@@ -92,10 +92,8 @@ int cgit_print_file(char *path, const char *head, int file_only)
+ type = oid_object_info(the_repository, &oid, &size);
+ if (type == OBJ_COMMIT) {
+ commit = lookup_commit_reference(the_repository, &oid);
+- read_tree_recursive(the_repository,
+- repo_get_commit_tree(the_repository, commit),
+- "", 0, 0, &paths, walk_tree,
+- &walk_tree_ctx);
++ read_tree(the_repository, repo_get_commit_tree(the_repository, commit),
++ &paths, walk_tree, &walk_tree_ctx);
+ if (!walk_tree_ctx.found_path)
+ return -1;
+ type = oid_object_info(the_repository, &oid, &size);
+@@ -151,10 +149,8 @@ void cgit_print_blob(const char *hex, char *path, const char *head, int file_onl
+
+ if ((!hex) && type == OBJ_COMMIT && path) {
+ commit = lookup_commit_reference(the_repository, &oid);
+- read_tree_recursive(the_repository,
+- repo_get_commit_tree(the_repository, commit),
+- "", 0, 0, &paths, walk_tree,
+- &walk_tree_ctx);
++ read_tree(the_repository, repo_get_commit_tree(the_repository, commit),
++ &paths, walk_tree, &walk_tree_ctx);
+ type = oid_object_info(the_repository, &oid, &size);
+ }
+
+diff --git a/ui-plain.c b/ui-plain.c
+index 001001c..65a205f 100644
+--- a/ui-plain.c
++++ b/ui-plain.c
+@@ -130,7 +130,7 @@ static void print_dir_tail(void)
+ }
+
+ static int walk_tree(const struct object_id *oid, struct strbuf *base,
+- const char *pathname, unsigned mode, int stage, void *cbdata)
++ const char *pathname, unsigned mode, void *cbdata)
+ {
+ struct walk_tree_context *walk_tree_ctx = cbdata;
+
+@@ -198,9 +198,8 @@ void cgit_print_plain(void)
+ }
+ else
+ walk_tree_ctx.match_baselen = basedir_len(path_items.match);
+- read_tree_recursive(the_repository,
+- repo_get_commit_tree(the_repository, commit),
+- "", 0, 0, &paths, walk_tree, &walk_tree_ctx);
++ read_tree(the_repository, repo_get_commit_tree(the_repository, commit),
++ &paths, walk_tree, &walk_tree_ctx);
+ if (!walk_tree_ctx.match)
+ cgit_print_error_page(404, "Not found", "Not found");
+ else if (walk_tree_ctx.match == 2)
+diff --git a/ui-tree.c b/ui-tree.c
+index 1e4efb2..b61f6f5 100644
+--- a/ui-tree.c
++++ b/ui-tree.c
+@@ -139,8 +139,7 @@ struct single_tree_ctx {
+ };
+
+ static int single_tree_cb(const struct object_id *oid, struct strbuf *base,
+- const char *pathname, unsigned mode, int stage,
+- void *cbdata)
++ const char *pathname, unsigned mode, void *cbdata)
+ {
+ struct single_tree_ctx *ctx = cbdata;
+
+@@ -185,8 +184,7 @@ static void write_tree_link(const struct object_id *oid, char *name,
+ tree_ctx.name = NULL;
+ tree_ctx.count = 0;
+
+- read_tree_recursive(the_repository, tree, "", 0, 1,
+- &paths, single_tree_cb, &tree_ctx);
++ read_tree(the_repository, tree, &paths, single_tree_cb, &tree_ctx);
+
+ if (tree_ctx.count != 1)
+ break;
+@@ -199,7 +197,7 @@ static void write_tree_link(const struct object_id *oid, char *name,
+ }
+
+ static int ls_item(const struct object_id *oid, struct strbuf *base,
+- const char *pathname, unsigned mode, int stage, void *cbdata)
++ const char *pathname, unsigned mode, void *cbdata)
+ {
+ struct walk_tree_context *walk_tree_ctx = cbdata;
+ char *name;
+@@ -294,14 +292,13 @@ static void ls_tree(const struct object_id *oid, const char *path, struct walk_t
+ }
+
+ ls_head();
+- read_tree_recursive(the_repository, tree, "", 0, 1,
+- &paths, ls_item, walk_tree_ctx);
++ read_tree(the_repository, tree, &paths, ls_item, walk_tree_ctx);
+ ls_tail();
+ }
+
+
+ static int walk_tree(const struct object_id *oid, struct strbuf *base,
+- const char *pathname, unsigned mode, int stage, void *cbdata)
++ const char *pathname, unsigned mode, void *cbdata)
+ {
+ struct walk_tree_context *walk_tree_ctx = cbdata;
+
+@@ -326,7 +323,7 @@ static int walk_tree(const struct object_id *oid, struct strbuf *base,
+ return 0;
+ }
+ }
+- ls_item(oid, base, pathname, mode, stage, walk_tree_ctx);
++ ls_item(oid, base, pathname, mode, walk_tree_ctx);
+ return 0;
+ }
+
+@@ -374,10 +371,8 @@ void cgit_print_tree(const char *rev, char *path)
+ goto cleanup;
+ }
+
+- read_tree_recursive(the_repository,
+- repo_get_commit_tree(the_repository, commit),
+- "", 0, 0,
+- &paths, walk_tree, &walk_tree_ctx);
++ read_tree(the_repository, repo_get_commit_tree(the_repository, commit),
++ &paths, walk_tree, &walk_tree_ctx);
+ if (walk_tree_ctx.state == 1)
+ ls_tail();
+ else if (walk_tree_ctx.state == 2)
+From 45eff406554f3ff31bdf7d54daae1da5635db72e Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Sun, 8 Aug 2021 17:55:53 +0200
+Subject: [PATCH] git: update to v2.33.0
+
+Update to git version v2.33.0, no additional changes required.
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index d13c5bd..b030ff9 100644
+--- a/Makefile
++++ b/Makefile
+@@ -14,7 +14,7 @@ htmldir = $(docdir)
+ pdfdir = $(docdir)
+ mandir = $(prefix)/share/man
+ SHA1_HEADER = <openssl/sha.h>
+-GIT_VER = 2.32.0
++GIT_VER = 2.33.0
+ GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+ INSTALL = install
+ COPYTREE = cp -r
+From b8f2b675df61e3a4ff4db7073fe7142fc07e8b7a Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Wed, 3 Nov 2021 15:32:17 +0100
+Subject: [PATCH] git: update to v2.34.0
+
+Update to git version v2.34.0, this requires changes for these
+upstream commits:
+
+* abf897bacd2d36b9dbd07c70b4a2f97a084704ee
+ string-list.[ch]: remove string_list_init() compatibility function
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ Makefile | 2 +-
+ cgit.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index b030ff9..9153a39 100644
+--- a/Makefile
++++ b/Makefile
+@@ -14,7 +14,7 @@ htmldir = $(docdir)
+ pdfdir = $(docdir)
+ mandir = $(prefix)/share/man
+ SHA1_HEADER = <openssl/sha.h>
+-GIT_VER = 2.33.0
++GIT_VER = 2.34.0
+ GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+ INSTALL = install
+ COPYTREE = cp -r
+diff --git a/cgit.c b/cgit.c
+index 08d81a1..4b2d86c 100644
+--- a/cgit.c
++++ b/cgit.c
+@@ -428,7 +428,7 @@ static void prepare_context(void)
+ ctx.page.modified = time(NULL);
+ ctx.page.expires = ctx.page.modified;
+ ctx.page.etag = NULL;
+- string_list_init(&ctx.cfg.mimetypes, 1);
++ string_list_init_dup(&ctx.cfg.mimetypes);
+ if (ctx.env.script_name)
+ ctx.cfg.script_name = xstrdup(ctx.env.script_name);
+ if (ctx.env.query_string)
+From 11be5b8182fc71c00c1c00c693f64c97769d77bb Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Wed, 24 Nov 2021 21:12:12 +0100
+Subject: [PATCH] git: update to v2.34.1
+
+Update to git version v2.34.1, no additional changes required.
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index 9153a39..baa7c2d 100644
+--- a/Makefile
++++ b/Makefile
+@@ -14,7 +14,7 @@ htmldir = $(docdir)
+ pdfdir = $(docdir)
+ mandir = $(prefix)/share/man
+ SHA1_HEADER = <openssl/sha.h>
+-GIT_VER = 2.34.0
++GIT_VER = 2.34.1
+ GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+ INSTALL = install
+ COPYTREE = cp -r
diff --git a/cgit.spec b/cgit.spec
index 720fdec..c93d2d5 100644
--- a/cgit.spec
+++ b/cgit.spec
@@ -1,58 +1,125 @@
# Review bug: https://bugzilla.redhat.com/479723
-%global gitver 2.10.2
+# Defaults
+%global gitver 2.34.1
%global cachedir %{_localstatedir}/cache/%{name}
%global filterdir %{_libexecdir}/%{name}/filters
%global scriptdir %{_localstatedir}/www/cgi-bin
%global cgitdata %{_datadir}/%{name}
+%global httpdconfd %{_sysconfdir}/httpd/conf.d
+%global gitrepodir %{_localstatedir}/lib/git
-%global syntax_highlight 1
+# GPG signing key fingerprints
+%global gpg_cgit AB9942E6D4A4CFC3412620A749FC7012A5DE03AE
+%global gpg_git 96E07AF25771955980DAD10020D04E5A713660A7
-# Temporarily -- in epel-7-ppc64 is not highlight package currently, #1117261
-%if 0%{?rhel} == 7
-%ifarch ppc64
-%global syntax_highlight 0
+# Settings for Fedora and EL >= 8
+%if 0%{?fedora} || 0%{?rhel} >= 8
+%bcond_without httpd_filesystem
+%global use_perl_interpreter 1
+%else
+%bcond_with httpd_filesystem
+%global use_perl_interpreter 0
%endif
+
+# The highlight package is only available in EL7+ on ppc64le and x86_64
+%if 0%{?rhel} >= 7 && ! ( "%{_arch}" == "ppc64le" || "%{_arch}" == "x86_64" )
+%bcond_with highlight
+%else
+%bcond_without highlight
%endif
Name: cgit
-Version: 1.1
-Release: 11%{?dist}
+Version: 1.2.3
+Release: 8%{?dist}
Summary: A fast web interface for git
-Group: Development/Tools
License: GPLv2
URL: https://git.zx2c4.com/cgit/
Source0: https://git.zx2c4.com/cgit/snapshot/%{name}-%{version}.tar.xz
-Source1: https://www.kernel.org/pub/software/scm/git//git-%{gitver}.tar.xz
+Source1: https://www.kernel.org/pub/software/scm/git/git-%{gitver}.tar.xz
Source2: cgitrc
-Source3: README.SELinux
-
-# https://git.zx2c4.com/cgit/commit/?id=53efaf30b
-Patch0: 0001-clone-fix-directory-traversal.patch
-
-# Security guys might try to repoquery for this.
+Source3: README-SELinux.md
+
+# Jason A. Donenfeld's key is used to sign cgit releases.
+# https://www.zx2c4.com/keys/AB9942E6D4A4CFC3412620A749FC7012A5DE03AE.asc
+Source90: gpgkey-%{gpg_cgit}.asc
+
+# Junio C Hamano's key is used to sign git releases. It can be found in the
+# junio-gpg-pub tag within git.
+#
+# (Note that the tagged blob in git contains a version of the key with an
+# expired signing subkey. The subkey expiration has been extended on the
+# public keyservers, but the blob in git has not been updated.)
+#
+# https://git.kernel.org/cgit/git/git.git/tag/?h=junio-gpg-pub
+# https://git.kernel.org/cgit/git/git.git/blob/?h=junio-gpg-pub&id=7214aea37915ee2c4f6369eb9dea520aec7d855b
+# https://src.fedoraproject.org/rpms/git/raw/master/f/gpgkey-junio.asc
+Source91: gpgkey-%{gpg_git}.asc
+
+# Tarball signatures
+Source92: https://git.zx2c4.com/cgit/snapshot/%{name}-%{version}.tar.asc
+Source93: https://www.kernel.org/pub/software/scm/git/git-%{gitver}.tar.sign
+
+# All supported releases use highlight version 3.
+Patch0: 0001-use-highlight-3-by-default.patch
+
+# Improve test suite's support for older tar versions
+# https://lists.zx2c4.com/pipermail/cgit/2020-August/004513.html
+Patch1: https://git.zx2c4.com/cgit/patch/?id=bd6f5683f#/0001-t0107-support-older-and-or-non-GNU-tar.patch
+
+# Update to current git
+#
+# This is a compilation of patches Christian Hesse has sent to the cgit list.
+# It was created somewhat manually by reviewing the number of patches since the
+# last update to git-2.25.1 (14). Then patch was generated via:
+#
+# git log --grep=git: --format='%h' --reverse -14 origin/ch/for-jason |
+# while read c _; do
+# git format-patch -1 --ignore-submodules --no-signature --stdout $c
+# done >~/src/dist/fedora/cgit/cgit-1.2.3-update-to-git-2.34.1.patch
+Patch2: cgit-1.2.3-update-to-git-2.34.1.patch
+
+# Note the bundled git, per the packaging guidelines
+# https://docs.fedoraproject.org/en-US/packaging-guidelines/#bundling
Provides: bundled(git) = %gitver
-%if %{syntax_highlight}
-# All supported releases use hightlight version 3.
-Patch1: cgit-0.9.1-highlightv3.patch
+%if %{with highlight}
BuildRequires: highlight
%endif
BuildRequires: asciidoc
+%if 0%{?rhel} && 0%{?rhel} < 9
+# Require epel-rpm-macros for the %%gpgverify macro on EL-7/EL-8, and
+# %%build_cflags / %%build_ldflags on EL-7.
+BuildRequires: epel-rpm-macros
+%endif
BuildRequires: gcc
-%if 0%{?fedora} || 0%{?rhel} >= 6
+BuildRequires: git-core
+BuildRequires: gnupg2
BuildRequires: libcurl-devel
-%else
-BuildRequires: curl-devel
-%endif
BuildRequires: openssl-devel
BuildRequires: lua-devel
BuildRequires: make
+BuildRequires: zlib-devel
-%if 0%{?fedora}
-# just to be able to install httpd configuration correctly, FC21+
+# Test dependencies
+BuildRequires: gettext
+BuildRequires: lzip
+%if %{use_perl_interpreter}
+BuildRequires: perl-interpreter
+%else
+BuildRequires: perl
+%endif
+BuildRequires: perl(ExtUtils::MakeMaker)
+BuildRequires: strace
+BuildRequires: tidy
+BuildRequires: unzip
+BuildRequires: xz
+BuildRequires: zstd
+
+%if %{with httpd_filesystem}
+# httpd-filesystem provides the basic apache directory layout
Requires: httpd-filesystem
%endif
Requires: webserver
@@ -62,103 +129,193 @@ Requires: webserver
Cgit is a fast web interface for git. It uses caching to increase performance.
%prep
-%setup -q -a 1
-%patch0 -p1
-%if %{syntax_highlight}
-%patch1 -p1
-%endif
+# Verify GPG signatures
+xz -dc '%{SOURCE0}' | %{gpgverify} --keyring='%{SOURCE90}' --signature='%{SOURCE92}' --data=-
+xz -dc '%{SOURCE1}' | %{gpgverify} --keyring='%{SOURCE91}' --signature='%{SOURCE93}' --data=-
+
+%autosetup -a 1 -S git
# setup the git dir
rm -rf git
mv git-%{gitver} git
+# add README.SELinux
+cp -p %{SOURCE3} .
+
# Use the same options for every invocation of 'make'.
# Otherwise it will rebuild in %%install due to flags changes.
-cat << \EOF > cgit.conf
+cat << \EOF | tee cgit.conf
V = 1
-CFLAGS = %{optflags}
-LDFLAGS = %{?__global_ldflags}
-DESTDIR = %{buildroot}
-INSTALL = install -p
+CFLAGS = %{build_cflags}
+LDFLAGS = %{build_ldflags}
CACHE_ROOT = %{cachedir}
CGIT_SCRIPT_PATH = %{scriptdir}
CGIT_SCRIPT_NAME = cgit
CGIT_DATA_PATH = %{cgitdata}
+COPYTREE = %{__cp} -rp
+INSTALL = %{__install} -p
docdir = %{docdir}
filterdir = %{filterdir}
prefix = %{_prefix}
EOF
# git build flags
-cat << \EOF > git/config.mak
+cat << \EOF | tee git/config.mak
V = 1
-CFLAGS = %{optflags}
-LDFLAGS = %{?__global_ldflags}
+CFLAGS = %{build_cflags}
+LDFLAGS = %{build_ldflags}
+NO_EXPAT = 1
+NO_PERL = 1
+NO_PYTHON = 1
+NO_TCLTK = 1
EOF
-# I tried to use matchpathcon, but we would need to require
-# selinux-policy-targeted probably.
+# remove env shebang's from filter scripts
+grep -rl '#!.*/env' filters/ | xargs -r sed -Ei 's@^(.+/)env (.+)$@\1\2@'
-build_dist=%{?fedora:fedora}%{?rhel:rhel}
-build_ver=%{?fedora}%{?rhel}
+# remove execute permissions from contrib file
+find contrib -type f | xargs -r chmod -x
-cgit_context=git_sys_content_t
-sed -e "s|@CGIT_CONTEXT@|$cgit_context|g" \
- %{SOURCE3} > README.SELinux
-
-cat > httpd.conf <<EOF
-Alias /cgit-data /usr/share/cgit
-ScriptAlias /cgit /var/www/cgi-bin/cgit
-%if 0%{?fedora} >= 19 || 0%{?rhel} >= 7
-<Directory "/usr/share/cgit">
+# default httpd config
+cat >httpd.conf <<EOF
+Alias /%{name}-data %{cgitdata}
+ScriptAlias /%{name} %{scriptdir}/%{name}
+<Directory "%{cgitdata}">
Require all granted
</Directory>
-%endif
EOF
+touch -r README httpd.conf
%build
-%make_build
+%make_build all doc-man doc-html
-# Something in the a2x chain doesn't like running in parallel. :/
-make -j1 doc-man doc-html
-
-%if %{syntax_highlight}
-# el5 highlight doesn't know --print-style
+%if %{with highlight}
highlight --print-style --style-outfile=stdout >> cgit.css
%endif
%install
%make_install install install-man
-install -d -m0755 %{buildroot}%{_sysconfdir}/httpd/conf.d
-install -p -m0644 %{SOURCE2} %{buildroot}%{_sysconfdir}/cgitrc
-install -p -m0644 httpd.conf %{buildroot}%{_sysconfdir}/httpd/conf.d/cgit.conf
-install -d -m0755 %{buildroot}%{cachedir}
+mkdir -p %{buildroot}%{cachedir} %{buildroot}%{gitrepodir}
+install -Dp -m0644 %{SOURCE2} %{buildroot}%{_sysconfdir}/cgitrc
+install -Dp -m0644 httpd.conf %{buildroot}%{httpdconfd}/%{name}.conf
+
+%check
+%__make %{?_smp_mflags} test
%files
-%defattr(-,root,root,-)
-%doc COPYING README* *.html
+%doc README* contrib *.html
+%license COPYING
%config(noreplace) %{_sysconfdir}/cgitrc
-%if 0%{?rhel} && 0%{?rhel} <= 7
-# Keep those two httpd-owned directories listed here until httpd-filesystem
-# becomes part of EPEL. See rhbz#1138599 for more details.
+%if ! %{with httpd_filesystem}
+# own httpd config dirs on systems without httpd-filesystem
%dir %{_sysconfdir}/httpd
%dir %{_sysconfdir}/httpd/conf.d
%endif
-%config(noreplace) %{_sysconfdir}/httpd/conf.d/cgit.conf
+%config(noreplace) %{httpdconfd}/%{name}.conf
%dir %attr(-,apache,root) %{cachedir}
%{cgitdata}
%{filterdir}
-%{scriptdir}/*
+# exclude byte-compiled python files on EL7
+%{?el7:%exclude %{filterdir}/*.py[co]}
+%{scriptdir}/%{name}
%{_mandir}/man*/*
+%dir %{gitrepodir}
%changelog
-* Fri Aug 03 2018 Todd Zullinger <tmz@pobox.com> - 1.1-11
-- Fix directory traversal vulnerability
+* Sun Jan 02 2022 Todd Zullinger <tmz@pobox.com> - 1.2.3-8
+- update to git-2.34.1
+- use %%__make to run tests in %%check
+
+* Mon Jul 26 2021 Todd Zullinger <tmz@pobox.com> - 1.2.3-7
+- update SELinux README
+- simplify install commands
+- improve httpd config file creation
+- explicitly list the cgit cgi-bin script
+- create /var/lib/git to improve SELinux compatibility
+
+* Wed Jul 21 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1.2.3-6
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
+
+* Sat Jun 05 2021 Todd Zullinger <tmz@pobox.com> - 1.2.3-5
+- include output of cgit.conf and git/config.mak in build logs
+- explicitly disable expat, perl, python, and tcl/tk in git build
+- use %%{gpgverify} macro to verify tarball signature
+- use %%{build_cflags} and %%{build_ldflags}
+- preserve timestamps when running install
+- clean up & improve dist conditionals
+- remove %%_python_bytecompile_extra
+- limit *.py[co] %%exclude to el7
+- refresh highlight v3 patch
+- use git to apply patches
+
+* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1.2.3-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
+
+* Tue Dec 29 2020 Todd Zullinger <tmz@pobox.com>
+- update tar/zstd patch from upstream
+
+* Sat Aug 08 2020 Todd Zullinger <tmz@pobox.com>
+- improve test suite's use of zstd to decode a tar file
+
+* Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1.2.3-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
+* Thu Apr 02 2020 Björn Esser <besser82@fedoraproject.org> - 1.2.3-2
+- Fix string quoting for rpm >= 4.16
+
+* Sat Mar 14 2020 Todd Zullinger <tmz@pobox.com> - 1.2.3-1
+- update to 1.2.3
+
+* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1.2.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
+
+* Tue Jan 14 2020 Todd Zullinger <tmz@pobox.com> - 1.2.2-1
+- update to 1.2.2
+- adjust highlight requirement conditional for EL-7+
+
+* Fri Aug 02 2019 Todd Zullinger <tmz@pobox.com> - 1.2.1-5
+- add missing zlib-devel BuildRequires, fixes FTBFS (#1737005)
+
+* Wed Jul 24 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1.2.1-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
+
+* Thu Jan 31 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1.2.1-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
+
+* Fri Aug 10 2018 Todd Zullinger <tmz@pobox.com> - 1.2.1-2
+- use git's default, collision-detecting SHA1 implementation
+- verify upstream GPG signatures in %%prep
+
+* Fri Aug 03 2018 Todd Zullinger <tmz@pobox.com> - 1.2.1-1
+- Update to 1.2.1, fixes directory traversal vulnerability
+
+* Fri Jul 13 2018 Todd Zullinger <tmz@pobox.com> - 1.2-1
+- Update to 1.2
+- Include contrib dir in docs
+- Update example cgtirc settings
+
+* Thu Jul 12 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-12
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
+
+* Fri Jun 15 2018 Todd Zullinger <tmz@pobox.com> - 1.1-11
+- disable automatic compilation of *.py files outside of python sitelib
+- use %%bcond_(with|without) to toggle highlight
+- use %%autosetup macro
+- drop crufty curl-devel conditional
+- fix parallel make issues in docs
+- simplify README.SELinux install
+- use %%bcond_(with|without) to handle httpd-filesystem
+- avoid libcrypto.so requires
+- run test suite in %%check
+
+* Mon Jun 04 2018 Todd Zullinger <tmz@pobox.com>
+- make config: drop redundant DESTDIR/INSTALL, add COPYTREE
+- remove env shebang's from filter scripts
* Sun Feb 18 2018 Todd Zullinger <tmz@pobox.com> - 1.1-10
- Use https for source URLs
diff --git a/cgitrc b/cgitrc
index 23b6b86..3770c3d 100644
--- a/cgitrc
+++ b/cgitrc
@@ -1,27 +1,39 @@
#
-# See cgitrc(5) or /usr/share/doc/cgit-*/cgitrc.5.html for details
+# See cgitrc(5) or /usr/share/doc/cgit/cgitrc.5.html for details
#
# Enable caching of up to 1000 output entries
cache-size=1000
# Specify some default clone prefixes
-#clone-prefix=git://example.com ssh://example.com/pub/git http://example.com/git
+#clone-prefix=git://example.com ssh://example.com/pub/git https://example.com/git
# Specify the css url
css=/cgit-data/cgit.css
+# Show owner on index page
+#enable-index-owner=1
+
+# Allow http transport git clone
+#enable-http-clone=1
+
# Show extra links for each repository on the index page
-enable-index-links=1
+#enable-index-links=0
+
+# Enable blame page and create links to it from tree page
+#enable-blame=0
# Enable ASCII art commit history graph on the log pages
-enable-commit-graph=1
+#enable-commit-graph=0
# Show number of affected files per commit on the log pages
-enable-log-filecount=1
+#enable-log-filecount=0
# Show number of added/removed lines per commit on the log pages
-enable-log-linecount=1
+#enable-log-linecount=0
+
+# Sort branches by age or name
+#branch-sort=name
# Add a cgit favicon
#favicon=/favicon.ico
@@ -29,14 +41,14 @@ enable-log-linecount=1
# Use a custom logo
logo=/cgit-data/cgit.png
-# Enable statistics per week, month and quarter
-max-stats=quarter
+# Enable statistics per week, month, quarter, or year
+#max-stats=
# Set the title and heading of the repository index page
-#root-title=example.com git repositories
+#root-title=Git Repository Browser
# Set a subheading for the repository index page
-#root-desc=tracking the foobar development
+#root-desc=a fast webinterface for the git dscm
# Include some more info about this site on the index page
#root-readme=/var/www/html/about.html
@@ -59,6 +71,43 @@ mimetype.svg=image/svg+xml
# Enable syntax highlighting (requires the highlight package)
#source-filter=/usr/libexec/cgit/filters/syntax-highlighting.sh
+# Format markdown, restructuredtext, manpages, text files, and html files
+# through the right converters
+#about-filter=/usr/libexec/cgit/filters/about-formatting.sh
+
+##
+## Search for these files in the root of the default branch of repositories
+## for coming up with the about page:
+##
+#readme=:README.md
+#readme=:readme.md
+#readme=:README.mkd
+#readme=:readme.mkd
+#readme=:README.rst
+#readme=:readme.rst
+#readme=:README.html
+#readme=:readme.html
+#readme=:README.htm
+#readme=:readme.htm
+#readme=:README.txt
+#readme=:readme.txt
+#readme=:README
+#readme=:readme
+#readme=:INSTALL.md
+#readme=:install.md
+#readme=:INSTALL.mkd
+#readme=:install.mkd
+#readme=:INSTALL.rst
+#readme=:install.rst
+#readme=:INSTALL.html
+#readme=:install.html
+#readme=:INSTALL.htm
+#readme=:install.htm
+#readme=:INSTALL.txt
+#readme=:install.txt
+#readme=:INSTALL
+#readme=:install
+
##
## List of repositories.
## PS: Any repositories listed when section is unset will not be
diff --git a/gpgkey-96E07AF25771955980DAD10020D04E5A713660A7.asc b/gpgkey-96E07AF25771955980DAD10020D04E5A713660A7.asc
new file mode 100644
index 0000000..5edb58f
--- /dev/null
+++ b/gpgkey-96E07AF25771955980DAD10020D04E5A713660A7.asc
@@ -0,0 +1,144 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+=7hTI
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/gpgkey-AB9942E6D4A4CFC3412620A749FC7012A5DE03AE.asc b/gpgkey-AB9942E6D4A4CFC3412620A749FC7012A5DE03AE.asc
new file mode 100644
index 0000000..db7bb9b
--- /dev/null
+++ b/gpgkey-AB9942E6D4A4CFC3412620A749FC7012A5DE03AE.asc
@@ -0,0 +1,446 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+nL4R5Qie03YIFHrDh/4=
+=GTxh
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/sources b/sources
index 5cb7672..d78c0ad 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,4 @@
-SHA512 (git-2.10.2.tar.xz) = 0ab09de481dbb31c3304382afaa5d3fc9f861115c9954c65b11a8a1c34b939118c7ed3ff60ac329145888596388e3e4d2b2fb677fe109d33a57206d531b5ee6a
-SHA512 (cgit-1.1.tar.xz) = 8f2ec418716d7a6f0880a713b622f2ee41217dc2d5462903841d59d978a021a8bc2be667ca65c25baee2b9dcd4a76bddd0c813bda0486109cc694e7610827051
+SHA512 (cgit-1.2.3.tar.xz) = 58f9bb644b07be49dc51f3ef30a3d0e53699cede3c06b1d6920f3874fe846c83dd2589632aa84357b70ea2d60272448409aa1b892f405d14dd6745f5559b4504
+SHA512 (cgit-1.2.3.tar.asc) = 6694f799bbf7c28baa683be0a2b51b0611d80b9611db9e1705e55e45e2501a1955910f90f9246a8ca52f61a2d34ac6262825f6a0165e67ec57189a8242aa4faa
+SHA512 (git-2.34.1.tar.xz) = a1a8e9e6f64b1da25508fbd2f783564dcdbe181fb5ff1ebab3bdac6db6094e18acc334479a1abf22ac17ce4f733cc3e10a664db9ab234cd523735a3f027b42db
+SHA512 (git-2.34.1.tar.sign) = a1111276e18da1a7b360e3ed3b8460034ea413b116482b0b66342f8873a9dd02a90f3f5bc7ad1e4b3c7f39ed55926a8155064b849e6e6bdf9478cb85b93f10b5