about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.envrc6
-rw-r--r--.gitignore247
-rw-r--r--LICENSE21
-rw-r--r--README.md143
-rwxr-xr-xbin/__dispatch.sh53
l---------bin/age1
l---------bin/age-keygen1
l---------bin/aoc20191
l---------bin/blog_cli1
l---------bin/kms_pass1
l---------bin/kontemplate1
l---------bin/rebuilder1
l---------bin/rink1
l---------bin/stern1
l---------bin/terraform1
-rw-r--r--ci-builds.nix20
-rw-r--r--default.nix61
-rw-r--r--docs/CODE_OF_CONDUCT.md29
-rw-r--r--docs/CONTRIBUTING.md119
-rw-r--r--fun/amsterdump/default.nix13
-rw-r--r--fun/amsterdump/listings-20200105.json2326
-rw-r--r--fun/amsterdump/main.go108
-rw-r--r--fun/amsterdump/scrape.el25
-rw-r--r--fun/aoc2019/default.nix22
-rw-r--r--fun/aoc2019/solution-day1.el28
-rw-r--r--fun/aoc2019/solution-day2.el53
-rw-r--r--fun/aoc2019/solution-day3.el64
-rw-r--r--fun/aoc2019/solution-day4.el73
-rw-r--r--fun/best-tools/README.md156
-rw-r--r--fun/defer_rs/.gitignore3
-rw-r--r--fun/defer_rs/Cargo.toml6
-rw-r--r--fun/defer_rs/README.md53
-rw-r--r--fun/defer_rs/examples/defer-with-error.rs70
-rw-r--r--fun/defer_rs/examples/defer.rs31
-rw-r--r--fun/defer_rs/examples/undefer.rs40
-rw-r--r--fun/elblog/.gitignore1
-rw-r--r--fun/elblog/README.md11
-rw-r--r--fun/elblog/blog.css37
-rw-r--r--fun/elblog/blog.el123
-rw-r--r--fun/elblog/postamble.html9
-rw-r--r--fun/elblog/preamble.html6
-rw-r--r--fun/gemma/CODE_OF_CONDUCT.md20
-rw-r--r--fun/gemma/LICENSE674
-rw-r--r--fun/gemma/README.markdown96
-rw-r--r--fun/gemma/build.lisp5
-rw-r--r--fun/gemma/config.lisp21
-rw-r--r--fun/gemma/default.nix61
-rw-r--r--fun/gemma/frontend/Main.elm221
-rw-r--r--fun/gemma/frontend/elm-package.json17
-rw-r--r--fun/gemma/gemma.asd33
-rw-r--r--fun/gemma/src/gemma.lisp192
-rw-r--r--fun/logo/depot-logo.pngbin0 -> 14985 bytes
-rw-r--r--fun/logo/depot-logo.xcfbin0 -> 358462 bytes
-rw-r--r--fun/quinistry/.gitignore2
-rw-r--r--fun/quinistry/README.md63
-rw-r--r--fun/quinistry/const.go12
-rw-r--r--fun/quinistry/default.nix11
-rw-r--r--fun/quinistry/image.go150
-rw-r--r--fun/quinistry/k8s/child.yaml27
-rw-r--r--fun/quinistry/k8s/parent.yaml27
-rw-r--r--fun/quinistry/main.go57
-rw-r--r--fun/quinistry/types.go79
-rw-r--r--fun/watchblob/README.md35
-rw-r--r--fun/watchblob/default.nix13
-rw-r--r--fun/watchblob/main.go108
-rw-r--r--fun/watchblob/main_test.go96
-rw-r--r--fun/watchblob/urls.go37
-rw-r--r--net/alcoholic_jwt/.gitignore4
-rw-r--r--net/alcoholic_jwt/Cargo.toml16
-rw-r--r--net/alcoholic_jwt/LICENSE674
-rw-r--r--net/alcoholic_jwt/README.md62
-rw-r--r--net/alcoholic_jwt/src/lib.rs451
-rw-r--r--net/alcoholic_jwt/src/tests.rs61
-rw-r--r--net/crimp/.gitignore3
-rw-r--r--net/crimp/Cargo.toml18
-rw-r--r--net/crimp/LICENSE674
-rw-r--r--net/crimp/README.md15
-rw-r--r--net/crimp/src/lib.rs502
-rw-r--r--net/crimp/src/tests.rs152
-rw-r--r--net/stomp_erl/.gitignore10
-rw-r--r--net/stomp_erl/Makefile8
-rw-r--r--net/stomp_erl/README.md78
-rw-r--r--net/stomp_erl/include/stomp.hrl22
-rw-r--r--net/stomp_erl/src/stomp.app.src7
-rw-r--r--net/stomp_erl/src/stomp_app.erl11
-rw-r--r--net/stomp_erl/src/stomp_sup.erl22
-rw-r--r--net/stomp_erl/src/stomp_worker.erl193
-rw-r--r--nix/buildGo/.skip-subtree2
-rw-r--r--nix/buildGo/README.md140
-rw-r--r--nix/buildGo/default.nix128
-rw-r--r--nix/buildGo/example/default.nix47
-rw-r--r--nix/buildGo/example/lib.go9
-rw-r--r--nix/buildGo/example/main.go25
-rw-r--r--nix/buildGo/example/thing.proto10
-rw-r--r--nix/buildGo/external/default.nix95
-rw-r--r--nix/buildGo/external/main.go186
-rw-r--r--nix/buildGo/proto.nix84
-rw-r--r--nix/buildLisp/README.md21
-rw-r--r--nix/buildLisp/default.nix171
-rw-r--r--nix/buildLisp/example/default.nix32
-rw-r--r--nix/buildLisp/example/lib.lisp6
-rw-r--r--nix/buildLisp/example/main.lisp7
-rw-r--r--nix/readTree/README.md81
-rw-r--r--nix/readTree/default.nix63
-rw-r--r--nix/yants/README.md84
-rw-r--r--nix/yants/default.nix298
-rw-r--r--nix/yants/screenshots/enums.pngbin0 -> 41305 bytes
-rw-r--r--nix/yants/screenshots/functions.pngbin0 -> 32907 bytes
-rw-r--r--nix/yants/screenshots/nested-structs.pngbin0 -> 70264 bytes
-rw-r--r--nix/yants/screenshots/simple.pngbin0 -> 43010 bytes
-rw-r--r--nix/yants/screenshots/structs.pngbin0 -> 69499 bytes
-rw-r--r--nix/yants/tests/default.nix94
-rw-r--r--ops/infra/.skip-subtree2
-rwxr-xr-xops/infra/dns/import11
-rw-r--r--ops/infra/dns/kontemplate-works15
-rw-r--r--ops/infra/dns/oslo-pub8
-rw-r--r--ops/infra/dns/root-tazj-in33
-rw-r--r--ops/infra/gcp/.gitignore3
-rw-r--r--ops/infra/gcp/default.tf111
-rw-r--r--ops/infra/kubernetes/cgit/config.yaml73
-rw-r--r--ops/infra/kubernetes/gemma/config.lisp19
-rw-r--r--ops/infra/kubernetes/https-cert/cert.yaml8
-rw-r--r--ops/infra/kubernetes/https-lb/ingress.yaml35
-rw-r--r--ops/infra/kubernetes/nginx/nginx.conf59
-rw-r--r--ops/infra/kubernetes/nginx/nginx.yaml60
-rw-r--r--ops/infra/kubernetes/nixery/config.yaml67
-rw-r--r--ops/infra/kubernetes/nixery/id_nixery.pub1
-rw-r--r--ops/infra/kubernetes/nixery/known_hosts2
-rw-r--r--ops/infra/kubernetes/nixery/secrets.yaml18
-rw-r--r--ops/infra/kubernetes/nixery/ssh_config4
-rw-r--r--ops/infra/kubernetes/primary-cluster.yaml38
-rw-r--r--ops/infra/kubernetes/tazblog/config.yaml34
-rw-r--r--ops/journaldriver/.gitignore3
-rw-r--r--ops/journaldriver/Cargo.lock816
-rw-r--r--ops/journaldriver/Cargo.toml21
-rw-r--r--ops/journaldriver/README.md152
-rw-r--r--ops/journaldriver/build.rs6
-rw-r--r--ops/journaldriver/default.nix9
-rw-r--r--ops/journaldriver/src/main.rs665
-rw-r--r--ops/journaldriver/src/tests.rs95
-rw-r--r--ops/kms_pass.nix61
-rw-r--r--ops/kontemplate/.gitignore2
-rw-r--r--ops/kontemplate/LICENSE674
-rw-r--r--ops/kontemplate/README.md187
-rwxr-xr-xops/kontemplate/build-release.sh75
-rw-r--r--ops/kontemplate/context/context.go266
-rw-r--r--ops/kontemplate/context/context_test.go353
-rw-r--r--ops/kontemplate/context/testdata/collections-test.yaml15
-rw-r--r--ops/kontemplate/context/testdata/default-loading.yaml6
-rw-r--r--ops/kontemplate/context/testdata/default/default.yaml2
-rw-r--r--ops/kontemplate/context/testdata/explicit-path.yaml11
-rw-r--r--ops/kontemplate/context/testdata/explicit-subresource-path.yaml8
-rw-r--r--ops/kontemplate/context/testdata/flat-test.yaml10
-rw-r--r--ops/kontemplate/context/testdata/flat-with-args-test.yaml9
-rw-r--r--ops/kontemplate/context/testdata/import-vars-simple.yaml5
-rw-r--r--ops/kontemplate/context/testdata/merging/context.yaml15
-rw-r--r--ops/kontemplate/context/testdata/merging/import-vars.yaml4
-rw-r--r--ops/kontemplate/context/testdata/merging/resource/default.yaml5
-rw-r--r--ops/kontemplate/context/testdata/merging/resource/output.yaml5
-rw-r--r--ops/kontemplate/context/testdata/parent-variable-override.yaml10
-rw-r--r--ops/kontemplate/context/testdata/parent-variables.yaml10
-rw-r--r--ops/kontemplate/context/testdata/test-vars-override.yaml3
-rw-r--r--ops/kontemplate/context/testdata/test-vars.yaml5
-rw-r--r--ops/kontemplate/default.nix36
-rw-r--r--ops/kontemplate/deps.nix111
-rw-r--r--ops/kontemplate/docs/cluster-config.md106
-rw-r--r--ops/kontemplate/docs/resource-sets.md170
-rw-r--r--ops/kontemplate/docs/templates.md153
-rw-r--r--ops/kontemplate/docs/tips-and-tricks.md77
-rw-r--r--ops/kontemplate/example/other-config.yaml7
-rw-r--r--ops/kontemplate/example/prod-cluster.json16
-rw-r--r--ops/kontemplate/example/prod-cluster.yaml17
-rw-r--r--ops/kontemplate/example/some-api/some-api.yaml52
-rw-r--r--ops/kontemplate/example/some-api/some.cfg4
-rw-r--r--ops/kontemplate/image/Dockerfile15
-rw-r--r--ops/kontemplate/image/README.md12
-rw-r--r--ops/kontemplate/image/hashes2
-rw-r--r--ops/kontemplate/main.go242
-rw-r--r--ops/kontemplate/release.nix54
-rw-r--r--ops/kontemplate/templater/dns.go35
-rw-r--r--ops/kontemplate/templater/pass.go34
-rw-r--r--ops/kontemplate/templater/templater.go236
-rw-r--r--ops/kontemplate/templater/templater_test.go205
-rw-r--r--ops/kontemplate/templater/testdata/test-default.txt1
-rw-r--r--ops/kontemplate/templater/testdata/test-insertTemplate.txt1
-rw-r--r--ops/kontemplate/templater/testdata/test-template.txt1
-rw-r--r--ops/kontemplate/util/util.go58
-rw-r--r--ops/kontemplate/util/util_test.go83
-rw-r--r--ops/nixos/.gitignore3
-rw-r--r--ops/nixos/README.md19
-rw-r--r--ops/nixos/default.nix39
-rw-r--r--ops/nixos/dotfiles/config.fish40
-rw-r--r--ops/nixos/dotfiles/msmtprc16
-rw-r--r--ops/nixos/dotfiles/notmuch-config21
-rw-r--r--ops/nixos/dotfiles/offlineimaprc39
-rw-r--r--ops/nixos/mail.nix77
-rw-r--r--ops/nixos/nugget/default.nix204
-rw-r--r--ops/secrets/.skip-subtree1
-rw-r--r--ops/secrets/gcsr-tazjin-passwordbin0 -> 186 bytes
-rw-r--r--ops/secrets/gmaps-api-keybin0 -> 121 bytes
-rw-r--r--ops/secrets/nixery-gcs-jsonbin0 -> 2416 bytes
-rw-r--r--ops/secrets/nixery-gcs-pembin0 -> 3214 bytes
-rw-r--r--ops/secrets/nixery-ssh-privatebin0 -> 1906 bytes
-rw-r--r--ops/sync-gcsr/default.nix10
-rw-r--r--ops/sync-gcsr/main.go129
-rw-r--r--overrides/default.nix28
-rw-r--r--overrides/elmPackages/default.nix10
-rw-r--r--overrides/kontemplate/default.nix13
-rw-r--r--overrides/lispPackages/default.nix8
-rw-r--r--overrides/lispPackages/quicklisp-to-nix-output/cl-prevalence.nix27
-rw-r--r--overrides/lispPackages/quicklisp-to-nix-output/s-sysdeps.nix25
-rw-r--r--overrides/lispPackages/quicklisp-to-nix-output/s-xml.nix27
-rw-r--r--overrides/lispPackages/quicklisp.nix26
-rw-r--r--overrides/writeElispBin/default.nix23
-rw-r--r--presentations/bootstrapping-2018/README.md5
-rw-r--r--presentations/bootstrapping-2018/default.nix50
-rw-r--r--presentations/bootstrapping-2018/drake-meme.pngbin0 -> 246872 bytes
-rw-r--r--presentations/bootstrapping-2018/nixos-logo.pngbin0 -> 90542 bytes
-rw-r--r--presentations/bootstrapping-2018/notes.org89
-rw-r--r--presentations/bootstrapping-2018/presentation.pdfbin0 -> 527371 bytes
-rw-r--r--presentations/bootstrapping-2018/presentation.tex251
-rw-r--r--presentations/bootstrapping-2018/quine-relay.pngbin0 -> 52350 bytes
-rw-r--r--presentations/bootstrapping-2018/result.pdfpc142
-rw-r--r--presentations/erlang-2016/.skip-subtree (renamed from contrib/credential/netrc/test.netrc.gpg)0
-rw-r--r--presentations/erlang-2016/README.md6
-rw-r--r--presentations/erlang-2016/presentation.md222
-rw-r--r--presentations/erlang-2016/presentation.pdfbin0 -> 1777976 bytes
-rw-r--r--presentations/erlang-2016/src/hello.erl5
-rw-r--r--presentations/erlang-2016/src/hello1.erl5
-rw-r--r--presentations/erlang-2016/src/hello2.erl11
-rw-r--r--presentations/erlang-2016/src/hello_server.erl12
-rw-r--r--presentations/erlang-2016/src/hello_server2.erl36
-rw-r--r--presentations/erlang-2016/src/hello_sup.erl24
-rw-r--r--presentations/servant-2016/Makefile8
-rw-r--r--presentations/servant-2016/README.md7
-rw-r--r--presentations/servant-2016/slides.pdfbin0 -> 71174 bytes
-rw-r--r--presentations/servant-2016/slides.pdfpc75
-rw-r--r--presentations/servant-2016/slides.tex137
-rw-r--r--presentations/systemd-2016/.gitignore6
-rw-r--r--presentations/systemd-2016/.skip-subtree1
-rw-r--r--presentations/systemd-2016/Makefile11
-rw-r--r--presentations/systemd-2016/README.md6
-rw-r--r--presentations/systemd-2016/demo/demo-error.service7
-rw-r--r--presentations/systemd-2016/demo/demo-limits.slice7
-rw-r--r--presentations/systemd-2016/demo/demo-notify@.service6
-rw-r--r--presentations/systemd-2016/demo/demo-path.path6
-rw-r--r--presentations/systemd-2016/demo/demo-stress.service6
-rw-r--r--presentations/systemd-2016/demo/demo-timer.timer12
-rw-r--r--presentations/systemd-2016/demo/demo.service6
-rw-r--r--presentations/systemd-2016/demo/notes.md27
-rw-r--r--presentations/systemd-2016/slides.pdfbin0 -> 258221 bytes
-rw-r--r--presentations/systemd-2016/slides.pdfpc85
-rw-r--r--presentations/systemd-2016/slides.tex160
-rw-r--r--presentations/systemd-2016/systemdcomponents.pngbin0 -> 233143 bytes
-rw-r--r--third_party/README.md13
-rw-r--r--third_party/cgit/.gitignore12
-rw-r--r--third_party/cgit/.gitmodules3
-rw-r--r--third_party/cgit/.mailmap10
-rw-r--r--third_party/cgit/AUTHORS13
-rw-r--r--third_party/cgit/COPYING339
-rw-r--r--third_party/cgit/Makefile170
-rw-r--r--third_party/cgit/README99
-rw-r--r--third_party/cgit/cache.c468
-rw-r--r--third_party/cgit/cache.h37
-rw-r--r--third_party/cgit/cgit.c1112
-rw-r--r--third_party/cgit/cgit.css895
-rw-r--r--third_party/cgit/cgit.h398
-rw-r--r--third_party/cgit/cgit.mk141
-rw-r--r--third_party/cgit/cgit.pngbin0 -> 1366 bytes
-rw-r--r--third_party/cgit/cgitrc.5.txt1008
-rw-r--r--third_party/cgit/cmd.c208
-rw-r--r--third_party/cgit/cmd.h16
-rw-r--r--third_party/cgit/configfile.c90
-rw-r--r--third_party/cgit/configfile.h10
-rwxr-xr-xthird_party/cgit/contrib/hooks/post-receive.agefile19
-rw-r--r--third_party/cgit/favicon.icobin0 -> 1078 bytes
-rw-r--r--third_party/cgit/filter.c457
-rwxr-xr-xthird_party/cgit/filters/about-formatting.sh27
-rwxr-xr-xthird_party/cgit/filters/commit-links.sh28
-rw-r--r--third_party/cgit/filters/email-gravatar.lua35
-rwxr-xr-xthird_party/cgit/filters/email-gravatar.py39
-rw-r--r--third_party/cgit/filters/email-libravatar.lua36
-rw-r--r--third_party/cgit/filters/file-authentication.lua359
-rw-r--r--third_party/cgit/filters/gentoo-ldap-authentication.lua360
-rwxr-xr-xthird_party/cgit/filters/html-converters/man2html4
-rwxr-xr-xthird_party/cgit/filters/html-converters/md2html307
-rwxr-xr-xthird_party/cgit/filters/html-converters/rst2html2
-rwxr-xr-xthird_party/cgit/filters/html-converters/txt2html4
-rw-r--r--third_party/cgit/filters/owner-example.lua17
-rw-r--r--third_party/cgit/filters/simple-authentication.lua314
-rwxr-xr-xthird_party/cgit/filters/syntax-highlighting.py55
-rwxr-xr-xthird_party/cgit/filters/syntax-highlighting.sh121
-rwxr-xr-xthird_party/cgit/gen-version.sh20
m---------third_party/cgit/git0
-rw-r--r--third_party/cgit/html.c344
-rw-r--r--third_party/cgit/html.h37
-rw-r--r--third_party/cgit/parsing.c224
-rw-r--r--third_party/cgit/robots.txt3
-rw-r--r--third_party/cgit/scan-tree.c270
-rw-r--r--third_party/cgit/scan-tree.h2
-rw-r--r--third_party/cgit/shared.c579
-rw-r--r--third_party/cgit/tests/.gitignore2
-rw-r--r--third_party/cgit/tests/Makefile17
-rw-r--r--third_party/cgit/tests/filters/dump.lua17
-rwxr-xr-xthird_party/cgit/tests/filters/dump.sh4
-rwxr-xr-xthird_party/cgit/tests/setup.sh176
-rwxr-xr-xthird_party/cgit/tests/t0001-validate-git-versions.sh41
-rwxr-xr-xthird_party/cgit/tests/t0010-validate-html.sh40
-rwxr-xr-xthird_party/cgit/tests/t0020-validate-cache.sh78
-rwxr-xr-xthird_party/cgit/tests/t0101-index.sh17
-rwxr-xr-xthird_party/cgit/tests/t0102-summary.sh25
-rwxr-xr-xthird_party/cgit/tests/t0103-log.sh24
-rwxr-xr-xthird_party/cgit/tests/t0104-tree.sh32
-rwxr-xr-xthird_party/cgit/tests/t0105-commit.sh36
-rwxr-xr-xthird_party/cgit/tests/t0106-diff.sh19
-rwxr-xr-xthird_party/cgit/tests/t0107-snapshot.sh82
-rwxr-xr-xthird_party/cgit/tests/t0108-patch.sh62
-rwxr-xr-xthird_party/cgit/tests/t0109-gitconfig.sh42
-rwxr-xr-xthird_party/cgit/tests/t0110-rawdiff.sh42
-rwxr-xr-xthird_party/cgit/tests/t0111-filter.sh46
-rwxr-xr-xthird_party/cgit/tests/valgrind/bin/cgit12
-rw-r--r--third_party/cgit/ui-atom.c149
-rw-r--r--third_party/cgit/ui-atom.h6
-rw-r--r--third_party/cgit/ui-blame.c302
-rw-r--r--third_party/cgit/ui-blame.h6
-rw-r--r--third_party/cgit/ui-blob.c181
-rw-r--r--third_party/cgit/ui-blob.h8
-rw-r--r--third_party/cgit/ui-clone.c126
-rw-r--r--third_party/cgit/ui-clone.h8
-rw-r--r--third_party/cgit/ui-commit.c147
-rw-r--r--third_party/cgit/ui-commit.h6
-rw-r--r--third_party/cgit/ui-diff.c501
-rw-r--r--third_party/cgit/ui-diff.h15
-rw-r--r--third_party/cgit/ui-log.c550
-rw-r--r--third_party/cgit/ui-log.h9
-rw-r--r--third_party/cgit/ui-patch.c98
-rw-r--r--third_party/cgit/ui-patch.h7
-rw-r--r--third_party/cgit/ui-plain.c207
-rw-r--r--third_party/cgit/ui-plain.h6
-rw-r--r--third_party/cgit/ui-refs.c219
-rw-r--r--third_party/cgit/ui-refs.h8
-rw-r--r--third_party/cgit/ui-repolist.c379
-rw-r--r--third_party/cgit/ui-repolist.h7
-rw-r--r--third_party/cgit/ui-shared.c1210
-rw-r--r--third_party/cgit/ui-shared.h87
-rw-r--r--third_party/cgit/ui-snapshot.c302
-rw-r--r--third_party/cgit/ui-snapshot.h7
-rw-r--r--third_party/cgit/ui-ssdiff.c420
-rw-r--r--third_party/cgit/ui-ssdiff.h25
-rw-r--r--third_party/cgit/ui-stats.c426
-rw-r--r--third_party/cgit/ui-stats.h28
-rw-r--r--third_party/cgit/ui-summary.c148
-rw-r--r--third_party/cgit/ui-summary.h7
-rw-r--r--third_party/cgit/ui-tag.c120
-rw-r--r--third_party/cgit/ui-tag.h6
-rw-r--r--third_party/cgit/ui-tree.c388
-rw-r--r--third_party/cgit/ui-tree.h6
-rw-r--r--third_party/default.nix111
-rw-r--r--third_party/emacs/carp-mode.nix23
-rw-r--r--third_party/git/.clang-format (renamed from .clang-format)0
-rw-r--r--third_party/git/.editorconfig (renamed from .editorconfig)0
-rw-r--r--third_party/git/.gitattributes (renamed from .gitattributes)0
-rw-r--r--third_party/git/.github/CONTRIBUTING.md (renamed from .github/CONTRIBUTING.md)0
-rw-r--r--third_party/git/.github/PULL_REQUEST_TEMPLATE.md (renamed from .github/PULL_REQUEST_TEMPLATE.md)0
-rw-r--r--third_party/git/.gitignore240
-rw-r--r--third_party/git/.gitmodules (renamed from .gitmodules)0
-rw-r--r--third_party/git/.mailmap (renamed from .mailmap)0
-rw-r--r--third_party/git/.travis.yml (renamed from .travis.yml)0
-rw-r--r--third_party/git/.tsan-suppressions (renamed from .tsan-suppressions)0
-rw-r--r--third_party/git/COPYING (renamed from COPYING)0
-rw-r--r--third_party/git/Documentation/.gitattributes (renamed from Documentation/.gitattributes)0
-rw-r--r--third_party/git/Documentation/.gitignore (renamed from Documentation/.gitignore)0
-rw-r--r--third_party/git/Documentation/CodingGuidelines (renamed from Documentation/CodingGuidelines)0
-rw-r--r--third_party/git/Documentation/Makefile (renamed from Documentation/Makefile)0
-rw-r--r--third_party/git/Documentation/MyFirstContribution.txt (renamed from Documentation/MyFirstContribution.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.0.1.txt (renamed from Documentation/RelNotes/1.5.0.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.0.2.txt (renamed from Documentation/RelNotes/1.5.0.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.0.3.txt (renamed from Documentation/RelNotes/1.5.0.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.0.4.txt (renamed from Documentation/RelNotes/1.5.0.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.0.5.txt (renamed from Documentation/RelNotes/1.5.0.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.0.6.txt (renamed from Documentation/RelNotes/1.5.0.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.0.7.txt (renamed from Documentation/RelNotes/1.5.0.7.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.0.txt (renamed from Documentation/RelNotes/1.5.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.1.1.txt (renamed from Documentation/RelNotes/1.5.1.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.1.2.txt (renamed from Documentation/RelNotes/1.5.1.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.1.3.txt (renamed from Documentation/RelNotes/1.5.1.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.1.4.txt (renamed from Documentation/RelNotes/1.5.1.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.1.5.txt (renamed from Documentation/RelNotes/1.5.1.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.1.6.txt (renamed from Documentation/RelNotes/1.5.1.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.1.txt (renamed from Documentation/RelNotes/1.5.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.2.1.txt (renamed from Documentation/RelNotes/1.5.2.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.2.2.txt (renamed from Documentation/RelNotes/1.5.2.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.2.3.txt (renamed from Documentation/RelNotes/1.5.2.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.2.4.txt (renamed from Documentation/RelNotes/1.5.2.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.2.5.txt (renamed from Documentation/RelNotes/1.5.2.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.2.txt (renamed from Documentation/RelNotes/1.5.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.3.1.txt (renamed from Documentation/RelNotes/1.5.3.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.3.2.txt (renamed from Documentation/RelNotes/1.5.3.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.3.3.txt (renamed from Documentation/RelNotes/1.5.3.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.3.4.txt (renamed from Documentation/RelNotes/1.5.3.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.3.5.txt (renamed from Documentation/RelNotes/1.5.3.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.3.6.txt (renamed from Documentation/RelNotes/1.5.3.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.3.7.txt (renamed from Documentation/RelNotes/1.5.3.7.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.3.8.txt (renamed from Documentation/RelNotes/1.5.3.8.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.3.txt (renamed from Documentation/RelNotes/1.5.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.4.1.txt (renamed from Documentation/RelNotes/1.5.4.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.4.2.txt (renamed from Documentation/RelNotes/1.5.4.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.4.3.txt (renamed from Documentation/RelNotes/1.5.4.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.4.4.txt (renamed from Documentation/RelNotes/1.5.4.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.4.5.txt (renamed from Documentation/RelNotes/1.5.4.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.4.6.txt (renamed from Documentation/RelNotes/1.5.4.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.4.7.txt (renamed from Documentation/RelNotes/1.5.4.7.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.4.txt (renamed from Documentation/RelNotes/1.5.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.5.1.txt (renamed from Documentation/RelNotes/1.5.5.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.5.2.txt (renamed from Documentation/RelNotes/1.5.5.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.5.3.txt (renamed from Documentation/RelNotes/1.5.5.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.5.4.txt (renamed from Documentation/RelNotes/1.5.5.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.5.5.txt (renamed from Documentation/RelNotes/1.5.5.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.5.6.txt (renamed from Documentation/RelNotes/1.5.5.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.5.txt (renamed from Documentation/RelNotes/1.5.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.6.1.txt (renamed from Documentation/RelNotes/1.5.6.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.6.2.txt (renamed from Documentation/RelNotes/1.5.6.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.6.3.txt (renamed from Documentation/RelNotes/1.5.6.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.6.4.txt (renamed from Documentation/RelNotes/1.5.6.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.6.5.txt (renamed from Documentation/RelNotes/1.5.6.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.6.6.txt (renamed from Documentation/RelNotes/1.5.6.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.5.6.txt (renamed from Documentation/RelNotes/1.5.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.0.1.txt (renamed from Documentation/RelNotes/1.6.0.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.0.2.txt (renamed from Documentation/RelNotes/1.6.0.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.0.3.txt (renamed from Documentation/RelNotes/1.6.0.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.0.4.txt (renamed from Documentation/RelNotes/1.6.0.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.0.5.txt (renamed from Documentation/RelNotes/1.6.0.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.0.6.txt (renamed from Documentation/RelNotes/1.6.0.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.0.txt (renamed from Documentation/RelNotes/1.6.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.1.1.txt (renamed from Documentation/RelNotes/1.6.1.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.1.2.txt (renamed from Documentation/RelNotes/1.6.1.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.1.3.txt (renamed from Documentation/RelNotes/1.6.1.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.1.4.txt (renamed from Documentation/RelNotes/1.6.1.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.1.txt (renamed from Documentation/RelNotes/1.6.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.2.1.txt (renamed from Documentation/RelNotes/1.6.2.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.2.2.txt (renamed from Documentation/RelNotes/1.6.2.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.2.3.txt (renamed from Documentation/RelNotes/1.6.2.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.2.4.txt (renamed from Documentation/RelNotes/1.6.2.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.2.5.txt (renamed from Documentation/RelNotes/1.6.2.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.2.txt (renamed from Documentation/RelNotes/1.6.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.3.1.txt (renamed from Documentation/RelNotes/1.6.3.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.3.2.txt (renamed from Documentation/RelNotes/1.6.3.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.3.3.txt (renamed from Documentation/RelNotes/1.6.3.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.3.4.txt (renamed from Documentation/RelNotes/1.6.3.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.3.txt (renamed from Documentation/RelNotes/1.6.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.4.1.txt (renamed from Documentation/RelNotes/1.6.4.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.4.2.txt (renamed from Documentation/RelNotes/1.6.4.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.4.3.txt (renamed from Documentation/RelNotes/1.6.4.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.4.4.txt (renamed from Documentation/RelNotes/1.6.4.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.4.5.txt (renamed from Documentation/RelNotes/1.6.4.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.4.txt (renamed from Documentation/RelNotes/1.6.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.5.1.txt (renamed from Documentation/RelNotes/1.6.5.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.5.2.txt (renamed from Documentation/RelNotes/1.6.5.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.5.3.txt (renamed from Documentation/RelNotes/1.6.5.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.5.4.txt (renamed from Documentation/RelNotes/1.6.5.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.5.5.txt (renamed from Documentation/RelNotes/1.6.5.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.5.6.txt (renamed from Documentation/RelNotes/1.6.5.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.5.7.txt (renamed from Documentation/RelNotes/1.6.5.7.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.5.8.txt (renamed from Documentation/RelNotes/1.6.5.8.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.5.9.txt (renamed from Documentation/RelNotes/1.6.5.9.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.5.txt (renamed from Documentation/RelNotes/1.6.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.6.1.txt (renamed from Documentation/RelNotes/1.6.6.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.6.2.txt (renamed from Documentation/RelNotes/1.6.6.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.6.3.txt (renamed from Documentation/RelNotes/1.6.6.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.6.6.txt (renamed from Documentation/RelNotes/1.6.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.0.1.txt (renamed from Documentation/RelNotes/1.7.0.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.0.2.txt (renamed from Documentation/RelNotes/1.7.0.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.0.3.txt (renamed from Documentation/RelNotes/1.7.0.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.0.4.txt (renamed from Documentation/RelNotes/1.7.0.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.0.5.txt (renamed from Documentation/RelNotes/1.7.0.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.0.6.txt (renamed from Documentation/RelNotes/1.7.0.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.0.7.txt (renamed from Documentation/RelNotes/1.7.0.7.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.0.8.txt (renamed from Documentation/RelNotes/1.7.0.8.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.0.9.txt (renamed from Documentation/RelNotes/1.7.0.9.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.0.txt (renamed from Documentation/RelNotes/1.7.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.1.1.txt (renamed from Documentation/RelNotes/1.7.1.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.1.2.txt (renamed from Documentation/RelNotes/1.7.1.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.1.3.txt (renamed from Documentation/RelNotes/1.7.1.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.1.4.txt (renamed from Documentation/RelNotes/1.7.1.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.1.txt (renamed from Documentation/RelNotes/1.7.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.10.1.txt (renamed from Documentation/RelNotes/1.7.10.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.10.2.txt (renamed from Documentation/RelNotes/1.7.10.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.10.3.txt (renamed from Documentation/RelNotes/1.7.10.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.10.4.txt (renamed from Documentation/RelNotes/1.7.10.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.10.5.txt (renamed from Documentation/RelNotes/1.7.10.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.10.txt (renamed from Documentation/RelNotes/1.7.10.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.11.1.txt (renamed from Documentation/RelNotes/1.7.11.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.11.2.txt (renamed from Documentation/RelNotes/1.7.11.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.11.3.txt (renamed from Documentation/RelNotes/1.7.11.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.11.4.txt (renamed from Documentation/RelNotes/1.7.11.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.11.5.txt (renamed from Documentation/RelNotes/1.7.11.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.11.6.txt (renamed from Documentation/RelNotes/1.7.11.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.11.7.txt (renamed from Documentation/RelNotes/1.7.11.7.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.11.txt (renamed from Documentation/RelNotes/1.7.11.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.12.1.txt (renamed from Documentation/RelNotes/1.7.12.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.12.2.txt (renamed from Documentation/RelNotes/1.7.12.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.12.3.txt (renamed from Documentation/RelNotes/1.7.12.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.12.4.txt (renamed from Documentation/RelNotes/1.7.12.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.12.txt (renamed from Documentation/RelNotes/1.7.12.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.2.1.txt (renamed from Documentation/RelNotes/1.7.2.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.2.2.txt (renamed from Documentation/RelNotes/1.7.2.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.2.3.txt (renamed from Documentation/RelNotes/1.7.2.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.2.4.txt (renamed from Documentation/RelNotes/1.7.2.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.2.5.txt (renamed from Documentation/RelNotes/1.7.2.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.2.txt (renamed from Documentation/RelNotes/1.7.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.3.1.txt (renamed from Documentation/RelNotes/1.7.3.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.3.2.txt (renamed from Documentation/RelNotes/1.7.3.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.3.3.txt (renamed from Documentation/RelNotes/1.7.3.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.3.4.txt (renamed from Documentation/RelNotes/1.7.3.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.3.5.txt (renamed from Documentation/RelNotes/1.7.3.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.3.txt (renamed from Documentation/RelNotes/1.7.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.4.1.txt (renamed from Documentation/RelNotes/1.7.4.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.4.2.txt (renamed from Documentation/RelNotes/1.7.4.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.4.3.txt (renamed from Documentation/RelNotes/1.7.4.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.4.4.txt (renamed from Documentation/RelNotes/1.7.4.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.4.5.txt (renamed from Documentation/RelNotes/1.7.4.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.4.txt (renamed from Documentation/RelNotes/1.7.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.5.1.txt (renamed from Documentation/RelNotes/1.7.5.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.5.2.txt (renamed from Documentation/RelNotes/1.7.5.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.5.3.txt (renamed from Documentation/RelNotes/1.7.5.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.5.4.txt (renamed from Documentation/RelNotes/1.7.5.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.5.txt (renamed from Documentation/RelNotes/1.7.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.6.1.txt (renamed from Documentation/RelNotes/1.7.6.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.6.2.txt (renamed from Documentation/RelNotes/1.7.6.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.6.3.txt (renamed from Documentation/RelNotes/1.7.6.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.6.4.txt (renamed from Documentation/RelNotes/1.7.6.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.6.5.txt (renamed from Documentation/RelNotes/1.7.6.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.6.6.txt (renamed from Documentation/RelNotes/1.7.6.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.6.txt (renamed from Documentation/RelNotes/1.7.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.7.1.txt (renamed from Documentation/RelNotes/1.7.7.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.7.2.txt (renamed from Documentation/RelNotes/1.7.7.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.7.3.txt (renamed from Documentation/RelNotes/1.7.7.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.7.4.txt (renamed from Documentation/RelNotes/1.7.7.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.7.5.txt (renamed from Documentation/RelNotes/1.7.7.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.7.6.txt (renamed from Documentation/RelNotes/1.7.7.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.7.7.txt (renamed from Documentation/RelNotes/1.7.7.7.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.7.txt (renamed from Documentation/RelNotes/1.7.7.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.8.1.txt (renamed from Documentation/RelNotes/1.7.8.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.8.2.txt (renamed from Documentation/RelNotes/1.7.8.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.8.3.txt (renamed from Documentation/RelNotes/1.7.8.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.8.4.txt (renamed from Documentation/RelNotes/1.7.8.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.8.5.txt (renamed from Documentation/RelNotes/1.7.8.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.8.6.txt (renamed from Documentation/RelNotes/1.7.8.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.8.txt (renamed from Documentation/RelNotes/1.7.8.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.9.1.txt (renamed from Documentation/RelNotes/1.7.9.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.9.2.txt (renamed from Documentation/RelNotes/1.7.9.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.9.3.txt (renamed from Documentation/RelNotes/1.7.9.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.9.4.txt (renamed from Documentation/RelNotes/1.7.9.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.9.5.txt (renamed from Documentation/RelNotes/1.7.9.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.9.6.txt (renamed from Documentation/RelNotes/1.7.9.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.9.7.txt (renamed from Documentation/RelNotes/1.7.9.7.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.7.9.txt (renamed from Documentation/RelNotes/1.7.9.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.0.1.txt (renamed from Documentation/RelNotes/1.8.0.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.0.2.txt (renamed from Documentation/RelNotes/1.8.0.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.0.3.txt (renamed from Documentation/RelNotes/1.8.0.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.0.txt (renamed from Documentation/RelNotes/1.8.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.1.1.txt (renamed from Documentation/RelNotes/1.8.1.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.1.2.txt (renamed from Documentation/RelNotes/1.8.1.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.1.3.txt (renamed from Documentation/RelNotes/1.8.1.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.1.4.txt (renamed from Documentation/RelNotes/1.8.1.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.1.5.txt (renamed from Documentation/RelNotes/1.8.1.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.1.6.txt (renamed from Documentation/RelNotes/1.8.1.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.1.txt (renamed from Documentation/RelNotes/1.8.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.2.1.txt (renamed from Documentation/RelNotes/1.8.2.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.2.2.txt (renamed from Documentation/RelNotes/1.8.2.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.2.3.txt (renamed from Documentation/RelNotes/1.8.2.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.2.txt (renamed from Documentation/RelNotes/1.8.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.3.1.txt (renamed from Documentation/RelNotes/1.8.3.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.3.2.txt (renamed from Documentation/RelNotes/1.8.3.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.3.3.txt (renamed from Documentation/RelNotes/1.8.3.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.3.4.txt (renamed from Documentation/RelNotes/1.8.3.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.3.txt (renamed from Documentation/RelNotes/1.8.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.4.1.txt (renamed from Documentation/RelNotes/1.8.4.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.4.2.txt (renamed from Documentation/RelNotes/1.8.4.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.4.3.txt (renamed from Documentation/RelNotes/1.8.4.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.4.4.txt (renamed from Documentation/RelNotes/1.8.4.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.4.5.txt (renamed from Documentation/RelNotes/1.8.4.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.4.txt (renamed from Documentation/RelNotes/1.8.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.5.1.txt (renamed from Documentation/RelNotes/1.8.5.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.5.2.txt (renamed from Documentation/RelNotes/1.8.5.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.5.3.txt (renamed from Documentation/RelNotes/1.8.5.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.5.4.txt (renamed from Documentation/RelNotes/1.8.5.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.5.5.txt (renamed from Documentation/RelNotes/1.8.5.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.5.6.txt (renamed from Documentation/RelNotes/1.8.5.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.8.5.txt (renamed from Documentation/RelNotes/1.8.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.9.0.txt (renamed from Documentation/RelNotes/1.9.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.9.1.txt (renamed from Documentation/RelNotes/1.9.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.9.2.txt (renamed from Documentation/RelNotes/1.9.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.9.3.txt (renamed from Documentation/RelNotes/1.9.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.9.4.txt (renamed from Documentation/RelNotes/1.9.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/1.9.5.txt (renamed from Documentation/RelNotes/1.9.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.0.0.txt (renamed from Documentation/RelNotes/2.0.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.0.1.txt (renamed from Documentation/RelNotes/2.0.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.0.2.txt (renamed from Documentation/RelNotes/2.0.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.0.3.txt (renamed from Documentation/RelNotes/2.0.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.0.4.txt (renamed from Documentation/RelNotes/2.0.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.0.5.txt (renamed from Documentation/RelNotes/2.0.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.1.0.txt (renamed from Documentation/RelNotes/2.1.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.1.1.txt (renamed from Documentation/RelNotes/2.1.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.1.2.txt (renamed from Documentation/RelNotes/2.1.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.1.3.txt (renamed from Documentation/RelNotes/2.1.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.1.4.txt (renamed from Documentation/RelNotes/2.1.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.10.0.txt (renamed from Documentation/RelNotes/2.10.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.10.1.txt (renamed from Documentation/RelNotes/2.10.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.10.2.txt (renamed from Documentation/RelNotes/2.10.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.10.3.txt (renamed from Documentation/RelNotes/2.10.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.10.4.txt (renamed from Documentation/RelNotes/2.10.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.10.5.txt (renamed from Documentation/RelNotes/2.10.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.11.0.txt (renamed from Documentation/RelNotes/2.11.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.11.1.txt (renamed from Documentation/RelNotes/2.11.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.11.2.txt (renamed from Documentation/RelNotes/2.11.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.11.3.txt (renamed from Documentation/RelNotes/2.11.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.11.4.txt (renamed from Documentation/RelNotes/2.11.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.12.0.txt (renamed from Documentation/RelNotes/2.12.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.12.1.txt (renamed from Documentation/RelNotes/2.12.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.12.2.txt (renamed from Documentation/RelNotes/2.12.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.12.3.txt (renamed from Documentation/RelNotes/2.12.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.12.4.txt (renamed from Documentation/RelNotes/2.12.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.12.5.txt (renamed from Documentation/RelNotes/2.12.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.13.0.txt (renamed from Documentation/RelNotes/2.13.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.13.1.txt (renamed from Documentation/RelNotes/2.13.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.13.2.txt (renamed from Documentation/RelNotes/2.13.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.13.3.txt (renamed from Documentation/RelNotes/2.13.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.13.4.txt (renamed from Documentation/RelNotes/2.13.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.13.5.txt (renamed from Documentation/RelNotes/2.13.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.13.6.txt (renamed from Documentation/RelNotes/2.13.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.13.7.txt (renamed from Documentation/RelNotes/2.13.7.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.14.0.txt (renamed from Documentation/RelNotes/2.14.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.14.1.txt (renamed from Documentation/RelNotes/2.14.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.14.2.txt (renamed from Documentation/RelNotes/2.14.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.14.3.txt (renamed from Documentation/RelNotes/2.14.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.14.4.txt (renamed from Documentation/RelNotes/2.14.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.14.5.txt (renamed from Documentation/RelNotes/2.14.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.15.0.txt (renamed from Documentation/RelNotes/2.15.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.15.1.txt (renamed from Documentation/RelNotes/2.15.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.15.2.txt (renamed from Documentation/RelNotes/2.15.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.15.3.txt (renamed from Documentation/RelNotes/2.15.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.16.0.txt (renamed from Documentation/RelNotes/2.16.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.16.1.txt (renamed from Documentation/RelNotes/2.16.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.16.2.txt (renamed from Documentation/RelNotes/2.16.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.16.3.txt (renamed from Documentation/RelNotes/2.16.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.16.4.txt (renamed from Documentation/RelNotes/2.16.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.16.5.txt (renamed from Documentation/RelNotes/2.16.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.17.0.txt (renamed from Documentation/RelNotes/2.17.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.17.1.txt (renamed from Documentation/RelNotes/2.17.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.17.2.txt (renamed from Documentation/RelNotes/2.17.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.18.0.txt (renamed from Documentation/RelNotes/2.18.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.18.1.txt (renamed from Documentation/RelNotes/2.18.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.19.0.txt (renamed from Documentation/RelNotes/2.19.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.19.1.txt (renamed from Documentation/RelNotes/2.19.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.19.2.txt (renamed from Documentation/RelNotes/2.19.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.2.0.txt (renamed from Documentation/RelNotes/2.2.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.2.1.txt (renamed from Documentation/RelNotes/2.2.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.2.2.txt (renamed from Documentation/RelNotes/2.2.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.2.3.txt (renamed from Documentation/RelNotes/2.2.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.20.0.txt (renamed from Documentation/RelNotes/2.20.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.20.1.txt (renamed from Documentation/RelNotes/2.20.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.21.0.txt (renamed from Documentation/RelNotes/2.21.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.22.0.txt (renamed from Documentation/RelNotes/2.22.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.22.1.txt (renamed from Documentation/RelNotes/2.22.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.23.0.txt (renamed from Documentation/RelNotes/2.23.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.3.0.txt (renamed from Documentation/RelNotes/2.3.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.3.1.txt (renamed from Documentation/RelNotes/2.3.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.3.10.txt (renamed from Documentation/RelNotes/2.3.10.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.3.2.txt (renamed from Documentation/RelNotes/2.3.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.3.3.txt (renamed from Documentation/RelNotes/2.3.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.3.4.txt (renamed from Documentation/RelNotes/2.3.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.3.5.txt (renamed from Documentation/RelNotes/2.3.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.3.6.txt (renamed from Documentation/RelNotes/2.3.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.3.7.txt (renamed from Documentation/RelNotes/2.3.7.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.3.8.txt (renamed from Documentation/RelNotes/2.3.8.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.3.9.txt (renamed from Documentation/RelNotes/2.3.9.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.4.0.txt (renamed from Documentation/RelNotes/2.4.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.4.1.txt (renamed from Documentation/RelNotes/2.4.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.4.10.txt (renamed from Documentation/RelNotes/2.4.10.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.4.11.txt (renamed from Documentation/RelNotes/2.4.11.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.4.12.txt (renamed from Documentation/RelNotes/2.4.12.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.4.2.txt (renamed from Documentation/RelNotes/2.4.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.4.3.txt (renamed from Documentation/RelNotes/2.4.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.4.4.txt (renamed from Documentation/RelNotes/2.4.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.4.5.txt (renamed from Documentation/RelNotes/2.4.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.4.6.txt (renamed from Documentation/RelNotes/2.4.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.4.7.txt (renamed from Documentation/RelNotes/2.4.7.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.4.8.txt (renamed from Documentation/RelNotes/2.4.8.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.4.9.txt (renamed from Documentation/RelNotes/2.4.9.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.5.0.txt (renamed from Documentation/RelNotes/2.5.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.5.1.txt (renamed from Documentation/RelNotes/2.5.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.5.2.txt (renamed from Documentation/RelNotes/2.5.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.5.3.txt (renamed from Documentation/RelNotes/2.5.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.5.4.txt (renamed from Documentation/RelNotes/2.5.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.5.5.txt (renamed from Documentation/RelNotes/2.5.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.5.6.txt (renamed from Documentation/RelNotes/2.5.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.6.0.txt (renamed from Documentation/RelNotes/2.6.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.6.1.txt (renamed from Documentation/RelNotes/2.6.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.6.2.txt (renamed from Documentation/RelNotes/2.6.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.6.3.txt (renamed from Documentation/RelNotes/2.6.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.6.4.txt (renamed from Documentation/RelNotes/2.6.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.6.5.txt (renamed from Documentation/RelNotes/2.6.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.6.6.txt (renamed from Documentation/RelNotes/2.6.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.6.7.txt (renamed from Documentation/RelNotes/2.6.7.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.7.0.txt (renamed from Documentation/RelNotes/2.7.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.7.1.txt (renamed from Documentation/RelNotes/2.7.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.7.2.txt (renamed from Documentation/RelNotes/2.7.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.7.3.txt (renamed from Documentation/RelNotes/2.7.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.7.4.txt (renamed from Documentation/RelNotes/2.7.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.7.5.txt (renamed from Documentation/RelNotes/2.7.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.7.6.txt (renamed from Documentation/RelNotes/2.7.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.8.0.txt (renamed from Documentation/RelNotes/2.8.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.8.1.txt (renamed from Documentation/RelNotes/2.8.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.8.2.txt (renamed from Documentation/RelNotes/2.8.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.8.3.txt (renamed from Documentation/RelNotes/2.8.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.8.4.txt (renamed from Documentation/RelNotes/2.8.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.8.5.txt (renamed from Documentation/RelNotes/2.8.5.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.8.6.txt (renamed from Documentation/RelNotes/2.8.6.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.9.0.txt (renamed from Documentation/RelNotes/2.9.0.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.9.1.txt (renamed from Documentation/RelNotes/2.9.1.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.9.2.txt (renamed from Documentation/RelNotes/2.9.2.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.9.3.txt (renamed from Documentation/RelNotes/2.9.3.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.9.4.txt (renamed from Documentation/RelNotes/2.9.4.txt)0
-rw-r--r--third_party/git/Documentation/RelNotes/2.9.5.txt (renamed from Documentation/RelNotes/2.9.5.txt)0
-rw-r--r--third_party/git/Documentation/SubmittingPatches (renamed from Documentation/SubmittingPatches)0
-rw-r--r--third_party/git/Documentation/asciidoc.conf (renamed from Documentation/asciidoc.conf)0
-rw-r--r--third_party/git/Documentation/asciidoctor-extensions.rb (renamed from Documentation/asciidoctor-extensions.rb)0
-rw-r--r--third_party/git/Documentation/blame-options.txt (renamed from Documentation/blame-options.txt)0
-rwxr-xr-xthird_party/git/Documentation/build-docdep.perl (renamed from Documentation/build-docdep.perl)0
-rwxr-xr-xthird_party/git/Documentation/cat-texi.perl (renamed from Documentation/cat-texi.perl)0
-rwxr-xr-xthird_party/git/Documentation/cmd-list.perl (renamed from Documentation/cmd-list.perl)0
-rw-r--r--third_party/git/Documentation/config.txt (renamed from Documentation/config.txt)0
-rw-r--r--third_party/git/Documentation/config/add.txt (renamed from Documentation/config/add.txt)0
-rw-r--r--third_party/git/Documentation/config/advice.txt (renamed from Documentation/config/advice.txt)0
-rw-r--r--third_party/git/Documentation/config/alias.txt (renamed from Documentation/config/alias.txt)0
-rw-r--r--third_party/git/Documentation/config/am.txt (renamed from Documentation/config/am.txt)0
-rw-r--r--third_party/git/Documentation/config/apply.txt (renamed from Documentation/config/apply.txt)0
-rw-r--r--third_party/git/Documentation/config/blame.txt (renamed from Documentation/config/blame.txt)0
-rw-r--r--third_party/git/Documentation/config/branch.txt (renamed from Documentation/config/branch.txt)0
-rw-r--r--third_party/git/Documentation/config/browser.txt (renamed from Documentation/config/browser.txt)0
-rw-r--r--third_party/git/Documentation/config/checkout.txt (renamed from Documentation/config/checkout.txt)0
-rw-r--r--third_party/git/Documentation/config/clean.txt (renamed from Documentation/config/clean.txt)0
-rw-r--r--third_party/git/Documentation/config/color.txt (renamed from Documentation/config/color.txt)0
-rw-r--r--third_party/git/Documentation/config/column.txt (renamed from Documentation/config/column.txt)0
-rw-r--r--third_party/git/Documentation/config/commit.txt (renamed from Documentation/config/commit.txt)0
-rw-r--r--third_party/git/Documentation/config/completion.txt (renamed from Documentation/config/completion.txt)0
-rw-r--r--third_party/git/Documentation/config/core.txt (renamed from Documentation/config/core.txt)0
-rw-r--r--third_party/git/Documentation/config/credential.txt (renamed from Documentation/config/credential.txt)0
-rw-r--r--third_party/git/Documentation/config/diff.txt (renamed from Documentation/config/diff.txt)0
-rw-r--r--third_party/git/Documentation/config/difftool.txt (renamed from Documentation/config/difftool.txt)0
-rw-r--r--third_party/git/Documentation/config/fastimport.txt (renamed from Documentation/config/fastimport.txt)0
-rw-r--r--third_party/git/Documentation/config/fetch.txt (renamed from Documentation/config/fetch.txt)0
-rw-r--r--third_party/git/Documentation/config/filter.txt (renamed from Documentation/config/filter.txt)0
-rw-r--r--third_party/git/Documentation/config/fmt-merge-msg.txt (renamed from Documentation/config/fmt-merge-msg.txt)0
-rw-r--r--third_party/git/Documentation/config/format.txt (renamed from Documentation/config/format.txt)0
-rw-r--r--third_party/git/Documentation/config/fsck.txt (renamed from Documentation/config/fsck.txt)0
-rw-r--r--third_party/git/Documentation/config/gc.txt (renamed from Documentation/config/gc.txt)0
-rw-r--r--third_party/git/Documentation/config/gitcvs.txt (renamed from Documentation/config/gitcvs.txt)0
-rw-r--r--third_party/git/Documentation/config/gitweb.txt (renamed from Documentation/config/gitweb.txt)0
-rw-r--r--third_party/git/Documentation/config/gpg.txt (renamed from Documentation/config/gpg.txt)0
-rw-r--r--third_party/git/Documentation/config/grep.txt (renamed from Documentation/config/grep.txt)0
-rw-r--r--third_party/git/Documentation/config/gui.txt (renamed from Documentation/config/gui.txt)0
-rw-r--r--third_party/git/Documentation/config/guitool.txt (renamed from Documentation/config/guitool.txt)0
-rw-r--r--third_party/git/Documentation/config/help.txt (renamed from Documentation/config/help.txt)0
-rw-r--r--third_party/git/Documentation/config/http.txt (renamed from Documentation/config/http.txt)0
-rw-r--r--third_party/git/Documentation/config/i18n.txt (renamed from Documentation/config/i18n.txt)0
-rw-r--r--third_party/git/Documentation/config/imap.txt (renamed from Documentation/config/imap.txt)0
-rw-r--r--third_party/git/Documentation/config/index.txt (renamed from Documentation/config/index.txt)0
-rw-r--r--third_party/git/Documentation/config/init.txt (renamed from Documentation/config/init.txt)0
-rw-r--r--third_party/git/Documentation/config/instaweb.txt (renamed from Documentation/config/instaweb.txt)0
-rw-r--r--third_party/git/Documentation/config/interactive.txt (renamed from Documentation/config/interactive.txt)0
-rw-r--r--third_party/git/Documentation/config/log.txt (renamed from Documentation/config/log.txt)0
-rw-r--r--third_party/git/Documentation/config/mailinfo.txt (renamed from Documentation/config/mailinfo.txt)0
-rw-r--r--third_party/git/Documentation/config/mailmap.txt (renamed from Documentation/config/mailmap.txt)0
-rw-r--r--third_party/git/Documentation/config/man.txt (renamed from Documentation/config/man.txt)0
-rw-r--r--third_party/git/Documentation/config/merge.txt (renamed from Documentation/config/merge.txt)0
-rw-r--r--third_party/git/Documentation/config/mergetool.txt (renamed from Documentation/config/mergetool.txt)0
-rw-r--r--third_party/git/Documentation/config/notes.txt (renamed from Documentation/config/notes.txt)0
-rw-r--r--third_party/git/Documentation/config/pack.txt (renamed from Documentation/config/pack.txt)0
-rw-r--r--third_party/git/Documentation/config/pager.txt (renamed from Documentation/config/pager.txt)0
-rw-r--r--third_party/git/Documentation/config/pretty.txt (renamed from Documentation/config/pretty.txt)0
-rw-r--r--third_party/git/Documentation/config/protocol.txt (renamed from Documentation/config/protocol.txt)0
-rw-r--r--third_party/git/Documentation/config/pull.txt (renamed from Documentation/config/pull.txt)0
-rw-r--r--third_party/git/Documentation/config/push.txt (renamed from Documentation/config/push.txt)0
-rw-r--r--third_party/git/Documentation/config/rebase.txt (renamed from Documentation/config/rebase.txt)0
-rw-r--r--third_party/git/Documentation/config/receive.txt (renamed from Documentation/config/receive.txt)0
-rw-r--r--third_party/git/Documentation/config/remote.txt (renamed from Documentation/config/remote.txt)0
-rw-r--r--third_party/git/Documentation/config/remotes.txt (renamed from Documentation/config/remotes.txt)0
-rw-r--r--third_party/git/Documentation/config/repack.txt (renamed from Documentation/config/repack.txt)0
-rw-r--r--third_party/git/Documentation/config/rerere.txt (renamed from Documentation/config/rerere.txt)0
-rw-r--r--third_party/git/Documentation/config/reset.txt (renamed from Documentation/config/reset.txt)0
-rw-r--r--third_party/git/Documentation/config/sendemail.txt (renamed from Documentation/config/sendemail.txt)0
-rw-r--r--third_party/git/Documentation/config/sequencer.txt (renamed from Documentation/config/sequencer.txt)0
-rw-r--r--third_party/git/Documentation/config/showbranch.txt (renamed from Documentation/config/showbranch.txt)0
-rw-r--r--third_party/git/Documentation/config/splitindex.txt (renamed from Documentation/config/splitindex.txt)0
-rw-r--r--third_party/git/Documentation/config/ssh.txt (renamed from Documentation/config/ssh.txt)0
-rw-r--r--third_party/git/Documentation/config/stash.txt (renamed from Documentation/config/stash.txt)0
-rw-r--r--third_party/git/Documentation/config/status.txt (renamed from Documentation/config/status.txt)0
-rw-r--r--third_party/git/Documentation/config/submodule.txt (renamed from Documentation/config/submodule.txt)0
-rw-r--r--third_party/git/Documentation/config/tag.txt (renamed from Documentation/config/tag.txt)0
-rw-r--r--third_party/git/Documentation/config/trace2.txt (renamed from Documentation/config/trace2.txt)0
-rw-r--r--third_party/git/Documentation/config/transfer.txt (renamed from Documentation/config/transfer.txt)0
-rw-r--r--third_party/git/Documentation/config/uploadarchive.txt (renamed from Documentation/config/uploadarchive.txt)0
-rw-r--r--third_party/git/Documentation/config/uploadpack.txt (renamed from Documentation/config/uploadpack.txt)0
-rw-r--r--third_party/git/Documentation/config/url.txt (renamed from Documentation/config/url.txt)0
-rw-r--r--third_party/git/Documentation/config/user.txt (renamed from Documentation/config/user.txt)0
-rw-r--r--third_party/git/Documentation/config/versionsort.txt (renamed from Documentation/config/versionsort.txt)0
-rw-r--r--third_party/git/Documentation/config/web.txt (renamed from Documentation/config/web.txt)0
-rw-r--r--third_party/git/Documentation/config/worktree.txt (renamed from Documentation/config/worktree.txt)0
-rw-r--r--third_party/git/Documentation/date-formats.txt (renamed from Documentation/date-formats.txt)0
-rw-r--r--third_party/git/Documentation/diff-format.txt (renamed from Documentation/diff-format.txt)0
-rw-r--r--third_party/git/Documentation/diff-generate-patch.txt (renamed from Documentation/diff-generate-patch.txt)0
-rw-r--r--third_party/git/Documentation/diff-options.txt (renamed from Documentation/diff-options.txt)0
-rwxr-xr-xthird_party/git/Documentation/doc-diff (renamed from Documentation/doc-diff)0
-rw-r--r--third_party/git/Documentation/docbook-xsl.css (renamed from Documentation/docbook-xsl.css)0
-rw-r--r--third_party/git/Documentation/docbook.xsl (renamed from Documentation/docbook.xsl)0
-rw-r--r--third_party/git/Documentation/everyday.txto (renamed from Documentation/everyday.txto)0
-rw-r--r--third_party/git/Documentation/fetch-options.txt (renamed from Documentation/fetch-options.txt)0
-rwxr-xr-xthird_party/git/Documentation/fix-texi.perl (renamed from Documentation/fix-texi.perl)0
-rw-r--r--third_party/git/Documentation/git-add.txt (renamed from Documentation/git-add.txt)0
-rw-r--r--third_party/git/Documentation/git-am.txt (renamed from Documentation/git-am.txt)0
-rw-r--r--third_party/git/Documentation/git-annotate.txt (renamed from Documentation/git-annotate.txt)0
-rw-r--r--third_party/git/Documentation/git-apply.txt (renamed from Documentation/git-apply.txt)0
-rw-r--r--third_party/git/Documentation/git-archimport.txt (renamed from Documentation/git-archimport.txt)0
-rw-r--r--third_party/git/Documentation/git-archive.txt (renamed from Documentation/git-archive.txt)0
-rw-r--r--third_party/git/Documentation/git-bisect-lk2009.txt (renamed from Documentation/git-bisect-lk2009.txt)0
-rw-r--r--third_party/git/Documentation/git-bisect.txt (renamed from Documentation/git-bisect.txt)0
-rw-r--r--third_party/git/Documentation/git-blame.txt (renamed from Documentation/git-blame.txt)0
-rw-r--r--third_party/git/Documentation/git-branch.txt (renamed from Documentation/git-branch.txt)0
-rw-r--r--third_party/git/Documentation/git-bundle.txt (renamed from Documentation/git-bundle.txt)0
-rw-r--r--third_party/git/Documentation/git-cat-file.txt (renamed from Documentation/git-cat-file.txt)0
-rw-r--r--third_party/git/Documentation/git-check-attr.txt (renamed from Documentation/git-check-attr.txt)0
-rw-r--r--third_party/git/Documentation/git-check-ignore.txt (renamed from Documentation/git-check-ignore.txt)0
-rw-r--r--third_party/git/Documentation/git-check-mailmap.txt (renamed from Documentation/git-check-mailmap.txt)0
-rw-r--r--third_party/git/Documentation/git-check-ref-format.txt (renamed from Documentation/git-check-ref-format.txt)0
-rw-r--r--third_party/git/Documentation/git-checkout-index.txt (renamed from Documentation/git-checkout-index.txt)0
-rw-r--r--third_party/git/Documentation/git-checkout.txt (renamed from Documentation/git-checkout.txt)0
-rw-r--r--third_party/git/Documentation/git-cherry-pick.txt (renamed from Documentation/git-cherry-pick.txt)0
-rw-r--r--third_party/git/Documentation/git-cherry.txt (renamed from Documentation/git-cherry.txt)0
-rw-r--r--third_party/git/Documentation/git-citool.txt (renamed from Documentation/git-citool.txt)0
-rw-r--r--third_party/git/Documentation/git-clean.txt (renamed from Documentation/git-clean.txt)0
-rw-r--r--third_party/git/Documentation/git-clone.txt (renamed from Documentation/git-clone.txt)0
-rw-r--r--third_party/git/Documentation/git-column.txt (renamed from Documentation/git-column.txt)0
-rw-r--r--third_party/git/Documentation/git-commit-graph.txt (renamed from Documentation/git-commit-graph.txt)0
-rw-r--r--third_party/git/Documentation/git-commit-tree.txt (renamed from Documentation/git-commit-tree.txt)0
-rw-r--r--third_party/git/Documentation/git-commit.txt (renamed from Documentation/git-commit.txt)0
-rw-r--r--third_party/git/Documentation/git-config.txt (renamed from Documentation/git-config.txt)0
-rw-r--r--third_party/git/Documentation/git-count-objects.txt (renamed from Documentation/git-count-objects.txt)0
-rw-r--r--third_party/git/Documentation/git-credential-cache--daemon.txt (renamed from Documentation/git-credential-cache--daemon.txt)0
-rw-r--r--third_party/git/Documentation/git-credential-cache.txt (renamed from Documentation/git-credential-cache.txt)0
-rw-r--r--third_party/git/Documentation/git-credential-store.txt (renamed from Documentation/git-credential-store.txt)0
-rw-r--r--third_party/git/Documentation/git-credential.txt (renamed from Documentation/git-credential.txt)0
-rw-r--r--third_party/git/Documentation/git-cvsexportcommit.txt (renamed from Documentation/git-cvsexportcommit.txt)0
-rw-r--r--third_party/git/Documentation/git-cvsimport.txt (renamed from Documentation/git-cvsimport.txt)0
-rw-r--r--third_party/git/Documentation/git-cvsserver.txt (renamed from Documentation/git-cvsserver.txt)0
-rw-r--r--third_party/git/Documentation/git-daemon.txt (renamed from Documentation/git-daemon.txt)0
-rw-r--r--third_party/git/Documentation/git-describe.txt (renamed from Documentation/git-describe.txt)0
-rw-r--r--third_party/git/Documentation/git-diff-files.txt (renamed from Documentation/git-diff-files.txt)0
-rw-r--r--third_party/git/Documentation/git-diff-index.txt (renamed from Documentation/git-diff-index.txt)0
-rw-r--r--third_party/git/Documentation/git-diff-tree.txt (renamed from Documentation/git-diff-tree.txt)0
-rw-r--r--third_party/git/Documentation/git-diff.txt (renamed from Documentation/git-diff.txt)0
-rw-r--r--third_party/git/Documentation/git-difftool.txt (renamed from Documentation/git-difftool.txt)0
-rw-r--r--third_party/git/Documentation/git-fast-export.txt (renamed from Documentation/git-fast-export.txt)0
-rw-r--r--third_party/git/Documentation/git-fast-import.txt (renamed from Documentation/git-fast-import.txt)0
-rw-r--r--third_party/git/Documentation/git-fetch-pack.txt (renamed from Documentation/git-fetch-pack.txt)0
-rw-r--r--third_party/git/Documentation/git-fetch.txt (renamed from Documentation/git-fetch.txt)0
-rw-r--r--third_party/git/Documentation/git-filter-branch.txt (renamed from Documentation/git-filter-branch.txt)0
-rw-r--r--third_party/git/Documentation/git-fmt-merge-msg.txt (renamed from Documentation/git-fmt-merge-msg.txt)0
-rw-r--r--third_party/git/Documentation/git-for-each-ref.txt (renamed from Documentation/git-for-each-ref.txt)0
-rw-r--r--third_party/git/Documentation/git-format-patch.txt (renamed from Documentation/git-format-patch.txt)0
-rw-r--r--third_party/git/Documentation/git-fsck-objects.txt (renamed from Documentation/git-fsck-objects.txt)0
-rw-r--r--third_party/git/Documentation/git-fsck.txt (renamed from Documentation/git-fsck.txt)0
-rw-r--r--third_party/git/Documentation/git-gc.txt (renamed from Documentation/git-gc.txt)0
-rw-r--r--third_party/git/Documentation/git-get-tar-commit-id.txt (renamed from Documentation/git-get-tar-commit-id.txt)0
-rw-r--r--third_party/git/Documentation/git-grep.txt (renamed from Documentation/git-grep.txt)0
-rw-r--r--third_party/git/Documentation/git-gui.txt (renamed from Documentation/git-gui.txt)0
-rw-r--r--third_party/git/Documentation/git-hash-object.txt (renamed from Documentation/git-hash-object.txt)0
-rw-r--r--third_party/git/Documentation/git-help.txt (renamed from Documentation/git-help.txt)0
-rw-r--r--third_party/git/Documentation/git-http-backend.txt (renamed from Documentation/git-http-backend.txt)0
-rw-r--r--third_party/git/Documentation/git-http-fetch.txt (renamed from Documentation/git-http-fetch.txt)0
-rw-r--r--third_party/git/Documentation/git-http-push.txt (renamed from Documentation/git-http-push.txt)0
-rw-r--r--third_party/git/Documentation/git-imap-send.txt (renamed from Documentation/git-imap-send.txt)0
-rw-r--r--third_party/git/Documentation/git-index-pack.txt (renamed from Documentation/git-index-pack.txt)0
-rw-r--r--third_party/git/Documentation/git-init-db.txt (renamed from Documentation/git-init-db.txt)0
-rw-r--r--third_party/git/Documentation/git-init.txt (renamed from Documentation/git-init.txt)0
-rw-r--r--third_party/git/Documentation/git-instaweb.txt (renamed from Documentation/git-instaweb.txt)0
-rw-r--r--third_party/git/Documentation/git-interpret-trailers.txt (renamed from Documentation/git-interpret-trailers.txt)0
-rw-r--r--third_party/git/Documentation/git-log.txt (renamed from Documentation/git-log.txt)0
-rw-r--r--third_party/git/Documentation/git-ls-files.txt (renamed from Documentation/git-ls-files.txt)0
-rw-r--r--third_party/git/Documentation/git-ls-remote.txt (renamed from Documentation/git-ls-remote.txt)0
-rw-r--r--third_party/git/Documentation/git-ls-tree.txt (renamed from Documentation/git-ls-tree.txt)0
-rw-r--r--third_party/git/Documentation/git-mailinfo.txt (renamed from Documentation/git-mailinfo.txt)0
-rw-r--r--third_party/git/Documentation/git-mailsplit.txt (renamed from Documentation/git-mailsplit.txt)0
-rw-r--r--third_party/git/Documentation/git-merge-base.txt (renamed from Documentation/git-merge-base.txt)0
-rw-r--r--third_party/git/Documentation/git-merge-file.txt (renamed from Documentation/git-merge-file.txt)0
-rw-r--r--third_party/git/Documentation/git-merge-index.txt (renamed from Documentation/git-merge-index.txt)0
-rw-r--r--third_party/git/Documentation/git-merge-one-file.txt (renamed from Documentation/git-merge-one-file.txt)0
-rw-r--r--third_party/git/Documentation/git-merge-tree.txt (renamed from Documentation/git-merge-tree.txt)0
-rw-r--r--third_party/git/Documentation/git-merge.txt (renamed from Documentation/git-merge.txt)0
-rw-r--r--third_party/git/Documentation/git-mergetool--lib.txt (renamed from Documentation/git-mergetool--lib.txt)0
-rw-r--r--third_party/git/Documentation/git-mergetool.txt (renamed from Documentation/git-mergetool.txt)0
-rw-r--r--third_party/git/Documentation/git-mktag.txt (renamed from Documentation/git-mktag.txt)0
-rw-r--r--third_party/git/Documentation/git-mktree.txt (renamed from Documentation/git-mktree.txt)0
-rw-r--r--third_party/git/Documentation/git-multi-pack-index.txt (renamed from Documentation/git-multi-pack-index.txt)0
-rw-r--r--third_party/git/Documentation/git-mv.txt (renamed from Documentation/git-mv.txt)0
-rw-r--r--third_party/git/Documentation/git-name-rev.txt (renamed from Documentation/git-name-rev.txt)0
-rw-r--r--third_party/git/Documentation/git-notes.txt (renamed from Documentation/git-notes.txt)0
-rw-r--r--third_party/git/Documentation/git-p4.txt (renamed from Documentation/git-p4.txt)0
-rw-r--r--third_party/git/Documentation/git-pack-objects.txt (renamed from Documentation/git-pack-objects.txt)0
-rw-r--r--third_party/git/Documentation/git-pack-redundant.txt (renamed from Documentation/git-pack-redundant.txt)0
-rw-r--r--third_party/git/Documentation/git-pack-refs.txt (renamed from Documentation/git-pack-refs.txt)0
-rw-r--r--third_party/git/Documentation/git-parse-remote.txt (renamed from Documentation/git-parse-remote.txt)0
-rw-r--r--third_party/git/Documentation/git-patch-id.txt (renamed from Documentation/git-patch-id.txt)0
-rw-r--r--third_party/git/Documentation/git-prune-packed.txt (renamed from Documentation/git-prune-packed.txt)0
-rw-r--r--third_party/git/Documentation/git-prune.txt (renamed from Documentation/git-prune.txt)0
-rw-r--r--third_party/git/Documentation/git-pull.txt (renamed from Documentation/git-pull.txt)0
-rw-r--r--third_party/git/Documentation/git-push.txt (renamed from Documentation/git-push.txt)0
-rw-r--r--third_party/git/Documentation/git-quiltimport.txt (renamed from Documentation/git-quiltimport.txt)0
-rw-r--r--third_party/git/Documentation/git-range-diff.txt (renamed from Documentation/git-range-diff.txt)0
-rw-r--r--third_party/git/Documentation/git-read-tree.txt (renamed from Documentation/git-read-tree.txt)0
-rw-r--r--third_party/git/Documentation/git-rebase.txt (renamed from Documentation/git-rebase.txt)0
-rw-r--r--third_party/git/Documentation/git-receive-pack.txt (renamed from Documentation/git-receive-pack.txt)0
-rw-r--r--third_party/git/Documentation/git-reflog.txt (renamed from Documentation/git-reflog.txt)0
-rw-r--r--third_party/git/Documentation/git-remote-ext.txt (renamed from Documentation/git-remote-ext.txt)0
-rw-r--r--third_party/git/Documentation/git-remote-fd.txt (renamed from Documentation/git-remote-fd.txt)0
-rw-r--r--third_party/git/Documentation/git-remote-helpers.txto (renamed from Documentation/git-remote-helpers.txto)0
-rw-r--r--third_party/git/Documentation/git-remote.txt (renamed from Documentation/git-remote.txt)0
-rw-r--r--third_party/git/Documentation/git-repack.txt (renamed from Documentation/git-repack.txt)0
-rw-r--r--third_party/git/Documentation/git-replace.txt (renamed from Documentation/git-replace.txt)0
-rw-r--r--third_party/git/Documentation/git-request-pull.txt (renamed from Documentation/git-request-pull.txt)0
-rw-r--r--third_party/git/Documentation/git-rerere.txt (renamed from Documentation/git-rerere.txt)0
-rw-r--r--third_party/git/Documentation/git-reset.txt (renamed from Documentation/git-reset.txt)0
-rw-r--r--third_party/git/Documentation/git-restore.txt (renamed from Documentation/git-restore.txt)0
-rw-r--r--third_party/git/Documentation/git-rev-list.txt (renamed from Documentation/git-rev-list.txt)0
-rw-r--r--third_party/git/Documentation/git-rev-parse.txt (renamed from Documentation/git-rev-parse.txt)0
-rw-r--r--third_party/git/Documentation/git-revert.txt (renamed from Documentation/git-revert.txt)0
-rw-r--r--third_party/git/Documentation/git-rm.txt (renamed from Documentation/git-rm.txt)0
-rw-r--r--third_party/git/Documentation/git-send-email.txt (renamed from Documentation/git-send-email.txt)0
-rw-r--r--third_party/git/Documentation/git-send-pack.txt (renamed from Documentation/git-send-pack.txt)0
-rw-r--r--third_party/git/Documentation/git-sh-i18n--envsubst.txt (renamed from Documentation/git-sh-i18n--envsubst.txt)0
-rw-r--r--third_party/git/Documentation/git-sh-i18n.txt (renamed from Documentation/git-sh-i18n.txt)0
-rw-r--r--third_party/git/Documentation/git-sh-setup.txt (renamed from Documentation/git-sh-setup.txt)0
-rw-r--r--third_party/git/Documentation/git-shell.txt (renamed from Documentation/git-shell.txt)0
-rw-r--r--third_party/git/Documentation/git-shortlog.txt (renamed from Documentation/git-shortlog.txt)0
-rw-r--r--third_party/git/Documentation/git-show-branch.txt (renamed from Documentation/git-show-branch.txt)0
-rw-r--r--third_party/git/Documentation/git-show-index.txt (renamed from Documentation/git-show-index.txt)0
-rw-r--r--third_party/git/Documentation/git-show-ref.txt (renamed from Documentation/git-show-ref.txt)0
-rw-r--r--third_party/git/Documentation/git-show.txt (renamed from Documentation/git-show.txt)0
-rw-r--r--third_party/git/Documentation/git-stage.txt (renamed from Documentation/git-stage.txt)0
-rw-r--r--third_party/git/Documentation/git-stash.txt (renamed from Documentation/git-stash.txt)0
-rw-r--r--third_party/git/Documentation/git-status.txt (renamed from Documentation/git-status.txt)0
-rw-r--r--third_party/git/Documentation/git-stripspace.txt (renamed from Documentation/git-stripspace.txt)0
-rw-r--r--third_party/git/Documentation/git-submodule.txt (renamed from Documentation/git-submodule.txt)0
-rw-r--r--third_party/git/Documentation/git-svn.txt (renamed from Documentation/git-svn.txt)0
-rw-r--r--third_party/git/Documentation/git-switch.txt (renamed from Documentation/git-switch.txt)0
-rw-r--r--third_party/git/Documentation/git-symbolic-ref.txt (renamed from Documentation/git-symbolic-ref.txt)0
-rw-r--r--third_party/git/Documentation/git-tag.txt (renamed from Documentation/git-tag.txt)0
-rw-r--r--third_party/git/Documentation/git-tools.txt (renamed from Documentation/git-tools.txt)0
-rw-r--r--third_party/git/Documentation/git-unpack-file.txt (renamed from Documentation/git-unpack-file.txt)0
-rw-r--r--third_party/git/Documentation/git-unpack-objects.txt (renamed from Documentation/git-unpack-objects.txt)0
-rw-r--r--third_party/git/Documentation/git-update-index.txt (renamed from Documentation/git-update-index.txt)0
-rw-r--r--third_party/git/Documentation/git-update-ref.txt (renamed from Documentation/git-update-ref.txt)0
-rw-r--r--third_party/git/Documentation/git-update-server-info.txt (renamed from Documentation/git-update-server-info.txt)0
-rw-r--r--third_party/git/Documentation/git-upload-archive.txt (renamed from Documentation/git-upload-archive.txt)0
-rw-r--r--third_party/git/Documentation/git-upload-pack.txt (renamed from Documentation/git-upload-pack.txt)0
-rw-r--r--third_party/git/Documentation/git-var.txt (renamed from Documentation/git-var.txt)0
-rw-r--r--third_party/git/Documentation/git-verify-commit.txt (renamed from Documentation/git-verify-commit.txt)0
-rw-r--r--third_party/git/Documentation/git-verify-pack.txt (renamed from Documentation/git-verify-pack.txt)0
-rw-r--r--third_party/git/Documentation/git-verify-tag.txt (renamed from Documentation/git-verify-tag.txt)0
-rw-r--r--third_party/git/Documentation/git-web--browse.txt (renamed from Documentation/git-web--browse.txt)0
-rw-r--r--third_party/git/Documentation/git-whatchanged.txt (renamed from Documentation/git-whatchanged.txt)0
-rw-r--r--third_party/git/Documentation/git-worktree.txt (renamed from Documentation/git-worktree.txt)0
-rw-r--r--third_party/git/Documentation/git-write-tree.txt (renamed from Documentation/git-write-tree.txt)0
-rw-r--r--third_party/git/Documentation/git.txt (renamed from Documentation/git.txt)0
-rw-r--r--third_party/git/Documentation/gitattributes.txt (renamed from Documentation/gitattributes.txt)0
-rw-r--r--third_party/git/Documentation/gitcli.txt (renamed from Documentation/gitcli.txt)0
-rw-r--r--third_party/git/Documentation/gitcore-tutorial.txt (renamed from Documentation/gitcore-tutorial.txt)0
-rw-r--r--third_party/git/Documentation/gitcredentials.txt (renamed from Documentation/gitcredentials.txt)0
-rw-r--r--third_party/git/Documentation/gitcvs-migration.txt (renamed from Documentation/gitcvs-migration.txt)0
-rw-r--r--third_party/git/Documentation/gitdiffcore.txt (renamed from Documentation/gitdiffcore.txt)0
-rw-r--r--third_party/git/Documentation/giteveryday.txt (renamed from Documentation/giteveryday.txt)0
-rw-r--r--third_party/git/Documentation/gitglossary.txt (renamed from Documentation/gitglossary.txt)0
-rw-r--r--third_party/git/Documentation/githooks.txt (renamed from Documentation/githooks.txt)0
-rw-r--r--third_party/git/Documentation/gitignore.txt (renamed from Documentation/gitignore.txt)0
-rw-r--r--third_party/git/Documentation/gitk.txt (renamed from Documentation/gitk.txt)0
-rw-r--r--third_party/git/Documentation/gitmodules.txt (renamed from Documentation/gitmodules.txt)0
-rw-r--r--third_party/git/Documentation/gitnamespaces.txt (renamed from Documentation/gitnamespaces.txt)0
-rw-r--r--third_party/git/Documentation/gitremote-helpers.txt (renamed from Documentation/gitremote-helpers.txt)0
-rw-r--r--third_party/git/Documentation/gitrepository-layout.txt (renamed from Documentation/gitrepository-layout.txt)0
-rw-r--r--third_party/git/Documentation/gitrevisions.txt (renamed from Documentation/gitrevisions.txt)0
-rw-r--r--third_party/git/Documentation/gitsubmodules.txt (renamed from Documentation/gitsubmodules.txt)0
-rw-r--r--third_party/git/Documentation/gittutorial-2.txt (renamed from Documentation/gittutorial-2.txt)0
-rw-r--r--third_party/git/Documentation/gittutorial.txt (renamed from Documentation/gittutorial.txt)0
-rw-r--r--third_party/git/Documentation/gitweb.conf.txt (renamed from Documentation/gitweb.conf.txt)0
-rw-r--r--third_party/git/Documentation/gitweb.txt (renamed from Documentation/gitweb.txt)0
-rw-r--r--third_party/git/Documentation/gitworkflows.txt (renamed from Documentation/gitworkflows.txt)0
-rw-r--r--third_party/git/Documentation/glossary-content.txt (renamed from Documentation/glossary-content.txt)0
-rwxr-xr-xthird_party/git/Documentation/howto-index.sh (renamed from Documentation/howto-index.sh)0
-rw-r--r--third_party/git/Documentation/howto/keep-canonical-history-correct.txt (renamed from Documentation/howto/keep-canonical-history-correct.txt)0
-rw-r--r--third_party/git/Documentation/howto/maintain-git.txt (renamed from Documentation/howto/maintain-git.txt)0
-rw-r--r--third_party/git/Documentation/howto/new-command.txt (renamed from Documentation/howto/new-command.txt)0
-rw-r--r--third_party/git/Documentation/howto/rebase-from-internal-branch.txt (renamed from Documentation/howto/rebase-from-internal-branch.txt)0
-rw-r--r--third_party/git/Documentation/howto/rebuild-from-update-hook.txt (renamed from Documentation/howto/rebuild-from-update-hook.txt)0
-rw-r--r--third_party/git/Documentation/howto/recover-corrupted-blob-object.txt (renamed from Documentation/howto/recover-corrupted-blob-object.txt)0
-rw-r--r--third_party/git/Documentation/howto/recover-corrupted-object-harder.txt (renamed from Documentation/howto/recover-corrupted-object-harder.txt)0
-rw-r--r--third_party/git/Documentation/howto/revert-a-faulty-merge.txt (renamed from Documentation/howto/revert-a-faulty-merge.txt)0
-rw-r--r--third_party/git/Documentation/howto/revert-branch-rebase.txt (renamed from Documentation/howto/revert-branch-rebase.txt)0
-rw-r--r--third_party/git/Documentation/howto/separating-topic-branches.txt (renamed from Documentation/howto/separating-topic-branches.txt)0
-rw-r--r--third_party/git/Documentation/howto/setup-git-server-over-http.txt (renamed from Documentation/howto/setup-git-server-over-http.txt)0
-rw-r--r--third_party/git/Documentation/howto/update-hook-example.txt (renamed from Documentation/howto/update-hook-example.txt)0
-rw-r--r--third_party/git/Documentation/howto/use-git-daemon.txt (renamed from Documentation/howto/use-git-daemon.txt)0
-rw-r--r--third_party/git/Documentation/howto/using-merge-subtree.txt (renamed from Documentation/howto/using-merge-subtree.txt)0
-rw-r--r--third_party/git/Documentation/howto/using-signed-tag-in-pull-request.txt (renamed from Documentation/howto/using-signed-tag-in-pull-request.txt)0
-rw-r--r--third_party/git/Documentation/i18n.txt (renamed from Documentation/i18n.txt)0
-rwxr-xr-xthird_party/git/Documentation/install-doc-quick.sh (renamed from Documentation/install-doc-quick.sh)0
-rwxr-xr-xthird_party/git/Documentation/install-webdoc.sh (renamed from Documentation/install-webdoc.sh)0
-rw-r--r--third_party/git/Documentation/line-range-format.txt (renamed from Documentation/line-range-format.txt)0
-rwxr-xr-xthird_party/git/Documentation/lint-gitlink.perl (renamed from Documentation/lint-gitlink.perl)0
-rw-r--r--third_party/git/Documentation/mailmap.txt (renamed from Documentation/mailmap.txt)0
-rw-r--r--third_party/git/Documentation/manpage-1.72.xsl (renamed from Documentation/manpage-1.72.xsl)0
-rw-r--r--third_party/git/Documentation/manpage-base-url.xsl.in (renamed from Documentation/manpage-base-url.xsl.in)0
-rw-r--r--third_party/git/Documentation/manpage-base.xsl (renamed from Documentation/manpage-base.xsl)0
-rw-r--r--third_party/git/Documentation/manpage-bold-literal.xsl (renamed from Documentation/manpage-bold-literal.xsl)0
-rw-r--r--third_party/git/Documentation/manpage-normal.xsl (renamed from Documentation/manpage-normal.xsl)0
-rw-r--r--third_party/git/Documentation/manpage-quote-apos.xsl (renamed from Documentation/manpage-quote-apos.xsl)0
-rw-r--r--third_party/git/Documentation/manpage-suppress-sp.xsl (renamed from Documentation/manpage-suppress-sp.xsl)0
-rw-r--r--third_party/git/Documentation/merge-options.txt (renamed from Documentation/merge-options.txt)0
-rw-r--r--third_party/git/Documentation/merge-strategies.txt (renamed from Documentation/merge-strategies.txt)0
-rw-r--r--third_party/git/Documentation/pretty-formats.txt (renamed from Documentation/pretty-formats.txt)0
-rw-r--r--third_party/git/Documentation/pretty-options.txt (renamed from Documentation/pretty-options.txt)0
-rw-r--r--third_party/git/Documentation/pull-fetch-param.txt (renamed from Documentation/pull-fetch-param.txt)0
-rw-r--r--third_party/git/Documentation/rev-list-options.txt (renamed from Documentation/rev-list-options.txt)0
-rw-r--r--third_party/git/Documentation/revisions.txt (renamed from Documentation/revisions.txt)0
-rw-r--r--third_party/git/Documentation/sequencer.txt (renamed from Documentation/sequencer.txt)0
-rw-r--r--third_party/git/Documentation/technical/.gitignore (renamed from Documentation/technical/.gitignore)0
-rw-r--r--third_party/git/Documentation/technical/api-allocation-growing.txt (renamed from Documentation/technical/api-allocation-growing.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-argv-array.txt (renamed from Documentation/technical/api-argv-array.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-config.txt (renamed from Documentation/technical/api-config.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-credentials.txt (renamed from Documentation/technical/api-credentials.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-diff.txt (renamed from Documentation/technical/api-diff.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-directory-listing.txt (renamed from Documentation/technical/api-directory-listing.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-error-handling.txt (renamed from Documentation/technical/api-error-handling.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-gitattributes.txt (renamed from Documentation/technical/api-gitattributes.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-grep.txt (renamed from Documentation/technical/api-grep.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-history-graph.txt (renamed from Documentation/technical/api-history-graph.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-index-skel.txt (renamed from Documentation/technical/api-index-skel.txt)0
-rwxr-xr-xthird_party/git/Documentation/technical/api-index.sh (renamed from Documentation/technical/api-index.sh)0
-rw-r--r--third_party/git/Documentation/technical/api-merge.txt (renamed from Documentation/technical/api-merge.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-object-access.txt (renamed from Documentation/technical/api-object-access.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-oid-array.txt (renamed from Documentation/technical/api-oid-array.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-parse-options.txt (renamed from Documentation/technical/api-parse-options.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-quote.txt (renamed from Documentation/technical/api-quote.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-ref-iteration.txt (renamed from Documentation/technical/api-ref-iteration.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-remote.txt (renamed from Documentation/technical/api-remote.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-revision-walking.txt (renamed from Documentation/technical/api-revision-walking.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-run-command.txt (renamed from Documentation/technical/api-run-command.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-setup.txt (renamed from Documentation/technical/api-setup.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-sigchain.txt (renamed from Documentation/technical/api-sigchain.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-submodule-config.txt (renamed from Documentation/technical/api-submodule-config.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-trace.txt (renamed from Documentation/technical/api-trace.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-trace2.txt (renamed from Documentation/technical/api-trace2.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-tree-walking.txt (renamed from Documentation/technical/api-tree-walking.txt)0
-rw-r--r--third_party/git/Documentation/technical/api-xdiff-interface.txt (renamed from Documentation/technical/api-xdiff-interface.txt)0
-rw-r--r--third_party/git/Documentation/technical/bitmap-format.txt (renamed from Documentation/technical/bitmap-format.txt)0
-rw-r--r--third_party/git/Documentation/technical/commit-graph-format.txt (renamed from Documentation/technical/commit-graph-format.txt)0
-rw-r--r--third_party/git/Documentation/technical/commit-graph.txt (renamed from Documentation/technical/commit-graph.txt)0
-rw-r--r--third_party/git/Documentation/technical/directory-rename-detection.txt (renamed from Documentation/technical/directory-rename-detection.txt)0
-rw-r--r--third_party/git/Documentation/technical/hash-function-transition.txt (renamed from Documentation/technical/hash-function-transition.txt)0
-rw-r--r--third_party/git/Documentation/technical/http-protocol.txt (renamed from Documentation/technical/http-protocol.txt)0
-rw-r--r--third_party/git/Documentation/technical/index-format.txt (renamed from Documentation/technical/index-format.txt)0
-rw-r--r--third_party/git/Documentation/technical/long-running-process-protocol.txt (renamed from Documentation/technical/long-running-process-protocol.txt)0
-rw-r--r--third_party/git/Documentation/technical/multi-pack-index.txt (renamed from Documentation/technical/multi-pack-index.txt)0
-rw-r--r--third_party/git/Documentation/technical/pack-format.txt (renamed from Documentation/technical/pack-format.txt)0
-rw-r--r--third_party/git/Documentation/technical/pack-heuristics.txt (renamed from Documentation/technical/pack-heuristics.txt)0
-rw-r--r--third_party/git/Documentation/technical/pack-protocol.txt (renamed from Documentation/technical/pack-protocol.txt)0
-rw-r--r--third_party/git/Documentation/technical/partial-clone.txt (renamed from Documentation/technical/partial-clone.txt)0
-rw-r--r--third_party/git/Documentation/technical/protocol-capabilities.txt (renamed from Documentation/technical/protocol-capabilities.txt)0
-rw-r--r--third_party/git/Documentation/technical/protocol-common.txt (renamed from Documentation/technical/protocol-common.txt)0
-rw-r--r--third_party/git/Documentation/technical/protocol-v2.txt (renamed from Documentation/technical/protocol-v2.txt)0
-rw-r--r--third_party/git/Documentation/technical/racy-git.txt (renamed from Documentation/technical/racy-git.txt)0
-rw-r--r--third_party/git/Documentation/technical/repository-version.txt (renamed from Documentation/technical/repository-version.txt)0
-rw-r--r--third_party/git/Documentation/technical/rerere.txt (renamed from Documentation/technical/rerere.txt)0
-rw-r--r--third_party/git/Documentation/technical/send-pack-pipeline.txt (renamed from Documentation/technical/send-pack-pipeline.txt)0
-rw-r--r--third_party/git/Documentation/technical/shallow.txt (renamed from Documentation/technical/shallow.txt)0
-rw-r--r--third_party/git/Documentation/technical/signature-format.txt (renamed from Documentation/technical/signature-format.txt)0
-rw-r--r--third_party/git/Documentation/technical/trivial-merge.txt (renamed from Documentation/technical/trivial-merge.txt)0
-rw-r--r--third_party/git/Documentation/texi.xsl (renamed from Documentation/texi.xsl)0
-rw-r--r--third_party/git/Documentation/trace2-target-values.txt (renamed from Documentation/trace2-target-values.txt)0
-rw-r--r--third_party/git/Documentation/transfer-data-leaks.txt (renamed from Documentation/transfer-data-leaks.txt)0
-rw-r--r--third_party/git/Documentation/urls-remotes.txt (renamed from Documentation/urls-remotes.txt)0
-rw-r--r--third_party/git/Documentation/urls.txt (renamed from Documentation/urls.txt)0
-rw-r--r--third_party/git/Documentation/user-manual.conf (renamed from Documentation/user-manual.conf)0
-rw-r--r--third_party/git/Documentation/user-manual.txt (renamed from Documentation/user-manual.txt)0
-rwxr-xr-xthird_party/git/GIT-VERSION-GEN (renamed from GIT-VERSION-GEN)0
-rw-r--r--third_party/git/INSTALL (renamed from INSTALL)0
-rw-r--r--third_party/git/LGPL-2.1 (renamed from LGPL-2.1)0
-rw-r--r--third_party/git/Makefile (renamed from Makefile)0
-rw-r--r--third_party/git/README.md66
l---------third_party/git/RelNotes (renamed from RelNotes)0
-rw-r--r--third_party/git/abspath.c (renamed from abspath.c)0
-rw-r--r--third_party/git/aclocal.m4 (renamed from aclocal.m4)0
-rw-r--r--third_party/git/advice.c (renamed from advice.c)0
-rw-r--r--third_party/git/advice.h (renamed from advice.h)0
-rw-r--r--third_party/git/alias.c (renamed from alias.c)0
-rw-r--r--third_party/git/alias.h (renamed from alias.h)0
-rw-r--r--third_party/git/alloc.c (renamed from alloc.c)0
-rw-r--r--third_party/git/alloc.h (renamed from alloc.h)0
-rw-r--r--third_party/git/apply.c (renamed from apply.c)0
-rw-r--r--third_party/git/apply.h (renamed from apply.h)0
-rw-r--r--third_party/git/archive-tar.c (renamed from archive-tar.c)0
-rw-r--r--third_party/git/archive-zip.c (renamed from archive-zip.c)0
-rw-r--r--third_party/git/archive.c (renamed from archive.c)0
-rw-r--r--third_party/git/archive.h (renamed from archive.h)0
-rw-r--r--third_party/git/argv-array.c (renamed from argv-array.c)0
-rw-r--r--third_party/git/argv-array.h (renamed from argv-array.h)0
-rw-r--r--third_party/git/attr.c (renamed from attr.c)0
-rw-r--r--third_party/git/attr.h (renamed from attr.h)0
-rw-r--r--third_party/git/azure-pipelines.yml (renamed from azure-pipelines.yml)0
-rw-r--r--third_party/git/banned.h (renamed from banned.h)0
-rw-r--r--third_party/git/base85.c (renamed from base85.c)0
-rw-r--r--third_party/git/bisect.c (renamed from bisect.c)0
-rw-r--r--third_party/git/bisect.h (renamed from bisect.h)0
-rw-r--r--third_party/git/blame.c (renamed from blame.c)0
-rw-r--r--third_party/git/blame.h (renamed from blame.h)0
-rw-r--r--third_party/git/blob.c (renamed from blob.c)0
-rw-r--r--third_party/git/blob.h (renamed from blob.h)0
-rw-r--r--third_party/git/block-sha1/sha1.c (renamed from block-sha1/sha1.c)0
-rw-r--r--third_party/git/block-sha1/sha1.h (renamed from block-sha1/sha1.h)0
-rw-r--r--third_party/git/branch.c (renamed from branch.c)0
-rw-r--r--third_party/git/branch.h (renamed from branch.h)0
-rw-r--r--third_party/git/builtin.h (renamed from builtin.h)0
-rw-r--r--third_party/git/builtin/add.c (renamed from builtin/add.c)0
-rw-r--r--third_party/git/builtin/am.c (renamed from builtin/am.c)0
-rw-r--r--third_party/git/builtin/annotate.c (renamed from builtin/annotate.c)0
-rw-r--r--third_party/git/builtin/apply.c (renamed from builtin/apply.c)0
-rw-r--r--third_party/git/builtin/archive.c (renamed from builtin/archive.c)0
-rw-r--r--third_party/git/builtin/bisect--helper.c (renamed from builtin/bisect--helper.c)0
-rw-r--r--third_party/git/builtin/blame.c (renamed from builtin/blame.c)0
-rw-r--r--third_party/git/builtin/branch.c (renamed from builtin/branch.c)0
-rw-r--r--third_party/git/builtin/bundle.c (renamed from builtin/bundle.c)0
-rw-r--r--third_party/git/builtin/cat-file.c (renamed from builtin/cat-file.c)0
-rw-r--r--third_party/git/builtin/check-attr.c (renamed from builtin/check-attr.c)0
-rw-r--r--third_party/git/builtin/check-ignore.c (renamed from builtin/check-ignore.c)0
-rw-r--r--third_party/git/builtin/check-mailmap.c (renamed from builtin/check-mailmap.c)0
-rw-r--r--third_party/git/builtin/check-ref-format.c (renamed from builtin/check-ref-format.c)0
-rw-r--r--third_party/git/builtin/checkout-index.c (renamed from builtin/checkout-index.c)0
-rw-r--r--third_party/git/builtin/checkout.c (renamed from builtin/checkout.c)0
-rw-r--r--third_party/git/builtin/clean.c (renamed from builtin/clean.c)0
-rw-r--r--third_party/git/builtin/clone.c (renamed from builtin/clone.c)0
-rw-r--r--third_party/git/builtin/column.c (renamed from builtin/column.c)0
-rw-r--r--third_party/git/builtin/commit-graph.c (renamed from builtin/commit-graph.c)0
-rw-r--r--third_party/git/builtin/commit-tree.c (renamed from builtin/commit-tree.c)0
-rw-r--r--third_party/git/builtin/commit.c (renamed from builtin/commit.c)0
-rw-r--r--third_party/git/builtin/config.c (renamed from builtin/config.c)0
-rw-r--r--third_party/git/builtin/count-objects.c (renamed from builtin/count-objects.c)0
-rw-r--r--third_party/git/builtin/credential.c (renamed from builtin/credential.c)0
-rw-r--r--third_party/git/builtin/describe.c (renamed from builtin/describe.c)0
-rw-r--r--third_party/git/builtin/diff-files.c (renamed from builtin/diff-files.c)0
-rw-r--r--third_party/git/builtin/diff-index.c (renamed from builtin/diff-index.c)0
-rw-r--r--third_party/git/builtin/diff-tree.c (renamed from builtin/diff-tree.c)0
-rw-r--r--third_party/git/builtin/diff.c (renamed from builtin/diff.c)0
-rw-r--r--third_party/git/builtin/difftool.c (renamed from builtin/difftool.c)0
-rw-r--r--third_party/git/builtin/env--helper.c (renamed from builtin/env--helper.c)0
-rw-r--r--third_party/git/builtin/fast-export.c (renamed from builtin/fast-export.c)0
-rw-r--r--third_party/git/builtin/fetch-pack.c (renamed from builtin/fetch-pack.c)0
-rw-r--r--third_party/git/builtin/fetch.c (renamed from builtin/fetch.c)0
-rw-r--r--third_party/git/builtin/fmt-merge-msg.c (renamed from builtin/fmt-merge-msg.c)0
-rw-r--r--third_party/git/builtin/for-each-ref.c (renamed from builtin/for-each-ref.c)0
-rw-r--r--third_party/git/builtin/fsck.c (renamed from builtin/fsck.c)0
-rw-r--r--third_party/git/builtin/gc.c (renamed from builtin/gc.c)0
-rw-r--r--third_party/git/builtin/get-tar-commit-id.c (renamed from builtin/get-tar-commit-id.c)0
-rw-r--r--third_party/git/builtin/grep.c (renamed from builtin/grep.c)0
-rw-r--r--third_party/git/builtin/hash-object.c (renamed from builtin/hash-object.c)0
-rw-r--r--third_party/git/builtin/help.c (renamed from builtin/help.c)0
-rw-r--r--third_party/git/builtin/index-pack.c (renamed from builtin/index-pack.c)0
-rw-r--r--third_party/git/builtin/init-db.c (renamed from builtin/init-db.c)0
-rw-r--r--third_party/git/builtin/interpret-trailers.c (renamed from builtin/interpret-trailers.c)0
-rw-r--r--third_party/git/builtin/log.c (renamed from builtin/log.c)0
-rw-r--r--third_party/git/builtin/ls-files.c (renamed from builtin/ls-files.c)0
-rw-r--r--third_party/git/builtin/ls-remote.c (renamed from builtin/ls-remote.c)0
-rw-r--r--third_party/git/builtin/ls-tree.c (renamed from builtin/ls-tree.c)0
-rw-r--r--third_party/git/builtin/mailinfo.c (renamed from builtin/mailinfo.c)0
-rw-r--r--third_party/git/builtin/mailsplit.c (renamed from builtin/mailsplit.c)0
-rw-r--r--third_party/git/builtin/merge-base.c (renamed from builtin/merge-base.c)0
-rw-r--r--third_party/git/builtin/merge-file.c (renamed from builtin/merge-file.c)0
-rw-r--r--third_party/git/builtin/merge-index.c (renamed from builtin/merge-index.c)0
-rw-r--r--third_party/git/builtin/merge-ours.c (renamed from builtin/merge-ours.c)0
-rw-r--r--third_party/git/builtin/merge-recursive.c (renamed from builtin/merge-recursive.c)0
-rw-r--r--third_party/git/builtin/merge-tree.c (renamed from builtin/merge-tree.c)0
-rw-r--r--third_party/git/builtin/merge.c (renamed from builtin/merge.c)0
-rw-r--r--third_party/git/builtin/mktag.c (renamed from builtin/mktag.c)0
-rw-r--r--third_party/git/builtin/mktree.c (renamed from builtin/mktree.c)0
-rw-r--r--third_party/git/builtin/multi-pack-index.c (renamed from builtin/multi-pack-index.c)0
-rw-r--r--third_party/git/builtin/mv.c (renamed from builtin/mv.c)0
-rw-r--r--third_party/git/builtin/name-rev.c (renamed from builtin/name-rev.c)0
-rw-r--r--third_party/git/builtin/notes.c (renamed from builtin/notes.c)0
-rw-r--r--third_party/git/builtin/pack-objects.c (renamed from builtin/pack-objects.c)0
-rw-r--r--third_party/git/builtin/pack-redundant.c (renamed from builtin/pack-redundant.c)0
-rw-r--r--third_party/git/builtin/pack-refs.c (renamed from builtin/pack-refs.c)0
-rw-r--r--third_party/git/builtin/patch-id.c (renamed from builtin/patch-id.c)0
-rw-r--r--third_party/git/builtin/prune-packed.c (renamed from builtin/prune-packed.c)0
-rw-r--r--third_party/git/builtin/prune.c (renamed from builtin/prune.c)0
-rw-r--r--third_party/git/builtin/pull.c (renamed from builtin/pull.c)0
-rw-r--r--third_party/git/builtin/push.c (renamed from builtin/push.c)0
-rw-r--r--third_party/git/builtin/range-diff.c (renamed from builtin/range-diff.c)0
-rw-r--r--third_party/git/builtin/read-tree.c (renamed from builtin/read-tree.c)0
-rw-r--r--third_party/git/builtin/rebase.c (renamed from builtin/rebase.c)0
-rw-r--r--third_party/git/builtin/receive-pack.c (renamed from builtin/receive-pack.c)0
-rw-r--r--third_party/git/builtin/reflog.c (renamed from builtin/reflog.c)0
-rw-r--r--third_party/git/builtin/remote-ext.c (renamed from builtin/remote-ext.c)0
-rw-r--r--third_party/git/builtin/remote-fd.c (renamed from builtin/remote-fd.c)0
-rw-r--r--third_party/git/builtin/remote.c (renamed from builtin/remote.c)0
-rw-r--r--third_party/git/builtin/repack.c (renamed from builtin/repack.c)0
-rw-r--r--third_party/git/builtin/replace.c (renamed from builtin/replace.c)0
-rw-r--r--third_party/git/builtin/rerere.c (renamed from builtin/rerere.c)0
-rw-r--r--third_party/git/builtin/reset.c (renamed from builtin/reset.c)0
-rw-r--r--third_party/git/builtin/rev-list.c (renamed from builtin/rev-list.c)0
-rw-r--r--third_party/git/builtin/rev-parse.c (renamed from builtin/rev-parse.c)0
-rw-r--r--third_party/git/builtin/revert.c (renamed from builtin/revert.c)0
-rw-r--r--third_party/git/builtin/rm.c (renamed from builtin/rm.c)0
-rw-r--r--third_party/git/builtin/send-pack.c (renamed from builtin/send-pack.c)0
-rw-r--r--third_party/git/builtin/shortlog.c (renamed from builtin/shortlog.c)0
-rw-r--r--third_party/git/builtin/show-branch.c (renamed from builtin/show-branch.c)0
-rw-r--r--third_party/git/builtin/show-index.c (renamed from builtin/show-index.c)0
-rw-r--r--third_party/git/builtin/show-ref.c (renamed from builtin/show-ref.c)0
-rw-r--r--third_party/git/builtin/stash.c (renamed from builtin/stash.c)0
-rw-r--r--third_party/git/builtin/stripspace.c (renamed from builtin/stripspace.c)0
-rw-r--r--third_party/git/builtin/submodule--helper.c (renamed from builtin/submodule--helper.c)0
-rw-r--r--third_party/git/builtin/symbolic-ref.c (renamed from builtin/symbolic-ref.c)0
-rw-r--r--third_party/git/builtin/tag.c (renamed from builtin/tag.c)0
-rw-r--r--third_party/git/builtin/unpack-file.c (renamed from builtin/unpack-file.c)0
-rw-r--r--third_party/git/builtin/unpack-objects.c (renamed from builtin/unpack-objects.c)0
-rw-r--r--third_party/git/builtin/update-index.c (renamed from builtin/update-index.c)0
-rw-r--r--third_party/git/builtin/update-ref.c (renamed from builtin/update-ref.c)0
-rw-r--r--third_party/git/builtin/update-server-info.c (renamed from builtin/update-server-info.c)0
-rw-r--r--third_party/git/builtin/upload-archive.c (renamed from builtin/upload-archive.c)0
-rw-r--r--third_party/git/builtin/upload-pack.c (renamed from builtin/upload-pack.c)0
-rw-r--r--third_party/git/builtin/var.c (renamed from builtin/var.c)0
-rw-r--r--third_party/git/builtin/verify-commit.c (renamed from builtin/verify-commit.c)0
-rw-r--r--third_party/git/builtin/verify-pack.c (renamed from builtin/verify-pack.c)0
-rw-r--r--third_party/git/builtin/verify-tag.c (renamed from builtin/verify-tag.c)0
-rw-r--r--third_party/git/builtin/worktree.c (renamed from builtin/worktree.c)0
-rw-r--r--third_party/git/builtin/write-tree.c (renamed from builtin/write-tree.c)0
-rw-r--r--third_party/git/bulk-checkin.c (renamed from bulk-checkin.c)0
-rw-r--r--third_party/git/bulk-checkin.h (renamed from bulk-checkin.h)0
-rw-r--r--third_party/git/bundle.c (renamed from bundle.c)0
-rw-r--r--third_party/git/bundle.h (renamed from bundle.h)0
-rw-r--r--third_party/git/cache-tree.c (renamed from cache-tree.c)0
-rw-r--r--third_party/git/cache-tree.h (renamed from cache-tree.h)0
-rw-r--r--third_party/git/cache.h (renamed from cache.h)0
-rw-r--r--third_party/git/chdir-notify.c (renamed from chdir-notify.c)0
-rw-r--r--third_party/git/chdir-notify.h (renamed from chdir-notify.h)0
-rwxr-xr-xthird_party/git/check-builtins.sh (renamed from check-builtins.sh)0
-rwxr-xr-xthird_party/git/check_bindir (renamed from check_bindir)0
-rw-r--r--third_party/git/checkout.c (renamed from checkout.c)0
-rw-r--r--third_party/git/checkout.h (renamed from checkout.h)0
-rwxr-xr-xthird_party/git/ci/install-dependencies.sh (renamed from ci/install-dependencies.sh)0
-rwxr-xr-xthird_party/git/ci/lib.sh (renamed from ci/lib.sh)0
-rwxr-xr-xthird_party/git/ci/make-test-artifacts.sh (renamed from ci/make-test-artifacts.sh)0
-rwxr-xr-xthird_party/git/ci/mount-fileshare.sh (renamed from ci/mount-fileshare.sh)0
-rwxr-xr-xthird_party/git/ci/print-test-failures.sh (renamed from ci/print-test-failures.sh)0
-rwxr-xr-xthird_party/git/ci/run-build-and-tests.sh (renamed from ci/run-build-and-tests.sh)0
-rwxr-xr-xthird_party/git/ci/run-linux32-build.sh (renamed from ci/run-linux32-build.sh)0
-rwxr-xr-xthird_party/git/ci/run-linux32-docker.sh (renamed from ci/run-linux32-docker.sh)0
-rwxr-xr-xthird_party/git/ci/run-static-analysis.sh (renamed from ci/run-static-analysis.sh)0
-rwxr-xr-xthird_party/git/ci/run-test-slice.sh (renamed from ci/run-test-slice.sh)0
-rwxr-xr-xthird_party/git/ci/test-documentation.sh (renamed from ci/test-documentation.sh)0
-rwxr-xr-xthird_party/git/ci/util/extract-trash-dirs.sh (renamed from ci/util/extract-trash-dirs.sh)0
-rw-r--r--third_party/git/color.c (renamed from color.c)0
-rw-r--r--third_party/git/color.h (renamed from color.h)0
-rw-r--r--third_party/git/column.c (renamed from column.c)0
-rw-r--r--third_party/git/column.h (renamed from column.h)0
-rw-r--r--third_party/git/combine-diff.c (renamed from combine-diff.c)0
-rw-r--r--third_party/git/command-list.txt (renamed from command-list.txt)0
-rw-r--r--third_party/git/commit-graph.c (renamed from commit-graph.c)0
-rw-r--r--third_party/git/commit-graph.h (renamed from commit-graph.h)0
-rw-r--r--third_party/git/commit-reach.c (renamed from commit-reach.c)0
-rw-r--r--third_party/git/commit-reach.h (renamed from commit-reach.h)0
-rw-r--r--third_party/git/commit-slab-decl.h (renamed from commit-slab-decl.h)0
-rw-r--r--third_party/git/commit-slab-impl.h (renamed from commit-slab-impl.h)0
-rw-r--r--third_party/git/commit-slab.h (renamed from commit-slab.h)0
-rw-r--r--third_party/git/commit.c (renamed from commit.c)0
-rw-r--r--third_party/git/commit.h (renamed from commit.h)0
-rw-r--r--third_party/git/common-main.c (renamed from common-main.c)0
-rw-r--r--third_party/git/compat/access.c (renamed from compat/access.c)0
-rw-r--r--third_party/git/compat/apple-common-crypto.h (renamed from compat/apple-common-crypto.h)0
-rw-r--r--third_party/git/compat/basename.c (renamed from compat/basename.c)0
-rw-r--r--third_party/git/compat/bswap.h (renamed from compat/bswap.h)0
-rw-r--r--third_party/git/compat/fileno.c (renamed from compat/fileno.c)0
-rw-r--r--third_party/git/compat/fopen.c (renamed from compat/fopen.c)0
-rw-r--r--third_party/git/compat/gmtime.c (renamed from compat/gmtime.c)0
-rw-r--r--third_party/git/compat/hstrerror.c (renamed from compat/hstrerror.c)0
-rw-r--r--third_party/git/compat/inet_ntop.c (renamed from compat/inet_ntop.c)0
-rw-r--r--third_party/git/compat/inet_pton.c (renamed from compat/inet_pton.c)0
-rw-r--r--third_party/git/compat/memmem.c (renamed from compat/memmem.c)0
-rw-r--r--third_party/git/compat/mingw.c (renamed from compat/mingw.c)0
-rw-r--r--third_party/git/compat/mingw.h (renamed from compat/mingw.h)0
-rw-r--r--third_party/git/compat/mkdir.c (renamed from compat/mkdir.c)0
-rw-r--r--third_party/git/compat/mkdtemp.c (renamed from compat/mkdtemp.c)0
-rw-r--r--third_party/git/compat/mmap.c (renamed from compat/mmap.c)0
-rw-r--r--third_party/git/compat/msvc.c (renamed from compat/msvc.c)0
-rw-r--r--third_party/git/compat/msvc.h (renamed from compat/msvc.h)0
-rw-r--r--third_party/git/compat/nedmalloc/License.txt (renamed from compat/nedmalloc/License.txt)0
-rw-r--r--third_party/git/compat/nedmalloc/Readme.txt (renamed from compat/nedmalloc/Readme.txt)0
-rw-r--r--third_party/git/compat/nedmalloc/malloc.c.h (renamed from compat/nedmalloc/malloc.c.h)0
-rw-r--r--third_party/git/compat/nedmalloc/nedmalloc.c (renamed from compat/nedmalloc/nedmalloc.c)0
-rw-r--r--third_party/git/compat/nedmalloc/nedmalloc.h (renamed from compat/nedmalloc/nedmalloc.h)0
-rw-r--r--third_party/git/compat/obstack.c (renamed from compat/obstack.c)0
-rw-r--r--third_party/git/compat/obstack.h (renamed from compat/obstack.h)0
-rw-r--r--third_party/git/compat/poll/poll.c (renamed from compat/poll/poll.c)0
-rw-r--r--third_party/git/compat/poll/poll.h (renamed from compat/poll/poll.h)0
-rw-r--r--third_party/git/compat/pread.c (renamed from compat/pread.c)0
-rw-r--r--third_party/git/compat/precompose_utf8.c (renamed from compat/precompose_utf8.c)0
-rw-r--r--third_party/git/compat/precompose_utf8.h (renamed from compat/precompose_utf8.h)0
-rw-r--r--third_party/git/compat/qsort.c (renamed from compat/qsort.c)0
-rw-r--r--third_party/git/compat/qsort_s.c (renamed from compat/qsort_s.c)0
-rw-r--r--third_party/git/compat/regex/regcomp.c (renamed from compat/regex/regcomp.c)0
-rw-r--r--third_party/git/compat/regex/regex.c (renamed from compat/regex/regex.c)0
-rw-r--r--third_party/git/compat/regex/regex.h (renamed from compat/regex/regex.h)0
-rw-r--r--third_party/git/compat/regex/regex_internal.c (renamed from compat/regex/regex_internal.c)0
-rw-r--r--third_party/git/compat/regex/regex_internal.h (renamed from compat/regex/regex_internal.h)0
-rw-r--r--third_party/git/compat/regex/regexec.c (renamed from compat/regex/regexec.c)0
-rw-r--r--third_party/git/compat/setenv.c (renamed from compat/setenv.c)0
-rw-r--r--third_party/git/compat/sha1-chunked.c (renamed from compat/sha1-chunked.c)0
-rw-r--r--third_party/git/compat/sha1-chunked.h (renamed from compat/sha1-chunked.h)0
-rw-r--r--third_party/git/compat/snprintf.c (renamed from compat/snprintf.c)0
-rw-r--r--third_party/git/compat/stat.c (renamed from compat/stat.c)0
-rw-r--r--third_party/git/compat/strcasestr.c (renamed from compat/strcasestr.c)0
-rw-r--r--third_party/git/compat/strdup.c (renamed from compat/strdup.c)0
-rw-r--r--third_party/git/compat/strlcpy.c (renamed from compat/strlcpy.c)0
-rw-r--r--third_party/git/compat/strtoimax.c (renamed from compat/strtoimax.c)0
-rw-r--r--third_party/git/compat/strtoumax.c (renamed from compat/strtoumax.c)0
-rw-r--r--third_party/git/compat/terminal.c (renamed from compat/terminal.c)0
-rw-r--r--third_party/git/compat/terminal.h (renamed from compat/terminal.h)0
-rw-r--r--third_party/git/compat/unsetenv.c (renamed from compat/unsetenv.c)0
-rw-r--r--third_party/git/compat/vcbuild/.gitignore (renamed from compat/vcbuild/.gitignore)0
-rw-r--r--third_party/git/compat/vcbuild/README (renamed from compat/vcbuild/README)0
-rw-r--r--third_party/git/compat/vcbuild/find_vs_env.bat (renamed from compat/vcbuild/find_vs_env.bat)0
-rw-r--r--third_party/git/compat/vcbuild/include/sys/param.h (renamed from compat/vcbuild/include/sys/param.h)0
-rw-r--r--third_party/git/compat/vcbuild/include/sys/time.h (renamed from compat/vcbuild/include/sys/time.h)0
-rw-r--r--third_party/git/compat/vcbuild/include/sys/utime.h (renamed from compat/vcbuild/include/sys/utime.h)0
-rw-r--r--third_party/git/compat/vcbuild/include/unistd.h (renamed from compat/vcbuild/include/unistd.h)0
-rw-r--r--third_party/git/compat/vcbuild/include/utime.h (renamed from compat/vcbuild/include/utime.h)0
-rwxr-xr-xthird_party/git/compat/vcbuild/scripts/clink.pl (renamed from compat/vcbuild/scripts/clink.pl)0
-rwxr-xr-xthird_party/git/compat/vcbuild/scripts/lib.pl (renamed from compat/vcbuild/scripts/lib.pl)0
-rw-r--r--third_party/git/compat/vcbuild/vcpkg_copy_dlls.bat (renamed from compat/vcbuild/vcpkg_copy_dlls.bat)0
-rw-r--r--third_party/git/compat/vcbuild/vcpkg_install.bat (renamed from compat/vcbuild/vcpkg_install.bat)0
-rw-r--r--third_party/git/compat/win32.h (renamed from compat/win32.h)0
-rw-r--r--third_party/git/compat/win32/alloca.h (renamed from compat/win32/alloca.h)0
-rw-r--r--third_party/git/compat/win32/dirent.c (renamed from compat/win32/dirent.c)0
-rw-r--r--third_party/git/compat/win32/dirent.h (renamed from compat/win32/dirent.h)0
-rw-r--r--third_party/git/compat/win32/git.manifest (renamed from compat/win32/git.manifest)0
-rw-r--r--third_party/git/compat/win32/lazyload.h (renamed from compat/win32/lazyload.h)0
-rw-r--r--third_party/git/compat/win32/path-utils.c (renamed from compat/win32/path-utils.c)0
-rw-r--r--third_party/git/compat/win32/path-utils.h (renamed from compat/win32/path-utils.h)0
-rw-r--r--third_party/git/compat/win32/pthread.c (renamed from compat/win32/pthread.c)0
-rw-r--r--third_party/git/compat/win32/pthread.h (renamed from compat/win32/pthread.h)0
-rw-r--r--third_party/git/compat/win32/syslog.c (renamed from compat/win32/syslog.c)0
-rw-r--r--third_party/git/compat/win32/syslog.h (renamed from compat/win32/syslog.h)0
-rw-r--r--third_party/git/compat/win32/trace2_win32_process_info.c (renamed from compat/win32/trace2_win32_process_info.c)0
-rw-r--r--third_party/git/compat/win32mmap.c (renamed from compat/win32mmap.c)0
-rw-r--r--third_party/git/compat/winansi.c (renamed from compat/winansi.c)0
-rw-r--r--third_party/git/config.c (renamed from config.c)0
-rw-r--r--third_party/git/config.h (renamed from config.h)0
-rw-r--r--third_party/git/config.mak.dev (renamed from config.mak.dev)0
-rw-r--r--third_party/git/config.mak.in (renamed from config.mak.in)0
-rw-r--r--third_party/git/config.mak.uname (renamed from config.mak.uname)0
-rw-r--r--third_party/git/configure.ac (renamed from configure.ac)0
-rw-r--r--third_party/git/connect.c (renamed from connect.c)0
-rw-r--r--third_party/git/connect.h (renamed from connect.h)0
-rw-r--r--third_party/git/connected.c (renamed from connected.c)0
-rw-r--r--third_party/git/connected.h (renamed from connected.h)0
-rw-r--r--third_party/git/contrib/README (renamed from contrib/README)0
-rw-r--r--third_party/git/contrib/buildsystems/Generators.pm (renamed from contrib/buildsystems/Generators.pm)0
-rw-r--r--third_party/git/contrib/buildsystems/Generators/QMake.pm (renamed from contrib/buildsystems/Generators/QMake.pm)0
-rw-r--r--third_party/git/contrib/buildsystems/Generators/Vcproj.pm (renamed from contrib/buildsystems/Generators/Vcproj.pm)0
-rw-r--r--third_party/git/contrib/buildsystems/Generators/Vcxproj.pm (renamed from contrib/buildsystems/Generators/Vcxproj.pm)0
-rwxr-xr-xthird_party/git/contrib/buildsystems/engine.pl (renamed from contrib/buildsystems/engine.pl)0
-rwxr-xr-xthird_party/git/contrib/buildsystems/generate (renamed from contrib/buildsystems/generate)0
-rwxr-xr-xthird_party/git/contrib/buildsystems/parse.pl (renamed from contrib/buildsystems/parse.pl)0
-rw-r--r--third_party/git/contrib/coccinelle/.gitignore (renamed from contrib/coccinelle/.gitignore)0
-rw-r--r--third_party/git/contrib/coccinelle/README (renamed from contrib/coccinelle/README)0
-rw-r--r--third_party/git/contrib/coccinelle/array.cocci (renamed from contrib/coccinelle/array.cocci)0
-rw-r--r--third_party/git/contrib/coccinelle/commit.cocci (renamed from contrib/coccinelle/commit.cocci)0
-rw-r--r--third_party/git/contrib/coccinelle/flex_alloc.cocci (renamed from contrib/coccinelle/flex_alloc.cocci)0
-rw-r--r--third_party/git/contrib/coccinelle/free.cocci (renamed from contrib/coccinelle/free.cocci)0
-rw-r--r--third_party/git/contrib/coccinelle/object_id.cocci (renamed from contrib/coccinelle/object_id.cocci)0
-rw-r--r--third_party/git/contrib/coccinelle/preincr.cocci (renamed from contrib/coccinelle/preincr.cocci)0
-rw-r--r--third_party/git/contrib/coccinelle/qsort.cocci (renamed from contrib/coccinelle/qsort.cocci)0
-rw-r--r--third_party/git/contrib/coccinelle/strbuf.cocci (renamed from contrib/coccinelle/strbuf.cocci)0
-rw-r--r--third_party/git/contrib/coccinelle/swap.cocci (renamed from contrib/coccinelle/swap.cocci)0
-rw-r--r--third_party/git/contrib/coccinelle/the_repository.pending.cocci (renamed from contrib/coccinelle/the_repository.pending.cocci)0
-rw-r--r--third_party/git/contrib/coccinelle/xstrdup_or_null.cocci (renamed from contrib/coccinelle/xstrdup_or_null.cocci)0
-rw-r--r--third_party/git/contrib/completion/.gitattributes (renamed from contrib/completion/.gitattributes)0
-rw-r--r--third_party/git/contrib/completion/git-completion.bash (renamed from contrib/completion/git-completion.bash)0
-rw-r--r--third_party/git/contrib/completion/git-completion.tcsh (renamed from contrib/completion/git-completion.tcsh)0
-rw-r--r--third_party/git/contrib/completion/git-completion.zsh (renamed from contrib/completion/git-completion.zsh)0
-rw-r--r--third_party/git/contrib/completion/git-prompt.sh (renamed from contrib/completion/git-prompt.sh)0
-rw-r--r--third_party/git/contrib/contacts/.gitignore (renamed from contrib/contacts/.gitignore)0
-rw-r--r--third_party/git/contrib/contacts/Makefile (renamed from contrib/contacts/Makefile)0
-rwxr-xr-xthird_party/git/contrib/contacts/git-contacts (renamed from contrib/contacts/git-contacts)0
-rw-r--r--third_party/git/contrib/contacts/git-contacts.txt (renamed from contrib/contacts/git-contacts.txt)0
-rwxr-xr-xthird_party/git/contrib/coverage-diff.sh (renamed from contrib/coverage-diff.sh)0
-rw-r--r--third_party/git/contrib/credential/gnome-keyring/.gitignore (renamed from contrib/credential/gnome-keyring/.gitignore)0
-rw-r--r--third_party/git/contrib/credential/gnome-keyring/Makefile (renamed from contrib/credential/gnome-keyring/Makefile)0
-rw-r--r--third_party/git/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c (renamed from contrib/credential/gnome-keyring/git-credential-gnome-keyring.c)0
-rw-r--r--third_party/git/contrib/credential/libsecret/Makefile (renamed from contrib/credential/libsecret/Makefile)0
-rw-r--r--third_party/git/contrib/credential/libsecret/git-credential-libsecret.c (renamed from contrib/credential/libsecret/git-credential-libsecret.c)0
-rw-r--r--third_party/git/contrib/credential/netrc/Makefile (renamed from contrib/credential/netrc/Makefile)0
-rwxr-xr-xthird_party/git/contrib/credential/netrc/git-credential-netrc (renamed from contrib/credential/netrc/git-credential-netrc)0
-rwxr-xr-xthird_party/git/contrib/credential/netrc/t-git-credential-netrc.sh (renamed from contrib/credential/netrc/t-git-credential-netrc.sh)0
-rwxr-xr-xthird_party/git/contrib/credential/netrc/test.command-option-gpg (renamed from contrib/credential/netrc/test.command-option-gpg)0
-rwxr-xr-xthird_party/git/contrib/credential/netrc/test.git-config-gpg (renamed from contrib/credential/netrc/test.git-config-gpg)0
-rw-r--r--third_party/git/contrib/credential/netrc/test.netrc (renamed from contrib/credential/netrc/test.netrc)0
-rw-r--r--third_party/git/contrib/credential/netrc/test.netrc.gpg (renamed from t/t5100/empty)0
-rwxr-xr-xthird_party/git/contrib/credential/netrc/test.pl (renamed from contrib/credential/netrc/test.pl)0
-rw-r--r--third_party/git/contrib/credential/osxkeychain/.gitignore (renamed from contrib/credential/osxkeychain/.gitignore)0
-rw-r--r--third_party/git/contrib/credential/osxkeychain/Makefile (renamed from contrib/credential/osxkeychain/Makefile)0
-rw-r--r--third_party/git/contrib/credential/osxkeychain/git-credential-osxkeychain.c (renamed from contrib/credential/osxkeychain/git-credential-osxkeychain.c)0
-rw-r--r--third_party/git/contrib/credential/wincred/Makefile (renamed from contrib/credential/wincred/Makefile)0
-rw-r--r--third_party/git/contrib/credential/wincred/git-credential-wincred.c (renamed from contrib/credential/wincred/git-credential-wincred.c)0
-rw-r--r--third_party/git/contrib/diff-highlight/.gitignore (renamed from contrib/diff-highlight/.gitignore)0
-rw-r--r--third_party/git/contrib/diff-highlight/DiffHighlight.pm (renamed from contrib/diff-highlight/DiffHighlight.pm)0
-rw-r--r--third_party/git/contrib/diff-highlight/Makefile (renamed from contrib/diff-highlight/Makefile)0
-rw-r--r--third_party/git/contrib/diff-highlight/README (renamed from contrib/diff-highlight/README)0
-rw-r--r--third_party/git/contrib/diff-highlight/diff-highlight.perl (renamed from contrib/diff-highlight/diff-highlight.perl)0
-rw-r--r--third_party/git/contrib/diff-highlight/t/.gitignore (renamed from contrib/diff-highlight/t/.gitignore)0
-rw-r--r--third_party/git/contrib/diff-highlight/t/Makefile (renamed from contrib/diff-highlight/t/Makefile)0
-rwxr-xr-xthird_party/git/contrib/diff-highlight/t/t9400-diff-highlight.sh (renamed from contrib/diff-highlight/t/t9400-diff-highlight.sh)0
-rw-r--r--third_party/git/contrib/emacs/README (renamed from contrib/emacs/README)0
-rw-r--r--third_party/git/contrib/emacs/git-blame.el (renamed from contrib/emacs/git-blame.el)0
-rw-r--r--third_party/git/contrib/emacs/git.el (renamed from contrib/emacs/git.el)0
-rw-r--r--third_party/git/contrib/examples/README (renamed from contrib/examples/README)0
-rwxr-xr-xthird_party/git/contrib/fast-import/git-import.perl (renamed from contrib/fast-import/git-import.perl)0
-rwxr-xr-xthird_party/git/contrib/fast-import/git-import.sh (renamed from contrib/fast-import/git-import.sh)0
-rw-r--r--third_party/git/contrib/fast-import/git-p4.README (renamed from contrib/fast-import/git-p4.README)0
-rwxr-xr-xthird_party/git/contrib/fast-import/import-directories.perl (renamed from contrib/fast-import/import-directories.perl)0
-rwxr-xr-xthird_party/git/contrib/fast-import/import-tars.perl (renamed from contrib/fast-import/import-tars.perl)0
-rwxr-xr-xthird_party/git/contrib/fast-import/import-zips.py (renamed from contrib/fast-import/import-zips.py)0
-rw-r--r--third_party/git/contrib/git-jump/README (renamed from contrib/git-jump/README)0
-rwxr-xr-xthird_party/git/contrib/git-jump/git-jump (renamed from contrib/git-jump/git-jump)0
-rwxr-xr-xthird_party/git/contrib/git-resurrect.sh (renamed from contrib/git-resurrect.sh)0
-rw-r--r--third_party/git/contrib/git-shell-commands/README (renamed from contrib/git-shell-commands/README)0
-rwxr-xr-xthird_party/git/contrib/git-shell-commands/help (renamed from contrib/git-shell-commands/help)0
-rwxr-xr-xthird_party/git/contrib/git-shell-commands/list (renamed from contrib/git-shell-commands/list)0
-rwxr-xr-xthird_party/git/contrib/hg-to-git/hg-to-git.py (renamed from contrib/hg-to-git/hg-to-git.py)0
-rw-r--r--third_party/git/contrib/hg-to-git/hg-to-git.txt (renamed from contrib/hg-to-git/hg-to-git.txt)0
-rw-r--r--third_party/git/contrib/hooks/multimail/CHANGES (renamed from contrib/hooks/multimail/CHANGES)0
-rw-r--r--third_party/git/contrib/hooks/multimail/CONTRIBUTING.rst (renamed from contrib/hooks/multimail/CONTRIBUTING.rst)0
-rw-r--r--third_party/git/contrib/hooks/multimail/README.Git (renamed from contrib/hooks/multimail/README.Git)0
-rw-r--r--third_party/git/contrib/hooks/multimail/README.migrate-from-post-receive-email (renamed from contrib/hooks/multimail/README.migrate-from-post-receive-email)0
-rw-r--r--third_party/git/contrib/hooks/multimail/README.rst (renamed from contrib/hooks/multimail/README.rst)0
-rw-r--r--third_party/git/contrib/hooks/multimail/doc/customizing-emails.rst (renamed from contrib/hooks/multimail/doc/customizing-emails.rst)0
-rw-r--r--third_party/git/contrib/hooks/multimail/doc/gerrit.rst (renamed from contrib/hooks/multimail/doc/gerrit.rst)0
-rw-r--r--third_party/git/contrib/hooks/multimail/doc/gitolite.rst (renamed from contrib/hooks/multimail/doc/gitolite.rst)0
-rw-r--r--third_party/git/contrib/hooks/multimail/doc/troubleshooting.rst (renamed from contrib/hooks/multimail/doc/troubleshooting.rst)0
-rwxr-xr-xthird_party/git/contrib/hooks/multimail/git_multimail.py (renamed from contrib/hooks/multimail/git_multimail.py)0
-rwxr-xr-xthird_party/git/contrib/hooks/multimail/migrate-mailhook-config (renamed from contrib/hooks/multimail/migrate-mailhook-config)0
-rwxr-xr-xthird_party/git/contrib/hooks/multimail/post-receive.example (renamed from contrib/hooks/multimail/post-receive.example)0
-rwxr-xr-xthird_party/git/contrib/hooks/post-receive-email (renamed from contrib/hooks/post-receive-email)0
-rwxr-xr-xthird_party/git/contrib/hooks/pre-auto-gc-battery (renamed from contrib/hooks/pre-auto-gc-battery)0
-rwxr-xr-xthird_party/git/contrib/hooks/setgitperms.perl (renamed from contrib/hooks/setgitperms.perl)0
-rwxr-xr-xthird_party/git/contrib/hooks/update-paranoid (renamed from contrib/hooks/update-paranoid)0
-rwxr-xr-xthird_party/git/contrib/long-running-filter/example.pl (renamed from contrib/long-running-filter/example.pl)0
-rw-r--r--third_party/git/contrib/mw-to-git/.gitignore (renamed from contrib/mw-to-git/.gitignore)0
-rw-r--r--third_party/git/contrib/mw-to-git/.perlcriticrc (renamed from contrib/mw-to-git/.perlcriticrc)0
-rw-r--r--third_party/git/contrib/mw-to-git/Git/Mediawiki.pm (renamed from contrib/mw-to-git/Git/Mediawiki.pm)0
-rw-r--r--third_party/git/contrib/mw-to-git/Makefile (renamed from contrib/mw-to-git/Makefile)0
-rwxr-xr-xthird_party/git/contrib/mw-to-git/bin-wrapper/git (renamed from contrib/mw-to-git/bin-wrapper/git)0
-rwxr-xr-xthird_party/git/contrib/mw-to-git/git-mw.perl (renamed from contrib/mw-to-git/git-mw.perl)0
-rwxr-xr-xthird_party/git/contrib/mw-to-git/git-remote-mediawiki.perl (renamed from contrib/mw-to-git/git-remote-mediawiki.perl)0
-rw-r--r--third_party/git/contrib/mw-to-git/git-remote-mediawiki.txt (renamed from contrib/mw-to-git/git-remote-mediawiki.txt)0
-rw-r--r--third_party/git/contrib/mw-to-git/t/.gitignore (renamed from contrib/mw-to-git/t/.gitignore)0
-rw-r--r--third_party/git/contrib/mw-to-git/t/Makefile (renamed from contrib/mw-to-git/t/Makefile)0
-rw-r--r--third_party/git/contrib/mw-to-git/t/README (renamed from contrib/mw-to-git/t/README)0
-rwxr-xr-xthird_party/git/contrib/mw-to-git/t/install-wiki.sh (renamed from contrib/mw-to-git/t/install-wiki.sh)0
-rw-r--r--third_party/git/contrib/mw-to-git/t/install-wiki/.gitignore (renamed from contrib/mw-to-git/t/install-wiki/.gitignore)0
-rw-r--r--third_party/git/contrib/mw-to-git/t/install-wiki/LocalSettings.php (renamed from contrib/mw-to-git/t/install-wiki/LocalSettings.php)0
-rw-r--r--third_party/git/contrib/mw-to-git/t/install-wiki/db_install.php (renamed from contrib/mw-to-git/t/install-wiki/db_install.php)0
-rw-r--r--third_party/git/contrib/mw-to-git/t/push-pull-tests.sh (renamed from contrib/mw-to-git/t/push-pull-tests.sh)0
-rwxr-xr-xthird_party/git/contrib/mw-to-git/t/t9360-mw-to-git-clone.sh (renamed from contrib/mw-to-git/t/t9360-mw-to-git-clone.sh)0
-rwxr-xr-xthird_party/git/contrib/mw-to-git/t/t9361-mw-to-git-push-pull.sh (renamed from contrib/mw-to-git/t/t9361-mw-to-git-push-pull.sh)0
-rwxr-xr-xthird_party/git/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh (renamed from contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh)0
-rwxr-xr-xthird_party/git/contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh (renamed from contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh)0
-rwxr-xr-xthird_party/git/contrib/mw-to-git/t/t9364-pull-by-rev.sh (renamed from contrib/mw-to-git/t/t9364-pull-by-rev.sh)0
-rwxr-xr-xthird_party/git/contrib/mw-to-git/t/t9365-continuing-queries.sh (renamed from contrib/mw-to-git/t/t9365-continuing-queries.sh)0
-rwxr-xr-xthird_party/git/contrib/mw-to-git/t/test-gitmw-lib.sh (renamed from contrib/mw-to-git/t/test-gitmw-lib.sh)0
-rwxr-xr-xthird_party/git/contrib/mw-to-git/t/test-gitmw.pl (renamed from contrib/mw-to-git/t/test-gitmw.pl)0
-rw-r--r--third_party/git/contrib/mw-to-git/t/test.config (renamed from contrib/mw-to-git/t/test.config)0
-rw-r--r--third_party/git/contrib/persistent-https/LICENSE (renamed from contrib/persistent-https/LICENSE)0
-rw-r--r--third_party/git/contrib/persistent-https/Makefile (renamed from contrib/persistent-https/Makefile)0
-rw-r--r--third_party/git/contrib/persistent-https/README (renamed from contrib/persistent-https/README)0
-rw-r--r--third_party/git/contrib/persistent-https/client.go (renamed from contrib/persistent-https/client.go)0
-rw-r--r--third_party/git/contrib/persistent-https/main.go (renamed from contrib/persistent-https/main.go)0
-rw-r--r--third_party/git/contrib/persistent-https/proxy.go (renamed from contrib/persistent-https/proxy.go)0
-rw-r--r--third_party/git/contrib/persistent-https/socket.go (renamed from contrib/persistent-https/socket.go)0
-rw-r--r--third_party/git/contrib/remote-helpers/README (renamed from contrib/remote-helpers/README)0
-rwxr-xr-xthird_party/git/contrib/remote-helpers/git-remote-bzr (renamed from contrib/remote-helpers/git-remote-bzr)0
-rwxr-xr-xthird_party/git/contrib/remote-helpers/git-remote-hg (renamed from contrib/remote-helpers/git-remote-hg)0
-rwxr-xr-xthird_party/git/contrib/remotes2config.sh (renamed from contrib/remotes2config.sh)0
-rwxr-xr-xthird_party/git/contrib/rerere-train.sh (renamed from contrib/rerere-train.sh)0
-rwxr-xr-xthird_party/git/contrib/stats/git-common-hash (renamed from contrib/stats/git-common-hash)0
-rwxr-xr-xthird_party/git/contrib/stats/mailmap.pl (renamed from contrib/stats/mailmap.pl)0
-rwxr-xr-xthird_party/git/contrib/stats/packinfo.pl (renamed from contrib/stats/packinfo.pl)0
-rw-r--r--third_party/git/contrib/subtree/.gitignore (renamed from contrib/subtree/.gitignore)0
-rw-r--r--third_party/git/contrib/subtree/COPYING (renamed from contrib/subtree/COPYING)0
-rw-r--r--third_party/git/contrib/subtree/INSTALL (renamed from contrib/subtree/INSTALL)0
-rw-r--r--third_party/git/contrib/subtree/Makefile (renamed from contrib/subtree/Makefile)0
-rw-r--r--third_party/git/contrib/subtree/README (renamed from contrib/subtree/README)0
-rwxr-xr-xthird_party/git/contrib/subtree/git-subtree.sh (renamed from contrib/subtree/git-subtree.sh)0
-rw-r--r--third_party/git/contrib/subtree/git-subtree.txt (renamed from contrib/subtree/git-subtree.txt)0
-rw-r--r--third_party/git/contrib/subtree/t/Makefile (renamed from contrib/subtree/t/Makefile)0
-rwxr-xr-xthird_party/git/contrib/subtree/t/t7900-subtree.sh (renamed from contrib/subtree/t/t7900-subtree.sh)0
-rw-r--r--third_party/git/contrib/subtree/todo (renamed from contrib/subtree/todo)0
-rw-r--r--third_party/git/contrib/svn-fe/.gitignore (renamed from contrib/svn-fe/.gitignore)0
-rw-r--r--third_party/git/contrib/svn-fe/Makefile (renamed from contrib/svn-fe/Makefile)0
-rw-r--r--third_party/git/contrib/svn-fe/svn-fe.c (renamed from contrib/svn-fe/svn-fe.c)0
-rw-r--r--third_party/git/contrib/svn-fe/svn-fe.txt (renamed from contrib/svn-fe/svn-fe.txt)0
-rwxr-xr-xthird_party/git/contrib/svn-fe/svnrdump_sim.py (renamed from contrib/svn-fe/svnrdump_sim.py)0
-rw-r--r--third_party/git/contrib/thunderbird-patch-inline/README (renamed from contrib/thunderbird-patch-inline/README)0
-rwxr-xr-xthird_party/git/contrib/thunderbird-patch-inline/appp.sh (renamed from contrib/thunderbird-patch-inline/appp.sh)0
-rw-r--r--third_party/git/contrib/update-unicode/.gitignore (renamed from contrib/update-unicode/.gitignore)0
-rw-r--r--third_party/git/contrib/update-unicode/README (renamed from contrib/update-unicode/README)0
-rwxr-xr-xthird_party/git/contrib/update-unicode/update_unicode.sh (renamed from contrib/update-unicode/update_unicode.sh)0
-rw-r--r--third_party/git/contrib/vscode/.gitattributes (renamed from contrib/vscode/.gitattributes)0
-rw-r--r--third_party/git/contrib/vscode/README.md (renamed from contrib/vscode/README.md)0
-rwxr-xr-xthird_party/git/contrib/vscode/init.sh (renamed from contrib/vscode/init.sh)0
-rw-r--r--third_party/git/contrib/workdir/.gitattributes (renamed from contrib/workdir/.gitattributes)0
-rwxr-xr-xthird_party/git/contrib/workdir/git-new-workdir (renamed from contrib/workdir/git-new-workdir)0
-rw-r--r--third_party/git/convert.c (renamed from convert.c)0
-rw-r--r--third_party/git/convert.h (renamed from convert.h)0
-rw-r--r--third_party/git/copy.c (renamed from copy.c)0
-rw-r--r--third_party/git/credential-cache--daemon.c (renamed from credential-cache--daemon.c)0
-rw-r--r--third_party/git/credential-cache.c (renamed from credential-cache.c)0
-rw-r--r--third_party/git/credential-store.c (renamed from credential-store.c)0
-rw-r--r--third_party/git/credential.c (renamed from credential.c)0
-rw-r--r--third_party/git/credential.h (renamed from credential.h)0
-rw-r--r--third_party/git/csum-file.c (renamed from csum-file.c)0
-rw-r--r--third_party/git/csum-file.h (renamed from csum-file.h)0
-rw-r--r--third_party/git/ctype.c (renamed from ctype.c)0
-rw-r--r--third_party/git/daemon.c (renamed from daemon.c)0
-rw-r--r--third_party/git/date.c (renamed from date.c)0
-rw-r--r--third_party/git/decorate.c (renamed from decorate.c)0
-rw-r--r--third_party/git/decorate.h (renamed from decorate.h)0
-rw-r--r--third_party/git/delta-islands.c (renamed from delta-islands.c)0
-rw-r--r--third_party/git/delta-islands.h (renamed from delta-islands.h)0
-rw-r--r--third_party/git/delta.h (renamed from delta.h)0
-rwxr-xr-xthird_party/git/detect-compiler (renamed from detect-compiler)0
-rw-r--r--third_party/git/diff-delta.c (renamed from diff-delta.c)0
-rw-r--r--third_party/git/diff-lib.c (renamed from diff-lib.c)0
-rw-r--r--third_party/git/diff-no-index.c (renamed from diff-no-index.c)0
-rw-r--r--third_party/git/diff.c (renamed from diff.c)0
-rw-r--r--third_party/git/diff.h (renamed from diff.h)0
-rw-r--r--third_party/git/diffcore-break.c (renamed from diffcore-break.c)0
-rw-r--r--third_party/git/diffcore-delta.c (renamed from diffcore-delta.c)0
-rw-r--r--third_party/git/diffcore-order.c (renamed from diffcore-order.c)0
-rw-r--r--third_party/git/diffcore-pickaxe.c (renamed from diffcore-pickaxe.c)0
-rw-r--r--third_party/git/diffcore-rename.c (renamed from diffcore-rename.c)0
-rw-r--r--third_party/git/diffcore.h (renamed from diffcore.h)0
-rw-r--r--third_party/git/dir-iterator.c (renamed from dir-iterator.c)0
-rw-r--r--third_party/git/dir-iterator.h (renamed from dir-iterator.h)0
-rw-r--r--third_party/git/dir.c (renamed from dir.c)0
-rw-r--r--third_party/git/dir.h (renamed from dir.h)0
-rw-r--r--third_party/git/editor.c (renamed from editor.c)0
-rw-r--r--third_party/git/entry.c (renamed from entry.c)0
-rw-r--r--third_party/git/environment.c (renamed from environment.c)0
-rw-r--r--third_party/git/ewah/bitmap.c (renamed from ewah/bitmap.c)0
-rw-r--r--third_party/git/ewah/ewah_bitmap.c (renamed from ewah/ewah_bitmap.c)0
-rw-r--r--third_party/git/ewah/ewah_io.c (renamed from ewah/ewah_io.c)0
-rw-r--r--third_party/git/ewah/ewah_rlw.c (renamed from ewah/ewah_rlw.c)0
-rw-r--r--third_party/git/ewah/ewok.h (renamed from ewah/ewok.h)0
-rw-r--r--third_party/git/ewah/ewok_rlw.h (renamed from ewah/ewok_rlw.h)0
-rw-r--r--third_party/git/exec-cmd.c (renamed from exec-cmd.c)0
-rw-r--r--third_party/git/exec-cmd.h (renamed from exec-cmd.h)0
-rw-r--r--third_party/git/fast-import.c (renamed from fast-import.c)0
-rw-r--r--third_party/git/fetch-negotiator.c (renamed from fetch-negotiator.c)0
-rw-r--r--third_party/git/fetch-negotiator.h (renamed from fetch-negotiator.h)0
-rw-r--r--third_party/git/fetch-object.c (renamed from fetch-object.c)0
-rw-r--r--third_party/git/fetch-object.h (renamed from fetch-object.h)0
-rw-r--r--third_party/git/fetch-pack.c (renamed from fetch-pack.c)0
-rw-r--r--third_party/git/fetch-pack.h (renamed from fetch-pack.h)0
-rw-r--r--third_party/git/fmt-merge-msg.h (renamed from fmt-merge-msg.h)0
-rw-r--r--third_party/git/fsck.c (renamed from fsck.c)0
-rw-r--r--third_party/git/fsck.h (renamed from fsck.h)0
-rw-r--r--third_party/git/fsmonitor.c (renamed from fsmonitor.c)0
-rw-r--r--third_party/git/fsmonitor.h (renamed from fsmonitor.h)0
-rw-r--r--third_party/git/fuzz-commit-graph.c (renamed from fuzz-commit-graph.c)0
-rw-r--r--third_party/git/fuzz-pack-headers.c (renamed from fuzz-pack-headers.c)0
-rw-r--r--third_party/git/fuzz-pack-idx.c (renamed from fuzz-pack-idx.c)0
-rwxr-xr-xthird_party/git/generate-cmdlist.sh (renamed from generate-cmdlist.sh)0
-rw-r--r--third_party/git/gettext.c (renamed from gettext.c)0
-rw-r--r--third_party/git/gettext.h (renamed from gettext.h)0
-rwxr-xr-xthird_party/git/git-add--interactive.perl (renamed from git-add--interactive.perl)0
-rwxr-xr-xthird_party/git/git-archimport.perl (renamed from git-archimport.perl)0
-rwxr-xr-xthird_party/git/git-bisect.sh (renamed from git-bisect.sh)0
-rw-r--r--third_party/git/git-compat-util.h (renamed from git-compat-util.h)0
-rwxr-xr-xthird_party/git/git-cvsexportcommit.perl (renamed from git-cvsexportcommit.perl)0
-rwxr-xr-xthird_party/git/git-cvsimport.perl (renamed from git-cvsimport.perl)0
-rwxr-xr-xthird_party/git/git-cvsserver.perl (renamed from git-cvsserver.perl)0
-rwxr-xr-xthird_party/git/git-difftool--helper.sh (renamed from git-difftool--helper.sh)0
-rwxr-xr-xthird_party/git/git-filter-branch.sh (renamed from git-filter-branch.sh)0
-rw-r--r--third_party/git/git-gui/.gitattributes (renamed from git-gui/.gitattributes)0
-rw-r--r--third_party/git/git-gui/.gitignore (renamed from git-gui/.gitignore)0
-rwxr-xr-xthird_party/git/git-gui/GIT-VERSION-GEN (renamed from git-gui/GIT-VERSION-GEN)0
-rw-r--r--third_party/git/git-gui/Makefile (renamed from git-gui/Makefile)0
-rwxr-xr-xthird_party/git/git-gui/git-gui--askpass (renamed from git-gui/git-gui--askpass)0
-rwxr-xr-xthird_party/git/git-gui/git-gui.sh (renamed from git-gui/git-gui.sh)0
-rw-r--r--third_party/git/git-gui/lib/about.tcl (renamed from git-gui/lib/about.tcl)0
-rw-r--r--third_party/git/git-gui/lib/blame.tcl (renamed from git-gui/lib/blame.tcl)0
-rw-r--r--third_party/git/git-gui/lib/branch.tcl (renamed from git-gui/lib/branch.tcl)0
-rw-r--r--third_party/git/git-gui/lib/branch_checkout.tcl (renamed from git-gui/lib/branch_checkout.tcl)0
-rw-r--r--third_party/git/git-gui/lib/branch_create.tcl (renamed from git-gui/lib/branch_create.tcl)0
-rw-r--r--third_party/git/git-gui/lib/branch_delete.tcl (renamed from git-gui/lib/branch_delete.tcl)0
-rw-r--r--third_party/git/git-gui/lib/branch_rename.tcl (renamed from git-gui/lib/branch_rename.tcl)0
-rw-r--r--third_party/git/git-gui/lib/browser.tcl (renamed from git-gui/lib/browser.tcl)0
-rw-r--r--third_party/git/git-gui/lib/checkout_op.tcl (renamed from git-gui/lib/checkout_op.tcl)0
-rw-r--r--third_party/git/git-gui/lib/choose_font.tcl (renamed from git-gui/lib/choose_font.tcl)0
-rw-r--r--third_party/git/git-gui/lib/choose_repository.tcl (renamed from git-gui/lib/choose_repository.tcl)0
-rw-r--r--third_party/git/git-gui/lib/choose_rev.tcl (renamed from git-gui/lib/choose_rev.tcl)0
-rw-r--r--third_party/git/git-gui/lib/class.tcl (renamed from git-gui/lib/class.tcl)0
-rw-r--r--third_party/git/git-gui/lib/commit.tcl (renamed from git-gui/lib/commit.tcl)0
-rw-r--r--third_party/git/git-gui/lib/console.tcl (renamed from git-gui/lib/console.tcl)0
-rw-r--r--third_party/git/git-gui/lib/database.tcl (renamed from git-gui/lib/database.tcl)0
-rw-r--r--third_party/git/git-gui/lib/date.tcl (renamed from git-gui/lib/date.tcl)0
-rw-r--r--third_party/git/git-gui/lib/diff.tcl (renamed from git-gui/lib/diff.tcl)0
-rw-r--r--third_party/git/git-gui/lib/encoding.tcl (renamed from git-gui/lib/encoding.tcl)0
-rw-r--r--third_party/git/git-gui/lib/error.tcl (renamed from git-gui/lib/error.tcl)0
-rw-r--r--third_party/git/git-gui/lib/git-gui.ico (renamed from git-gui/lib/git-gui.ico)bin3638 -> 3638 bytes
-rw-r--r--third_party/git/git-gui/lib/index.tcl (renamed from git-gui/lib/index.tcl)0
-rw-r--r--third_party/git/git-gui/lib/line.tcl (renamed from git-gui/lib/line.tcl)0
-rw-r--r--third_party/git/git-gui/lib/logo.tcl (renamed from git-gui/lib/logo.tcl)0
-rw-r--r--third_party/git/git-gui/lib/merge.tcl (renamed from git-gui/lib/merge.tcl)0
-rw-r--r--third_party/git/git-gui/lib/mergetool.tcl (renamed from git-gui/lib/mergetool.tcl)0
-rw-r--r--third_party/git/git-gui/lib/option.tcl (renamed from git-gui/lib/option.tcl)0
-rw-r--r--third_party/git/git-gui/lib/remote.tcl (renamed from git-gui/lib/remote.tcl)0
-rw-r--r--third_party/git/git-gui/lib/remote_add.tcl (renamed from git-gui/lib/remote_add.tcl)0
-rw-r--r--third_party/git/git-gui/lib/remote_branch_delete.tcl (renamed from git-gui/lib/remote_branch_delete.tcl)0
-rw-r--r--third_party/git/git-gui/lib/search.tcl (renamed from git-gui/lib/search.tcl)0
-rw-r--r--third_party/git/git-gui/lib/shortcut.tcl (renamed from git-gui/lib/shortcut.tcl)0
-rw-r--r--third_party/git/git-gui/lib/spellcheck.tcl (renamed from git-gui/lib/spellcheck.tcl)0
-rw-r--r--third_party/git/git-gui/lib/sshkey.tcl (renamed from git-gui/lib/sshkey.tcl)0
-rw-r--r--third_party/git/git-gui/lib/status_bar.tcl (renamed from git-gui/lib/status_bar.tcl)0
-rw-r--r--third_party/git/git-gui/lib/themed.tcl (renamed from git-gui/lib/themed.tcl)0
-rw-r--r--third_party/git/git-gui/lib/tools.tcl (renamed from git-gui/lib/tools.tcl)0
-rw-r--r--third_party/git/git-gui/lib/tools_dlg.tcl (renamed from git-gui/lib/tools_dlg.tcl)0
-rw-r--r--third_party/git/git-gui/lib/transport.tcl (renamed from git-gui/lib/transport.tcl)0
-rw-r--r--third_party/git/git-gui/lib/win32.tcl (renamed from git-gui/lib/win32.tcl)0
-rw-r--r--third_party/git/git-gui/lib/win32_shortcut.js (renamed from git-gui/lib/win32_shortcut.js)0
-rw-r--r--third_party/git/git-gui/macosx/AppMain.tcl (renamed from git-gui/macosx/AppMain.tcl)0
-rw-r--r--third_party/git/git-gui/macosx/Info.plist (renamed from git-gui/macosx/Info.plist)0
-rw-r--r--third_party/git/git-gui/macosx/git-gui.icns (renamed from git-gui/macosx/git-gui.icns)bin28866 -> 28866 bytes
-rw-r--r--third_party/git/git-gui/po/.gitignore (renamed from git-gui/po/.gitignore)0
-rw-r--r--third_party/git/git-gui/po/README (renamed from git-gui/po/README)0
-rw-r--r--third_party/git/git-gui/po/bg.po (renamed from git-gui/po/bg.po)0
-rw-r--r--third_party/git/git-gui/po/de.po (renamed from git-gui/po/de.po)0
-rw-r--r--third_party/git/git-gui/po/el.po (renamed from git-gui/po/el.po)0
-rw-r--r--third_party/git/git-gui/po/fr.po (renamed from git-gui/po/fr.po)0
-rw-r--r--third_party/git/git-gui/po/git-gui.pot (renamed from git-gui/po/git-gui.pot)0
-rw-r--r--third_party/git/git-gui/po/glossary/Makefile (renamed from git-gui/po/glossary/Makefile)0
-rw-r--r--third_party/git/git-gui/po/glossary/bg.po (renamed from git-gui/po/glossary/bg.po)0
-rw-r--r--third_party/git/git-gui/po/glossary/de.po (renamed from git-gui/po/glossary/de.po)0
-rw-r--r--third_party/git/git-gui/po/glossary/el.po (renamed from git-gui/po/glossary/el.po)0
-rw-r--r--third_party/git/git-gui/po/glossary/fr.po (renamed from git-gui/po/glossary/fr.po)0
-rw-r--r--third_party/git/git-gui/po/glossary/git-gui-glossary.pot (renamed from git-gui/po/glossary/git-gui-glossary.pot)0
-rw-r--r--third_party/git/git-gui/po/glossary/git-gui-glossary.txt (renamed from git-gui/po/glossary/git-gui-glossary.txt)0
-rw-r--r--third_party/git/git-gui/po/glossary/it.po (renamed from git-gui/po/glossary/it.po)0
-rw-r--r--third_party/git/git-gui/po/glossary/pt_br.po (renamed from git-gui/po/glossary/pt_br.po)0
-rw-r--r--third_party/git/git-gui/po/glossary/pt_pt.po (renamed from git-gui/po/glossary/pt_pt.po)0
-rwxr-xr-xthird_party/git/git-gui/po/glossary/txt-to-pot.sh (renamed from git-gui/po/glossary/txt-to-pot.sh)0
-rw-r--r--third_party/git/git-gui/po/glossary/zh_cn.po (renamed from git-gui/po/glossary/zh_cn.po)0
-rw-r--r--third_party/git/git-gui/po/hu.po (renamed from git-gui/po/hu.po)0
-rw-r--r--third_party/git/git-gui/po/it.po (renamed from git-gui/po/it.po)0
-rw-r--r--third_party/git/git-gui/po/ja.po (renamed from git-gui/po/ja.po)0
-rw-r--r--third_party/git/git-gui/po/nb.po (renamed from git-gui/po/nb.po)0
-rwxr-xr-xthird_party/git/git-gui/po/po2msg.sh (renamed from git-gui/po/po2msg.sh)0
-rw-r--r--third_party/git/git-gui/po/pt_br.po (renamed from git-gui/po/pt_br.po)0
-rw-r--r--third_party/git/git-gui/po/pt_pt.po (renamed from git-gui/po/pt_pt.po)0
-rw-r--r--third_party/git/git-gui/po/ru.po (renamed from git-gui/po/ru.po)0
-rw-r--r--third_party/git/git-gui/po/sv.po (renamed from git-gui/po/sv.po)0
-rw-r--r--third_party/git/git-gui/po/vi.po (renamed from git-gui/po/vi.po)0
-rw-r--r--third_party/git/git-gui/po/zh_cn.po (renamed from git-gui/po/zh_cn.po)0
-rwxr-xr-xthird_party/git/git-gui/windows/git-gui.sh (renamed from git-gui/windows/git-gui.sh)0
-rwxr-xr-xthird_party/git/git-instaweb.sh (renamed from git-instaweb.sh)0
-rwxr-xr-xthird_party/git/git-legacy-stash.sh (renamed from git-legacy-stash.sh)0
-rwxr-xr-xthird_party/git/git-merge-octopus.sh (renamed from git-merge-octopus.sh)0
-rwxr-xr-xthird_party/git/git-merge-one-file.sh (renamed from git-merge-one-file.sh)0
-rwxr-xr-xthird_party/git/git-merge-resolve.sh (renamed from git-merge-resolve.sh)0
-rw-r--r--third_party/git/git-mergetool--lib.sh (renamed from git-mergetool--lib.sh)0
-rwxr-xr-xthird_party/git/git-mergetool.sh (renamed from git-mergetool.sh)0
-rwxr-xr-xthird_party/git/git-p4.py (renamed from git-p4.py)0
-rw-r--r--third_party/git/git-parse-remote.sh (renamed from git-parse-remote.sh)0
-rwxr-xr-xthird_party/git/git-quiltimport.sh (renamed from git-quiltimport.sh)0
-rw-r--r--third_party/git/git-rebase--preserve-merges.sh (renamed from git-rebase--preserve-merges.sh)0
-rwxr-xr-xthird_party/git/git-request-pull.sh (renamed from git-request-pull.sh)0
-rwxr-xr-xthird_party/git/git-send-email.perl (renamed from git-send-email.perl)0
-rw-r--r--third_party/git/git-sh-i18n.sh (renamed from git-sh-i18n.sh)0
-rw-r--r--third_party/git/git-sh-setup.sh (renamed from git-sh-setup.sh)0
-rwxr-xr-xthird_party/git/git-submodule.sh (renamed from git-submodule.sh)0
-rwxr-xr-xthird_party/git/git-svn.perl (renamed from git-svn.perl)0
-rwxr-xr-xthird_party/git/git-web--browse.sh (renamed from git-web--browse.sh)0
-rw-r--r--third_party/git/git.c (renamed from git.c)0
-rw-r--r--third_party/git/git.rc (renamed from git.rc)0
-rw-r--r--third_party/git/gitk-git/.gitignore (renamed from gitk-git/.gitignore)0
-rw-r--r--third_party/git/gitk-git/Makefile (renamed from gitk-git/Makefile)0
-rwxr-xr-xthird_party/git/gitk-git/gitk (renamed from gitk-git/gitk)0
-rw-r--r--third_party/git/gitk-git/po/.gitignore (renamed from gitk-git/po/.gitignore)0
-rw-r--r--third_party/git/gitk-git/po/bg.po (renamed from gitk-git/po/bg.po)0
-rw-r--r--third_party/git/gitk-git/po/ca.po (renamed from gitk-git/po/ca.po)0
-rw-r--r--third_party/git/gitk-git/po/de.po (renamed from gitk-git/po/de.po)0
-rw-r--r--third_party/git/gitk-git/po/es.po (renamed from gitk-git/po/es.po)0
-rw-r--r--third_party/git/gitk-git/po/fr.po (renamed from gitk-git/po/fr.po)0
-rw-r--r--third_party/git/gitk-git/po/hu.po (renamed from gitk-git/po/hu.po)0
-rw-r--r--third_party/git/gitk-git/po/it.po (renamed from gitk-git/po/it.po)0
-rw-r--r--third_party/git/gitk-git/po/ja.po (renamed from gitk-git/po/ja.po)0
-rwxr-xr-xthird_party/git/gitk-git/po/po2msg.sh (renamed from gitk-git/po/po2msg.sh)0
-rw-r--r--third_party/git/gitk-git/po/pt_br.po (renamed from gitk-git/po/pt_br.po)0
-rw-r--r--third_party/git/gitk-git/po/pt_pt.po (renamed from gitk-git/po/pt_pt.po)0
-rw-r--r--third_party/git/gitk-git/po/ru.po (renamed from gitk-git/po/ru.po)0
-rw-r--r--third_party/git/gitk-git/po/sv.po (renamed from gitk-git/po/sv.po)0
-rw-r--r--third_party/git/gitk-git/po/vi.po (renamed from gitk-git/po/vi.po)0
-rw-r--r--third_party/git/gitweb/INSTALL (renamed from gitweb/INSTALL)0
-rw-r--r--third_party/git/gitweb/Makefile (renamed from gitweb/Makefile)0
-rw-r--r--third_party/git/gitweb/README (renamed from gitweb/README)0
-rwxr-xr-xthird_party/git/gitweb/gitweb.perl (renamed from gitweb/gitweb.perl)0
-rw-r--r--third_party/git/gitweb/static/git-favicon.png (renamed from gitweb/static/git-favicon.png)bin115 -> 115 bytes
-rw-r--r--third_party/git/gitweb/static/git-logo.png (renamed from gitweb/static/git-logo.png)bin207 -> 207 bytes
-rw-r--r--third_party/git/gitweb/static/gitweb.css (renamed from gitweb/static/gitweb.css)0
-rw-r--r--third_party/git/gitweb/static/js/README (renamed from gitweb/static/js/README)0
-rw-r--r--third_party/git/gitweb/static/js/adjust-timezone.js (renamed from gitweb/static/js/adjust-timezone.js)0
-rw-r--r--third_party/git/gitweb/static/js/blame_incremental.js (renamed from gitweb/static/js/blame_incremental.js)0
-rw-r--r--third_party/git/gitweb/static/js/javascript-detection.js (renamed from gitweb/static/js/javascript-detection.js)0
-rw-r--r--third_party/git/gitweb/static/js/lib/common-lib.js (renamed from gitweb/static/js/lib/common-lib.js)0
-rw-r--r--third_party/git/gitweb/static/js/lib/cookies.js (renamed from gitweb/static/js/lib/cookies.js)0
-rw-r--r--third_party/git/gitweb/static/js/lib/datetime.js (renamed from gitweb/static/js/lib/datetime.js)0
-rw-r--r--third_party/git/gpg-interface.c (renamed from gpg-interface.c)0
-rw-r--r--third_party/git/gpg-interface.h (renamed from gpg-interface.h)0
-rw-r--r--third_party/git/graph.c (renamed from graph.c)0
-rw-r--r--third_party/git/graph.h (renamed from graph.h)0
-rw-r--r--third_party/git/grep.c (renamed from grep.c)0
-rw-r--r--third_party/git/grep.h (renamed from grep.h)0
-rw-r--r--third_party/git/hash.h (renamed from hash.h)0
-rw-r--r--third_party/git/hashmap.c (renamed from hashmap.c)0
-rw-r--r--third_party/git/hashmap.h (renamed from hashmap.h)0
-rw-r--r--third_party/git/help.c (renamed from help.c)0
-rw-r--r--third_party/git/help.h (renamed from help.h)0
-rw-r--r--third_party/git/hex.c (renamed from hex.c)0
-rw-r--r--third_party/git/http-backend.c (renamed from http-backend.c)0
-rw-r--r--third_party/git/http-fetch.c (renamed from http-fetch.c)0
-rw-r--r--third_party/git/http-push.c (renamed from http-push.c)0
-rw-r--r--third_party/git/http-walker.c (renamed from http-walker.c)0
-rw-r--r--third_party/git/http.c (renamed from http.c)0
-rw-r--r--third_party/git/http.h (renamed from http.h)0
-rw-r--r--third_party/git/ident.c (renamed from ident.c)0
-rw-r--r--third_party/git/imap-send.c (renamed from imap-send.c)0
-rw-r--r--third_party/git/interdiff.c (renamed from interdiff.c)0
-rw-r--r--third_party/git/interdiff.h (renamed from interdiff.h)0
-rw-r--r--third_party/git/iterator.h (renamed from iterator.h)0
-rw-r--r--third_party/git/json-writer.c (renamed from json-writer.c)0
-rw-r--r--third_party/git/json-writer.h (renamed from json-writer.h)0
-rw-r--r--third_party/git/khash.h (renamed from khash.h)0
-rw-r--r--third_party/git/kwset.c (renamed from kwset.c)0
-rw-r--r--third_party/git/kwset.h (renamed from kwset.h)0
-rw-r--r--third_party/git/levenshtein.c (renamed from levenshtein.c)0
-rw-r--r--third_party/git/levenshtein.h (renamed from levenshtein.h)0
-rw-r--r--third_party/git/line-log.c (renamed from line-log.c)0
-rw-r--r--third_party/git/line-log.h (renamed from line-log.h)0
-rw-r--r--third_party/git/line-range.c (renamed from line-range.c)0
-rw-r--r--third_party/git/line-range.h (renamed from line-range.h)0
-rw-r--r--third_party/git/linear-assignment.c (renamed from linear-assignment.c)0
-rw-r--r--third_party/git/linear-assignment.h (renamed from linear-assignment.h)0
-rw-r--r--third_party/git/list-objects-filter-options.c (renamed from list-objects-filter-options.c)0
-rw-r--r--third_party/git/list-objects-filter-options.h (renamed from list-objects-filter-options.h)0
-rw-r--r--third_party/git/list-objects-filter.c (renamed from list-objects-filter.c)0
-rw-r--r--third_party/git/list-objects-filter.h (renamed from list-objects-filter.h)0
-rw-r--r--third_party/git/list-objects.c (renamed from list-objects.c)0
-rw-r--r--third_party/git/list-objects.h (renamed from list-objects.h)0
-rw-r--r--third_party/git/list.h (renamed from list.h)0
-rw-r--r--third_party/git/ll-merge.c (renamed from ll-merge.c)0
-rw-r--r--third_party/git/ll-merge.h (renamed from ll-merge.h)0
-rw-r--r--third_party/git/lockfile.c (renamed from lockfile.c)0
-rw-r--r--third_party/git/lockfile.h (renamed from lockfile.h)0
-rw-r--r--third_party/git/log-tree.c (renamed from log-tree.c)0
-rw-r--r--third_party/git/log-tree.h (renamed from log-tree.h)0
-rw-r--r--third_party/git/ls-refs.c (renamed from ls-refs.c)0
-rw-r--r--third_party/git/ls-refs.h (renamed from ls-refs.h)0
-rw-r--r--third_party/git/mailinfo.c (renamed from mailinfo.c)0
-rw-r--r--third_party/git/mailinfo.h (renamed from mailinfo.h)0
-rw-r--r--third_party/git/mailmap.c (renamed from mailmap.c)0
-rw-r--r--third_party/git/mailmap.h (renamed from mailmap.h)0
-rw-r--r--third_party/git/match-trees.c (renamed from match-trees.c)0
-rw-r--r--third_party/git/mem-pool.c (renamed from mem-pool.c)0
-rw-r--r--third_party/git/mem-pool.h (renamed from mem-pool.h)0
-rw-r--r--third_party/git/merge-blobs.c (renamed from merge-blobs.c)0
-rw-r--r--third_party/git/merge-blobs.h (renamed from merge-blobs.h)0
-rw-r--r--third_party/git/merge-recursive.c (renamed from merge-recursive.c)0
-rw-r--r--third_party/git/merge-recursive.h (renamed from merge-recursive.h)0
-rw-r--r--third_party/git/merge.c (renamed from merge.c)0
-rw-r--r--third_party/git/mergesort.c (renamed from mergesort.c)0
-rw-r--r--third_party/git/mergesort.h (renamed from mergesort.h)0
-rw-r--r--third_party/git/mergetools/araxis (renamed from mergetools/araxis)0
-rw-r--r--third_party/git/mergetools/bc (renamed from mergetools/bc)0
-rw-r--r--third_party/git/mergetools/bc3 (renamed from mergetools/bc3)0
-rw-r--r--third_party/git/mergetools/codecompare (renamed from mergetools/codecompare)0
-rw-r--r--third_party/git/mergetools/deltawalker (renamed from mergetools/deltawalker)0
-rw-r--r--third_party/git/mergetools/diffmerge (renamed from mergetools/diffmerge)0
-rw-r--r--third_party/git/mergetools/diffuse (renamed from mergetools/diffuse)0
-rw-r--r--third_party/git/mergetools/ecmerge (renamed from mergetools/ecmerge)0
-rw-r--r--third_party/git/mergetools/emerge (renamed from mergetools/emerge)0
-rw-r--r--third_party/git/mergetools/examdiff (renamed from mergetools/examdiff)0
-rw-r--r--third_party/git/mergetools/guiffy (renamed from mergetools/guiffy)0
-rw-r--r--third_party/git/mergetools/gvimdiff (renamed from mergetools/gvimdiff)0
-rw-r--r--third_party/git/mergetools/gvimdiff2 (renamed from mergetools/gvimdiff2)0
-rw-r--r--third_party/git/mergetools/gvimdiff3 (renamed from mergetools/gvimdiff3)0
-rw-r--r--third_party/git/mergetools/kdiff3 (renamed from mergetools/kdiff3)0
-rw-r--r--third_party/git/mergetools/kompare (renamed from mergetools/kompare)0
-rw-r--r--third_party/git/mergetools/meld (renamed from mergetools/meld)0
-rw-r--r--third_party/git/mergetools/opendiff (renamed from mergetools/opendiff)0
-rw-r--r--third_party/git/mergetools/p4merge (renamed from mergetools/p4merge)0
-rw-r--r--third_party/git/mergetools/smerge (renamed from mergetools/smerge)0
-rw-r--r--third_party/git/mergetools/tkdiff (renamed from mergetools/tkdiff)0
-rw-r--r--third_party/git/mergetools/tortoisemerge (renamed from mergetools/tortoisemerge)0
-rw-r--r--third_party/git/mergetools/vimdiff (renamed from mergetools/vimdiff)0
-rw-r--r--third_party/git/mergetools/vimdiff2 (renamed from mergetools/vimdiff2)0
-rw-r--r--third_party/git/mergetools/vimdiff3 (renamed from mergetools/vimdiff3)0
-rw-r--r--third_party/git/mergetools/winmerge (renamed from mergetools/winmerge)0
-rw-r--r--third_party/git/mergetools/xxdiff (renamed from mergetools/xxdiff)0
-rw-r--r--third_party/git/midx.c (renamed from midx.c)0
-rw-r--r--third_party/git/midx.h (renamed from midx.h)0
-rw-r--r--third_party/git/name-hash.c (renamed from name-hash.c)0
-rw-r--r--third_party/git/negotiator/default.c (renamed from negotiator/default.c)0
-rw-r--r--third_party/git/negotiator/default.h (renamed from negotiator/default.h)0
-rw-r--r--third_party/git/negotiator/skipping.c (renamed from negotiator/skipping.c)0
-rw-r--r--third_party/git/negotiator/skipping.h (renamed from negotiator/skipping.h)0
-rw-r--r--third_party/git/notes-cache.c (renamed from notes-cache.c)0
-rw-r--r--third_party/git/notes-cache.h (renamed from notes-cache.h)0
-rw-r--r--third_party/git/notes-merge.c (renamed from notes-merge.c)0
-rw-r--r--third_party/git/notes-merge.h (renamed from notes-merge.h)0
-rw-r--r--third_party/git/notes-utils.c (renamed from notes-utils.c)0
-rw-r--r--third_party/git/notes-utils.h (renamed from notes-utils.h)0
-rw-r--r--third_party/git/notes.c (renamed from notes.c)0
-rw-r--r--third_party/git/notes.h (renamed from notes.h)0
-rw-r--r--third_party/git/object-store.h (renamed from object-store.h)0
-rw-r--r--third_party/git/object.c (renamed from object.c)0
-rw-r--r--third_party/git/object.h (renamed from object.h)0
-rw-r--r--third_party/git/oidmap.c (renamed from oidmap.c)0
-rw-r--r--third_party/git/oidmap.h (renamed from oidmap.h)0
-rw-r--r--third_party/git/oidset.c (renamed from oidset.c)0
-rw-r--r--third_party/git/oidset.h (renamed from oidset.h)0
-rw-r--r--third_party/git/pack-bitmap-write.c (renamed from pack-bitmap-write.c)0
-rw-r--r--third_party/git/pack-bitmap.c (renamed from pack-bitmap.c)0
-rw-r--r--third_party/git/pack-bitmap.h (renamed from pack-bitmap.h)0
-rw-r--r--third_party/git/pack-check.c (renamed from pack-check.c)0
-rw-r--r--third_party/git/pack-objects.c (renamed from pack-objects.c)0
-rw-r--r--third_party/git/pack-objects.h (renamed from pack-objects.h)0
-rw-r--r--third_party/git/pack-revindex.c (renamed from pack-revindex.c)0
-rw-r--r--third_party/git/pack-revindex.h (renamed from pack-revindex.h)0
-rw-r--r--third_party/git/pack-write.c (renamed from pack-write.c)0
-rw-r--r--third_party/git/pack.h (renamed from pack.h)0
-rw-r--r--third_party/git/packfile.c (renamed from packfile.c)0
-rw-r--r--third_party/git/packfile.h (renamed from packfile.h)0
-rw-r--r--third_party/git/pager.c (renamed from pager.c)0
-rw-r--r--third_party/git/parse-options-cb.c (renamed from parse-options-cb.c)0
-rw-r--r--third_party/git/parse-options.c (renamed from parse-options.c)0
-rw-r--r--third_party/git/parse-options.h (renamed from parse-options.h)0
-rw-r--r--third_party/git/patch-delta.c (renamed from patch-delta.c)0
-rw-r--r--third_party/git/patch-ids.c (renamed from patch-ids.c)0
-rw-r--r--third_party/git/patch-ids.h (renamed from patch-ids.h)0
-rw-r--r--third_party/git/path.c (renamed from path.c)0
-rw-r--r--third_party/git/path.h (renamed from path.h)0
-rw-r--r--third_party/git/pathspec.c (renamed from pathspec.c)0
-rw-r--r--third_party/git/pathspec.h (renamed from pathspec.h)0
-rw-r--r--third_party/git/perl/.gitignore (renamed from perl/.gitignore)0
-rw-r--r--third_party/git/perl/FromCPAN/.gitattributes (renamed from perl/FromCPAN/.gitattributes)0
-rw-r--r--third_party/git/perl/FromCPAN/Error.pm (renamed from perl/FromCPAN/Error.pm)0
-rw-r--r--third_party/git/perl/FromCPAN/Mail/Address.pm (renamed from perl/FromCPAN/Mail/Address.pm)0
-rw-r--r--third_party/git/perl/Git.pm (renamed from perl/Git.pm)0
-rw-r--r--third_party/git/perl/Git/I18N.pm (renamed from perl/Git/I18N.pm)0
-rw-r--r--third_party/git/perl/Git/IndexInfo.pm (renamed from perl/Git/IndexInfo.pm)0
-rw-r--r--third_party/git/perl/Git/LoadCPAN.pm (renamed from perl/Git/LoadCPAN.pm)0
-rw-r--r--third_party/git/perl/Git/LoadCPAN/Error.pm (renamed from perl/Git/LoadCPAN/Error.pm)0
-rw-r--r--third_party/git/perl/Git/LoadCPAN/Mail/Address.pm (renamed from perl/Git/LoadCPAN/Mail/Address.pm)0
-rw-r--r--third_party/git/perl/Git/Packet.pm (renamed from perl/Git/Packet.pm)0
-rw-r--r--third_party/git/perl/Git/SVN.pm (renamed from perl/Git/SVN.pm)0
-rw-r--r--third_party/git/perl/Git/SVN/Editor.pm (renamed from perl/Git/SVN/Editor.pm)0
-rw-r--r--third_party/git/perl/Git/SVN/Fetcher.pm (renamed from perl/Git/SVN/Fetcher.pm)0
-rw-r--r--third_party/git/perl/Git/SVN/GlobSpec.pm (renamed from perl/Git/SVN/GlobSpec.pm)0
-rw-r--r--third_party/git/perl/Git/SVN/Log.pm (renamed from perl/Git/SVN/Log.pm)0
-rw-r--r--third_party/git/perl/Git/SVN/Memoize/YAML.pm (renamed from perl/Git/SVN/Memoize/YAML.pm)0
-rw-r--r--third_party/git/perl/Git/SVN/Migration.pm (renamed from perl/Git/SVN/Migration.pm)0
-rw-r--r--third_party/git/perl/Git/SVN/Prompt.pm (renamed from perl/Git/SVN/Prompt.pm)0
-rw-r--r--third_party/git/perl/Git/SVN/Ra.pm (renamed from perl/Git/SVN/Ra.pm)0
-rw-r--r--third_party/git/perl/Git/SVN/Utils.pm (renamed from perl/Git/SVN/Utils.pm)0
-rw-r--r--third_party/git/perl/header_templates/fixed_prefix.template.pl (renamed from perl/header_templates/fixed_prefix.template.pl)0
-rw-r--r--third_party/git/perl/header_templates/runtime_prefix.template.pl (renamed from perl/header_templates/runtime_prefix.template.pl)0
-rw-r--r--third_party/git/pkt-line.c (renamed from pkt-line.c)0
-rw-r--r--third_party/git/pkt-line.h (renamed from pkt-line.h)0
-rw-r--r--third_party/git/po/.gitignore (renamed from po/.gitignore)0
-rw-r--r--third_party/git/po/README (renamed from po/README)0
-rw-r--r--third_party/git/po/TEAMS (renamed from po/TEAMS)0
-rw-r--r--third_party/git/po/bg.po (renamed from po/bg.po)0
-rw-r--r--third_party/git/po/ca.po (renamed from po/ca.po)0
-rw-r--r--third_party/git/po/de.po (renamed from po/de.po)0
-rw-r--r--third_party/git/po/el.po (renamed from po/el.po)0
-rw-r--r--third_party/git/po/es.po (renamed from po/es.po)0
-rw-r--r--third_party/git/po/fr.po (renamed from po/fr.po)0
-rw-r--r--third_party/git/po/git.pot (renamed from po/git.pot)0
-rw-r--r--third_party/git/po/is.po (renamed from po/is.po)0
-rw-r--r--third_party/git/po/it.po (renamed from po/it.po)0
-rw-r--r--third_party/git/po/ko.po (renamed from po/ko.po)0
-rw-r--r--third_party/git/po/pt_PT.po (renamed from po/pt_PT.po)0
-rw-r--r--third_party/git/po/ru.po (renamed from po/ru.po)0
-rw-r--r--third_party/git/po/sv.po (renamed from po/sv.po)0
-rw-r--r--third_party/git/po/vi.po (renamed from po/vi.po)0
-rw-r--r--third_party/git/po/zh_CN.po (renamed from po/zh_CN.po)0
-rw-r--r--third_party/git/ppc/sha1.c (renamed from ppc/sha1.c)0
-rw-r--r--third_party/git/ppc/sha1.h (renamed from ppc/sha1.h)0
-rw-r--r--third_party/git/ppc/sha1ppc.S (renamed from ppc/sha1ppc.S)0
-rw-r--r--third_party/git/preload-index.c (renamed from preload-index.c)0
-rw-r--r--third_party/git/pretty.c (renamed from pretty.c)0
-rw-r--r--third_party/git/pretty.h (renamed from pretty.h)0
-rw-r--r--third_party/git/prio-queue.c (renamed from prio-queue.c)0
-rw-r--r--third_party/git/prio-queue.h (renamed from prio-queue.h)0
-rw-r--r--third_party/git/progress.c (renamed from progress.c)0
-rw-r--r--third_party/git/progress.h (renamed from progress.h)0
-rw-r--r--third_party/git/prompt.c (renamed from prompt.c)0
-rw-r--r--third_party/git/prompt.h (renamed from prompt.h)0
-rw-r--r--third_party/git/protocol.c (renamed from protocol.c)0
-rw-r--r--third_party/git/protocol.h (renamed from protocol.h)0
-rw-r--r--third_party/git/quote.c (renamed from quote.c)0
-rw-r--r--third_party/git/quote.h (renamed from quote.h)0
-rw-r--r--third_party/git/range-diff.c (renamed from range-diff.c)0
-rw-r--r--third_party/git/range-diff.h (renamed from range-diff.h)0
-rw-r--r--third_party/git/reachable.c (renamed from reachable.c)0
-rw-r--r--third_party/git/reachable.h (renamed from reachable.h)0
-rw-r--r--third_party/git/read-cache.c (renamed from read-cache.c)0
-rw-r--r--third_party/git/rebase-interactive.c (renamed from rebase-interactive.c)0
-rw-r--r--third_party/git/rebase-interactive.h (renamed from rebase-interactive.h)0
-rw-r--r--third_party/git/ref-filter.c (renamed from ref-filter.c)0
-rw-r--r--third_party/git/ref-filter.h (renamed from ref-filter.h)0
-rw-r--r--third_party/git/reflog-walk.c (renamed from reflog-walk.c)0
-rw-r--r--third_party/git/reflog-walk.h (renamed from reflog-walk.h)0
-rw-r--r--third_party/git/refs.c (renamed from refs.c)0
-rw-r--r--third_party/git/refs.h (renamed from refs.h)0
-rw-r--r--third_party/git/refs/files-backend.c (renamed from refs/files-backend.c)0
-rw-r--r--third_party/git/refs/iterator.c (renamed from refs/iterator.c)0
-rw-r--r--third_party/git/refs/packed-backend.c (renamed from refs/packed-backend.c)0
-rw-r--r--third_party/git/refs/packed-backend.h (renamed from refs/packed-backend.h)0
-rw-r--r--third_party/git/refs/ref-cache.c (renamed from refs/ref-cache.c)0
-rw-r--r--third_party/git/refs/ref-cache.h (renamed from refs/ref-cache.h)0
-rw-r--r--third_party/git/refs/refs-internal.h (renamed from refs/refs-internal.h)0
-rw-r--r--third_party/git/refspec.c (renamed from refspec.c)0
-rw-r--r--third_party/git/refspec.h (renamed from refspec.h)0
-rw-r--r--third_party/git/remote-curl.c (renamed from remote-curl.c)0
-rw-r--r--third_party/git/remote-testsvn.c (renamed from remote-testsvn.c)0
-rw-r--r--third_party/git/remote.c (renamed from remote.c)0
-rw-r--r--third_party/git/remote.h (renamed from remote.h)0
-rw-r--r--third_party/git/replace-object.c (renamed from replace-object.c)0
-rw-r--r--third_party/git/replace-object.h (renamed from replace-object.h)0
-rw-r--r--third_party/git/repository.c (renamed from repository.c)0
-rw-r--r--third_party/git/repository.h (renamed from repository.h)0
-rw-r--r--third_party/git/rerere.c (renamed from rerere.c)0
-rw-r--r--third_party/git/rerere.h (renamed from rerere.h)0
-rw-r--r--third_party/git/resolve-undo.c (renamed from resolve-undo.c)0
-rw-r--r--third_party/git/resolve-undo.h (renamed from resolve-undo.h)0
-rw-r--r--third_party/git/revision.c (renamed from revision.c)0
-rw-r--r--third_party/git/revision.h (renamed from revision.h)0
-rw-r--r--third_party/git/run-command.c (renamed from run-command.c)0
-rw-r--r--third_party/git/run-command.h (renamed from run-command.h)0
-rw-r--r--third_party/git/send-pack.c (renamed from send-pack.c)0
-rw-r--r--third_party/git/send-pack.h (renamed from send-pack.h)0
-rw-r--r--third_party/git/sequencer.c (renamed from sequencer.c)0
-rw-r--r--third_party/git/sequencer.h (renamed from sequencer.h)0
-rw-r--r--third_party/git/serve.c (renamed from serve.c)0
-rw-r--r--third_party/git/serve.h (renamed from serve.h)0
-rw-r--r--third_party/git/server-info.c (renamed from server-info.c)0
-rw-r--r--third_party/git/setup.c (renamed from setup.c)0
-rw-r--r--third_party/git/sh-i18n--envsubst.c (renamed from sh-i18n--envsubst.c)0
-rw-r--r--third_party/git/sha1-array.c (renamed from sha1-array.c)0
-rw-r--r--third_party/git/sha1-array.h (renamed from sha1-array.h)0
-rw-r--r--third_party/git/sha1-file.c (renamed from sha1-file.c)0
-rw-r--r--third_party/git/sha1-lookup.c (renamed from sha1-lookup.c)0
-rw-r--r--third_party/git/sha1-lookup.h (renamed from sha1-lookup.h)0
-rw-r--r--third_party/git/sha1-name.c (renamed from sha1-name.c)0
m---------third_party/git/sha1collisiondetection (renamed from sha1collisiondetection)0
-rw-r--r--third_party/git/sha1dc/.gitattributes (renamed from sha1dc/.gitattributes)0
-rw-r--r--third_party/git/sha1dc/LICENSE.txt (renamed from sha1dc/LICENSE.txt)0
-rw-r--r--third_party/git/sha1dc/sha1.c (renamed from sha1dc/sha1.c)0
-rw-r--r--third_party/git/sha1dc/sha1.h (renamed from sha1dc/sha1.h)0
-rw-r--r--third_party/git/sha1dc/ubc_check.c (renamed from sha1dc/ubc_check.c)0
-rw-r--r--third_party/git/sha1dc/ubc_check.h (renamed from sha1dc/ubc_check.h)0
-rw-r--r--third_party/git/sha1dc_git.c (renamed from sha1dc_git.c)0
-rw-r--r--third_party/git/sha1dc_git.h (renamed from sha1dc_git.h)0
-rw-r--r--third_party/git/sha256/block/sha256.c (renamed from sha256/block/sha256.c)0
-rw-r--r--third_party/git/sha256/block/sha256.h (renamed from sha256/block/sha256.h)0
-rw-r--r--third_party/git/sha256/gcrypt.h (renamed from sha256/gcrypt.h)0
-rw-r--r--third_party/git/shallow.c (renamed from shallow.c)0
-rw-r--r--third_party/git/shell.c (renamed from shell.c)0
-rw-r--r--third_party/git/shortlog.h (renamed from shortlog.h)0
-rw-r--r--third_party/git/sideband.c (renamed from sideband.c)0
-rw-r--r--third_party/git/sideband.h (renamed from sideband.h)0
-rw-r--r--third_party/git/sigchain.c (renamed from sigchain.c)0
-rw-r--r--third_party/git/sigchain.h (renamed from sigchain.h)0
-rw-r--r--third_party/git/split-index.c (renamed from split-index.c)0
-rw-r--r--third_party/git/split-index.h (renamed from split-index.h)0
-rw-r--r--third_party/git/strbuf.c (renamed from strbuf.c)0
-rw-r--r--third_party/git/strbuf.h (renamed from strbuf.h)0
-rw-r--r--third_party/git/streaming.c (renamed from streaming.c)0
-rw-r--r--third_party/git/streaming.h (renamed from streaming.h)0
-rw-r--r--third_party/git/string-list.c (renamed from string-list.c)0
-rw-r--r--third_party/git/string-list.h (renamed from string-list.h)0
-rw-r--r--third_party/git/sub-process.c (renamed from sub-process.c)0
-rw-r--r--third_party/git/sub-process.h (renamed from sub-process.h)0
-rw-r--r--third_party/git/submodule-config.c (renamed from submodule-config.c)0
-rw-r--r--third_party/git/submodule-config.h (renamed from submodule-config.h)0
-rw-r--r--third_party/git/submodule.c (renamed from submodule.c)0
-rw-r--r--third_party/git/submodule.h (renamed from submodule.h)0
-rw-r--r--third_party/git/symlinks.c (renamed from symlinks.c)0
-rw-r--r--third_party/git/t/.gitattributes (renamed from t/.gitattributes)0
-rw-r--r--third_party/git/t/.gitignore (renamed from t/.gitignore)0
-rwxr-xr-xthird_party/git/t/Git-SVN/00compile.t (renamed from t/Git-SVN/00compile.t)0
-rwxr-xr-xthird_party/git/t/Git-SVN/Utils/add_path_to_url.t (renamed from t/Git-SVN/Utils/add_path_to_url.t)0
-rwxr-xr-xthird_party/git/t/Git-SVN/Utils/can_compress.t (renamed from t/Git-SVN/Utils/can_compress.t)0
-rwxr-xr-xthird_party/git/t/Git-SVN/Utils/canonicalize_url.t (renamed from t/Git-SVN/Utils/canonicalize_url.t)0
-rwxr-xr-xthird_party/git/t/Git-SVN/Utils/collapse_dotdot.t (renamed from t/Git-SVN/Utils/collapse_dotdot.t)0
-rwxr-xr-xthird_party/git/t/Git-SVN/Utils/fatal.t (renamed from t/Git-SVN/Utils/fatal.t)0
-rwxr-xr-xthird_party/git/t/Git-SVN/Utils/join_paths.t (renamed from t/Git-SVN/Utils/join_paths.t)0
-rw-r--r--third_party/git/t/Makefile (renamed from t/Makefile)0
-rw-r--r--third_party/git/t/README (renamed from t/README)0
-rwxr-xr-xthird_party/git/t/aggregate-results.sh (renamed from t/aggregate-results.sh)0
-rw-r--r--third_party/git/t/annotate-tests.sh (renamed from t/annotate-tests.sh)0
-rw-r--r--third_party/git/t/chainlint.sed (renamed from t/chainlint.sed)0
-rw-r--r--third_party/git/t/chainlint/arithmetic-expansion.expect (renamed from t/chainlint/arithmetic-expansion.expect)0
-rw-r--r--third_party/git/t/chainlint/arithmetic-expansion.test (renamed from t/chainlint/arithmetic-expansion.test)0
-rw-r--r--third_party/git/t/chainlint/bash-array.expect (renamed from t/chainlint/bash-array.expect)0
-rw-r--r--third_party/git/t/chainlint/bash-array.test (renamed from t/chainlint/bash-array.test)0
-rw-r--r--third_party/git/t/chainlint/blank-line.expect (renamed from t/chainlint/blank-line.expect)0
-rw-r--r--third_party/git/t/chainlint/blank-line.test (renamed from t/chainlint/blank-line.test)0
-rw-r--r--third_party/git/t/chainlint/block.expect (renamed from t/chainlint/block.expect)0
-rw-r--r--third_party/git/t/chainlint/block.test (renamed from t/chainlint/block.test)0
-rw-r--r--third_party/git/t/chainlint/broken-chain.expect (renamed from t/chainlint/broken-chain.expect)0
-rw-r--r--third_party/git/t/chainlint/broken-chain.test (renamed from t/chainlint/broken-chain.test)0
-rw-r--r--third_party/git/t/chainlint/case.expect (renamed from t/chainlint/case.expect)0
-rw-r--r--third_party/git/t/chainlint/case.test (renamed from t/chainlint/case.test)0
-rw-r--r--third_party/git/t/chainlint/close-nested-and-parent-together.expect (renamed from t/chainlint/close-nested-and-parent-together.expect)0
-rw-r--r--third_party/git/t/chainlint/close-nested-and-parent-together.test (renamed from t/chainlint/close-nested-and-parent-together.test)0
-rw-r--r--third_party/git/t/chainlint/close-subshell.expect (renamed from t/chainlint/close-subshell.expect)0
-rw-r--r--third_party/git/t/chainlint/close-subshell.test (renamed from t/chainlint/close-subshell.test)0
-rw-r--r--third_party/git/t/chainlint/command-substitution.expect (renamed from t/chainlint/command-substitution.expect)0
-rw-r--r--third_party/git/t/chainlint/command-substitution.test (renamed from t/chainlint/command-substitution.test)0
-rw-r--r--third_party/git/t/chainlint/comment.expect (renamed from t/chainlint/comment.expect)0
-rw-r--r--third_party/git/t/chainlint/comment.test (renamed from t/chainlint/comment.test)0
-rw-r--r--third_party/git/t/chainlint/complex-if-in-cuddled-loop.expect (renamed from t/chainlint/complex-if-in-cuddled-loop.expect)0
-rw-r--r--third_party/git/t/chainlint/complex-if-in-cuddled-loop.test (renamed from t/chainlint/complex-if-in-cuddled-loop.test)0
-rw-r--r--third_party/git/t/chainlint/cuddled-if-then-else.expect (renamed from t/chainlint/cuddled-if-then-else.expect)0
-rw-r--r--third_party/git/t/chainlint/cuddled-if-then-else.test (renamed from t/chainlint/cuddled-if-then-else.test)0
-rw-r--r--third_party/git/t/chainlint/cuddled-loop.expect (renamed from t/chainlint/cuddled-loop.expect)0
-rw-r--r--third_party/git/t/chainlint/cuddled-loop.test (renamed from t/chainlint/cuddled-loop.test)0
-rw-r--r--third_party/git/t/chainlint/cuddled.expect (renamed from t/chainlint/cuddled.expect)0
-rw-r--r--third_party/git/t/chainlint/cuddled.test (renamed from t/chainlint/cuddled.test)0
-rw-r--r--third_party/git/t/chainlint/exit-loop.expect (renamed from t/chainlint/exit-loop.expect)0
-rw-r--r--third_party/git/t/chainlint/exit-loop.test (renamed from t/chainlint/exit-loop.test)0
-rw-r--r--third_party/git/t/chainlint/exit-subshell.expect (renamed from t/chainlint/exit-subshell.expect)0
-rw-r--r--third_party/git/t/chainlint/exit-subshell.test (renamed from t/chainlint/exit-subshell.test)0
-rw-r--r--third_party/git/t/chainlint/for-loop.expect (renamed from t/chainlint/for-loop.expect)0
-rw-r--r--third_party/git/t/chainlint/for-loop.test (renamed from t/chainlint/for-loop.test)0
-rw-r--r--third_party/git/t/chainlint/here-doc-close-subshell.expect (renamed from t/chainlint/here-doc-close-subshell.expect)0
-rw-r--r--third_party/git/t/chainlint/here-doc-close-subshell.test (renamed from t/chainlint/here-doc-close-subshell.test)0
-rw-r--r--third_party/git/t/chainlint/here-doc-multi-line-command-subst.expect (renamed from t/chainlint/here-doc-multi-line-command-subst.expect)0
-rw-r--r--third_party/git/t/chainlint/here-doc-multi-line-command-subst.test (renamed from t/chainlint/here-doc-multi-line-command-subst.test)0
-rw-r--r--third_party/git/t/chainlint/here-doc-multi-line-string.expect (renamed from t/chainlint/here-doc-multi-line-string.expect)0
-rw-r--r--third_party/git/t/chainlint/here-doc-multi-line-string.test (renamed from t/chainlint/here-doc-multi-line-string.test)0
-rw-r--r--third_party/git/t/chainlint/here-doc.expect (renamed from t/chainlint/here-doc.expect)0
-rw-r--r--third_party/git/t/chainlint/here-doc.test (renamed from t/chainlint/here-doc.test)0
-rw-r--r--third_party/git/t/chainlint/if-in-loop.expect (renamed from t/chainlint/if-in-loop.expect)0
-rw-r--r--third_party/git/t/chainlint/if-in-loop.test (renamed from t/chainlint/if-in-loop.test)0
-rw-r--r--third_party/git/t/chainlint/if-then-else.expect (renamed from t/chainlint/if-then-else.expect)0
-rw-r--r--third_party/git/t/chainlint/if-then-else.test (renamed from t/chainlint/if-then-else.test)0
-rw-r--r--third_party/git/t/chainlint/incomplete-line.expect (renamed from t/chainlint/incomplete-line.expect)0
-rw-r--r--third_party/git/t/chainlint/incomplete-line.test (renamed from t/chainlint/incomplete-line.test)0
-rw-r--r--third_party/git/t/chainlint/inline-comment.expect (renamed from t/chainlint/inline-comment.expect)0
-rw-r--r--third_party/git/t/chainlint/inline-comment.test (renamed from t/chainlint/inline-comment.test)0
-rw-r--r--third_party/git/t/chainlint/loop-in-if.expect (renamed from t/chainlint/loop-in-if.expect)0
-rw-r--r--third_party/git/t/chainlint/loop-in-if.test (renamed from t/chainlint/loop-in-if.test)0
-rw-r--r--third_party/git/t/chainlint/multi-line-nested-command-substitution.expect (renamed from t/chainlint/multi-line-nested-command-substitution.expect)0
-rw-r--r--third_party/git/t/chainlint/multi-line-nested-command-substitution.test (renamed from t/chainlint/multi-line-nested-command-substitution.test)0
-rw-r--r--third_party/git/t/chainlint/multi-line-string.expect (renamed from t/chainlint/multi-line-string.expect)0
-rw-r--r--third_party/git/t/chainlint/multi-line-string.test (renamed from t/chainlint/multi-line-string.test)0
-rw-r--r--third_party/git/t/chainlint/negated-one-liner.expect (renamed from t/chainlint/negated-one-liner.expect)0
-rw-r--r--third_party/git/t/chainlint/negated-one-liner.test (renamed from t/chainlint/negated-one-liner.test)0
-rw-r--r--third_party/git/t/chainlint/nested-cuddled-subshell.expect (renamed from t/chainlint/nested-cuddled-subshell.expect)0
-rw-r--r--third_party/git/t/chainlint/nested-cuddled-subshell.test (renamed from t/chainlint/nested-cuddled-subshell.test)0
-rw-r--r--third_party/git/t/chainlint/nested-here-doc.expect (renamed from t/chainlint/nested-here-doc.expect)0
-rw-r--r--third_party/git/t/chainlint/nested-here-doc.test (renamed from t/chainlint/nested-here-doc.test)0
-rw-r--r--third_party/git/t/chainlint/nested-subshell-comment.expect (renamed from t/chainlint/nested-subshell-comment.expect)0
-rw-r--r--third_party/git/t/chainlint/nested-subshell-comment.test (renamed from t/chainlint/nested-subshell-comment.test)0
-rw-r--r--third_party/git/t/chainlint/nested-subshell.expect (renamed from t/chainlint/nested-subshell.expect)0
-rw-r--r--third_party/git/t/chainlint/nested-subshell.test (renamed from t/chainlint/nested-subshell.test)0
-rw-r--r--third_party/git/t/chainlint/one-liner.expect (renamed from t/chainlint/one-liner.expect)0
-rw-r--r--third_party/git/t/chainlint/one-liner.test (renamed from t/chainlint/one-liner.test)0
-rw-r--r--third_party/git/t/chainlint/p4-filespec.expect (renamed from t/chainlint/p4-filespec.expect)0
-rw-r--r--third_party/git/t/chainlint/p4-filespec.test (renamed from t/chainlint/p4-filespec.test)0
-rw-r--r--third_party/git/t/chainlint/pipe.expect (renamed from t/chainlint/pipe.expect)0
-rw-r--r--third_party/git/t/chainlint/pipe.test (renamed from t/chainlint/pipe.test)0
-rw-r--r--third_party/git/t/chainlint/semicolon.expect (renamed from t/chainlint/semicolon.expect)0
-rw-r--r--third_party/git/t/chainlint/semicolon.test (renamed from t/chainlint/semicolon.test)0
-rw-r--r--third_party/git/t/chainlint/subshell-here-doc.expect (renamed from t/chainlint/subshell-here-doc.expect)0
-rw-r--r--third_party/git/t/chainlint/subshell-here-doc.test (renamed from t/chainlint/subshell-here-doc.test)0
-rw-r--r--third_party/git/t/chainlint/subshell-one-liner.expect (renamed from t/chainlint/subshell-one-liner.expect)0
-rw-r--r--third_party/git/t/chainlint/subshell-one-liner.test (renamed from t/chainlint/subshell-one-liner.test)0
-rw-r--r--third_party/git/t/chainlint/t7900-subtree.expect (renamed from t/chainlint/t7900-subtree.expect)0
-rw-r--r--third_party/git/t/chainlint/t7900-subtree.test (renamed from t/chainlint/t7900-subtree.test)0
-rw-r--r--third_party/git/t/chainlint/while-loop.expect (renamed from t/chainlint/while-loop.expect)0
-rw-r--r--third_party/git/t/chainlint/while-loop.test (renamed from t/chainlint/while-loop.test)0
-rwxr-xr-xthird_party/git/t/check-non-portable-shell.pl (renamed from t/check-non-portable-shell.pl)0
-rw-r--r--third_party/git/t/diff-lib.sh (renamed from t/diff-lib.sh)0
-rw-r--r--third_party/git/t/diff-lib/COPYING (renamed from t/diff-lib/COPYING)0
-rw-r--r--third_party/git/t/diff-lib/README (renamed from t/diff-lib/README)0
-rw-r--r--third_party/git/t/gitweb-lib.sh (renamed from t/gitweb-lib.sh)0
-rw-r--r--third_party/git/t/helper/.gitignore (renamed from t/helper/.gitignore)0
-rw-r--r--third_party/git/t/helper/test-chmtime.c (renamed from t/helper/test-chmtime.c)0
-rw-r--r--third_party/git/t/helper/test-config.c (renamed from t/helper/test-config.c)0
-rw-r--r--third_party/git/t/helper/test-ctype.c (renamed from t/helper/test-ctype.c)0
-rw-r--r--third_party/git/t/helper/test-date.c (renamed from t/helper/test-date.c)0
-rw-r--r--third_party/git/t/helper/test-delta.c (renamed from t/helper/test-delta.c)0
-rw-r--r--third_party/git/t/helper/test-dir-iterator.c (renamed from t/helper/test-dir-iterator.c)0
-rw-r--r--third_party/git/t/helper/test-drop-caches.c (renamed from t/helper/test-drop-caches.c)0
-rw-r--r--third_party/git/t/helper/test-dump-cache-tree.c (renamed from t/helper/test-dump-cache-tree.c)0
-rw-r--r--third_party/git/t/helper/test-dump-fsmonitor.c (renamed from t/helper/test-dump-fsmonitor.c)0
-rw-r--r--third_party/git/t/helper/test-dump-split-index.c (renamed from t/helper/test-dump-split-index.c)0
-rw-r--r--third_party/git/t/helper/test-dump-untracked-cache.c (renamed from t/helper/test-dump-untracked-cache.c)0
-rw-r--r--third_party/git/t/helper/test-example-decorate.c (renamed from t/helper/test-example-decorate.c)0
-rw-r--r--third_party/git/t/helper/test-fake-ssh.c (renamed from t/helper/test-fake-ssh.c)0
-rw-r--r--third_party/git/t/helper/test-genrandom.c (renamed from t/helper/test-genrandom.c)0
-rw-r--r--third_party/git/t/helper/test-genzeros.c (renamed from t/helper/test-genzeros.c)0
-rw-r--r--third_party/git/t/helper/test-hash-speed.c (renamed from t/helper/test-hash-speed.c)0
-rw-r--r--third_party/git/t/helper/test-hash.c (renamed from t/helper/test-hash.c)0
-rw-r--r--third_party/git/t/helper/test-hashmap.c (renamed from t/helper/test-hashmap.c)0
-rw-r--r--third_party/git/t/helper/test-index-version.c (renamed from t/helper/test-index-version.c)0
-rw-r--r--third_party/git/t/helper/test-json-writer.c (renamed from t/helper/test-json-writer.c)0
-rw-r--r--third_party/git/t/helper/test-lazy-init-name-hash.c (renamed from t/helper/test-lazy-init-name-hash.c)0
-rw-r--r--third_party/git/t/helper/test-line-buffer.c (renamed from t/helper/test-line-buffer.c)0
-rw-r--r--third_party/git/t/helper/test-match-trees.c (renamed from t/helper/test-match-trees.c)0
-rw-r--r--third_party/git/t/helper/test-mergesort.c (renamed from t/helper/test-mergesort.c)0
-rw-r--r--third_party/git/t/helper/test-mktemp.c (renamed from t/helper/test-mktemp.c)0
-rw-r--r--third_party/git/t/helper/test-oidmap.c (renamed from t/helper/test-oidmap.c)0
-rw-r--r--third_party/git/t/helper/test-online-cpus.c (renamed from t/helper/test-online-cpus.c)0
-rw-r--r--third_party/git/t/helper/test-parse-options.c (renamed from t/helper/test-parse-options.c)0
-rw-r--r--third_party/git/t/helper/test-path-utils.c (renamed from t/helper/test-path-utils.c)0
-rw-r--r--third_party/git/t/helper/test-pkt-line.c (renamed from t/helper/test-pkt-line.c)0
-rw-r--r--third_party/git/t/helper/test-prio-queue.c (renamed from t/helper/test-prio-queue.c)0
-rw-r--r--third_party/git/t/helper/test-reach.c (renamed from t/helper/test-reach.c)0
-rw-r--r--third_party/git/t/helper/test-read-cache.c (renamed from t/helper/test-read-cache.c)0
-rw-r--r--third_party/git/t/helper/test-read-midx.c (renamed from t/helper/test-read-midx.c)0
-rw-r--r--third_party/git/t/helper/test-ref-store.c (renamed from t/helper/test-ref-store.c)0
-rw-r--r--third_party/git/t/helper/test-regex.c (renamed from t/helper/test-regex.c)0
-rw-r--r--third_party/git/t/helper/test-repository.c (renamed from t/helper/test-repository.c)0
-rw-r--r--third_party/git/t/helper/test-revision-walking.c (renamed from t/helper/test-revision-walking.c)0
-rw-r--r--third_party/git/t/helper/test-run-command.c (renamed from t/helper/test-run-command.c)0
-rw-r--r--third_party/git/t/helper/test-scrap-cache-tree.c (renamed from t/helper/test-scrap-cache-tree.c)0
-rw-r--r--third_party/git/t/helper/test-serve-v2.c (renamed from t/helper/test-serve-v2.c)0
-rw-r--r--third_party/git/t/helper/test-sha1-array.c (renamed from t/helper/test-sha1-array.c)0
-rw-r--r--third_party/git/t/helper/test-sha1.c (renamed from t/helper/test-sha1.c)0
-rwxr-xr-xthird_party/git/t/helper/test-sha1.sh (renamed from t/helper/test-sha1.sh)0
-rw-r--r--third_party/git/t/helper/test-sha256.c (renamed from t/helper/test-sha256.c)0
-rw-r--r--third_party/git/t/helper/test-sigchain.c (renamed from t/helper/test-sigchain.c)0
-rw-r--r--third_party/git/t/helper/test-strcmp-offset.c (renamed from t/helper/test-strcmp-offset.c)0
-rw-r--r--third_party/git/t/helper/test-string-list.c (renamed from t/helper/test-string-list.c)0
-rw-r--r--third_party/git/t/helper/test-submodule-config.c (renamed from t/helper/test-submodule-config.c)0
-rw-r--r--third_party/git/t/helper/test-submodule-nested-repo-config.c (renamed from t/helper/test-submodule-nested-repo-config.c)0
-rw-r--r--third_party/git/t/helper/test-subprocess.c (renamed from t/helper/test-subprocess.c)0
-rw-r--r--third_party/git/t/helper/test-svn-fe.c (renamed from t/helper/test-svn-fe.c)0
-rw-r--r--third_party/git/t/helper/test-tool.c (renamed from t/helper/test-tool.c)0
-rw-r--r--third_party/git/t/helper/test-tool.h (renamed from t/helper/test-tool.h)0
-rw-r--r--third_party/git/t/helper/test-trace2.c (renamed from t/helper/test-trace2.c)0
-rw-r--r--third_party/git/t/helper/test-urlmatch-normalization.c (renamed from t/helper/test-urlmatch-normalization.c)0
-rw-r--r--third_party/git/t/helper/test-wildmatch.c (renamed from t/helper/test-wildmatch.c)0
-rw-r--r--third_party/git/t/helper/test-windows-named-pipe.c (renamed from t/helper/test-windows-named-pipe.c)0
-rw-r--r--third_party/git/t/helper/test-write-cache.c (renamed from t/helper/test-write-cache.c)0
-rw-r--r--third_party/git/t/helper/test-xml-encode.c (renamed from t/helper/test-xml-encode.c)0
-rw-r--r--third_party/git/t/interop/.gitignore (renamed from t/interop/.gitignore)0
-rw-r--r--third_party/git/t/interop/Makefile (renamed from t/interop/Makefile)0
-rw-r--r--third_party/git/t/interop/README (renamed from t/interop/README)0
-rwxr-xr-xthird_party/git/t/interop/i0000-basic.sh (renamed from t/interop/i0000-basic.sh)0
-rwxr-xr-xthird_party/git/t/interop/i5500-git-daemon.sh (renamed from t/interop/i5500-git-daemon.sh)0
-rwxr-xr-xthird_party/git/t/interop/i5700-protocol-transition.sh (renamed from t/interop/i5700-protocol-transition.sh)0
-rw-r--r--third_party/git/t/interop/interop-lib.sh (renamed from t/interop/interop-lib.sh)0
-rw-r--r--third_party/git/t/lib-bash.sh (renamed from t/lib-bash.sh)0
-rwxr-xr-xthird_party/git/t/lib-credential.sh (renamed from t/lib-credential.sh)0
-rw-r--r--third_party/git/t/lib-cvs.sh (renamed from t/lib-cvs.sh)0
-rw-r--r--third_party/git/t/lib-diff-alternative.sh (renamed from t/lib-diff-alternative.sh)0
-rw-r--r--third_party/git/t/lib-gettext.sh (renamed from t/lib-gettext.sh)0
-rw-r--r--third_party/git/t/lib-git-daemon.sh (renamed from t/lib-git-daemon.sh)0
-rw-r--r--third_party/git/t/lib-git-p4.sh (renamed from t/lib-git-p4.sh)0
-rw-r--r--third_party/git/t/lib-git-svn.sh (renamed from t/lib-git-svn.sh)0
-rwxr-xr-xthird_party/git/t/lib-gpg.sh (renamed from t/lib-gpg.sh)0
-rw-r--r--third_party/git/t/lib-gpg/gpgsm-gen-key.in (renamed from t/lib-gpg/gpgsm-gen-key.in)0
-rw-r--r--third_party/git/t/lib-gpg/gpgsm_cert.p12 (renamed from t/lib-gpg/gpgsm_cert.p12)bin2652 -> 2652 bytes
-rw-r--r--third_party/git/t/lib-gpg/keyring.gpg (renamed from t/lib-gpg/keyring.gpg)0
-rw-r--r--third_party/git/t/lib-gpg/ownertrust (renamed from t/lib-gpg/ownertrust)0
-rw-r--r--third_party/git/t/lib-httpd.sh (renamed from t/lib-httpd.sh)0
-rw-r--r--third_party/git/t/lib-httpd/apache.conf (renamed from t/lib-httpd/apache.conf)0
-rw-r--r--third_party/git/t/lib-httpd/apply-one-time-sed.sh (renamed from t/lib-httpd/apply-one-time-sed.sh)0
-rw-r--r--third_party/git/t/lib-httpd/broken-smart-http.sh (renamed from t/lib-httpd/broken-smart-http.sh)0
-rw-r--r--third_party/git/t/lib-httpd/error-smart-http.sh (renamed from t/lib-httpd/error-smart-http.sh)0
-rwxr-xr-xthird_party/git/t/lib-httpd/error.sh (renamed from t/lib-httpd/error.sh)0
-rw-r--r--third_party/git/t/lib-httpd/passwd (renamed from t/lib-httpd/passwd)0
-rw-r--r--third_party/git/t/lib-httpd/ssl.cnf (renamed from t/lib-httpd/ssl.cnf)0
-rw-r--r--third_party/git/t/lib-pack.sh (renamed from t/lib-pack.sh)0
-rw-r--r--third_party/git/t/lib-pager.sh (renamed from t/lib-pager.sh)0
-rw-r--r--third_party/git/t/lib-patch-mode.sh (renamed from t/lib-patch-mode.sh)0
-rw-r--r--third_party/git/t/lib-proto-disable.sh (renamed from t/lib-proto-disable.sh)0
-rw-r--r--third_party/git/t/lib-read-tree-m-3way.sh (renamed from t/lib-read-tree-m-3way.sh)0
-rw-r--r--third_party/git/t/lib-read-tree.sh (renamed from t/lib-read-tree.sh)0
-rw-r--r--third_party/git/t/lib-rebase.sh (renamed from t/lib-rebase.sh)0
-rwxr-xr-xthird_party/git/t/lib-submodule-update.sh (renamed from t/lib-submodule-update.sh)0
-rw-r--r--third_party/git/t/lib-t6000.sh (renamed from t/lib-t6000.sh)0
-rw-r--r--third_party/git/t/lib-terminal.sh (renamed from t/lib-terminal.sh)0
-rw-r--r--third_party/git/t/oid-info/README (renamed from t/oid-info/README)0
-rw-r--r--third_party/git/t/oid-info/hash-info (renamed from t/oid-info/hash-info)0
-rw-r--r--third_party/git/t/oid-info/oid (renamed from t/oid-info/oid)0
-rw-r--r--third_party/git/t/perf/.gitignore (renamed from t/perf/.gitignore)0
-rw-r--r--third_party/git/t/perf/Makefile (renamed from t/perf/Makefile)0
-rw-r--r--third_party/git/t/perf/README (renamed from t/perf/README)0
-rwxr-xr-xthird_party/git/t/perf/aggregate.perl (renamed from t/perf/aggregate.perl)0
-rwxr-xr-xthird_party/git/t/perf/bisect_regression (renamed from t/perf/bisect_regression)0
-rwxr-xr-xthird_party/git/t/perf/bisect_run_script (renamed from t/perf/bisect_run_script)0
-rw-r--r--third_party/git/t/perf/lib-pack.sh (renamed from t/perf/lib-pack.sh)0
-rwxr-xr-xthird_party/git/t/perf/min_time.perl (renamed from t/perf/min_time.perl)0
-rwxr-xr-xthird_party/git/t/perf/p0000-perf-lib-sanity.sh (renamed from t/perf/p0000-perf-lib-sanity.sh)0
-rwxr-xr-xthird_party/git/t/perf/p0001-rev-list.sh (renamed from t/perf/p0001-rev-list.sh)0
-rwxr-xr-xthird_party/git/t/perf/p0002-read-cache.sh (renamed from t/perf/p0002-read-cache.sh)0
-rwxr-xr-xthird_party/git/t/perf/p0003-delta-base-cache.sh (renamed from t/perf/p0003-delta-base-cache.sh)0
-rwxr-xr-xthird_party/git/t/perf/p0004-lazy-init-name-hash.sh (renamed from t/perf/p0004-lazy-init-name-hash.sh)0
-rwxr-xr-xthird_party/git/t/perf/p0005-status.sh (renamed from t/perf/p0005-status.sh)0
-rwxr-xr-xthird_party/git/t/perf/p0006-read-tree-checkout.sh (renamed from t/perf/p0006-read-tree-checkout.sh)0
-rwxr-xr-xthird_party/git/t/perf/p0007-write-cache.sh (renamed from t/perf/p0007-write-cache.sh)0
-rwxr-xr-xthird_party/git/t/perf/p0071-sort.sh (renamed from t/perf/p0071-sort.sh)0
-rwxr-xr-xthird_party/git/t/perf/p0100-globbing.sh (renamed from t/perf/p0100-globbing.sh)0
-rwxr-xr-xthird_party/git/t/perf/p1450-fsck.sh (renamed from t/perf/p1450-fsck.sh)0
-rwxr-xr-xthird_party/git/t/perf/p1451-fsck-skip-list.sh (renamed from t/perf/p1451-fsck-skip-list.sh)0
-rwxr-xr-xthird_party/git/t/perf/p3400-rebase.sh (renamed from t/perf/p3400-rebase.sh)0
-rwxr-xr-xthird_party/git/t/perf/p3404-rebase-interactive.sh (renamed from t/perf/p3404-rebase-interactive.sh)0
-rwxr-xr-xthird_party/git/t/perf/p4000-diff-algorithms.sh (renamed from t/perf/p4000-diff-algorithms.sh)0
-rwxr-xr-xthird_party/git/t/perf/p4001-diff-no-index.sh (renamed from t/perf/p4001-diff-no-index.sh)0
-rwxr-xr-xthird_party/git/t/perf/p4205-log-pretty-formats.sh (renamed from t/perf/p4205-log-pretty-formats.sh)0
-rwxr-xr-xthird_party/git/t/perf/p4211-line-log.sh (renamed from t/perf/p4211-line-log.sh)0
-rwxr-xr-xthird_party/git/t/perf/p4220-log-grep-engines.sh (renamed from t/perf/p4220-log-grep-engines.sh)0
-rwxr-xr-xthird_party/git/t/perf/p4221-log-grep-engines-fixed.sh (renamed from t/perf/p4221-log-grep-engines-fixed.sh)0
-rwxr-xr-xthird_party/git/t/perf/p5302-pack-index.sh (renamed from t/perf/p5302-pack-index.sh)0
-rwxr-xr-xthird_party/git/t/perf/p5303-many-packs.sh (renamed from t/perf/p5303-many-packs.sh)0
-rwxr-xr-xthird_party/git/t/perf/p5304-prune.sh (renamed from t/perf/p5304-prune.sh)0
-rwxr-xr-xthird_party/git/t/perf/p5310-pack-bitmaps.sh (renamed from t/perf/p5310-pack-bitmaps.sh)0
-rwxr-xr-xthird_party/git/t/perf/p5311-pack-bitmaps-fetch.sh (renamed from t/perf/p5311-pack-bitmaps-fetch.sh)0
-rwxr-xr-xthird_party/git/t/perf/p5550-fetch-tags.sh (renamed from t/perf/p5550-fetch-tags.sh)0
-rwxr-xr-xthird_party/git/t/perf/p5551-fetch-rescan.sh (renamed from t/perf/p5551-fetch-rescan.sh)0
-rwxr-xr-xthird_party/git/t/perf/p5600-clone-reference.sh (renamed from t/perf/p5600-clone-reference.sh)0
-rwxr-xr-xthird_party/git/t/perf/p5600-partial-clone.sh (renamed from t/perf/p5600-partial-clone.sh)0
-rwxr-xr-xthird_party/git/t/perf/p7000-filter-branch.sh (renamed from t/perf/p7000-filter-branch.sh)0
-rwxr-xr-xthird_party/git/t/perf/p7300-clean.sh (renamed from t/perf/p7300-clean.sh)0
-rwxr-xr-xthird_party/git/t/perf/p7519-fsmonitor.sh (renamed from t/perf/p7519-fsmonitor.sh)0
-rwxr-xr-xthird_party/git/t/perf/p7810-grep.sh (renamed from t/perf/p7810-grep.sh)0
-rwxr-xr-xthird_party/git/t/perf/p7820-grep-engines.sh (renamed from t/perf/p7820-grep-engines.sh)0
-rwxr-xr-xthird_party/git/t/perf/p7821-grep-engines-fixed.sh (renamed from t/perf/p7821-grep-engines-fixed.sh)0
-rw-r--r--third_party/git/t/perf/perf-lib.sh (renamed from t/perf/perf-lib.sh)0
-rw-r--r--third_party/git/t/perf/repos/.gitignore (renamed from t/perf/repos/.gitignore)0
-rwxr-xr-xthird_party/git/t/perf/repos/inflate-repo.sh (renamed from t/perf/repos/inflate-repo.sh)0
-rwxr-xr-xthird_party/git/t/perf/repos/many-files.sh (renamed from t/perf/repos/many-files.sh)0
-rwxr-xr-xthird_party/git/t/perf/run (renamed from t/perf/run)0
-rwxr-xr-xthird_party/git/t/t0000-basic.sh (renamed from t/t0000-basic.sh)0
-rwxr-xr-xthird_party/git/t/t0001-init.sh (renamed from t/t0001-init.sh)0
-rwxr-xr-xthird_party/git/t/t0002-gitfile.sh (renamed from t/t0002-gitfile.sh)0
-rwxr-xr-xthird_party/git/t/t0003-attributes.sh (renamed from t/t0003-attributes.sh)0
-rwxr-xr-xthird_party/git/t/t0004-unwritable.sh (renamed from t/t0004-unwritable.sh)0
-rwxr-xr-xthird_party/git/t/t0005-signals.sh (renamed from t/t0005-signals.sh)0
-rwxr-xr-xthird_party/git/t/t0006-date.sh (renamed from t/t0006-date.sh)0
-rwxr-xr-xthird_party/git/t/t0007-git-var.sh (renamed from t/t0007-git-var.sh)0
-rwxr-xr-xthird_party/git/t/t0008-ignores.sh (renamed from t/t0008-ignores.sh)0
-rwxr-xr-xthird_party/git/t/t0009-prio-queue.sh (renamed from t/t0009-prio-queue.sh)0
-rwxr-xr-xthird_party/git/t/t0010-racy-git.sh (renamed from t/t0010-racy-git.sh)0
-rwxr-xr-xthird_party/git/t/t0011-hashmap.sh (renamed from t/t0011-hashmap.sh)0
-rwxr-xr-xthird_party/git/t/t0012-help.sh (renamed from t/t0012-help.sh)0
-rwxr-xr-xthird_party/git/t/t0013-sha1dc.sh (renamed from t/t0013-sha1dc.sh)0
-rw-r--r--third_party/git/t/t0013/shattered-1.pdf (renamed from t/t0013/shattered-1.pdf)bin422435 -> 422435 bytes
-rwxr-xr-xthird_party/git/t/t0014-alias.sh (renamed from t/t0014-alias.sh)0
-rwxr-xr-xthird_party/git/t/t0015-hash.sh (renamed from t/t0015-hash.sh)0
-rwxr-xr-xthird_party/git/t/t0016-oidmap.sh (renamed from t/t0016-oidmap.sh)0
-rwxr-xr-xthird_party/git/t/t0017-env-helper.sh (renamed from t/t0017-env-helper.sh)0
-rwxr-xr-xthird_party/git/t/t0019-json-writer.sh (renamed from t/t0019-json-writer.sh)0
-rw-r--r--third_party/git/t/t0019/parse_json.perl (renamed from t/t0019/parse_json.perl)0
-rwxr-xr-xthird_party/git/t/t0020-crlf.sh (renamed from t/t0020-crlf.sh)0
-rwxr-xr-xthird_party/git/t/t0021-conversion.sh (renamed from t/t0021-conversion.sh)0
-rw-r--r--third_party/git/t/t0021/rot13-filter.pl (renamed from t/t0021/rot13-filter.pl)0
-rwxr-xr-xthird_party/git/t/t0022-crlf-rename.sh (renamed from t/t0022-crlf-rename.sh)0
-rwxr-xr-xthird_party/git/t/t0023-crlf-am.sh (renamed from t/t0023-crlf-am.sh)0
-rwxr-xr-xthird_party/git/t/t0024-crlf-archive.sh (renamed from t/t0024-crlf-archive.sh)0
-rwxr-xr-xthird_party/git/t/t0025-crlf-renormalize.sh (renamed from t/t0025-crlf-renormalize.sh)0
-rwxr-xr-xthird_party/git/t/t0026-eol-config.sh (renamed from t/t0026-eol-config.sh)0
-rwxr-xr-xthird_party/git/t/t0027-auto-crlf.sh (renamed from t/t0027-auto-crlf.sh)0
-rwxr-xr-xthird_party/git/t/t0028-working-tree-encoding.sh (renamed from t/t0028-working-tree-encoding.sh)0
-rwxr-xr-xthird_party/git/t/t0029-core-unsetenvvars.sh (renamed from t/t0029-core-unsetenvvars.sh)0
-rwxr-xr-xthird_party/git/t/t0030-stripspace.sh (renamed from t/t0030-stripspace.sh)0
-rwxr-xr-xthird_party/git/t/t0040-parse-options.sh (renamed from t/t0040-parse-options.sh)0
-rwxr-xr-xthird_party/git/t/t0041-usage.sh (renamed from t/t0041-usage.sh)0
-rwxr-xr-xthird_party/git/t/t0050-filesystem.sh (renamed from t/t0050-filesystem.sh)0
-rwxr-xr-xthird_party/git/t/t0051-windows-named-pipe.sh (renamed from t/t0051-windows-named-pipe.sh)0
-rwxr-xr-xthird_party/git/t/t0055-beyond-symlinks.sh (renamed from t/t0055-beyond-symlinks.sh)0
-rwxr-xr-xthird_party/git/t/t0056-git-C.sh (renamed from t/t0056-git-C.sh)0
-rwxr-xr-xthird_party/git/t/t0060-path-utils.sh (renamed from t/t0060-path-utils.sh)0
-rwxr-xr-xthird_party/git/t/t0061-run-command.sh (renamed from t/t0061-run-command.sh)0
-rwxr-xr-xthird_party/git/t/t0062-revision-walking.sh (renamed from t/t0062-revision-walking.sh)0
-rwxr-xr-xthird_party/git/t/t0063-string-list.sh (renamed from t/t0063-string-list.sh)0
-rwxr-xr-xthird_party/git/t/t0064-sha1-array.sh (renamed from t/t0064-sha1-array.sh)0
-rwxr-xr-xthird_party/git/t/t0065-strcmp-offset.sh (renamed from t/t0065-strcmp-offset.sh)0
-rwxr-xr-xthird_party/git/t/t0066-dir-iterator.sh (renamed from t/t0066-dir-iterator.sh)0
-rwxr-xr-xthird_party/git/t/t0070-fundamental.sh (renamed from t/t0070-fundamental.sh)0
-rwxr-xr-xthird_party/git/t/t0081-line-buffer.sh (renamed from t/t0081-line-buffer.sh)0
-rwxr-xr-xthird_party/git/t/t0090-cache-tree.sh (renamed from t/t0090-cache-tree.sh)0
-rwxr-xr-xthird_party/git/t/t0100-previous.sh (renamed from t/t0100-previous.sh)0
-rwxr-xr-xthird_party/git/t/t0101-at-syntax.sh (renamed from t/t0101-at-syntax.sh)0
-rwxr-xr-xthird_party/git/t/t0110-urlmatch-normalization.sh (renamed from t/t0110-urlmatch-normalization.sh)0
-rw-r--r--third_party/git/t/t0110/README (renamed from t/t0110/README)0
-rw-r--r--third_party/git/t/t0110/url-1 (renamed from t/t0110/url-1)0
-rw-r--r--third_party/git/t/t0110/url-10 (renamed from t/t0110/url-10)0
-rw-r--r--third_party/git/t/t0110/url-11 (renamed from t/t0110/url-11)0
-rw-r--r--third_party/git/t/t0110/url-2 (renamed from t/t0110/url-2)0
-rw-r--r--third_party/git/t/t0110/url-3 (renamed from t/t0110/url-3)0
-rw-r--r--third_party/git/t/t0110/url-4 (renamed from t/t0110/url-4)0
-rw-r--r--third_party/git/t/t0110/url-5 (renamed from t/t0110/url-5)0
-rw-r--r--third_party/git/t/t0110/url-6 (renamed from t/t0110/url-6)0
-rw-r--r--third_party/git/t/t0110/url-7 (renamed from t/t0110/url-7)0
-rw-r--r--third_party/git/t/t0110/url-8 (renamed from t/t0110/url-8)0
-rw-r--r--third_party/git/t/t0110/url-9 (renamed from t/t0110/url-9)0
-rwxr-xr-xthird_party/git/t/t0200-gettext-basic.sh (renamed from t/t0200-gettext-basic.sh)0
-rw-r--r--third_party/git/t/t0200/test.c (renamed from t/t0200/test.c)0
-rw-r--r--third_party/git/t/t0200/test.perl (renamed from t/t0200/test.perl)0
-rw-r--r--third_party/git/t/t0200/test.sh (renamed from t/t0200/test.sh)0
-rwxr-xr-xthird_party/git/t/t0201-gettext-fallbacks.sh (renamed from t/t0201-gettext-fallbacks.sh)0
-rwxr-xr-xthird_party/git/t/t0202-gettext-perl.sh (renamed from t/t0202-gettext-perl.sh)0
-rwxr-xr-xthird_party/git/t/t0202/test.pl (renamed from t/t0202/test.pl)0
-rwxr-xr-xthird_party/git/t/t0203-gettext-setlocale-sanity.sh (renamed from t/t0203-gettext-setlocale-sanity.sh)0
-rwxr-xr-xthird_party/git/t/t0204-gettext-reencode-sanity.sh (renamed from t/t0204-gettext-reencode-sanity.sh)0
-rwxr-xr-xthird_party/git/t/t0205-gettext-poison.sh (renamed from t/t0205-gettext-poison.sh)0
-rwxr-xr-xthird_party/git/t/t0210-trace2-normal.sh (renamed from t/t0210-trace2-normal.sh)0
-rw-r--r--third_party/git/t/t0210/scrub_normal.perl (renamed from t/t0210/scrub_normal.perl)0
-rwxr-xr-xthird_party/git/t/t0211-trace2-perf.sh (renamed from t/t0211-trace2-perf.sh)0
-rw-r--r--third_party/git/t/t0211/scrub_perf.perl (renamed from t/t0211/scrub_perf.perl)0
-rwxr-xr-xthird_party/git/t/t0212-trace2-event.sh (renamed from t/t0212-trace2-event.sh)0
-rw-r--r--third_party/git/t/t0212/parse_events.perl (renamed from t/t0212/parse_events.perl)0
-rwxr-xr-xthird_party/git/t/t0300-credentials.sh (renamed from t/t0300-credentials.sh)0
-rwxr-xr-xthird_party/git/t/t0301-credential-cache.sh (renamed from t/t0301-credential-cache.sh)0
-rwxr-xr-xthird_party/git/t/t0302-credential-store.sh (renamed from t/t0302-credential-store.sh)0
-rwxr-xr-xthird_party/git/t/t0303-credential-external.sh (renamed from t/t0303-credential-external.sh)0
-rwxr-xr-xthird_party/git/t/t0410-partial-clone.sh (renamed from t/t0410-partial-clone.sh)0
-rwxr-xr-xthird_party/git/t/t1000-read-tree-m-3way.sh (renamed from t/t1000-read-tree-m-3way.sh)0
-rwxr-xr-xthird_party/git/t/t1001-read-tree-m-2way.sh (renamed from t/t1001-read-tree-m-2way.sh)0
-rwxr-xr-xthird_party/git/t/t1002-read-tree-m-u-2way.sh (renamed from t/t1002-read-tree-m-u-2way.sh)0
-rwxr-xr-xthird_party/git/t/t1003-read-tree-prefix.sh (renamed from t/t1003-read-tree-prefix.sh)0
-rwxr-xr-xthird_party/git/t/t1004-read-tree-m-u-wf.sh (renamed from t/t1004-read-tree-m-u-wf.sh)0
-rwxr-xr-xthird_party/git/t/t1005-read-tree-reset.sh (renamed from t/t1005-read-tree-reset.sh)0
-rwxr-xr-xthird_party/git/t/t1006-cat-file.sh (renamed from t/t1006-cat-file.sh)0
-rwxr-xr-xthird_party/git/t/t1007-hash-object.sh (renamed from t/t1007-hash-object.sh)0
-rwxr-xr-xthird_party/git/t/t1008-read-tree-overlay.sh (renamed from t/t1008-read-tree-overlay.sh)0
-rwxr-xr-xthird_party/git/t/t1009-read-tree-new-index.sh (renamed from t/t1009-read-tree-new-index.sh)0
-rwxr-xr-xthird_party/git/t/t1010-mktree.sh (renamed from t/t1010-mktree.sh)0
-rwxr-xr-xthird_party/git/t/t1011-read-tree-sparse-checkout.sh (renamed from t/t1011-read-tree-sparse-checkout.sh)0
-rwxr-xr-xthird_party/git/t/t1012-read-tree-df.sh (renamed from t/t1012-read-tree-df.sh)0
-rwxr-xr-xthird_party/git/t/t1013-read-tree-submodule.sh (renamed from t/t1013-read-tree-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t1014-read-tree-confusing.sh (renamed from t/t1014-read-tree-confusing.sh)0
-rwxr-xr-xthird_party/git/t/t1015-read-index-unmerged.sh (renamed from t/t1015-read-index-unmerged.sh)0
-rwxr-xr-xthird_party/git/t/t1020-subdirectory.sh (renamed from t/t1020-subdirectory.sh)0
-rwxr-xr-xthird_party/git/t/t1021-rerere-in-workdir.sh (renamed from t/t1021-rerere-in-workdir.sh)0
-rwxr-xr-xthird_party/git/t/t1050-large.sh (renamed from t/t1050-large.sh)0
-rwxr-xr-xthird_party/git/t/t1051-large-conversion.sh (renamed from t/t1051-large-conversion.sh)0
-rwxr-xr-xthird_party/git/t/t1060-object-corruption.sh (renamed from t/t1060-object-corruption.sh)0
-rwxr-xr-xthird_party/git/t/t1090-sparse-checkout-scope.sh (renamed from t/t1090-sparse-checkout-scope.sh)0
-rwxr-xr-xthird_party/git/t/t1100-commit-tree-options.sh (renamed from t/t1100-commit-tree-options.sh)0
-rwxr-xr-xthird_party/git/t/t1300-config.sh (renamed from t/t1300-config.sh)0
-rwxr-xr-xthird_party/git/t/t1301-shared-repo.sh (renamed from t/t1301-shared-repo.sh)0
-rwxr-xr-xthird_party/git/t/t1302-repo-version.sh (renamed from t/t1302-repo-version.sh)0
-rwxr-xr-xthird_party/git/t/t1303-wacky-config.sh (renamed from t/t1303-wacky-config.sh)0
-rwxr-xr-xthird_party/git/t/t1304-default-acl.sh (renamed from t/t1304-default-acl.sh)0
-rwxr-xr-xthird_party/git/t/t1305-config-include.sh (renamed from t/t1305-config-include.sh)0
-rwxr-xr-xthird_party/git/t/t1306-xdg-files.sh (renamed from t/t1306-xdg-files.sh)0
-rwxr-xr-xthird_party/git/t/t1307-config-blob.sh (renamed from t/t1307-config-blob.sh)0
-rwxr-xr-xthird_party/git/t/t1308-config-set.sh (renamed from t/t1308-config-set.sh)0
-rwxr-xr-xthird_party/git/t/t1309-early-config.sh (renamed from t/t1309-early-config.sh)0
-rwxr-xr-xthird_party/git/t/t1310-config-default.sh (renamed from t/t1310-config-default.sh)0
-rwxr-xr-xthird_party/git/t/t1350-config-hooks-path.sh (renamed from t/t1350-config-hooks-path.sh)0
-rwxr-xr-xthird_party/git/t/t1400-update-ref.sh (renamed from t/t1400-update-ref.sh)0
-rwxr-xr-xthird_party/git/t/t1401-symbolic-ref.sh (renamed from t/t1401-symbolic-ref.sh)0
-rwxr-xr-xthird_party/git/t/t1402-check-ref-format.sh (renamed from t/t1402-check-ref-format.sh)0
-rwxr-xr-xthird_party/git/t/t1403-show-ref.sh (renamed from t/t1403-show-ref.sh)0
-rwxr-xr-xthird_party/git/t/t1404-update-ref-errors.sh (renamed from t/t1404-update-ref-errors.sh)0
-rwxr-xr-xthird_party/git/t/t1405-main-ref-store.sh (renamed from t/t1405-main-ref-store.sh)0
-rwxr-xr-xthird_party/git/t/t1406-submodule-ref-store.sh (renamed from t/t1406-submodule-ref-store.sh)0
-rwxr-xr-xthird_party/git/t/t1407-worktree-ref-store.sh (renamed from t/t1407-worktree-ref-store.sh)0
-rwxr-xr-xthird_party/git/t/t1408-packed-refs.sh (renamed from t/t1408-packed-refs.sh)0
-rwxr-xr-xthird_party/git/t/t1409-avoid-packing-refs.sh (renamed from t/t1409-avoid-packing-refs.sh)0
-rwxr-xr-xthird_party/git/t/t1410-reflog.sh (renamed from t/t1410-reflog.sh)0
-rwxr-xr-xthird_party/git/t/t1411-reflog-show.sh (renamed from t/t1411-reflog-show.sh)0
-rwxr-xr-xthird_party/git/t/t1412-reflog-loop.sh (renamed from t/t1412-reflog-loop.sh)0
-rwxr-xr-xthird_party/git/t/t1413-reflog-detach.sh (renamed from t/t1413-reflog-detach.sh)0
-rwxr-xr-xthird_party/git/t/t1414-reflog-walk.sh (renamed from t/t1414-reflog-walk.sh)0
-rwxr-xr-xthird_party/git/t/t1415-worktree-refs.sh (renamed from t/t1415-worktree-refs.sh)0
-rwxr-xr-xthird_party/git/t/t1420-lost-found.sh (renamed from t/t1420-lost-found.sh)0
-rwxr-xr-xthird_party/git/t/t1430-bad-ref-name.sh (renamed from t/t1430-bad-ref-name.sh)0
-rwxr-xr-xthird_party/git/t/t1450-fsck.sh (renamed from t/t1450-fsck.sh)0
-rwxr-xr-xthird_party/git/t/t1500-rev-parse.sh (renamed from t/t1500-rev-parse.sh)0
-rwxr-xr-xthird_party/git/t/t1501-work-tree.sh (renamed from t/t1501-work-tree.sh)0
-rwxr-xr-xthird_party/git/t/t1502-rev-parse-parseopt.sh (renamed from t/t1502-rev-parse-parseopt.sh)0
-rwxr-xr-xthird_party/git/t/t1503-rev-parse-verify.sh (renamed from t/t1503-rev-parse-verify.sh)0
-rwxr-xr-xthird_party/git/t/t1504-ceiling-dirs.sh (renamed from t/t1504-ceiling-dirs.sh)0
-rwxr-xr-xthird_party/git/t/t1505-rev-parse-last.sh (renamed from t/t1505-rev-parse-last.sh)0
-rwxr-xr-xthird_party/git/t/t1506-rev-parse-diagnosis.sh (renamed from t/t1506-rev-parse-diagnosis.sh)0
-rwxr-xr-xthird_party/git/t/t1507-rev-parse-upstream.sh (renamed from t/t1507-rev-parse-upstream.sh)0
-rwxr-xr-xthird_party/git/t/t1508-at-combinations.sh (renamed from t/t1508-at-combinations.sh)0
-rwxr-xr-xthird_party/git/t/t1509-root-work-tree.sh (renamed from t/t1509-root-work-tree.sh)0
-rw-r--r--third_party/git/t/t1509/excludes (renamed from t/t1509/excludes)0
-rwxr-xr-xthird_party/git/t/t1509/prepare-chroot.sh (renamed from t/t1509/prepare-chroot.sh)0
-rwxr-xr-xthird_party/git/t/t1510-repo-setup.sh (renamed from t/t1510-repo-setup.sh)0
-rwxr-xr-xthird_party/git/t/t1511-rev-parse-caret.sh (renamed from t/t1511-rev-parse-caret.sh)0
-rwxr-xr-xthird_party/git/t/t1512-rev-parse-disambiguation.sh (renamed from t/t1512-rev-parse-disambiguation.sh)0
-rwxr-xr-xthird_party/git/t/t1513-rev-parse-prefix.sh (renamed from t/t1513-rev-parse-prefix.sh)0
-rwxr-xr-xthird_party/git/t/t1514-rev-parse-push.sh (renamed from t/t1514-rev-parse-push.sh)0
-rwxr-xr-xthird_party/git/t/t1515-rev-parse-outside-repo.sh (renamed from t/t1515-rev-parse-outside-repo.sh)0
-rwxr-xr-xthird_party/git/t/t1600-index.sh (renamed from t/t1600-index.sh)0
-rwxr-xr-xthird_party/git/t/t1601-index-bogus.sh (renamed from t/t1601-index-bogus.sh)0
-rwxr-xr-xthird_party/git/t/t1700-split-index.sh (renamed from t/t1700-split-index.sh)0
-rwxr-xr-xthird_party/git/t/t1701-racy-split-index.sh (renamed from t/t1701-racy-split-index.sh)0
-rwxr-xr-xthird_party/git/t/t2000-conflict-when-checking-files-out.sh (renamed from t/t2000-conflict-when-checking-files-out.sh)0
-rwxr-xr-xthird_party/git/t/t2002-checkout-cache-u.sh (renamed from t/t2002-checkout-cache-u.sh)0
-rwxr-xr-xthird_party/git/t/t2003-checkout-cache-mkdir.sh (renamed from t/t2003-checkout-cache-mkdir.sh)0
-rwxr-xr-xthird_party/git/t/t2004-checkout-cache-temp.sh (renamed from t/t2004-checkout-cache-temp.sh)0
-rwxr-xr-xthird_party/git/t/t2005-checkout-index-symlinks.sh (renamed from t/t2005-checkout-index-symlinks.sh)0
-rwxr-xr-xthird_party/git/t/t2006-checkout-index-basic.sh (renamed from t/t2006-checkout-index-basic.sh)0
-rwxr-xr-xthird_party/git/t/t2007-checkout-symlink.sh (renamed from t/t2007-checkout-symlink.sh)0
-rwxr-xr-xthird_party/git/t/t2008-checkout-subdir.sh (renamed from t/t2008-checkout-subdir.sh)0
-rwxr-xr-xthird_party/git/t/t2009-checkout-statinfo.sh (renamed from t/t2009-checkout-statinfo.sh)0
-rwxr-xr-xthird_party/git/t/t2010-checkout-ambiguous.sh (renamed from t/t2010-checkout-ambiguous.sh)0
-rwxr-xr-xthird_party/git/t/t2011-checkout-invalid-head.sh (renamed from t/t2011-checkout-invalid-head.sh)0
-rwxr-xr-xthird_party/git/t/t2012-checkout-last.sh (renamed from t/t2012-checkout-last.sh)0
-rwxr-xr-xthird_party/git/t/t2013-checkout-submodule.sh (renamed from t/t2013-checkout-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t2014-checkout-switch.sh (renamed from t/t2014-checkout-switch.sh)0
-rwxr-xr-xthird_party/git/t/t2015-checkout-unborn.sh (renamed from t/t2015-checkout-unborn.sh)0
-rwxr-xr-xthird_party/git/t/t2016-checkout-patch.sh (renamed from t/t2016-checkout-patch.sh)0
-rwxr-xr-xthird_party/git/t/t2017-checkout-orphan.sh (renamed from t/t2017-checkout-orphan.sh)0
-rwxr-xr-xthird_party/git/t/t2018-checkout-branch.sh (renamed from t/t2018-checkout-branch.sh)0
-rwxr-xr-xthird_party/git/t/t2019-checkout-ambiguous-ref.sh (renamed from t/t2019-checkout-ambiguous-ref.sh)0
-rwxr-xr-xthird_party/git/t/t2020-checkout-detach.sh (renamed from t/t2020-checkout-detach.sh)0
-rwxr-xr-xthird_party/git/t/t2021-checkout-overwrite.sh (renamed from t/t2021-checkout-overwrite.sh)0
-rwxr-xr-xthird_party/git/t/t2022-checkout-paths.sh (renamed from t/t2022-checkout-paths.sh)0
-rwxr-xr-xthird_party/git/t/t2023-checkout-m.sh (renamed from t/t2023-checkout-m.sh)0
-rwxr-xr-xthird_party/git/t/t2024-checkout-dwim.sh (renamed from t/t2024-checkout-dwim.sh)0
-rwxr-xr-xthird_party/git/t/t2025-checkout-no-overlay.sh (renamed from t/t2025-checkout-no-overlay.sh)0
-rwxr-xr-xthird_party/git/t/t2030-unresolve-info.sh (renamed from t/t2030-unresolve-info.sh)0
-rwxr-xr-xthird_party/git/t/t2050-git-dir-relative.sh (renamed from t/t2050-git-dir-relative.sh)0
-rwxr-xr-xthird_party/git/t/t2060-switch.sh (renamed from t/t2060-switch.sh)0
-rwxr-xr-xthird_party/git/t/t2070-restore.sh (renamed from t/t2070-restore.sh)0
-rwxr-xr-xthird_party/git/t/t2071-restore-patch.sh (renamed from t/t2071-restore-patch.sh)0
-rwxr-xr-xthird_party/git/t/t2100-update-cache-badpath.sh (renamed from t/t2100-update-cache-badpath.sh)0
-rwxr-xr-xthird_party/git/t/t2101-update-index-reupdate.sh (renamed from t/t2101-update-index-reupdate.sh)0
-rwxr-xr-xthird_party/git/t/t2102-update-index-symlinks.sh (renamed from t/t2102-update-index-symlinks.sh)0
-rwxr-xr-xthird_party/git/t/t2103-update-index-ignore-missing.sh (renamed from t/t2103-update-index-ignore-missing.sh)0
-rwxr-xr-xthird_party/git/t/t2104-update-index-skip-worktree.sh (renamed from t/t2104-update-index-skip-worktree.sh)0
-rwxr-xr-xthird_party/git/t/t2105-update-index-gitfile.sh (renamed from t/t2105-update-index-gitfile.sh)0
-rwxr-xr-xthird_party/git/t/t2106-update-index-assume-unchanged.sh (renamed from t/t2106-update-index-assume-unchanged.sh)0
-rwxr-xr-xthird_party/git/t/t2107-update-index-basic.sh (renamed from t/t2107-update-index-basic.sh)0
-rwxr-xr-xthird_party/git/t/t2200-add-update.sh (renamed from t/t2200-add-update.sh)0
-rwxr-xr-xthird_party/git/t/t2201-add-update-typechange.sh (renamed from t/t2201-add-update-typechange.sh)0
-rwxr-xr-xthird_party/git/t/t2202-add-addremove.sh (renamed from t/t2202-add-addremove.sh)0
-rwxr-xr-xthird_party/git/t/t2203-add-intent.sh (renamed from t/t2203-add-intent.sh)0
-rwxr-xr-xthird_party/git/t/t2204-add-ignored.sh (renamed from t/t2204-add-ignored.sh)0
-rwxr-xr-xthird_party/git/t/t2300-cd-to-toplevel.sh (renamed from t/t2300-cd-to-toplevel.sh)0
-rwxr-xr-xthird_party/git/t/t2400-worktree-add.sh (renamed from t/t2400-worktree-add.sh)0
-rwxr-xr-xthird_party/git/t/t2401-worktree-prune.sh (renamed from t/t2401-worktree-prune.sh)0
-rwxr-xr-xthird_party/git/t/t2402-worktree-list.sh (renamed from t/t2402-worktree-list.sh)0
-rwxr-xr-xthird_party/git/t/t2403-worktree-move.sh (renamed from t/t2403-worktree-move.sh)0
-rwxr-xr-xthird_party/git/t/t2404-worktree-config.sh (renamed from t/t2404-worktree-config.sh)0
-rwxr-xr-xthird_party/git/t/t3000-ls-files-others.sh (renamed from t/t3000-ls-files-others.sh)0
-rwxr-xr-xthird_party/git/t/t3001-ls-files-others-exclude.sh (renamed from t/t3001-ls-files-others-exclude.sh)0
-rwxr-xr-xthird_party/git/t/t3002-ls-files-dashpath.sh (renamed from t/t3002-ls-files-dashpath.sh)0
-rwxr-xr-xthird_party/git/t/t3003-ls-files-exclude.sh (renamed from t/t3003-ls-files-exclude.sh)0
-rwxr-xr-xthird_party/git/t/t3004-ls-files-basic.sh (renamed from t/t3004-ls-files-basic.sh)0
-rwxr-xr-xthird_party/git/t/t3005-ls-files-relative.sh (renamed from t/t3005-ls-files-relative.sh)0
-rwxr-xr-xthird_party/git/t/t3006-ls-files-long.sh (renamed from t/t3006-ls-files-long.sh)0
-rwxr-xr-xthird_party/git/t/t3007-ls-files-recurse-submodules.sh (renamed from t/t3007-ls-files-recurse-submodules.sh)0
-rwxr-xr-xthird_party/git/t/t3008-ls-files-lazy-init-name-hash.sh (renamed from t/t3008-ls-files-lazy-init-name-hash.sh)0
-rwxr-xr-xthird_party/git/t/t3009-ls-files-others-nonsubmodule.sh (renamed from t/t3009-ls-files-others-nonsubmodule.sh)0
-rwxr-xr-xthird_party/git/t/t3010-ls-files-killed-modified.sh (renamed from t/t3010-ls-files-killed-modified.sh)0
-rwxr-xr-xthird_party/git/t/t3020-ls-files-error-unmatch.sh (renamed from t/t3020-ls-files-error-unmatch.sh)0
-rwxr-xr-xthird_party/git/t/t3030-merge-recursive.sh (renamed from t/t3030-merge-recursive.sh)0
-rwxr-xr-xthird_party/git/t/t3031-merge-criscross.sh (renamed from t/t3031-merge-criscross.sh)0
-rwxr-xr-xthird_party/git/t/t3032-merge-recursive-space-options.sh (renamed from t/t3032-merge-recursive-space-options.sh)0
-rwxr-xr-xthird_party/git/t/t3033-merge-toplevel.sh (renamed from t/t3033-merge-toplevel.sh)0
-rwxr-xr-xthird_party/git/t/t3034-merge-recursive-rename-options.sh (renamed from t/t3034-merge-recursive-rename-options.sh)0
-rwxr-xr-xthird_party/git/t/t3035-merge-sparse.sh (renamed from t/t3035-merge-sparse.sh)0
-rwxr-xr-xthird_party/git/t/t3040-subprojects-basic.sh (renamed from t/t3040-subprojects-basic.sh)0
-rwxr-xr-xthird_party/git/t/t3050-subprojects-fetch.sh (renamed from t/t3050-subprojects-fetch.sh)0
-rwxr-xr-xthird_party/git/t/t3060-ls-files-with-tree.sh (renamed from t/t3060-ls-files-with-tree.sh)0
-rwxr-xr-xthird_party/git/t/t3070-wildmatch.sh (renamed from t/t3070-wildmatch.sh)0
-rwxr-xr-xthird_party/git/t/t3100-ls-tree-restrict.sh (renamed from t/t3100-ls-tree-restrict.sh)0
-rwxr-xr-xthird_party/git/t/t3101-ls-tree-dirname.sh (renamed from t/t3101-ls-tree-dirname.sh)0
-rwxr-xr-xthird_party/git/t/t3102-ls-tree-wildcards.sh (renamed from t/t3102-ls-tree-wildcards.sh)0
-rwxr-xr-xthird_party/git/t/t3103-ls-tree-misc.sh (renamed from t/t3103-ls-tree-misc.sh)0
-rwxr-xr-xthird_party/git/t/t3200-branch.sh (renamed from t/t3200-branch.sh)0
-rwxr-xr-xthird_party/git/t/t3201-branch-contains.sh (renamed from t/t3201-branch-contains.sh)0
-rwxr-xr-xthird_party/git/t/t3202-show-branch-octopus.sh (renamed from t/t3202-show-branch-octopus.sh)0
-rwxr-xr-xthird_party/git/t/t3203-branch-output.sh (renamed from t/t3203-branch-output.sh)0
-rwxr-xr-xthird_party/git/t/t3204-branch-name-interpretation.sh (renamed from t/t3204-branch-name-interpretation.sh)0
-rwxr-xr-xthird_party/git/t/t3205-branch-color.sh (renamed from t/t3205-branch-color.sh)0
-rwxr-xr-xthird_party/git/t/t3206-range-diff.sh (renamed from t/t3206-range-diff.sh)0
-rw-r--r--third_party/git/t/t3206/history.export (renamed from t/t3206/history.export)0
-rwxr-xr-xthird_party/git/t/t3210-pack-refs.sh (renamed from t/t3210-pack-refs.sh)0
-rwxr-xr-xthird_party/git/t/t3211-peel-ref.sh (renamed from t/t3211-peel-ref.sh)0
-rwxr-xr-xthird_party/git/t/t3300-funny-names.sh (renamed from t/t3300-funny-names.sh)0
-rwxr-xr-xthird_party/git/t/t3301-notes.sh (renamed from t/t3301-notes.sh)0
-rwxr-xr-xthird_party/git/t/t3302-notes-index-expensive.sh (renamed from t/t3302-notes-index-expensive.sh)0
-rwxr-xr-xthird_party/git/t/t3303-notes-subtrees.sh (renamed from t/t3303-notes-subtrees.sh)0
-rwxr-xr-xthird_party/git/t/t3304-notes-mixed.sh (renamed from t/t3304-notes-mixed.sh)0
-rwxr-xr-xthird_party/git/t/t3305-notes-fanout.sh (renamed from t/t3305-notes-fanout.sh)0
-rwxr-xr-xthird_party/git/t/t3306-notes-prune.sh (renamed from t/t3306-notes-prune.sh)0
-rwxr-xr-xthird_party/git/t/t3307-notes-man.sh (renamed from t/t3307-notes-man.sh)0
-rwxr-xr-xthird_party/git/t/t3308-notes-merge.sh (renamed from t/t3308-notes-merge.sh)0
-rwxr-xr-xthird_party/git/t/t3309-notes-merge-auto-resolve.sh (renamed from t/t3309-notes-merge-auto-resolve.sh)0
-rwxr-xr-xthird_party/git/t/t3310-notes-merge-manual-resolve.sh (renamed from t/t3310-notes-merge-manual-resolve.sh)0
-rwxr-xr-xthird_party/git/t/t3311-notes-merge-fanout.sh (renamed from t/t3311-notes-merge-fanout.sh)0
-rwxr-xr-xthird_party/git/t/t3320-notes-merge-worktrees.sh (renamed from t/t3320-notes-merge-worktrees.sh)0
-rwxr-xr-xthird_party/git/t/t3400-rebase.sh (renamed from t/t3400-rebase.sh)0
-rwxr-xr-xthird_party/git/t/t3401-rebase-and-am-rename.sh (renamed from t/t3401-rebase-and-am-rename.sh)0
-rwxr-xr-xthird_party/git/t/t3402-rebase-merge.sh (renamed from t/t3402-rebase-merge.sh)0
-rwxr-xr-xthird_party/git/t/t3403-rebase-skip.sh (renamed from t/t3403-rebase-skip.sh)0
-rwxr-xr-xthird_party/git/t/t3404-rebase-interactive.sh (renamed from t/t3404-rebase-interactive.sh)0
-rwxr-xr-xthird_party/git/t/t3405-rebase-malformed.sh (renamed from t/t3405-rebase-malformed.sh)0
-rwxr-xr-xthird_party/git/t/t3406-rebase-message.sh (renamed from t/t3406-rebase-message.sh)0
-rwxr-xr-xthird_party/git/t/t3407-rebase-abort.sh (renamed from t/t3407-rebase-abort.sh)0
-rwxr-xr-xthird_party/git/t/t3408-rebase-multi-line.sh (renamed from t/t3408-rebase-multi-line.sh)0
-rwxr-xr-xthird_party/git/t/t3409-rebase-preserve-merges.sh (renamed from t/t3409-rebase-preserve-merges.sh)0
-rwxr-xr-xthird_party/git/t/t3410-rebase-preserve-dropped-merges.sh (renamed from t/t3410-rebase-preserve-dropped-merges.sh)0
-rwxr-xr-xthird_party/git/t/t3411-rebase-preserve-around-merges.sh (renamed from t/t3411-rebase-preserve-around-merges.sh)0
-rwxr-xr-xthird_party/git/t/t3412-rebase-root.sh (renamed from t/t3412-rebase-root.sh)0
-rwxr-xr-xthird_party/git/t/t3413-rebase-hook.sh (renamed from t/t3413-rebase-hook.sh)0
-rwxr-xr-xthird_party/git/t/t3414-rebase-preserve-onto.sh (renamed from t/t3414-rebase-preserve-onto.sh)0
-rwxr-xr-xthird_party/git/t/t3415-rebase-autosquash.sh (renamed from t/t3415-rebase-autosquash.sh)0
-rwxr-xr-xthird_party/git/t/t3416-rebase-onto-threedots.sh (renamed from t/t3416-rebase-onto-threedots.sh)0
-rwxr-xr-xthird_party/git/t/t3417-rebase-whitespace-fix.sh (renamed from t/t3417-rebase-whitespace-fix.sh)0
-rwxr-xr-xthird_party/git/t/t3418-rebase-continue.sh (renamed from t/t3418-rebase-continue.sh)0
-rwxr-xr-xthird_party/git/t/t3419-rebase-patch-id.sh (renamed from t/t3419-rebase-patch-id.sh)0
-rwxr-xr-xthird_party/git/t/t3420-rebase-autostash.sh (renamed from t/t3420-rebase-autostash.sh)0
-rwxr-xr-xthird_party/git/t/t3421-rebase-topology-linear.sh (renamed from t/t3421-rebase-topology-linear.sh)0
-rwxr-xr-xthird_party/git/t/t3422-rebase-incompatible-options.sh (renamed from t/t3422-rebase-incompatible-options.sh)0
-rwxr-xr-xthird_party/git/t/t3423-rebase-reword.sh (renamed from t/t3423-rebase-reword.sh)0
-rwxr-xr-xthird_party/git/t/t3425-rebase-topology-merges.sh (renamed from t/t3425-rebase-topology-merges.sh)0
-rwxr-xr-xthird_party/git/t/t3426-rebase-submodule.sh (renamed from t/t3426-rebase-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t3427-rebase-subtree.sh (renamed from t/t3427-rebase-subtree.sh)0
-rwxr-xr-xthird_party/git/t/t3428-rebase-signoff.sh (renamed from t/t3428-rebase-signoff.sh)0
-rwxr-xr-xthird_party/git/t/t3429-rebase-edit-todo.sh (renamed from t/t3429-rebase-edit-todo.sh)0
-rwxr-xr-xthird_party/git/t/t3430-rebase-merges.sh (renamed from t/t3430-rebase-merges.sh)0
-rwxr-xr-xthird_party/git/t/t3500-cherry.sh (renamed from t/t3500-cherry.sh)0
-rwxr-xr-xthird_party/git/t/t3501-revert-cherry-pick.sh (renamed from t/t3501-revert-cherry-pick.sh)0
-rwxr-xr-xthird_party/git/t/t3502-cherry-pick-merge.sh (renamed from t/t3502-cherry-pick-merge.sh)0
-rwxr-xr-xthird_party/git/t/t3503-cherry-pick-root.sh (renamed from t/t3503-cherry-pick-root.sh)0
-rwxr-xr-xthird_party/git/t/t3504-cherry-pick-rerere.sh (renamed from t/t3504-cherry-pick-rerere.sh)0
-rwxr-xr-xthird_party/git/t/t3505-cherry-pick-empty.sh (renamed from t/t3505-cherry-pick-empty.sh)0
-rwxr-xr-xthird_party/git/t/t3506-cherry-pick-ff.sh (renamed from t/t3506-cherry-pick-ff.sh)0
-rwxr-xr-xthird_party/git/t/t3507-cherry-pick-conflict.sh (renamed from t/t3507-cherry-pick-conflict.sh)0
-rwxr-xr-xthird_party/git/t/t3508-cherry-pick-many-commits.sh (renamed from t/t3508-cherry-pick-many-commits.sh)0
-rwxr-xr-xthird_party/git/t/t3509-cherry-pick-merge-df.sh (renamed from t/t3509-cherry-pick-merge-df.sh)0
-rwxr-xr-xthird_party/git/t/t3510-cherry-pick-sequence.sh (renamed from t/t3510-cherry-pick-sequence.sh)0
-rwxr-xr-xthird_party/git/t/t3511-cherry-pick-x.sh (renamed from t/t3511-cherry-pick-x.sh)0
-rwxr-xr-xthird_party/git/t/t3512-cherry-pick-submodule.sh (renamed from t/t3512-cherry-pick-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t3513-revert-submodule.sh (renamed from t/t3513-revert-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t3600-rm.sh (renamed from t/t3600-rm.sh)0
-rwxr-xr-xthird_party/git/t/t3700-add.sh (renamed from t/t3700-add.sh)0
-rwxr-xr-xthird_party/git/t/t3701-add-interactive.sh (renamed from t/t3701-add-interactive.sh)0
-rwxr-xr-xthird_party/git/t/t3702-add-edit.sh (renamed from t/t3702-add-edit.sh)0
-rwxr-xr-xthird_party/git/t/t3703-add-magic-pathspec.sh (renamed from t/t3703-add-magic-pathspec.sh)0
-rwxr-xr-xthird_party/git/t/t3800-mktag.sh (renamed from t/t3800-mktag.sh)0
-rwxr-xr-xthird_party/git/t/t3900-i18n-commit.sh (renamed from t/t3900-i18n-commit.sh)0
-rw-r--r--third_party/git/t/t3900/1-UTF-8.txt (renamed from t/t3900/1-UTF-8.txt)0
-rw-r--r--third_party/git/t/t3900/2-UTF-8.txt (renamed from t/t3900/2-UTF-8.txt)0
-rw-r--r--third_party/git/t/t3900/ISO-2022-JP.txt (renamed from t/t3900/ISO-2022-JP.txt)0
-rw-r--r--third_party/git/t/t3900/ISO8859-1.txt (renamed from t/t3900/ISO8859-1.txt)0
-rw-r--r--third_party/git/t/t3900/UTF-16.txt (renamed from t/t3900/UTF-16.txt)bin146 -> 146 bytes
-rw-r--r--third_party/git/t/t3900/eucJP.txt (renamed from t/t3900/eucJP.txt)0
-rwxr-xr-xthird_party/git/t/t3901-i18n-patch.sh (renamed from t/t3901-i18n-patch.sh)0
-rwxr-xr-xthird_party/git/t/t3901/8859-1.txt (renamed from t/t3901/8859-1.txt)0
-rwxr-xr-xthird_party/git/t/t3901/utf8.txt (renamed from t/t3901/utf8.txt)0
-rwxr-xr-xthird_party/git/t/t3902-quoted.sh (renamed from t/t3902-quoted.sh)0
-rwxr-xr-xthird_party/git/t/t3903-stash.sh (renamed from t/t3903-stash.sh)0
-rwxr-xr-xthird_party/git/t/t3904-stash-patch.sh (renamed from t/t3904-stash-patch.sh)0
-rwxr-xr-xthird_party/git/t/t3905-stash-include-untracked.sh (renamed from t/t3905-stash-include-untracked.sh)0
-rwxr-xr-xthird_party/git/t/t3906-stash-submodule.sh (renamed from t/t3906-stash-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t3907-stash-show-config.sh (renamed from t/t3907-stash-show-config.sh)0
-rwxr-xr-xthird_party/git/t/t3910-mac-os-precompose.sh (renamed from t/t3910-mac-os-precompose.sh)0
-rwxr-xr-xthird_party/git/t/t4000-diff-format.sh (renamed from t/t4000-diff-format.sh)0
-rwxr-xr-xthird_party/git/t/t4001-diff-rename.sh (renamed from t/t4001-diff-rename.sh)0
-rwxr-xr-xthird_party/git/t/t4002-diff-basic.sh (renamed from t/t4002-diff-basic.sh)0
-rwxr-xr-xthird_party/git/t/t4003-diff-rename-1.sh (renamed from t/t4003-diff-rename-1.sh)0
-rwxr-xr-xthird_party/git/t/t4004-diff-rename-symlink.sh (renamed from t/t4004-diff-rename-symlink.sh)0
-rwxr-xr-xthird_party/git/t/t4005-diff-rename-2.sh (renamed from t/t4005-diff-rename-2.sh)0
-rwxr-xr-xthird_party/git/t/t4006-diff-mode.sh (renamed from t/t4006-diff-mode.sh)0
-rwxr-xr-xthird_party/git/t/t4007-rename-3.sh (renamed from t/t4007-rename-3.sh)0
-rwxr-xr-xthird_party/git/t/t4008-diff-break-rewrite.sh (renamed from t/t4008-diff-break-rewrite.sh)0
-rwxr-xr-xthird_party/git/t/t4009-diff-rename-4.sh (renamed from t/t4009-diff-rename-4.sh)0
-rwxr-xr-xthird_party/git/t/t4010-diff-pathspec.sh (renamed from t/t4010-diff-pathspec.sh)0
-rwxr-xr-xthird_party/git/t/t4011-diff-symlink.sh (renamed from t/t4011-diff-symlink.sh)0
-rwxr-xr-xthird_party/git/t/t4012-diff-binary.sh (renamed from t/t4012-diff-binary.sh)0
-rwxr-xr-xthird_party/git/t/t4013-diff-various.sh (renamed from t/t4013-diff-various.sh)0
-rw-r--r--third_party/git/t/t4013/diff.config_format.subjectprefix_DIFFERENT_PREFIX (renamed from t/t4013/diff.config_format.subjectprefix_DIFFERENT_PREFIX)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_master (renamed from t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_master)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_side (renamed from t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_side)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--cc_--patch-with-stat_master (renamed from t/t4013/diff.diff-tree_--cc_--patch-with-stat_master)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--cc_--shortstat_master (renamed from t/t4013/diff.diff-tree_--cc_--shortstat_master)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--cc_--stat_--summary_master (renamed from t/t4013/diff.diff-tree_--cc_--stat_--summary_master)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--cc_--stat_--summary_side (renamed from t/t4013/diff.diff-tree_--cc_--stat_--summary_side)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--cc_--stat_master (renamed from t/t4013/diff.diff-tree_--cc_--stat_master)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--cc_--summary_REVERSE (renamed from t/t4013/diff.diff-tree_--cc_--summary_REVERSE)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--cc_master (renamed from t/t4013/diff.diff-tree_--cc_master)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--patch-with-raw_initial (renamed from t/t4013/diff.diff-tree_--patch-with-raw_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--patch-with-stat_initial (renamed from t/t4013/diff.diff-tree_--patch-with-stat_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--patch-with-raw_initial (renamed from t/t4013/diff.diff-tree_--pretty=oneline_--patch-with-raw_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--patch-with-stat_initial (renamed from t/t4013/diff.diff-tree_--pretty=oneline_--patch-with-stat_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-raw_initial (renamed from t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-raw_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-stat_initial (renamed from t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-stat_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--root_-p_initial (renamed from t/t4013/diff.diff-tree_--pretty=oneline_--root_-p_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--root_initial (renamed from t/t4013/diff.diff-tree_--pretty=oneline_--root_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_-p_initial (renamed from t/t4013/diff.diff-tree_--pretty=oneline_-p_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_initial (renamed from t/t4013/diff.diff-tree_--pretty=oneline_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--patch-with-raw_initial (renamed from t/t4013/diff.diff-tree_--pretty_--patch-with-raw_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--patch-with-stat_initial (renamed from t/t4013/diff.diff-tree_--pretty_--patch-with-stat_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--patch-with-stat_side (renamed from t/t4013/diff.diff-tree_--pretty_--patch-with-stat_side)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--patch-with-raw_initial (renamed from t/t4013/diff.diff-tree_--pretty_--root_--patch-with-raw_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--patch-with-stat_initial (renamed from t/t4013/diff.diff-tree_--pretty_--root_--patch-with-stat_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--stat_--compact-summary_initial (renamed from t/t4013/diff.diff-tree_--pretty_--root_--stat_--compact-summary_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--stat_--summary_initial (renamed from t/t4013/diff.diff-tree_--pretty_--root_--stat_--summary_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--stat_initial (renamed from t/t4013/diff.diff-tree_--pretty_--root_--stat_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--summary_-r_initial (renamed from t/t4013/diff.diff-tree_--pretty_--root_--summary_-r_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--summary_initial (renamed from t/t4013/diff.diff-tree_--pretty_--root_--summary_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--root_-p_initial (renamed from t/t4013/diff.diff-tree_--pretty_--root_-p_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--root_initial (renamed from t/t4013/diff.diff-tree_--pretty_--root_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--stat_--summary_initial (renamed from t/t4013/diff.diff-tree_--pretty_--stat_--summary_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--stat_initial (renamed from t/t4013/diff.diff-tree_--pretty_--stat_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_--summary_initial (renamed from t/t4013/diff.diff-tree_--pretty_--summary_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_-R_--root_--stat_--compact-summary_initial (renamed from t/t4013/diff.diff-tree_--pretty_-R_--root_--stat_--compact-summary_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_-p_initial (renamed from t/t4013/diff.diff-tree_--pretty_-p_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_-p_side (renamed from t/t4013/diff.diff-tree_--pretty_-p_side)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_initial (renamed from t/t4013/diff.diff-tree_--pretty_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--pretty_side (renamed from t/t4013/diff.diff-tree_--pretty_side)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--root_--abbrev_initial (renamed from t/t4013/diff.diff-tree_--root_--abbrev_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--root_--patch-with-raw_initial (renamed from t/t4013/diff.diff-tree_--root_--patch-with-raw_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--root_--patch-with-stat_initial (renamed from t/t4013/diff.diff-tree_--root_--patch-with-stat_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--root_-p_initial (renamed from t/t4013/diff.diff-tree_--root_-p_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--root_-r_--abbrev=4_initial (renamed from t/t4013/diff.diff-tree_--root_-r_--abbrev=4_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--root_-r_--abbrev_initial (renamed from t/t4013/diff.diff-tree_--root_-r_--abbrev_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--root_-r_initial (renamed from t/t4013/diff.diff-tree_--root_-r_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--root_initial (renamed from t/t4013/diff.diff-tree_--root_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--stat_--compact-summary_initial_mode (renamed from t/t4013/diff.diff-tree_--stat_--compact-summary_initial_mode)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--stat_initial_mode (renamed from t/t4013/diff.diff-tree_--stat_initial_mode)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_--summary_initial_mode (renamed from t/t4013/diff.diff-tree_--summary_initial_mode)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_-R_--stat_--compact-summary_initial_mode (renamed from t/t4013/diff.diff-tree_-R_--stat_--compact-summary_initial_mode)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_-c_--abbrev_master (renamed from t/t4013/diff.diff-tree_-c_--abbrev_master)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_-c_--stat_--summary_master (renamed from t/t4013/diff.diff-tree_-c_--stat_--summary_master)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_-c_--stat_--summary_side (renamed from t/t4013/diff.diff-tree_-c_--stat_--summary_side)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_-c_--stat_master (renamed from t/t4013/diff.diff-tree_-c_--stat_master)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_-c_master (renamed from t/t4013/diff.diff-tree_-c_master)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_-p_-m_master (renamed from t/t4013/diff.diff-tree_-p_-m_master)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_-p_initial (renamed from t/t4013/diff.diff-tree_-p_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_-p_master (renamed from t/t4013/diff.diff-tree_-p_master)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_-r_--abbrev=4_initial (renamed from t/t4013/diff.diff-tree_-r_--abbrev=4_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_-r_--abbrev_initial (renamed from t/t4013/diff.diff-tree_-r_--abbrev_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_-r_initial (renamed from t/t4013/diff.diff-tree_-r_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_initial (renamed from t/t4013/diff.diff-tree_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_initial_mode (renamed from t/t4013/diff.diff-tree_initial_mode)0
-rw-r--r--third_party/git/t/t4013/diff.diff-tree_master (renamed from t/t4013/diff.diff-tree_master)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--abbrev_initial..side (renamed from t/t4013/diff.diff_--abbrev_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--cached (renamed from t/t4013/diff.diff_--cached)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--cached_--_file0 (renamed from t/t4013/diff.diff_--cached_--_file0)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--dirstat-by-file_initial_rearrange (renamed from t/t4013/diff.diff_--dirstat-by-file_initial_rearrange)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--dirstat_--cc_master~1_master (renamed from t/t4013/diff.diff_--dirstat_--cc_master~1_master)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--dirstat_initial_rearrange (renamed from t/t4013/diff.diff_--dirstat_initial_rearrange)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--dirstat_master~1_master~2 (renamed from t/t4013/diff.diff_--dirstat_master~1_master~2)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--line-prefix=abc_master_master^_side (renamed from t/t4013/diff.diff_--line-prefix=abc_master_master^_side)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--line-prefix_--cached_--_file0 (renamed from t/t4013/diff.diff_--line-prefix_--cached_--_file0)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--name-status_dir2_dir (renamed from t/t4013/diff.diff_--name-status_dir2_dir)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--no-index_--name-status_--_dir2_dir (renamed from t/t4013/diff.diff_--no-index_--name-status_--_dir2_dir)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--no-index_--name-status_dir2_dir (renamed from t/t4013/diff.diff_--no-index_--name-status_dir2_dir)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--no-index_--raw_--abbrev=4_dir2_dir (renamed from t/t4013/diff.diff_--no-index_--raw_--abbrev=4_dir2_dir)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--no-index_--raw_--no-abbrev_dir2_dir (renamed from t/t4013/diff.diff_--no-index_--raw_--no-abbrev_dir2_dir)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--no-index_--raw_dir2_dir (renamed from t/t4013/diff.diff_--no-index_--raw_dir2_dir)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--no-index_dir_dir3 (renamed from t/t4013/diff.diff_--no-index_dir_dir3)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--patch-with-raw_-r_initial..side (renamed from t/t4013/diff.diff_--patch-with-raw_-r_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--patch-with-raw_initial..side (renamed from t/t4013/diff.diff_--patch-with-raw_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--patch-with-stat_-r_initial..side (renamed from t/t4013/diff.diff_--patch-with-stat_-r_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--patch-with-stat_initial..side (renamed from t/t4013/diff.diff_--patch-with-stat_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--raw_--abbrev=4_initial (renamed from t/t4013/diff.diff_--raw_--abbrev=4_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--raw_--no-abbrev_initial (renamed from t/t4013/diff.diff_--raw_--no-abbrev_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--raw_initial (renamed from t/t4013/diff.diff_--raw_initial)0
-rw-r--r--third_party/git/t/t4013/diff.diff_--stat_initial..side (renamed from t/t4013/diff.diff_--stat_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.diff_-U1_initial..side (renamed from t/t4013/diff.diff_-U1_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.diff_-U2_initial..side (renamed from t/t4013/diff.diff_-U2_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.diff_-U_initial..side (renamed from t/t4013/diff.diff_-U_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.diff_-r_--stat_initial..side (renamed from t/t4013/diff.diff_-r_--stat_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.diff_-r_initial..side (renamed from t/t4013/diff.diff_-r_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.diff_initial..side (renamed from t/t4013/diff.diff_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.diff_master_master^_side (renamed from t/t4013/diff.diff_master_master^_side)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--attach_--stdout_--suffix=.diff_initial..side (renamed from t/t4013/diff.format-patch_--attach_--stdout_--suffix=.diff_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--attach_--stdout_initial..master (renamed from t/t4013/diff.format-patch_--attach_--stdout_initial..master)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--attach_--stdout_initial..master^ (renamed from t/t4013/diff.format-patch_--attach_--stdout_initial..master^)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--attach_--stdout_initial..side (renamed from t/t4013/diff.format-patch_--attach_--stdout_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--inline_--stdout_--numbered-files_initial..master (renamed from t/t4013/diff.format-patch_--inline_--stdout_--numbered-files_initial..master)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--inline_--stdout_--subject-prefix=TESTCASE_initial..master (renamed from t/t4013/diff.format-patch_--inline_--stdout_--subject-prefix=TESTCASE_initial..master)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--inline_--stdout_initial..master (renamed from t/t4013/diff.format-patch_--inline_--stdout_initial..master)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--inline_--stdout_initial..master^ (renamed from t/t4013/diff.format-patch_--inline_--stdout_initial..master^)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--inline_--stdout_initial..master^^ (renamed from t/t4013/diff.format-patch_--inline_--stdout_initial..master^^)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--inline_--stdout_initial..side (renamed from t/t4013/diff.format-patch_--inline_--stdout_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--stdout_--cover-letter_-n_initial..master^ (renamed from t/t4013/diff.format-patch_--stdout_--cover-letter_-n_initial..master^)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--stdout_--no-numbered_initial..master (renamed from t/t4013/diff.format-patch_--stdout_--no-numbered_initial..master)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--stdout_--numbered_initial..master (renamed from t/t4013/diff.format-patch_--stdout_--numbered_initial..master)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--stdout_initial..master (renamed from t/t4013/diff.format-patch_--stdout_initial..master)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--stdout_initial..master^ (renamed from t/t4013/diff.format-patch_--stdout_initial..master^)0
-rw-r--r--third_party/git/t/t4013/diff.format-patch_--stdout_initial..side (renamed from t/t4013/diff.format-patch_--stdout_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.log_--decorate=full_--all (renamed from t/t4013/diff.log_--decorate=full_--all)0
-rw-r--r--third_party/git/t/t4013/diff.log_--decorate_--all (renamed from t/t4013/diff.log_--decorate_--all)0
-rw-r--r--third_party/git/t/t4013/diff.log_--patch-with-stat_--summary_master_--_dir_ (renamed from t/t4013/diff.log_--patch-with-stat_--summary_master_--_dir_)0
-rw-r--r--third_party/git/t/t4013/diff.log_--patch-with-stat_master (renamed from t/t4013/diff.log_--patch-with-stat_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_--patch-with-stat_master_--_dir_ (renamed from t/t4013/diff.log_--patch-with-stat_master_--_dir_)0
-rw-r--r--third_party/git/t/t4013/diff.log_--root_--cc_--patch-with-stat_--summary_master (renamed from t/t4013/diff.log_--root_--cc_--patch-with-stat_--summary_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_--root_--patch-with-stat_--summary_master (renamed from t/t4013/diff.log_--root_--patch-with-stat_--summary_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_--root_--patch-with-stat_master (renamed from t/t4013/diff.log_--root_--patch-with-stat_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_--root_-c_--patch-with-stat_--summary_master (renamed from t/t4013/diff.log_--root_-c_--patch-with-stat_--summary_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_--root_-p_master (renamed from t/t4013/diff.log_--root_-p_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_--root_master (renamed from t/t4013/diff.log_--root_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_-GF_-p_--pickaxe-all_master (renamed from t/t4013/diff.log_-GF_-p_--pickaxe-all_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_-GF_-p_master (renamed from t/t4013/diff.log_-GF_-p_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_-GF_master (renamed from t/t4013/diff.log_-GF_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_-SF_-p_master (renamed from t/t4013/diff.log_-SF_-p_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_-SF_master (renamed from t/t4013/diff.log_-SF_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_-SF_master_--max-count=0 (renamed from t/t4013/diff.log_-SF_master_--max-count=0)0
-rw-r--r--third_party/git/t/t4013/diff.log_-SF_master_--max-count=1 (renamed from t/t4013/diff.log_-SF_master_--max-count=1)0
-rw-r--r--third_party/git/t/t4013/diff.log_-SF_master_--max-count=2 (renamed from t/t4013/diff.log_-SF_master_--max-count=2)0
-rw-r--r--third_party/git/t/t4013/diff.log_-S_F_master (renamed from t/t4013/diff.log_-S_F_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_-m_-p_--first-parent_master (renamed from t/t4013/diff.log_-m_-p_--first-parent_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_-m_-p_master (renamed from t/t4013/diff.log_-m_-p_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_-p_--first-parent_master (renamed from t/t4013/diff.log_-p_--first-parent_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_-p_master (renamed from t/t4013/diff.log_-p_master)0
-rw-r--r--third_party/git/t/t4013/diff.log_master (renamed from t/t4013/diff.log_master)0
-rw-r--r--third_party/git/t/t4013/diff.noellipses-diff-tree_--root_--abbrev_initial (renamed from t/t4013/diff.noellipses-diff-tree_--root_--abbrev_initial)0
-rw-r--r--third_party/git/t/t4013/diff.noellipses-diff-tree_--root_-r_--abbrev=4_initial (renamed from t/t4013/diff.noellipses-diff-tree_--root_-r_--abbrev=4_initial)0
-rw-r--r--third_party/git/t/t4013/diff.noellipses-diff-tree_--root_-r_--abbrev_initial (renamed from t/t4013/diff.noellipses-diff-tree_--root_-r_--abbrev_initial)0
-rw-r--r--third_party/git/t/t4013/diff.noellipses-diff-tree_-c_--abbrev_master (renamed from t/t4013/diff.noellipses-diff-tree_-c_--abbrev_master)0
-rw-r--r--third_party/git/t/t4013/diff.noellipses-diff_--no-index_--raw_--abbrev=4_dir2_dir (renamed from t/t4013/diff.noellipses-diff_--no-index_--raw_--abbrev=4_dir2_dir)0
-rw-r--r--third_party/git/t/t4013/diff.noellipses-diff_--no-index_--raw_dir2_dir (renamed from t/t4013/diff.noellipses-diff_--no-index_--raw_dir2_dir)0
-rw-r--r--third_party/git/t/t4013/diff.noellipses-diff_--patch-with-raw_-r_initial..side (renamed from t/t4013/diff.noellipses-diff_--patch-with-raw_-r_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.noellipses-diff_--patch-with-raw_initial..side (renamed from t/t4013/diff.noellipses-diff_--patch-with-raw_initial..side)0
-rw-r--r--third_party/git/t/t4013/diff.noellipses-diff_--raw_--abbrev=4_initial (renamed from t/t4013/diff.noellipses-diff_--raw_--abbrev=4_initial)0
-rw-r--r--third_party/git/t/t4013/diff.noellipses-diff_--raw_initial (renamed from t/t4013/diff.noellipses-diff_--raw_initial)0
-rw-r--r--third_party/git/t/t4013/diff.noellipses-show_--patch-with-raw_side (renamed from t/t4013/diff.noellipses-show_--patch-with-raw_side)0
-rw-r--r--third_party/git/t/t4013/diff.noellipses-whatchanged_--root_master (renamed from t/t4013/diff.noellipses-whatchanged_--root_master)0
-rw-r--r--third_party/git/t/t4013/diff.noellipses-whatchanged_-SF_master (renamed from t/t4013/diff.noellipses-whatchanged_-SF_master)0
-rw-r--r--third_party/git/t/t4013/diff.noellipses-whatchanged_master (renamed from t/t4013/diff.noellipses-whatchanged_master)0
-rw-r--r--third_party/git/t/t4013/diff.rev-list_--children_HEAD (renamed from t/t4013/diff.rev-list_--children_HEAD)0
-rw-r--r--third_party/git/t/t4013/diff.rev-list_--parents_HEAD (renamed from t/t4013/diff.rev-list_--parents_HEAD)0
-rw-r--r--third_party/git/t/t4013/diff.show_--first-parent_master (renamed from t/t4013/diff.show_--first-parent_master)0
-rw-r--r--third_party/git/t/t4013/diff.show_--patch-with-raw_side (renamed from t/t4013/diff.show_--patch-with-raw_side)0
-rw-r--r--third_party/git/t/t4013/diff.show_--patch-with-stat_--summary_side (renamed from t/t4013/diff.show_--patch-with-stat_--summary_side)0
-rw-r--r--third_party/git/t/t4013/diff.show_--patch-with-stat_side (renamed from t/t4013/diff.show_--patch-with-stat_side)0
-rw-r--r--third_party/git/t/t4013/diff.show_--root_initial (renamed from t/t4013/diff.show_--root_initial)0
-rw-r--r--third_party/git/t/t4013/diff.show_--stat_--summary_side (renamed from t/t4013/diff.show_--stat_--summary_side)0
-rw-r--r--third_party/git/t/t4013/diff.show_--stat_side (renamed from t/t4013/diff.show_--stat_side)0
-rw-r--r--third_party/git/t/t4013/diff.show_-c_master (renamed from t/t4013/diff.show_-c_master)0
-rw-r--r--third_party/git/t/t4013/diff.show_-m_master (renamed from t/t4013/diff.show_-m_master)0
-rw-r--r--third_party/git/t/t4013/diff.show_initial (renamed from t/t4013/diff.show_initial)0
-rw-r--r--third_party/git/t/t4013/diff.show_master (renamed from t/t4013/diff.show_master)0
-rw-r--r--third_party/git/t/t4013/diff.show_side (renamed from t/t4013/diff.show_side)0
-rw-r--r--third_party/git/t/t4013/diff.whatchanged_--patch-with-stat_--summary_master_--_dir_ (renamed from t/t4013/diff.whatchanged_--patch-with-stat_--summary_master_--_dir_)0
-rw-r--r--third_party/git/t/t4013/diff.whatchanged_--patch-with-stat_master (renamed from t/t4013/diff.whatchanged_--patch-with-stat_master)0
-rw-r--r--third_party/git/t/t4013/diff.whatchanged_--patch-with-stat_master_--_dir_ (renamed from t/t4013/diff.whatchanged_--patch-with-stat_master_--_dir_)0
-rw-r--r--third_party/git/t/t4013/diff.whatchanged_--root_--cc_--patch-with-stat_--summary_master (renamed from t/t4013/diff.whatchanged_--root_--cc_--patch-with-stat_--summary_master)0
-rw-r--r--third_party/git/t/t4013/diff.whatchanged_--root_--patch-with-stat_--summary_master (renamed from t/t4013/diff.whatchanged_--root_--patch-with-stat_--summary_master)0
-rw-r--r--third_party/git/t/t4013/diff.whatchanged_--root_--patch-with-stat_master (renamed from t/t4013/diff.whatchanged_--root_--patch-with-stat_master)0
-rw-r--r--third_party/git/t/t4013/diff.whatchanged_--root_-c_--patch-with-stat_--summary_master (renamed from t/t4013/diff.whatchanged_--root_-c_--patch-with-stat_--summary_master)0
-rw-r--r--third_party/git/t/t4013/diff.whatchanged_--root_-p_master (renamed from t/t4013/diff.whatchanged_--root_-p_master)0
-rw-r--r--third_party/git/t/t4013/diff.whatchanged_--root_master (renamed from t/t4013/diff.whatchanged_--root_master)0
-rw-r--r--third_party/git/t/t4013/diff.whatchanged_-SF_-p_master (renamed from t/t4013/diff.whatchanged_-SF_-p_master)0
-rw-r--r--third_party/git/t/t4013/diff.whatchanged_-SF_master (renamed from t/t4013/diff.whatchanged_-SF_master)0
-rw-r--r--third_party/git/t/t4013/diff.whatchanged_-p_master (renamed from t/t4013/diff.whatchanged_-p_master)0
-rw-r--r--third_party/git/t/t4013/diff.whatchanged_master (renamed from t/t4013/diff.whatchanged_master)0
-rwxr-xr-xthird_party/git/t/t4014-format-patch.sh (renamed from t/t4014-format-patch.sh)0
-rwxr-xr-xthird_party/git/t/t4015-diff-whitespace.sh (renamed from t/t4015-diff-whitespace.sh)0
-rwxr-xr-xthird_party/git/t/t4016-diff-quote.sh (renamed from t/t4016-diff-quote.sh)0
-rwxr-xr-xthird_party/git/t/t4017-diff-retval.sh (renamed from t/t4017-diff-retval.sh)0
-rwxr-xr-xthird_party/git/t/t4018-diff-funcname.sh (renamed from t/t4018-diff-funcname.sh)0
-rw-r--r--third_party/git/t/t4018/README (renamed from t/t4018/README)0
-rw-r--r--third_party/git/t/t4018/cpp-c++-function (renamed from t/t4018/cpp-c++-function)0
-rw-r--r--third_party/git/t/t4018/cpp-class-constructor (renamed from t/t4018/cpp-class-constructor)0
-rw-r--r--third_party/git/t/t4018/cpp-class-constructor-mem-init (renamed from t/t4018/cpp-class-constructor-mem-init)0
-rw-r--r--third_party/git/t/t4018/cpp-class-definition (renamed from t/t4018/cpp-class-definition)0
-rw-r--r--third_party/git/t/t4018/cpp-class-definition-derived (renamed from t/t4018/cpp-class-definition-derived)0
-rw-r--r--third_party/git/t/t4018/cpp-class-destructor (renamed from t/t4018/cpp-class-destructor)0
-rw-r--r--third_party/git/t/t4018/cpp-function-returning-global-type (renamed from t/t4018/cpp-function-returning-global-type)0
-rw-r--r--third_party/git/t/t4018/cpp-function-returning-nested (renamed from t/t4018/cpp-function-returning-nested)0
-rw-r--r--third_party/git/t/t4018/cpp-function-returning-pointer (renamed from t/t4018/cpp-function-returning-pointer)0
-rw-r--r--third_party/git/t/t4018/cpp-function-returning-reference (renamed from t/t4018/cpp-function-returning-reference)0
-rw-r--r--third_party/git/t/t4018/cpp-gnu-style-function (renamed from t/t4018/cpp-gnu-style-function)0
-rw-r--r--third_party/git/t/t4018/cpp-namespace-definition (renamed from t/t4018/cpp-namespace-definition)0
-rw-r--r--third_party/git/t/t4018/cpp-operator-definition (renamed from t/t4018/cpp-operator-definition)0
-rw-r--r--third_party/git/t/t4018/cpp-skip-access-specifiers (renamed from t/t4018/cpp-skip-access-specifiers)0
-rw-r--r--third_party/git/t/t4018/cpp-skip-comment-block (renamed from t/t4018/cpp-skip-comment-block)0
-rw-r--r--third_party/git/t/t4018/cpp-skip-labels (renamed from t/t4018/cpp-skip-labels)0
-rw-r--r--third_party/git/t/t4018/cpp-struct-definition (renamed from t/t4018/cpp-struct-definition)0
-rw-r--r--third_party/git/t/t4018/cpp-struct-single-line (renamed from t/t4018/cpp-struct-single-line)0
-rw-r--r--third_party/git/t/t4018/cpp-template-function-definition (renamed from t/t4018/cpp-template-function-definition)0
-rw-r--r--third_party/git/t/t4018/cpp-union-definition (renamed from t/t4018/cpp-union-definition)0
-rw-r--r--third_party/git/t/t4018/cpp-void-c-function (renamed from t/t4018/cpp-void-c-function)0
-rw-r--r--third_party/git/t/t4018/css-brace-in-col-1 (renamed from t/t4018/css-brace-in-col-1)0
-rw-r--r--third_party/git/t/t4018/css-colon-eol (renamed from t/t4018/css-colon-eol)0
-rw-r--r--third_party/git/t/t4018/css-colon-selector (renamed from t/t4018/css-colon-selector)0
-rw-r--r--third_party/git/t/t4018/css-common (renamed from t/t4018/css-common)0
-rw-r--r--third_party/git/t/t4018/css-long-selector-list (renamed from t/t4018/css-long-selector-list)0
-rw-r--r--third_party/git/t/t4018/css-prop-sans-indent (renamed from t/t4018/css-prop-sans-indent)0
-rw-r--r--third_party/git/t/t4018/css-short-selector-list (renamed from t/t4018/css-short-selector-list)0
-rw-r--r--third_party/git/t/t4018/css-trailing-space (renamed from t/t4018/css-trailing-space)0
-rw-r--r--third_party/git/t/t4018/custom1-pattern (renamed from t/t4018/custom1-pattern)0
-rw-r--r--third_party/git/t/t4018/custom2-match-to-end-of-line (renamed from t/t4018/custom2-match-to-end-of-line)0
-rw-r--r--third_party/git/t/t4018/custom3-alternation-in-pattern (renamed from t/t4018/custom3-alternation-in-pattern)0
-rw-r--r--third_party/git/t/t4018/fountain-scene (renamed from t/t4018/fountain-scene)0
-rw-r--r--third_party/git/t/t4018/golang-complex-function (renamed from t/t4018/golang-complex-function)0
-rw-r--r--third_party/git/t/t4018/golang-func (renamed from t/t4018/golang-func)0
-rw-r--r--third_party/git/t/t4018/golang-interface (renamed from t/t4018/golang-interface)0
-rw-r--r--third_party/git/t/t4018/golang-long-func (renamed from t/t4018/golang-long-func)0
-rw-r--r--third_party/git/t/t4018/golang-struct (renamed from t/t4018/golang-struct)0
-rw-r--r--third_party/git/t/t4018/java-class-member-function (renamed from t/t4018/java-class-member-function)0
-rw-r--r--third_party/git/t/t4018/matlab-class-definition (renamed from t/t4018/matlab-class-definition)0
-rw-r--r--third_party/git/t/t4018/matlab-function (renamed from t/t4018/matlab-function)0
-rw-r--r--third_party/git/t/t4018/matlab-octave-section-1 (renamed from t/t4018/matlab-octave-section-1)0
-rw-r--r--third_party/git/t/t4018/matlab-octave-section-2 (renamed from t/t4018/matlab-octave-section-2)0
-rw-r--r--third_party/git/t/t4018/matlab-section (renamed from t/t4018/matlab-section)0
-rw-r--r--third_party/git/t/t4018/perl-skip-end-of-heredoc (renamed from t/t4018/perl-skip-end-of-heredoc)0
-rw-r--r--third_party/git/t/t4018/perl-skip-forward-decl (renamed from t/t4018/perl-skip-forward-decl)0
-rw-r--r--third_party/git/t/t4018/perl-skip-sub-in-pod (renamed from t/t4018/perl-skip-sub-in-pod)0
-rw-r--r--third_party/git/t/t4018/perl-sub-definition (renamed from t/t4018/perl-sub-definition)0
-rw-r--r--third_party/git/t/t4018/perl-sub-definition-kr-brace (renamed from t/t4018/perl-sub-definition-kr-brace)0
-rw-r--r--third_party/git/t/t4018/php-abstract-class (renamed from t/t4018/php-abstract-class)0
-rw-r--r--third_party/git/t/t4018/php-class (renamed from t/t4018/php-class)0
-rw-r--r--third_party/git/t/t4018/php-final-class (renamed from t/t4018/php-final-class)0
-rw-r--r--third_party/git/t/t4018/php-function (renamed from t/t4018/php-function)0
-rw-r--r--third_party/git/t/t4018/php-interface (renamed from t/t4018/php-interface)0
-rw-r--r--third_party/git/t/t4018/php-method (renamed from t/t4018/php-method)0
-rw-r--r--third_party/git/t/t4018/php-trait (renamed from t/t4018/php-trait)0
-rw-r--r--third_party/git/t/t4018/rust-fn (renamed from t/t4018/rust-fn)0
-rw-r--r--third_party/git/t/t4018/rust-impl (renamed from t/t4018/rust-impl)0
-rw-r--r--third_party/git/t/t4018/rust-struct (renamed from t/t4018/rust-struct)0
-rw-r--r--third_party/git/t/t4018/rust-trait (renamed from t/t4018/rust-trait)0
-rwxr-xr-xthird_party/git/t/t4019-diff-wserror.sh (renamed from t/t4019-diff-wserror.sh)0
-rwxr-xr-xthird_party/git/t/t4020-diff-external.sh (renamed from t/t4020-diff-external.sh)0
-rw-r--r--third_party/git/t/t4020/diff.NUL (renamed from t/t4020/diff.NUL)bin116 -> 116 bytes
-rwxr-xr-xthird_party/git/t/t4021-format-patch-numbered.sh (renamed from t/t4021-format-patch-numbered.sh)0
-rwxr-xr-xthird_party/git/t/t4022-diff-rewrite.sh (renamed from t/t4022-diff-rewrite.sh)0
-rwxr-xr-xthird_party/git/t/t4023-diff-rename-typechange.sh (renamed from t/t4023-diff-rename-typechange.sh)0
-rwxr-xr-xthird_party/git/t/t4024-diff-optimize-common.sh (renamed from t/t4024-diff-optimize-common.sh)0
-rwxr-xr-xthird_party/git/t/t4025-hunk-header.sh (renamed from t/t4025-hunk-header.sh)0
-rwxr-xr-xthird_party/git/t/t4026-color.sh (renamed from t/t4026-color.sh)0
-rwxr-xr-xthird_party/git/t/t4027-diff-submodule.sh (renamed from t/t4027-diff-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t4028-format-patch-mime-headers.sh (renamed from t/t4028-format-patch-mime-headers.sh)0
-rwxr-xr-xthird_party/git/t/t4029-diff-trailing-space.sh (renamed from t/t4029-diff-trailing-space.sh)0
-rwxr-xr-xthird_party/git/t/t4030-diff-textconv.sh (renamed from t/t4030-diff-textconv.sh)0
-rwxr-xr-xthird_party/git/t/t4031-diff-rewrite-binary.sh (renamed from t/t4031-diff-rewrite-binary.sh)0
-rwxr-xr-xthird_party/git/t/t4032-diff-inter-hunk-context.sh (renamed from t/t4032-diff-inter-hunk-context.sh)0
-rwxr-xr-xthird_party/git/t/t4033-diff-patience.sh (renamed from t/t4033-diff-patience.sh)0
-rwxr-xr-xthird_party/git/t/t4034-diff-words.sh (renamed from t/t4034-diff-words.sh)0
-rw-r--r--third_party/git/t/t4034/ada/expect (renamed from t/t4034/ada/expect)0
-rw-r--r--third_party/git/t/t4034/ada/post (renamed from t/t4034/ada/post)0
-rw-r--r--third_party/git/t/t4034/ada/pre (renamed from t/t4034/ada/pre)0
-rw-r--r--third_party/git/t/t4034/bibtex/expect (renamed from t/t4034/bibtex/expect)0
-rw-r--r--third_party/git/t/t4034/bibtex/post (renamed from t/t4034/bibtex/post)0
-rw-r--r--third_party/git/t/t4034/bibtex/pre (renamed from t/t4034/bibtex/pre)0
-rw-r--r--third_party/git/t/t4034/cpp/expect (renamed from t/t4034/cpp/expect)0
-rw-r--r--third_party/git/t/t4034/cpp/post (renamed from t/t4034/cpp/post)0
-rw-r--r--third_party/git/t/t4034/cpp/pre (renamed from t/t4034/cpp/pre)0
-rw-r--r--third_party/git/t/t4034/csharp/expect (renamed from t/t4034/csharp/expect)0
-rw-r--r--third_party/git/t/t4034/csharp/post (renamed from t/t4034/csharp/post)0
-rw-r--r--third_party/git/t/t4034/csharp/pre (renamed from t/t4034/csharp/pre)0
-rw-r--r--third_party/git/t/t4034/css/expect (renamed from t/t4034/css/expect)0
-rw-r--r--third_party/git/t/t4034/css/post (renamed from t/t4034/css/post)0
-rw-r--r--third_party/git/t/t4034/css/pre (renamed from t/t4034/css/pre)0
-rw-r--r--third_party/git/t/t4034/fortran/expect (renamed from t/t4034/fortran/expect)0
-rw-r--r--third_party/git/t/t4034/fortran/post (renamed from t/t4034/fortran/post)0
-rw-r--r--third_party/git/t/t4034/fortran/pre (renamed from t/t4034/fortran/pre)0
-rw-r--r--third_party/git/t/t4034/html/expect (renamed from t/t4034/html/expect)0
-rw-r--r--third_party/git/t/t4034/html/post (renamed from t/t4034/html/post)0
-rw-r--r--third_party/git/t/t4034/html/pre (renamed from t/t4034/html/pre)0
-rw-r--r--third_party/git/t/t4034/java/expect (renamed from t/t4034/java/expect)0
-rw-r--r--third_party/git/t/t4034/java/post (renamed from t/t4034/java/post)0
-rw-r--r--third_party/git/t/t4034/java/pre (renamed from t/t4034/java/pre)0
-rw-r--r--third_party/git/t/t4034/matlab/expect (renamed from t/t4034/matlab/expect)0
-rw-r--r--third_party/git/t/t4034/matlab/post (renamed from t/t4034/matlab/post)0
-rw-r--r--third_party/git/t/t4034/matlab/pre (renamed from t/t4034/matlab/pre)0
-rw-r--r--third_party/git/t/t4034/objc/expect (renamed from t/t4034/objc/expect)0
-rw-r--r--third_party/git/t/t4034/objc/post (renamed from t/t4034/objc/post)0
-rw-r--r--third_party/git/t/t4034/objc/pre (renamed from t/t4034/objc/pre)0
-rw-r--r--third_party/git/t/t4034/pascal/expect (renamed from t/t4034/pascal/expect)0
-rw-r--r--third_party/git/t/t4034/pascal/post (renamed from t/t4034/pascal/post)0
-rw-r--r--third_party/git/t/t4034/pascal/pre (renamed from t/t4034/pascal/pre)0
-rw-r--r--third_party/git/t/t4034/perl/expect (renamed from t/t4034/perl/expect)0
-rw-r--r--third_party/git/t/t4034/perl/post (renamed from t/t4034/perl/post)0
-rw-r--r--third_party/git/t/t4034/perl/pre (renamed from t/t4034/perl/pre)0
-rw-r--r--third_party/git/t/t4034/php/expect (renamed from t/t4034/php/expect)0
-rw-r--r--third_party/git/t/t4034/php/post (renamed from t/t4034/php/post)0
-rw-r--r--third_party/git/t/t4034/php/pre (renamed from t/t4034/php/pre)0
-rw-r--r--third_party/git/t/t4034/python/expect (renamed from t/t4034/python/expect)0
-rw-r--r--third_party/git/t/t4034/python/post (renamed from t/t4034/python/post)0
-rw-r--r--third_party/git/t/t4034/python/pre (renamed from t/t4034/python/pre)0
-rw-r--r--third_party/git/t/t4034/ruby/expect (renamed from t/t4034/ruby/expect)0
-rw-r--r--third_party/git/t/t4034/ruby/post (renamed from t/t4034/ruby/post)0
-rw-r--r--third_party/git/t/t4034/ruby/pre (renamed from t/t4034/ruby/pre)0
-rw-r--r--third_party/git/t/t4034/tex/expect (renamed from t/t4034/tex/expect)0
-rw-r--r--third_party/git/t/t4034/tex/post (renamed from t/t4034/tex/post)0
-rw-r--r--third_party/git/t/t4034/tex/pre (renamed from t/t4034/tex/pre)0
-rwxr-xr-xthird_party/git/t/t4035-diff-quiet.sh (renamed from t/t4035-diff-quiet.sh)0
-rwxr-xr-xthird_party/git/t/t4036-format-patch-signer-mime.sh (renamed from t/t4036-format-patch-signer-mime.sh)0
-rwxr-xr-xthird_party/git/t/t4037-diff-r-t-dirs.sh (renamed from t/t4037-diff-r-t-dirs.sh)0
-rwxr-xr-xthird_party/git/t/t4038-diff-combined.sh (renamed from t/t4038-diff-combined.sh)0
-rwxr-xr-xthird_party/git/t/t4039-diff-assume-unchanged.sh (renamed from t/t4039-diff-assume-unchanged.sh)0
-rwxr-xr-xthird_party/git/t/t4040-whitespace-status.sh (renamed from t/t4040-whitespace-status.sh)0
-rwxr-xr-xthird_party/git/t/t4041-diff-submodule-option.sh (renamed from t/t4041-diff-submodule-option.sh)0
-rwxr-xr-xthird_party/git/t/t4042-diff-textconv-caching.sh (renamed from t/t4042-diff-textconv-caching.sh)0
-rwxr-xr-xthird_party/git/t/t4043-diff-rename-binary.sh (renamed from t/t4043-diff-rename-binary.sh)0
-rwxr-xr-xthird_party/git/t/t4044-diff-index-unique-abbrev.sh (renamed from t/t4044-diff-index-unique-abbrev.sh)0
-rwxr-xr-xthird_party/git/t/t4045-diff-relative.sh (renamed from t/t4045-diff-relative.sh)0
-rwxr-xr-xthird_party/git/t/t4046-diff-unmerged.sh (renamed from t/t4046-diff-unmerged.sh)0
-rwxr-xr-xthird_party/git/t/t4047-diff-dirstat.sh (renamed from t/t4047-diff-dirstat.sh)0
-rwxr-xr-xthird_party/git/t/t4048-diff-combined-binary.sh (renamed from t/t4048-diff-combined-binary.sh)0
-rwxr-xr-xthird_party/git/t/t4049-diff-stat-count.sh (renamed from t/t4049-diff-stat-count.sh)0
-rwxr-xr-xthird_party/git/t/t4050-diff-histogram.sh (renamed from t/t4050-diff-histogram.sh)0
-rwxr-xr-xthird_party/git/t/t4051-diff-function-context.sh (renamed from t/t4051-diff-function-context.sh)0
-rw-r--r--third_party/git/t/t4051/appended1.c (renamed from t/t4051/appended1.c)0
-rw-r--r--third_party/git/t/t4051/appended2.c (renamed from t/t4051/appended2.c)0
-rw-r--r--third_party/git/t/t4051/dummy.c (renamed from t/t4051/dummy.c)0
-rw-r--r--third_party/git/t/t4051/hello.c (renamed from t/t4051/hello.c)0
-rw-r--r--third_party/git/t/t4051/includes.c (renamed from t/t4051/includes.c)0
-rwxr-xr-xthird_party/git/t/t4052-stat-output.sh (renamed from t/t4052-stat-output.sh)0
-rwxr-xr-xthird_party/git/t/t4053-diff-no-index.sh (renamed from t/t4053-diff-no-index.sh)0
-rwxr-xr-xthird_party/git/t/t4054-diff-bogus-tree.sh (renamed from t/t4054-diff-bogus-tree.sh)0
-rwxr-xr-xthird_party/git/t/t4055-diff-context.sh (renamed from t/t4055-diff-context.sh)0
-rwxr-xr-xthird_party/git/t/t4056-diff-order.sh (renamed from t/t4056-diff-order.sh)0
-rwxr-xr-xthird_party/git/t/t4057-diff-combined-paths.sh (renamed from t/t4057-diff-combined-paths.sh)0
-rwxr-xr-xthird_party/git/t/t4058-diff-duplicates.sh (renamed from t/t4058-diff-duplicates.sh)0
-rwxr-xr-xthird_party/git/t/t4059-diff-submodule-not-initialized.sh (renamed from t/t4059-diff-submodule-not-initialized.sh)0
-rwxr-xr-xthird_party/git/t/t4060-diff-submodule-option-diff-format.sh (renamed from t/t4060-diff-submodule-option-diff-format.sh)0
-rwxr-xr-xthird_party/git/t/t4061-diff-indent.sh (renamed from t/t4061-diff-indent.sh)0
-rwxr-xr-xthird_party/git/t/t4062-diff-pickaxe.sh (renamed from t/t4062-diff-pickaxe.sh)0
-rwxr-xr-xthird_party/git/t/t4063-diff-blobs.sh (renamed from t/t4063-diff-blobs.sh)0
-rwxr-xr-xthird_party/git/t/t4064-diff-oidfind.sh (renamed from t/t4064-diff-oidfind.sh)0
-rwxr-xr-xthird_party/git/t/t4065-diff-anchored.sh (renamed from t/t4065-diff-anchored.sh)0
-rwxr-xr-xthird_party/git/t/t4066-diff-emit-delay.sh (renamed from t/t4066-diff-emit-delay.sh)0
-rwxr-xr-xthird_party/git/t/t4067-diff-partial-clone.sh (renamed from t/t4067-diff-partial-clone.sh)0
-rwxr-xr-xthird_party/git/t/t4100-apply-stat.sh (renamed from t/t4100-apply-stat.sh)0
-rw-r--r--third_party/git/t/t4100/t-apply-1.expect (renamed from t/t4100/t-apply-1.expect)0
-rw-r--r--third_party/git/t/t4100/t-apply-1.patch (renamed from t/t4100/t-apply-1.patch)0
-rw-r--r--third_party/git/t/t4100/t-apply-2.expect (renamed from t/t4100/t-apply-2.expect)0
-rw-r--r--third_party/git/t/t4100/t-apply-2.patch (renamed from t/t4100/t-apply-2.patch)0
-rw-r--r--third_party/git/t/t4100/t-apply-3.expect (renamed from t/t4100/t-apply-3.expect)0
-rw-r--r--third_party/git/t/t4100/t-apply-3.patch (renamed from t/t4100/t-apply-3.patch)0
-rw-r--r--third_party/git/t/t4100/t-apply-4.expect (renamed from t/t4100/t-apply-4.expect)0
-rw-r--r--third_party/git/t/t4100/t-apply-4.patch (renamed from t/t4100/t-apply-4.patch)0
-rw-r--r--third_party/git/t/t4100/t-apply-5.expect (renamed from t/t4100/t-apply-5.expect)0
-rw-r--r--third_party/git/t/t4100/t-apply-5.patch (renamed from t/t4100/t-apply-5.patch)0
-rw-r--r--third_party/git/t/t4100/t-apply-6.expect (renamed from t/t4100/t-apply-6.expect)0
-rw-r--r--third_party/git/t/t4100/t-apply-6.patch (renamed from t/t4100/t-apply-6.patch)0
-rw-r--r--third_party/git/t/t4100/t-apply-7.expect (renamed from t/t4100/t-apply-7.expect)0
-rw-r--r--third_party/git/t/t4100/t-apply-7.patch (renamed from t/t4100/t-apply-7.patch)0
-rw-r--r--third_party/git/t/t4100/t-apply-8.expect (renamed from t/t4100/t-apply-8.expect)0
-rw-r--r--third_party/git/t/t4100/t-apply-8.patch (renamed from t/t4100/t-apply-8.patch)0
-rw-r--r--third_party/git/t/t4100/t-apply-9.expect (renamed from t/t4100/t-apply-9.expect)0
-rw-r--r--third_party/git/t/t4100/t-apply-9.patch (renamed from t/t4100/t-apply-9.patch)0
-rwxr-xr-xthird_party/git/t/t4101-apply-nonl.sh (renamed from t/t4101-apply-nonl.sh)0
-rw-r--r--third_party/git/t/t4101/diff.0-1 (renamed from t/t4101/diff.0-1)0
-rw-r--r--third_party/git/t/t4101/diff.0-2 (renamed from t/t4101/diff.0-2)0
-rw-r--r--third_party/git/t/t4101/diff.0-3 (renamed from t/t4101/diff.0-3)0
-rw-r--r--third_party/git/t/t4101/diff.1-0 (renamed from t/t4101/diff.1-0)0
-rw-r--r--third_party/git/t/t4101/diff.1-2 (renamed from t/t4101/diff.1-2)0
-rw-r--r--third_party/git/t/t4101/diff.1-3 (renamed from t/t4101/diff.1-3)0
-rw-r--r--third_party/git/t/t4101/diff.2-0 (renamed from t/t4101/diff.2-0)0
-rw-r--r--third_party/git/t/t4101/diff.2-1 (renamed from t/t4101/diff.2-1)0
-rw-r--r--third_party/git/t/t4101/diff.2-3 (renamed from t/t4101/diff.2-3)0
-rw-r--r--third_party/git/t/t4101/diff.3-0 (renamed from t/t4101/diff.3-0)0
-rw-r--r--third_party/git/t/t4101/diff.3-1 (renamed from t/t4101/diff.3-1)0
-rw-r--r--third_party/git/t/t4101/diff.3-2 (renamed from t/t4101/diff.3-2)0
-rwxr-xr-xthird_party/git/t/t4102-apply-rename.sh (renamed from t/t4102-apply-rename.sh)0
-rwxr-xr-xthird_party/git/t/t4103-apply-binary.sh (renamed from t/t4103-apply-binary.sh)0
-rwxr-xr-xthird_party/git/t/t4104-apply-boundary.sh (renamed from t/t4104-apply-boundary.sh)0
-rwxr-xr-xthird_party/git/t/t4105-apply-fuzz.sh (renamed from t/t4105-apply-fuzz.sh)0
-rwxr-xr-xthird_party/git/t/t4106-apply-stdin.sh (renamed from t/t4106-apply-stdin.sh)0
-rwxr-xr-xthird_party/git/t/t4107-apply-ignore-whitespace.sh (renamed from t/t4107-apply-ignore-whitespace.sh)0
-rwxr-xr-xthird_party/git/t/t4108-apply-threeway.sh (renamed from t/t4108-apply-threeway.sh)0
-rwxr-xr-xthird_party/git/t/t4109-apply-multifrag.sh (renamed from t/t4109-apply-multifrag.sh)0
-rw-r--r--third_party/git/t/t4109/expect-1 (renamed from t/t4109/expect-1)0
-rw-r--r--third_party/git/t/t4109/expect-2 (renamed from t/t4109/expect-2)0
-rw-r--r--third_party/git/t/t4109/expect-3 (renamed from t/t4109/expect-3)0
-rw-r--r--third_party/git/t/t4109/patch1.patch (renamed from t/t4109/patch1.patch)0
-rw-r--r--third_party/git/t/t4109/patch2.patch (renamed from t/t4109/patch2.patch)0
-rw-r--r--third_party/git/t/t4109/patch3.patch (renamed from t/t4109/patch3.patch)0
-rw-r--r--third_party/git/t/t4109/patch4.patch (renamed from t/t4109/patch4.patch)0
-rwxr-xr-xthird_party/git/t/t4110-apply-scan.sh (renamed from t/t4110-apply-scan.sh)0
-rw-r--r--third_party/git/t/t4110/expect (renamed from t/t4110/expect)0
-rw-r--r--third_party/git/t/t4110/patch1.patch (renamed from t/t4110/patch1.patch)0
-rw-r--r--third_party/git/t/t4110/patch2.patch (renamed from t/t4110/patch2.patch)0
-rw-r--r--third_party/git/t/t4110/patch3.patch (renamed from t/t4110/patch3.patch)0
-rw-r--r--third_party/git/t/t4110/patch4.patch (renamed from t/t4110/patch4.patch)0
-rw-r--r--third_party/git/t/t4110/patch5.patch (renamed from t/t4110/patch5.patch)0
-rwxr-xr-xthird_party/git/t/t4111-apply-subdir.sh (renamed from t/t4111-apply-subdir.sh)0
-rwxr-xr-xthird_party/git/t/t4112-apply-renames.sh (renamed from t/t4112-apply-renames.sh)0
-rwxr-xr-xthird_party/git/t/t4113-apply-ending.sh (renamed from t/t4113-apply-ending.sh)0
-rwxr-xr-xthird_party/git/t/t4114-apply-typechange.sh (renamed from t/t4114-apply-typechange.sh)0
-rwxr-xr-xthird_party/git/t/t4115-apply-symlink.sh (renamed from t/t4115-apply-symlink.sh)0
-rwxr-xr-xthird_party/git/t/t4116-apply-reverse.sh (renamed from t/t4116-apply-reverse.sh)0
-rwxr-xr-xthird_party/git/t/t4117-apply-reject.sh (renamed from t/t4117-apply-reject.sh)0
-rwxr-xr-xthird_party/git/t/t4118-apply-empty-context.sh (renamed from t/t4118-apply-empty-context.sh)0
-rwxr-xr-xthird_party/git/t/t4119-apply-config.sh (renamed from t/t4119-apply-config.sh)0
-rwxr-xr-xthird_party/git/t/t4120-apply-popt.sh (renamed from t/t4120-apply-popt.sh)0
-rwxr-xr-xthird_party/git/t/t4121-apply-diffs.sh (renamed from t/t4121-apply-diffs.sh)0
-rwxr-xr-xthird_party/git/t/t4122-apply-symlink-inside.sh (renamed from t/t4122-apply-symlink-inside.sh)0
-rwxr-xr-xthird_party/git/t/t4123-apply-shrink.sh (renamed from t/t4123-apply-shrink.sh)0
-rwxr-xr-xthird_party/git/t/t4124-apply-ws-rule.sh (renamed from t/t4124-apply-ws-rule.sh)0
-rwxr-xr-xthird_party/git/t/t4125-apply-ws-fuzz.sh (renamed from t/t4125-apply-ws-fuzz.sh)0
-rwxr-xr-xthird_party/git/t/t4126-apply-empty.sh (renamed from t/t4126-apply-empty.sh)0
-rwxr-xr-xthird_party/git/t/t4127-apply-same-fn.sh (renamed from t/t4127-apply-same-fn.sh)0
-rwxr-xr-xthird_party/git/t/t4128-apply-root.sh (renamed from t/t4128-apply-root.sh)0
-rwxr-xr-xthird_party/git/t/t4129-apply-samemode.sh (renamed from t/t4129-apply-samemode.sh)0
-rwxr-xr-xthird_party/git/t/t4130-apply-criss-cross-rename.sh (renamed from t/t4130-apply-criss-cross-rename.sh)0
-rwxr-xr-xthird_party/git/t/t4131-apply-fake-ancestor.sh (renamed from t/t4131-apply-fake-ancestor.sh)0
-rwxr-xr-xthird_party/git/t/t4132-apply-removal.sh (renamed from t/t4132-apply-removal.sh)0
-rwxr-xr-xthird_party/git/t/t4133-apply-filenames.sh (renamed from t/t4133-apply-filenames.sh)0
-rwxr-xr-xthird_party/git/t/t4134-apply-submodule.sh (renamed from t/t4134-apply-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t4135-apply-weird-filenames.sh (renamed from t/t4135-apply-weird-filenames.sh)0
-rw-r--r--third_party/git/t/t4135/.gitignore (renamed from t/t4135/.gitignore)0
-rw-r--r--third_party/git/t/t4135/add-plain.diff (renamed from t/t4135/add-plain.diff)0
-rw-r--r--third_party/git/t/t4135/add-with backslash.diff (renamed from t/t4135/add-with backslash.diff)0
-rw-r--r--third_party/git/t/t4135/add-with quote.diff (renamed from t/t4135/add-with quote.diff)0
-rw-r--r--third_party/git/t/t4135/add-with spaces.diff (renamed from t/t4135/add-with spaces.diff)0
-rw-r--r--third_party/git/t/t4135/add-with tab.diff (renamed from t/t4135/add-with tab.diff)0
-rw-r--r--third_party/git/t/t4135/damaged-tz.diff (renamed from t/t4135/damaged-tz.diff)0
-rw-r--r--third_party/git/t/t4135/damaged.diff (renamed from t/t4135/damaged.diff)0
-rw-r--r--third_party/git/t/t4135/diff-plain.diff (renamed from t/t4135/diff-plain.diff)0
-rw-r--r--third_party/git/t/t4135/diff-with backslash.diff (renamed from t/t4135/diff-with backslash.diff)0
-rw-r--r--third_party/git/t/t4135/diff-with quote.diff (renamed from t/t4135/diff-with quote.diff)0
-rw-r--r--third_party/git/t/t4135/diff-with spaces.diff (renamed from t/t4135/diff-with spaces.diff)0
-rw-r--r--third_party/git/t/t4135/diff-with tab.diff (renamed from t/t4135/diff-with tab.diff)0
-rw-r--r--third_party/git/t/t4135/funny-tz.diff (renamed from t/t4135/funny-tz.diff)0
-rw-r--r--third_party/git/t/t4135/git-plain.diff (renamed from t/t4135/git-plain.diff)0
-rw-r--r--third_party/git/t/t4135/git-with backslash.diff (renamed from t/t4135/git-with backslash.diff)0
-rw-r--r--third_party/git/t/t4135/git-with quote.diff (renamed from t/t4135/git-with quote.diff)0
-rw-r--r--third_party/git/t/t4135/git-with spaces.diff (renamed from t/t4135/git-with spaces.diff)0
-rw-r--r--third_party/git/t/t4135/git-with tab.diff (renamed from t/t4135/git-with tab.diff)0
-rwxr-xr-xthird_party/git/t/t4135/make-patches (renamed from t/t4135/make-patches)0
-rwxr-xr-xthird_party/git/t/t4136-apply-check.sh (renamed from t/t4136-apply-check.sh)0
-rwxr-xr-xthird_party/git/t/t4137-apply-submodule.sh (renamed from t/t4137-apply-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t4138-apply-ws-expansion.sh (renamed from t/t4138-apply-ws-expansion.sh)0
-rwxr-xr-xthird_party/git/t/t4139-apply-escape.sh (renamed from t/t4139-apply-escape.sh)0
-rwxr-xr-xthird_party/git/t/t4150-am.sh (renamed from t/t4150-am.sh)0
-rwxr-xr-xthird_party/git/t/t4151-am-abort.sh (renamed from t/t4151-am-abort.sh)0
-rwxr-xr-xthird_party/git/t/t4152-am-subjects.sh (renamed from t/t4152-am-subjects.sh)0
-rwxr-xr-xthird_party/git/t/t4153-am-resume-override-opts.sh (renamed from t/t4153-am-resume-override-opts.sh)0
-rwxr-xr-xthird_party/git/t/t4200-rerere.sh (renamed from t/t4200-rerere.sh)0
-rwxr-xr-xthird_party/git/t/t4201-shortlog.sh (renamed from t/t4201-shortlog.sh)0
-rwxr-xr-xthird_party/git/t/t4202-log.sh (renamed from t/t4202-log.sh)0
-rwxr-xr-xthird_party/git/t/t4203-mailmap.sh (renamed from t/t4203-mailmap.sh)0
-rwxr-xr-xthird_party/git/t/t4204-patch-id.sh (renamed from t/t4204-patch-id.sh)0
-rwxr-xr-xthird_party/git/t/t4205-log-pretty-formats.sh (renamed from t/t4205-log-pretty-formats.sh)0
-rwxr-xr-xthird_party/git/t/t4206-log-follow-harder-copies.sh (renamed from t/t4206-log-follow-harder-copies.sh)0
-rwxr-xr-xthird_party/git/t/t4207-log-decoration-colors.sh (renamed from t/t4207-log-decoration-colors.sh)0
-rwxr-xr-xthird_party/git/t/t4208-log-magic-pathspec.sh (renamed from t/t4208-log-magic-pathspec.sh)0
-rwxr-xr-xthird_party/git/t/t4209-log-pickaxe.sh (renamed from t/t4209-log-pickaxe.sh)0
-rwxr-xr-xthird_party/git/t/t4210-log-i18n.sh (renamed from t/t4210-log-i18n.sh)0
-rwxr-xr-xthird_party/git/t/t4211-line-log.sh (renamed from t/t4211-line-log.sh)0
-rw-r--r--third_party/git/t/t4211/expect.beginning-of-file (renamed from t/t4211/expect.beginning-of-file)0
-rw-r--r--third_party/git/t/t4211/expect.end-of-file (renamed from t/t4211/expect.end-of-file)0
-rw-r--r--third_party/git/t/t4211/expect.move-support-f (renamed from t/t4211/expect.move-support-f)0
-rw-r--r--third_party/git/t/t4211/expect.multiple (renamed from t/t4211/expect.multiple)0
-rw-r--r--third_party/git/t/t4211/expect.multiple-overlapping (renamed from t/t4211/expect.multiple-overlapping)0
-rw-r--r--third_party/git/t/t4211/expect.multiple-superset (renamed from t/t4211/expect.multiple-superset)0
-rw-r--r--third_party/git/t/t4211/expect.parallel-change-f-to-main (renamed from t/t4211/expect.parallel-change-f-to-main)0
-rw-r--r--third_party/git/t/t4211/expect.simple-f (renamed from t/t4211/expect.simple-f)0
-rw-r--r--third_party/git/t/t4211/expect.simple-f-to-main (renamed from t/t4211/expect.simple-f-to-main)0
-rw-r--r--third_party/git/t/t4211/expect.simple-main (renamed from t/t4211/expect.simple-main)0
-rw-r--r--third_party/git/t/t4211/expect.simple-main-to-end (renamed from t/t4211/expect.simple-main-to-end)0
-rw-r--r--third_party/git/t/t4211/expect.two-ranges (renamed from t/t4211/expect.two-ranges)0
-rw-r--r--third_party/git/t/t4211/expect.vanishes-early (renamed from t/t4211/expect.vanishes-early)0
-rw-r--r--third_party/git/t/t4211/history.export (renamed from t/t4211/history.export)0
-rwxr-xr-xthird_party/git/t/t4212-log-corrupt.sh (renamed from t/t4212-log-corrupt.sh)0
-rwxr-xr-xthird_party/git/t/t4213-log-tabexpand.sh (renamed from t/t4213-log-tabexpand.sh)0
-rwxr-xr-xthird_party/git/t/t4214-log-graph-octopus.sh (renamed from t/t4214-log-graph-octopus.sh)0
-rwxr-xr-xthird_party/git/t/t4252-am-options.sh (renamed from t/t4252-am-options.sh)0
-rw-r--r--third_party/git/t/t4252/am-test-1-1 (renamed from t/t4252/am-test-1-1)0
-rw-r--r--third_party/git/t/t4252/am-test-1-2 (renamed from t/t4252/am-test-1-2)0
-rw-r--r--third_party/git/t/t4252/am-test-2-1 (renamed from t/t4252/am-test-2-1)0
-rw-r--r--third_party/git/t/t4252/am-test-2-2 (renamed from t/t4252/am-test-2-2)0
-rw-r--r--third_party/git/t/t4252/am-test-3-1 (renamed from t/t4252/am-test-3-1)0
-rw-r--r--third_party/git/t/t4252/am-test-3-2 (renamed from t/t4252/am-test-3-2)0
-rw-r--r--third_party/git/t/t4252/am-test-4-1 (renamed from t/t4252/am-test-4-1)0
-rw-r--r--third_party/git/t/t4252/am-test-4-2 (renamed from t/t4252/am-test-4-2)0
-rw-r--r--third_party/git/t/t4252/am-test-5-1 (renamed from t/t4252/am-test-5-1)0
-rw-r--r--third_party/git/t/t4252/am-test-5-2 (renamed from t/t4252/am-test-5-2)0
-rw-r--r--third_party/git/t/t4252/am-test-6-1 (renamed from t/t4252/am-test-6-1)0
-rw-r--r--third_party/git/t/t4252/file-1-0 (renamed from t/t4252/file-1-0)0
-rw-r--r--third_party/git/t/t4252/file-2-0 (renamed from t/t4252/file-2-0)0
-rwxr-xr-xthird_party/git/t/t4253-am-keep-cr-dos.sh (renamed from t/t4253-am-keep-cr-dos.sh)0
-rwxr-xr-xthird_party/git/t/t4254-am-corrupt.sh (renamed from t/t4254-am-corrupt.sh)0
-rwxr-xr-xthird_party/git/t/t4255-am-submodule.sh (renamed from t/t4255-am-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t4256-am-format-flowed.sh (renamed from t/t4256-am-format-flowed.sh)0
-rw-r--r--third_party/git/t/t4256/1/mailinfo.c (renamed from t/t4256/1/mailinfo.c)0
-rw-r--r--third_party/git/t/t4256/1/mailinfo.c.orig (renamed from t/t4256/1/mailinfo.c.orig)0
-rw-r--r--third_party/git/t/t4256/1/patch (renamed from t/t4256/1/patch)0
-rwxr-xr-xthird_party/git/t/t4257-am-interactive.sh (renamed from t/t4257-am-interactive.sh)0
-rwxr-xr-xthird_party/git/t/t4300-merge-tree.sh (renamed from t/t4300-merge-tree.sh)0
-rwxr-xr-xthird_party/git/t/t5000-tar-tree.sh (renamed from t/t5000-tar-tree.sh)0
-rw-r--r--third_party/git/t/t5000/huge-and-future.tar (renamed from t/t5000/huge-and-future.tar)bin2048 -> 2048 bytes
-rw-r--r--third_party/git/t/t5000/huge-object (renamed from t/t5000/huge-object)bin2048 -> 2048 bytes
-rw-r--r--third_party/git/t/t5000/pax.tar (renamed from t/t5000/pax.tar)bin10240 -> 10240 bytes
-rwxr-xr-xthird_party/git/t/t5001-archive-attr.sh (renamed from t/t5001-archive-attr.sh)0
-rwxr-xr-xthird_party/git/t/t5002-archive-attr-pattern.sh (renamed from t/t5002-archive-attr-pattern.sh)0
-rwxr-xr-xthird_party/git/t/t5003-archive-zip.sh (renamed from t/t5003-archive-zip.sh)0
-rw-r--r--third_party/git/t/t5003/infozip-symlinks.zip (renamed from t/t5003/infozip-symlinks.zip)bin328 -> 328 bytes
-rwxr-xr-xthird_party/git/t/t5004-archive-corner-cases.sh (renamed from t/t5004-archive-corner-cases.sh)0
-rw-r--r--third_party/git/t/t5004/big-pack.zip (renamed from t/t5004/big-pack.zip)bin7373 -> 7373 bytes
-rw-r--r--third_party/git/t/t5004/empty-with-pax-header.tar (renamed from t/t5004/empty-with-pax-header.tar)bin10240 -> 10240 bytes
-rw-r--r--third_party/git/t/t5004/empty.zip (renamed from t/t5004/empty.zip)bin62 -> 62 bytes
-rwxr-xr-xthird_party/git/t/t5100-mailinfo.sh (renamed from t/t5100-mailinfo.sh)0
-rw-r--r--third_party/git/t/t5100/.gitattributes (renamed from t/t5100/.gitattributes)0
-rw-r--r--third_party/git/t/t5100/0001mboxrd (renamed from t/t5100/0001mboxrd)0
-rw-r--r--third_party/git/t/t5100/0002mboxrd (renamed from t/t5100/0002mboxrd)0
-rw-r--r--third_party/git/t/t5100/comment.expect (renamed from t/t5100/comment.expect)0
-rw-r--r--third_party/git/t/t5100/comment.in (renamed from t/t5100/comment.in)0
-rw-r--r--third_party/git/t/t5100/embed-from.expect (renamed from t/t5100/embed-from.expect)0
-rw-r--r--third_party/git/t/t5100/embed-from.in (renamed from t/t5100/embed-from.in)0
-rw-r--r--third_party/git/t/t5100/empty (renamed from t/t5100/msg0013)0
-rw-r--r--third_party/git/t/t5100/info-from.expect (renamed from t/t5100/info-from.expect)0
-rw-r--r--third_party/git/t/t5100/info-from.in (renamed from t/t5100/info-from.in)0
-rw-r--r--third_party/git/t/t5100/info0001 (renamed from t/t5100/info0001)0
-rw-r--r--third_party/git/t/t5100/info0002 (renamed from t/t5100/info0002)0
-rw-r--r--third_party/git/t/t5100/info0003 (renamed from t/t5100/info0003)0
-rw-r--r--third_party/git/t/t5100/info0004 (renamed from t/t5100/info0004)0
-rw-r--r--third_party/git/t/t5100/info0005 (renamed from t/t5100/info0005)0
-rw-r--r--third_party/git/t/t5100/info0006 (renamed from t/t5100/info0006)0
-rw-r--r--third_party/git/t/t5100/info0007 (renamed from t/t5100/info0007)0
-rw-r--r--third_party/git/t/t5100/info0008 (renamed from t/t5100/info0008)0
-rw-r--r--third_party/git/t/t5100/info0009 (renamed from t/t5100/info0009)0
-rw-r--r--third_party/git/t/t5100/info0010 (renamed from t/t5100/info0010)0
-rw-r--r--third_party/git/t/t5100/info0011 (renamed from t/t5100/info0011)0
-rw-r--r--third_party/git/t/t5100/info0012 (renamed from t/t5100/info0012)0
-rw-r--r--third_party/git/t/t5100/info0012--message-id (renamed from t/t5100/info0012--message-id)0
-rw-r--r--third_party/git/t/t5100/info0013 (renamed from t/t5100/info0013)0
-rw-r--r--third_party/git/t/t5100/info0014 (renamed from t/t5100/info0014)0
-rw-r--r--third_party/git/t/t5100/info0014--scissors (renamed from t/t5100/info0014--scissors)0
-rw-r--r--third_party/git/t/t5100/info0015 (renamed from t/t5100/info0015)0
-rw-r--r--third_party/git/t/t5100/info0015--no-inbody-headers (renamed from t/t5100/info0015--no-inbody-headers)0
-rw-r--r--third_party/git/t/t5100/info0016 (renamed from t/t5100/info0016)0
-rw-r--r--third_party/git/t/t5100/info0016--no-inbody-headers (renamed from t/t5100/info0016--no-inbody-headers)0
-rw-r--r--third_party/git/t/t5100/info0017 (renamed from t/t5100/info0017)0
-rw-r--r--third_party/git/t/t5100/info0018 (renamed from t/t5100/info0018)0
-rw-r--r--third_party/git/t/t5100/info0018--no-inbody-headers (renamed from t/t5100/info0018--no-inbody-headers)0
-rw-r--r--third_party/git/t/t5100/msg0001 (renamed from t/t5100/msg0001)0
-rw-r--r--third_party/git/t/t5100/msg0002 (renamed from t/t5100/msg0002)0
-rw-r--r--third_party/git/t/t5100/msg0003 (renamed from t/t5100/msg0003)0
-rw-r--r--third_party/git/t/t5100/msg0004 (renamed from t/t5100/msg0004)0
-rw-r--r--third_party/git/t/t5100/msg0005 (renamed from t/t5100/msg0005)0
-rw-r--r--third_party/git/t/t5100/msg0006 (renamed from t/t5100/msg0006)0
-rw-r--r--third_party/git/t/t5100/msg0007 (renamed from t/t5100/msg0007)0
-rw-r--r--third_party/git/t/t5100/msg0008 (renamed from t/t5100/msg0008)0
-rw-r--r--third_party/git/t/t5100/msg0009 (renamed from t/t5100/msg0009)0
-rw-r--r--third_party/git/t/t5100/msg0010 (renamed from t/t5100/msg0010)0
-rw-r--r--third_party/git/t/t5100/msg0011 (renamed from t/t5100/msg0011)0
-rw-r--r--third_party/git/t/t5100/msg0012 (renamed from t/t5100/msg0012)0
-rw-r--r--third_party/git/t/t5100/msg0012--message-id (renamed from t/t5100/msg0012--message-id)0
-rw-r--r--third_party/git/t/t5100/msg0013 (renamed from t/t5100/msg0015)0
-rw-r--r--third_party/git/t/t5100/msg0014 (renamed from t/t5100/msg0014)0
-rw-r--r--third_party/git/t/t5100/msg0014--scissors (renamed from t/t5100/msg0014--scissors)0
-rw-r--r--third_party/git/t/t5100/msg0015 (renamed from t/t5100/patch0007)0
-rw-r--r--third_party/git/t/t5100/msg0015--no-inbody-headers (renamed from t/t5100/msg0015--no-inbody-headers)0
-rw-r--r--third_party/git/t/t5100/msg0016 (renamed from t/t5100/msg0016)0
-rw-r--r--third_party/git/t/t5100/msg0016--no-inbody-headers (renamed from t/t5100/msg0016--no-inbody-headers)0
-rw-r--r--third_party/git/t/t5100/msg0017 (renamed from t/t5100/msg0017)0
-rw-r--r--third_party/git/t/t5100/msg0018 (renamed from t/t5100/msg0018)0
-rw-r--r--third_party/git/t/t5100/msg0018--no-inbody-headers (renamed from t/t5100/msg0018--no-inbody-headers)0
-rw-r--r--third_party/git/t/t5100/nul-b64.expect (renamed from t/t5100/nul-b64.expect)bin1672 -> 1672 bytes
-rw-r--r--third_party/git/t/t5100/nul-b64.in (renamed from t/t5100/nul-b64.in)0
-rw-r--r--third_party/git/t/t5100/nul-plain (renamed from t/t5100/nul-plain)bin91 -> 91 bytes
-rw-r--r--third_party/git/t/t5100/patch0001 (renamed from t/t5100/patch0001)0
-rw-r--r--third_party/git/t/t5100/patch0002 (renamed from t/t5100/patch0002)0
-rw-r--r--third_party/git/t/t5100/patch0003 (renamed from t/t5100/patch0003)0
-rw-r--r--third_party/git/t/t5100/patch0004 (renamed from t/t5100/patch0004)0
-rw-r--r--third_party/git/t/t5100/patch0005 (renamed from t/t5100/patch0005)0
-rw-r--r--third_party/git/t/t5100/patch0006 (renamed from t/t5100/patch0006)0
-rw-r--r--third_party/git/t/t5100/patch0007 (renamed from t/t5100/patch0008)0
-rw-r--r--third_party/git/t/t5100/patch0008 (renamed from t/t5100/patch0013)0
-rw-r--r--third_party/git/t/t5100/patch0009 (renamed from t/t5100/patch0009)0
-rw-r--r--third_party/git/t/t5100/patch0010 (renamed from t/t5100/patch0010)0
-rw-r--r--third_party/git/t/t5100/patch0011 (renamed from t/t5100/patch0011)0
-rw-r--r--third_party/git/t/t5100/patch0012 (renamed from t/t5100/patch0012)0
-rw-r--r--third_party/git/t/t5100/patch0012--message-id (renamed from t/t5100/patch0012--message-id)0
-rw-r--r--third_party/git/t/t5100/patch00130
-rw-r--r--third_party/git/t/t5100/patch0014 (renamed from t/t5100/patch0014)0
-rw-r--r--third_party/git/t/t5100/patch0014--scissors (renamed from t/t5100/patch0014--scissors)0
-rw-r--r--third_party/git/t/t5100/patch0015 (renamed from t/t5100/patch0015)0
-rw-r--r--third_party/git/t/t5100/patch0015--no-inbody-headers (renamed from t/t5100/patch0015--no-inbody-headers)0
-rw-r--r--third_party/git/t/t5100/patch0016 (renamed from t/t5100/patch0016)0
-rw-r--r--third_party/git/t/t5100/patch0016--no-inbody-headers (renamed from t/t5100/patch0016--no-inbody-headers)0
-rw-r--r--third_party/git/t/t5100/patch0017 (renamed from t/t5100/patch0017)0
-rw-r--r--third_party/git/t/t5100/patch0018 (renamed from t/t5100/patch0018)0
-rw-r--r--third_party/git/t/t5100/patch0018--no-inbody-headers (renamed from t/t5100/patch0018--no-inbody-headers)0
-rw-r--r--third_party/git/t/t5100/quoted-from.expect (renamed from t/t5100/quoted-from.expect)0
-rw-r--r--third_party/git/t/t5100/quoted-from.in (renamed from t/t5100/quoted-from.in)0
-rw-r--r--third_party/git/t/t5100/quoted-string.expect (renamed from t/t5100/quoted-string.expect)0
-rw-r--r--third_party/git/t/t5100/quoted-string.in (renamed from t/t5100/quoted-string.in)0
-rw-r--r--third_party/git/t/t5100/rfc2047-info-0001 (renamed from t/t5100/rfc2047-info-0001)0
-rw-r--r--third_party/git/t/t5100/rfc2047-info-0002 (renamed from t/t5100/rfc2047-info-0002)0
-rw-r--r--third_party/git/t/t5100/rfc2047-info-0003 (renamed from t/t5100/rfc2047-info-0003)0
-rw-r--r--third_party/git/t/t5100/rfc2047-info-0004 (renamed from t/t5100/rfc2047-info-0004)0
-rw-r--r--third_party/git/t/t5100/rfc2047-info-0005 (renamed from t/t5100/rfc2047-info-0005)0
-rw-r--r--third_party/git/t/t5100/rfc2047-info-0006 (renamed from t/t5100/rfc2047-info-0006)0
-rw-r--r--third_party/git/t/t5100/rfc2047-info-0007 (renamed from t/t5100/rfc2047-info-0007)0
-rw-r--r--third_party/git/t/t5100/rfc2047-info-0008 (renamed from t/t5100/rfc2047-info-0008)0
-rw-r--r--third_party/git/t/t5100/rfc2047-info-0009 (renamed from t/t5100/rfc2047-info-0009)0
-rw-r--r--third_party/git/t/t5100/rfc2047-info-0010 (renamed from t/t5100/rfc2047-info-0010)0
-rw-r--r--third_party/git/t/t5100/rfc2047-info-0011 (renamed from t/t5100/rfc2047-info-0011)0
-rw-r--r--third_party/git/t/t5100/rfc2047-samples.mbox (renamed from t/t5100/rfc2047-samples.mbox)0
-rw-r--r--third_party/git/t/t5100/sample.mbox (renamed from t/t5100/sample.mbox)0
-rw-r--r--third_party/git/t/t5100/sample.mboxrd (renamed from t/t5100/sample.mboxrd)0
-rwxr-xr-xthird_party/git/t/t5150-request-pull.sh (renamed from t/t5150-request-pull.sh)0
-rwxr-xr-xthird_party/git/t/t5200-update-server-info.sh (renamed from t/t5200-update-server-info.sh)0
-rwxr-xr-xthird_party/git/t/t5300-pack-object.sh (renamed from t/t5300-pack-object.sh)0
-rwxr-xr-xthird_party/git/t/t5301-sliding-window.sh (renamed from t/t5301-sliding-window.sh)0
-rwxr-xr-xthird_party/git/t/t5302-pack-index.sh (renamed from t/t5302-pack-index.sh)0
-rwxr-xr-xthird_party/git/t/t5303-pack-corruption-resilience.sh (renamed from t/t5303-pack-corruption-resilience.sh)0
-rwxr-xr-xthird_party/git/t/t5304-prune.sh (renamed from t/t5304-prune.sh)0
-rwxr-xr-xthird_party/git/t/t5305-include-tag.sh (renamed from t/t5305-include-tag.sh)0
-rwxr-xr-xthird_party/git/t/t5306-pack-nobase.sh (renamed from t/t5306-pack-nobase.sh)0
-rwxr-xr-xthird_party/git/t/t5307-pack-missing-commit.sh (renamed from t/t5307-pack-missing-commit.sh)0
-rwxr-xr-xthird_party/git/t/t5308-pack-detect-duplicates.sh (renamed from t/t5308-pack-detect-duplicates.sh)0
-rwxr-xr-xthird_party/git/t/t5309-pack-delta-cycles.sh (renamed from t/t5309-pack-delta-cycles.sh)0
-rwxr-xr-xthird_party/git/t/t5310-pack-bitmaps.sh (renamed from t/t5310-pack-bitmaps.sh)0
-rwxr-xr-xthird_party/git/t/t5311-pack-bitmaps-shallow.sh (renamed from t/t5311-pack-bitmaps-shallow.sh)0
-rwxr-xr-xthird_party/git/t/t5312-prune-corruption.sh (renamed from t/t5312-prune-corruption.sh)0
-rwxr-xr-xthird_party/git/t/t5313-pack-bounds-checks.sh (renamed from t/t5313-pack-bounds-checks.sh)0
-rwxr-xr-xthird_party/git/t/t5314-pack-cycle-detection.sh (renamed from t/t5314-pack-cycle-detection.sh)0
-rwxr-xr-xthird_party/git/t/t5315-pack-objects-compression.sh (renamed from t/t5315-pack-objects-compression.sh)0
-rwxr-xr-xthird_party/git/t/t5316-pack-delta-depth.sh (renamed from t/t5316-pack-delta-depth.sh)0
-rwxr-xr-xthird_party/git/t/t5317-pack-objects-filter-objects.sh (renamed from t/t5317-pack-objects-filter-objects.sh)0
-rwxr-xr-xthird_party/git/t/t5318-commit-graph.sh (renamed from t/t5318-commit-graph.sh)0
-rwxr-xr-xthird_party/git/t/t5319-multi-pack-index.sh (renamed from t/t5319-multi-pack-index.sh)0
-rwxr-xr-xthird_party/git/t/t5320-delta-islands.sh (renamed from t/t5320-delta-islands.sh)0
-rwxr-xr-xthird_party/git/t/t5321-pack-large-objects.sh (renamed from t/t5321-pack-large-objects.sh)0
-rwxr-xr-xthird_party/git/t/t5322-pack-objects-sparse.sh (renamed from t/t5322-pack-objects-sparse.sh)0
-rwxr-xr-xthird_party/git/t/t5323-pack-redundant.sh (renamed from t/t5323-pack-redundant.sh)0
-rwxr-xr-xthird_party/git/t/t5324-split-commit-graph.sh (renamed from t/t5324-split-commit-graph.sh)0
-rwxr-xr-xthird_party/git/t/t5400-send-pack.sh (renamed from t/t5400-send-pack.sh)0
-rwxr-xr-xthird_party/git/t/t5401-update-hooks.sh (renamed from t/t5401-update-hooks.sh)0
-rwxr-xr-xthird_party/git/t/t5402-post-merge-hook.sh (renamed from t/t5402-post-merge-hook.sh)0
-rwxr-xr-xthird_party/git/t/t5403-post-checkout-hook.sh (renamed from t/t5403-post-checkout-hook.sh)0
-rwxr-xr-xthird_party/git/t/t5404-tracking-branches.sh (renamed from t/t5404-tracking-branches.sh)0
-rwxr-xr-xthird_party/git/t/t5405-send-pack-rewind.sh (renamed from t/t5405-send-pack-rewind.sh)0
-rwxr-xr-xthird_party/git/t/t5406-remote-rejects.sh (renamed from t/t5406-remote-rejects.sh)0
-rwxr-xr-xthird_party/git/t/t5407-post-rewrite-hook.sh (renamed from t/t5407-post-rewrite-hook.sh)0
-rwxr-xr-xthird_party/git/t/t5408-send-pack-stdin.sh (renamed from t/t5408-send-pack-stdin.sh)0
-rwxr-xr-xthird_party/git/t/t5409-colorize-remote-messages.sh (renamed from t/t5409-colorize-remote-messages.sh)0
-rwxr-xr-xthird_party/git/t/t5410-receive-pack-alternates.sh (renamed from t/t5410-receive-pack-alternates.sh)0
-rwxr-xr-xthird_party/git/t/t5500-fetch-pack.sh (renamed from t/t5500-fetch-pack.sh)0
-rwxr-xr-xthird_party/git/t/t5501-fetch-push-alternates.sh (renamed from t/t5501-fetch-push-alternates.sh)0
-rwxr-xr-xthird_party/git/t/t5502-quickfetch.sh (renamed from t/t5502-quickfetch.sh)0
-rwxr-xr-xthird_party/git/t/t5503-tagfollow.sh (renamed from t/t5503-tagfollow.sh)0
-rwxr-xr-xthird_party/git/t/t5504-fetch-receive-strict.sh (renamed from t/t5504-fetch-receive-strict.sh)0
-rwxr-xr-xthird_party/git/t/t5505-remote.sh (renamed from t/t5505-remote.sh)0
-rwxr-xr-xthird_party/git/t/t5506-remote-groups.sh (renamed from t/t5506-remote-groups.sh)0
-rwxr-xr-xthird_party/git/t/t5507-remote-environment.sh (renamed from t/t5507-remote-environment.sh)0
-rwxr-xr-xthird_party/git/t/t5509-fetch-push-namespaces.sh (renamed from t/t5509-fetch-push-namespaces.sh)0
-rwxr-xr-xthird_party/git/t/t5510-fetch.sh (renamed from t/t5510-fetch.sh)0
-rwxr-xr-xthird_party/git/t/t5511-refspec.sh (renamed from t/t5511-refspec.sh)0
-rwxr-xr-xthird_party/git/t/t5512-ls-remote.sh (renamed from t/t5512-ls-remote.sh)0
-rwxr-xr-xthird_party/git/t/t5513-fetch-track.sh (renamed from t/t5513-fetch-track.sh)0
-rwxr-xr-xthird_party/git/t/t5514-fetch-multiple.sh (renamed from t/t5514-fetch-multiple.sh)0
-rwxr-xr-xthird_party/git/t/t5515-fetch-merge-logic.sh (renamed from t/t5515-fetch-merge-logic.sh)0
-rw-r--r--third_party/git/t/t5515/fetch.br-branches-default (renamed from t/t5515/fetch.br-branches-default)0
-rw-r--r--third_party/git/t/t5515/fetch.br-branches-default-merge (renamed from t/t5515/fetch.br-branches-default-merge)0
-rw-r--r--third_party/git/t/t5515/fetch.br-branches-default-merge_branches-default (renamed from t/t5515/fetch.br-branches-default-merge_branches-default)0
-rw-r--r--third_party/git/t/t5515/fetch.br-branches-default-octopus (renamed from t/t5515/fetch.br-branches-default-octopus)0
-rw-r--r--third_party/git/t/t5515/fetch.br-branches-default-octopus_branches-default (renamed from t/t5515/fetch.br-branches-default-octopus_branches-default)0
-rw-r--r--third_party/git/t/t5515/fetch.br-branches-default_branches-default (renamed from t/t5515/fetch.br-branches-default_branches-default)0
-rw-r--r--third_party/git/t/t5515/fetch.br-branches-one (renamed from t/t5515/fetch.br-branches-one)0
-rw-r--r--third_party/git/t/t5515/fetch.br-branches-one-merge (renamed from t/t5515/fetch.br-branches-one-merge)0
-rw-r--r--third_party/git/t/t5515/fetch.br-branches-one-merge_branches-one (renamed from t/t5515/fetch.br-branches-one-merge_branches-one)0
-rw-r--r--third_party/git/t/t5515/fetch.br-branches-one-octopus (renamed from t/t5515/fetch.br-branches-one-octopus)0
-rw-r--r--third_party/git/t/t5515/fetch.br-branches-one-octopus_branches-one (renamed from t/t5515/fetch.br-branches-one-octopus_branches-one)0
-rw-r--r--third_party/git/t/t5515/fetch.br-branches-one_branches-one (renamed from t/t5515/fetch.br-branches-one_branches-one)0
-rw-r--r--third_party/git/t/t5515/fetch.br-config-explicit (renamed from t/t5515/fetch.br-config-explicit)0
-rw-r--r--third_party/git/t/t5515/fetch.br-config-explicit-merge (renamed from t/t5515/fetch.br-config-explicit-merge)0
-rw-r--r--third_party/git/t/t5515/fetch.br-config-explicit-merge_config-explicit (renamed from t/t5515/fetch.br-config-explicit-merge_config-explicit)0
-rw-r--r--third_party/git/t/t5515/fetch.br-config-explicit-octopus (renamed from t/t5515/fetch.br-config-explicit-octopus)0
-rw-r--r--third_party/git/t/t5515/fetch.br-config-explicit-octopus_config-explicit (renamed from t/t5515/fetch.br-config-explicit-octopus_config-explicit)0
-rw-r--r--third_party/git/t/t5515/fetch.br-config-explicit_config-explicit (renamed from t/t5515/fetch.br-config-explicit_config-explicit)0
-rw-r--r--third_party/git/t/t5515/fetch.br-config-glob (renamed from t/t5515/fetch.br-config-glob)0
-rw-r--r--third_party/git/t/t5515/fetch.br-config-glob-merge (renamed from t/t5515/fetch.br-config-glob-merge)0
-rw-r--r--third_party/git/t/t5515/fetch.br-config-glob-merge_config-glob (renamed from t/t5515/fetch.br-config-glob-merge_config-glob)0
-rw-r--r--third_party/git/t/t5515/fetch.br-config-glob-octopus (renamed from t/t5515/fetch.br-config-glob-octopus)0
-rw-r--r--third_party/git/t/t5515/fetch.br-config-glob-octopus_config-glob (renamed from t/t5515/fetch.br-config-glob-octopus_config-glob)0
-rw-r--r--third_party/git/t/t5515/fetch.br-config-glob_config-glob (renamed from t/t5515/fetch.br-config-glob_config-glob)0
-rw-r--r--third_party/git/t/t5515/fetch.br-remote-explicit (renamed from t/t5515/fetch.br-remote-explicit)0
-rw-r--r--third_party/git/t/t5515/fetch.br-remote-explicit-merge (renamed from t/t5515/fetch.br-remote-explicit-merge)0
-rw-r--r--third_party/git/t/t5515/fetch.br-remote-explicit-merge_remote-explicit (renamed from t/t5515/fetch.br-remote-explicit-merge_remote-explicit)0
-rw-r--r--third_party/git/t/t5515/fetch.br-remote-explicit-octopus (renamed from t/t5515/fetch.br-remote-explicit-octopus)0
-rw-r--r--third_party/git/t/t5515/fetch.br-remote-explicit-octopus_remote-explicit (renamed from t/t5515/fetch.br-remote-explicit-octopus_remote-explicit)0
-rw-r--r--third_party/git/t/t5515/fetch.br-remote-explicit_remote-explicit (renamed from t/t5515/fetch.br-remote-explicit_remote-explicit)0
-rw-r--r--third_party/git/t/t5515/fetch.br-remote-glob (renamed from t/t5515/fetch.br-remote-glob)0
-rw-r--r--third_party/git/t/t5515/fetch.br-remote-glob-merge (renamed from t/t5515/fetch.br-remote-glob-merge)0
-rw-r--r--third_party/git/t/t5515/fetch.br-remote-glob-merge_remote-glob (renamed from t/t5515/fetch.br-remote-glob-merge_remote-glob)0
-rw-r--r--third_party/git/t/t5515/fetch.br-remote-glob-octopus (renamed from t/t5515/fetch.br-remote-glob-octopus)0
-rw-r--r--third_party/git/t/t5515/fetch.br-remote-glob-octopus_remote-glob (renamed from t/t5515/fetch.br-remote-glob-octopus_remote-glob)0
-rw-r--r--third_party/git/t/t5515/fetch.br-remote-glob_remote-glob (renamed from t/t5515/fetch.br-remote-glob_remote-glob)0
-rw-r--r--third_party/git/t/t5515/fetch.br-unconfig (renamed from t/t5515/fetch.br-unconfig)0
-rw-r--r--third_party/git/t/t5515/fetch.br-unconfig_--tags_.._.git (renamed from t/t5515/fetch.br-unconfig_--tags_.._.git)0
-rw-r--r--third_party/git/t/t5515/fetch.br-unconfig_.._.git (renamed from t/t5515/fetch.br-unconfig_.._.git)0
-rw-r--r--third_party/git/t/t5515/fetch.br-unconfig_.._.git_one (renamed from t/t5515/fetch.br-unconfig_.._.git_one)0
-rw-r--r--third_party/git/t/t5515/fetch.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file (renamed from t/t5515/fetch.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file)0
-rw-r--r--third_party/git/t/t5515/fetch.br-unconfig_.._.git_one_two (renamed from t/t5515/fetch.br-unconfig_.._.git_one_two)0
-rw-r--r--third_party/git/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file (renamed from t/t5515/fetch.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file)0
-rw-r--r--third_party/git/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one_tag_tag-three (renamed from t/t5515/fetch.br-unconfig_.._.git_tag_tag-one_tag_tag-three)0
-rw-r--r--third_party/git/t/t5515/fetch.br-unconfig_branches-default (renamed from t/t5515/fetch.br-unconfig_branches-default)0
-rw-r--r--third_party/git/t/t5515/fetch.br-unconfig_branches-one (renamed from t/t5515/fetch.br-unconfig_branches-one)0
-rw-r--r--third_party/git/t/t5515/fetch.br-unconfig_config-explicit (renamed from t/t5515/fetch.br-unconfig_config-explicit)0
-rw-r--r--third_party/git/t/t5515/fetch.br-unconfig_config-glob (renamed from t/t5515/fetch.br-unconfig_config-glob)0
-rw-r--r--third_party/git/t/t5515/fetch.br-unconfig_remote-explicit (renamed from t/t5515/fetch.br-unconfig_remote-explicit)0
-rw-r--r--third_party/git/t/t5515/fetch.br-unconfig_remote-glob (renamed from t/t5515/fetch.br-unconfig_remote-glob)0
-rw-r--r--third_party/git/t/t5515/fetch.master (renamed from t/t5515/fetch.master)0
-rw-r--r--third_party/git/t/t5515/fetch.master_--tags_.._.git (renamed from t/t5515/fetch.master_--tags_.._.git)0
-rw-r--r--third_party/git/t/t5515/fetch.master_.._.git (renamed from t/t5515/fetch.master_.._.git)0
-rw-r--r--third_party/git/t/t5515/fetch.master_.._.git_one (renamed from t/t5515/fetch.master_.._.git_one)0
-rw-r--r--third_party/git/t/t5515/fetch.master_.._.git_one_tag_tag-one_tag_tag-three-file (renamed from t/t5515/fetch.master_.._.git_one_tag_tag-one_tag_tag-three-file)0
-rw-r--r--third_party/git/t/t5515/fetch.master_.._.git_one_two (renamed from t/t5515/fetch.master_.._.git_one_two)0
-rw-r--r--third_party/git/t/t5515/fetch.master_.._.git_tag_tag-one-tree_tag_tag-three-file (renamed from t/t5515/fetch.master_.._.git_tag_tag-one-tree_tag_tag-three-file)0
-rw-r--r--third_party/git/t/t5515/fetch.master_.._.git_tag_tag-one_tag_tag-three (renamed from t/t5515/fetch.master_.._.git_tag_tag-one_tag_tag-three)0
-rw-r--r--third_party/git/t/t5515/fetch.master_branches-default (renamed from t/t5515/fetch.master_branches-default)0
-rw-r--r--third_party/git/t/t5515/fetch.master_branches-one (renamed from t/t5515/fetch.master_branches-one)0
-rw-r--r--third_party/git/t/t5515/fetch.master_config-explicit (renamed from t/t5515/fetch.master_config-explicit)0
-rw-r--r--third_party/git/t/t5515/fetch.master_config-glob (renamed from t/t5515/fetch.master_config-glob)0
-rw-r--r--third_party/git/t/t5515/fetch.master_remote-explicit (renamed from t/t5515/fetch.master_remote-explicit)0
-rw-r--r--third_party/git/t/t5515/fetch.master_remote-glob (renamed from t/t5515/fetch.master_remote-glob)0
-rw-r--r--third_party/git/t/t5515/refs.br-branches-default (renamed from t/t5515/refs.br-branches-default)0
-rw-r--r--third_party/git/t/t5515/refs.br-branches-default-merge (renamed from t/t5515/refs.br-branches-default-merge)0
-rw-r--r--third_party/git/t/t5515/refs.br-branches-default-merge_branches-default (renamed from t/t5515/refs.br-branches-default-merge_branches-default)0
-rw-r--r--third_party/git/t/t5515/refs.br-branches-default-octopus (renamed from t/t5515/refs.br-branches-default-octopus)0
-rw-r--r--third_party/git/t/t5515/refs.br-branches-default-octopus_branches-default (renamed from t/t5515/refs.br-branches-default-octopus_branches-default)0
-rw-r--r--third_party/git/t/t5515/refs.br-branches-default_branches-default (renamed from t/t5515/refs.br-branches-default_branches-default)0
-rw-r--r--third_party/git/t/t5515/refs.br-branches-one (renamed from t/t5515/refs.br-branches-one)0
-rw-r--r--third_party/git/t/t5515/refs.br-branches-one-merge (renamed from t/t5515/refs.br-branches-one-merge)0
-rw-r--r--third_party/git/t/t5515/refs.br-branches-one-merge_branches-one (renamed from t/t5515/refs.br-branches-one-merge_branches-one)0
-rw-r--r--third_party/git/t/t5515/refs.br-branches-one-octopus (renamed from t/t5515/refs.br-branches-one-octopus)0
-rw-r--r--third_party/git/t/t5515/refs.br-branches-one-octopus_branches-one (renamed from t/t5515/refs.br-branches-one-octopus_branches-one)0
-rw-r--r--third_party/git/t/t5515/refs.br-branches-one_branches-one (renamed from t/t5515/refs.br-branches-one_branches-one)0
-rw-r--r--third_party/git/t/t5515/refs.br-config-explicit (renamed from t/t5515/refs.br-config-explicit)0
-rw-r--r--third_party/git/t/t5515/refs.br-config-explicit-merge (renamed from t/t5515/refs.br-config-explicit-merge)0
-rw-r--r--third_party/git/t/t5515/refs.br-config-explicit-merge_config-explicit (renamed from t/t5515/refs.br-config-explicit-merge_config-explicit)0
-rw-r--r--third_party/git/t/t5515/refs.br-config-explicit-octopus (renamed from t/t5515/refs.br-config-explicit-octopus)0
-rw-r--r--third_party/git/t/t5515/refs.br-config-explicit-octopus_config-explicit (renamed from t/t5515/refs.br-config-explicit-octopus_config-explicit)0
-rw-r--r--third_party/git/t/t5515/refs.br-config-explicit_config-explicit (renamed from t/t5515/refs.br-config-explicit_config-explicit)0
-rw-r--r--third_party/git/t/t5515/refs.br-config-glob (renamed from t/t5515/refs.br-config-glob)0
-rw-r--r--third_party/git/t/t5515/refs.br-config-glob-merge (renamed from t/t5515/refs.br-config-glob-merge)0
-rw-r--r--third_party/git/t/t5515/refs.br-config-glob-merge_config-glob (renamed from t/t5515/refs.br-config-glob-merge_config-glob)0
-rw-r--r--third_party/git/t/t5515/refs.br-config-glob-octopus (renamed from t/t5515/refs.br-config-glob-octopus)0
-rw-r--r--third_party/git/t/t5515/refs.br-config-glob-octopus_config-glob (renamed from t/t5515/refs.br-config-glob-octopus_config-glob)0
-rw-r--r--third_party/git/t/t5515/refs.br-config-glob_config-glob (renamed from t/t5515/refs.br-config-glob_config-glob)0
-rw-r--r--third_party/git/t/t5515/refs.br-remote-explicit (renamed from t/t5515/refs.br-remote-explicit)0
-rw-r--r--third_party/git/t/t5515/refs.br-remote-explicit-merge (renamed from t/t5515/refs.br-remote-explicit-merge)0
-rw-r--r--third_party/git/t/t5515/refs.br-remote-explicit-merge_remote-explicit (renamed from t/t5515/refs.br-remote-explicit-merge_remote-explicit)0
-rw-r--r--third_party/git/t/t5515/refs.br-remote-explicit-octopus (renamed from t/t5515/refs.br-remote-explicit-octopus)0
-rw-r--r--third_party/git/t/t5515/refs.br-remote-explicit-octopus_remote-explicit (renamed from t/t5515/refs.br-remote-explicit-octopus_remote-explicit)0
-rw-r--r--third_party/git/t/t5515/refs.br-remote-explicit_remote-explicit (renamed from t/t5515/refs.br-remote-explicit_remote-explicit)0
-rw-r--r--third_party/git/t/t5515/refs.br-remote-glob (renamed from t/t5515/refs.br-remote-glob)0
-rw-r--r--third_party/git/t/t5515/refs.br-remote-glob-merge (renamed from t/t5515/refs.br-remote-glob-merge)0
-rw-r--r--third_party/git/t/t5515/refs.br-remote-glob-merge_remote-glob (renamed from t/t5515/refs.br-remote-glob-merge_remote-glob)0
-rw-r--r--third_party/git/t/t5515/refs.br-remote-glob-octopus (renamed from t/t5515/refs.br-remote-glob-octopus)0
-rw-r--r--third_party/git/t/t5515/refs.br-remote-glob-octopus_remote-glob (renamed from t/t5515/refs.br-remote-glob-octopus_remote-glob)0
-rw-r--r--third_party/git/t/t5515/refs.br-remote-glob_remote-glob (renamed from t/t5515/refs.br-remote-glob_remote-glob)0
-rw-r--r--third_party/git/t/t5515/refs.br-unconfig (renamed from t/t5515/refs.br-unconfig)0
-rw-r--r--third_party/git/t/t5515/refs.br-unconfig_--tags_.._.git (renamed from t/t5515/refs.br-unconfig_--tags_.._.git)0
-rw-r--r--third_party/git/t/t5515/refs.br-unconfig_.._.git (renamed from t/t5515/refs.br-unconfig_.._.git)0
-rw-r--r--third_party/git/t/t5515/refs.br-unconfig_.._.git_one (renamed from t/t5515/refs.br-unconfig_.._.git_one)0
-rw-r--r--third_party/git/t/t5515/refs.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file (renamed from t/t5515/refs.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file)0
-rw-r--r--third_party/git/t/t5515/refs.br-unconfig_.._.git_one_two (renamed from t/t5515/refs.br-unconfig_.._.git_one_two)0
-rw-r--r--third_party/git/t/t5515/refs.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file (renamed from t/t5515/refs.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file)0
-rw-r--r--third_party/git/t/t5515/refs.br-unconfig_.._.git_tag_tag-one_tag_tag-three (renamed from t/t5515/refs.br-unconfig_.._.git_tag_tag-one_tag_tag-three)0
-rw-r--r--third_party/git/t/t5515/refs.br-unconfig_branches-default (renamed from t/t5515/refs.br-unconfig_branches-default)0
-rw-r--r--third_party/git/t/t5515/refs.br-unconfig_branches-one (renamed from t/t5515/refs.br-unconfig_branches-one)0
-rw-r--r--third_party/git/t/t5515/refs.br-unconfig_config-explicit (renamed from t/t5515/refs.br-unconfig_config-explicit)0
-rw-r--r--third_party/git/t/t5515/refs.br-unconfig_config-glob (renamed from t/t5515/refs.br-unconfig_config-glob)0
-rw-r--r--third_party/git/t/t5515/refs.br-unconfig_remote-explicit (renamed from t/t5515/refs.br-unconfig_remote-explicit)0
-rw-r--r--third_party/git/t/t5515/refs.br-unconfig_remote-glob (renamed from t/t5515/refs.br-unconfig_remote-glob)0
-rw-r--r--third_party/git/t/t5515/refs.master (renamed from t/t5515/refs.master)0
-rw-r--r--third_party/git/t/t5515/refs.master_--tags_.._.git (renamed from t/t5515/refs.master_--tags_.._.git)0
-rw-r--r--third_party/git/t/t5515/refs.master_.._.git (renamed from t/t5515/refs.master_.._.git)0
-rw-r--r--third_party/git/t/t5515/refs.master_.._.git_one (renamed from t/t5515/refs.master_.._.git_one)0
-rw-r--r--third_party/git/t/t5515/refs.master_.._.git_one_tag_tag-one_tag_tag-three-file (renamed from t/t5515/refs.master_.._.git_one_tag_tag-one_tag_tag-three-file)0
-rw-r--r--third_party/git/t/t5515/refs.master_.._.git_one_two (renamed from t/t5515/refs.master_.._.git_one_two)0
-rw-r--r--third_party/git/t/t5515/refs.master_.._.git_tag_tag-one-tree_tag_tag-three-file (renamed from t/t5515/refs.master_.._.git_tag_tag-one-tree_tag_tag-three-file)0
-rw-r--r--third_party/git/t/t5515/refs.master_.._.git_tag_tag-one_tag_tag-three (renamed from t/t5515/refs.master_.._.git_tag_tag-one_tag_tag-three)0
-rw-r--r--third_party/git/t/t5515/refs.master_branches-default (renamed from t/t5515/refs.master_branches-default)0
-rw-r--r--third_party/git/t/t5515/refs.master_branches-one (renamed from t/t5515/refs.master_branches-one)0
-rw-r--r--third_party/git/t/t5515/refs.master_config-explicit (renamed from t/t5515/refs.master_config-explicit)0
-rw-r--r--third_party/git/t/t5515/refs.master_config-glob (renamed from t/t5515/refs.master_config-glob)0
-rw-r--r--third_party/git/t/t5515/refs.master_remote-explicit (renamed from t/t5515/refs.master_remote-explicit)0
-rw-r--r--third_party/git/t/t5515/refs.master_remote-glob (renamed from t/t5515/refs.master_remote-glob)0
-rwxr-xr-xthird_party/git/t/t5516-fetch-push.sh (renamed from t/t5516-fetch-push.sh)0
-rwxr-xr-xthird_party/git/t/t5517-push-mirror.sh (renamed from t/t5517-push-mirror.sh)0
-rwxr-xr-xthird_party/git/t/t5518-fetch-exit-status.sh (renamed from t/t5518-fetch-exit-status.sh)0
-rwxr-xr-xthird_party/git/t/t5519-push-alternates.sh (renamed from t/t5519-push-alternates.sh)0
-rwxr-xr-xthird_party/git/t/t5520-pull.sh (renamed from t/t5520-pull.sh)0
-rwxr-xr-xthird_party/git/t/t5521-pull-options.sh (renamed from t/t5521-pull-options.sh)0
-rwxr-xr-xthird_party/git/t/t5522-pull-symlink.sh (renamed from t/t5522-pull-symlink.sh)0
-rwxr-xr-xthird_party/git/t/t5523-push-upstream.sh (renamed from t/t5523-push-upstream.sh)0
-rwxr-xr-xthird_party/git/t/t5524-pull-msg.sh (renamed from t/t5524-pull-msg.sh)0
-rwxr-xr-xthird_party/git/t/t5525-fetch-tagopt.sh (renamed from t/t5525-fetch-tagopt.sh)0
-rwxr-xr-xthird_party/git/t/t5526-fetch-submodules.sh (renamed from t/t5526-fetch-submodules.sh)0
-rwxr-xr-xthird_party/git/t/t5527-fetch-odd-refs.sh (renamed from t/t5527-fetch-odd-refs.sh)0
-rwxr-xr-xthird_party/git/t/t5528-push-default.sh (renamed from t/t5528-push-default.sh)0
-rwxr-xr-xthird_party/git/t/t5529-push-errors.sh (renamed from t/t5529-push-errors.sh)0
-rwxr-xr-xthird_party/git/t/t5530-upload-pack-error.sh (renamed from t/t5530-upload-pack-error.sh)0
-rwxr-xr-xthird_party/git/t/t5531-deep-submodule-push.sh (renamed from t/t5531-deep-submodule-push.sh)0
-rwxr-xr-xthird_party/git/t/t5532-fetch-proxy.sh (renamed from t/t5532-fetch-proxy.sh)0
-rwxr-xr-xthird_party/git/t/t5533-push-cas.sh (renamed from t/t5533-push-cas.sh)0
-rwxr-xr-xthird_party/git/t/t5534-push-signed.sh (renamed from t/t5534-push-signed.sh)0
-rwxr-xr-xthird_party/git/t/t5535-fetch-push-symref.sh (renamed from t/t5535-fetch-push-symref.sh)0
-rwxr-xr-xthird_party/git/t/t5536-fetch-conflicts.sh (renamed from t/t5536-fetch-conflicts.sh)0
-rwxr-xr-xthird_party/git/t/t5537-fetch-shallow.sh (renamed from t/t5537-fetch-shallow.sh)0
-rwxr-xr-xthird_party/git/t/t5538-push-shallow.sh (renamed from t/t5538-push-shallow.sh)0
-rwxr-xr-xthird_party/git/t/t5539-fetch-http-shallow.sh (renamed from t/t5539-fetch-http-shallow.sh)0
-rwxr-xr-xthird_party/git/t/t5540-http-push-webdav.sh (renamed from t/t5540-http-push-webdav.sh)0
-rwxr-xr-xthird_party/git/t/t5541-http-push-smart.sh (renamed from t/t5541-http-push-smart.sh)0
-rwxr-xr-xthird_party/git/t/t5542-push-http-shallow.sh (renamed from t/t5542-push-http-shallow.sh)0
-rwxr-xr-xthird_party/git/t/t5543-atomic-push.sh (renamed from t/t5543-atomic-push.sh)0
-rwxr-xr-xthird_party/git/t/t5544-pack-objects-hook.sh (renamed from t/t5544-pack-objects-hook.sh)0
-rwxr-xr-xthird_party/git/t/t5545-push-options.sh (renamed from t/t5545-push-options.sh)0
-rwxr-xr-xthird_party/git/t/t5546-receive-limits.sh (renamed from t/t5546-receive-limits.sh)0
-rwxr-xr-xthird_party/git/t/t5547-push-quarantine.sh (renamed from t/t5547-push-quarantine.sh)0
-rwxr-xr-xthird_party/git/t/t5550-http-fetch-dumb.sh (renamed from t/t5550-http-fetch-dumb.sh)0
-rwxr-xr-xthird_party/git/t/t5551-http-fetch-smart.sh (renamed from t/t5551-http-fetch-smart.sh)0
-rwxr-xr-xthird_party/git/t/t5552-skipping-fetch-negotiator.sh (renamed from t/t5552-skipping-fetch-negotiator.sh)0
-rwxr-xr-xthird_party/git/t/t5560-http-backend-noserver.sh (renamed from t/t5560-http-backend-noserver.sh)0
-rwxr-xr-xthird_party/git/t/t5561-http-backend.sh (renamed from t/t5561-http-backend.sh)0
-rwxr-xr-xthird_party/git/t/t5562-http-backend-content-length.sh (renamed from t/t5562-http-backend-content-length.sh)0
-rw-r--r--third_party/git/t/t5562/invoke-with-content-length.pl (renamed from t/t5562/invoke-with-content-length.pl)0
-rwxr-xr-xthird_party/git/t/t556x_common (renamed from t/t556x_common)0
-rwxr-xr-xthird_party/git/t/t5570-git-daemon.sh (renamed from t/t5570-git-daemon.sh)0
-rwxr-xr-xthird_party/git/t/t5571-pre-push-hook.sh (renamed from t/t5571-pre-push-hook.sh)0
-rwxr-xr-xthird_party/git/t/t5572-pull-submodule.sh (renamed from t/t5572-pull-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t5573-pull-verify-signatures.sh (renamed from t/t5573-pull-verify-signatures.sh)0
-rwxr-xr-xthird_party/git/t/t5580-clone-push-unc.sh (renamed from t/t5580-clone-push-unc.sh)0
-rwxr-xr-xthird_party/git/t/t5581-http-curl-verbose.sh (renamed from t/t5581-http-curl-verbose.sh)0
-rwxr-xr-xthird_party/git/t/t5600-clone-fail-cleanup.sh (renamed from t/t5600-clone-fail-cleanup.sh)0
-rwxr-xr-xthird_party/git/t/t5601-clone.sh (renamed from t/t5601-clone.sh)0
-rwxr-xr-xthird_party/git/t/t5602-clone-remote-exec.sh (renamed from t/t5602-clone-remote-exec.sh)0
-rwxr-xr-xthird_party/git/t/t5603-clone-dirname.sh (renamed from t/t5603-clone-dirname.sh)0
-rwxr-xr-xthird_party/git/t/t5604-clone-reference.sh (renamed from t/t5604-clone-reference.sh)0
-rwxr-xr-xthird_party/git/t/t5605-clone-local.sh (renamed from t/t5605-clone-local.sh)0
-rwxr-xr-xthird_party/git/t/t5606-clone-options.sh (renamed from t/t5606-clone-options.sh)0
-rwxr-xr-xthird_party/git/t/t5607-clone-bundle.sh (renamed from t/t5607-clone-bundle.sh)0
-rwxr-xr-xthird_party/git/t/t5608-clone-2gb.sh (renamed from t/t5608-clone-2gb.sh)0
-rwxr-xr-xthird_party/git/t/t5609-clone-branch.sh (renamed from t/t5609-clone-branch.sh)0
-rwxr-xr-xthird_party/git/t/t5610-clone-detached.sh (renamed from t/t5610-clone-detached.sh)0
-rwxr-xr-xthird_party/git/t/t5611-clone-config.sh (renamed from t/t5611-clone-config.sh)0
-rwxr-xr-xthird_party/git/t/t5612-clone-refspec.sh (renamed from t/t5612-clone-refspec.sh)0
-rwxr-xr-xthird_party/git/t/t5613-info-alternate.sh (renamed from t/t5613-info-alternate.sh)0
-rwxr-xr-xthird_party/git/t/t5614-clone-submodules-shallow.sh (renamed from t/t5614-clone-submodules-shallow.sh)0
-rwxr-xr-xthird_party/git/t/t5615-alternate-env.sh (renamed from t/t5615-alternate-env.sh)0
-rwxr-xr-xthird_party/git/t/t5616-partial-clone.sh (renamed from t/t5616-partial-clone.sh)0
-rwxr-xr-xthird_party/git/t/t5617-clone-submodules-remote.sh (renamed from t/t5617-clone-submodules-remote.sh)0
-rwxr-xr-xthird_party/git/t/t5618-alternate-refs.sh (renamed from t/t5618-alternate-refs.sh)0
-rwxr-xr-xthird_party/git/t/t5700-protocol-v1.sh (renamed from t/t5700-protocol-v1.sh)0
-rwxr-xr-xthird_party/git/t/t5701-git-serve.sh (renamed from t/t5701-git-serve.sh)0
-rwxr-xr-xthird_party/git/t/t5702-protocol-v2.sh (renamed from t/t5702-protocol-v2.sh)0
-rwxr-xr-xthird_party/git/t/t5703-upload-pack-ref-in-want.sh (renamed from t/t5703-upload-pack-ref-in-want.sh)0
-rwxr-xr-xthird_party/git/t/t5801-remote-helpers.sh (renamed from t/t5801-remote-helpers.sh)0
-rwxr-xr-xthird_party/git/t/t5801/git-remote-testgit (renamed from t/t5801/git-remote-testgit)0
-rwxr-xr-xthird_party/git/t/t5802-connect-helper.sh (renamed from t/t5802-connect-helper.sh)0
-rwxr-xr-xthird_party/git/t/t5810-proto-disable-local.sh (renamed from t/t5810-proto-disable-local.sh)0
-rwxr-xr-xthird_party/git/t/t5811-proto-disable-git.sh (renamed from t/t5811-proto-disable-git.sh)0
-rwxr-xr-xthird_party/git/t/t5812-proto-disable-http.sh (renamed from t/t5812-proto-disable-http.sh)0
-rwxr-xr-xthird_party/git/t/t5813-proto-disable-ssh.sh (renamed from t/t5813-proto-disable-ssh.sh)0
-rwxr-xr-xthird_party/git/t/t5814-proto-disable-ext.sh (renamed from t/t5814-proto-disable-ext.sh)0
-rwxr-xr-xthird_party/git/t/t5815-submodule-protos.sh (renamed from t/t5815-submodule-protos.sh)0
-rwxr-xr-xthird_party/git/t/t5900-repo-selection.sh (renamed from t/t5900-repo-selection.sh)0
-rwxr-xr-xthird_party/git/t/t6000-rev-list-misc.sh (renamed from t/t6000-rev-list-misc.sh)0
-rwxr-xr-xthird_party/git/t/t6001-rev-list-graft.sh (renamed from t/t6001-rev-list-graft.sh)0
-rwxr-xr-xthird_party/git/t/t6002-rev-list-bisect.sh (renamed from t/t6002-rev-list-bisect.sh)0
-rwxr-xr-xthird_party/git/t/t6003-rev-list-topo-order.sh (renamed from t/t6003-rev-list-topo-order.sh)0
-rwxr-xr-xthird_party/git/t/t6004-rev-list-path-optim.sh (renamed from t/t6004-rev-list-path-optim.sh)0
-rwxr-xr-xthird_party/git/t/t6005-rev-list-count.sh (renamed from t/t6005-rev-list-count.sh)0
-rwxr-xr-xthird_party/git/t/t6006-rev-list-format.sh (renamed from t/t6006-rev-list-format.sh)0
-rwxr-xr-xthird_party/git/t/t6007-rev-list-cherry-pick-file.sh (renamed from t/t6007-rev-list-cherry-pick-file.sh)0
-rwxr-xr-xthird_party/git/t/t6008-rev-list-submodule.sh (renamed from t/t6008-rev-list-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t6009-rev-list-parent.sh (renamed from t/t6009-rev-list-parent.sh)0
-rwxr-xr-xthird_party/git/t/t6010-merge-base.sh (renamed from t/t6010-merge-base.sh)0
-rwxr-xr-xthird_party/git/t/t6011-rev-list-with-bad-commit.sh (renamed from t/t6011-rev-list-with-bad-commit.sh)0
-rwxr-xr-xthird_party/git/t/t6012-rev-list-simplify.sh (renamed from t/t6012-rev-list-simplify.sh)0
-rwxr-xr-xthird_party/git/t/t6013-rev-list-reverse-parents.sh (renamed from t/t6013-rev-list-reverse-parents.sh)0
-rwxr-xr-xthird_party/git/t/t6014-rev-list-all.sh (renamed from t/t6014-rev-list-all.sh)0
-rwxr-xr-xthird_party/git/t/t6016-rev-list-graph-simplify-history.sh (renamed from t/t6016-rev-list-graph-simplify-history.sh)0
-rwxr-xr-xthird_party/git/t/t6017-rev-list-stdin.sh (renamed from t/t6017-rev-list-stdin.sh)0
-rwxr-xr-xthird_party/git/t/t6018-rev-list-glob.sh (renamed from t/t6018-rev-list-glob.sh)0
-rwxr-xr-xthird_party/git/t/t6019-rev-list-ancestry-path.sh (renamed from t/t6019-rev-list-ancestry-path.sh)0
-rwxr-xr-xthird_party/git/t/t6020-merge-df.sh (renamed from t/t6020-merge-df.sh)0
-rwxr-xr-xthird_party/git/t/t6021-merge-criss-cross.sh (renamed from t/t6021-merge-criss-cross.sh)0
-rwxr-xr-xthird_party/git/t/t6022-merge-rename.sh (renamed from t/t6022-merge-rename.sh)0
-rwxr-xr-xthird_party/git/t/t6023-merge-file.sh (renamed from t/t6023-merge-file.sh)0
-rwxr-xr-xthird_party/git/t/t6024-recursive-merge.sh (renamed from t/t6024-recursive-merge.sh)0
-rwxr-xr-xthird_party/git/t/t6025-merge-symlinks.sh (renamed from t/t6025-merge-symlinks.sh)0
-rwxr-xr-xthird_party/git/t/t6026-merge-attr.sh (renamed from t/t6026-merge-attr.sh)0
-rwxr-xr-xthird_party/git/t/t6027-merge-binary.sh (renamed from t/t6027-merge-binary.sh)0
-rwxr-xr-xthird_party/git/t/t6028-merge-up-to-date.sh (renamed from t/t6028-merge-up-to-date.sh)0
-rwxr-xr-xthird_party/git/t/t6029-merge-subtree.sh (renamed from t/t6029-merge-subtree.sh)0
-rwxr-xr-xthird_party/git/t/t6030-bisect-porcelain.sh (renamed from t/t6030-bisect-porcelain.sh)0
-rwxr-xr-xthird_party/git/t/t6031-merge-filemode.sh (renamed from t/t6031-merge-filemode.sh)0
-rwxr-xr-xthird_party/git/t/t6032-merge-large-rename.sh (renamed from t/t6032-merge-large-rename.sh)0
-rwxr-xr-xthird_party/git/t/t6033-merge-crlf.sh (renamed from t/t6033-merge-crlf.sh)0
-rwxr-xr-xthird_party/git/t/t6034-merge-rename-nocruft.sh (renamed from t/t6034-merge-rename-nocruft.sh)0
-rwxr-xr-xthird_party/git/t/t6035-merge-dir-to-symlink.sh (renamed from t/t6035-merge-dir-to-symlink.sh)0
-rwxr-xr-xthird_party/git/t/t6036-recursive-corner-cases.sh (renamed from t/t6036-recursive-corner-cases.sh)0
-rwxr-xr-xthird_party/git/t/t6037-merge-ours-theirs.sh (renamed from t/t6037-merge-ours-theirs.sh)0
-rwxr-xr-xthird_party/git/t/t6038-merge-text-auto.sh (renamed from t/t6038-merge-text-auto.sh)0
-rwxr-xr-xthird_party/git/t/t6039-merge-ignorecase.sh (renamed from t/t6039-merge-ignorecase.sh)0
-rwxr-xr-xthird_party/git/t/t6040-tracking-info.sh (renamed from t/t6040-tracking-info.sh)0
-rwxr-xr-xthird_party/git/t/t6041-bisect-submodule.sh (renamed from t/t6041-bisect-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t6042-merge-rename-corner-cases.sh (renamed from t/t6042-merge-rename-corner-cases.sh)0
-rwxr-xr-xthird_party/git/t/t6043-merge-rename-directories.sh (renamed from t/t6043-merge-rename-directories.sh)0
-rwxr-xr-xthird_party/git/t/t6044-merge-unrelated-index-changes.sh (renamed from t/t6044-merge-unrelated-index-changes.sh)0
-rwxr-xr-xthird_party/git/t/t6045-merge-rename-delete.sh (renamed from t/t6045-merge-rename-delete.sh)0
-rwxr-xr-xthird_party/git/t/t6046-merge-skip-unneeded-updates.sh (renamed from t/t6046-merge-skip-unneeded-updates.sh)0
-rwxr-xr-xthird_party/git/t/t6050-replace.sh (renamed from t/t6050-replace.sh)0
-rwxr-xr-xthird_party/git/t/t6060-merge-index.sh (renamed from t/t6060-merge-index.sh)0
-rwxr-xr-xthird_party/git/t/t6100-rev-list-in-order.sh (renamed from t/t6100-rev-list-in-order.sh)0
-rwxr-xr-xthird_party/git/t/t6101-rev-parse-parents.sh (renamed from t/t6101-rev-parse-parents.sh)0
-rwxr-xr-xthird_party/git/t/t6102-rev-list-unexpected-objects.sh (renamed from t/t6102-rev-list-unexpected-objects.sh)0
-rwxr-xr-xthird_party/git/t/t6110-rev-list-sparse.sh (renamed from t/t6110-rev-list-sparse.sh)0
-rwxr-xr-xthird_party/git/t/t6111-rev-list-treesame.sh (renamed from t/t6111-rev-list-treesame.sh)0
-rwxr-xr-xthird_party/git/t/t6112-rev-list-filters-objects.sh (renamed from t/t6112-rev-list-filters-objects.sh)0
-rwxr-xr-xthird_party/git/t/t6120-describe.sh (renamed from t/t6120-describe.sh)0
-rwxr-xr-xthird_party/git/t/t6130-pathspec-noglob.sh (renamed from t/t6130-pathspec-noglob.sh)0
-rwxr-xr-xthird_party/git/t/t6131-pathspec-icase.sh (renamed from t/t6131-pathspec-icase.sh)0
-rwxr-xr-xthird_party/git/t/t6132-pathspec-exclude.sh (renamed from t/t6132-pathspec-exclude.sh)0
-rwxr-xr-xthird_party/git/t/t6133-pathspec-rev-dwim.sh (renamed from t/t6133-pathspec-rev-dwim.sh)0
-rwxr-xr-xthird_party/git/t/t6134-pathspec-in-submodule.sh (renamed from t/t6134-pathspec-in-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t6135-pathspec-with-attrs.sh (renamed from t/t6135-pathspec-with-attrs.sh)0
-rwxr-xr-xthird_party/git/t/t6200-fmt-merge-msg.sh (renamed from t/t6200-fmt-merge-msg.sh)0
-rwxr-xr-xthird_party/git/t/t6300-for-each-ref.sh (renamed from t/t6300-for-each-ref.sh)0
-rwxr-xr-xthird_party/git/t/t6301-for-each-ref-errors.sh (renamed from t/t6301-for-each-ref-errors.sh)0
-rwxr-xr-xthird_party/git/t/t6302-for-each-ref-filter.sh (renamed from t/t6302-for-each-ref-filter.sh)0
-rwxr-xr-xthird_party/git/t/t6500-gc.sh (renamed from t/t6500-gc.sh)0
-rwxr-xr-xthird_party/git/t/t6501-freshen-objects.sh (renamed from t/t6501-freshen-objects.sh)0
-rwxr-xr-xthird_party/git/t/t6600-test-reach.sh (renamed from t/t6600-test-reach.sh)0
-rwxr-xr-xthird_party/git/t/t7001-mv.sh (renamed from t/t7001-mv.sh)0
-rwxr-xr-xthird_party/git/t/t7003-filter-branch.sh (renamed from t/t7003-filter-branch.sh)0
-rwxr-xr-xthird_party/git/t/t7004-tag.sh (renamed from t/t7004-tag.sh)0
-rwxr-xr-xthird_party/git/t/t7005-editor.sh (renamed from t/t7005-editor.sh)0
-rwxr-xr-xthird_party/git/t/t7006-pager.sh (renamed from t/t7006-pager.sh)0
-rwxr-xr-xthird_party/git/t/t7007-show.sh (renamed from t/t7007-show.sh)0
-rwxr-xr-xthird_party/git/t/t7008-grep-binary.sh (renamed from t/t7008-grep-binary.sh)0
-rwxr-xr-xthird_party/git/t/t7009-filter-branch-null-sha1.sh (renamed from t/t7009-filter-branch-null-sha1.sh)0
-rwxr-xr-xthird_party/git/t/t7010-setup.sh (renamed from t/t7010-setup.sh)0
-rwxr-xr-xthird_party/git/t/t7011-skip-worktree-reading.sh (renamed from t/t7011-skip-worktree-reading.sh)0
-rwxr-xr-xthird_party/git/t/t7012-skip-worktree-writing.sh (renamed from t/t7012-skip-worktree-writing.sh)0
-rwxr-xr-xthird_party/git/t/t7030-verify-tag.sh (renamed from t/t7030-verify-tag.sh)0
-rwxr-xr-xthird_party/git/t/t7060-wtstatus.sh (renamed from t/t7060-wtstatus.sh)0
-rwxr-xr-xthird_party/git/t/t7061-wtstatus-ignore.sh (renamed from t/t7061-wtstatus-ignore.sh)0
-rwxr-xr-xthird_party/git/t/t7062-wtstatus-ignorecase.sh (renamed from t/t7062-wtstatus-ignorecase.sh)0
-rwxr-xr-xthird_party/git/t/t7063-status-untracked-cache.sh (renamed from t/t7063-status-untracked-cache.sh)0
-rwxr-xr-xthird_party/git/t/t7064-wtstatus-pv2.sh (renamed from t/t7064-wtstatus-pv2.sh)0
-rwxr-xr-xthird_party/git/t/t7101-reset-empty-subdirs.sh (renamed from t/t7101-reset-empty-subdirs.sh)0
-rwxr-xr-xthird_party/git/t/t7102-reset.sh (renamed from t/t7102-reset.sh)0
-rwxr-xr-xthird_party/git/t/t7103-reset-bare.sh (renamed from t/t7103-reset-bare.sh)0
-rwxr-xr-xthird_party/git/t/t7104-reset-hard.sh (renamed from t/t7104-reset-hard.sh)0
-rwxr-xr-xthird_party/git/t/t7105-reset-patch.sh (renamed from t/t7105-reset-patch.sh)0
-rwxr-xr-xthird_party/git/t/t7106-reset-unborn-branch.sh (renamed from t/t7106-reset-unborn-branch.sh)0
-rwxr-xr-xthird_party/git/t/t7110-reset-merge.sh (renamed from t/t7110-reset-merge.sh)0
-rwxr-xr-xthird_party/git/t/t7111-reset-table.sh (renamed from t/t7111-reset-table.sh)0
-rwxr-xr-xthird_party/git/t/t7112-reset-submodule.sh (renamed from t/t7112-reset-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t7113-post-index-change-hook.sh (renamed from t/t7113-post-index-change-hook.sh)0
-rwxr-xr-xthird_party/git/t/t7201-co.sh (renamed from t/t7201-co.sh)0
-rwxr-xr-xthird_party/git/t/t7300-clean.sh (renamed from t/t7300-clean.sh)0
-rwxr-xr-xthird_party/git/t/t7301-clean-interactive.sh (renamed from t/t7301-clean-interactive.sh)0
-rwxr-xr-xthird_party/git/t/t7400-submodule-basic.sh (renamed from t/t7400-submodule-basic.sh)0
-rwxr-xr-xthird_party/git/t/t7401-submodule-summary.sh (renamed from t/t7401-submodule-summary.sh)0
-rwxr-xr-xthird_party/git/t/t7402-submodule-rebase.sh (renamed from t/t7402-submodule-rebase.sh)0
-rwxr-xr-xthird_party/git/t/t7403-submodule-sync.sh (renamed from t/t7403-submodule-sync.sh)0
-rwxr-xr-xthird_party/git/t/t7405-submodule-merge.sh (renamed from t/t7405-submodule-merge.sh)0
-rwxr-xr-xthird_party/git/t/t7406-submodule-update.sh (renamed from t/t7406-submodule-update.sh)0
-rwxr-xr-xthird_party/git/t/t7407-submodule-foreach.sh (renamed from t/t7407-submodule-foreach.sh)0
-rwxr-xr-xthird_party/git/t/t7408-submodule-reference.sh (renamed from t/t7408-submodule-reference.sh)0
-rwxr-xr-xthird_party/git/t/t7409-submodule-detached-work-tree.sh (renamed from t/t7409-submodule-detached-work-tree.sh)0
-rwxr-xr-xthird_party/git/t/t7410-submodule-checkout-to.sh (renamed from t/t7410-submodule-checkout-to.sh)0
-rwxr-xr-xthird_party/git/t/t7411-submodule-config.sh (renamed from t/t7411-submodule-config.sh)0
-rwxr-xr-xthird_party/git/t/t7412-submodule-absorbgitdirs.sh (renamed from t/t7412-submodule-absorbgitdirs.sh)0
-rwxr-xr-xthird_party/git/t/t7413-submodule-is-active.sh (renamed from t/t7413-submodule-is-active.sh)0
-rwxr-xr-xthird_party/git/t/t7414-submodule-mistakes.sh (renamed from t/t7414-submodule-mistakes.sh)0
-rwxr-xr-xthird_party/git/t/t7415-submodule-names.sh (renamed from t/t7415-submodule-names.sh)0
-rwxr-xr-xthird_party/git/t/t7416-submodule-dash-url.sh (renamed from t/t7416-submodule-dash-url.sh)0
-rwxr-xr-xthird_party/git/t/t7417-submodule-path-url.sh (renamed from t/t7417-submodule-path-url.sh)0
-rwxr-xr-xthird_party/git/t/t7418-submodule-sparse-gitmodules.sh (renamed from t/t7418-submodule-sparse-gitmodules.sh)0
-rwxr-xr-xthird_party/git/t/t7419-submodule-set-branch.sh (renamed from t/t7419-submodule-set-branch.sh)0
-rwxr-xr-xthird_party/git/t/t7500-commit-template-squash-signoff.sh (renamed from t/t7500-commit-template-squash-signoff.sh)0
-rwxr-xr-xthird_party/git/t/t7500/add-comments (renamed from t/t7500/add-comments)0
-rwxr-xr-xthird_party/git/t/t7500/add-content (renamed from t/t7500/add-content)0
-rwxr-xr-xthird_party/git/t/t7500/add-content-and-comment (renamed from t/t7500/add-content-and-comment)0
-rwxr-xr-xthird_party/git/t/t7500/add-signed-off (renamed from t/t7500/add-signed-off)0
-rwxr-xr-xthird_party/git/t/t7500/add-whitespaced-content (renamed from t/t7500/add-whitespaced-content)0
-rwxr-xr-xthird_party/git/t/t7500/edit-content (renamed from t/t7500/edit-content)0
-rwxr-xr-xthird_party/git/t/t7501-commit-basic-functionality.sh (renamed from t/t7501-commit-basic-functionality.sh)0
-rwxr-xr-xthird_party/git/t/t7502-commit-porcelain.sh (renamed from t/t7502-commit-porcelain.sh)0
-rwxr-xr-xthird_party/git/t/t7503-pre-commit-hook.sh (renamed from t/t7503-pre-commit-hook.sh)0
-rwxr-xr-xthird_party/git/t/t7504-commit-msg-hook.sh (renamed from t/t7504-commit-msg-hook.sh)0
-rwxr-xr-xthird_party/git/t/t7505-prepare-commit-msg-hook.sh (renamed from t/t7505-prepare-commit-msg-hook.sh)0
-rw-r--r--third_party/git/t/t7505/expected-rebase-i (renamed from t/t7505/expected-rebase-i)0
-rw-r--r--third_party/git/t/t7505/expected-rebase-p (renamed from t/t7505/expected-rebase-p)0
-rwxr-xr-xthird_party/git/t/t7506-status-submodule.sh (renamed from t/t7506-status-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t7507-commit-verbose.sh (renamed from t/t7507-commit-verbose.sh)0
-rwxr-xr-xthird_party/git/t/t7508-status.sh (renamed from t/t7508-status.sh)0
-rwxr-xr-xthird_party/git/t/t7509-commit-authorship.sh (renamed from t/t7509-commit-authorship.sh)0
-rwxr-xr-xthird_party/git/t/t7510-signed-commit.sh (renamed from t/t7510-signed-commit.sh)0
-rwxr-xr-xthird_party/git/t/t7511-status-index.sh (renamed from t/t7511-status-index.sh)0
-rwxr-xr-xthird_party/git/t/t7512-status-help.sh (renamed from t/t7512-status-help.sh)0
-rwxr-xr-xthird_party/git/t/t7513-interpret-trailers.sh (renamed from t/t7513-interpret-trailers.sh)0
-rwxr-xr-xthird_party/git/t/t7514-commit-patch.sh (renamed from t/t7514-commit-patch.sh)0
-rwxr-xr-xthird_party/git/t/t7515-status-symlinks.sh (renamed from t/t7515-status-symlinks.sh)0
-rwxr-xr-xthird_party/git/t/t7516-commit-races.sh (renamed from t/t7516-commit-races.sh)0
-rwxr-xr-xthird_party/git/t/t7517-per-repo-email.sh (renamed from t/t7517-per-repo-email.sh)0
-rwxr-xr-xthird_party/git/t/t7518-ident-corner-cases.sh (renamed from t/t7518-ident-corner-cases.sh)0
-rwxr-xr-xthird_party/git/t/t7519-status-fsmonitor.sh (renamed from t/t7519-status-fsmonitor.sh)0
-rwxr-xr-xthird_party/git/t/t7519/fsmonitor-all (renamed from t/t7519/fsmonitor-all)0
-rwxr-xr-xthird_party/git/t/t7519/fsmonitor-none (renamed from t/t7519/fsmonitor-none)0
-rwxr-xr-xthird_party/git/t/t7519/fsmonitor-watchman (renamed from t/t7519/fsmonitor-watchman)0
-rwxr-xr-xthird_party/git/t/t7520-ignored-hook-warning.sh (renamed from t/t7520-ignored-hook-warning.sh)0
-rwxr-xr-xthird_party/git/t/t7521-ignored-mode.sh (renamed from t/t7521-ignored-mode.sh)0
-rwxr-xr-xthird_party/git/t/t7525-status-rename.sh (renamed from t/t7525-status-rename.sh)0
-rwxr-xr-xthird_party/git/t/t7600-merge.sh (renamed from t/t7600-merge.sh)0
-rwxr-xr-xthird_party/git/t/t7601-merge-pull-config.sh (renamed from t/t7601-merge-pull-config.sh)0
-rwxr-xr-xthird_party/git/t/t7602-merge-octopus-many.sh (renamed from t/t7602-merge-octopus-many.sh)0
-rwxr-xr-xthird_party/git/t/t7603-merge-reduce-heads.sh (renamed from t/t7603-merge-reduce-heads.sh)0
-rwxr-xr-xthird_party/git/t/t7604-merge-custom-message.sh (renamed from t/t7604-merge-custom-message.sh)0
-rwxr-xr-xthird_party/git/t/t7605-merge-resolve.sh (renamed from t/t7605-merge-resolve.sh)0
-rwxr-xr-xthird_party/git/t/t7606-merge-custom.sh (renamed from t/t7606-merge-custom.sh)0
-rwxr-xr-xthird_party/git/t/t7607-merge-overwrite.sh (renamed from t/t7607-merge-overwrite.sh)0
-rwxr-xr-xthird_party/git/t/t7608-merge-messages.sh (renamed from t/t7608-merge-messages.sh)0
-rwxr-xr-xthird_party/git/t/t7609-merge-co-error-msgs.sh (renamed from t/t7609-merge-co-error-msgs.sh)0
-rwxr-xr-xthird_party/git/t/t7610-mergetool.sh (renamed from t/t7610-mergetool.sh)0
-rwxr-xr-xthird_party/git/t/t7611-merge-abort.sh (renamed from t/t7611-merge-abort.sh)0
-rwxr-xr-xthird_party/git/t/t7612-merge-verify-signatures.sh (renamed from t/t7612-merge-verify-signatures.sh)0
-rwxr-xr-xthird_party/git/t/t7613-merge-submodule.sh (renamed from t/t7613-merge-submodule.sh)0
-rwxr-xr-xthird_party/git/t/t7614-merge-signoff.sh (renamed from t/t7614-merge-signoff.sh)0
-rwxr-xr-xthird_party/git/t/t7700-repack.sh (renamed from t/t7700-repack.sh)0
-rwxr-xr-xthird_party/git/t/t7701-repack-unpack-unreachable.sh (renamed from t/t7701-repack-unpack-unreachable.sh)0
-rwxr-xr-xthird_party/git/t/t7702-repack-cyclic-alternate.sh (renamed from t/t7702-repack-cyclic-alternate.sh)0
-rwxr-xr-xthird_party/git/t/t7800-difftool.sh (renamed from t/t7800-difftool.sh)0
-rwxr-xr-xthird_party/git/t/t7810-grep.sh (renamed from t/t7810-grep.sh)0
-rwxr-xr-xthird_party/git/t/t7811-grep-open.sh (renamed from t/t7811-grep-open.sh)0
-rwxr-xr-xthird_party/git/t/t7812-grep-icase-non-ascii.sh (renamed from t/t7812-grep-icase-non-ascii.sh)0
-rwxr-xr-xthird_party/git/t/t7813-grep-icase-iso.sh (renamed from t/t7813-grep-icase-iso.sh)0
-rwxr-xr-xthird_party/git/t/t7814-grep-recurse-submodules.sh (renamed from t/t7814-grep-recurse-submodules.sh)0
-rwxr-xr-xthird_party/git/t/t8001-annotate.sh (renamed from t/t8001-annotate.sh)0
-rwxr-xr-xthird_party/git/t/t8002-blame.sh (renamed from t/t8002-blame.sh)0
-rwxr-xr-xthird_party/git/t/t8003-blame-corner-cases.sh (renamed from t/t8003-blame-corner-cases.sh)0
-rwxr-xr-xthird_party/git/t/t8004-blame-with-conflicts.sh (renamed from t/t8004-blame-with-conflicts.sh)0
-rwxr-xr-xthird_party/git/t/t8005-blame-i18n.sh (renamed from t/t8005-blame-i18n.sh)0
-rw-r--r--third_party/git/t/t8005/euc-japan.txt (renamed from t/t8005/euc-japan.txt)0
-rw-r--r--third_party/git/t/t8005/sjis.txt (renamed from t/t8005/sjis.txt)0
-rw-r--r--third_party/git/t/t8005/utf8.txt (renamed from t/t8005/utf8.txt)0
-rwxr-xr-xthird_party/git/t/t8006-blame-textconv.sh (renamed from t/t8006-blame-textconv.sh)0
-rwxr-xr-xthird_party/git/t/t8007-cat-file-textconv.sh (renamed from t/t8007-cat-file-textconv.sh)0
-rwxr-xr-xthird_party/git/t/t8008-blame-formats.sh (renamed from t/t8008-blame-formats.sh)0
-rwxr-xr-xthird_party/git/t/t8009-blame-vs-topicbranches.sh (renamed from t/t8009-blame-vs-topicbranches.sh)0
-rwxr-xr-xthird_party/git/t/t8010-cat-file-filters.sh (renamed from t/t8010-cat-file-filters.sh)0
-rwxr-xr-xthird_party/git/t/t8011-blame-split-file.sh (renamed from t/t8011-blame-split-file.sh)0
-rwxr-xr-xthird_party/git/t/t8012-blame-colors.sh (renamed from t/t8012-blame-colors.sh)0
-rwxr-xr-xthird_party/git/t/t8013-blame-ignore-revs.sh (renamed from t/t8013-blame-ignore-revs.sh)0
-rwxr-xr-xthird_party/git/t/t8014-blame-ignore-fuzzy.sh (renamed from t/t8014-blame-ignore-fuzzy.sh)0
-rwxr-xr-xthird_party/git/t/t9001-send-email.sh (renamed from t/t9001-send-email.sh)0
-rwxr-xr-xthird_party/git/t/t9002-column.sh (renamed from t/t9002-column.sh)0
-rwxr-xr-xthird_party/git/t/t9003-help-autocorrect.sh (renamed from t/t9003-help-autocorrect.sh)0
-rwxr-xr-xthird_party/git/t/t9004-example.sh (renamed from t/t9004-example.sh)0
-rwxr-xr-xthird_party/git/t/t9010-svn-fe.sh (renamed from t/t9010-svn-fe.sh)0
-rwxr-xr-xthird_party/git/t/t9011-svn-da.sh (renamed from t/t9011-svn-da.sh)0
-rwxr-xr-xthird_party/git/t/t9020-remote-svn.sh (renamed from t/t9020-remote-svn.sh)0
-rwxr-xr-xthird_party/git/t/t9100-git-svn-basic.sh (renamed from t/t9100-git-svn-basic.sh)0
-rwxr-xr-xthird_party/git/t/t9101-git-svn-props.sh (renamed from t/t9101-git-svn-props.sh)0
-rwxr-xr-xthird_party/git/t/t9102-git-svn-deep-rmdir.sh (renamed from t/t9102-git-svn-deep-rmdir.sh)0
-rwxr-xr-xthird_party/git/t/t9103-git-svn-tracked-directory-removed.sh (renamed from t/t9103-git-svn-tracked-directory-removed.sh)0
-rwxr-xr-xthird_party/git/t/t9104-git-svn-follow-parent.sh (renamed from t/t9104-git-svn-follow-parent.sh)0
-rwxr-xr-xthird_party/git/t/t9105-git-svn-commit-diff.sh (renamed from t/t9105-git-svn-commit-diff.sh)0
-rwxr-xr-xthird_party/git/t/t9106-git-svn-commit-diff-clobber.sh (renamed from t/t9106-git-svn-commit-diff-clobber.sh)0
-rwxr-xr-xthird_party/git/t/t9107-git-svn-migrate.sh (renamed from t/t9107-git-svn-migrate.sh)0
-rwxr-xr-xthird_party/git/t/t9108-git-svn-glob.sh (renamed from t/t9108-git-svn-glob.sh)0
-rwxr-xr-xthird_party/git/t/t9109-git-svn-multi-glob.sh (renamed from t/t9109-git-svn-multi-glob.sh)0
-rwxr-xr-xthird_party/git/t/t9110-git-svn-use-svm-props.sh (renamed from t/t9110-git-svn-use-svm-props.sh)0
-rw-r--r--third_party/git/t/t9110/svm.dump (renamed from t/t9110/svm.dump)0
-rwxr-xr-xthird_party/git/t/t9111-git-svn-use-svnsync-props.sh (renamed from t/t9111-git-svn-use-svnsync-props.sh)0
-rw-r--r--third_party/git/t/t9111/svnsync.dump (renamed from t/t9111/svnsync.dump)0
-rwxr-xr-xthird_party/git/t/t9112-git-svn-md5less-file.sh (renamed from t/t9112-git-svn-md5less-file.sh)0
-rwxr-xr-xthird_party/git/t/t9113-git-svn-dcommit-new-file.sh (renamed from t/t9113-git-svn-dcommit-new-file.sh)0
-rwxr-xr-xthird_party/git/t/t9114-git-svn-dcommit-merge.sh (renamed from t/t9114-git-svn-dcommit-merge.sh)0
-rwxr-xr-xthird_party/git/t/t9115-git-svn-dcommit-funky-renames.sh (renamed from t/t9115-git-svn-dcommit-funky-renames.sh)0
-rw-r--r--third_party/git/t/t9115/funky-names.dump (renamed from t/t9115/funky-names.dump)0
-rwxr-xr-xthird_party/git/t/t9116-git-svn-log.sh (renamed from t/t9116-git-svn-log.sh)0
-rwxr-xr-xthird_party/git/t/t9117-git-svn-init-clone.sh (renamed from t/t9117-git-svn-init-clone.sh)0
-rwxr-xr-xthird_party/git/t/t9118-git-svn-funky-branch-names.sh (renamed from t/t9118-git-svn-funky-branch-names.sh)0
-rwxr-xr-xthird_party/git/t/t9119-git-svn-info.sh (renamed from t/t9119-git-svn-info.sh)0
-rwxr-xr-xthird_party/git/t/t9120-git-svn-clone-with-percent-escapes.sh (renamed from t/t9120-git-svn-clone-with-percent-escapes.sh)0
-rwxr-xr-xthird_party/git/t/t9121-git-svn-fetch-renamed-dir.sh (renamed from t/t9121-git-svn-fetch-renamed-dir.sh)0
-rw-r--r--third_party/git/t/t9121/renamed-dir.dump (renamed from t/t9121/renamed-dir.dump)0
-rwxr-xr-xthird_party/git/t/t9122-git-svn-author.sh (renamed from t/t9122-git-svn-author.sh)0
-rwxr-xr-xthird_party/git/t/t9123-git-svn-rebuild-with-rewriteroot.sh (renamed from t/t9123-git-svn-rebuild-with-rewriteroot.sh)0
-rwxr-xr-xthird_party/git/t/t9124-git-svn-dcommit-auto-props.sh (renamed from t/t9124-git-svn-dcommit-auto-props.sh)0
-rwxr-xr-xthird_party/git/t/t9125-git-svn-multi-glob-branch-names.sh (renamed from t/t9125-git-svn-multi-glob-branch-names.sh)0
-rwxr-xr-xthird_party/git/t/t9126-git-svn-follow-deleted-readded-directory.sh (renamed from t/t9126-git-svn-follow-deleted-readded-directory.sh)0
-rw-r--r--third_party/git/t/t9126/follow-deleted-readded.dump (renamed from t/t9126/follow-deleted-readded.dump)0
-rwxr-xr-xthird_party/git/t/t9127-git-svn-partial-rebuild.sh (renamed from t/t9127-git-svn-partial-rebuild.sh)0
-rwxr-xr-xthird_party/git/t/t9128-git-svn-cmd-branch.sh (renamed from t/t9128-git-svn-cmd-branch.sh)0
-rwxr-xr-xthird_party/git/t/t9129-git-svn-i18n-commitencoding.sh (renamed from t/t9129-git-svn-i18n-commitencoding.sh)0
-rwxr-xr-xthird_party/git/t/t9130-git-svn-authors-file.sh (renamed from t/t9130-git-svn-authors-file.sh)0
-rwxr-xr-xthird_party/git/t/t9131-git-svn-empty-symlink.sh (renamed from t/t9131-git-svn-empty-symlink.sh)0
-rwxr-xr-xthird_party/git/t/t9132-git-svn-broken-symlink.sh (renamed from t/t9132-git-svn-broken-symlink.sh)0
-rwxr-xr-xthird_party/git/t/t9133-git-svn-nested-git-repo.sh (renamed from t/t9133-git-svn-nested-git-repo.sh)0
-rwxr-xr-xthird_party/git/t/t9134-git-svn-ignore-paths.sh (renamed from t/t9134-git-svn-ignore-paths.sh)0
-rwxr-xr-xthird_party/git/t/t9135-git-svn-moved-branch-empty-file.sh (renamed from t/t9135-git-svn-moved-branch-empty-file.sh)0
-rw-r--r--third_party/git/t/t9135/svn.dump (renamed from t/t9135/svn.dump)0
-rwxr-xr-xthird_party/git/t/t9136-git-svn-recreated-branch-empty-file.sh (renamed from t/t9136-git-svn-recreated-branch-empty-file.sh)0
-rw-r--r--third_party/git/t/t9136/svn.dump (renamed from t/t9136/svn.dump)0
-rwxr-xr-xthird_party/git/t/t9137-git-svn-dcommit-clobber-series.sh (renamed from t/t9137-git-svn-dcommit-clobber-series.sh)0
-rwxr-xr-xthird_party/git/t/t9138-git-svn-authors-prog.sh (renamed from t/t9138-git-svn-authors-prog.sh)0
-rwxr-xr-xthird_party/git/t/t9139-git-svn-non-utf8-commitencoding.sh (renamed from t/t9139-git-svn-non-utf8-commitencoding.sh)0
-rwxr-xr-xthird_party/git/t/t9140-git-svn-reset.sh (renamed from t/t9140-git-svn-reset.sh)0
-rwxr-xr-xthird_party/git/t/t9141-git-svn-multiple-branches.sh (renamed from t/t9141-git-svn-multiple-branches.sh)0
-rwxr-xr-xthird_party/git/t/t9142-git-svn-shallow-clone.sh (renamed from t/t9142-git-svn-shallow-clone.sh)0
-rwxr-xr-xthird_party/git/t/t9143-git-svn-gc.sh (renamed from t/t9143-git-svn-gc.sh)0
-rwxr-xr-xthird_party/git/t/t9144-git-svn-old-rev_map.sh (renamed from t/t9144-git-svn-old-rev_map.sh)0
-rwxr-xr-xthird_party/git/t/t9145-git-svn-master-branch.sh (renamed from t/t9145-git-svn-master-branch.sh)0
-rwxr-xr-xthird_party/git/t/t9146-git-svn-empty-dirs.sh (renamed from t/t9146-git-svn-empty-dirs.sh)0
-rwxr-xr-xthird_party/git/t/t9147-git-svn-include-paths.sh (renamed from t/t9147-git-svn-include-paths.sh)0
-rwxr-xr-xthird_party/git/t/t9148-git-svn-propset.sh (renamed from t/t9148-git-svn-propset.sh)0
-rwxr-xr-xthird_party/git/t/t9150-svk-mergetickets.sh (renamed from t/t9150-svk-mergetickets.sh)0
-rwxr-xr-xthird_party/git/t/t9150/make-svk-dump (renamed from t/t9150/make-svk-dump)0
-rw-r--r--third_party/git/t/t9150/svk-merge.dump (renamed from t/t9150/svk-merge.dump)0
-rwxr-xr-xthird_party/git/t/t9151-svn-mergeinfo.sh (renamed from t/t9151-svn-mergeinfo.sh)0
-rw-r--r--third_party/git/t/t9151/.gitignore (renamed from t/t9151/.gitignore)0
-rwxr-xr-xthird_party/git/t/t9151/make-svnmerge-dump (renamed from t/t9151/make-svnmerge-dump)0
-rw-r--r--third_party/git/t/t9151/svn-mergeinfo.dump (renamed from t/t9151/svn-mergeinfo.dump)0
-rwxr-xr-xthird_party/git/t/t9152-svn-empty-dirs-after-gc.sh (renamed from t/t9152-svn-empty-dirs-after-gc.sh)0
-rwxr-xr-xthird_party/git/t/t9153-git-svn-rewrite-uuid.sh (renamed from t/t9153-git-svn-rewrite-uuid.sh)0
-rw-r--r--third_party/git/t/t9153/svn.dump (renamed from t/t9153/svn.dump)0
-rwxr-xr-xthird_party/git/t/t9154-git-svn-fancy-glob.sh (renamed from t/t9154-git-svn-fancy-glob.sh)0
-rw-r--r--third_party/git/t/t9154/svn.dump (renamed from t/t9154/svn.dump)0
-rwxr-xr-xthird_party/git/t/t9155-git-svn-fetch-deleted-tag.sh (renamed from t/t9155-git-svn-fetch-deleted-tag.sh)0
-rwxr-xr-xthird_party/git/t/t9156-git-svn-fetch-deleted-tag-2.sh (renamed from t/t9156-git-svn-fetch-deleted-tag-2.sh)0
-rwxr-xr-xthird_party/git/t/t9157-git-svn-fetch-merge.sh (renamed from t/t9157-git-svn-fetch-merge.sh)0
-rwxr-xr-xthird_party/git/t/t9158-git-svn-mergeinfo.sh (renamed from t/t9158-git-svn-mergeinfo.sh)0
-rwxr-xr-xthird_party/git/t/t9159-git-svn-no-parent-mergeinfo.sh (renamed from t/t9159-git-svn-no-parent-mergeinfo.sh)0
-rwxr-xr-xthird_party/git/t/t9160-git-svn-preserve-empty-dirs.sh (renamed from t/t9160-git-svn-preserve-empty-dirs.sh)0
-rwxr-xr-xthird_party/git/t/t9161-git-svn-mergeinfo-push.sh (renamed from t/t9161-git-svn-mergeinfo-push.sh)0
-rw-r--r--third_party/git/t/t9161/branches.dump (renamed from t/t9161/branches.dump)0
-rwxr-xr-xthird_party/git/t/t9162-git-svn-dcommit-interactive.sh (renamed from t/t9162-git-svn-dcommit-interactive.sh)0
-rwxr-xr-xthird_party/git/t/t9163-git-svn-reset-clears-caches.sh (renamed from t/t9163-git-svn-reset-clears-caches.sh)0
-rwxr-xr-xthird_party/git/t/t9164-git-svn-dcommit-concurrent.sh (renamed from t/t9164-git-svn-dcommit-concurrent.sh)0
-rwxr-xr-xthird_party/git/t/t9165-git-svn-fetch-merge-branch-of-branch.sh (renamed from t/t9165-git-svn-fetch-merge-branch-of-branch.sh)0
-rwxr-xr-xthird_party/git/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh (renamed from t/t9166-git-svn-fetch-merge-branch-of-branch2.sh)0
-rwxr-xr-xthird_party/git/t/t9167-git-svn-cmd-branch-subproject.sh (renamed from t/t9167-git-svn-cmd-branch-subproject.sh)0
-rwxr-xr-xthird_party/git/t/t9168-git-svn-partially-globbed-names.sh (renamed from t/t9168-git-svn-partially-globbed-names.sh)0
-rwxr-xr-xthird_party/git/t/t9169-git-svn-dcommit-crlf.sh (renamed from t/t9169-git-svn-dcommit-crlf.sh)0
-rwxr-xr-xthird_party/git/t/t9200-git-cvsexportcommit.sh (renamed from t/t9200-git-cvsexportcommit.sh)0
-rwxr-xr-xthird_party/git/t/t9300-fast-import.sh (renamed from t/t9300-fast-import.sh)0
-rwxr-xr-xthird_party/git/t/t9301-fast-import-notes.sh (renamed from t/t9301-fast-import-notes.sh)0
-rwxr-xr-xthird_party/git/t/t9302-fast-import-unpack-limit.sh (renamed from t/t9302-fast-import-unpack-limit.sh)0
-rwxr-xr-xthird_party/git/t/t9303-fast-import-compression.sh (renamed from t/t9303-fast-import-compression.sh)0
-rwxr-xr-xthird_party/git/t/t9350-fast-export.sh (renamed from t/t9350-fast-export.sh)0
-rw-r--r--third_party/git/t/t9350/broken-iso-8859-7-commit-message.txt (renamed from t/t9350/broken-iso-8859-7-commit-message.txt)0
-rw-r--r--third_party/git/t/t9350/simple-iso-8859-7-commit-message.txt (renamed from t/t9350/simple-iso-8859-7-commit-message.txt)0
-rwxr-xr-xthird_party/git/t/t9351-fast-export-anonymize.sh (renamed from t/t9351-fast-export-anonymize.sh)0
-rwxr-xr-xthird_party/git/t/t9400-git-cvsserver-server.sh (renamed from t/t9400-git-cvsserver-server.sh)0
-rwxr-xr-xthird_party/git/t/t9401-git-cvsserver-crlf.sh (renamed from t/t9401-git-cvsserver-crlf.sh)0
-rwxr-xr-xthird_party/git/t/t9402-git-cvsserver-refs.sh (renamed from t/t9402-git-cvsserver-refs.sh)0
-rwxr-xr-xthird_party/git/t/t9500-gitweb-standalone-no-errors.sh (renamed from t/t9500-gitweb-standalone-no-errors.sh)0
-rwxr-xr-xthird_party/git/t/t9501-gitweb-standalone-http-status.sh (renamed from t/t9501-gitweb-standalone-http-status.sh)0
-rwxr-xr-xthird_party/git/t/t9502-gitweb-standalone-parse-output.sh (renamed from t/t9502-gitweb-standalone-parse-output.sh)0
-rwxr-xr-xthird_party/git/t/t9600-cvsimport.sh (renamed from t/t9600-cvsimport.sh)0
-rwxr-xr-xthird_party/git/t/t9601-cvsimport-vendor-branch.sh (renamed from t/t9601-cvsimport-vendor-branch.sh)0
-rw-r--r--third_party/git/t/t9601/cvsroot/.gitattributes (renamed from t/t9601/cvsroot/.gitattributes)0
-rw-r--r--third_party/git/t/t9601/cvsroot/CVSROOT/.gitignore (renamed from t/t9601/cvsroot/CVSROOT/.gitignore)0
-rw-r--r--third_party/git/t/t9601/cvsroot/module/added-imported.txt,v (renamed from t/t9601/cvsroot/module/added-imported.txt,v)0
-rw-r--r--third_party/git/t/t9601/cvsroot/module/imported-anonymously.txt,v (renamed from t/t9601/cvsroot/module/imported-anonymously.txt,v)0
-rw-r--r--third_party/git/t/t9601/cvsroot/module/imported-modified-imported.txt,v (renamed from t/t9601/cvsroot/module/imported-modified-imported.txt,v)0
-rw-r--r--third_party/git/t/t9601/cvsroot/module/imported-modified.txt,v (renamed from t/t9601/cvsroot/module/imported-modified.txt,v)0
-rw-r--r--third_party/git/t/t9601/cvsroot/module/imported-once.txt,v (renamed from t/t9601/cvsroot/module/imported-once.txt,v)0
-rw-r--r--third_party/git/t/t9601/cvsroot/module/imported-twice.txt,v (renamed from t/t9601/cvsroot/module/imported-twice.txt,v)0
-rwxr-xr-xthird_party/git/t/t9602-cvsimport-branches-tags.sh (renamed from t/t9602-cvsimport-branches-tags.sh)0
-rw-r--r--third_party/git/t/t9602/README (renamed from t/t9602/README)0
-rw-r--r--third_party/git/t/t9602/cvsroot/.gitattributes (renamed from t/t9602/cvsroot/.gitattributes)0
-rw-r--r--third_party/git/t/t9602/cvsroot/CVSROOT/.gitignore (renamed from t/t9602/cvsroot/CVSROOT/.gitignore)0
-rw-r--r--third_party/git/t/t9602/cvsroot/module/default,v (renamed from t/t9602/cvsroot/module/default,v)0
-rw-r--r--third_party/git/t/t9602/cvsroot/module/sub1/default,v (renamed from t/t9602/cvsroot/module/sub1/default,v)0
-rw-r--r--third_party/git/t/t9602/cvsroot/module/sub1/subsubA/default,v (renamed from t/t9602/cvsroot/module/sub1/subsubA/default,v)0
-rw-r--r--third_party/git/t/t9602/cvsroot/module/sub1/subsubB/default,v (renamed from t/t9602/cvsroot/module/sub1/subsubB/default,v)0
-rw-r--r--third_party/git/t/t9602/cvsroot/module/sub2/Attic/branch_B_MIXED_only,v (renamed from t/t9602/cvsroot/module/sub2/Attic/branch_B_MIXED_only,v)0
-rw-r--r--third_party/git/t/t9602/cvsroot/module/sub2/default,v (renamed from t/t9602/cvsroot/module/sub2/default,v)0
-rw-r--r--third_party/git/t/t9602/cvsroot/module/sub2/subsubA/default,v (renamed from t/t9602/cvsroot/module/sub2/subsubA/default,v)0
-rw-r--r--third_party/git/t/t9602/cvsroot/module/sub3/default,v (renamed from t/t9602/cvsroot/module/sub3/default,v)0
-rwxr-xr-xthird_party/git/t/t9603-cvsimport-patchsets.sh (renamed from t/t9603-cvsimport-patchsets.sh)0
-rw-r--r--third_party/git/t/t9603/cvsroot/.gitattributes (renamed from t/t9603/cvsroot/.gitattributes)0
-rw-r--r--third_party/git/t/t9603/cvsroot/CVSROOT/.gitignore (renamed from t/t9603/cvsroot/CVSROOT/.gitignore)0
-rw-r--r--third_party/git/t/t9603/cvsroot/module/a,v (renamed from t/t9603/cvsroot/module/a,v)0
-rw-r--r--third_party/git/t/t9603/cvsroot/module/b,v (renamed from t/t9603/cvsroot/module/b,v)0
-rwxr-xr-xthird_party/git/t/t9604-cvsimport-timestamps.sh (renamed from t/t9604-cvsimport-timestamps.sh)0
-rw-r--r--third_party/git/t/t9604/cvsroot/.gitattributes (renamed from t/t9604/cvsroot/.gitattributes)0
-rw-r--r--third_party/git/t/t9604/cvsroot/CVSROOT/.gitignore (renamed from t/t9604/cvsroot/CVSROOT/.gitignore)0
-rw-r--r--third_party/git/t/t9604/cvsroot/module/a,v (renamed from t/t9604/cvsroot/module/a,v)0
-rwxr-xr-xthird_party/git/t/t9700-perl-git.sh (renamed from t/t9700-perl-git.sh)0
-rwxr-xr-xthird_party/git/t/t9700/test.pl (renamed from t/t9700/test.pl)0
-rwxr-xr-xthird_party/git/t/t9800-git-p4-basic.sh (renamed from t/t9800-git-p4-basic.sh)0
-rwxr-xr-xthird_party/git/t/t9801-git-p4-branch.sh (renamed from t/t9801-git-p4-branch.sh)0
-rwxr-xr-xthird_party/git/t/t9802-git-p4-filetype.sh (renamed from t/t9802-git-p4-filetype.sh)0
-rwxr-xr-xthird_party/git/t/t9803-git-p4-shell-metachars.sh (renamed from t/t9803-git-p4-shell-metachars.sh)0
-rwxr-xr-xthird_party/git/t/t9804-git-p4-label.sh (renamed from t/t9804-git-p4-label.sh)0
-rwxr-xr-xthird_party/git/t/t9805-git-p4-skip-submit-edit.sh (renamed from t/t9805-git-p4-skip-submit-edit.sh)0
-rwxr-xr-xthird_party/git/t/t9806-git-p4-options.sh (renamed from t/t9806-git-p4-options.sh)0
-rwxr-xr-xthird_party/git/t/t9807-git-p4-submit.sh (renamed from t/t9807-git-p4-submit.sh)0
-rwxr-xr-xthird_party/git/t/t9808-git-p4-chdir.sh (renamed from t/t9808-git-p4-chdir.sh)0
-rwxr-xr-xthird_party/git/t/t9809-git-p4-client-view.sh (renamed from t/t9809-git-p4-client-view.sh)0
-rwxr-xr-xthird_party/git/t/t9810-git-p4-rcs.sh (renamed from t/t9810-git-p4-rcs.sh)0
-rwxr-xr-xthird_party/git/t/t9811-git-p4-label-import.sh (renamed from t/t9811-git-p4-label-import.sh)0
-rwxr-xr-xthird_party/git/t/t9812-git-p4-wildcards.sh (renamed from t/t9812-git-p4-wildcards.sh)0
-rwxr-xr-xthird_party/git/t/t9813-git-p4-preserve-users.sh (renamed from t/t9813-git-p4-preserve-users.sh)0
-rwxr-xr-xthird_party/git/t/t9814-git-p4-rename.sh (renamed from t/t9814-git-p4-rename.sh)0
-rwxr-xr-xthird_party/git/t/t9815-git-p4-submit-fail.sh (renamed from t/t9815-git-p4-submit-fail.sh)0
-rwxr-xr-xthird_party/git/t/t9816-git-p4-locked.sh (renamed from t/t9816-git-p4-locked.sh)0
-rwxr-xr-xthird_party/git/t/t9817-git-p4-exclude.sh (renamed from t/t9817-git-p4-exclude.sh)0
-rwxr-xr-xthird_party/git/t/t9818-git-p4-block.sh (renamed from t/t9818-git-p4-block.sh)0
-rwxr-xr-xthird_party/git/t/t9819-git-p4-case-folding.sh (renamed from t/t9819-git-p4-case-folding.sh)0
-rwxr-xr-xthird_party/git/t/t9820-git-p4-editor-handling.sh (renamed from t/t9820-git-p4-editor-handling.sh)0
-rwxr-xr-xthird_party/git/t/t9821-git-p4-path-variations.sh (renamed from t/t9821-git-p4-path-variations.sh)0
-rwxr-xr-xthird_party/git/t/t9822-git-p4-path-encoding.sh (renamed from t/t9822-git-p4-path-encoding.sh)0
-rwxr-xr-xthird_party/git/t/t9823-git-p4-mock-lfs.sh (renamed from t/t9823-git-p4-mock-lfs.sh)0
-rwxr-xr-xthird_party/git/t/t9824-git-p4-git-lfs.sh (renamed from t/t9824-git-p4-git-lfs.sh)0
-rwxr-xr-xthird_party/git/t/t9825-git-p4-handle-utf16-without-bom.sh (renamed from t/t9825-git-p4-handle-utf16-without-bom.sh)0
-rwxr-xr-xthird_party/git/t/t9826-git-p4-keep-empty-commits.sh (renamed from t/t9826-git-p4-keep-empty-commits.sh)0
-rwxr-xr-xthird_party/git/t/t9827-git-p4-change-filetype.sh (renamed from t/t9827-git-p4-change-filetype.sh)0
-rwxr-xr-xthird_party/git/t/t9828-git-p4-map-user.sh (renamed from t/t9828-git-p4-map-user.sh)0
-rwxr-xr-xthird_party/git/t/t9829-git-p4-jobs.sh (renamed from t/t9829-git-p4-jobs.sh)0
-rwxr-xr-xthird_party/git/t/t9830-git-p4-symlink-dir.sh (renamed from t/t9830-git-p4-symlink-dir.sh)0
-rwxr-xr-xthird_party/git/t/t9831-git-p4-triggers.sh (renamed from t/t9831-git-p4-triggers.sh)0
-rwxr-xr-xthird_party/git/t/t9832-unshelve.sh (renamed from t/t9832-unshelve.sh)0
-rwxr-xr-xthird_party/git/t/t9833-errors.sh (renamed from t/t9833-errors.sh)0
-rwxr-xr-xthird_party/git/t/t9901-git-web--browse.sh (renamed from t/t9901-git-web--browse.sh)0
-rwxr-xr-xthird_party/git/t/t9902-completion.sh (renamed from t/t9902-completion.sh)0
-rwxr-xr-xthird_party/git/t/t9903-bash-prompt.sh (renamed from t/t9903-bash-prompt.sh)0
-rw-r--r--third_party/git/t/test-binary-1.png (renamed from t/test-binary-1.png)bin5660 -> 5660 bytes
-rw-r--r--third_party/git/t/test-binary-2.png (renamed from t/test-binary-2.png)bin275 -> 275 bytes
-rw-r--r--third_party/git/t/test-lib-functions.sh (renamed from t/test-lib-functions.sh)0
-rw-r--r--third_party/git/t/test-lib.sh (renamed from t/test-lib.sh)0
-rwxr-xr-xthird_party/git/t/test-terminal.perl (renamed from t/test-terminal.perl)0
-rw-r--r--third_party/git/t/valgrind/.gitignore (renamed from t/valgrind/.gitignore)0
-rwxr-xr-xthird_party/git/t/valgrind/analyze.sh (renamed from t/valgrind/analyze.sh)0
-rw-r--r--third_party/git/t/valgrind/default.supp (renamed from t/valgrind/default.supp)0
-rwxr-xr-xthird_party/git/t/valgrind/valgrind.sh (renamed from t/valgrind/valgrind.sh)0
-rw-r--r--third_party/git/tag.c (renamed from tag.c)0
-rw-r--r--third_party/git/tag.h (renamed from tag.h)0
-rw-r--r--third_party/git/tar.h (renamed from tar.h)0
-rw-r--r--third_party/git/tempfile.c (renamed from tempfile.c)0
-rw-r--r--third_party/git/tempfile.h (renamed from tempfile.h)0
-rw-r--r--third_party/git/templates/.gitignore (renamed from templates/.gitignore)0
-rw-r--r--third_party/git/templates/Makefile (renamed from templates/Makefile)0
-rw-r--r--third_party/git/templates/branches-- (renamed from templates/branches--)0
-rwxr-xr-xthird_party/git/templates/hooks--applypatch-msg.sample (renamed from templates/hooks--applypatch-msg.sample)0
-rwxr-xr-xthird_party/git/templates/hooks--commit-msg.sample (renamed from templates/hooks--commit-msg.sample)0
-rwxr-xr-xthird_party/git/templates/hooks--fsmonitor-watchman.sample (renamed from templates/hooks--fsmonitor-watchman.sample)0
-rwxr-xr-xthird_party/git/templates/hooks--post-update.sample (renamed from templates/hooks--post-update.sample)0
-rwxr-xr-xthird_party/git/templates/hooks--pre-applypatch.sample (renamed from templates/hooks--pre-applypatch.sample)0
-rwxr-xr-xthird_party/git/templates/hooks--pre-commit.sample (renamed from templates/hooks--pre-commit.sample)0
-rwxr-xr-xthird_party/git/templates/hooks--pre-push.sample (renamed from templates/hooks--pre-push.sample)0
-rwxr-xr-xthird_party/git/templates/hooks--pre-rebase.sample (renamed from templates/hooks--pre-rebase.sample)0
-rwxr-xr-xthird_party/git/templates/hooks--pre-receive.sample (renamed from templates/hooks--pre-receive.sample)0
-rwxr-xr-xthird_party/git/templates/hooks--prepare-commit-msg.sample (renamed from templates/hooks--prepare-commit-msg.sample)0
-rwxr-xr-xthird_party/git/templates/hooks--update.sample (renamed from templates/hooks--update.sample)0
-rw-r--r--third_party/git/templates/info--exclude (renamed from templates/info--exclude)0
-rw-r--r--third_party/git/templates/this--description (renamed from templates/this--description)0
-rw-r--r--third_party/git/thread-utils.c (renamed from thread-utils.c)0
-rw-r--r--third_party/git/thread-utils.h (renamed from thread-utils.h)0
-rw-r--r--third_party/git/tmp-objdir.c (renamed from tmp-objdir.c)0
-rw-r--r--third_party/git/tmp-objdir.h (renamed from tmp-objdir.h)0
-rw-r--r--third_party/git/trace.c (renamed from trace.c)0
-rw-r--r--third_party/git/trace.h (renamed from trace.h)0
-rw-r--r--third_party/git/trace2.c (renamed from trace2.c)0
-rw-r--r--third_party/git/trace2.h (renamed from trace2.h)0
-rw-r--r--third_party/git/trace2/tr2_cfg.c (renamed from trace2/tr2_cfg.c)0
-rw-r--r--third_party/git/trace2/tr2_cfg.h (renamed from trace2/tr2_cfg.h)0
-rw-r--r--third_party/git/trace2/tr2_cmd_name.c (renamed from trace2/tr2_cmd_name.c)0
-rw-r--r--third_party/git/trace2/tr2_cmd_name.h (renamed from trace2/tr2_cmd_name.h)0
-rw-r--r--third_party/git/trace2/tr2_dst.c (renamed from trace2/tr2_dst.c)0
-rw-r--r--third_party/git/trace2/tr2_dst.h (renamed from trace2/tr2_dst.h)0
-rw-r--r--third_party/git/trace2/tr2_sid.c (renamed from trace2/tr2_sid.c)0
-rw-r--r--third_party/git/trace2/tr2_sid.h (renamed from trace2/tr2_sid.h)0
-rw-r--r--third_party/git/trace2/tr2_sysenv.c (renamed from trace2/tr2_sysenv.c)0
-rw-r--r--third_party/git/trace2/tr2_sysenv.h (renamed from trace2/tr2_sysenv.h)0
-rw-r--r--third_party/git/trace2/tr2_tbuf.c (renamed from trace2/tr2_tbuf.c)0
-rw-r--r--third_party/git/trace2/tr2_tbuf.h (renamed from trace2/tr2_tbuf.h)0
-rw-r--r--third_party/git/trace2/tr2_tgt.h (renamed from trace2/tr2_tgt.h)0
-rw-r--r--third_party/git/trace2/tr2_tgt_event.c (renamed from trace2/tr2_tgt_event.c)0
-rw-r--r--third_party/git/trace2/tr2_tgt_normal.c (renamed from trace2/tr2_tgt_normal.c)0
-rw-r--r--third_party/git/trace2/tr2_tgt_perf.c (renamed from trace2/tr2_tgt_perf.c)0
-rw-r--r--third_party/git/trace2/tr2_tls.c (renamed from trace2/tr2_tls.c)0
-rw-r--r--third_party/git/trace2/tr2_tls.h (renamed from trace2/tr2_tls.h)0
-rw-r--r--third_party/git/trailer.c (renamed from trailer.c)0
-rw-r--r--third_party/git/trailer.h (renamed from trailer.h)0
-rw-r--r--third_party/git/transport-helper.c (renamed from transport-helper.c)0
-rw-r--r--third_party/git/transport-internal.h (renamed from transport-internal.h)0
-rw-r--r--third_party/git/transport.c (renamed from transport.c)0
-rw-r--r--third_party/git/transport.h (renamed from transport.h)0
-rw-r--r--third_party/git/tree-diff.c (renamed from tree-diff.c)0
-rw-r--r--third_party/git/tree-walk.c (renamed from tree-walk.c)0
-rw-r--r--third_party/git/tree-walk.h (renamed from tree-walk.h)0
-rw-r--r--third_party/git/tree.c (renamed from tree.c)0
-rw-r--r--third_party/git/tree.h (renamed from tree.h)0
-rw-r--r--third_party/git/unicode-width.h (renamed from unicode-width.h)0
-rw-r--r--third_party/git/unimplemented.sh (renamed from unimplemented.sh)0
-rw-r--r--third_party/git/unix-socket.c (renamed from unix-socket.c)0
-rw-r--r--third_party/git/unix-socket.h (renamed from unix-socket.h)0
-rw-r--r--third_party/git/unpack-trees.c (renamed from unpack-trees.c)0
-rw-r--r--third_party/git/unpack-trees.h (renamed from unpack-trees.h)0
-rw-r--r--third_party/git/upload-pack.c (renamed from upload-pack.c)0
-rw-r--r--third_party/git/upload-pack.h (renamed from upload-pack.h)0
-rw-r--r--third_party/git/url.c (renamed from url.c)0
-rw-r--r--third_party/git/url.h (renamed from url.h)0
-rw-r--r--third_party/git/urlmatch.c (renamed from urlmatch.c)0
-rw-r--r--third_party/git/urlmatch.h (renamed from urlmatch.h)0
-rw-r--r--third_party/git/usage.c (renamed from usage.c)0
-rw-r--r--third_party/git/userdiff.c (renamed from userdiff.c)0
-rw-r--r--third_party/git/userdiff.h (renamed from userdiff.h)0
-rw-r--r--third_party/git/utf8.c (renamed from utf8.c)0
-rw-r--r--third_party/git/utf8.h (renamed from utf8.h)0
-rw-r--r--third_party/git/varint.c (renamed from varint.c)0
-rw-r--r--third_party/git/varint.h (renamed from varint.h)0
-rw-r--r--third_party/git/vcs-svn/LICENSE (renamed from vcs-svn/LICENSE)0
-rw-r--r--third_party/git/vcs-svn/fast_export.c (renamed from vcs-svn/fast_export.c)0
-rw-r--r--third_party/git/vcs-svn/fast_export.h (renamed from vcs-svn/fast_export.h)0
-rw-r--r--third_party/git/vcs-svn/line_buffer.c (renamed from vcs-svn/line_buffer.c)0
-rw-r--r--third_party/git/vcs-svn/line_buffer.h (renamed from vcs-svn/line_buffer.h)0
-rw-r--r--third_party/git/vcs-svn/line_buffer.txt (renamed from vcs-svn/line_buffer.txt)0
-rw-r--r--third_party/git/vcs-svn/sliding_window.c (renamed from vcs-svn/sliding_window.c)0
-rw-r--r--third_party/git/vcs-svn/sliding_window.h (renamed from vcs-svn/sliding_window.h)0
-rw-r--r--third_party/git/vcs-svn/svndiff.c (renamed from vcs-svn/svndiff.c)0
-rw-r--r--third_party/git/vcs-svn/svndiff.h (renamed from vcs-svn/svndiff.h)0
-rw-r--r--third_party/git/vcs-svn/svndump.c (renamed from vcs-svn/svndump.c)0
-rw-r--r--third_party/git/vcs-svn/svndump.h (renamed from vcs-svn/svndump.h)0
-rw-r--r--third_party/git/version.c (renamed from version.c)0
-rw-r--r--third_party/git/version.h (renamed from version.h)0
-rw-r--r--third_party/git/versioncmp.c (renamed from versioncmp.c)0
-rw-r--r--third_party/git/walker.c (renamed from walker.c)0
-rw-r--r--third_party/git/walker.h (renamed from walker.h)0
-rw-r--r--third_party/git/wildmatch.c (renamed from wildmatch.c)0
-rw-r--r--third_party/git/wildmatch.h (renamed from wildmatch.h)0
-rw-r--r--third_party/git/worktree.c (renamed from worktree.c)0
-rw-r--r--third_party/git/worktree.h (renamed from worktree.h)0
-rw-r--r--third_party/git/wrap-for-bin.sh (renamed from wrap-for-bin.sh)0
-rw-r--r--third_party/git/wrapper.c (renamed from wrapper.c)0
-rw-r--r--third_party/git/write-or-die.c (renamed from write-or-die.c)0
-rw-r--r--third_party/git/ws.c (renamed from ws.c)0
-rw-r--r--third_party/git/wt-status.c (renamed from wt-status.c)0
-rw-r--r--third_party/git/wt-status.h (renamed from wt-status.h)0
-rw-r--r--third_party/git/xdiff-interface.c (renamed from xdiff-interface.c)0
-rw-r--r--third_party/git/xdiff-interface.h (renamed from xdiff-interface.h)0
-rw-r--r--third_party/git/xdiff/xdiff.h (renamed from xdiff/xdiff.h)0
-rw-r--r--third_party/git/xdiff/xdiffi.c (renamed from xdiff/xdiffi.c)0
-rw-r--r--third_party/git/xdiff/xdiffi.h (renamed from xdiff/xdiffi.h)0
-rw-r--r--third_party/git/xdiff/xemit.c (renamed from xdiff/xemit.c)0
-rw-r--r--third_party/git/xdiff/xemit.h (renamed from xdiff/xemit.h)0
-rw-r--r--third_party/git/xdiff/xhistogram.c (renamed from xdiff/xhistogram.c)0
-rw-r--r--third_party/git/xdiff/xinclude.h (renamed from xdiff/xinclude.h)0
-rw-r--r--third_party/git/xdiff/xmacros.h (renamed from xdiff/xmacros.h)0
-rw-r--r--third_party/git/xdiff/xmerge.c (renamed from xdiff/xmerge.c)0
-rw-r--r--third_party/git/xdiff/xpatience.c (renamed from xdiff/xpatience.c)0
-rw-r--r--third_party/git/xdiff/xprepare.c (renamed from xdiff/xprepare.c)0
-rw-r--r--third_party/git/xdiff/xprepare.h (renamed from xdiff/xprepare.h)0
-rw-r--r--third_party/git/xdiff/xtypes.h (renamed from xdiff/xtypes.h)0
-rw-r--r--third_party/git/xdiff/xutils.c (renamed from xdiff/xutils.c)0
-rw-r--r--third_party/git/xdiff/xutils.h (renamed from xdiff/xutils.h)0
-rw-r--r--third_party/git/zlib.c (renamed from zlib.c)0
-rw-r--r--third_party/gopkgs/cloud.google.com/go/default.nix12
-rw-r--r--third_party/gopkgs/github.com/emirpasic/gods/default.nix12
-rw-r--r--third_party/gopkgs/github.com/golang/groupcache/default.nix9
-rw-r--r--third_party/gopkgs/github.com/golang/protobuf/default.nix12
-rw-r--r--third_party/gopkgs/github.com/google/uuid/default.nix12
-rw-r--r--third_party/gopkgs/github.com/googleapis/gax-go/default.nix19
-rw-r--r--third_party/gopkgs/github.com/hashicorp/golang-lru/default.nix14
-rw-r--r--third_party/gopkgs/github.com/jbenet/go-context/default.nix16
-rw-r--r--third_party/gopkgs/github.com/kevinburke/ssh_config/default.nix15
-rw-r--r--third_party/gopkgs/github.com/mitchellh/go-homedir/default.nix12
-rw-r--r--third_party/gopkgs/github.com/sergi/go-diff/default.nix12
-rw-r--r--third_party/gopkgs/github.com/src-d/gcfg/default.nix16
-rw-r--r--third_party/gopkgs/github.com/xanzy/ssh-agent/default.nix16
-rw-r--r--third_party/gopkgs/go.opencensus.io/default.nix14
-rw-r--r--third_party/gopkgs/golang.org/x/crypto/default.nix13
-rw-r--r--third_party/gopkgs/golang.org/x/net/default.nix15
-rw-r--r--third_party/gopkgs/golang.org/x/oauth2/default.nix14
-rw-r--r--third_party/gopkgs/golang.org/x/sys/default.nix9
-rw-r--r--third_party/gopkgs/golang.org/x/text/default.nix12
-rw-r--r--third_party/gopkgs/golang.org/x/time/default.nix10
-rw-r--r--third_party/gopkgs/google.golang.org/api/default.nix20
-rw-r--r--third_party/gopkgs/google.golang.org/genproto/default.nix14
-rw-r--r--third_party/gopkgs/google.golang.org/grpc/default.nix21
-rw-r--r--third_party/gopkgs/googlemaps.github.io/maps.nix17
-rw-r--r--third_party/gopkgs/gopkg.in/src-d/go-billy/default.nix16
-rw-r--r--third_party/gopkgs/gopkg.in/src-d/go-git/default.nix31
-rw-r--r--third_party/gopkgs/gopkg.in/warnings/default.nix12
-rw-r--r--third_party/lieer/api_client.patch20
-rw-r--r--third_party/lieer/default.nix51
-rw-r--r--third_party/lieer/send_scope.patch13
-rw-r--r--third_party/lisp/alexandria.nix32
-rw-r--r--third_party/lisp/asdf.nix9
-rw-r--r--third_party/lisp/babel.nix31
-rw-r--r--third_party/lisp/bordeaux-threads.nix20
-rw-r--r--third_party/lisp/cffi.nix32
-rw-r--r--third_party/lisp/cl-ansi-text.nix19
-rw-r--r--third_party/lisp/cl-colors2.nix21
-rw-r--r--third_party/lisp/cl-plus-ssl.nix38
-rw-r--r--third_party/lisp/cl-ppcre.nix30
-rw-r--r--third_party/lisp/flexi-streams.nix34
-rw-r--r--third_party/lisp/sb-posix.nix10
-rw-r--r--third_party/lisp/trivial-features.nix12
-rw-r--r--third_party/lisp/trivial-garbage.nix12
-rw-r--r--third_party/lisp/trivial-gray-streams.nix16
-rw-r--r--third_party/lisp/uiop.nix10
-rw-r--r--third_party/naersk/default.nix9
-rw-r--r--third_party/nixery/default.nix18
-rw-r--r--third_party/notmuch/default.nix6
-rw-r--r--third_party/notmuch/dottime.patch63
-rw-r--r--third_party/ormolu/default.nix8
-rw-r--r--third_party/telega/default.nix22
-rw-r--r--third_party/terraform-gcp/default.nix3
-rw-r--r--tools/blog_cli/README.md41
-rw-r--r--tools/blog_cli/default.nix9
-rw-r--r--tools/blog_cli/main.go209
-rw-r--r--tools/cheddar/.gitignore1
-rw-r--r--tools/cheddar/.skip-subtree0
-rw-r--r--tools/cheddar/Cargo.lock849
-rw-r--r--tools/cheddar/Cargo.toml10
-rw-r--r--tools/cheddar/README.md21
-rw-r--r--tools/cheddar/default.nix20
-rw-r--r--tools/cheddar/src/main.rs198
-rw-r--r--tools/emacs-pkgs/dottime/default.nix7
-rw-r--r--tools/emacs-pkgs/dottime/dottime.el82
-rw-r--r--tools/emacs-pkgs/nix-util/default.nix7
-rw-r--r--tools/emacs-pkgs/nix-util/nix-util.el67
-rw-r--r--tools/emacs-pkgs/term-switcher/default.nix14
-rw-r--r--tools/emacs-pkgs/term-switcher/term-switcher.el56
-rw-r--r--tools/emacs/.gitignore11
-rw-r--r--tools/emacs/README.md7
-rw-r--r--tools/emacs/config/bindings.el44
-rw-r--r--tools/emacs/config/custom.el52
-rw-r--r--tools/emacs/config/desktop.el213
-rw-r--r--tools/emacs/config/eshell-setup.el68
-rw-r--r--tools/emacs/config/functions.el241
-rw-r--r--tools/emacs/config/init.el229
-rw-r--r--tools/emacs/config/look-and-feel.el114
-rw-r--r--tools/emacs/config/mail-setup.el83
-rw-r--r--tools/emacs/config/modes.el36
-rw-r--r--tools/emacs/config/settings.el50
-rw-r--r--tools/emacs/default.nix141
-rw-r--r--web/cgit-taz/0001-cgit_monorepo_urls.patch114
-rw-r--r--web/cgit-taz/0002-cgit_subtree_readmes.patch46
-rw-r--r--web/cgit-taz/0003-cgit_subtree_about_links.patch50
-rw-r--r--web/cgit-taz/default.nix80
-rw-r--r--web/cgit-taz/thttpd_cgi_idx.patch13
-rw-r--r--web/tazblog/blog/Main.hs24
-rw-r--r--web/tazblog/default.nix18
-rw-r--r--web/tazblog/shell.nix11
-rw-r--r--web/tazblog/src/Blog.hs141
-rw-r--r--web/tazblog/src/BlogStore.hs182
-rw-r--r--web/tazblog/src/RSS.hs48
-rw-r--r--web/tazblog/src/Server.hs81
-rw-r--r--web/tazblog/static/apple-touch-icon.pngbin0 -> 9756 bytes
-rw-r--r--web/tazblog/static/blog.css35
-rw-r--r--web/tazblog/static/favicon.icobin0 -> 4354 bytes
-rw-r--r--web/tazblog/static/keybase.txt69
-rw-r--r--web/tazblog/tazblog.cabal39
-rw-r--r--web/tazblog/tazblog.nix30
4087 files changed, 39216 insertions, 306 deletions
diff --git a/.envrc b/.envrc
new file mode 100644
index 0000000000..34fe568ce9
--- /dev/null
+++ b/.envrc
@@ -0,0 +1,6 @@
+# Configure the local PATH to contain tools which are fetched ad-hoc
+# from Nix.
+
+export PATH="${PWD}/bin:${PATH}"
+export NIX_PATH="nixpkgs=${PWD}/default.nix"
+export REPO_ROOT="${PWD}"
diff --git a/.gitignore b/.gitignore
index 521d8f4fb4..0b135e7034 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,240 +1,7 @@
-/fuzz-commit-graph
-/fuzz_corpora
-/fuzz-pack-headers
-/fuzz-pack-idx
-/GIT-BUILD-OPTIONS
-/GIT-CFLAGS
-/GIT-LDFLAGS
-/GIT-PREFIX
-/GIT-PERL-DEFINES
-/GIT-PERL-HEADER
-/GIT-PYTHON-VARS
-/GIT-SCRIPT-DEFINES
-/GIT-USER-AGENT
-/GIT-VERSION-FILE
-/bin-wrappers/
-/git
-/git-add
-/git-add--interactive
-/git-am
-/git-annotate
-/git-apply
-/git-archimport
-/git-archive
-/git-bisect
-/git-bisect--helper
-/git-blame
-/git-branch
-/git-bundle
-/git-cat-file
-/git-check-attr
-/git-check-ignore
-/git-check-mailmap
-/git-check-ref-format
-/git-checkout
-/git-checkout-index
-/git-cherry
-/git-cherry-pick
-/git-clean
-/git-clone
-/git-column
-/git-commit
-/git-commit-graph
-/git-commit-tree
-/git-config
-/git-count-objects
-/git-credential
-/git-credential-cache
-/git-credential-cache--daemon
-/git-credential-store
-/git-cvsexportcommit
-/git-cvsimport
-/git-cvsserver
-/git-daemon
-/git-diff
-/git-diff-files
-/git-diff-index
-/git-diff-tree
-/git-difftool
-/git-difftool--helper
-/git-describe
-/git-env--helper
-/git-fast-export
-/git-fast-import
-/git-fetch
-/git-fetch-pack
-/git-filter-branch
-/git-fmt-merge-msg
-/git-for-each-ref
-/git-format-patch
-/git-fsck
-/git-fsck-objects
-/git-gc
-/git-get-tar-commit-id
-/git-grep
-/git-hash-object
-/git-help
-/git-http-backend
-/git-http-fetch
-/git-http-push
-/git-imap-send
-/git-index-pack
-/git-init
-/git-init-db
-/git-interpret-trailers
-/git-instaweb
-/git-legacy-stash
-/git-log
-/git-ls-files
-/git-ls-remote
-/git-ls-tree
-/git-mailinfo
-/git-mailsplit
-/git-merge
-/git-merge-base
-/git-merge-index
-/git-merge-file
-/git-merge-tree
-/git-merge-octopus
-/git-merge-one-file
-/git-merge-ours
-/git-merge-recursive
-/git-merge-resolve
-/git-merge-subtree
-/git-mergetool
-/git-mergetool--lib
-/git-mktag
-/git-mktree
-/git-multi-pack-index
-/git-mv
-/git-name-rev
-/git-notes
-/git-p4
-/git-pack-redundant
-/git-pack-objects
-/git-pack-refs
-/git-parse-remote
-/git-patch-id
-/git-prune
-/git-prune-packed
-/git-pull
-/git-push
-/git-quiltimport
-/git-range-diff
-/git-read-tree
-/git-rebase
-/git-rebase--preserve-merges
-/git-receive-pack
-/git-reflog
-/git-remote
-/git-remote-http
-/git-remote-https
-/git-remote-ftp
-/git-remote-ftps
-/git-remote-fd
-/git-remote-ext
-/git-remote-testpy
-/git-remote-testsvn
-/git-repack
-/git-replace
-/git-request-pull
-/git-rerere
-/git-reset
-/git-restore
-/git-rev-list
-/git-rev-parse
-/git-revert
-/git-rm
-/git-send-email
-/git-send-pack
-/git-serve
-/git-sh-i18n
-/git-sh-i18n--envsubst
-/git-sh-setup
-/git-sh-i18n
-/git-shell
-/git-shortlog
-/git-show
-/git-show-branch
-/git-show-index
-/git-show-ref
-/git-stage
-/git-stash
-/git-status
-/git-stripspace
-/git-submodule
-/git-submodule--helper
-/git-svn
-/git-switch
-/git-symbolic-ref
-/git-tag
-/git-unpack-file
-/git-unpack-objects
-/git-update-index
-/git-update-ref
-/git-update-server-info
-/git-upload-archive
-/git-upload-pack
-/git-var
-/git-verify-commit
-/git-verify-pack
-/git-verify-tag
-/git-web--browse
-/git-whatchanged
-/git-worktree
-/git-write-tree
-/git-core-*/?*
-/gitweb/GITWEB-BUILD-OPTIONS
-/gitweb/gitweb.cgi
-/gitweb/static/gitweb.js
-/gitweb/static/gitweb.min.*
-/command-list.h
-*.tar.gz
-*.dsc
-*.deb
-/git.spec
-*.exe
-*.[aos]
-*.py[co]
-.depend/
-*.gcda
-*.gcno
-*.gcov
-/coverage-untested-functions
-/cover_db/
-/cover_db_html/
-*+
-/config.mak
-/autom4te.cache
-/config.cache
-/config.log
-/config.status
-/config.mak.autogen
-/config.mak.append
-/configure
-/.vscode/
-/tags
-/TAGS
-/cscope*
-*.obj
-*.lib
-*.res
-*.sln
-*.suo
-*.ncb
-*.vcproj
-*.user
-*.idb
-*.pdb
-*.ilk
-*.iobj
-*.ipdb
-*.dll
-.vs/
-*.manifest
-Debug/
-Release/
-/UpgradeLog*.htm
-/git.VC.VC.opendb
-/git.VC.db
-*.dSYM
+# Ignore the garbage folder, in which I slowly assemble a bunch of
+# trash locally that might be valuable in the future.
+garbage/
+
+# Ignore Nix result symlinks
+result
+result-*
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000..904a76ed04
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2019 Vincent Ambo
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index e1d2b82209..22ffdda4d3 100644
--- a/README.md
+++ b/README.md
@@ -1,66 +1,77 @@
-[![Build Status](https://dev.azure.com/git/git/_apis/build/status/git.git)](https://dev.azure.com/git/git/_build/latest?definitionId=11)
-
-Git - fast, scalable, distributed revision control system
-=========================================================
-
-Git is a fast, scalable, distributed revision control system with an
-unusually rich command set that provides both high-level operations
-and full access to internals.
-
-Git is an Open Source project covered by the GNU General Public
-License version 2 (some parts of it are under different licenses,
-compatible with the GPLv2). It was originally written by Linus
-Torvalds with help of a group of hackers around the net.
-
-Please read the file [INSTALL][] for installation instructions.
-
-Many Git online resources are accessible from <https://git-scm.com/>
-including full documentation and Git related tools.
-
-See [Documentation/gittutorial.txt][] to get started, then see
-[Documentation/giteveryday.txt][] for a useful minimum set of commands, and
-`Documentation/git-<commandname>.txt` for documentation of each command.
-If git has been correctly installed, then the tutorial can also be
-read with `man gittutorial` or `git help tutorial`, and the
-documentation of each command with `man git-<commandname>` or `git help
-<commandname>`.
-
-CVS users may also want to read [Documentation/gitcvs-migration.txt][]
-(`man gitcvs-migration` or `git help cvs-migration` if git is
-installed).
-
-The user discussion and development of Git take place on the Git
-mailing list -- everyone is welcome to post bug reports, feature
-requests, comments and patches to git@vger.kernel.org (read
-[Documentation/SubmittingPatches][] for instructions on patch submission).
-To subscribe to the list, send an email with just "subscribe git" in
-the body to majordomo@vger.kernel.org. The mailing list archives are
-available at <https://public-inbox.org/git/>,
-<http://marc.info/?l=git> and other archival sites.
-
-Issues which are security relevant should be disclosed privately to
-the Git Security mailing list <git-security@googlegroups.com>.
-
-The maintainer frequently sends the "What's cooking" reports that
-list the current status of various development topics to the mailing
-list.  The discussion following them give a good reference for
-project status, development direction and remaining tasks.
-
-The name "git" was given by Linus Torvalds when he wrote the very
-first version. He described the tool as "the stupid content tracker"
-and the name as (depending on your mood):
-
- - random three-letter combination that is pronounceable, and not
-   actually used by any common UNIX command.  The fact that it is a
-   mispronunciation of "get" may or may not be relevant.
- - stupid. contemptible and despicable. simple. Take your pick from the
-   dictionary of slang.
- - "global information tracker": you're in a good mood, and it actually
-   works for you. Angels sing, and a light suddenly fills the room.
- - "goddamn idiotic truckload of sh*t": when it breaks
-
-[INSTALL]: INSTALL
-[Documentation/gittutorial.txt]: Documentation/gittutorial.txt
-[Documentation/giteveryday.txt]: Documentation/giteveryday.txt
-[Documentation/gitcvs-migration.txt]: Documentation/gitcvs-migration.txt
-[Documentation/SubmittingPatches]: Documentation/SubmittingPatches
+depot
+=====
+
+This repository is the [monorepo][] for my personal tools and infrastructure.
+Everything in here is built using [Nix][] with an automatic attribute-set layout
+that mirrors the filesystem layout of the repository (this might feel familiar
+to users of Bazel).
+
+This repository used to be hosted on GitHub, but for a variety of reasons I have
+decided to take over the management of personal infrastructure - of which this
+repository is a core component.
+
+If you've ended up here and have no idea who I am, feel free to follow me [on
+Twitter][].
+
+# Highlights
+
+## Tools
+
+* `tools/emacs` contains my personal Emacs configuration (packages & config)
+* `fun/aoc2019` contains solutions for a handful of Advent of Code 2019
+  challenges, before I ran out of interest
+* `tools/blog_cli` contains my tool for writing new blog posts and storing them
+  in the DNS zone
+* `ops/kms_pass.nix` is a tiny tool that emulates the user-interface of `pass`,
+  but actually uses Google Cloud KMS for secret decryption
+* `ops/kontemplate` contains my Kubernetes resource templating tool (with which
+  the services in this repository are deployed!)
+
+## Packages / Libraries
+
+* `nix/buildGo` implements a Nix library that can build Go software in the style
+  of Bazel's `rules_go`. Go programs in this repository are built using this
+  library.
+* `tools/emacs-pkgs` contains various Emacs libraries that my Emacs setup uses,
+  for example:
+  * `dottime.el` provides [dottime][] in the Emacs modeline
+  * `nix-util.el` provides editing utilities for Nix files
+  * `term-switcher.el` is an ivy-function for switching between vterm buffers
+* `net/alcoholic_jwt` contains an easy-to-use JWT-validation library for Rust
+* `net/crimp` contains a high-level HTTP client using cURL for Rust
+
+## Services
+
+Services in this repository are deployed on a Google Kubernetes Engine cluster
+using [Nixery]().
+
+* `web/tazblog` contains my blog software (serving at [tazj.in][])
+* `web/cgit-taz` contains a slightly patched version of `cgit` that serves my
+  git web interface at [git.tazj.in][]
+* `ops/sync-gcsr` contains a tiny service that synchronises a Google Cloud
+  Source Repository with a local disk path. My `cgit` setup uses this
+  under-the-hood.
+* `ops/journaldriver` contains a small Rust daemon that can forward logs from
+  journald to Stackdriver Logging
+
+## Miscellaneous
+
+Presentations I've given in the past are in the `presentations` folder, these
+cover a variety of topics and some of them have links to recordings.
+
+There's a few fun things in the `fun/` folder, often with context given in the
+README. Check out my [list of the best tools][best-tools] for example.
+
+# Contributing
+
+If you'd like to contribute to any of the tools in here, please check out the
+[contribution guidelines](/tree/docs/CONTRIBUTING.md).
+
+[monorepo]: https://en.wikipedia.org/wiki/Monorepo
+[Nix]: https://nixos.org/nix
+[on Twitter]: https://twitter.com/tazjin
+[Nixery]: https://github.com/google/nixery
+[tazj.in]: https://tazj.in
+[git.tazj.in]: https://git.tazj.in
+[best-tools]: /about/fun/best-tools/README.md
+[dottime]: https://dotti.me
diff --git a/bin/__dispatch.sh b/bin/__dispatch.sh
new file mode 100755
index 0000000000..af56750872
--- /dev/null
+++ b/bin/__dispatch.sh
@@ -0,0 +1,53 @@
+#!/usr/bin/env bash
+# This script dispatches invocations transparently to programs instantiated from
+# Nix.
+#
+# To add a new tool, insert it into the case statement below by setting `attr`
+# to the key in nixpkgs which represents the program you want to run.
+set -ueo pipefail
+
+readonly REPO_ROOT=$(dirname $0)/..
+TARGET_TOOL=$(basename $0)
+
+case "${TARGET_TOOL}" in
+  terraform)
+    attr="third_party.terraform-gcp"
+    ;;
+  kontemplate)
+    attr="kontemplate"
+    ;;
+  blog_cli)
+    attr="tools.blog_cli"
+    ;;
+  stern)
+    attr="third_party.stern"
+    ;;
+  kms_pass)
+    attr="ops.kms_pass"
+    TARGET_TOOL="pass"
+    ;;
+  aoc2019)
+    attr="fun.aoc2019.${1}"
+    ;;
+  rink)
+    attr="third_party.rink"
+    ;;
+  age)
+    attr="third_party.age"
+    ;;
+  age-keygen)
+    attr="third_party.age"
+    ;;
+  rebuilder)
+    attr="ops.nixos.rebuilder"
+    ;;
+  *)
+    echo "The tool '${TARGET_TOOL}' is currently not installed in this repository."
+    exit 1
+    ;;
+esac
+
+result=$(nix-build --no-out-link --attr "${attr}" "${REPO_ROOT}")
+PATH="${result}/bin:$PATH"
+
+exec "${TARGET_TOOL}" "${@}"
diff --git a/bin/age b/bin/age
new file mode 120000
index 0000000000..8390ec9c96
--- /dev/null
+++ b/bin/age
@@ -0,0 +1 @@
+__dispatch.sh
\ No newline at end of file
diff --git a/bin/age-keygen b/bin/age-keygen
new file mode 120000
index 0000000000..8390ec9c96
--- /dev/null
+++ b/bin/age-keygen
@@ -0,0 +1 @@
+__dispatch.sh
\ No newline at end of file
diff --git a/bin/aoc2019 b/bin/aoc2019
new file mode 120000
index 0000000000..8390ec9c96
--- /dev/null
+++ b/bin/aoc2019
@@ -0,0 +1 @@
+__dispatch.sh
\ No newline at end of file
diff --git a/bin/blog_cli b/bin/blog_cli
new file mode 120000
index 0000000000..8390ec9c96
--- /dev/null
+++ b/bin/blog_cli
@@ -0,0 +1 @@
+__dispatch.sh
\ No newline at end of file
diff --git a/bin/kms_pass b/bin/kms_pass
new file mode 120000
index 0000000000..8390ec9c96
--- /dev/null
+++ b/bin/kms_pass
@@ -0,0 +1 @@
+__dispatch.sh
\ No newline at end of file
diff --git a/bin/kontemplate b/bin/kontemplate
new file mode 120000
index 0000000000..8390ec9c96
--- /dev/null
+++ b/bin/kontemplate
@@ -0,0 +1 @@
+__dispatch.sh
\ No newline at end of file
diff --git a/bin/rebuilder b/bin/rebuilder
new file mode 120000
index 0000000000..8390ec9c96
--- /dev/null
+++ b/bin/rebuilder
@@ -0,0 +1 @@
+__dispatch.sh
\ No newline at end of file
diff --git a/bin/rink b/bin/rink
new file mode 120000
index 0000000000..8390ec9c96
--- /dev/null
+++ b/bin/rink
@@ -0,0 +1 @@
+__dispatch.sh
\ No newline at end of file
diff --git a/bin/stern b/bin/stern
new file mode 120000
index 0000000000..8390ec9c96
--- /dev/null
+++ b/bin/stern
@@ -0,0 +1 @@
+__dispatch.sh
\ No newline at end of file
diff --git a/bin/terraform b/bin/terraform
new file mode 120000
index 0000000000..8390ec9c96
--- /dev/null
+++ b/bin/terraform
@@ -0,0 +1 @@
+__dispatch.sh
\ No newline at end of file
diff --git a/ci-builds.nix b/ci-builds.nix
new file mode 100644
index 0000000000..913f4f2b68
--- /dev/null
+++ b/ci-builds.nix
@@ -0,0 +1,20 @@
+# This file defines the derivations that should be built by CI.
+#
+# The plan is still to implement recursive tree traversal
+# automatically and detect all derivations that have `meta.enableCI =
+# true`, but this is currently more effort than it would save me.
+
+let
+  pkgs = import ./default.nix {};
+in with pkgs; [
+  nix.yants.tests
+  ops.journaldriver
+  ops.kms_pass
+  ops.kontemplate
+  ops.sync-gcsr
+  tools.blog_cli
+  tools.cheddar
+  tools.emacs
+  web.cgit-taz
+  # web.tazblog #  TODO(tazjin): Happstack build failure in nixos-unstable
+]
diff --git a/default.nix b/default.nix
new file mode 100644
index 0000000000..ad9e332cbf
--- /dev/null
+++ b/default.nix
@@ -0,0 +1,61 @@
+# This file sets up the top-level package set by traversing the package tree
+# (see read-tree.nix for details) and constructing a matching attribute set
+# tree.
+#
+# This makes packages accessible via the Nixery instance that is configured to
+# use this repository as its nixpkgs source.
+
+{ ... }@args:
+
+with builtins;
+
+let
+  # This definition of fix is identical to <nixpkgs>.lib.fix, but the global
+  # package set is not available here.
+  fix = f: let x = f x; in x;
+
+  # Global configuration that all packages are called with.
+  config = pkgs: {
+    inherit pkgs;
+
+    kms = {
+      project = "tazjins-infrastructure";
+      region = "europe-north1";
+      keyring = "tazjins-keys";
+      key = "kontemplate-key";
+    };
+  };
+
+  readTree' = import ./nix/readTree {};
+
+  localPkgs = readTree: {
+    fun           = readTree ./fun;
+    nix           = readTree ./nix;
+    ops           = readTree ./ops;
+    presentations = readTree ./presentations;
+    third_party   = readTree ./third_party;
+    tools         = readTree ./tools;
+    web           = readTree ./web;
+  };
+in fix(self: {
+  config = config self;
+
+  # Elevate 'lib' from nixpkgs
+  lib = import (self.third_party.nixpkgsSrc + "/lib");
+
+  # Expose readTree for downstream repo consumers.
+  readTree = {
+    __functor = x: (readTree' x.config);
+    config = self.config;
+  };
+}
+
+# Add local packages as structured by readTree
+// (localPkgs (readTree' (self.config // { inherit (self) lib; })))
+
+# Load overrides into the top-level.
+#
+# This can be used to move things from third_party into the top-level, too (such
+# as `lib`).
+// (readTree' { pkgs = self; }) ./overrides
+)
diff --git a/docs/CODE_OF_CONDUCT.md b/docs/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000000..0e46bbedb0
--- /dev/null
+++ b/docs/CODE_OF_CONDUCT.md
@@ -0,0 +1,29 @@
+A SERMON ON ETHICS AND LOVE
+===========================
+
+One day Mal-2 asked the messenger spirit Saint Gulik to approach the
+Goddess and request Her presence for some desperate advice. Shortly
+afterwards the radio came on by itself, and an ethereal female Voice
+said **YES?**
+
+"O! Eris! Blessed Mother of Man! Queen of Chaos! Daughter of Discord!
+Concubine of Confusion! O! Exquisite Lady, I beseech You to lift a
+heavy burden from my heart!"
+
+**WHAT BOTHERS YOU, MAL? YOU DON'T SOUND WELL.**
+
+"I am filled with fear and tormented with terrible visions of pain.
+Everywhere people are hurting one another, the planet is rampant with
+injustices, whole societies plunder groups of their own people,
+mothers imprison sons, children perish while brothers war. O, woe."
+
+**WHAT IS THE MATTER WITH THAT, IF IT IS WHAT YOU WANT TO DO?**
+
+"But nobody Wants it! Everybody hates it."
+
+**OH. WELL, THEN *STOP*.**
+
+At which moment She turned herself into an aspirin commercial and left
+The Polyfather stranded alone with his species.
+
+SINISTER DEXTER HAS A BROKEN SPIROMETER.
diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md
new file mode 100644
index 0000000000..df61c7ff70
--- /dev/null
+++ b/docs/CONTRIBUTING.md
@@ -0,0 +1,119 @@
+Contribution Guidelines
+=======================
+
+<!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc-refresh-toc -->
+**Table of Contents**
+
+- [Contribution Guidelines](#contribution-guidelines)
+    - [Before making a change](#before-making-a-change)
+    - [Commit messages](#commit-messages)
+    - [Commit content](#commit-content)
+    - [Code quality](#code-quality)
+    - [Builds & tests](#builds--tests)
+
+<!-- markdown-toc end -->
+
+This is a loose set of "guidelines" for contributing to my depot. Please note
+that I will not accept any patches that don't follow these guidelines.
+
+Also consider the [code of conduct](/tree/docs/CODE_OF_CONDUCT.md). No really,
+you should.
+
+## Before making a change
+
+Before making a change, consider your motivation for making the change.
+Documentation updates, bug fixes and the like are *always* welcome.
+
+When adding a feature you should consider whether it is only useful for your
+particular use-case or whether it is generally applicable for other users of the
+project.
+
+When in doubt - just ask! You can reach out to me via
+[mail](mailto:mail@tazj.in) or on Twitter / IRC / etc.
+
+## Commit messages
+
+All commit messages should be structured like this:
+
+```
+type(scope): Subject line with at most a 68 character length
+
+Body of the commit message with an empty line between subject and
+body. This text should explain what the change does and why it has
+been made, *especially* if it introduces a new feature.
+
+Relevant issues should be mentioned if they exist.
+```
+
+Where `type` can be one of:
+
+* `feat`: A new feature has been introduced
+* `fix`: An issue of some kind has been fixed
+* `docs`: Documentation or comments have been updated
+* `style`: Formatting changes only
+* `refactor`: Hopefully self-explanatory!
+* `test`: Added missing tests / fixed tests
+* `chore`: Maintenance work
+
+And `scope` should refer to some kind of logical grouping inside of the project.
+
+Please take a look at the existing commit log for examples.
+
+## Commit content
+
+Multiple changes should be divided into multiple git commits whenever possible.
+Common sense applies.
+
+The fix for a single-line whitespace issue is fine to include in a different
+commit. Introducing a new feature and refactoring (unrelated) code in the same
+commit is not fine.
+
+`git commit -a` is generally **taboo**.
+
+In my experience making "sane" commits becomes *significantly* easier as
+developer tooling is improved. The interface to `git` that I recommend is
+[magit][]. Even if you are not yet an Emacs user, it makes sense to install
+Emacs just to be able to use magit - it is really that good.
+
+For staging sane chunks on the command line with only git, consider `git add
+-p`.
+
+## Code quality
+
+This one should go without saying - but please ensure that your code quality
+does not fall below the rest of the project. This is of course very subjective,
+but as an example if you place code that throws away errors into a block in
+which errors are handled properly your change will be rejected.
+
+In my experience there is a strong correlation between the visual appearance of
+a code block and its quality. This is a simple way to sanity-check your work
+while squinting and keeping some distance from your screen ;-)
+
+## Builds & tests
+
+My projects are built using [Nix][] to avoid "build pollution" via the user's
+environment.
+
+If you have Nix installed and are contributing to a project tracked in this
+repository, you can usually build the project by calling `nix-build -A
+path.to.project`.
+
+For example, to build a project located at `tools/foo` you would call `nix-build
+-A tools.foo`
+
+If the project has tests, check that they still work before submitting your
+change.
+
+## Submitting patches
+
+When making a change, please create an appropriate commit locally and send it to
+me using either `git send-email` or `git format-patch`. The email address to use
+for depot reviews is `depot@tazj.in`, which is a [public group][].
+
+I recognise that most people are used to a GitHub-style workflow. If you run
+into issues with the above but would still like to contribute, feel free to
+reach out to me.
+
+[magit]: https://magit.vc/
+[Nix]: https://nixos.org/nix/
+[public group]: https://groups.google.com/a/tazj.in/forum/?hl=en#!forum/depot
diff --git a/fun/amsterdump/default.nix b/fun/amsterdump/default.nix
new file mode 100644
index 0000000000..e5fc22a176
--- /dev/null
+++ b/fun/amsterdump/default.nix
@@ -0,0 +1,13 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.program {
+  name = "amsterdump";
+  srcs = [
+    ./main.go
+  ];
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+    # gopkgs."golang.org".x.oauth2.google
+    gopkgs."googlemaps.github.io".maps
+  ];
+}
diff --git a/fun/amsterdump/listings-20200105.json b/fun/amsterdump/listings-20200105.json
new file mode 100644
index 0000000000..251598312a
--- /dev/null
+++ b/fun/amsterdump/listings-20200105.json
@@ -0,0 +1,2326 @@
+[
+  {
+    "address": "Sumatrakade 577, 1019 PS Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87026792-sumatrakade-577/?navigateSource=toppositie",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "20.5 km",
+        "value": 20475
+      },
+      "duration": {
+        "value": 2467,
+        "text": "41m7s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "3.2 km",
+        "value": 3187
+      },
+      "duration": {
+        "value": 727,
+        "text": "12m7s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Spuistraat 253, 1012 VR Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-86705763-spuistraat-253-hs/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "14.2 km",
+        "value": 14151
+      },
+      "duration": {
+        "value": 1901,
+        "text": "31m41s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "1.5 km",
+        "value": 1459
+      },
+      "duration": {
+        "value": 522,
+        "text": "8m42s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Melis Stokehof 84, 1064 JE Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87036254-melis-stokehof-84/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "16.1 km",
+        "value": 16086
+      },
+      "duration": {
+        "value": 2166,
+        "text": "36m6s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "7.3 km",
+        "value": 7317
+      },
+      "duration": {
+        "value": 1772,
+        "text": "29m32s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Churchill-laan 91D, 1078 DK Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41533400-churchill-laan-91-d/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "11.6 km",
+        "value": 11590
+      },
+      "duration": {
+        "value": 1921,
+        "text": "32m1s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "5.7 km",
+        "value": 5749
+      },
+      "duration": {
+        "value": 1609,
+        "text": "26m49s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "De Boelelaan 745, 1082 RS Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41687804-de-boelelaan-745/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "9.5 km",
+        "value": 9466
+      },
+      "duration": {
+        "value": 907,
+        "text": "15m7s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "6.7 km",
+        "value": 6659
+      },
+      "duration": {
+        "value": 1147,
+        "text": "19m7s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Leeuwendalersweg 15G, 1055 JE Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41679332-leeuwendalersweg-15-g/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "11.4 km",
+        "value": 11359
+      },
+      "duration": {
+        "value": 1596,
+        "text": "26m36s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "6.5 km",
+        "value": 6526
+      },
+      "duration": {
+        "value": 1364,
+        "text": "22m44s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Singel 449, 1012 XG Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87899154-singel-449-1/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "14.2 km",
+        "value": 14169
+      },
+      "duration": {
+        "value": 1911,
+        "text": "31m51s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "1.9 km",
+        "value": 1945
+      },
+      "duration": {
+        "value": 568,
+        "text": "9m28s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Jan van Zutphenstraat 211, 1069 RR Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41671501-jan-van-zutphenstraat-211/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "10.2 km",
+        "value": 10160
+      },
+      "duration": {
+        "value": 1647,
+        "text": "27m27s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "9.1 km",
+        "value": 9145
+      },
+      "duration": {
+        "value": 2311,
+        "text": "38m31s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Parnassusweg 977, Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41670908-parnassusweg-977/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "9.6 km",
+        "value": 9578
+      },
+      "duration": {
+        "value": 996,
+        "text": "16m36s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "6.8 km",
+        "value": 6780
+      },
+      "duration": {
+        "value": 1236,
+        "text": "20m36s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Esplanade de Meer 179, 1098 WJ Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87995311-esplanade-de-meer-179/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "17.4 km",
+        "value": 17441
+      },
+      "duration": {
+        "value": 2107,
+        "text": "35m7s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "7.0 km",
+        "value": 6989
+      },
+      "duration": {
+        "value": 1600,
+        "text": "26m40s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Hoofdweg 538, 1055 AB Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41521204-hoofdweg-538/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "14.1 km",
+        "value": 14073
+      },
+      "duration": {
+        "value": 1892,
+        "text": "31m32s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "6.5 km",
+        "value": 6468
+      },
+      "duration": {
+        "value": 1320,
+        "text": "22m0s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Hoofdweg 538, 1055 AB Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41521204-hoofdweg-538/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "14.1 km",
+        "value": 14073
+      },
+      "duration": {
+        "value": 1892,
+        "text": "31m32s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "6.5 km",
+        "value": 6468
+      },
+      "duration": {
+        "value": 1320,
+        "text": "22m0s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Hoofdweg 538, 1055 AB Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41521204-hoofdweg-538/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "14.1 km",
+        "value": 14073
+      },
+      "duration": {
+        "value": 1892,
+        "text": "31m32s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "6.5 km",
+        "value": 6468
+      },
+      "duration": {
+        "value": 1320,
+        "text": "22m0s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Annie Romeinplein 18, 1103 JL Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87985710-annie-romeinplein-18/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "17.4 km",
+        "value": 17402
+      },
+      "duration": {
+        "value": 1869,
+        "text": "31m9s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "10.1 km",
+        "value": 10129
+      },
+      "duration": {
+        "value": 1308,
+        "text": "21m48s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Vechtstraat 185, 1079 JJ Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41512041-vechtstraat-185-ii/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "11.9 km",
+        "value": 11877
+      },
+      "duration": {
+        "value": 1876,
+        "text": "31m16s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "7.0 km",
+        "value": 6992
+      },
+      "duration": {
+        "value": 2142,
+        "text": "35m42s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Westerdok 240, 1013 BH Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41553306-westerdok-240/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "18.3 km",
+        "value": 18332
+      },
+      "duration": {
+        "value": 1816,
+        "text": "30m16s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "1.7 km",
+        "value": 1748
+      },
+      "duration": {
+        "value": 715,
+        "text": "11m55s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "IJburglaan 701, 1087 BS Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87898167-ijburglaan-701/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "24.5 km",
+        "value": 24471
+      },
+      "duration": {
+        "value": 2556,
+        "text": "42m36s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "7.1 km",
+        "value": 7097
+      },
+      "duration": {
+        "value": 935,
+        "text": "15m35s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "IJdoornlaan 1497, 1034 Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87041092-ijdoornlaan-1497-a/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "19.5 km",
+        "value": 19524
+      },
+      "duration": {
+        "value": 2620,
+        "text": "43m40s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "4.7 km",
+        "value": 4704
+      },
+      "duration": {
+        "value": 1139,
+        "text": "18m59s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Sumatrakade 577, 1019 PS Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87026792-sumatrakade-577/?navigateSource=toppositie",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "20.5 km",
+        "value": 20475
+      },
+      "duration": {
+        "value": 2467,
+        "text": "41m7s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "3.2 km",
+        "value": 3187
+      },
+      "duration": {
+        "value": 727,
+        "text": "12m7s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "George Sliekerkade 18, 1087 KK Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87030790-george-sliekerkade-18/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "24.8 km",
+        "value": 24761
+      },
+      "duration": {
+        "value": 2843,
+        "text": "47m23s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "8.0 km",
+        "value": 7958
+      },
+      "duration": {
+        "value": 1183,
+        "text": "19m43s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Sumatrakade 265, 1019 PK Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41662773-sumatrakade-265/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "20.6 km",
+        "value": 20638
+      },
+      "duration": {
+        "value": 2587,
+        "text": "43m7s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "3.4 km",
+        "value": 3350
+      },
+      "duration": {
+        "value": 847,
+        "text": "14m7s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Koggestraat 5, 1012 TA Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41531104-koggestraat-5-2/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "17.9 km",
+        "value": 17938
+      },
+      "duration": {
+        "value": 1748,
+        "text": "29m8s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "1.0 km",
+        "value": 981
+      },
+      "duration": {
+        "value": 393,
+        "text": "6m33s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Warmoesstraat 139B, 1012 JB Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41524099-warmoesstraat-139-b/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "18.1 km",
+        "value": 18072
+      },
+      "duration": {
+        "value": 1835,
+        "text": "30m35s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "1.0 km",
+        "value": 964
+      },
+      "duration": {
+        "value": 315,
+        "text": "5m15s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Parnassusweg 35, 1077 Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41579167-parnassusweg-35-i/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "10.0 km",
+        "value": 9986
+      },
+      "duration": {
+        "value": 1329,
+        "text": "22m9s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "5.8 km",
+        "value": 5754
+      },
+      "duration": {
+        "value": 1568,
+        "text": "26m8s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "De Boelelaan 389, 1082 RH Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87890510-de-boelelaan-389/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "9.6 km",
+        "value": 9650
+      },
+      "duration": {
+        "value": 1048,
+        "text": "17m28s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "6.9 km",
+        "value": 6852
+      },
+      "duration": {
+        "value": 1288,
+        "text": "21m28s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Theo Frenkelhof 96, 1087 JA Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87995272-theo-frenkelhof-96/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "24.9 km",
+        "value": 24874
+      },
+      "duration": {
+        "value": 2928,
+        "text": "48m48s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "8.1 km",
+        "value": 8101
+      },
+      "duration": {
+        "value": 1268,
+        "text": "21m8s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Veembroederhof 207, 1019 HD Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41539826-veembroederhof-207/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "19.7 km",
+        "value": 19731
+      },
+      "duration": {
+        "value": 2402,
+        "text": "40m2s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "1.8 km",
+        "value": 1845
+      },
+      "duration": {
+        "value": 501,
+        "text": "8m21s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Nieuwe Passeerdersstraat 174, 1016 XP Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41537370-nieuwe-passeerdersstraat-174/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "12.3 km",
+        "value": 12345
+      },
+      "duration": {
+        "value": 1885,
+        "text": "31m25s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "2.9 km",
+        "value": 2937
+      },
+      "duration": {
+        "value": 978,
+        "text": "16m18s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Jan van Galenstraat 1K, 1051 KE Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41513735-jan-van-galenstraat-1-k/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "14.0 km",
+        "value": 14042
+      },
+      "duration": {
+        "value": 2071,
+        "text": "34m31s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "4.1 km",
+        "value": 4104
+      },
+      "duration": {
+        "value": 859,
+        "text": "14m19s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Joan Melchior Kemperstraat 128, 1051 TX Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87924023-joan-melchior-kemperstraat-128-3/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "15.6 km",
+        "value": 15558
+      },
+      "duration": {
+        "value": 2675,
+        "text": "44m35s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "4.2 km",
+        "value": 4220
+      },
+      "duration": {
+        "value": 1015,
+        "text": "16m55s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Javakade 560, 1019 SE Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41438193-javakade-560/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "20.2 km",
+        "value": 20218
+      },
+      "duration": {
+        "value": 2508,
+        "text": "41m48s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "2.1 km",
+        "value": 2114
+      },
+      "duration": {
+        "value": 718,
+        "text": "11m58s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Saxen Weimarlaan 32, 1075 BZ Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41427768-saxen-weimarlaan-32-ii/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "13.7 km",
+        "value": 13707
+      },
+      "duration": {
+        "value": 1836,
+        "text": "30m36s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "5.5 km",
+        "value": 5516
+      },
+      "duration": {
+        "value": 1557,
+        "text": "25m57s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Zeedijk 125C, 1012 AW Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87892979-zeedijk-125-c/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "18.1 km",
+        "value": 18074
+      },
+      "duration": {
+        "value": 1845,
+        "text": "30m45s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "1.0 km",
+        "value": 1031
+      },
+      "duration": {
+        "value": 269,
+        "text": "4m29s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Sumatrakade 577, 1019 PS Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87026792-sumatrakade-577/?navigateSource=toppositie",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "20.5 km",
+        "value": 20475
+      },
+      "duration": {
+        "value": 2467,
+        "text": "41m7s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "3.2 km",
+        "value": 3187
+      },
+      "duration": {
+        "value": 727,
+        "text": "12m7s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Revaleiland 89, 1013 AX Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41685704-revaleiland-89/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "20.0 km",
+        "value": 20043
+      },
+      "duration": {
+        "value": 2208,
+        "text": "36m48s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "3.2 km",
+        "value": 3244
+      },
+      "duration": {
+        "value": 941,
+        "text": "15m41s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Rozengracht 42A, 1016 ND Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41685113-rozengracht-42-a/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "13.2 km",
+        "value": 13195
+      },
+      "duration": {
+        "value": 1977,
+        "text": "32m57s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "1.8 km",
+        "value": 1826
+      },
+      "duration": {
+        "value": 621,
+        "text": "10m21s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Rembrandtplein 7, 1017 CV Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87903367-rembrandtplein-7-1/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "14.3 km",
+        "value": 14276
+      },
+      "duration": {
+        "value": 1998,
+        "text": "33m18s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "2.0 km",
+        "value": 2033
+      },
+      "duration": {
+        "value": 574,
+        "text": "9m34s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Leenhofstraat 69, 1067 LA Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41576354-leenhofstraat-69-4/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "14.1 km",
+        "value": 14143
+      },
+      "duration": {
+        "value": 2126,
+        "text": "35m26s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "10.4 km",
+        "value": 10374
+      },
+      "duration": {
+        "value": 1974,
+        "text": "32m54s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Bolestein 300, 1081 ED Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41575228-bolestein-300/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "12.1 km",
+        "value": 12120
+      },
+      "duration": {
+        "value": 1939,
+        "text": "32m19s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "12.2 km",
+        "value": 12165
+      },
+      "duration": {
+        "value": 1692,
+        "text": "28m12s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Westerdoksdijk 263b, 1013 AD Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41562746-westerdoksdijk-263-b-pp/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "18.2 km",
+        "value": 18157
+      },
+      "duration": {
+        "value": 1687,
+        "text": "28m7s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "1.4 km",
+        "value": 1358
+      },
+      "duration": {
+        "value": 420,
+        "text": "7m0s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Brederodestraat 89, 1054 VC Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87916974-brederodestraat-89-hs/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "10.4 km",
+        "value": 10450
+      },
+      "duration": {
+        "value": 1677,
+        "text": "27m57s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "4.4 km",
+        "value": 4382
+      },
+      "duration": {
+        "value": 1384,
+        "text": "23m4s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Kon. Wilhelminaplein 222, 1062 KT Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41427806-koningin-wilhelminaplein-222/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "9.1 km",
+        "value": 9070
+      },
+      "duration": {
+        "value": 987,
+        "text": "16m27s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "14.1 km",
+        "value": 14135
+      },
+      "duration": {
+        "value": 1734,
+        "text": "28m54s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Tweede Hugo de Grootstraat 45, 1052 LE Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-40342170-tweede-hugo-de-grootstraat-45-c/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "20.8 km",
+        "value": 20802
+      },
+      "duration": {
+        "value": 2309,
+        "text": "38m29s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "3.8 km",
+        "value": 3825
+      },
+      "duration": {
+        "value": 826,
+        "text": "13m46s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Eerste Constantijn Huygensstraat 102, 1054 BZ Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41687869-eerste-constantijn-huygensstraat-102-3/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "11.2 km",
+        "value": 11214
+      },
+      "duration": {
+        "value": 1758,
+        "text": "29m18s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "3.0 km",
+        "value": 3035
+      },
+      "duration": {
+        "value": 1210,
+        "text": "20m10s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Gustav Mahlerlaan 483, 1082 LS Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41685852-gustav-mahlerlaan-483/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "9.3 km",
+        "value": 9292
+      },
+      "duration": {
+        "value": 776,
+        "text": "12m56s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "6.5 km",
+        "value": 6485
+      },
+      "duration": {
+        "value": 1016,
+        "text": "16m56s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Gustav Mahlerlaan 439, 1082 LS Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41685850-gustav-mahlerlaan-439/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "9.3 km",
+        "value": 9255
+      },
+      "duration": {
+        "value": 748,
+        "text": "12m28s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "6.4 km",
+        "value": 6448
+      },
+      "duration": {
+        "value": 988,
+        "text": "16m28s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Kruitberghof 94, 1104 CA Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87033407-kruitberghof-94/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "19.2 km",
+        "value": 19210
+      },
+      "duration": {
+        "value": 2214,
+        "text": "36m54s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "10.9 km",
+        "value": 10911
+      },
+      "duration": {
+        "value": 1273,
+        "text": "21m13s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Kerkstraat 322, 1017 HC Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87900649-kerkstraat-322-c/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "13.3 km",
+        "value": 13310
+      },
+      "duration": {
+        "value": 1928,
+        "text": "32m8s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "2.4 km",
+        "value": 2441
+      },
+      "duration": {
+        "value": 884,
+        "text": "14m44s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Boerhaaveplein 12, 1091 AS Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87928778-boerhaaveplein-12-1/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "19.7 km",
+        "value": 19690
+      },
+      "duration": {
+        "value": 2090,
+        "text": "34m50s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "2.7 km",
+        "value": 2710
+      },
+      "duration": {
+        "value": 652,
+        "text": "10m52s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Sumatrakade 577, 1019 PS Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87026792-sumatrakade-577/?navigateSource=toppositie",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "20.5 km",
+        "value": 20475
+      },
+      "duration": {
+        "value": 2467,
+        "text": "41m7s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "3.2 km",
+        "value": 3187
+      },
+      "duration": {
+        "value": 727,
+        "text": "12m7s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Boylestraat 12I, 1098 PC Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87924456-boylestraat-12-i/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "21.1 km",
+        "value": 21067
+      },
+      "duration": {
+        "value": 2701,
+        "text": "45m1s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "5.4 km",
+        "value": 5436
+      },
+      "duration": {
+        "value": 1594,
+        "text": "26m34s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Kanaalstraat 88C, 1054 XL Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41557413-kanaalstraat-88-c/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "11.3 km",
+        "value": 11336
+      },
+      "duration": {
+        "value": 1664,
+        "text": "27m44s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "4.1 km",
+        "value": 4135
+      },
+      "duration": {
+        "value": 1201,
+        "text": "20m1s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Borneokade 285, 1019 XG Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huis-40216702-borneokade-285/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "22.9 km",
+        "value": 22862
+      },
+      "duration": {
+        "value": 2931,
+        "text": "48m51s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "5.6 km",
+        "value": 5573
+      },
+      "duration": {
+        "value": 1191,
+        "text": "19m51s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Spadinalaan, 1031 Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41426177-spadinalaan-240/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "19.1 km",
+        "value": 19133
+      },
+      "duration": {
+        "value": 2325,
+        "text": "38m45s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "1.4 km",
+        "value": 1372
+      },
+      "duration": {
+        "value": 1000,
+        "text": "16m40s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Pontsteiger 295, 1013 AH Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41532923-pontsteiger-295/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "19.6 km",
+        "value": 19557
+      },
+      "duration": {
+        "value": 2137,
+        "text": "35m37s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "2.8 km",
+        "value": 2758
+      },
+      "duration": {
+        "value": 870,
+        "text": "14m30s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Wielingenstraat 30, 1078 KL Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41660066-wielingenstraat-30-g/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "11.3 km",
+        "value": 11329
+      },
+      "duration": {
+        "value": 1469,
+        "text": "24m29s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "4.9 km",
+        "value": 4865
+      },
+      "duration": {
+        "value": 908,
+        "text": "15m8s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Karspeldreef 1443, 1104 SE Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87901941-karspeldreef-1443/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "19.1 km",
+        "value": 19138
+      },
+      "duration": {
+        "value": 2162,
+        "text": "36m2s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "10.8 km",
+        "value": 10839
+      },
+      "duration": {
+        "value": 1221,
+        "text": "20m21s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Joan Muyskenweg 4, 1096 CJ Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41412597-joan-muyskenweg-4-h4/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "17.1 km",
+        "value": 17067
+      },
+      "duration": {
+        "value": 2267,
+        "text": "37m47s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "5.8 km",
+        "value": 5777
+      },
+      "duration": {
+        "value": 1332,
+        "text": "22m12s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Wibautstraat 70, 1091 GN Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41686330-wibautstraat-70-y/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "15.5 km",
+        "value": 15460
+      },
+      "duration": {
+        "value": 1524,
+        "text": "25m24s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "3.1 km",
+        "value": 3108
+      },
+      "duration": {
+        "value": 415,
+        "text": "6m55s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Balistraat 16D, 1094 JL Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-41675497-balistraat-16-d/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "21.0 km",
+        "value": 21009
+      },
+      "duration": {
+        "value": 2349,
+        "text": "39m9s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "4.2 km",
+        "value": 4210
+      },
+      "duration": {
+        "value": 860,
+        "text": "14m20s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Wamelplein 32, 1106 DP Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87035710-wamelplein-32/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "19.4 km",
+        "value": 19383
+      },
+      "duration": {
+        "value": 1694,
+        "text": "28m14s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "12.7 km",
+        "value": 12699
+      },
+      "duration": {
+        "value": 1585,
+        "text": "26m25s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Osdorperweg 664, 1067 SZ Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huis-87858446-osdorperweg-664/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "13.7 km",
+        "value": 13735
+      },
+      "duration": {
+        "value": 2914,
+        "text": "48m34s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "12.5 km",
+        "value": 12469
+      },
+      "duration": {
+        "value": 3245,
+        "text": "54m5s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Utrechtsestraat 106, 1017 VS Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87031649-utrechtsestraat-106-2/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "13.3 km",
+        "value": 13300
+      },
+      "duration": {
+        "value": 2112,
+        "text": "35m12s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "2.9 km",
+        "value": 2944
+      },
+      "duration": {
+        "value": 811,
+        "text": "13m31s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Vossiusstraat 17, 1054 ES Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87026796-vossiusstraat-17-1/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "16.2 km",
+        "value": 16171
+      },
+      "duration": {
+        "value": 2115,
+        "text": "35m15s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "3.3 km",
+        "value": 3285
+      },
+      "duration": {
+        "value": 1087,
+        "text": "18m7s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Sumatrakade 577, 1019 PS Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87026792-sumatrakade-577/?navigateSource=toppositie",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "20.5 km",
+        "value": 20475
+      },
+      "duration": {
+        "value": 2467,
+        "text": "41m7s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "3.2 km",
+        "value": 3187
+      },
+      "duration": {
+        "value": 727,
+        "text": "12m7s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Singel 449A, 1012 WP Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-86774627-singel-449-a/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "14.2 km",
+        "value": 14172
+      },
+      "duration": {
+        "value": 1914,
+        "text": "31m54s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "1.9 km",
+        "value": 1948
+      },
+      "duration": {
+        "value": 571,
+        "text": "9m31s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Gordijnensteeg 1, 1012 BT Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87925802-gordijnensteeg-1/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "21.6 km",
+        "value": 21578
+      },
+      "duration": {
+        "value": 2076,
+        "text": "34m36s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "1.0 km",
+        "value": 1046
+      },
+      "duration": {
+        "value": 285,
+        "text": "4m45s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Reguliersdwarsstraat 125, 1017 BL Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-87804538-reguliersdwarsstraat-125-2/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "21.3 km",
+        "value": 21342
+      },
+      "duration": {
+        "value": 2235,
+        "text": "37m15s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "2.2 km",
+        "value": 2168
+      },
+      "duration": {
+        "value": 651,
+        "text": "10m51s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Saxen Weimarlaan 32, 1075 BZ Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/appartement-86783378-saxen-weimarlaan-32-2/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "13.7 km",
+        "value": 13707
+      },
+      "duration": {
+        "value": 1836,
+        "text": "30m36s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "5.5 km",
+        "value": 5516
+      },
+      "duration": {
+        "value": 1557,
+        "text": "25m57s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Joan Muyskenweg 4, 1096 CJ Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huurcomplex-40896531-joan-muyskenweg-4a-t-m-4h/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "17.1 km",
+        "value": 17067
+      },
+      "duration": {
+        "value": 2267,
+        "text": "37m47s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "5.8 km",
+        "value": 5777
+      },
+      "duration": {
+        "value": 1332,
+        "text": "22m12s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Volkerakstraat & Krammerstraat, 1078 AV Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huurcomplex-40405375-wielingenstraat-volkerakstraat-krammerstraat-eendrachtstraat/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "11.4 km",
+        "value": 11405
+      },
+      "duration": {
+        "value": 1518,
+        "text": "25m18s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "4.9 km",
+        "value": 4941
+      },
+      "duration": {
+        "value": 957,
+        "text": "15m57s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Pontsteiger, 1013 AH Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huurcomplex-40133931-pontsteiger/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "19.4 km",
+        "value": 19399
+      },
+      "duration": {
+        "value": 2020,
+        "text": "33m40s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "2.6 km",
+        "value": 2600
+      },
+      "duration": {
+        "value": 753,
+        "text": "12m33s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "153 S Pearl St, Albany, NY 12202, USA",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huurcomplex-41409333-de-halve-maen/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "ZERO_RESULTS",
+      "distance": {
+        "text": "",
+        "value": 0
+      },
+      "duration": {
+        "value": 0,
+        "text": ""
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "ZERO_RESULTS",
+      "distance": {
+        "text": "",
+        "value": 0
+      },
+      "duration": {
+        "value": 0,
+        "text": ""
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Stokerkade 2, 1019 XA Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huurcomplex-48914398-borneokade-255-313-stuurmankade-146-264-stokerkade-2-60-patio-woningen/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "22.7 km",
+        "value": 22749
+      },
+      "duration": {
+        "value": 2848,
+        "text": "47m28s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "5.5 km",
+        "value": 5460
+      },
+      "duration": {
+        "value": 1108,
+        "text": "18m28s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Tweede Hugo de Grootstraat, Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huurcomplex-49624585-tweede-hugo-de-grootstraat/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "21.0 km",
+        "value": 20980
+      },
+      "duration": {
+        "value": 2473,
+        "text": "41m13s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "4.0 km",
+        "value": 4003
+      },
+      "duration": {
+        "value": 990,
+        "text": "16m30s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Westerdoksdijk 243, 1013 AD Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huurcomplex-48925492-westerdoksdijk-243-t-m-271-d/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "18.2 km",
+        "value": 18168
+      },
+      "duration": {
+        "value": 1694,
+        "text": "28m14s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "1.4 km",
+        "value": 1369
+      },
+      "duration": {
+        "value": 427,
+        "text": "7m7s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Javakade 440, 1019 SC Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huurcomplex-48914339-javakade-440-618-imogirituin-6-8/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "20.6 km",
+        "value": 20578
+      },
+      "duration": {
+        "value": 2544,
+        "text": "42m24s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "2.2 km",
+        "value": 2211
+      },
+      "duration": {
+        "value": 786,
+        "text": "13m6s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Nieuwe Passeerdersstraat, 1016 XJ Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huurcomplex-40176801-nieuwe-passeerdersstraat/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "12.4 km",
+        "value": 12361
+      },
+      "duration": {
+        "value": 1897,
+        "text": "31m37s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "2.9 km",
+        "value": 2922
+      },
+      "duration": {
+        "value": 967,
+        "text": "16m7s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Nieuwe Passeerdersstraat, 1016 XJ Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huurcomplex-40176801-nieuwe-passeerdersstraat/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "12.4 km",
+        "value": 12361
+      },
+      "duration": {
+        "value": 1897,
+        "text": "31m37s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "2.9 km",
+        "value": 2922
+      },
+      "duration": {
+        "value": 967,
+        "text": "16m7s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Sumatrakade 13, 1019 BJ Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huurcomplex-48925472-sumatrakade-13-1295/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "21.2 km",
+        "value": 21157
+      },
+      "duration": {
+        "value": 2599,
+        "text": "43m19s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "3.9 km",
+        "value": 3868
+      },
+      "duration": {
+        "value": 859,
+        "text": "14m19s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Sumatrakade 13, 1019 BJ Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huurcomplex-48925472-sumatrakade-13-1295/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "21.2 km",
+        "value": 21157
+      },
+      "duration": {
+        "value": 2599,
+        "text": "43m19s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "3.9 km",
+        "value": 3868
+      },
+      "duration": {
+        "value": 859,
+        "text": "14m19s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Westerdoksdijk 4, 1013 AA Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huurcomplex-40544531-westerdok-en-westerdoksdijk-4-6-106-t-m-270-en-35-t-m-49-89-t-m-101/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "17.9 km",
+        "value": 17924
+      },
+      "duration": {
+        "value": 1687,
+        "text": "28m7s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "0.9 km",
+        "value": 919
+      },
+      "duration": {
+        "value": 693,
+        "text": "11m33s"
+      },
+      "duration_in_traffic": null
+    }
+  },
+  {
+    "address": "Westerdoksdijk 4, 1013 AA Amsterdam, Netherlands",
+    "url": "https://www.funda.nl/en/huur/amsterdam/huurcomplex-40544531-westerdok-en-westerdoksdijk-4-6-106-t-m-270-en-35-t-m-49-89-t-m-101/?navigateSource=resultlist",
+    "schiphol": {
+      "status": "OK",
+      "distance": {
+        "text": "17.9 km",
+        "value": 17924
+      },
+      "duration": {
+        "value": 1687,
+        "text": "28m7s"
+      },
+      "duration_in_traffic": null
+    },
+    "centraal": {
+      "status": "OK",
+      "distance": {
+        "text": "0.9 km",
+        "value": 919
+      },
+      "duration": {
+        "value": 693,
+        "text": "11m33s"
+      },
+      "duration_in_traffic": null
+    }
+  }
+]
diff --git a/fun/amsterdump/main.go b/fun/amsterdump/main.go
new file mode 100644
index 0000000000..dda9995b7c
--- /dev/null
+++ b/fun/amsterdump/main.go
@@ -0,0 +1,108 @@
+// Amsterdump is a small program that populates a BigQuery table with
+// a matrix of origin points scattered around Amsterdam and each
+// respective points travel time to a given destination.
+//
+// The two destinations used here are the Schiphol Airport and
+// Amsterdam Central station.
+//
+// To accomplish this the Google Maps Distance Matrix API [1] is
+// queried with the points. A visualisation is later done using
+// BigQuery GeoViz[2].
+//
+// [1]: https://developers.google.com/maps/documentation/distance-matrix/start#quotas
+// [2]: https://bigquerygeoviz.appspot.com/
+package main
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"log"
+	"os"
+
+	"googlemaps.github.io/maps"
+)
+
+func failOn(err error, msg string) {
+	if err != nil {
+		log.Fatalln(msg, err)
+	}
+}
+
+type LocationResult struct {
+	Address  string                      `json:"address"`
+	URL      string                      `json:"url"`
+	Schiphol *maps.DistanceMatrixElement `json:"schiphol"`
+	Centraal *maps.DistanceMatrixElement `json:"centraal"`
+}
+
+type Listing struct {
+	URL     string `json:"url"`
+	Address string `json:"address"`
+}
+
+func requestMatrix(ctx context.Context, client *maps.Client, listings []Listing) {
+	origins := make([]string, len(listings))
+	for i, l := range listings {
+		origins[i] = l.Address
+	}
+
+	request := &maps.DistanceMatrixRequest{
+		Mode:    maps.TravelModeTransit,
+		Units:   maps.UnitsMetric,
+		Origins: origins,
+
+		Destinations: []string{
+			"Schiphol Airport",
+			"Amsterdam Centraal",
+		},
+	}
+
+	response, err := client.DistanceMatrix(ctx, request)
+	failOn(err, "could not retrieve distance matrix:")
+
+	for idx, addr := range response.OriginAddresses {
+		result := LocationResult{
+			Address:  addr,
+			URL:      listings[idx].URL,
+			Schiphol: response.Rows[idx].Elements[0],
+			Centraal: response.Rows[idx].Elements[1],
+		}
+
+		j, _ := json.Marshal(result)
+		fmt.Println(string(j))
+	}
+}
+
+func main() {
+	var listings []Listing
+	input, err := ioutil.ReadFile("fun/amsterdump/input.json")
+	failOn(err, "could not read input file:")
+
+	err = json.Unmarshal(input, &listings)
+	failOn(err, "could not deserialise listings:")
+
+	ctx := context.Background()
+	apiKey = os.Getenv("MAPS_API_KEY", "")
+	if apiKey == "" {
+		log.Fatalln("API key must be supplied via MAPS_API_KEY")
+	}
+
+	client, err := maps.NewClient(maps.WithAPIKey(apiKey))
+	failOn(err, "could not create Google Maps API client:")
+
+	var chunk []Listing
+	for _, l := range listings {
+		if len(chunk) == 25 {
+			requestMatrix(ctx, client, chunk)
+			chunk = []Listing{}
+		} else {
+			chunk = append(chunk, l)
+		}
+	}
+
+	if len(chunk) > 1 {
+		requestMatrix(ctx, client, chunk)
+	}
+}
diff --git a/fun/amsterdump/scrape.el b/fun/amsterdump/scrape.el
new file mode 100644
index 0000000000..f5537c2c8f
--- /dev/null
+++ b/fun/amsterdump/scrape.el
@@ -0,0 +1,25 @@
+;; Scraping funda.nl (this file is just notes and snippets, not full code)
+;;
+;; Begin by copying whole page into buffer (out of inspect element
+;; because encoding is difficult)
+
+(beginning-of-buffer)
+
+;; zap everything that isn't a relevant result
+(keep-lines "data-object-url-tracking\\|img alt")
+
+;; mark all spans, move them to the end of the buffer
+(cl-letf (((symbol-function 'read-regexp)
+           (lambda (&rest _) "</span>")))
+  (mc/mark-all-in-region-regexp (point-min) (point-max)))
+
+;; mark all images lines (these contain street addresses for things
+;; with images), clear up and join with previous
+;;
+;; mark all: data-image-error-fallback
+
+;; delete all lines that don't either contain a span or an img tag
+;; (there are duplicates)
+(keep-lines "span class\\|img alt")
+
+;; do some manual cleanup from the hrefs and done
diff --git a/fun/aoc2019/default.nix b/fun/aoc2019/default.nix
new file mode 100644
index 0000000000..a53586eea9
--- /dev/null
+++ b/fun/aoc2019/default.nix
@@ -0,0 +1,22 @@
+# Solutions for Advent of Code 2019, written in Emacs Lisp.
+#
+# For each day a new file is created as "solution-day$n.el".
+{ pkgs, ... }:
+
+let
+  inherit (builtins) attrNames filter head listToAttrs match readDir;
+  dir = readDir ./.;
+  matchSolution = match "solution-(.*)\.el";
+  isSolution = f: (matchSolution f) != null;
+  getDay = f: head (matchSolution f);
+
+  solutionFiles = filter (e: dir."${e}" == "regular" && isSolution e) (attrNames dir);
+  solutions = map (f: let day = getDay f; in {
+    name = day;
+    value = pkgs.writeElispBin {
+      name = "aoc2019";
+      deps = p: with p; [ dash s ht ];
+      src = ./. + ("/" + f);
+    };
+  }) solutionFiles;
+in listToAttrs solutions
diff --git a/fun/aoc2019/solution-day1.el b/fun/aoc2019/solution-day1.el
new file mode 100644
index 0000000000..d805c22ec8
--- /dev/null
+++ b/fun/aoc2019/solution-day1.el
@@ -0,0 +1,28 @@
+;; Advent of Code 2019 - Day 1
+(require 'dash)
+
+;; Puzzle 1:
+
+(defvar day-1/input
+  '(83285 96868 121640 51455 128067 128390 141809 52325 68310 140707 124520 149678
+          87961 52040 133133 52203 117483 85643 84414 86558 65402 122692 88565 61895
+          126271 128802 140363 109764 53600 114391 98973 124467 99574 69140 144856
+          56809 149944 138738 128823 82776 77557 51994 74322 64716 114506 124074
+          73096 97066 96731 149307 135626 121413 69575 98581 50570 60754 94843 72165
+          146504 53290 63491 50936 79644 119081 70218 85849 133228 114550 131943
+          67288 68499 80512 148872 99264 119723 68295 90348 146534 52661 99146 95993
+          130363 78956 126736 82065 77227 129950 97946 132345 107137 79623 148477
+          88928 118911 75277 97162 80664 149742 88983 74518))
+
+(defun calculate-fuel (mass)
+  (- (/ mass 3) 2))
+
+(message "Solution to day1/1: %d" (apply #'+ (-map #'calculate-fuel day-1/input)))
+
+;; Puzzle 2:
+(defun calculate-recursive-fuel (mass)
+  (let ((fuel (calculate-fuel mass)))
+    (if (< fuel 0) 0
+      (+ fuel (calculate-recursive-fuel fuel)))))
+
+(message "Solution to day1/2: %d" (apply #'+ (-map #'calculate-recursive-fuel day-1/input)))
diff --git a/fun/aoc2019/solution-day2.el b/fun/aoc2019/solution-day2.el
new file mode 100644
index 0000000000..6ecac1e201
--- /dev/null
+++ b/fun/aoc2019/solution-day2.el
@@ -0,0 +1,53 @@
+;; -*- lexical-binding: t; -*-
+;; Advent of Code 2019 - Day 2
+(require 'dash)
+(require 'ht)
+
+(defvar day2/input
+  [1 0 0 3 1 1 2 3 1 3 4 3 1 5 0 3 2 1 9 19 1 19 5 23 1 13 23 27 1 27 6 31
+     2 31 6 35 2 6 35 39 1 39 5 43 1 13 43 47 1 6 47 51 2 13 51 55 1 10 55
+     59 1 59 5 63 1 10 63 67 1 67 5 71 1 71 10 75 1 9 75 79 2 13 79 83 1 9
+     83 87 2 87 13 91 1 10 91 95 1 95 9 99 1 13 99 103 2 103 13 107 1 107 10
+     111 2 10 111 115 1 115 9 119 2 119 6 123 1 5 123 127 1 5 127 131 1 10
+     131 135 1 135 6 139 1 10 139 143 1 143 6 147 2 147 13 151 1 5 151 155 1
+     155 5 159 1 159 2 163 1 163 9 0 99 2 14 0 0])
+
+;; Puzzle 1
+
+(defun day2/single-op (f state idx)
+  (let* ((a (aref state (aref state (+ 1 idx))))
+         (b (aref state (aref state (+ 2 idx))))
+         (p (aref state (+ 3 idx)))
+         (result (funcall f a b)))
+    (aset state p (funcall f a b))))
+
+(defun day2/operate (state idx)
+  (pcase (aref state idx)
+    (99 (aref state 0))
+    (1 (day2/single-op #'+ state idx)
+       (day2/operate state (+ 4 idx)))
+    (2 (day2/single-op #'* state idx)
+       (day2/operate state (+ 4 idx)))
+    (other (error "Unknown opcode: %s" other))))
+
+(defun day2/program-with-inputs (noun verb)
+  (let* ((input (copy-tree day2/input t)))
+    (aset input 1 noun)
+    (aset input 2 verb)
+    (day2/operate input 0)))
+
+(message "Solution to day2/1: %s" (day2/program-with-inputs 12 2))
+
+;; Puzzle 2
+(let* ((used (ht))
+       (noun 0)
+       (verb 0)
+       (result (day2/program-with-inputs noun verb)))
+  (while (/= 19690720 result)
+    (setq noun (random 100))
+    (setq verb (random 100))
+    (unless (ht-get used (format "%d%d" noun verb))
+      (ht-set used (format "%d%d" noun verb) t)
+      (setq result (day2/program-with-inputs noun verb))))
+
+  (message "Solution to day2/2: %s%s" noun verb))
diff --git a/fun/aoc2019/solution-day3.el b/fun/aoc2019/solution-day3.el
new file mode 100644
index 0000000000..b7dfdd245f
--- /dev/null
+++ b/fun/aoc2019/solution-day3.el
@@ -0,0 +1,64 @@
+;; -*- lexical-binding: t; -*-
+;; Advent of Code 2019 - Day 3
+
+(require 'cl-lib)
+(require 'dash)
+(require 'ht)
+(require 's)
+
+(defvar day3/input/wire1
+  "R1010,D422,L354,U494,L686,U894,R212,U777,L216,U9,L374,U77,R947,U385,L170,U916,R492,D553,L992,D890,L531,U360,R128,U653,L362,U522,R817,U198,L126,D629,L569,U300,L241,U145,R889,D196,L450,D576,L319,D147,R985,U889,L941,U837,L608,D77,L864,U911,L270,D869,R771,U132,L249,U603,L36,D328,L597,U992,L733,D370,L947,D595,L308,U536,L145,U318,R55,D773,R175,D505,R483,D13,R780,U778,R445,D107,R490,U245,L587,U502,R446,U639,R150,U35,L455,D522,R866,U858,R394,D975,R513,D378,R58,D646,L374,D675,R209,U228,R530,U543,L480,U677,L912,D164,L573,U587,L784,D626,L994,U250,L215,U985,R684,D79,L877,U811,L766,U617,L665,D246,L408,U800,L360,D272,L436,U138,R240,U735,L681,U68,L608,D59,R532,D808,L104,U968,R887,U819,R346,U698,L317,U582,R516,U55,L303,U607,L457,U479,L510,D366,L583,U519,R878,D195,R970,D267,R842,U784,R9,D946,R833,D238,L232,D94,L860,D47,L346,U951,R491,D745,R849,U273,R263,U392,L341,D808,R696,U326,R886,D296,L865,U833,R241,U644,R729,D216,R661,D712,L466,D699,L738,U5,L556,D693,R912,D13,R48,U63,L877,U628,L689,D929,R74,U924,R612,U153,R417,U425,L879,D378,R79,D248,L3,U519,R366,U281,R439,D823,R149,D668,R326,D342,L213,D735,R504,U265,L718,D842,L565,U105,L214,U963,R518,D681,R642,U170,L111,U6,R697,U572,R18,U331,L618,D255,R534,D322,L399,U595,L246,U651,L836,U757,R417,D795,R291,U759,L568,U965,R828,D570,R350,U317,R338,D173,L74,D833,L650,D844,L70,U913,R594,U407,R674,D684,L481,D564,L128,D277,R851,D274,L435,D582,R469,U729,R387,D818,R443,U504,R414,U8,L842,U845,R275,U986,R53,U660,R661,D225,R614,U159,R477")
+
+(defvar day3/input/wire2
+  "L1010,D698,R442,U660,L719,U702,L456,D86,R938,D177,L835,D639,R166,D285,L694,U468,L569,D104,L234,D574,L669,U299,L124,D275,L179,D519,R617,U72,L985,D248,R257,D276,L759,D834,R490,U864,L406,U181,R911,U873,R261,D864,R260,U759,R648,U158,R308,D386,L835,D27,L745,U91,R840,U707,R275,U543,L663,U736,L617,D699,R924,U103,R225,U455,R708,U319,R569,U38,R315,D432,L179,D975,R519,D546,L295,U680,L685,U603,R262,D250,R7,U171,R261,U519,L832,U534,L471,U431,L474,U886,R10,D179,L79,D555,R452,U452,L832,U863,L367,U538,L237,D160,R441,U605,R942,U259,L811,D552,R646,D353,L225,D94,L35,D307,R752,U23,R698,U610,L379,D932,R698,D751,R178,D347,R325,D156,R471,D555,R558,D593,R773,U2,L955,U764,L735,U438,R364,D640,L757,U534,R919,U409,R361,U407,R336,D808,R877,D648,R610,U198,R340,U94,R795,D667,R811,U975,L965,D224,R565,D681,L64,U567,R621,U922,L665,U329,R242,U592,L727,D481,L339,U402,R213,D280,R656,U169,R976,D962,L294,D505,L251,D689,L497,U133,R230,D441,L90,D220,L896,D657,L500,U331,R502,U723,R762,D613,L447,D256,L226,U309,L935,U384,L740,D459,R309,D707,R952,D747,L304,D105,R977,D539,R941,D21,R291,U216,R132,D543,R515,U453,L854,D42,R982,U102,L469,D639,R559,D68,R302,U734,R980,D214,R107,D191,L730,D793,L63,U17,R807,U196,R412,D592,R330,D941,L87,D291,L44,D94,L272,D780,R968,U837,L712,D704,R163,U981,R537,U778,R220,D303,L196,D951,R163,D446,R11,D623,L72,D778,L158,U660,L189,D510,L247,D716,L89,U887,L115,U114,L36,U81,R927,U293,L265,U183,R331,D267,R745,D298,L561,D918,R299,U810,L322,U679,L739,D854,L581,U34,L862,D779,R23")
+
+;; Puzzle 1
+
+(defun wire-from (raw)
+  (-map (lambda (s)
+          (cons (substring s 0 1) (string-to-number (substring s 1))))
+        (s-split "," raw)))
+
+(defun day3/move (x y next)
+  (cl-flet ((steps (by op)
+                   (-map op (reverse (number-sequence 1 by)))))
+    (pcase next
+      (`("L" . ,by) (steps by (lambda (n) (cons (- x n) y))))
+      (`("R" . ,by) (steps by (lambda (n) (cons (+ x n) y))))
+      (`("U" . ,by) (steps by (lambda (n) (cons x (+ y n)))))
+      (`("D" . ,by) (steps by (lambda (n) (cons x (- y n))))))))
+
+(defun day3/wire-points (wire)
+  (let ((points (ht))
+        (point-list (-reduce-from
+                     (lambda (acc point)
+                       (-let* (((x . y) (car acc))
+                               (next (day3/move x y point)))
+                         (-concat next acc)))
+                     '((0 . 0)) wire)))
+    (-map (-lambda ((s . p)) (ht-set! points p s))
+          (-zip (reverse (number-sequence 0 (- (length point-list) 1))) point-list))
+    (ht-remove! points '(0 . 0))
+    points))
+
+(defun day3/closest-intersection (crossed-points)
+  (car (-sort #'<
+              (-map (-lambda ((x . y))
+                      (+ (abs x) (abs y)))
+                    crossed-points))))
+
+(defun day3/minimum-steps (wire1 wire2 crossed)
+  (car (-sort #'<
+              (-map (-lambda (p)
+                      (+ (ht-get wire1 p) (ht-get wire2 p)))
+                    crossed))))
+
+;; Example:
+(let* ((wire1-points (day3/wire-points (wire-from day3/input/wire1)))
+       (wire2-points (day3/wire-points (wire-from day3/input/wire2)))
+       (crossed-points (-filter (lambda (p) (ht-contains? wire1-points p))
+                                (ht-keys wire2-points))))
+  (message "Solution for day3/1: %d" (day3/closest-intersection crossed-points))
+  (message "Solution for day3/2: %d" (day3/minimum-steps wire1-points
+                                                         wire2-points
+                                                         crossed-points)))
diff --git a/fun/aoc2019/solution-day4.el b/fun/aoc2019/solution-day4.el
new file mode 100644
index 0000000000..2805f3f4e9
--- /dev/null
+++ b/fun/aoc2019/solution-day4.el
@@ -0,0 +1,73 @@
+;; -*- lexical-binding: t; -*-
+;; Advent of Code 2019 - Day 4
+
+(require 'cl-lib)
+(require 'dash)
+
+;; Puzzle 1
+
+(defun day4/to-digits (num)
+  "Convert NUM to a list of its digits."
+  (cl-labels ((steps (n digits)
+                     (if (= n 0) digits
+                       (steps (/ n 10) (cons (% n 10) digits)))))
+    (steps num '())))
+
+(defvar day4/input (-map #'day4/to-digits (number-sequence 128392 643281)))
+
+(defun day4/filter-password (digits)
+  "Determines whether the given rules match the supplied
+  number."
+
+  (and
+   ;; It is a six digit number
+   (= 6 (length digits))
+
+   ;; Value is within the range given in puzzle input
+   ;; (noop because the range is generated from the input)
+
+   ;; Two adjacent digits are the same (like 22 in 122345).
+   (car (-reduce-from (-lambda ((acc . prev) next)
+                        (cons (or acc (= prev next)) next))
+                      '(nil . 0) digits))
+
+   ;; Going from left to right, the digits never decrease; they only
+   ;; ever increase or stay the same (like 111123 or 135679).
+   (car (-reduce-from (-lambda ((acc . prev) next)
+                        (cons (and acc (>= next prev)) next))
+                      '(t . 0) digits))))
+
+;; Puzzle 2
+;;
+;; Additional criteria: If there's matching digits, they're not in a group.
+
+(cl-defstruct day4/acc state prev count)
+
+(defun day4/filter-longer-groups (digits)
+  (let ((res (-reduce-from
+              (lambda (acc next)
+                (cond ;; sequence is broken and count was at 1 ->
+                 ;; match!
+                 ((and (= (day4/acc-count acc) 2)
+                       (/= (day4/acc-prev acc) next))
+                  (setf (day4/acc-state acc) t))
+
+                 ;; sequence continues, counter increment!
+                 ((= (day4/acc-prev acc) next)
+                  (setf (day4/acc-count acc) (+ 1 (day4/acc-count acc))))
+
+                 ;; sequence broken, reset counter
+                 ((/= (day4/acc-prev acc) next)
+                  (setf (day4/acc-count acc) 1)))
+
+                (setf (day4/acc-prev acc) next)
+                acc)
+              (make-day4/acc :prev 0 :count 0) digits)))
+    (or (day4/acc-state res)
+        (= 2 (day4/acc-count res)))))
+
+(let* ((simple (-filter #'day4/filter-password day4/input))
+       (complex (-filter #'day4/filter-longer-groups simple)))
+  (message "Solution to day4/1: %d" (length simple))
+  (message "Solution to day4/2: %d" (length complex)))
+
diff --git a/fun/best-tools/README.md b/fun/best-tools/README.md
new file mode 100644
index 0000000000..e17052467a
--- /dev/null
+++ b/fun/best-tools/README.md
@@ -0,0 +1,156 @@
+tazjin's best tools
+===================
+
+In the spirit of various other "Which X do you use?"-pages I thought it would be
+fun to have a little document here that describes which tools I've found to work
+well for myself.
+
+When I say "tools" here, it's not about software - it's about real, physical
+tools!
+
+If something goes on this list that's because I think it's seriously a
+best-in-class type of product.
+
+<!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc-refresh-toc -->
+- [Media & Tech](#media--tech)
+    - [Keyboard](#keyboard)
+    - [Speakers](#speakers)
+    - [Headphones](#headphones)
+        - [Earphones](#earphones)
+    - [Phone](#phone)
+- [Other stuff](#other-stuff)
+    - [Toothbrush](#toothbrush)
+    - [Shavers](#shavers)
+    - [Shoulder bag](#shoulder-bag)
+    - [Wallet](#wallet)
+<!-- markdown-toc end -->
+
+---------
+
+# Media & Tech
+
+## Keyboard
+
+The best keyboard that money will buy you at the moment is the [Kinesis
+Advantage][advantage]. There's a variety of contoured & similarly shaped
+keyboards on the market, but the Kinesis is the only one I've tried that has
+properly implemented the keywell concept.
+
+I struggle with RSI issues and the Kinesis actually makes it possible for me to
+type for longer periods of time, which always leads to extra discomfort on
+laptop keyboards and such.
+
+Honestly, the Kinesis is probably the best piece of equipment on this entire
+list. I own several of them and there will probably be more in the future. They
+last forever and your wrists will thank you in the future, even if you do not
+suffer from RSI yet.
+
+[advantage]: https://kinesis-ergo.com/shop/advantage2/
+
+## Speakers
+
+The speakers that I've hooked up to my audio setup (including both record player
+& Chromecast / TV) are the [Teufel Motiv 2][motiv-2]. I've had these for over a
+decade and they're incredibly good, but unfortunately Teufel no longer makes
+them.
+
+It's possible to grab a pair on eBay occasionally, so keep an eye out if you're
+interested!
+
+[motiv-2]: https://www.teufelaudio.com/uk/pc/motiv-2-p167.html
+
+## Headphones
+
+I use the [Bose QC35][qc35] (note: link goes to a newer generation than the one
+I own) for their outstanding noise cancelling functionality and decent sound.
+
+When I first bought them I didn't expect them to end up on this list as the
+firmware had issues that made them only barely usable, but Bose has managed to
+iron these problems out over time.
+
+I avoid using Bluetooth when outside and fortunately the QC35 come with an
+optional cable that you can plug into any good old 3.5mm jack.
+
+[qc35]: https://www.bose.co.uk/en_gb/products/headphones/over_ear_headphones/quietcomfort-35-wireless-ii.html
+
+### Earphones
+
+Actually, to follow up on the above - most of the time I'm not using (over-ear)
+headphones, but (in-ear) earphones - specifically the (**wired!!!**) [Apple
+EarPods][earpods].
+
+Apple will probably stop selling these soon because they've gotten into the
+habit of cancelling all of their good products, so I have a stash of these
+around. You will usually find no fewer than 3-4 of them lying around in my
+flat.
+
+[earpods]: https://www.apple.com/uk/shop/product/MNHF2ZM/A/earpods-with-35mm-headphone-plug
+
+## Phone
+
+The best phone that's on the market at the moment is the [iPhone SE][se]. It's
+as far as I am aware the *only* phone that has a reasonable size (up to 4")
+*and* a 3.5mm headphone jack.
+
+These two are the make-it-or-break-it requirements for me. Despite iOS being an
+annoying system to use there is nothing better available at the moment.
+
+This is the only item on this list for which I am actively seeking a
+replacement, so if you have any tips about new phones that might fit these
+criteria that I've missed please let me know.
+
+[se]: https://en.wikipedia.org/wiki/IPhone_SE
+
+# Other stuff
+
+## Toothbrush
+
+The [Philips Sonicare][sonicare] (note: link goes to a newer generation than
+mine) is excellent and well worth its money.
+
+I've had it for a few years and whereas I occasionally had minor teeth issues
+before, they seem to be mostly gone now. According to my dentist the state of my
+teeth is now usually pretty good and I draw a direct correlation back to this
+thing.
+
+The newer generations come with flashy features like apps and probably more
+LEDs, but I suspect that those can just be ignored.
+
+[sonicare]: https://www.philips.co.uk/c-m-pe/electric-toothbrushes
+
+## Shavers
+
+The [Philipps SensoTouch 3D][sensotouch] is excellent. Super-comfortable close
+face shave in no time and leaves absolutely no mess around, as far as I can
+tell! I've had this for ~5 years and it's not showing any signs of aging yet.
+
+Another bonus is that its battery time is effectively infinite. I've never had
+to worry when bringing it on a longer trip!
+
+[sensotouch]: https://www.philips.co.uk/c-p/1250X_40/norelco-sensotouch-3d-wet-and-dry-electric-razor-with-precision-trimmer
+
+## Shoulder bag
+
+When I moved to London I wanted to stop using backpacks most of the time, as
+those are just annoying to deal with when commuting on the tube.
+
+To work around this I wanted a good shoulder bag with a vertical format (to save
+space), but it turned out that there's very few of those around that reach any
+kind of quality standard.
+
+The one I settled on is the [Waterfield Muzetto][muzetto] leather bag. It's one
+of those things that comes with a bit of a price tag attached, but it's well
+worth it!
+
+[muzetto]: https://www.sfbags.com/collections/shoulder-messenger-bags/products/muzetto-leather-bag
+
+## Wallet
+
+My wallet is the [Bellroy Slim Sleeve][slim-sleeve]. I don't carry cash unless
+I'm attending an event in Germany and this wallet fits that lifestyle perfectly.
+
+It's near indestructible, looks great, is very slim and fits a ton of cards,
+business cards, receipts and whatever else you want to be lugging around with
+you!
+
+[slim-sleeve]: https://bellroy.com/products/slim-sleeve-wallet/default/charcoal
diff --git a/fun/defer_rs/.gitignore b/fun/defer_rs/.gitignore
new file mode 100644
index 0000000000..6aa106405a
--- /dev/null
+++ b/fun/defer_rs/.gitignore
@@ -0,0 +1,3 @@
+/target/
+**/*.rs.bk
+Cargo.lock
diff --git a/fun/defer_rs/Cargo.toml b/fun/defer_rs/Cargo.toml
new file mode 100644
index 0000000000..0fcd60373f
--- /dev/null
+++ b/fun/defer_rs/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "defer"
+version = "0.1.0"
+authors = ["Vincent Ambo <tazjin@gmail.com>"]
+
+[dependencies]
diff --git a/fun/defer_rs/README.md b/fun/defer_rs/README.md
new file mode 100644
index 0000000000..160158d177
--- /dev/null
+++ b/fun/defer_rs/README.md
@@ -0,0 +1,53 @@
+defer in Rust
+=============
+
+After a Hacker News discussion about implementing Go's `defer` keyword in C++,
+I stumbled upon [this comment](https://news.ycombinator.com/item?id=15523589)
+and more specifically this response to it by "Occivink":
+
+> There's plenty of one-time cases where you don't want to declare an entire
+> class but still enjoy scope-based functions.
+
+Specificall the "don't want to declare an entire class" suggests that languages
+like C++ have high friction for explaining your desired invariant (cleanup is
+run when `$thing` is destroyed) to the compiler.
+
+It seems like most languages either hand-wave this away (*cough* Java *cough*)
+or use what seems like a workaround (`defer`).
+
+Rust has the so-called `Drop` trait, which is a typeclass that contains a single
+method with no return value that is run when a variable is dropped (i.e. goes out
+of scope).
+
+This works fine for most general cases - i.e. closing file handlers - but can
+get complicated if other use-cases of `defer` are considered:
+
+* returning an error-value by mutating a reference in the enclosing scope (oh boy)
+* deferring a decision about when/whether to run cleanup to the caller
+
+While thinking about how to do this with the `Drop` trait I realised that `defer`
+can actually be trivially implemented in Rust, using `Drop`.
+
+A simple implementation of `defer` can be seen in [defer.rs](examples/defer.rs),
+an implementation using shared mutable state for error returns is in the file
+[defer-with-error.rs](examples/defer-with-error.rs) and an implementation that
+allows cleanup to be *cancelled* (don't _actually_ do this, it leaks a pointer)
+is in [undefer.rs](examples/undefer.rs).
+
+Whether any of this is actually useful is not up to me to decide. I haven't
+actually had a real-life need for this.
+
+You can run the examples with `cargo run --example defer`, etc.
+
+## Notes
+
+* `Drop` is not guaranteed to run in case of panics or program aborts, if you
+  need support for that check out [scopeguard](https://github.com/bluss/scopeguard)
+* `undefer` could be implemented safely by, for example, carrying a boolean that
+  by default causes execution to happen but can be flipped to disable it
+
+## Further reading:
+
+* [The Pain Of Real Linear Types in Rust](https://gankro.github.io/blah/linear-rust/)
+* [Go's defer](https://tour.golang.org/flowcontrol/12)
+* [Rust's Drop](https://doc.rust-lang.org/std/ops/trait.Drop.html)
diff --git a/fun/defer_rs/examples/defer-with-error.rs b/fun/defer_rs/examples/defer-with-error.rs
new file mode 100644
index 0000000000..26d56d77cf
--- /dev/null
+++ b/fun/defer_rs/examples/defer-with-error.rs
@@ -0,0 +1,70 @@
+// Go's defer in Rust, with error value return.
+
+use std::rc::Rc;
+use std::sync::RwLock;
+
+struct Defer<F: Fn()> {
+    f: F
+}
+
+impl <F: Fn()> Drop for Defer<F> {
+    fn drop(&mut self) {
+        (self.f)()
+    }
+}
+
+// Only added this for Go-syntax familiarity ;-)
+fn  defer<F: Fn()>(f: F) -> Defer<F> {
+    Defer { f }
+}
+
+// Convenience type synonym. This is a reference-counted smart pointer to
+// a shareable, mutable variable.
+// Rust does not allow willy-nilly mutation of shared variables, so explicit
+// write-locking must be performed.
+type ErrorHandle<T> = Rc<RwLock<Option<T>>>;
+
+///////////////////
+// Usage example //
+///////////////////
+
+#[derive(Debug)] // Debug trait for some default way to print the type.
+enum Error { DropError }
+
+fn main() {
+    // Create a place to store the error.
+    let drop_err: ErrorHandle<Error> = Default::default(); // create empty error
+
+    // Introduce an arbitrary scope block (so that we still have control after
+    // the defer runs):
+    {
+        let mut i = 1;
+
+        // Rc types are safe to clone and share for multiple ownership.
+        let err_handle = drop_err.clone();
+
+        // Call defer and let the closure own the cloned handle to the error:
+        let token = defer(move || {
+            // do something!
+            println!("Value is: {}", i);
+
+            // ... oh no, it went wrong!
+            *err_handle.write().unwrap() = Some(Error::DropError);
+        });
+
+        i += 1;
+        println!("Value is: {}", i);
+
+        // token goes out of scope here - drop() is called.
+    }
+
+    match *drop_err.read().unwrap() {
+        Some(ref err) => println!("Oh no, an error occured: {:?}!", err),
+        None => println!("Phew, everything went well.")
+    };
+}
+
+// Prints:
+// Value is: 2
+// Value is: 1
+// Oh no, an error occured: DropError!
diff --git a/fun/defer_rs/examples/defer.rs b/fun/defer_rs/examples/defer.rs
new file mode 100644
index 0000000000..eadac795f8
--- /dev/null
+++ b/fun/defer_rs/examples/defer.rs
@@ -0,0 +1,31 @@
+// Go's defer in Rust!
+
+struct Defer<F: Fn()> {
+    f: F
+}
+
+impl <F: Fn()> Drop for Defer<F> {
+    fn drop(&mut self) {
+        (self.f)()
+    }
+}
+
+// Only added this for Go-syntax familiarity ;-)
+fn  defer<F: Fn()>(f: F) -> Defer<F> {
+    Defer { f }
+}
+
+fn main() {
+    let mut i = 1;
+
+    // Calling it "token" ... could be something else. The lifetime of this
+    // controls when the action is run.
+    let _token = defer(move || println!("Value is: {}", i));
+
+    i += 1;
+    println!("Value is: {}", i);
+}
+
+// Prints:
+// Value is: 2
+// Value is: 1
diff --git a/fun/defer_rs/examples/undefer.rs b/fun/defer_rs/examples/undefer.rs
new file mode 100644
index 0000000000..17ad8a6b54
--- /dev/null
+++ b/fun/defer_rs/examples/undefer.rs
@@ -0,0 +1,40 @@
+// Go's defer in Rust, with a little twist!
+
+struct Defer<F: Fn()> {
+    f: F
+}
+
+impl <F: Fn()> Drop for Defer<F> {
+    fn drop(&mut self) {
+        (self.f)()
+    }
+}
+
+// Only added this for Go-syntax familiarity ;-)
+fn defer<F: Fn()>(f: F) -> Defer<F> {
+    Defer { f }
+}
+
+// Changed your mind about the defer?
+// (Note: This leaks the closure! Don't actually do this!)
+fn undefer<F: Fn()>(token: Defer<F>) {
+    use std::mem;
+    mem::forget(token);
+}
+
+fn main() {
+    let mut i = 1;
+
+    // Calling it "token" ... could be something else. The lifetime of this
+    // controls when the action is run.
+    let token = defer(move || println!("Value is: {}", i));
+
+    i += 1;
+    println!("Value is: {}", i);
+
+    // Oh, now I changed my mind about the previous defer:
+    undefer(token);
+}
+
+// Prints:
+// Value is: 2
diff --git a/fun/elblog/.gitignore b/fun/elblog/.gitignore
new file mode 100644
index 0000000000..c531d9867f
--- /dev/null
+++ b/fun/elblog/.gitignore
@@ -0,0 +1 @@
+*.elc
diff --git a/fun/elblog/README.md b/fun/elblog/README.md
new file mode 100644
index 0000000000..994b1138ef
--- /dev/null
+++ b/fun/elblog/README.md
@@ -0,0 +1,11 @@
+elblog
+======
+
+This is a simple blogging software written in Emacs Lisp.
+
+The idea is that it should be able to do most of the things [my actual blog][]
+does at the moment.
+
+No documentation exists for now besides the commit messages, but it works!
+
+[my actual blog]: https://www.tazj.in/
diff --git a/fun/elblog/blog.css b/fun/elblog/blog.css
new file mode 100644
index 0000000000..0d021f78e8
--- /dev/null
+++ b/fun/elblog/blog.css
@@ -0,0 +1,37 @@
+<style type="text/css">
+body {
+    margin: 40px auto;
+    max-width: 800px;
+    line-height: 1.6;
+    font-size: 18px;
+    color: #383838;
+    padding: 0 10px
+}
+h1, h2, h3 {
+    line-height: 1.2
+}
+.footer {
+    text-align: right;
+}
+.lod {
+    text-align: center;
+}
+.unstyled-link {
+    color: inherit;
+    text-decoration: none;
+}
+.uncoloured-link {
+    color: inherit;
+}
+.date {
+    text-align: right;
+    font-style: italic;
+    float: right;
+}
+.inline {
+    display: inline;
+}
+.navigation {
+    text-align: center;
+}
+</style>
diff --git a/fun/elblog/blog.el b/fun/elblog/blog.el
new file mode 100644
index 0000000000..102aa37914
--- /dev/null
+++ b/fun/elblog/blog.el
@@ -0,0 +1,123 @@
+;;; blog.el --- A simple org-mode & elnode blog software.
+;;; -*- lexical-binding: t; -*-
+
+(require 'dash)
+(require 'elnode)
+(require 'f)
+(require 'ht)
+
+;; Definition of customization options
+
+(defgroup elblog nil
+  "Configuration for the Emacs Lisp blog software"
+  :link '(url-link "https://github.com/tazjin/elblog"))
+
+(defcustom elblog-port 8010
+  "Port to run elblog's HTTP server on"
+  :group 'elblog
+  :type 'integer)
+
+(defcustom elblog-host "localhost"
+  "Host for elblog's HTTP server to listen on"
+  :group 'elblog
+  :type 'string)
+
+(defcustom elblog-title "Elblog"
+  "Title text for this elblog instance"
+  :group 'elblog
+  :type 'string)
+
+(defcustom elblog-article-directory nil
+  "Directory in which elblog articles are stored"
+  :group 'elblog
+  :type 'string)
+
+(defcustom elblog-additional-routes '()
+  "Additional Elnode routes to register in the Elblog instance"
+  :group 'elblog
+  :type '(alist :key-type regexp :value-type function))
+
+;; Declare user-configurable variables needed at runtime.
+
+(defvar elblog-articles (ht-create)
+  "A hash-table of blog articles. This is used for looking up articles from
+   URL fragments as well as for rendering the index.")
+
+;; HTML templating setup
+
+(defun template-preamble ()
+  "Templates the preamble snippet with the correct blog title."
+  (format (f-read-text "preamble.html") elblog-title))
+
+(defun configure-org-html-export ()
+  "Configure org-mode settings for elblog's HTML templating to work correctly."
+  (setq org-html-postamble t)
+  (setq org-html-doctype "html5")
+  (setq org-html-head-include-scripts nil)
+  (setq org-html-style-default (f-read-text "blog.css"))
+  (setq org-html-preamble-format `(("en" ,(template-preamble))))
+  (setq org-html-postamble-format `(("en" ,(f-read-text "postamble.html")))))
+
+;; Article fetching & rendering functions
+
+(defun render-org-buffer (input-buffer &optional force)
+  "Renders an org-mode buffer as HTML and returns the name of the output buffer."
+  (letrec ((output-buffer (concat (buffer-name input-buffer) "-rendered"))
+           ;; Don't re-render articles unless forced.
+           (must-render (or force
+                            (not (get-buffer output-buffer)))))
+    (if (and input-buffer must-render)
+        (with-current-buffer input-buffer
+          (org-export-to-buffer 'html output-buffer nil nil t)))
+    (if input-buffer output-buffer nil)))
+
+(defun get-buffer-string (buffer)
+  "Returns the contents of the specified buffer as a string."
+  (with-current-buffer (get-buffer buffer)
+    (buffer-string)))
+
+(defvar-local article-not-found
+  '(404 . "<html><body><p>Oh no, the article was not found.</p></body></html>"))
+
+(defvar-local text-html '("Content-Type" . "text/html"))
+
+(defun render-article (article)
+  "Renders an article, if it exists."
+  (letrec ((rendered (-some->>
+                      (ht-get elblog-articles article)
+                      (concat elblog-article-directory)
+                      (find-file)
+                      (render-org-buffer))))
+    (if rendered `(200 . ,(get-buffer-string rendered))
+      article-not-found)))
+
+(defun blog-post-handler (httpcon)
+  "This handler servers a blog post from the configured blog post directory."
+  (let ((response (render-article (elnode-http-mapping httpcon 1))))
+    (elnode-http-start httpcon  (car response) text-html)
+    (elnode-http-return httpcon (cdr response))))
+
+;; Web server implementation
+
+(defvar elblog-routes
+  '(("^.*//\\(.*\\)" . blog-post-handler))
+  "The default routes available in elblog. They can be extended by the user
+by setting the elblog-additional-routes customize option.")
+
+(defun elblog-handler (httpcon)
+  (elnode-hostpath-dispatcher
+   httpcon
+   (-concat elblog-additional-routes elblog-routes)))
+
+(defun start-elblog ()
+  (interactive)
+  (configure-org-html-export)
+  (elnode-start 'elblog-handler
+              :port elblog-port
+              :host elblog-host))
+
+(defun stop-elblog ()
+  (interactive)
+  (elnode-stop elblog-port))
+
+(provide 'elblog)
diff --git a/fun/elblog/postamble.html b/fun/elblog/postamble.html
new file mode 100644
index 0000000000..16a26218a0
--- /dev/null
+++ b/fun/elblog/postamble.html
@@ -0,0 +1,9 @@
+<hr>
+<footer><p class="footer">Served with <a class="uncoloured-link" href="https://github.com/tazjin/elblog">Emacs</a>.</p>
+  <p class="footer">
+    <a class="uncoloured-link" href="https://twitter.com/tazjin">Twitter</a>
+    |
+    <a class="uncoloured-link" href="mailto:blog@tazj.in">Mail</a>
+  </p>
+  <p class="lod">ಠ_ಠ</p>
+</footer>
diff --git a/fun/elblog/preamble.html b/fun/elblog/preamble.html
new file mode 100644
index 0000000000..be74b9207e
--- /dev/null
+++ b/fun/elblog/preamble.html
@@ -0,0 +1,6 @@
+<header>
+  <h1>
+    <a class="unstyled-link" href="/">%s</a>
+  </h1>
+  <hr>
+</header>
diff --git a/fun/gemma/CODE_OF_CONDUCT.md b/fun/gemma/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000000..c4013ac13e
--- /dev/null
+++ b/fun/gemma/CODE_OF_CONDUCT.md
@@ -0,0 +1,20 @@
+A SERMON ON ETHICS AND LOVE
+===========================
+
+One day Mal-2 asked the messenger spirit Saint Gulik to approach the Goddess and request Her presence for some desperate advice. Shortly afterwards the radio came on by itself, and an ethereal female Voice said **YES?**
+
+"O! Eris! Blessed Mother of Man! Queen of Chaos! Daughter of Discord! Concubine of Confusion! O! Exquisite Lady, I beseech You to lift a heavy burden from my heart!"
+
+**WHAT BOTHERS YOU, MAL? YOU DON'T SOUND WELL.**
+
+"I am filled with fear and tormented with terrible visions of pain. Everywhere people are hurting one another, the planet is rampant with injustices, whole societies plunder groups of their own people, mothers imprison sons, children perish while brothers war. O, woe."
+
+**WHAT IS THE MATTER WITH THAT, IF IT IS WHAT YOU WANT TO DO?**
+
+"But nobody Wants it! Everybody hates it."
+
+**OH. WELL, THEN *STOP*.**
+
+At which moment She turned herself into an aspirin commercial and left The Polyfather stranded alone with his species.
+
+SINISTER DEXTER HAS A BROKEN SPIROMETER.
diff --git a/fun/gemma/LICENSE b/fun/gemma/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/fun/gemma/LICENSE
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/fun/gemma/README.markdown b/fun/gemma/README.markdown
new file mode 100644
index 0000000000..064742c009
--- /dev/null
+++ b/fun/gemma/README.markdown
@@ -0,0 +1,96 @@
+# Gemma
+
+Gemma is a simple application to track *recurring* tasks, named after Gemma
+Hartley who [wrote an article][] about task distribution issues in households.
+
+## Background
+
+(Skip this if you just want the technical bits)
+
+Gemma's article launched a discussion in my friend circle about what causes an
+uneven distribution of household workload. I theorised that this is not so much
+a gender issue, but mostly a discoverability issue.
+
+Usually one person in a household is aware of what needs to be done, but in many
+cases the "overhead" of delegating the tasks would actually take more time than
+simply doing the task.
+
+I theorise further that the person (or people) who do a smaller share of the
+household work would often do the work if they had a convenient way to become
+aware of what needs to be done. Many times the "household manager" has the
+function of tracking non-obvious tasks like when bedsheets were last changed -
+shouldn't it be possible to actually distribute this information somehow?
+
+## The Project
+
+This project is an initial attempt at sketching out a little application that
+aids with reminding users of recurring tasks. Some basic ideas:
+
+* The system should be blame-free.
+* There should be as little usage overhead as possible so that people actually
+  do use it.
+* It should work mostly passively without much user interaction.
+
+I believe that the basic (*very* simple) idea behind Gemma solves these issues.
+Unfortunately my living situation changed before I actually got to test this out
+in a real-life situation involving multiple people, but feedback from other
+potential test subjects would be welcome! :)
+
+## Overview
+
+Gemma is a Common Lisp application in which a list of recurring tasks is
+declared, together with the *maximum interval* at which they should be completed
+(in days). Example:
+
+```lisp
+;; Bathroom tasks
+(deftask bathroom/wipe-mirror 7)
+(deftask bathroom/wipe-counter 7)
+
+;; Bedroom tasks
+(deftask bedroom/change-sheets 7)
+(deftask bedroom/vacuum 10)
+
+;; Kitchen tasks
+(deftask kitchen/trash 3)
+(deftask kitchen/wipe-counters 3)
+(deftask kitchen/vacuum 5 "Kitchen has more crumbs and such!")
+
+;; Entire place
+(deftask clean-windows 60)
+```
+
+These tasks are marked with their last completion time and tracked by Gemma. A
+simple Elm-based frontend application displays the tasks sorted by their
+"urgency" and features a button to mark a task as completed:
+
+![Gemma screenshot](http://i.imgur.com/n7FFMJH.png)
+
+Marking a task as completed resets its counter and moves it to the bottom of the
+task list.
+
+In theory this *should be it*, the frontend is made available to household
+members in some easily accessible place (e.g. an old phone glued to the fridge!)
+and people should attempt to develop a habit of checking what needs to be done
+occasionally.
+
+The "household manager" still exists as a role of the household because someone
+is entering the tasks into the application, but if my theory about people not
+actually being actively *unwilling* to do tasks is correct this could help a
+lot.
+
+## Usage
+
+(*Note*: Gemma is alpha software so the below is clearly not the final goal)
+
+Right now using this is non-trivial, but I'll eventually make a better
+distribution. Basically you need to know Common Lisp (in which case you'll know
+how to get the backend running) and have `elm-reactor` installed to run the
+development version of the frontend application.
+
+Gemma is configured via a configuration file that should be located either at
+`/etc/gemma/config.lisp` or at a custom location specified via the environment
+variable `GEMMA_CONFIG`. Have a look at the `config.lisp` file in the repository
+root for an example.
+
+[wrote an article]: http://www.harpersbazaar.com/culture/features/a12063822/emotional-labor-gender-equality/
diff --git a/fun/gemma/build.lisp b/fun/gemma/build.lisp
new file mode 100644
index 0000000000..e935ce25fd
--- /dev/null
+++ b/fun/gemma/build.lisp
@@ -0,0 +1,5 @@
+(require :asdf)
+(require :sb-posix)
+
+(push (format nil "~A/" (sb-posix:getcwd)) asdf:*central-registry*)
+(asdf:operate 'asdf:program-op :gemma)
diff --git a/fun/gemma/config.lisp b/fun/gemma/config.lisp
new file mode 100644
index 0000000000..54f8e5f344
--- /dev/null
+++ b/fun/gemma/config.lisp
@@ -0,0 +1,21 @@
+;; Example configuration file for Gemma
+
+(config :port 4242
+        :data-dir "/tmp/gemma/")
+
+(deftask bathroom/wipe-mirror 7)
+(deftask bathroom/wipe-counter 7)
+
+;; Bedroom tasks
+(deftask bedroom/change-sheets 7)
+(deftask bedroom/vacuum 10)
+
+;; Kitchen tasks
+(deftask kitchen/normal-trash 3)
+(deftask kitchen/green-trash 5)
+(deftask kitchen/blue-trash 5)
+(deftask kitchen/wipe-counters 3)
+(deftask kitchen/vacuum 5 "Kitchen has more crumbs and such!")
+
+;; Entire place
+(deftask clean-windows 60)
diff --git a/fun/gemma/default.nix b/fun/gemma/default.nix
new file mode 100644
index 0000000000..f48af48921
--- /dev/null
+++ b/fun/gemma/default.nix
@@ -0,0 +1,61 @@
+{ pkgs, ... }:
+
+let
+  inherit (pkgs) elmPackages lispPackages;
+  inherit (pkgs.third_party) stdenv sbcl makeWrapper openssl;
+
+  frontend = stdenv.mkDerivation {
+    name = "gemma-frontend";
+    src = ./frontend;
+    buildInputs = [ elmPackages.elm ];
+
+    phases = [ "unpackPhase" "buildPhase" ];
+    buildPhase = ''
+      mkdir .home && export HOME="$PWD/.home"
+      mkdir -p $out
+      elm-make --yes Main.elm --output $out/index.html
+    '';
+  };
+in stdenv.mkDerivation rec {
+  name = "gemma";
+  src = ./.;
+
+  nativeBuildInputs = with lispPackages; [
+    sbcl
+    hunchentoot
+    cl-json
+    cffi
+    cl-prevalence
+    local-time
+    makeWrapper
+  ];
+
+  buildPhase = ''
+    mkdir -p $out/share/gemma $out/bin
+
+    # Build Lisp using the Nix-provided wrapper which sets the load
+    # paths correctly.
+    cd $src
+    env GEMMA_BIN_TARGET=$out/bin/gemma common-lisp.sh --load build.lisp
+
+    # Wrap gemma to find OpenSSL at runtime:
+    wrapProgram $out/bin/gemma --prefix LD_LIBRARY_PATH : "${openssl.out}/lib"
+
+    # and finally copy the frontend to the appropriate spot
+    cp ${frontend}/index.html $out/share/gemma/index.html
+  '';
+
+  installPhase = "true";
+
+  # Stripping an SBCL executable removes the application, which is unfortunate.
+  dontStrip = true;
+
+  meta = with stdenv.lib; {
+    description = "Tool for tracking recurring tasks";
+    homepage    = "https://github.com/tazjin/gemma";
+    license     = licenses.gpl3;
+
+    # Lisp builds are broken for some reason (2019-09-22)
+    broken = true;
+  };
+}
diff --git a/fun/gemma/frontend/Main.elm b/fun/gemma/frontend/Main.elm
new file mode 100644
index 0000000000..e449908e49
--- /dev/null
+++ b/fun/gemma/frontend/Main.elm
@@ -0,0 +1,221 @@
+-- Copyright (C) 2016-2017  Vincent Ambo <mail@tazj.in>
+--
+-- This file is part of Gemma.
+--
+-- Gemma is free software: you can redistribute it and/or modify it
+-- under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+
+
+module Main exposing (..)
+
+import Html exposing (Html, text, div, span)
+import Html.Attributes exposing (style)
+import Json.Decode exposing (..)
+import Http
+import Time
+
+
+--  Material design imports
+
+import Material
+import Material.Card as Card
+import Material.Color as Color
+import Material.Grid exposing (grid, cell, size, Device(..))
+import Material.Layout as Layout
+import Material.Scheme as Scheme
+import Material.Options as Options
+import Material.Elevation as Elevation
+import Material.Button as Button
+
+
+-- API interface to Gemma
+
+
+type alias Task =
+    { name : String
+    , description : Maybe String
+    , remaining : Int
+    }
+
+
+emptyStringFilter s =
+    if s == "" then
+        Nothing
+    else
+        Just s
+
+
+decodeEmptyString : Decoder (Maybe String)
+decodeEmptyString =
+    map emptyStringFilter string
+
+
+decodeTask : Decoder Task
+decodeTask =
+    map3 Task
+        (field "name" string)
+        (field "description" decodeEmptyString)
+        (field "remaining" int)
+
+
+loadTasks : Cmd Msg
+loadTasks =
+    let
+        request =
+            Http.get "/tasks" (list decodeTask)
+    in
+        Http.send NewTasks request
+
+
+completeTask : Task -> Cmd Msg
+completeTask task =
+    let
+        request =
+            Http.getString
+                (String.concat
+                    [ "/complete?task="
+                    , task.name
+                    ]
+                )
+    in
+        Http.send (\_ -> LoadTasks) request
+
+
+
+-- Elm architecture implementation
+
+
+type Msg
+    = None
+    | LoadTasks
+    | NewTasks (Result Http.Error (List Task))
+    | Mdl (Material.Msg Msg)
+    | Complete Task
+
+
+type alias Model =
+    { tasks : List Task
+    , error : Maybe String
+    , mdl : Material.Model
+    }
+
+
+update : Msg -> Model -> ( Model, Cmd Msg )
+update msg model =
+    case msg of
+        LoadTasks ->
+            ( model, loadTasks )
+
+        Complete task ->
+            ( model, completeTask task )
+
+        NewTasks (Ok tasks) ->
+            ( { model | tasks = tasks, error = Nothing }, Cmd.none )
+
+        NewTasks (Err err) ->
+            ( { model | error = Just (toString err) }, Cmd.none )
+
+        _ ->
+            ( model, Cmd.none )
+
+
+
+-- View implementation
+
+
+white =
+    Color.text Color.white
+
+
+taskColor : Task -> Color.Hue
+taskColor task =
+    if task.remaining > 2 then
+        Color.Green
+    else if task.remaining < 0 then
+        Color.Red
+    else
+        Color.Yellow
+
+
+within : Task -> String
+within task =
+    if task.remaining < 0 then
+        "This task is overdue!"
+    else if task.remaining > 2 then
+        String.concat
+            [ "Relax, this task has "
+            , toString task.remaining
+            , " days left before it is due."
+            ]
+    else
+        String.concat
+            [ "This task should be completed within "
+            , toString task.remaining
+            , " days. Consider doing it now!"
+            ]
+
+
+renderTask : Model -> Task -> Html Msg
+renderTask model task =
+    Card.view
+        [ Color.background (Color.color (taskColor task) Color.S800)
+        , Elevation.e3
+        ]
+        [ Card.title [] [ Card.head [ white ] [ text task.name ] ]
+        , Card.text [ white ]
+            [ text (Maybe.withDefault "" task.description)
+            , Html.br [] []
+            , text (within task)
+            ]
+        , Card.actions
+            [ Card.border ]
+            [ Button.render Mdl
+                [ 0 ]
+                model.mdl
+                [ white, Button.ripple, Button.accent, Options.onClick (Complete task) ]
+                [ text "Completed" ]
+            ]
+        ]
+
+
+gemmaView : Model -> Html Msg
+gemmaView model =
+    grid []
+        (List.map (\t -> cell [ size All 4 ] [ renderTask model t ])
+            model.tasks
+        )
+
+
+view : Model -> Html Msg
+view model =
+    gemmaView model |> Scheme.top
+
+
+
+-- subscriptions : Model -> Sub Msg
+
+
+subscriptions model =
+    Sub.batch
+        [ Material.subscriptions Mdl model
+        , Time.every (15 * Time.second) (\_ -> LoadTasks)
+        ]
+
+
+main : Program Never Model Msg
+main =
+    let
+        model =
+            { tasks = []
+            , error = Nothing
+            , mdl = Material.model
+            }
+    in
+        Html.program
+            { init = ( model, Cmd.batch [ loadTasks, Material.init Mdl ] )
+            , view = view
+            , update = update
+            , subscriptions = subscriptions
+            }
diff --git a/fun/gemma/frontend/elm-package.json b/fun/gemma/frontend/elm-package.json
new file mode 100644
index 0000000000..2ae541ae0b
--- /dev/null
+++ b/fun/gemma/frontend/elm-package.json
@@ -0,0 +1,17 @@
+{
+    "version": "1.0.0",
+    "summary": "helpful summary of your project, less than 80 characters",
+    "repository": "https://github.com/user/project.git",
+    "license": "BSD3",
+    "source-directories": [
+        "."
+    ],
+    "exposed-modules": [],
+    "dependencies": {
+        "elm-lang/core": "5.1.1 <= v < 6.0.0",
+        "elm-lang/html": "2.0.0 <= v < 3.0.0",
+        "elm-lang/http": "1.0.0 <= v < 2.0.0",
+        "debois/elm-mdl": "8.1.0 <= v < 9.0.0"
+    },
+    "elm-version": "0.18.0 <= v < 0.19.0"
+}
diff --git a/fun/gemma/gemma.asd b/fun/gemma/gemma.asd
new file mode 100644
index 0000000000..0aea9c95ff
--- /dev/null
+++ b/fun/gemma/gemma.asd
@@ -0,0 +1,33 @@
+#|
+  This file is part of Gemma.
+
+  Gemma is free software: you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  Copyright (c) 2017 Vincent Ambo
+|#
+
+(require 'sb-posix)
+
+(defsystem "gemma"
+  :version "0.1.0"
+  :author "Vincent Ambo"
+  :license "GPLv3"
+  :depends-on (local-time
+               hunchentoot
+               cl-json
+               cl-prevalence)
+  :components ((:module "src"
+                :components
+                ((:file "gemma"))))
+  :build-operation program-op
+  :build-pathname #.(or (pathname  (sb-posix:getenv "GEMMA_BIN_TARGET"))
+                        "gemma")
+  :entry-point "gemma::entrypoint"
+  :description "Gemma is a household task management system"
+  :long-description
+  #.(read-file-string
+     (subpathname *load-pathname* "README.markdown"))
+  :in-order-to ((test-op (test-op "gemma-test"))))
diff --git a/fun/gemma/src/gemma.lisp b/fun/gemma/src/gemma.lisp
new file mode 100644
index 0000000000..b8a20addd9
--- /dev/null
+++ b/fun/gemma/src/gemma.lisp
@@ -0,0 +1,192 @@
+;; Copyright (C) 2016-2017  Vincent Ambo <mail@tazj.in>
+;;
+;; This file is part of Gemma.
+;;
+;; Gemma is free software: you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+(defpackage gemma
+  (:use :cl
+        :local-time
+        :cl-json)
+  (:import-from :sb-posix :getenv)
+  (:shadowing-import-from :sb-posix :getcwd)
+  (:export :start-gemma :config :entrypoint))
+(in-package :gemma)
+
+;; TODO: Store an average of how many days it was between task
+;; completions. Some of the current numbers are just guesses
+;; anyways.
+
+(defmacro in-case-of (x &body body)
+  "Evaluate BODY if X is non-nil, binding the value of X to IT."
+  `(let ((it ,x))
+     (when it ,@body)))
+
+;; Set default configuration parameters
+(defvar *gemma-port* 4242
+  "Port on which the Gemma web server listens.")
+
+(defvar *static-file-location*
+  (or (in-case-of (sb-posix:getenv "out")
+        (concatenate 'string it "/share/gemma/"))
+      "frontend/")
+  "Folder from which to serve static assets. If built inside of Nix,
+  the folder is concatenated with the output path at which the files
+  are expected to be.")
+
+(defun initialise-persistence (data-dir)
+  (defvar *p-tasks*
+    (cl-prevalence:make-prevalence-system data-dir)
+    "All tasks registered in this Gemma instance.")
+
+  ;; Initialise database ID counter
+  (or (> (length (cl-prevalence:find-all-objects *p-tasks* 'task)) 0)
+      (cl-prevalence:tx-create-id-counter *p-tasks*)))
+
+(defun config (&key port data-dir)
+  "Configuration function for use in the Gemma configuration file."
+
+  (in-package :gemma)
+  (in-case-of port (defparameter *gemma-port* it))
+  (initialise-persistence (or data-dir "data/")))
+
+;;
+;; Define task management system
+;;
+
+(defclass task ()
+  ((id :reader id
+       :initarg :id)
+
+   ;; (Unique) name of the task
+   (name :type symbol
+         :initarg :name
+         :accessor name-of)
+
+   ;; Maximum completion interval
+   (days :type integer
+         :initarg :days
+         :accessor days-of)
+
+   ;; Optional description
+   (description :type string
+                :initarg :description
+                :accessor description-of)
+
+   ;; Last completion time
+   (done-at :type timestamp
+            :initarg :done-at
+            :accessor last-done-at)))
+
+(defmacro deftask (task-name days &optional description)
+  (unless (get-task task-name)
+    `(progn (cl-prevalence:tx-create-object
+             *p-tasks*
+             'task
+             (quote ((name ,task-name)
+                     (days ,days)
+                     (description ,(or description ""))
+                     (done-at ,(now)))))
+            (cl-prevalence:snapshot *p-tasks*))))
+
+(defun get-task (name)
+  (cl-prevalence:find-object-with-slot *p-tasks* 'task 'name name))
+
+(defun list-tasks ()
+  (cl-prevalence:find-all-objects *p-tasks* 'task))
+
+(defun days-remaining (task)
+  "Returns the number of days remaining before the supplied TASK reaches its
+maximum interval."
+  (let* ((expires-at (timestamp+ (last-done-at task)
+                                 (days-of task) :day))
+         (secs-until-expiry (timestamp-difference expires-at (now))))
+    (round (/ secs-until-expiry 60 60 24))))
+
+(defun sort-tasks (tasks)
+  "Sorts TASKS in descending order by number of days remaining."
+  (sort (copy-list tasks)
+        (lambda (t1 t2) (< (days-remaining t1)
+                           (days-remaining t2)))))
+
+(defun complete-task (name &optional at)
+  "Mark the task with NAME as completed, either now or AT specified time."
+  (cl-prevalence:tx-change-object-slots *p-tasks* 'task
+                                        (id (get-task name))
+                                        `((done-at ,(or at (now)))))
+  (cl-prevalence:snapshot *p-tasks*))
+
+;;
+;; Define web API
+;;
+
+(defun response-for (task)
+  "Create a response object to be JSON encoded for TASK."
+  `((:name . ,(name-of task))
+    (:description . ,(description-of task))
+    (:remaining . ,(days-remaining task))))
+
+(defun start-gemma ()
+  (in-package :gemma)
+
+  ;; Load configuration
+  (load (pathname (or (getenv "GEMMA_CONFIG")
+                      "/etc/gemma/config.lisp")))
+
+  ;; Set up web server
+  (hunchentoot:start
+   (make-instance 'hunchentoot:easy-acceptor
+                  :port *gemma-port*
+                  :document-root *static-file-location*))
+
+  ;; Task listing handler
+  (hunchentoot:define-easy-handler
+   (get-tasks :uri "/tasks") ()
+
+   (setf (hunchentoot:content-type*) "application/json")
+   (setf (hunchentoot:header-out "Access-Control-Allow-Origin") "*")
+   (encode-json-to-string
+    ;; Construct a frontend-friendly representation of the tasks.
+    (mapcar #'response-for (sort-tasks (list-tasks)))))
+
+  ;; Task completion handler
+  (hunchentoot:define-easy-handler
+   (complete-task-handler :uri "/complete") (task)
+   (setf (hunchentoot:content-type*) "application/json")
+   (let* ((key (find-symbol (camel-case-to-lisp task) "GEMMA")))
+     (format t "Marking task ~A as completed" key)
+     (complete-task key)
+     (encode-json-to-string (response-for (get-task key))))))
+
+(defun entrypoint ()
+  "This function serves as the entrypoint for ASDF-built executables.
+  It joins the Hunchentoot server thread to keep the process running
+  for as long as the server is alive."
+
+  (start-gemma)
+  (sb-thread:join-thread
+   (find-if (lambda (th)
+              (string= (sb-thread:thread-name th)
+                       (format nil "hunchentoot-listener-*:~A" *gemma-port*)))
+            (sb-thread:list-all-threads))))
+
+;; Experimentation / testing stuff
+
+(defun randomise-completion-times ()
+  "Set some random completion timestamps for all tasks"
+  (mapcar
+   (lambda (task)
+     (complete-task (name-of task)
+                    (timestamp- (now)
+                                (random 14)
+                                :day)))
+   (cl-prevalence:find-all-objects *p-tasks* 'task)))
+
+(defun clear-all-tasks ()
+  (mapcar (lambda (task) (cl-prevalence:tx-delete-object *p-tasks* 'task (id task)))
+          (cl-prevalence:find-all-objects *p-tasks* 'task)))
+
+;; (randomise-completion-times)
diff --git a/fun/logo/depot-logo.png b/fun/logo/depot-logo.png
new file mode 100644
index 0000000000..5d4d0b5c04
--- /dev/null
+++ b/fun/logo/depot-logo.png
Binary files differdiff --git a/fun/logo/depot-logo.xcf b/fun/logo/depot-logo.xcf
new file mode 100644
index 0000000000..3bf6a67131
--- /dev/null
+++ b/fun/logo/depot-logo.xcf
Binary files differdiff --git a/fun/quinistry/.gitignore b/fun/quinistry/.gitignore
new file mode 100644
index 0000000000..622119552e
--- /dev/null
+++ b/fun/quinistry/.gitignore
@@ -0,0 +1,2 @@
+.idea/
+quinistry
\ No newline at end of file
diff --git a/fun/quinistry/README.md b/fun/quinistry/README.md
new file mode 100644
index 0000000000..de197a219e
--- /dev/null
+++ b/fun/quinistry/README.md
@@ -0,0 +1,63 @@
+Quinistry
+=========
+
+*A simple Docker registry quine.*
+
+## What?
+
+This is an example project for a from-scratch implementation of an HTTP server compatible with the [Docker Registry V2][]
+protocol.
+
+It serves a single image called `quinistry:latest` which is a Docker image that runs quinistry itself, therefore it is a
+sort of Docker registry [quine][].
+
+The official documentation does not contain enough information to actually implement this protocol (which I assume is
+intentional), but a bit of trial&error lead there anyways. I've added comments to parts of the code to clear up things
+that may be helpful to other developers in the future.
+
+## Example
+
+```
+# Run quinistry:
+vincent@urdhva ~/go/src/github.com/tazjin/quinistry (git)-[master] % ./quinistry
+2017/03/16 14:11:56 Starting quinistry
+
+# Pull the quinistry image from itself:
+vincent@urdhva ~ % docker pull localhost:8080/quinistry
+Using default tag: latest
+latest: Pulling from quinistry
+7bf1a8b18466: Already exists
+Digest: sha256:d5cd4490901ef04b4e28e4ccc03a1d25fe3461200cf4d7166aab86fcd495e22e
+Status: Downloaded newer image for localhost:8080/quinistry:latest
+
+# Quinistry will log:
+2017/03/16 14:14:03 Acknowleding V2 API: GET /v2/
+2017/03/16 14:14:03 Serving manifest: GET /v2/quinistry/manifests/latest
+2017/03/16 14:14:03 Serving config: GET /v2/quinistry/blobs/sha256:fbb165c48849de16017aa398aa9bb08fd1c00eaa7c150b6c2af37312913db279
+
+# Run the downloaded image:
+vincent@urdhva ~ % docker run -p 8090:8080 localhost:8080/quinistry
+2017/03/16 13:15:18 Starting quinistry
+
+# And download it again from itself:
+vincent@urdhva ~ % docker pull localhost:8090/quinistry
+Using default tag: latest
+latest: Pulling from quinistry
+7bf1a8b18466: Already exists
+Digest: sha256:11141d95ddce0bac9ffa32ab1e8bc94748ed923e87762c68858dc41d11a46d3f
+Status: Downloaded newer image for localhost:8090/quinistry:latest
+```
+
+## Building
+
+Quinistry creates a Docker image that only contains a statically linked `main` binary. As this package makes use of
+`net/http`, Go will (by default) link against `libc` for DNS resolution and create a dynamic binary instead.
+
+To disable this, `build` the project with `-tags netgo`:
+
+```
+go build -tags netgo
+```
+
+[Docker Registry V2]: https://docs.docker.com/registry/spec/api/
+[quine]: https://en.wikipedia.org/wiki/Quine_(computing)
\ No newline at end of file
diff --git a/fun/quinistry/const.go b/fun/quinistry/const.go
new file mode 100644
index 0000000000..173fa9efc3
--- /dev/null
+++ b/fun/quinistry/const.go
@@ -0,0 +1,12 @@
+package main
+
+// HTTP content types
+
+const ImageConfigMediaType string = "application/vnd.docker.container.image.v1+json"
+const ManifestMediaType string = "application/vnd.docker.distribution.manifest.v2+json"
+const LayerMediaType string = "application/vnd.docker.image.rootfs.diff.tar.gzip"
+
+// HTTP header names
+
+const ContentType string = "Content-Type"
+const DigestHeader string = "Docker-Content-Digest"
diff --git a/fun/quinistry/default.nix b/fun/quinistry/default.nix
new file mode 100644
index 0000000000..8b005da8f6
--- /dev/null
+++ b/fun/quinistry/default.nix
@@ -0,0 +1,11 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.program {
+  name = "quinistry";
+  srcs = [
+    ./const.go
+    ./image.go
+    ./main.go
+    ./types.go
+  ];
+}
diff --git a/fun/quinistry/image.go b/fun/quinistry/image.go
new file mode 100644
index 0000000000..3daeac34d6
--- /dev/null
+++ b/fun/quinistry/image.go
@@ -0,0 +1,150 @@
+// The code in this file creates a Docker image layer containing the binary of the
+// application itself.
+
+package main
+
+import (
+	"archive/tar"
+	"bytes"
+	"compress/gzip"
+	"crypto/sha256"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"log"
+	"os"
+	"time"
+)
+
+// This function creates a Docker-image digest (i.e. SHA256 hash with
+// algorithm-specification prefix)
+func Digest(b []byte) string {
+	hash := sha256.New()
+	hash.Write(b)
+
+	return fmt.Sprintf("sha256:%x", hash.Sum(nil))
+}
+
+func GetImageOfCurrentExecutable() Image {
+	binary := getCurrentBinary()
+	tarArchive := createTarArchive(&map[string][]byte{
+		"/main": binary,
+	})
+
+	configJson, configElem := createConfig([]string{Digest(tarArchive)})
+	compressed := gzipArchive("Quinistry image", tarArchive)
+	manifest := createManifest(&configElem, &compressed)
+	manifestJson, _ := json.Marshal(manifest)
+
+	return Image{
+		Layer:          compressed,
+		LayerDigest:    Digest(compressed),
+		Manifest:       manifestJson,
+		ManifestDigest: Digest(manifestJson),
+		Config:         configJson,
+		ConfigDigest:   Digest(configJson),
+	}
+
+}
+
+func getCurrentBinary() []byte {
+	path, _ := os.Executable()
+	file, _ := ioutil.ReadFile(path)
+	return file
+}
+
+func createTarArchive(files *map[string][]byte) []byte {
+	buf := new(bytes.Buffer)
+	w := tar.NewWriter(buf)
+
+	for name, file := range *files {
+		hdr := &tar.Header{
+			Name: name,
+			// Everything is executable \o/
+			Mode: 0755,
+			Size: int64(len(file)),
+		}
+		w.WriteHeader(hdr)
+		w.Write(file)
+	}
+
+	if err := w.Close(); err != nil {
+		log.Fatalln(err)
+		os.Exit(1)
+	}
+
+	return buf.Bytes()
+}
+
+func gzipArchive(name string, archive []byte) []byte {
+	buf := new(bytes.Buffer)
+	w := gzip.NewWriter(buf)
+	w.Name = name
+	w.Write(archive)
+
+	if err := w.Close(); err != nil {
+		log.Fatalln(err)
+		os.Exit(1)
+	}
+
+	return buf.Bytes()
+}
+
+func createConfig(layerDigests []string) (configJson []byte, elem Element) {
+	now := time.Now()
+
+	imageConfig := &ImageConfig{
+		Cmd: []string{"/main"},
+		Env: []string{"PATH=/"},
+	}
+
+	rootFs := RootFs{
+		DiffIds: layerDigests,
+		Type:    "layers",
+	}
+
+	history := []History{
+		{
+			Created:   now,
+			CreatedBy: "Quinistry magic",
+		},
+	}
+
+	config := Config{
+		Created:      now,
+		Author:       "tazjin",
+		Architecture: "amd64",
+		Os:           "linux",
+		Config:       imageConfig,
+		RootFs:       rootFs,
+		History:      history,
+	}
+
+	configJson, _ = json.Marshal(config)
+
+	elem = Element{
+		MediaType: ImageConfigMediaType,
+		Size:      len(configJson),
+		Digest:    Digest(configJson),
+	}
+
+	return
+}
+
+func createManifest(config *Element, layer *[]byte) Manifest {
+	layers := []Element{
+		{
+			MediaType: LayerMediaType,
+			Size:      len(*layer),
+			// Layers must contain the digest of the *gzipped* layer.
+			Digest: Digest(*layer),
+		},
+	}
+
+	return Manifest{
+		SchemaVersion: 2,
+		MediaType:     ManifestMediaType,
+		Config:        *config,
+		Layers:        layers,
+	}
+}
diff --git a/fun/quinistry/k8s/child.yaml b/fun/quinistry/k8s/child.yaml
new file mode 100644
index 0000000000..aa2e318262
--- /dev/null
+++ b/fun/quinistry/k8s/child.yaml
@@ -0,0 +1,27 @@
+# This is a child quinistry, running via an image served off the parent.
+---
+apiVersion: extensions/v1beta1
+kind: DaemonSet
+metadata:
+  name: quinistry-gen2
+  labels:
+    k8s-app: quinistry
+    quinistry/role: child
+    quinistry/generation: '2'
+spec:
+  template:
+    metadata:
+      labels:
+        k8s-app: quinistry
+        quinistry/role: child
+        quinistry/generation: '2'
+    spec:
+      containers:
+        - name: quinistry
+          # Bootstrap via Docker Hub (or any other registry)
+          image: localhost:5000/quinistry
+          ports:
+            - name: registry
+              containerPort: 8080
+              # Incremented hostPort, 
+              hostPort: 5001
diff --git a/fun/quinistry/k8s/parent.yaml b/fun/quinistry/k8s/parent.yaml
new file mode 100644
index 0000000000..0db2fe300e
--- /dev/null
+++ b/fun/quinistry/k8s/parent.yaml
@@ -0,0 +1,27 @@
+# This is a bootstrapped Quinistry DaemonSet. The initial image
+# comes from Docker Hub
+---
+apiVersion: extensions/v1beta1
+kind: DaemonSet
+metadata:
+  name: quinistry
+  labels:
+    k8s-app: quinistry
+    quinistry/role: parent
+    quinistry/generation: '1'
+spec:
+  template:
+    metadata:
+      labels:
+        k8s-app: quinistry
+        quinistry/role: parent
+        quinistry/generation: '1'
+    spec:
+      containers:
+        - name: quinistry
+          # Bootstrap via Docker Hub (or any other registry)
+          image: tazjin/quinistry
+          ports:
+            - name: registry
+              containerPort: 8080
+              hostPort: 5000
diff --git a/fun/quinistry/main.go b/fun/quinistry/main.go
new file mode 100644
index 0000000000..50b47418d1
--- /dev/null
+++ b/fun/quinistry/main.go
@@ -0,0 +1,57 @@
+package main
+
+import (
+	"fmt"
+	"log"
+	"net/http"
+)
+
+func main() {
+	log.Println("Starting quinistry")
+
+	image := GetImageOfCurrentExecutable()
+
+	layerUri := fmt.Sprintf("/v2/quinistry/blobs/%s", image.LayerDigest)
+	configUri := fmt.Sprintf("/v2/quinistry/blobs/%s", image.ConfigDigest)
+
+	log.Fatal(http.ListenAndServe(":8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		// Acknowledge that we speak V2
+		if r.RequestURI == "/v2/" {
+			logRequest("Acknowleding V2 API", r)
+			fmt.Fprintln(w)
+			return
+		}
+
+		// Serve manifest
+		if r.RequestURI == "/v2/quinistry/manifests/latest" {
+			logRequest("Serving manifest", r)
+			w.Header().Set(ContentType, ManifestMediaType)
+			w.Header().Add(DigestHeader, image.ManifestDigest)
+			w.Write(image.Manifest)
+			return
+		}
+
+		// Serve actual image layer
+		if r.RequestURI == layerUri {
+			logRequest("Serving image layer blob", r)
+			w.Header().Add(DigestHeader, image.LayerDigest)
+			w.Write(image.Layer)
+			return
+		}
+
+		// Serve image config
+		if r.RequestURI == configUri {
+			logRequest("Serving config", r)
+			w.Header().Set("Content-Type", ImageConfigMediaType)
+			w.Header().Set(DigestHeader, image.ConfigDigest)
+			w.Write(image.Config)
+			return
+		}
+
+		log.Printf("Unhandled request: %v\n", *r)
+	})))
+}
+
+func logRequest(msg string, r *http.Request) {
+	log.Printf("%s: %s %s\n", msg, r.Method, r.RequestURI)
+}
diff --git a/fun/quinistry/types.go b/fun/quinistry/types.go
new file mode 100644
index 0000000000..498cbac2f2
--- /dev/null
+++ b/fun/quinistry/types.go
@@ -0,0 +1,79 @@
+package main
+
+import "time"
+
+// This type represents the rootfs-key of the Docker image config.
+// It specifies the digest (i.e. usually SHA256 hash) of the tar'ed, but NOT
+// compressed image layers.
+type RootFs struct {
+	// The digests of the non-compressed FS layers.
+	DiffIds []string `json:"diff_ids"`
+
+	// Type should always be set to "layers"
+	Type string `json:"type"`
+}
+
+// This type represents an entry in the Docker image config's history key.
+// Every history element "belongs" to a filesystem layer.
+type History struct {
+	Created   time.Time `json:"created"`
+	CreatedBy string    `json:"created_by"`
+}
+
+// This type represents runtime-configuration for the Docker image.
+// A lot of possible keys are omitted here, see:
+// https://github.com/docker/docker/blob/master/image/spec/v1.2.md#image-json-description
+type ImageConfig struct {
+	Cmd []string
+	Env []string
+}
+
+// This type represents the Docker image configuration
+type Config struct {
+	Created time.Time `json:"created"`
+	Author  string    `json:"author"`
+
+	// Architecture should be "amd64"
+	Architecture string `json:"architecture"`
+
+	// OS should be "linux"
+	Os string `json:"os"`
+
+	// Configuration can be set to 'nil', in which case all options have to be
+	// supplied at container launch time.
+	Config *ImageConfig `json:"config"`
+
+	// Filesystem layers and history elements have to be in the same order.
+	RootFs  RootFs    `json:"rootfs"`
+	History []History `json:"history"`
+}
+
+// This type represents any manifest
+type Element struct {
+	MediaType string `json:"mediaType"`
+	Size      int    `json:"size"`
+	Digest    string `json:"digest"`
+}
+
+// This type represents a Docker image manifest as used by the registry
+// protocol V2.
+type Manifest struct {
+	SchemaVersion int       `json:"schemaVersion"` // Must be 2
+	MediaType     string    `json:"mediaType"`     // Use ManifestMediaType const
+	Config        Element   `json:"config"`
+	Layers        []Element `json:"layers"`
+}
+
+// A really "dumb" representation of an image, with its data blob and related
+// metadata.
+// Note: This is not a registry API type.
+type Image struct {
+	Layer       []byte
+	LayerDigest string
+
+	Manifest       []byte
+	ManifestDigest string
+
+	Config       []byte
+	ConfigDigest string
+}
diff --git a/fun/watchblob/README.md b/fun/watchblob/README.md
new file mode 100644
index 0000000000..712c96cd95
--- /dev/null
+++ b/fun/watchblob/README.md
@@ -0,0 +1,35 @@
+Watchblob - WatchGuard VPN on Linux
+===================================
+
+This tiny helper tool makes it possible to use WatchGuard / Firebox / <<whatever
+they are actually called>> VPNs that use multi-factor authentication on Linux.
+
+Rather than using OpenVPN's built-in dynamic challenge/response protocol, WatchGuard
+has opted for a separate implementation negotiating credentials outside of the
+OpenVPN protocol, which makes it impossible to start those connections solely by
+using the `openvpn` CLI and configuration files.
+
+What this application does has been reverse-engineered from the "WatchGuard Mobile VPN
+with SSL" application on OS X.
+
+I've published a [blog post](https://www.tazj.in/en/1486830338) describing the process
+and what is actually going on in this protocol.
+
+## Installation
+
+Make sure you have Go installed and `GOPATH` configured, then simply
+`go get github.com/tazjin/watchblob/...`.
+
+## Usage
+
+Right now the usage is very simple. Make sure you have the correct OpenVPN client
+config ready (this is normally supplied by the WatchGuard UI) simply run:
+
+```
+watchblob vpnserver.somedomain.org username p4ssw0rd
+```
+
+The server responds with a challenge which is displayed to the user, wait until you
+receive the SMS code or whatever and enter it. `watchblob` then completes the
+credential negotiation and you may proceed to log in with OpenVPN using your username
+and *the OTP token* (**not**  your password) as credentials.
diff --git a/fun/watchblob/default.nix b/fun/watchblob/default.nix
new file mode 100644
index 0000000000..51f14ab163
--- /dev/null
+++ b/fun/watchblob/default.nix
@@ -0,0 +1,13 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.program {
+  name = "watchblob";
+  srcs = [
+    ./main.go
+    ./urls.go
+  ];
+
+  deps = with pkgs.third_party; [
+    gopkgs."golang.org".x.crypto.ssh.terminal.gopkg
+  ];
+}
diff --git a/fun/watchblob/main.go b/fun/watchblob/main.go
new file mode 100644
index 0000000000..a7ab65d3d1
--- /dev/null
+++ b/fun/watchblob/main.go
@@ -0,0 +1,108 @@
+package main
+
+import (
+	"bufio"
+	"encoding/xml"
+	"fmt"
+	"golang.org/x/crypto/ssh/terminal"
+	"net/http"
+	"os"
+	"strings"
+	"syscall"
+)
+
+// The XML response returned by the WatchGuard server
+type Resp struct {
+	Action      string `xml:"action"`
+	LogonStatus int    `xml:"logon_status"`
+	LogonId     int    `xml:"logon_id"`
+	Error       string `xml:"errStr"`
+	Challenge   string `xml:"chaStr"`
+}
+
+func main() {
+	args := os.Args[1:]
+
+	if len(args) != 1 {
+		fmt.Fprintln(os.Stderr, "Usage: watchblob <vpn-host>")
+		os.Exit(1)
+	}
+
+	host := args[0]
+
+	username, password, err := readCredentials()
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Could not read credentials: %v\n", err)
+	}
+
+	fmt.Printf("Requesting challenge from %s as user %s\n", host, username)
+	challenge, err := triggerChallengeResponse(&host, &username, &password)
+
+	if err != nil || challenge.LogonStatus != 4 {
+		fmt.Fprintln(os.Stderr, "Did not receive challenge from server")
+		fmt.Fprintf(os.Stderr, "Response: %v\nError: %v\n", challenge, err)
+		os.Exit(1)
+	}
+
+	token := getToken(&challenge)
+	err = logon(&host, &challenge, &token)
+
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Logon failed: %v\n", err)
+		os.Exit(1)
+	}
+
+	fmt.Printf("Login succeeded, you may now (quickly) authenticate OpenVPN with %s as your password\n", token)
+}
+
+func readCredentials() (string, string, error) {
+	fmt.Printf("Username: ")
+	reader := bufio.NewReader(os.Stdin)
+	username, err := reader.ReadString('\n')
+
+	fmt.Printf("Password: ")
+	password, err := terminal.ReadPassword(syscall.Stdin)
+	fmt.Println()
+
+	// If an error occured, I don't care about which one it is.
+	return strings.TrimSpace(username), strings.TrimSpace(string(password)), err
+}
+
+func triggerChallengeResponse(host *string, username *string, password *string) (r Resp, err error) {
+	return request(templateUrl(host, templateChallengeTriggerUri(username, password)))
+}
+
+func getToken(challenge *Resp) string {
+	fmt.Println(challenge.Challenge)
+
+	reader := bufio.NewReader(os.Stdin)
+	token, _ := reader.ReadString('\n')
+
+	return strings.TrimSpace(token)
+}
+
+func logon(host *string, challenge *Resp, token *string) (err error) {
+	resp, err := request(templateUrl(host, templateResponseUri(challenge.LogonId, token)))
+	if err != nil {
+		return
+	}
+
+	if resp.LogonStatus != 1 {
+		err = fmt.Errorf("Challenge/response authentication failed: %v", resp)
+	}
+
+	return
+}
+
+func request(url string) (r Resp, err error) {
+	resp, err := http.Get(url)
+	if err != nil {
+		return
+	}
+
+	defer resp.Body.Close()
+	decoder := xml.NewDecoder(resp.Body)
+
+	err = decoder.Decode(&r)
+	return
+}
diff --git a/fun/watchblob/main_test.go b/fun/watchblob/main_test.go
new file mode 100644
index 0000000000..1af52d0cd4
--- /dev/null
+++ b/fun/watchblob/main_test.go
@@ -0,0 +1,96 @@
+package main
+
+import (
+	"encoding/xml"
+	"reflect"
+	"testing"
+)
+
+func TestUnmarshalChallengeRespones(t *testing.T) {
+	var testXml string = `
+<?xml version="1.0" encoding="UTF-8"?>
+<resp>
+  <action>sslvpn_logon</action>
+  <logon_status>4</logon_status>
+  <auth-domain-list>
+    <auth-domain>
+      <name>RADIUS</name>
+    </auth-domain>
+  </auth-domain-list>
+  <logon_id>441</logon_id>
+  <chaStr>Enter Your 6 Digit Passcode </chaStr>
+</resp>`
+
+	var r Resp
+	xml.Unmarshal([]byte(testXml), &r)
+
+	expected := Resp{
+		Action:      "sslvpn_logon",
+		LogonStatus: 4,
+		LogonId:     441,
+		Challenge:   "Enter Your 6 Digit Passcode ",
+	}
+
+	assertEqual(t, expected, r)
+}
+
+func TestUnmarshalLoginError(t *testing.T) {
+	var testXml string = `
+<?xml version="1.0" encoding="UTF-8"?>
+<resp>
+  <action>sslvpn_logon</action>
+  <logon_status>2</logon_status>
+  <auth-domain-list>
+    <auth-domain>
+      <name>RADIUS</name>
+    </auth-domain>
+  </auth-domain-list>
+  <errStr>501</errStr>
+</resp>`
+
+	var r Resp
+	xml.Unmarshal([]byte(testXml), &r)
+
+	expected := Resp{
+		Action:      "sslvpn_logon",
+		LogonStatus: 2,
+		Error:       "501",
+	}
+
+	assertEqual(t, expected, r)
+}
+
+func TestUnmarshalLoginSuccess(t *testing.T) {
+	var testXml string = `
+<?xml version="1.0" encoding="UTF-8"?>
+<resp>
+  <action>sslvpn_logon</action>
+  <logon_status>1</logon_status>
+  <auth-domain-list>
+    <auth-domain>
+      <name>RADIUS</name>
+    </auth-domain>
+  </auth-domain-list>
+</resp>
+`
+	var r Resp
+	xml.Unmarshal([]byte(testXml), &r)
+
+	expected := Resp{
+		Action:      "sslvpn_logon",
+		LogonStatus: 1,
+	}
+
+	assertEqual(t, expected, r)
+}
+
+func assertEqual(t *testing.T, expected interface{}, result interface{}) {
+	if !reflect.DeepEqual(expected, result) {
+		t.Errorf(
+			"Unmarshaled values did not match.\nExpected: %v\nResult: %v\n",
+			expected, result,
+		)
+
+		t.Fail()
+	}
+}
diff --git a/fun/watchblob/urls.go b/fun/watchblob/urls.go
new file mode 100644
index 0000000000..37f65e0fae
--- /dev/null
+++ b/fun/watchblob/urls.go
@@ -0,0 +1,37 @@
+package main
+
+import (
+	"fmt"
+	"net/url"
+	"strconv"
+)
+
+const urlFormat string = "https://%s%s"
+const uriFormat = "/?%s"
+
+func templateChallengeTriggerUri(username *string, password *string) string {
+	v := url.Values{}
+	v.Set("action", "sslvpn_logon")
+	v.Set("style", "fw_logon_progress.xsl")
+	v.Set("fw_logon_type", "logon")
+	v.Set("fw_domain", "Firebox-DB")
+	v.Set("fw_username", *username)
+	v.Set("fw_password", *password)
+
+	return fmt.Sprintf(uriFormat, v.Encode())
+}
+
+func templateResponseUri(logonId int, token *string) string {
+	v := url.Values{}
+	v.Set("action", "sslvpn_logon")
+	v.Set("style", "fw_logon_progress.xsl")
+	v.Set("fw_logon_type", "response")
+	v.Set("response", *token)
+	v.Set("fw_logon_id", strconv.Itoa(logonId))
+
+	return fmt.Sprintf(uriFormat, v.Encode())
+}
+
+func templateUrl(baseUrl *string, uri string) string {
+	return fmt.Sprintf(urlFormat, *baseUrl, uri)
+}
diff --git a/net/alcoholic_jwt/.gitignore b/net/alcoholic_jwt/.gitignore
new file mode 100644
index 0000000000..143b1ca014
--- /dev/null
+++ b/net/alcoholic_jwt/.gitignore
@@ -0,0 +1,4 @@
+
+/target/
+**/*.rs.bk
+Cargo.lock
diff --git a/net/alcoholic_jwt/Cargo.toml b/net/alcoholic_jwt/Cargo.toml
new file mode 100644
index 0000000000..40db6b7bd1
--- /dev/null
+++ b/net/alcoholic_jwt/Cargo.toml
@@ -0,0 +1,16 @@
+[package]
+name = "alcoholic_jwt"
+description = "Library for validation of RS256 JWTs"
+version = "1.0.0"
+authors = ["Vincent Ambo <vincent@aprila.no>"]
+keywords = ["jwt", "token", "jwks"]
+categories = ["authentication"]
+license = "GPL-3.0-or-later"
+repository = "https://github.com/aprilabank/alcoholic_jwt"
+
+[dependencies]
+base64 = "0.10"
+openssl = "0.10"
+serde = "1.0"
+serde_derive = "1.0"
+serde_json = "1.0"
diff --git a/net/alcoholic_jwt/LICENSE b/net/alcoholic_jwt/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/net/alcoholic_jwt/LICENSE
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/net/alcoholic_jwt/README.md b/net/alcoholic_jwt/README.md
new file mode 100644
index 0000000000..b9ff57df4b
--- /dev/null
+++ b/net/alcoholic_jwt/README.md
@@ -0,0 +1,62 @@
+alcoholic_jwt
+=============
+
+[![Build Status](https://travis-ci.org/aprilabank/alcoholic_jwt.svg?branch=master)](https://travis-ci.org/aprilabank/alcoholic_jwt)
+
+This is a library for **validation** of **RS256** JWTs using keys from
+a JWKS. Nothing more, nothing less.
+
+RS256 is the most commonly used asymmetric signature mechanism for
+JWTs, encountered in for example [Google][]'s or [Aprila][]'s APIs.
+
+The name of the library stems from the potential side-effects of
+trying to use the other Rust libraries that are made for similar
+purposes.
+
+## Usage overview
+
+You are retrieving JWTs from some authentication provider that uses
+`RS256` signatures and provides its public keys in [JWKS][] format.
+
+Example for a token that provides the key ID used for signing in the
+[`kid` claim][]:
+
+```rust
+extern crate alcoholic_jwt;
+
+use alcoholic_jwt::{JWKS, Validation, validate, token_kid};
+
+// The function implied here would usually perform an HTTP-GET
+// on the JWKS-URL for an authentication provider and deserialize
+// the result into the `alcoholic_jwt::JWKS`-struct.
+let jwks: JWKS = jwks_fetching_function();
+
+let token: String = some_token_fetching_function();
+
+// Several types of built-in validations are provided:
+let validations = vec![
+  Validation::Issuer("auth.test.aprila.no".into()),
+  Validation::SubjectPresent,
+];
+
+// If a JWKS contains multiple keys, the correct KID first
+// needs to be fetched from the token headers.
+let kid = token_kid(&token)
+    .expect("Failed to decode token headers")
+    .expect("No 'kid' claim present in token");
+
+let jwk = jwks.find(&kid).expect("Specified key not found in set");
+
+validate(token, jwk, validations).expect("Token validation has failed!");
+```
+
+## Under the hood
+
+This library aims to only use trustworthy off-the-shelf components to
+do the work. Cryptographic operations are provided by the `openssl`
+crate, JSON-serialisation is provided by `serde_json`.
+
+[Google]: https://www.google.com/
+[Aprila]: https://www.aprila.no/
+[JWKS]: https://tools.ietf.org/html/rfc7517
+[`kid` claim]: https://tools.ietf.org/html/rfc7515#section-4.1.4
diff --git a/net/alcoholic_jwt/src/lib.rs b/net/alcoholic_jwt/src/lib.rs
new file mode 100644
index 0000000000..c98bee6150
--- /dev/null
+++ b/net/alcoholic_jwt/src/lib.rs
@@ -0,0 +1,451 @@
+// Copyright (C) 2018  Aprila Bank ASA
+//
+// alcoholic_jwt is free software: you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+//! Implements a library for for **validation** of **RS256** JWTs
+//! using keys from a JWKS. Nothing more, nothing less.
+//!
+//! The name of the library stems from the potential side-effects of
+//! trying to use the other Rust libraries that are made for similar
+//! purposes.
+//!
+//! This library is specifically aimed at developers that consume
+//! tokens from services which provide their RSA public keys in
+//! [JWKS][] format.
+//!
+//! ## Usage example (token with `kid`-claim)
+//!
+//! ```rust
+//! # extern crate serde_json;
+//! extern crate alcoholic_jwt;
+//!
+//! use alcoholic_jwt::{JWKS, Validation, validate, token_kid};
+//!
+//! # fn some_token_fetching_function() -> &'static str {
+//! #   "eyJraWQiOiI4ckRxOFB3MEZaY2FvWFdURVZRbzcrVGYyWXpTTDFmQnhOS1BDZWJhYWk0PSIsImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0.eyJpc3MiOiJhdXRoLnRlc3QuYXByaWxhLm5vIiwiaWF0IjoxNTM2MDUwNjkzLCJleHAiOjE1MzYwNTQyOTMsInN1YiI6IjQyIiwiZXh0Ijoic21va2V0ZXN0IiwicHJ2IjoiYXJpc3RpIiwic2NwIjoicHJvY2VzcyJ9.gOLsv98109qLkmRK6Dn7WWRHLW7o8W78WZcWvFZoxPLzVO0qvRXXRLYc9h5chpfvcWreLZ4f1cOdvxv31_qnCRSQQPOeQ7r7hj_sPEDzhKjk-q2aoNHaGGJg1vabI--9EFkFsGQfoS7UbMMssS44dgR68XEnKtjn0Vys-Vzbvz_CBSCH6yQhRLik2SU2jR2L7BoFvh4LGZ6EKoQWzm8Z-CHXLGLUs4Hp5aPhF46dGzgAzwlPFW4t9G4DciX1uB4vv1XnfTc5wqJch6ltjKMde1GZwLR757a8dJSBcmGWze3UNE2YH_VLD7NCwH2kkqr3gh8rn7lWKG4AUIYPxsw9CB"
+//! # }
+//!
+//! # fn jwks_fetching_function() -> JWKS {
+//! #   let jwks_json = "{\"keys\":[{\"kty\":\"RSA\",\"alg\":\"RS256\",\"use\":\"sig\",\"kid\":\"8rDq8Pw0FZcaoXWTEVQo7+Tf2YzSL1fBxNKPCebaai4=\",\"n\":\"l4UTgk1zr-8C8utt0E57DtBV6qqAPWzVRrIuQS2j0_hp2CviaNl5XzGRDnB8gwk0Hx95YOhJupAe6RNq5ok3fDdxL7DLvppJNRLz3Ag9CsmDLcbXgNEQys33fBJaPw1v3GcaFC4tisU5p-o1f5RfWwvwdBtdBfGiwT1GRvbc5sFx6M4iYjg9uv1lNKW60PqSJW4iDYrfqzZmB0zF1SJ0BL_rnQZ1Wi_UkFmNe9arM8W9tI9T3Ie59HITFuyVSTCt6qQEtSfa1e5PiBaVuV3qoFI2jPBiVZQ6LPGBWEDyz4QtrHLdECPPoTF30NN6TSVwwlRbCuUUrdNdXdjYe2dMFQ\",\"e\":\"DhaD5zC7mzaDvHO192wKT_9sfsVmdy8w8T8C9VG17_b1jG2srd3cmc6Ycw-0blDf53Wrpi9-KGZXKHX6_uIuJK249WhkP7N1SHrTJxO0sUJ8AhK482PLF09Qtu6cUfJqY1X1y1S2vACJZItU4Vjr3YAfiVGQXeA8frAf7Sm4O1CBStCyg6yCcIbGojII0jfh2vSB-GD9ok1F69Nmk-R-bClyqMCV_Oq-5a0gqClVS8pDyGYMgKTww2RHgZaFSUcG13KeLMQsG2UOB2OjSC8FkOXK00NBlAjU3d0Vv-IamaLIszO7FQBY3Oh0uxNOvIE9ofQyCOpB-xIK6V9CTTphxw\"}]}";
+//! #   serde_json::from_str(jwks_json).unwrap()
+//! # }
+//! #
+//! // The function implied here would usually perform an HTTP-GET
+//! // on the JWKS-URL for an authentication provider and deserialize
+//! // the result into the `alcoholic_jwt::JWKS`-struct.
+//! let jwks: JWKS = jwks_fetching_function();
+//!
+//! let token = some_token_fetching_function();
+//!
+//! // Several types of built-in validations are provided:
+//! let validations = vec![
+//!   Validation::Issuer("auth.test.aprila.no".into()),
+//!   Validation::SubjectPresent,
+//! ];
+//!
+//! // If a JWKS contains multiple keys, the correct KID first
+//! // needs to be fetched from the token headers.
+//! let kid = token_kid(&token)
+//!     .expect("Failed to decode token headers")
+//!     .expect("No 'kid' claim present in token");
+//!
+//! let jwk = jwks.find(&kid).expect("Specified key not found in set");
+//!
+//! validate(token, jwk, validations).expect("Token validation has failed!");
+//! ```
+//!
+//! [JWKS]: https://tools.ietf.org/html/rfc7517
+
+#[macro_use] extern crate serde_derive;
+
+extern crate base64;
+extern crate openssl;
+extern crate serde;
+extern crate serde_json;
+
+use base64::{URL_SAFE_NO_PAD, Config, DecodeError};
+use openssl::bn::BigNum;
+use openssl::error::ErrorStack;
+use openssl::hash::MessageDigest;
+use openssl::pkey::{Public, PKey};
+use openssl::rsa::Rsa;
+use openssl::sign::Verifier;
+use serde::de::DeserializeOwned;
+use serde_json::Value;
+use std::time::{UNIX_EPOCH, Duration, SystemTime};
+
+#[cfg(test)]
+mod tests;
+
+/// URL-safe character set without padding that allows trailing bits,
+/// which appear in some JWT implementations.
+///
+/// Note: The functions on `base64::Config` are not marked `const`,
+/// and the constructors are not exported, which is why this is
+/// implemented as a function.
+fn jwt_forgiving() -> Config {
+    URL_SAFE_NO_PAD.decode_allow_trailing_bits(true)
+}
+
+/// JWT algorithm used. The only supported algorithm is currently
+/// RS256.
+#[derive(Clone, Deserialize, Debug)]
+enum KeyAlgorithm { RS256 }
+
+/// Type of key contained in a JWT. The only supported key type is
+/// currently RSA.
+#[derive(Clone, Deserialize, Debug)]
+enum KeyType { RSA }
+
+/// Representation of a single JSON Web Key. See [RFC
+/// 7517](https://tools.ietf.org/html/rfc7517#section-4).
+#[allow(dead_code)] // kty & alg only constrain deserialisation, but aren't used
+#[derive(Clone, Debug, Deserialize)]
+pub struct JWK {
+    kty: KeyType,
+    alg: Option<KeyAlgorithm>,
+    kid: Option<String>,
+
+    // Shared modulus
+    n: String,
+
+    // Public key exponent
+    e: String,
+}
+
+/// Representation of a set of JSON Web Keys. See [RFC
+/// 7517](https://tools.ietf.org/html/rfc7517#section-5).
+#[derive(Clone, Debug, Deserialize)]
+pub struct JWKS {
+    // This is a vector instead of some kind of map-like structure
+    // because key IDs are in fact optional.
+    //
+    // Technically having multiple keys with the same KID would not
+    // violate the JWKS-definition either, but behaviour in that case
+    // is unspecified.
+    keys: Vec<JWK>,
+}
+
+impl JWKS {
+    /// Attempt to find a JWK by its key ID.
+    pub fn find(&self, kid: &str) -> Option<&JWK> {
+        self.keys.iter().find(|jwk| jwk.kid == Some(kid.into()))
+    }
+}
+
+/// Representation of an undecoded JSON Web Token. See [RFC
+/// 7519](https://tools.ietf.org/html/rfc7519).
+struct JWT<'a> (&'a str);
+
+/// Representation of a decoded and validated JSON Web Token.
+///
+/// Specific claim fields are only decoded internally in the library
+/// for validation purposes, while it is generally up to the consumer
+/// of the validated JWT what structure they would like to impose.
+pub struct ValidJWT {
+    /// JOSE header of the JSON Web Token. Certain fields are
+    /// guaranteed to be present in this header, consult section 5 of
+    /// RFC7519 for more information.
+    pub headers: Value,
+
+    /// Claims (i.e. primary data) contained in the JSON Web Token.
+    /// While there are several registered and recommended headers
+    /// (consult section 4.1 of RFC7519), the presence of no field is
+    /// guaranteed in these.
+    pub claims: Value,
+}
+
+/// Possible token claim validations. This enumeration only covers
+/// common use-cases, for other types of validations the user is
+/// encouraged to inspect the claim set manually.
+pub enum Validation {
+    /// Validate that the issuer ("iss") claim matches a specified
+    /// value.
+    Issuer(String),
+
+    /// Validate that the audience ("aud") claim matches a specified
+    /// value.
+    Audience(String),
+
+    /// Validate that a subject value is present.
+    SubjectPresent,
+
+    /// Validate that the expiry time of the token ("exp"-claim) has
+    /// not yet been reached.
+    NotExpired,
+}
+
+/// Possible results of a token validation.
+#[derive(Debug)]
+pub enum ValidationError {
+    /// Invalid number of token components (not a JWT?)
+    InvalidComponents,
+
+    /// Token segments had invalid base64-encoding.
+    InvalidBase64(DecodeError),
+
+    /// Decoding of the provided JWK failed.
+    InvalidJWK,
+
+    /// Signature validation failed, i.e. because of a non-matching
+    /// public key.
+    InvalidSignature,
+
+    /// An OpenSSL operation failed along the way at a point at which
+    /// a more specific error variant could not be constructed.
+    OpenSSL(ErrorStack),
+
+    /// JSON decoding into a provided type failed.
+    JSON(serde_json::Error),
+
+    /// One or more claim validations failed. This variant contains
+    /// human-readable validation errors.
+    InvalidClaims(Vec<&'static str>),
+}
+
+type JWTResult<T> = Result<T, ValidationError>;
+
+impl From<ErrorStack> for ValidationError {
+    fn from(err: ErrorStack) -> Self { ValidationError::OpenSSL(err) }
+}
+
+impl From<serde_json::Error> for ValidationError {
+    fn from(err: serde_json::Error) -> Self { ValidationError::JSON(err) }
+}
+
+impl From<DecodeError> for ValidationError {
+    fn from(err: DecodeError) -> Self { ValidationError::InvalidBase64(err) }
+}
+
+/// Attempt to extract the `kid`-claim out of a JWT's header claims.
+///
+/// This function is normally used when a token provider has multiple
+/// public keys in rotation at the same time that could all still have
+/// valid tokens issued under them.
+///
+/// This is only safe if the key set containing the currently allowed
+/// key IDs is fetched from a trusted source.
+pub fn token_kid(token: &str) -> JWTResult<Option<String>> {
+    // Fetch the header component of the JWT by splitting it out and
+    // dismissing the rest.
+    let parts: Vec<&str> = token.splitn(2, '.').collect();
+    if parts.len() != 2 {
+        return Err(ValidationError::InvalidComponents);
+    }
+
+    // Decode only the first part of the token into a specialised
+    // representation:
+    #[derive(Deserialize)]
+    struct KidOnly {
+        kid: Option<String>,
+    }
+
+    let kid_only: KidOnly = deserialize_part(parts[0])?;
+
+    Ok(kid_only.kid)
+}
+
+/// Validate the signature of a JSON Web Token and optionally apply
+/// claim validations. Signatures are always verified before claims,
+/// and if a signature verification passes *all* claim validations are
+/// run and returned.
+///
+/// If validation succeeds a representation of the token is returned
+/// that contains the header and claims as simple JSON values.
+///
+/// It is the user's task to ensure that the correct JWK is passed in
+/// for validation.
+pub fn validate(token: &str,
+                jwk: &JWK,
+                validations: Vec<Validation>) -> JWTResult<ValidJWT> {
+    let jwt = JWT(token);
+    let public_key = public_key_from_jwk(&jwk)?;
+    validate_jwt_signature(&jwt, public_key)?;
+
+    // Split out all three parts of the JWT this time, deserialising
+    // the first and second as appropriate.
+    let parts: Vec<&str> = jwt.0.splitn(3, '.').collect();
+    if parts.len() != 3 {
+        // This is unlikely considering that validation has already
+        // been performed at this point, but better safe than sorry.
+        return Err(ValidationError::InvalidComponents)
+    }
+
+    // Perform claim validations before constructing the valid token:
+    let partial_claims = deserialize_part(parts[1])?;
+    validate_claims(partial_claims, validations)?;
+
+    let headers = deserialize_part(parts[0])?;
+    let claims = deserialize_part(parts[1])?;
+    let valid_jwt = ValidJWT { headers, claims };
+
+    Ok(valid_jwt)
+}
+
+// Internal implementation
+//
+// The functions in the following section are not part of the public
+// API of this library.
+
+/// Decode a single key fragment (base64-url encoded integer) to an
+/// OpenSSL BigNum.
+fn decode_fragment(fragment: &str) -> JWTResult<BigNum> {
+    let bytes = base64::decode_config(fragment, jwt_forgiving())
+        .map_err(|_| ValidationError::InvalidJWK)?;
+
+    BigNum::from_slice(&bytes).map_err(Into::into)
+}
+
+/// Decode an RSA public key from a JWK by constructing it directly
+/// from the public RSA key fragments.
+fn public_key_from_jwk(jwk: &JWK) -> JWTResult<Rsa<Public>> {
+    let jwk_n = decode_fragment(&jwk.n)?;
+    let jwk_e = decode_fragment(&jwk.e)?;
+    Rsa::from_public_components(jwk_n, jwk_e).map_err(Into::into)
+}
+
+/// Decode a base64-URL encoded string and deserialise the resulting
+/// JSON.
+fn deserialize_part<T: DeserializeOwned>(part: &str) -> JWTResult<T> {
+    let json = base64::decode_config(part, jwt_forgiving())?;
+    serde_json::from_slice(&json).map_err(Into::into)
+}
+
+/// Validate the signature on a JWT using a provided public key.
+///
+/// A JWT is made up of three components (headers, claims, signature)
+/// - only the first two are part of the signed data.
+fn validate_jwt_signature(jwt: &JWT, key: Rsa<Public>) -> JWTResult<()> {
+    let key = PKey::from_rsa(key)?;
+    let mut verifier = Verifier::new(MessageDigest::sha256(), &key)?;
+
+    // Split the token from the back to a maximum of two elements.
+    // There are technically three components using the same separator
+    // ('.'), but we are interested in the first two together and
+    // splitting them is unnecessary.
+    let token_parts: Vec<&str> = jwt.0.rsplitn(2, '.').collect();
+    if token_parts.len() != 2 {
+        return Err(ValidationError::InvalidComponents);
+    }
+
+    // Second element of the vector will be the signed payload.
+    let data = token_parts[1];
+
+    // First element of the vector will be the (encoded) signature.
+    let sig_b64 = token_parts[0];
+    let sig = base64::decode_config(sig_b64, jwt_forgiving())?;
+
+    // Verify signature by inserting the payload data and checking it
+    // against the decoded signature.
+    verifier.update(data.as_bytes())?;
+
+    match verifier.verify(&sig)? {
+        true  => Ok(()),
+        false => Err(ValidationError::InvalidSignature),
+    }
+}
+
+/// Internal helper struct for claims that are relevant for claim
+/// validations.
+#[derive(Deserialize)]
+struct PartialClaims {
+    aud: Option<String>,
+    iss: Option<String>,
+    sub: Option<String>,
+    exp: Option<u64>,
+}
+
+/// Apply a single validation to the claim set of a token.
+fn apply_validation(claims: &PartialClaims,
+                    validation: Validation) -> Result<(), &'static str> {
+    match validation {
+        // Validate that an 'iss' claim is present and matches the
+        // supplied value.
+        Validation::Issuer(iss) => {
+            match claims.iss {
+                None => Err("'iss' claim is missing"),
+                Some(ref claim) => if *claim == iss {
+                    Ok(())
+                } else {
+                    Err("'iss' claim does not match")
+                }
+            }
+        },
+
+        // Validate that an 'aud' claim is present and matches the
+        // supplied value.
+        Validation::Audience(aud) => {
+            match claims.aud {
+                None => Err("'aud' claim is missing"),
+                Some(ref claim) => if *claim == aud {
+                    Ok(())
+                } else {
+                    Err("'aud' claim does not match")
+                }
+            }
+        },
+
+        Validation::SubjectPresent => match claims.sub {
+            Some(_) => Ok(()),
+            None => Err("'sub' claim is missing"),
+        },
+
+        Validation::NotExpired => match claims.exp {
+            None => Err("'exp' claim is missing"),
+            Some(exp) => {
+                // Determine the current timestamp in seconds since
+                // the UNIX epoch.
+                let now = SystemTime::now()
+                    .duration_since(UNIX_EPOCH)
+                    // this is an unrecoverable, critical error. There
+                    // aren't many ways this can occur, other than
+                    // system time being set into the far future or
+                    // this library being used in some sort of future
+                    // museum.
+                    .expect("system time is likely incorrect");
+
+                // Convert the expiry time (which is also in epoch
+                // seconds) to a duration.
+                let exp_duration = Duration::from_secs(exp);
+
+                // The token has not expired if the expiry duration is
+                // larger than (i.e. in the future from) the current
+                // time.
+                if exp_duration > now {
+                    Ok(())
+                } else {
+                    Err("token has expired")
+                }
+            }
+        },
+    }
+}
+
+/// Apply all requested validations to a partial claim set.
+fn validate_claims(claims: PartialClaims,
+                   validations: Vec<Validation>) -> JWTResult<()> {
+    let validation_errors: Vec<_> = validations.into_iter()
+        .map(|v| apply_validation(&claims, v))
+        .filter_map(|result| match result {
+            Ok(_)    => None,
+            Err(err) => Some(err),
+        })
+        .collect();
+
+    if validation_errors.is_empty() {
+        Ok(())
+    } else {
+        Err(ValidationError::InvalidClaims(validation_errors))
+    }
+}
diff --git a/net/alcoholic_jwt/src/tests.rs b/net/alcoholic_jwt/src/tests.rs
new file mode 100644
index 0000000000..81890986f8
--- /dev/null
+++ b/net/alcoholic_jwt/src/tests.rs
@@ -0,0 +1,61 @@
+// Copyright (C) 2018  Aprila Bank ASA
+//
+// alcoholic_jwt is free software: you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+use super::*;
+
+#[test]
+fn test_fragment_decoding() {
+    let fragment = "ngRRjNbXgPW29oNtF0JgsyyfTwPyEL0u_X16s453X2AOc33XGFxVKLEQ7R_TiMenaKcr-tPifYqgps_deyi0XOr4I3SOdOMtAVKDZJCANe--CANOHZb-meIfjKhCHisvT90fm5Apd6qPRVsXsZ7A8pmClZHKM5fwZUkBv8NsPLm2Xy2sGOZIiwP_7z8m3j0abUzniPQsx2b3xcWimB9vRtshFHN1KgPUf1ALQ5xzLfJnlFkCxC7kmOxKC7_NpQ4kJR_DKzKFV_r3HxTqf-jddHcXIrrMcLQXCSyeLQtLaz7whQ4F-EfL42z4XgwPr4ji3sct2gWL13EqlbE5DDxLKQ";
+    let bignum = decode_fragment(fragment).expect("Failed to decode fragment");
+
+    let expected = "19947781743618558124649689124245117083485690334420160711273532766920651190711502679542723943527557680293732686428091794139998732541701457212387600480039297092835433997837314251024513773285252960725418984381935183495143908023024822433135775773958512751261112853383693442999603704969543668619221464654540065497665889289271044207667765128672709218996183649696030570183970367596949687544839066873508106034650634722970893169823917299050098551447676778961773465887890052852528696684907153295689693676910831376066659456592813140662563597179711588277621736656871685099184755908108451080261403193680966083938080206832839445289";
+    assert_eq!(expected, format!("{}", bignum), "Decoded fragment should match ");
+}
+
+#[test]
+fn test_decode_find_jwks() {
+    let json = "{\"keys\":[{\"kty\":\"RSA\",\"alg\":\"RS256\",\"use\":\"sig\",\"kid\":\"mUjI\\/rIMLLtung35BKZfdbrqtlEAAYJ4JX\\/SKvnLxJc=\",\"n\":\"ngRRjNbXgPW29oNtF0JgsyyfTwPyEL0u_X16s453X2AOc33XGFxVKLEQ7R_TiMenaKcr-tPifYqgps_deyi0XOr4I3SOdOMtAVKDZJCANe--CANOHZb-meIfjKhCHisvT90fm5Apd6qPRVsXsZ7A8pmClZHKM5fwZUkBv8NsPLm2Xy2sGOZIiwP_7z8m3j0abUzniPQsx2b3xcWimB9vRtshFHN1KgPUf1ALQ5xzLfJnlFkCxC7kmOxKC7_NpQ4kJR_DKzKFV_r3HxTqf-jddHcXIrrMcLQXCSyeLQtLaz7whQ4F-EfL42z4XgwPr4ji3sct2gWL13EqlbE5DDxLKQ\",\"e\":\"GK7oLCDbNPAF59LhvyseqcG04hDnPs58qGYolr_HHmaR4lulWJ90ozx6e4Ut363yKG2p9vwvivR5UIC-aLPtqT2qr-OtjhBFzUFVaMGZ6mPCvMKk0AgMYdOHvWTgBSqQtNJTvl1yYLnhcWyoE2fLQhoEbY9qUyCBCEOScXOZRDpnmBtz5I8q5yYMV6a920J24T_IYbxHgkGcEU2SGg-b1cOMD7Rja7vCfV---CQ2pR4leQ0jufzudDoe7z3mziJm-Ihcdrz2Ujy5kPEMdz6R55prJ-ENKrkD_X4u5aSlSRaetwmHS3oAVkjr1JwUNbqnpM-kOqieqHEp8LUmez-Znw\"}]}";
+    let jwks: JWKS = serde_json::from_str(json).expect("Failed to decode JWKS");
+    let jwk = jwks.find("mUjI/rIMLLtung35BKZfdbrqtlEAAYJ4JX/SKvnLxJc=")
+        .expect("Failed to find required JWK");
+
+    public_key_from_jwk(&jwk).expect("Failed to construct public key from JWK");
+}
+
+#[test]
+fn test_token_kid() {
+    let jwt = "eyJraWQiOiI4ckRxOFB3MEZaY2FvWFdURVZRbzcrVGYyWXpTTDFmQnhOS1BDZWJhYWk0PSIsImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0.eyJpc3MiOiJhdXRoLnRlc3QuYXByaWxhLm5vIiwiaWF0IjoxNTM2MDUwNjkzLCJleHAiOjE1MzYwNTQyOTMsInN1YiI6IjQyIiwiZXh0Ijoic21va2V0ZXN0IiwicHJ2IjoiYXJpc3RpIiwic2NwIjoicHJvY2VzcyJ9.gOLsv98109qLkmRK6Dn7WWRHLW7o8W78WZcWvFZoxPLzVO0qvRXXRLYc9h5chpfvcWreLZ4f1cOdvxv31_qnCRSQQPOeQ7r7hj_sPEDzhKjk-q2aoNHaGGJg1vabI--9EFkFsGQfoS7UbMMssS44dgR68XEnKtjn0Vys-Vzbvz_CBSCH6yQhRLik2SU2jR2L7BoFvh4LGZ6EKoQWzm8Z-CHXLGLUs4Hp5aPhF46dGzgAzwlPFW4t9G4DciX1uB4vv1XnfTc5wqJch6ltjKMde1GZwLR757a8dJSBcmGWze3UNE2YH_VLD7NCwH2kkqr3gh8rn7lWKG4AUIYPxsw9CB";
+
+    let kid = token_kid(&jwt).expect("Failed to extract token KID");
+    assert_eq!(Some("8rDq8Pw0FZcaoXWTEVQo7+Tf2YzSL1fBxNKPCebaai4=".into()),
+               kid, "Extracted KID did not match expected KID");
+}
+
+#[test]
+fn test_validate_jwt() {
+    let jwks_json = "{\"keys\":[{\"kty\":\"RSA\",\"alg\":\"RS256\",\"use\":\"sig\",\"kid\":\"8rDq8Pw0FZcaoXWTEVQo7+Tf2YzSL1fBxNKPCebaai4=\",\"n\":\"l4UTgk1zr-8C8utt0E57DtBV6qqAPWzVRrIuQS2j0_hp2CviaNl5XzGRDnB8gwk0Hx95YOhJupAe6RNq5ok3fDdxL7DLvppJNRLz3Ag9CsmDLcbXgNEQys33fBJaPw1v3GcaFC4tisU5p-o1f5RfWwvwdBtdBfGiwT1GRvbc5sFx6M4iYjg9uv1lNKW60PqSJW4iDYrfqzZmB0zF1SJ0BL_rnQZ1Wi_UkFmNe9arM8W9tI9T3Ie59HITFuyVSTCt6qQEtSfa1e5PiBaVuV3qoFI2jPBiVZQ6LPGBWEDyz4QtrHLdECPPoTF30NN6TSVwwlRbCuUUrdNdXdjYe2dMFQ\",\"e\":\"DhaD5zC7mzaDvHO192wKT_9sfsVmdy8w8T8C9VG17_b1jG2srd3cmc6Ycw-0blDf53Wrpi9-KGZXKHX6_uIuJK249WhkP7N1SHrTJxO0sUJ8AhK482PLF09Qtu6cUfJqY1X1y1S2vACJZItU4Vjr3YAfiVGQXeA8frAf7Sm4O1CBStCyg6yCcIbGojII0jfh2vSB-GD9ok1F69Nmk-R-bClyqMCV_Oq-5a0gqClVS8pDyGYMgKTww2RHgZaFSUcG13KeLMQsG2UOB2OjSC8FkOXK00NBlAjU3d0Vv-IamaLIszO7FQBY3Oh0uxNOvIE9ofQyCOpB-xIK6V9CTTphxw\"}]}";
+
+    let jwks: JWKS = serde_json::from_str(jwks_json)
+        .expect("Failed to decode JWKS");
+
+    let jwk = jwks.find("8rDq8Pw0FZcaoXWTEVQo7+Tf2YzSL1fBxNKPCebaai4=")
+        .expect("Failed to find required JWK");
+
+    let pkey = public_key_from_jwk(&jwk).expect("Failed to construct public key");
+
+    let jwt = JWT("eyJraWQiOiI4ckRxOFB3MEZaY2FvWFdURVZRbzcrVGYyWXpTTDFmQnhOS1BDZWJhYWk0PSIsImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0.eyJpc3MiOiJhdXRoLnRlc3QuYXByaWxhLm5vIiwiaWF0IjoxNTM2MDUwNjkzLCJleHAiOjE1MzYwNTQyOTMsInN1YiI6IjQyIiwiZXh0Ijoic21va2V0ZXN0IiwicHJ2IjoiYXJpc3RpIiwic2NwIjoicHJvY2VzcyJ9.gOLsv98109qLkmRK6Dn7WWRHLW7o8W78WZcWvFZoxPLzVO0qvRXXRLYc9h5chpfvcWreLZ4f1cOdvxv31_qnCRSQQPOeQ7r7hj_sPEDzhKjk-q2aoNHaGGJg1vabI--9EFkFsGQfoS7UbMMssS44dgR68XEnKtjn0Vys-Vzbvz_CBSCH6yQhRLik2SU2jR2L7BoFvh4LGZ6EKoQWzm8Z-CHXLGLUs4Hp5aPhF46dGzgAzwlPFW4t9G4DciX1uB4vv1XnfTc5wqJch6ltjKMde1GZwLR757a8dJSBcmGWze3UNE2YH_VLD7NCwH2kkqr3gh8rn7lWKG4AUIYPxsw9CB".into());
+
+    validate_jwt_signature(&jwt, pkey).expect("Validation failed unexpectedly");
+}
diff --git a/net/crimp/.gitignore b/net/crimp/.gitignore
new file mode 100644
index 0000000000..693699042b
--- /dev/null
+++ b/net/crimp/.gitignore
@@ -0,0 +1,3 @@
+/target
+**/*.rs.bk
+Cargo.lock
diff --git a/net/crimp/Cargo.toml b/net/crimp/Cargo.toml
new file mode 100644
index 0000000000..13c80f1f69
--- /dev/null
+++ b/net/crimp/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "crimp"
+description = "Higher-level Rust API for cURL bindings"
+version = "0.2.2"
+authors = ["Vincent Ambo <mail@tazj.in>"]
+keywords = [ "http", "curl" ]
+categories = [ "api-bindings" ]
+license = "GPL-3.0-or-later"
+repository = "https://github.com/tazjin/crimp"
+
+[features]
+default = [ "json" ]
+json = [ "serde", "serde_json"]
+
+[dependencies]
+curl = "0.4"
+serde = { version = "1.0", optional = true }
+serde_json = { version = "1.0", optional = true }
diff --git a/net/crimp/LICENSE b/net/crimp/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/net/crimp/LICENSE
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/net/crimp/README.md b/net/crimp/README.md
new file mode 100644
index 0000000000..791c354fc1
--- /dev/null
+++ b/net/crimp/README.md
@@ -0,0 +1,15 @@
+crimp
+=====
+
+[![Build Status](https://travis-ci.org/tazjin/crimp.svg?branch=master)](https://travis-ci.org/tazjin/crimp)
+[![](https://img.shields.io/crates/v/crimp.svg)](https://crates.io/crates/crimp)
+[![](https://docs.rs/crimp/badge.svg)](https://docs.rs/crimp)
+
+Crimp is an HTTP client interface on top of the [Rust bindings][] to
+cURL.
+
+The documentation for this crate is primarily in the [module
+documentation][]
+
+[Rust bindings]: https://docs.rs/curl
+[module documentation]: https://docs.rs/crimp
diff --git a/net/crimp/src/lib.rs b/net/crimp/src/lib.rs
new file mode 100644
index 0000000000..b52ebc3ef0
--- /dev/null
+++ b/net/crimp/src/lib.rs
@@ -0,0 +1,502 @@
+// crimp - Higher-level Rust cURL API
+//
+// Copyright (C) 2019 Vincent Ambo
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+//! # crimp
+//!
+//! This library provides a simplified API over the [cURL Rust
+//! bindings][] that resemble that of higher-level libraries such as
+//! [reqwest][]. All calls are synchronous.
+//!
+//! `crimp` is intended to be used in situations where HTTP client
+//! functionality is desired without adding a significant number of
+//! dependencies or sacrificing too much usability.
+//!
+//! Using `crimp` to make HTTP requests is done using a simple
+//! builder-pattern style API. For example, to make a `GET`-request
+//! and print the result to `stdout`:
+//!
+//! ```rust
+//! use crimp::Request;
+//!
+//! let response = Request::get("http://httpbin.org/get")
+//!     .user_agent("crimp test suite").unwrap()
+//!     .send().unwrap()
+//!     .as_string().unwrap();
+//!
+//! println!("Status: {}\nBody: {}", response.status, response.body);
+//! # assert_eq!(response.status, 200);
+//! ```
+//!
+//! If a feature from the underlying cURL library is missing, the
+//! `Request::raw` method can be used as an escape hatch to deal with
+//! the handle directly. Should you find yourself doing this, please
+//! [file an issue][].
+//!
+//! `crimp` does not currently expose functionality for re-using a
+//! cURL Easy handle, meaning that keep-alive of HTTP connections and
+//! the like is not supported.
+//!
+//! ## Cargo features
+//!
+//! All optional features are enabled by default.
+//!
+//! * `json`: Adds `Request::json` and `Response::as_json` methods
+//!   which can be used for convenient serialisation of
+//!   request/response bodies using `serde_json`. This feature adds a
+//!   dependency on the `serde` and `serde_json` crates.
+//!
+//! ## Initialisation
+//!
+//! It is recommended to call the underlying `curl::init` method
+//! (re-exported as `crimp::init`) when launching your application to
+//! initialise the cURL library. This is not required, but will
+//! otherwise occur the first time a request is made.
+//!
+//! [cURL Rust bindings]: https://docs.rs/curl
+//! [reqwest]: https://docs.rs/reqwest
+//! [file an issue]: https://github.com/tazjin/crimp/issues
+
+extern crate curl;
+
+#[cfg(feature = "json")] extern crate serde;
+#[cfg(feature = "json")] extern crate serde_json;
+
+pub use curl::init;
+
+use curl::easy::{Auth, Easy, Form, List, Transfer, ReadError, WriteError};
+use std::collections::HashMap;
+use std::io::Write;
+use std::path::Path;
+use std::string::{FromUtf8Error, ToString};
+use std::time::Duration;
+
+#[cfg(feature = "json")] use serde::Serialize;
+#[cfg(feature = "json")] use serde::de::DeserializeOwned;
+
+#[cfg(test)]
+mod tests;
+
+/// HTTP method to use for the request.
+enum Method {
+    Get, Post, Put, Patch, Delete
+}
+
+/// Certificate types for client-certificate key pairs.
+pub enum CertType {
+    P12, PEM, DER
+}
+
+/// Builder structure for an HTTP request.
+///
+/// This is the primary API-type in `crimp`. After creating a new
+/// request its parameters are modified using the various builder
+/// methods until it is consumed by `send()`.
+pub struct Request<'a> {
+    url: &'a str,
+    method: Method,
+    handle: Easy,
+    headers: List,
+    body: Body<'a>,
+}
+
+enum Body<'a> {
+    NoBody,
+    Form(Form),
+
+    Bytes {
+        content_type: &'a str,
+        data: &'a [u8],
+    },
+
+    #[cfg(feature = "json")]
+    Json(Vec<u8>),
+}
+
+/// HTTP responses structure containing response data and headers.
+///
+/// By default the `send()` function of the `Request` structure will
+/// return a `Response<Vec<u8>>`. Convenience helpers exist for
+/// decoding a string via `Response::as_string` or to a
+/// `serde`-compatible type with `Response::as_json` (if the
+/// `json`-feature is enabled).
+#[derive(Debug, PartialEq)]
+pub struct Response<T> {
+    /// HTTP status code of the response.
+    pub status: u32,
+
+    /// HTTP headers returned from the remote.
+    pub headers: HashMap<String, String>,
+
+    /// Body data from the HTTP response.
+    pub body: T,
+}
+
+impl <'a> Request<'a> {
+    /// Initiate an HTTP request with the given method and URL.
+    fn new(method: Method, url: &'a str) -> Self {
+        Request {
+            url,
+            method,
+            handle: Easy::new(),
+            headers: List::new(),
+            body: Body::NoBody,
+        }
+    }
+
+    /// Initiate a GET request with the given URL.
+    pub fn get(url: &'a str) -> Self { Request::new(Method::Get, url) }
+
+    /// Initiate a POST request with the given URL.
+    pub fn post(url: &'a str) -> Self { Request::new(Method::Post, url) }
+
+    /// Initiate a PUT request with the given URL.
+    pub fn put(url: &'a str) -> Self { Request::new(Method::Put, url) }
+
+    /// Initiate a PATCH request with the given URL.
+    pub fn patch(url: &'a str) -> Self { Request::new(Method::Patch, url) }
+
+    /// Initiate a DELETE request with the given URL.
+    pub fn delete(url: &'a str) -> Self { Request::new(Method::Delete, url) }
+
+    /// Add an HTTP header to a request.
+    pub fn header(mut self, k: &str, v: &str) -> Result<Self, curl::Error> {
+        self.headers.append(&format!("{}: {}", k, v))?;
+        Ok(self)
+    }
+
+    /// Set the `User-Agent` for this request. By default this will be
+    /// set to cURL's standard user agent.
+    pub fn user_agent(mut self, agent: &str) -> Result<Self, curl::Error> {
+        self.handle.useragent(agent)?;
+        Ok(self)
+    }
+
+    /// Set the `Authorization` header to a `Bearer` value with the
+    /// supplied token.
+    pub fn bearer_auth(mut self, token: &str) -> Result<Self, curl::Error> {
+        self.headers.append(&format!("Authorization: Bearer {}", token))?;
+        Ok(self)
+    }
+
+    /// Set the `Authorization` header to a basic authentication value
+    /// from the supplied username and password.
+    pub fn basic_auth(mut self, username: &str, password: &str) -> Result<Self, curl::Error> {
+        let mut auth = Auth::new();
+        auth.basic(true);
+        self.handle.username(username)?;
+        self.handle.password(password)?;
+        self.handle.http_auth(&auth)?;
+        Ok(self)
+    }
+
+    /// Configure a TLS client certificate on the request.
+    ///
+    /// Depending on whether the certificate file contains the private
+    /// key or not, calling `tls_client_key` may be required in
+    /// addition.
+    ///
+    /// Consult the documentation for the `ssl_cert` and `ssl_key`
+    /// functions in `curl::easy::Easy2` for details on supported
+    /// formats and defaults.
+    pub fn tls_client_cert<P: AsRef<Path>>(mut self, cert_type: CertType, cert: P)
+                                           -> Result<Self, curl::Error> {
+        self.handle.ssl_cert(cert)?;
+        self.handle.ssl_cert_type(match cert_type {
+            CertType::P12 => "P12",
+            CertType::PEM => "PEM",
+            CertType::DER => "DER",
+        })?;
+
+        Ok(self)
+    }
+
+    /// Configure a TLS client certificate key on the request.
+    ///
+    /// Note that this does **not** need to be called again for
+    /// PKCS12-encoded key pairs which are set via `tls_client_cert`.
+    ///
+    /// Currently only PEM-encoded key files are supported.
+    pub fn tls_client_key<P: AsRef<Path>>(mut self, key: P) -> Result<Self, curl::Error> {
+        self.handle.ssl_key(key)?;
+        Ok(self)
+    }
+
+    /// Configure an encryption password for a TLS client certificate
+    /// key on the request.
+    ///
+    /// This is required in case of an encrypted private key that
+    /// should be used.
+    pub fn tls_key_password(mut self, password: &str) -> Result<Self, curl::Error> {
+        self.handle.key_password(password)?;
+        Ok(self)
+    }
+
+    /// Configure a timeout for the request after which the request
+    /// will be aborted.
+    pub fn timeout(mut self, timeout: Duration) -> Result<Self, curl::Error> {
+        self.handle.timeout(timeout)?;
+        Ok(self)
+    }
+
+    /// Set custom configuration on the cURL `Easy` handle.
+    ///
+    /// This function can be considered an "escape-hatch" from the
+    /// high-level API which lets users access the internal
+    /// `curl::easy::Easy` handle and configure options on it
+    /// directly.
+    ///
+    /// ```
+    /// # use crimp::Request;
+    /// let response = Request::get("https://httpbin.org/get")
+    ///     .with_handle(|mut handle| handle.referer("Example-Referer")).unwrap()
+    ///     .send().unwrap();
+    /// #
+    /// # assert!(response.is_success());
+    /// ```
+    pub fn with_handle<F>(mut self, function: F) -> Result<Self, curl::Error>
+    where F: FnOnce(&mut Easy) -> Result<(), curl::Error> {
+        function(&mut self.handle)?;
+        Ok(self)
+    }
+
+    /// Add a byte-array body to a request using the specified
+    /// `Content-Type`.
+    pub fn body(mut self, content_type: &'a str, data: &'a [u8]) -> Self {
+        self.body = Body::Bytes { data, content_type };
+        self
+    }
+
+    /// Add a form-encoded body to a request using the `curl::Form`
+    /// type.
+    ///
+    /// ```rust
+    /// # extern crate curl;
+    /// # extern crate serde_json;
+    /// # use crimp::*;
+    /// # use serde_json::{Value, json};
+    /// use curl::easy::Form;
+    ///
+    /// let mut form = Form::new();
+    /// form.part("some-name")
+    ///     .contents("some-data".as_bytes())
+    ///     .add().unwrap();
+    ///
+    /// let response = Request::post("https://httpbin.org/post")
+    ///     .user_agent("crimp test suite").unwrap()
+    ///     .form(form)
+    ///     .send().unwrap();
+    /// #
+    /// # assert_eq!(200, response.status, "form POST should succeed");
+    /// # assert_eq!(
+    /// #     response.as_json::<Value>().unwrap().body.get("form").unwrap(),
+    /// #     &json!({"some-name": "some-data"}),
+    /// #     "posted form data should match",
+    /// # );
+    /// ```
+    ///
+    /// See the documentation of `curl::easy::Form` for details on how
+    /// to construct a form body.
+    pub fn form(mut self, form: Form) -> Self {
+        self.body = Body::Form(form);
+        self
+    }
+
+    /// Add a JSON-encoded body from a serializable type.
+    #[cfg(feature = "json")]
+    pub fn json<T: Serialize>(mut self, body: &T) -> Result<Self, serde_json::Error> {
+        let json = serde_json::to_vec(body)?;
+        self.body = Body::Json(json);
+        Ok(self)
+    }
+
+    /// Send the HTTP request and return a response structure
+    /// containing the raw body.
+    pub fn send(mut self) -> Result<Response<Vec<u8>>, curl::Error> {
+        // Configure request basics:
+        self.handle.url(self.url)?;
+
+        match self.method {
+            Method::Get    => self.handle.get(true)?,
+            Method::Post   => self.handle.post(true)?,
+            Method::Put    => self.handle.put(true)?,
+            Method::Patch  => self.handle.custom_request("PATCH")?,
+            Method::Delete => self.handle.custom_request("DELETE")?,
+        }
+
+        // Create structures in which to store the response data:
+        let mut headers = HashMap::new();
+        let mut body = vec![];
+
+        // Submit a form value to cURL if it is set and proceed
+        // pretending that there is no body, as the handling of this
+        // type of body happens under-the-hood.
+        if let Body::Form(form) = self.body {
+            self.handle.httppost(form)?;
+            self.body = Body::NoBody;
+        }
+
+        // Optionally set content type if a body payload is configured
+        // and configure the expected body size (or form payload).
+         match self.body {
+            Body::Bytes { content_type, data } => {
+                self.handle.post_field_size(data.len() as u64)?;
+                self.headers.append(&format!("Content-Type: {}", content_type))?;
+            },
+
+            #[cfg(feature = "json")]
+            Body::Json(ref data) => {
+                self.handle.post_field_size(data.len() as u64)?;
+                self.headers.append("Content-Type: application/json")?;
+            },
+
+             // Do not set content-type header at all if there is no
+             // body, or if the form handler was invoked above.
+             _ => (),
+        };
+
+        // Configure headers on the request:
+        self.handle.http_headers(self.headers)?;
+
+        {
+            // Take a scoped transfer from the Easy handle. This makes it
+            // possible to write data into the above local buffers without
+            // fighting the borrow-checker:
+            let mut transfer = self.handle.transfer();
+
+            // Write the payload if it exists:
+            match self.body {
+                Body::Bytes { data, .. } => chunked_read_function(&mut transfer, data)?,
+
+                #[cfg(feature = "json")]
+                Body::Json(ref json) => chunked_read_function(&mut transfer, json)?,
+
+                // Do nothing if there is no body or if the body is a
+                // form.
+                _ => (),
+            };
+
+            // Read one header per invocation. Request processing is
+            // terminated if any header is malformed:
+            transfer.header_function(|header| {
+                // Headers are expected to be valid UTF-8 data. If they
+                // are not, the conversion is lossy.
+                //
+                // Technically it is legal for HTTP requests to use
+                // different encodings, but we don't interface with such
+                // services for hygienic reasons.
+                let header = String::from_utf8_lossy(header);
+                let split = header.splitn(2, ':').collect::<Vec<_>>();
+
+                // "Malformed" headers are skipped. In most cases this
+                // will only be the HTTP version statement.
+                if split.len() != 2 {
+                    return true;
+                }
+
+                headers.insert(
+                    split[0].trim().to_string(), split[1].trim().to_string()
+                );
+                true
+            })?;
+
+            // Read the body to the allocated buffer.
+            transfer.write_function(|data| {
+                let len = data.len();
+                body.write_all(data)
+                    .map(|_| len)
+                    .map_err(|_| WriteError::Pause)
+            })?;
+
+            transfer.perform()?;
+        }
+
+        Ok(Response {
+            status: self.handle.response_code()?,
+            headers,
+            body
+        })
+    }
+}
+
+/// Provide a data chunk potentially larger than cURL's initial write
+/// buffer to the data reading callback by tracking the offset off
+/// already written data.
+///
+/// As we manually set the expected upload size, cURL will call the
+/// read callback repeatedly until it has all the data it needs.
+fn chunked_read_function<'easy, 'data>(transfer: &mut Transfer<'easy, 'data>,
+                                       data: &'data [u8]) -> Result<(), curl::Error> {
+    let mut data = data;
+
+    transfer.read_function(move |mut into| {
+        let written = into.write(data)
+            .map_err(|_| ReadError::Abort)?;
+
+        data = &data[written..];
+
+        Ok(written)
+    })
+}
+
+impl <T> Response<T> {
+    /// Check whether the status code of this HTTP response is a
+    /// success (i.e. in the 200-299 range).
+    pub fn is_success(&self) -> bool {
+        self.status >= 200 && self.status < 300
+    }
+
+    /// Check whether a request succeeded using `Request::is_success`
+    /// and let users provide a closure that creates a custom error
+    /// from the request if it did not.
+    ///
+    /// This function exists for convenience to avoid having to write
+    /// repetitive `if !response.is_success() { ... }` blocks.
+    pub fn error_for_status<F, E>(self, closure: F) -> Result<Self, E>
+    where F: FnOnce(Self) -> E {
+        if !self.is_success() {
+            return Err(closure(self))
+        }
+
+        Ok(self)
+    }
+}
+
+impl Response<Vec<u8>> {
+    /// Attempt to parse the HTTP response body as a UTF-8 encoded
+    /// string.
+    pub fn as_string(self) -> Result<Response<String>, FromUtf8Error> {
+        let body = String::from_utf8(self.body)?;
+
+        Ok(Response {
+            body,
+            status: self.status,
+            headers: self.headers,
+        })
+    }
+
+    /// Attempt to deserialize the HTTP response body from JSON.
+    #[cfg(feature = "json")]
+    pub fn as_json<T: DeserializeOwned>(self) -> Result<Response<T>, serde_json::Error> {
+        let deserialized = serde_json::from_slice(&self.body)?;
+
+        Ok(Response {
+            body: deserialized,
+            status: self.status,
+            headers: self.headers,
+        })
+    }
+}
diff --git a/net/crimp/src/tests.rs b/net/crimp/src/tests.rs
new file mode 100644
index 0000000000..6c2bc4f5b3
--- /dev/null
+++ b/net/crimp/src/tests.rs
@@ -0,0 +1,152 @@
+// All tests expect an httpbin instance to be available at
+// `http://localhost:4662`.
+//
+// This is easily spun up using Docker by running:
+//
+//    docker run --rm -p 4662:80 kennethreitz/httpbin
+
+use super::*;
+use serde_json::{Value, json};
+
+// These tests check whether the correct HTTP method is used in the
+// requests.
+
+#[test]
+fn test_http_get() {
+    let resp = Request::get("http://127.0.0.1:4662/get")
+        .send().expect("failed to send request");
+
+    assert!(resp.is_success(), "request should have succeeded");
+}
+
+#[test]
+fn test_http_delete() {
+    let resp = Request::delete("http://127.0.0.1:4662/delete")
+        .send().expect("failed to send request");
+
+    assert_eq!(200, resp.status, "response status should be 200 OK");
+}
+
+#[test]
+fn test_http_put() {
+    let resp = Request::put("http://127.0.0.1:4662/put")
+        .send().expect("failed to send request");
+
+    assert_eq!(200, resp.status, "response status should be 200 OK");
+}
+
+#[test]
+fn test_http_patch() {
+    let resp = Request::patch("http://127.0.0.1:4662/patch")
+        .send().expect("failed to send request");
+
+    assert_eq!(200, resp.status, "response status should be 200 OK");
+}
+
+// These tests perform various requests with different body payloads
+// and verify that those were received correctly by the remote side.
+
+#[test]
+fn test_http_post() {
+    let body = "test body";
+    let response = Request::post("http://127.0.0.1:4662/post")
+        .user_agent("crimp test suite").expect("failed to set user-agent")
+        .timeout(Duration::from_secs(5)).expect("failed to set request timeout")
+        .body("text/plain", &body.as_bytes())
+        .send().expect("failed to send request")
+        .as_json::<Value>().expect("failed to deserialize response");
+
+    let data = response.body;
+
+    assert_eq!(200, response.status, "response status should be 200 OK");
+
+    assert_eq!(data.get("data").unwrap(), &json!("test body"),
+               "test body should have been POSTed");
+
+    assert_eq!(
+        data.get("headers").unwrap().get("Content-Type").unwrap(),
+        &json!("text/plain"),
+        "Content-Type should be `text/plain`",
+    );
+}
+
+#[cfg(feature = "json")] #[test]
+fn test_http_post_json() {
+    let body = json!({
+        "purpose": "testing!"
+    });
+
+    let response = Request::post("http://127.0.0.1:4662/post")
+        .user_agent("crimp test suite").expect("failed to set user-agent")
+        .timeout(Duration::from_secs(5)).expect("failed to set request timeout")
+        .json(&body).expect("request serialization failed")
+        .send().expect("failed to send request")
+        .as_json::<Value>().expect("failed to deserialize response");
+
+
+    let data = response.body;
+
+    assert_eq!(200, response.status, "response status should be 200 OK");
+
+    assert_eq!(data.get("json").unwrap(), &body,
+               "test body should have been POSTed");
+
+    assert_eq!(
+        data.get("headers").unwrap().get("Content-Type").unwrap(),
+        &json!("application/json"),
+        "Content-Type should be `application/json`",
+    );
+}
+
+// Tests for different authentication methods that are supported
+// out-of-the-box:
+
+#[test]
+fn test_bearer_auth() {
+    let response = Request::get("http://127.0.0.1:4662/bearer")
+        .bearer_auth("some-token").expect("failed to set auth header")
+        .send().expect("failed to send request");
+
+    assert!(response.is_success(), "authorized request should succeed");
+}
+
+#[test]
+fn test_basic_auth() {
+    let request = Request::get("http://127.0.0.1:4662/basic-auth/alan_watts/oneness");
+
+    let response = request
+        .basic_auth("alan_watts", "oneness").expect("failed to set auth header")
+        .send().expect("failed to send request");
+
+    assert!(response.is_success(), "authorized request should succeed");
+}
+
+#[test]
+fn test_large_body() {
+    // By default cURL buffers seem to be 2^16 bytes in size. The test
+    // size is therefore 2^16+1.
+    const BODY_SIZE: usize = 65537;
+
+    let resp = Request::post("http://127.0.0.1:4662/post")
+        .body("application/octet-stream", &[0; BODY_SIZE])
+        .send().expect("sending request")
+        .as_json::<Value>().expect("JSON deserialisation");
+
+    // httpbin returns the uploaded data as a string in the `data`
+    // field.
+    let data = resp.body.get("data").unwrap().as_str().unwrap();
+
+    assert_eq!(BODY_SIZE, data.len(), "uploaded data length should be correct");
+}
+
+// Tests for various other features.
+
+#[test]
+fn test_error_for_status() {
+    let response = Request::get("http://127.0.0.1:4662/patch")
+        .send().expect("failed to send request")
+        .error_for_status(|resp| format!("Response error code: {}", resp.status));
+
+    assert_eq!(Err("Response error code: 405".into()), response,
+               "returned error should be converted into Result::Err");
+}
diff --git a/net/stomp_erl/.gitignore b/net/stomp_erl/.gitignore
new file mode 100644
index 0000000000..8e46d5a07f
--- /dev/null
+++ b/net/stomp_erl/.gitignore
@@ -0,0 +1,10 @@
+.eunit
+deps
+*.o
+*.beam
+*.plt
+erl_crash.dump
+ebin
+rel/example_project
+.concrete/DEV_MODE
+.rebar
diff --git a/net/stomp_erl/Makefile b/net/stomp_erl/Makefile
new file mode 100644
index 0000000000..b3bc54673d
--- /dev/null
+++ b/net/stomp_erl/Makefile
@@ -0,0 +1,8 @@
+PROJECT = stomp
+PROJECT_DESCRIPTION = STOMP client for Erlang
+PROJECT_VERSION = 0.1.0
+
+# Whitespace to be used when creating files from templates.
+SP = 4
+
+include erlang.mk
diff --git a/net/stomp_erl/README.md b/net/stomp_erl/README.md
new file mode 100644
index 0000000000..21c95a11a2
--- /dev/null
+++ b/net/stomp_erl/README.md
@@ -0,0 +1,78 @@
+STOMP on Erlang
+===============
+
+`stomp.erl` is a simple Erlang client for the [STOMP protocol][] in version 1.2.
+
+Currently only subscribing to queues is supported.
+
+It provides an application called `stomp` which takes configuration of the form:
+
+```erlang
+[{stomp, #{host     => "stomp-server.somedomain.sexy", % required
+           port     => 61613,                          % optional
+           login    => <<"someuser">>,                 % optional
+           passcode => <<"hunter2>>,                   % optional
+ }}].
+```
+
+## Types
+
+The following types are used in `stomp.erl`, you can include them from
+`stomp.hrl`:
+
+```erlang
+%% Client ack modes, refer to the STOMP protocol documentation
+-type ack_mode() :: client | client_individual | auto.
+
+%% Subscriptions are enumerated from 0
+-type sub_id() :: integer().
+
+%% Message IDs (for acknowledgements) are simple strings. They are
+%% extracted from the 'ack' field of the header in client or client-individual
+%% mode, and from the 'message-id' field in auto mode.
+-type message_id() :: binary().
+
+%% A STOMP message as received from a queue subscription
+-record(stomp_msg, { headers :: #{ binary() => binary() },
+                     body    :: binary() }.
+-type stomp_msg() :: #stomp_msg{}.
+```
+
+Once the application starts it will register a process under the name
+`stomp_worker` and expose the following API:
+
+## Subscribing to a queue
+
+```erlang
+%% Subscribe to a destination, receive the subscription ID
+-spec subscribe(binary(),   % Destination (e.g. <<"/queue/lizards">>)
+                ack_mode(), % Client-acknowledgement mode
+                -> {ok, sub_id()}.
+```
+
+This synchronous call subscribes to a message queue. The `stomp_worker` will
+link itself to the caller and forward received messages as
+`{msg, sub_id(), stomp_msg()}`.
+
+Depending on the acknowledgement mode specified on connecting, the subscriber
+may have to acknowledge receival of messages.
+
+## Acknowledging messages
+
+```erlang
+%% Acknowledge a message ID.
+%% This is not required in auto mode. In client mode it will acknowledge the
+%% received messages up to the ID specified. In client-individual mode every
+%% single message has to be acknowledged.
+-spec ack(sub_id(), message_id()) -> ok.
+
+%% Explicitly "unacknowledge" a message
+-spec nack(sub_id(), message_id()) -> ok.
+```
+
+Both of these calls are asynchronous and will return immediately. Note that in
+the case of the `stomp_worker` crashing before a message acknowledgement is
+handled, the message *may* be delivered again. Your consumer needs to be able to
+handle this.
+
+[STOMP protocol]: https://stomp.github.io/stomp-specification-1.2.html
diff --git a/net/stomp_erl/include/stomp.hrl b/net/stomp_erl/include/stomp.hrl
new file mode 100644
index 0000000000..30c933b563
--- /dev/null
+++ b/net/stomp_erl/include/stomp.hrl
@@ -0,0 +1,22 @@
+%% Client ack modes, refer to the STOMP protocol documentation
+-type ack_mode() :: client | client_individual | auto.
+
+%% Subscriptions are enumerated from 0
+-type sub_id() :: integer().
+
+%% Message IDs (for acknowledgements) are simple strings. They are
+%% extracted from the 'ack' field of the header in client or client-individual
+%% mode, and from the 'message-id' field in auto mode.
+-type message_id() :: binary().
+
+%% A destination can be a queue, or something else.
+%% Example: <<"/queue/lizards">>
+-type destination() :: binary().
+
+%% A STOMP message as received from a queue subscription
+-record(stomp_msg, { headers :: #{ binary() => binary() },
+                     body    :: binary() }).
+-type stomp_msg() :: #stomp_msg{}.
+
+%% STOMP frame components
+-type headers() :: #{binary() => binary()}.
diff --git a/net/stomp_erl/src/stomp.app.src b/net/stomp_erl/src/stomp.app.src
new file mode 100644
index 0000000000..baf0e271d1
--- /dev/null
+++ b/net/stomp_erl/src/stomp.app.src
@@ -0,0 +1,7 @@
+{application, stomp, [{description, "STOMP client for Erlang"},
+                      {vsn, "0.1.0"},
+                      {modules, [stomp_app, stomp_sup, stomp_worker]},
+                      {registered, [stomp_worker]},
+                      {env, []},
+                      {applications, [kernel, stdlib]},
+                      {mod, {stomp_app, []}}]}.
diff --git a/net/stomp_erl/src/stomp_app.erl b/net/stomp_erl/src/stomp_app.erl
new file mode 100644
index 0000000000..2ba3e69f99
--- /dev/null
+++ b/net/stomp_erl/src/stomp_app.erl
@@ -0,0 +1,11 @@
+-module(stomp_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+    stomp_sup:start_link().
+
+stop(_State) ->
+    ok.
diff --git a/net/stomp_erl/src/stomp_sup.erl b/net/stomp_erl/src/stomp_sup.erl
new file mode 100644
index 0000000000..3a298bc9bf
--- /dev/null
+++ b/net/stomp_erl/src/stomp_sup.erl
@@ -0,0 +1,22 @@
+-module(stomp_sup).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+    supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+    Procs = [stomp_spec()],
+    {ok, {{one_for_one, 1, 5}, Procs}}.
+
+%% Private
+
+stomp_spec() ->
+    #{id       => stomp_proc,
+      start    => {stomp_worker, start_link, []},
+      restart  => permanent,
+      shutdown => 5000,
+      type     => worker,
+      module   => [stomp_worker]}.
diff --git a/net/stomp_erl/src/stomp_worker.erl b/net/stomp_erl/src/stomp_worker.erl
new file mode 100644
index 0000000000..80981d37ab
--- /dev/null
+++ b/net/stomp_erl/src/stomp_worker.erl
@@ -0,0 +1,193 @@
+-module(stomp_worker).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+%% Testing
+-compile(export_all).
+
+-include("stomp.hrl").
+
+%% State of a stomp_worker
+-record(state, {connection    :: port(),
+                next_sub      :: sub_id(),
+                subscriptions :: #{ destination() => sub_id() },
+                subscribers   :: #{ destination() => pid() }
+               }).
+-type state() :: #state{}.
+
+%% API implementation
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+    {ok, Pid} = gen_server:start_link(?MODULE, [], []),
+    register(?MODULE, Pid),
+    {ok, Pid}.
+
+%% gen_server implementation
+
+-spec init(any()) -> {ok, state()}.
+init(_Args) ->
+    %% Fetch configuration from app config
+    {ok, Host} = application:get_env(stomp, host),
+    Port = application:get_env(stomp, port, 61613),
+    Login = application:get_env(stomp, login),
+    Pass = application:get_env(stomp, passcode),
+
+    %% Catch exit signals from linked processes (subscribers dying)
+    process_flag(trap_exit, true),
+
+    %% Establish connection
+    {ok, Conn} = connect(Host, Port, Login, Pass),
+
+    {ok, #state{connection = Conn,
+                next_sub   = 0,
+                subscriptions = #{},
+                subscribers = #{}}}.
+
+%% Handle subscription calls
+handle_call({subscribe, Dest, Ack}, From, State) ->
+    %% Subscribe to new destination
+    SubId = State#state.next_sub,
+    ok = subscribe(State#state.connection, SubId, Dest, Ack),
+
+    %% Add subscription and subscriber to state
+    Subscriptions = maps:put(SubId, Dest, State#state.subscriptions),
+    Subscribers = maps:put(SubId, From, State#state.subscribers),
+    NextSub = SubId + 1,
+    NewState = State#state{subscriptions = Subscriptions,
+                           subscribers = Subscribers,
+                           next_sub = NextSub },
+
+    {reply, {ok, SubId}, NewState};
+handle_call(_Req, _From, State) ->
+    {reply, ignored, State}.
+
+handle_info({tcp, Conn, Frame}, State) when Conn =:= State#state.connection ->
+    handle_frame(Frame, State);
+handle_info(_Msg, State) ->
+    {noreply, State}.
+
+%% Unused gen_server callbacks
+
+handle_cast(_Msg, State) ->
+    {noreply, State}.
+
+terminate(_Reason, _State) ->
+    ok.
+
+code_change(_OldVsn, State, _Extra) ->
+    {ok, State}.
+
+%% Private functions
+
+-spec connect(list(), integer(), any(), any()) -> {ok, port()}.
+connect(Host, Port, Login, Pass) ->
+    %% STOMP CONNECT frame
+    Connect = connect_frame(Host, Login, Pass),
+
+    %% TODO: Configurable buffer size
+    %% Frames larger than the user-level buffer will be truncated, so it should
+    %% never be smaller than the largest expected messages.
+    {ok, Socket} = gen_tcp:connect(Host, Port, [binary,
+                                                {packet, line},
+                                                {line_delimiter, $\0},
+                                                {buffer, 262144}]),
+
+    ok = gen_tcp:send(Socket, Connect),
+    {ok, Socket}.
+
+-spec subscribe(port(), sub_id(), destination(), ack_mode()) -> ok.
+subscribe(Socket, Id, Queue, Ack) ->
+    {ok, SubscribeFrame} = subscribe_frame(Id, Queue, Ack),
+    gen_tcp:send(Socket, SubscribeFrame).
+
+%%% Parsing STOMP frames
+
+handle_frame(<<"MESSAGE", "\n", _Frame/binary>>, State) ->
+    {noreply, State};
+handle_frame(Frame, State) ->
+    io:format("Received unknown frame ~p", [Frame]),
+    {noreply, State}.
+
+
+%% Parse out headers into a map
+-spec parse_headers(binary()) -> headers().
+parse_headers(HeadersBin) ->
+    Headers = binary:split(HeadersBin, <<"\n">>, [global]),
+    ToPairs = fun(H, M) -> [K,V | []] = binary:split(H, <<":">>),
+                           maps:put(K, V, M)
+              end,
+    {ok, lists:mapfoldl(ToPairs, #{}, Headers)}.
+
+%%% Making STOMP protocol frames
+
+%% Format a header
+-spec format_header({binary(), binary()}) -> binary().
+format_header({Key, Val}) ->
+    <<Key/binary, ":", Val/binary, "\n">>.
+
+%% Build a single STOMP frame
+-spec make_frame(binary(),
+                 headers(),
+                 binary())
+                -> {ok, iolist()}.
+make_frame(Command, HeaderMap, Body) ->
+    Headers = lists:map(fun format_header/1, maps:to_list(HeaderMap)),
+    Frame = [Command, <<"\n">>, Headers, <<"\n">>, Body, <<0>>],
+    {ok, Frame}.
+
+%%% Default frames
+
+-spec connect_frame(list(), any(), any()) -> iolist().
+connect_frame(Host, {ok, Login}, {ok, Pass}) ->
+    make_frame(<<"CONNECT">>,
+               #{<<"accept-version">> => <<"1.2">>,
+                 <<"host">>           => Host,
+                 <<"login">>          => Login,
+                 <<"passcode">>       => Pass,
+                 <<"heart-beat">>     => <<"0,5000">>},
+               []);
+connect_frame(Host, _Login, _Pass) ->
+    make_frame(<<"CONNECT">>,
+               #{<<"accept-version">> => <<"1.2">>,
+                 <<"host">>           => Host,
+                 %% Expect a server heartbeat every 5 seconds, let the server
+                 %% expect one every 10. We don't actually check this and just
+                 %% echo server heartbeats.
+                 %% TODO: For now the server is told not to expect replies due to
+                 %% a weird behaviour.
+                 <<"heart-beat">>     => <<"0,5000">>},
+               []).
+
+
+-spec subscribe_frame(sub_id(), destination(), ack_mode()) -> iolist().
+subscribe_frame(Id, Queue, Ack) ->
+    make_frame(<<"SUBSCRIBE">>,
+               #{<<"id">>          => integer_to_binary(Id),
+                 <<"destination">> => Queue,
+                 <<"ack">>         => ack_mode_to_binary(Ack)},
+               []).
+
+-spec ack_mode_to_binary(ack_mode()) -> binary().
+ack_mode_to_binary(AckMode) ->
+    case AckMode of
+        auto              -> <<"auto">>;
+        client            -> <<"client">>;
+        client_individual -> <<"client-individual">>
+    end.
+
+%% -spec ack_frame(binary()) -> iolist().
+%% ack_frame(MessageID) ->
+%%     make_frame(<<"ACK">>,
+%%                [{"id", MessageID}],
+%%                []).
diff --git a/nix/buildGo/.skip-subtree b/nix/buildGo/.skip-subtree
new file mode 100644
index 0000000000..8db1f814f6
--- /dev/null
+++ b/nix/buildGo/.skip-subtree
@@ -0,0 +1,2 @@
+Subdirectories of this folder should not be imported since they are
+internal to buildGo.nix and incompatible with readTree.
diff --git a/nix/buildGo/README.md b/nix/buildGo/README.md
new file mode 100644
index 0000000000..e84ede663b
--- /dev/null
+++ b/nix/buildGo/README.md
@@ -0,0 +1,140 @@
+buildGo.nix
+===========
+
+This is an alternative [Nix][] build system for [Go][]. It supports building Go
+libraries and programs, and even automatically generating Protobuf & gRPC
+libraries.
+
+*Note:* This will probably end up being folded into [Nixery][].
+
+## Background
+
+Most language-specific Nix tooling outsources the build to existing
+language-specific build tooling, which essentially means that Nix ends up being
+a wrapper around all sorts of external build systems.
+
+However, systems like [Bazel][] take an alternative approach in which the
+compiler is invoked directly and the composition of programs and libraries stays
+within a single homogeneous build system.
+
+Users don't need to learn per-language build systems and especially for
+companies with large monorepo-setups ([like Google][]) this has huge
+productivity impact.
+
+This project is an attempt to prove that Nix can be used in a similar style to
+build software directly, rather than shelling out to other build systems.
+
+## Example
+
+Given a program layout like this:
+
+```
+.
+├── lib          <-- some library component
+│   ├── bar.go
+│   └── foo.go
+├── api.proto    <-- gRPC API definition
+├── main.go      <-- program implementation
+└── default.nix  <-- build instructions
+```
+
+The contents of `default.nix` could look like this:
+
+```nix
+{ buildGo }:
+
+let
+  api = buildGo.grpc {
+    name  = "someapi";
+    proto = ./api.proto;
+  };
+
+  lib = buildGo.package {
+    name = "somelib";
+    srcs = [
+      ./lib/bar.go
+      ./lib/foo.go
+    ];
+  };
+in buildGo.program {
+  name = "my-program";
+  deps = [ api lib ];
+
+  srcs = [
+    ./main.go
+  ];
+}
+```
+
+(If you don't know how to read Nix, check out [nix-1p][])
+
+## Usage
+
+`buildGo` exposes five different functions:
+
+* `buildGo.program`: Build a Go binary out of the specified source files.
+
+  | parameter | type                    | use                                            | required? |
+  |-----------|-------------------------|------------------------------------------------|-----------|
+  | `name`    | `string`                | Name of the program (and resulting executable) | yes       |
+  | `srcs`    | `list<path>`            | List of paths to source files                  | yes       |
+  | `deps`    | `list<drv>`             | List of dependencies (i.e. other Go libraries) | no        |
+  | `x_defs`  | `attrs<string, string>` | Attribute set of linker vars (i.e. `-X`-flags) | no        |
+
+* `buildGo.package`: Build a Go library out of the specified source files.
+
+  | parameter | type         | use                                            | required? |
+  |-----------|--------------|------------------------------------------------|-----------|
+  | `name`    | `string`     | Name of the library (and resulting executable) | yes       |
+  | `srcs`    | `list<path>` | List of paths to source files                  | yes       |
+  | `deps`    | `list<drv>`  | List of dependencies (i.e. other Go libraries) | no        |
+  | `path`    | `string`     | Go import path for the resulting library       | no        |
+
+* `buildGo.external`: Build an externally defined Go library or program.
+
+  This function performs analysis on the supplied source code (which
+  can use the standard Go tooling layout) and creates a tree of all
+  the packages contained within.
+
+  This exists for compatibility with external libraries that were not
+  defined using buildGo.
+
+  | parameter | type           | use                                           | required? |
+  |-----------|----------------|-----------------------------------------------|-----------|
+  | `path`    | `string`       | Go import path for the resulting package      | yes       |
+  | `src`     | `path`         | Path to the source **directory**              | yes       |
+  | `deps`    | `list<drv>`    | List of dependencies (i.e. other Go packages) | no        |
+
+  For some examples of how `buildGo.external` is used, check out
+  [`proto.nix`](./proto.nix).
+
+* `buildGo.proto`: Build a Go library out of the specified Protobuf definition.
+
+  | parameter   | type        | use                                              | required? |
+  |-------------|-------------|--------------------------------------------------|-----------|
+  | `name`      | `string`    | Name for the resulting library                   | yes       |
+  | `proto`     | `path`      | Path to the Protobuf definition file             | yes       |
+  | `path`      | `string`    | Import path for the resulting Go library         | no        |
+  | `extraDeps` | `list<drv>` | Additional Go dependencies to add to the library | no        |
+
+* `buildGo.grpc`: Build a Go library out of the specified gRPC definition.
+
+  The parameters are identical to `buildGo.proto`.
+
+## Current status
+
+This project is work-in-progress. Crucially it is lacking the following features:
+
+* feature flag parity with Bazel's Go rules
+* documentation building
+* test execution
+
+There are still some open questions around how to structure some of those
+features in Nix.
+
+[Nix]: https://nixos.org/nix/
+[Go]: https://golang.org/
+[Nixery]: https://github.com/google/nixery
+[Bazel]: https://bazel.build/
+[like Google]: https://ai.google/research/pubs/pub45424
+[nix-1p]: https://github.com/tazjin/nix-1p
diff --git a/nix/buildGo/default.nix b/nix/buildGo/default.nix
new file mode 100644
index 0000000000..140cbf2d9d
--- /dev/null
+++ b/nix/buildGo/default.nix
@@ -0,0 +1,128 @@
+# Copyright 2019 Google LLC.
+# SPDX-License-Identifier: Apache-2.0
+#
+# buildGo provides Nix functions to build Go packages in the style of Bazel's
+# rules_go.
+
+{ pkgs ? import <nixpkgs> {}
+, ... }:
+
+let
+  inherit (builtins)
+    attrNames
+    baseNameOf
+    dirOf
+    elemAt
+    filter
+    listToAttrs
+    map
+    match
+    readDir
+    replaceStrings
+    toString;
+
+  inherit (pkgs) lib go runCommand fetchFromGitHub protobuf symlinkJoin;
+
+  # Helpers for low-level Go compiler invocations
+  spaceOut = lib.concatStringsSep " ";
+
+  includeDepSrc = dep: "-I ${dep}";
+  includeSources = deps: spaceOut (map includeDepSrc deps);
+
+  includeDepLib = dep: "-L ${dep}";
+  includeLibs = deps: spaceOut (map includeDepLib deps);
+
+  srcBasename = src: elemAt (match "([a-z0-9]{32}\-)?(.*\.go)" (baseNameOf src)) 1;
+  srcCopy = path: src: "cp ${src} $out/${path}/${srcBasename src}";
+  srcList = path: srcs: lib.concatStringsSep "\n" (map (srcCopy path) srcs);
+
+  allDeps = deps: lib.unique (lib.flatten (deps ++ (map (d: d.goDeps) deps)));
+
+  xFlags = x_defs: spaceOut (map (k: "-X ${k}=${x_defs."${k}"}") (attrNames x_defs));
+
+  pathToName = p: replaceStrings ["/"] ["_"] (toString p);
+
+  # Add an `overrideGo` attribute to a function result that works
+  # similar to `overrideAttrs`, but is used specifically for the
+  # arguments passed to Go builders.
+  makeOverridable = f: orig: (f orig) // {
+    overrideGo = new: makeOverridable f (orig // (new orig));
+  };
+
+  # High-level build functions
+
+  # Build a Go program out of the specified files and dependencies.
+  program = { name, srcs, deps ? [], x_defs ? {} }:
+  let uniqueDeps = allDeps deps;
+  in runCommand name {} ''
+    ${go}/bin/go tool compile -o ${name}.a -trimpath=$PWD -trimpath=${go} ${includeSources uniqueDeps} ${spaceOut srcs}
+    mkdir -p $out/bin
+    ${go}/bin/go tool link -o $out/bin/${name} -buildid nix ${xFlags x_defs} ${includeLibs uniqueDeps} ${name}.a
+  '';
+
+  # Build a Go library assembled out of the specified files.
+  #
+  # This outputs both the sources and compiled binary, as both are
+  # needed when downstream packages depend on it.
+  package = { name, srcs, deps ? [], path ? name, sfiles ? [] }:
+  let
+    uniqueDeps = allDeps deps;
+
+    # The build steps below need to be executed conditionally for Go
+    # assembly if the analyser detected any *.s files.
+    #
+    # This is required for several popular packages (e.g. x/sys).
+    ifAsm = do: if sfiles == [] then "" else do;
+    asmBuild = ifAsm ''
+      ${go}/bin/go tool asm -trimpath $PWD -I $PWD -I ${go}/share/go/pkg/include -D GOOS_linux -D GOARCH_amd64 -gensymabis -o ./symabis ${spaceOut sfiles}
+      ${go}/bin/go tool asm -trimpath $PWD -I $PWD -I ${go}/share/go/pkg/include -D GOOS_linux -D GOARCH_amd64 -o ./asm.o ${spaceOut sfiles}
+    '';
+    asmLink = ifAsm "-symabis ./symabis -asmhdr $out/go_asm.h";
+    asmPack = ifAsm ''
+      ${go}/bin/go tool pack r $out/${path}.a ./asm.o
+    '';
+  in (runCommand "golib-${name}" {} ''
+    mkdir -p $out/${path}
+    ${srcList path (map (s: "${s}") srcs)}
+    ${asmBuild}
+    ${go}/bin/go tool compile -pack ${asmLink} -o $out/${path}.a -trimpath=$PWD -trimpath=${go} -p ${path} ${includeSources uniqueDeps} ${spaceOut srcs}
+    ${asmPack}
+  '') // { goDeps = uniqueDeps; goImportPath = path; };
+
+  # Build a tree of Go libraries out of an external Go source
+  # directory that follows the standard Go layout and was not built
+  # with buildGo.nix.
+  #
+  # The derivation for each actual package will reside in an attribute
+  # named "gopkg", and an attribute named "gobin" for binaries.
+  external = import ./external { inherit pkgs program package; };
+
+  # Import support libraries needed for protobuf & gRPC support
+  protoLibs = import ./proto.nix {
+    inherit external;
+  };
+
+  # Build a Go library out of the specified protobuf definition.
+  proto = { name, proto, path ? name, extraDeps ? [] }: (makeOverridable package) {
+    inherit name path;
+    deps = [ protoLibs.goProto.proto.gopkg ] ++ extraDeps;
+    srcs = lib.singleton (runCommand "goproto-${name}.pb.go" {} ''
+      cp ${proto} ${baseNameOf proto}
+      ${protobuf}/bin/protoc --plugin=${protoLibs.goProto.protoc-gen-go.gopkg}/bin/protoc-gen-go \
+        --go_out=plugins=grpc,import_path=${baseNameOf path}:. ${baseNameOf proto}
+      mv *.pb.go $out
+    '');
+  };
+
+  # Build a Go library out of the specified gRPC definition.
+  grpc = args: proto (args // { extraDeps = [ protoLibs.goGrpc.gopkg ]; });
+
+in {
+  # Only the high-level builder functions are exposed, but made
+  # overrideable.
+  program = makeOverridable program;
+  package = makeOverridable package;
+  proto = makeOverridable proto;
+  grpc = makeOverridable grpc;
+  external = makeOverridable external;
+}
diff --git a/nix/buildGo/example/default.nix b/nix/buildGo/example/default.nix
new file mode 100644
index 0000000000..5abed1fbbc
--- /dev/null
+++ b/nix/buildGo/example/default.nix
@@ -0,0 +1,47 @@
+# Copyright 2019 Google LLC.
+# SPDX-License-Identifier: Apache-2.0
+
+# This file provides examples for how to use the various builder
+# functions provided by `buildGo`.
+#
+# The features used in the example are not exhaustive, but should give
+# users a quick introduction to how to use buildGo.
+
+let
+  buildGo = import ../buildGo.nix {};
+
+  # Example use of buildGo.package, which creates an importable Go
+  # package from the specified source files.
+  examplePackage = buildGo.package {
+    name = "example";
+    srcs = [
+      ./lib.go
+    ];
+  };
+
+  # Example use of buildGo.proto, which generates a Go library from a
+  # Protobuf definition file.
+  exampleProto = buildGo.proto {
+    name = "exampleproto";
+    proto = ./thing.proto;
+  };
+
+  # Example use of buildGo.program, which builds an executable using
+  # the specified name and dependencies (which in turn must have been
+  # created via buildGo.package etc.)
+in buildGo.program {
+  name = "example";
+
+  srcs = [
+    ./main.go
+  ];
+
+  deps = [
+    examplePackage
+    exampleProto
+  ];
+
+  x_defs = {
+    "main.Flag" = "successfully";
+  };
+}
diff --git a/nix/buildGo/example/lib.go b/nix/buildGo/example/lib.go
new file mode 100644
index 0000000000..8a61370e99
--- /dev/null
+++ b/nix/buildGo/example/lib.go
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// SPDX-License-Identifier: Apache-2.0
+
+package example
+
+// UUID returns a totally random, carefully chosen UUID
+func UUID() string {
+	return "3640932f-ad40-4bc9-b45d-f504a0f5910a"
+}
diff --git a/nix/buildGo/example/main.go b/nix/buildGo/example/main.go
new file mode 100644
index 0000000000..bbcedbff87
--- /dev/null
+++ b/nix/buildGo/example/main.go
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// SPDX-License-Identifier: Apache-2.0
+//
+// Package main provides a tiny example program for the Bazel-style
+// Nix build system for Go.
+
+package main
+
+import (
+	"example"
+	"exampleproto"
+	"fmt"
+)
+
+var Flag string = "unsuccessfully"
+
+func main() {
+	thing := exampleproto.Thing{
+		Id:          example.UUID(),
+		KindOfThing: "test thing",
+	}
+
+	fmt.Printf("The thing is a %s with ID %q\n", thing.Id, thing.KindOfThing)
+	fmt.Printf("The flag has been %s set\n", Flag)
+}
diff --git a/nix/buildGo/example/thing.proto b/nix/buildGo/example/thing.proto
new file mode 100644
index 0000000000..0cb34124df
--- /dev/null
+++ b/nix/buildGo/example/thing.proto
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// SPDX-License-Identifier: Apache-2.0
+
+syntax = "proto3";
+package exampleProto;
+
+message Thing {
+  string id = 1;
+  string kind_of_thing = 2;
+}
diff --git a/nix/buildGo/external/default.nix b/nix/buildGo/external/default.nix
new file mode 100644
index 0000000000..48f678688e
--- /dev/null
+++ b/nix/buildGo/external/default.nix
@@ -0,0 +1,95 @@
+# Copyright 2019 Google LLC.
+# SPDX-License-Identifier: Apache-2.0
+{ pkgs, program, package }:
+
+let
+  inherit (builtins)
+    elemAt
+    foldl'
+    fromJSON
+    head
+    length
+    listToAttrs
+    readFile
+    replaceStrings
+    tail
+    throw;
+
+  inherit (pkgs) lib runCommand go jq ripgrep;
+
+  pathToName = p: replaceStrings ["/"] ["_"] (toString p);
+
+  # Collect all non-vendored dependencies from the Go standard library
+  # into a file that can be used to filter them out when processing
+  # dependencies.
+  stdlibPackages = runCommand "stdlib-pkgs.json" {} ''
+    export HOME=$PWD
+    export GOPATH=/dev/null
+    ${go}/bin/go list all | \
+      ${ripgrep}/bin/rg -v 'vendor' | \
+      ${jq}/bin/jq -R '.' | \
+      ${jq}/bin/jq -c -s 'map({key: ., value: true}) | from_entries' \
+      > $out
+  '';
+
+  analyser = program {
+    name = "analyser";
+
+    srcs = [
+      ./main.go
+    ];
+
+    x_defs = {
+      "main.stdlibList" = "${stdlibPackages}";
+    };
+  };
+
+  mkset = path: value:
+    if path == [] then { gopkg = value; }
+    else { "${head path}" = mkset (tail path) value; };
+
+  last = l: elemAt l ((length l) - 1);
+
+  toPackage = self: src: path: depMap: entry:
+    let
+      localDeps = map (d: lib.attrByPath (d ++ [ "gopkg" ]) (
+        throw "missing local dependency '${lib.concatStringsSep "." d}' in '${path}'"
+      ) self) entry.localDeps;
+
+      foreignDeps = map (d: lib.attrByPath [ d ] (
+        throw "missing foreign dependency '${d}' in '${path}'"
+      ) depMap) entry.foreignDeps;
+
+      args = {
+        srcs = map (f: src + ("/" + f)) entry.files;
+        deps = localDeps ++ foreignDeps;
+      };
+
+      libArgs = args // {
+        name = pathToName entry.name;
+        path = lib.concatStringsSep "/" ([ path ] ++ entry.locator);
+        sfiles = map (f: src + ("/" + f)) entry.sfiles;
+      };
+
+      binArgs = args // {
+        name = (last ((lib.splitString "/" path) ++ entry.locator));
+      };
+    in if entry.isCommand then (program binArgs) else (package libArgs);
+
+in { src, path, deps ? [] }: let
+  # Build a map of dependencies (from their import paths to their
+  # derivation) so that they can be conditionally imported only in
+  # sub-packages that require them.
+  depMap = listToAttrs (map (d: {
+    name = d.goImportPath;
+    value = d;
+  }) deps);
+
+  name = pathToName path;
+  analysisOutput = runCommand "${name}-structure.json" {} ''
+    ${analyser}/bin/analyser -path ${path} -source ${src} > $out
+  '';
+  analysis = fromJSON (readFile analysisOutput);
+in lib.fix(self: foldl' lib.recursiveUpdate {} (
+  map (entry: mkset entry.locator (toPackage self src path depMap entry)) analysis
+))
diff --git a/nix/buildGo/external/main.go b/nix/buildGo/external/main.go
new file mode 100644
index 0000000000..aa4a813d32
--- /dev/null
+++ b/nix/buildGo/external/main.go
@@ -0,0 +1,186 @@
+// Copyright 2019 Google LLC.
+// SPDX-License-Identifier: Apache-2.0
+
+// This tool analyses external (i.e. not built with `buildGo.nix`) Go
+// packages to determine a build plan that Nix can import.
+package main
+
+import (
+	"encoding/json"
+	"flag"
+	"fmt"
+	"go/build"
+	"io/ioutil"
+	"log"
+	"os"
+	"path"
+	"path/filepath"
+	"strings"
+)
+
+// Path to a JSON file describing all standard library import paths.
+// This file is generated and set here by Nix during the build
+// process.
+var stdlibList string
+
+// pkg describes a single Go package within the specified source
+// directory.
+//
+// Return information includes the local (relative from project root)
+// and external (none-stdlib) dependencies of this package.
+type pkg struct {
+	Name        string     `json:"name"`
+	Locator     []string   `json:"locator"`
+	Files       []string   `json:"files"`
+	SFiles      []string   `json:"sfiles"`
+	LocalDeps   [][]string `json:"localDeps"`
+	ForeignDeps []string   `json:"foreignDeps"`
+	IsCommand   bool       `json:"isCommand"`
+}
+
+// findGoDirs returns a filepath.WalkFunc that identifies all
+// directories that contain Go source code in a certain tree.
+func findGoDirs(at string) ([]string, error) {
+	dirSet := make(map[string]bool)
+
+	err := filepath.Walk(at, func(path string, info os.FileInfo, err error) error {
+		name := info.Name()
+		// Skip folders that are guaranteed to not be relevant
+		if info.IsDir() && (name == "testdata" || name == ".git") {
+			return filepath.SkipDir
+		}
+
+		// If the current file is a Go file, then the directory is popped
+		// (i.e. marked as a Go directory).
+		if !info.IsDir() && strings.HasSuffix(name, ".go") && !strings.HasSuffix(name, "_test.go") {
+			dirSet[filepath.Dir(path)] = true
+		}
+
+		return nil
+	})
+
+	if err != nil {
+		return nil, err
+	}
+
+	goDirs := []string{}
+	for k, _ := range dirSet {
+		goDirs = append(goDirs, k)
+	}
+
+	return goDirs, nil
+}
+
+// analysePackage loads and analyses the imports of a single Go
+// package, returning the data that is required by the Nix code to
+// generate a derivation for this package.
+func analysePackage(root, source, importpath string, stdlib map[string]bool) (pkg, error) {
+	ctx := build.Default
+	ctx.CgoEnabled = false
+
+	p, err := ctx.ImportDir(source, build.IgnoreVendor)
+	if err != nil {
+		return pkg{}, err
+	}
+
+	local := [][]string{}
+	foreign := []string{}
+
+	for _, i := range p.Imports {
+		if stdlib[i] {
+			continue
+		}
+
+		if i == importpath {
+			local = append(local, []string{})
+		} else if strings.HasPrefix(i, importpath) {
+			local = append(local, strings.Split(strings.TrimPrefix(i, importpath+"/"), "/"))
+		} else {
+			foreign = append(foreign, i)
+		}
+	}
+
+	prefix := strings.TrimPrefix(source, root+"/")
+
+	locator := []string{}
+	if len(prefix) != len(source) {
+		locator = strings.Split(prefix, "/")
+	} else {
+		// Otherwise, the locator is empty since its the root package and
+		// no prefix should be added to files.
+		prefix = ""
+	}
+
+	files := []string{}
+	for _, f := range p.GoFiles {
+		files = append(files, path.Join(prefix, f))
+	}
+
+	sfiles := []string{}
+	for _, f := range p.SFiles {
+		sfiles = append(sfiles, path.Join(prefix, f))
+	}
+
+	return pkg{
+		Name:        path.Join(importpath, prefix),
+		Locator:     locator,
+		Files:       files,
+		SFiles:      sfiles,
+		LocalDeps:   local,
+		ForeignDeps: foreign,
+		IsCommand:   p.IsCommand(),
+	}, nil
+}
+
+func loadStdlibPkgs(from string) (pkgs map[string]bool, err error) {
+	f, err := ioutil.ReadFile(from)
+	if err != nil {
+		return
+	}
+
+	err = json.Unmarshal(f, &pkgs)
+	return
+}
+
+func main() {
+	source := flag.String("source", "", "path to directory with sources to process")
+	path := flag.String("path", "", "import path for the package")
+
+	flag.Parse()
+
+	if *source == "" {
+		log.Fatalf("-source flag must be specified")
+	}
+
+	stdlibPkgs, err := loadStdlibPkgs(stdlibList)
+	if err != nil {
+		log.Fatalf("failed to load standard library index from %q: %s\n", stdlibList, err)
+	}
+
+	goDirs, err := findGoDirs(*source)
+	if err != nil {
+		log.Fatalf("failed to walk source directory '%s': %s\n", source, err)
+	}
+
+	all := []pkg{}
+	for _, d := range goDirs {
+		analysed, err := analysePackage(*source, d, *path, stdlibPkgs)
+
+		// If the Go source analysis returned "no buildable Go files",
+		// that directory should be skipped.
+		//
+		// This might be due to `+build` flags on the platform and other
+		// reasons (such as test files).
+		if _, ok := err.(*build.NoGoError); ok {
+			continue
+		}
+
+		if err != nil {
+			log.Fatalf("failed to analyse package at %q: %s", d, err)
+		}
+		all = append(all, analysed)
+	}
+
+	j, _ := json.Marshal(all)
+	fmt.Println(string(j))
+}
diff --git a/nix/buildGo/proto.nix b/nix/buildGo/proto.nix
new file mode 100644
index 0000000000..2ece948ebd
--- /dev/null
+++ b/nix/buildGo/proto.nix
@@ -0,0 +1,84 @@
+# Copyright 2019 Google LLC.
+# SPDX-License-Identifier: Apache-2.0
+#
+# This file provides derivations for the dependencies of a gRPC
+# service in Go.
+
+{ external }:
+
+let
+  inherit (builtins) fetchGit map;
+in rec {
+  goProto = external {
+    path = "github.com/golang/protobuf";
+    src = fetchGit {
+      url = "https://github.com/golang/protobuf";
+      rev = "ed6926b37a637426117ccab59282c3839528a700";
+    };
+  };
+
+  xnet = external {
+    path = "golang.org/x/net";
+
+    src = fetchGit {
+      url = "https://go.googlesource.com/net";
+      rev = "ffdde105785063a81acd95bdf89ea53f6e0aac2d";
+    };
+
+    deps = map (p: p.gopkg) [
+      xtext.secure.bidirule
+      xtext.unicode.bidi
+      xtext.unicode.norm
+    ];
+  };
+
+  xsys = external {
+    path = "golang.org/x/sys";
+    src = fetchGit {
+      url = "https://go.googlesource.com/sys";
+      rev = "bd437916bb0eb726b873ee8e9b2dcf212d32e2fd";
+    };
+  };
+
+  xtext = external {
+    path = "golang.org/x/text";
+    src = fetchGit {
+      url = "https://go.googlesource.com/text";
+      rev = "cbf43d21aaebfdfeb81d91a5f444d13a3046e686";
+    };
+  };
+
+  genproto = external {
+    path = "google.golang.org/genproto";
+    src = fetchGit {
+      url = "https://github.com/google/go-genproto";
+      rev = "83cc0476cb11ea0da33dacd4c6354ab192de6fe6";
+    };
+
+    deps = with goProto; map (p: p.gopkg) [
+      proto
+      ptypes.any
+    ];
+  };
+
+  goGrpc = external {
+    path = "google.golang.org/grpc";
+    deps = map (p: p.gopkg) ([
+      xnet.trace
+      xnet.http2
+      xsys.unix
+      xnet.http2.hpack
+      genproto.googleapis.rpc.status
+    ] ++ (with goProto; [
+      proto
+      ptypes
+      ptypes.duration
+      ptypes.timestamp
+    ]));
+
+    src = fetchGit {
+      url = "https://github.com/grpc/grpc-go";
+      rev = "d8e3da36ac481ef00e510ca119f6b68177713689";
+    };
+  };
+}
diff --git a/nix/buildLisp/README.md b/nix/buildLisp/README.md
new file mode 100644
index 0000000000..513656f570
--- /dev/null
+++ b/nix/buildLisp/README.md
@@ -0,0 +1,21 @@
+buildLisp.nix
+=============
+
+This is a build system for Common Lisp, written in Nix.
+
+The project is in its early stages and currently supports nothing
+other than compiling a bunch of Lisp sources into a combined FASL
+file.
+
+This is what it currently looks like:
+
+```nix
+nix.buildLisp.library {
+  name = "test-lib";
+  srcs = [
+    ./nix/buildLisp/test-lib.lisp
+  ];
+}
+```
+
+Check back here in a few days for more information.
diff --git a/nix/buildLisp/default.nix b/nix/buildLisp/default.nix
new file mode 100644
index 0000000000..66de386631
--- /dev/null
+++ b/nix/buildLisp/default.nix
@@ -0,0 +1,171 @@
+# buildLisp provides Nix functions to build Common Lisp packages,
+# targeting SBCL.
+#
+# buildLisp is designed to enforce conventions and do away with the
+# free-for-all of existing Lisp build systems.
+
+{ pkgs ? { third_party = import <nixpkgs> {}; }
+, ... }:
+
+let
+  inherit (builtins) map elemAt match;
+  inherit (pkgs.third_party) lib runCommandNoCC makeWrapper writeText writeShellScriptBin sbcl;
+
+  #
+  # Internal helper definitions
+  #
+
+  # 'genLoadLisp' generates Lisp code that instructs SBCL to load all
+  # the provided Lisp libraries.
+  genLoadLisp = deps: lib.concatStringsSep "\n"
+    (map (lib: "(load \"${lib}/${lib.lispName}.fasl\")") (allDeps deps));
+
+  # 'genCompileLisp' generates a Lisp file that instructs SBCL to
+  # compile the provided list of Lisp source files to $out.
+  genCompileLisp = srcs: deps: writeText "compile.lisp" ''
+    ;; This file compiles the specified sources into the Nix build
+    ;; directory, creating one FASL file for each source.
+    (require 'sb-posix)
+
+    ${genLoadLisp deps}
+
+    (defun nix-compile-lisp (file srcfile)
+      (let ((outfile (make-pathname :type "fasl"
+                                    :directory (or (sb-posix:getenv "NIX_BUILD_TOP")
+                                                   (error "not running in a Nix build"))
+                                    :defaults srcfile)))
+        (multiple-value-bind (_outfile _warnings-p failure-p)
+            (compile-file srcfile :output-file outfile)
+          (if failure-p (sb-posix:exit 1)
+              (progn
+                ;; For the case of multiple files belonging to the same
+                ;; library being compiled, load them in order:
+                (load outfile)
+
+                ;; Write them to the FASL list in the same order:
+                (format file "cat ~a~%" (namestring outfile)))))))
+
+    (let ((*compile-verbose* t)
+          ;; FASL files are compiled into the working directory of the
+          ;; build and *then* moved to the correct out location.
+          (pwd (sb-posix:getcwd)))
+
+      (with-open-file (file "cat_fasls"
+                            :direction :output
+                            :if-does-not-exist :create)
+
+        ;; These forms were inserted by the Nix build:
+        ${
+          lib.concatStringsSep "\n" (map (src: "(nix-compile-lisp file \"${src}\")") srcs)
+        }
+        ))
+  '';
+
+  # 'dependsOn' determines whether Lisp library 'b' depends on 'a'.
+  dependsOn = a: b: builtins.elem a b.lispDeps;
+
+  # 'allDeps' flattens the list of dependencies (and their
+  # dependencies) into one ordered list of unique deps.
+  allDeps = deps: (lib.toposort dependsOn (lib.unique (
+    lib.flatten (deps ++ (map (d: d.lispDeps) deps))
+  ))).result;
+
+  # 'allNative' extracts all native dependencies of a dependency list
+  # to ensure that library load paths are set correctly during all
+  # compilations and program assembly.
+  allNative = native: deps: lib.unique (
+    lib.flatten (native ++ (map (d: d.lispNativeDeps) deps))
+  );
+
+  # 'genDumpLisp' generates a Lisp file that instructs SBCL to dump
+  # the currently loaded image as an executable to $out/bin/$name.
+  #
+  # TODO(tazjin): Compression is currently unsupported because the
+  # SBCL in nixpkgs is, by default, not compiled with zlib support.
+  genDumpLisp = name: main: deps: writeText "dump.lisp" ''
+    (require 'sb-posix)
+
+    ${genLoadLisp deps}
+
+    (let* ((bindir (concatenate 'string (sb-posix:getenv "out") "/bin"))
+           (outpath (make-pathname :name "${name}"
+                                   :directory bindir)))
+      (save-lisp-and-die outpath
+                         :executable t
+                         :toplevel (function ${main})
+                         :purify t))
+    ;;
+  '';
+
+  # Add an `overrideLisp` attribute to a function result that works
+  # similar to `overrideAttrs`, but is used specifically for the
+  # arguments passed to Lisp builders.
+  makeOverridable = f: orig: (f orig) // {
+    overrideLisp = new: makeOverridable f (orig // (new orig));
+  };
+
+  #
+  # Public API functions
+  #
+
+  # 'library' builds a list of Common Lisp files into a single FASL
+  # which can then be loaded into SBCL.
+  library = { name, srcs, deps ? [], native ? [] }:
+  let
+    lispNativeDeps = (allNative native deps);
+    lispDeps = allDeps deps;
+  in runCommandNoCC "${name}-cllib" {
+    LD_LIBRARY_PATH = lib.makeLibraryPath lispNativeDeps;
+  } ''
+    ${sbcl}/bin/sbcl --script ${genCompileLisp srcs lispDeps}
+
+    echo "Compilation finished, assembling FASL files"
+
+    # FASL files can be combined by simply concatenating them
+    # together, but it needs to be in the compilation order.
+    mkdir $out
+
+    chmod +x cat_fasls
+    ./cat_fasls > $out/${name}.fasl
+  '' // {
+    inherit lispNativeDeps lispDeps;
+    lispName = name;
+  };
+
+  # 'program' creates an executable containing a dumped image of the
+  # specified sources and dependencies.
+  program = { name, main ? "${name}:main", srcs, deps ? [], native ? [] }:
+  let
+    lispDeps = allDeps deps;
+    libPath = lib.makeLibraryPath (allNative native lispDeps);
+    selfLib = library {
+      inherit name srcs native;
+      deps = lispDeps;
+    };
+  in runCommandNoCC "${name}" {
+    nativeBuildInputs = [ makeWrapper ];
+    LD_LIBRARY_PATH = libPath;
+  } ''
+    mkdir -p $out/bin
+
+    ${sbcl}/bin/sbcl --script ${
+      genDumpLisp name main ([ selfLib ] ++ lispDeps)
+    }
+
+    wrapProgram $out/bin/${name} --prefix LD_LIBRARY_PATH : "${libPath}"
+  '';
+
+  # 'sbclWith' creates an image with the specified libraries /
+  # programs loaded.
+  sbclWith = deps: let lispDeps = allDeps deps; in writeShellScriptBin "sbcl" ''
+    export LD_LIBRARY_PATH=${lib.makeLibraryPath (allNative [] lispDeps)};
+    exec ${sbcl}/bin/sbcl ${
+      if deps == [] then ""
+      else "--load ${writeText "load.lisp" (genLoadLisp lispDeps)}"
+    } $@
+  '';
+in {
+  library = makeOverridable library;
+  program = makeOverridable program;
+  sbclWith = makeOverridable sbclWith;
+}
diff --git a/nix/buildLisp/example/default.nix b/nix/buildLisp/example/default.nix
new file mode 100644
index 0000000000..4a8cba6002
--- /dev/null
+++ b/nix/buildLisp/example/default.nix
@@ -0,0 +1,32 @@
+{ pkgs, ... }:
+
+let
+  inherit (pkgs.nix) buildLisp;
+
+  # Example Lisp library.
+  #
+  # Currently the `name` attribute is only used for the derivation
+  # itself, it has no practical implications.
+  libExample = buildLisp.library {
+    name = "lib-example";
+    srcs = [
+      ./lib.lisp
+    ];
+  };
+
+# Example Lisp program.
+#
+# This builds & writes an executable for a program using the library
+# above to disk.
+#
+# By default, buildLisp.program expects the entry point to be
+# `$name:main`. This can be overridden by configuring the `main`
+# attribute.
+in buildLisp.program {
+  name = "example";
+  deps = [ libExample ];
+
+  srcs = [
+    ./main.lisp
+  ];
+}
diff --git a/nix/buildLisp/example/lib.lisp b/nix/buildLisp/example/lib.lisp
new file mode 100644
index 0000000000..e557de4ae5
--- /dev/null
+++ b/nix/buildLisp/example/lib.lisp
@@ -0,0 +1,6 @@
+(defpackage lib-example
+  (:use :cl)
+  (:export :who))
+(in-package :lib-example)
+
+(defun who () "edef")
diff --git a/nix/buildLisp/example/main.lisp b/nix/buildLisp/example/main.lisp
new file mode 100644
index 0000000000..a29390cf4d
--- /dev/null
+++ b/nix/buildLisp/example/main.lisp
@@ -0,0 +1,7 @@
+(defpackage example
+  (:use :cl :lib-example)
+  (:export :main))
+(in-package :example)
+
+(defun main ()
+  (format t "i <3 ~A~%" (who)))
diff --git a/nix/readTree/README.md b/nix/readTree/README.md
new file mode 100644
index 0000000000..c93cf2bfdd
--- /dev/null
+++ b/nix/readTree/README.md
@@ -0,0 +1,81 @@
+readTree
+========
+
+This is a Nix program that builds up an attribute set tree for a large
+repository based on the filesystem layout.
+
+It is in fact the tool that lays out the attribute set of this repository.
+
+As an example, consider a root (`.`) of a repository and a layout such as:
+
+```
+.
+├── third_party
+│   ├── default.nix
+│   └── rustpkgs
+│       ├── aho-corasick.nix
+│       └── serde.nix
+└── tools
+    ├── cheddar
+    │   └── default.nix
+    └── roquefort.nix
+```
+
+When `readTree` is called on that tree, it will construct an attribute set with
+this shape:
+
+```nix
+{
+    tools = {
+        cheddar = ...;
+        roquefort = ...;
+    };
+
+    third_party = {
+        # the `default.nix` of this folder might have had arbitrary other
+        # attributes here, such as this:
+        favouriteColour = "orange";
+
+        rustpkgs = {
+            aho-corasick = ...;
+            serde = ...;
+        };
+    };
+}
+```
+
+Every imported Nix file that yields an attribute set will have a `__readTree =
+true;` attribute merged into it.
+
+## Traversal logic
+
+`readTree` will follow any subdirectories of a tree and import all Nix files,
+with some exceptions:
+
+* A folder can declare that its children are off-limit by containing a
+  `.skip-subtree` file. Since the content of the file is not checked, it can be
+  useful to leave a note for a human in the file.
+* If a folder contains a `default.nix` file, no *sibling* Nix files will be
+  imported - however children are traversed as normal.
+* If a folder contains a `default.nix` it is loaded and, if it evaluates to a
+  set, *merged* with the children. If it evaluates to anything else the children
+  are *not traversed*.
+
+Traversal is lazy, `readTree` will only build up the tree as requested. This
+currently has the downside that directories with no importable files end up in
+the tree as empty nodes (`{}`).
+
+## Import structure
+
+`readTree` is called with two parameters: The arguments to pass to all imports,
+and the initial path at which to start the traversal.
+
+The package headers in this repository follow the form `{ pkgs, ... }:` where
+`pkgs` is a fixed-point of the entire package tree (see the `default.nix` at the
+root of the depot).
+
+In theory `readTree` can pass arguments of different shapes, but I have found
+this to be a good solution for the most part.
+
+Note that `readTree` does not currently make functions overridable, though it is
+feasible that it could do that in the future.
diff --git a/nix/readTree/default.nix b/nix/readTree/default.nix
new file mode 100644
index 0000000000..c48928ee19
--- /dev/null
+++ b/nix/readTree/default.nix
@@ -0,0 +1,63 @@
+{ ... }:
+
+args: initPath:
+
+let
+  inherit (builtins)
+    attrNames
+    baseNameOf
+    filter
+    hasAttr
+    head
+    length
+    listToAttrs
+    map
+    match
+    isAttrs
+    readDir;
+
+  argsWithPath = parts: args // {
+    locatedAt = parts;
+  };
+
+  # The marker is added to every set that was imported directly by
+  # readTree.
+  importWithMark = path: parts:
+    let imported = import path (argsWithPath parts);
+    in if (isAttrs imported)
+      then imported // { __readTree = true; }
+      else imported;
+
+  nixFileName = file:
+    let res = match "(.*)\.nix" file;
+    in if res == null then null else head res;
+
+  readTree = path: parts:
+    let
+      dir = readDir path;
+      self = importWithMark path parts;
+      joinChild = c: path + ("/" + c);
+
+      # Import subdirectories of the current one, unless the special
+      # `.skip-subtree` file exists which makes readTree ignore the
+      # children.
+      #
+      # This file can optionally contain information on why the tree
+      # should be ignored, but its content is not inspected by
+      # readTree
+      filterDir = f: dir."${f}" == "directory";
+      children = if hasAttr ".skip-subtree" dir then [] else map (c: {
+        name = c;
+        value = readTree (joinChild c) (parts ++ [ c ]);
+      }) (filter filterDir (attrNames dir));
+
+      # Import Nix files
+      nixFiles = filter (f: f != null) (map nixFileName (attrNames dir));
+      nixChildren = map (c: let p = joinChild (c + ".nix"); in {
+        name = c;
+        value = importWithMark p (parts ++ [ c ]);
+      }) nixFiles;
+    in if dir ? "default.nix"
+      then (if isAttrs self then self // (listToAttrs children) else self)
+      else listToAttrs (nixChildren ++ children);
+in readTree initPath [ (baseNameOf initPath) ]
diff --git a/nix/yants/README.md b/nix/yants/README.md
new file mode 100644
index 0000000000..5d551e5a49
--- /dev/null
+++ b/nix/yants/README.md
@@ -0,0 +1,84 @@
+yants
+=====
+
+This is a tiny type-checker for data in Nix, written in Nix.
+
+# Features
+
+* Checking of primitive types (`int`, `string` etc.)
+* Checking polymorphic types (`option`, `list`, `either`)
+* Defining & checking struct/record types
+* Defining & matching enum types
+* Defining & matching sum types
+* Defining function signatures (including curried functions)
+* Types are composable! `option string`! `list (either int (option float))`!
+* Type errors also compose!
+
+Currently lacking:
+
+* Any kind of inference
+* Convenient syntax for attribute-set function signatures
+
+## Primitives & simple polymorphism
+
+![simple](screenshots/simple.png)
+
+## Structs
+
+![structs](screenshots/structs.png)
+
+## Nested structs!
+
+![nested structs](screenshots/nested-structs.png)
+
+## Enums!
+
+![enums](screenshots/enums.png)
+
+## Functions!
+
+![functions](screenshots/functions.png)
+
+# Usage
+
+Yants can be imported from its `default.nix`. A single attribute (`lib`) can be
+passed, which will otherwise be imported from `<nixpkgs>`.
+
+Examples for the most common import methods would be:
+
+1. Import into scope with `with`:
+    ```nix
+    with (import ./default.nix {});
+    # ... Nix code that uses yants ...
+    ```
+
+2. Import as a named variable:
+    ```nix
+    let yants = import ./default.nix {};
+    in yants.string "foo" # or other uses ...
+    ````
+
+3. Overlay into `pkgs.lib`:
+    ```nix
+    # wherever you import your package set (e.g. from <nixpkgs>):
+    import <nixpkgs> {
+      overlays = [
+        (self: super: {
+          lib = super.lib // { yants = import ./default.nix { inherit (super) lib; }; };
+        })
+      ];
+    }
+
+    # yants now lives at lib.yants, besides the other library functions!
+    ```
+
+Please see my [Nix one-pager](https://github.com/tazjin/nix-1p) for more generic
+information about the Nix language and what the above constructs mean.
+
+# Stability
+
+The current API of Yants is **not yet** considered stable, but it works fine and
+should continue to do so even if used at an older version.
+
+Yants' tests use Nix versions above 2.2 - compatibility with older versions is
+not guaranteed.
diff --git a/nix/yants/default.nix b/nix/yants/default.nix
new file mode 100644
index 0000000000..aacc156b43
--- /dev/null
+++ b/nix/yants/default.nix
@@ -0,0 +1,298 @@
+# Copyright 2019 Google LLC
+# SPDX-License-Identifier: Apache-2.0
+#
+# Provides a "type-system" for Nix that provides various primitive &
+# polymorphic types as well as the ability to define & check records.
+#
+# All types (should) compose as expected.
+
+{ lib ?  (import <nixpkgs> {}).lib, ... }:
+
+with builtins; let
+  prettyPrint = lib.generators.toPretty {};
+
+  # typedef' :: struct {
+  #   name = string;
+  #   checkType = function; (a -> result)
+  #   checkToBool = option function; (result -> bool)
+  #   toError = option function; (a -> result -> string)
+  #   def = option any;
+  #   match = option function;
+  # } -> type
+  #           -> (a -> b)
+  #           -> (b -> bool)
+  #           -> (a -> b -> string)
+  #           -> type
+  #
+  # This function creates an attribute set that acts as a type.
+  #
+  # It receives a type name, a function that is used to perform a
+  # check on an arbitrary value, a function that can translate the
+  # return of that check to a boolean that informs whether the value
+  # is type-conformant, and a function that can construct error
+  # messages from the check result.
+  #
+  # This function is the low-level primitive used to create types. For
+  # many cases the higher-level 'typedef' function is more appropriate.
+  typedef' = { name, checkType
+             , checkToBool ? (result: result.ok)
+             , toError ? (_: result: result.err)
+             , def ? null
+             , match ? null }: {
+    inherit name checkToBool toError;
+
+    # check :: a -> bool
+    #
+    # This function is used to determine whether a given type is
+    # conformant.
+    check = value: checkToBool (checkType value);
+
+    # checkType :: a -> struct { ok = bool; err = option string; }
+    #
+    # This function checks whether the passed value is type conformant
+    # and returns an optional type error string otherwise.
+    inherit checkType;
+
+    # __functor :: a -> a
+    #
+    # This function checks whether the passed value is type conformant
+    # and throws an error if it is not.
+    #
+    # The name of this function is a special attribute in Nix that
+    # makes it possible to execute a type attribute set like a normal
+    # function.
+    __functor = self: value:
+    let result = self.checkType value;
+    in if checkToBool result then value
+       else throw (toError value result);
+  };
+
+  typeError = type: val:
+  "expected type '${type}', but value '${prettyPrint val}' is of type '${typeOf val}'";
+
+  # typedef :: string -> (a -> bool) -> type
+  #
+  # typedef is the simplified version of typedef' which uses a default
+  # error message constructor.
+  typedef = name: check: typedef' {
+    inherit name;
+    checkType = check;
+    checkToBool = r: r;
+    toError = value: _result: typeError name value;
+  };
+
+  checkEach = name: t: l: foldl' (acc: e:
+    let res = t.checkType e;
+        isT = t.checkToBool res;
+    in {
+      ok = acc.ok && isT;
+      err = if isT
+        then acc.err
+        else acc.err + "${prettyPrint e}: ${t.toError e res}\n";
+    }) { ok = true; err = "expected type ${name}, but found:\n"; } l;
+in lib.fix (self: {
+  # Primitive types
+  any      = typedef "any" (_: true);
+  int      = typedef "int" isInt;
+  bool     = typedef "bool" isBool;
+  float    = typedef "float" isFloat;
+  string   = typedef "string" isString;
+  path     = typedef "path" (x: typeOf x == "path");
+  drv      = typedef "derivation" (x: isAttrs x && x ? "type" && x.type == "derivation");
+  function = typedef "function" (x: isFunction x || (isAttrs x && x ? "__functor"
+                                                 && isFunction x.__functor));
+
+  # Type for types themselves. Useful when defining polymorphic types.
+  type = typedef "type" (x:
+    isAttrs x
+    && hasAttr "name" x && self.string.check x.name
+    && hasAttr "checkType" x && self.function.check x.checkType
+    && hasAttr "checkToBool" x && self.function.check x.checkToBool
+    && hasAttr "toError" x && self.function.check x.toError
+  );
+
+  # Polymorphic types
+  option = t: typedef' rec {
+    name = "option<${t.name}>";
+    checkType = v:
+      let res = t.checkType v;
+      in {
+        ok = isNull v || (self.type t).checkToBool res;
+        err = "expected type ${name}, but value does not conform to '${t.name}': "
+         + t.toError v res;
+      };
+  };
+
+  eitherN = tn: typedef "either<${concatStringsSep ", " (map (x: x.name) tn)}>"
+    (x: any (t: (self.type t).check x) tn);
+
+  either = t1: t2: self.eitherN [ t1 t2 ];
+
+  list = t: typedef' rec {
+    name = "list<${t.name}>";
+
+    checkType = v: if isList v
+      then checkEach name (self.type t) v
+      else {
+        ok = false;
+        err = typeError name v;
+      };
+  };
+
+  attrs = t: typedef' rec {
+    name = "attrs<${t.name}>";
+
+    checkType = v: if isAttrs v
+      then checkEach name (self.type t) (attrValues v)
+      else {
+        ok = false;
+        err = typeError name v;
+      };
+  };
+
+  # Structs / record types
+  #
+  # Checks that all fields match their declared types, no optional
+  # fields are missing and no unexpected fields occur in the struct.
+  #
+  # Anonymous structs are supported (e.g. for nesting) by omitting the
+  # name.
+  #
+  # TODO: Support open records?
+  struct =
+    # Struct checking is more involved than the simpler types above.
+    # To make the actual type definition more readable, several
+    # helpers are defined below.
+    let
+      # checkField checks an individual field of the struct against
+      # its definition and creates a typecheck result. These results
+      # are aggregated during the actual checking.
+      checkField = def: name: value: let result = def.checkType value; in rec {
+        ok = def.checkToBool result;
+        err = if !ok && isNull value
+          then "missing required ${def.name} field '${name}'\n"
+          else "field '${name}': ${def.toError value result}\n";
+      };
+
+      # checkExtraneous determines whether a (closed) struct contains
+      # any fields that are not part of the definition.
+      checkExtraneous = def: has: acc:
+        if (length has) == 0 then acc
+        else if (hasAttr (head has) def)
+          then checkExtraneous def (tail has) acc
+          else checkExtraneous def (tail has) {
+            ok = false;
+            err = acc.err + "unexpected struct field '${head has}'\n";
+          };
+
+      # checkStruct combines all structure checks and creates one
+      # typecheck result from them
+      checkStruct = def: value:
+        let
+          init = { ok = true; err = ""; };
+          extraneous = checkExtraneous def (attrNames value) init;
+
+          checkedFields = map (n:
+            let v = if hasAttr n value then value."${n}" else null;
+            in checkField def."${n}" n v) (attrNames def);
+
+          combined = foldl' (acc: res: {
+            ok = acc.ok && res.ok;
+            err = if !res.ok then acc.err + res.err else acc.err;
+          }) init checkedFields;
+        in {
+          ok = combined.ok && extraneous.ok;
+          err = combined.err + extraneous.err;
+        };
+
+      struct' = name: def: typedef' {
+        inherit name def;
+        checkType = value: if isAttrs value
+          then (checkStruct (self.attrs self.type def) value)
+          else { ok = false; err = typeError name value; };
+
+          toError = _: result: "expected '${name}'-struct, but found:\n" + result.err;
+      };
+    in arg: if isString arg then (struct' arg) else (struct' "anon" arg);
+
+  # Enums & pattern matching
+  enum =
+  let
+    plain = name: def: typedef' {
+      inherit name def;
+
+      checkType = (x: isString x && elem x def);
+      checkToBool = x: x;
+      toError = value: _: "'${prettyPrint value} is not a member of enum ${name}";
+    };
+    enum' = name: def: lib.fix (e: (plain name def) // {
+      match = x: actions: deepSeq (map e (attrNames actions)) (
+      let
+        actionKeys = attrNames actions;
+        missing = foldl' (m: k: if (elem k actionKeys) then m else m ++ [ k ]) [] def;
+      in if (length missing) > 0
+        then throw "Missing match action for members: ${prettyPrint missing}"
+        else actions."${e x}");
+    });
+  in arg: if isString arg then (enum' arg) else (enum' "anon" arg);
+
+  # Sum types
+  #
+  # The representation of a sum type is an attribute set with only one
+  # value, where the key of the value denotes the variant of the type.
+  sum =
+  let
+    plain = name: def: typedef' {
+      inherit name def;
+      checkType = (x:
+        let variant = elemAt (attrNames x) 0;
+        in if isAttrs x && length (attrNames x) == 1 && hasAttr variant def
+          then let t = def."${variant}";
+                   v = x."${variant}";
+                   res = t.checkType v;
+               in if t.checkToBool res
+                  then { ok = true; }
+                  else {
+                    ok = false;
+                    err = "while checking '${name}' variant '${variant}': "
+                          + t.toError v res;
+                  }
+          else { ok = false; err = typeError name x; }
+      );
+    };
+    sum' = name: def: lib.fix (s: (plain name def) // {
+    match = x: actions:
+    let variant = deepSeq (s x) (elemAt (attrNames x) 0);
+        actionKeys = attrNames actions;
+        defKeys = attrNames def;
+        missing = foldl' (m: k: if (elem k actionKeys) then m else m ++ [ k ]) [] defKeys;
+    in if (length missing) > 0
+      then throw "Missing match action for variants: ${prettyPrint missing}"
+      else actions."${variant}" x."${variant}";
+    });
+    in arg: if isString arg then (sum' arg) else (sum' "anon" arg);
+
+  # Typed function definitions
+  #
+  # These definitions wrap the supplied function in type-checking
+  # forms that are evaluated when the function is called.
+  #
+  # Note that typed functions themselves are not types and can not be
+  # used to check values for conformity.
+  defun =
+    let
+      mkFunc = sig: f: {
+        inherit sig;
+        __toString = self: foldl' (s: t: "${s} -> ${t.name}")
+                                  "λ :: ${(head self.sig).name}" (tail self.sig);
+        __functor = _: f;
+      };
+
+      defun' = sig: func: if length sig > 2
+        then mkFunc sig (x: defun' (tail sig) (func ((head sig) x)))
+        else mkFunc sig (x: ((head (tail sig)) (func ((head sig) x))));
+
+    in sig: func: if length sig < 2
+      then (throw "Signature must at least have two types (a -> b)")
+      else defun' sig func;
+})
diff --git a/nix/yants/screenshots/enums.png b/nix/yants/screenshots/enums.png
new file mode 100644
index 0000000000..71673e7ab6
--- /dev/null
+++ b/nix/yants/screenshots/enums.png
Binary files differdiff --git a/nix/yants/screenshots/functions.png b/nix/yants/screenshots/functions.png
new file mode 100644
index 0000000000..30ed50f832
--- /dev/null
+++ b/nix/yants/screenshots/functions.png
Binary files differdiff --git a/nix/yants/screenshots/nested-structs.png b/nix/yants/screenshots/nested-structs.png
new file mode 100644
index 0000000000..6b03ed65ce
--- /dev/null
+++ b/nix/yants/screenshots/nested-structs.png
Binary files differdiff --git a/nix/yants/screenshots/simple.png b/nix/yants/screenshots/simple.png
new file mode 100644
index 0000000000..05a302cc6b
--- /dev/null
+++ b/nix/yants/screenshots/simple.png
Binary files differdiff --git a/nix/yants/screenshots/structs.png b/nix/yants/screenshots/structs.png
new file mode 100644
index 0000000000..fcbcf6415f
--- /dev/null
+++ b/nix/yants/screenshots/structs.png
Binary files differdiff --git a/nix/yants/tests/default.nix b/nix/yants/tests/default.nix
new file mode 100644
index 0000000000..ae144db45a
--- /dev/null
+++ b/nix/yants/tests/default.nix
@@ -0,0 +1,94 @@
+{ pkgs, ... }:
+
+with builtins;
+with pkgs.nix.yants;
+
+# Note: Derivations are not included in the tests below as they cause
+# issues with deepSeq.
+
+deepSeq rec {
+  # Test that all primitive types match
+  primitives = [
+    (int 15)
+    (bool false)
+    (float 13.37)
+    (string "Hello!")
+    (function (x: x * 2))
+    (path /nix)
+  ];
+
+  # Test that polymorphic types work as intended
+  poly = [
+    (option int null)
+    (list string [ "foo" "bar" ])
+    (either int float 42)
+  ];
+
+  # Test that structures work as planned.
+  person = struct "person" {
+    name = string;
+    age  = int;
+
+    contact = option (struct {
+      email = string;
+      phone = option string;
+    });
+  };
+
+  testPerson = person {
+    name = "Brynhjulf";
+    age  = 42;
+    contact.email = "brynhjulf@yants.nix";
+  };
+
+  # Test enum definitions & matching
+  colour = enum "colour" [ "red" "blue" "green" ];
+  testMatch = colour.match "red" {
+    red = "It is in fact red!";
+    blue = throw "It should not be blue!";
+    green = throw "It should not be green!";
+  };
+
+  # Test sum type definitions
+  creature = sum "creature" {
+    human = struct {
+      name = string;
+      age = option int;
+    };
+
+    pet = enum "pet" [ "dog" "lizard" "cat" ];
+  };
+
+  testSum = creature {
+    human = {
+      name = "Brynhjulf";
+      age = 42;
+    };
+  };
+
+  testSumMatch = creature.match testSum {
+    human = v: "It's a human named ${v.name}";
+    pet = v: throw "It's not supposed to be a pet!";
+  };
+
+  # Test curried function definitions
+  func = defun [ string int string ]
+  (name: age: "${name} is ${toString age} years old");
+
+  testFunc = func "Brynhjulf" 42;
+
+  # Test that all types are types.
+  testTypes = map type [
+    any bool drv float int string path
+
+    (attrs int)
+    (eitherN [ int string bool ])
+    (either int string)
+    (enum [ "foo" "bar" ])
+    (list string)
+    (option int)
+    (option (list string))
+    (struct { a = int; b = option string; })
+    (sum { a = int; b = option string; })
+  ];
+} (pkgs.writeText "yants-tests" "All tests passed!")
diff --git a/ops/infra/.skip-subtree b/ops/infra/.skip-subtree
new file mode 100644
index 0000000000..cee24b7579
--- /dev/null
+++ b/ops/infra/.skip-subtree
@@ -0,0 +1,2 @@
+Code under //ops/infra is mostly configuration for other tools, not
+Nix derivations to be built.
diff --git a/ops/infra/dns/import b/ops/infra/dns/import
new file mode 100755
index 0000000000..e79e426b55
--- /dev/null
+++ b/ops/infra/dns/import
@@ -0,0 +1,11 @@
+#!/bin/sh
+set -ue
+
+# Imports a zone file into a Google Cloud DNS zone of the same name
+readonly ZONE="${1}"
+
+gcloud dns record-sets import "${ZONE}" \
+       --project composite-watch-759 \
+       --zone-file-format \
+       --delete-all-existing \
+       --zone "${ZONE}"
diff --git a/ops/infra/dns/kontemplate-works b/ops/infra/dns/kontemplate-works
new file mode 100644
index 0000000000..326a129d21
--- /dev/null
+++ b/ops/infra/dns/kontemplate-works
@@ -0,0 +1,15 @@
+;;  -*- mode: zone; -*-
+;; Do not delete these
+kontemplate.works. 21600 IN NS ns-cloud-d1.googledomains.com.
+kontemplate.works. 21600 IN NS ns-cloud-d2.googledomains.com.
+kontemplate.works. 21600 IN NS ns-cloud-d3.googledomains.com.
+kontemplate.works. 21600 IN NS ns-cloud-d4.googledomains.com.
+kontemplate.works. 21600 IN SOA ns-cloud-d1.googledomains.com. cloud-dns-hostmaster.google.com. 4 21600 3600 259200 300
+
+;; Github site setup
+kontemplate.works. 60 IN A 185.199.108.153
+kontemplate.works. 60 IN A 185.199.109.153
+kontemplate.works. 60 IN A 185.199.110.153
+kontemplate.works. 60 IN A 185.199.111.153
+
+www.kontemplate.works. 60 IN CNAME tazjin.github.io.
diff --git a/ops/infra/dns/oslo-pub b/ops/infra/dns/oslo-pub
new file mode 100644
index 0000000000..674687484b
--- /dev/null
+++ b/ops/infra/dns/oslo-pub
@@ -0,0 +1,8 @@
+;; Do not delete these
+oslo.pub. 21600 IN NS ns-cloud-c1.googledomains.com.
+oslo.pub. 21600 IN NS ns-cloud-c2.googledomains.com.
+oslo.pub. 21600 IN NS ns-cloud-c3.googledomains.com.
+oslo.pub. 21600 IN NS ns-cloud-c4.googledomains.com.
+oslo.pub. 21600 IN SOA ns-cloud-c1.googledomains.com. cloud-dns-hostmaster.google.com. 4 21600 3600 1209600 300
+
+oslo.pub. 60 IN A 46.21.106.241
diff --git a/ops/infra/dns/root-tazj-in b/ops/infra/dns/root-tazj-in
new file mode 100644
index 0000000000..43db5834a0
--- /dev/null
+++ b/ops/infra/dns/root-tazj-in
@@ -0,0 +1,33 @@
+;; -*- mode: zone; -*-
+;; Do not delete these
+tazj.in. 21600 IN NS ns-cloud-a1.googledomains.com.
+tazj.in. 21600 IN NS ns-cloud-a2.googledomains.com.
+tazj.in. 21600 IN NS ns-cloud-a3.googledomains.com.
+tazj.in. 21600 IN NS ns-cloud-a4.googledomains.com.
+tazj.in. 21600 IN SOA ns-cloud-a1.googledomains.com. cloud-dns-hostmaster.google.com. 123 21600 3600 1209600 300
+
+;; Email setup
+tazj.in. 300 IN MX 1 aspmx.l.google.com.
+tazj.in. 300 IN MX 5 alt1.aspmx.l.google.com.
+tazj.in. 300 IN MX 5 alt2.aspmx.l.google.com.
+tazj.in. 300 IN MX 10 alt3.aspmx.l.google.com.
+tazj.in. 300 IN MX 10 alt4.aspmx.l.google.com.
+tazj.in. 300 IN TXT "v=spf1 include:_spf.google.com ~all"
+google._domainkey.tazj.in. 21600 IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9AphX/WJf8zVXQB5Jk0Ry1MI6ARa6vEyAoJtpjpt9Nbm7XU4qVWFRJm+L0VFd5EZ5YDPJTIZ90lJE3/B8vae2ipnoGbJbj8LaVSzzIPMbWmhPhX3fkLJFdkv7xRDMDn730iYXRlfkgv6GsqbS8vZt7mzxx4mpnePTI323yjRVkwRW8nGVbsmB25ZoG1/0985" "kg4mSYxzWeJ2ozCPFhT4sfMtZMXe/4QEkJz/zkod29KZfFJmLgEaf73WLdBX8kdwbhuh2PYXt/PwzUrRzF5ujVCsSaTZwdRVPErcf+yo4NvedelTjjs8rFVfoJiaDD1q2bQ3w0gDEBWPdC2VP7k9zwIDAQAB"
+
+;; Site verifications
+tazj.in. 3600 IN TXT "keybase-site-verification=gC4kzEmnLzY7F669PjN-pw2Cf__xHqcxQ08Gb-W9dhE"
+tazj.in. 300 IN TXT "google-site-verification=d3_MI1OwD6q2OT42Vvh0I9w2u3Q5KFBu-PieNUE1Fig"
+www.tazj.in. 3600 IN TXT "keybase-site-verification=ER8m_byyqAhzeIy9TyzkAU1H2p2yHtpvImuB_XrRF2U"
+
+;; Blog "storage engine"
+blog.tazj.in. 21600 IN NS ns-cloud-c1.googledomains.com.
+blog.tazj.in. 21600 IN NS ns-cloud-c2.googledomains.com.
+blog.tazj.in. 21600 IN NS ns-cloud-c3.googledomains.com.
+blog.tazj.in. 21600 IN NS ns-cloud-c4.googledomains.com.
+
+;; Webpage records setup
+tazj.in.       300 IN A 34.98.120.189
+www.tazj.in.   300 IN A 34.98.120.189
+git.tazj.in.   300 IN A 34.98.120.189
+files.tazj.in. 300 IN CNAME c.storage.googleapis.com.
diff --git a/ops/infra/gcp/.gitignore b/ops/infra/gcp/.gitignore
new file mode 100644
index 0000000000..96c7538dda
--- /dev/null
+++ b/ops/infra/gcp/.gitignore
@@ -0,0 +1,3 @@
+.terraform
+*.tfstate
+*.tfstate.backup
diff --git a/ops/infra/gcp/default.tf b/ops/infra/gcp/default.tf
new file mode 100644
index 0000000000..2cb57836fa
--- /dev/null
+++ b/ops/infra/gcp/default.tf
@@ -0,0 +1,111 @@
+# Terraform configuration for the GCP project 'tazjins-infrastructure'
+
+provider "google" {
+  project = "tazjins-infrastructure"
+  region  = "europe-north1"
+}
+
+# Configure a storage bucket in which to keep Terraform state and
+# other data, such as Nixery's layers.
+resource "google_storage_bucket" "tazjins-data" {
+  name     = "tazjins-data"
+  location = "EU"
+}
+
+terraform {
+  backend "gcs" {
+    bucket = "tazjins-data"
+    prefix = "terraform"
+  }
+}
+
+# Configure enabled APIs
+resource "google_project_services" "primary" {
+  project = "tazjins-infrastructure"
+  services = [
+    "bigquery-json.googleapis.com",
+    "bigquerystorage.googleapis.com",
+    "cloudapis.googleapis.com",
+    "clouddebugger.googleapis.com",
+    "cloudfunctions.googleapis.com",
+    "cloudkms.googleapis.com",
+    "cloudtrace.googleapis.com",
+    "compute.googleapis.com",
+    "container.googleapis.com",
+    "containerregistry.googleapis.com",
+    "datastore.googleapis.com",
+    "dns.googleapis.com",
+    "iam.googleapis.com",
+    "iamcredentials.googleapis.com",
+    "logging.googleapis.com",
+    "monitoring.googleapis.com",
+    "oslogin.googleapis.com",
+    "pubsub.googleapis.com",
+    "run.googleapis.com",
+    "servicemanagement.googleapis.com",
+    "serviceusage.googleapis.com",
+    "sourcerepo.googleapis.com",
+    "sql-component.googleapis.com",
+    "storage-api.googleapis.com",
+    "storage-component.googleapis.com",
+  ]
+}
+
+
+# Configure the main Kubernetes cluster in which services are deployed
+resource "google_container_cluster" "primary" {
+  name     = "tazjin-cluster"
+  location = "europe-north1"
+
+  remove_default_node_pool = true
+  initial_node_count       = 1
+}
+
+resource "google_container_node_pool" "primary_nodes" {
+  name       = "primary-nodes"
+  location   = "europe-north1"
+  cluster    = google_container_cluster.primary.name
+  node_count = 1
+
+  node_config {
+    preemptible  = true
+    machine_type = "n1-standard-2"
+
+    oauth_scopes = [
+      "storage-rw",
+      "logging-write",
+      "monitoring",
+      "https://www.googleapis.com/auth/source.read_only",
+    ]
+  }
+}
+
+# Configure a service account for which GCS URL signing keys can be created.
+resource "google_service_account" "nixery" {
+  account_id   = "nixery"
+  display_name = "Nixery service account"
+}
+
+# Configure Cloud KMS for secret encryption
+resource "google_kms_key_ring" "tazjins_keys" {
+  name     = "tazjins-keys"
+  location = "europe-north1"
+
+  lifecycle {
+    prevent_destroy = true
+  }
+}
+
+resource "google_kms_crypto_key" "kontemplate_key" {
+  name     = "kontemplate-key"
+  key_ring = google_kms_key_ring.tazjins_keys.id
+
+  lifecycle {
+    prevent_destroy = true
+  }
+}
+
+# Configure the git repository that contains everything.
+resource "google_sourcerepo_repository" "depot" {
+  name = "depot"
+}
diff --git a/ops/infra/kubernetes/cgit/config.yaml b/ops/infra/kubernetes/cgit/config.yaml
new file mode 100644
index 0000000000..43bfe9d7fb
--- /dev/null
+++ b/ops/infra/kubernetes/cgit/config.yaml
@@ -0,0 +1,73 @@
+---
+apiVersion: v1
+kind: Secret
+metadata:
+  name: gcsr-secrets
+type: Opaque
+data:
+  username: "Z2l0LXRhemppbi5nbWFpbC5jb20="
+  # This credential is a GCSR 'gitcookie' token.
+  password: '{{ passLookup "gcsr-tazjin-password" | b64enc }}'
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: cgit
+  labels:
+    app: cgit
+spec:
+  replicas: 2
+  selector:
+    matchLabels:
+      app: cgit
+  template:
+    metadata:
+      labels:
+        app: cgit
+    spec:
+      securityContext:
+        runAsUser: 1000
+        runAsGroup: 1000
+        fsGroup: 1000
+      containers:
+      - name: cgit
+        image: nixery.local/shell/web.cgit-taz:{{ gitHEAD }}
+        command: [ "cgit-launch" ]
+        env:
+          - name: HOME
+            value: /git
+        volumeMounts:
+          - name: git-volume
+            mountPath: /git
+      - name: sync-gcsr
+        image: nixery.local/shell/ops.sync-gcsr:{{ gitHEAD }}
+        command: [ "sync-gcsr" ]
+        env:
+          - name: SYNC_USER
+            valueFrom:
+              secretKeyRef:
+                name: gcsr-secrets
+                key: username
+          - name: SYNC_PASS
+            valueFrom:
+              secretKeyRef:
+                name: gcsr-secrets
+                key: password
+        volumeMounts:
+          - name: git-volume
+            mountPath: /git
+      volumes:
+        - name: git-volume
+          emptyDir: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: cgit
+spec:
+  selector:
+    app: cgit
+  ports:
+    - protocol: TCP
+      port: 80
+      targetPort: 8080
diff --git a/ops/infra/kubernetes/gemma/config.lisp b/ops/infra/kubernetes/gemma/config.lisp
new file mode 100644
index 0000000000..517a658cf1
--- /dev/null
+++ b/ops/infra/kubernetes/gemma/config.lisp
@@ -0,0 +1,19 @@
+(config :port 4242
+        :data-dir "/var/lib/gemma/")
+
+(deftask bathroom/wipe-mirror 7)
+(deftask bathroom/wipe-counter 7)
+
+;; Bedroom tasks
+(deftask bedroom/change-sheets 7)
+(deftask bedroom/vacuum 10)
+
+;; Kitchen tasks
+(deftask kitchen/normal-trash 3)
+(deftask kitchen/green-trash 5)
+(deftask kitchen/blue-trash 5)
+(deftask kitchen/wipe-counters 3)
+(deftask kitchen/vacuum 5 "Kitchen has more crumbs and such!")
+
+;; Entire place
+(deftask clean-windows 60)
diff --git a/ops/infra/kubernetes/https-cert/cert.yaml b/ops/infra/kubernetes/https-cert/cert.yaml
new file mode 100644
index 0000000000..c7a85275ae
--- /dev/null
+++ b/ops/infra/kubernetes/https-cert/cert.yaml
@@ -0,0 +1,8 @@
+---
+apiVersion: networking.gke.io/v1beta1
+kind: ManagedCertificate
+metadata:
+  name: {{ .domain | replace "." "-" }}
+spec:
+  domains:
+    - {{ .domain }}
diff --git a/ops/infra/kubernetes/https-lb/ingress.yaml b/ops/infra/kubernetes/https-lb/ingress.yaml
new file mode 100644
index 0000000000..069771a421
--- /dev/null
+++ b/ops/infra/kubernetes/https-lb/ingress.yaml
@@ -0,0 +1,35 @@
+# This resource configures the HTTPS load balancer that is used as the
+# entrypoint to all HTTPS services running in the cluster.
+---
+apiVersion: extensions/v1beta1
+kind: Ingress
+metadata:
+  name: https-ingress
+  annotations:
+    networking.gke.io/managed-certificates: tazj-in, git-tazj-in, www-tazj-in, oslo-pub
+spec:
+  rules:
+    # Route blog to the blog ...
+    - host: tazj.in
+      http:
+        paths:
+          - path: /*
+            backend:
+              serviceName: tazblog
+              servicePort: 8000
+    # Route git.tazj.in to the cgit pods
+    - host: git.tazj.in
+      http:
+        paths:
+          - path: /*
+            backend:
+              serviceName: nginx
+              servicePort: 6756
+    # Route oslo.pub to the nginx instance which serves redirects
+    - host: oslo.pub
+      http:
+        paths:
+          - path: /
+            backend:
+              serviceName: nginx
+              servicePort: 6756
diff --git a/ops/infra/kubernetes/nginx/nginx.conf b/ops/infra/kubernetes/nginx/nginx.conf
new file mode 100644
index 0000000000..918aa60678
--- /dev/null
+++ b/ops/infra/kubernetes/nginx/nginx.conf
@@ -0,0 +1,59 @@
+daemon off;
+worker_processes  1;
+error_log stderr;
+pid /run/nginx.pid;
+
+events {
+    worker_connections  1024;
+}
+
+http {
+    log_format json_combined escape=json
+    '{'
+        '"time_local":"$time_local",'
+        '"remote_addr":"$remote_addr",'
+        '"remote_user":"$remote_user",'
+        '"request":"$request",'
+        '"status": "$status",'
+        '"body_bytes_sent":"$body_bytes_sent",'
+        '"request_time":"$request_time",'
+        '"http_referrer":"$http_referer",'
+        '"http_user_agent":"$http_user_agent"'
+        '}';
+
+    access_log /dev/stdout json_combined;
+
+    sendfile        on;
+    keepalive_timeout  65;
+
+    server {
+        listen 80 default_server;
+        location / {
+            return 200 "ok";
+        }
+    }
+
+    server {
+        listen       80;
+        server_name  oslo.pub;
+
+        location / {
+            return 302 https://www.google.com/maps/d/viewer?mid=1pJIYY9cuEdt9DuMTbb4etBVq7hs;
+        }
+    }
+
+    server {
+        listen       80;
+        server_name  git.tazj.in;
+
+        # Static assets must always hit the root.
+        location ~ ^/(favicon\.ico|cgit\.(css|png))$ {
+           proxy_pass http://cgit;
+        }
+
+        # Everything else hits the depot directly.
+        location / {
+            proxy_pass http://cgit/cgit.cgi/depot/;
+        }
+    }
+}
diff --git a/ops/infra/kubernetes/nginx/nginx.yaml b/ops/infra/kubernetes/nginx/nginx.yaml
new file mode 100644
index 0000000000..983b265baf
--- /dev/null
+++ b/ops/infra/kubernetes/nginx/nginx.yaml
@@ -0,0 +1,60 @@
+# Deploy an nginx instance which serves ... redirects.
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: nginx-conf
+data:
+  nginx.conf: {{ insertFile "nginx.conf" | toJson }}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: nginx
+  labels:
+    app: nginx
+spec:
+  replicas: 2
+  selector:
+    matchLabels:
+      app: nginx
+  template:
+    metadata:
+      labels:
+        app: nginx
+        config: {{ insertFile "nginx.conf" | sha1sum }}
+    spec:
+      containers:
+        - name: tazblog
+          image: nixery.local/shell/third_party.nginx:{{ .version }}
+          command: ["/bin/bash", "-c"]
+          args:
+            - |
+              cd /run
+              echo 'nogroup:x:30000:nobody' >> /etc/group
+              echo 'nobody:x:30000:30000:nobody:/tmp:/bin/bash' >> /etc/passwd
+              exec nginx -c /etc/nginx/nginx.conf
+          volumeMounts:
+            - name: nginx-conf
+              mountPath: /etc/nginx
+            - name: nginx-rundir
+              mountPath: /run
+      volumes:
+        - name: nginx-conf
+          configMap:
+            name: nginx-conf
+        - name: nginx-rundir
+          emptyDir: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: nginx
+spec:
+  type: NodePort
+  selector:
+    app: nginx
+  ports:
+    - protocol: TCP
+      port: 6756
+      targetPort: 80
diff --git a/ops/infra/kubernetes/nixery/config.yaml b/ops/infra/kubernetes/nixery/config.yaml
new file mode 100644
index 0000000000..0775e79b58
--- /dev/null
+++ b/ops/infra/kubernetes/nixery/config.yaml
@@ -0,0 +1,67 @@
+# Deploys an instance of Nixery into the cluster.
+#
+# The service via which Nixery is exposed has a private DNS entry
+# pointing to it, which makes it possible to resolve `nixery.local`
+# in-cluster without things getting nasty.
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: nixery
+  namespace: kube-public
+  labels:
+    app: nixery
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: nixery
+  template:
+    metadata:
+      labels:
+        app: nixery
+    spec:
+      containers:
+      - name: nixery
+        image: eu.gcr.io/tazjins-infrastructure/nixery:{{ .version }}
+        volumeMounts:
+          - name: nixery-secrets
+            mountPath: /var/nixery
+        env:
+          - name: BUCKET
+            value: {{ .bucket}}
+          - name: PORT
+            value: "{{ .port }}"
+          - name: GOOGLE_APPLICATION_CREDENTIALS
+            value: /var/nixery/gcs-key.json
+          - name: GCS_SIGNING_KEY
+            value: /var/nixery/gcs-key.pem
+          - name: GCS_SIGNING_ACCOUNT
+            value: {{ .account }}
+          - name: GIT_SSH_COMMAND
+            value: 'ssh -F /var/nixery/ssh_config'
+          - name: NIXERY_PKGS_REPO
+            value: {{ .repo }}
+          - name: NIX_POPULARITY_URL
+            value: 'https://storage.googleapis.com/nixery-layers/popularity/{{ .popularity }}'
+      volumes:
+        - name: nixery-secrets
+          secret:
+            secretName: nixery-secrets
+            defaultMode: 256
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: nixery
+  namespace: kube-public
+  annotations:
+    cloud.google.com/load-balancer-type: "Internal"
+spec:
+  selector:
+    app: nixery
+  type: LoadBalancer
+  ports:
+  - protocol: TCP
+    port: 80
+    targetPort: 8080
diff --git a/ops/infra/kubernetes/nixery/id_nixery.pub b/ops/infra/kubernetes/nixery/id_nixery.pub
new file mode 100644
index 0000000000..dc3fd617d0
--- /dev/null
+++ b/ops/infra/kubernetes/nixery/id_nixery.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCzBM6ydst77jDHNcTFWKD9Fw4SReqyNEEp2MtQBk2wt94U4yLp8MQIuNeOEn1GaDEX4RGCxqai/2UVF1w9ZNdU+v2fXcKWfkKuGQH2XcNfXor2cVNObd40H78++iZiv3nmM/NaEdkTbTBbi925cRy9u5FgItDgsJlyKNRglCb0fr6KlgpvWjL20dp/eeZ8a/gLniHK8PnEsgERQSvJnsyFpxxVhxtoUiyLWpXDl4npf/rQr0eRDf4Q5sN/nbTwksapPHfze8dKcaoA7A2NqT3bJ6DPGrwVCzGRtGw/SXJwFwmmtAl9O6BklpeReyiknSxc+KOtrjDW6O0r6yvymD5Z nixery
diff --git a/ops/infra/kubernetes/nixery/known_hosts b/ops/infra/kubernetes/nixery/known_hosts
new file mode 100644
index 0000000000..6a2f84b5fb
--- /dev/null
+++ b/ops/infra/kubernetes/nixery/known_hosts
@@ -0,0 +1,2 @@
+github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
+140.82.118.4 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
diff --git a/ops/infra/kubernetes/nixery/secrets.yaml b/ops/infra/kubernetes/nixery/secrets.yaml
new file mode 100644
index 0000000000..d9a674d2c9
--- /dev/null
+++ b/ops/infra/kubernetes/nixery/secrets.yaml
@@ -0,0 +1,18 @@
+# The secrets below are encrypted using keys stored in Cloud KMS and
+# templated in by kontemplate when deploying.
+#
+# Not all of the values are actually secret (see the matching)
+---
+apiVersion: v1
+kind: Secret
+metadata:
+  name: nixery-secrets
+  namespace: kube-public
+type: Opaque
+data:
+  gcs-key.json: {{ passLookup "nixery-gcs-json" | b64enc }}
+  gcs-key.pem: {{ passLookup "nixery-gcs-pem" | b64enc }}
+  id_nixery: {{ printf "%s\n" (passLookup "nixery-ssh-private") | b64enc }}
+  id_nixery.pub: {{ insertFile "id_nixery.pub" | b64enc }}
+  known_hosts: {{ insertFile "known_hosts" | b64enc }}
+  ssh_config: {{ insertFile "ssh_config" | b64enc }}
diff --git a/ops/infra/kubernetes/nixery/ssh_config b/ops/infra/kubernetes/nixery/ssh_config
new file mode 100644
index 0000000000..78afbb0b03
--- /dev/null
+++ b/ops/infra/kubernetes/nixery/ssh_config
@@ -0,0 +1,4 @@
+Match host *
+      User tazjin@google.com
+      IdentityFile /var/nixery/id_nixery
+      UserKnownHostsFile /var/nixery/known_hosts
diff --git a/ops/infra/kubernetes/primary-cluster.yaml b/ops/infra/kubernetes/primary-cluster.yaml
new file mode 100644
index 0000000000..1d5d33e0bb
--- /dev/null
+++ b/ops/infra/kubernetes/primary-cluster.yaml
@@ -0,0 +1,38 @@
+# Kontemplate configuration for the primary GKE cluster in the project
+# 'tazjins-infrastructure'.
+---
+context: gke_tazjins-infrastructure_europe-north1_tazjin-cluster
+include:
+  # SSL certificates (provisioned by Google)
+  - name: tazj-in-cert
+    path: https-cert
+    values:
+      domain: tazj.in
+  - name: www-tazj-in-cert
+    path: https-cert
+    values:
+      domain: www.tazj.in
+  - name: git-tazj-in-cert
+    path: https-cert
+    values:
+      domain: git.tazj.in
+  - name: oslo-pub-cert
+    path: https-cert
+    values:
+      domain: oslo.pub
+
+  # Services
+  - name: nixery
+    values:
+      port: 8080
+      version: xkm36vrbcnzxdccybzdrx4qzfcfqfrhg
+      bucket: tazjins-data
+      account: nixery@tazjins-infrastructure.iam.gserviceaccount.com
+      repo: ssh://tazjin@gmail.com@source.developers.google.com:2022/p/tazjins-infrastructure/r/depot
+      popularity: 'popularity-nixos-unstable-3140fa89c51233397f496f49014f6b23216667c2.json'
+  - name: tazblog
+  - name: cgit
+  - name: https-lb
+  - name: nginx
+    values:
+      version: a349d5e9145ae9a6c89f62ec631f01fb180de546
diff --git a/ops/infra/kubernetes/tazblog/config.yaml b/ops/infra/kubernetes/tazblog/config.yaml
new file mode 100644
index 0000000000..dc63ce8e4b
--- /dev/null
+++ b/ops/infra/kubernetes/tazblog/config.yaml
@@ -0,0 +1,34 @@
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: tazblog
+  labels:
+    app: tazblog
+spec:
+  replicas: 2
+  selector:
+    matchLabels:
+      app: tazblog
+  template:
+    metadata:
+      labels:
+        app: tazblog
+    spec:
+      containers:
+      - name: tazblog
+        image: nixery.local/shell/web.tazblog:{{ gitHEAD }}
+        command: [ "tazblog" ]
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: tazblog
+spec:
+  type: NodePort
+  selector:
+    app: tazblog
+  ports:
+    - protocol: TCP
+      port: 8000
+      targetPort: 8000
diff --git a/ops/journaldriver/.gitignore b/ops/journaldriver/.gitignore
new file mode 100644
index 0000000000..29e65519ba
--- /dev/null
+++ b/ops/journaldriver/.gitignore
@@ -0,0 +1,3 @@
+result
+/target
+**/*.rs.bk
diff --git a/ops/journaldriver/Cargo.lock b/ops/journaldriver/Cargo.lock
new file mode 100644
index 0000000000..40bdc96280
--- /dev/null
+++ b/ops/journaldriver/Cargo.lock
@@ -0,0 +1,816 @@
+[[package]]
+name = "aho-corasick"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "ascii"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "atty"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+ "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "backtrace"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "backtrace-sys"
+version = "0.1.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "base64"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "byteorder"
+version = "1.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "cc"
+version = "1.0.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "cfg-if"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "chrono"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
+ "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "chunked_transfer"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "cloudabi"
+version = "0.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "cookie"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "cstr-argument"
+version = "0.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "env_logger"
+version = "0.5.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "failure"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "failure_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "failure_derive"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "synstructure 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "fuchsia-zircon"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "fuchsia-zircon-sys"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "humantime"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "idna"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "itoa"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "journaldriver"
+version = "1.1.0"
+dependencies = [
+ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "failure 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "medallion 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)",
+ "systemd 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ureq 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "libsystemd-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "log"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "matches"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "medallion"
+version = "2.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "openssl 0.10.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)",
+ "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "memchr"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "memchr"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "native-tls"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+ "openssl 0.10.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "openssl-sys 0.9.36 (registry+https://github.com/rust-lang/crates.io-index)",
+ "schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "security-framework 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tempfile 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "openssl"
+version = "0.10.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+ "openssl-sys 0.9.36 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "proc-macro2"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "qstring"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "quick-error"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "quote"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rand"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "redox_syscall"
+version = "0.1.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "redox_termios"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "aho-corasick 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "utf8-ranges 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "remove_dir_all"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "ryu"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "safemem"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "schannel"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "security-framework"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+ "security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "serde_derive"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 0.15.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "syn"
+version = "0.14.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "syn"
+version = "0.15.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "synstructure"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "systemd"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cstr-argument 0.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libsystemd-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "utf8-cstr 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tempfile"
+version = "3.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "termion"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+ "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "time"
+version = "0.1.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
+ "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "ucd-util"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "unicode-xid"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "ureq"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "ascii 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "chunked_transfer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cookie 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "native-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "qstring 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "url"
+version = "1.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "utf8-cstr"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "utf8-ranges"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "version_check"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "wincolor"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[metadata]
+"checksum aho-corasick 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "68f56c7353e5a9547cbd76ed90f7bb5ffc3ba09d4ea9bd1d8c06c8b1142eeb5a"
+"checksum ascii 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a5fc969a8ce2c9c0c4b0429bb8431544f6658283c8326ba5ff8c762b75369335"
+"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
+"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a"
+"checksum backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c66d56ac8dabd07f6aacdaf633f4b8262f5b3601a810a0dcddffd5c22c69daa0"
+"checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643"
+"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
+"checksum byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "90492c5858dd7d2e78691cfb89f90d273a2800fc11d98f60786e5d87e2f83781"
+"checksum cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "f159dfd43363c4d08055a07703eb7a3406b0dac4d0584d96965a3262db3c9d16"
+"checksum cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4e7bb64a8ebb0d856483e1e682ea3422f883c5f5615a90d51a2c82fe87fdd3"
+"checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878"
+"checksum chunked_transfer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "498d20a7aaf62625b9bf26e637cf7736417cde1d0c99f1d04d1170229a85cf87"
+"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
+"checksum cookie 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1465f8134efa296b4c19db34d909637cb2bf0f7aaf21299e23e18fa29ac557cf"
+"checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980"
+"checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa"
+"checksum cstr-argument 0.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "514570a4b719329df37f93448a70df2baac553020d0eb43a8dfa9c1f5ba7b658"
+"checksum env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)" = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38"
+"checksum failure 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7efb22686e4a466b1ec1a15c2898f91fa9cb340452496dca654032de20ff95b9"
+"checksum failure_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "946d0e98a50d9831f5d589038d2ca7f8f455b1c21028c0db0e84116a12696426"
+"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
+"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
+"checksum humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0484fda3e7007f2a4a0d9c3a703ca38c71c54c55602ce4660c419fd32e188c9e"
+"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
+"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b"
+"checksum lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca488b89a5657b0a2ecd45b95609b3e848cf1755da332a0da46e2b2b1cb371a7"
+"checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d"
+"checksum libsystemd-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e751b723417158e0949ba470bee4affd6f1dd6b67622b5240d79186631b6a0d9"
+"checksum log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fcce5fa49cc693c312001daf1d13411c4a5283796bac1084299ea3e567113f"
+"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
+"checksum medallion 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b2e6f0713b388174fc3de9b63a0a63dfcee191a8abc8e06c0a9c6d80821c1891"
+"checksum memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "148fab2e51b4f1cfc66da2a7c32981d1d3c083a803978268bb11fe4b86925e7a"
+"checksum memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b3629fe9fdbff6daa6c33b90f7c08355c1aca05a3d01fa8063b822fcf185f3b"
+"checksum native-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8b0a7bd714e83db15676d31caf968ad7318e9cc35f93c85a90231c8f22867549"
+"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
+"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1"
+"checksum openssl 0.10.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5e2e79eede055813a3ac52fb3915caf8e1c9da2dec1587871aec9f6f7b48508d"
+"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de"
+"checksum openssl-sys 0.9.36 (registry+https://github.com/rust-lang/crates.io-index)" = "409d77eeb492a1aebd6eb322b2ee72ff7c7496b4434d98b3bf8be038755de65e"
+"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
+"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c"
+"checksum proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "3d7b7eaaa90b4a90a932a9ea6666c95a389e424eff347f0f793979289429feee"
+"checksum qstring 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "545ec057a36a93e25fb5883baed912e4984af4e2543bbf0e3463d962e0408469"
+"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
+"checksum quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dd636425967c33af890042c483632d33fa7a18f19ad1d7ea72e8998c6ef8dea5"
+"checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c"
+"checksum rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1961a422c4d189dfb50ffa9320bf1f2a9bd54ecb92792fb9477f99a1045f3372"
+"checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db"
+"checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1"
+"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
+"checksum regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2069749032ea3ec200ca51e4a31df41759190a88edca0d2d86ee8bedf7073341"
+"checksum regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "747ba3b235651f6e2f67dfa8bcdcd073ddb7c243cb21c442fc12395dfcac212d"
+"checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5"
+"checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395"
+"checksum ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7153dd96dade874ab973e098cb62fcdbb89a03682e46b144fd09550998d4a4a7"
+"checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9"
+"checksum schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "0e1a231dc10abf6749cfa5d7767f25888d484201accbd919b66ab5413c502d56"
+"checksum security-framework 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "697d3f3c23a618272ead9e1fb259c1411102b31c6af8b93f1d64cca9c3b0e8e0"
+"checksum security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab01dfbe5756785b5b4d46e0289e5a18071dfa9a7c2b24213ea00b9ef9b665bf"
+"checksum serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "84257ccd054dc351472528c8587b4de2dbf0dc0fe2e634030c1a90bfdacebaa9"
+"checksum serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "31569d901045afbff7a9479f793177fe9259819aff10ab4f89ef69bbc5f567fe"
+"checksum serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "43344e7ce05d0d8280c5940cabb4964bea626aa58b1ec0e8c73fa2a8512a38ce"
+"checksum syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)" = "261ae9ecaa397c42b960649561949d69311f08eeaea86a65696e6e46517cf741"
+"checksum syn 0.15.8 (registry+https://github.com/rust-lang/crates.io-index)" = "356d1c5043597c40489e9af2d2498c7fefc33e99b7d75b43be336c8a59b3e45e"
+"checksum synstructure 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "85bb9b7550d063ea184027c9b8c20ac167cd36d3e06b3a40bceb9d746dc1a7b7"
+"checksum systemd 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b62a732355787f960c25536210ae0a981aca2e5dae9dab8491bdae39613ce48"
+"checksum tempfile 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "55c1195ef8513f3273d55ff59fe5da6940287a0d7a98331254397f464833675b"
+"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f"
+"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
+"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
+"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b"
+"checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d"
+"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
+"checksum unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25"
+"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
+"checksum ureq 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5f3f941c0434783c82e46d30508834be5f3c1f2c85dd1b98f0681984c7be8e03"
+"checksum url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2a321979c09843d272956e73700d12c4e7d3d92b2ee112b31548aef0d4efc5a6"
+"checksum utf8-cstr 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "55bcbb425141152b10d5693095950b51c3745d019363fc2929ffd8f61449b628"
+"checksum utf8-ranges 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd70f467df6810094968e2fce0ee1bd0e87157aceb026a8c083bcf5e25b9efe4"
+"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d"
+"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
+"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
+"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+"checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab"
+"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+"checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba"
diff --git a/ops/journaldriver/Cargo.toml b/ops/journaldriver/Cargo.toml
new file mode 100644
index 0000000000..248b22807f
--- /dev/null
+++ b/ops/journaldriver/Cargo.toml
@@ -0,0 +1,21 @@
+[package]
+name = "journaldriver"
+version = "1.1.0"
+authors = ["Vincent Ambo <mail@tazj.in>"]
+license = "GPL-3.0-or-later"
+
+[dependencies]
+chrono = { version = "0.4", features = [ "serde" ]}
+env_logger = "0.5"
+failure = "0.1"
+lazy_static = "1.0"
+log = "0.4"
+medallion = "2.2"
+serde = "1.0"
+serde_derive = "1.0"
+serde_json = "1.0"
+systemd = "0.3"
+ureq = { version = "0.6.2", features = [ "json" ]}
+
+[build-dependencies]
+pkg-config = "0.3"
diff --git a/ops/journaldriver/README.md b/ops/journaldriver/README.md
new file mode 100644
index 0000000000..4dc9de0f61
--- /dev/null
+++ b/ops/journaldriver/README.md
@@ -0,0 +1,152 @@
+journaldriver
+=============
+
+This is a small daemon used to forward logs from `journald` (systemd's
+logging service) to [Stackdriver Logging][].
+
+Many existing log services are written in inefficient dynamic
+languages with error-prone "cover every possible use-case"
+configuration. `journaldriver` instead aims to fit a specific use-case
+very well, instead of covering every possible logging setup.
+
+`journaldriver` can be run on GCP-instances with no additional
+configuration as authentication tokens are retrieved from the
+[metadata server][].
+
+<!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc-refresh-toc -->
+**Table of Contents**
+
+- [Features](#features)
+- [Usage on Google Cloud Platform](#usage-on-google-cloud-platform)
+- [Usage outside of Google Cloud Platform](#usage-outside-of-google-cloud-platform)
+- [Log levels / severities / priorities](#log-levels--severities--priorities)
+- [NixOS module](#nixos-module)
+- [Stackdriver Error Reporting](#stackdriver-error-reporting)
+
+<!-- markdown-toc end -->
+
+# Features
+
+* `journaldriver` persists the last forwarded position in the journal
+  and will resume forwarding at the same position after a restart
+* `journaldriver` will recognise log entries in JSON format and
+  forward them appropriately to make structured log entries available
+  in Stackdriver
+* `journaldriver` can be used outside of GCP by configuring static
+  credentials
+* `journaldriver` will recognise journald's log priority levels and
+  convert them into equivalent Stackdriver log severity levels
+
+# Usage on Google Cloud Platform
+
+`journaldriver` does not require any configuration when running on GCP
+instances.
+
+1. Install `journaldriver` on the instance from which you wish to
+   forward logs.
+
+2. Ensure that the instance has the appropriate permissions to write
+   to Stackdriver. Google continously changes how IAM is implemented
+   on GCP, so you will have to refer to [Google's documentation][].
+
+   By default instances have the required permissions if Stackdriver
+   Logging support is enabled in the project.
+
+3. Start `journaldriver`, for example via `systemd`.
+
+# Usage outside of Google Cloud Platform
+
+When running outside of GCP, the following extra steps need to be
+performed:
+
+1. Create a Google Cloud Platform service account with the "Log
+   Writer" role and download its private key in JSON-format.
+2. When starting `journaldriver`, configure the following environment
+   variables:
+
+   * `GOOGLE_CLOUD_PROJECT`: Name of the GCP project to which logs
+     should be written.
+   * `GOOGLE_APPLICATION_CREDENTIALS`: Filesystem path to the
+     JSON-file containing the service account's private key.
+   * `LOG_STREAM`: Name of the target log stream in Stackdriver Logging.
+     This will be automatically created if it does not yet exist.
+   * `LOG_NAME`: Name of the target log to write to. This defaults to
+     `journaldriver` if unset, but it is recommended to - for
+     example - set it to the machine hostname.
+
+# Log levels / severities / priorities
+
+`journaldriver` recognises [journald's priorities][] and converts them
+into [equivalent severities][] in Stackdriver. Both sets of values
+correspond to standard `syslog` priorities.
+
+The easiest way to emit log messages with priorites from an
+application is to use [priority prefixes][], which are compatible with
+structured log messages.
+
+For example, to emit a simple warning message (structured and
+unstructured):
+
+```
+$ echo '<4>{"fnord":true, "msg":"structured log (warning)"}' | systemd-cat
+$ echo '<4>unstructured log (warning)' | systemd-cat
+```
+
+# NixOS module
+
+The NixOS package repository [contains a module][] for setting up
+`journaldriver` on NixOS machines. NixOS by default uses `systemd` for
+service management and `journald` for logging, which means that log
+output from most services will be captured automatically.
+
+On a GCP instance the only required option is this:
+
+```nix
+services.journaldriver.enable = true;
+```
+
+When running outside of GCP, the configuration looks as follows:
+
+```nix
+services.journaldriver = {
+  enable                 = true;
+  logStream              = "prod-environment";
+  logName                = "hostname";
+  googleCloudProject     = "gcp-project-name";
+  applicationCredentials = keyFile;
+};
+```
+
+**Note**: The `journaldriver`-module is included in stable releases of
+NixOS since NixOS 18.09.
+
+# Stackdriver Error Reporting
+
+The [Stackdriver Error Reporting][] service of Google's monitoring
+toolbox supports automatically detecting and correlating errors from
+log entries.
+
+To use this functionality log messages must be logged in the expected
+[log format][].
+
+*Note*: Reporting errors from non-GCP instances requires that the
+`LOG_STREAM` environment variable is set to the special value
+`global`.
+
+This value changes the monitored resource descriptor from a log stream
+to the project-global stream. Due to a limitation in Stackdriver Error
+Reporting, this is the only way to correctly ingest errors from
+non-GCP machines. Please see [issue #4][] for more information about
+this.
+
+[Stackdriver Logging]: https://cloud.google.com/logging/
+[metadata server]: https://cloud.google.com/compute/docs/storing-retrieving-metadata
+[Google's documentation]: https://cloud.google.com/logging/docs/access-control
+[NixOS]: https://nixos.org/
+[contains a module]: https://github.com/NixOS/nixpkgs/pull/42134
+[journald's priorities]: http://0pointer.de/public/systemd-man/sd-daemon.html
+[equivalent severities]: https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#logseverity
+[priority prefixes]: http://0pointer.de/public/systemd-man/sd-daemon.html
+[Stackdriver Error Reporting]: https://cloud.google.com/error-reporting/
+[log format]: https://cloud.google.com/error-reporting/docs/formatting-error-messages
+[issue #4]: https://github.com/tazjin/journaldriver/issues/4
diff --git a/ops/journaldriver/build.rs b/ops/journaldriver/build.rs
new file mode 100644
index 0000000000..d64c82a88a
--- /dev/null
+++ b/ops/journaldriver/build.rs
@@ -0,0 +1,6 @@
+extern crate pkg_config;
+
+fn main() {
+    pkg_config::probe_library("libsystemd")
+        .expect("Could not probe libsystemd");
+}
diff --git a/ops/journaldriver/default.nix b/ops/journaldriver/default.nix
new file mode 100644
index 0000000000..2df5e58fc8
--- /dev/null
+++ b/ops/journaldriver/default.nix
@@ -0,0 +1,9 @@
+{ pkgs, ... }:
+
+pkgs.third_party.naersk.buildPackage {
+  src = ./.;
+
+  buildInputs = with pkgs.third_party; [
+    pkgconfig openssl systemd.dev    
+  ];
+}
diff --git a/ops/journaldriver/src/main.rs b/ops/journaldriver/src/main.rs
new file mode 100644
index 0000000000..a57bb3505d
--- /dev/null
+++ b/ops/journaldriver/src/main.rs
@@ -0,0 +1,665 @@
+// Copyright (C) 2018 Vincent Ambo <mail@tazj.in>
+//
+// journaldriver is free software: you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+//! This file implements journaldriver, a small application that
+//! forwards logs from journald (systemd's log facility) to
+//! Stackdriver Logging.
+//!
+//! Log entries are read continously from journald and are forwarded
+//! to Stackdriver in batches.
+//!
+//! Stackdriver Logging has a concept of monitored resources. In the
+//! simplest case this monitored resource will be the GCE instance on
+//! which journaldriver is running.
+//!
+//! Information about the instance, the project and required security
+//! credentials are retrieved from Google's metadata instance on GCP.
+//!
+//! To run journaldriver on non-GCP machines, users must specify the
+//! `GOOGLE_APPLICATION_CREDENTIALS`, `GOOGLE_CLOUD_PROJECT` and
+//! `LOG_NAME` environment variables.
+
+#[macro_use] extern crate failure;
+#[macro_use] extern crate log;
+#[macro_use] extern crate serde_derive;
+#[macro_use] extern crate serde_json;
+#[macro_use] extern crate lazy_static;
+
+extern crate chrono;
+extern crate env_logger;
+extern crate medallion;
+extern crate serde;
+extern crate systemd;
+extern crate ureq;
+
+use chrono::offset::LocalResult;
+use chrono::prelude::*;
+use failure::ResultExt;
+use serde_json::{from_str, Value};
+use std::env;
+use std::fs::{self, File, rename};
+use std::io::{self, Read, ErrorKind, Write};
+use std::mem;
+use std::path::PathBuf;
+use std::process;
+use std::time::{Duration, Instant};
+use systemd::journal::*;
+
+#[cfg(test)]
+mod tests;
+
+const LOGGING_SERVICE: &str = "https://logging.googleapis.com/google.logging.v2.LoggingServiceV2";
+const ENTRIES_WRITE_URL: &str = "https://logging.googleapis.com/v2/entries:write";
+const METADATA_TOKEN_URL: &str = "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token";
+const METADATA_ID_URL: &str = "http://metadata.google.internal/computeMetadata/v1/instance/id";
+const METADATA_ZONE_URL: &str = "http://metadata.google.internal/computeMetadata/v1/instance/zone";
+const METADATA_PROJECT_URL: &str = "http://metadata.google.internal/computeMetadata/v1/project/project-id";
+
+/// Convenience type alias for results using failure's `Error` type.
+type Result<T> = std::result::Result<T, failure::Error>;
+
+/// Representation of static service account credentials for GCP.
+#[derive(Debug, Deserialize)]
+struct Credentials {
+    /// PEM encoded private key
+    private_key: String,
+
+    /// `kid` of this private key
+    private_key_id: String,
+
+    /// "email" address of the service account
+    client_email: String,
+}
+
+lazy_static! {
+    /// ID of the GCP project to which to send logs.
+    static ref PROJECT_ID: String = get_project_id();
+
+    /// Name of the log to write to (this should only be manually
+    /// configured if not running on GCP):
+    static ref LOG_NAME: String = env::var("LOG_NAME")
+        .unwrap_or("journaldriver".into());
+
+    /// Service account credentials (if configured)
+    static ref SERVICE_ACCOUNT_CREDENTIALS: Option<Credentials> =
+        env::var("GOOGLE_APPLICATION_CREDENTIALS").ok()
+        .and_then(|path| File::open(path).ok())
+        .and_then(|file| serde_json::from_reader(file).ok());
+
+    /// Descriptor of the currently monitored instance. Refer to the
+    /// documentation of `determine_monitored_resource` for more
+    /// information.
+    static ref MONITORED_RESOURCE: Value = determine_monitored_resource();
+
+    /// Path to the directory in which journaldriver should persist
+    /// its cursor state.
+    static ref CURSOR_DIR: PathBuf = env::var("CURSOR_POSITION_DIR")
+        .unwrap_or("/var/lib/journaldriver".into())
+        .into();
+
+    /// Path to the cursor position file itself.
+    static ref CURSOR_FILE: PathBuf = {
+        let mut path = CURSOR_DIR.clone();
+        path.push("cursor.pos");
+        path
+    };
+
+    /// Path to the temporary file used for cursor position writes.
+    static ref CURSOR_TMP_FILE: PathBuf = {
+        let mut path = CURSOR_DIR.clone();
+        path.push("cursor.tmp");
+        path
+    };
+}
+
+/// Convenience helper for retrieving values from the metadata server.
+fn get_metadata(url: &str) -> Result<String> {
+    let response = ureq::get(url)
+        .set("Metadata-Flavor", "Google")
+        .timeout_connect(5000)
+        .timeout_read(5000)
+        .call();
+
+    if response.ok() {
+        // Whitespace is trimmed to remove newlines from responses.
+        let body = response.into_string()
+            .context("Failed to decode metadata response")?
+            .trim().to_string();
+
+        Ok(body)
+    } else {
+        let status = response.status_line().to_string();
+        let body = response.into_string()
+            .unwrap_or_else(|e| format!("Metadata body error: {}", e));
+        bail!("Metadata failure: {} ({})", body, status)
+    }
+}
+
+/// Convenience helper for determining the project ID.
+fn get_project_id() -> String {
+    env::var("GOOGLE_CLOUD_PROJECT")
+        .map_err(Into::into)
+        .or_else(|_: failure::Error| get_metadata(METADATA_PROJECT_URL))
+        .expect("Could not determine project ID")
+}
+
+/// Determines the monitored resource descriptor used in Stackdriver
+/// logs. On GCP this will be set to the instance ID as returned by
+/// the metadata server.
+///
+/// On non-GCP machines the value is determined by using the
+/// `GOOGLE_CLOUD_PROJECT` and `LOG_STREAM` environment variables.
+///
+/// [issue #4]: https://github.com/tazjin/journaldriver/issues/4
+fn determine_monitored_resource() -> Value {
+    if let Ok(log) = env::var("LOG_STREAM") {
+        // The special value `global` is recognised as a log stream name that
+        // results in a `global`-type resource descriptor. This is useful in
+        // cases where Stackdriver Error Reporting is intended to be used on
+        // a non-GCE instance. See [issue #4][] for details.
+        if log == "global" {
+            return json!({
+                "type": "global",
+                "labels": {
+                    "project_id": PROJECT_ID.as_str(),
+                }
+            });
+        }
+
+        json!({
+            "type": "logging_log",
+            "labels": {
+                "project_id": PROJECT_ID.as_str(),
+                "name": log,
+            }
+        })
+    } else {
+        let instance_id = get_metadata(METADATA_ID_URL)
+            .expect("Could not determine instance ID");
+
+        let zone = get_metadata(METADATA_ZONE_URL)
+            .expect("Could not determine instance zone");
+
+        json!({
+            "type": "gce_instance",
+            "labels": {
+                "project_id": PROJECT_ID.as_str(),
+                "instance_id": instance_id,
+                "zone": zone,
+            }
+        })
+    }
+}
+
+/// Represents the response returned by the metadata server's token
+/// endpoint. The token is normally valid for an hour.
+#[derive(Deserialize)]
+struct TokenResponse {
+    expires_in: u64,
+    access_token: String,
+}
+
+/// Struct used to store a token together with a sensible
+/// representation of when it expires.
+struct Token {
+    token: String,
+    fetched_at: Instant,
+    expires: Duration,
+}
+
+impl Token {
+    /// Does this token need to be renewed?
+    fn is_expired(&self) -> bool {
+        self.fetched_at.elapsed() > self.expires
+    }
+}
+
+/// Retrieves a token from the GCP metadata service. Retrieving these
+/// tokens requires no additional authentication.
+fn get_metadata_token() -> Result<Token> {
+    let body = get_metadata(METADATA_TOKEN_URL)?;
+    let token: TokenResponse = from_str(&body)?;
+
+    debug!("Fetched new token from metadata service");
+
+    Ok(Token {
+        fetched_at: Instant::now(),
+        expires: Duration::from_secs(token.expires_in / 2),
+        token: token.access_token,
+    })
+}
+
+/// Signs a token using static client credentials configured for a
+/// service account. This service account must have been given the
+/// `Log Writer` role in Google Cloud IAM.
+///
+/// The process for creating and signing these tokens is described
+/// here:
+///
+/// https://developers.google.com/identity/protocols/OAuth2ServiceAccount#jwt-auth
+fn sign_service_account_token(credentials: &Credentials) -> Result<Token> {
+    use medallion::{Algorithm, Header, Payload};
+
+    let iat = Utc::now();
+    let exp = iat.checked_add_signed(chrono::Duration::seconds(3600))
+        .ok_or_else(|| format_err!("Failed to calculate token expiry"))?;
+
+    let header = Header {
+        alg: Algorithm::RS256,
+        headers: Some(json!({
+            "kid": credentials.private_key_id,
+        })),
+    };
+
+    let payload: Payload<()> = Payload {
+        iss: Some(credentials.client_email.clone()),
+        sub: Some(credentials.client_email.clone()),
+        aud: Some(LOGGING_SERVICE.to_string()),
+        iat: Some(iat.timestamp() as u64),
+        exp: Some(exp.timestamp() as u64),
+        ..Default::default()
+    };
+
+    let token = medallion::Token::new(header, payload)
+        .sign(credentials.private_key.as_bytes())
+        .context("Signing service account token failed")?;
+
+    debug!("Signed new service account token");
+
+    Ok(Token {
+        token,
+        fetched_at: Instant::now(),
+        expires: Duration::from_secs(3000),
+    })
+}
+
+/// Retrieve the authentication token either by using static client
+/// credentials, or by talking to the metadata server.
+///
+/// Which behaviour is used is controlled by the environment variable
+/// `GOOGLE_APPLICATION_CREDENTIALS`, which should be configured to
+/// point at a JSON private key file if service account authentication
+/// is to be used.
+fn get_token() -> Result<Token> {
+    if let Some(credentials) = SERVICE_ACCOUNT_CREDENTIALS.as_ref() {
+        sign_service_account_token(credentials)
+    } else {
+        get_metadata_token()
+    }
+}
+
+/// This structure represents the different types of payloads
+/// supported by journaldriver.
+///
+/// Currently log entries can either contain plain text messages or
+/// structured payloads in JSON-format.
+#[derive(Debug, Serialize, PartialEq)]
+#[serde(untagged)]
+enum Payload {
+    TextPayload {
+        #[serde(rename = "textPayload")]
+        text_payload: String,
+    },
+    JsonPayload {
+        #[serde(rename = "jsonPayload")]
+        json_payload: Value,
+    },
+}
+
+/// Attempt to parse a log message as JSON and return it as a
+/// structured payload. If parsing fails, return the entry in plain
+/// text format.
+fn message_to_payload(message: Option<String>) -> Payload {
+    match message {
+        None => Payload::TextPayload { text_payload: "empty log entry".into() },
+        Some(text_payload) => {
+            // Attempt to deserialize the text payload as a generic
+            // JSON value.
+            if let Ok(json_payload) = serde_json::from_str::<Value>(&text_payload) {
+                // If JSON-parsing succeeded on the payload, check
+                // whether we parsed an object (Stackdriver does not
+                // expect other types of JSON payload) and return it
+                // in that case.
+                if json_payload.is_object() {
+                    return Payload::JsonPayload { json_payload }
+                }
+            }
+
+            Payload::TextPayload { text_payload }
+        }
+    }
+}
+
+/// Attempt to parse journald's microsecond timestamps into a UTC
+/// timestamp.
+///
+/// Parse errors are dismissed and returned as empty options: There
+/// simply aren't any useful fallback mechanisms other than defaulting
+/// to ingestion time for journaldriver's use-case.
+fn parse_microseconds(input: String) -> Option<DateTime<Utc>> {
+    if input.len() != 16 {
+        return None;
+    }
+
+    let seconds: i64 = (&input[..10]).parse().ok()?;
+    let micros: u32 = (&input[10..]).parse().ok()?;
+
+    match Utc.timestamp_opt(seconds, micros * 1000) {
+        LocalResult::Single(time) => Some(time),
+        _ => None,
+    }
+}
+
+/// Converts a journald log message priority to a
+/// Stackdriver-compatible severity number.
+///
+/// Both Stackdriver and journald specify equivalent
+/// severities/priorities. Conveniently, the names are the same.
+/// Inconveniently, the numbers are not.
+///
+/// For more information on the journald priorities, consult these
+/// man-pages:
+///
+/// * systemd.journal-fields(7) (section 'PRIORITY')
+/// * sd-daemon(3)
+/// * systemd.exec(5) (section 'SyslogLevelPrefix')
+///
+/// Note that priorities can be logged by applications via the prefix
+/// concept described in these man pages, without interfering with
+/// structured JSON-payloads.
+///
+/// For more information on the Stackdriver severity levels, please
+/// consult Google's documentation:
+///
+/// https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity
+///
+/// Any unknown priority values result in no severity being set.
+fn priority_to_severity(priority: String) -> Option<u32> {
+    match priority.as_ref() {
+        "0" => Some(800), // emerg
+        "1" => Some(700), // alert
+        "2" => Some(600), // crit
+        "3" => Some(500), // err
+        "4" => Some(400), // warning
+        "5" => Some(300), // notice
+        "6" => Some(200), // info
+        "7" => Some(100), // debug
+        _ => None,
+    }
+}
+
+/// This structure represents a log entry in the format expected by
+/// the Stackdriver API.
+#[derive(Debug, Serialize)]
+#[serde(rename_all = "camelCase")]
+struct LogEntry {
+    labels: Value,
+
+    #[serde(skip_serializing_if = "Option::is_none")]
+    timestamp: Option<DateTime<Utc>>,
+
+    #[serde(flatten)]
+    payload: Payload,
+
+    // https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity
+    #[serde(skip_serializing_if = "Option::is_none")]
+    severity: Option<u32>,
+}
+
+impl From<JournalRecord> for LogEntry {
+    // Converts from the fields contained in a journald record to the
+    // representation required by Stackdriver Logging.
+    //
+    // The fields are documented in systemd.journal-fields(7).
+    fn from(mut record: JournalRecord) -> LogEntry {
+        // The message field is technically just a convention, but
+        // journald seems to default to it when ingesting unit
+        // output.
+        let payload = message_to_payload(record.remove("MESSAGE"));
+
+        // Presumably this is always set, but who can be sure
+        // about anything in this world.
+        let hostname = record.remove("_HOSTNAME");
+
+        // The unit is seemingly missing on kernel entries, but
+        // present on all others.
+        let unit = record.remove("_SYSTEMD_UNIT");
+
+        // The source timestamp (if present) is specified in
+        // microseconds since epoch.
+        //
+        // If it is not present or can not be parsed, journaldriver
+        // will not send a timestamp for the log entry and it will
+        // default to the ingestion time.
+        let timestamp = record
+            .remove("_SOURCE_REALTIME_TIMESTAMP")
+            .and_then(parse_microseconds);
+
+        // Journald uses syslogd's concept of priority. No idea if this is
+        // always present, but it's optional in the Stackdriver API, so we just
+        // omit it if we can't find or parse it.
+        let severity = record
+            .remove("PRIORITY")
+            .and_then(priority_to_severity);
+
+        LogEntry {
+            payload,
+            timestamp,
+            labels: json!({
+                "host": hostname,
+                "unit": unit.unwrap_or_else(|| "syslog".into()),
+            }),
+            severity,
+        }
+    }
+}
+
+/// Attempt to read from the journal. If no new entry is present,
+/// await the next one up to the specified timeout.
+fn receive_next_record(timeout: Duration, journal: &mut Journal)
+                       -> Result<Option<JournalRecord>> {
+    let next_record = journal.next_record()?;
+    if next_record.is_some() {
+        return Ok(next_record);
+    }
+
+    Ok(journal.await_next_record(Some(timeout))?)
+}
+
+/// This function starts a double-looped, blocking receiver. It will
+/// buffer messages for half a second before flushing them to
+/// Stackdriver.
+fn receiver_loop(mut journal: Journal) -> Result<()> {
+    let mut token = get_token()?;
+
+    let mut buf: Vec<LogEntry> = Vec::new();
+    let iteration = Duration::from_millis(500);
+
+    loop {
+        trace!("Beginning outer iteration");
+        let now = Instant::now();
+
+        loop {
+            if now.elapsed() > iteration {
+                break;
+            }
+
+            if let Ok(Some(entry)) = receive_next_record(iteration, &mut journal) {
+                trace!("Received a new entry");
+                buf.push(entry.into());
+            }
+        }
+
+        if !buf.is_empty() {
+            let to_flush = mem::replace(&mut buf, Vec::new());
+            flush(&mut token, to_flush, journal.cursor()?)?;
+        }
+
+        trace!("Done outer iteration");
+    }
+}
+
+/// Writes the current cursor into `/var/journaldriver/cursor.pos`. To
+/// avoid issues with journaldriver being terminated while the cursor
+/// is still being written, this will first write the cursor into a
+/// temporary file and then move it.
+fn persist_cursor(cursor: String) -> Result<()> {
+    // This code exists to aid in tracking down if there are other
+    // causes of issue #2 than what has already been taken care of.
+    //
+    // One theory is that journald (or the Rust library to interface
+    // with it) may occasionally return empty cursor strings. If this
+    // is ever the case, we would like to know about it.
+    if cursor.is_empty() {
+        error!("Received empty journald cursor position, refusing to persist!");
+        error!("Please report this message at https://github.com/tazjin/journaldriver/issues/2");
+        return Ok(())
+    }
+
+    let mut file = File::create(&*CURSOR_TMP_FILE)
+        .context("Failed to create cursor file")?;
+
+    write!(file, "{}", cursor).context("Failed to write cursor file")?;
+
+    rename(&*CURSOR_TMP_FILE, &*CURSOR_FILE)
+        .context("Failed to move cursor file")
+        .map_err(Into::into)
+}
+
+/// Flushes all drained records to Stackdriver. Any Stackdriver
+/// message can at most contain 1000 log entries which means they are
+/// chunked up here.
+///
+/// In some cases large payloads seem to cause errors in Stackdriver -
+/// the chunks are therefore made smaller here.
+///
+/// If flushing is successful the last cursor position will be
+/// persisted to disk.
+fn flush(token: &mut Token,
+         entries: Vec<LogEntry>,
+         cursor: String) -> Result<()> {
+    if token.is_expired() {
+        debug!("Refreshing Google metadata access token");
+        let new_token = get_token()?;
+        mem::replace(token, new_token);
+    }
+
+    for chunk in entries.chunks(750) {
+        let request = prepare_request(chunk);
+        if let Err(write_error) = write_entries(token, request) {
+            error!("Failed to write {} entries: {}", chunk.len(), write_error)
+        } else {
+            debug!("Wrote {} entries to Stackdriver", chunk.len())
+        }
+    }
+
+    persist_cursor(cursor)
+}
+
+/// Convert a slice of log entries into the format expected by
+/// Stackdriver. This format is documented here:
+///
+/// https://cloud.google.com/logging/docs/reference/v2/rest/v2/entries/write
+fn prepare_request(entries: &[LogEntry]) -> Value {
+    json!({
+        "logName": format!("projects/{}/logs/{}", PROJECT_ID.as_str(), LOG_NAME.as_str()),
+        "resource": &*MONITORED_RESOURCE,
+        "entries": entries,
+        "partialSuccess": true
+    })
+}
+
+/// Perform the log entry insertion in Stackdriver Logging.
+fn write_entries(token: &Token, request: Value) -> Result<()> {
+    let response = ureq::post(ENTRIES_WRITE_URL)
+        .set("Authorization", format!("Bearer {}", token.token).as_str())
+        // The timeout values are set relatively high, not because of
+        // an expectation of Stackdriver being slow but just to
+        // eventually hit an error case in case of network troubles.
+        // Presumably no request in a functioning environment will
+        // ever hit these limits.
+        .timeout_connect(2000)
+        .timeout_read(5000)
+        .send_json(request);
+
+    if response.ok() {
+        Ok(())
+    } else {
+        let status = response.status_line().to_string();
+        let body = response.into_string()
+            .unwrap_or_else(|_| "no response body".into());
+        bail!("Write failure: {} ({})", body, status)
+    }
+}
+
+/// Attempt to read the initial cursor position from the configured
+/// file. If there is no initial cursor position set, read from the
+/// tail of the log.
+///
+/// The only "acceptable" error when reading the cursor position is
+/// the cursor position file not existing, other errors are fatal
+/// because they indicate a misconfiguration of journaldriver.
+fn initial_cursor() -> Result<JournalSeek> {
+    let read_result: io::Result<String> = (|| {
+        let mut contents = String::new();
+        let mut file = File::open(&*CURSOR_FILE)?;
+        file.read_to_string(&mut contents)?;
+        Ok(contents.trim().into())
+    })();
+
+    match read_result {
+        Ok(cursor) => Ok(JournalSeek::Cursor { cursor }),
+        Err(ref err) if err.kind() == ErrorKind::NotFound => {
+            info!("No previous cursor position, reading from journal tail");
+            Ok(JournalSeek::Tail)
+        },
+        Err(err) => {
+            (Err(err).context("Could not read cursor position"))?
+        }
+    }
+}
+
+fn main () {
+    env_logger::init();
+
+    // The directory in which cursor positions are persisted should
+    // have been created:
+    if !CURSOR_DIR.exists() {
+        error!("Cursor directory at '{:?}' does not exist", *CURSOR_DIR);
+        process::exit(1);
+    }
+
+    let cursor_position_dir = CURSOR_FILE.parent()
+        .expect("Invalid cursor position file path");
+
+    fs::create_dir_all(cursor_position_dir)
+        .expect("Could not create directory to store cursor position in");
+
+    let mut journal = Journal::open(JournalFiles::All, false, true)
+        .expect("Failed to open systemd journal");
+
+    let seek_position = initial_cursor()
+        .expect("Failed to determine initial cursor position");
+
+    match journal.seek(seek_position) {
+        Ok(cursor) => info!("Opened journal at cursor '{}'", cursor),
+        Err(err) => {
+            error!("Failed to set initial journal position: {}", err);
+            process::exit(1)
+        }
+    }
+
+    receiver_loop(journal).expect("log receiver encountered an unexpected error");
+}
diff --git a/ops/journaldriver/src/tests.rs b/ops/journaldriver/src/tests.rs
new file mode 100644
index 0000000000..779add7a70
--- /dev/null
+++ b/ops/journaldriver/src/tests.rs
@@ -0,0 +1,95 @@
+use super::*;
+use serde_json::to_string;
+
+#[test]
+fn test_text_entry_serialization() {
+    let entry = LogEntry {
+        labels: Value::Null,
+        timestamp: None,
+        payload: Payload::TextPayload {
+            text_payload: "test entry".into(),
+        },
+        severity: None,
+    };
+
+    let expected = "{\"labels\":null,\"textPayload\":\"test entry\"}";
+    let result = to_string(&entry).expect("serialization failed");
+
+    assert_eq!(expected, result, "Plain text payload should serialize correctly")
+}
+
+#[test]
+fn test_json_entry_serialization() {
+    let entry = LogEntry {
+        labels: Value::Null,
+        timestamp: None,
+        payload: Payload::JsonPayload {
+            json_payload: json!({
+                "message": "JSON test"
+            })
+        },
+        severity: None,
+    };
+
+    let expected = "{\"labels\":null,\"jsonPayload\":{\"message\":\"JSON test\"}}";
+    let result = to_string(&entry).expect("serialization failed");
+
+    assert_eq!(expected, result, "JSOn payload should serialize correctly")
+}
+
+#[test]
+fn test_plain_text_payload() {
+    let message = "plain text payload".into();
+    let payload = message_to_payload(Some(message));
+    let expected = Payload::TextPayload {
+        text_payload: "plain text payload".into(),
+    };
+
+    assert_eq!(expected, payload, "Plain text payload should be detected correctly");
+}
+
+#[test]
+fn test_empty_payload() {
+    let payload = message_to_payload(None);
+    let expected = Payload::TextPayload {
+        text_payload: "empty log entry".into(),
+    };
+
+    assert_eq!(expected, payload, "Empty payload should be handled correctly");
+}
+
+#[test]
+fn test_json_payload() {
+    let message = "{\"someKey\":\"someValue\", \"otherKey\": 42}".into();
+    let payload = message_to_payload(Some(message));
+    let expected = Payload::JsonPayload {
+        json_payload: json!({
+            "someKey": "someValue",
+            "otherKey": 42
+        })
+    };
+
+    assert_eq!(expected, payload, "JSON payload should be detected correctly");
+}
+
+#[test]
+fn test_json_no_object() {
+    // This message can be parsed as valid JSON, but it is not an
+    // object - it should be returned as a plain-text payload.
+    let message = "42".into();
+    let payload = message_to_payload(Some(message));
+    let expected = Payload::TextPayload {
+        text_payload: "42".into(),
+    };
+
+    assert_eq!(expected, payload, "Non-object JSON payload should be plain text");
+}
+
+#[test]
+fn test_parse_microseconds() {
+    let input: String = "1529175149291187".into();
+    let expected: DateTime<Utc> = "2018-06-16T18:52:29.291187Z"
+        .to_string().parse().unwrap();
+
+    assert_eq!(Some(expected), parse_microseconds(input));
+}
diff --git a/ops/kms_pass.nix b/ops/kms_pass.nix
new file mode 100644
index 0000000000..b8a97d1332
--- /dev/null
+++ b/ops/kms_pass.nix
@@ -0,0 +1,61 @@
+# This tool mimics a subset of the interface of 'pass', but uses
+# Google Cloud KMS for encryption.
+#
+# It is intended to be compatible with how 'kontemplate' invokes
+# 'pass.'
+#
+# Only the 'show' and 'insert' commands are supported.
+
+{ pkgs, kms, ... }:
+
+let inherit (pkgs.third_party) google-cloud-sdk tree writeShellScriptBin;
+in (writeShellScriptBin "pass" ''
+  set -eo pipefail
+
+  CMD="$1"
+  readonly SECRET=$2
+  readonly SECRETS_DIR=${./secrets}
+  readonly SECRET_PATH="$SECRETS_DIR/$SECRET"
+
+  function secret_check {
+    if [[ -z $SECRET ]]; then
+      echo 'Secret must be specified'
+      exit 1
+    fi
+  }
+
+  if [[ -z $CMD ]]; then
+    CMD="ls"
+  fi
+
+  case "$CMD" in
+    ls)
+       ${tree}/bin/tree $SECRETS_DIR
+       ;;
+    show)
+      secret_check
+      ${google-cloud-sdk}/bin/gcloud kms decrypt \
+        --project ${kms.project} \
+        --location ${kms.region} \
+        --keyring ${kms.keyring} \
+        --key ${kms.key} \
+        --ciphertext-file $SECRET_PATH \
+        --plaintext-file -
+      ;;
+    insert)
+      secret_check
+      ${google-cloud-sdk}/bin/gcloud kms encrypt \
+        --project ${kms.project} \
+        --location ${kms.region} \
+        --keyring ${kms.keyring} \
+        --key ${kms.key} \
+        --ciphertext-file $SECRET_PATH \
+        --plaintext-file -
+      echo "Inserted secret '$SECRET'"
+      ;;
+    *)
+      echo "Usage: pass show/insert <secret>"
+      exit 1
+      ;;
+  esac
+'') // { meta.enableCI = true; }
diff --git a/ops/kontemplate/.gitignore b/ops/kontemplate/.gitignore
new file mode 100644
index 0000000000..53a04aab3a
--- /dev/null
+++ b/ops/kontemplate/.gitignore
@@ -0,0 +1,2 @@
+.idea/
+release/
diff --git a/ops/kontemplate/LICENSE b/ops/kontemplate/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/ops/kontemplate/LICENSE
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/ops/kontemplate/README.md b/ops/kontemplate/README.md
new file mode 100644
index 0000000000..dd02943f89
--- /dev/null
+++ b/ops/kontemplate/README.md
@@ -0,0 +1,187 @@
+Kontemplate - A simple Kubernetes templater
+===========================================
+
+[Kontemplate][] is a simple CLI tool that can take sets of Kubernetes resource
+files with placeholders and insert values per environment.
+
+This tool was made because in many cases all I want in terms of Kubernetes
+configuration is simple value interpolation per environment (i.e. Kubernetes
+cluster), but with the same deployment files.
+
+In my experience this is often enough and more complex solutions such as
+[Helm][] are not required.
+
+Check out a Kontemplate setup example and the feature list below!
+
+<!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc-refresh-toc -->
+**Table of Contents**
+
+- [Kontemplate - A simple Kubernetes templater](#kontemplate---a-simple-kubernetes-templater)
+    - [Features](#features)
+    - [Example](#example)
+    - [Installation](#installation)
+        - [Homebrew](#homebrew)
+        - [Arch Linux](#arch-linux)
+        - [Building repeatably from source](#building-repeatably-from-source)
+        - [Building from source](#building-from-source)
+    - [Usage](#usage)
+    - [Contributing](#contributing)
+
+<!-- markdown-toc end -->
+
+## Features
+
+* [Simple, yet powerful templates](docs/templates.md)
+* [Clean cluster configuration files](docs/cluster-config.md)
+* [Resources organised as simple resource sets](docs/resource-sets.md)
+* Integration with pass
+* Integration with kubectl
+
+## Example
+
+Kontemplate lets you describe resources as you normally would in a simple folder structure:
+
+```
+.
+├── prod-cluster.yaml
+└── some-api
+    ├── deployment.yaml
+    └── service.yaml
+```
+
+This example has all resources belonging to `some-api` (no file naming conventions enforced at all!) in the `some-api`
+folder and the configuration for the cluster `prod-cluster` in the corresponding file.
+
+Lets take a short look at `prod-cluster.yaml`:
+
+```yaml
+---
+context: k8s.prod.mydomain.com
+global:
+  globalVar: lizards
+include:
+  - name: some-api
+    values:
+      version: 1.0-0e6884d
+      importantFeature: true
+      apiPort: 4567
+```
+
+Those values are then templated into the resource files of `some-api`. That's it!
+
+You can also set up more complicated folder structures for organisation, for example:
+
+```
+.
+├── api
+│   ├── image-api
+│   │   └── deployment.yaml
+│   └── music-api
+│       └── deployment.yaml
+│   │   └── default.json
+├── frontend
+│   ├── main-app
+│   │   ├── deployment.yaml
+│   │   └── service.yaml
+│   └── user-page
+│       ├── deployment.yaml
+│       └── service.yaml
+├── prod-cluster.yaml
+└── test-cluster.yaml
+```
+
+And selectively template or apply resources with a command such as
+`kontemplate apply test-cluster.yaml --include api --include frontend/user-page`
+to only update the `api` resource sets and the `frontend/user-page` resource set.
+
+## Installation
+
+It is recommended to install Kontemplate from the signed binary releases available on the
+[releases page][]. Release binaries are available for Linux, OS X, FreeBSD and Windows.
+
+### NixOS
+
+Kontemplate has been included in [NixOS](https://nixos.org/) since version 17.09.
+
+It is available as `kontemplate` from the default Nix package set.
+
+### Arch Linux
+
+An [AUR package][] is available for Arch Linux and other `pacman`-based distributions.
+
+### Building from source
+
+You can clone Kontemplate either by cloning the full
+[depot][https://git.tazj.in/] or by just cloning the kontemplate
+subtree like so:
+
+    git clone -b kontemplate https://git.tazj.in kontemplate
+
+The `go` tooling can be used as normal with this cloned repository. In
+a full clone of the dpeot, Nix can be used to build Kontemplate:
+
+    nix-build -A ops.kontemplate
+
+## Usage
+
+You must have `kubectl` installed to use Kontemplate effectively.
+
+```
+usage: kontemplate [<flags>] <command> [<args> ...]
+
+simple Kubernetes resource templating
+
+Flags:
+  -h, --help                 Show context-sensitive help (also try --help-long and --help-man).
+  -i, --include=INCLUDE ...  Resource sets to include explicitly
+  -e, --exclude=EXCLUDE ...  Resource sets to exclude explicitly
+
+Commands:
+  help [<command>...]
+    Show help.
+
+  template <file>
+    Template resource sets and print them
+
+  apply [<flags>] <file>
+    Template resources and pass to 'kubectl apply'
+
+  replace <file>
+    Template resources and pass to 'kubectl replace'
+
+  delete <file>
+    Template resources and pass to 'kubectl delete'
+
+  create <file>
+    Template resources and pass to 'kubectl create'
+
+```
+
+Examples:
+
+```
+# Look at output for a specific resource set and check to see if it's correct ...
+kontemplate template example/prod-cluster.yaml -i some-api
+
+# ... maybe do a dry-run to see what kubectl would do:
+kontemplate apply example/prod-cluster.yaml --dry-run
+
+# And actually apply it if you like what you see:
+kontemplate apply example/prod-cluster.yaml
+```
+
+Check out the feature list and the individual feature documentation above. Then you should be good to go!
+
+## Contributing
+
+Feel free to contribute pull requests, file bugs and open issues with feature suggestions!
+
+Kontemplate is licensed under the GPLv3, a copy of the license and its terms can be found
+in the `LICENSE` file.
+
+Please follow the [code of conduct](CODE_OF_CONDUCT.md).
+
+[Kontemplate]: http://kontemplate.works
+[Helm]: https://helm.sh/
+[releases page]: https://github.com/tazjin/kontemplate/releases
+[AUR package]: https://aur.archlinux.org/packages/kontemplate-git/
diff --git a/ops/kontemplate/build-release.sh b/ops/kontemplate/build-release.sh
new file mode 100755
index 0000000000..e4258c53dd
--- /dev/null
+++ b/ops/kontemplate/build-release.sh
@@ -0,0 +1,75 @@
+#!/usr/bin/env bash
+set -ueo pipefail
+
+# Copyright (C) 2016-2019  Vincent Ambo <mail@tazj.in>
+#
+# This file is part of Kontemplate.
+#
+# Kontemplate is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+readonly GIT_HASH="$(git rev-parse --short HEAD)"
+readonly LDFLAGS="-X main.gitHash=${GIT_HASH} -w -s"
+readonly VERSION="1.8.0-${GIT_HASH}"
+
+function binary-name() {
+    local os="${1}"
+    local target="${2}"
+    if [ "${os}" = "windows" ]; then
+        echo -n "${target}/kontemplate.exe"
+    else
+        echo -n "${target}/kontemplate"
+    fi
+}
+
+function build-for() {
+    local os="${1}"
+    local arch="${2}"
+    local target="release/${os}/${arch}"
+    local bin=$(binary-name "${os}" "${target}")
+
+    echo "Building kontemplate for ${os}-${arch} in ${target}"
+
+    mkdir -p "${target}"
+
+    env GOOS="${os}" GOARCH="${arch}" go build \
+        -ldflags "${LDFLAGS}" \
+        -o "${bin}" \
+        -tags netgo
+}
+
+function sign-for() {
+    local os="${1}"
+    local arch="${2}"
+    local target="release/${os}/${arch}"
+    local bin=$(binary-name "${os}" "${target}")
+    local tar="release/kontemplate-${VERSION}-${os}-${arch}.tar.gz"
+
+    echo "Packing release into ${tar}"
+    tar czvf "${tar}" -C "${target}" $(basename "${bin}")
+
+    local hash=$(sha256sum "${tar}")
+    echo "Signing kontemplate release tarball for ${os}-${arch} with SHA256 ${hash}"
+    gpg --armor --detach-sig --sign "${tar}"
+}
+
+case "${1}" in
+    "build")
+        # Build releases for various operating systems:
+        build-for "linux" "amd64"
+        build-for "darwin" "amd64"
+        build-for "windows" "amd64"
+        build-for "freebsd" "amd64"
+        exit 0
+        ;;
+    "sign")
+        # Bundle and sign releases:
+        sign-for "linux" "amd64"
+        sign-for "darwin" "amd64"
+        sign-for "windows" "amd64"
+        sign-for "freebsd" "amd64"
+        exit 0
+        ;;
+esac
diff --git a/ops/kontemplate/context/context.go b/ops/kontemplate/context/context.go
new file mode 100644
index 0000000000..2d0378a0ec
--- /dev/null
+++ b/ops/kontemplate/context/context.go
@@ -0,0 +1,266 @@
+// Copyright (C) 2016-2019  Vincent Ambo <mail@tazj.in>
+//
+// This file is part of Kontemplate.
+//
+// Kontemplate is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+package context
+
+import (
+	"fmt"
+	"path"
+	"strings"
+
+	"github.com/tazjin/kontemplate/util"
+)
+
+type ResourceSet struct {
+	// Name of the resource set. This can be used in include/exclude statements during kontemplate runs.
+	Name string `json:"name"`
+
+	// Path to the folder containing the files for this resource set. This defaults to the value of the 'name' field
+	// if unset.
+	Path string `json:"path"`
+
+	// Values to include when interpolating resources from this resource set.
+	Values map[string]interface{} `json:"values"`
+
+	// Args to pass on to kubectl for this resource set.
+	Args []string `json:"args"`
+
+	// Nested resource sets to include
+	Include []ResourceSet `json:"include"`
+
+	// Parent resource set for flattened resource sets. Should not be manually specified.
+	Parent string
+}
+
+type Context struct {
+	// The name of the kubectl context
+	Name string `json:"context"`
+
+	// Global variables that should be accessible by all resource sets
+	Global map[string]interface{} `json:"global"`
+
+	// File names of YAML or JSON files including extra variables that should be globally accessible
+	VariableImportFiles []string `json:"import"`
+
+	// The resource sets to include in this context
+	ResourceSets []ResourceSet `json:"include"`
+
+	// Variables imported from additional files
+	ImportedVars map[string]interface{}
+
+	// Explicitly set variables (via `--var`) that should override all others
+	ExplicitVars map[string]interface{}
+
+	// This field represents the absolute path to the context base directory and should not be manually specified.
+	BaseDir string
+}
+
+func contextLoadingError(filename string, cause error) error {
+	return fmt.Errorf("Context loading failed on file %s due to: \n%v", filename, cause)
+}
+
+// Attempt to load and deserialise a Context from the specified file.
+func LoadContext(filename string, explicitVars *[]string) (*Context, error) {
+	var ctx Context
+	err := util.LoadData(filename, &ctx)
+
+	if err != nil {
+		return nil, contextLoadingError(filename, err)
+	}
+
+	ctx.BaseDir = path.Dir(filename)
+
+	// Prepare the resource sets by resolving parents etc.
+	ctx.ResourceSets = flattenPrepareResourceSetPaths(&ctx.BaseDir, &ctx.ResourceSets)
+
+	// Add variables explicitly specified on the command line
+	ctx.ExplicitVars, err = loadExplicitVars(explicitVars)
+	if err != nil {
+		return nil, fmt.Errorf("Error setting explicit variables: %v\n", err)
+	}
+
+	// Add variables loaded from import files
+	ctx.ImportedVars, err = ctx.loadImportedVariables()
+	if err != nil {
+		return nil, contextLoadingError(filename, err)
+	}
+
+	// Merge variables defined at different levels. The
+	// `mergeContextValues` function is documented with the merge
+	// hierarchy.
+	ctx.ResourceSets = ctx.mergeContextValues()
+
+	if err != nil {
+		return nil, contextLoadingError(filename, err)
+	}
+
+	return &ctx, nil
+}
+
+// Kontemplate supports specifying additional variable files with the
+// `import` keyword. This function loads those variable files and
+// merges them together with the context's other global variables.
+func (ctx *Context) loadImportedVariables() (map[string]interface{}, error) {
+	allImportedVars := make(map[string]interface{})
+
+	for _, file := range ctx.VariableImportFiles {
+		// Ensure that the filename is not merged with the baseDir if
+		// it is set to an absolute path.
+		var filePath string
+		if path.IsAbs(file) {
+			filePath = file
+		} else {
+			filePath = path.Join(ctx.BaseDir, file)
+		}
+
+		var importedVars map[string]interface{}
+		err := util.LoadData(filePath, &importedVars)
+
+		if err != nil {
+			return nil, err
+		}
+
+		allImportedVars = *util.Merge(&allImportedVars, &importedVars)
+	}
+
+	return allImportedVars, nil
+}
+
+// Correctly prepares the file paths for resource sets by inferring implicit paths and flattening resource set
+// collections, i.e. resource sets that themselves have an additional 'include' field set.
+// Those will be regarded as a short-hand for including multiple resource sets from a subfolder.
+// See https://github.com/tazjin/kontemplate/issues/9 for more information.
+func flattenPrepareResourceSetPaths(baseDir *string, rs *[]ResourceSet) []ResourceSet {
+	flattened := make([]ResourceSet, 0)
+
+	for _, r := range *rs {
+		// If a path is not explicitly specified it should default to the resource set name.
+		// This is also the classic behaviour prior to kontemplate 1.2
+		if r.Path == "" {
+			r.Path = r.Name
+		}
+
+		// Paths are made absolute by resolving them relative to the context base,
+		// unless absolute paths were specified.
+		if !path.IsAbs(r.Path) {
+			r.Path = path.Join(*baseDir, r.Path)
+		}
+
+		if len(r.Include) == 0 {
+			flattened = append(flattened, r)
+		} else {
+			for _, subResourceSet := range r.Include {
+				if subResourceSet.Path == "" {
+					subResourceSet.Path = subResourceSet.Name
+				}
+
+				subResourceSet.Parent = r.Name
+				subResourceSet.Name = path.Join(r.Name, subResourceSet.Name)
+				subResourceSet.Path = path.Join(r.Path, subResourceSet.Path)
+				subResourceSet.Values = *util.Merge(&r.Values, &subResourceSet.Values)
+				flattened = append(flattened, subResourceSet)
+			}
+		}
+	}
+
+	return flattened
+}
+
+// Merges the context and resource set variables according in the
+// desired precedence order.
+//
+// For now the reasoning behind the merge order is from least specific
+// in relation to the cluster configuration, which means that the
+// precedence is (in ascending order):
+//
+// 1. Default values in resource sets.
+// 2. Values imported from files (via `import:`)
+// 3. Global values in a cluster configuration
+// 4. Values set in a resource set's `include`-section
+// 5. Explicit values set on the CLI (`--var`)
+//
+// For a discussion on the reasoning behind this order, please consult
+// https://github.com/tazjin/kontemplate/issues/142
+func (ctx *Context) mergeContextValues() []ResourceSet {
+	updated := make([]ResourceSet, len(ctx.ResourceSets))
+
+	// Merging has to happen separately for every individual
+	// resource set to make use of the default values:
+	for i, rs := range ctx.ResourceSets {
+		// Begin by loading default values from the resource
+		// sets configuration.
+		//
+		// Resource sets are used across different cluster
+		// contexts and the default values in them have the
+		// lowest precedence.
+		defaultValues := loadDefaultValues(&rs, ctx)
+
+		// Continue by merging default values with values
+		// imported from external files. Those values are also
+		// used across cluster contexts, but have higher
+		// precedence than defaults.
+		merged := util.Merge(defaultValues, &ctx.ImportedVars)
+
+		// Merge global values defined in the cluster context:
+		merged = util.Merge(merged, &ctx.Global)
+
+		// Merge values configured in the resource set's
+		// `include` section:
+		merged = util.Merge(merged, &rs.Values)
+
+		// Merge values defined explicitly on the CLI:
+		merged = util.Merge(merged, &ctx.ExplicitVars)
+
+		// Continue with the newly merged resource set:
+		rs.Values = *merged
+		updated[i] = rs
+	}
+
+	return updated
+}
+
+// Loads default values for a resource set collection from
+// path/to/set/default.{json|yaml}.
+func loadDefaultValues(rs *ResourceSet, c *Context) *map[string]interface{} {
+	var defaultVars map[string]interface{}
+
+	for _, filename := range util.DefaultFilenames {
+		err := util.LoadData(path.Join(rs.Path, filename), &defaultVars)
+		if err == nil {
+			return &defaultVars
+		}
+	}
+
+	// The actual error is not inspected here. The reasoning for
+	// this is that in case of serious problems (e.g. permission
+	// issues with the folder / folder not existing) failure will
+	// occur a bit later anyways.
+	//
+	// Otherwise we'd have to differentiate between
+	// file-not-found-errors (no default values specified) and
+	// other errors here.
+	return &rs.Values
+}
+
+// Prepares the variables specified explicitly via `--var` when
+// executing kontemplate for adding to the context.
+func loadExplicitVars(vars *[]string) (map[string]interface{}, error) {
+	explicitVars := make(map[string]interface{}, len(*vars))
+
+	for _, v := range *vars {
+		varParts := strings.SplitN(v, "=", 2)
+		if len(varParts) != 2 {
+			return nil, fmt.Errorf(`invalid explicit variable provided (%s), name and value should be separated with "="`, v)
+		}
+
+		explicitVars[varParts[0]] = varParts[1]
+	}
+
+	return explicitVars, nil
+}
diff --git a/ops/kontemplate/context/context_test.go b/ops/kontemplate/context/context_test.go
new file mode 100644
index 0000000000..7ecd9d587d
--- /dev/null
+++ b/ops/kontemplate/context/context_test.go
@@ -0,0 +1,353 @@
+// Copyright (C) 2016-2019  Vincent Ambo <mail@tazj.in>
+//
+// This file is part of Kontemplate.
+//
+// Kontemplate is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+package context
+
+import (
+	"reflect"
+	"testing"
+)
+
+var noExplicitVars []string = make([]string, 0)
+
+func TestLoadFlatContextFromFile(t *testing.T) {
+	ctx, err := LoadContext("testdata/flat-test.yaml", &noExplicitVars)
+
+	if err != nil {
+		t.Error(err)
+		t.Fail()
+	}
+
+	expected := Context{
+		Name: "k8s.prod.mydomain.com",
+		Global: map[string]interface{}{
+			"globalVar": "lizards",
+		},
+		ResourceSets: []ResourceSet{
+			{
+				Name: "some-api",
+				Path: "testdata/some-api",
+				Values: map[string]interface{}{
+					"apiPort":          float64(4567), // yep!
+					"importantFeature": true,
+					"version":          "1.0-0e6884d",
+					"globalVar":        "lizards",
+				},
+				Include: nil,
+				Parent:  "",
+			},
+		},
+		BaseDir:      "testdata",
+		ImportedVars: make(map[string]interface{}, 0),
+		ExplicitVars: make(map[string]interface{}, 0),
+	}
+
+	if !reflect.DeepEqual(*ctx, expected) {
+		t.Error("Loaded context and expected context did not match")
+		t.Fail()
+	}
+}
+
+func TestLoadContextWithArgs(t *testing.T) {
+	ctx, err := LoadContext("testdata/flat-with-args-test.yaml", &noExplicitVars)
+
+	if err != nil {
+		t.Error(err)
+		t.Fail()
+	}
+
+	expected := Context{
+		Name: "k8s.prod.mydomain.com",
+		ResourceSets: []ResourceSet{
+			{
+				Name:   "some-api",
+				Path:   "testdata/some-api",
+				Values: make(map[string]interface{}, 0),
+				Args: []string{
+					"--as=some-user",
+					"--as-group=hello:world",
+					"--as-banana",
+					"true",
+				},
+				Include: nil,
+				Parent:  "",
+			},
+		},
+		BaseDir:      "testdata",
+		ImportedVars: make(map[string]interface{}, 0),
+		ExplicitVars: make(map[string]interface{}, 0),
+	}
+
+	if !reflect.DeepEqual(*ctx, expected) {
+		t.Error("Loaded context and expected context did not match")
+		t.Fail()
+	}
+}
+
+func TestLoadContextWithResourceSetCollections(t *testing.T) {
+	ctx, err := LoadContext("testdata/collections-test.yaml", &noExplicitVars)
+
+	if err != nil {
+		t.Error(err)
+		t.Fail()
+	}
+
+	expected := Context{
+		Name: "k8s.prod.mydomain.com",
+		Global: map[string]interface{}{
+			"globalVar": "lizards",
+		},
+		ResourceSets: []ResourceSet{
+			{
+				Name: "some-api",
+				Path: "testdata/some-api",
+				Values: map[string]interface{}{
+					"apiPort":          float64(4567), // yep!
+					"importantFeature": true,
+					"version":          "1.0-0e6884d",
+					"globalVar":        "lizards",
+				},
+				Include: nil,
+				Parent:  "",
+			},
+			{
+				Name: "collection/nested",
+				Path: "testdata/collection/nested",
+				Values: map[string]interface{}{
+					"lizards":   "good",
+					"globalVar": "lizards",
+				},
+				Include: nil,
+				Parent:  "collection",
+			},
+		},
+		BaseDir:      "testdata",
+		ImportedVars: make(map[string]interface{}, 0),
+		ExplicitVars: make(map[string]interface{}, 0),
+	}
+
+	if !reflect.DeepEqual(*ctx, expected) {
+		t.Error("Loaded context and expected context did not match")
+		t.Fail()
+	}
+
+}
+
+func TestSubresourceVariableInheritance(t *testing.T) {
+	ctx, err := LoadContext("testdata/parent-variables.yaml", &noExplicitVars)
+
+	if err != nil {
+		t.Error(err)
+		t.Fail()
+	}
+
+	expected := Context{
+		Name: "k8s.prod.mydomain.com",
+		ResourceSets: []ResourceSet{
+			{
+				Name: "parent/child",
+				Path: "testdata/parent/child",
+				Values: map[string]interface{}{
+					"foo": "bar",
+					"bar": "baz",
+				},
+				Include: nil,
+				Parent:  "parent",
+			},
+		},
+		BaseDir:      "testdata",
+		ImportedVars: make(map[string]interface{}, 0),
+		ExplicitVars: make(map[string]interface{}, 0),
+	}
+
+	if !reflect.DeepEqual(*ctx, expected) {
+		t.Error("Loaded and expected context did not match")
+		t.Fail()
+	}
+}
+
+func TestSubresourceVariableInheritanceOverride(t *testing.T) {
+	ctx, err := LoadContext("testdata/parent-variable-override.yaml", &noExplicitVars)
+
+	if err != nil {
+		t.Error(err)
+		t.Fail()
+	}
+
+	expected := Context{
+		Name: "k8s.prod.mydomain.com",
+		ResourceSets: []ResourceSet{
+			{
+				Name: "parent/child",
+				Path: "testdata/parent/child",
+				Values: map[string]interface{}{
+					"foo": "newvalue",
+				},
+				Include: nil,
+				Parent:  "parent",
+			},
+		},
+		BaseDir:      "testdata",
+		ImportedVars: make(map[string]interface{}, 0),
+		ExplicitVars: make(map[string]interface{}, 0),
+	}
+
+	if !reflect.DeepEqual(*ctx, expected) {
+		t.Error("Loaded and expected context did not match")
+		t.Fail()
+	}
+}
+
+func TestDefaultValuesLoading(t *testing.T) {
+	ctx, err := LoadContext("testdata/default-loading.yaml", &noExplicitVars)
+	if err != nil {
+		t.Error(err)
+		t.Fail()
+	}
+
+	rs := ctx.ResourceSets[0]
+	if rs.Values["defaultValues"] != "loaded" {
+		t.Errorf("Default values not loaded from YAML file")
+		t.Fail()
+	}
+
+	if rs.Values["override"] != "notAtAll" {
+		t.Error("Default values should not override other values")
+		t.Fail()
+	}
+}
+
+func TestImportValuesLoading(t *testing.T) {
+	ctx, err := LoadContext("testdata/import-vars-simple.yaml", &noExplicitVars)
+	if err != nil {
+		t.Error(err)
+		t.Fail()
+	}
+
+	expected := map[string]interface{}{
+		"override": "true",
+		"music": map[string]interface{}{
+			"artist": "Pallida",
+			"track":  "Tractor Beam",
+		},
+	}
+
+	if !reflect.DeepEqual(ctx.ImportedVars, expected) {
+		t.Error("Expected imported values after loading imports did not match!")
+		t.Fail()
+	}
+}
+
+func TestExplicitPathLoading(t *testing.T) {
+	ctx, err := LoadContext("testdata/explicit-path.yaml", &noExplicitVars)
+	if err != nil {
+		t.Error(err)
+		t.Fail()
+	}
+
+	expected := Context{
+		Name: "k8s.prod.mydomain.com",
+		ResourceSets: []ResourceSet{
+			{
+				Name: "some-api-europe",
+				Path: "testdata/some-api",
+				Values: map[string]interface{}{
+					"location": "europe",
+				},
+				Include: nil,
+				Parent:  "",
+			},
+			{
+				Name: "some-api-asia",
+				Path: "testdata/some-api",
+				Values: map[string]interface{}{
+					"location": "asia",
+				},
+				Include: nil,
+				Parent:  "",
+			},
+		},
+		BaseDir:      "testdata",
+		ImportedVars: make(map[string]interface{}, 0),
+		ExplicitVars: make(map[string]interface{}, 0),
+	}
+
+	if !reflect.DeepEqual(*ctx, expected) {
+		t.Error("Loaded context and expected context did not match")
+		t.Fail()
+	}
+}
+
+func TestExplicitSubresourcePathLoading(t *testing.T) {
+	ctx, err := LoadContext("testdata/explicit-subresource-path.yaml", &noExplicitVars)
+	if err != nil {
+		t.Error(err)
+		t.Fail()
+	}
+
+	expected := Context{
+		Name: "k8s.prod.mydomain.com",
+		ResourceSets: []ResourceSet{
+			{
+				Name:   "parent/child",
+				Path:   "testdata/parent-path/child-path",
+				Parent: "parent",
+				Values: make(map[string]interface{}, 0),
+			},
+		},
+		BaseDir:      "testdata",
+		ImportedVars: make(map[string]interface{}, 0),
+		ExplicitVars: make(map[string]interface{}, 0),
+	}
+
+	if !reflect.DeepEqual(*ctx, expected) {
+		t.Error("Loaded context and expected context did not match")
+		t.Fail()
+	}
+}
+
+func TestSetVariablesFromArguments(t *testing.T) {
+	vars := []string{"version=some-service-version"}
+	ctx, _ := LoadContext("testdata/default-loading.yaml", &vars)
+
+	if version := ctx.ExplicitVars["version"]; version != "some-service-version" {
+		t.Errorf(`Expected variable "version" to have value "some-service-version" but was "%s"`, version)
+	}
+}
+
+func TestSetInvalidVariablesFromArguments(t *testing.T) {
+	vars := []string{"version: some-service-version"}
+	_, err := LoadContext("testdata/default-loading.yaml", &vars)
+
+	if err == nil {
+		t.Error("Expected invalid variable to return an error")
+	}
+}
+
+// This test ensures that variables are merged in the correct order.
+// Please consult the test data in `testdata/merging`.
+func TestValueMergePrecedence(t *testing.T) {
+	cliVars:= []string{"cliVar=cliVar"}
+	ctx, _ := LoadContext("testdata/merging/context.yaml", &cliVars)
+
+	expected := map[string]interface{}{
+		"defaultVar": "defaultVar",
+		"importVar": "importVar",
+		"globalVar": "globalVar",
+		"includeVar": "includeVar",
+		"cliVar": "cliVar",
+	}
+
+	result := ctx.ResourceSets[0].Values
+
+	if !reflect.DeepEqual(expected, result) {
+		t.Errorf("Merged values did not match expected result: \n%v", result)
+		t.Fail()
+	}
+}
diff --git a/ops/kontemplate/context/testdata/collections-test.yaml b/ops/kontemplate/context/testdata/collections-test.yaml
new file mode 100644
index 0000000000..a619c8cfdd
--- /dev/null
+++ b/ops/kontemplate/context/testdata/collections-test.yaml
@@ -0,0 +1,15 @@
+---
+context: k8s.prod.mydomain.com
+global:
+  globalVar: lizards
+include:
+  - name: some-api
+    values:
+      version: 1.0-0e6884d
+      importantFeature: true
+      apiPort: 4567
+  - name: collection
+    include:
+      - name: nested
+        values:
+          lizards: good
diff --git a/ops/kontemplate/context/testdata/default-loading.yaml b/ops/kontemplate/context/testdata/default-loading.yaml
new file mode 100644
index 0000000000..d589c99b4e
--- /dev/null
+++ b/ops/kontemplate/context/testdata/default-loading.yaml
@@ -0,0 +1,6 @@
+---
+context: default-loading
+include:
+  - name: default
+    values:
+      override: notAtAll
\ No newline at end of file
diff --git a/ops/kontemplate/context/testdata/default/default.yaml b/ops/kontemplate/context/testdata/default/default.yaml
new file mode 100644
index 0000000000..0ffa3cd81f
--- /dev/null
+++ b/ops/kontemplate/context/testdata/default/default.yaml
@@ -0,0 +1,2 @@
+defaultValues: loaded
+override: noop
\ No newline at end of file
diff --git a/ops/kontemplate/context/testdata/explicit-path.yaml b/ops/kontemplate/context/testdata/explicit-path.yaml
new file mode 100644
index 0000000000..2c81f83c09
--- /dev/null
+++ b/ops/kontemplate/context/testdata/explicit-path.yaml
@@ -0,0 +1,11 @@
+---
+context: k8s.prod.mydomain.com
+include:
+  - name: some-api-europe
+    path: some-api
+    values:
+      location: europe
+  - name: some-api-asia
+    path: some-api
+    values:
+      location: asia
diff --git a/ops/kontemplate/context/testdata/explicit-subresource-path.yaml b/ops/kontemplate/context/testdata/explicit-subresource-path.yaml
new file mode 100644
index 0000000000..6cf8618322
--- /dev/null
+++ b/ops/kontemplate/context/testdata/explicit-subresource-path.yaml
@@ -0,0 +1,8 @@
+---
+context: k8s.prod.mydomain.com
+include:
+  - name: parent
+    path: parent-path
+    include:
+      - name: child
+        path: child-path
diff --git a/ops/kontemplate/context/testdata/flat-test.yaml b/ops/kontemplate/context/testdata/flat-test.yaml
new file mode 100644
index 0000000000..dd7804f719
--- /dev/null
+++ b/ops/kontemplate/context/testdata/flat-test.yaml
@@ -0,0 +1,10 @@
+---
+context: k8s.prod.mydomain.com
+global:
+  globalVar: lizards
+include:
+  - name: some-api
+    values:
+      version: 1.0-0e6884d
+      importantFeature: true
+      apiPort: 4567
diff --git a/ops/kontemplate/context/testdata/flat-with-args-test.yaml b/ops/kontemplate/context/testdata/flat-with-args-test.yaml
new file mode 100644
index 0000000000..29d3334fb5
--- /dev/null
+++ b/ops/kontemplate/context/testdata/flat-with-args-test.yaml
@@ -0,0 +1,9 @@
+---
+context: k8s.prod.mydomain.com
+include:
+  - name: some-api
+    args:
+      - --as=some-user
+      - --as-group=hello:world
+      - --as-banana
+      - "true"
diff --git a/ops/kontemplate/context/testdata/import-vars-simple.yaml b/ops/kontemplate/context/testdata/import-vars-simple.yaml
new file mode 100644
index 0000000000..12244e1ab1
--- /dev/null
+++ b/ops/kontemplate/context/testdata/import-vars-simple.yaml
@@ -0,0 +1,5 @@
+---
+context: k8s.prod.mydomain.com
+import:
+  - test-vars.yaml
+include: []
diff --git a/ops/kontemplate/context/testdata/merging/context.yaml b/ops/kontemplate/context/testdata/merging/context.yaml
new file mode 100644
index 0000000000..df30d3d8cb
--- /dev/null
+++ b/ops/kontemplate/context/testdata/merging/context.yaml
@@ -0,0 +1,15 @@
+# This context file is intended to test the merge hierarchy of
+# variables defined at different levels.
+---
+context: merging.in.kontemplate.works
+global:
+  globalVar: globalVar
+  includeVar: should be overridden (global)
+  cliVar: should be overridden (global)
+import:
+  - import-vars.yaml
+include:
+  - name: resource
+    values:
+      includeVar: includeVar
+      cliVar: should be overridden (include)
diff --git a/ops/kontemplate/context/testdata/merging/import-vars.yaml b/ops/kontemplate/context/testdata/merging/import-vars.yaml
new file mode 100644
index 0000000000..2a51352571
--- /dev/null
+++ b/ops/kontemplate/context/testdata/merging/import-vars.yaml
@@ -0,0 +1,4 @@
+importVar: importVar
+globalVar: should be overridden (import)
+includeVar: should be overridden (import)
+cliVar: should be overridden (import)
diff --git a/ops/kontemplate/context/testdata/merging/resource/default.yaml b/ops/kontemplate/context/testdata/merging/resource/default.yaml
new file mode 100644
index 0000000000..040a19aaba
--- /dev/null
+++ b/ops/kontemplate/context/testdata/merging/resource/default.yaml
@@ -0,0 +1,5 @@
+defaultVar: defaultVar
+importVar: should be overridden (default)
+globalVar: should be overridden (default)
+includeVar: should be overridden (default)
+cliVar: should be overridden (default)
diff --git a/ops/kontemplate/context/testdata/merging/resource/output.yaml b/ops/kontemplate/context/testdata/merging/resource/output.yaml
new file mode 100644
index 0000000000..5920b27207
--- /dev/null
+++ b/ops/kontemplate/context/testdata/merging/resource/output.yaml
@@ -0,0 +1,5 @@
+defaultVar: {{ .defaultVar }}
+importVar: {{ .importVar }}
+globalVar: {{ .globalVar }}
+includeVar: {{ .includeVar }}
+cliVar: {{ .cliVar }}
diff --git a/ops/kontemplate/context/testdata/parent-variable-override.yaml b/ops/kontemplate/context/testdata/parent-variable-override.yaml
new file mode 100644
index 0000000000..42676c3028
--- /dev/null
+++ b/ops/kontemplate/context/testdata/parent-variable-override.yaml
@@ -0,0 +1,10 @@
+---
+context: k8s.prod.mydomain.com
+include:
+  - name: parent
+    values:
+      foo: bar
+    include:
+      - name: child
+        values:
+          foo: newvalue
diff --git a/ops/kontemplate/context/testdata/parent-variables.yaml b/ops/kontemplate/context/testdata/parent-variables.yaml
new file mode 100644
index 0000000000..8459fd3040
--- /dev/null
+++ b/ops/kontemplate/context/testdata/parent-variables.yaml
@@ -0,0 +1,10 @@
+---
+context: k8s.prod.mydomain.com
+include:
+  - name: parent
+    values:
+      foo: bar
+    include:
+      - name: child
+        values:
+          bar: baz
diff --git a/ops/kontemplate/context/testdata/test-vars-override.yaml b/ops/kontemplate/context/testdata/test-vars-override.yaml
new file mode 100644
index 0000000000..5215c559c1
--- /dev/null
+++ b/ops/kontemplate/context/testdata/test-vars-override.yaml
@@ -0,0 +1,3 @@
+---
+override: 3
+place: Oslo
diff --git a/ops/kontemplate/context/testdata/test-vars.yaml b/ops/kontemplate/context/testdata/test-vars.yaml
new file mode 100644
index 0000000000..af27bdc455
--- /dev/null
+++ b/ops/kontemplate/context/testdata/test-vars.yaml
@@ -0,0 +1,5 @@
+---
+override: 'true'
+music:
+  artist: Pallida
+  track: Tractor Beam
diff --git a/ops/kontemplate/default.nix b/ops/kontemplate/default.nix
new file mode 100644
index 0000000000..8a56bba7fe
--- /dev/null
+++ b/ops/kontemplate/default.nix
@@ -0,0 +1,36 @@
+# Copyright (C) 2016-2019  Vincent Ambo <mail@tazj.in>
+#
+# This file is part of Kontemplate.
+#
+# Kontemplate is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This file is the Nix derivation used to install Kontemplate on
+# Nix-based systems.
+
+{ pkgs, ... }:
+
+with pkgs.third_party; buildGoPackage rec {
+  name = "kontemplate-${version}";
+  version = "master";
+  src = ./.;
+  goPackagePath = "github.com/tazjin/kontemplate";
+  goDeps = ./deps.nix;
+  buildInputs = [ parallel ];
+
+  # Enable checks and configure check-phase to include vet:
+  doCheck = true;
+  preCheck = ''
+    for pkg in $(getGoDirs ""); do
+      buildGoDir vet "$pkg"
+    done
+  '';
+
+  meta = with lib; {
+    description = "A resource templating helper for Kubernetes";
+    homepage = "http://kontemplate.works/";
+    license = licenses.gpl3;
+  };
+}
diff --git a/ops/kontemplate/deps.nix b/ops/kontemplate/deps.nix
new file mode 100644
index 0000000000..7693968bd5
--- /dev/null
+++ b/ops/kontemplate/deps.nix
@@ -0,0 +1,111 @@
+# This file was generated by https://github.com/kamilchm/go2nix v1.3.0
+[
+  {
+    goPackagePath = "github.com/Masterminds/goutils";
+    fetch = {
+      type = "git";
+      url = "https://github.com/Masterminds/goutils";
+      rev = "41ac8693c5c10a92ea1ff5ac3a7f95646f6123b0";
+      sha256 = "180px47gj936qyk5bkv5mbbgiil9abdjq6kwkf7sq70vyi9mcfiq";
+    };
+  }
+  {
+    goPackagePath = "github.com/Masterminds/semver";
+    fetch = {
+      type = "git";
+      url = "https://github.com/Masterminds/semver";
+      rev = "5bc3b9184d48f1412b300b87a200cf020d9254cf";
+      sha256 = "1vdfm653v50jf63cw0kg2hslx50cn4mk6lj3p51bi11jrg48kfng";
+    };
+  }
+  {
+    goPackagePath = "github.com/Masterminds/sprig";
+    fetch = {
+      type = "git";
+      url = "https://github.com/Masterminds/sprig";
+      rev = "6f509977777c33eae63b2136d97f7b976cb971cc";
+      sha256 = "05h9k6fhjxnpwlihj3z02q9kvqvnq53jix0ab84sx0666bci3cdh";
+    };
+  }
+  {
+    goPackagePath = "github.com/alecthomas/template";
+    fetch = {
+      type = "git";
+      url = "https://github.com/alecthomas/template";
+      rev = "fb15b899a75114aa79cc930e33c46b577cc664b1";
+      sha256 = "1vlasv4dgycydh5wx6jdcvz40zdv90zz1h7836z7lhsi2ymvii26";
+    };
+  }
+  {
+    goPackagePath = "github.com/alecthomas/units";
+    fetch = {
+      type = "git";
+      url = "https://github.com/alecthomas/units";
+      rev = "c3de453c63f4bdb4dadffab9805ec00426c505f7";
+      sha256 = "0js37zlgv37y61j4a2d46jh72xm5kxmpaiw0ya9v944bjpc386my";
+    };
+  }
+  {
+    goPackagePath = "github.com/ghodss/yaml";
+    fetch = {
+      type = "git";
+      url = "https://github.com/ghodss/yaml";
+      rev = "25d852aebe32c875e9c044af3eef9c7dc6bc777f";
+      sha256 = "1w9yq0bxzygc4qwkwwiy7k1k1yviaspcqqv18255k2xkjv5ipccz";
+    };
+  }
+  {
+    goPackagePath = "github.com/google/uuid";
+    fetch = {
+      type = "git";
+      url = "https://github.com/google/uuid";
+      rev = "c2e93f3ae59f2904160ceaab466009f965df46d6";
+      sha256 = "0zw8fvl6jqg0fmv6kmvhss0g4gkrbvgyvl2zgy5wdbdlgp4fja0h";
+    };
+  }
+  {
+    goPackagePath = "github.com/huandu/xstrings";
+    fetch = {
+      type = "git";
+      url = "https://github.com/huandu/xstrings";
+      rev = "8bbcf2f9ccb55755e748b7644164cd4bdce94c1d";
+      sha256 = "1ivvc95514z63k7cpz71l0dwlanffmsh1pijhaqmp41kfiby8rsx";
+    };
+  }
+  {
+    goPackagePath = "github.com/imdario/mergo";
+    fetch = {
+      type = "git";
+      url = "https://github.com/imdario/mergo";
+      rev = "4c317f2286be3bd0c4f1a0e622edc6398ec4656d";
+      sha256 = "0bihha1qsgfjk14yv1hwddv3d8dzxpbjlaxwwyys6lhgxz1cr9h9";
+    };
+  }
+  {
+    goPackagePath = "golang.org/x/crypto";
+    fetch = {
+      type = "git";
+      url = "https://go.googlesource.com/crypto";
+      rev = "9756ffdc24725223350eb3266ffb92590d28f278";
+      sha256 = "0q7hxaaq6lp0v8qqzifvysl47z5rfdlrxkh3d29vsl3wyby3dxl8";
+    };
+  }
+  {
+    goPackagePath = "gopkg.in/alecthomas/kingpin.v2";
+    fetch = {
+      type = "git";
+      url = "https://gopkg.in/alecthomas/kingpin.v2";
+      rev = "947dcec5ba9c011838740e680966fd7087a71d0d";
+      sha256 = "0mndnv3hdngr3bxp7yxfd47cas4prv98sqw534mx7vp38gd88n5r";
+    };
+  }
+  {
+    goPackagePath = "gopkg.in/yaml.v2";
+    fetch = {
+      type = "git";
+      url = "https://gopkg.in/yaml.v2";
+      rev = "51d6538a90f86fe93ac480b35f37b2be17fef232";
+      sha256 = "01wj12jzsdqlnidpyjssmj0r4yavlqy7dwrg7adqd8dicjc4ncsa";
+    };
+  }
+]
diff --git a/ops/kontemplate/docs/cluster-config.md b/ops/kontemplate/docs/cluster-config.md
new file mode 100644
index 0000000000..4e87016179
--- /dev/null
+++ b/ops/kontemplate/docs/cluster-config.md
@@ -0,0 +1,106 @@
+Cluster configuration
+==========================
+
+Every cluster (or "environment") that requires individual configuration is specified in
+a very simple YAML file in Kontemplate.
+
+An example file for a hypothetical test environment could look like this:
+
+```yaml
+---
+context: k8s.test.mydomain.com
+global:
+  clusterName: test-cluster
+  defaultReplicas: 2
+import:
+  - test-secrets.yaml
+include:
+  - name: gateway
+    path: tools/nginx
+    values:
+      tlsDomains:
+        - test.oslo.pub
+        - test.tazj.in
+  - path: backend
+    values:
+      env: test
+    include:
+      - name: blog
+        values:
+          url: test.tazj.in
+      - name: pub-service
+```
+
+<!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc-refresh-toc -->
+**Table of Contents**
+
+- [Cluster configuration](#cluster-configuration)
+    - [Fields](#fields)
+        - [`context`](#context)
+        - [`global`](#global)
+        - [`import`](#import)
+        - [`include`](#include)
+    - [External variables](#external-variables)
+
+<!-- markdown-toc end -->
+
+## Fields
+
+This is documentation for the individual fields in a cluster context file.
+
+### `context`
+
+The `context` field contains the name of the kubectl-context. You can list context names with
+'kubectl config get-contexts'.
+
+This must be set here so that Kontemplate can use the correct context when calling kubectl.
+
+This field is **required** for `kubectl`-wrapping commands. It can be left out if only the `template`-command is used.
+
+### `global`
+
+The `global` field contains a key/value map of variables that should be available to all resource
+sets in the cluster.
+
+This field is **optional**.
+
+### `import`
+
+The `import` field contains the file names of additional YAML or JSON files from which global
+variables should be loaded. Using this field makes it possible to keep certain configuration that
+is the same for some, but not all, clusters in a common place.
+
+This field is **optional**.
+
+### `include`
+
+The `include` field contains the actual resource sets to be included in the cluster.
+
+Information about the structure of resource sets can be found in the [resource set documentation][].
+
+This field is **required**.
+
+## External variables
+
+As mentioned above, extra variables can be loaded from additional YAML or JSON files. Assuming you
+have a file called `test-secrets.yaml` which contains variables that should be shared between a `test`
+and `dev` cluster, you could import it in your context as such:
+
+```yaml
+# test-secrets.yaml:
+mySecretVar: foo-bar-12345
+
+# test-cluster.yaml:
+context: k8s.test.mydomain.com
+import:
+  - test-secrets.yaml
+
+# dev-cluster.yaml:
+context: k8s.dev.mydomain.com
+import:
+  - test-secrets.yaml
+```
+
+The variable `mySecretVar` is then available as a global variable.
+
+[resource set documentation]: resource-sets.md
diff --git a/ops/kontemplate/docs/resource-sets.md b/ops/kontemplate/docs/resource-sets.md
new file mode 100644
index 0000000000..1444dd4912
--- /dev/null
+++ b/ops/kontemplate/docs/resource-sets.md
@@ -0,0 +1,170 @@
+Resource Sets
+================
+
+Resource sets are collections of Kubernetes resources that should be passed to `kubectl` together.
+
+Technically a resource set is simply a folder with a few YAML and/or JSON templates in it.
+
+<!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc-refresh-toc -->
+**Table of Contents**
+
+- [Resource Sets](#resource-sets)
+- [Creating resource sets](#creating-resource-sets)
+    - [Default variables](#default-variables)
+- [Including resource sets](#including-resource-sets)
+    - [Fields](#fields)
+        - [`name`](#name)
+        - [`path`](#path)
+        - [`values`](#values)
+        - [`args`](#args)
+        - [`include`](#include)
+    - [Multiple includes](#multiple-includes)
+    - [Nesting resource sets](#nesting-resource-sets)
+        - [Caveats](#caveats)
+
+<!-- markdown-toc end -->
+
+# Creating resource sets
+
+Simply create a folder in your Kontemplate repository and place a YAML or JSON file in it. These
+files get interpreted as [templates][] during Kontemplate runs and variables (as well as template
+logic or functions) will be interpolated.
+
+Refer to the template documentation for information on how to write templates.
+
+## Default variables
+
+Sometimes it is useful to specify default values for variables that should be interpolated during
+a run if the [cluster configuration][] does not specify a variable explicitly.
+
+This can be done simply by placing a `default.yaml` or `default.json` file in the resource set
+folder and filling it with key/value pairs of the intended default variables.
+
+Kontemplate will error during interpolation if any variables are left unspecified.
+
+# Including resource sets
+
+Under the cluster configuration `include` key resource sets are included and required variables
+are specified. For example:
+
+```yaml
+include:
+  - name: some-api
+    values:
+      version: 1.2-SNAPSHOT
+```
+
+This will include a resource set from a folder called `some-api` and set the specified `version` variable.
+
+## Fields
+
+The available fields when including a resource set are these:
+
+### `name`
+
+The `name` field contains the name of the resource set. This name can be used to refer to the resource set
+when specifying explicit includes or excludes during a run.
+
+By default it is assumed that the `name` is the path to the resource set folder, but this can be overridden.
+
+This field is **required**.
+
+### `path`
+
+The `path` field specifies an explicit path to a resource set folder in the case that it should differ from
+the resource set's `name`.
+
+This field is **optional**.
+
+### `values`
+
+The `values` field specifies key/values pairs of variables that should be available during templating.
+
+This field is **optional**.
+
+### `args`
+
+The `args` field specifies a list of arguments that should be passed to `kubectl`.
+
+This field is **optional**.
+
+### `include`
+
+The `include` field specifies additional resource sets that should be included and that should inherit the
+variables of this resource set.
+
+The fully qualified names of "nested" resource sets are set to `${PARENT_NAME}/${CHILD_NAME}` and paths are
+merged in the same way.
+
+This makes it easy to organise different resource sets as "groups" to include / exclude them collectively
+during runs.
+
+This field is **optional**.
+
+## Multiple includes
+
+Resource sets can be included multiple times with different configurations. In this case it is recommended
+to set the `path` and `name` fields explicitly. For example:
+
+```yaml
+include:
+  - name: forwarder-europe
+    path: tools/forwarder
+    values:
+      source: europe
+  - name: forwarder-asia
+    path: tools/forwarder
+    values:
+      source: asia
+```
+
+The two different configurations can be referred to by their set names, but will use the same resource
+templates with different configurations.
+
+## Nesting resource sets
+
+As mentioned above for the `include` field, resource sets can be nested. This lets users group resource
+sets in logical ways using simple folder structures.
+
+Assuming a folder structure like:
+
+```
+├── backend
+│   ├── auth-api
+│   ├── message-api
+│   └── order-api
+└── frontend
+    ├── app-page
+    └── login-page
+```
+
+With each of these folders being a resource set, they could be included in a cluster configuration like so:
+
+```yaml
+include:
+  - name: backend
+    include:
+      - name: auth-api
+      - name: message-api
+      - name: order-api
+  - name: frontend:
+    include:
+      - name: app-page
+      - name: login-page
+```
+
+Kontemplate could then be run with, for example, `--include backend` to only include the resource sets nested
+in the backend group. Specific resource sets can also be targeted, for example as `--include backend/order-api`.
+
+Variables specified in the parent resource set are inherited by the children.
+
+### Caveats
+
+Two caveats apply that users should be aware of:
+
+1. The parent resource set can not contain any resource templates itself.
+
+2. Only one level of nesting is supported. Specifying `include` again on a nested resource set will be ignored.
+
+[templates]: templates.md
+[cluster configuration]: cluster-config.md
diff --git a/ops/kontemplate/docs/templates.md b/ops/kontemplate/docs/templates.md
new file mode 100644
index 0000000000..32da205108
--- /dev/null
+++ b/ops/kontemplate/docs/templates.md
@@ -0,0 +1,153 @@
+Kontemplate templates
+=====================
+
+The template file format is based on Go's [templating engine][] in combination
+with a small extension library called [sprig][] that adds additional template
+functions.
+
+Go templates can either simply display variables or build more complicated
+*pipelines* in which variables are passed to functions for further processing,
+or in which conditionals are evaluated for more complex template logic.
+
+It is recommended that you check out the Golang [documentation][] for the templating
+engine in addition to the cherry-picked features listed here.
+
+<!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc-refresh-toc -->
+**Table of Contents**
+
+- [Kontemplate templates](#kontemplate-templates)
+    - [Basic variable interpolation](#basic-variable-interpolation)
+        - [Example:](#example)
+    - [Template functions](#template-functions)
+    - [Examples:](#examples)
+    - [Conditionals & ranges](#conditionals--ranges)
+    - [Caveats](#caveats)
+
+<!-- markdown-toc end -->
+
+## Basic variable interpolation
+
+The basic template format uses `{{ .variableName }}` as the interpolation format.
+
+### Example:
+
+Assuming that you include a resource set as such:
+
+```
+- name: api-gateway
+  values:
+    internalHost: http://my-internal-host/
+```
+
+And the api-gateway resource set includes a ConfigMap (some fields left out for
+the example):
+
+```
+# api-gateway/configmap.yaml:
+---
+kind: ConfigMap
+metadata:
+  name: api-gateway-config
+data:
+  internalHost: {{ .internalHost }}
+```
+
+The resulting output will be:
+
+```
+
+---
+kind: ConfigMap
+metadata:
+  name: api-gateway-config
+data:
+  internalHost: http://my-internal-host/
+```
+
+## Template functions
+
+Go templates support template functions which you can think of as a sort of
+shell-like pipeline where text flows through transformations from left to
+right.
+
+Some template functions come from Go's standard library and are listed in the
+[Go documentation][]. In addition the functions declared by [sprig][] are
+available in kontemplate, as well as five custom functions:
+
+* `json`: Encodes any supplied data structure as JSON.
+* `gitHEAD`: Retrieves the commit hash at Git `HEAD`.
+* `passLookup`: Looks up the supplied key in [pass][].
+* `insertFile`: Insert the contents of the given file in the resource
+  set folder as a string.
+* `insertTemplate`: Insert the contents of the given template in the resource
+  set folder as a string.
+
+## Examples:
+
+```
+# With the following values:
+name: Donald
+certKeyPath: my-website/cert-key
+
+# The following interpolations are possible:
+
+{{ .name | upper }}
+-> DONALD
+
+{{ .name | upper | repeat 2 }}
+-> DONALD DONALD
+
+{{ .certKeyPath | passLookup }}
+-> Returns content of 'my-website/cert-key' from pass
+
+{{ gitHEAD }}
+-> Returns the Git commit hash at HEAD.
+```
+
+## Conditionals & ranges
+
+Some logic is supported in Golang templates and can be used in Kontemplate, too.
+
+With the following values:
+
+```
+useKube2IAM: true
+servicePorts:
+  - 8080
+  - 9090
+```
+
+The following interpolations are possible:
+
+```
+# Conditionally insert something in the template:
+metadata:
+  annotations:
+    foo: bar
+    {{ if .useKube2IAM -}} iam.amazonaws.com/role: my-api {{- end }}
+```
+
+```
+# Iterate over a list of values
+ports:
+  {{ range .servicePorts }}
+  - port: {{ . }}
+  {{ end }}
+```
+
+Check out the Golang documentation (linked above) for more information about template logic.
+
+## Caveats
+
+Kontemplate does not by itself parse any of the content of the templates, which
+means that it does not validate whether the resources you supply are valid YAML
+or JSON.
+
+You can perform some validation by using `kontemplate apply --dry-run` which
+will make use of the Dry-Run functionality in `kubectl`.
+
+[templating engine]: https://golang.org/pkg/text/template/
+[documentation]: https://golang.org/pkg/text/template/
+[sprig]: http://masterminds.github.io/sprig/
+[Go documentation]: https://golang.org/pkg/text/template/#hdr-Functions
+[pass]: https://www.passwordstore.org/
diff --git a/ops/kontemplate/docs/tips-and-tricks.md b/ops/kontemplate/docs/tips-and-tricks.md
new file mode 100644
index 0000000000..5401ac91e5
--- /dev/null
+++ b/ops/kontemplate/docs/tips-and-tricks.md
@@ -0,0 +1,77 @@
+Kontemplate tips & tricks
+=========================
+
+<!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc-refresh-toc -->
+**Table of Contents**
+
+- [Kontemplate tips & tricks](#kontemplate-tips--tricks)
+    - [Update Deployments when ConfigMaps change](#update-deployments-when-configmaps-change)
+    - [direnv & pass](#direnv--pass)
+
+<!-- markdown-toc end -->
+
+## Update Deployments when ConfigMaps change
+
+Kubernetes does [not currently][] have the ability to perform rolling updates
+of Deployments and other resource types when `ConfigMap` or `Secret` objects
+are updated.
+
+It is possible to make use of annotations and templating functions in
+Kontemplate to force updates to these resources anyways.
+ 
+For example:
+
+```yaml
+# A ConfigMap that contains some configuration for your app
+---
+kind: ConfigMap
+metadata:
+  name: app-config
+data:
+  app.conf: |
+    name: {{ .appName }}
+    foo: bar
+```
+
+Now whenever the `appName` variable changes or we make an edit to the
+`ConfigMap` we would like to update the `Deployment` making use of it, too. We
+can do this by adding a hash of the parsed template to the annotations of the
+created `Pod` objects:
+
+```yaml
+
+---
+kind: Deployment
+metadata:
+  name: app
+spec:
+  template:
+    metadata:
+      annotations:
+        configHash: {{ insertTemplate "app-config.yaml" | sha256sum }}
+    spec:
+      containers:
+        - name: app
+          # Some details omitted ... 
+          volumeMounts:
+            - name: config
+              mountPath: /etc/app/
+      volumes:
+        - name: config
+          configMap:
+            name: app-config
+```
+
+Now any change to the `ConfigMap` - either by directly editing the yaml file or
+via a changed template variable - will cause the annotation to change,
+triggering a rolling update of all relevant pods.
+
+## direnv & pass
+
+Users of `pass` may have multiple different password stores on their machines.
+Assuming that `kontemplate` configuration exists somewhere on the filesystem
+per project, it is easy to use [direnv][] to switch to the correct
+`PASSWORD_STORE_DIR` variable when entering the folder.
+
+[not currently]: https://github.com/kubernetes/kubernetes/issues/22368
+[direnv]: https://direnv.net/
diff --git a/ops/kontemplate/example/other-config.yaml b/ops/kontemplate/example/other-config.yaml
new file mode 100644
index 0000000000..87370569c4
--- /dev/null
+++ b/ops/kontemplate/example/other-config.yaml
@@ -0,0 +1,7 @@
+---
+apiVersion: extensions/v1beta1
+kind: ConfigMap
+metadata:
+  name: other-config
+data:
+  globalData: {{ .globalVar }}
diff --git a/ops/kontemplate/example/prod-cluster.json b/ops/kontemplate/example/prod-cluster.json
new file mode 100644
index 0000000000..70e2365f17
--- /dev/null
+++ b/ops/kontemplate/example/prod-cluster.json
@@ -0,0 +1,16 @@
+{
+  "context": "k8s.prod.mydomain.com",
+  "global": {
+    "globalVar": "lizards"
+  },
+  "include": [
+    {
+      "name": "some-api",
+      "values": {
+        "version": "1.0-SNAPSHOT-0e6884d",
+        "importantFeature": true,
+        "apiPort": 4567
+      }
+    }
+  ]
+}
diff --git a/ops/kontemplate/example/prod-cluster.yaml b/ops/kontemplate/example/prod-cluster.yaml
new file mode 100644
index 0000000000..9f300a4920
--- /dev/null
+++ b/ops/kontemplate/example/prod-cluster.yaml
@@ -0,0 +1,17 @@
+---
+context: k8s.prod.mydomain.com
+global:
+  globalVar: lizards
+include:
+  # By default resource sets are included from a folder with the same
+  # name as the resource set's name
+  - name: some-api
+    values:
+      version: 1.0-0e6884d
+      importantFeature: true
+      apiPort: 4567
+
+  # Paths can also be specified manually (and point at single template
+  # files!)
+  - name: other-config
+    path: other-config.yaml
diff --git a/ops/kontemplate/example/some-api/some-api.yaml b/ops/kontemplate/example/some-api/some-api.yaml
new file mode 100644
index 0000000000..f0188f9dbd
--- /dev/null
+++ b/ops/kontemplate/example/some-api/some-api.yaml
@@ -0,0 +1,52 @@
+---
+apiVersion: v1
+kind: Secret
+metadata:
+  name: secret-certificate
+data:
+  cert.pem: {{ passLookup "my/secret/certificate" | b64enc }}
+---
+apiVersion: extensions/v1beta1
+kind: ConfigMap
+metadata:
+  name: some-config
+data:
+  # The content of the example configuration file is templated in here
+  # by the 'insertFile' function and indented for YAML-compatibility
+  # with the 'indent' function:
+  some.cfg: |
+{{ insertFile "some.cfg" | indent 4 }}
+---
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: some-api
+spec:
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: some-api
+    spec:
+      containers:
+        - image: my.container.repo/some-api:{{ .version }}
+          name: some-api
+          env:
+            - name: ENABLE_IMPORTANT_FEATURE
+              value: {{ .importantFeature }}
+            - name: SOME_GLOBAL_VAR
+              value: {{ .globalVar }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: some-api
+  labels:
+    app: some-api
+spec:
+  selector:
+    app: some-api
+  ports:
+    - port: 80
+      targetPort: {{ .apiPort }}
+      name: http
diff --git a/ops/kontemplate/example/some-api/some.cfg b/ops/kontemplate/example/some-api/some.cfg
new file mode 100644
index 0000000000..733d5e1678
--- /dev/null
+++ b/ops/kontemplate/example/some-api/some.cfg
@@ -0,0 +1,4 @@
+{
+  "something": 1542,
+  "other-thing": "да"
+}
diff --git a/ops/kontemplate/image/Dockerfile b/ops/kontemplate/image/Dockerfile
new file mode 100644
index 0000000000..a40fa83b08
--- /dev/null
+++ b/ops/kontemplate/image/Dockerfile
@@ -0,0 +1,15 @@
+FROM alpine:3.10
+
+ADD hashes /root/hashes
+ADD https://storage.googleapis.com/kubernetes-release/release/v1.15.3/bin/linux/amd64/kubectl /usr/bin/kubectl
+ADD https://github.com/tazjin/kontemplate/releases/download/v1.8.0/kontemplate-1.8.0-6c3b299-linux-amd64.tar.gz /tmp/kontemplate.tar.gz
+
+# Pass release version is 1.7.3
+ADD https://raw.githubusercontent.com/zx2c4/password-store/74fdfb5022f317ad48d449e29543710bdad1afda/src/password-store.sh /usr/bin/pass
+
+RUN sha256sum -c /root/hashes && \
+    apk add -U bash tree gnupg git && \
+    chmod +x /usr/bin/kubectl /usr/bin/pass && \
+    tar xzvf /tmp/kontemplate.tar.gz && \
+    mv kontemplate /usr/bin/kontemplate && \
+    /usr/bin/kontemplate version
diff --git a/ops/kontemplate/image/README.md b/ops/kontemplate/image/README.md
new file mode 100644
index 0000000000..fe04765401
--- /dev/null
+++ b/ops/kontemplate/image/README.md
@@ -0,0 +1,12 @@
+Kontemplate Docker image
+========================
+
+This builds a simple Docker image available on the Docker Hub as `tazjin/kontemplate`.
+
+Builds are automated based on the Dockerfile contained here.
+
+It contains both `kontemplate` and `kubectl` and can be used as part of container-based
+CI pipelines.
+
+`pass` and its dependencies are also installed to enable the use of the `passLookup`
+template function if desired.
diff --git a/ops/kontemplate/image/hashes b/ops/kontemplate/image/hashes
new file mode 100644
index 0000000000..bfd87c0201
--- /dev/null
+++ b/ops/kontemplate/image/hashes
@@ -0,0 +1,2 @@
+a39dfdd77e4655acaabe301285cf389cb5fc8145060f5677dc93db1cc20911a4  /tmp/kontemplate.tar.gz
+6e805054a1fb2280abb53f75b57a1b92bf9c66ffe0d2cdcd46e81b079d93c322  /usr/bin/kubectl
diff --git a/ops/kontemplate/main.go b/ops/kontemplate/main.go
new file mode 100644
index 0000000000..e55d42465c
--- /dev/null
+++ b/ops/kontemplate/main.go
@@ -0,0 +1,242 @@
+// Copyright (C) 2016-2019  Vincent Ambo <mail@tazj.in>
+//
+// Kontemplate is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+package main
+
+import (
+	"fmt"
+	"os"
+	"os/exec"
+	"strings"
+
+	"github.com/tazjin/kontemplate/context"
+	"github.com/tazjin/kontemplate/templater"
+	"gopkg.in/alecthomas/kingpin.v2"
+)
+
+const version string = "1.8.0"
+
+// This variable will be initialised by the Go linker during the builder
+var gitHash string
+
+var (
+	app = kingpin.New("kontemplate", "simple Kubernetes resource templating")
+
+	// Global flags
+	includes   = app.Flag("include", "Resource sets to include explicitly").Short('i').Strings()
+	excludes   = app.Flag("exclude", "Resource sets to exclude explicitly").Short('e').Strings()
+	variables  = app.Flag("var", "Provide variables to templates explicitly").Strings()
+	kubectlBin = app.Flag("kubectl", "Path to the kubectl binary (default 'kubectl')").Default("kubectl").String()
+
+	// Commands
+	template          = app.Command("template", "Template resource sets and print them")
+	templateFile      = template.Arg("file", "Cluster configuration file to use").Required().String()
+	templateOutputDir = template.Flag("output", "Output directory in which to save templated files instead of printing them").Short('o').String()
+
+	apply       = app.Command("apply", "Template resources and pass to 'kubectl apply'")
+	applyFile   = apply.Arg("file", "Cluster configuration file to use").Required().String()
+	applyDryRun = apply.Flag("dry-run", "Print remote operations without executing them").Default("false").Bool()
+
+	replace     = app.Command("replace", "Template resources and pass to 'kubectl replace'")
+	replaceFile = replace.Arg("file", "Cluster configuration file to use").Required().String()
+
+	delete     = app.Command("delete", "Template resources and pass to 'kubectl delete'")
+	deleteFile = delete.Arg("file", "Cluster configuration file to use").Required().String()
+
+	create     = app.Command("create", "Template resources and pass to 'kubectl create'")
+	createFile = create.Arg("file", "Cluster configuration file to use").Required().String()
+
+	versionCmd = app.Command("version", "Show kontemplate version")
+)
+
+func main() {
+	app.HelpFlag.Short('h')
+
+	switch kingpin.MustParse(app.Parse(os.Args[1:])) {
+	case template.FullCommand():
+		templateCommand()
+
+	case apply.FullCommand():
+		applyCommand()
+
+	case replace.FullCommand():
+		replaceCommand()
+
+	case delete.FullCommand():
+		deleteCommand()
+
+	case create.FullCommand():
+		createCommand()
+
+	case versionCmd.FullCommand():
+		versionCommand()
+	}
+}
+
+func versionCommand() {
+	if gitHash == "" {
+		fmt.Printf("Kontemplate version %s (git commit unknown)\n", version)
+	} else {
+		fmt.Printf("Kontemplate version %s (git commit: %s)\n", version, gitHash)
+	}
+}
+
+func templateCommand() {
+	_, resourceSets := loadContextAndResources(templateFile)
+
+	for _, rs := range *resourceSets {
+		if len(rs.Resources) == 0 {
+			fmt.Fprintf(os.Stderr, "Warning: Resource set '%s' does not exist or contains no valid templates\n", rs.Name)
+			continue
+		}
+
+		if *templateOutputDir != "" {
+			templateIntoDirectory(templateOutputDir, rs)
+		} else {
+			for _, r := range rs.Resources {
+				fmt.Fprintf(os.Stderr, "Rendered file %s/%s:\n", rs.Name, r.Filename)
+				fmt.Println(r.Rendered)
+			}
+		}
+	}
+}
+
+func templateIntoDirectory(outputDir *string, rs templater.RenderedResourceSet) {
+	// Attempt to create the output directory if it does not
+	// already exist:
+	if err := os.MkdirAll(*templateOutputDir, 0775); err != nil {
+		app.Fatalf("Could not create output directory: %v\n", err)
+	}
+
+	// Nested resource sets may contain slashes in their names.
+	// These are replaced with dashes for the purpose of writing a
+	// flat list of output files:
+	setName := strings.Replace(rs.Name, "/", "-", -1)
+
+	for _, r := range rs.Resources {
+		filename := fmt.Sprintf("%s/%s-%s", *templateOutputDir, setName, r.Filename)
+		fmt.Fprintf(os.Stderr, "Writing file %s\n", filename)
+
+		file, err := os.Create(filename)
+		if err != nil {
+			app.Fatalf("Could not create file %s: %v\n", filename, err)
+		}
+
+		_, err = fmt.Fprintf(file, r.Rendered)
+		if err != nil {
+			app.Fatalf("Error writing file %s: %v\n", filename, err)
+		}
+	}
+}
+
+func applyCommand() {
+	ctx, resources := loadContextAndResources(applyFile)
+
+	var kubectlArgs []string
+
+	if *applyDryRun {
+		kubectlArgs = []string{"apply", "-f", "-", "--dry-run"}
+	} else {
+		kubectlArgs = []string{"apply", "-f", "-"}
+	}
+
+	if err := runKubectlWithResources(ctx, &kubectlArgs, resources); err != nil {
+		failWithKubectlError(err)
+	}
+}
+
+func replaceCommand() {
+	ctx, resources := loadContextAndResources(replaceFile)
+	args := []string{"replace", "--save-config=true", "-f", "-"}
+
+	if err := runKubectlWithResources(ctx, &args, resources); err != nil {
+		failWithKubectlError(err)
+	}
+}
+
+func deleteCommand() {
+	ctx, resources := loadContextAndResources(deleteFile)
+	args := []string{"delete", "-f", "-"}
+
+	if err := runKubectlWithResources(ctx, &args, resources); err != nil {
+		failWithKubectlError(err)
+	}
+}
+
+func createCommand() {
+	ctx, resources := loadContextAndResources(createFile)
+	args := []string{"create", "--save-config=true", "-f", "-"}
+
+	if err := runKubectlWithResources(ctx, &args, resources); err != nil {
+		failWithKubectlError(err)
+	}
+}
+
+func loadContextAndResources(file *string) (*context.Context, *[]templater.RenderedResourceSet) {
+	ctx, err := context.LoadContext(*file, variables)
+	if err != nil {
+		app.Fatalf("Error loading context: %v\n", err)
+	}
+
+	resources, err := templater.LoadAndApplyTemplates(includes, excludes, ctx)
+	if err != nil {
+		app.Fatalf("Error templating resource sets: %v\n", err)
+	}
+
+	return ctx, &resources
+}
+
+func runKubectlWithResources(c *context.Context, kubectlArgs *[]string, resourceSets *[]templater.RenderedResourceSet) error {
+	argsWithContext := append(*kubectlArgs, fmt.Sprintf("--context=%s", c.Name))
+
+	for _, rs := range *resourceSets {
+		if len(rs.Resources) == 0 {
+			fmt.Fprintf(os.Stderr, "Warning: Resource set '%s' contains no valid templates\n", rs.Name)
+			continue
+		}
+
+		argsWithResourceSetArgs := append(argsWithContext, rs.Args...)
+
+		kubectl := exec.Command(*kubectlBin, argsWithResourceSetArgs...)
+
+		stdin, err := kubectl.StdinPipe()
+		if err != nil {
+			return fmt.Errorf("kubectl error: %v", err)
+		}
+
+		kubectl.Stdout = os.Stdout
+		kubectl.Stderr = os.Stderr
+
+		if err = kubectl.Start(); err != nil {
+			return fmt.Errorf("kubectl error: %v", err)
+		}
+
+		for _, r := range rs.Resources {
+			fmt.Printf("Passing file %s/%s to kubectl\n", rs.Name, r.Filename)
+			fmt.Fprintln(stdin, r.Rendered)
+		}
+		stdin.Close()
+
+		if err = kubectl.Wait(); err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func failWithKubectlError(err error) {
+	app.Fatalf("Kubectl error: %v\n", err)
+}
diff --git a/ops/kontemplate/release.nix b/ops/kontemplate/release.nix
new file mode 100644
index 0000000000..4af08f50c7
--- /dev/null
+++ b/ops/kontemplate/release.nix
@@ -0,0 +1,54 @@
+# Copyright (C) 2016-2019  Vincent Ambo <mail@tazj.in>
+#
+# This file is part of Kontemplate.
+#
+# Kontemplate is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This file is the Nix derivation used to build release binaries for
+# several different architectures and operating systems.
+
+let pkgs = import ((import <nixpkgs> {}).fetchFromGitHub {
+  owner = "NixOS";
+  repo = "nixpkgs-channels";
+  rev = "541d9cce8af7a490fb9085305939569567cb58e6";
+  sha256 = "0jgz72hhzkd5vyq5v69vpljjlnf0lqaz7fh327bvb3cvmwbfxrja";
+}) {};
+in with pkgs; buildGoPackage rec {
+  name = "kontemplate-${version}";
+  version = "master";
+  src = ./.;
+  goPackagePath = "github.com/tazjin/kontemplate";
+  goDeps = ./deps.nix;
+
+  # This configuration enables the building of statically linked
+  # executables. For some reason, those will have multiple references
+  # to the Go compiler's installation path in them, which is the
+  # reason for setting the 'allowGoReference' flag.
+  dontStrip = true; # Linker configuration handles stripping
+  allowGoReference = true;
+  CGO_ENABLED="0";
+  GOCACHE="off";
+
+  # Configure release builds via the "build-matrix" script:
+  buildInputs = [ git ];
+  buildPhase = ''
+    cd go/src/${goPackagePath}
+    patchShebangs build-release.sh
+    ./build-release.sh build
+  '';
+
+  outputs = [ "out" ];
+  installPhase = ''
+    mkdir $out
+    cp -r release/ $out
+  '';
+
+  meta = with lib; {
+    description = "A resource templating helper for Kubernetes";
+    homepage = "http://kontemplate.works/";
+    license = licenses.gpl3;
+  };
+}
diff --git a/ops/kontemplate/templater/dns.go b/ops/kontemplate/templater/dns.go
new file mode 100644
index 0000000000..6cd974dd93
--- /dev/null
+++ b/ops/kontemplate/templater/dns.go
@@ -0,0 +1,35 @@
+// Copyright (C) 2016-2019  Vincent Ambo <mail@tazj.in>
+//
+// This file is part of Kontemplate.
+//
+// Kontemplate is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This file contains the implementation of a template function for retrieving
+// IP addresses from DNS
+
+package templater
+
+import (
+	"fmt"
+	"net"
+	"os"
+)
+
+func GetIPsFromDNS(host string) ([]interface{}, error) {
+	fmt.Fprintf(os.Stderr, "Attempting to look up IP for %s in DNS\n", host)
+	ips, err := net.LookupIP(host)
+
+	if err != nil {
+		return nil, fmt.Errorf("IP address lookup failed: %v", err)
+	}
+
+	var result []interface{} = make([]interface{}, len(ips))
+	for i, ip := range ips {
+		result[i] = ip
+	}
+
+	return result, nil
+}
diff --git a/ops/kontemplate/templater/pass.go b/ops/kontemplate/templater/pass.go
new file mode 100644
index 0000000000..f7fbcb433d
--- /dev/null
+++ b/ops/kontemplate/templater/pass.go
@@ -0,0 +1,34 @@
+// Copyright (C) 2016-2019  Vincent Ambo <mail@tazj.in>
+//
+// This file is part of Kontemplate.
+//
+// Kontemplate is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This file contains the implementation of a template function for retrieving
+// variables from 'pass', the standard UNIX password manager.
+
+package templater
+
+import (
+	"fmt"
+	"os"
+	"os/exec"
+	"strings"
+)
+
+func GetFromPass(key string) (string, error) {
+	fmt.Fprintf(os.Stderr, "Attempting to look up %s in pass\n", key)
+	pass := exec.Command("pass", "show", key)
+
+	output, err := pass.CombinedOutput()
+	if err != nil {
+		return "", fmt.Errorf("Pass lookup failed: %s (%v)", output, err)
+	}
+
+	trimmed := strings.TrimSpace(string(output))
+
+	return trimmed, nil
+}
diff --git a/ops/kontemplate/templater/templater.go b/ops/kontemplate/templater/templater.go
new file mode 100644
index 0000000000..a8f0c670a6
--- /dev/null
+++ b/ops/kontemplate/templater/templater.go
@@ -0,0 +1,236 @@
+// Copyright (C) 2016-2019  Vincent Ambo <mail@tazj.in>
+//
+// This file is part of Kontemplate.
+//
+// Kontemplate is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+package templater
+
+import (
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"os"
+	"os/exec"
+	"path"
+	"strings"
+	"text/template"
+
+	"github.com/Masterminds/sprig"
+	"github.com/tazjin/kontemplate/context"
+	"github.com/tazjin/kontemplate/util"
+)
+
+const failOnMissingKeys string = "missingkey=error"
+
+type RenderedResource struct {
+	Filename string
+	Rendered string
+}
+
+type RenderedResourceSet struct {
+	Name      string
+	Resources []RenderedResource
+	Args      []string
+}
+
+func LoadAndApplyTemplates(include *[]string, exclude *[]string, c *context.Context) ([]RenderedResourceSet, error) {
+	limitedResourceSets := applyLimits(&c.ResourceSets, include, exclude)
+	renderedResourceSets := make([]RenderedResourceSet, 0)
+
+	if len(*limitedResourceSets) == 0 {
+		return renderedResourceSets, fmt.Errorf("No valid resource sets included!")
+	}
+
+	for _, rs := range *limitedResourceSets {
+		set, err := processResourceSet(c, &rs)
+
+		if err != nil {
+			return nil, err
+		}
+
+		renderedResourceSets = append(renderedResourceSets, *set)
+	}
+
+	return renderedResourceSets, nil
+}
+
+func processResourceSet(ctx *context.Context, rs *context.ResourceSet) (*RenderedResourceSet, error) {
+	fmt.Fprintf(os.Stderr, "Loading resources for %s\n", rs.Name)
+
+	fileInfo, err := os.Stat(rs.Path)
+	if err != nil {
+		return nil, err
+	}
+
+	var files []os.FileInfo
+	var resources []RenderedResource
+
+	// Treat single-file resource paths separately from resource
+	// sets containing multiple templates
+	if fileInfo.IsDir() {
+		// Explicitly discard this error, which will give us an empty
+		// list of files instead.
+		// This will end up printing a warning to the user, but it
+		// won't stop the rest of the process.
+		files, _ = ioutil.ReadDir(rs.Path)
+		resources, err = processFiles(ctx, rs, files)
+		if err != nil {
+			return nil, err
+		}
+	} else {
+		resource, err := templateFile(ctx, rs, rs.Path)
+		if err != nil {
+			return nil, err
+		}
+
+		resources = []RenderedResource{resource}
+	}
+
+	return &RenderedResourceSet{
+		Name:      rs.Name,
+		Resources: resources,
+		Args:      rs.Args,
+	}, nil
+}
+
+func processFiles(ctx *context.Context, rs *context.ResourceSet, files []os.FileInfo) ([]RenderedResource, error) {
+	resources := make([]RenderedResource, 0)
+
+	for _, file := range files {
+		if !file.IsDir() && isResourceFile(file) {
+			path := path.Join(rs.Path, file.Name())
+			res, err := templateFile(ctx, rs, path)
+
+			if err != nil {
+				return resources, err
+			}
+
+			resources = append(resources, res)
+		}
+	}
+
+	return resources, nil
+}
+
+func templateFile(ctx *context.Context, rs *context.ResourceSet, filepath string) (RenderedResource, error) {
+	var resource RenderedResource
+
+	tpl, err := template.New(path.Base(filepath)).Funcs(templateFuncs(ctx, rs)).Option(failOnMissingKeys).ParseFiles(filepath)
+	if err != nil {
+		return resource, fmt.Errorf("Could not load template %s: %v", filepath, err)
+	}
+
+	var b bytes.Buffer
+	err = tpl.Execute(&b, rs.Values)
+	if err != nil {
+		return resource, fmt.Errorf("Error while templating %s: %v", filepath, err)
+	}
+
+	resource = RenderedResource{
+		Filename: path.Base(filepath),
+		Rendered: b.String(),
+	}
+
+	return resource, nil
+}
+
+// Applies the limits of explicitly included or excluded resources and returns the updated resource set.
+// Exclude takes priority over include
+func applyLimits(rs *[]context.ResourceSet, include *[]string, exclude *[]string) *[]context.ResourceSet {
+	if len(*include) == 0 && len(*exclude) == 0 {
+		return rs
+	}
+
+	// Exclude excluded resource sets
+	excluded := make([]context.ResourceSet, 0)
+	for _, r := range *rs {
+		if !matchesResourceSet(exclude, &r) {
+			excluded = append(excluded, r)
+		}
+	}
+
+	// Include included resource sets
+	if len(*include) == 0 {
+		return &excluded
+	}
+	included := make([]context.ResourceSet, 0)
+	for _, r := range excluded {
+		if matchesResourceSet(include, &r) {
+			included = append(included, r)
+		}
+	}
+
+	return &included
+}
+
+// Check whether an include/exclude string slice matches a resource set
+func matchesResourceSet(s *[]string, rs *context.ResourceSet) bool {
+	for _, r := range *s {
+		r = strings.TrimSuffix(r, "/")
+		if r == rs.Name || r == rs.Parent {
+			return true
+		}
+	}
+
+	return false
+}
+
+func templateFuncs(c *context.Context, rs *context.ResourceSet) template.FuncMap {
+	m := sprig.TxtFuncMap()
+	m["json"] = func(data interface{}) string {
+		b, _ := json.Marshal(data)
+		return string(b)
+	}
+	m["passLookup"] = GetFromPass
+	m["gitHEAD"] = func() (string, error) {
+		out, err := exec.Command("git", "-C", c.BaseDir, "rev-parse", "HEAD").Output()
+		if err != nil {
+			return "", err
+		}
+		output := strings.TrimSpace(string(out))
+		return output, nil
+	}
+	m["lookupIPAddr"] = GetIPsFromDNS
+	m["insertFile"] = func(file string) (string, error) {
+		data, err := ioutil.ReadFile(path.Join(rs.Path, file))
+		if err != nil {
+			return "", err
+		}
+
+		return string(data), nil
+	}
+	m["insertTemplate"] = func(file string) (string, error) {
+		data, err := templateFile(c, rs, path.Join(rs.Path, file))
+		if err != nil {
+			return "", err
+		}
+
+		return data.Rendered, nil
+	}
+	m["default"] = func(defaultVal interface{}, varName string) interface{} {
+		if val, ok := rs.Values[varName]; ok {
+			return val
+		}
+
+		return defaultVal
+	}
+	return m
+}
+
+// Checks whether a file is a resource file (i.e. is YAML or JSON) and not a default values file.
+func isResourceFile(f os.FileInfo) bool {
+	for _, defaultFile := range util.DefaultFilenames {
+		if f.Name() == defaultFile {
+			return false
+		}
+	}
+
+	return strings.HasSuffix(f.Name(), "yaml") ||
+		strings.HasSuffix(f.Name(), "yml") ||
+		strings.HasSuffix(f.Name(), "json")
+}
diff --git a/ops/kontemplate/templater/templater_test.go b/ops/kontemplate/templater/templater_test.go
new file mode 100644
index 0000000000..c20858c203
--- /dev/null
+++ b/ops/kontemplate/templater/templater_test.go
@@ -0,0 +1,205 @@
+// Copyright (C) 2016-2019  Vincent Ambo <mail@tazj.in>
+//
+// This file is part of Kontemplate.
+//
+// Kontemplate is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+package templater
+
+import (
+	"github.com/tazjin/kontemplate/context"
+	"reflect"
+	"strings"
+	"testing"
+)
+
+func TestApplyNoLimits(t *testing.T) {
+	resources := []context.ResourceSet{
+		{
+			Name: "testResourceSet1",
+		},
+		{
+			Name: "testResourceSet2",
+		},
+	}
+
+	result := applyLimits(&resources, &[]string{}, &[]string{})
+
+	if !reflect.DeepEqual(resources, *result) {
+		t.Error("Resource set slice changed, but shouldn't have.")
+		t.Errorf("Expected: %v\nResult: %v\n", resources, *result)
+		t.Fail()
+	}
+}
+
+func TestApplyIncludeLimits(t *testing.T) {
+	resources := []context.ResourceSet{
+		{
+			Name: "testResourceSet1",
+		},
+		{
+			Name: "testResourceSet2",
+		},
+		{
+			Name:   "testResourceSet3",
+			Parent: "included",
+		},
+	}
+
+	includes := []string{"testResourceSet1", "included"}
+
+	result := applyLimits(&resources, &includes, &[]string{})
+
+	expected := []context.ResourceSet{
+		{
+			Name: "testResourceSet1",
+		},
+		{
+			Name:   "testResourceSet3",
+			Parent: "included",
+		},
+	}
+
+	if !reflect.DeepEqual(expected, *result) {
+		t.Error("Result does not contain expected resource sets.")
+		t.Errorf("Expected: %v\nResult: %v\n", expected, *result)
+		t.Fail()
+	}
+}
+
+func TestApplyExcludeLimits(t *testing.T) {
+	resources := []context.ResourceSet{
+		{
+			Name: "testResourceSet1",
+		},
+		{
+			Name: "testResourceSet2",
+		},
+		{
+			Name:   "testResourceSet3",
+			Parent: "included",
+		},
+	}
+
+	exclude := []string{"testResourceSet2"}
+
+	result := applyLimits(&resources, &[]string{}, &exclude)
+
+	expected := []context.ResourceSet{
+		{
+			Name: "testResourceSet1",
+		},
+		{
+			Name:   "testResourceSet3",
+			Parent: "included",
+		},
+	}
+
+	if !reflect.DeepEqual(expected, *result) {
+		t.Error("Result does not contain expected resource sets.")
+		t.Errorf("Expected: %v\nResult: %v\n", expected, *result)
+		t.Fail()
+	}
+}
+
+func TestApplyLimitsExcludeIncludePrecedence(t *testing.T) {
+	resources := []context.ResourceSet{
+		{
+			Name:   "collection/nested1",
+			Parent: "collection",
+		},
+		{
+			Name:   "collection/nested2",
+			Parent: "collection",
+		},
+		{
+			Name:   "collection/nested3",
+			Parent: "collection",
+		},
+		{
+			Name: "something-else",
+		},
+	}
+
+	include := []string{"collection"}
+	exclude := []string{"collection/nested2"}
+
+	result := applyLimits(&resources, &include, &exclude)
+
+	expected := []context.ResourceSet{
+		{
+			Name:   "collection/nested1",
+			Parent: "collection",
+		},
+		{
+			Name:   "collection/nested3",
+			Parent: "collection",
+		},
+	}
+
+	if !reflect.DeepEqual(expected, *result) {
+		t.Error("Result does not contain expected resource sets.")
+		t.Errorf("Expected: %v\nResult: %v\n", expected, *result)
+		t.Fail()
+	}
+}
+
+func TestFailOnMissingKeys(t *testing.T) {
+	ctx := context.Context{}
+	resourceSet := context.ResourceSet{}
+
+	_, err := templateFile(&ctx, &resourceSet, "testdata/test-template.txt")
+
+	if err == nil {
+		t.Errorf("Template with missing keys should have failed.\n")
+		t.Fail()
+	}
+
+	if !strings.Contains(err.Error(), "map has no entry for key \"testName\"") {
+		t.Errorf("Templating failed with unexpected error: %v\n", err)
+	}
+}
+
+func TestDefaultTemplateFunction(t *testing.T) {
+	ctx := context.Context{}
+	resourceSet := context.ResourceSet{}
+
+	res, err := templateFile(&ctx, &resourceSet, "testdata/test-default.txt")
+
+	if err != nil {
+		t.Errorf("Templating with default values should have succeeded.\n")
+		t.Fail()
+	}
+
+	if res.Rendered != "defaultValue\n" {
+		t.Error("Result does not contain expected rendered default value.")
+		t.Fail()
+	}
+}
+
+func TestInsertTemplateFunction(t *testing.T) {
+	ctx := context.Context{}
+	resourceSet := context.ResourceSet{
+		Path: "testdata",
+		Values: map[string]interface{}{
+			"testName":        "TestInsertTemplateFunction",
+		},
+	}
+
+	res, err := templateFile(&ctx, &resourceSet, "testdata/test-insertTemplate.txt")
+
+	if err != nil {
+		t.Error(err)
+		t.Errorf("Templating with an insertTemplate call should have succeeded.\n")
+		t.Fail()
+	}
+
+	if res.Rendered != "Inserting \"Template for test TestInsertTemplateFunction\".\n" {
+		t.Error("Result does not contain expected rendered template value.")
+		t.Error(res.Rendered)
+		t.Fail()
+	}
+}
diff --git a/ops/kontemplate/templater/testdata/test-default.txt b/ops/kontemplate/templater/testdata/test-default.txt
new file mode 100644
index 0000000000..4f7997bd69
--- /dev/null
+++ b/ops/kontemplate/templater/testdata/test-default.txt
@@ -0,0 +1 @@
+{{ default "defaultValue" "missingVar" }}
diff --git a/ops/kontemplate/templater/testdata/test-insertTemplate.txt b/ops/kontemplate/templater/testdata/test-insertTemplate.txt
new file mode 100644
index 0000000000..8155e174fe
--- /dev/null
+++ b/ops/kontemplate/templater/testdata/test-insertTemplate.txt
@@ -0,0 +1 @@
+Inserting "{{ insertTemplate "test-template.txt" | trim }}".
diff --git a/ops/kontemplate/templater/testdata/test-template.txt b/ops/kontemplate/templater/testdata/test-template.txt
new file mode 100644
index 0000000000..06f1cfc630
--- /dev/null
+++ b/ops/kontemplate/templater/testdata/test-template.txt
@@ -0,0 +1 @@
+Template for test {{ .testName }}
diff --git a/ops/kontemplate/util/util.go b/ops/kontemplate/util/util.go
new file mode 100644
index 0000000000..56fa1e3fc9
--- /dev/null
+++ b/ops/kontemplate/util/util.go
@@ -0,0 +1,58 @@
+// Copyright (C) 2016-2019  Vincent Ambo <mail@tazj.in>
+//
+// This file is part of Kontemplate.
+//
+// Kontemplate is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+package util
+
+import (
+	"io/ioutil"
+
+	"github.com/ghodss/yaml"
+)
+
+// Filenames excluded from templating for the purpose of containing default variable values inside a resource set.
+var DefaultFilenames []string = []string{"default.yml", "default.yaml", "default.json"}
+
+// Merges two maps together. Values from the second map override values in the first map.
+// The returned map is new if anything was changed.
+func Merge(in1 *map[string]interface{}, in2 *map[string]interface{}) *map[string]interface{} {
+	if in1 == nil || len(*in1) == 0 {
+		return in2
+	}
+
+	if in2 == nil || len(*in2) == 0 {
+		return in1
+	}
+
+	new := make(map[string]interface{})
+	for k, v := range *in1 {
+		new[k] = v
+	}
+
+	for k, v := range *in2 {
+		new[k] = v
+	}
+
+	return &new
+}
+
+// Loads either a YAML or JSON file from the specified path and
+// deserialises it into the provided interface.
+func LoadData(filename string, addr interface{}) error {
+	file, err := ioutil.ReadFile(filename)
+	if err != nil {
+		return err
+	}
+
+	err = yaml.Unmarshal(file, addr)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
diff --git a/ops/kontemplate/util/util_test.go b/ops/kontemplate/util/util_test.go
new file mode 100644
index 0000000000..53c5608175
--- /dev/null
+++ b/ops/kontemplate/util/util_test.go
@@ -0,0 +1,83 @@
+// Copyright (C) 2016-2019  Vincent Ambo <mail@tazj.in>
+//
+// This file is part of Kontemplate.
+//
+// Kontemplate is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+package util
+
+import (
+	"reflect"
+	"testing"
+)
+
+func TestMergeWithEmptyMap(t *testing.T) {
+	testMap := map[string]interface{}{
+		"foo": "bar",
+	}
+
+	empty := make(map[string]interface{})
+
+	res1 := Merge(&testMap, &empty)
+	res2 := Merge(&empty, &testMap)
+
+	if res1 != &testMap || res2 != &testMap {
+		t.Error("A new map was returned incorrectly.")
+		t.Fail()
+	}
+}
+
+func TestMergeWithNilMap(t *testing.T) {
+	testMap := map[string]interface{}{
+		"foo": "bar",
+	}
+
+	res1 := Merge(&testMap, nil)
+	res2 := Merge(nil, &testMap)
+
+	if res1 != &testMap || res2 != &testMap {
+		t.Error("A new map was returned incorrectly.")
+		t.Fail()
+	}
+}
+
+func TestMergeMaps(t *testing.T) {
+	map1 := map[string]interface{}{
+		"foo": "bar",
+	}
+
+	map2 := map[string]interface{}{
+		"bar": "baz",
+	}
+
+	result := Merge(&map1, &map2)
+	expected := map[string]interface{}{
+		"foo": "bar",
+		"bar": "baz",
+	}
+
+	if !reflect.DeepEqual(*result, expected) {
+		t.Error("Maps were merged incorrectly.")
+		t.Fail()
+	}
+}
+
+func TestMergeMapsPrecedence(t *testing.T) {
+	map1 := map[string]interface{}{
+		"foo": "incorrect",
+	}
+
+	map2 := map[string]interface{}{
+		"foo": "correct",
+	}
+
+	result := Merge(&map1, &map2)
+
+	if (*result)["foo"] != "correct" {
+		t.Error("Map merge precedence test failed.")
+		t.Fail()
+	}
+}
diff --git a/ops/nixos/.gitignore b/ops/nixos/.gitignore
new file mode 100644
index 0000000000..773fa16670
--- /dev/null
+++ b/ops/nixos/.gitignore
@@ -0,0 +1,3 @@
+hardware-configuration.nix
+local-configuration.nix
+result
diff --git a/ops/nixos/README.md b/ops/nixos/README.md
new file mode 100644
index 0000000000..9e88193dad
--- /dev/null
+++ b/ops/nixos/README.md
@@ -0,0 +1,19 @@
+NixOS configuration
+===================
+
+My NixOS configuration! It configures most of the packages I require
+on my systems, sets up Emacs the way I need and does a bunch of other
+interesting things.
+
+System configuration lives in folders for each machine and a custom
+fixed point evaluation (similar to standard NixOS module
+configuration) is used to combine configuration together.
+
+Building `ops.nixos.rebuilder` yields a script that will automatically
+build and activate the newest configuration based on the current
+hostname.
+
+## Configured hosts:
+
+* `nugget` - desktop computer at home
+* ~~`urdhva` - T470s~~ (currently with edef)
diff --git a/ops/nixos/default.nix b/ops/nixos/default.nix
new file mode 100644
index 0000000000..d4aa9705d6
--- /dev/null
+++ b/ops/nixos/default.nix
@@ -0,0 +1,39 @@
+# TODO(tazjin): rename 'pkgs' -> 'depot'?
+{ pkgs, ... }:
+
+let
+  inherit (pkgs) lib;
+  inherit (builtins) foldl';
+
+  systemFor = configs: (pkgs.third_party.nixos {
+    configuration = lib.fix(config:
+      foldl' lib.recursiveUpdate {} (map (c: c config) configs)
+    );
+  }).system;
+
+  nuggetSystem = systemFor [ pkgs.ops.nixos.nugget ];
+
+  rebuilder = pkgs.third_party.writeShellScriptBin "rebuilder" ''
+    set -ue
+    if [[ $EUID -ne 0 ]]; then
+      echo "Oh no! Only root is allowed to rebuild the system!" >&2
+      exit 1
+    fi
+
+    case $HOSTNAME in
+    nugget)
+      echo "Rebuilding NixOS for //ops/nixos/nugget"
+      system=$(nix-build -E '(import <depot> {}).ops.nixos.nuggetSystem' --no-out-link)
+      ;;
+    *)
+      echo "$HOSTNAME is not a known NixOS host!" >&2
+      exit 1
+      ;;
+    esac
+
+    nix-env -p /nix/var/nix/profiles/system --set $system
+    $system/bin/switch-to-configuration switch
+  '';
+in {
+  inherit nuggetSystem rebuilder;
+}
diff --git a/ops/nixos/dotfiles/config.fish b/ops/nixos/dotfiles/config.fish
new file mode 100644
index 0000000000..de2c99ae60
--- /dev/null
+++ b/ops/nixos/dotfiles/config.fish
@@ -0,0 +1,40 @@
+# Configure classic prompt
+set fish_color_user --bold blue
+set fish_color_cwd --bold white
+
+# Enable colour hints in VCS prompt:
+set __fish_git_prompt_showcolorhints yes
+set __fish_git_prompt_color_prefix purple
+set __fish_git_prompt_color_suffix purple
+
+# Fish configuration
+set fish_greeting ""
+set PATH $HOME/.local/bin $HOME/.cargo/bin $PATH
+
+# Editor configuration
+set -gx EDITOR "emacsclient"
+set -gx ALTERNATE_EDITOR "emacs -q -nw"
+set -gx VISUAL "emacsclient"
+
+# Miscellaneous
+eval (direnv hook fish)
+
+# Useful command aliases
+alias gpr 'git pull --rebase'
+alias gco 'git checkout'
+alias gf 'git fetch'
+alias gap 'git add -p'
+alias pbcopy 'xclip -selection clipboard'
+alias edit 'emacsclient -n'
+alias servedir 'nix-shell -p haskellPackages.wai-app-static --run warp'
+
+# Old habits die hard (also ls is just easier to type):
+alias ls 'exa'
+
+# Fix up nix-env & friends for Nix 2.0
+export NIX_REMOTE=daemon
+
+# Fix display of fish in emacs' term-mode:
+function fish_title
+  true
+end
diff --git a/ops/nixos/dotfiles/msmtprc b/ops/nixos/dotfiles/msmtprc
new file mode 100644
index 0000000000..624b6a77fc
--- /dev/null
+++ b/ops/nixos/dotfiles/msmtprc
@@ -0,0 +1,16 @@
+defaults
+
+port 587
+tls on
+tls_trust_file /etc/ssl/certs/ca-certificates.crt
+
+# Runbox mail
+account runbox
+from mail@tazj.in
+host mail.runbox.com
+auth on
+user mail@tazj.in
+passwordeval pass show general/runbox-tazjin
+
+# Use Runbox as default
+account default : runbox
diff --git a/ops/nixos/dotfiles/notmuch-config b/ops/nixos/dotfiles/notmuch-config
new file mode 100644
index 0000000000..a490774e63
--- /dev/null
+++ b/ops/nixos/dotfiles/notmuch-config
@@ -0,0 +1,21 @@
+# .notmuch-config - Configuration file for the notmuch mail system
+#
+# For more information about notmuch, see https://notmuchmail.org
+
+[database]
+path=/home/vincent/mail
+
+[user]
+name=Vincent Ambo
+primary_email=mail@tazj.in
+other_email=tazjin@gmail.com;
+
+[new]
+tags=unread;inbox;
+ignore=
+
+[search]
+exclude_tags=deleted;spam;draft;
+
+[maildir]
+synchronize_flags=true
diff --git a/ops/nixos/dotfiles/offlineimaprc b/ops/nixos/dotfiles/offlineimaprc
new file mode 100644
index 0000000000..78315447e4
--- /dev/null
+++ b/ops/nixos/dotfiles/offlineimaprc
@@ -0,0 +1,39 @@
+[general]
+accounts = tazjin, gmail
+
+[DEFAULT]
+ssl = yes
+sslcacertfile = /etc/ssl/certs/ca-certificates.crt
+
+# Private GMail account (old):
+[Account gmail]
+maxage = 90
+localrepository = gmail-local
+remoterepository = gmail-remote
+synclabels = yes
+
+[Repository gmail-local]
+type = GmailMaildir
+localfolders = ~/mail/gmail
+
+[Repository gmail-remote]
+type = Gmail
+remoteuser = tazjin@gmail.com
+remotepassfile = ~/.config/mail/gmail-pass
+folderfilter = lambda folder: folder == 'INBOX'
+
+# Main private account:
+[Account tazjin]
+localrepository = tazjin-local
+remoterepository = tazjin-remote
+
+[Repository tazjin-local]
+type = Maildir
+localfolders = ~/mail/tazjin
+
+[Repository tazjin-remote]
+type = IMAP
+remotehost = mail.runbox.com
+remoteuser = mail@tazj.in
+remotepassfile = ~/.config/mail/tazjin-pass
+auth_mechanisms = LOGIN
diff --git a/ops/nixos/mail.nix b/ops/nixos/mail.nix
new file mode 100644
index 0000000000..ba4ebfa060
--- /dev/null
+++ b/ops/nixos/mail.nix
@@ -0,0 +1,77 @@
+# This file configures offlineimap, notmuch and MSMTP.
+#
+# Some manual configuration is required the first time this is
+# applied:
+#
+# 1. Credential setup.
+# 2. Linking of MSMTP config (ln -s /etc/msmtprc ~/.msmtprc)
+# 3. Linking of notmuch config (ln -s /etc/notmuch-config ~/.notmuch-config)
+
+{ config, lib, pkgs, ... }:
+
+let offlineImapConfig = pkgs.writeText "offlineimaprc"
+  (builtins.readFile ./dotfiles/offlineimaprc);
+
+msmtpConfig = pkgs.writeText "msmtprc"
+  (builtins.readFile ./dotfiles/msmtprc);
+
+notmuchConfig = pkgs.writeText "notmuch-config"
+  (builtins.readFile ./dotfiles/notmuch-config);
+
+tagConfig = pkgs.writeText "notmuch-tags" ''
+  # Tag emacs-devel mailing list:
+  -inbox +emacs-devel -- to:emacs-devel@gnu.org OR cc:emacs-devel@gnu.org
+
+  # Tag nix-devel mailing list & discourse:
+  -inbox +nix-devel -- to:nix-devel@googlegroups.com OR from:nixos1@discoursemail.com
+
+  # Tag my own mail (from other devices) as sent:
+  -inbox +sent -- from:mail@tazj.in
+
+  # Drafts are always read, duh.
+  -unread -- tag:draft
+'';
+
+notmuchIndex = pkgs.writeShellScriptBin "notmuch-index" ''
+  echo "Indexing new mails in notmuch"
+
+  # Index new mail
+  ${pkgs.notmuch}/bin/notmuch new
+
+  # Apply tags
+  cat ${tagConfig} | ${pkgs.notmuch}/bin/notmuch tag --batch
+
+  echo "Done indexing new mails"
+'';
+in {
+  # Enable OfflineIMAP timer & service:
+  systemd.user.timers.offlineimap = {
+    description = "OfflineIMAP timer";
+    wantedBy    = [ "timers.target" ];
+
+    timerConfig = {
+      Unit       = "offlineimap.service";
+      OnCalendar = "*:0/2"; # every 2 minutes
+      Persistent = "true"; # persist timer state after reboots
+    };
+  };
+
+  systemd.user.services.offlineimap = {
+    description = "OfflineIMAP service";
+    path = with pkgs; [ pass notmuch ];
+
+    serviceConfig = {
+      Type            = "oneshot";
+      ExecStart       = "${pkgs.offlineimap}/bin/offlineimap -u syslog -o -c ${offlineImapConfig}";
+      ExecStartPost   = "${notmuchIndex}/bin/notmuch-index";
+      TimeoutStartSec = "2min";
+    };
+  };
+
+  # Link configuration files to /etc/ (from where they will be linked
+  # further):
+  environment.etc = {
+    "msmtprc".source = msmtpConfig;
+    "notmuch-config".source = notmuchConfig;
+  };
+}
diff --git a/ops/nixos/nugget/default.nix b/ops/nixos/nugget/default.nix
new file mode 100644
index 0000000000..6a68926e43
--- /dev/null
+++ b/ops/nixos/nugget/default.nix
@@ -0,0 +1,204 @@
+# This file contains the configuration for my home desktop.
+
+{ pkgs, ... }:
+
+config: let
+  inherit (pkgs) lib;
+
+  nixpkgs = import pkgs.third_party.nixpkgsSrc {
+    config.allowUnfree = true;
+  };
+
+  lieer = (pkgs.third_party.lieer {});
+in pkgs.lib.fix(self: {
+  hardware = {
+    pulseaudio.enable = true;
+    cpu.intel.updateMicrocode = true;
+  };
+
+  boot = {
+    cleanTmpDir = true;
+    kernelModules = [ "kvm-intel" ];
+
+    loader = {
+      timeout = 3;
+      systemd-boot.enable = true;
+      efi.canTouchEfiVariables = false;
+    };
+
+    initrd = {
+      luks.devices.nugget-crypt.device = "/dev/disk/by-label/nugget-crypt";
+      availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" ];
+      kernelModules = [ "dm-snapshot" ];
+    };
+  };
+
+  nix = {
+    nixPath = [
+      "depot=/home/tazjin/depot"
+      "nixpkgs=${pkgs.third_party.nixpkgsSrc}"
+    ];
+  };
+
+  nixpkgs.pkgs = nixpkgs;
+
+  networking = {
+    hostName = "nugget";
+    useDHCP = false;
+    interfaces.eno1.useDHCP = true;
+    interfaces.wlp7s0.useDHCP = true;
+
+    # Don't use ISP's DNS servers:
+    nameservers = [
+      "8.8.8.8"
+      "8.8.4.4"
+    ];
+
+    # Open Chromecast-related ports & servedir
+    firewall.allowedTCPPorts = [ 4242 5556 5558 ];
+  };
+
+  # Generate an immutable /etc/resolv.conf from the nameserver settings
+  # above (otherwise DHCP overwrites it):
+  environment.etc."resolv.conf" = with lib; with pkgs; {
+    source = writeText "resolv.conf" ''
+      ${concatStringsSep "\n" (map (ns: "nameserver ${ns}") self.networking.nameservers)}
+      options edns0
+    '';
+  };
+
+  time.timeZone = "Europe/London";
+
+  environment.systemPackages =
+    # programs from the depot
+    (with pkgs; [
+      lieer
+      ops.kontemplate
+      third_party.git
+      tools.emacs
+    ]) ++
+
+    # programs from nixpkgs
+    (with nixpkgs; [
+      age
+      bat
+      chromium
+      curl
+      direnv
+      dnsutils
+      exa
+      fd
+      gnupg
+      go
+      google-cloud-sdk
+      htop
+      imagemagick
+      jq
+      kubectl
+      msmtp
+      nix-prefetch-github
+      notmuch
+      openssh
+      openssl
+      pass
+      pavucontrol
+      pinentry
+      pinentry-emacs
+      pwgen
+      ripgrep
+      rustup
+      sbcl
+      scrot
+      spotify
+      tokei
+      tree
+      vlc
+      xclip
+    ]);
+
+    fileSystems = {
+      "/".device = "/dev/disk/by-label/nugget-root";
+      "/boot".device = "/dev/disk/by-label/EFI";
+      "/home".device = "/dev/disk/by-label/nugget-home";
+    };
+
+    # Configure user account
+    users.extraUsers.tazjin = {
+      extraGroups = [ "wheel" "audio" ];
+      isNormalUser = true;
+      uid = 1000;
+      shell = nixpkgs.fish;
+    };
+
+    security.sudo = {
+      enable = true;
+      extraConfig = "wheel ALL=(ALL:ALL) SETENV: ALL";
+    };
+
+    fonts = {
+      fonts = with nixpkgs; [
+        corefonts
+        input-fonts
+        noto-fonts-cjk
+        noto-fonts-emoji
+      ];
+    };
+
+    # Configure location (Vauxhall, London) for services that need it.
+    location = {
+      latitude = 51.4819109;
+      longitude = -0.1252998;
+    };
+
+    programs.fish.enable = true;
+
+    services.redshift.enable = true;
+    services.openssh.enable = true;
+
+    services.xserver = {
+      enable = true;
+      layout = "us";
+      xkbOptions = "caps:super";
+      exportConfiguration = true;
+      videoDrivers = [ "nvidia" ];
+
+      displayManager = {
+        # Give EXWM permission to control the session.
+        sessionCommands = "${nixpkgs.xorg.xhost}/bin/xhost +SI:localuser:$USER";
+
+        lightdm.enable = true;
+        lightdm.greeters.gtk.clock-format = "%H·%M";
+      };
+
+      windowManager.session = pkgs.lib.singleton {
+        name = "exwm";
+        start = "${pkgs.tools.emacs}/bin/tazjins-emacs";
+      };
+    };
+
+    # Do not restart the display manager automatically
+    systemd.services.display-manager.restartIfChanged = lib.mkForce false;
+
+    # Configure email setup
+    systemd.user.services.lieer-tazjin = {
+      description = "Synchronise mail@tazj.in via lieer";
+      script = "${lieer}/bin/gmi sync";
+
+      serviceConfig = {
+        WorkingDirectory = "%h/mail/account.tazjin";
+        Type = "oneshot";
+      };
+    };
+
+    systemd.user.timers.lieer-tazjin = {
+      wantedBy = [ "timers.target" ];
+
+      timerConfig = {
+        OnActiveSec = "1";
+        OnUnitActiveSec = "180";
+      };
+    };
+
+    # ... and other nonsense.
+    system.stateVersion = "19.09";
+})
diff --git a/ops/secrets/.skip-subtree b/ops/secrets/.skip-subtree
new file mode 100644
index 0000000000..25dba2a344
--- /dev/null
+++ b/ops/secrets/.skip-subtree
@@ -0,0 +1 @@
+No Nix derivations under //ops/secrets
diff --git a/ops/secrets/gcsr-tazjin-password b/ops/secrets/gcsr-tazjin-password
new file mode 100644
index 0000000000..5893de1315
--- /dev/null
+++ b/ops/secrets/gcsr-tazjin-password
Binary files differdiff --git a/ops/secrets/gmaps-api-key b/ops/secrets/gmaps-api-key
new file mode 100644
index 0000000000..6a45226460
--- /dev/null
+++ b/ops/secrets/gmaps-api-key
Binary files differdiff --git a/ops/secrets/nixery-gcs-json b/ops/secrets/nixery-gcs-json
new file mode 100644
index 0000000000..b8b5445116
--- /dev/null
+++ b/ops/secrets/nixery-gcs-json
Binary files differdiff --git a/ops/secrets/nixery-gcs-pem b/ops/secrets/nixery-gcs-pem
new file mode 100644
index 0000000000..798a1e5a66
--- /dev/null
+++ b/ops/secrets/nixery-gcs-pem
Binary files differdiff --git a/ops/secrets/nixery-ssh-private b/ops/secrets/nixery-ssh-private
new file mode 100644
index 0000000000..5c4ff20233
--- /dev/null
+++ b/ops/secrets/nixery-ssh-private
Binary files differdiff --git a/ops/sync-gcsr/default.nix b/ops/sync-gcsr/default.nix
new file mode 100644
index 0000000000..114ff221be
--- /dev/null
+++ b/ops/sync-gcsr/default.nix
@@ -0,0 +1,10 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.program {
+  name = "sync-gcsr";
+  srcs = [ ./main.go ];
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+    gopkgs."gopkg.in".src-d.go-git
+  ];
+}
diff --git a/ops/sync-gcsr/main.go b/ops/sync-gcsr/main.go
new file mode 100644
index 0000000000..a02f6d5527
--- /dev/null
+++ b/ops/sync-gcsr/main.go
@@ -0,0 +1,129 @@
+// Copyright 2019 Google LLC.
+// SPDX-License-Identifier: Apache-2.0
+//
+// sync-gcsr implements a small utility that periodically mirrors a
+// remote Google Cloud Source Repository to a local file path.
+package main
+
+import (
+	"fmt"
+	"log"
+	"os"
+	"time"
+
+	git "gopkg.in/src-d/go-git.v4"
+	"gopkg.in/src-d/go-git.v4/plumbing"
+	"gopkg.in/src-d/go-git.v4/plumbing/transport/http"
+)
+
+func EnvOr(key, def string) string {
+	v := os.Getenv(key)
+	if v == "" {
+		return def
+	}
+
+	return v
+}
+
+// ensure that all remote branches exist locally & are up to date.
+func updateBranches(auth *http.BasicAuth, repo *git.Repository) error {
+	origin, err := repo.Remote("origin")
+	if err != nil {
+		return err
+	}
+
+	refs, err := origin.List(&git.ListOptions{
+		Auth: auth,
+	})
+	if err != nil {
+		return err
+	}
+
+	for _, ref := range refs {
+		if !ref.Name().IsBranch() || ref.Type() != plumbing.HashReference {
+			continue
+		}
+
+		branch := plumbing.NewHashReference(
+			plumbing.NewBranchReferenceName(ref.Name().Short()),
+			ref.Hash(),
+		)
+
+		err := repo.Storer.SetReference(branch)
+		if err != nil {
+			return err
+		}
+		log.Println("Updated branch", ref.Name().String())
+	}
+
+	return nil
+}
+
+func updateRepo(auth *http.BasicAuth, repo *git.Repository, opts *git.FetchOptions) error {
+	err := repo.Fetch(opts)
+
+	if err == git.NoErrAlreadyUpToDate {
+		// nothing to do ...
+		return nil
+	} else if err != nil {
+		return err
+	}
+
+	log.Println("Fetched updates from remote, updating local branches")
+	return updateBranches(auth, repo)
+}
+
+func cloneRepo(dest, project, repo string, auth *http.BasicAuth) (*git.Repository, error) {
+	var cloneOpts = git.CloneOptions{
+		Auth: auth,
+		URL:  fmt.Sprintf("https://source.developers.google.com/p/%s/r/%s", project, repo),
+	}
+
+	handle, err := git.PlainClone(dest, true, &cloneOpts)
+
+	if err == git.ErrRepositoryAlreadyExists {
+		handle, err = git.PlainOpen(dest)
+	}
+
+	return handle, updateBranches(auth, handle)
+}
+
+func main() {
+	dest := EnvOr("SYNC_DEST", "/git/depot")
+	project := EnvOr("SYNC_PROJECT", "tazjins-infrastructure")
+	repo := EnvOr("SYNC_REPO", "depot")
+	user := os.Getenv("SYNC_USER")
+	pass := os.Getenv("SYNC_PASS")
+
+	log.Printf("Syncing repository '%s/%s' to destination '%s'", project, repo, dest)
+
+	var auth *http.BasicAuth
+	if user != "" && pass != "" {
+		auth = &http.BasicAuth{
+			Username: user,
+			Password: pass,
+		}
+		log.Println("Enabling basic authentication as user", user)
+	}
+
+	handle, err := cloneRepo(dest, project, repo, auth)
+
+	if err != nil {
+		log.Fatalf("Failed to clone repository: %s", err)
+	} else {
+		log.Println("Initiating update loop")
+	}
+
+	fetchOpts := git.FetchOptions{
+		Auth:  auth,
+		Force: true,
+	}
+
+	for {
+		if err = updateRepo(auth, handle, &fetchOpts); err != nil {
+			log.Fatalf("Failed to pull updated repository: %s", err)
+		}
+
+		time.Sleep(10 * time.Second)
+	}
+}
diff --git a/overrides/default.nix b/overrides/default.nix
new file mode 100644
index 0000000000..2159d45bd0
--- /dev/null
+++ b/overrides/default.nix
@@ -0,0 +1,28 @@
+# This file is used to move things from nested attribute sets to the
+# top-level.
+{ pkgs, ... }:
+
+{
+  buildGo = pkgs.nix.buildGo;
+
+  # These packages must be exposed at the top-level for compatibility
+  # with Nixery.
+  inherit (pkgs.third_party)
+    bashInteractive
+    cacert
+    coreutils
+    iana-etc
+    jq
+    moreutils
+    nano
+    openssl
+    runCommand
+    symlinkJoin
+    writeText;
+
+  # These packages must be exposed for compatibility with buildGo.
+  #
+  # Despite buildGo being tracked in this tree, I want it to be possible
+  # for external users to import it with the default nixpkgs layout.
+  inherit (pkgs.third_party) go ripgrep;
+}
diff --git a/overrides/elmPackages/default.nix b/overrides/elmPackages/default.nix
new file mode 100644
index 0000000000..20026d9180
--- /dev/null
+++ b/overrides/elmPackages/default.nix
@@ -0,0 +1,10 @@
+# Gemma needs an older version of Elm to be built. Updating it to
+# the newer version is a lot of effort.
+{ pkgs, ... }:
+
+(import (pkgs.third_party.fetchFromGitHub {
+  owner = "NixOS";
+  repo = "nixpkgs";
+  rev = "14f9ee66e63077539252f8b4550049381a082518";
+  sha256 = "1wn7nmb1cqfk2j91l3rwc6yhimfkzxprb8wknw5wi57yhq9m6lv1";
+}) {}).elmPackages
diff --git a/overrides/kontemplate/default.nix b/overrides/kontemplate/default.nix
new file mode 100644
index 0000000000..52da1ba32c
--- /dev/null
+++ b/overrides/kontemplate/default.nix
@@ -0,0 +1,13 @@
+{ pkgs, ... }:
+
+with pkgs;
+
+third_party.writeShellScriptBin "kontemplate" ''
+  export PATH="${ops.kms_pass}/bin:$PATH"
+
+  if [[ -z $1 ]]; then
+    exec ${ops.kontemplate}/bin/kontemplate
+  fi
+
+  exec ${ops.kontemplate}/bin/kontemplate $1 ${./../..}/ops/infra/kubernetes/primary-cluster.yaml ''${@:2}
+''
diff --git a/overrides/lispPackages/default.nix b/overrides/lispPackages/default.nix
new file mode 100644
index 0000000000..c6502975e3
--- /dev/null
+++ b/overrides/lispPackages/default.nix
@@ -0,0 +1,8 @@
+# One of Gemma's dependencies is missing in nixpkgs' Quicklisp
+# package set, it is overlaid locally here.
+{ pkgs, ... }:
+
+import ./quicklisp.nix {
+  inherit (pkgs) lib;
+  inherit (pkgs.third_party) lispPackages;
+}
diff --git a/overrides/lispPackages/quicklisp-to-nix-output/cl-prevalence.nix b/overrides/lispPackages/quicklisp-to-nix-output/cl-prevalence.nix
new file mode 100644
index 0000000000..4e5e3ec5d6
--- /dev/null
+++ b/overrides/lispPackages/quicklisp-to-nix-output/cl-prevalence.nix
@@ -0,0 +1,27 @@
+args @ { fetchurl, ... }:
+rec {
+  baseName = ''cl-prevalence'';
+  version = ''20130720-hg'';
+
+  description = ''Common Lisp Prevalence Package'';
+
+  deps = [ args."s-sysdeps" args."s-xml" ];
+
+  src = fetchurl {
+    url = ''http://beta.quicklisp.org/archive/cl-prevalence/2013-07-20/cl-prevalence-20130720-hg.tgz'';
+    sha256 = ''09pqbw6xcgy0242npiqw7sd8jwwjc0kz7m0sas48jjr0zgnnmi89'';
+  };
+
+  packageName = "cl-prevalence";
+
+  asdFilesToKeep = ["cl-prevalence.asd"];
+  overrides = x: x;
+}
+/* (SYSTEM cl-prevalence DESCRIPTION Common Lisp Prevalence Package SHA256
+    09pqbw6xcgy0242npiqw7sd8jwwjc0kz7m0sas48jjr0zgnnmi89 URL
+    http://beta.quicklisp.org/archive/cl-prevalence/2013-07-20/cl-prevalence-20130720-hg.tgz
+    MD5 6176c34b8e1621b65906b1575d9fa20d NAME cl-prevalence FILENAME
+    cl-prevalence DEPS
+    ((NAME s-sysdeps FILENAME s-sysdeps) (NAME s-xml FILENAME s-xml))
+    DEPENDENCIES (s-sysdeps s-xml) VERSION 20130720-hg SIBLINGS
+    (cl-prevalence-test) PARASITES NIL) */
diff --git a/overrides/lispPackages/quicklisp-to-nix-output/s-sysdeps.nix b/overrides/lispPackages/quicklisp-to-nix-output/s-sysdeps.nix
new file mode 100644
index 0000000000..1c28ec6e2a
--- /dev/null
+++ b/overrides/lispPackages/quicklisp-to-nix-output/s-sysdeps.nix
@@ -0,0 +1,25 @@
+args @ { fetchurl, ... }:
+rec {
+  baseName = ''s-sysdeps'';
+  version = ''20130128-git'';
+
+  description = ''An abstraction layer over platform dependent functionality'';
+
+  deps = [ ];
+
+  src = fetchurl {
+    url = ''http://beta.quicklisp.org/archive/s-sysdeps/2013-01-28/s-sysdeps-20130128-git.tgz'';
+    sha256 = ''048q0mzypnm284bvv7036d4z7bv7rdcqks5l372s74kq279l2y00'';
+  };
+
+  packageName = "s-sysdeps";
+
+  asdFilesToKeep = ["s-sysdeps.asd"];
+  overrides = x: x;
+}
+/* (SYSTEM s-sysdeps DESCRIPTION
+    An abstraction layer over platform dependent functionality SHA256
+    048q0mzypnm284bvv7036d4z7bv7rdcqks5l372s74kq279l2y00 URL
+    http://beta.quicklisp.org/archive/s-sysdeps/2013-01-28/s-sysdeps-20130128-git.tgz
+    MD5 2fe61fadafd62ef9597e17b4783889ef NAME s-sysdeps FILENAME s-sysdeps DEPS
+    NIL DEPENDENCIES NIL VERSION 20130128-git SIBLINGS NIL PARASITES NIL) */
diff --git a/overrides/lispPackages/quicklisp-to-nix-output/s-xml.nix b/overrides/lispPackages/quicklisp-to-nix-output/s-xml.nix
new file mode 100644
index 0000000000..ec12dde522
--- /dev/null
+++ b/overrides/lispPackages/quicklisp-to-nix-output/s-xml.nix
@@ -0,0 +1,27 @@
+args @ { fetchurl, ... }:
+rec {
+  baseName = ''s-xml'';
+  version = ''20150608-git'';
+
+  parasites = [ "s-xml.examples" "s-xml.test" ];
+
+  description = ''Simple Common Lisp XML Parser'';
+
+  deps = [ ];
+
+  src = fetchurl {
+    url = ''http://beta.quicklisp.org/archive/s-xml/2015-06-08/s-xml-20150608-git.tgz'';
+    sha256 = ''0cy36wqzasqma4maw9djq1vdwsp5hxq8svlbnhbv9sq9zzys5viq'';
+  };
+
+  packageName = "s-xml";
+
+  asdFilesToKeep = ["s-xml.asd"];
+  overrides = x: x;
+}
+/* (SYSTEM s-xml DESCRIPTION Simple Common Lisp XML Parser SHA256
+    0cy36wqzasqma4maw9djq1vdwsp5hxq8svlbnhbv9sq9zzys5viq URL
+    http://beta.quicklisp.org/archive/s-xml/2015-06-08/s-xml-20150608-git.tgz
+    MD5 9c31c80f0661777c493fab683f776716 NAME s-xml FILENAME s-xml DEPS NIL
+    DEPENDENCIES NIL VERSION 20150608-git SIBLINGS NIL PARASITES
+    (s-xml.examples s-xml.test)) */
diff --git a/overrides/lispPackages/quicklisp.nix b/overrides/lispPackages/quicklisp.nix
new file mode 100644
index 0000000000..1d23db762d
--- /dev/null
+++ b/overrides/lispPackages/quicklisp.nix
@@ -0,0 +1,26 @@
+{ lib, lispPackages }:
+
+let inherit (lispPackages) buildLispPackage qlOverrides fetchurl;
+in lispPackages // lib.fix(self: {
+  "s-xml" = buildLispPackage
+    ((f: x: (x // (f x)))
+       (qlOverrides."s-xml" or (x: {}))
+       (import ./quicklisp-to-nix-output/s-xml.nix {
+         inherit fetchurl;
+       }));
+
+  "s-sysdeps" = buildLispPackage
+    ((f: x: (x // (f x)))
+       (qlOverrides."s-sysdeps" or (x: {}))
+       (import ./quicklisp-to-nix-output/s-sysdeps.nix {
+         inherit fetchurl;
+       }));
+
+  "cl-prevalence" = buildLispPackage
+    ((f: x: (x // (f x)))
+       (qlOverrides."cl-prevalence" or (x: {}))
+       (import ./quicklisp-to-nix-output/cl-prevalence.nix {
+         inherit fetchurl;
+         inherit (self) s-sysdeps s-xml;
+       }));
+})
diff --git a/overrides/writeElispBin/default.nix b/overrides/writeElispBin/default.nix
new file mode 100644
index 0000000000..a1616fb9d4
--- /dev/null
+++ b/overrides/writeElispBin/default.nix
@@ -0,0 +1,23 @@
+{ pkgs, ... }:
+
+{ name, src, deps ? (_: []), emacs ? pkgs.third_party.emacs26-nox }:
+
+let
+  inherit (pkgs.third_party) emacsPackagesNg emacsPackagesNgGen writeTextFile;
+  inherit (builtins) isString toFile;
+
+  finalEmacs = (emacsPackagesNgGen emacs).emacsWithPackages deps;
+
+  srcFile = if isString src
+    then toFile "${name}.el" src
+    else src;
+in writeTextFile {
+  inherit name;
+  executable = true;
+  destination = "/bin/${name}";
+
+  text = ''
+    #!/bin/sh
+    ${finalEmacs}/bin/emacs --batch --no-site-file --script ${srcFile} $@
+  '';
+}
diff --git a/presentations/bootstrapping-2018/README.md b/presentations/bootstrapping-2018/README.md
new file mode 100644
index 0000000000..e9573ae3f2
--- /dev/null
+++ b/presentations/bootstrapping-2018/README.md
@@ -0,0 +1,5 @@
+These are the slides for a talk I gave at the Norwegian Unix User Group on
+2018-03-13.
+
+There is more information and a recording on the [event
+page](https://www.nuug.no/aktiviteter/20180313-reproduible-compiler/).
diff --git a/presentations/bootstrapping-2018/default.nix b/presentations/bootstrapping-2018/default.nix
new file mode 100644
index 0000000000..28296d8bf3
--- /dev/null
+++ b/presentations/bootstrapping-2018/default.nix
@@ -0,0 +1,50 @@
+# This derivation builds the LaTeX presentation.
+
+{ pkgs, ... }:
+
+with pkgs.third_party;
+
+let tex = texlive.combine {
+  inherit (texlive)
+    beamer
+    beamertheme-metropolis
+    etoolbox
+    euenc
+    extsizes
+    fontspec
+    lualibs
+    luaotfload
+    luatex
+    minted
+    ms
+    pgfopts
+    scheme-basic
+    translator;
+};
+in stdenv.mkDerivation {
+  name = "nuug-bootstrapping-slides";
+  src = ./.;
+
+  FONTCONFIG_FILE = makeFontsConf {
+    fontDirectories = [ fira fira-code fira-mono ];
+  };
+
+  buildInputs = [ tex fira fira-code fira-mono ];
+  buildPhase = ''
+    # LaTeX needs a cache folder in /home/ ...
+    mkdir home
+    export HOME=$PWD/home
+    # ${tex}/bin/luaotfload-tool -ufv
+
+    # As usual, TeX needs to be run twice ...
+    function run() {
+      ${tex}/bin/lualatex presentation.tex
+    }
+    run && run
+  '';
+
+  installPhase = ''
+    mkdir -p $out
+    cp presentation.pdf $out/
+  '';
+}
diff --git a/presentations/bootstrapping-2018/drake-meme.png b/presentations/bootstrapping-2018/drake-meme.png
new file mode 100644
index 0000000000..4b03675438
--- /dev/null
+++ b/presentations/bootstrapping-2018/drake-meme.png
Binary files differdiff --git a/presentations/bootstrapping-2018/nixos-logo.png b/presentations/bootstrapping-2018/nixos-logo.png
new file mode 100644
index 0000000000..ce0c98c2ca
--- /dev/null
+++ b/presentations/bootstrapping-2018/nixos-logo.png
Binary files differdiff --git a/presentations/bootstrapping-2018/notes.org b/presentations/bootstrapping-2018/notes.org
new file mode 100644
index 0000000000..363d75352e
--- /dev/null
+++ b/presentations/bootstrapping-2018/notes.org
@@ -0,0 +1,89 @@
+#+TITLE: Bootstrapping, reproducibility, etc.
+#+AUTHOR: Vincent Ambo
+#+DATE: <2018-03-10 Sat>
+
+* Compiler bootstrapping
+  This section contains notes about compiler bootstrapping, the
+  history thereof, which compilers need it - and so on:
+
+** C
+
+** Haskell
+   - self-hosted compiler (GHC)
+
+** Common Lisp
+   CL is fairly interesting in this space because it is a language
+   that is defined via an ANSI standard that compiler implementations
+   normally actually follow!
+
+   CL has several ecosystem components that focus on making
+   abstracting away implementation-specific calls and if a self-hosted
+   compiler is written in CL using those components it can be
+   cross-bootstrapped.
+
+** Python
+
+* A note on runtimes
+  Sometimes the compiler just isn't enough ...
+
+** LLVM
+** JVM
+
+* References
+  https://github.com/mame/quine-relay
+  https://manishearth.github.io/blog/2016/12/02/reflections-on-rusting-trust/
+  https://tests.reproducible-builds.org/debian/reproducible.html
+
+* Slide thoughts:
+  1. Hardware trust has been discussed here a bunch, most recently
+     during the puri.sm talk. Hardware trust is important, as we see
+     with IME, but it's striking that people often take a leap to "I'm
+     now on my trusted Debian with free software".
+
+     Unless you built it yourself from scratch (Spoiler: you haven't)
+     you're placing trust in what is basically foreign binary blobs.
+
+     Agenda: Implications/attack vectors of this, state of the chicken
+     & egg, the topic of reproducibility, what can you do? (Nix!)
+
+  2. Chicken-and-egg issue
+
+     It's an important milestone for a language to become self-hosted:
+     You begin doing a kind of dogfeeding, you begin to enforce
+     reliability & consistency guarantees to avoid having to redo your
+     own codebase constantly and so on.
+
+     However, the implication is now that you need your own compiler
+     to compile itself.
+
+     Common examples:
+     - C/C++ compilers needed to build C/C++ compilers:
+
+       GCC 4.7 was the last version of GCC that could be built with a
+       standard C-compiler, nowadays it is mostly written in C++.
+
+       Certain versions of GCC can be built with LLVM/Clang.
+
+       Clang/LLVM can be compiled by itself and also GCC.
+
+     - Rust was originally written in OCAML but moved to being
+       self-hosted in 2011. Currently rustc-releases are always built
+       with a copy of the previous release.
+
+       It's relatively new so we can build the chain all the way.
+
+     Notable exceptions: Some popular languages are not self-hosted,
+     for example Clojure. Languages also have runtimes, which may be
+     written in something else (e.g. Haskell -> C runtime)
+* How to help:
+  Most of this advice is about reproducible builds, not bootstrapping,
+  as that is a much harder project.
+
+  - fix reproducibility issues listed in Debian's issue tracker (focus
+    on non-Debian specific ones though)
+  - experiment with NixOS / GuixSD to get a better grasp on the
+    problem space of reproducibility
+
+  If you want to contribute to bootstrapping, look at
+  bootstrappable.org and their wiki. Several initiatives such as MES
+  could need help!
diff --git a/presentations/bootstrapping-2018/presentation.pdf b/presentations/bootstrapping-2018/presentation.pdf
new file mode 100644
index 0000000000..7f435fe5b5
--- /dev/null
+++ b/presentations/bootstrapping-2018/presentation.pdf
Binary files differdiff --git a/presentations/bootstrapping-2018/presentation.tex b/presentations/bootstrapping-2018/presentation.tex
new file mode 100644
index 0000000000..d3aa613375
--- /dev/null
+++ b/presentations/bootstrapping-2018/presentation.tex
@@ -0,0 +1,251 @@
+\documentclass[12pt]{beamer}
+\usetheme{metropolis}
+\newenvironment{code}{\ttfamily}{\par}
+\title{Where does \textit{your} compiler come from?}
+\date{2018-03-13}
+\author{Vincent Ambo}
+\institute{Norwegian Unix User Group}
+\begin{document}
+  \maketitle
+
+  %% Slide 1:
+  \section{Introduction}
+
+  %% Slide 2:
+  \begin{frame}{Chicken and egg}
+    Self-hosted compilers are often built using themselves, for example:
+
+    \begin{itemize}
+    \item C-family compilers bootstrap themselves \& each other
+    \item (Some!) Common Lisp compilers can bootstrap each other
+    \item \texttt{rustc} bootstraps itself with a previous version
+    \item ... same for many other languages!
+    \end{itemize}
+  \end{frame}
+
+  \begin{frame}{Chicken, egg and ... lizard?}
+    It's not just compilers: Languages have runtimes, too.
+
+    \begin{itemize}
+    \item JVM is implemented in C++
+    \item Erlang-VM is C
+    \item Haskell runtime is C
+    \end{itemize}
+
+    ... we can't ever get away from C, can we?
+  \end{frame}
+
+  %% Slide 3:
+  \begin{frame}{Trusting Trust}
+    \begin{center}
+      \huge{Could this be exploited?}
+    \end{center}
+  \end{frame}
+
+  %% Slide 4:
+  \begin{frame}{Short interlude: A quine}
+    \begin{center}
+      \begin{code}
+        ((lambda (x) (list x (list 'quote x)))
+        \newline\vspace*{6mm} '(lambda (x) (list x (list 'quote x))))
+      \end{code}
+    \end{center}
+  \end{frame}
+
+  %% Slide 5:
+  \begin{frame}{Short interlude: Quine Relay}
+    \begin{center}
+      \includegraphics[
+        keepaspectratio=true,
+        height=\textheight
+      ]{quine-relay.png}
+    \end{center}
+  \end{frame}
+
+  %% Slide 6:
+  \begin{frame}{Trusting Trust}
+    An attack described by Ken Thompson in 1983:
+
+    \begin{enumerate}
+    \item Modify a compiler to detect when it's compiling itself.
+    \item Let the modification insert \textit{itself} into the new compiler.
+    \item Add arbitrary attack code to the modification.
+    \item \textit{Optional!} Remove the attack from the source after compilation.
+    \end{enumerate}
+  \end{frame}
+
+  %% Slide 7:
+  \begin{frame}{Damage potential?}
+    \begin{center}
+      \large{Let your imagination run wild!}
+    \end{center}
+  \end{frame}
+
+  %% Slide 8:
+  \section{Countermeasures}
+
+  %% Slide 9:
+  \begin{frame}{Diverse Double-Compiling}
+    Assume we have:
+
+    \begin{itemize}
+    \item Target language compilers $A$ and $T$
+    \item The source code of $A$: $ S_{A} $
+    \end{itemize}
+  \end{frame}
+
+  %% Slide 10:
+  \begin{frame}{Diverse Double-Compiling}
+    Apply the first stage (functional equivalence):
+
+    \begin{itemize}
+    \item $ X = A(S_{A})$
+    \item $ Y = T(S_{A})$
+    \end{itemize}
+
+    Apply the second stage (bit-for-bit equivalence):
+
+    \begin{itemize}
+    \item $ V = X(S_{A})$
+    \item $ W = Y(S_{A})$
+    \end{itemize}
+
+    Now we have a new problem: Reproducibility!
+  \end{frame}
+
+  %% Slide 11:
+  \begin{frame}{Reproducibility}
+    Bit-for-bit equivalent output is hard, for example:
+
+    \begin{itemize}
+    \item Timestamps in output artifacts
+    \item Non-deterministic linking order in concurrent builds
+    \item Non-deterministic VM \& memory states in outputs
+    \item Randomness in builds (sic!)
+    \end{itemize}
+  \end{frame}
+
+  \begin{frame}{Reproducibility}
+    \begin{center}
+      Without reproducibility, we can never trust that any shipped
+      binary matches the source code!
+    \end{center}
+  \end{frame}
+
+  %% Slide 12:
+  \section{(Partial) State of the Union}
+
+  \begin{frame}{The Desired State}
+    \begin{center}
+      \begin{enumerate}
+      \item Full-source bootstrap!
+      \item All packages reproducible!
+      \end{enumerate}
+    \end{center}
+  \end{frame}
+
+  %% Slide 13:
+  \begin{frame}{Bootstrapping Debian}
+    \begin{itemize}
+    \item Sparse information on the Debian-wiki
+    \item Bootstrapping discussions mostly resolve around new architectures
+    \item GCC is compiled by depending on previous versions of GCC
+    \end{itemize}
+  \end{frame}
+
+  \begin{frame}{Reproducing Debian}
+    Debian has a very active effort for reproducible builds:
+
+    \begin{itemize}
+    \item Organised information about reproducibility status
+    \item Over 90\% reproducibility in Debian package base!
+    \end{itemize}
+  \end{frame}
+
+  \begin{frame}{Short interlude: Nix}
+    \begin{center}
+      \includegraphics[
+        keepaspectratio=true,
+        height=0.7\textheight
+      ]{nixos-logo.png}
+    \end{center}
+  \end{frame}
+
+  \begin{frame}{Short interlude: Nix}
+    \begin{center}
+      \includegraphics[
+        keepaspectratio=true,
+        height=0.90\textheight
+      ]{drake-meme.png}
+    \end{center}
+  \end{frame}
+
+  \begin{frame}{Short interlude: Nix}
+    \begin{center}
+      \includegraphics[
+        keepaspectratio=true,
+        height=0.7\textheight
+      ]{nixos-logo.png}
+    \end{center}
+  \end{frame}
+
+  \begin{frame}{Bootstrapping NixOS}
+    Nix evaluation can not recurse forever: The bootstrap can not
+    simply depend on a previous GCC.
+
+    Workaround: \texttt{bootstrap-tools} tarball from a previous
+    binary cache is fetched and used.
+
+    An unfortunate magic binary blob ...
+  \end{frame}
+
+  \begin{frame}{Reproducing NixOS}
+    Not all reproducibility patches have been ported from Debian.
+
+    However: Builds are fully repeatable via the Nix fundamentals!
+  \end{frame}
+
+  \section{Future Developments}
+
+  \begin{frame}{Bootstrappable: stage0}
+    Hand-rolled ``Cthulhu's Path to Madness'' hex-programs:
+
+    \begin{itemize}
+    \item No non-auditable binary blobs
+    \item Aims for understandability by 70\% of programmers
+    \item End goal is a full-source bootstrap of GCC
+    \end{itemize}
+  \end{frame}
+
+
+  \begin{frame}{Bootstrappable: MES}
+    Bootstrapping the ``Maxwell Equations of Software'':
+
+    \begin{itemize}
+    \item Minimal C-compiler written in Scheme
+    \item Minimal Scheme-interpreter (currently in C, but intended to
+      be rewritten in stage0 macros)
+    \item End goal is full-source bootstrap of the entire GuixSD
+    \end{itemize}
+  \end{frame}
+
+  \begin{frame}{Other platforms}
+    \begin{itemize}
+    \item Nix for Darwin is actively maintained
+    \item F-Droid Android repository works towards fully reproducible
+      builds of (open) Android software
+    \item Mobile devices (phones, tablets, etc.) are a lost cause at
+      the moment
+    \end{itemize}
+  \end{frame}
+
+  \begin{frame}{Thanks!}
+    Resources:
+    \begin{itemize}
+    \item bootstrappable.org
+    \item reproducible-builds.org
+    \end{itemize}
+
+    @tazjin | mail@tazj.in
+  \end{frame}
+\end{document}
diff --git a/presentations/bootstrapping-2018/quine-relay.png b/presentations/bootstrapping-2018/quine-relay.png
new file mode 100644
index 0000000000..5644dc3900
--- /dev/null
+++ b/presentations/bootstrapping-2018/quine-relay.png
Binary files differdiff --git a/presentations/bootstrapping-2018/result.pdfpc b/presentations/bootstrapping-2018/result.pdfpc
new file mode 100644
index 0000000000..b0fa6c9a0e
--- /dev/null
+++ b/presentations/bootstrapping-2018/result.pdfpc
@@ -0,0 +1,142 @@
+[file]
+result
+[last_saved_slide]
+10
+[font_size]
+20000
+[notes]
+### 1
+- previous discussions of hardware trust (e.g. purism presentation)
+- people leap to "now I'm on my trusted Debian!"
+- unless you built it from scratch (spoiler: you haven't) you're *trusting* someone
+
+Agenda: Implications of trust with focus on bootstrap paths and reproducibility, plus how you can help.### 2
+self-hosting:
+- C-family: GCC pre/post 4.7, Clang
+- Common Lisp: Sunshine land! (with SBCL)
+- rustc: Bootstrap based on previous versions (C++ transpiler underway!)
+- many other languages also work this way!
+
+(Noteable counterexample: Clojure is written in Java!)### 3
+
+- compilers are just one bit, the various runtimes exist, too!### 4
+
+Could this be exploited?
+
+People don't think about where their compiler comes from.
+
+Even if they do, they may only go so far as to say "I'll just recompile it using <other compiler>".
+
+Unfortunately, spoiler alert, life isn't that easy in the computer world and yes, exploitation is possible.### 5
+
+- describe what a quine is
+- classic Lisp quine
+- explain demo quine
+- demo demo quine
+
+- this is interesting, but not useful - can quines do more than that?### 6
+
+- quine-relay: "art project" with 128-language circular quine
+
+- show source of quine-relay
+
+- (demo quine relay?)
+
+- side-note: this program is very, very trustworthy!### 7
+
+Ken Thompson (designer of UNIX and a couple other things!) received Turing award in 1983, and described attack in speech.
+
+- figure out how to detect self-compilation
+- make that modification a quine
+- insert modification into new compiler
+- add attack code to modification
+- remove attack from source, distributed binary will still be compromised! it's like evolution :)### 8
+
+damage potential is basically infinite:
+
+- classic "login" attack
+=> also applicable to other credentials
+
+- attack (weaken) crypto algorithms
+
+- you can probably think of more!### 10
+
+idea being: potential vulnerability would have to work across compilers:
+
+the more compilers we can introduce (e.g. more architectures, different versions, different compilers), the harder it gets for a vulnerability to survive all of those
+
+The more compilers, the merrier! Lisps are pretty good at this.### 11
+
+if we get a bit-mismatch after DDC, not all hope is lost: Maybe the thing just isn't reproducible!
+
+- many reasons for failures
+- timestamps are a classic! artifacts can be build logs, metadata in ZIP-files or whatever
+- non-determinism is the devil
+- sometimes people actively introduce build-randomness (NaCl)### 12
+
+- Does that binary download on the project's website really match the source?
+
+- Your Linux packages are signed by someone - cool - but what does that mean?### 13
+
+Two things should be achieved - gross oversimplification - to get to the ideal "desired state of the union":
+
+1. full-source bootstrap: without ever introducing any binaries, go from nothing to a full Linux distribution
+
+2. when packages are distributed, we should be able to know the expected output of a source package beforehand
+
+=> suddenly binary distributions become a cache! But more on Nix later.### 14
+
+- Debian project does not seem as concerned with bootstrapping as with reproducibility
+- Debian mostly bootstraps on new architectures (using cross-compilation and similar techniques, from an existing binary base)
+- core bootstrap (GCC & friends) is performed with previous Debian version and depending on GCC### 15
+
+... however! Debian cares about reproducibility.
+
+- automated testing of reproducibility
+- information about the status of all packages is made available in repos
+- Over 90% packages of packages are reproducible!
+
+< show reproducible builds website >
+
+Debian is still fundamentally a binary distribution though, but it doesn't have to be that way.### 16
+
+Nix - a purely functional package manager
+
+It's not a new project (10+ years), been discussed here before, has multiple components: package manager, language, NixOS.
+
+Instead of describing *how* to build a thing, Nix describes *what* to build:### 17
+### 19
+
+In Nix, it's impossible to say "GCC is the result of applying GCC to the GCC source", because that happens to be infinite recursion.
+
+Bootstrapping in Nix works by introducing a binary pinned by its full-hash, which was built on some previous Nix version.
+
+Unfortunately also just a magic binary blob ... ### 20
+
+NixOS is not actively porting all of Debian's reproducibility patches, but builds are fully repeatable:
+
+- introducing a malicious compiler would produce a different input hash -> different package
+
+Future slide: hope is not lost! Things are underway.### 21
+
+- bootstrappable.org (demo?) is an umbrella page for several projects working on bootstrappability
+
+- stage0 is an important piece: manually, small, auditable Hex programs to get to a Hex macro expander
+
+- end goal is a full-source bootrap, but pieces are missing### 22
+
+MES is out of the GuixSD circles (explain Guix, GNU Hurd joke)
+
+- idea being that once you have a Lisp, you have all of computing (as Alan Key said)
+
+- includes MesCC in Scheme -> can *almost* make a working tinyCC -> can *almost* make a working gcc 4.7
+
+- minimal Scheme interpreter, currently built in C to get the higher-level stuff to work, goal is rewrite in hex
+- bootstrapping Guix is the end goal### 23
+
+- userspace in Darwin has a Nix project
+- unsure about other BSDs, but if anyone knows - input welcome!
+- F-Droid has reproducible Android packages, but that's also userspace only
+- All other mobile platforms are a lost cause
+
+Generally, all closed-source software is impossible to trust.
diff --git a/contrib/credential/netrc/test.netrc.gpg b/presentations/erlang-2016/.skip-subtree
index e69de29bb2..e69de29bb2 100644
--- a/contrib/credential/netrc/test.netrc.gpg
+++ b/presentations/erlang-2016/.skip-subtree
diff --git a/presentations/erlang-2016/README.md b/presentations/erlang-2016/README.md
new file mode 100644
index 0000000000..e1b6c83b99
--- /dev/null
+++ b/presentations/erlang-2016/README.md
@@ -0,0 +1,6 @@
+These are the slides for a presentation I gave for the Oslo javaBin meetup in
+2016.
+
+Unfortunately there is no recording of the presentation due to a technical error
+(video was recorded, but no audio). This is a bit of a shame because I think
+these are some of the best slides I've ever made.
diff --git a/presentations/erlang-2016/presentation.md b/presentations/erlang-2016/presentation.md
new file mode 100644
index 0000000000..526564b882
--- /dev/null
+++ b/presentations/erlang-2016/presentation.md
@@ -0,0 +1,222 @@
+slidenumbers: true
+Erlang.
+======
+
+### Fault-tolerant, concurrent programming.
+
+---
+
+## A brief history of Erlang
+
+---
+
+![](https://www.ericsson.com/thinkingahead/the-networked-society-blog/wp-content/uploads/2014/09/bfW5FSr.jpg)
+
+
+^ Telefontornet in Stockholm, around 1890. Used until 1913. 
+
+---
+
+![](https://3.bp.blogspot.com/-UF7W9yTUO2g/VBqw-1HNTzI/AAAAAAAAPeg/KvsMbNSAcII/s1600/6835942484_1531372d8f_b.jpg)
+
+^ Telephones were operated manually at Switchboards. Anyone old enough to remember? I'm certainly not. 
+
+---
+
+![fit](https://russcam.github.io/fsharp-akka-talk/images/ericsson-301-AXD.png)
+
+^ Eventually we did that in software, and we got better at it over time. Ericsson AXD 301, first commercial Erlang switch. But lets take a step back.
+
+---
+
+## Phone switches must be ...
+
+Highly concurrent
+
+Fault-tolerant
+
+Distributed
+
+(Fast!)
+
+![right 150%](http://learnyousomeerlang.com/static/img/erlang-the-movie.png)
+
+---
+
+## ... and so is Erlang!
+
+---
+
+## Erlang as a whole:
+
+- Unique process model (actors!)
+- Built-in fault-tolerance & error handling
+- Distributed processes
+- Three parts!
+
+---
+
+## Part 1: Erlang, the language
+
+- Functional
+- Prolog-inspired syntax
+- Everything is immutable
+- *Extreme* pattern-matching
+
+---
+### Hello Joe
+
+```erlang
+hello_joe.
+```
+
+---
+### Hello Joe
+
+```erlang
+-module(hello1).
+-export([hello_joe/0]).
+
+hello_joe() ->
+    hello_joe.
+```
+
+---
+### Hello Joe
+
+```erlang
+-module(hello1).
+-export([hello_joe/0]).
+
+hello_joe() ->
+    hello_joe.
+    
+% 1> c(hello1).
+% {ok,hello1}
+% 2> hello1:hello_joe().
+% hello_joe
+```
+
+---
+### Hello Joe
+
+```erlang
+-module(hello2).
+-export([hello/1]).
+
+hello(Name) ->
+    io:format("Hello ~s!~n", [Name]).
+
+% 3> c(hello2).
+% {ok,hello2}
+% 4> hello2:hello("Joe").
+% Hello Joe!
+% ok
+```
+
+---
+
+## [fit] Hello ~~world~~ Joe is boring!
+## [fit] Lets do it with processes.
+
+---
+### Hello Server
+
+```erlang
+-module(hello_server).
+-export([start_server/0]).
+
+start_server() ->
+    spawn(fun() -> server() end).
+
+server() ->
+    receive
+        {greet, Name} ->
+            io:format("Hello ~s!~n", [Name]),
+            server()
+    end.
+```
+
+---
+
+## [fit] Some issues with that ...
+
+- What about unused messages?
+- What if the server crashes?
+
+---
+
+## [fit] Part 2: Open Telecom Platform
+
+### **It's called Erlang/OTP for a reason.**
+
+---
+
+# OTP: An Application Framework
+
+- Supervision - keep processes alive!
+
+- OTP Behaviours - common process patterns
+
+- Extensive standard library
+
+- Error handling, debuggers, testing, ...
+
+- Lots more!
+
+^ Standard library includes lots of things from simple network libraries over testing frameworks to cryptography, complete LDAP clients etc.
+
+---
+
+# Supervision
+
+![inline](http://erlang.org/doc/design_principles/sup6.gif)
+
+^ Supervision keeps processes alive, different restart behaviours, everything should be supervised to avoid "process" (and therefore memory) leaks
+
+---
+
+# OTP Behaviours
+
+* `gen_server`
+* `gen_statem` 
+* `gen_event`
+* `supervisor`
+
+^ gen = generic. explain server, explain statem, event = event handling with registered handlers, supervisor ...
+
+---
+
+`gen_server`
+
+---
+
+## [fit] Part 3: BEAM
+
+### Bogdan/Bjørn Erlang Abstract machine
+
+---
+
+## A VM for Erlang
+
+* Many were written, BEAM survived
+* Concurrent garbage-collection
+* Lower-level bytecode than JVM
+* Very open to new languages
+  (Elixir, LFE, Joxa, ...)
+
+---
+
+## What next?
+
+* Ole's talk, obviously!
+* Learn You Some Erlang!
+  www.learnyousomeerlang.com
+* Watch *Erlang the Movie*
+* (soon!) Join the Oslo BEAM meetup group
+
+---
+
+# [fit] Questions?
+
+`@tazjin`
diff --git a/presentations/erlang-2016/presentation.pdf b/presentations/erlang-2016/presentation.pdf
new file mode 100644
index 0000000000..ec8d996704
--- /dev/null
+++ b/presentations/erlang-2016/presentation.pdf
Binary files differdiff --git a/presentations/erlang-2016/src/hello.erl b/presentations/erlang-2016/src/hello.erl
new file mode 100644
index 0000000000..56404a0c5a
--- /dev/null
+++ b/presentations/erlang-2016/src/hello.erl
@@ -0,0 +1,5 @@
+-module(hello).
+-export([hello_joe/0]).
+
+hello_joe() ->
+    hello_joe.
diff --git a/presentations/erlang-2016/src/hello1.erl b/presentations/erlang-2016/src/hello1.erl
new file mode 100644
index 0000000000..ca78261399
--- /dev/null
+++ b/presentations/erlang-2016/src/hello1.erl
@@ -0,0 +1,5 @@
+-module(hello1).
+-export([hello_joe/0]).
+
+hello_joe() ->
+    hello_joe.
diff --git a/presentations/erlang-2016/src/hello2.erl b/presentations/erlang-2016/src/hello2.erl
new file mode 100644
index 0000000000..2d1f6c84c4
--- /dev/null
+++ b/presentations/erlang-2016/src/hello2.erl
@@ -0,0 +1,11 @@
+-module(hello2).
+-export([hello/1]).
+
+hello(Name) ->
+    io:format("Hey ~s!~n", [Name]).
+
+% 3> c(hello2).
+% {ok,hello2}
+% 4> hello2:hello("Joe").
+% Hello Joe!
+% ok
diff --git a/presentations/erlang-2016/src/hello_server.erl b/presentations/erlang-2016/src/hello_server.erl
new file mode 100644
index 0000000000..01df14ac57
--- /dev/null
+++ b/presentations/erlang-2016/src/hello_server.erl
@@ -0,0 +1,12 @@
+-module(hello_server).
+-export([start_server/0, server/0]).
+
+start_server() ->
+    spawn(fun() -> server() end).
+
+server() ->
+    receive
+        {greet, Name} ->
+            io:format("Hello ~s!~n", [Name]),
+            hello_server:server()
+    end.
diff --git a/presentations/erlang-2016/src/hello_server2.erl b/presentations/erlang-2016/src/hello_server2.erl
new file mode 100644
index 0000000000..24bb934ee5
--- /dev/null
+++ b/presentations/erlang-2016/src/hello_server2.erl
@@ -0,0 +1,36 @@
+-module(hello_server2).
+-behaviour(gen_server).
+-compile(export_all).
+
+%%% Start callback for supervisor
+start_link() ->
+    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+
+%%% gen_server callbacks
+
+init([]) ->
+    {ok, sets:new()}.
+
+handle_call({greet, Name}, _From, State) ->
+    io:format("Hello ~s!~n", [Name]),
+    NewState = sets:add_element(Name, State),
+    {reply, ok, NewState};
+
+handle_call({bye, Name}, _From, State) ->
+    io:format("Goodbye ~s!~n", [Name]),
+    NewState = sets:del_element(Name, State),
+    {reply, ok, NewState}.
+
+terminate(normal, State) ->
+    [io:format("Goodbye ~s!~n", [Name]) || Name <- State],
+    ok.
+
+%%% Unused gen_server callbacks
+code_change(_OldVsn, State, _Extra) ->
+    {ok, State}.
+
+handle_info(_Info, State) ->
+    {noreply, State}.
+
+handle_cast(_Request, State) ->
+    {noreply, State}.
diff --git a/presentations/erlang-2016/src/hello_sup.erl b/presentations/erlang-2016/src/hello_sup.erl
new file mode 100644
index 0000000000..7fee0928c5
--- /dev/null
+++ b/presentations/erlang-2016/src/hello_sup.erl
@@ -0,0 +1,24 @@
+-module(hello_sup).
+-behaviour(supervisor).
+-export([start_link/0, init/1]).
+
+%%% Module API
+
+start_link() ->
+    supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+%%% Supervisor callbacks
+
+init([]) ->
+    Children = [hello_spec()],
+    {ok, { {one_for_one, 5, 10}, Children}}.
+
+%%% Private
+
+hello_spec() ->
+    #{id       => hello_server2,
+      start    => {hello_server2, start_link, []},
+      restart  => permanent,
+      shutdown => 5000,
+      type     => worker,
+      module   => [hello_server2]}.
diff --git a/presentations/servant-2016/Makefile b/presentations/servant-2016/Makefile
new file mode 100644
index 0000000000..96115ec2cb
--- /dev/null
+++ b/presentations/servant-2016/Makefile
@@ -0,0 +1,8 @@
+all: slides
+
+slides:
+	lualatex --shell-escape slides.tex
+
+clean:
+	rm -f slides.aux slides.log slides.nav \
+	slides.out slides.toc slides.snm
diff --git a/presentations/servant-2016/README.md b/presentations/servant-2016/README.md
new file mode 100644
index 0000000000..8cfb04a424
--- /dev/null
+++ b/presentations/servant-2016/README.md
@@ -0,0 +1,7 @@
+These are the slides for my presentation about [servant][] at [Oslo Haskell][].
+
+A full video recording of the presentation is available [on Vimeo][].
+
+[servant]: https://haskell-servant.github.io/
+[Oslo Haskell]: http://www.meetup.com/Oslo-Haskell/events/227107530/
+[on Vimeo]: https://vimeo.com/153901805
diff --git a/presentations/servant-2016/slides.pdf b/presentations/servant-2016/slides.pdf
new file mode 100644
index 0000000000..842a667e1b
--- /dev/null
+++ b/presentations/servant-2016/slides.pdf
Binary files differdiff --git a/presentations/servant-2016/slides.pdfpc b/presentations/servant-2016/slides.pdfpc
new file mode 100644
index 0000000000..ed46003768
--- /dev/null
+++ b/presentations/servant-2016/slides.pdfpc
@@ -0,0 +1,75 @@
+[file]
+slides.pdf
+[font_size]
+10897
+[notes]
+### 1
+13### 2
+Let's talk about servant, which is several things:
+API description DSL, we'll speak about how this DSL works
+and why it's at the type level
+
+Interpretations of the types resulting from that DSL, for example in
+web servers or API clients
+
+Servant is commonly used or implementing services with APIs, or for accessing
+other APIs with a simple, typed client
+### 3
+Why type-level DSLs?
+Type-level DSL:  express *something*, e.g. endpoints of API, on  type level by combining types. Types can be uninhabited
+
+Phil Wadler's: expression problem: things should be extensible both in the cases of a type, and in the functions operating on the type
+Normal data types: can't add new constructors easily
+Servant lifts thisup to simply allow the declaration of new types that can be included in the DSL, and new interpretations that can be attached to the types through typeclasses
+
+APIs become first-class citizens, can pass them around, combine them etc, they are separate from interpretations such as server implementations. In contrast, in most webframeworks, API declaration is implicit
+
+(Mention previous attemps at type-safe web, Yesod / web-routes + boomerang etc)
+### 4
+Three extensions are necessary:
+TypeOperators lets us use infix operators on the type level as constructors
+DataKinds promotes new type declarations to the kind level, makes type-level literals (strings and natural numbers) available, lets us use type-level lists and pairs in combination with typeoperators
+TypeFamilies: Type-level functions, map one set of types to another, come in two forms (type families, non-injective; data families, injective), more powerful than associated types
+### 5
+Here you can see servant's general syntax, we define an API type as a simple alias of some other type combinations
+strings are type-level strings, not actually values, represent path elements
+endpoints are separated by :<|>, all endpoints end in a method with content types and return types
+Capture captures path segments, but there are other combinators, for example for headers
+Everything that is used from the request is expressed in types, enforcing checkability, no "escape hatch" inside handlers to get request
+Every combinator has associated interpretations through typeclasses
+### 6
+Explain type alias, point out Capture
+Server is a type level function (type family), as mentioned earlier
+### 7
+If we expand server (in ghci with kind!) we can see the actual type of the
+function
+### 8
+Lets speak about some interpretations of these things
+### 9
+Servant server is the main interpretation that people are interested in, it's used
+for taking a type specification and creating a server from it
+Based on WAI, the web application interface, common abstraction for web servers which came out of the Yesod project. Implemented by the web server warp, which Yesod runs on
+### 10
+Explain snippet, path gets removed from server type (irrelevant for handler),
+route extracts string to value level
+### 11
+Explain echo server quickly
+### 12
+servant client allows generation of Haskell functions that query the API with the same types
+this makes for easy to use RPC for example
+### 13
+A lot of other interpretations exist for all kinds of things, mock servers for testing, foreign functions in various languages, documentation ...
+### 14
+Demo!
+1. Go quickly through code
+2. Run server, query with curl
+3. Open javascript function
+4. Show JS code in the thing
+5. Open the map itself
+6. Open GHCi, use client
+7. Generate docs
+### 15
+Conclusion
+Servant is pretty good, it's very easy to get started and it's great to raise the level of things that the compiler can tell you about when you do them wrong.
+### 16
+Drawbacks.
diff --git a/presentations/servant-2016/slides.tex b/presentations/servant-2016/slides.tex
new file mode 100644
index 0000000000..d5947eb942
--- /dev/null
+++ b/presentations/servant-2016/slides.tex
@@ -0,0 +1,137 @@
+\documentclass[12pt]{beamer}
+\usetheme{metropolis}
+\usepackage{minted}
+
+\newenvironment{code}{\ttfamily}{\par}
+
+\title{servant}
+\subtitle{Defining web APIs at the type-level}
+
+\begin{document}
+\metroset{titleformat frame=smallcaps}
+\setminted{fontsize=\scriptsize}
+
+
+\maketitle
+
+\section{Introduction}
+
+\begin{frame}{Type-level DSLs?}
+  \begin{itemize}
+  \item (Uninhabited) types with attached ``meaning''
+  \item The Expression Problem (Wadler 1998)
+  \item API representation and interpretation are separated
+  \item APIs become first-class citizens
+  \end{itemize}
+\end{frame}
+
+\begin{frame}{Haskell extensions}
+  \begin{itemize}
+  \item TypeOperators
+  \item DataKinds
+  \item TypeFamilies
+  \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]{A servant example}
+  \begin{minted}{haskell}
+    type PubAPI = "pubs" :> Get ’[JSON] [Pub]
+             :<|> "pubs" :> "tagged"
+                         :> Capture "tag" Text
+                         :> Get ’[JSON] [Pub]
+  \end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Computed types}
+  \begin{minted}{haskell}
+    type TaggedPubs = "tagged" :> Capture "tag" Text :> ...
+
+    taggedPubsHandler :: Server TaggedPubs
+    taggedPubsHandler tag = ...
+  \end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Computed types}
+  \begin{minted}{haskell}
+    type TaggedPubs = "tagged" :> Capture "tag" Text :> ...
+
+    taggedPubsHandler :: Server TaggedPubs
+    taggedPubsHandler tag = ...
+
+    Server TaggedPubs ~
+    Text -> EitherT ServantErr IO [Pub]
+  \end{minted}
+\end{frame}
+
+\section{Interpretations}
+
+\begin{frame}{servant-server}
+  The one everyone is interested in!
+
+  \begin{itemize}
+  \item Based on WAI, can run on warp
+  \item Interprets combinators with a simple \texttt{HasServer c} class
+  \item Easy to use!
+  \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]{HasServer ...}
+  \begin{minted}{haskell}
+    instance (KnownSymbol path, HasServer sublayout)
+             => HasServer (path :> sublayout) where
+      type ServerT (path :> sublayout) m = ServerT sublayout m
+
+      route ...
+        where
+          pathString = symbolVal (Proxy :: Proxy path)
+  \end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Server example}
+  \begin{minted}{haskell}
+    type Echo = Capture "echo" Text :> Get ’[PlainText] Text
+
+    echoAPI :: Proxy Echo
+    echoAPI = Proxy
+
+    echoServer :: Server Echo
+    echoServer = return
+  \end{minted}
+\end{frame}
+
+\begin{frame}{servant-client}
+  \begin{itemize}
+  \item Generates Haskell client functions for API
+  \item Same types as API specification: For RPC the whole ``web layer'' is abstracted away
+  \item Also easy to use!
+  \end{itemize}
+\end{frame}
+
+\begin{frame}{servant-docs, servant-js ...}
+  Many other interpretations exist already, for example:
+  \begin{itemize}
+  \item Documentation generation
+  \item Foreign function export (e.g. Elm, JavaScript)
+  \item Mock-server generation
+  \end{itemize}
+\end{frame}
+
+\section{Demo}
+
+\section{Conclusion}
+
+\begin{frame}{Drawbacks}
+  \begin{itemize}
+  \item Haskell has no custom open kinds (yet)
+  \item Proxies are ugly
+  \item Errors can be a bit daunting
+  \end{itemize}
+\end{frame}
+
+\begin{frame}{Questions?}
+  Ølkartet: github.com/tazjin/pubkartet \\
+  Slides: github.com/tazjin/servant-presentation
+
+  @tazjin
+\end{frame}
+\end{document}
diff --git a/presentations/systemd-2016/.gitignore b/presentations/systemd-2016/.gitignore
new file mode 100644
index 0000000000..1a38620fe9
--- /dev/null
+++ b/presentations/systemd-2016/.gitignore
@@ -0,0 +1,6 @@
+slides.aux
+slides.log
+slides.nav
+slides.out
+slides.snm
+slides.toc
diff --git a/presentations/systemd-2016/.skip-subtree b/presentations/systemd-2016/.skip-subtree
new file mode 100644
index 0000000000..108b3507dd
--- /dev/null
+++ b/presentations/systemd-2016/.skip-subtree
@@ -0,0 +1 @@
+No Nix files will ever be under this tree ...
diff --git a/presentations/systemd-2016/Makefile b/presentations/systemd-2016/Makefile
new file mode 100644
index 0000000000..ac5dde3cb3
--- /dev/null
+++ b/presentations/systemd-2016/Makefile
@@ -0,0 +1,11 @@
+all: slides.pdf
+
+slides.toc:
+	lualatex slides.tex
+
+slides.pdf: slides.toc
+	lualatex slides.tex
+
+clean:
+	rm -f slides.aux slides.log slides.nav \
+	slides.out slides.toc slides.snm
diff --git a/presentations/systemd-2016/README.md b/presentations/systemd-2016/README.md
new file mode 100644
index 0000000000..7f004b7d14
--- /dev/null
+++ b/presentations/systemd-2016/README.md
@@ -0,0 +1,6 @@
+This repository contains the slides for my systemd presentation at Hackeriet.
+
+Requires LaTeX, [beamer][] and the [metropolis][] theme.
+
+[beamer]: http://mirror.hmc.edu/ctan/macros/latex/contrib/beamer/
+[metropolis]: https://github.com/matze/mtheme
diff --git a/presentations/systemd-2016/demo/demo-error.service b/presentations/systemd-2016/demo/demo-error.service
new file mode 100644
index 0000000000..b2d4c9d347
--- /dev/null
+++ b/presentations/systemd-2016/demo/demo-error.service
@@ -0,0 +1,7 @@
+[Unit]
+Description=Demonstrate failing units
+OnFailure=demo-notify@%n.service
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/false
diff --git a/presentations/systemd-2016/demo/demo-limits.slice b/presentations/systemd-2016/demo/demo-limits.slice
new file mode 100644
index 0000000000..998185d261
--- /dev/null
+++ b/presentations/systemd-2016/demo/demo-limits.slice
@@ -0,0 +1,7 @@
+[Unit]
+Description=Limited resources demo
+DefaultDependencies=no
+Before=slices.target
+
+[Slice]
+CPUQuota=10%
diff --git a/presentations/systemd-2016/demo/demo-notify@.service b/presentations/systemd-2016/demo/demo-notify@.service
new file mode 100644
index 0000000000..e25524b4e2
--- /dev/null
+++ b/presentations/systemd-2016/demo/demo-notify@.service
@@ -0,0 +1,6 @@
+[Unit]
+Description=Demonstrate systemd templating by sending a notification
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/notify-send 'Systemd notification' '%i'
diff --git a/presentations/systemd-2016/demo/demo-path.path b/presentations/systemd-2016/demo/demo-path.path
new file mode 100644
index 0000000000..87f1342da9
--- /dev/null
+++ b/presentations/systemd-2016/demo/demo-path.path
@@ -0,0 +1,6 @@
+[Unit]
+Description=Demonstrate systemd path units
+
+[Path]
+DirectoryNotEmpty=/tmp/hackeriet
+Unit=demo.service
diff --git a/presentations/systemd-2016/demo/demo-stress.service b/presentations/systemd-2016/demo/demo-stress.service
new file mode 100644
index 0000000000..7e14f13e29
--- /dev/null
+++ b/presentations/systemd-2016/demo/demo-stress.service
@@ -0,0 +1,6 @@
+[Unit]
+Description=Stress test CPU
+
+[Service]
+Slice=demo.slice
+ExecStart=/usr/bin/stress -c 5
diff --git a/presentations/systemd-2016/demo/demo-timer.timer b/presentations/systemd-2016/demo/demo-timer.timer
new file mode 100644
index 0000000000..34eccb98b0
--- /dev/null
+++ b/presentations/systemd-2016/demo/demo-timer.timer
@@ -0,0 +1,12 @@
+[Unit]
+Description=Demonstrate systemd timers
+
+[Timer]
+OnActiveSec=2
+OnUnitActiveSec=5
+AccuracySec=5
+Unit=demo.service
+# OnCalendar=Thu,Fri 2016-*-1,5 11:12:13
+
+[Install]
+WantedBy=multi-user.target
diff --git a/presentations/systemd-2016/demo/demo.service b/presentations/systemd-2016/demo/demo.service
new file mode 100644
index 0000000000..fcc710ad93
--- /dev/null
+++ b/presentations/systemd-2016/demo/demo.service
@@ -0,0 +1,6 @@
+[Unit]
+Description=Demo unit for systemd
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/echo "Systemd unit activated. Hello Hackeriet."
diff --git a/presentations/systemd-2016/demo/notes.md b/presentations/systemd-2016/demo/notes.md
new file mode 100644
index 0000000000..b4866b1642
--- /dev/null
+++ b/presentations/systemd-2016/demo/notes.md
@@ -0,0 +1,27 @@
+# simple oneshot
+
+Run `demo-notify@hello.service`
+
+# simple timer
+
+Run `demo-timer.timer`, show both
+
+# enabling
+
+Enable `demo-timer.timer`, go to symlink folder, disable
+
+# OnError
+
+Show & run `demo-error.service`
+
+# cgroups demo
+
+Start `demo-stress.service` without, show in htop, stop
+Show slice unit, start slice unit
+Add Slice=demo-limits.slice
+daemon-reload
+Start stress again
+
+# Proper service
+
+Look at nginx unit
diff --git a/presentations/systemd-2016/slides.pdf b/presentations/systemd-2016/slides.pdf
new file mode 100644
index 0000000000..384db2a6e0
--- /dev/null
+++ b/presentations/systemd-2016/slides.pdf
Binary files differdiff --git a/presentations/systemd-2016/slides.pdfpc b/presentations/systemd-2016/slides.pdfpc
new file mode 100644
index 0000000000..99326bd8bf
--- /dev/null
+++ b/presentations/systemd-2016/slides.pdfpc
@@ -0,0 +1,85 @@
+[file]
+slides.pdf
+[notes]
+### 1
+### 2
+Let's start off by looking at what an init system is, how they used to work and what systemd does different before we go into more systemd-specific details.
+### 3
+system processes that are started include for example FS mounts, network settings, powertop...
+system services are long-running processes such as daemons, e.g. SSH, database or web servers, session managers, udev ...
+
+orphans: Process whose parent has finished somehow, gets adopted by init system
+-> when a process terminates its parent must call wait() to get its exit() code, if there is no init system adopting orphans the process would become a zombie
+### 4
+Before systemd there were simple init systems that just did the tasks listed on the previous slide.
+Init scripts -> increased greatly in complexity over time, look at incomprehensible skeleton for Debian service init scripts
+Runlevels -> things such as single-user mode, full multiuser mode, reboot, halt
+
+Init will run all the scripts, but it will not do much more than print information on success/failure of started scripts
+
+Init scripts run strictly sequential
+
+Init is unaware of inter-service dependencies, expressed through prefixing scripts with numbers etc.
+
+Init will not watch processes after system is booted -> crashing daemons will not automatically restart
+### 5
+### 6
+How systemd came to be
+
+Considering the lack of process monitoring, problematic things about init scripts -> legacy init systems have drawbacks
+
+Apple had already built launchd, a more featured init system that monitored running processes, could automatically restart them and allowed for certain advanced features -> however it is awful to use and wrap your head around
+
+Lennart Poettering of Pulseaudio fame and Kay Sievers decided to implement a new init system to address these problems, while taking certain clues from Apple's design
+### 7
+Systemd's design goals
+### 8
+No more init scripts with opaque effects -> services are clearly defined units
+Unit dependencies -> systemd can figure out what can be started in parallel
+Process supervision: Unit can be configured in many ways, e.g. always restart, only restart on success etc
+Service logs: We'll talk more about this later
+### 9
+Units are the core component of systemd that users deal with. They define services and everything else that systemd needs to start and manage.
+Note that all these are the names of the respective man page on a system with systemd installed
+Types:
+systemd.service - processes controlled by systemd
+systemd.target - equivalent to "runlevels", grouping of units for synchronisation
+systemd.timer - more powerful replacement of cron that starts other units
+systemd.path - systemd equvialent of inotify, watches files/folders -> launches units
+systemd.socket - expose local IPC or network sockets, launch units on connections
+systemd.device - trigger units when certain devices are connected
+systemd.mount - systemd equivalent of fstab entries
+systemd.swap - like mount
+systemd.slice - unit groups for resource management purposes
+... and a few more specialised ones
+### 10
+Linux cgroups are a new resource management feature added quite a long time ago, but not used much.
+Cgroups can be created manually and processes can be moved into them in order to control resource utilisation
+Few people used them before systemd, limits.conf was often much easier but not as fine-grained
+Systemd changed this
+### 11
+Systemd collects standard output and stderr from all processes into its journal system
+they provide a tool for querying the log, for example grouping service logs together with correct timestamps, querying,
+### 12
+Systemd tooling, most important one is systemctl for general service management
+journalctl is the query and management tool for journald
+systemd-analyze is used for figuring out performance issues, for example by analysing the boot process, can make cool graphs of dependencies
+systemd-cgtop is like top, but not on a process level - it's on a cgroup/slice level, shows combined usage of cgroups
+systemd-cgls lists contents of systemd's cgroups to see which services are in what group
+there also exist a bunch of others that we'll skip for now
+### 13
+### 14
+### 15
+Systemd criticism comes from many directions and usually focuses on a few points
+feature-creep: systemd is absorbing a lot of different services
+### 16
+explain diagram a bit
+### 17
+opaque: as a result, systemd has a lot more internal complexity that people can't easily wrap your mind around. However I argue that unless you're using something like suckless' sinit with your own scripts, you probably have no idea what your init does today anyways
+unstable: this was definitely true even in the first stable release, with the binary log format getting corrupted for example. I haven't personally experienced any trouble with it recently though.
+Another thing is that services start depending on systemd when they shouldn't, a problem for the BSD world (who cares (hey christoph!))
+### 18
+Despite criticism, systemd was adopted rapidly by large portions of the Linux
+Initially in RedHat, because Poettering and co work there and it was clear from the beginning that it would be there
+ArchLinux (which I'm using) and a few others followed suit quite quickly
+Eventually, the big Debian init system discussion - after a lot of flaming - led to Debian adopting it as well, which had a ripple effect for related distros such as Ubuntu which abandoned upstart for it.
\ No newline at end of file
diff --git a/presentations/systemd-2016/slides.tex b/presentations/systemd-2016/slides.tex
new file mode 100644
index 0000000000..c613cefd7e
--- /dev/null
+++ b/presentations/systemd-2016/slides.tex
@@ -0,0 +1,160 @@
+\documentclass[12pt]{beamer}
+\usetheme{metropolis}
+
+\newenvironment{code}{\ttfamily}{\par}
+
+\title{systemd}
+\subtitle{The standard Linux init system}
+
+\begin{document}
+\metroset{titleformat frame=smallcaps}
+
+\maketitle
+
+\section{Introduction}
+
+\begin{frame}{What is an init system?}
+  An init system is the first userspace process (PID 1) started in a UNIX-like system. It handles:
+
+  \begin{itemize}
+  \item Starting system processes and services to prepare the environment
+  \item Adopting and ``reaping'' orphaned processes
+  \end{itemize}
+\end{frame}
+
+\begin{frame}{Classical init systems}
+  Init systems before systemd - such as SysVinit - were very simple.
+
+  \begin{itemize}
+  \item Services and processes to run are organised into ``init scripts''
+  \item Scripts are linked to specific runlevels
+  \item Init system is configured to boot into a runlevel
+  \end{itemize}
+
+\end{frame}
+
+\section{systemd}
+
+\begin{frame}{Can we do better?}
+  \begin{itemize}
+  \item ``legacy'' init systems have a lot of drawbacks
+  \item Apple is taking a different approach on OS X
+  \item Systemd project was founded to address these issues
+  \end{itemize}
+\end{frame}
+
+\begin{frame}{Systemd design goals}
+  \begin{itemize}
+  \item Expressing service dependencies
+  \item Monitoring service status
+  \item Enable parallel service startups
+  \item Ease of use
+  \end{itemize}
+\end{frame}
+
+\begin{frame}{Systemd - the basics}
+  \begin{itemize}
+  \item No scripts are executed, only declarative units
+  \item Units have explicit dependencies
+  \item Processes are supervised
+  \item cgroups are utilised to apply resource limits
+  \item Service logs are managed and centrally queryable
+  \item Much more!
+  \end{itemize}
+\end{frame}
+
+\begin{frame}{Systemd units}
+  Units specify how and what to start. Several types exist:
+  \begin{code}
+    \small
+    \begin{columns}[T,onlytextwidth]
+      \column{0.5\textwidth}
+      \begin{itemize}
+      \item systemd.service
+      \item systemd.target
+      \item systemd.timer
+      \item systemd.path
+      \item systemd.socket
+      \end{itemize}
+      \column{0.5\textwidth}
+      \begin{itemize}
+      \item systemd.device
+      \item systemd.mount
+      \item systemd.swap
+      \item systemd.slice
+      \end{itemize}
+    \end{columns}
+  \end{code}
+\end{frame}
+
+
+\begin{frame}{Resource management}
+  Systemd utilises Linux \texttt{cgroups} for resource management, specifically CPU, disk I/O and memory usage.
+
+  \begin{itemize}
+  \item Hierarchical setup of groups makes it easy to limit resources for a set of services
+  \item Units can be attached to a \texttt{systemd.slice} for controlling resources for a group of services
+  \item Resource limits can also be specified directly in the unit
+  \end{itemize}
+\end{frame}
+
+\begin{frame}{journald}
+  Systemd comes with an integrated log management solution, replacing software such as \texttt{syslog-ng}.
+  \begin{itemize}
+  \item All process output is collected in the journal
+  \item \texttt{journalctl} tool provides many options for querying and tailing logs
+  \item Children of processes automatically log to the journal as well
+  \item \textbf{Caveat:} Hard to learn initially
+  \end{itemize}
+\end{frame}
+
+\begin{frame}{Systemd tooling}
+  A variety of CLI-tools exist for managing systemd systems.
+  \begin{code}
+    \begin{itemize}
+    \item systemctl
+    \item journalctl
+    \item systemd-analyze
+    \item systemd-cgtop
+    \item systemd-cgls
+    \end{itemize}
+  \end{code}
+
+  Let's look at some of them.
+\end{frame}
+
+\section{Demo}
+
+\section{Controversies}
+
+\begin{frame}{Systemd criticism}
+  Systemd has been heavily criticised, usually focusing around a few points:
+  \begin{itemize}
+  \item Feature-creep: Systemd absorbs more and more other services
+  \end{itemize}
+\end{frame}
+
+\begin{frame}{Systemd criticism}
+  \includegraphics[keepaspectratio=true,width=\textwidth]{systemdcomponents.png}
+\end{frame}
+
+\begin{frame}{Systemd criticism}
+  Systemd has been heavily criticised, usually focusing around a few points:
+  \begin{itemize}
+  \item Feature-creep: Systemd absorbs more and more other services
+  \item Opaque: systemd's inner workings are harder to understand than old \texttt{init}
+  \item Unstable: development is quick and breakage happens
+  \end{itemize}
+\end{frame}
+
+\begin{frame}{Systemd adoption}
+  Systemd was initially adopted by RedHat (and related distributions).
+
+  It spread quickly to others, for example ArchLinux.
+
+  Debian and Ubuntu were the last major players who decided to adopt it, but not without drama.
+\end{frame}
+
+\section{Questions?}
+
+\end{document}
diff --git a/presentations/systemd-2016/systemdcomponents.png b/presentations/systemd-2016/systemdcomponents.png
new file mode 100644
index 0000000000..a22c762f7e
--- /dev/null
+++ b/presentations/systemd-2016/systemdcomponents.png
Binary files differdiff --git a/third_party/README.md b/third_party/README.md
new file mode 100644
index 0000000000..267f234697
--- /dev/null
+++ b/third_party/README.md
@@ -0,0 +1,13 @@
+Third-Party Code
+================
+
+Code under this folder is one of the following:
+
+1. Externally developed dependencies which have been imported ("vendored") into
+   this repository. These dependencies come with their own licenses and whatever
+   else.
+
+2. Code that is developed inside of this repository, but released to an external
+   repository via [Copybara][].
+
+[Copybara]: https://github.com/google/copybara
diff --git a/third_party/cgit/.gitignore b/third_party/cgit/.gitignore
new file mode 100644
index 0000000000..661df346c2
--- /dev/null
+++ b/third_party/cgit/.gitignore
@@ -0,0 +1,12 @@
+# Files I don't care to see in git-status/commit
+/cgit
+cgit.conf
+CGIT-CFLAGS
+VERSION
+cgitrc.5
+cgitrc.5.fo
+cgitrc.5.html
+cgitrc.5.pdf
+cgitrc.5.xml
+*.o
+*.d
diff --git a/third_party/cgit/.gitmodules b/third_party/cgit/.gitmodules
new file mode 100644
index 0000000000..5c6ecb4f89
--- /dev/null
+++ b/third_party/cgit/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "git"]
+	url = https://git.kernel.org/pub/scm/git/git.git
+	path = git
diff --git a/third_party/cgit/.mailmap b/third_party/cgit/.mailmap
new file mode 100644
index 0000000000..03b54796cf
--- /dev/null
+++ b/third_party/cgit/.mailmap
@@ -0,0 +1,10 @@
+Florian Pritz <bluewind@xinu.at> <bluewind@xssn.at>
+Harley Laue <losinggeneration@gmail.com> <losinggeneration@aim.com>
+John Keeping <john@keeping.me.uk> <john@metanate.com>
+Lars Hjemli <hjemli@gmail.com> <larsh@hal-2004.(none)>
+Lars Hjemli <hjemli@gmail.com> <larsh@hatman.(none)>
+Lars Hjemli <hjemli@gmail.com> <larsh@slackbox.hjemli.net>
+Lars Hjemli <hjemli@gmail.com> <larsh@slaptop.hjemli.net>
+Lukas Fleischer <lfleischer@lfos.de> <cgit@cryptocrack.de>
+Lukas Fleischer <lfleischer@lfos.de> <info@cryptocrack.de>
+Stefan Bühler <source@stbuehler.de> <lighttpd@stbuehler.de>
diff --git a/third_party/cgit/AUTHORS b/third_party/cgit/AUTHORS
new file mode 100644
index 0000000000..031de338f9
--- /dev/null
+++ b/third_party/cgit/AUTHORS
@@ -0,0 +1,13 @@
+Maintainer:
+	Jason A. Donenfeld <Jason@zx2c4.com>
+
+Contributors:
+	Jason A. Donenfeld <Jason@zx2c4.com>
+	Lukas Fleischer <cgit@cryptocrack.de>
+	Johan Herland <johan@herland.net>
+	Lars Hjemli <hjemli@gmail.com>
+	Ferry Huberts <ferry.huberts@pelagic.nl>
+	John Keeping <john@keeping.me.uk>
+
+Previous Maintainer:
+	Lars Hjemli <hjemli@gmail.com>
diff --git a/third_party/cgit/COPYING b/third_party/cgit/COPYING
new file mode 100644
index 0000000000..d159169d10
--- /dev/null
+++ b/third_party/cgit/COPYING
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/third_party/cgit/Makefile b/third_party/cgit/Makefile
new file mode 100644
index 0000000000..96ad7cd878
--- /dev/null
+++ b/third_party/cgit/Makefile
@@ -0,0 +1,170 @@
+all::
+
+CGIT_VERSION = v1.2.1
+CGIT_SCRIPT_NAME = cgit.cgi
+CGIT_SCRIPT_PATH = /var/www/htdocs/cgit
+CGIT_DATA_PATH = $(CGIT_SCRIPT_PATH)
+CGIT_CONFIG = /etc/cgitrc
+CACHE_ROOT = /var/cache/cgit
+prefix = /usr/local
+libdir = $(prefix)/lib
+filterdir = $(libdir)/cgit/filters
+docdir = $(prefix)/share/doc/cgit
+htmldir = $(docdir)
+pdfdir = $(docdir)
+mandir = $(prefix)/share/man
+SHA1_HEADER = <openssl/sha.h>
+GIT_VER = 2.23.0
+GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
+INSTALL = install
+COPYTREE = cp -r
+MAN5_TXT = $(wildcard *.5.txt)
+MAN_TXT  = $(MAN5_TXT)
+DOC_MAN5 = $(patsubst %.txt,%,$(MAN5_TXT))
+DOC_HTML = $(patsubst %.txt,%.html,$(MAN_TXT))
+DOC_PDF  = $(patsubst %.txt,%.pdf,$(MAN_TXT))
+
+ASCIIDOC = asciidoc
+ASCIIDOC_EXTRA =
+ASCIIDOC_HTML = xhtml11
+ASCIIDOC_COMMON = $(ASCIIDOC) $(ASCIIDOC_EXTRA)
+TXT_TO_HTML = $(ASCIIDOC_COMMON) -b $(ASCIIDOC_HTML)
+
+# Define NO_C99_FORMAT if your formatted IO functions (printf/scanf et.al.)
+# do not support the 'size specifiers' introduced by C99, namely ll, hh,
+# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).
+# some C compilers supported these specifiers prior to C99 as an extension.
+#
+# Define HAVE_LINUX_SENDFILE to use sendfile()
+
+#-include config.mak
+
+-include git/config.mak.uname
+#
+# Let the user override the above settings.
+#
+-include cgit.conf
+
+export CGIT_VERSION CGIT_SCRIPT_NAME CGIT_SCRIPT_PATH CGIT_DATA_PATH CGIT_CONFIG CACHE_ROOT
+
+#
+# Define a way to invoke make in subdirs quietly, shamelessly ripped
+# from git.git
+#
+QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
+QUIET_SUBDIR1  =
+
+ifneq ($(findstring w,$(MAKEFLAGS)),w)
+PRINT_DIR = --no-print-directory
+else # "make -w"
+NO_SUBDIR = :
+endif
+
+ifndef V
+	QUIET_SUBDIR0  = +@subdir=
+	QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
+			 $(MAKE) $(PRINT_DIR) -C $$subdir
+	QUIET_TAGS     = @echo '   ' TAGS $@;
+	export V
+endif
+
+.SUFFIXES:
+
+all:: cgit
+
+cgit:
+	$(QUIET_SUBDIR0)git $(QUIET_SUBDIR1) -f ../cgit.mk ../cgit $(EXTRA_GIT_TARGETS) NO_CURL=1
+
+sparse:
+	$(QUIET_SUBDIR0)git $(QUIET_SUBDIR1) -f ../cgit.mk NO_CURL=1 cgit-sparse
+
+test:
+	@$(MAKE) --no-print-directory cgit EXTRA_GIT_TARGETS=all
+	$(QUIET_SUBDIR0)tests $(QUIET_SUBDIR1) all
+
+install: all
+	$(INSTALL) -m 0755 -d $(DESTDIR)$(CGIT_SCRIPT_PATH)
+	$(INSTALL) -m 0755 cgit $(DESTDIR)$(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME)
+	$(INSTALL) -m 0755 -d $(DESTDIR)$(CGIT_DATA_PATH)
+	$(INSTALL) -m 0644 cgit.css $(DESTDIR)$(CGIT_DATA_PATH)/cgit.css
+	$(INSTALL) -m 0644 cgit.png $(DESTDIR)$(CGIT_DATA_PATH)/cgit.png
+	$(INSTALL) -m 0644 favicon.ico $(DESTDIR)$(CGIT_DATA_PATH)/favicon.ico
+	$(INSTALL) -m 0644 robots.txt $(DESTDIR)$(CGIT_DATA_PATH)/robots.txt
+	$(INSTALL) -m 0755 -d $(DESTDIR)$(filterdir)
+	$(COPYTREE) filters/* $(DESTDIR)$(filterdir)
+
+install-doc: install-man install-html install-pdf
+
+install-man: doc-man
+	$(INSTALL) -m 0755 -d $(DESTDIR)$(mandir)/man5
+	$(INSTALL) -m 0644 $(DOC_MAN5) $(DESTDIR)$(mandir)/man5
+
+install-html: doc-html
+	$(INSTALL) -m 0755 -d $(DESTDIR)$(htmldir)
+	$(INSTALL) -m 0644 $(DOC_HTML) $(DESTDIR)$(htmldir)
+
+install-pdf: doc-pdf
+	$(INSTALL) -m 0755 -d $(DESTDIR)$(pdfdir)
+	$(INSTALL) -m 0644 $(DOC_PDF) $(DESTDIR)$(pdfdir)
+
+uninstall:
+	rm -f $(DESTDIR)$(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME)
+	rm -f $(DESTDIR)$(CGIT_DATA_PATH)/cgit.css
+	rm -f $(DESTDIR)$(CGIT_DATA_PATH)/cgit.png
+	rm -f $(DESTDIR)$(CGIT_DATA_PATH)/favicon.ico
+
+uninstall-doc: uninstall-man uninstall-html uninstall-pdf
+
+uninstall-man:
+	@for i in $(DOC_MAN5); do \
+	    rm -fv $(DESTDIR)$(mandir)/man5/$$i; \
+	done
+
+uninstall-html:
+	@for i in $(DOC_HTML); do \
+	    rm -fv $(DESTDIR)$(htmldir)/$$i; \
+	done
+
+uninstall-pdf:
+	@for i in $(DOC_PDF); do \
+	    rm -fv $(DESTDIR)$(pdfdir)/$$i; \
+	done
+
+doc: doc-man doc-html doc-pdf
+doc-man: doc-man5
+doc-man5: $(DOC_MAN5)
+doc-html: $(DOC_HTML)
+doc-pdf: $(DOC_PDF)
+
+%.5 : %.5.txt
+	a2x -f manpage $<
+
+$(DOC_HTML): %.html : %.txt
+	$(TXT_TO_HTML) -o $@+ $< && \
+	mv $@+ $@
+
+$(DOC_PDF): %.pdf : %.txt
+	a2x -f pdf cgitrc.5.txt
+
+clean: clean-doc
+	$(RM) cgit VERSION CGIT-CFLAGS *.o tags
+	$(RM) -r .deps
+
+cleanall: clean
+	$(MAKE) -C git clean
+
+clean-doc:
+	$(RM) cgitrc.5 cgitrc.5.html cgitrc.5.pdf cgitrc.5.xml cgitrc.5.fo
+
+get-git:
+	curl -L $(GIT_URL) | tar -xJf - && rm -rf git && mv git-$(GIT_VER) git
+
+tags:
+	$(QUIET_TAGS)find . -name '*.[ch]' | xargs ctags
+
+.PHONY: all cgit git get-git
+.PHONY: clean clean-doc cleanall
+.PHONY: doc doc-html doc-man doc-pdf
+.PHONY: install install-doc install-html install-man install-pdf
+.PHONY: tags test
+.PHONY: uninstall uninstall-doc uninstall-html uninstall-man uninstall-pdf
diff --git a/third_party/cgit/README b/third_party/cgit/README
new file mode 100644
index 0000000000..7a6b4a40ca
--- /dev/null
+++ b/third_party/cgit/README
@@ -0,0 +1,99 @@
+cgit - CGI for Git
+==================
+
+This is an attempt to create a fast web interface for the Git SCM, using a
+built-in cache to decrease server I/O pressure.
+
+Installation
+------------
+
+Building cgit involves building a proper version of Git. How to do this
+depends on how you obtained the cgit sources:
+
+a) If you're working in a cloned cgit repository, you first need to
+initialize and update the Git submodule:
+
+    $ git submodule init     # register the Git submodule in .git/config
+    $ $EDITOR .git/config    # if you want to specify a different url for git
+    $ git submodule update   # clone/fetch and checkout correct git version
+
+b) If you're building from a cgit tarball, you can download a proper git
+version like this:
+
+    $ make get-git
+
+When either a) or b) has been performed, you can build and install cgit like
+this:
+
+    $ make
+    $ sudo make install
+
+This will install `cgit.cgi` and `cgit.css` into `/var/www/htdocs/cgit`. You
+can configure this location (and a few other things) by providing a `cgit.conf`
+file (see the Makefile for details).
+
+If you'd like to compile without Lua support, you may use:
+
+    $ make NO_LUA=1
+
+And if you'd like to specify a Lua implementation, you may use:
+
+    $ make LUA_PKGCONFIG=lua5.1
+
+If this is not specified, the Lua implementation will be auto-detected,
+preferring LuaJIT if many are present. Acceptable values are generally "lua",
+"luajit", "lua5.1", and "lua5.2".
+
+
+Dependencies
+------------
+
+* libzip
+* libcrypto (OpenSSL)
+* libssl (OpenSSL)
+* optional: luajit or lua, most reliably used when pkg-config is available
+
+Apache configuration
+--------------------
+
+A new `Directory` section must probably be added for cgit, possibly something
+like this:
+
+    <Directory "/var/www/htdocs/cgit/">
+        AllowOverride None
+        Options +ExecCGI
+        Order allow,deny
+        Allow from all
+    </Directory>
+
+
+Runtime configuration
+---------------------
+
+The file `/etc/cgitrc` is read by cgit before handling a request. In addition
+to runtime parameters, this file may also contain a list of repositories
+displayed by cgit (see `cgitrc.5.txt` for further details).
+
+The cache
+---------
+
+When cgit is invoked it looks for a cache file matching the request and
+returns it to the client. If no such cache file exists (or if it has expired),
+the content for the request is written into the proper cache file before the
+file is returned.
+
+If the cache file has expired but cgit is unable to obtain a lock for it, the
+stale cache file is returned to the client. This is done to favour page
+throughput over page freshness.
+
+The generated content contains the complete response to the client, including
+the HTTP headers `Modified` and `Expires`.
+
+Online presence
+---------------
+
+* The cgit homepage is hosted by cgit at <https://git.zx2c4.com/cgit/about/>
+
+* Patches, bug reports, discussions and support should go to the cgit
+  mailing list: <cgit@lists.zx2c4.com>. To sign up, visit
+  <https://lists.zx2c4.com/mailman/listinfo/cgit>
diff --git a/third_party/cgit/cache.c b/third_party/cgit/cache.c
new file mode 100644
index 0000000000..2c70be784d
--- /dev/null
+++ b/third_party/cgit/cache.c
@@ -0,0 +1,468 @@
+/* cache.c: cache management
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ *
+ *
+ * The cache is just a directory structure where each file is a cache slot,
+ * and each filename is based on the hash of some key (e.g. the cgit url).
+ * Each file contains the full key followed by the cached content for that
+ * key.
+ *
+ */
+
+#include "cgit.h"
+#include "cache.h"
+#include "html.h"
+#ifdef HAVE_LINUX_SENDFILE
+#include <sys/sendfile.h>
+#endif
+
+#define CACHE_BUFSIZE (1024 * 4)
+
+struct cache_slot {
+	const char *key;
+	size_t keylen;
+	int ttl;
+	cache_fill_fn fn;
+	int cache_fd;
+	int lock_fd;
+	int stdout_fd;
+	const char *cache_name;
+	const char *lock_name;
+	int match;
+	struct stat cache_st;
+	int bufsize;
+	char buf[CACHE_BUFSIZE];
+};
+
+/* Open an existing cache slot and fill the cache buffer with
+ * (part of) the content of the cache file. Return 0 on success
+ * and errno otherwise.
+ */
+static int open_slot(struct cache_slot *slot)
+{
+	char *bufz;
+	ssize_t bufkeylen = -1;
+
+	slot->cache_fd = open(slot->cache_name, O_RDONLY);
+	if (slot->cache_fd == -1)
+		return errno;
+
+	if (fstat(slot->cache_fd, &slot->cache_st))
+		return errno;
+
+	slot->bufsize = xread(slot->cache_fd, slot->buf, sizeof(slot->buf));
+	if (slot->bufsize < 0)
+		return errno;
+
+	bufz = memchr(slot->buf, 0, slot->bufsize);
+	if (bufz)
+		bufkeylen = bufz - slot->buf;
+
+	if (slot->key)
+		slot->match = bufkeylen == slot->keylen &&
+		    !memcmp(slot->key, slot->buf, bufkeylen + 1);
+
+	return 0;
+}
+
+/* Close the active cache slot */
+static int close_slot(struct cache_slot *slot)
+{
+	int err = 0;
+	if (slot->cache_fd > 0) {
+		if (close(slot->cache_fd))
+			err = errno;
+		else
+			slot->cache_fd = -1;
+	}
+	return err;
+}
+
+/* Print the content of the active cache slot (but skip the key). */
+static int print_slot(struct cache_slot *slot)
+{
+#ifdef HAVE_LINUX_SENDFILE
+	off_t start_off;
+	int ret;
+
+	start_off = slot->keylen + 1;
+
+	do {
+		ret = sendfile(STDOUT_FILENO, slot->cache_fd, &start_off,
+				slot->cache_st.st_size - start_off);
+		if (ret < 0) {
+			if (errno == EAGAIN || errno == EINTR)
+				continue;
+			return errno;
+		}
+		return 0;
+	} while (1);
+#else
+	ssize_t i, j;
+
+	i = lseek(slot->cache_fd, slot->keylen + 1, SEEK_SET);
+	if (i != slot->keylen + 1)
+		return errno;
+
+	do {
+		i = j = xread(slot->cache_fd, slot->buf, sizeof(slot->buf));
+		if (i > 0)
+			j = xwrite(STDOUT_FILENO, slot->buf, i);
+	} while (i > 0 && j == i);
+
+	if (i < 0 || j != i)
+		return errno;
+	else
+		return 0;
+#endif
+}
+
+/* Check if the slot has expired */
+static int is_expired(struct cache_slot *slot)
+{
+	if (slot->ttl < 0)
+		return 0;
+	else
+		return slot->cache_st.st_mtime + slot->ttl * 60 < time(NULL);
+}
+
+/* Check if the slot has been modified since we opened it.
+ * NB: If stat() fails, we pretend the file is modified.
+ */
+static int is_modified(struct cache_slot *slot)
+{
+	struct stat st;
+
+	if (stat(slot->cache_name, &st))
+		return 1;
+	return (st.st_ino != slot->cache_st.st_ino ||
+		st.st_mtime != slot->cache_st.st_mtime ||
+		st.st_size != slot->cache_st.st_size);
+}
+
+/* Close an open lockfile */
+static int close_lock(struct cache_slot *slot)
+{
+	int err = 0;
+	if (slot->lock_fd > 0) {
+		if (close(slot->lock_fd))
+			err = errno;
+		else
+			slot->lock_fd = -1;
+	}
+	return err;
+}
+
+/* Create a lockfile used to store the generated content for a cache
+ * slot, and write the slot key + \0 into it.
+ * Returns 0 on success and errno otherwise.
+ */
+static int lock_slot(struct cache_slot *slot)
+{
+	struct flock lock = {
+		.l_type = F_WRLCK,
+		.l_whence = SEEK_SET,
+		.l_start = 0,
+		.l_len = 0,
+	};
+
+	slot->lock_fd = open(slot->lock_name, O_RDWR | O_CREAT,
+			     S_IRUSR | S_IWUSR);
+	if (slot->lock_fd == -1)
+		return errno;
+	if (fcntl(slot->lock_fd, F_SETLK, &lock) < 0) {
+		int saved_errno = errno;
+		close(slot->lock_fd);
+		slot->lock_fd = -1;
+		return saved_errno;
+	}
+	if (xwrite(slot->lock_fd, slot->key, slot->keylen + 1) < 0)
+		return errno;
+	return 0;
+}
+
+/* Release the current lockfile. If `replace_old_slot` is set the
+ * lockfile replaces the old cache slot, otherwise the lockfile is
+ * just deleted.
+ */
+static int unlock_slot(struct cache_slot *slot, int replace_old_slot)
+{
+	int err;
+
+	if (replace_old_slot)
+		err = rename(slot->lock_name, slot->cache_name);
+	else
+		err = unlink(slot->lock_name);
+
+	/* Restore stdout and close the temporary FD. */
+	if (slot->stdout_fd >= 0) {
+		dup2(slot->stdout_fd, STDOUT_FILENO);
+		close(slot->stdout_fd);
+		slot->stdout_fd = -1;
+	}
+
+	if (err)
+		return errno;
+
+	return 0;
+}
+
+/* Generate the content for the current cache slot by redirecting
+ * stdout to the lock-fd and invoking the callback function
+ */
+static int fill_slot(struct cache_slot *slot)
+{
+	/* Preserve stdout */
+	slot->stdout_fd = dup(STDOUT_FILENO);
+	if (slot->stdout_fd == -1)
+		return errno;
+
+	/* Redirect stdout to lockfile */
+	if (dup2(slot->lock_fd, STDOUT_FILENO) == -1)
+		return errno;
+
+	/* Generate cache content */
+	slot->fn();
+
+	/* Make sure any buffered data is flushed to the file */
+	if (fflush(stdout))
+		return errno;
+
+	/* update stat info */
+	if (fstat(slot->lock_fd, &slot->cache_st))
+		return errno;
+
+	return 0;
+}
+
+/* Crude implementation of 32-bit FNV-1 hash algorithm,
+ * see http://www.isthe.com/chongo/tech/comp/fnv/ for details
+ * about the magic numbers.
+ */
+#define FNV_OFFSET 0x811c9dc5
+#define FNV_PRIME  0x01000193
+
+unsigned long hash_str(const char *str)
+{
+	unsigned long h = FNV_OFFSET;
+	unsigned char *s = (unsigned char *)str;
+
+	if (!s)
+		return h;
+
+	while (*s) {
+		h *= FNV_PRIME;
+		h ^= *s++;
+	}
+	return h;
+}
+
+static int process_slot(struct cache_slot *slot)
+{
+	int err;
+
+	err = open_slot(slot);
+	if (!err && slot->match) {
+		if (is_expired(slot)) {
+			if (!lock_slot(slot)) {
+				/* If the cachefile has been replaced between
+				 * `open_slot` and `lock_slot`, we'll just
+				 * serve the stale content from the original
+				 * cachefile. This way we avoid pruning the
+				 * newly generated slot. The same code-path
+				 * is chosen if fill_slot() fails for some
+				 * reason.
+				 *
+				 * TODO? check if the new slot contains the
+				 * same key as the old one, since we would
+				 * prefer to serve the newest content.
+				 * This will require us to open yet another
+				 * file-descriptor and read and compare the
+				 * key from the new file, so for now we're
+				 * lazy and just ignore the new file.
+				 */
+				if (is_modified(slot) || fill_slot(slot)) {
+					unlock_slot(slot, 0);
+					close_lock(slot);
+				} else {
+					close_slot(slot);
+					unlock_slot(slot, 1);
+					slot->cache_fd = slot->lock_fd;
+				}
+			}
+		}
+		if ((err = print_slot(slot)) != 0) {
+			cache_log("[cgit] error printing cache %s: %s (%d)\n",
+				  slot->cache_name,
+				  strerror(err),
+				  err);
+		}
+		close_slot(slot);
+		return err;
+	}
+
+	/* If the cache slot does not exist (or its key doesn't match the
+	 * current key), lets try to create a new cache slot for this
+	 * request. If this fails (for whatever reason), lets just generate
+	 * the content without caching it and fool the caller to believe
+	 * everything worked out (but print a warning on stdout).
+	 */
+
+	close_slot(slot);
+	if ((err = lock_slot(slot)) != 0) {
+		cache_log("[cgit] Unable to lock slot %s: %s (%d)\n",
+			  slot->lock_name, strerror(err), err);
+		slot->fn();
+		return 0;
+	}
+
+	if ((err = fill_slot(slot)) != 0) {
+		cache_log("[cgit] Unable to fill slot %s: %s (%d)\n",
+			  slot->lock_name, strerror(err), err);
+		unlock_slot(slot, 0);
+		close_lock(slot);
+		slot->fn();
+		return 0;
+	}
+	// We've got a valid cache slot in the lock file, which
+	// is about to replace the old cache slot. But if we
+	// release the lockfile and then try to open the new cache
+	// slot, we might get a race condition with a concurrent
+	// writer for the same cache slot (with a different key).
+	// Lets avoid such a race by just printing the content of
+	// the lock file.
+	slot->cache_fd = slot->lock_fd;
+	unlock_slot(slot, 1);
+	if ((err = print_slot(slot)) != 0) {
+		cache_log("[cgit] error printing cache %s: %s (%d)\n",
+			  slot->cache_name,
+			  strerror(err),
+			  err);
+	}
+	close_slot(slot);
+	return err;
+}
+
+/* Print cached content to stdout, generate the content if necessary. */
+int cache_process(int size, const char *path, const char *key, int ttl,
+		  cache_fill_fn fn)
+{
+	unsigned long hash;
+	int i;
+	struct strbuf filename = STRBUF_INIT;
+	struct strbuf lockname = STRBUF_INIT;
+	struct cache_slot slot;
+	int result;
+
+	/* If the cache is disabled, just generate the content */
+	if (size <= 0 || ttl == 0) {
+		fn();
+		return 0;
+	}
+
+	/* Verify input, calculate filenames */
+	if (!path) {
+		cache_log("[cgit] Cache path not specified, caching is disabled\n");
+		fn();
+		return 0;
+	}
+	if (!key)
+		key = "";
+	hash = hash_str(key) % size;
+	strbuf_addstr(&filename, path);
+	strbuf_ensure_end(&filename, '/');
+	for (i = 0; i < 8; i++) {
+		strbuf_addf(&filename, "%x", (unsigned char)(hash & 0xf));
+		hash >>= 4;
+	}
+	strbuf_addbuf(&lockname, &filename);
+	strbuf_addstr(&lockname, ".lock");
+	slot.fn = fn;
+	slot.ttl = ttl;
+	slot.stdout_fd = -1;
+	slot.cache_name = filename.buf;
+	slot.lock_name = lockname.buf;
+	slot.key = key;
+	slot.keylen = strlen(key);
+	result = process_slot(&slot);
+
+	strbuf_release(&filename);
+	strbuf_release(&lockname);
+	return result;
+}
+
+/* Return a strftime formatted date/time
+ * NB: the result from this function is to shared memory
+ */
+static char *sprintftime(const char *format, time_t time)
+{
+	static char buf[64];
+	struct tm *tm;
+
+	if (!time)
+		return NULL;
+	tm = gmtime(&time);
+	strftime(buf, sizeof(buf)-1, format, tm);
+	return buf;
+}
+
+int cache_ls(const char *path)
+{
+	DIR *dir;
+	struct dirent *ent;
+	int err = 0;
+	struct cache_slot slot = { NULL };
+	struct strbuf fullname = STRBUF_INIT;
+	size_t prefixlen;
+
+	if (!path) {
+		cache_log("[cgit] cache path not specified\n");
+		return -1;
+	}
+	dir = opendir(path);
+	if (!dir) {
+		err = errno;
+		cache_log("[cgit] unable to open path %s: %s (%d)\n",
+			  path, strerror(err), err);
+		return err;
+	}
+	strbuf_addstr(&fullname, path);
+	strbuf_ensure_end(&fullname, '/');
+	prefixlen = fullname.len;
+	while ((ent = readdir(dir)) != NULL) {
+		if (strlen(ent->d_name) != 8)
+			continue;
+		strbuf_setlen(&fullname, prefixlen);
+		strbuf_addstr(&fullname, ent->d_name);
+		slot.cache_name = fullname.buf;
+		if ((err = open_slot(&slot)) != 0) {
+			cache_log("[cgit] unable to open path %s: %s (%d)\n",
+				  fullname.buf, strerror(err), err);
+			continue;
+		}
+		htmlf("%s %s %10"PRIuMAX" %s\n",
+		      fullname.buf,
+		      sprintftime("%Y-%m-%d %H:%M:%S",
+				  slot.cache_st.st_mtime),
+		      (uintmax_t)slot.cache_st.st_size,
+		      slot.buf);
+		close_slot(&slot);
+	}
+	closedir(dir);
+	strbuf_release(&fullname);
+	return 0;
+}
+
+/* Print a message to stdout */
+void cache_log(const char *format, ...)
+{
+	va_list args;
+	va_start(args, format);
+	vfprintf(stderr, format, args);
+	va_end(args);
+}
+
diff --git a/third_party/cgit/cache.h b/third_party/cgit/cache.h
new file mode 100644
index 0000000000..470da4fc15
--- /dev/null
+++ b/third_party/cgit/cache.h
@@ -0,0 +1,37 @@
+/*
+ * Since git has it's own cache.h which we include,
+ * lets test on CGIT_CACHE_H to avoid confusion
+ */
+
+#ifndef CGIT_CACHE_H
+#define CGIT_CACHE_H
+
+typedef void (*cache_fill_fn)(void);
+
+
+/* Print cached content to stdout, generate the content if necessary.
+ *
+ * Parameters
+ *   size    max number of cache files
+ *   path    directory used to store cache files
+ *   key     the key used to lookup cache files
+ *   ttl     max cache time in seconds for this key
+ *   fn      content generator function for this key
+ *
+ * Return value
+ *   0 indicates success, everything else is an error
+ */
+extern int cache_process(int size, const char *path, const char *key, int ttl,
+			 cache_fill_fn fn);
+
+
+/* List info about all cache entries on stdout */
+extern int cache_ls(const char *path);
+
+/* Print a message to stdout */
+__attribute__((format (printf,1,2)))
+extern void cache_log(const char *format, ...);
+
+extern unsigned long hash_str(const char *str);
+
+#endif /* CGIT_CACHE_H */
diff --git a/third_party/cgit/cgit.c b/third_party/cgit/cgit.c
new file mode 100644
index 0000000000..ac8c6418ba
--- /dev/null
+++ b/third_party/cgit/cgit.c
@@ -0,0 +1,1112 @@
+/* cgit.c: cgi for the git scm
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "cache.h"
+#include "cmd.h"
+#include "configfile.h"
+#include "html.h"
+#include "ui-shared.h"
+#include "ui-stats.h"
+#include "ui-blob.h"
+#include "ui-summary.h"
+#include "scan-tree.h"
+
+const char *cgit_version = CGIT_VERSION;
+
+__attribute__((constructor))
+static void constructor_environment()
+{
+	/* Do not look in /etc/ for gitconfig and gitattributes. */
+	setenv("GIT_CONFIG_NOSYSTEM", "1", 1);
+	setenv("GIT_ATTR_NOSYSTEM", "1", 1);
+	unsetenv("HOME");
+	unsetenv("XDG_CONFIG_HOME");
+}
+
+static void add_mimetype(const char *name, const char *value)
+{
+	struct string_list_item *item;
+
+	item = string_list_insert(&ctx.cfg.mimetypes, name);
+	item->util = xstrdup(value);
+}
+
+static void process_cached_repolist(const char *path);
+
+static void repo_config(struct cgit_repo *repo, const char *name, const char *value)
+{
+	const char *path;
+	struct string_list_item *item;
+
+	if (!strcmp(name, "name"))
+		repo->name = xstrdup(value);
+	else if (!strcmp(name, "clone-url"))
+		repo->clone_url = xstrdup(value);
+	else if (!strcmp(name, "desc"))
+		repo->desc = xstrdup(value);
+	else if (!strcmp(name, "owner"))
+		repo->owner = xstrdup(value);
+	else if (!strcmp(name, "homepage"))
+		repo->homepage = xstrdup(value);
+	else if (!strcmp(name, "defbranch"))
+		repo->defbranch = xstrdup(value);
+	else if (!strcmp(name, "extra-head-content"))
+		repo->extra_head_content = xstrdup(value);
+	else if (!strcmp(name, "snapshots"))
+		repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value);
+	else if (!strcmp(name, "enable-blame"))
+		repo->enable_blame = atoi(value);
+	else if (!strcmp(name, "enable-commit-graph"))
+		repo->enable_commit_graph = atoi(value);
+	else if (!strcmp(name, "enable-log-filecount"))
+		repo->enable_log_filecount = atoi(value);
+	else if (!strcmp(name, "enable-log-linecount"))
+		repo->enable_log_linecount = atoi(value);
+	else if (!strcmp(name, "enable-remote-branches"))
+		repo->enable_remote_branches = atoi(value);
+	else if (!strcmp(name, "enable-subject-links"))
+		repo->enable_subject_links = atoi(value);
+	else if (!strcmp(name, "enable-html-serving"))
+		repo->enable_html_serving = atoi(value);
+	else if (!strcmp(name, "branch-sort")) {
+		if (!strcmp(value, "age"))
+			repo->branch_sort = 1;
+		if (!strcmp(value, "name"))
+			repo->branch_sort = 0;
+	} else if (!strcmp(name, "commit-sort")) {
+		if (!strcmp(value, "date"))
+			repo->commit_sort = 1;
+		if (!strcmp(value, "topo"))
+			repo->commit_sort = 2;
+	} else if (!strcmp(name, "max-stats"))
+		repo->max_stats = cgit_find_stats_period(value, NULL);
+	else if (!strcmp(name, "module-link"))
+		repo->module_link= xstrdup(value);
+	else if (skip_prefix(name, "module-link.", &path)) {
+		item = string_list_append(&repo->submodules, xstrdup(path));
+		item->util = xstrdup(value);
+	} else if (!strcmp(name, "section"))
+		repo->section = xstrdup(value);
+	else if (!strcmp(name, "snapshot-prefix"))
+		repo->snapshot_prefix = xstrdup(value);
+	else if (!strcmp(name, "readme") && value != NULL) {
+		if (repo->readme.items == ctx.cfg.readme.items)
+			memset(&repo->readme, 0, sizeof(repo->readme));
+		string_list_append(&repo->readme, xstrdup(value));
+	} else if (!strcmp(name, "logo") && value != NULL)
+		repo->logo = xstrdup(value);
+	else if (!strcmp(name, "logo-link") && value != NULL)
+		repo->logo_link = xstrdup(value);
+	else if (!strcmp(name, "hide"))
+		repo->hide = atoi(value);
+	else if (!strcmp(name, "ignore"))
+		repo->ignore = atoi(value);
+	else if (ctx.cfg.enable_filter_overrides) {
+		if (!strcmp(name, "about-filter"))
+			repo->about_filter = cgit_new_filter(value, ABOUT);
+		else if (!strcmp(name, "commit-filter"))
+			repo->commit_filter = cgit_new_filter(value, COMMIT);
+		else if (!strcmp(name, "source-filter"))
+			repo->source_filter = cgit_new_filter(value, SOURCE);
+		else if (!strcmp(name, "email-filter"))
+			repo->email_filter = cgit_new_filter(value, EMAIL);
+		else if (!strcmp(name, "owner-filter"))
+			repo->owner_filter = cgit_new_filter(value, OWNER);
+	}
+}
+
+static void config_cb(const char *name, const char *value)
+{
+	const char *arg;
+
+	if (!strcmp(name, "section"))
+		ctx.cfg.section = xstrdup(value);
+	else if (!strcmp(name, "repo.url"))
+		ctx.repo = cgit_add_repo(value);
+	else if (ctx.repo && !strcmp(name, "repo.path"))
+		ctx.repo->path = trim_end(value, '/');
+	else if (ctx.repo && skip_prefix(name, "repo.", &arg))
+		repo_config(ctx.repo, arg, value);
+	else if (!strcmp(name, "readme"))
+		string_list_append(&ctx.cfg.readme, xstrdup(value));
+	else if (!strcmp(name, "root-title"))
+		ctx.cfg.root_title = xstrdup(value);
+	else if (!strcmp(name, "root-desc"))
+		ctx.cfg.root_desc = xstrdup(value);
+	else if (!strcmp(name, "root-readme"))
+		ctx.cfg.root_readme = xstrdup(value);
+	else if (!strcmp(name, "css"))
+		ctx.cfg.css = xstrdup(value);
+	else if (!strcmp(name, "favicon"))
+		ctx.cfg.favicon = xstrdup(value);
+	else if (!strcmp(name, "footer"))
+		ctx.cfg.footer = xstrdup(value);
+	else if (!strcmp(name, "head-include"))
+		ctx.cfg.head_include = xstrdup(value);
+	else if (!strcmp(name, "header"))
+		ctx.cfg.header = xstrdup(value);
+	else if (!strcmp(name, "logo"))
+		ctx.cfg.logo = xstrdup(value);
+	else if (!strcmp(name, "logo-link"))
+		ctx.cfg.logo_link = xstrdup(value);
+	else if (!strcmp(name, "module-link"))
+		ctx.cfg.module_link = xstrdup(value);
+	else if (!strcmp(name, "strict-export"))
+		ctx.cfg.strict_export = xstrdup(value);
+	else if (!strcmp(name, "virtual-root"))
+		ctx.cfg.virtual_root = ensure_end(value, '/');
+	else if (!strcmp(name, "noplainemail"))
+		ctx.cfg.noplainemail = atoi(value);
+	else if (!strcmp(name, "noheader"))
+		ctx.cfg.noheader = atoi(value);
+	else if (!strcmp(name, "snapshots"))
+		ctx.cfg.snapshots = cgit_parse_snapshots_mask(value);
+	else if (!strcmp(name, "enable-filter-overrides"))
+		ctx.cfg.enable_filter_overrides = atoi(value);
+	else if (!strcmp(name, "enable-follow-links"))
+		ctx.cfg.enable_follow_links = atoi(value);
+	else if (!strcmp(name, "enable-http-clone"))
+		ctx.cfg.enable_http_clone = atoi(value);
+	else if (!strcmp(name, "enable-index-links"))
+		ctx.cfg.enable_index_links = atoi(value);
+	else if (!strcmp(name, "enable-index-owner"))
+		ctx.cfg.enable_index_owner = atoi(value);
+	else if (!strcmp(name, "enable-blame"))
+		ctx.cfg.enable_blame = atoi(value);
+	else if (!strcmp(name, "enable-commit-graph"))
+		ctx.cfg.enable_commit_graph = atoi(value);
+	else if (!strcmp(name, "enable-log-filecount"))
+		ctx.cfg.enable_log_filecount = atoi(value);
+	else if (!strcmp(name, "enable-log-linecount"))
+		ctx.cfg.enable_log_linecount = atoi(value);
+	else if (!strcmp(name, "enable-remote-branches"))
+		ctx.cfg.enable_remote_branches = atoi(value);
+	else if (!strcmp(name, "enable-subject-links"))
+		ctx.cfg.enable_subject_links = atoi(value);
+	else if (!strcmp(name, "enable-html-serving"))
+		ctx.cfg.enable_html_serving = atoi(value);
+	else if (!strcmp(name, "enable-tree-linenumbers"))
+		ctx.cfg.enable_tree_linenumbers = atoi(value);
+	else if (!strcmp(name, "enable-git-config"))
+		ctx.cfg.enable_git_config = atoi(value);
+	else if (!strcmp(name, "max-stats"))
+		ctx.cfg.max_stats = cgit_find_stats_period(value, NULL);
+	else if (!strcmp(name, "cache-size"))
+		ctx.cfg.cache_size = atoi(value);
+	else if (!strcmp(name, "cache-root"))
+		ctx.cfg.cache_root = xstrdup(expand_macros(value));
+	else if (!strcmp(name, "cache-root-ttl"))
+		ctx.cfg.cache_root_ttl = atoi(value);
+	else if (!strcmp(name, "cache-repo-ttl"))
+		ctx.cfg.cache_repo_ttl = atoi(value);
+	else if (!strcmp(name, "cache-scanrc-ttl"))
+		ctx.cfg.cache_scanrc_ttl = atoi(value);
+	else if (!strcmp(name, "cache-static-ttl"))
+		ctx.cfg.cache_static_ttl = atoi(value);
+	else if (!strcmp(name, "cache-dynamic-ttl"))
+		ctx.cfg.cache_dynamic_ttl = atoi(value);
+	else if (!strcmp(name, "cache-about-ttl"))
+		ctx.cfg.cache_about_ttl = atoi(value);
+	else if (!strcmp(name, "cache-snapshot-ttl"))
+		ctx.cfg.cache_snapshot_ttl = atoi(value);
+	else if (!strcmp(name, "case-sensitive-sort"))
+		ctx.cfg.case_sensitive_sort = atoi(value);
+	else if (!strcmp(name, "about-filter"))
+		ctx.cfg.about_filter = cgit_new_filter(value, ABOUT);
+	else if (!strcmp(name, "commit-filter"))
+		ctx.cfg.commit_filter = cgit_new_filter(value, COMMIT);
+	else if (!strcmp(name, "email-filter"))
+		ctx.cfg.email_filter = cgit_new_filter(value, EMAIL);
+	else if (!strcmp(name, "owner-filter"))
+		ctx.cfg.owner_filter = cgit_new_filter(value, OWNER);
+	else if (!strcmp(name, "auth-filter"))
+		ctx.cfg.auth_filter = cgit_new_filter(value, AUTH);
+	else if (!strcmp(name, "embedded"))
+		ctx.cfg.embedded = atoi(value);
+	else if (!strcmp(name, "max-atom-items"))
+		ctx.cfg.max_atom_items = atoi(value);
+	else if (!strcmp(name, "max-message-length"))
+		ctx.cfg.max_msg_len = atoi(value);
+	else if (!strcmp(name, "max-repodesc-length"))
+		ctx.cfg.max_repodesc_len = atoi(value);
+	else if (!strcmp(name, "max-blob-size"))
+		ctx.cfg.max_blob_size = atoi(value);
+	else if (!strcmp(name, "max-repo-count"))
+		ctx.cfg.max_repo_count = atoi(value);
+	else if (!strcmp(name, "max-commit-count"))
+		ctx.cfg.max_commit_count = atoi(value);
+	else if (!strcmp(name, "project-list"))
+		ctx.cfg.project_list = xstrdup(expand_macros(value));
+	else if (!strcmp(name, "scan-path"))
+		if (ctx.cfg.cache_size)
+			process_cached_repolist(expand_macros(value));
+		else if (ctx.cfg.project_list)
+			scan_projects(expand_macros(value),
+				      ctx.cfg.project_list, repo_config);
+		else
+			scan_tree(expand_macros(value), repo_config);
+	else if (!strcmp(name, "scan-hidden-path"))
+		ctx.cfg.scan_hidden_path = atoi(value);
+	else if (!strcmp(name, "section-from-path"))
+		ctx.cfg.section_from_path = atoi(value);
+	else if (!strcmp(name, "repository-sort"))
+		ctx.cfg.repository_sort = xstrdup(value);
+	else if (!strcmp(name, "section-sort"))
+		ctx.cfg.section_sort = atoi(value);
+	else if (!strcmp(name, "source-filter"))
+		ctx.cfg.source_filter = cgit_new_filter(value, SOURCE);
+	else if (!strcmp(name, "summary-log"))
+		ctx.cfg.summary_log = atoi(value);
+	else if (!strcmp(name, "summary-branches"))
+		ctx.cfg.summary_branches = atoi(value);
+	else if (!strcmp(name, "summary-tags"))
+		ctx.cfg.summary_tags = atoi(value);
+	else if (!strcmp(name, "side-by-side-diffs"))
+		ctx.cfg.difftype = atoi(value) ? DIFF_SSDIFF : DIFF_UNIFIED;
+	else if (!strcmp(name, "agefile"))
+		ctx.cfg.agefile = xstrdup(value);
+	else if (!strcmp(name, "mimetype-file"))
+		ctx.cfg.mimetype_file = xstrdup(value);
+	else if (!strcmp(name, "renamelimit"))
+		ctx.cfg.renamelimit = atoi(value);
+	else if (!strcmp(name, "remove-suffix"))
+		ctx.cfg.remove_suffix = atoi(value);
+	else if (!strcmp(name, "robots"))
+		ctx.cfg.robots = xstrdup(value);
+	else if (!strcmp(name, "clone-prefix"))
+		ctx.cfg.clone_prefix = xstrdup(value);
+	else if (!strcmp(name, "clone-url"))
+		ctx.cfg.clone_url = xstrdup(value);
+	else if (!strcmp(name, "local-time"))
+		ctx.cfg.local_time = atoi(value);
+	else if (!strcmp(name, "commit-sort")) {
+		if (!strcmp(value, "date"))
+			ctx.cfg.commit_sort = 1;
+		if (!strcmp(value, "topo"))
+			ctx.cfg.commit_sort = 2;
+	} else if (!strcmp(name, "branch-sort")) {
+		if (!strcmp(value, "age"))
+			ctx.cfg.branch_sort = 1;
+		if (!strcmp(value, "name"))
+			ctx.cfg.branch_sort = 0;
+	} else if (skip_prefix(name, "mimetype.", &arg))
+		add_mimetype(arg, value);
+	else if (!strcmp(name, "include"))
+		parse_configfile(expand_macros(value), config_cb);
+}
+
+static void querystring_cb(const char *name, const char *value)
+{
+	if (!value)
+		value = "";
+
+	if (!strcmp(name,"r")) {
+		ctx.qry.repo = xstrdup(value);
+		ctx.repo = cgit_get_repoinfo(value);
+	} else if (!strcmp(name, "p")) {
+		ctx.qry.page = xstrdup(value);
+	} else if (!strcmp(name, "url")) {
+		if (*value == '/')
+			value++;
+		ctx.qry.url = xstrdup(value);
+		cgit_parse_url(value);
+	} else if (!strcmp(name, "qt")) {
+		ctx.qry.grep = xstrdup(value);
+	} else if (!strcmp(name, "q")) {
+		ctx.qry.search = xstrdup(value);
+	} else if (!strcmp(name, "h")) {
+		ctx.qry.head = xstrdup(value);
+		ctx.qry.has_symref = 1;
+	} else if (!strcmp(name, "id")) {
+		ctx.qry.sha1 = xstrdup(value);
+		ctx.qry.has_sha1 = 1;
+	} else if (!strcmp(name, "id2")) {
+		ctx.qry.sha2 = xstrdup(value);
+		ctx.qry.has_sha1 = 1;
+	} else if (!strcmp(name, "ofs")) {
+		ctx.qry.ofs = atoi(value);
+	} else if (!strcmp(name, "path")) {
+		ctx.qry.path = trim_end(value, '/');
+	} else if (!strcmp(name, "name")) {
+		ctx.qry.name = xstrdup(value);
+	} else if (!strcmp(name, "s")) {
+		ctx.qry.sort = xstrdup(value);
+	} else if (!strcmp(name, "showmsg")) {
+		ctx.qry.showmsg = atoi(value);
+	} else if (!strcmp(name, "period")) {
+		ctx.qry.period = xstrdup(value);
+	} else if (!strcmp(name, "dt")) {
+		ctx.qry.difftype = atoi(value);
+		ctx.qry.has_difftype = 1;
+	} else if (!strcmp(name, "ss")) {
+		/* No longer generated, but there may be links out there. */
+		ctx.qry.difftype = atoi(value) ? DIFF_SSDIFF : DIFF_UNIFIED;
+		ctx.qry.has_difftype = 1;
+	} else if (!strcmp(name, "all")) {
+		ctx.qry.show_all = atoi(value);
+	} else if (!strcmp(name, "context")) {
+		ctx.qry.context = atoi(value);
+	} else if (!strcmp(name, "ignorews")) {
+		ctx.qry.ignorews = atoi(value);
+	} else if (!strcmp(name, "follow")) {
+		ctx.qry.follow = atoi(value);
+	}
+}
+
+static void prepare_context(void)
+{
+	memset(&ctx, 0, sizeof(ctx));
+	ctx.cfg.agefile = "info/web/last-modified";
+	ctx.cfg.cache_size = 0;
+	ctx.cfg.cache_max_create_time = 5;
+	ctx.cfg.cache_root = CGIT_CACHE_ROOT;
+	ctx.cfg.cache_about_ttl = 15;
+	ctx.cfg.cache_snapshot_ttl = 5;
+	ctx.cfg.cache_repo_ttl = 5;
+	ctx.cfg.cache_root_ttl = 5;
+	ctx.cfg.cache_scanrc_ttl = 15;
+	ctx.cfg.cache_dynamic_ttl = 5;
+	ctx.cfg.cache_static_ttl = -1;
+	ctx.cfg.case_sensitive_sort = 1;
+	ctx.cfg.branch_sort = 0;
+	ctx.cfg.commit_sort = 0;
+	ctx.cfg.css = "/cgit.css";
+	ctx.cfg.logo = "/cgit.png";
+	ctx.cfg.favicon = "/favicon.ico";
+	ctx.cfg.local_time = 0;
+	ctx.cfg.enable_http_clone = 1;
+	ctx.cfg.enable_index_owner = 1;
+	ctx.cfg.enable_tree_linenumbers = 1;
+	ctx.cfg.enable_git_config = 0;
+	ctx.cfg.max_repo_count = 50;
+	ctx.cfg.max_commit_count = 50;
+	ctx.cfg.max_lock_attempts = 5;
+	ctx.cfg.max_msg_len = 80;
+	ctx.cfg.max_repodesc_len = 80;
+	ctx.cfg.max_blob_size = 0;
+	ctx.cfg.max_stats = 0;
+	ctx.cfg.project_list = NULL;
+	ctx.cfg.renamelimit = -1;
+	ctx.cfg.remove_suffix = 0;
+	ctx.cfg.robots = "index, nofollow";
+	ctx.cfg.root_title = "Git repository browser";
+	ctx.cfg.root_desc = "a fast webinterface for the git dscm";
+	ctx.cfg.scan_hidden_path = 0;
+	ctx.cfg.script_name = CGIT_SCRIPT_NAME;
+	ctx.cfg.section = "";
+	ctx.cfg.repository_sort = "name";
+	ctx.cfg.section_sort = 1;
+	ctx.cfg.summary_branches = 10;
+	ctx.cfg.summary_log = 10;
+	ctx.cfg.summary_tags = 10;
+	ctx.cfg.max_atom_items = 10;
+	ctx.cfg.difftype = DIFF_UNIFIED;
+	ctx.env.cgit_config = getenv("CGIT_CONFIG");
+	ctx.env.http_host = getenv("HTTP_HOST");
+	ctx.env.https = getenv("HTTPS");
+	ctx.env.no_http = getenv("NO_HTTP");
+	ctx.env.path_info = getenv("PATH_INFO");
+	ctx.env.query_string = getenv("QUERY_STRING");
+	ctx.env.request_method = getenv("REQUEST_METHOD");
+	ctx.env.script_name = getenv("SCRIPT_NAME");
+	ctx.env.server_name = getenv("SERVER_NAME");
+	ctx.env.server_port = getenv("SERVER_PORT");
+	ctx.env.http_cookie = getenv("HTTP_COOKIE");
+	ctx.env.http_referer = getenv("HTTP_REFERER");
+	ctx.env.content_length = getenv("CONTENT_LENGTH") ? strtoul(getenv("CONTENT_LENGTH"), NULL, 10) : 0;
+	ctx.env.authenticated = 0;
+	ctx.page.mimetype = "text/html";
+	ctx.page.charset = PAGE_ENCODING;
+	ctx.page.filename = NULL;
+	ctx.page.size = 0;
+	ctx.page.modified = time(NULL);
+	ctx.page.expires = ctx.page.modified;
+	ctx.page.etag = NULL;
+	string_list_init(&ctx.cfg.mimetypes, 1);
+	if (ctx.env.script_name)
+		ctx.cfg.script_name = xstrdup(ctx.env.script_name);
+	if (ctx.env.query_string)
+		ctx.qry.raw = xstrdup(ctx.env.query_string);
+	if (!ctx.env.cgit_config)
+		ctx.env.cgit_config = CGIT_CONFIG;
+}
+
+struct refmatch {
+	char *req_ref;
+	char *first_ref;
+	int match;
+};
+
+static int find_current_ref(const char *refname, const struct object_id *oid,
+			    int flags, void *cb_data)
+{
+	struct refmatch *info;
+
+	info = (struct refmatch *)cb_data;
+	if (!strcmp(refname, info->req_ref))
+		info->match = 1;
+	if (!info->first_ref)
+		info->first_ref = xstrdup(refname);
+	return info->match;
+}
+
+static void free_refmatch_inner(struct refmatch *info)
+{
+	if (info->first_ref)
+		free(info->first_ref);
+}
+
+static char *find_default_branch(struct cgit_repo *repo)
+{
+	struct refmatch info;
+	char *ref;
+
+	info.req_ref = repo->defbranch;
+	info.first_ref = NULL;
+	info.match = 0;
+	for_each_branch_ref(find_current_ref, &info);
+	if (info.match)
+		ref = info.req_ref;
+	else
+		ref = info.first_ref;
+	if (ref)
+		ref = xstrdup(ref);
+	free_refmatch_inner(&info);
+
+	return ref;
+}
+
+static char *guess_defbranch(void)
+{
+	const char *ref, *refname;
+	struct object_id oid;
+
+	ref = resolve_ref_unsafe("HEAD", 0, &oid, NULL);
+	if (!ref || !skip_prefix(ref, "refs/heads/", &refname))
+		return "master";
+	return xstrdup(refname);
+}
+
+/* The caller must free filename and ref after calling this. */
+static inline void parse_readme(const char *readme, char **filename, char **ref, struct cgit_repo *repo)
+{
+	const char *colon;
+
+	*filename = NULL;
+	*ref = NULL;
+
+	if (!readme || !readme[0])
+		return;
+
+	/* Check if the readme is tracked in the git repo. */
+	colon = strchr(readme, ':');
+	if (colon && strlen(colon) > 1) {
+		/* If it starts with a colon, we want to use
+		 * the default branch */
+		if (colon == readme && repo->defbranch)
+			*ref = xstrdup(repo->defbranch);
+		else
+			*ref = xstrndup(readme, colon - readme);
+		readme = colon + 1;
+	}
+
+	/* Prepend repo path to relative readme path unless tracked. */
+	if (!(*ref) && readme[0] != '/')
+		*filename = fmtalloc("%s/%s", repo->path, readme);
+	else
+		*filename = xstrdup(readme);
+}
+static void choose_readme(struct cgit_repo *repo)
+{
+	int found;
+	char *filename, *ref;
+	struct string_list_item *entry;
+
+	if (!repo->readme.nr)
+		return;
+
+	found = 0;
+	for_each_string_list_item(entry, &repo->readme) {
+		parse_readme(entry->string, &filename, &ref, repo);
+		if (!filename) {
+			free(filename);
+			free(ref);
+			continue;
+		}
+		if (ref) {
+			if (cgit_ref_path_exists(filename, ref, 1)) {
+				found = 1;
+				break;
+			}
+		}
+		else if (!access(filename, R_OK)) {
+			found = 1;
+			break;
+		}
+		free(filename);
+		free(ref);
+	}
+	repo->readme.strdup_strings = 1;
+	string_list_clear(&repo->readme, 0);
+	repo->readme.strdup_strings = 0;
+	if (found)
+		string_list_append(&repo->readme, filename)->util = ref;
+}
+
+static void print_no_repo_clone_urls(const char *url)
+{
+        html("<tr><td><a rel='vcs-git' href='");
+        html_url_path(url);
+        html("' title='");
+        html_attr(ctx.repo->name);
+        html(" Git repository'>");
+        html_txt(url);
+        html("</a></td></tr>\n");
+}
+
+static void prepare_repo_env(int *nongit)
+{
+	/* The path to the git repository. */
+	setenv("GIT_DIR", ctx.repo->path, 1);
+
+	/* Setup the git directory and initialize the notes system. Both of these
+	 * load local configuration from the git repository, so we do them both while
+	 * the HOME variables are unset. */
+	setup_git_directory_gently(nongit);
+	init_display_notes(NULL);
+}
+
+static int prepare_repo_cmd(int nongit)
+{
+	struct object_id oid;
+	int rc;
+
+	if (nongit) {
+		const char *name = ctx.repo->name;
+		rc = errno;
+		ctx.page.title = fmtalloc("%s - %s", ctx.cfg.root_title,
+						"config error");
+		ctx.repo = NULL;
+		cgit_print_http_headers();
+		cgit_print_docstart();
+		cgit_print_pageheader();
+		cgit_print_error("Failed to open %s: %s", name,
+				 rc ? strerror(rc) : "Not a valid git repository");
+		cgit_print_docend();
+		return 1;
+	}
+	ctx.page.title = fmtalloc("%s - %s", ctx.repo->name, ctx.repo->desc);
+
+	if (!ctx.repo->defbranch)
+		ctx.repo->defbranch = guess_defbranch();
+
+	if (!ctx.qry.head) {
+		ctx.qry.nohead = 1;
+		ctx.qry.head = find_default_branch(ctx.repo);
+	}
+
+	if (!ctx.qry.head) {
+		cgit_print_http_headers();
+		cgit_print_docstart();
+		cgit_print_pageheader();
+		cgit_print_error("Repository seems to be empty");
+		if (!strcmp(ctx.qry.page, "summary")) {
+			html("<table class='list'><tr class='nohover'><td>&nbsp;</td></tr><tr class='nohover'><th class='left'>Clone</th></tr>\n");
+			cgit_prepare_repo_env(ctx.repo);
+			cgit_add_clone_urls(print_no_repo_clone_urls);
+			html("</table>\n");
+		}
+		cgit_print_docend();
+		return 1;
+	}
+
+	if (get_oid(ctx.qry.head, &oid)) {
+		char *old_head = ctx.qry.head;
+		ctx.qry.head = xstrdup(ctx.repo->defbranch);
+		cgit_print_error_page(404, "Not found",
+				"Invalid branch: %s", old_head);
+		free(old_head);
+		return 1;
+	}
+	string_list_sort(&ctx.repo->submodules);
+	cgit_prepare_repo_env(ctx.repo);
+	choose_readme(ctx.repo);
+	return 0;
+}
+
+static inline void open_auth_filter(const char *function)
+{
+	cgit_open_filter(ctx.cfg.auth_filter, function,
+		ctx.env.http_cookie ? ctx.env.http_cookie : "",
+		ctx.env.request_method ? ctx.env.request_method : "",
+		ctx.env.query_string ? ctx.env.query_string : "",
+		ctx.env.http_referer ? ctx.env.http_referer : "",
+		ctx.env.path_info ? ctx.env.path_info : "",
+		ctx.env.http_host ? ctx.env.http_host : "",
+		ctx.env.https ? ctx.env.https : "",
+		ctx.qry.repo ? ctx.qry.repo : "",
+		ctx.qry.page ? ctx.qry.page : "",
+		cgit_currentfullurl(),
+		cgit_loginurl());
+}
+
+/* We intentionally keep this rather small, instead of looping and
+ * feeding it to the filter a couple bytes at a time. This way, the
+ * filter itself does not need to handle any denial of service or
+ * buffer bloat issues. If this winds up being too small, people
+ * will complain on the mailing list, and we'll increase it as needed. */
+#define MAX_AUTHENTICATION_POST_BYTES 4096
+/* The filter is expected to spit out "Status: " and all headers. */
+static inline void authenticate_post(void)
+{
+	char buffer[MAX_AUTHENTICATION_POST_BYTES];
+	ssize_t len;
+
+	open_auth_filter("authenticate-post");
+	len = ctx.env.content_length;
+	if (len > MAX_AUTHENTICATION_POST_BYTES)
+		len = MAX_AUTHENTICATION_POST_BYTES;
+	if ((len = read(STDIN_FILENO, buffer, len)) < 0)
+		die_errno("Could not read POST from stdin");
+	if (write(STDOUT_FILENO, buffer, len) < 0)
+		die_errno("Could not write POST to stdout");
+	cgit_close_filter(ctx.cfg.auth_filter);
+	exit(0);
+}
+
+static inline void authenticate_cookie(void)
+{
+	/* If we don't have an auth_filter, consider all cookies valid, and thus return early. */
+	if (!ctx.cfg.auth_filter) {
+		ctx.env.authenticated = 1;
+		return;
+	}
+
+	/* If we're having something POST'd to /login, we're authenticating POST,
+	 * instead of the cookie, so call authenticate_post and bail out early.
+	 * This pattern here should match /?p=login with POST. */
+	if (ctx.env.request_method && ctx.qry.page && !ctx.repo && \
+	    !strcmp(ctx.env.request_method, "POST") && !strcmp(ctx.qry.page, "login")) {
+		authenticate_post();
+		return;
+	}
+
+	/* If we've made it this far, we're authenticating the cookie for real, so do that. */
+	open_auth_filter("authenticate-cookie");
+	ctx.env.authenticated = cgit_close_filter(ctx.cfg.auth_filter);
+}
+
+static void process_request(void)
+{
+	struct cgit_cmd *cmd;
+	int nongit = 0;
+
+	/* If we're not yet authenticated, no matter what page we're on,
+	 * display the authentication body from the auth_filter. This should
+	 * never be cached. */
+	if (!ctx.env.authenticated) {
+		ctx.page.title = "Authentication Required";
+		cgit_print_http_headers();
+		cgit_print_docstart();
+		cgit_print_pageheader();
+		open_auth_filter("body");
+		cgit_close_filter(ctx.cfg.auth_filter);
+		cgit_print_docend();
+		return;
+	}
+
+	if (ctx.repo)
+		prepare_repo_env(&nongit);
+
+	cmd = cgit_get_cmd();
+	if (!cmd) {
+		ctx.page.title = "cgit error";
+		cgit_print_error_page(404, "Not found", "Invalid request");
+		return;
+	}
+
+	if (!ctx.cfg.enable_http_clone && cmd->is_clone) {
+		ctx.page.title = "cgit error";
+		cgit_print_error_page(404, "Not found", "Invalid request");
+		return;
+	}
+
+	if (cmd->want_repo && !ctx.repo) {
+		cgit_print_error_page(400, "Bad request",
+				"No repository selected");
+		return;
+	}
+
+	/* If cmd->want_vpath is set, assume ctx.qry.path contains a "virtual"
+	 * in-project path limit to be made available at ctx.qry.vpath.
+	 * Otherwise, no path limit is in effect (ctx.qry.vpath = NULL).
+	 */
+	ctx.qry.vpath = cmd->want_vpath ? ctx.qry.path : NULL;
+
+	if (ctx.repo && prepare_repo_cmd(nongit))
+		return;
+
+	cmd->fn();
+}
+
+static int cmp_repos(const void *a, const void *b)
+{
+	const struct cgit_repo *ra = a, *rb = b;
+	return strcmp(ra->url, rb->url);
+}
+
+static char *build_snapshot_setting(int bitmap)
+{
+	const struct cgit_snapshot_format *f;
+	struct strbuf result = STRBUF_INIT;
+
+	for (f = cgit_snapshot_formats; f->suffix; f++) {
+		if (cgit_snapshot_format_bit(f) & bitmap) {
+			if (result.len)
+				strbuf_addch(&result, ' ');
+			strbuf_addstr(&result, f->suffix);
+		}
+	}
+	return strbuf_detach(&result, NULL);
+}
+
+static char *get_first_line(char *txt)
+{
+	char *t = xstrdup(txt);
+	char *p = strchr(t, '\n');
+	if (p)
+		*p = '\0';
+	return t;
+}
+
+static void print_repo(FILE *f, struct cgit_repo *repo)
+{
+	struct string_list_item *item;
+	fprintf(f, "repo.url=%s\n", repo->url);
+	fprintf(f, "repo.name=%s\n", repo->name);
+	fprintf(f, "repo.path=%s\n", repo->path);
+	if (repo->owner)
+		fprintf(f, "repo.owner=%s\n", repo->owner);
+	if (repo->desc) {
+		char *tmp = get_first_line(repo->desc);
+		fprintf(f, "repo.desc=%s\n", tmp);
+		free(tmp);
+	}
+	for_each_string_list_item(item, &repo->readme) {
+		if (item->util)
+			fprintf(f, "repo.readme=%s:%s\n", (char *)item->util, item->string);
+		else
+			fprintf(f, "repo.readme=%s\n", item->string);
+	}
+	if (repo->defbranch)
+		fprintf(f, "repo.defbranch=%s\n", repo->defbranch);
+	if (repo->extra_head_content)
+		fprintf(f, "repo.extra-head-content=%s\n", repo->extra_head_content);
+	if (repo->module_link)
+		fprintf(f, "repo.module-link=%s\n", repo->module_link);
+	if (repo->section)
+		fprintf(f, "repo.section=%s\n", repo->section);
+	if (repo->homepage)
+		fprintf(f, "repo.homepage=%s\n", repo->homepage);
+	if (repo->clone_url)
+		fprintf(f, "repo.clone-url=%s\n", repo->clone_url);
+	fprintf(f, "repo.enable-blame=%d\n",
+	        repo->enable_blame);
+	fprintf(f, "repo.enable-commit-graph=%d\n",
+	        repo->enable_commit_graph);
+	fprintf(f, "repo.enable-log-filecount=%d\n",
+	        repo->enable_log_filecount);
+	fprintf(f, "repo.enable-log-linecount=%d\n",
+	        repo->enable_log_linecount);
+	if (repo->about_filter && repo->about_filter != ctx.cfg.about_filter)
+		cgit_fprintf_filter(repo->about_filter, f, "repo.about-filter=");
+	if (repo->commit_filter && repo->commit_filter != ctx.cfg.commit_filter)
+		cgit_fprintf_filter(repo->commit_filter, f, "repo.commit-filter=");
+	if (repo->source_filter && repo->source_filter != ctx.cfg.source_filter)
+		cgit_fprintf_filter(repo->source_filter, f, "repo.source-filter=");
+	if (repo->email_filter && repo->email_filter != ctx.cfg.email_filter)
+		cgit_fprintf_filter(repo->email_filter, f, "repo.email-filter=");
+	if (repo->owner_filter && repo->owner_filter != ctx.cfg.owner_filter)
+		cgit_fprintf_filter(repo->owner_filter, f, "repo.owner-filter=");
+	if (repo->snapshots != ctx.cfg.snapshots) {
+		char *tmp = build_snapshot_setting(repo->snapshots);
+		fprintf(f, "repo.snapshots=%s\n", tmp ? tmp : "");
+		free(tmp);
+	}
+	if (repo->snapshot_prefix)
+		fprintf(f, "repo.snapshot-prefix=%s\n", repo->snapshot_prefix);
+	if (repo->max_stats != ctx.cfg.max_stats)
+		fprintf(f, "repo.max-stats=%s\n",
+		        cgit_find_stats_periodname(repo->max_stats));
+	if (repo->logo)
+		fprintf(f, "repo.logo=%s\n", repo->logo);
+	if (repo->logo_link)
+		fprintf(f, "repo.logo-link=%s\n", repo->logo_link);
+	fprintf(f, "repo.enable-remote-branches=%d\n", repo->enable_remote_branches);
+	fprintf(f, "repo.enable-subject-links=%d\n", repo->enable_subject_links);
+	fprintf(f, "repo.enable-html-serving=%d\n", repo->enable_html_serving);
+	if (repo->branch_sort == 1)
+		fprintf(f, "repo.branch-sort=age\n");
+	if (repo->commit_sort) {
+		if (repo->commit_sort == 1)
+			fprintf(f, "repo.commit-sort=date\n");
+		else if (repo->commit_sort == 2)
+			fprintf(f, "repo.commit-sort=topo\n");
+	}
+	fprintf(f, "repo.hide=%d\n", repo->hide);
+	fprintf(f, "repo.ignore=%d\n", repo->ignore);
+	fprintf(f, "\n");
+}
+
+static void print_repolist(FILE *f, struct cgit_repolist *list, int start)
+{
+	int i;
+
+	for (i = start; i < list->count; i++)
+		print_repo(f, &list->repos[i]);
+}
+
+/* Scan 'path' for git repositories, save the resulting repolist in 'cached_rc'
+ * and return 0 on success.
+ */
+static int generate_cached_repolist(const char *path, const char *cached_rc)
+{
+	struct strbuf locked_rc = STRBUF_INIT;
+	int result = 0;
+	int idx;
+	FILE *f;
+
+	strbuf_addf(&locked_rc, "%s.lock", cached_rc);
+	f = fopen(locked_rc.buf, "wx");
+	if (!f) {
+		/* Inform about the error unless the lockfile already existed,
+		 * since that only means we've got concurrent requests.
+		 */
+		result = errno;
+		if (result != EEXIST)
+			fprintf(stderr, "[cgit] Error opening %s: %s (%d)\n",
+				locked_rc.buf, strerror(result), result);
+		goto out;
+	}
+	idx = cgit_repolist.count;
+	if (ctx.cfg.project_list)
+		scan_projects(path, ctx.cfg.project_list, repo_config);
+	else
+		scan_tree(path, repo_config);
+	print_repolist(f, &cgit_repolist, idx);
+	if (rename(locked_rc.buf, cached_rc))
+		fprintf(stderr, "[cgit] Error renaming %s to %s: %s (%d)\n",
+			locked_rc.buf, cached_rc, strerror(errno), errno);
+	fclose(f);
+out:
+	strbuf_release(&locked_rc);
+	return result;
+}
+
+static void process_cached_repolist(const char *path)
+{
+	struct stat st;
+	struct strbuf cached_rc = STRBUF_INIT;
+	time_t age;
+	unsigned long hash;
+
+	hash = hash_str(path);
+	if (ctx.cfg.project_list)
+		hash += hash_str(ctx.cfg.project_list);
+	strbuf_addf(&cached_rc, "%s/rc-%8lx", ctx.cfg.cache_root, hash);
+
+	if (stat(cached_rc.buf, &st)) {
+		/* Nothing is cached, we need to scan without forking. And
+		 * if we fail to generate a cached repolist, we need to
+		 * invoke scan_tree manually.
+		 */
+		if (generate_cached_repolist(path, cached_rc.buf)) {
+			if (ctx.cfg.project_list)
+				scan_projects(path, ctx.cfg.project_list,
+					      repo_config);
+			else
+				scan_tree(path, repo_config);
+		}
+		goto out;
+	}
+
+	parse_configfile(cached_rc.buf, config_cb);
+
+	/* If the cached configfile hasn't expired, lets exit now */
+	age = time(NULL) - st.st_mtime;
+	if (age <= (ctx.cfg.cache_scanrc_ttl * 60))
+		goto out;
+
+	/* The cached repolist has been parsed, but it was old. So lets
+	 * rescan the specified path and generate a new cached repolist
+	 * in a child-process to avoid latency for the current request.
+	 */
+	if (fork())
+		goto out;
+
+	exit(generate_cached_repolist(path, cached_rc.buf));
+out:
+	strbuf_release(&cached_rc);
+}
+
+static void cgit_parse_args(int argc, const char **argv)
+{
+	int i;
+	const char *arg;
+	int scan = 0;
+
+	for (i = 1; i < argc; i++) {
+		if (!strcmp(argv[i], "--version")) {
+			printf("CGit %s | https://git.zx2c4.com/cgit/\n\nCompiled in features:\n", CGIT_VERSION);
+#ifdef NO_LUA
+			printf("[-] ");
+#else
+			printf("[+] ");
+#endif
+			printf("Lua scripting\n");
+#ifndef HAVE_LINUX_SENDFILE
+			printf("[-] ");
+#else
+			printf("[+] ");
+#endif
+			printf("Linux sendfile() usage\n");
+
+			exit(0);
+		}
+		if (skip_prefix(argv[i], "--cache=", &arg)) {
+			ctx.cfg.cache_root = xstrdup(arg);
+		} else if (!strcmp(argv[i], "--nohttp")) {
+			ctx.env.no_http = "1";
+		} else if (skip_prefix(argv[i], "--query=", &arg)) {
+			ctx.qry.raw = xstrdup(arg);
+		} else if (skip_prefix(argv[i], "--repo=", &arg)) {
+			ctx.qry.repo = xstrdup(arg);
+		} else if (skip_prefix(argv[i], "--page=", &arg)) {
+			ctx.qry.page = xstrdup(arg);
+		} else if (skip_prefix(argv[i], "--head=", &arg)) {
+			ctx.qry.head = xstrdup(arg);
+			ctx.qry.has_symref = 1;
+		} else if (skip_prefix(argv[i], "--sha1=", &arg)) {
+			ctx.qry.sha1 = xstrdup(arg);
+			ctx.qry.has_sha1 = 1;
+		} else if (skip_prefix(argv[i], "--ofs=", &arg)) {
+			ctx.qry.ofs = atoi(arg);
+		} else if (skip_prefix(argv[i], "--scan-tree=", &arg) ||
+		           skip_prefix(argv[i], "--scan-path=", &arg)) {
+			/*
+			 * HACK: The global snapshot bit mask defines the set
+			 * of allowed snapshot formats, but the config file
+			 * hasn't been parsed yet so the mask is currently 0.
+			 * By setting all bits high before scanning we make
+			 * sure that any in-repo cgitrc snapshot setting is
+			 * respected by scan_tree().
+			 *
+			 * NOTE: We assume that there aren't more than 8
+			 * different snapshot formats supported by cgit...
+			 */
+			ctx.cfg.snapshots = 0xFF;
+			scan++;
+			scan_tree(arg, repo_config);
+		}
+	}
+	if (scan) {
+		qsort(cgit_repolist.repos, cgit_repolist.count,
+			sizeof(struct cgit_repo), cmp_repos);
+		print_repolist(stdout, &cgit_repolist, 0);
+		exit(0);
+	}
+}
+
+static int calc_ttl(void)
+{
+	if (!ctx.repo)
+		return ctx.cfg.cache_root_ttl;
+
+	if (!ctx.qry.page)
+		return ctx.cfg.cache_repo_ttl;
+
+	if (!strcmp(ctx.qry.page, "about"))
+		return ctx.cfg.cache_about_ttl;
+
+	if (!strcmp(ctx.qry.page, "snapshot"))
+		return ctx.cfg.cache_snapshot_ttl;
+
+	if (ctx.qry.has_sha1)
+		return ctx.cfg.cache_static_ttl;
+
+	if (ctx.qry.has_symref)
+		return ctx.cfg.cache_dynamic_ttl;
+
+	return ctx.cfg.cache_repo_ttl;
+}
+
+int cmd_main(int argc, const char **argv)
+{
+	const char *path;
+	int err, ttl;
+
+	cgit_init_filters();
+	atexit(cgit_cleanup_filters);
+
+	prepare_context();
+	cgit_repolist.length = 0;
+	cgit_repolist.count = 0;
+	cgit_repolist.repos = NULL;
+
+	cgit_parse_args(argc, argv);
+	parse_configfile(expand_macros(ctx.env.cgit_config), config_cb);
+	ctx.repo = NULL;
+	http_parse_querystring(ctx.qry.raw, querystring_cb);
+
+	/* If virtual-root isn't specified in cgitrc, lets pretend
+	 * that virtual-root equals SCRIPT_NAME, minus any possibly
+	 * trailing slashes.
+	 */
+	if (!ctx.cfg.virtual_root && ctx.cfg.script_name)
+		ctx.cfg.virtual_root = ensure_end(ctx.cfg.script_name, '/');
+
+	/* If no url parameter is specified on the querystring, lets
+	 * use PATH_INFO as url. This allows cgit to work with virtual
+	 * urls without the need for rewriterules in the webserver (as
+	 * long as PATH_INFO is included in the cache lookup key).
+	 */
+	path = ctx.env.path_info;
+	if (!ctx.qry.url && path) {
+		if (path[0] == '/')
+			path++;
+		ctx.qry.url = xstrdup(path);
+		if (ctx.qry.raw) {
+			char *newqry = fmtalloc("%s?%s", path, ctx.qry.raw);
+			free(ctx.qry.raw);
+			ctx.qry.raw = newqry;
+		} else
+			ctx.qry.raw = xstrdup(ctx.qry.url);
+		cgit_parse_url(ctx.qry.url);
+	}
+
+	/* Before we go any further, we set ctx.env.authenticated by checking to see
+	 * if the supplied cookie is valid. All cookies are valid if there is no
+	 * auth_filter. If there is an auth_filter, the filter decides. */
+	authenticate_cookie();
+
+	ttl = calc_ttl();
+	if (ttl < 0)
+		ctx.page.expires += 10 * 365 * 24 * 60 * 60; /* 10 years */
+	else
+		ctx.page.expires += ttl * 60;
+	if (!ctx.env.authenticated || (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD")))
+		ctx.cfg.cache_size = 0;
+	err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root,
+			    ctx.qry.raw, ttl, process_request);
+	cgit_cleanup_filters();
+	if (err)
+		cgit_print_error("Error processing page: %s (%d)",
+				 strerror(err), err);
+	return err;
+}
diff --git a/third_party/cgit/cgit.css b/third_party/cgit/cgit.css
new file mode 100644
index 0000000000..d4aadbfa10
--- /dev/null
+++ b/third_party/cgit/cgit.css
@@ -0,0 +1,895 @@
+div#cgit {
+	padding: 0em;
+	margin: 0em;
+	font-family: sans-serif;
+	font-size: 10pt;
+	color: #333;
+	background: white;
+	padding: 4px;
+}
+
+div#cgit a {
+	color: blue;
+	text-decoration: none;
+}
+
+div#cgit a:hover {
+	text-decoration: underline;
+}
+
+div#cgit table {
+	border-collapse: collapse;
+}
+
+div#cgit table#header {
+	width: 100%;
+	margin-bottom: 1em;
+}
+
+div#cgit table#header td.logo {
+	width: 96px;
+	vertical-align: top;
+}
+
+div#cgit table#header td.main {
+	font-size: 250%;
+	padding-left: 10px;
+	white-space: nowrap;
+}
+
+div#cgit table#header td.main a {
+	color: #000;
+}
+
+div#cgit table#header td.form {
+	text-align: right;
+	vertical-align: bottom;
+	padding-right: 1em;
+	padding-bottom: 2px;
+	white-space: nowrap;
+}
+
+div#cgit table#header td.form form,
+div#cgit table#header td.form input,
+div#cgit table#header td.form select {
+	font-size: 90%;
+}
+
+div#cgit table#header td.sub {
+	color: #777;
+	border-top: solid 1px #ccc;
+	padding-left: 10px;
+}
+
+div#cgit table.tabs {
+	border-bottom: solid 3px #ccc;
+	border-collapse: collapse;
+	margin-top: 2em;
+	margin-bottom: 0px;
+	width: 100%;
+}
+
+div#cgit table.tabs td {
+	padding: 0px 1em;
+	vertical-align: bottom;
+}
+
+div#cgit table.tabs td a {
+	padding: 2px 0.75em;
+	color: #777;
+	font-size: 110%;
+}
+
+div#cgit table.tabs td a.active {
+	color: #000;
+	background-color: #ccc;
+}
+
+div#cgit table.tabs a[href^="http://"]:after, div#cgit table.tabs a[href^="https://"]:after {
+	content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfgAhcJDQY+gm2TAAAAHWlUWHRDb21tZW50AAAAAABDcmVhdGVkIHdpdGggR0lNUGQuZQcAAABbSURBVAhbY2BABs4MU4CwhYHBh2Erww4wrGFQZHjI8B8IgUIscJWyDHcggltQhI4zGDCcRwhChPggHIggP1QoAVmQkSETrGoHsiAEsACtBYN0oDAMbgU6EBcAAL2eHUt4XUU4AAAAAElFTkSuQmCC);
+	opacity: 0.5;
+	margin: 0 0 0 5px;
+}
+
+div#cgit table.tabs td.form {
+	text-align: right;
+}
+
+div#cgit table.tabs td.form form {
+	padding-bottom: 2px;
+	font-size: 90%;
+	white-space: nowrap;
+}
+
+div#cgit table.tabs td.form input,
+div#cgit table.tabs td.form select {
+	font-size: 90%;
+}
+
+div#cgit div.path {
+	margin: 0px;
+	padding: 5px 2em 2px 2em;
+	color: #000;
+	background-color: #eee;
+}
+
+div#cgit div.content {
+	margin: 0px;
+	padding: 2em;
+	border-bottom: solid 3px #ccc;
+}
+
+
+div#cgit table.list {
+	width: 100%;
+	border: none;
+	border-collapse: collapse;
+}
+
+div#cgit table.list tr {
+	background: white;
+}
+
+div#cgit table.list tr.logheader {
+	background: #eee;
+}
+
+div#cgit table.list tr:nth-child(even) {
+	background: #f7f7f7;
+}
+
+div#cgit table.list tr:nth-child(odd) {
+	background: white;
+}
+
+div#cgit table.list tr:hover {
+	background: #eee;
+}
+
+div#cgit table.list tr.nohover {
+	background: white;
+}
+
+div#cgit table.list tr.nohover:hover {
+	background: white;
+}
+
+div#cgit table.list tr.nohover-highlight:hover:nth-child(even) {
+	background: #f7f7f7;
+}
+
+div#cgit table.list tr.nohover-highlight:hover:nth-child(odd) {
+	background: white;
+}
+
+div#cgit table.list th {
+	font-weight: bold;
+	/* color: #888;
+	border-top: dashed 1px #888;
+	border-bottom: dashed 1px #888;
+	*/
+	padding: 0.1em 0.5em 0.05em 0.5em;
+	vertical-align: baseline;
+}
+
+div#cgit table.list td {
+	border: none;
+	padding: 0.1em 0.5em 0.1em 0.5em;
+}
+
+div#cgit table.list td.commitgraph {
+	font-family: monospace;
+	white-space: pre;
+}
+
+div#cgit table.list td.commitgraph .column1 {
+	color: #a00;
+}
+
+div#cgit table.list td.commitgraph .column2 {
+	color: #0a0;
+}
+
+div#cgit table.list td.commitgraph .column3 {
+	color: #aa0;
+}
+
+div#cgit table.list td.commitgraph .column4 {
+	color: #00a;
+}
+
+div#cgit table.list td.commitgraph .column5 {
+	color: #a0a;
+}
+
+div#cgit table.list td.commitgraph .column6 {
+	color: #0aa;
+}
+
+div#cgit table.list td.logsubject {
+	font-family: monospace;
+	font-weight: bold;
+}
+
+div#cgit table.list td.logmsg {
+	font-family: monospace;
+	white-space: pre;
+	padding: 0 0.5em;
+}
+
+div#cgit table.list td a {
+	color: black;
+}
+
+div#cgit table.list td a.ls-dir {
+	font-weight: bold;
+	color: #00f;
+}
+
+div#cgit table.list td a:hover {
+	color: #00f;
+}
+
+div#cgit img {
+	border: none;
+}
+
+div#cgit input#switch-btn {
+	margin: 2px 0px 0px 0px;
+}
+
+div#cgit td#sidebar input.txt {
+	width: 100%;
+	margin: 2px 0px 0px 0px;
+}
+
+div#cgit table#grid {
+	margin: 0px;
+}
+
+div#cgit td#content {
+	vertical-align: top;
+	padding: 1em 2em 1em 1em;
+	border: none;
+}
+
+div#cgit div#summary {
+	vertical-align: top;
+	margin-bottom: 1em;
+}
+
+div#cgit table#downloads {
+	float: right;
+	border-collapse: collapse;
+	border: solid 1px #777;
+	margin-left: 0.5em;
+	margin-bottom: 0.5em;
+}
+
+div#cgit table#downloads th {
+	background-color: #ccc;
+}
+
+div#cgit div#blob {
+	border: solid 1px black;
+}
+
+div#cgit div.error {
+	color: red;
+	font-weight: bold;
+	margin: 1em 2em;
+}
+
+div#cgit a.ls-blob, div#cgit a.ls-dir, div#cgit .ls-mod {
+	font-family: monospace;
+}
+
+div#cgit td.ls-size {
+	text-align: right;
+	font-family: monospace;
+	width: 10em;
+}
+
+div#cgit td.ls-mode {
+	font-family: monospace;
+	width: 10em;
+}
+
+div#cgit table.blob {
+	margin-top: 0.5em;
+	border-top: solid 1px black;
+}
+
+div#cgit table.blob td.hashes,
+div#cgit table.blob td.lines {
+	margin: 0; padding: 0 0 0 0.5em;
+	vertical-align: top;
+	color: black;
+}
+
+div#cgit table.blob td.linenumbers {
+	margin: 0; padding: 0 0.5em 0 0.5em;
+	vertical-align: top;
+	text-align: right;
+	border-right: 1px solid gray;
+}
+
+div#cgit table.blob pre {
+	padding: 0; margin: 0;
+}
+
+div#cgit table.blob td.linenumbers a,
+div#cgit table.ssdiff td.lineno a {
+	color: gray;
+	text-align: right;
+	text-decoration: none;
+}
+
+div#cgit table.blob td.linenumbers a:hover,
+div#cgit table.ssdiff td.lineno a:hover {
+	color: black;
+}
+
+div#cgit table.blame td.hashes,
+div#cgit table.blame td.lines,
+div#cgit table.blame td.linenumbers {
+	padding: 0;
+}
+
+div#cgit table.blame td.hashes div.alt,
+div#cgit table.blame td.lines div.alt {
+	padding: 0 0.5em 0 0.5em;
+}
+
+div#cgit table.blame td.linenumbers div.alt {
+	padding: 0 0.5em 0 0;
+}
+
+div#cgit table.blame div.alt:nth-child(even) {
+	background: #eee;
+}
+
+div#cgit table.blame div.alt:nth-child(odd) {
+	background: white;
+}
+
+div#cgit table.blame td.lines > div {
+	position: relative;
+}
+
+div#cgit table.blame td.lines > div > pre {
+	padding: 0 0 0 0.5em;
+	position: absolute;
+	top: 0;
+}
+
+div#cgit table.bin-blob {
+	margin-top: 0.5em;
+	border: solid 1px black;
+}
+
+div#cgit table.bin-blob th {
+	font-family: monospace;
+	white-space: pre;
+	border: solid 1px #777;
+	padding: 0.5em 1em;
+}
+
+div#cgit table.bin-blob td {
+	font-family: monospace;
+	white-space: pre;
+	border-left: solid 1px #777;
+	padding: 0em 1em;
+}
+
+div#cgit table.nowrap td {
+	white-space: nowrap;
+}
+
+div#cgit table.commit-info {
+	border-collapse: collapse;
+	margin-top: 1.5em;
+}
+
+div#cgit div.cgit-panel {
+	float: right;
+	margin-top: 1.5em;
+}
+
+div#cgit div.cgit-panel table {
+	border-collapse: collapse;
+	border: solid 1px #aaa;
+	background-color: #eee;
+}
+
+div#cgit div.cgit-panel th {
+	text-align: center;
+}
+
+div#cgit div.cgit-panel td {
+	padding: 0.25em 0.5em;
+}
+
+div#cgit div.cgit-panel td.label {
+	padding-right: 0.5em;
+}
+
+div#cgit div.cgit-panel td.ctrl {
+	padding-left: 0.5em;
+}
+
+div#cgit table.commit-info th {
+	text-align: left;
+	font-weight: normal;
+	padding: 0.1em 1em 0.1em 0.1em;
+	vertical-align: top;
+}
+
+div#cgit table.commit-info td {
+	font-weight: normal;
+	padding: 0.1em 1em 0.1em 0.1em;
+}
+
+div#cgit div.commit-subject {
+	font-weight: bold;
+	font-size: 125%;
+	margin: 1.5em 0em 0.5em 0em;
+	padding: 0em;
+}
+
+div#cgit div.commit-msg {
+	white-space: pre;
+	font-family: monospace;
+}
+
+div#cgit div.notes-header {
+	font-weight: bold;
+	padding-top: 1.5em;
+}
+
+div#cgit div.notes {
+	white-space: pre;
+	font-family: monospace;
+	border: solid 1px #ee9;
+	background-color: #ffd;
+	padding: 0.3em 2em 0.3em 1em;
+	float: left;
+}
+
+div#cgit div.notes-footer {
+	clear: left;
+}
+
+div#cgit div.diffstat-header {
+	font-weight: bold;
+	padding-top: 1.5em;
+}
+
+div#cgit table.diffstat {
+	border-collapse: collapse;
+	border: solid 1px #aaa;
+	background-color: #eee;
+}
+
+div#cgit table.diffstat th {
+	font-weight: normal;
+	text-align: left;
+	text-decoration: underline;
+	padding: 0.1em 1em 0.1em 0.1em;
+	font-size: 100%;
+}
+
+div#cgit table.diffstat td {
+	padding: 0.2em 0.2em 0.1em 0.1em;
+	font-size: 100%;
+	border: none;
+}
+
+div#cgit table.diffstat td.mode {
+	white-space: nowrap;
+}
+
+div#cgit table.diffstat td span.modechange {
+	padding-left: 1em;
+	color: red;
+}
+
+div#cgit table.diffstat td.add a {
+	color: green;
+}
+
+div#cgit table.diffstat td.del a {
+	color: red;
+}
+
+div#cgit table.diffstat td.upd a {
+	color: blue;
+}
+
+div#cgit table.diffstat td.graph {
+	width: 500px;
+	vertical-align: middle;
+}
+
+div#cgit table.diffstat td.graph table {
+	border: none;
+}
+
+div#cgit table.diffstat td.graph td {
+	padding: 0px;
+	border: 0px;
+	height: 7pt;
+}
+
+div#cgit table.diffstat td.graph td.add {
+	background-color: #5c5;
+}
+
+div#cgit table.diffstat td.graph td.rem {
+	background-color: #c55;
+}
+
+div#cgit div.diffstat-summary {
+	color: #888;
+	padding-top: 0.5em;
+}
+
+div#cgit table.diff {
+	width: 100%;
+}
+
+div#cgit table.diff td {
+	font-family: monospace;
+	white-space: pre;
+}
+
+div#cgit table.diff td div.head {
+	font-weight: bold;
+	margin-top: 1em;
+	color: black;
+}
+
+div#cgit table.diff td div.hunk {
+	color: #009;
+}
+
+div#cgit table.diff td div.add {
+	color: green;
+}
+
+div#cgit table.diff td div.del {
+	color: red;
+}
+
+div#cgit .sha1 {
+	font-family: monospace;
+	font-size: 90%;
+}
+
+div#cgit .left {
+	text-align: left;
+}
+
+div#cgit .right {
+	text-align: right;
+}
+
+div#cgit table.list td.reposection {
+	font-style: italic;
+	color: #888;
+}
+
+div#cgit a.button {
+	font-size: 80%;
+	padding: 0em 0.5em;
+}
+
+div#cgit a.primary {
+	font-size: 100%;
+}
+
+div#cgit a.secondary {
+	font-size: 90%;
+}
+
+div#cgit td.toplevel-repo {
+
+}
+
+div#cgit table.list td.sublevel-repo {
+	padding-left: 1.5em;
+}
+
+div#cgit ul.pager {
+	list-style-type: none;
+	text-align: center;
+	margin: 1em 0em 0em 0em;
+	padding: 0;
+}
+
+div#cgit ul.pager li {
+	display: inline-block;
+	margin: 0.25em 0.5em;
+}
+
+div#cgit ul.pager a {
+	color: #777;
+}
+
+div#cgit ul.pager .current {
+	font-weight: bold;
+}
+
+div#cgit span.age-mins {
+	font-weight: bold;
+	color: #080;
+}
+
+div#cgit span.age-hours {
+	color: #080;
+}
+
+div#cgit span.age-days {
+	color: #040;
+}
+
+div#cgit span.age-weeks {
+	color: #444;
+}
+
+div#cgit span.age-months {
+	color: #888;
+}
+
+div#cgit span.age-years {
+	color: #bbb;
+}
+
+div#cgit span.insertions {
+	color: #080;
+}
+
+div#cgit span.deletions {
+	color: #800;
+}
+
+div#cgit div.footer {
+	margin-top: 0.5em;
+	text-align: center;
+	font-size: 80%;
+	color: #ccc;
+}
+
+div#cgit div.footer a {
+	color: #ccc;
+	text-decoration: none;
+}
+
+div#cgit div.footer a:hover {
+	text-decoration: underline;
+}
+
+div#cgit a.branch-deco {
+	color: #000;
+	margin: 0px 0.5em;
+	padding: 0px 0.25em;
+	background-color: #88ff88;
+	border: solid 1px #007700;
+}
+
+div#cgit a.tag-deco {
+	color: #000;
+	margin: 0px 0.5em;
+	padding: 0px 0.25em;
+	background-color: #ffff88;
+	border: solid 1px #777700;
+}
+
+div#cgit a.tag-annotated-deco {
+	color: #000;
+	margin: 0px 0.5em;
+	padding: 0px 0.25em;
+	background-color: #ffcc88;
+	border: solid 1px #777700;
+}
+
+div#cgit a.remote-deco {
+	color: #000;
+	margin: 0px 0.5em;
+	padding: 0px 0.25em;
+	background-color: #ccccff;
+	border: solid 1px #000077;
+}
+
+div#cgit a.deco {
+	color: #000;
+	margin: 0px 0.5em;
+	padding: 0px 0.25em;
+	background-color: #ff8888;
+	border: solid 1px #770000;
+}
+
+div#cgit div.commit-subject a.branch-deco,
+div#cgit div.commit-subject a.tag-deco,
+div#cgit div.commit-subject a.tag-annotated-deco,
+div#cgit div.commit-subject a.remote-deco,
+div#cgit div.commit-subject a.deco {
+	margin-left: 1em;
+	font-size: 75%;
+}
+
+div#cgit table.stats {
+	border: solid 1px black;
+	border-collapse: collapse;
+}
+
+div#cgit table.stats th {
+	text-align: left;
+	padding: 1px 0.5em;
+	background-color: #eee;
+	border: solid 1px black;
+}
+
+div#cgit table.stats td {
+	text-align: right;
+	padding: 1px 0.5em;
+	border: solid 1px black;
+}
+
+div#cgit table.stats td.total {
+	font-weight: bold;
+	text-align: left;
+}
+
+div#cgit table.stats td.sum {
+	color: #c00;
+	font-weight: bold;
+/*	background-color: #eee; */
+}
+
+div#cgit table.stats td.left {
+	text-align: left;
+}
+
+div#cgit table.vgraph {
+	border-collapse: separate;
+	border: solid 1px black;
+	height: 200px;
+}
+
+div#cgit table.vgraph th {
+	background-color: #eee;
+	font-weight: bold;
+	border: solid 1px white;
+	padding: 1px 0.5em;
+}
+
+div#cgit table.vgraph td {
+	vertical-align: bottom;
+	padding: 0px 10px;
+}
+
+div#cgit table.vgraph div.bar {
+	background-color: #eee;
+}
+
+div#cgit table.hgraph {
+	border: solid 1px black;
+	width: 800px;
+}
+
+div#cgit table.hgraph th {
+	background-color: #eee;
+	font-weight: bold;
+	border: solid 1px black;
+	padding: 1px 0.5em;
+}
+
+div#cgit table.hgraph td {
+	vertical-align: middle;
+	padding: 2px 2px;
+}
+
+div#cgit table.hgraph div.bar {
+	background-color: #eee;
+	height: 1em;
+}
+
+div#cgit table.ssdiff {
+	width: 100%;
+}
+
+div#cgit table.ssdiff td {
+	font-size: 75%;
+	font-family: monospace;
+	white-space: pre;
+	padding: 1px 4px 1px 4px;
+	border-left: solid 1px #aaa;
+	border-right: solid 1px #aaa;
+}
+
+div#cgit table.ssdiff td.add {
+	color: black;
+	background: #cfc;
+	min-width: 50%;
+}
+
+div#cgit table.ssdiff td.add_dark {
+	color: black;
+	background: #aca;
+	min-width: 50%;
+}
+
+div#cgit table.ssdiff span.add {
+	background: #cfc;
+	font-weight: bold;
+}
+
+div#cgit table.ssdiff td.del {
+	color: black;
+	background: #fcc;
+	min-width: 50%;
+}
+
+div#cgit table.ssdiff td.del_dark {
+	color: black;
+	background: #caa;
+	min-width: 50%;
+}
+
+div#cgit table.ssdiff span.del {
+	background: #fcc;
+	font-weight: bold;
+}
+
+div#cgit table.ssdiff td.changed {
+	color: black;
+	background: #ffc;
+	min-width: 50%;
+}
+
+div#cgit table.ssdiff td.changed_dark {
+	color: black;
+	background: #cca;
+	min-width: 50%;
+}
+
+div#cgit table.ssdiff td.lineno {
+	color: black;
+	background: #eee;
+	text-align: right;
+	width: 3em;
+	min-width: 3em;
+}
+
+div#cgit table.ssdiff td.hunk {
+	color: black;
+	background: #ccf;
+	border-top: solid 1px #aaa;
+	border-bottom: solid 1px #aaa;
+}
+
+div#cgit table.ssdiff td.head {
+	border-top: solid 1px #aaa;
+	border-bottom: solid 1px #aaa;
+}
+
+div#cgit table.ssdiff td.head div.head {
+	font-weight: bold;
+	color: black;
+}
+
+div#cgit table.ssdiff td.foot {
+	border-top: solid 1px #aaa;
+	border-left: none;
+	border-right: none;
+	border-bottom: none;
+}
+
+div#cgit table.ssdiff td.space {
+	border: none;
+}
+
+div#cgit table.ssdiff td.space div {
+	min-height: 3em;
+}
diff --git a/third_party/cgit/cgit.h b/third_party/cgit/cgit.h
new file mode 100644
index 0000000000..7ec46b4846
--- /dev/null
+++ b/third_party/cgit/cgit.h
@@ -0,0 +1,398 @@
+#ifndef CGIT_H
+#define CGIT_H
+
+
+#include <git-compat-util.h>
+#include <stdbool.h>
+
+#include <cache.h>
+#include <grep.h>
+#include <object.h>
+#include <object-store.h>
+#include <tree.h>
+#include <commit.h>
+#include <tag.h>
+#include <diff.h>
+#include <diffcore.h>
+#include <argv-array.h>
+#include <refs.h>
+#include <revision.h>
+#include <log-tree.h>
+#include <archive.h>
+#include <string-list.h>
+#include <xdiff-interface.h>
+#include <xdiff/xdiff.h>
+#include <utf8.h>
+#include <notes.h>
+#include <graph.h>
+
+/* Add isgraph(x) to Git's sane ctype support (see git-compat-util.h) */
+#undef isgraph
+#define isgraph(x) (isprint((x)) && !isspace((x)))
+
+
+/*
+ * Limits used for relative dates
+ */
+#define TM_MIN    60
+#define TM_HOUR  (TM_MIN * 60)
+#define TM_DAY   (TM_HOUR * 24)
+#define TM_WEEK  (TM_DAY * 7)
+#define TM_YEAR  (TM_DAY * 365)
+#define TM_MONTH (TM_YEAR / 12.0)
+
+
+/*
+ * Default encoding
+ */
+#define PAGE_ENCODING "UTF-8"
+
+#define BIT(x)	(1U << (x))
+
+typedef void (*configfn)(const char *name, const char *value);
+typedef void (*filepair_fn)(struct diff_filepair *pair);
+typedef void (*linediff_fn)(char *line, int len);
+
+typedef enum {
+	DIFF_UNIFIED, DIFF_SSDIFF, DIFF_STATONLY
+} diff_type;
+
+typedef enum {
+	ABOUT, COMMIT, SOURCE, EMAIL, AUTH, OWNER
+} filter_type;
+
+struct cgit_filter {
+	int (*open)(struct cgit_filter *, va_list ap);
+	int (*close)(struct cgit_filter *);
+	void (*fprintf)(struct cgit_filter *, FILE *, const char *prefix);
+	void (*cleanup)(struct cgit_filter *);
+	int argument_count;
+};
+
+struct cgit_exec_filter {
+	struct cgit_filter base;
+	char *cmd;
+	char **argv;
+	int old_stdout;
+	int pid;
+};
+
+struct cgit_repo {
+	char *url;
+	char *name;
+	char *path;
+	char *desc;
+	char *extra_head_content;
+	char *owner;
+	char *homepage;
+	char *defbranch;
+	char *module_link;
+	struct string_list readme;
+	char *section;
+	char *clone_url;
+	char *logo;
+	char *logo_link;
+	char *snapshot_prefix;
+	int snapshots;
+	int enable_blame;
+	int enable_commit_graph;
+	int enable_log_filecount;
+	int enable_log_linecount;
+	int enable_remote_branches;
+	int enable_subject_links;
+	int enable_html_serving;
+	int max_stats;
+	int branch_sort;
+	int commit_sort;
+	time_t mtime;
+	struct cgit_filter *about_filter;
+	struct cgit_filter *commit_filter;
+	struct cgit_filter *source_filter;
+	struct cgit_filter *email_filter;
+	struct cgit_filter *owner_filter;
+	struct string_list submodules;
+	int hide;
+	int ignore;
+};
+
+typedef void (*repo_config_fn)(struct cgit_repo *repo, const char *name,
+	      const char *value);
+
+struct cgit_repolist {
+	int length;
+	int count;
+	struct cgit_repo *repos;
+};
+
+struct commitinfo {
+	struct commit *commit;
+	char *author;
+	char *author_email;
+	unsigned long author_date;
+	int author_tz;
+	char *committer;
+	char *committer_email;
+	unsigned long committer_date;
+	int committer_tz;
+	char *subject;
+	char *msg;
+	char *msg_encoding;
+};
+
+struct taginfo {
+	char *tagger;
+	char *tagger_email;
+	unsigned long tagger_date;
+	int tagger_tz;
+	char *msg;
+};
+
+struct refinfo {
+	const char *refname;
+	struct object *object;
+	union {
+		struct taginfo *tag;
+		struct commitinfo *commit;
+	};
+};
+
+struct reflist {
+	struct refinfo **refs;
+	int alloc;
+	int count;
+};
+
+struct cgit_query {
+	int has_symref;
+	int has_sha1;
+	int has_difftype;
+	char *raw;
+	char *repo;
+	char *page;
+	char *search;
+	char *grep;
+	char *head;
+	char *sha1;
+	char *sha2;
+	char *path;
+	char *name;
+	char *url;
+	char *period;
+	int   ofs;
+	int nohead;
+	char *sort;
+	int showmsg;
+	diff_type difftype;
+	int show_all;
+	int context;
+	int ignorews;
+	int follow;
+	char *vpath;
+};
+
+struct cgit_config {
+	char *agefile;
+	char *cache_root;
+	char *clone_prefix;
+	char *clone_url;
+	char *css;
+	char *favicon;
+	char *footer;
+	char *head_include;
+	char *header;
+	char *logo;
+	char *logo_link;
+	char *mimetype_file;
+	char *module_link;
+	char *project_list;
+	struct string_list readme;
+	char *robots;
+	char *root_title;
+	char *root_desc;
+	char *root_readme;
+	char *script_name;
+	char *section;
+	char *repository_sort;
+	char *virtual_root;	/* Always ends with '/'. */
+	char *strict_export;
+	int cache_size;
+	int cache_dynamic_ttl;
+	int cache_max_create_time;
+	int cache_repo_ttl;
+	int cache_root_ttl;
+	int cache_scanrc_ttl;
+	int cache_static_ttl;
+	int cache_about_ttl;
+	int cache_snapshot_ttl;
+	int case_sensitive_sort;
+	int embedded;
+	int enable_filter_overrides;
+	int enable_follow_links;
+	int enable_http_clone;
+	int enable_index_links;
+	int enable_index_owner;
+	int enable_blame;
+	int enable_commit_graph;
+	int enable_log_filecount;
+	int enable_log_linecount;
+	int enable_remote_branches;
+	int enable_subject_links;
+	int enable_html_serving;
+	int enable_tree_linenumbers;
+	int enable_git_config;
+	int local_time;
+	int max_atom_items;
+	int max_repo_count;
+	int max_commit_count;
+	int max_lock_attempts;
+	int max_msg_len;
+	int max_repodesc_len;
+	int max_blob_size;
+	int max_stats;
+	int noplainemail;
+	int noheader;
+	int renamelimit;
+	int remove_suffix;
+	int scan_hidden_path;
+	int section_from_path;
+	int snapshots;
+	int section_sort;
+	int summary_branches;
+	int summary_log;
+	int summary_tags;
+	diff_type difftype;
+	int branch_sort;
+	int commit_sort;
+	struct string_list mimetypes;
+	struct cgit_filter *about_filter;
+	struct cgit_filter *commit_filter;
+	struct cgit_filter *source_filter;
+	struct cgit_filter *email_filter;
+	struct cgit_filter *owner_filter;
+	struct cgit_filter *auth_filter;
+};
+
+struct cgit_page {
+	time_t modified;
+	time_t expires;
+	size_t size;
+	const char *mimetype;
+	const char *charset;
+	const char *filename;
+	const char *etag;
+	const char *title;
+	int status;
+	const char *statusmsg;
+};
+
+struct cgit_environment {
+	const char *cgit_config;
+	const char *http_host;
+	const char *https;
+	const char *no_http;
+	const char *path_info;
+	const char *query_string;
+	const char *request_method;
+	const char *script_name;
+	const char *server_name;
+	const char *server_port;
+	const char *http_cookie;
+	const char *http_referer;
+	unsigned int content_length;
+	int authenticated;
+};
+
+struct cgit_context {
+	struct cgit_environment env;
+	struct cgit_query qry;
+	struct cgit_config cfg;
+	struct cgit_repo *repo;
+	struct cgit_page page;
+};
+
+typedef int (*write_archive_fn_t)(const char *, const char *);
+
+struct cgit_snapshot_format {
+	const char *suffix;
+	const char *mimetype;
+	write_archive_fn_t write_func;
+};
+
+extern const char *cgit_version;
+
+extern struct cgit_repolist cgit_repolist;
+extern struct cgit_context ctx;
+extern const struct cgit_snapshot_format cgit_snapshot_formats[];
+
+extern char *cgit_default_repo_desc;
+extern struct cgit_repo *cgit_add_repo(const char *url);
+extern struct cgit_repo *cgit_get_repoinfo(const char *url);
+extern void cgit_repo_config_cb(const char *name, const char *value);
+
+extern int chk_zero(int result, char *msg);
+extern int chk_positive(int result, char *msg);
+extern int chk_non_negative(int result, char *msg);
+
+extern char *trim_end(const char *str, char c);
+extern char *ensure_end(const char *str, char c);
+
+extern void strbuf_ensure_end(struct strbuf *sb, char c);
+
+extern void cgit_add_ref(struct reflist *list, struct refinfo *ref);
+extern void cgit_free_reflist_inner(struct reflist *list);
+extern int cgit_refs_cb(const char *refname, const struct object_id *oid,
+			int flags, void *cb_data);
+
+extern void cgit_free_commitinfo(struct commitinfo *info);
+extern void cgit_free_taginfo(struct taginfo *info);
+
+void cgit_diff_tree_cb(struct diff_queue_struct *q,
+		       struct diff_options *options, void *data);
+
+extern int cgit_diff_files(const struct object_id *old_oid,
+			   const struct object_id *new_oid,
+			   unsigned long *old_size, unsigned long *new_size,
+			   int *binary, int context, int ignorews,
+			   linediff_fn fn);
+
+extern void cgit_diff_tree(const struct object_id *old_oid,
+			   const struct object_id *new_oid,
+			   filepair_fn fn, const char *prefix, int ignorews);
+
+extern void cgit_diff_commit(struct commit *commit, filepair_fn fn,
+			     const char *prefix);
+
+__attribute__((format (printf,1,2)))
+extern char *fmt(const char *format,...);
+
+__attribute__((format (printf,1,2)))
+extern char *fmtalloc(const char *format,...);
+
+extern struct commitinfo *cgit_parse_commit(struct commit *commit);
+extern struct taginfo *cgit_parse_tag(struct tag *tag);
+extern void cgit_parse_url(const char *url);
+
+extern const char *cgit_repobasename(const char *reponame);
+
+extern int cgit_parse_snapshots_mask(const char *str);
+extern const struct object_id *cgit_snapshot_get_sig(const char *ref,
+						     const struct cgit_snapshot_format *f);
+extern const unsigned cgit_snapshot_format_bit(const struct cgit_snapshot_format *f);
+
+extern int cgit_open_filter(struct cgit_filter *filter, ...);
+extern int cgit_close_filter(struct cgit_filter *filter);
+extern void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix);
+extern void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **argv);
+extern struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype);
+extern void cgit_cleanup_filters(void);
+extern void cgit_init_filters(void);
+
+extern void cgit_prepare_repo_env(struct cgit_repo * repo);
+
+extern int readfile(const char *path, char **buf, size_t *size);
+
+extern char *expand_macros(const char *txt);
+
+extern char *get_mimetype_for_filename(const char *filename);
+
+#endif /* CGIT_H */
diff --git a/third_party/cgit/cgit.mk b/third_party/cgit/cgit.mk
new file mode 100644
index 0000000000..3fcc1ca314
--- /dev/null
+++ b/third_party/cgit/cgit.mk
@@ -0,0 +1,141 @@
+# This Makefile is run in the "git" directory in order to re-use Git's
+# build variables and operating system detection.  Hence all files in
+# CGit's directory must be prefixed with "../".
+include Makefile
+
+CGIT_PREFIX = ../
+
+-include $(CGIT_PREFIX)cgit.conf
+
+# The CGIT_* variables are inherited when this file is called from the
+# main Makefile - they are defined there.
+
+$(CGIT_PREFIX)VERSION: force-version
+	@cd $(CGIT_PREFIX) && '$(SHELL_PATH_SQ)' ./gen-version.sh "$(CGIT_VERSION)"
+-include $(CGIT_PREFIX)VERSION
+.PHONY: force-version
+
+# CGIT_CFLAGS is a separate variable so that we can track it separately
+# and avoid rebuilding all of Git when these variables change.
+CGIT_CFLAGS += -DCGIT_CONFIG='"$(CGIT_CONFIG)"'
+CGIT_CFLAGS += -DCGIT_SCRIPT_NAME='"$(CGIT_SCRIPT_NAME)"'
+CGIT_CFLAGS += -DCGIT_CACHE_ROOT='"$(CACHE_ROOT)"'
+
+PKG_CONFIG ?= pkg-config
+
+ifdef NO_C99_FORMAT
+	CFLAGS += -DNO_C99_FORMAT
+endif
+
+ifdef NO_LUA
+	LUA_MESSAGE := linking without specified Lua support
+	CGIT_CFLAGS += -DNO_LUA
+else
+ifeq ($(LUA_PKGCONFIG),)
+	LUA_PKGCONFIG := $(shell for pc in luajit lua lua5.2 lua5.1; do \
+			$(PKG_CONFIG) --exists $$pc 2>/dev/null && echo $$pc && break; \
+			done)
+	LUA_MODE := autodetected
+else
+	LUA_MODE := specified
+endif
+ifneq ($(LUA_PKGCONFIG),)
+	LUA_MESSAGE := linking with $(LUA_MODE) $(LUA_PKGCONFIG)
+	LUA_LIBS := $(shell $(PKG_CONFIG) --libs $(LUA_PKGCONFIG) 2>/dev/null)
+	LUA_CFLAGS := $(shell $(PKG_CONFIG) --cflags $(LUA_PKGCONFIG) 2>/dev/null)
+	CGIT_LIBS += $(LUA_LIBS)
+	CGIT_CFLAGS += $(LUA_CFLAGS)
+else
+	LUA_MESSAGE := linking without autodetected Lua support
+	NO_LUA := YesPlease
+	CGIT_CFLAGS += -DNO_LUA
+endif
+
+endif
+
+# Add -ldl to linker flags on systems that commonly use GNU libc.
+ifneq (,$(filter $(uname_S),Linux GNU GNU/kFreeBSD))
+	CGIT_LIBS += -ldl
+endif
+
+# glibc 2.1+ offers sendfile which the most common C library on Linux
+ifeq ($(uname_S),Linux)
+	HAVE_LINUX_SENDFILE = YesPlease
+endif
+
+ifdef HAVE_LINUX_SENDFILE
+	CGIT_CFLAGS += -DHAVE_LINUX_SENDFILE
+endif
+
+CGIT_OBJ_NAMES += cgit.o
+CGIT_OBJ_NAMES += cache.o
+CGIT_OBJ_NAMES += cmd.o
+CGIT_OBJ_NAMES += configfile.o
+CGIT_OBJ_NAMES += filter.o
+CGIT_OBJ_NAMES += html.o
+CGIT_OBJ_NAMES += parsing.o
+CGIT_OBJ_NAMES += scan-tree.o
+CGIT_OBJ_NAMES += shared.o
+CGIT_OBJ_NAMES += ui-atom.o
+CGIT_OBJ_NAMES += ui-blame.o
+CGIT_OBJ_NAMES += ui-blob.o
+CGIT_OBJ_NAMES += ui-clone.o
+CGIT_OBJ_NAMES += ui-commit.o
+CGIT_OBJ_NAMES += ui-diff.o
+CGIT_OBJ_NAMES += ui-log.o
+CGIT_OBJ_NAMES += ui-patch.o
+CGIT_OBJ_NAMES += ui-plain.o
+CGIT_OBJ_NAMES += ui-refs.o
+CGIT_OBJ_NAMES += ui-repolist.o
+CGIT_OBJ_NAMES += ui-shared.o
+CGIT_OBJ_NAMES += ui-snapshot.o
+CGIT_OBJ_NAMES += ui-ssdiff.o
+CGIT_OBJ_NAMES += ui-stats.o
+CGIT_OBJ_NAMES += ui-summary.o
+CGIT_OBJ_NAMES += ui-tag.o
+CGIT_OBJ_NAMES += ui-tree.o
+
+CGIT_OBJS := $(addprefix $(CGIT_PREFIX),$(CGIT_OBJ_NAMES))
+
+# Only cgit.c reference CGIT_VERSION so we only rebuild its objects when the
+# version changes.
+CGIT_VERSION_OBJS := $(addprefix $(CGIT_PREFIX),cgit.o cgit.sp)
+$(CGIT_VERSION_OBJS): $(CGIT_PREFIX)VERSION
+$(CGIT_VERSION_OBJS): EXTRA_CPPFLAGS = \
+	-DCGIT_VERSION='"$(CGIT_VERSION)"'
+
+# Git handles dependencies using ":=" so dependencies in CGIT_OBJ are not
+# handled by that and we must handle them ourselves.
+cgit_dep_files := $(foreach f,$(CGIT_OBJS),$(dir $f).depend/$(notdir $f).d)
+cgit_dep_files_present := $(wildcard $(cgit_dep_files))
+ifneq ($(cgit_dep_files_present),)
+include $(cgit_dep_files_present)
+endif
+
+ifeq ($(wildcard $(CGIT_PREFIX).depend),)
+missing_dep_dirs += $(CGIT_PREFIX).depend
+endif
+
+$(CGIT_PREFIX).depend:
+	@mkdir -p $@
+
+$(CGIT_PREFIX)CGIT-CFLAGS: FORCE
+	@FLAGS='$(subst ','\'',$(CGIT_CFLAGS))'; \
+	    if test x"$$FLAGS" != x"`cat ../CGIT-CFLAGS 2>/dev/null`" ; then \
+		echo 1>&2 "    * new CGit build flags"; \
+		echo "$$FLAGS" >$(CGIT_PREFIX)CGIT-CFLAGS; \
+            fi
+
+$(CGIT_OBJS): %.o: %.c GIT-CFLAGS $(CGIT_PREFIX)CGIT-CFLAGS $(missing_dep_dirs)
+	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $(CGIT_CFLAGS) $<
+
+$(CGIT_PREFIX)cgit: $(CGIT_OBJS) GIT-LDFLAGS $(GITLIBS)
+	@echo 1>&1 "    * $(LUA_MESSAGE)"
+	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS) $(CGIT_LIBS)
+
+CGIT_SP_OBJS := $(patsubst %.o,%.sp,$(CGIT_OBJS))
+
+$(CGIT_SP_OBJS): %.sp: %.c GIT-CFLAGS $(CGIT_PREFIX)CGIT-CFLAGS FORCE
+	$(QUIET_SP)cgcc -no-compile $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $(CGIT_CFLAGS) $(SPARSE_FLAGS) $<
+
+cgit-sparse: $(CGIT_SP_OBJS)
diff --git a/third_party/cgit/cgit.png b/third_party/cgit/cgit.png
new file mode 100644
index 0000000000..425528ee39
--- /dev/null
+++ b/third_party/cgit/cgit.png
Binary files differdiff --git a/third_party/cgit/cgitrc.5.txt b/third_party/cgit/cgitrc.5.txt
new file mode 100644
index 0000000000..ba77826fd0
--- /dev/null
+++ b/third_party/cgit/cgitrc.5.txt
@@ -0,0 +1,1008 @@
+:man source:   cgit
+:man manual:   cgit
+
+CGITRC(5)
+========
+
+
+NAME
+----
+cgitrc - runtime configuration for cgit
+
+
+SYNOPSIS
+--------
+Cgitrc contains all runtime settings for cgit, including the list of git
+repositories, formatted as a line-separated list of NAME=VALUE pairs. Blank
+lines, and lines starting with '#', are ignored.
+
+
+LOCATION
+--------
+The default location of cgitrc, defined at compile time, is /etc/cgitrc. At
+runtime, cgit will consult the environment variable CGIT_CONFIG and, if
+defined, use its value instead.
+
+
+GLOBAL SETTINGS
+---------------
+about-filter::
+	Specifies a command which will be invoked to format the content of
+	about pages (both top-level and for each repository). The command will
+	get the content of the about-file on its STDIN, the name of the file
+	as the first argument, and the STDOUT from the command will be
+	included verbatim on the about page. Default value: none. See
+	also: "FILTER API".
+
+agefile::
+	Specifies a path, relative to each repository path, which can be used
+	to specify the date and time of the youngest commit in the repository.
+	The first line in the file is used as input to the "parse_date"
+	function in libgit. Recommended timestamp-format is "yyyy-mm-dd
+	hh:mm:ss". You may want to generate this file from a post-receive
+	hook. Default value: "info/web/last-modified".
+
+auth-filter::
+	Specifies a command that will be invoked for authenticating repository
+	access. Receives quite a few arguments, and data on both stdin and
+	stdout for authentication processing. Details follow later in this
+	document. If no auth-filter is specified, no authentication is
+	performed. Default value: none. See also: "FILTER API".
+
+branch-sort::
+	Flag which, when set to "age", enables date ordering in the branch ref
+	list, and when set to "name" enables ordering by branch name. Default
+	value: "name".
+
+cache-about-ttl::
+	Number which specifies the time-to-live, in minutes, for the cached
+	version of the repository about page. See also: "CACHE". Default
+	value: "15".
+
+cache-dynamic-ttl::
+	Number which specifies the time-to-live, in minutes, for the cached
+	version of repository pages accessed without a fixed SHA1. See also:
+	"CACHE". Default value: "5".
+
+cache-repo-ttl::
+	Number which specifies the time-to-live, in minutes, for the cached
+	version of the repository summary page. See also: "CACHE". Default
+	value: "5".
+
+cache-root::
+	Path used to store the cgit cache entries. Default value:
+	"/var/cache/cgit". See also: "MACRO EXPANSION".
+
+cache-root-ttl::
+	Number which specifies the time-to-live, in minutes, for the cached
+	version of the repository index page. See also: "CACHE". Default
+	value: "5".
+
+cache-scanrc-ttl::
+	Number which specifies the time-to-live, in minutes, for the result
+	of scanning a path for git repositories. See also: "CACHE". Default
+	value: "15".
+
+case-sensitive-sort::
+	Sort items in the repo list case sensitively. Default value: "1".
+	See also: repository-sort, section-sort.
+
+cache-size::
+	The maximum number of entries in the cgit cache. When set to "0",
+	caching is disabled. See also: "CACHE". Default value: "0"
+
+cache-snapshot-ttl::
+	Number which specifies the time-to-live, in minutes, for the cached
+	version of snapshots. See also: "CACHE". Default value: "5".
+
+cache-static-ttl::
+	Number which specifies the time-to-live, in minutes, for the cached
+	version of repository pages accessed with a fixed SHA1. See also:
+	"CACHE". Default value: -1".
+
+clone-prefix::
+	Space-separated list of common prefixes which, when combined with a
+	repository url, generates valid clone urls for the repository. This
+	setting is only used if `repo.clone-url` is unspecified. Default value:
+	none.
+
+clone-url::
+	Space-separated list of clone-url templates. This setting is only
+	used if `repo.clone-url` is unspecified. Default value: none. See
+	also: "MACRO EXPANSION", "FILTER API".
+
+commit-filter::
+	Specifies a command which will be invoked to format commit messages.
+	The command will get the message on its STDIN, and the STDOUT from the
+	command will be included verbatim as the commit message, i.e. this can
+	be used to implement bugtracker integration. Default value: none.
+	See also: "FILTER API".
+
+commit-sort::
+	Flag which, when set to "date", enables strict date ordering in the
+	commit log, and when set to "topo" enables strict topological
+	ordering. If unset, the default ordering of "git log" is used. Default
+	value: unset.
+
+css::
+	Url which specifies the css document to include in all cgit pages.
+	Default value: "/cgit.css".
+
+email-filter::
+	Specifies a command which will be invoked to format names and email
+	address of committers, authors, and taggers, as represented in various
+	places throughout the cgit interface. This command will receive an
+	email address and an origin page string as its command line arguments,
+	and the text to format on STDIN. It is to write the formatted text back
+	out onto STDOUT. Default value: none. See also: "FILTER API".
+
+embedded::
+	Flag which, when set to "1", will make cgit generate a html fragment
+	suitable for embedding in other html pages. Default value: none. See
+	also: "noheader".
+
+enable-blame::
+	Flag which, when set to "1", will allow cgit to provide a "blame" page
+	for files, and will make it generate links to that page in appropriate
+	places. Default value: "0".
+
+enable-commit-graph::
+	Flag which, when set to "1", will make cgit print an ASCII-art commit
+	history graph to the left of the commit messages in the repository
+	log page. Default value: "0".
+
+enable-filter-overrides::
+	Flag which, when set to "1", allows all filter settings to be
+	overridden in repository-specific cgitrc files. Default value: none.
+
+enable-follow-links::
+	Flag which, when set to "1", allows users to follow a file in the log
+	view.  Default value: "0".
+
+enable-git-config::
+	Flag which, when set to "1", will allow cgit to use git config to set
+	any repo specific settings. This option is used in conjunction with
+	"scan-path", and must be defined prior, to augment repo-specific
+	settings. The keys gitweb.owner, gitweb.category, gitweb.description,
+	and gitweb.homepage will map to the cgit keys repo.owner, repo.section,
+	repo.desc, and repo.homepage respectively. All git config keys that begin
+	with "cgit." will be mapped to the corresponding "repo." key in cgit.
+	Default value: "0". See also: scan-path, section-from-path.
+
+enable-http-clone::
+	If set to "1", cgit will act as a dumb HTTP endpoint for git clones.
+	You can add "http://$HTTP_HOST$SCRIPT_NAME/$CGIT_REPO_URL" to clone-url
+	to expose this feature. If you use an alternate way of serving git
+	repositories, you may wish to disable this. Default value: "1".
+
+enable-html-serving::
+	Flag which, when set to "1", will allow the /plain handler to serve
+	mimetype headers that result in the file being treated as HTML by the
+	browser. When set to "0", such file types are returned instead as
+	text/plain or application/octet-stream. Default value: "0". See also:
+	"repo.enable-html-serving".
+
+enable-index-links::
+	Flag which, when set to "1", will make cgit generate extra links for
+	each repo in the repository index (specifically, to the "summary",
+	"commit" and "tree" pages). Default value: "0".
+
+enable-index-owner::
+	Flag which, when set to "1", will make cgit display the owner of
+	each repo in the repository index. Default value: "1".
+
+enable-log-filecount::
+	Flag which, when set to "1", will make cgit print the number of
+	modified files for each commit on the repository log page. Default
+	value: "0".
+
+enable-log-linecount::
+	Flag which, when set to "1", will make cgit print the number of added
+	and removed lines for each commit on the repository log page. Default
+	value: "0".
+
+enable-remote-branches::
+	Flag which, when set to "1", will make cgit display remote branches
+	in the summary and refs views. Default value: "0". See also:
+	"repo.enable-remote-branches".
+
+enable-subject-links::
+	Flag which, when set to "1", will make cgit use the subject of the
+	parent commit as link text when generating links to parent commits
+	in commit view. Default value: "0". See also:
+	"repo.enable-subject-links".
+
+enable-tree-linenumbers::
+	Flag which, when set to "1", will make cgit generate linenumber links
+	for plaintext blobs printed in the tree view. Default value: "1".
+
+favicon::
+	Url used as link to a shortcut icon for cgit. It is suggested to use
+	the value "/favicon.ico" since certain browsers will ignore other
+	values. Default value: "/favicon.ico".
+
+footer::
+	The content of the file specified with this option will be included
+	verbatim at the bottom of all pages (i.e. it replaces the standard
+	"generated by..." message. Default value: none.
+
+head-include::
+	The content of the file specified with this option will be included
+	verbatim in the html HEAD section on all pages. Default value: none.
+
+header::
+	The content of the file specified with this option will be included
+	verbatim at the top of all pages. Default value: none.
+
+include::
+	Name of a configfile to include before the rest of the current config-
+	file is parsed. Default value: none. See also: "MACRO EXPANSION".
+
+local-time::
+	Flag which, if set to "1", makes cgit print commit and tag times in the
+	servers timezone. Default value: "0".
+
+logo::
+	Url which specifies the source of an image which will be used as a logo
+	on all cgit pages. Default value: "/cgit.png".
+
+logo-link::
+	Url loaded when clicking on the cgit logo image. If unspecified the
+	calculated url of the repository index page will be used. Default
+	value: none.
+
+max-atom-items::
+	Specifies the number of items to display in atom feeds view. Default
+	value: "10".
+
+max-blob-size::
+	Specifies the maximum size of a blob to display HTML for in KBytes.
+	Default value: "0" (limit disabled).
+
+max-commit-count::
+	Specifies the number of entries to list per page in "log" view. Default
+	value: "50".
+
+max-message-length::
+	Specifies the maximum number of commit message characters to display in
+	"log" view. Default value: "80".
+
+max-repo-count::
+	Specifies the number of entries to list per page on the	repository
+	index page. Default value: "50".
+
+max-repodesc-length::
+	Specifies the maximum number of repo description characters to display
+	on the repository index page. Default value: "80".
+
+max-stats::
+	Set the default maximum statistics period. Valid values are "week",
+	"month", "quarter" and "year". If unspecified, statistics are
+	disabled. Default value: none. See also: "repo.max-stats".
+
+mimetype.<ext>::
+	Set the mimetype for the specified filename extension. This is used
+	by the `plain` command when returning blob content.
+
+mimetype-file::
+	Specifies the file to use for automatic mimetype lookup. If specified
+	then this field is used as a fallback when no "mimetype.<ext>" match is
+	found. If unspecified then no such lookup is performed. The typical file
+	to use on a Linux system is /etc/mime.types. The format of the file must
+	comply to:
+	- a comment line is an empty line or a line starting with a hash (#),
+	  optionally preceded by whitespace
+	- a non-comment line starts with the mimetype (like image/png), followed
+	  by one or more file extensions (like jpg), all separated by whitespace
+	Default value: none. See also: "mimetype.<ext>".
+
+module-link::
+	Text which will be used as the formatstring for a hyperlink when a
+	submodule is printed in a directory listing. The arguments for the
+	formatstring are the path and SHA1 of the submodule commit. Default
+	value: none.
+
+noplainemail::
+	If set to "1" showing full author email addresses will be disabled.
+	Default value: "0".
+
+noheader::
+	Flag which, when set to "1", will make cgit omit the standard header
+	on all pages. Default value: none. See also: "embedded".
+
+owner-filter::
+	Specifies a command which will be invoked to format the Owner
+	column of the main page.  The command will get the owner on STDIN,
+	and the STDOUT from the command will be included verbatim in the
+	table.  This can be used to link to additional context such as an
+	owners home page.  When active this filter is used instead of the
+	default owner query url.  Default value: none.
+	See also: "FILTER API".
+
+project-list::
+	A list of subdirectories inside of scan-path, relative to it, that
+	should loaded as git repositories. This must be defined prior to
+	scan-path. Default value: none. See also: scan-path, "MACRO
+	EXPANSION".
+
+readme::
+	Text which will be used as default value for "repo.readme". Multiple
+	config keys may be specified, and cgit will use the first found file
+	in this list. This is useful in conjunction with scan-path. Default
+	value: none. See also: scan-path, repo.readme.
+
+remove-suffix::
+	If set to "1" and scan-path is enabled, if any repositories are found
+	with a suffix of ".git", this suffix will be removed for the url and
+	name. This must be defined prior to scan-path. Default value: "0".
+	See also: scan-path.
+
+renamelimit::
+	Maximum number of files to consider when detecting renames. The value
+	 "-1" uses the compiletime value in git (for further info, look at
+	  `man git-diff`). Default value: "-1".
+
+repository-sort::
+	The way in which repositories in each section are sorted. Valid values
+	are "name" for sorting by the repo name or "age" for sorting by the
+	most recently updated repository. Default value: "name". See also:
+	section, case-sensitive-sort, section-sort.
+
+robots::
+	Text used as content for the "robots" meta-tag. Default value:
+	"index, nofollow".
+
+root-desc::
+	Text printed below the heading on the repository index page. Default
+	value: "a fast webinterface for the git dscm".
+
+root-readme::
+	The content of the file specified with this option will be included
+	verbatim below the "about" link on the repository index page. Default
+	value: none.
+
+root-title::
+	Text printed as heading on the repository index page. Default value:
+	"Git Repository Browser".
+
+scan-hidden-path::
+	If set to "1" and scan-path is enabled, scan-path will recurse into
+	directories whose name starts with a period ('.'). Otherwise,
+	scan-path will stay away from such directories (considered as
+	"hidden"). Note that this does not apply to the ".git" directory in
+	non-bare repos. This must be defined prior to scan-path.
+	Default value: 0. See also: scan-path.
+
+scan-path::
+	A path which will be scanned for repositories. If caching is enabled,
+	the result will be cached as a cgitrc include-file in the cache
+	directory. If project-list has been defined prior to scan-path,
+	scan-path loads only the directories listed in the file pointed to by
+	project-list. Be advised that only the global settings taken
+	before the scan-path directive will be applied to each repository.
+	Default value: none. See also: cache-scanrc-ttl, project-list,
+	"MACRO EXPANSION".
+
+section::
+	The name of the current repository section - all repositories defined
+	after this option will inherit the current section name. Default value:
+	none.
+
+section-sort::
+	Flag which, when set to "1", will sort the sections on the repository
+	listing by name. Set this flag to "0" if the order in the cgitrc file should
+	be preserved. Default value: "1". See also: section,
+	case-sensitive-sort, repository-sort.
+
+section-from-path::
+	A number which, if defined prior to scan-path, specifies how many
+	path elements from each repo path to use as a default section name.
+	If negative, cgit will discard the specified number of path elements
+	above the repo directory. Default value: "0".
+
+side-by-side-diffs::
+	If set to "1" shows side-by-side diffs instead of unidiffs per
+	default. Default value: "0".
+
+snapshots::
+	Text which specifies the default set of snapshot formats that cgit
+	generates links for. The value is a space-separated list of zero or
+	more of the values "tar", "tar.gz", "tar.bz2", "tar.xz" and "zip".
+	The special value "all" enables all snapshot formats.
+	Default value: none.
+
+source-filter::
+	Specifies a command which will be invoked to format plaintext blobs
+	in the tree view. The command will get the blob content on its STDIN
+	and the name of the blob as its only command line argument. The STDOUT
+	from the command will be included verbatim as the blob contents, i.e.
+	this can be used to implement e.g. syntax highlighting. Default value:
+	none. See also: "FILTER API".
+
+summary-branches::
+	Specifies the number of branches to display in the repository "summary"
+	view. Default value: "10".
+
+summary-log::
+	Specifies the number of log entries to display in the repository
+	"summary" view. Default value: "10".
+
+summary-tags::
+	Specifies the number of tags to display in the repository "summary"
+	view. Default value: "10".
+
+strict-export::
+	Filename which, if specified, needs to be present within the repository
+	for cgit to allow access to that repository. This can be used to emulate
+	gitweb's EXPORT_OK and STRICT_EXPORT functionality and limit cgit's
+	repositories to match those exported by git-daemon. This option must
+	be defined prior to scan-path.
+
+virtual-root::
+	Url which, if specified, will be used as root for all cgit links. It
+	will also cause cgit to generate 'virtual urls', i.e. urls like
+	'/cgit/tree/README' as opposed to '?r=cgit&p=tree&path=README'. Default
+	value: none.
+	NOTE: cgit has recently learned how to use PATH_INFO to achieve the
+	same kind of virtual urls, so this option will probably be deprecated.
+
+
+REPOSITORY SETTINGS
+-------------------
+repo.about-filter::
+	Override the default about-filter. Default value: none. See also:
+	"enable-filter-overrides". See also: "FILTER API".
+
+repo.branch-sort::
+	Flag which, when set to "age", enables date ordering in the branch ref
+	list, and when set to "name" enables ordering by branch name. Default
+	value: "name".
+
+repo.clone-url::
+	A list of space-separated urls which can be used to clone this repo.
+	Default value: none. See also: "MACRO EXPANSION".
+
+repo.commit-filter::
+	Override the default commit-filter. Default value: none. See also:
+	"enable-filter-overrides". See also: "FILTER API".
+
+repo.commit-sort::
+	Flag which, when set to "date", enables strict date ordering in the
+	commit log, and when set to "topo" enables strict topological
+	ordering. If unset, the default ordering of "git log" is used. Default
+	value: unset.
+
+repo.defbranch::
+	The name of the default branch for this repository. If no such branch
+	exists in the repository, the first branch name (when sorted) is used
+	as default instead. Default value: branch pointed to by HEAD, or
+	"master" if there is no suitable HEAD.
+
+repo.desc::
+	The value to show as repository description. Default value: none.
+
+repo.email-filter::
+	Override the default email-filter. Default value: none. See also:
+	"enable-filter-overrides". See also: "FILTER API".
+
+repo.enable-blame::
+	A flag which can be used to disable the global setting
+	`enable-blame'. Default value: none.
+
+repo.enable-commit-graph::
+	A flag which can be used to disable the global setting
+	`enable-commit-graph'. Default value: none.
+
+repo.enable-html-serving::
+	A flag which can be used to override the global setting
+	`enable-html-serving`. Default value: none.
+
+repo.enable-log-filecount::
+	A flag which can be used to disable the global setting
+	`enable-log-filecount'. Default value: none.
+
+repo.enable-log-linecount::
+	A flag which can be used to disable the global setting
+	`enable-log-linecount'. Default value: none.
+
+repo.enable-remote-branches::
+	Flag which, when set to "1", will make cgit display remote branches
+	in the summary and refs views. Default value: <enable-remote-branches>.
+
+repo.enable-subject-links::
+	A flag which can be used to override the global setting
+	`enable-subject-links'. Default value: none.
+
+repo.extra-head-content::
+	This value will be added verbatim to the head section of each page
+	displayed for this repo. Default value: none.
+
+repo.hide::
+	Flag which, when set to "1", hides the repository from the repository
+	index. The repository can still be accessed by providing a direct path.
+	Default value: "0". See also: "repo.ignore".
+
+repo.homepage::
+	The value to show as repository homepage. Default value: none.
+
+repo.ignore::
+	Flag which, when set to "1", ignores the repository. The repository
+	is not shown in the index and cannot be accessed by providing a direct
+	path. Default value: "0". See also: "repo.hide".
+
+repo.logo::
+	Url which specifies the source of an image which will be used as a logo
+	on this repo's pages. Default value: global logo.
+
+repo.logo-link::
+	Url loaded when clicking on the cgit logo image. If unspecified the
+	calculated url of the repository index page will be used. Default
+	value: global logo-link.
+
+repo.module-link::
+	Text which will be used as the formatstring for a hyperlink when a
+	submodule is printed in a directory listing. The arguments for the
+	formatstring are the path and SHA1 of the submodule commit. Default
+	value: <module-link>
+
+repo.module-link.<path>::
+	Text which will be used as the formatstring for a hyperlink when a
+	submodule with the specified subdirectory path is printed in a
+	directory listing. The only argument for the formatstring is the SHA1
+	of the submodule commit. Default value: none.
+
+repo.max-stats::
+	Override the default maximum statistics period. Valid values are equal
+	to the values specified for the global "max-stats" setting. Default
+	value: none.
+
+repo.name::
+	The value to show as repository name. Default value: <repo.url>.
+
+repo.owner::
+	A value used to identify the owner of the repository. Default value:
+	none.
+
+repo.owner-filter::
+	Override the default owner-filter. Default value: none. See also:
+	"enable-filter-overrides". See also: "FILTER API".
+
+repo.path::
+	An absolute path to the repository directory. For non-bare repositories
+	this is the .git-directory. Default value: none.
+
+repo.readme::
+	A path (relative to <repo.path>) which specifies a file to include
+	verbatim as the "About" page for this repo. You may also specify a
+	git refspec by head or by hash by prepending the refspec followed by
+	a colon. For example, "master:docs/readme.mkd". If the value begins
+	with a colon, i.e. ":docs/readme.rst", the default branch of the
+	repository will be used. Sharing any file will expose that entire
+	directory tree to the "/about/PATH" endpoints, so be sure that there
+	are no non-public files located in the same directory as the readme
+	file. Default value: <readme>.
+
+repo.section::
+	Override the current section name for this repository. Default value:
+	none.
+
+repo.snapshots::
+	A mask of snapshot formats for this repo that cgit generates links for,
+	restricted by the global "snapshots" setting. Default value:
+	<snapshots>.
+
+repo.snapshot-prefix::
+	Prefix to use for snapshot links instead of the repository basename.
+	For example, the "linux-stable" repository may wish to set this to
+	"linux" so that snapshots are in the format "linux-3.15.4" instead
+	of "linux-stable-3.15.4".  Default value: <empty> meaning to use
+	the repository basename.
+
+repo.source-filter::
+	Override the default source-filter. Default value: none. See also:
+	"enable-filter-overrides". See also: "FILTER API".
+
+repo.url::
+	The relative url used to access the repository. This must be the first
+	setting specified for each repo. Default value: none.
+
+
+REPOSITORY-SPECIFIC CGITRC FILE
+-------------------------------
+When the option "scan-path" is used to auto-discover git repositories, cgit
+will try to parse the file "cgitrc" within any found repository. Such a
+repo-specific config file may contain any of the repo-specific options
+described above, except "repo.url" and "repo.path". Additionally, the "filter"
+options are only acknowledged in repo-specific config files when
+"enable-filter-overrides" is set to "1".
+
+Note: the "repo." prefix is dropped from the option names in repo-specific
+config files, e.g. "repo.desc" becomes "desc".
+
+
+FILTER API
+----------
+By default, filters are separate processes that are executed each time they
+are needed.  Alternative technologies may be used by prefixing the filter
+specification with the relevant string; available values are:
+
+'exec:'::
+	The default "one process per filter" mode.
+
+'lua:'::
+	Executes the script using a built-in Lua interpreter. The script is
+	loaded once per execution of cgit, and may be called multiple times
+	during cgit's lifetime, making it a good choice for repeated filters
+	such as the 'email filter'. It responds to three functions:
+
+	'filter_open(argument1, argument2, argument3, ...)'::
+		This is called upon activation of the filter for a particular
+		set of data.
+	'filter_write(buffer)'::
+		This is called whenever cgit writes data to the webpage.
+	'filter_close()'::
+		This is called when the current filtering operation is
+		completed. It must return an integer value. Usually 0
+		indicates success.
+
+	Additionally, cgit exposes to the Lua the following built-in functions:
+
+	'html(str)'::
+		Writes 'str' to the webpage.
+	'html_txt(str)'::
+		HTML escapes and writes 'str' to the webpage.
+	'html_attr(str)'::
+		HTML escapes for an attribute and writes "str' to the webpage.
+	'html_url_path(str)'::
+		URL escapes for a path and writes 'str' to the webpage.
+	'html_url_arg(str)'::
+		URL escapes for an argument and writes 'str' to the webpage.
+	'html_include(file)'::
+		Includes 'file' in webpage.
+
+
+Parameters are provided to filters as follows.
+
+about filter::
+	This filter is given a single parameter: the filename of the source
+	file to filter. The filter can use the filename to determine (for
+	example) the type of syntax to follow when formatting the readme file.
+	The about text that is to be filtered is available on standard input
+	and the filtered text is expected on standard output.
+
+auth filter::
+	The authentication filter receives 12 parameters:
+	  - filter action, explained below, which specifies which action the
+	    filter is called for
+	  - http cookie
+	  - http method
+	  - http referer
+	  - http path
+	  - http https flag
+	  - cgit repo
+	  - cgit page
+	  - cgit url
+	  - cgit login url
+	When the filter action is "body", this filter must write to output the
+	HTML for displaying the login form, which POSTs to the login url. When
+	the filter action is "authenticate-cookie", this filter must validate
+	the http cookie and return a 0 if it is invalid or 1 if it is invalid,
+	in the exit code / close function. If the filter action is
+	"authenticate-post", this filter receives POST'd parameters on
+	standard input, and should write a complete CGI response, preferably
+	with a 302 redirect, and write to output one or more "Set-Cookie"
+	HTTP headers, each followed by a newline.
+
+	Please see `filters/simple-authentication.lua` for a clear example
+	script that may be modified.
+
+commit filter::
+	This filter is given no arguments. The commit message text that is to
+	be filtered is available on standard input and the filtered text is
+	expected on standard output.
+
+email filter::
+	This filter is given two parameters: the email address of the relevant
+	author and a string indicating the originating page. The filter will
+	then receive the text string to format on standard input and is
+	expected to write to standard output the formatted text to be included
+	in the page.
+
+owner filter::
+	This filter is given no arguments.  The owner text is available on
+	standard input and the filter is expected to write to standard
+	output.  The output is included in the Owner column.
+
+source filter::
+	This filter is given a single parameter: the filename of the source
+	file to filter. The filter can use the filename to determine (for
+	example) the syntax highlighting mode. The contents of the source
+	file that is to be filtered is available on standard input and the
+	filtered contents is expected on standard output.
+
+
+All filters are handed the following environment variables:
+
+- CGIT_REPO_URL (from repo.url)
+- CGIT_REPO_NAME (from repo.name)
+- CGIT_REPO_PATH (from repo.path)
+- CGIT_REPO_OWNER (from repo.owner)
+- CGIT_REPO_DEFBRANCH (from repo.defbranch)
+- CGIT_REPO_SECTION (from repo.section)
+- CGIT_REPO_CLONE_URL (from repo.clone-url)
+
+If a setting is not defined for a repository and the corresponding global
+setting is also not defined (if applicable), then the corresponding
+environment variable will be unset.
+
+
+MACRO EXPANSION
+---------------
+The following cgitrc options support a simple macro expansion feature,
+where tokens prefixed with "$" are replaced with the value of a similarly
+named environment variable:
+
+- cache-root
+- include
+- project-list
+- scan-path
+
+Macro expansion will also happen on the content of $CGIT_CONFIG, if
+defined.
+
+One usage of this feature is virtual hosting, which in its simplest form
+can be accomplished by adding the following line to /etc/cgitrc:
+
+	include=/etc/cgitrc.d/$HTTP_HOST
+
+The following options are expanded during request processing, and support
+the environment variables defined in "FILTER API":
+
+- clone-url
+- repo.clone-url
+
+
+CACHE
+-----
+
+All cache ttl values are in minutes. Negative ttl values indicate that a page
+type will never expire, and thus the first time a URL is accessed, the result
+will be cached indefinitely, even if the underlying git repository changes.
+Conversely, when a ttl value is zero, the cache is disabled for that
+particular page type, and the page type is never cached.
+
+SIGNATURES
+----------
+
+Cgit can host .asc signatures corresponding to various snapshot formats,
+through use of git notes. For example, the following command may be used to
+add a signature to a .tar.xz archive:
+
+    git notes --ref=refs/notes/signatures/tar.xz add -C "$(
+	gpg --output - --armor --detach-sign cgit-1.1.tar.xz |
+	git hash-object -w --stdin
+    )" v1.1
+
+If it is instead desirable to attach a signature of the underlying .tar, this
+will be linked, as a special case, beside a .tar.* link that does not have its
+own signature. For example, a signature of a tarball of the latest tag might
+be added with a similar command:
+
+    tag="$(git describe --abbrev=0)"
+    git notes --ref=refs/notes/signatures/tar add -C "$(
+        git archive --format tar --prefix "cgit-${tag#v}/" "$tag" |
+        gpg --output - --armor --detach-sign |
+        git hash-object -w --stdin
+    )" "$tag"
+
+Since git-archive(1) is expected to produce stable output between versions,
+this allows one to generate a long-term signature of the contents of a given
+tag.
+
+EXAMPLE CGITRC FILE
+-------------------
+
+....
+# Enable caching of up to 1000 output entries
+cache-size=1000
+
+
+# Specify some default clone urls using macro expansion
+clone-url=git://foo.org/$CGIT_REPO_URL git@foo.org:$CGIT_REPO_URL
+
+# Specify the css url
+css=/css/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 blame page and create links to it from tree page
+enable-blame=1
+
+
+# Enable ASCII art commit history graph on the log pages
+enable-commit-graph=1
+
+
+# Show number of affected files per commit on the log pages
+enable-log-filecount=1
+
+
+# Show number of added/removed lines per commit on the log pages
+enable-log-linecount=1
+
+
+# Sort branches by date
+branch-sort=age
+
+
+# Add a cgit favicon
+favicon=/favicon.ico
+
+
+# Use a custom logo
+logo=/img/mylogo.png
+
+
+# Enable statistics per week, month and quarter
+max-stats=quarter
+
+
+# Set the title and heading of the repository index page
+root-title=example.com git repositories
+
+
+# Set a subheading for the repository index page
+root-desc=tracking the foobar development
+
+
+# Include some more info about example.com on the index page
+root-readme=/var/www/htdocs/about.html
+
+
+# Allow download of tar.gz, tar.bz2 and zip-files
+snapshots=tar.gz tar.bz2 zip
+
+
+##
+## List of common mimetypes
+##
+
+mimetype.gif=image/gif
+mimetype.html=text/html
+mimetype.jpg=image/jpeg
+mimetype.jpeg=image/jpeg
+mimetype.pdf=application/pdf
+mimetype.png=image/png
+mimetype.svg=image/svg+xml
+
+
+# Highlight source code with python pygments-based highlighter
+source-filter=/var/www/cgit/filters/syntax-highlighting.py
+
+# Format markdown, restructuredtext, manpages, text files, and html files
+# through the right converters
+about-filter=/var/www/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
+##     displayed under a section heading
+## PPS: This list could be kept in a different file (e.g. '/etc/cgitrepos')
+##      and included like this:
+##        include=/etc/cgitrepos
+##
+
+
+repo.url=foo
+repo.path=/pub/git/foo.git
+repo.desc=the master foo repository
+repo.owner=fooman@example.com
+repo.readme=info/web/about.html
+
+
+repo.url=bar
+repo.path=/pub/git/bar.git
+repo.desc=the bars for your foo
+repo.owner=barman@example.com
+repo.readme=info/web/about.html
+
+
+# The next repositories will be displayed under the 'extras' heading
+section=extras
+
+
+repo.url=baz
+repo.path=/pub/git/baz.git
+repo.desc=a set of extensions for bar users
+
+repo.url=wiz
+repo.path=/pub/git/wiz.git
+repo.desc=the wizard of foo
+
+
+# Add some mirrored repositories
+section=mirrors
+
+
+repo.url=git
+repo.path=/pub/git/git.git
+repo.desc=the dscm
+
+
+repo.url=linux
+repo.path=/pub/git/linux.git
+repo.desc=the kernel
+
+# Disable adhoc downloads of this repo
+repo.snapshots=0
+
+# Disable line-counts for this repo
+repo.enable-log-linecount=0
+
+# Restrict the max statistics period for this repo
+repo.max-stats=month
+....
+
+
+BUGS
+----
+Comments currently cannot appear on the same line as a setting; the comment
+will be included as part of the value. E.g. this line:
+
+	robots=index  # allow indexing
+
+will generate the following html element:
+
+	<meta name='robots' content='index  # allow indexing'/>
+
+
+
+AUTHOR
+------
+Lars Hjemli <hjemli@gmail.com>
+Jason A. Donenfeld <Jason@zx2c4.com>
diff --git a/third_party/cgit/cmd.c b/third_party/cgit/cmd.c
new file mode 100644
index 0000000000..bf6d8f516f
--- /dev/null
+++ b/third_party/cgit/cmd.c
@@ -0,0 +1,208 @@
+/* cmd.c: the cgit command dispatcher
+ *
+ * Copyright (C) 2006-2017 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "cmd.h"
+#include "cache.h"
+#include "ui-shared.h"
+#include "ui-atom.h"
+#include "ui-blame.h"
+#include "ui-blob.h"
+#include "ui-clone.h"
+#include "ui-commit.h"
+#include "ui-diff.h"
+#include "ui-log.h"
+#include "ui-patch.h"
+#include "ui-plain.h"
+#include "ui-refs.h"
+#include "ui-repolist.h"
+#include "ui-snapshot.h"
+#include "ui-stats.h"
+#include "ui-summary.h"
+#include "ui-tag.h"
+#include "ui-tree.h"
+
+static void HEAD_fn(void)
+{
+	cgit_clone_head();
+}
+
+static void atom_fn(void)
+{
+	cgit_print_atom(ctx.qry.head, ctx.qry.path, ctx.cfg.max_atom_items);
+}
+
+static void about_fn(void)
+{
+	if (ctx.repo) {
+		size_t path_info_len = ctx.env.path_info ? strlen(ctx.env.path_info) : 0;
+		if (!ctx.qry.path &&
+		    ctx.qry.url[strlen(ctx.qry.url) - 1] != '/' &&
+		    (!path_info_len || ctx.env.path_info[path_info_len - 1] != '/')) {
+			char *currenturl = cgit_currenturl();
+			char *redirect = fmtalloc("%s/", currenturl);
+			cgit_redirect(redirect, true);
+			free(currenturl);
+			free(redirect);
+		} else if (ctx.repo->readme.nr)
+			cgit_print_repo_readme(ctx.qry.path);
+		else if (ctx.repo->homepage)
+			cgit_redirect(ctx.repo->homepage, false);
+		else {
+			char *currenturl = cgit_currenturl();
+			char *redirect = fmtalloc("%s../", currenturl);
+			cgit_redirect(redirect, false);
+			free(currenturl);
+			free(redirect);
+		}
+	} else
+		cgit_print_site_readme();
+}
+
+static void blame_fn(void)
+{
+	if (ctx.repo->enable_blame)
+		cgit_print_blame();
+	else
+		cgit_print_error_page(403, "Forbidden", "Blame is disabled");
+}
+
+static void blob_fn(void)
+{
+	cgit_print_blob(ctx.qry.sha1, ctx.qry.path, ctx.qry.head, 0);
+}
+
+static void commit_fn(void)
+{
+	cgit_print_commit(ctx.qry.sha1, ctx.qry.path);
+}
+
+static void diff_fn(void)
+{
+	cgit_print_diff(ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path, 1, 0);
+}
+
+static void rawdiff_fn(void)
+{
+	cgit_print_diff(ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path, 1, 1);
+}
+
+static void info_fn(void)
+{
+	cgit_clone_info();
+}
+
+static void log_fn(void)
+{
+	cgit_print_log(ctx.qry.sha1, ctx.qry.ofs, ctx.cfg.max_commit_count,
+		       ctx.qry.grep, ctx.qry.search, ctx.qry.path, 1,
+		       ctx.repo->enable_commit_graph,
+		       ctx.repo->commit_sort);
+}
+
+static void ls_cache_fn(void)
+{
+	ctx.page.mimetype = "text/plain";
+	ctx.page.filename = "ls-cache.txt";
+	cgit_print_http_headers();
+	cache_ls(ctx.cfg.cache_root);
+}
+
+static void objects_fn(void)
+{
+	cgit_clone_objects();
+}
+
+static void repolist_fn(void)
+{
+	cgit_print_repolist();
+}
+
+static void patch_fn(void)
+{
+	cgit_print_patch(ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path);
+}
+
+static void plain_fn(void)
+{
+	cgit_print_plain();
+}
+
+static void refs_fn(void)
+{
+	cgit_print_refs();
+}
+
+static void snapshot_fn(void)
+{
+	cgit_print_snapshot(ctx.qry.head, ctx.qry.sha1, ctx.qry.path,
+			    ctx.qry.nohead);
+}
+
+static void stats_fn(void)
+{
+	cgit_show_stats();
+}
+
+static void summary_fn(void)
+{
+	cgit_print_summary();
+}
+
+static void tag_fn(void)
+{
+	cgit_print_tag(ctx.qry.sha1);
+}
+
+static void tree_fn(void)
+{
+	cgit_print_tree(ctx.qry.sha1, ctx.qry.path);
+}
+
+#define def_cmd(name, want_repo, want_vpath, is_clone) \
+	{#name, name##_fn, want_repo, want_vpath, is_clone}
+
+struct cgit_cmd *cgit_get_cmd(void)
+{
+	static struct cgit_cmd cmds[] = {
+		def_cmd(HEAD, 1, 0, 1),
+		def_cmd(atom, 1, 0, 0),
+		def_cmd(about, 0, 0, 0),
+		def_cmd(blame, 1, 1, 0),
+		def_cmd(blob, 1, 0, 0),
+		def_cmd(commit, 1, 1, 0),
+		def_cmd(diff, 1, 1, 0),
+		def_cmd(info, 1, 0, 1),
+		def_cmd(log, 1, 1, 0),
+		def_cmd(ls_cache, 0, 0, 0),
+		def_cmd(objects, 1, 0, 1),
+		def_cmd(patch, 1, 1, 0),
+		def_cmd(plain, 1, 0, 0),
+		def_cmd(rawdiff, 1, 1, 0),
+		def_cmd(refs, 1, 0, 0),
+		def_cmd(repolist, 0, 0, 0),
+		def_cmd(snapshot, 1, 0, 0),
+		def_cmd(stats, 1, 1, 0),
+		def_cmd(summary, 1, 0, 0),
+		def_cmd(tag, 1, 0, 0),
+		def_cmd(tree, 1, 1, 0),
+	};
+	int i;
+
+	if (ctx.qry.page == NULL) {
+		if (ctx.repo)
+			ctx.qry.page = "summary";
+		else
+			ctx.qry.page = "repolist";
+	}
+
+	for (i = 0; i < sizeof(cmds)/sizeof(*cmds); i++)
+		if (!strcmp(ctx.qry.page, cmds[i].name))
+			return &cmds[i];
+	return NULL;
+}
diff --git a/third_party/cgit/cmd.h b/third_party/cgit/cmd.h
new file mode 100644
index 0000000000..6249b1d892
--- /dev/null
+++ b/third_party/cgit/cmd.h
@@ -0,0 +1,16 @@
+#ifndef CMD_H
+#define CMD_H
+
+typedef void (*cgit_cmd_fn)(void);
+
+struct cgit_cmd {
+	const char *name;
+	cgit_cmd_fn fn;
+	unsigned int want_repo:1,
+		want_vpath:1,
+		is_clone:1;
+};
+
+extern struct cgit_cmd *cgit_get_cmd(void);
+
+#endif /* CMD_H */
diff --git a/third_party/cgit/configfile.c b/third_party/cgit/configfile.c
new file mode 100644
index 0000000000..e0391091e1
--- /dev/null
+++ b/third_party/cgit/configfile.c
@@ -0,0 +1,90 @@
+/* configfile.c: parsing of config files
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include <git-compat-util.h>
+#include "configfile.h"
+
+static int next_char(FILE *f)
+{
+	int c = fgetc(f);
+	if (c == '\r') {
+		c = fgetc(f);
+		if (c != '\n') {
+			ungetc(c, f);
+			c = '\r';
+		}
+	}
+	return c;
+}
+
+static void skip_line(FILE *f)
+{
+	int c;
+
+	while ((c = next_char(f)) && c != '\n' && c != EOF)
+		;
+}
+
+static int read_config_line(FILE *f, struct strbuf *name, struct strbuf *value)
+{
+	int c = next_char(f);
+
+	strbuf_reset(name);
+	strbuf_reset(value);
+
+	/* Skip comments and preceding spaces. */
+	for(;;) {
+		if (c == EOF)
+			return 0;
+		else if (c == '#' || c == ';')
+			skip_line(f);
+		else if (!isspace(c))
+			break;
+		c = next_char(f);
+	}
+
+	/* Read variable name. */
+	while (c != '=') {
+		if (c == '\n' || c == EOF)
+			return 0;
+		strbuf_addch(name, c);
+		c = next_char(f);
+	}
+
+	/* Read variable value. */
+	c = next_char(f);
+	while (c != '\n' && c != EOF) {
+		strbuf_addch(value, c);
+		c = next_char(f);
+	}
+
+	return 1;
+}
+
+int parse_configfile(const char *filename, configfile_value_fn fn)
+{
+	static int nesting;
+	struct strbuf name = STRBUF_INIT;
+	struct strbuf value = STRBUF_INIT;
+	FILE *f;
+
+	/* cancel deeply nested include-commands */
+	if (nesting > 8)
+		return -1;
+	if (!(f = fopen(filename, "r")))
+		return -1;
+	nesting++;
+	while (read_config_line(f, &name, &value))
+		fn(name.buf, value.buf);
+	nesting--;
+	fclose(f);
+	strbuf_release(&name);
+	strbuf_release(&value);
+	return 0;
+}
+
diff --git a/third_party/cgit/configfile.h b/third_party/cgit/configfile.h
new file mode 100644
index 0000000000..af7ca19735
--- /dev/null
+++ b/third_party/cgit/configfile.h
@@ -0,0 +1,10 @@
+#ifndef CONFIGFILE_H
+#define CONFIGFILE_H
+
+#include "cgit.h"
+
+typedef void (*configfile_value_fn)(const char *name, const char *value);
+
+extern int parse_configfile(const char *filename, configfile_value_fn fn);
+
+#endif /* CONFIGFILE_H */
diff --git a/third_party/cgit/contrib/hooks/post-receive.agefile b/third_party/cgit/contrib/hooks/post-receive.agefile
new file mode 100755
index 0000000000..2f72ae9c0d
--- /dev/null
+++ b/third_party/cgit/contrib/hooks/post-receive.agefile
@@ -0,0 +1,19 @@
+#!/bin/sh
+#
+# An example hook to update the "agefile" for CGit's idle time calculation.
+#
+# This hook assumes that you are using the default agefile location of
+# "info/web/last-modified".  If you change the value in your cgitrc then you
+# must also change it here.
+#
+# To install the hook, copy (or link) it to the file "hooks/post-receive" in
+# each of your repositories.
+#
+
+agefile="$(git rev-parse --git-dir)"/info/web/last-modified
+
+mkdir -p "$(dirname "$agefile")" &&
+git for-each-ref \
+	--sort=-authordate --count=1 \
+	--format='%(authordate:iso8601)' \
+	>"$agefile"
diff --git a/third_party/cgit/favicon.ico b/third_party/cgit/favicon.ico
new file mode 100644
index 0000000000..56ff59384f
--- /dev/null
+++ b/third_party/cgit/favicon.ico
Binary files differdiff --git a/third_party/cgit/filter.c b/third_party/cgit/filter.c
new file mode 100644
index 0000000000..70f5b74998
--- /dev/null
+++ b/third_party/cgit/filter.c
@@ -0,0 +1,457 @@
+/* filter.c: filter framework functions
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "html.h"
+#ifndef NO_LUA
+#include <dlfcn.h>
+#include <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+#endif
+
+static inline void reap_filter(struct cgit_filter *filter)
+{
+	if (filter && filter->cleanup)
+		filter->cleanup(filter);
+}
+
+void cgit_cleanup_filters(void)
+{
+	int i;
+	reap_filter(ctx.cfg.about_filter);
+	reap_filter(ctx.cfg.commit_filter);
+	reap_filter(ctx.cfg.source_filter);
+	reap_filter(ctx.cfg.email_filter);
+	reap_filter(ctx.cfg.owner_filter);
+	reap_filter(ctx.cfg.auth_filter);
+	for (i = 0; i < cgit_repolist.count; ++i) {
+		reap_filter(cgit_repolist.repos[i].about_filter);
+		reap_filter(cgit_repolist.repos[i].commit_filter);
+		reap_filter(cgit_repolist.repos[i].source_filter);
+		reap_filter(cgit_repolist.repos[i].email_filter);
+		reap_filter(cgit_repolist.repos[i].owner_filter);
+	}
+}
+
+static int open_exec_filter(struct cgit_filter *base, va_list ap)
+{
+	struct cgit_exec_filter *filter = (struct cgit_exec_filter *)base;
+	int pipe_fh[2];
+	int i;
+
+	for (i = 0; i < filter->base.argument_count; i++)
+		filter->argv[i + 1] = va_arg(ap, char *);
+
+	filter->old_stdout = chk_positive(dup(STDOUT_FILENO),
+		"Unable to duplicate STDOUT");
+	chk_zero(pipe(pipe_fh), "Unable to create pipe to subprocess");
+	filter->pid = chk_non_negative(fork(), "Unable to create subprocess");
+	if (filter->pid == 0) {
+		close(pipe_fh[1]);
+		chk_non_negative(dup2(pipe_fh[0], STDIN_FILENO),
+			"Unable to use pipe as STDIN");
+		execvp(filter->cmd, filter->argv);
+		die_errno("Unable to exec subprocess %s", filter->cmd);
+	}
+	close(pipe_fh[0]);
+	chk_non_negative(dup2(pipe_fh[1], STDOUT_FILENO),
+		"Unable to use pipe as STDOUT");
+	close(pipe_fh[1]);
+	return 0;
+}
+
+static int close_exec_filter(struct cgit_filter *base)
+{
+	struct cgit_exec_filter *filter = (struct cgit_exec_filter *)base;
+	int i, exit_status = 0;
+
+	chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO),
+		"Unable to restore STDOUT");
+	close(filter->old_stdout);
+	if (filter->pid < 0)
+		goto done;
+	waitpid(filter->pid, &exit_status, 0);
+	if (WIFEXITED(exit_status))
+		goto done;
+	die("Subprocess %s exited abnormally", filter->cmd);
+
+done:
+	for (i = 0; i < filter->base.argument_count; i++)
+		filter->argv[i + 1] = NULL;
+	return WEXITSTATUS(exit_status);
+
+}
+
+static void fprintf_exec_filter(struct cgit_filter *base, FILE *f, const char *prefix)
+{
+	struct cgit_exec_filter *filter = (struct cgit_exec_filter *)base;
+	fprintf(f, "%sexec:%s\n", prefix, filter->cmd);
+}
+
+static void cleanup_exec_filter(struct cgit_filter *base)
+{
+	struct cgit_exec_filter *filter = (struct cgit_exec_filter *)base;
+	if (filter->argv) {
+		free(filter->argv);
+		filter->argv = NULL;
+	}
+	if (filter->cmd) {
+		free(filter->cmd);
+		filter->cmd = NULL;
+	}
+}
+
+static struct cgit_filter *new_exec_filter(const char *cmd, int argument_count)
+{
+	struct cgit_exec_filter *f;
+	int args_size = 0;
+
+	f = xmalloc(sizeof(*f));
+	/* We leave argv for now and assign it below. */
+	cgit_exec_filter_init(f, xstrdup(cmd), NULL);
+	f->base.argument_count = argument_count;
+	args_size = (2 + argument_count) * sizeof(char *);
+	f->argv = xmalloc(args_size);
+	memset(f->argv, 0, args_size);
+	f->argv[0] = f->cmd;
+	return &f->base;
+}
+
+void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **argv)
+{
+	memset(filter, 0, sizeof(*filter));
+	filter->base.open = open_exec_filter;
+	filter->base.close = close_exec_filter;
+	filter->base.fprintf = fprintf_exec_filter;
+	filter->base.cleanup = cleanup_exec_filter;
+	filter->cmd = cmd;
+	filter->argv = argv;
+	/* The argument count for open_filter is zero by default, unless called from new_filter, above. */
+	filter->base.argument_count = 0;
+}
+
+#ifdef NO_LUA
+void cgit_init_filters(void)
+{
+}
+#endif
+
+#ifndef NO_LUA
+static ssize_t (*libc_write)(int fd, const void *buf, size_t count);
+static ssize_t (*filter_write)(struct cgit_filter *base, const void *buf, size_t count) = NULL;
+static struct cgit_filter *current_write_filter = NULL;
+
+void cgit_init_filters(void)
+{
+	libc_write = dlsym(RTLD_NEXT, "write");
+	if (!libc_write)
+		die("Could not locate libc's write function");
+}
+
+ssize_t write(int fd, const void *buf, size_t count)
+{
+	if (fd != STDOUT_FILENO || !filter_write)
+		return libc_write(fd, buf, count);
+	return filter_write(current_write_filter, buf, count);
+}
+
+static inline void hook_write(struct cgit_filter *filter, ssize_t (*new_write)(struct cgit_filter *base, const void *buf, size_t count))
+{
+	/* We want to avoid buggy nested patterns. */
+	assert(filter_write == NULL);
+	assert(current_write_filter == NULL);
+	current_write_filter = filter;
+	filter_write = new_write;
+}
+
+static inline void unhook_write(void)
+{
+	assert(filter_write != NULL);
+	assert(current_write_filter != NULL);
+	filter_write = NULL;
+	current_write_filter = NULL;
+}
+
+struct lua_filter {
+	struct cgit_filter base;
+	char *script_file;
+	lua_State *lua_state;
+};
+
+static void error_lua_filter(struct lua_filter *filter)
+{
+	die("Lua error in %s: %s", filter->script_file, lua_tostring(filter->lua_state, -1));
+	lua_pop(filter->lua_state, 1);
+}
+
+static ssize_t write_lua_filter(struct cgit_filter *base, const void *buf, size_t count)
+{
+	struct lua_filter *filter = (struct lua_filter *)base;
+
+	lua_getglobal(filter->lua_state, "filter_write");
+	lua_pushlstring(filter->lua_state, buf, count);
+	if (lua_pcall(filter->lua_state, 1, 0, 0)) {
+		error_lua_filter(filter);
+		errno = EIO;
+		return -1;
+	}
+	return count;
+}
+
+static inline int hook_lua_filter(lua_State *lua_state, void (*fn)(const char *txt))
+{
+	const char *str;
+	ssize_t (*save_filter_write)(struct cgit_filter *base, const void *buf, size_t count);
+	struct cgit_filter *save_filter;
+
+	str = lua_tostring(lua_state, 1);
+	if (!str)
+		return 0;
+
+	save_filter_write = filter_write;
+	save_filter = current_write_filter;
+	unhook_write();
+	fn(str);
+	hook_write(save_filter, save_filter_write);
+
+	return 0;
+}
+
+static int html_lua_filter(lua_State *lua_state)
+{
+	return hook_lua_filter(lua_state, html);
+}
+
+static int html_txt_lua_filter(lua_State *lua_state)
+{
+	return hook_lua_filter(lua_state, html_txt);
+}
+
+static int html_attr_lua_filter(lua_State *lua_state)
+{
+	return hook_lua_filter(lua_state, html_attr);
+}
+
+static int html_url_path_lua_filter(lua_State *lua_state)
+{
+	return hook_lua_filter(lua_state, html_url_path);
+}
+
+static int html_url_arg_lua_filter(lua_State *lua_state)
+{
+	return hook_lua_filter(lua_state, html_url_arg);
+}
+
+static int html_include_lua_filter(lua_State *lua_state)
+{
+	return hook_lua_filter(lua_state, (void (*)(const char *))html_include);
+}
+
+static void cleanup_lua_filter(struct cgit_filter *base)
+{
+	struct lua_filter *filter = (struct lua_filter *)base;
+
+	if (!filter->lua_state)
+		return;
+
+	lua_close(filter->lua_state);
+	filter->lua_state = NULL;
+	if (filter->script_file) {
+		free(filter->script_file);
+		filter->script_file = NULL;
+	}
+}
+
+static int init_lua_filter(struct lua_filter *filter)
+{
+	if (filter->lua_state)
+		return 0;
+
+	if (!(filter->lua_state = luaL_newstate()))
+		return 1;
+
+	luaL_openlibs(filter->lua_state);
+
+	lua_pushcfunction(filter->lua_state, html_lua_filter);
+	lua_setglobal(filter->lua_state, "html");
+	lua_pushcfunction(filter->lua_state, html_txt_lua_filter);
+	lua_setglobal(filter->lua_state, "html_txt");
+	lua_pushcfunction(filter->lua_state, html_attr_lua_filter);
+	lua_setglobal(filter->lua_state, "html_attr");
+	lua_pushcfunction(filter->lua_state, html_url_path_lua_filter);
+	lua_setglobal(filter->lua_state, "html_url_path");
+	lua_pushcfunction(filter->lua_state, html_url_arg_lua_filter);
+	lua_setglobal(filter->lua_state, "html_url_arg");
+	lua_pushcfunction(filter->lua_state, html_include_lua_filter);
+	lua_setglobal(filter->lua_state, "html_include");
+
+	if (luaL_dofile(filter->lua_state, filter->script_file)) {
+		error_lua_filter(filter);
+		lua_close(filter->lua_state);
+		filter->lua_state = NULL;
+		return 1;
+	}
+	return 0;
+}
+
+static int open_lua_filter(struct cgit_filter *base, va_list ap)
+{
+	struct lua_filter *filter = (struct lua_filter *)base;
+	int i;
+
+	if (init_lua_filter(filter))
+		return 1;
+
+	hook_write(base, write_lua_filter);
+
+	lua_getglobal(filter->lua_state, "filter_open");
+	for (i = 0; i < filter->base.argument_count; ++i)
+		lua_pushstring(filter->lua_state, va_arg(ap, char *));
+	if (lua_pcall(filter->lua_state, filter->base.argument_count, 0, 0)) {
+		error_lua_filter(filter);
+		return 1;
+	}
+	return 0;
+}
+
+static int close_lua_filter(struct cgit_filter *base)
+{
+	struct lua_filter *filter = (struct lua_filter *)base;
+	int ret = 0;
+
+	lua_getglobal(filter->lua_state, "filter_close");
+	if (lua_pcall(filter->lua_state, 0, 1, 0)) {
+		error_lua_filter(filter);
+		ret = -1;
+	} else {
+		ret = lua_tonumber(filter->lua_state, -1);
+		lua_pop(filter->lua_state, 1);
+	}
+
+	unhook_write();
+	return ret;
+}
+
+static void fprintf_lua_filter(struct cgit_filter *base, FILE *f, const char *prefix)
+{
+	struct lua_filter *filter = (struct lua_filter *)base;
+	fprintf(f, "%slua:%s\n", prefix, filter->script_file);
+}
+
+
+static struct cgit_filter *new_lua_filter(const char *cmd, int argument_count)
+{
+	struct lua_filter *filter;
+
+	filter = xmalloc(sizeof(*filter));
+	memset(filter, 0, sizeof(*filter));
+	filter->base.open = open_lua_filter;
+	filter->base.close = close_lua_filter;
+	filter->base.fprintf = fprintf_lua_filter;
+	filter->base.cleanup = cleanup_lua_filter;
+	filter->base.argument_count = argument_count;
+	filter->script_file = xstrdup(cmd);
+
+	return &filter->base;
+}
+
+#endif
+
+
+int cgit_open_filter(struct cgit_filter *filter, ...)
+{
+	int result;
+	va_list ap;
+	if (!filter)
+		return 0;
+	va_start(ap, filter);
+	result = filter->open(filter, ap);
+	va_end(ap);
+	return result;
+}
+
+int cgit_close_filter(struct cgit_filter *filter)
+{
+	if (!filter)
+		return 0;
+	return filter->close(filter);
+}
+
+void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix)
+{
+	filter->fprintf(filter, f, prefix);
+}
+
+
+
+static const struct {
+	const char *prefix;
+	struct cgit_filter *(*ctor)(const char *cmd, int argument_count);
+} filter_specs[] = {
+	{ "exec", new_exec_filter },
+#ifndef NO_LUA
+	{ "lua", new_lua_filter },
+#endif
+};
+
+struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype)
+{
+	char *colon;
+	int i;
+	size_t len;
+	int argument_count;
+
+	if (!cmd || !cmd[0])
+		return NULL;
+
+	colon = strchr(cmd, ':');
+	len = colon - cmd;
+	/*
+	 * In case we're running on Windows, don't allow a single letter before
+	 * the colon.
+	 */
+	if (len == 1)
+		colon = NULL;
+
+	switch (filtertype) {
+		case AUTH:
+			argument_count = 12;
+			break;
+
+		case EMAIL:
+			argument_count = 2;
+			break;
+
+		case OWNER:
+			argument_count = 0;
+			break;
+
+		case SOURCE:
+		case ABOUT:
+			argument_count = 1;
+			break;
+
+		case COMMIT:
+		default:
+			argument_count = 0;
+			break;
+	}
+
+	/* If no prefix is given, exec filter is the default. */
+	if (!colon)
+		return new_exec_filter(cmd, argument_count);
+
+	for (i = 0; i < ARRAY_SIZE(filter_specs); i++) {
+		if (len == strlen(filter_specs[i].prefix) &&
+		    !strncmp(filter_specs[i].prefix, cmd, len))
+			return filter_specs[i].ctor(colon + 1, argument_count);
+	}
+
+	die("Invalid filter type: %.*s", (int) len, cmd);
+}
diff --git a/third_party/cgit/filters/about-formatting.sh b/third_party/cgit/filters/about-formatting.sh
new file mode 100755
index 0000000000..85daf9c26b
--- /dev/null
+++ b/third_party/cgit/filters/about-formatting.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+# This may be used with the about-filter or repo.about-filter setting in cgitrc.
+# It passes formatting of about pages to differing programs, depending on the usage.
+
+# Markdown support requires python and markdown-python.
+# RestructuredText support requires python and docutils.
+# Man page support requires groff.
+
+# The following environment variables can be used to retrieve the configuration
+# of the repository for which this script is called:
+# CGIT_REPO_URL        ( = repo.url       setting )
+# CGIT_REPO_NAME       ( = repo.name      setting )
+# CGIT_REPO_PATH       ( = repo.path      setting )
+# CGIT_REPO_OWNER      ( = repo.owner     setting )
+# CGIT_REPO_DEFBRANCH  ( = repo.defbranch setting )
+# CGIT_REPO_SECTION    ( = section        setting )
+# CGIT_REPO_CLONE_URL  ( = repo.clone-url setting )
+
+cd "$(dirname $0)/html-converters/"
+case "$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')" in
+	*.markdown|*.mdown|*.md|*.mkd) exec ./md2html; ;;
+	*.rst) exec ./rst2html; ;;
+	*.[1-9]) exec ./man2html; ;;
+	*.htm|*.html) exec cat; ;;
+	*.txt|*) exec ./txt2html; ;;
+esac
diff --git a/third_party/cgit/filters/commit-links.sh b/third_party/cgit/filters/commit-links.sh
new file mode 100755
index 0000000000..58819524ce
--- /dev/null
+++ b/third_party/cgit/filters/commit-links.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+# This script can be used to generate links in commit messages.
+#
+# To use this script, refer to this file with either the commit-filter or the
+# repo.commit-filter options in cgitrc.
+#
+# The following environment variables can be used to retrieve the configuration
+# of the repository for which this script is called:
+# CGIT_REPO_URL        ( = repo.url       setting )
+# CGIT_REPO_NAME       ( = repo.name      setting )
+# CGIT_REPO_PATH       ( = repo.path      setting )
+# CGIT_REPO_OWNER      ( = repo.owner     setting )
+# CGIT_REPO_DEFBRANCH  ( = repo.defbranch setting )
+# CGIT_REPO_SECTION    ( = section        setting )
+# CGIT_REPO_CLONE_URL  ( = repo.clone-url setting )
+#
+
+regex=''
+
+# This expression generates links to commits referenced by their SHA1.
+regex=$regex'
+s|\b([0-9a-fA-F]{7,40})\b|<a href="./?id=\1">\1</a>|g'
+
+# This expression generates links to a fictional bugtracker.
+regex=$regex'
+s|#([0-9]+)\b|<a href="http://bugs.example.com/?bug=\1">#\1</a>|g'
+
+sed -re "$regex"
diff --git a/third_party/cgit/filters/email-gravatar.lua b/third_party/cgit/filters/email-gravatar.lua
new file mode 100644
index 0000000000..c39b490d6b
--- /dev/null
+++ b/third_party/cgit/filters/email-gravatar.lua
@@ -0,0 +1,35 @@
+-- This script may be used with the email-filter or repo.email-filter settings in cgitrc.
+-- It adds gravatar icons to author names. It is designed to be used with the lua:
+-- prefix in filters. It is much faster than the corresponding python script.
+--
+-- Requirements:
+-- 	luaossl
+-- 	<http://25thandclement.com/~william/projects/luaossl.html>
+--
+
+local digest = require("openssl.digest")
+
+function md5_hex(input)
+	local b = digest.new("md5"):final(input)
+	local x = ""
+	for i = 1, #b do
+		x = x .. string.format("%.2x", string.byte(b, i))
+	end
+	return x
+end
+
+function filter_open(email, page)
+	buffer = ""
+	md5 = md5_hex(email:sub(2, -2):lower())
+end
+
+function filter_close()
+	html("<img src='//www.gravatar.com/avatar/" .. md5 .. "?s=13&amp;d=retro' width='13' height='13' alt='Gravatar' /> " .. buffer)
+	return 0
+end
+
+function filter_write(str)
+	buffer = buffer .. str
+end
+
+
diff --git a/third_party/cgit/filters/email-gravatar.py b/third_party/cgit/filters/email-gravatar.py
new file mode 100755
index 0000000000..d70440ea54
--- /dev/null
+++ b/third_party/cgit/filters/email-gravatar.py
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+
+# Please prefer the email-gravatar.lua using lua: as a prefix over this script. This
+# script is very slow, in comparison.
+#
+# This script may be used with the email-filter or repo.email-filter settings in cgitrc.
+#
+# The following environment variables can be used to retrieve the configuration
+# of the repository for which this script is called:
+# CGIT_REPO_URL        ( = repo.url       setting )
+# CGIT_REPO_NAME       ( = repo.name      setting )
+# CGIT_REPO_PATH       ( = repo.path      setting )
+# CGIT_REPO_OWNER      ( = repo.owner     setting )
+# CGIT_REPO_DEFBRANCH  ( = repo.defbranch setting )
+# CGIT_REPO_SECTION    ( = section        setting )
+# CGIT_REPO_CLONE_URL  ( = repo.clone-url setting )
+#
+# It receives an email address on argv[1] and text on stdin. It prints
+# to stdout that text prepended by a gravatar at 10pt.
+
+import sys
+import hashlib
+import codecs
+
+email = sys.argv[1].lower().strip()
+if email[0] == '<':
+        email = email[1:]
+if email[-1] == '>':
+        email = email[0:-1]
+
+page = sys.argv[2]
+
+sys.stdin = codecs.getreader("utf-8")(sys.stdin.detach())
+sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
+
+md5 = hashlib.md5(email.encode()).hexdigest()
+text = sys.stdin.read().strip()
+
+print("<img src='//www.gravatar.com/avatar/" + md5 + "?s=13&amp;d=retro' width='13' height='13' alt='Gravatar' /> " + text)
diff --git a/third_party/cgit/filters/email-libravatar.lua b/third_party/cgit/filters/email-libravatar.lua
new file mode 100644
index 0000000000..7336baf830
--- /dev/null
+++ b/third_party/cgit/filters/email-libravatar.lua
@@ -0,0 +1,36 @@
+-- This script may be used with the email-filter or repo.email-filter settings in cgitrc.
+-- It adds libravatar icons to author names. It is designed to be used with the lua:
+-- prefix in filters.
+--
+-- Requirements:
+-- 	luaossl
+-- 	<http://25thandclement.com/~william/projects/luaossl.html>
+--
+
+local digest = require("openssl.digest")
+
+function md5_hex(input)
+	local b = digest.new("md5"):final(input)
+	local x = ""
+	for i = 1, #b do
+		x = x .. string.format("%.2x", string.byte(b, i))
+	end
+	return x
+end
+
+function filter_open(email, page)
+	buffer = ""
+	md5 = md5_hex(email:sub(2, -2):lower())
+end
+
+function filter_close()
+	baseurl = os.getenv("HTTPS") and "https://seccdn.libravatar.org/" or "http://cdn.libravatar.org/"
+	html("<img src='" .. baseurl .. "avatar/" .. md5 .. "?s=13&amp;d=retro' width='13' height='13' alt='Libravatar' /> " .. buffer)
+	return 0
+end
+
+function filter_write(str)
+	buffer = buffer .. str
+end
+
+
diff --git a/third_party/cgit/filters/file-authentication.lua b/third_party/cgit/filters/file-authentication.lua
new file mode 100644
index 0000000000..024880463c
--- /dev/null
+++ b/third_party/cgit/filters/file-authentication.lua
@@ -0,0 +1,359 @@
+-- This script may be used with the auth-filter.
+--
+-- Requirements:
+-- 	luaossl
+-- 	<http://25thandclement.com/~william/projects/luaossl.html>
+-- 	luaposix
+-- 	<https://github.com/luaposix/luaposix>
+--
+local sysstat = require("posix.sys.stat")
+local unistd = require("posix.unistd")
+local rand = require("openssl.rand")
+local hmac = require("openssl.hmac")
+
+-- This file should contain a series of lines in the form of:
+--	username1:hash1
+--	username2:hash2
+--	username3:hash3
+--	...
+-- Hashes can be generated using something like `mkpasswd -m sha-512 -R 300000`.
+-- This file should not be world-readable.
+local users_filename = "/etc/cgit-auth/users"
+
+-- This file should contain a series of lines in the form of:
+-- 	groupname1:username1,username2,username3,...
+--	...
+local groups_filename = "/etc/cgit-auth/groups"
+
+-- This file should contain a series of lines in the form of:
+-- 	reponame1:groupname1,groupname2,groupname3,...
+--	...
+local repos_filename = "/etc/cgit-auth/repos"
+
+-- Set this to a path this script can write to for storing a persistent
+-- cookie secret, which should not be world-readable.
+local secret_filename = "/var/cache/cgit/auth-secret"
+
+--
+--
+-- Authentication functions follow below. Swap these out if you want different authentication semantics.
+--
+--
+
+-- Looks up a hash for a given user.
+function lookup_hash(user)
+	local line
+	for line in io.lines(users_filename) do
+		local u, h = string.match(line, "(.-):(.+)")
+		if u:lower() == user:lower() then
+			return h
+		end
+	end
+	return nil
+end
+
+-- Looks up users for a given repo.
+function lookup_users(repo)
+	local users = nil
+	local groups = nil
+	local line, group, user
+	for line in io.lines(repos_filename) do
+		local r, g = string.match(line, "(.-):(.+)")
+		if r == repo then
+			groups = { }
+			for group in string.gmatch(g, "([^,]+)") do
+				groups[group:lower()] = true
+			end
+			break
+		end
+	end
+	if groups == nil then
+		return nil
+	end
+	for line in io.lines(groups_filename) do
+		local g, u = string.match(line, "(.-):(.+)")
+		if groups[g:lower()] then
+			if users == nil then
+				users = { }
+			end
+			for user in string.gmatch(u, "([^,]+)") do
+				users[user:lower()] = true
+			end
+		end
+	end
+	return users
+end
+
+
+-- Sets HTTP cookie headers based on post and sets up redirection.
+function authenticate_post()
+	local hash = lookup_hash(post["username"])
+	local redirect = validate_value("redirect", post["redirect"])
+
+	if redirect == nil then
+		not_found()
+		return 0
+	end
+
+	redirect_to(redirect)
+
+	if hash == nil or hash ~= unistd.crypt(post["password"], hash) then
+		set_cookie("cgitauth", "")
+	else
+		-- One week expiration time
+		local username = secure_value("username", post["username"], os.time() + 604800)
+		set_cookie("cgitauth", username)
+	end
+
+	html("\n")
+	return 0
+end
+
+
+-- Returns 1 if the cookie is valid and 0 if it is not.
+function authenticate_cookie()
+	accepted_users = lookup_users(cgit["repo"])
+	if accepted_users == nil then
+		-- We return as valid if the repo is not protected.
+		return 1
+	end
+
+	local username = validate_value("username", get_cookie(http["cookie"], "cgitauth"))
+	if username == nil or not accepted_users[username:lower()] then
+		return 0
+	else
+		return 1
+	end
+end
+
+-- Prints the html for the login form.
+function body()
+	html("<h2>Authentication Required</h2>")
+	html("<form method='post' action='")
+	html_attr(cgit["login"])
+	html("'>")
+	html("<input type='hidden' name='redirect' value='")
+	html_attr(secure_value("redirect", cgit["url"], 0))
+	html("' />")
+	html("<table>")
+	html("<tr><td><label for='username'>Username:</label></td><td><input id='username' name='username' autofocus /></td></tr>")
+	html("<tr><td><label for='password'>Password:</label></td><td><input id='password' name='password' type='password' /></td></tr>")
+	html("<tr><td colspan='2'><input value='Login' type='submit' /></td></tr>")
+	html("</table></form>")
+
+	return 0
+end
+
+
+
+--
+--
+-- Wrapper around filter API, exposing the http table, the cgit table, and the post table to the above functions.
+--
+--
+
+local actions = {}
+actions["authenticate-post"] = authenticate_post
+actions["authenticate-cookie"] = authenticate_cookie
+actions["body"] = body
+
+function filter_open(...)
+	action = actions[select(1, ...)]
+
+	http = {}
+	http["cookie"] = select(2, ...)
+	http["method"] = select(3, ...)
+	http["query"] = select(4, ...)
+	http["referer"] = select(5, ...)
+	http["path"] = select(6, ...)
+	http["host"] = select(7, ...)
+	http["https"] = select(8, ...)
+
+	cgit = {}
+	cgit["repo"] = select(9, ...)
+	cgit["page"] = select(10, ...)
+	cgit["url"] = select(11, ...)
+	cgit["login"] = select(12, ...)
+
+end
+
+function filter_close()
+	return action()
+end
+
+function filter_write(str)
+	post = parse_qs(str)
+end
+
+
+--
+--
+-- Utility functions based on keplerproject/wsapi.
+--
+--
+
+function url_decode(str)
+	if not str then
+		return ""
+	end
+	str = string.gsub(str, "+", " ")
+	str = string.gsub(str, "%%(%x%x)", function(h) return string.char(tonumber(h, 16)) end)
+	str = string.gsub(str, "\r\n", "\n")
+	return str
+end
+
+function url_encode(str)
+	if not str then
+		return ""
+	end
+	str = string.gsub(str, "\n", "\r\n")
+	str = string.gsub(str, "([^%w ])", function(c) return string.format("%%%02X", string.byte(c)) end)
+	str = string.gsub(str, " ", "+")
+	return str
+end
+
+function parse_qs(qs)
+	local tab = {}
+	for key, val in string.gmatch(qs, "([^&=]+)=([^&=]*)&?") do
+		tab[url_decode(key)] = url_decode(val)
+	end
+	return tab
+end
+
+function get_cookie(cookies, name)
+	cookies = string.gsub(";" .. cookies .. ";", "%s*;%s*", ";")
+	return url_decode(string.match(cookies, ";" .. name .. "=(.-);"))
+end
+
+function tohex(b)
+	local x = ""
+	for i = 1, #b do
+		x = x .. string.format("%.2x", string.byte(b, i))
+	end
+	return x
+end
+
+--
+--
+-- Cookie construction and validation helpers.
+--
+--
+
+local secret = nil
+
+-- Loads a secret from a file, creates a secret, or returns one from memory.
+function get_secret()
+	if secret ~= nil then
+		return secret
+	end
+	local secret_file = io.open(secret_filename, "r")
+	if secret_file == nil then
+		local old_umask = sysstat.umask(63)
+		local temporary_filename = secret_filename .. ".tmp." .. tohex(rand.bytes(16))
+		local temporary_file = io.open(temporary_filename, "w")
+		if temporary_file == nil then
+			os.exit(177)
+		end
+		temporary_file:write(tohex(rand.bytes(32)))
+		temporary_file:close()
+		unistd.link(temporary_filename, secret_filename) -- Intentionally fails in the case that another process is doing the same.
+		unistd.unlink(temporary_filename)
+		sysstat.umask(old_umask)
+		secret_file = io.open(secret_filename, "r")
+	end
+	if secret_file == nil then
+		os.exit(177)
+	end
+	secret = secret_file:read()
+	secret_file:close()
+	if secret:len() ~= 64 then
+		os.exit(177)
+	end
+	return secret
+end
+
+-- Returns value of cookie if cookie is valid. Otherwise returns nil.
+function validate_value(expected_field, cookie)
+	local i = 0
+	local value = ""
+	local field = ""
+	local expiration = 0
+	local salt = ""
+	local chmac = ""
+
+	if cookie == nil or cookie:len() < 3 or cookie:sub(1, 1) == "|" then
+		return nil
+	end
+
+	for component in string.gmatch(cookie, "[^|]+") do
+		if i == 0 then
+			field = component
+		elseif i == 1 then
+			value = component
+		elseif i == 2 then
+			expiration = tonumber(component)
+			if expiration == nil then
+				expiration = -1
+			end
+		elseif i == 3 then
+			salt = component
+		elseif i == 4 then
+			chmac = component
+		else
+			break
+		end
+		i = i + 1
+	end
+
+	if chmac == nil or chmac:len() == 0 then
+		return nil
+	end
+
+	-- Lua hashes strings, so these comparisons are time invariant.
+	if chmac ~= tohex(hmac.new(get_secret(), "sha256"):final(field .. "|" .. value .. "|" .. tostring(expiration) .. "|" .. salt)) then
+		return nil
+	end
+
+	if expiration == -1 or (expiration ~= 0 and expiration <= os.time()) then
+		return nil
+	end
+
+	if url_decode(field) ~= expected_field then
+		return nil
+	end
+
+	return url_decode(value)
+end
+
+function secure_value(field, value, expiration)
+	if value == nil or value:len() <= 0 then
+		return ""
+	end
+
+	local authstr = ""
+	local salt = tohex(rand.bytes(16))
+	value = url_encode(value)
+	field = url_encode(field)
+	authstr = field .. "|" .. value .. "|" .. tostring(expiration) .. "|" .. salt
+	authstr = authstr .. "|" .. tohex(hmac.new(get_secret(), "sha256"):final(authstr))
+	return authstr
+end
+
+function set_cookie(cookie, value)
+	html("Set-Cookie: " .. cookie .. "=" .. value .. "; HttpOnly")
+	if http["https"] == "yes" or http["https"] == "on" or http["https"] == "1" then
+		html("; secure")
+	end
+	html("\n")
+end
+
+function redirect_to(url)
+	html("Status: 302 Redirect\n")
+	html("Cache-Control: no-cache, no-store\n")
+	html("Location: " .. url .. "\n")
+end
+
+function not_found()
+	html("Status: 404 Not Found\n")
+	html("Cache-Control: no-cache, no-store\n\n")
+end
diff --git a/third_party/cgit/filters/gentoo-ldap-authentication.lua b/third_party/cgit/filters/gentoo-ldap-authentication.lua
new file mode 100644
index 0000000000..673c88d102
--- /dev/null
+++ b/third_party/cgit/filters/gentoo-ldap-authentication.lua
@@ -0,0 +1,360 @@
+-- This script may be used with the auth-filter. Be sure to configure it as you wish.
+--
+-- Requirements:
+-- 	luaossl
+-- 	<http://25thandclement.com/~william/projects/luaossl.html>
+-- 	lualdap >= 1.2
+-- 	<https://git.zx2c4.com/lualdap/about/>
+-- 	luaposix
+-- 	<https://github.com/luaposix/luaposix>
+--
+local sysstat = require("posix.sys.stat")
+local unistd = require("posix.unistd")
+local lualdap = require("lualdap")
+local rand = require("openssl.rand")
+local hmac = require("openssl.hmac")
+
+--
+--
+-- Configure these variables for your settings.
+--
+--
+
+-- A list of password protected repositories, with which gentooAccess
+-- group is allowed to access each one.
+local protected_repos = {
+	glouglou = "infra",
+	portage = "dev"
+}
+
+-- Set this to a path this script can write to for storing a persistent
+-- cookie secret, which should be guarded.
+local secret_filename = "/var/cache/cgit/auth-secret"
+
+
+--
+--
+-- Authentication functions follow below. Swap these out if you want different authentication semantics.
+--
+--
+
+-- Sets HTTP cookie headers based on post and sets up redirection.
+function authenticate_post()
+	local redirect = validate_value("redirect", post["redirect"])
+
+	if redirect == nil then
+		not_found()
+		return 0
+	end
+
+	redirect_to(redirect)
+	
+	local groups = gentoo_ldap_user_groups(post["username"], post["password"])
+	if groups == nil then
+		set_cookie("cgitauth", "")
+	else
+		-- One week expiration time
+		set_cookie("cgitauth", secure_value("gentoogroups", table.concat(groups, ","), os.time() + 604800))
+	end
+
+	html("\n")
+	return 0
+end
+
+
+-- Returns 1 if the cookie is valid and 0 if it is not.
+function authenticate_cookie()
+	local required_group = protected_repos[cgit["repo"]]
+	if required_group == nil then
+		-- We return as valid if the repo is not protected.
+		return 1
+	end
+	
+	local user_groups = validate_value("gentoogroups", get_cookie(http["cookie"], "cgitauth"))
+	if user_groups == nil or user_groups == "" then
+		return 0
+	end
+	for group in string.gmatch(user_groups, "[^,]+") do
+		if group == required_group then
+			return 1
+		end
+	end
+	return 0
+end
+
+-- Prints the html for the login form.
+function body()
+	html("<h2>Gentoo LDAP Authentication Required</h2>")
+	html("<form method='post' action='")
+	html_attr(cgit["login"])
+	html("'>")
+	html("<input type='hidden' name='redirect' value='")
+	html_attr(secure_value("redirect", cgit["url"], 0))
+	html("' />")
+	html("<table>")
+	html("<tr><td><label for='username'>Username:</label></td><td><input id='username' name='username' autofocus /></td></tr>")
+	html("<tr><td><label for='password'>Password:</label></td><td><input id='password' name='password' type='password' /></td></tr>")
+	html("<tr><td colspan='2'><input value='Login' type='submit' /></td></tr>")
+	html("</table></form>")
+
+	return 0
+end
+
+--
+--
+-- Gentoo LDAP support.
+--
+--
+
+function gentoo_ldap_user_groups(username, password)
+	-- Ensure the user is alphanumeric
+	if username == nil or username:match("%W") then
+		return nil
+	end
+
+	local who = "uid=" .. username .. ",ou=devs,dc=gentoo,dc=org"
+
+	local ldap, err = lualdap.open_simple {
+		uri = "ldap://ldap1.gentoo.org",
+		who = who,
+		password = password,
+		starttls = true,
+		certfile = "/var/www/uwsgi/cgit/gentoo-ldap/star.gentoo.org.crt",
+		keyfile = "/var/www/uwsgi/cgit/gentoo-ldap/star.gentoo.org.key",
+		cacertfile = "/var/www/uwsgi/cgit/gentoo-ldap/ca.pem"
+	}
+	if ldap == nil then
+		return nil
+	end
+
+	local group_suffix = ".group"
+	local group_suffix_len = group_suffix:len()
+	local groups = {}
+	for dn, attribs in ldap:search { base = who, scope = "subtree" } do
+		local access = attribs["gentooAccess"]
+		if dn == who and access ~= nil then
+			for i, v in ipairs(access) do
+				local vlen = v:len()
+				if vlen > group_suffix_len and v:sub(-group_suffix_len) == group_suffix then
+					table.insert(groups, v:sub(1, vlen - group_suffix_len))
+				end
+			end
+		end
+	end
+
+	ldap:close()
+
+	return groups
+end
+
+--
+--
+-- Wrapper around filter API, exposing the http table, the cgit table, and the post table to the above functions.
+--
+--
+
+local actions = {}
+actions["authenticate-post"] = authenticate_post
+actions["authenticate-cookie"] = authenticate_cookie
+actions["body"] = body
+
+function filter_open(...)
+	action = actions[select(1, ...)]
+
+	http = {}
+	http["cookie"] = select(2, ...)
+	http["method"] = select(3, ...)
+	http["query"] = select(4, ...)
+	http["referer"] = select(5, ...)
+	http["path"] = select(6, ...)
+	http["host"] = select(7, ...)
+	http["https"] = select(8, ...)
+
+	cgit = {}
+	cgit["repo"] = select(9, ...)
+	cgit["page"] = select(10, ...)
+	cgit["url"] = select(11, ...)
+	cgit["login"] = select(12, ...)
+
+end
+
+function filter_close()
+	return action()
+end
+
+function filter_write(str)
+	post = parse_qs(str)
+end
+
+
+--
+--
+-- Utility functions based on keplerproject/wsapi.
+--
+--
+
+function url_decode(str)
+	if not str then
+		return ""
+	end
+	str = string.gsub(str, "+", " ")
+	str = string.gsub(str, "%%(%x%x)", function(h) return string.char(tonumber(h, 16)) end)
+	str = string.gsub(str, "\r\n", "\n")
+	return str
+end
+
+function url_encode(str)
+	if not str then
+		return ""
+	end
+	str = string.gsub(str, "\n", "\r\n")
+	str = string.gsub(str, "([^%w ])", function(c) return string.format("%%%02X", string.byte(c)) end)
+	str = string.gsub(str, " ", "+")
+	return str
+end
+
+function parse_qs(qs)
+	local tab = {}
+	for key, val in string.gmatch(qs, "([^&=]+)=([^&=]*)&?") do
+		tab[url_decode(key)] = url_decode(val)
+	end
+	return tab
+end
+
+function get_cookie(cookies, name)
+	cookies = string.gsub(";" .. cookies .. ";", "%s*;%s*", ";")
+	return string.match(cookies, ";" .. name .. "=(.-);")
+end
+
+function tohex(b)
+	local x = ""
+	for i = 1, #b do
+		x = x .. string.format("%.2x", string.byte(b, i))
+	end
+	return x
+end
+
+--
+--
+-- Cookie construction and validation helpers.
+--
+--
+
+local secret = nil
+
+-- Loads a secret from a file, creates a secret, or returns one from memory.
+function get_secret()
+	if secret ~= nil then
+		return secret
+	end
+	local secret_file = io.open(secret_filename, "r")
+	if secret_file == nil then
+		local old_umask = sysstat.umask(63)
+		local temporary_filename = secret_filename .. ".tmp." .. tohex(rand.bytes(16))
+		local temporary_file = io.open(temporary_filename, "w")
+		if temporary_file == nil then
+			os.exit(177)
+		end
+		temporary_file:write(tohex(rand.bytes(32)))
+		temporary_file:close()
+		unistd.link(temporary_filename, secret_filename) -- Intentionally fails in the case that another process is doing the same.
+		unistd.unlink(temporary_filename)
+		sysstat.umask(old_umask)
+		secret_file = io.open(secret_filename, "r")
+	end
+	if secret_file == nil then
+		os.exit(177)
+	end
+	secret = secret_file:read()
+	secret_file:close()
+	if secret:len() ~= 64 then
+		os.exit(177)
+	end
+	return secret
+end
+
+-- Returns value of cookie if cookie is valid. Otherwise returns nil.
+function validate_value(expected_field, cookie)
+	local i = 0
+	local value = ""
+	local field = ""
+	local expiration = 0
+	local salt = ""
+	local chmac = ""
+
+	if cookie == nil or cookie:len() < 3 or cookie:sub(1, 1) == "|" then
+		return nil
+	end
+
+	for component in string.gmatch(cookie, "[^|]+") do
+		if i == 0 then
+			field = component
+		elseif i == 1 then
+			value = component
+		elseif i == 2 then
+			expiration = tonumber(component)
+			if expiration == nil then
+				expiration = -1
+			end
+		elseif i == 3 then
+			salt = component
+		elseif i == 4 then
+			chmac = component
+		else
+			break
+		end
+		i = i + 1
+	end
+
+	if chmac == nil or chmac:len() == 0 then
+		return nil
+	end
+
+	-- Lua hashes strings, so these comparisons are time invariant.
+	if chmac ~= tohex(hmac.new(get_secret(), "sha256"):final(field .. "|" .. value .. "|" .. tostring(expiration) .. "|" .. salt)) then
+		return nil
+	end
+
+	if expiration == -1 or (expiration ~= 0 and expiration <= os.time()) then
+		return nil
+	end
+
+	if url_decode(field) ~= expected_field then
+		return nil
+	end
+
+	return url_decode(value)
+end
+
+function secure_value(field, value, expiration)
+	if value == nil or value:len() <= 0 then
+		return ""
+	end
+
+	local authstr = ""
+	local salt = tohex(rand.bytes(16))
+	value = url_encode(value)
+	field = url_encode(field)
+	authstr = field .. "|" .. value .. "|" .. tostring(expiration) .. "|" .. salt
+	authstr = authstr .. "|" .. tohex(hmac.new(get_secret(), "sha256"):final(authstr))
+	return authstr
+end
+
+function set_cookie(cookie, value)
+	html("Set-Cookie: " .. cookie .. "=" .. value .. "; HttpOnly")
+	if http["https"] == "yes" or http["https"] == "on" or http["https"] == "1" then
+		html("; secure")
+	end
+	html("\n")
+end
+
+function redirect_to(url)
+	html("Status: 302 Redirect\n")
+	html("Cache-Control: no-cache, no-store\n")
+	html("Location: " .. url .. "\n")
+end
+
+function not_found()
+	html("Status: 404 Not Found\n")
+	html("Cache-Control: no-cache, no-store\n\n")
+end
diff --git a/third_party/cgit/filters/html-converters/man2html b/third_party/cgit/filters/html-converters/man2html
new file mode 100755
index 0000000000..0ef7884181
--- /dev/null
+++ b/third_party/cgit/filters/html-converters/man2html
@@ -0,0 +1,4 @@
+#!/bin/sh
+echo "<div style=\"font-family: monospace\">"
+groff -mandoc -T html -P -r -P -l | egrep -v '(<html>|<head>|<meta|<title>|</title>|</head>|<body>|</body>|</html>|<!DOCTYPE|"http://www.w3.org)'
+echo "</div>"
diff --git a/third_party/cgit/filters/html-converters/md2html b/third_party/cgit/filters/html-converters/md2html
new file mode 100755
index 0000000000..dc20f42a05
--- /dev/null
+++ b/third_party/cgit/filters/html-converters/md2html
@@ -0,0 +1,307 @@
+#!/usr/bin/env python3
+import markdown
+import sys
+import io
+from pygments.formatters import HtmlFormatter
+from markdown.extensions.toc import TocExtension
+sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')
+sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
+sys.stdout.write('''
+<style>
+.markdown-body {
+    font-size: 14px;
+    line-height: 1.6;
+    overflow: hidden;
+}
+.markdown-body>*:first-child {
+    margin-top: 0 !important;
+}
+.markdown-body>*:last-child {
+    margin-bottom: 0 !important;
+}
+.markdown-body a.absent {
+    color: #c00;
+}
+.markdown-body a.anchor {
+    display: block;
+    padding-left: 30px;
+    margin-left: -30px;
+    cursor: pointer;
+    position: absolute;
+    top: 0;
+    left: 0;
+    bottom: 0;
+}
+.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 {
+    margin: 20px 0 10px;
+    padding: 0;
+    font-weight: bold;
+    -webkit-font-smoothing: antialiased;
+    cursor: text;
+    position: relative;
+}
+.markdown-body h1 .mini-icon-link, .markdown-body h2 .mini-icon-link, .markdown-body h3 .mini-icon-link, .markdown-body h4 .mini-icon-link, .markdown-body h5 .mini-icon-link, .markdown-body h6 .mini-icon-link {
+    display: none;
+    color: #000;
+}
+.markdown-body h1:hover a.anchor, .markdown-body h2:hover a.anchor, .markdown-body h3:hover a.anchor, .markdown-body h4:hover a.anchor, .markdown-body h5:hover a.anchor, .markdown-body h6:hover a.anchor {
+    text-decoration: none;
+    line-height: 1;
+    padding-left: 0;
+    margin-left: -22px;
+    top: 15%;
+}
+.markdown-body h1:hover a.anchor .mini-icon-link, .markdown-body h2:hover a.anchor .mini-icon-link, .markdown-body h3:hover a.anchor .mini-icon-link, .markdown-body h4:hover a.anchor .mini-icon-link, .markdown-body h5:hover a.anchor .mini-icon-link, .markdown-body h6:hover a.anchor .mini-icon-link {
+    display: inline-block;
+}
+div#cgit .markdown-body h1 a.toclink, div#cgit .markdown-body h2 a.toclink, div#cgit .markdown-body h3 a.toclink, div#cgit .markdown-body h4 a.toclink, div#cgit .markdown-body h5 a.toclink, div#cgit .markdown-body h6 a.toclink {
+    color: black;
+}
+.markdown-body h1 tt, .markdown-body h1 code, .markdown-body h2 tt, .markdown-body h2 code, .markdown-body h3 tt, .markdown-body h3 code, .markdown-body h4 tt, .markdown-body h4 code, .markdown-body h5 tt, .markdown-body h5 code, .markdown-body h6 tt, .markdown-body h6 code {
+    font-size: inherit;
+}
+.markdown-body h1 {
+    font-size: 28px;
+    color: #000;
+}
+.markdown-body h2 {
+    font-size: 24px;
+    border-bottom: 1px solid #ccc;
+    color: #000;
+}
+.markdown-body h3 {
+    font-size: 18px;
+}
+.markdown-body h4 {
+    font-size: 16px;
+}
+.markdown-body h5 {
+    font-size: 14px;
+}
+.markdown-body h6 {
+    color: #777;
+    font-size: 14px;
+}
+.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre {
+    margin: 15px 0;
+}
+.markdown-body hr {
+    background: transparent url("/dirty-shade.png") repeat-x 0 0;
+    border: 0 none;
+    color: #ccc;
+    height: 4px;
+    padding: 0;
+}
+.markdown-body>h2:first-child, .markdown-body>h1:first-child, .markdown-body>h1:first-child+h2, .markdown-body>h3:first-child, .markdown-body>h4:first-child, .markdown-body>h5:first-child, .markdown-body>h6:first-child {
+    margin-top: 0;
+    padding-top: 0;
+}
+.markdown-body a:first-child h1, .markdown-body a:first-child h2, .markdown-body a:first-child h3, .markdown-body a:first-child h4, .markdown-body a:first-child h5, .markdown-body a:first-child h6 {
+    margin-top: 0;
+    padding-top: 0;
+}
+.markdown-body h1+p, .markdown-body h2+p, .markdown-body h3+p, .markdown-body h4+p, .markdown-body h5+p, .markdown-body h6+p {
+    margin-top: 0;
+}
+.markdown-body li p.first {
+    display: inline-block;
+}
+.markdown-body ul, .markdown-body ol {
+    padding-left: 30px;
+}
+.markdown-body ul.no-list, .markdown-body ol.no-list {
+    list-style-type: none;
+    padding: 0;
+}
+.markdown-body ul li>:first-child, .markdown-body ul li ul:first-of-type, .markdown-body ul li ol:first-of-type, .markdown-body ol li>:first-child, .markdown-body ol li ul:first-of-type, .markdown-body ol li ol:first-of-type {
+    margin-top: 0px;
+}
+.markdown-body ul li p:last-of-type, .markdown-body ol li p:last-of-type {
+    margin-bottom: 0;
+}
+.markdown-body ul ul, .markdown-body ul ol, .markdown-body ol ol, .markdown-body ol ul {
+    margin-bottom: 0;
+}
+.markdown-body dl {
+    padding: 0;
+}
+.markdown-body dl dt {
+    font-size: 14px;
+    font-weight: bold;
+    font-style: italic;
+    padding: 0;
+    margin: 15px 0 5px;
+}
+.markdown-body dl dt:first-child {
+    padding: 0;
+}
+.markdown-body dl dt>:first-child {
+    margin-top: 0px;
+}
+.markdown-body dl dt>:last-child {
+    margin-bottom: 0px;
+}
+.markdown-body dl dd {
+    margin: 0 0 15px;
+    padding: 0 15px;
+}
+.markdown-body dl dd>:first-child {
+    margin-top: 0px;
+}
+.markdown-body dl dd>:last-child {
+    margin-bottom: 0px;
+}
+.markdown-body blockquote {
+    border-left: 4px solid #DDD;
+    padding: 0 15px;
+    color: #777;
+}
+.markdown-body blockquote>:first-child {
+    margin-top: 0px;
+}
+.markdown-body blockquote>:last-child {
+    margin-bottom: 0px;
+}
+.markdown-body table th {
+    font-weight: bold;
+}
+.markdown-body table th, .markdown-body table td {
+    border: 1px solid #ccc;
+    padding: 6px 13px;
+}
+.markdown-body table tr {
+    border-top: 1px solid #ccc;
+    background-color: #fff;
+}
+.markdown-body table tr:nth-child(2n) {
+    background-color: #f8f8f8;
+}
+.markdown-body img {
+    max-width: 100%;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+}
+.markdown-body span.frame {
+    display: block;
+    overflow: hidden;
+}
+.markdown-body span.frame>span {
+    border: 1px solid #ddd;
+    display: block;
+    float: left;
+    overflow: hidden;
+    margin: 13px 0 0;
+    padding: 7px;
+    width: auto;
+}
+.markdown-body span.frame span img {
+    display: block;
+    float: left;
+}
+.markdown-body span.frame span span {
+    clear: both;
+    color: #333;
+    display: block;
+    padding: 5px 0 0;
+}
+.markdown-body span.align-center {
+    display: block;
+    overflow: hidden;
+    clear: both;
+}
+.markdown-body span.align-center>span {
+    display: block;
+    overflow: hidden;
+    margin: 13px auto 0;
+    text-align: center;
+}
+.markdown-body span.align-center span img {
+    margin: 0 auto;
+    text-align: center;
+}
+.markdown-body span.align-right {
+    display: block;
+    overflow: hidden;
+    clear: both;
+}
+.markdown-body span.align-right>span {
+    display: block;
+    overflow: hidden;
+    margin: 13px 0 0;
+    text-align: right;
+}
+.markdown-body span.align-right span img {
+    margin: 0;
+    text-align: right;
+}
+.markdown-body span.float-left {
+    display: block;
+    margin-right: 13px;
+    overflow: hidden;
+    float: left;
+}
+.markdown-body span.float-left span {
+    margin: 13px 0 0;
+}
+.markdown-body span.float-right {
+    display: block;
+    margin-left: 13px;
+    overflow: hidden;
+    float: right;
+}
+.markdown-body span.float-right>span {
+    display: block;
+    overflow: hidden;
+    margin: 13px auto 0;
+    text-align: right;
+}
+.markdown-body code, .markdown-body tt {
+    margin: 0 2px;
+    padding: 0px 5px;
+    border: 1px solid #eaeaea;
+    background-color: #f8f8f8;
+    border-radius: 3px;
+}
+.markdown-body code {
+    white-space: nowrap;
+}
+.markdown-body pre>code {
+    margin: 0;
+    padding: 0;
+    white-space: pre;
+    border: none;
+    background: transparent;
+}
+.markdown-body .highlight pre, .markdown-body pre {
+    background-color: #f8f8f8;
+    border: 1px solid #ccc;
+    font-size: 13px;
+    line-height: 19px;
+    overflow: auto;
+    padding: 6px 10px;
+    border-radius: 3px;
+}
+.markdown-body pre code, .markdown-body pre tt {
+    margin: 0;
+    padding: 0;
+    background-color: transparent;
+    border: none;
+}
+''')
+sys.stdout.write(HtmlFormatter(style='pastie').get_style_defs('.highlight'))
+sys.stdout.write('''
+</style>   
+''')
+sys.stdout.write("<div class='markdown-body'>")
+sys.stdout.flush()
+# Note: you may want to run this through bleach for sanitization
+markdown.markdownFromFile(
+	output_format="html5",
+	extensions=[
+		"markdown.extensions.fenced_code",
+		"markdown.extensions.codehilite",
+		"markdown.extensions.tables",
+		TocExtension(anchorlink=True)],
+	extension_configs={
+		"markdown.extensions.codehilite":{"css_class":"highlight"}})
+sys.stdout.write("</div>")
diff --git a/third_party/cgit/filters/html-converters/rst2html b/third_party/cgit/filters/html-converters/rst2html
new file mode 100755
index 0000000000..02d90f81c9
--- /dev/null
+++ b/third_party/cgit/filters/html-converters/rst2html
@@ -0,0 +1,2 @@
+#!/bin/bash
+exec rst2html.py --template <(echo -e "%(stylesheet)s\n%(body_pre_docinfo)s\n%(docinfo)s\n%(body)s")
diff --git a/third_party/cgit/filters/html-converters/txt2html b/third_party/cgit/filters/html-converters/txt2html
new file mode 100755
index 0000000000..495eeceb27
--- /dev/null
+++ b/third_party/cgit/filters/html-converters/txt2html
@@ -0,0 +1,4 @@
+#!/bin/sh
+echo "<pre>"
+sed "s|&|\\&amp;|g;s|'|\\&apos;|g;s|\"|\\&quot;|g;s|<|\\&lt;|g;s|>|\\&gt;|g"
+echo "</pre>"
diff --git a/third_party/cgit/filters/owner-example.lua b/third_party/cgit/filters/owner-example.lua
new file mode 100644
index 0000000000..50fc25a8e5
--- /dev/null
+++ b/third_party/cgit/filters/owner-example.lua
@@ -0,0 +1,17 @@
+-- This script is an example of an owner-filter.  It replaces the
+-- usual query link with one to a fictional homepage.  This script may
+-- be used with the owner-filter or repo.owner-filter settings in
+-- cgitrc with the `lua:` prefix.
+
+function filter_open()
+	buffer = ""
+end
+
+function filter_close()
+	html(string.format("<a href=\"%s\">%s</a>", "http://wiki.example.com/about/" .. buffer, buffer))
+	return 0
+end
+
+function filter_write(str)
+	buffer = buffer .. str
+end
diff --git a/third_party/cgit/filters/simple-authentication.lua b/third_party/cgit/filters/simple-authentication.lua
new file mode 100644
index 0000000000..23d345763b
--- /dev/null
+++ b/third_party/cgit/filters/simple-authentication.lua
@@ -0,0 +1,314 @@
+-- This script may be used with the auth-filter. Be sure to configure it as you wish.
+--
+-- Requirements:
+-- 	luaossl
+-- 	<http://25thandclement.com/~william/projects/luaossl.html>
+-- 	luaposix
+-- 	<https://github.com/luaposix/luaposix>
+--
+local sysstat = require("posix.sys.stat")
+local unistd = require("posix.unistd")
+local rand = require("openssl.rand")
+local hmac = require("openssl.hmac")
+
+--
+--
+-- Configure these variables for your settings.
+--
+--
+
+-- A list of password protected repositories along with the users who can access them.
+local protected_repos = {
+	glouglou	= { laurent = true, jason = true },
+	qt		= { jason = true, bob = true }
+}
+
+-- A list of users and hashes, generated with `mkpasswd -m sha-512 -R 300000`.
+local users = {
+	jason		= "$6$rounds=300000$YYJct3n/o.ruYK$HhpSeuCuW1fJkpvMZOZzVizeLsBKcGA/aF2UPuV5v60JyH2MVSG6P511UMTj2F3H75.IT2HIlnvXzNb60FcZH1",
+	laurent		= "$6$rounds=300000$dP0KNHwYb3JKigT$pN/LG7rWxQ4HniFtx5wKyJXBJUKP7R01zTNZ0qSK/aivw8ywGAOdfYiIQFqFhZFtVGvr11/7an.nesvm8iJUi.",
+	bob		= "$6$rounds=300000$jCLCCt6LUpTz$PI1vvd1yaVYcCzqH8QAJFcJ60b6W/6sjcOsU7mAkNo7IE8FRGW1vkjF8I/T5jt/auv5ODLb1L4S2s.CAyZyUC"
+}
+
+-- Set this to a path this script can write to for storing a persistent
+-- cookie secret, which should be guarded.
+local secret_filename = "/var/cache/cgit/auth-secret"
+
+--
+--
+-- Authentication functions follow below. Swap these out if you want different authentication semantics.
+--
+--
+
+-- Sets HTTP cookie headers based on post and sets up redirection.
+function authenticate_post()
+	local hash = users[post["username"]]
+	local redirect = validate_value("redirect", post["redirect"])
+
+	if redirect == nil then
+		not_found()
+		return 0
+	end
+
+	redirect_to(redirect)
+
+	if hash == nil or hash ~= unistd.crypt(post["password"], hash) then
+		set_cookie("cgitauth", "")
+	else
+		-- One week expiration time
+		local username = secure_value("username", post["username"], os.time() + 604800)
+		set_cookie("cgitauth", username)
+	end
+
+	html("\n")
+	return 0
+end
+
+
+-- Returns 1 if the cookie is valid and 0 if it is not.
+function authenticate_cookie()
+	accepted_users = protected_repos[cgit["repo"]]
+	if accepted_users == nil then
+		-- We return as valid if the repo is not protected.
+		return 1
+	end
+
+	local username = validate_value("username", get_cookie(http["cookie"], "cgitauth"))
+	if username == nil or not accepted_users[username:lower()] then
+		return 0
+	else
+		return 1
+	end
+end
+
+-- Prints the html for the login form.
+function body()
+	html("<h2>Authentication Required</h2>")
+	html("<form method='post' action='")
+	html_attr(cgit["login"])
+	html("'>")
+	html("<input type='hidden' name='redirect' value='")
+	html_attr(secure_value("redirect", cgit["url"], 0))
+	html("' />")
+	html("<table>")
+	html("<tr><td><label for='username'>Username:</label></td><td><input id='username' name='username' autofocus /></td></tr>")
+	html("<tr><td><label for='password'>Password:</label></td><td><input id='password' name='password' type='password' /></td></tr>")
+	html("<tr><td colspan='2'><input value='Login' type='submit' /></td></tr>")
+	html("</table></form>")
+
+	return 0
+end
+
+
+
+--
+--
+-- Wrapper around filter API, exposing the http table, the cgit table, and the post table to the above functions.
+--
+--
+
+local actions = {}
+actions["authenticate-post"] = authenticate_post
+actions["authenticate-cookie"] = authenticate_cookie
+actions["body"] = body
+
+function filter_open(...)
+	action = actions[select(1, ...)]
+
+	http = {}
+	http["cookie"] = select(2, ...)
+	http["method"] = select(3, ...)
+	http["query"] = select(4, ...)
+	http["referer"] = select(5, ...)
+	http["path"] = select(6, ...)
+	http["host"] = select(7, ...)
+	http["https"] = select(8, ...)
+
+	cgit = {}
+	cgit["repo"] = select(9, ...)
+	cgit["page"] = select(10, ...)
+	cgit["url"] = select(11, ...)
+	cgit["login"] = select(12, ...)
+
+end
+
+function filter_close()
+	return action()
+end
+
+function filter_write(str)
+	post = parse_qs(str)
+end
+
+
+--
+--
+-- Utility functions based on keplerproject/wsapi.
+--
+--
+
+function url_decode(str)
+	if not str then
+		return ""
+	end
+	str = string.gsub(str, "+", " ")
+	str = string.gsub(str, "%%(%x%x)", function(h) return string.char(tonumber(h, 16)) end)
+	str = string.gsub(str, "\r\n", "\n")
+	return str
+end
+
+function url_encode(str)
+	if not str then
+		return ""
+	end
+	str = string.gsub(str, "\n", "\r\n")
+	str = string.gsub(str, "([^%w ])", function(c) return string.format("%%%02X", string.byte(c)) end)
+	str = string.gsub(str, " ", "+")
+	return str
+end
+
+function parse_qs(qs)
+	local tab = {}
+	for key, val in string.gmatch(qs, "([^&=]+)=([^&=]*)&?") do
+		tab[url_decode(key)] = url_decode(val)
+	end
+	return tab
+end
+
+function get_cookie(cookies, name)
+	cookies = string.gsub(";" .. cookies .. ";", "%s*;%s*", ";")
+	return url_decode(string.match(cookies, ";" .. name .. "=(.-);"))
+end
+
+function tohex(b)
+	local x = ""
+	for i = 1, #b do
+		x = x .. string.format("%.2x", string.byte(b, i))
+	end
+	return x
+end
+
+--
+--
+-- Cookie construction and validation helpers.
+--
+--
+
+local secret = nil
+
+-- Loads a secret from a file, creates a secret, or returns one from memory.
+function get_secret()
+	if secret ~= nil then
+		return secret
+	end
+	local secret_file = io.open(secret_filename, "r")
+	if secret_file == nil then
+		local old_umask = sysstat.umask(63)
+		local temporary_filename = secret_filename .. ".tmp." .. tohex(rand.bytes(16))
+		local temporary_file = io.open(temporary_filename, "w")
+		if temporary_file == nil then
+			os.exit(177)
+		end
+		temporary_file:write(tohex(rand.bytes(32)))
+		temporary_file:close()
+		unistd.link(temporary_filename, secret_filename) -- Intentionally fails in the case that another process is doing the same.
+		unistd.unlink(temporary_filename)
+		sysstat.umask(old_umask)
+		secret_file = io.open(secret_filename, "r")
+	end
+	if secret_file == nil then
+		os.exit(177)
+	end
+	secret = secret_file:read()
+	secret_file:close()
+	if secret:len() ~= 64 then
+		os.exit(177)
+	end
+	return secret
+end
+
+-- Returns value of cookie if cookie is valid. Otherwise returns nil.
+function validate_value(expected_field, cookie)
+	local i = 0
+	local value = ""
+	local field = ""
+	local expiration = 0
+	local salt = ""
+	local chmac = ""
+
+	if cookie == nil or cookie:len() < 3 or cookie:sub(1, 1) == "|" then
+		return nil
+	end
+
+	for component in string.gmatch(cookie, "[^|]+") do
+		if i == 0 then
+			field = component
+		elseif i == 1 then
+			value = component
+		elseif i == 2 then
+			expiration = tonumber(component)
+			if expiration == nil then
+				expiration = -1
+			end
+		elseif i == 3 then
+			salt = component
+		elseif i == 4 then
+			chmac = component
+		else
+			break
+		end
+		i = i + 1
+	end
+
+	if chmac == nil or chmac:len() == 0 then
+		return nil
+	end
+
+	-- Lua hashes strings, so these comparisons are time invariant.
+	if chmac ~= tohex(hmac.new(get_secret(), "sha256"):final(field .. "|" .. value .. "|" .. tostring(expiration) .. "|" .. salt)) then
+		return nil
+	end
+
+	if expiration == -1 or (expiration ~= 0 and expiration <= os.time()) then
+		return nil
+	end
+
+	if url_decode(field) ~= expected_field then
+		return nil
+	end
+
+	return url_decode(value)
+end
+
+function secure_value(field, value, expiration)
+	if value == nil or value:len() <= 0 then
+		return ""
+	end
+
+	local authstr = ""
+	local salt = tohex(rand.bytes(16))
+	value = url_encode(value)
+	field = url_encode(field)
+	authstr = field .. "|" .. value .. "|" .. tostring(expiration) .. "|" .. salt
+	authstr = authstr .. "|" .. tohex(hmac.new(get_secret(), "sha256"):final(authstr))
+	return authstr
+end
+
+function set_cookie(cookie, value)
+	html("Set-Cookie: " .. cookie .. "=" .. value .. "; HttpOnly")
+	if http["https"] == "yes" or http["https"] == "on" or http["https"] == "1" then
+		html("; secure")
+	end
+	html("\n")
+end
+
+function redirect_to(url)
+	html("Status: 302 Redirect\n")
+	html("Cache-Control: no-cache, no-store\n")
+	html("Location: " .. url .. "\n")
+end
+
+function not_found()
+	html("Status: 404 Not Found\n")
+	html("Cache-Control: no-cache, no-store\n\n")
+end
diff --git a/third_party/cgit/filters/syntax-highlighting.py b/third_party/cgit/filters/syntax-highlighting.py
new file mode 100755
index 0000000000..e912594c48
--- /dev/null
+++ b/third_party/cgit/filters/syntax-highlighting.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+
+# This script uses Pygments and Python3. You must have both installed
+# for this to work.
+#
+# http://pygments.org/
+# http://python.org/
+#
+# It may be used with the source-filter or repo.source-filter settings
+# in cgitrc.
+#
+# The following environment variables can be used to retrieve the
+# configuration of the repository for which this script is called:
+# CGIT_REPO_URL        ( = repo.url       setting )
+# CGIT_REPO_NAME       ( = repo.name      setting )
+# CGIT_REPO_PATH       ( = repo.path      setting )
+# CGIT_REPO_OWNER      ( = repo.owner     setting )
+# CGIT_REPO_DEFBRANCH  ( = repo.defbranch setting )
+# CGIT_REPO_SECTION    ( = section        setting )
+# CGIT_REPO_CLONE_URL  ( = repo.clone-url setting )
+
+
+import sys
+import io
+from pygments import highlight
+from pygments.util import ClassNotFound
+from pygments.lexers import TextLexer
+from pygments.lexers import guess_lexer
+from pygments.lexers import guess_lexer_for_filename
+from pygments.formatters import HtmlFormatter
+
+
+sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8', errors='replace')
+sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
+data = sys.stdin.read()
+filename = sys.argv[1]
+formatter = HtmlFormatter(style='pastie', nobackground=True)
+
+try:
+	lexer = guess_lexer_for_filename(filename, data)
+except ClassNotFound:
+	# check if there is any shebang
+	if data[0:2] == '#!':
+		lexer = guess_lexer(data)
+	else:
+		lexer = TextLexer()
+except TypeError:
+	lexer = TextLexer()
+
+# highlight! :-)
+# printout pygments' css definitions as well
+sys.stdout.write('<style>')
+sys.stdout.write(formatter.get_style_defs('.highlight'))
+sys.stdout.write('</style>')
+sys.stdout.write(highlight(data, lexer, formatter, outfile=None))
diff --git a/third_party/cgit/filters/syntax-highlighting.sh b/third_party/cgit/filters/syntax-highlighting.sh
new file mode 100755
index 0000000000..840bc34fff
--- /dev/null
+++ b/third_party/cgit/filters/syntax-highlighting.sh
@@ -0,0 +1,121 @@
+#!/bin/sh
+# This script can be used to implement syntax highlighting in the cgit
+# tree-view by referring to this file with the source-filter or repo.source-
+# filter options in cgitrc.
+#
+# This script requires a shell supporting the ${var##pattern} syntax.
+# It is supported by at least dash and bash, however busybox environments
+# might have to use an external call to sed instead.
+#
+# Note: the highlight command (http://www.andre-simon.de/) uses css for syntax
+# highlighting, so you'll probably want something like the following included
+# in your css file:
+#
+# Style definition file generated by highlight 2.4.8, http://www.andre-simon.de/
+#
+# table.blob .num  { color:#2928ff; }
+# table.blob .esc  { color:#ff00ff; }
+# table.blob .str  { color:#ff0000; }
+# table.blob .dstr { color:#818100; }
+# table.blob .slc  { color:#838183; font-style:italic; }
+# table.blob .com  { color:#838183; font-style:italic; }
+# table.blob .dir  { color:#008200; }
+# table.blob .sym  { color:#000000; }
+# table.blob .kwa  { color:#000000; font-weight:bold; }
+# table.blob .kwb  { color:#830000; }
+# table.blob .kwc  { color:#000000; font-weight:bold; }
+# table.blob .kwd  { color:#010181; }
+#
+#
+# Style definition file generated by highlight 2.6.14, http://www.andre-simon.de/
+#
+# body.hl  { background-color:#ffffff; }
+# pre.hl   { color:#000000; background-color:#ffffff; font-size:10pt; font-family:'Courier New';}
+# .hl.num  { color:#2928ff; }
+# .hl.esc  { color:#ff00ff; }
+# .hl.str  { color:#ff0000; }
+# .hl.dstr { color:#818100; }
+# .hl.slc  { color:#838183; font-style:italic; }
+# .hl.com  { color:#838183; font-style:italic; }
+# .hl.dir  { color:#008200; }
+# .hl.sym  { color:#000000; }
+# .hl.line { color:#555555; }
+# .hl.mark { background-color:#ffffbb;}
+# .hl.kwa  { color:#000000; font-weight:bold; }
+# .hl.kwb  { color:#830000; }
+# .hl.kwc  { color:#000000; font-weight:bold; }
+# .hl.kwd  { color:#010181; }
+#
+#
+# Style definition file generated by highlight 3.8, http://www.andre-simon.de/
+#
+# body.hl { background-color:#e0eaee; }
+# pre.hl  { color:#000000; background-color:#e0eaee; font-size:10pt; font-family:'Courier New';}
+# .hl.num { color:#b07e00; }
+# .hl.esc { color:#ff00ff; }
+# .hl.str { color:#bf0303; }
+# .hl.pps { color:#818100; }
+# .hl.slc { color:#838183; font-style:italic; }
+# .hl.com { color:#838183; font-style:italic; }
+# .hl.ppc { color:#008200; }
+# .hl.opt { color:#000000; }
+# .hl.lin { color:#555555; }
+# .hl.kwa { color:#000000; font-weight:bold; }
+# .hl.kwb { color:#0057ae; }
+# .hl.kwc { color:#000000; font-weight:bold; }
+# .hl.kwd { color:#010181; }
+#
+#
+# Style definition file generated by highlight 3.13, http://www.andre-simon.de/
+#
+# body.hl { background-color:#e0eaee; }
+# pre.hl  { color:#000000; background-color:#e0eaee; font-size:10pt; font-family:'Courier New',monospace;}
+# .hl.num { color:#b07e00; }
+# .hl.esc { color:#ff00ff; }
+# .hl.str { color:#bf0303; }
+# .hl.pps { color:#818100; }
+# .hl.slc { color:#838183; font-style:italic; }
+# .hl.com { color:#838183; font-style:italic; }
+# .hl.ppc { color:#008200; }
+# .hl.opt { color:#000000; }
+# .hl.ipl { color:#0057ae; }
+# .hl.lin { color:#555555; }
+# .hl.kwa { color:#000000; font-weight:bold; }
+# .hl.kwb { color:#0057ae; }
+# .hl.kwc { color:#000000; font-weight:bold; }
+# .hl.kwd { color:#010181; }
+#
+#
+# The following environment variables can be used to retrieve the configuration
+# of the repository for which this script is called:
+# CGIT_REPO_URL        ( = repo.url       setting )
+# CGIT_REPO_NAME       ( = repo.name      setting )
+# CGIT_REPO_PATH       ( = repo.path      setting )
+# CGIT_REPO_OWNER      ( = repo.owner     setting )
+# CGIT_REPO_DEFBRANCH  ( = repo.defbranch setting )
+# CGIT_REPO_SECTION    ( = section        setting )
+# CGIT_REPO_CLONE_URL  ( = repo.clone-url setting )
+#
+
+# store filename and extension in local vars
+BASENAME="$1"
+EXTENSION="${BASENAME##*.}"
+
+[ "${BASENAME}" = "${EXTENSION}" ] && EXTENSION=txt
+[ -z "${EXTENSION}" ] && EXTENSION=txt
+
+# map Makefile and Makefile.* to .mk
+[ "${BASENAME%%.*}" = "Makefile" ] && EXTENSION=mk
+
+# highlight versions 2 and 3 have different commandline options. Specifically,
+# the -X option that is used for version 2 is replaced by the -O xhtml option
+# for version 3.
+#
+# Version 2 can be found (for example) on EPEL 5, while version 3 can be
+# found (for example) on EPEL 6.
+#
+# This is for version 2
+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
diff --git a/third_party/cgit/gen-version.sh b/third_party/cgit/gen-version.sh
new file mode 100755
index 0000000000..80cf49af48
--- /dev/null
+++ b/third_party/cgit/gen-version.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# Get version-info specified in Makefile
+V=$1
+
+# Use `git describe` to get current version if we're inside a git repo
+if test "$(git rev-parse --git-dir 2>/dev/null)" = '.git'
+then
+	V=$(git describe --abbrev=4 HEAD 2>/dev/null)
+fi
+
+new="CGIT_VERSION = $V"
+old=$(cat VERSION 2>/dev/null)
+
+# Exit if VERSION is uptodate
+test "$old" = "$new" && exit 0
+
+# Update VERSION with new version-info
+echo "$new" > VERSION
+cat VERSION
diff --git a/third_party/cgit/git b/third_party/cgit/git
new file mode 160000
+Subproject 5fa0f5238b0cd46cfe7f6fa76c3f526ea98148d
diff --git a/third_party/cgit/html.c b/third_party/cgit/html.c
new file mode 100644
index 0000000000..7f81965fdd
--- /dev/null
+++ b/third_party/cgit/html.c
@@ -0,0 +1,344 @@
+/* html.c: helper functions for html output
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "html.h"
+#include "url.h"
+
+/* Percent-encoding of each character, except: a-zA-Z0-9!$()*,./:;@- */
+static const char* url_escape_table[256] = {
+	"%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07",
+	"%08", "%09", "%0a", "%0b", "%0c", "%0d", "%0e", "%0f",
+	"%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
+	"%18", "%19", "%1a", "%1b", "%1c", "%1d", "%1e", "%1f",
+	"%20", NULL,  "%22", "%23", NULL,  "%25", "%26", "%27",
+	NULL,  NULL,  NULL,  "%2b", NULL,  NULL,  NULL,  NULL,
+	NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,
+	NULL,  NULL,  NULL,  NULL,  "%3c", "%3d", "%3e", "%3f",
+	NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,
+	NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,
+	NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,
+	NULL,  NULL,  NULL,  NULL,  "%5c", NULL,  "%5e", NULL,
+	"%60", NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,
+	NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,
+	NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL,
+	NULL,  NULL,  NULL,  "%7b", "%7c", "%7d", NULL,  "%7f",
+	"%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87",
+	"%88", "%89", "%8a", "%8b", "%8c", "%8d", "%8e", "%8f",
+	"%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97",
+	"%98", "%99", "%9a", "%9b", "%9c", "%9d", "%9e", "%9f",
+	"%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7",
+	"%a8", "%a9", "%aa", "%ab", "%ac", "%ad", "%ae", "%af",
+	"%b0", "%b1", "%b2", "%b3", "%b4", "%b5", "%b6", "%b7",
+	"%b8", "%b9", "%ba", "%bb", "%bc", "%bd", "%be", "%bf",
+	"%c0", "%c1", "%c2", "%c3", "%c4", "%c5", "%c6", "%c7",
+	"%c8", "%c9", "%ca", "%cb", "%cc", "%cd", "%ce", "%cf",
+	"%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
+	"%d8", "%d9", "%da", "%db", "%dc", "%dd", "%de", "%df",
+	"%e0", "%e1", "%e2", "%e3", "%e4", "%e5", "%e6", "%e7",
+	"%e8", "%e9", "%ea", "%eb", "%ec", "%ed", "%ee", "%ef",
+	"%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
+	"%f8", "%f9", "%fa", "%fb", "%fc", "%fd", "%fe", "%ff"
+};
+
+char *fmt(const char *format, ...)
+{
+	static char buf[8][1024];
+	static int bufidx;
+	int len;
+	va_list args;
+
+	bufidx++;
+	bufidx &= 7;
+
+	va_start(args, format);
+	len = vsnprintf(buf[bufidx], sizeof(buf[bufidx]), format, args);
+	va_end(args);
+	if (len > sizeof(buf[bufidx])) {
+		fprintf(stderr, "[html.c] string truncated: %s\n", format);
+		exit(1);
+	}
+	return buf[bufidx];
+}
+
+char *fmtalloc(const char *format, ...)
+{
+	struct strbuf sb = STRBUF_INIT;
+	va_list args;
+
+	va_start(args, format);
+	strbuf_vaddf(&sb, format, args);
+	va_end(args);
+
+	return strbuf_detach(&sb, NULL);
+}
+
+void html_raw(const char *data, size_t size)
+{
+	if (write(STDOUT_FILENO, data, size) != size)
+		die_errno("write error on html output");
+}
+
+void html(const char *txt)
+{
+	html_raw(txt, strlen(txt));
+}
+
+void htmlf(const char *format, ...)
+{
+	va_list args;
+	struct strbuf buf = STRBUF_INIT;
+
+	va_start(args, format);
+	strbuf_vaddf(&buf, format, args);
+	va_end(args);
+	html(buf.buf);
+	strbuf_release(&buf);
+}
+
+void html_txtf(const char *format, ...)
+{
+	va_list args;
+
+	va_start(args, format);
+	html_vtxtf(format, args);
+	va_end(args);
+}
+
+void html_vtxtf(const char *format, va_list ap)
+{
+	va_list cp;
+	struct strbuf buf = STRBUF_INIT;
+
+	va_copy(cp, ap);
+	strbuf_vaddf(&buf, format, cp);
+	va_end(cp);
+	html_txt(buf.buf);
+	strbuf_release(&buf);
+}
+
+void html_txt(const char *txt)
+{
+	if (txt)
+		html_ntxt(txt, strlen(txt));
+}
+
+ssize_t html_ntxt(const char *txt, size_t len)
+{
+	const char *t = txt;
+	ssize_t slen;
+
+	if (len > SSIZE_MAX)
+		return -1;
+
+	slen = (ssize_t) len;
+	while (t && *t && slen--) {
+		int c = *t;
+		if (c == '<' || c == '>' || c == '&') {
+			html_raw(txt, t - txt);
+			if (c == '>')
+				html("&gt;");
+			else if (c == '<')
+				html("&lt;");
+			else if (c == '&')
+				html("&amp;");
+			txt = t + 1;
+		}
+		t++;
+	}
+	if (t != txt)
+		html_raw(txt, t - txt);
+	return slen;
+}
+
+void html_attrf(const char *fmt, ...)
+{
+	va_list ap;
+	struct strbuf sb = STRBUF_INIT;
+
+	va_start(ap, fmt);
+	strbuf_vaddf(&sb, fmt, ap);
+	va_end(ap);
+
+	html_attr(sb.buf);
+	strbuf_release(&sb);
+}
+
+void html_attr(const char *txt)
+{
+	const char *t = txt;
+	while (t && *t) {
+		int c = *t;
+		if (c == '<' || c == '>' || c == '\'' || c == '\"' || c == '&') {
+			html_raw(txt, t - txt);
+			if (c == '>')
+				html("&gt;");
+			else if (c == '<')
+				html("&lt;");
+			else if (c == '\'')
+				html("&#x27;");
+			else if (c == '"')
+				html("&quot;");
+			else if (c == '&')
+				html("&amp;");
+			txt = t + 1;
+		}
+		t++;
+	}
+	if (t != txt)
+		html(txt);
+}
+
+void html_url_path(const char *txt)
+{
+	const char *t = txt;
+	while (t && *t) {
+		unsigned char c = *t;
+		const char *e = url_escape_table[c];
+		if (e && c != '+' && c != '&') {
+			html_raw(txt, t - txt);
+			html(e);
+			txt = t + 1;
+		}
+		t++;
+	}
+	if (t != txt)
+		html(txt);
+}
+
+void html_url_arg(const char *txt)
+{
+	const char *t = txt;
+	while (t && *t) {
+		unsigned char c = *t;
+		const char *e = url_escape_table[c];
+		if (c == ' ')
+			e = "+";
+		if (e) {
+			html_raw(txt, t - txt);
+			html(e);
+			txt = t + 1;
+		}
+		t++;
+	}
+	if (t != txt)
+		html(txt);
+}
+
+void html_header_arg_in_quotes(const char *txt)
+{
+	const char *t = txt;
+	while (t && *t) {
+		unsigned char c = *t;
+		const char *e = NULL;
+		if (c == '\\')
+			e = "\\\\";
+		else if (c == '\r')
+			e = "\\r";
+		else if (c == '\n')
+			e = "\\n";
+		else if (c == '"')
+			e = "\\\"";
+		if (e) {
+			html_raw(txt, t - txt);
+			html(e);
+			txt = t + 1;
+		}
+		t++;
+	}
+	if (t != txt)
+		html(txt);
+
+}
+
+void html_hidden(const char *name, const char *value)
+{
+	html("<input type='hidden' name='");
+	html_attr(name);
+	html("' value='");
+	html_attr(value);
+	html("'/>");
+}
+
+void html_option(const char *value, const char *text, const char *selected_value)
+{
+	html("<option value='");
+	html_attr(value);
+	html("'");
+	if (selected_value && !strcmp(selected_value, value))
+		html(" selected='selected'");
+	html(">");
+	html_txt(text);
+	html("</option>\n");
+}
+
+void html_intoption(int value, const char *text, int selected_value)
+{
+	htmlf("<option value='%d'%s>", value,
+	      value == selected_value ? " selected='selected'" : "");
+	html_txt(text);
+	html("</option>");
+}
+
+void html_link_open(const char *url, const char *title, const char *class)
+{
+	html("<a href='");
+	html_attr(url);
+	if (title) {
+		html("' title='");
+		html_attr(title);
+	}
+	if (class) {
+		html("' class='");
+		html_attr(class);
+	}
+	html("'>");
+}
+
+void html_link_close(void)
+{
+	html("</a>");
+}
+
+void html_fileperm(unsigned short mode)
+{
+	htmlf("%c%c%c", (mode & 4 ? 'r' : '-'),
+	      (mode & 2 ? 'w' : '-'), (mode & 1 ? 'x' : '-'));
+}
+
+int html_include(const char *filename)
+{
+	FILE *f;
+	char buf[4096];
+	size_t len;
+
+	if (!(f = fopen(filename, "r"))) {
+		fprintf(stderr, "[cgit] Failed to include file %s: %s (%d).\n",
+			filename, strerror(errno), errno);
+		return -1;
+	}
+	while ((len = fread(buf, 1, 4096, f)) > 0)
+		html_raw(buf, len);
+	fclose(f);
+	return 0;
+}
+
+void http_parse_querystring(const char *txt, void (*fn)(const char *name, const char *value))
+{
+	const char *t = txt;
+
+	while (t && *t) {
+		char *name = url_decode_parameter_name(&t);
+		if (*name) {
+			char *value = url_decode_parameter_value(&t);
+			fn(name, value);
+			free(value);
+		}
+		free(name);
+	}
+}
diff --git a/third_party/cgit/html.h b/third_party/cgit/html.h
new file mode 100644
index 0000000000..fa4de77587
--- /dev/null
+++ b/third_party/cgit/html.h
@@ -0,0 +1,37 @@
+#ifndef HTML_H
+#define HTML_H
+
+#include "cgit.h"
+
+extern void html_raw(const char *txt, size_t size);
+extern void html(const char *txt);
+
+__attribute__((format (printf,1,2)))
+extern void htmlf(const char *format,...);
+
+__attribute__((format (printf,1,2)))
+extern void html_txtf(const char *format,...);
+
+__attribute__((format (printf,1,0)))
+extern void html_vtxtf(const char *format, va_list ap);
+
+__attribute__((format (printf,1,2)))
+extern void html_attrf(const char *format,...);
+
+extern void html_txt(const char *txt);
+extern ssize_t html_ntxt(const char *txt, size_t len);
+extern void html_attr(const char *txt);
+extern void html_url_path(const char *txt);
+extern void html_url_arg(const char *txt);
+extern void html_header_arg_in_quotes(const char *txt);
+extern void html_hidden(const char *name, const char *value);
+extern void html_option(const char *value, const char *text, const char *selected_value);
+extern void html_intoption(int value, const char *text, int selected_value);
+extern void html_link_open(const char *url, const char *title, const char *class);
+extern void html_link_close(void);
+extern void html_fileperm(unsigned short mode);
+extern int html_include(const char *filename);
+
+extern void http_parse_querystring(const char *txt, void (*fn)(const char *name, const char *value));
+
+#endif /* HTML_H */
diff --git a/third_party/cgit/parsing.c b/third_party/cgit/parsing.c
new file mode 100644
index 0000000000..7b3980e6b1
--- /dev/null
+++ b/third_party/cgit/parsing.c
@@ -0,0 +1,224 @@
+/* parsing.c: parsing of config files
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+
+/*
+ * url syntax: [repo ['/' cmd [ '/' path]]]
+ *   repo: any valid repo url, may contain '/'
+ *   cmd:  log | commit | diff | tree | view | blob | snapshot
+ *   path: any valid path, may contain '/'
+ *
+ */
+void cgit_parse_url(const char *url)
+{
+	char *c, *cmd, *p;
+	struct cgit_repo *repo;
+
+	if (!url || url[0] == '\0')
+		return;
+
+	ctx.qry.page = NULL;
+	ctx.repo = cgit_get_repoinfo(url);
+	if (ctx.repo) {
+		ctx.qry.repo = ctx.repo->url;
+		return;
+	}
+
+	cmd = NULL;
+	c = strchr(url, '/');
+	while (c) {
+		c[0] = '\0';
+		repo = cgit_get_repoinfo(url);
+		if (repo) {
+			ctx.repo = repo;
+			cmd = c;
+		}
+		c[0] = '/';
+		c = strchr(c + 1, '/');
+	}
+
+	if (ctx.repo) {
+		ctx.qry.repo = ctx.repo->url;
+		p = strchr(cmd + 1, '/');
+		if (p) {
+			p[0] = '\0';
+			if (p[1])
+				ctx.qry.path = trim_end(p + 1, '/');
+		}
+		if (cmd[1])
+			ctx.qry.page = xstrdup(cmd + 1);
+	}
+}
+
+static char *substr(const char *head, const char *tail)
+{
+	char *buf;
+
+	if (tail < head)
+		return xstrdup("");
+	buf = xmalloc(tail - head + 1);
+	strlcpy(buf, head, tail - head + 1);
+	return buf;
+}
+
+static void parse_user(const char *t, char **name, char **email, unsigned long *date, int *tz)
+{
+	struct ident_split ident;
+	unsigned email_len;
+
+	if (!split_ident_line(&ident, t, strchrnul(t, '\n') - t)) {
+		*name = substr(ident.name_begin, ident.name_end);
+
+		email_len = ident.mail_end - ident.mail_begin;
+		*email = xmalloc(strlen("<") + email_len + strlen(">") + 1);
+		xsnprintf(*email, email_len + 3, "<%.*s>", email_len, ident.mail_begin);
+
+		if (ident.date_begin)
+			*date = strtoul(ident.date_begin, NULL, 10);
+		if (ident.tz_begin)
+			*tz = atoi(ident.tz_begin);
+	}
+}
+
+#ifdef NO_ICONV
+#define reencode(a, b, c)
+#else
+static const char *reencode(char **txt, const char *src_enc, const char *dst_enc)
+{
+	char *tmp;
+
+	if (!txt)
+		return NULL;
+
+	if (!*txt || !src_enc || !dst_enc)
+		return *txt;
+
+	/* no encoding needed if src_enc equals dst_enc */
+	if (!strcasecmp(src_enc, dst_enc))
+		return *txt;
+
+	tmp = reencode_string(*txt, dst_enc, src_enc);
+	if (tmp) {
+		free(*txt);
+		*txt = tmp;
+	}
+	return *txt;
+}
+#endif
+
+static const char *next_header_line(const char *p)
+{
+	p = strchr(p, '\n');
+	if (!p)
+		return NULL;
+	return p + 1;
+}
+
+static int end_of_header(const char *p)
+{
+	return !p || (*p == '\n');
+}
+
+struct commitinfo *cgit_parse_commit(struct commit *commit)
+{
+	const int sha1hex_len = 40;
+	struct commitinfo *ret;
+	const char *p = get_cached_commit_buffer(the_repository, commit, NULL);
+	const char *t;
+
+	ret = xcalloc(1, sizeof(struct commitinfo));
+	ret->commit = commit;
+
+	if (!p)
+		return ret;
+
+	if (!skip_prefix(p, "tree ", &p))
+		die("Bad commit: %s", oid_to_hex(&commit->object.oid));
+	p += sha1hex_len + 1;
+
+	while (skip_prefix(p, "parent ", &p))
+		p += sha1hex_len + 1;
+
+	if (p && skip_prefix(p, "author ", &p)) {
+		parse_user(p, &ret->author, &ret->author_email,
+			&ret->author_date, &ret->author_tz);
+		p = next_header_line(p);
+	}
+
+	if (p && skip_prefix(p, "committer ", &p)) {
+		parse_user(p, &ret->committer, &ret->committer_email,
+			&ret->committer_date, &ret->committer_tz);
+		p = next_header_line(p);
+	}
+
+	if (p && skip_prefix(p, "encoding ", &p)) {
+		t = strchr(p, '\n');
+		if (t) {
+			ret->msg_encoding = substr(p, t + 1);
+			p = t + 1;
+		}
+	}
+
+	if (!ret->msg_encoding)
+		ret->msg_encoding = xstrdup("UTF-8");
+
+	while (!end_of_header(p))
+		p = next_header_line(p);
+	while (p && *p == '\n')
+		p++;
+	if (!p)
+		return ret;
+
+	t = strchrnul(p, '\n');
+	ret->subject = substr(p, t);
+	while (*t == '\n')
+		t++;
+	ret->msg = xstrdup(t);
+
+	reencode(&ret->author, ret->msg_encoding, PAGE_ENCODING);
+	reencode(&ret->author_email, ret->msg_encoding, PAGE_ENCODING);
+	reencode(&ret->committer, ret->msg_encoding, PAGE_ENCODING);
+	reencode(&ret->committer_email, ret->msg_encoding, PAGE_ENCODING);
+	reencode(&ret->subject, ret->msg_encoding, PAGE_ENCODING);
+	reencode(&ret->msg, ret->msg_encoding, PAGE_ENCODING);
+
+	return ret;
+}
+
+struct taginfo *cgit_parse_tag(struct tag *tag)
+{
+	void *data;
+	enum object_type type;
+	unsigned long size;
+	const char *p;
+	struct taginfo *ret = NULL;
+
+	data = read_object_file(&tag->object.oid, &type, &size);
+	if (!data || type != OBJ_TAG)
+		goto cleanup;
+
+	ret = xcalloc(1, sizeof(struct taginfo));
+
+	for (p = data; !end_of_header(p); p = next_header_line(p)) {
+		if (skip_prefix(p, "tagger ", &p)) {
+			parse_user(p, &ret->tagger, &ret->tagger_email,
+				&ret->tagger_date, &ret->tagger_tz);
+		}
+	}
+
+	while (p && *p == '\n')
+		p++;
+
+	if (p && *p)
+		ret->msg = xstrdup(p);
+
+cleanup:
+	free(data);
+	return ret;
+}
diff --git a/third_party/cgit/robots.txt b/third_party/cgit/robots.txt
new file mode 100644
index 0000000000..4ce948fec2
--- /dev/null
+++ b/third_party/cgit/robots.txt
@@ -0,0 +1,3 @@
+User-agent: *
+Disallow: /*/snapshot/*
+Allow: /
diff --git a/third_party/cgit/scan-tree.c b/third_party/cgit/scan-tree.c
new file mode 100644
index 0000000000..6a2f65a86b
--- /dev/null
+++ b/third_party/cgit/scan-tree.c
@@ -0,0 +1,270 @@
+/* scan-tree.c
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "scan-tree.h"
+#include "configfile.h"
+#include "html.h"
+#include <config.h>
+
+/* return 1 if path contains a objects/ directory and a HEAD file */
+static int is_git_dir(const char *path)
+{
+	struct stat st;
+	struct strbuf pathbuf = STRBUF_INIT;
+	int result = 0;
+
+	strbuf_addf(&pathbuf, "%s/objects", path);
+	if (stat(pathbuf.buf, &st)) {
+		if (errno != ENOENT)
+			fprintf(stderr, "Error checking path %s: %s (%d)\n",
+				path, strerror(errno), errno);
+		goto out;
+	}
+	if (!S_ISDIR(st.st_mode))
+		goto out;
+
+	strbuf_reset(&pathbuf);
+	strbuf_addf(&pathbuf, "%s/HEAD", path);
+	if (stat(pathbuf.buf, &st)) {
+		if (errno != ENOENT)
+			fprintf(stderr, "Error checking path %s: %s (%d)\n",
+				path, strerror(errno), errno);
+		goto out;
+	}
+	if (!S_ISREG(st.st_mode))
+		goto out;
+
+	result = 1;
+out:
+	strbuf_release(&pathbuf);
+	return result;
+}
+
+static struct cgit_repo *repo;
+static repo_config_fn config_fn;
+
+static void scan_tree_repo_config(const char *name, const char *value)
+{
+	config_fn(repo, name, value);
+}
+
+static int gitconfig_config(const char *key, const char *value, void *cb)
+{
+	const char *name;
+
+	if (!strcmp(key, "gitweb.owner"))
+		config_fn(repo, "owner", value);
+	else if (!strcmp(key, "gitweb.description"))
+		config_fn(repo, "desc", value);
+	else if (!strcmp(key, "gitweb.category"))
+		config_fn(repo, "section", value);
+	else if (!strcmp(key, "gitweb.homepage"))
+		config_fn(repo, "homepage", value);
+	else if (skip_prefix(key, "cgit.", &name))
+		config_fn(repo, name, value);
+
+	return 0;
+}
+
+static char *xstrrchr(char *s, char *from, int c)
+{
+	while (from >= s && *from != c)
+		from--;
+	return from < s ? NULL : from;
+}
+
+static void add_repo(const char *base, struct strbuf *path, repo_config_fn fn)
+{
+	struct stat st;
+	struct passwd *pwd;
+	size_t pathlen;
+	struct strbuf rel = STRBUF_INIT;
+	char *p, *slash;
+	int n;
+	size_t size;
+
+	if (stat(path->buf, &st)) {
+		fprintf(stderr, "Error accessing %s: %s (%d)\n",
+			path->buf, strerror(errno), errno);
+		return;
+	}
+
+	strbuf_addch(path, '/');
+	pathlen = path->len;
+
+	if (ctx.cfg.strict_export) {
+		strbuf_addstr(path, ctx.cfg.strict_export);
+		if(stat(path->buf, &st))
+			return;
+		strbuf_setlen(path, pathlen);
+	}
+
+	strbuf_addstr(path, "noweb");
+	if (!stat(path->buf, &st))
+		return;
+	strbuf_setlen(path, pathlen);
+
+	if (!starts_with(path->buf, base))
+		strbuf_addbuf(&rel, path);
+	else
+		strbuf_addstr(&rel, path->buf + strlen(base) + 1);
+
+	if (!strcmp(rel.buf + rel.len - 5, "/.git"))
+		strbuf_setlen(&rel, rel.len - 5);
+	else if (rel.len && rel.buf[rel.len - 1] == '/')
+		strbuf_setlen(&rel, rel.len - 1);
+
+	repo = cgit_add_repo(rel.buf);
+	config_fn = fn;
+	if (ctx.cfg.enable_git_config) {
+		strbuf_addstr(path, "config");
+		git_config_from_file(gitconfig_config, path->buf, NULL);
+		strbuf_setlen(path, pathlen);
+	}
+
+	if (ctx.cfg.remove_suffix) {
+		size_t urllen;
+		strip_suffix(repo->url, ".git", &urllen);
+		strip_suffix_mem(repo->url, &urllen, "/");
+		repo->url[urllen] = '\0';
+	}
+	repo->path = xstrdup(path->buf);
+	while (!repo->owner) {
+		if ((pwd = getpwuid(st.st_uid)) == NULL) {
+			fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n",
+				path->buf, strerror(errno), errno);
+			break;
+		}
+		if (pwd->pw_gecos)
+			if ((p = strchr(pwd->pw_gecos, ',')))
+				*p = '\0';
+		repo->owner = xstrdup(pwd->pw_gecos ? pwd->pw_gecos : pwd->pw_name);
+	}
+
+	if (repo->desc == cgit_default_repo_desc || !repo->desc) {
+		strbuf_addstr(path, "description");
+		if (!stat(path->buf, &st))
+			readfile(path->buf, &repo->desc, &size);
+		strbuf_setlen(path, pathlen);
+	}
+
+	if (ctx.cfg.section_from_path) {
+		n = ctx.cfg.section_from_path;
+		if (n > 0) {
+			slash = rel.buf - 1;
+			while (slash && n && (slash = strchr(slash + 1, '/')))
+				n--;
+		} else {
+			slash = rel.buf + rel.len;
+			while (slash && n && (slash = xstrrchr(rel.buf, slash - 1, '/')))
+				n++;
+		}
+		if (slash && !n) {
+			*slash = '\0';
+			repo->section = xstrdup(rel.buf);
+			*slash = '/';
+			if (starts_with(repo->name, repo->section)) {
+				repo->name += strlen(repo->section);
+				if (*repo->name == '/')
+					repo->name++;
+			}
+		}
+	}
+
+	strbuf_addstr(path, "cgitrc");
+	if (!stat(path->buf, &st))
+		parse_configfile(path->buf, &scan_tree_repo_config);
+
+	strbuf_release(&rel);
+}
+
+static void scan_path(const char *base, const char *path, repo_config_fn fn)
+{
+	DIR *dir = opendir(path);
+	struct dirent *ent;
+	struct strbuf pathbuf = STRBUF_INIT;
+	size_t pathlen = strlen(path);
+	struct stat st;
+
+	if (!dir) {
+		fprintf(stderr, "Error opening directory %s: %s (%d)\n",
+			path, strerror(errno), errno);
+		return;
+	}
+
+	strbuf_add(&pathbuf, path, strlen(path));
+	if (is_git_dir(pathbuf.buf)) {
+		add_repo(base, &pathbuf, fn);
+		goto end;
+	}
+	strbuf_addstr(&pathbuf, "/.git");
+	if (is_git_dir(pathbuf.buf)) {
+		add_repo(base, &pathbuf, fn);
+		goto end;
+	}
+	/*
+	 * Add one because we don't want to lose the trailing '/' when we
+	 * reset the length of pathbuf in the loop below.
+	 */
+	pathlen++;
+	while ((ent = readdir(dir)) != NULL) {
+		if (ent->d_name[0] == '.') {
+			if (ent->d_name[1] == '\0')
+				continue;
+			if (ent->d_name[1] == '.' && ent->d_name[2] == '\0')
+				continue;
+			if (!ctx.cfg.scan_hidden_path)
+				continue;
+		}
+		strbuf_setlen(&pathbuf, pathlen);
+		strbuf_addstr(&pathbuf, ent->d_name);
+		if (stat(pathbuf.buf, &st)) {
+			fprintf(stderr, "Error checking path %s: %s (%d)\n",
+				pathbuf.buf, strerror(errno), errno);
+			continue;
+		}
+		if (S_ISDIR(st.st_mode))
+			scan_path(base, pathbuf.buf, fn);
+	}
+end:
+	strbuf_release(&pathbuf);
+	closedir(dir);
+}
+
+void scan_projects(const char *path, const char *projectsfile, repo_config_fn fn)
+{
+	struct strbuf line = STRBUF_INIT;
+	FILE *projects;
+	int err;
+
+	projects = fopen(projectsfile, "r");
+	if (!projects) {
+		fprintf(stderr, "Error opening projectsfile %s: %s (%d)\n",
+			projectsfile, strerror(errno), errno);
+		return;
+	}
+	while (strbuf_getline(&line, projects) != EOF) {
+		if (!line.len)
+			continue;
+		strbuf_insert(&line, 0, "/", 1);
+		strbuf_insert(&line, 0, path, strlen(path));
+		scan_path(path, line.buf, fn);
+	}
+	if ((err = ferror(projects))) {
+		fprintf(stderr, "Error reading from projectsfile %s: %s (%d)\n",
+			projectsfile, strerror(err), err);
+	}
+	fclose(projects);
+	strbuf_release(&line);
+}
+
+void scan_tree(const char *path, repo_config_fn fn)
+{
+	scan_path(path, path, fn);
+}
diff --git a/third_party/cgit/scan-tree.h b/third_party/cgit/scan-tree.h
new file mode 100644
index 0000000000..1afbd4bbcd
--- /dev/null
+++ b/third_party/cgit/scan-tree.h
@@ -0,0 +1,2 @@
+extern void scan_projects(const char *path, const char *projectsfile, repo_config_fn fn);
+extern void scan_tree(const char *path, repo_config_fn fn);
diff --git a/third_party/cgit/shared.c b/third_party/cgit/shared.c
new file mode 100644
index 0000000000..8115469a7c
--- /dev/null
+++ b/third_party/cgit/shared.c
@@ -0,0 +1,579 @@
+/* shared.c: global vars + some callback functions
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+
+struct cgit_repolist cgit_repolist;
+struct cgit_context ctx;
+
+int chk_zero(int result, char *msg)
+{
+	if (result != 0)
+		die_errno("%s", msg);
+	return result;
+}
+
+int chk_positive(int result, char *msg)
+{
+	if (result <= 0)
+		die_errno("%s", msg);
+	return result;
+}
+
+int chk_non_negative(int result, char *msg)
+{
+	if (result < 0)
+		die_errno("%s", msg);
+	return result;
+}
+
+char *cgit_default_repo_desc = "[no description]";
+struct cgit_repo *cgit_add_repo(const char *url)
+{
+	struct cgit_repo *ret;
+
+	if (++cgit_repolist.count > cgit_repolist.length) {
+		if (cgit_repolist.length == 0)
+			cgit_repolist.length = 8;
+		else
+			cgit_repolist.length *= 2;
+		cgit_repolist.repos = xrealloc(cgit_repolist.repos,
+					       cgit_repolist.length *
+					       sizeof(struct cgit_repo));
+	}
+
+	ret = &cgit_repolist.repos[cgit_repolist.count-1];
+	memset(ret, 0, sizeof(struct cgit_repo));
+	ret->url = trim_end(url, '/');
+	ret->name = ret->url;
+	ret->path = NULL;
+	ret->desc = cgit_default_repo_desc;
+	ret->extra_head_content = NULL;
+	ret->owner = NULL;
+	ret->homepage = NULL;
+	ret->section = ctx.cfg.section;
+	ret->snapshots = ctx.cfg.snapshots;
+	ret->enable_blame = ctx.cfg.enable_blame;
+	ret->enable_commit_graph = ctx.cfg.enable_commit_graph;
+	ret->enable_log_filecount = ctx.cfg.enable_log_filecount;
+	ret->enable_log_linecount = ctx.cfg.enable_log_linecount;
+	ret->enable_remote_branches = ctx.cfg.enable_remote_branches;
+	ret->enable_subject_links = ctx.cfg.enable_subject_links;
+	ret->enable_html_serving = ctx.cfg.enable_html_serving;
+	ret->max_stats = ctx.cfg.max_stats;
+	ret->branch_sort = ctx.cfg.branch_sort;
+	ret->commit_sort = ctx.cfg.commit_sort;
+	ret->module_link = ctx.cfg.module_link;
+	ret->readme = ctx.cfg.readme;
+	ret->mtime = -1;
+	ret->about_filter = ctx.cfg.about_filter;
+	ret->commit_filter = ctx.cfg.commit_filter;
+	ret->source_filter = ctx.cfg.source_filter;
+	ret->email_filter = ctx.cfg.email_filter;
+	ret->owner_filter = ctx.cfg.owner_filter;
+	ret->clone_url = ctx.cfg.clone_url;
+	ret->submodules.strdup_strings = 1;
+	ret->hide = ret->ignore = 0;
+	return ret;
+}
+
+struct cgit_repo *cgit_get_repoinfo(const char *url)
+{
+	int i;
+	struct cgit_repo *repo;
+
+	for (i = 0; i < cgit_repolist.count; i++) {
+		repo = &cgit_repolist.repos[i];
+		if (repo->ignore)
+			continue;
+		if (!strcmp(repo->url, url))
+			return repo;
+	}
+	return NULL;
+}
+
+void cgit_free_commitinfo(struct commitinfo *info)
+{
+	free(info->author);
+	free(info->author_email);
+	free(info->committer);
+	free(info->committer_email);
+	free(info->subject);
+	free(info->msg);
+	free(info->msg_encoding);
+	free(info);
+}
+
+char *trim_end(const char *str, char c)
+{
+	int len;
+
+	if (str == NULL)
+		return NULL;
+	len = strlen(str);
+	while (len > 0 && str[len - 1] == c)
+		len--;
+	if (len == 0)
+		return NULL;
+	return xstrndup(str, len);
+}
+
+char *ensure_end(const char *str, char c)
+{
+	size_t len = strlen(str);
+	char *result;
+
+	if (len && str[len - 1] == c)
+		return xstrndup(str, len);
+
+	result = xmalloc(len + 2);
+	memcpy(result, str, len);
+	result[len] = '/';
+	result[len + 1] = '\0';
+	return result;
+}
+
+void strbuf_ensure_end(struct strbuf *sb, char c)
+{
+	if (!sb->len || sb->buf[sb->len - 1] != c)
+		strbuf_addch(sb, c);
+}
+
+void cgit_add_ref(struct reflist *list, struct refinfo *ref)
+{
+	size_t size;
+
+	if (list->count >= list->alloc) {
+		list->alloc += (list->alloc ? list->alloc : 4);
+		size = list->alloc * sizeof(struct refinfo *);
+		list->refs = xrealloc(list->refs, size);
+	}
+	list->refs[list->count++] = ref;
+}
+
+static struct refinfo *cgit_mk_refinfo(const char *refname, const struct object_id *oid)
+{
+	struct refinfo *ref;
+
+	ref = xmalloc(sizeof (struct refinfo));
+	ref->refname = xstrdup(refname);
+	ref->object = parse_object(the_repository, oid);
+	switch (ref->object->type) {
+	case OBJ_TAG:
+		ref->tag = cgit_parse_tag((struct tag *)ref->object);
+		break;
+	case OBJ_COMMIT:
+		ref->commit = cgit_parse_commit((struct commit *)ref->object);
+		break;
+	}
+	return ref;
+}
+
+void cgit_free_taginfo(struct taginfo *tag)
+{
+	if (tag->tagger)
+		free(tag->tagger);
+	if (tag->tagger_email)
+		free(tag->tagger_email);
+	if (tag->msg)
+		free(tag->msg);
+	free(tag);
+}
+
+static void cgit_free_refinfo(struct refinfo *ref)
+{
+	if (ref->refname)
+		free((char *)ref->refname);
+	switch (ref->object->type) {
+	case OBJ_TAG:
+		cgit_free_taginfo(ref->tag);
+		break;
+	case OBJ_COMMIT:
+		cgit_free_commitinfo(ref->commit);
+		break;
+	}
+	free(ref);
+}
+
+void cgit_free_reflist_inner(struct reflist *list)
+{
+	int i;
+
+	for (i = 0; i < list->count; i++) {
+		cgit_free_refinfo(list->refs[i]);
+	}
+	free(list->refs);
+}
+
+int cgit_refs_cb(const char *refname, const struct object_id *oid, int flags,
+		  void *cb_data)
+{
+	struct reflist *list = (struct reflist *)cb_data;
+	struct refinfo *info = cgit_mk_refinfo(refname, oid);
+
+	if (info)
+		cgit_add_ref(list, info);
+	return 0;
+}
+
+void cgit_diff_tree_cb(struct diff_queue_struct *q,
+		       struct diff_options *options, void *data)
+{
+	int i;
+
+	for (i = 0; i < q->nr; i++) {
+		if (q->queue[i]->status == 'U')
+			continue;
+		((filepair_fn)data)(q->queue[i]);
+	}
+}
+
+static int load_mmfile(mmfile_t *file, const struct object_id *oid)
+{
+	enum object_type type;
+
+	if (is_null_oid(oid)) {
+		file->ptr = (char *)"";
+		file->size = 0;
+	} else {
+		file->ptr = read_object_file(oid, &type,
+		                           (unsigned long *)&file->size);
+	}
+	return 1;
+}
+
+/*
+ * Receive diff-buffers from xdiff and concatenate them as
+ * needed across multiple callbacks.
+ *
+ * This is basically a copy of xdiff-interface.c/xdiff_outf(),
+ * ripped from git and modified to use globals instead of
+ * a special callback-struct.
+ */
+static char *diffbuf = NULL;
+static int buflen = 0;
+
+static int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf)
+{
+	int i;
+
+	for (i = 0; i < nbuf; i++) {
+		if (mb[i].ptr[mb[i].size-1] != '\n') {
+			/* Incomplete line */
+			diffbuf = xrealloc(diffbuf, buflen + mb[i].size);
+			memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size);
+			buflen += mb[i].size;
+			continue;
+		}
+
+		/* we have a complete line */
+		if (!diffbuf) {
+			((linediff_fn)priv)(mb[i].ptr, mb[i].size);
+			continue;
+		}
+		diffbuf = xrealloc(diffbuf, buflen + mb[i].size);
+		memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size);
+		((linediff_fn)priv)(diffbuf, buflen + mb[i].size);
+		free(diffbuf);
+		diffbuf = NULL;
+		buflen = 0;
+	}
+	if (diffbuf) {
+		((linediff_fn)priv)(diffbuf, buflen);
+		free(diffbuf);
+		diffbuf = NULL;
+		buflen = 0;
+	}
+	return 0;
+}
+
+int cgit_diff_files(const struct object_id *old_oid,
+		    const struct object_id *new_oid, unsigned long *old_size,
+		    unsigned long *new_size, int *binary, int context,
+		    int ignorews, linediff_fn fn)
+{
+	mmfile_t file1, file2;
+	xpparam_t diff_params;
+	xdemitconf_t emit_params;
+	xdemitcb_t emit_cb;
+
+	if (!load_mmfile(&file1, old_oid) || !load_mmfile(&file2, new_oid))
+		return 1;
+
+	*old_size = file1.size;
+	*new_size = file2.size;
+
+	if ((file1.ptr && buffer_is_binary(file1.ptr, file1.size)) ||
+	    (file2.ptr && buffer_is_binary(file2.ptr, file2.size))) {
+		*binary = 1;
+		if (file1.size)
+			free(file1.ptr);
+		if (file2.size)
+			free(file2.ptr);
+		return 0;
+	}
+
+	memset(&diff_params, 0, sizeof(diff_params));
+	memset(&emit_params, 0, sizeof(emit_params));
+	memset(&emit_cb, 0, sizeof(emit_cb));
+	diff_params.flags = XDF_NEED_MINIMAL;
+	if (ignorews)
+		diff_params.flags |= XDF_IGNORE_WHITESPACE;
+	emit_params.ctxlen = context > 0 ? context : 3;
+	emit_params.flags = XDL_EMIT_FUNCNAMES;
+	emit_cb.out_line = filediff_cb;
+	emit_cb.priv = fn;
+	xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb);
+	if (file1.size)
+		free(file1.ptr);
+	if (file2.size)
+		free(file2.ptr);
+	return 0;
+}
+
+void cgit_diff_tree(const struct object_id *old_oid,
+		    const struct object_id *new_oid,
+		    filepair_fn fn, const char *prefix, int ignorews)
+{
+	struct diff_options opt;
+	struct pathspec_item item;
+
+	memset(&item, 0, sizeof(item));
+	diff_setup(&opt);
+	opt.output_format = DIFF_FORMAT_CALLBACK;
+	opt.detect_rename = 1;
+	opt.rename_limit = ctx.cfg.renamelimit;
+	opt.flags.recursive = 1;
+	if (ignorews)
+		DIFF_XDL_SET(&opt, IGNORE_WHITESPACE);
+	opt.format_callback = cgit_diff_tree_cb;
+	opt.format_callback_data = fn;
+	if (prefix) {
+		item.match = xstrdup(prefix);
+		item.len = strlen(prefix);
+		opt.pathspec.nr = 1;
+		opt.pathspec.items = &item;
+	}
+	diff_setup_done(&opt);
+
+	if (old_oid && !is_null_oid(old_oid))
+		diff_tree_oid(old_oid, new_oid, "", &opt);
+	else
+		diff_root_tree_oid(new_oid, "", &opt);
+	diffcore_std(&opt);
+	diff_flush(&opt);
+
+	free(item.match);
+}
+
+void cgit_diff_commit(struct commit *commit, filepair_fn fn, const char *prefix)
+{
+	const struct object_id *old_oid = NULL;
+
+	if (commit->parents)
+		old_oid = &commit->parents->item->object.oid;
+	cgit_diff_tree(old_oid, &commit->object.oid, fn, prefix,
+		       ctx.qry.ignorews);
+}
+
+int cgit_parse_snapshots_mask(const char *str)
+{
+	struct string_list tokens = STRING_LIST_INIT_DUP;
+	struct string_list_item *item;
+	const struct cgit_snapshot_format *f;
+	int rv = 0;
+
+	/* favor legacy setting */
+	if (atoi(str))
+		return 1;
+
+	if (strcmp(str, "all") == 0)
+		return INT_MAX;
+
+	string_list_split(&tokens, str, ' ', -1);
+	string_list_remove_empty_items(&tokens, 0);
+
+	for_each_string_list_item(item, &tokens) {
+		for (f = cgit_snapshot_formats; f->suffix; f++) {
+			if (!strcmp(item->string, f->suffix) ||
+			    !strcmp(item->string, f->suffix + 1)) {
+				rv |= cgit_snapshot_format_bit(f);
+				break;
+			}
+		}
+	}
+
+	string_list_clear(&tokens, 0);
+	return rv;
+}
+
+typedef struct {
+	char * name;
+	char * value;
+} cgit_env_var;
+
+void cgit_prepare_repo_env(struct cgit_repo * repo)
+{
+	cgit_env_var env_vars[] = {
+		{ .name = "CGIT_REPO_URL", .value = repo->url },
+		{ .name = "CGIT_REPO_NAME", .value = repo->name },
+		{ .name = "CGIT_REPO_PATH", .value = repo->path },
+		{ .name = "CGIT_REPO_OWNER", .value = repo->owner },
+		{ .name = "CGIT_REPO_DEFBRANCH", .value = repo->defbranch },
+		{ .name = "CGIT_REPO_SECTION", .value = repo->section },
+		{ .name = "CGIT_REPO_CLONE_URL", .value = repo->clone_url }
+	};
+	int env_var_count = ARRAY_SIZE(env_vars);
+	cgit_env_var *p, *q;
+	static char *warn = "cgit warning: failed to set env: %s=%s\n";
+
+	p = env_vars;
+	q = p + env_var_count;
+	for (; p < q; p++)
+		if (p->value && setenv(p->name, p->value, 1))
+			fprintf(stderr, warn, p->name, p->value);
+}
+
+/* Read the content of the specified file into a newly allocated buffer,
+ * zeroterminate the buffer and return 0 on success, errno otherwise.
+ */
+int readfile(const char *path, char **buf, size_t *size)
+{
+	int fd, e;
+	struct stat st;
+
+	fd = open(path, O_RDONLY);
+	if (fd == -1)
+		return errno;
+	if (fstat(fd, &st)) {
+		e = errno;
+		close(fd);
+		return e;
+	}
+	if (!S_ISREG(st.st_mode)) {
+		close(fd);
+		return EISDIR;
+	}
+	*buf = xmalloc(st.st_size + 1);
+	*size = read_in_full(fd, *buf, st.st_size);
+	e = errno;
+	(*buf)[*size] = '\0';
+	close(fd);
+	return (*size == st.st_size ? 0 : e);
+}
+
+static int is_token_char(char c)
+{
+	return isalnum(c) || c == '_';
+}
+
+/* Replace name with getenv(name), return pointer to zero-terminating char
+ */
+static char *expand_macro(char *name, int maxlength)
+{
+	char *value;
+	size_t len;
+
+	len = 0;
+	value = getenv(name);
+	if (value) {
+		len = strlen(value) + 1;
+		if (len > maxlength)
+			len = maxlength;
+		strlcpy(name, value, len);
+		--len;
+	}
+	return name + len;
+}
+
+#define EXPBUFSIZE (1024 * 8)
+
+/* Replace all tokens prefixed by '$' in the specified text with the
+ * value of the named environment variable.
+ * NB: the return value is a static buffer, i.e. it must be strdup'd
+ * by the caller.
+ */
+char *expand_macros(const char *txt)
+{
+	static char result[EXPBUFSIZE];
+	char *p, *start;
+	int len;
+
+	p = result;
+	start = NULL;
+	while (p < result + EXPBUFSIZE - 1 && txt && *txt) {
+		*p = *txt;
+		if (start) {
+			if (!is_token_char(*txt)) {
+				if (p - start > 0) {
+					*p = '\0';
+					len = result + EXPBUFSIZE - start - 1;
+					p = expand_macro(start, len) - 1;
+				}
+				start = NULL;
+				txt--;
+			}
+			p++;
+			txt++;
+			continue;
+		}
+		if (*txt == '$') {
+			start = p;
+			txt++;
+			continue;
+		}
+		p++;
+		txt++;
+	}
+	*p = '\0';
+	if (start && p - start > 0) {
+		len = result + EXPBUFSIZE - start - 1;
+		p = expand_macro(start, len);
+		*p = '\0';
+	}
+	return result;
+}
+
+char *get_mimetype_for_filename(const char *filename)
+{
+	char *ext, *mimetype, *token, line[1024], *saveptr;
+	FILE *file;
+	struct string_list_item *mime;
+
+	if (!filename)
+		return NULL;
+
+	ext = strrchr(filename, '.');
+	if (!ext)
+		return NULL;
+	++ext;
+	if (!ext[0])
+		return NULL;
+	mime = string_list_lookup(&ctx.cfg.mimetypes, ext);
+	if (mime)
+		return xstrdup(mime->util);
+
+	if (!ctx.cfg.mimetype_file)
+		return NULL;
+	file = fopen(ctx.cfg.mimetype_file, "r");
+	if (!file)
+		return NULL;
+	while (fgets(line, sizeof(line), file)) {
+		if (!line[0] || line[0] == '#')
+			continue;
+		mimetype = strtok_r(line, " \t\r\n", &saveptr);
+		while ((token = strtok_r(NULL, " \t\r\n", &saveptr))) {
+			if (!strcasecmp(ext, token)) {
+				fclose(file);
+				return xstrdup(mimetype);
+			}
+		}
+	}
+	fclose(file);
+	return NULL;
+}
diff --git a/third_party/cgit/tests/.gitignore b/third_party/cgit/tests/.gitignore
new file mode 100644
index 0000000000..3fd2e965c8
--- /dev/null
+++ b/third_party/cgit/tests/.gitignore
@@ -0,0 +1,2 @@
+trash\ directory.t*
+test-results
diff --git a/third_party/cgit/tests/Makefile b/third_party/cgit/tests/Makefile
new file mode 100644
index 0000000000..65e1117338
--- /dev/null
+++ b/third_party/cgit/tests/Makefile
@@ -0,0 +1,17 @@
+include ../git/config.mak.uname
+-include ../cgit.conf
+
+SHELL_PATH ?= $(SHELL)
+SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
+
+T = $(wildcard t[0-9][0-9][0-9][0-9]-*.sh)
+
+all: $(T)
+
+$(T):
+	@'$(SHELL_PATH_SQ)' $@ $(CGIT_TEST_OPTS)
+
+clean:
+	$(RM) -rf trash
+
+.PHONY: $(T) clean
diff --git a/third_party/cgit/tests/filters/dump.lua b/third_party/cgit/tests/filters/dump.lua
new file mode 100644
index 0000000000..1f15c93105
--- /dev/null
+++ b/third_party/cgit/tests/filters/dump.lua
@@ -0,0 +1,17 @@
+function filter_open(...)
+	buffer = ""
+	for i = 1, select("#", ...) do
+		buffer = buffer .. select(i, ...) .. " "
+	end
+end
+
+function filter_close()
+	html(buffer)
+	return 0
+end
+
+function filter_write(str)
+	buffer = buffer .. string.upper(str)
+end
+
+
diff --git a/third_party/cgit/tests/filters/dump.sh b/third_party/cgit/tests/filters/dump.sh
new file mode 100755
index 0000000000..da6f7a1b18
--- /dev/null
+++ b/third_party/cgit/tests/filters/dump.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+[ "$#" -gt 0 ] && printf "%s " "$*"
+tr '[:lower:]' '[:upper:]'
diff --git a/third_party/cgit/tests/setup.sh b/third_party/cgit/tests/setup.sh
new file mode 100755
index 0000000000..7590f04944
--- /dev/null
+++ b/third_party/cgit/tests/setup.sh
@@ -0,0 +1,176 @@
+# This file should be sourced by all test-scripts
+#
+# Main functions:
+#   prepare_tests(description) - setup for testing, i.e. create repos+config
+#   run_test(description, script) - run one test, i.e. eval script
+#
+# Helper functions
+#   cgit_query(querystring) - call cgit with the specified querystring
+#   cgit_url(url) - call cgit with the specified virtual url
+#
+# Example script:
+#
+# . setup.sh
+# prepare_tests "html validation"
+# run_test 'repo index' 'cgit_url "/" | tidy -e'
+# run_test 'repo summary' 'cgit_url "/foo" | tidy -e'
+
+# We don't want to run Git commands through Valgrind, so we filter out the
+# --valgrind option here and handle it ourselves.  We copy the arguments
+# assuming that none contain a newline, although other whitespace is
+# preserved.
+LF='
+'
+test_argv=
+
+while test $# != 0
+do
+	case "$1" in
+	--va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind)
+		cgit_valgrind=t
+		test_argv="$test_argv${LF}--verbose"
+		;;
+	*)
+		test_argv="$test_argv$LF$1"
+		;;
+	esac
+	shift
+done
+
+OLDIFS=$IFS
+IFS=$LF
+set -- $test_argv
+IFS=$OLDIFS
+
+: ${TEST_DIRECTORY=$(pwd)/../git/t}
+: ${TEST_OUTPUT_DIRECTORY=$(pwd)}
+TEST_NO_CREATE_REPO=YesPlease
+. "$TEST_DIRECTORY"/test-lib.sh
+
+# Prepend the directory containing cgit to PATH.
+if test -n "$cgit_valgrind"
+then
+	GIT_VALGRIND="$TEST_DIRECTORY/valgrind"
+	CGIT_VALGRIND=$(cd ../valgrind && pwd)
+	PATH="$CGIT_VALGRIND/bin:$PATH"
+	export GIT_VALGRIND CGIT_VALGRIND
+else
+	PATH="$(pwd)/../..:$PATH"
+fi
+
+FILTER_DIRECTORY=$(cd ../filters && pwd)
+
+if cgit --version | grep -F -q "[+] Lua scripting"; then
+	export CGIT_HAS_LUA=1
+else
+	export CGIT_HAS_LUA=0
+fi
+
+mkrepo() {
+	name=$1
+	count=$2
+	test_create_repo "$name"
+	(
+		cd "$name"
+		n=1
+		while test $n -le $count
+		do
+			echo $n >file-$n
+			git add file-$n
+			git commit -m "commit $n"
+			n=$(expr $n + 1)
+		done
+		if test "$3" = "testplus"
+		then
+			echo "hello" >a+b
+			git add a+b
+			git commit -m "add a+b"
+			git branch "1+2"
+		fi
+	)
+}
+
+setup_repos()
+{
+	rm -rf cache
+	mkdir -p cache
+	mkrepo repos/foo 5 >/dev/null
+	mkrepo repos/bar 50 >/dev/null
+	mkrepo repos/foo+bar 10 testplus >/dev/null
+	mkrepo "repos/with space" 2 >/dev/null
+	mkrepo repos/filter 5 testplus >/dev/null
+	cat >cgitrc <<EOF
+virtual-root=/
+cache-root=$PWD/cache
+
+cache-size=1021
+snapshots=tar.gz tar.bz zip
+enable-log-filecount=1
+enable-log-linecount=1
+summary-log=5
+summary-branches=5
+summary-tags=5
+clone-url=git://example.org/\$CGIT_REPO_URL.git
+enable-filter-overrides=1
+
+repo.url=foo
+repo.path=$PWD/repos/foo/.git
+# Do not specify a description for this repo, as it then will be assigned
+# the constant value "[no description]" (which actually used to cause a
+# segfault).
+
+repo.url=bar
+repo.path=$PWD/repos/bar/.git
+repo.desc=the bar repo
+
+repo.url=foo+bar
+repo.path=$PWD/repos/foo+bar/.git
+repo.desc=the foo+bar repo
+
+repo.url=with space
+repo.path=$PWD/repos/with space/.git
+repo.desc=spaced repo
+
+repo.url=filter-exec
+repo.path=$PWD/repos/filter/.git
+repo.desc=filtered repo
+repo.about-filter=exec:$FILTER_DIRECTORY/dump.sh
+repo.commit-filter=exec:$FILTER_DIRECTORY/dump.sh
+repo.email-filter=exec:$FILTER_DIRECTORY/dump.sh
+repo.source-filter=exec:$FILTER_DIRECTORY/dump.sh
+repo.readme=master:a+b
+EOF
+
+	if [ $CGIT_HAS_LUA -eq 1 ]; then
+		cat >>cgitrc <<EOF
+repo.url=filter-lua
+repo.path=$PWD/repos/filter/.git
+repo.desc=filtered repo
+repo.about-filter=lua:$FILTER_DIRECTORY/dump.lua
+repo.commit-filter=lua:$FILTER_DIRECTORY/dump.lua
+repo.email-filter=lua:$FILTER_DIRECTORY/dump.lua
+repo.source-filter=lua:$FILTER_DIRECTORY/dump.lua
+repo.readme=master:a+b
+EOF
+	fi
+}
+
+cgit_query()
+{
+	CGIT_CONFIG="$PWD/cgitrc" QUERY_STRING="$1" cgit
+}
+
+cgit_url()
+{
+	CGIT_CONFIG="$PWD/cgitrc" QUERY_STRING="url=$1" cgit
+}
+
+strip_headers() {
+	while read -r line
+	do
+		test -z "$line" && break
+	done
+	cat
+}
+
+test -z "$CGIT_TEST_NO_CREATE_REPOS" && setup_repos
diff --git a/third_party/cgit/tests/t0001-validate-git-versions.sh b/third_party/cgit/tests/t0001-validate-git-versions.sh
new file mode 100755
index 0000000000..3200f31101
--- /dev/null
+++ b/third_party/cgit/tests/t0001-validate-git-versions.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+test_description='Check Git version is correct'
+CGIT_TEST_NO_CREATE_REPOS=YesPlease
+. ./setup.sh
+
+test_expect_success 'extract Git version from Makefile' '
+	sed -n -e "/^GIT_VER[ 	]*=/ {
+		s/^GIT_VER[ 	]*=[ 	]*//
+		p
+	}" ../../Makefile >makefile_version
+'
+
+# Note that Git's GIT-VERSION-GEN script applies "s/-/./g" to the version
+# string to produce the internal version in the GIT-VERSION-FILE, so we
+# must apply the same transformation to the version in the Makefile before
+# comparing them.
+test_expect_success 'test Git version matches Makefile' '
+	( cat ../../git/GIT-VERSION-FILE || echo "No GIT-VERSION-FILE" ) |
+	sed -e "s/GIT_VERSION[ 	]*=[ 	]*//" -e "s/\\.dirty$//" >git_version &&
+	sed -e "s/-/./g" makefile_version >makefile_git_version &&
+	test_cmp git_version makefile_git_version
+'
+
+test_expect_success 'test submodule version matches Makefile' '
+	if ! test -e ../../git/.git
+	then
+		echo "git/ is not a Git repository" >&2
+	else
+		(
+			cd ../.. &&
+			sm_sha1=$(git ls-files --stage -- git |
+				sed -e "s/^[0-9]* \\([0-9a-f]*\\) [0-9]	.*$/\\1/") &&
+			cd git &&
+			git describe --match "v[0-9]*" $sm_sha1
+		) | sed -e "s/^v//" -e "s/-/./" >sm_version &&
+		test_cmp sm_version makefile_version
+	fi
+'
+
+test_done
diff --git a/third_party/cgit/tests/t0010-validate-html.sh b/third_party/cgit/tests/t0010-validate-html.sh
new file mode 100755
index 0000000000..ca08d69d14
--- /dev/null
+++ b/third_party/cgit/tests/t0010-validate-html.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+test_description='Validate html with tidy'
+. ./setup.sh
+
+
+test_url()
+{
+	tidy_opt="-eq"
+	test -z "$NO_TIDY_WARNINGS" || tidy_opt+=" --show-warnings no"
+	cgit_url "$1" >tidy-$test_count.tmp || return
+	sed -e "1,4d" tidy-$test_count.tmp >tidy-$test_count || return
+	"$tidy" $tidy_opt tidy-$test_count
+	rc=$?
+
+	# tidy returns with exitcode 1 on warnings, 2 on error
+	if test $rc = 2
+	then
+		false
+	else
+		:
+	fi
+}
+
+tidy=`which tidy 2>/dev/null`
+test -n "$tidy" || {
+	skip_all='Skipping html validation tests: tidy not found'
+	test_done
+	exit
+}
+
+test_expect_success 'index page' 'test_url ""'
+test_expect_success 'foo' 'test_url "foo"'
+test_expect_success 'foo/log' 'test_url "foo/log"'
+test_expect_success 'foo/tree' 'test_url "foo/tree"'
+test_expect_success 'foo/tree/file-1' 'test_url "foo/tree/file-1"'
+test_expect_success 'foo/commit' 'test_url "foo/commit"'
+test_expect_success 'foo/diff' 'test_url "foo/diff"'
+
+test_done
diff --git a/third_party/cgit/tests/t0020-validate-cache.sh b/third_party/cgit/tests/t0020-validate-cache.sh
new file mode 100755
index 0000000000..657765d897
--- /dev/null
+++ b/third_party/cgit/tests/t0020-validate-cache.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+
+test_description='Validate cache'
+. ./setup.sh
+
+test_expect_success 'verify cache-size=0' '
+
+	rm -f cache/* &&
+	sed -e "s/cache-size=1021$/cache-size=0/" cgitrc >cgitrc.tmp &&
+	mv -f cgitrc.tmp cgitrc &&
+	cgit_url "" &&
+	cgit_url "foo" &&
+	cgit_url "foo/refs" &&
+	cgit_url "foo/tree" &&
+	cgit_url "foo/log" &&
+	cgit_url "foo/diff" &&
+	cgit_url "foo/patch" &&
+	cgit_url "bar" &&
+	cgit_url "bar/refs" &&
+	cgit_url "bar/tree" &&
+	cgit_url "bar/log" &&
+	cgit_url "bar/diff" &&
+	cgit_url "bar/patch" &&
+	ls cache >output &&
+	test_line_count = 0 output
+'
+
+test_expect_success 'verify cache-size=1' '
+
+	rm -f cache/* &&
+	sed -e "s/cache-size=0$/cache-size=1/" cgitrc >cgitrc.tmp &&
+	mv -f cgitrc.tmp cgitrc &&
+	cgit_url "" &&
+	cgit_url "foo" &&
+	cgit_url "foo/refs" &&
+	cgit_url "foo/tree" &&
+	cgit_url "foo/log" &&
+	cgit_url "foo/diff" &&
+	cgit_url "foo/patch" &&
+	cgit_url "bar" &&
+	cgit_url "bar/refs" &&
+	cgit_url "bar/tree" &&
+	cgit_url "bar/log" &&
+	cgit_url "bar/diff" &&
+	cgit_url "bar/patch" &&
+	ls cache >output &&
+	test_line_count = 1 output
+'
+
+test_expect_success 'verify cache-size=1021' '
+
+	rm -f cache/* &&
+	sed -e "s/cache-size=1$/cache-size=1021/" cgitrc >cgitrc.tmp &&
+	mv -f cgitrc.tmp cgitrc &&
+	cgit_url "" &&
+	cgit_url "foo" &&
+	cgit_url "foo/refs" &&
+	cgit_url "foo/tree" &&
+	cgit_url "foo/log" &&
+	cgit_url "foo/diff" &&
+	cgit_url "foo/patch" &&
+	cgit_url "bar" &&
+	cgit_url "bar/refs" &&
+	cgit_url "bar/tree" &&
+	cgit_url "bar/log" &&
+	cgit_url "bar/diff" &&
+	cgit_url "bar/patch" &&
+	ls cache >output &&
+	test_line_count = 13 output &&
+	cgit_url "foo/ls_cache" >output.full &&
+	strip_headers <output.full >output &&
+	test_line_count = 13 output &&
+	# Check that ls_cache output is cached correctly
+	cgit_url "foo/ls_cache" >output.second &&
+	test_cmp output.full output.second
+'
+
+test_done
diff --git a/third_party/cgit/tests/t0101-index.sh b/third_party/cgit/tests/t0101-index.sh
new file mode 100755
index 0000000000..82ef9b04e5
--- /dev/null
+++ b/third_party/cgit/tests/t0101-index.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+test_description='Check content on index page'
+. ./setup.sh
+
+test_expect_success 'generate index page' 'cgit_url "" >tmp'
+test_expect_success 'find foo repo' 'grep "foo" tmp'
+test_expect_success 'find foo description' 'grep "\[no description\]" tmp'
+test_expect_success 'find bar repo' 'grep "bar" tmp'
+test_expect_success 'find bar description' 'grep "the bar repo" tmp'
+test_expect_success 'find foo+bar repo' 'grep ">foo+bar<" tmp'
+test_expect_success 'verify foo+bar link' 'grep "/foo+bar/" tmp'
+test_expect_success 'verify "with%20space" link' 'grep "/with%20space/" tmp'
+test_expect_success 'no tree-link' '! grep "foo/tree" tmp'
+test_expect_success 'no log-link' '! grep "foo/log" tmp'
+
+test_done
diff --git a/third_party/cgit/tests/t0102-summary.sh b/third_party/cgit/tests/t0102-summary.sh
new file mode 100755
index 0000000000..b8864cb187
--- /dev/null
+++ b/third_party/cgit/tests/t0102-summary.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+test_description='Check content on summary page'
+. ./setup.sh
+
+test_expect_success 'generate foo summary' 'cgit_url "foo" >tmp'
+test_expect_success 'find commit 1' 'grep "commit 1" tmp'
+test_expect_success 'find commit 5' 'grep "commit 5" tmp'
+test_expect_success 'find branch master' 'grep "master" tmp'
+test_expect_success 'no tags' '! grep "tags" tmp'
+test_expect_success 'clone-url expanded correctly' '
+	grep "git://example.org/foo.git" tmp
+'
+
+test_expect_success 'generate bar summary' 'cgit_url "bar" >tmp'
+test_expect_success 'no commit 45' '! grep "commit 45" tmp'
+test_expect_success 'find commit 46' 'grep "commit 46" tmp'
+test_expect_success 'find commit 50' 'grep "commit 50" tmp'
+test_expect_success 'find branch master' 'grep "master" tmp'
+test_expect_success 'no tags' '! grep "tags" tmp'
+test_expect_success 'clone-url expanded correctly' '
+	grep "git://example.org/bar.git" tmp
+'
+
+test_done
diff --git a/third_party/cgit/tests/t0103-log.sh b/third_party/cgit/tests/t0103-log.sh
new file mode 100755
index 0000000000..bdf1435a16
--- /dev/null
+++ b/third_party/cgit/tests/t0103-log.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+test_description='Check content on log page'
+. ./setup.sh
+
+test_expect_success 'generate foo/log' 'cgit_url "foo/log" >tmp'
+test_expect_success 'find commit 1' 'grep "commit 1" tmp'
+test_expect_success 'find commit 5' 'grep "commit 5" tmp'
+
+test_expect_success 'generate bar/log' 'cgit_url "bar/log" >tmp'
+test_expect_success 'find commit 1' 'grep "commit 1" tmp'
+test_expect_success 'find commit 50' 'grep "commit 50" tmp'
+
+test_expect_success 'generate "with%20space/log?qt=grep&q=commit+1"' '
+	cgit_url "with+space/log&qt=grep&q=commit+1" >tmp
+'
+test_expect_success 'find commit 1' 'grep "commit 1" tmp'
+test_expect_success 'find link with %20 in path' 'grep "/with%20space/log/?qt=grep" tmp'
+test_expect_success 'find link with + in arg' 'grep "/log/?qt=grep&amp;q=commit+1" tmp'
+test_expect_success 'no links with space in path' '! grep "href=./with space/" tmp'
+test_expect_success 'no links with space in arg' '! grep "q=commit 1" tmp'
+test_expect_success 'commit 2 is not visible' '! grep "commit 2" tmp'
+
+test_done
diff --git a/third_party/cgit/tests/t0104-tree.sh b/third_party/cgit/tests/t0104-tree.sh
new file mode 100755
index 0000000000..2e140f5939
--- /dev/null
+++ b/third_party/cgit/tests/t0104-tree.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+test_description='Check content on tree page'
+. ./setup.sh
+
+test_expect_success 'generate bar/tree' 'cgit_url "bar/tree" >tmp'
+test_expect_success 'find file-1' 'grep "file-1" tmp'
+test_expect_success 'find file-50' 'grep "file-50" tmp'
+
+test_expect_success 'generate bar/tree/file-50' 'cgit_url "bar/tree/file-50" >tmp'
+
+test_expect_success 'find line 1' '
+	grep "<a id=.n1. href=.#n1.>1</a>" tmp
+'
+
+test_expect_success 'no line 2' '
+	! grep "<a id=.n2. href=.#n2.>2</a>" tmp
+'
+
+test_expect_success 'generate foo+bar/tree' 'cgit_url "foo%2bbar/tree" >tmp'
+
+test_expect_success 'verify a+b link' '
+	grep "/foo+bar/tree/a+b" tmp
+'
+
+test_expect_success 'generate foo+bar/tree?h=1+2' 'cgit_url "foo%2bbar/tree&h=1%2b2" >tmp'
+
+test_expect_success 'verify a+b?h=1+2 link' '
+	grep "/foo+bar/tree/a+b?h=1%2b2" tmp
+'
+
+test_done
diff --git a/third_party/cgit/tests/t0105-commit.sh b/third_party/cgit/tests/t0105-commit.sh
new file mode 100755
index 0000000000..9cdf55c025
--- /dev/null
+++ b/third_party/cgit/tests/t0105-commit.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+test_description='Check content on commit page'
+. ./setup.sh
+
+test_expect_success 'generate foo/commit' 'cgit_url "foo/commit" >tmp'
+test_expect_success 'find tree link' 'grep "<a href=./foo/tree/.>" tmp'
+test_expect_success 'find parent link' 'grep -E "<a href=./foo/commit/\?id=.+>" tmp'
+
+test_expect_success 'find commit subject' '
+	grep "<div class=.commit-subject.>commit 5<" tmp
+'
+
+test_expect_success 'find commit msg' 'grep "<div class=.commit-msg.></div>" tmp'
+test_expect_success 'find diffstat' 'grep "<table summary=.diffstat. class=.diffstat.>" tmp'
+
+test_expect_success 'find diff summary' '
+	grep "1 files changed, 1 insertions, 0 deletions" tmp
+'
+
+test_expect_success 'get root commit' '
+	root=$(cd repos/foo && git rev-list --reverse HEAD | head -1) &&
+	cgit_url "foo/commit&id=$root" >tmp &&
+	grep "</html>" tmp
+'
+
+test_expect_success 'root commit contains diffstat' '
+	grep "<a href=./foo/diff/file-1.id=[0-9a-f]\{40\}.>file-1</a>" tmp
+'
+
+test_expect_success 'root commit contains diff' '
+	grep ">diff --git a/file-1 b/file-1<" tmp &&
+	grep "<div class=.add.>+1</div>" tmp
+'
+
+test_done
diff --git a/third_party/cgit/tests/t0106-diff.sh b/third_party/cgit/tests/t0106-diff.sh
new file mode 100755
index 0000000000..82b645ec72
--- /dev/null
+++ b/third_party/cgit/tests/t0106-diff.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+test_description='Check content on diff page'
+. ./setup.sh
+
+test_expect_success 'generate foo/diff' 'cgit_url "foo/diff" >tmp'
+test_expect_success 'find diff header' 'grep "a/file-5 b/file-5" tmp'
+test_expect_success 'find blob link' 'grep "<a href=./foo/tree/file-5?id=" tmp'
+test_expect_success 'find added file' 'grep "new file mode 100644" tmp'
+
+test_expect_success 'find hunk header' '
+	grep "<div class=.hunk.>@@ -0,0 +1 @@</div>" tmp
+'
+
+test_expect_success 'find added line' '
+	grep "<div class=.add.>+5</div>" tmp
+'
+
+test_done
diff --git a/third_party/cgit/tests/t0107-snapshot.sh b/third_party/cgit/tests/t0107-snapshot.sh
new file mode 100755
index 0000000000..6cf7aaa6fc
--- /dev/null
+++ b/third_party/cgit/tests/t0107-snapshot.sh
@@ -0,0 +1,82 @@
+#!/bin/sh
+
+test_description='Verify snapshot'
+. ./setup.sh
+
+test_expect_success 'get foo/snapshot/master.tar.gz' '
+	cgit_url "foo/snapshot/master.tar.gz" >tmp
+'
+
+test_expect_success 'check html headers' '
+	head -n 1 tmp |
+	grep "Content-Type: application/x-gzip" &&
+
+	head -n 2 tmp |
+	grep "Content-Disposition: inline; filename=.master.tar.gz."
+'
+
+test_expect_success 'strip off the header lines' '
+	strip_headers <tmp >master.tar.gz
+'
+
+test_expect_success 'verify gzip format' '
+	gunzip --test master.tar.gz
+'
+
+test_expect_success 'untar' '
+	rm -rf master &&
+	tar -xzf master.tar.gz
+'
+
+test_expect_success 'count files' '
+	ls master/ >output &&
+	test_line_count = 5 output
+'
+
+test_expect_success 'verify untarred file-5' '
+	grep "^5$" master/file-5 &&
+	test_line_count = 1 master/file-5
+'
+
+test_expect_success 'get foo/snapshot/master.zip' '
+	cgit_url "foo/snapshot/master.zip" >tmp
+'
+
+test_expect_success 'check HTML headers (zip)' '
+	head -n 1 tmp |
+	grep "Content-Type: application/x-zip" &&
+
+	head -n 2 tmp |
+	grep "Content-Disposition: inline; filename=.master.zip."
+'
+
+test_expect_success 'strip off the header lines (zip)' '
+	strip_headers <tmp >master.zip
+'
+
+if test -n "$(which unzip 2>/dev/null)"; then
+	test_set_prereq UNZIP
+else
+	say 'Skipping ZIP validation tests: unzip not found'
+fi
+
+test_expect_success UNZIP 'verify zip format' '
+	unzip -t master.zip
+'
+
+test_expect_success UNZIP 'unzip' '
+	rm -rf master &&
+	unzip master.zip
+'
+
+test_expect_success UNZIP 'count files (zip)' '
+	ls master/ >output &&
+	test_line_count = 5 output
+'
+
+test_expect_success UNZIP 'verify unzipped file-5' '
+	grep "^5$" master/file-5 &&
+	test_line_count = 1 master/file-5
+'
+
+test_done
diff --git a/third_party/cgit/tests/t0108-patch.sh b/third_party/cgit/tests/t0108-patch.sh
new file mode 100755
index 0000000000..013d68024d
--- /dev/null
+++ b/third_party/cgit/tests/t0108-patch.sh
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+test_description='Check content on patch page'
+. ./setup.sh
+
+test_expect_success 'generate foo/patch' '
+	cgit_query "url=foo/patch" >tmp
+'
+
+test_expect_success 'find `From:` line' '
+	grep "^From: " tmp
+'
+
+test_expect_success 'find `Date:` line' '
+	grep "^Date: " tmp
+'
+
+test_expect_success 'find `Subject:` line' '
+	grep "^Subject: commit 5" tmp
+'
+
+test_expect_success 'find `cgit` signature' '
+	tail -2 tmp | head -1 | grep "^cgit"
+'
+
+test_expect_success 'compare with output of git-format-patch(1)' '
+	CGIT_VERSION=$(sed -n "s/CGIT_VERSION = //p" ../../VERSION) &&
+	git --git-dir="$PWD/repos/foo/.git" format-patch --subject-prefix="" --signature="cgit $CGIT_VERSION" --stdout HEAD^ >tmp2 &&
+	strip_headers <tmp >tmp_ &&
+	test_cmp tmp_ tmp2
+'
+
+test_expect_success 'find initial commit' '
+	root=$(git --git-dir="$PWD/repos/foo/.git" rev-list --max-parents=0 HEAD)
+'
+
+test_expect_success 'generate patch for initial commit' '
+	cgit_query "url=foo/patch&id=$root" >tmp
+'
+
+test_expect_success 'find `cgit` signature' '
+	tail -2 tmp | head -1 | grep "^cgit"
+'
+
+test_expect_success 'generate patches for multiple commits' '
+	id=$(git --git-dir="$PWD/repos/foo/.git" rev-parse HEAD) &&
+	id2=$(git --git-dir="$PWD/repos/foo/.git" rev-parse HEAD~3) &&
+	cgit_query "url=foo/patch&id=$id&id2=$id2" >tmp
+'
+
+test_expect_success 'find `cgit` signature' '
+	tail -2 tmp | head -1 | grep "^cgit"
+'
+
+test_expect_success 'compare with output of git-format-patch(1)' '
+	CGIT_VERSION=$(sed -n "s/CGIT_VERSION = //p" ../../VERSION) &&
+	git --git-dir="$PWD/repos/foo/.git" format-patch -N --subject-prefix="" --signature="cgit $CGIT_VERSION" --stdout HEAD~3..HEAD >tmp2 &&
+	strip_headers <tmp >tmp_ &&
+	test_cmp tmp_ tmp2
+'
+
+test_done
diff --git a/third_party/cgit/tests/t0109-gitconfig.sh b/third_party/cgit/tests/t0109-gitconfig.sh
new file mode 100755
index 0000000000..3ba668490d
--- /dev/null
+++ b/third_party/cgit/tests/t0109-gitconfig.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+test_description='Ensure that git does not access $HOME'
+. ./setup.sh
+
+test -n "$(which strace 2>/dev/null)" || {
+	skip_all='Skipping access validation tests: strace not found'
+	test_done
+	exit
+}
+
+test_no_home_access () {
+	non_existent_path="/path/to/some/place/that/does/not/possibly/exist"
+	while test -d "$non_existent_path"; do
+		non_existent_path="$non_existent_path/$(date +%N)"
+	done &&
+	strace \
+		-E HOME="$non_existent_path" \
+		-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
+}
+
+test_no_home_access_success() {
+	test_expect_success "do not access \$HOME: $1" "
+		test_no_home_access '$1'
+	"
+}
+
+test_no_home_access_success
+test_no_home_access_success foo
+test_no_home_access_success foo/refs
+test_no_home_access_success foo/log
+test_no_home_access_success foo/tree
+test_no_home_access_success foo/tree/file-1
+test_no_home_access_success foo/commit
+test_no_home_access_success foo/diff
+test_no_home_access_success foo/patch
+test_no_home_access_success foo/snapshot/master.tar.gz
+
+test_done
diff --git a/third_party/cgit/tests/t0110-rawdiff.sh b/third_party/cgit/tests/t0110-rawdiff.sh
new file mode 100755
index 0000000000..66fa7d5d37
--- /dev/null
+++ b/third_party/cgit/tests/t0110-rawdiff.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+test_description='Check content on rawdiff page'
+. ./setup.sh
+
+test_expect_success 'generate foo/rawdiff' '
+	cgit_query "url=foo/rawdiff" >tmp
+'
+
+test_expect_success 'compare with output of git-diff(1)' '
+	git --git-dir="$PWD/repos/foo/.git" diff HEAD^.. >tmp2 &&
+	sed "1,4d" tmp >tmp_ &&
+	cmp tmp_ tmp2
+'
+
+test_expect_success 'find initial commit' '
+	root=$(git --git-dir="$PWD/repos/foo/.git" rev-list --max-parents=0 HEAD)
+'
+
+test_expect_success 'generate diff for initial commit' '
+	cgit_query "url=foo/rawdiff&id=$root" >tmp
+'
+
+test_expect_success 'compare with output of git-diff-tree(1)' '
+	git --git-dir="$PWD/repos/foo/.git" diff-tree -p --no-commit-id --root "$root" >tmp2 &&
+	sed "1,4d" tmp >tmp_ &&
+	cmp tmp_ tmp2
+'
+
+test_expect_success 'generate diff for multiple commits' '
+	id=$(git --git-dir="$PWD/repos/foo/.git" rev-parse HEAD) &&
+	id2=$(git --git-dir="$PWD/repos/foo/.git" rev-parse HEAD~3) &&
+	cgit_query "url=foo/rawdiff&id=$id&id2=$id2" >tmp
+'
+
+test_expect_success 'compare with output of git-diff(1)' '
+	git --git-dir="$PWD/repos/foo/.git" diff HEAD~3..HEAD >tmp2 &&
+	sed "1,4d" tmp >tmp_ &&
+	cmp tmp_ tmp2
+'
+
+test_done
diff --git a/third_party/cgit/tests/t0111-filter.sh b/third_party/cgit/tests/t0111-filter.sh
new file mode 100755
index 0000000000..2fdc3669f4
--- /dev/null
+++ b/third_party/cgit/tests/t0111-filter.sh
@@ -0,0 +1,46 @@
+#!/bin/sh
+
+test_description='Check filtered content'
+. ./setup.sh
+
+prefixes="exec"
+if [ $CGIT_HAS_LUA -eq 1 ]; then
+	prefixes="$prefixes lua"
+fi
+
+for prefix in $prefixes
+do
+	test_expect_success "generate filter-$prefix/tree/a%2bb" "
+		cgit_url 'filter-$prefix/tree/a%2bb' >tmp
+	"
+
+	test_expect_success "check whether the $prefix source filter works" '
+		grep "<code>a+b HELLO$" tmp
+	'
+
+	test_expect_success "generate filter-$prefix/about/" "
+		cgit_url 'filter-$prefix/about/' >tmp
+	"
+
+	test_expect_success "check whether the $prefix about filter works" '
+		grep "<div id='"'"'summary'"'"'>a+b HELLO$" tmp
+	'
+
+	test_expect_success "generate filter-$prefix/commit/" "
+		cgit_url 'filter-$prefix/commit/' >tmp
+	"
+
+	test_expect_success "check whether the $prefix commit filter works" '
+		grep "<div class='"'"'commit-subject'"'"'>ADD A+B" tmp
+	'
+
+	test_expect_success "check whether the $prefix email filter works for authors" '
+		grep "<author@example.com> commit A U THOR &LT;AUTHOR@EXAMPLE.COM&GT;" tmp
+	'
+
+	test_expect_success "check whether the $prefix email filter works for committers" '
+		grep "<committer@example.com> commit C O MITTER &LT;COMMITTER@EXAMPLE.COM&GT;" tmp
+	'
+done
+
+test_done
diff --git a/third_party/cgit/tests/valgrind/bin/cgit b/third_party/cgit/tests/valgrind/bin/cgit
new file mode 100755
index 0000000000..dcdfbe5320
--- /dev/null
+++ b/third_party/cgit/tests/valgrind/bin/cgit
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# Note that we currently use Git's suppression file and there are variables
+# $GIT_VALGRIND and $CGIT_VALGRIND which point to different places.
+exec valgrind -q --error-exitcode=126 \
+	--suppressions="$GIT_VALGRIND/default.supp" \
+	--gen-suppressions=all \
+	--leak-check=no \
+	--track-origins=yes \
+	--log-fd=4 \
+	--input-fd=4 \
+	"$CGIT_VALGRIND/../../cgit" "$@"
diff --git a/third_party/cgit/ui-atom.c b/third_party/cgit/ui-atom.c
new file mode 100644
index 0000000000..1056f36397
--- /dev/null
+++ b/third_party/cgit/ui-atom.c
@@ -0,0 +1,149 @@
+/* ui-atom.c: functions for atom feeds
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-atom.h"
+#include "html.h"
+#include "ui-shared.h"
+
+static void add_entry(struct commit *commit, const char *host)
+{
+	char delim = '&';
+	char *hex;
+	char *mail, *t, *t2;
+	struct commitinfo *info;
+
+	info = cgit_parse_commit(commit);
+	hex = oid_to_hex(&commit->object.oid);
+	html("<entry>\n");
+	html("<title>");
+	html_txt(info->subject);
+	html("</title>\n");
+	html("<updated>");
+	html_txt(show_date(info->committer_date, 0,
+                    date_mode_from_type(DATE_ISO8601_STRICT)));
+	html("</updated>\n");
+	html("<author>\n");
+	if (info->author) {
+		html("<name>");
+		html_txt(info->author);
+		html("</name>\n");
+	}
+	if (info->author_email && !ctx.cfg.noplainemail) {
+		mail = xstrdup(info->author_email);
+		t = strchr(mail, '<');
+		if (t)
+			t++;
+		else
+			t = mail;
+		t2 = strchr(t, '>');
+		if (t2)
+			*t2 = '\0';
+		html("<email>");
+		html_txt(t);
+		html("</email>\n");
+		free(mail);
+	}
+	html("</author>\n");
+	html("<published>");
+	html_txt(show_date(info->author_date, 0,
+                    date_mode_from_type(DATE_ISO8601_STRICT)));
+	html("</published>\n");
+	if (host) {
+		char *pageurl;
+		html("<link rel='alternate' type='text/html' href='");
+		html(cgit_httpscheme());
+		html_attr(host);
+		pageurl = cgit_pageurl(ctx.repo->url, "commit", NULL);
+		html_attr(pageurl);
+		if (ctx.cfg.virtual_root)
+			delim = '?';
+		html_attrf("%cid=%s", delim, hex);
+		html("'/>\n");
+		free(pageurl);
+	}
+	htmlf("<id>%s</id>\n", hex);
+	html("<content type='text'>\n");
+	html_txt(info->msg);
+	html("</content>\n");
+	html("<content type='xhtml'>\n");
+	html("<div xmlns='http://www.w3.org/1999/xhtml'>\n");
+	html("<pre>\n");
+	html_txt(info->msg);
+	html("</pre>\n");
+	html("</div>\n");
+	html("</content>\n");
+	html("</entry>\n");
+	cgit_free_commitinfo(info);
+}
+
+
+void cgit_print_atom(char *tip, const char *path, int max_count)
+{
+	char *host;
+	const char *argv[] = {NULL, tip, NULL, NULL, NULL};
+	struct commit *commit;
+	struct rev_info rev;
+	int argc = 2;
+
+	if (ctx.qry.show_all)
+		argv[1] = "--all";
+	else if (!tip)
+		argv[1] = ctx.qry.head;
+
+	if (path) {
+		argv[argc++] = "--";
+		argv[argc++] = path;
+	}
+
+	init_revisions(&rev, NULL);
+	rev.abbrev = DEFAULT_ABBREV;
+	rev.commit_format = CMIT_FMT_DEFAULT;
+	rev.verbose_header = 1;
+	rev.show_root_diff = 0;
+	rev.max_count = max_count;
+	setup_revisions(argc, argv, &rev, NULL);
+	prepare_revision_walk(&rev);
+
+	host = cgit_hosturl();
+	ctx.page.mimetype = "text/xml";
+	ctx.page.charset = "utf-8";
+	cgit_print_http_headers();
+	html("<feed xmlns='http://www.w3.org/2005/Atom'>\n");
+	html("<title>");
+	html_txt(ctx.repo->name);
+	if (path) {
+		html("/");
+		html_txt(path);
+	}
+	if (tip && !ctx.qry.show_all) {
+		html(", branch ");
+		html_txt(tip);
+	}
+	html("</title>\n");
+	html("<subtitle>");
+	html_txt(ctx.repo->desc);
+	html("</subtitle>\n");
+	if (host) {
+		char *repourl = cgit_repourl(ctx.repo->url);
+		html("<link rel='alternate' type='text/html' href='");
+		html(cgit_httpscheme());
+		html_attr(host);
+		html_attr(repourl);
+		html("'/>\n");
+		free(repourl);
+	}
+	while ((commit = get_revision(&rev)) != NULL) {
+		add_entry(commit, host);
+		free_commit_buffer(the_repository->parsed_objects, commit);
+		free_commit_list(commit->parents);
+		commit->parents = NULL;
+	}
+	html("</feed>\n");
+	free(host);
+}
diff --git a/third_party/cgit/ui-atom.h b/third_party/cgit/ui-atom.h
new file mode 100644
index 0000000000..dda953bbf4
--- /dev/null
+++ b/third_party/cgit/ui-atom.h
@@ -0,0 +1,6 @@
+#ifndef UI_ATOM_H
+#define UI_ATOM_H
+
+extern void cgit_print_atom(char *tip, const char *path, int max_count);
+
+#endif
diff --git a/third_party/cgit/ui-blame.c b/third_party/cgit/ui-blame.c
new file mode 100644
index 0000000000..644c30ad28
--- /dev/null
+++ b/third_party/cgit/ui-blame.c
@@ -0,0 +1,302 @@
+/* ui-blame.c: functions for blame output
+ *
+ * Copyright (C) 2006-2017 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-blame.h"
+#include "html.h"
+#include "ui-shared.h"
+#include "argv-array.h"
+#include "blame.h"
+
+
+static char *emit_suspect_detail(struct blame_origin *suspect)
+{
+	struct commitinfo *info;
+	struct strbuf detail = STRBUF_INIT;
+
+	info = cgit_parse_commit(suspect->commit);
+
+	strbuf_addf(&detail, "author  %s", info->author);
+	if (!ctx.cfg.noplainemail)
+		strbuf_addf(&detail, " %s", info->author_email);
+	strbuf_addf(&detail, "  %s\n",
+		    show_date(info->author_date, info->author_tz,
+				    cgit_date_mode(DATE_ISO8601)));
+
+	strbuf_addf(&detail, "committer  %s", info->committer);
+	if (!ctx.cfg.noplainemail)
+		strbuf_addf(&detail, " %s", info->committer_email);
+	strbuf_addf(&detail, "  %s\n\n",
+		    show_date(info->committer_date, info->committer_tz,
+				    cgit_date_mode(DATE_ISO8601)));
+
+	strbuf_addstr(&detail, info->subject);
+
+	cgit_free_commitinfo(info);
+	return strbuf_detach(&detail, NULL);
+}
+
+static void emit_blame_entry_hash(struct blame_entry *ent)
+{
+	struct blame_origin *suspect = ent->suspect;
+	struct object_id *oid = &suspect->commit->object.oid;
+	unsigned long line = 0;
+
+	char *detail = emit_suspect_detail(suspect);
+	html("<span class='sha1'>");
+	cgit_commit_link(find_unique_abbrev(oid, DEFAULT_ABBREV), detail,
+			 NULL, ctx.qry.head, oid_to_hex(oid), suspect->path);
+	html("</span>");
+	free(detail);
+
+	while (line++ < ent->num_lines)
+		html("\n");
+}
+
+static void emit_blame_entry_linenumber(struct blame_entry *ent)
+{
+	const char *numberfmt = "<a id='n%1$d' href='#n%1$d'>%1$d</a>\n";
+
+	unsigned long lineno = ent->lno;
+	while (lineno < ent->lno + ent->num_lines)
+		htmlf(numberfmt, ++lineno);
+}
+
+static void emit_blame_entry_line_background(struct blame_scoreboard *sb,
+					     struct blame_entry *ent)
+{
+	unsigned long line;
+	size_t len, maxlen = 2;
+	const char* pos, *endpos;
+
+	for (line = ent->lno; line < ent->lno + ent->num_lines; line++) {
+		html("\n");
+		pos = blame_nth_line(sb, line);
+		endpos = blame_nth_line(sb, line + 1);
+		len = 0;
+		while (pos < endpos) {
+			len++;
+			if (*pos++ == '\t')
+				len = (len + 7) & ~7;
+		}
+		if (len > maxlen)
+			maxlen = len;
+	}
+
+	for (len = 0; len < maxlen - 1; len++)
+		html(" ");
+}
+
+struct walk_tree_context {
+	char *curr_rev;
+	int match_baselen;
+	int state;
+};
+
+static void print_object(const struct object_id *oid, const char *path,
+			 const char *basename, const char *rev)
+{
+	enum object_type type;
+	char *buf;
+	unsigned long size;
+	struct argv_array rev_argv = ARGV_ARRAY_INIT;
+	struct rev_info revs;
+	struct blame_scoreboard sb;
+	struct blame_origin *o;
+	struct blame_entry *ent = NULL;
+
+	type = oid_object_info(the_repository, oid, &size);
+	if (type == OBJ_BAD) {
+		cgit_print_error_page(404, "Not found", "Bad object name: %s",
+				      oid_to_hex(oid));
+		return;
+	}
+
+	buf = read_object_file(oid, &type, &size);
+	if (!buf) {
+		cgit_print_error_page(500, "Internal server error",
+			"Error reading object %s", oid_to_hex(oid));
+		return;
+	}
+
+	argv_array_push(&rev_argv, "blame");
+	argv_array_push(&rev_argv, rev);
+	init_revisions(&revs, NULL);
+	revs.diffopt.flags.allow_textconv = 1;
+	setup_revisions(rev_argv.argc, rev_argv.argv, &revs, NULL);
+	init_scoreboard(&sb);
+	sb.revs = &revs;
+	sb.repo = the_repository;
+	setup_scoreboard(&sb, path, &o);
+	o->suspects = blame_entry_prepend(NULL, 0, sb.num_lines, o);
+	prio_queue_put(&sb.commits, o->commit);
+	blame_origin_decref(o);
+	sb.ent = NULL;
+	sb.path = path;
+	assign_blame(&sb, 0);
+	blame_sort_final(&sb);
+	blame_coalesce(&sb);
+
+	cgit_set_title_from_path(path);
+
+	cgit_print_layout_start();
+	htmlf("blob: %s (", oid_to_hex(oid));
+	cgit_plain_link("plain", NULL, NULL, ctx.qry.head, rev, path);
+	html(") (");
+	cgit_tree_link("tree", NULL, NULL, ctx.qry.head, rev, path);
+	html(")\n");
+
+	if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) {
+		htmlf("<div class='error'>blob size (%ldKB)"
+		      " exceeds display size limit (%dKB).</div>",
+		      size / 1024, ctx.cfg.max_blob_size);
+		goto cleanup;
+	}
+
+	html("<table class='blame blob'>\n<tr>\n");
+
+	/* Commit hashes */
+	html("<td class='hashes'>");
+	for (ent = sb.ent; ent; ent = ent->next) {
+		html("<div class='alt'><pre>");
+		emit_blame_entry_hash(ent);
+		html("</pre></div>");
+	}
+	html("</td>\n");
+
+	/* Line numbers */
+	if (ctx.cfg.enable_tree_linenumbers) {
+		html("<td class='linenumbers'>");
+		for (ent = sb.ent; ent; ent = ent->next) {
+			html("<div class='alt'><pre>");
+			emit_blame_entry_linenumber(ent);
+			html("</pre></div>");
+		}
+		html("</td>\n");
+	}
+
+	html("<td class='lines'><div>");
+
+	/* Colored bars behind lines */
+	html("<div>");
+	for (ent = sb.ent; ent; ) {
+		struct blame_entry *e = ent->next;
+		html("<div class='alt'><pre>");
+		emit_blame_entry_line_background(&sb, ent);
+		html("</pre></div>");
+		free(ent);
+		ent = e;
+	}
+	html("</div>");
+
+	free((void *)sb.final_buf);
+
+	/* Lines */
+	html("<pre><code>");
+	if (ctx.repo->source_filter) {
+		char *filter_arg = xstrdup(basename);
+		cgit_open_filter(ctx.repo->source_filter, filter_arg);
+		html_raw(buf, size);
+		cgit_close_filter(ctx.repo->source_filter);
+		free(filter_arg);
+	} else {
+		html_txt(buf);
+	}
+	html("</code></pre>");
+
+	html("</div></td>\n");
+
+	html("</tr>\n</table>\n");
+
+	cgit_print_layout_end();
+
+cleanup:
+	free(buf);
+}
+
+static int walk_tree(const struct object_id *oid, struct strbuf *base,
+		     const char *pathname, unsigned mode, int stage,
+		     void *cbdata)
+{
+	struct walk_tree_context *walk_tree_ctx = cbdata;
+
+	if (base->len == walk_tree_ctx->match_baselen) {
+		if (S_ISREG(mode)) {
+			struct strbuf buffer = STRBUF_INIT;
+			strbuf_addbuf(&buffer, base);
+			strbuf_addstr(&buffer, pathname);
+			print_object(oid, buffer.buf, pathname,
+				     walk_tree_ctx->curr_rev);
+			strbuf_release(&buffer);
+			walk_tree_ctx->state = 1;
+		} else if (S_ISDIR(mode)) {
+			walk_tree_ctx->state = 2;
+		}
+	} else if (base->len < INT_MAX
+			&& (int)base->len > walk_tree_ctx->match_baselen) {
+		walk_tree_ctx->state = 2;
+	} else if (S_ISDIR(mode)) {
+		return READ_TREE_RECURSIVE;
+	}
+	return 0;
+}
+
+static int basedir_len(const char *path)
+{
+	char *p = strrchr(path, '/');
+	if (p)
+		return p - path + 1;
+	return 0;
+}
+
+void cgit_print_blame(void)
+{
+	const char *rev = ctx.qry.sha1;
+	struct object_id oid;
+	struct commit *commit;
+	struct pathspec_item path_items = {
+		.match = ctx.qry.path,
+		.len = ctx.qry.path ? strlen(ctx.qry.path) : 0
+	};
+	struct pathspec paths = {
+		.nr = 1,
+		.items = &path_items
+	};
+	struct walk_tree_context walk_tree_ctx = {
+		.state = 0
+	};
+
+	if (!rev)
+		rev = ctx.qry.head;
+
+	if (get_oid(rev, &oid)) {
+		cgit_print_error_page(404, "Not found",
+			"Invalid revision name: %s", rev);
+		return;
+	}
+	commit = lookup_commit_reference(the_repository, &oid);
+	if (!commit || parse_commit(commit)) {
+		cgit_print_error_page(404, "Not found",
+			"Invalid commit reference: %s", rev);
+		return;
+	}
+
+	walk_tree_ctx.curr_rev = xstrdup(rev);
+	walk_tree_ctx.match_baselen = (path_items.match) ?
+				       basedir_len(path_items.match) : -1;
+
+	read_tree_recursive(the_repository, commit->maybe_tree, "", 0, 0,
+		&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)
+		cgit_print_error_page(404, "No blame for folders",
+			"Blame is not available for folders.");
+
+	free(walk_tree_ctx.curr_rev);
+}
diff --git a/third_party/cgit/ui-blame.h b/third_party/cgit/ui-blame.h
new file mode 100644
index 0000000000..5b97e03591
--- /dev/null
+++ b/third_party/cgit/ui-blame.h
@@ -0,0 +1,6 @@
+#ifndef UI_BLAME_H
+#define UI_BLAME_H
+
+extern void cgit_print_blame(void);
+
+#endif /* UI_BLAME_H */
diff --git a/third_party/cgit/ui-blob.c b/third_party/cgit/ui-blob.c
new file mode 100644
index 0000000000..30e2d4bf5f
--- /dev/null
+++ b/third_party/cgit/ui-blob.c
@@ -0,0 +1,181 @@
+/* ui-blob.c: show blob content
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-blob.h"
+#include "html.h"
+#include "ui-shared.h"
+
+struct walk_tree_context {
+	const char *match_path;
+	struct object_id *matched_oid;
+	unsigned int found_path:1;
+	unsigned int file_only:1;
+};
+
+static int walk_tree(const struct object_id *oid, struct strbuf *base,
+		const char *pathname, unsigned mode, int stage, void *cbdata)
+{
+	struct walk_tree_context *walk_tree_ctx = cbdata;
+
+	if (walk_tree_ctx->file_only && !S_ISREG(mode))
+		return READ_TREE_RECURSIVE;
+	if (strncmp(base->buf, walk_tree_ctx->match_path, base->len)
+		|| strcmp(walk_tree_ctx->match_path + base->len, pathname))
+		return READ_TREE_RECURSIVE;
+	oidcpy(walk_tree_ctx->matched_oid, oid);
+	walk_tree_ctx->found_path = 1;
+	return 0;
+}
+
+int cgit_ref_path_exists(const char *path, const char *ref, int file_only)
+{
+	struct object_id oid;
+	unsigned long size;
+	struct pathspec_item path_items = {
+		.match = xstrdup(path),
+		.len = strlen(path)
+	};
+	struct pathspec paths = {
+		.nr = 1,
+		.items = &path_items
+	};
+	struct walk_tree_context walk_tree_ctx = {
+		.match_path = path,
+		.matched_oid = &oid,
+		.found_path = 0,
+		.file_only = file_only
+	};
+
+	if (get_oid(ref, &oid))
+		goto done;
+	if (oid_object_info(the_repository, &oid, &size) != OBJ_COMMIT)
+		goto done;
+	read_tree_recursive(the_repository, lookup_commit_reference(the_repository, &oid)->maybe_tree,
+		"", 0, 0, &paths, walk_tree, &walk_tree_ctx);
+
+done:
+	free(path_items.match);
+	return walk_tree_ctx.found_path;
+}
+
+int cgit_print_file(char *path, const char *head, int file_only)
+{
+	struct object_id oid;
+	enum object_type type;
+	char *buf;
+	unsigned long size;
+	struct commit *commit;
+	struct pathspec_item path_items = {
+		.match = path,
+		.len = strlen(path)
+	};
+	struct pathspec paths = {
+		.nr = 1,
+		.items = &path_items
+	};
+	struct walk_tree_context walk_tree_ctx = {
+		.match_path = path,
+		.matched_oid = &oid,
+		.found_path = 0,
+		.file_only = file_only
+	};
+
+	if (get_oid(head, &oid))
+		return -1;
+	type = oid_object_info(the_repository, &oid, &size);
+	if (type == OBJ_COMMIT) {
+		commit = lookup_commit_reference(the_repository, &oid);
+		read_tree_recursive(the_repository, commit->maybe_tree,
+			"", 0, 0, &paths, walk_tree, &walk_tree_ctx);
+		if (!walk_tree_ctx.found_path)
+			return -1;
+		type = oid_object_info(the_repository, &oid, &size);
+	}
+	if (type == OBJ_BAD)
+		return -1;
+	buf = read_object_file(&oid, &type, &size);
+	if (!buf)
+		return -1;
+	buf[size] = '\0';
+	html_raw(buf, size);
+	free(buf);
+	return 0;
+}
+
+void cgit_print_blob(const char *hex, char *path, const char *head, int file_only)
+{
+	struct object_id oid;
+	enum object_type type;
+	char *buf;
+	unsigned long size;
+	struct commit *commit;
+	struct pathspec_item path_items = {
+		.match = path,
+		.len = path ? strlen(path) : 0
+	};
+	struct pathspec paths = {
+		.nr = 1,
+		.items = &path_items
+	};
+	struct walk_tree_context walk_tree_ctx = {
+		.match_path = path,
+		.matched_oid = &oid,
+		.found_path = 0,
+		.file_only = file_only
+	};
+
+	if (hex) {
+		if (get_oid_hex(hex, &oid)) {
+			cgit_print_error_page(400, "Bad request",
+					"Bad hex value: %s", hex);
+			return;
+		}
+	} else {
+		if (get_oid(head, &oid)) {
+			cgit_print_error_page(404, "Not found",
+					"Bad ref: %s", head);
+			return;
+		}
+	}
+
+	type = oid_object_info(the_repository, &oid, &size);
+
+	if ((!hex) && type == OBJ_COMMIT && path) {
+		commit = lookup_commit_reference(the_repository, &oid);
+		read_tree_recursive(the_repository, commit->maybe_tree,
+			"", 0, 0, &paths, walk_tree, &walk_tree_ctx);
+		type = oid_object_info(the_repository, &oid, &size);
+	}
+
+	if (type == OBJ_BAD) {
+		cgit_print_error_page(404, "Not found",
+				"Bad object name: %s", hex);
+		return;
+	}
+
+	buf = read_object_file(&oid, &type, &size);
+	if (!buf) {
+		cgit_print_error_page(500, "Internal server error",
+				"Error reading object %s", hex);
+		return;
+	}
+
+	buf[size] = '\0';
+	if (buffer_is_binary(buf, size))
+		ctx.page.mimetype = "application/octet-stream";
+	else
+		ctx.page.mimetype = "text/plain";
+	ctx.page.filename = path;
+
+	html("X-Content-Type-Options: nosniff\n");
+	html("Content-Security-Policy: default-src 'none'\n");
+	cgit_print_http_headers();
+	html_raw(buf, size);
+	free(buf);
+}
diff --git a/third_party/cgit/ui-blob.h b/third_party/cgit/ui-blob.h
new file mode 100644
index 0000000000..16847b20b1
--- /dev/null
+++ b/third_party/cgit/ui-blob.h
@@ -0,0 +1,8 @@
+#ifndef UI_BLOB_H
+#define UI_BLOB_H
+
+extern int cgit_ref_path_exists(const char *path, const char *ref, int file_only);
+extern int cgit_print_file(char *path, const char *head, int file_only);
+extern void cgit_print_blob(const char *hex, char *path, const char *head, int file_only);
+
+#endif /* UI_BLOB_H */
diff --git a/third_party/cgit/ui-clone.c b/third_party/cgit/ui-clone.c
new file mode 100644
index 0000000000..5dccb63976
--- /dev/null
+++ b/third_party/cgit/ui-clone.c
@@ -0,0 +1,126 @@
+/* ui-clone.c: functions for http cloning, based on
+ * git's http-backend.c by Shawn O. Pearce
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-clone.h"
+#include "html.h"
+#include "ui-shared.h"
+#include "packfile.h"
+#include "object-store.h"
+
+static int print_ref_info(const char *refname, const struct object_id *oid,
+                          int flags, void *cb_data)
+{
+	struct object *obj;
+
+	if (!(obj = parse_object(the_repository, oid)))
+		return 0;
+
+	htmlf("%s\t%s\n", oid_to_hex(oid), refname);
+	if (obj->type == OBJ_TAG) {
+		if (!(obj = deref_tag(the_repository, obj, refname, 0)))
+			return 0;
+		htmlf("%s\t%s^{}\n", oid_to_hex(&obj->oid), refname);
+	}
+	return 0;
+}
+
+static void print_pack_info(void)
+{
+	struct packed_git *pack;
+	char *offset;
+
+	ctx.page.mimetype = "text/plain";
+	ctx.page.filename = "objects/info/packs";
+	cgit_print_http_headers();
+	reprepare_packed_git(the_repository);
+	for (pack = get_packed_git(the_repository); pack; pack = pack->next) {
+		if (pack->pack_local) {
+			offset = strrchr(pack->pack_name, '/');
+			if (offset && offset[1] != '\0')
+				++offset;
+			else
+				offset = pack->pack_name;
+			htmlf("P %s\n", offset);
+		}
+	}
+}
+
+static void send_file(const char *path)
+{
+	struct stat st;
+
+	if (stat(path, &st)) {
+		switch (errno) {
+		case ENOENT:
+			cgit_print_error_page(404, "Not found", "Not found");
+			break;
+		case EACCES:
+			cgit_print_error_page(403, "Forbidden", "Forbidden");
+			break;
+		default:
+			cgit_print_error_page(400, "Bad request", "Bad request");
+		}
+		return;
+	}
+	ctx.page.mimetype = "application/octet-stream";
+	ctx.page.filename = path;
+	skip_prefix(path, ctx.repo->path, &ctx.page.filename);
+	skip_prefix(ctx.page.filename, "/", &ctx.page.filename);
+	cgit_print_http_headers();
+	html_include(path);
+}
+
+void cgit_clone_info(void)
+{
+	if (!ctx.qry.path || strcmp(ctx.qry.path, "refs")) {
+		cgit_print_error_page(400, "Bad request", "Bad request");
+		return;
+	}
+
+	ctx.page.mimetype = "text/plain";
+	ctx.page.filename = "info/refs";
+	cgit_print_http_headers();
+	for_each_ref(print_ref_info, NULL);
+}
+
+void cgit_clone_objects(void)
+{
+	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)
+{
+	send_file(git_path("%s", "HEAD"));
+}
diff --git a/third_party/cgit/ui-clone.h b/third_party/cgit/ui-clone.h
new file mode 100644
index 0000000000..3e460a3dbc
--- /dev/null
+++ b/third_party/cgit/ui-clone.h
@@ -0,0 +1,8 @@
+#ifndef UI_CLONE_H
+#define UI_CLONE_H
+
+void cgit_clone_info(void);
+void cgit_clone_objects(void);
+void cgit_clone_head(void);
+
+#endif /* UI_CLONE_H */
diff --git a/third_party/cgit/ui-commit.c b/third_party/cgit/ui-commit.c
new file mode 100644
index 0000000000..9a47b54c56
--- /dev/null
+++ b/third_party/cgit/ui-commit.c
@@ -0,0 +1,147 @@
+/* ui-commit.c: generate commit view
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-commit.h"
+#include "html.h"
+#include "ui-shared.h"
+#include "ui-diff.h"
+#include "ui-log.h"
+
+void cgit_print_commit(char *hex, const char *prefix)
+{
+	struct commit *commit, *parent;
+	struct commitinfo *info, *parent_info;
+	struct commit_list *p;
+	struct strbuf notes = STRBUF_INIT;
+	struct object_id oid;
+	char *tmp, *tmp2;
+	int parents = 0;
+
+	if (!hex)
+		hex = ctx.qry.head;
+
+	if (get_oid(hex, &oid)) {
+		cgit_print_error_page(400, "Bad request",
+				"Bad object id: %s", hex);
+		return;
+	}
+	commit = lookup_commit_reference(the_repository, &oid);
+	if (!commit) {
+		cgit_print_error_page(404, "Not found",
+				"Bad commit reference: %s", hex);
+		return;
+	}
+	info = cgit_parse_commit(commit);
+
+	format_display_notes(&oid, &notes, PAGE_ENCODING, 0);
+
+	load_ref_decorations(NULL, DECORATE_FULL_REFS);
+
+	cgit_print_layout_start();
+	cgit_print_diff_ctrls();
+	html("<table summary='commit info' class='commit-info'>\n");
+	html("<tr><th>author</th><td>");
+	cgit_open_filter(ctx.repo->email_filter, info->author_email, "commit");
+	html_txt(info->author);
+	if (!ctx.cfg.noplainemail) {
+		html(" ");
+		html_txt(info->author_email);
+	}
+	cgit_close_filter(ctx.repo->email_filter);
+	html("</td><td class='right'>");
+	html_txt(show_date(info->author_date, info->author_tz,
+				cgit_date_mode(DATE_ISO8601)));
+	html("</td></tr>\n");
+	html("<tr><th>committer</th><td>");
+	cgit_open_filter(ctx.repo->email_filter, info->committer_email, "commit");
+	html_txt(info->committer);
+	if (!ctx.cfg.noplainemail) {
+		html(" ");
+		html_txt(info->committer_email);
+	}
+	cgit_close_filter(ctx.repo->email_filter);
+	html("</td><td class='right'>");
+	html_txt(show_date(info->committer_date, info->committer_tz,
+				cgit_date_mode(DATE_ISO8601)));
+	html("</td></tr>\n");
+	html("<tr><th>commit</th><td colspan='2' class='sha1'>");
+	tmp = oid_to_hex(&commit->object.oid);
+	cgit_commit_link(tmp, NULL, NULL, ctx.qry.head, tmp, prefix);
+	html(" (");
+	cgit_patch_link("patch", NULL, NULL, NULL, tmp, prefix);
+	html(")</td></tr>\n");
+	html("<tr><th>tree</th><td colspan='2' class='sha1'>");
+	tmp = xstrdup(hex);
+	cgit_tree_link(oid_to_hex(&commit->maybe_tree->object.oid), NULL, NULL,
+		       ctx.qry.head, tmp, NULL);
+	if (prefix) {
+		html(" /");
+		cgit_tree_link(prefix, NULL, NULL, ctx.qry.head, tmp, prefix);
+	}
+	free(tmp);
+	html("</td></tr>\n");
+	for (p = commit->parents; p; p = p->next) {
+		parent = lookup_commit_reference(the_repository, &p->item->object.oid);
+		if (!parent) {
+			html("<tr><td colspan='3'>");
+			cgit_print_error("Error reading parent commit");
+			html("</td></tr>");
+			continue;
+		}
+		html("<tr><th>parent</th>"
+		     "<td colspan='2' class='sha1'>");
+		tmp = tmp2 = oid_to_hex(&p->item->object.oid);
+		if (ctx.repo->enable_subject_links) {
+			parent_info = cgit_parse_commit(parent);
+			tmp2 = parent_info->subject;
+		}
+		cgit_commit_link(tmp2, NULL, NULL, ctx.qry.head, tmp, prefix);
+		html(" (");
+		cgit_diff_link("diff", NULL, NULL, ctx.qry.head, hex,
+			       oid_to_hex(&p->item->object.oid), prefix);
+		html(")</td></tr>");
+		parents++;
+	}
+	if (ctx.repo->snapshots) {
+		html("<tr><th>download</th><td colspan='2' class='sha1'>");
+		cgit_print_snapshot_links(ctx.repo, hex, "<br/>");
+		html("</td></tr>");
+	}
+	html("</table>\n");
+	html("<div class='commit-subject'>");
+	cgit_open_filter(ctx.repo->commit_filter);
+	html_txt(info->subject);
+	cgit_close_filter(ctx.repo->commit_filter);
+	show_commit_decorations(commit);
+	html("</div>");
+	html("<div class='commit-msg'>");
+	cgit_open_filter(ctx.repo->commit_filter);
+	html_txt(info->msg);
+	cgit_close_filter(ctx.repo->commit_filter);
+	html("</div>");
+	if (notes.len != 0) {
+		html("<div class='notes-header'>Notes</div>");
+		html("<div class='notes'>");
+		cgit_open_filter(ctx.repo->commit_filter);
+		html_txt(notes.buf);
+		cgit_close_filter(ctx.repo->commit_filter);
+		html("</div>");
+		html("<div class='notes-footer'></div>");
+	}
+	if (parents < 3) {
+		if (parents)
+			tmp = oid_to_hex(&commit->parents->item->object.oid);
+		else
+			tmp = NULL;
+		cgit_print_diff(ctx.qry.sha1, tmp, prefix, 0, 0);
+	}
+	strbuf_release(&notes);
+	cgit_free_commitinfo(info);
+	cgit_print_layout_end();
+}
diff --git a/third_party/cgit/ui-commit.h b/third_party/cgit/ui-commit.h
new file mode 100644
index 0000000000..8198b4bacc
--- /dev/null
+++ b/third_party/cgit/ui-commit.h
@@ -0,0 +1,6 @@
+#ifndef UI_COMMIT_H
+#define UI_COMMIT_H
+
+extern void cgit_print_commit(char *hex, const char *prefix);
+
+#endif /* UI_COMMIT_H */
diff --git a/third_party/cgit/ui-diff.c b/third_party/cgit/ui-diff.c
new file mode 100644
index 0000000000..c60aefd1d6
--- /dev/null
+++ b/third_party/cgit/ui-diff.c
@@ -0,0 +1,501 @@
+/* ui-diff.c: show diff between two blobs
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-diff.h"
+#include "html.h"
+#include "ui-shared.h"
+#include "ui-ssdiff.h"
+
+struct object_id old_rev_oid[1];
+struct object_id new_rev_oid[1];
+
+static int files, slots;
+static int total_adds, total_rems, max_changes;
+static int lines_added, lines_removed;
+
+static struct fileinfo {
+	char status;
+	struct object_id old_oid[1];
+	struct object_id new_oid[1];
+	unsigned short old_mode;
+	unsigned short new_mode;
+	char *old_path;
+	char *new_path;
+	unsigned int added;
+	unsigned int removed;
+	unsigned long old_size;
+	unsigned long new_size;
+	unsigned int binary:1;
+} *items;
+
+static int use_ssdiff = 0;
+static struct diff_filepair *current_filepair;
+static const char *current_prefix;
+
+struct diff_filespec *cgit_get_current_old_file(void)
+{
+	return current_filepair->one;
+}
+
+struct diff_filespec *cgit_get_current_new_file(void)
+{
+	return current_filepair->two;
+}
+
+static void print_fileinfo(struct fileinfo *info)
+{
+	char *class;
+
+	switch (info->status) {
+	case DIFF_STATUS_ADDED:
+		class = "add";
+		break;
+	case DIFF_STATUS_COPIED:
+		class = "cpy";
+		break;
+	case DIFF_STATUS_DELETED:
+		class = "del";
+		break;
+	case DIFF_STATUS_MODIFIED:
+		class = "upd";
+		break;
+	case DIFF_STATUS_RENAMED:
+		class = "mov";
+		break;
+	case DIFF_STATUS_TYPE_CHANGED:
+		class = "typ";
+		break;
+	case DIFF_STATUS_UNKNOWN:
+		class = "unk";
+		break;
+	case DIFF_STATUS_UNMERGED:
+		class = "stg";
+		break;
+	default:
+		die("bug: unhandled diff status %c", info->status);
+	}
+
+	html("<tr>");
+	html("<td class='mode'>");
+	if (is_null_oid(info->new_oid)) {
+		cgit_print_filemode(info->old_mode);
+	} else {
+		cgit_print_filemode(info->new_mode);
+	}
+
+	if (info->old_mode != info->new_mode &&
+	    !is_null_oid(info->old_oid) &&
+	    !is_null_oid(info->new_oid)) {
+		html("<span class='modechange'>[");
+		cgit_print_filemode(info->old_mode);
+		html("]</span>");
+	}
+	htmlf("</td><td class='%s'>", class);
+	cgit_diff_link(info->new_path, NULL, NULL, ctx.qry.head, ctx.qry.sha1,
+		       ctx.qry.sha2, info->new_path);
+	if (info->status == DIFF_STATUS_COPIED || info->status == DIFF_STATUS_RENAMED) {
+		htmlf(" (%s from ",
+		      info->status == DIFF_STATUS_COPIED ? "copied" : "renamed");
+		html_txt(info->old_path);
+		html(")");
+	}
+	html("</td><td class='right'>");
+	if (info->binary) {
+		htmlf("bin</td><td class='graph'>%ld -> %ld bytes",
+		      info->old_size, info->new_size);
+		return;
+	}
+	htmlf("%d", info->added + info->removed);
+	html("</td><td class='graph'>");
+	htmlf("<table summary='file diffstat' width='%d%%'><tr>", (max_changes > 100 ? 100 : max_changes));
+	htmlf("<td class='add' style='width: %.1f%%;'/>",
+	      info->added * 100.0 / max_changes);
+	htmlf("<td class='rem' style='width: %.1f%%;'/>",
+	      info->removed * 100.0 / max_changes);
+	htmlf("<td class='none' style='width: %.1f%%;'/>",
+	      (max_changes - info->removed - info->added) * 100.0 / max_changes);
+	html("</tr></table></td></tr>\n");
+}
+
+static void count_diff_lines(char *line, int len)
+{
+	if (line && (len > 0)) {
+		if (line[0] == '+')
+			lines_added++;
+		else if (line[0] == '-')
+			lines_removed++;
+	}
+}
+
+static int show_filepair(struct diff_filepair *pair)
+{
+	/* Always show if we have no limiting prefix. */
+	if (!current_prefix)
+		return 1;
+
+	/* Show if either path in the pair begins with the prefix. */
+	if (starts_with(pair->one->path, current_prefix) ||
+	    starts_with(pair->two->path, current_prefix))
+		return 1;
+
+	/* Otherwise we don't want to show this filepair. */
+	return 0;
+}
+
+static void inspect_filepair(struct diff_filepair *pair)
+{
+	int binary = 0;
+	unsigned long old_size = 0;
+	unsigned long new_size = 0;
+
+	if (!show_filepair(pair))
+		return;
+
+	files++;
+	lines_added = 0;
+	lines_removed = 0;
+	cgit_diff_files(&pair->one->oid, &pair->two->oid, &old_size, &new_size,
+			&binary, 0, ctx.qry.ignorews, count_diff_lines);
+	if (files >= slots) {
+		if (slots == 0)
+			slots = 4;
+		else
+			slots = slots * 2;
+		items = xrealloc(items, slots * sizeof(struct fileinfo));
+	}
+	items[files-1].status = pair->status;
+	oidcpy(items[files-1].old_oid, &pair->one->oid);
+	oidcpy(items[files-1].new_oid, &pair->two->oid);
+	items[files-1].old_mode = pair->one->mode;
+	items[files-1].new_mode = pair->two->mode;
+	items[files-1].old_path = xstrdup(pair->one->path);
+	items[files-1].new_path = xstrdup(pair->two->path);
+	items[files-1].added = lines_added;
+	items[files-1].removed = lines_removed;
+	items[files-1].old_size = old_size;
+	items[files-1].new_size = new_size;
+	items[files-1].binary = binary;
+	if (lines_added + lines_removed > max_changes)
+		max_changes = lines_added + lines_removed;
+	total_adds += lines_added;
+	total_rems += lines_removed;
+}
+
+static void cgit_print_diffstat(const struct object_id *old_oid,
+				const struct object_id *new_oid,
+				const char *prefix)
+{
+	int i;
+
+	html("<div class='diffstat-header'>");
+	cgit_diff_link("Diffstat", NULL, NULL, ctx.qry.head, ctx.qry.sha1,
+		       ctx.qry.sha2, NULL);
+	if (prefix) {
+		html(" (limited to '");
+		html_txt(prefix);
+		html("')");
+	}
+	html("</div>");
+	html("<table summary='diffstat' class='diffstat'>");
+	max_changes = 0;
+	cgit_diff_tree(old_oid, new_oid, inspect_filepair, prefix,
+		       ctx.qry.ignorews);
+	for (i = 0; i<files; i++)
+		print_fileinfo(&items[i]);
+	html("</table>");
+	html("<div class='diffstat-summary'>");
+	htmlf("%d files changed, %d insertions, %d deletions",
+	      files, total_adds, total_rems);
+	html("</div>");
+}
+
+
+/*
+ * print a single line returned from xdiff
+ */
+static void print_line(char *line, int len)
+{
+	char *class = "ctx";
+	char c = line[len-1];
+
+	if (line[0] == '+')
+		class = "add";
+	else if (line[0] == '-')
+		class = "del";
+	else if (line[0] == '@')
+		class = "hunk";
+
+	htmlf("<div class='%s'>", class);
+	line[len-1] = '\0';
+	html_txt(line);
+	html("</div>");
+	line[len-1] = c;
+}
+
+static void header(const struct object_id *oid1, char *path1, int mode1,
+		   const struct object_id *oid2, char *path2, int mode2)
+{
+	char *abbrev1, *abbrev2;
+	int subproject;
+
+	subproject = (S_ISGITLINK(mode1) || S_ISGITLINK(mode2));
+	html("<div class='head'>");
+	html("diff --git a/");
+	html_txt(path1);
+	html(" b/");
+	html_txt(path2);
+
+	if (mode1 == 0)
+		htmlf("<br/>new file mode %.6o", mode2);
+
+	if (mode2 == 0)
+		htmlf("<br/>deleted file mode %.6o", mode1);
+
+	if (!subproject) {
+		abbrev1 = xstrdup(find_unique_abbrev(oid1, DEFAULT_ABBREV));
+		abbrev2 = xstrdup(find_unique_abbrev(oid2, DEFAULT_ABBREV));
+		htmlf("<br/>index %s..%s", abbrev1, abbrev2);
+		free(abbrev1);
+		free(abbrev2);
+		if (mode1 != 0 && mode2 != 0) {
+			htmlf(" %.6o", mode1);
+			if (mode2 != mode1)
+				htmlf("..%.6o", mode2);
+		}
+		if (is_null_oid(oid1)) {
+			path1 = "dev/null";
+			html("<br/>--- /");
+		} else
+			html("<br/>--- a/");
+		if (mode1 != 0)
+			cgit_tree_link(path1, NULL, NULL, ctx.qry.head,
+				       oid_to_hex(old_rev_oid), path1);
+		else
+			html_txt(path1);
+		if (is_null_oid(oid2)) {
+			path2 = "dev/null";
+			html("<br/>+++ /");
+		} else
+			html("<br/>+++ b/");
+		if (mode2 != 0)
+			cgit_tree_link(path2, NULL, NULL, ctx.qry.head,
+				       oid_to_hex(new_rev_oid), path2);
+		else
+			html_txt(path2);
+	}
+	html("</div>");
+}
+
+static void filepair_cb(struct diff_filepair *pair)
+{
+	unsigned long old_size = 0;
+	unsigned long new_size = 0;
+	int binary = 0;
+	linediff_fn print_line_fn = print_line;
+
+	if (!show_filepair(pair))
+		return;
+
+	current_filepair = pair;
+	if (use_ssdiff) {
+		cgit_ssdiff_header_begin();
+		print_line_fn = cgit_ssdiff_line_cb;
+	}
+	header(&pair->one->oid, pair->one->path, pair->one->mode,
+	       &pair->two->oid, pair->two->path, pair->two->mode);
+	if (use_ssdiff)
+		cgit_ssdiff_header_end();
+	if (S_ISGITLINK(pair->one->mode) || S_ISGITLINK(pair->two->mode)) {
+		if (S_ISGITLINK(pair->one->mode))
+			print_line_fn(fmt("-Subproject %s", oid_to_hex(&pair->one->oid)), 52);
+		if (S_ISGITLINK(pair->two->mode))
+			print_line_fn(fmt("+Subproject %s", oid_to_hex(&pair->two->oid)), 52);
+		if (use_ssdiff)
+			cgit_ssdiff_footer();
+		return;
+	}
+	if (cgit_diff_files(&pair->one->oid, &pair->two->oid, &old_size,
+			    &new_size, &binary, ctx.qry.context,
+			    ctx.qry.ignorews, print_line_fn))
+		cgit_print_error("Error running diff");
+	if (binary) {
+		if (use_ssdiff)
+			html("<tr><td colspan='4'>Binary files differ</td></tr>");
+		else
+			html("Binary files differ");
+	}
+	if (use_ssdiff)
+		cgit_ssdiff_footer();
+}
+
+void cgit_print_diff_ctrls(void)
+{
+	int i, curr;
+
+	html("<div class='cgit-panel'>");
+	html("<b>diff options</b>");
+	html("<form method='get'>");
+	cgit_add_hidden_formfields(1, 0, ctx.qry.page);
+	html("<table>");
+	html("<tr><td colspan='2'/></tr>");
+	html("<tr>");
+	html("<td class='label'>context:</td>");
+	html("<td class='ctrl'>");
+	html("<select name='context' onchange='this.form.submit();'>");
+	curr = ctx.qry.context;
+	if (!curr)
+		curr = 3;
+	for (i = 1; i <= 10; i++)
+		html_intoption(i, fmt("%d", i), curr);
+	for (i = 15; i <= 40; i += 5)
+		html_intoption(i, fmt("%d", i), curr);
+	html("</select>");
+	html("</td>");
+	html("</tr><tr>");
+	html("<td class='label'>space:</td>");
+	html("<td class='ctrl'>");
+	html("<select name='ignorews' onchange='this.form.submit();'>");
+	html_intoption(0, "include", ctx.qry.ignorews);
+	html_intoption(1, "ignore", ctx.qry.ignorews);
+	html("</select>");
+	html("</td>");
+	html("</tr><tr>");
+	html("<td class='label'>mode:</td>");
+	html("<td class='ctrl'>");
+	html("<select name='dt' onchange='this.form.submit();'>");
+	curr = ctx.qry.has_difftype ? ctx.qry.difftype : ctx.cfg.difftype;
+	html_intoption(0, "unified", curr);
+	html_intoption(1, "ssdiff", curr);
+	html_intoption(2, "stat only", curr);
+	html("</select></td></tr>");
+	html("<tr><td/><td class='ctrl'>");
+	html("<noscript><input type='submit' value='reload'/></noscript>");
+	html("</td></tr></table>");
+	html("</form>");
+	html("</div>");
+}
+
+void cgit_print_diff(const char *new_rev, const char *old_rev,
+		     const char *prefix, int show_ctrls, int raw)
+{
+	struct commit *commit, *commit2;
+	const struct object_id *old_tree_oid, *new_tree_oid;
+	diff_type difftype;
+
+	/*
+	 * If "follow" is set then the diff machinery needs to examine the
+	 * entire commit to detect renames so we must limit the paths in our
+	 * own callbacks and not pass the prefix to the diff machinery.
+	 */
+	if (ctx.qry.follow && ctx.cfg.enable_follow_links) {
+		current_prefix = prefix;
+		prefix = "";
+	} else {
+		current_prefix = NULL;
+	}
+
+	if (!new_rev)
+		new_rev = ctx.qry.head;
+	if (get_oid(new_rev, new_rev_oid)) {
+		cgit_print_error_page(404, "Not found",
+			"Bad object name: %s", new_rev);
+		return;
+	}
+	commit = lookup_commit_reference(the_repository, new_rev_oid);
+	if (!commit || parse_commit(commit)) {
+		cgit_print_error_page(404, "Not found",
+			"Bad commit: %s", oid_to_hex(new_rev_oid));
+		return;
+	}
+	new_tree_oid = &commit->maybe_tree->object.oid;
+
+	if (old_rev) {
+		if (get_oid(old_rev, old_rev_oid)) {
+			cgit_print_error_page(404, "Not found",
+				"Bad object name: %s", old_rev);
+			return;
+		}
+	} else if (commit->parents && commit->parents->item) {
+		oidcpy(old_rev_oid, &commit->parents->item->object.oid);
+	} else {
+		oidclr(old_rev_oid);
+	}
+
+	if (!is_null_oid(old_rev_oid)) {
+		commit2 = lookup_commit_reference(the_repository, old_rev_oid);
+		if (!commit2 || parse_commit(commit2)) {
+			cgit_print_error_page(404, "Not found",
+				"Bad commit: %s", oid_to_hex(old_rev_oid));
+			return;
+		}
+		old_tree_oid = &commit2->maybe_tree->object.oid;
+	} else {
+		old_tree_oid = NULL;
+	}
+
+	if (raw) {
+		struct diff_options diffopt;
+
+		diff_setup(&diffopt);
+		diffopt.output_format = DIFF_FORMAT_PATCH;
+		diffopt.flags.recursive = 1;
+		diff_setup_done(&diffopt);
+
+		ctx.page.mimetype = "text/plain";
+		cgit_print_http_headers();
+		if (old_tree_oid) {
+			diff_tree_oid(old_tree_oid, new_tree_oid, "",
+				       &diffopt);
+		} else {
+			diff_root_tree_oid(new_tree_oid, "", &diffopt);
+		}
+		diffcore_std(&diffopt);
+		diff_flush(&diffopt);
+
+		return;
+	}
+
+	difftype = ctx.qry.has_difftype ? ctx.qry.difftype : ctx.cfg.difftype;
+	use_ssdiff = difftype == DIFF_SSDIFF;
+
+	if (show_ctrls) {
+		cgit_print_layout_start();
+		cgit_print_diff_ctrls();
+	}
+
+	/*
+	 * Clicking on a link to a file in the diff stat should show a diff
+	 * of the file, showing the diff stat limited to a single file is
+	 * pretty useless.  All links from this point on will be to
+	 * individual files, so we simply reset the difftype in the query
+	 * here to avoid propagating DIFF_STATONLY to the individual files.
+	 */
+	if (difftype == DIFF_STATONLY)
+		ctx.qry.difftype = ctx.cfg.difftype;
+
+	cgit_print_diffstat(old_rev_oid, new_rev_oid, prefix);
+
+	if (difftype == DIFF_STATONLY)
+		return;
+
+	if (use_ssdiff) {
+		html("<table summary='ssdiff' class='ssdiff'>");
+	} else {
+		html("<table summary='diff' class='diff'>");
+		html("<tr><td>");
+	}
+	cgit_diff_tree(old_rev_oid, new_rev_oid, filepair_cb, prefix,
+		       ctx.qry.ignorews);
+	if (!use_ssdiff)
+		html("</td></tr>");
+	html("</table>");
+
+	if (show_ctrls)
+		cgit_print_layout_end();
+}
diff --git a/third_party/cgit/ui-diff.h b/third_party/cgit/ui-diff.h
new file mode 100644
index 0000000000..39264a164f
--- /dev/null
+++ b/third_party/cgit/ui-diff.h
@@ -0,0 +1,15 @@
+#ifndef UI_DIFF_H
+#define UI_DIFF_H
+
+extern void cgit_print_diff_ctrls(void);
+
+extern void cgit_print_diff(const char *new_hex, const char *old_hex,
+			    const char *prefix, int show_ctrls, int raw);
+
+extern struct diff_filespec *cgit_get_current_old_file(void);
+extern struct diff_filespec *cgit_get_current_new_file(void);
+
+extern struct object_id old_rev_oid[1];
+extern struct object_id new_rev_oid[1];
+
+#endif /* UI_DIFF_H */
diff --git a/third_party/cgit/ui-log.c b/third_party/cgit/ui-log.c
new file mode 100644
index 0000000000..dc5cb1eb6a
--- /dev/null
+++ b/third_party/cgit/ui-log.c
@@ -0,0 +1,550 @@
+/* ui-log.c: functions for log output
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-log.h"
+#include "html.h"
+#include "ui-shared.h"
+#include "argv-array.h"
+
+static int files, add_lines, rem_lines, lines_counted;
+
+/*
+ * The list of available column colors in the commit graph.
+ */
+static const char *column_colors_html[] = {
+	"<span class='column1'>",
+	"<span class='column2'>",
+	"<span class='column3'>",
+	"<span class='column4'>",
+	"<span class='column5'>",
+	"<span class='column6'>",
+	"</span>",
+};
+
+#define COLUMN_COLORS_HTML_MAX (ARRAY_SIZE(column_colors_html) - 1)
+
+static void count_lines(char *line, int size)
+{
+	if (size <= 0)
+		return;
+
+	if (line[0] == '+')
+		add_lines++;
+
+	else if (line[0] == '-')
+		rem_lines++;
+}
+
+static void inspect_files(struct diff_filepair *pair)
+{
+	unsigned long old_size = 0;
+	unsigned long new_size = 0;
+	int binary = 0;
+
+	files++;
+	if (ctx.repo->enable_log_linecount)
+		cgit_diff_files(&pair->one->oid, &pair->two->oid, &old_size,
+				&new_size, &binary, 0, ctx.qry.ignorews,
+				count_lines);
+}
+
+void show_commit_decorations(struct commit *commit)
+{
+	const struct name_decoration *deco;
+	static char buf[1024];
+
+	buf[sizeof(buf) - 1] = 0;
+	deco = get_name_decoration(&commit->object);
+	if (!deco)
+		return;
+	html("<span class='decoration'>");
+	while (deco) {
+		struct object_id peeled;
+		int is_annotated = 0;
+		strlcpy(buf, prettify_refname(deco->name), sizeof(buf));
+		switch(deco->type) {
+		case DECORATION_NONE:
+			/* If the git-core doesn't recognize it,
+			 * don't display anything. */
+			break;
+		case DECORATION_REF_LOCAL:
+			cgit_log_link(buf, NULL, "branch-deco", buf, NULL,
+				ctx.qry.vpath, 0, NULL, NULL,
+				ctx.qry.showmsg, 0);
+			break;
+		case DECORATION_REF_TAG:
+			if (!peel_ref(deco->name, &peeled))
+				is_annotated = !oidcmp(&commit->object.oid, &peeled);
+			cgit_tag_link(buf, NULL, is_annotated ? "tag-annotated-deco" : "tag-deco", buf);
+			break;
+		case DECORATION_REF_REMOTE:
+			if (!ctx.repo->enable_remote_branches)
+				break;
+			cgit_log_link(buf, NULL, "remote-deco", NULL,
+				oid_to_hex(&commit->object.oid),
+				ctx.qry.vpath, 0, NULL, NULL,
+				ctx.qry.showmsg, 0);
+			break;
+		default:
+			cgit_commit_link(buf, NULL, "deco", ctx.qry.head,
+					oid_to_hex(&commit->object.oid),
+					ctx.qry.vpath);
+			break;
+		}
+		deco = deco->next;
+	}
+	html("</span>");
+}
+
+static void handle_rename(struct diff_filepair *pair)
+{
+	/*
+	 * After we have seen a rename, we generate links to the previous
+	 * name of the file so that commit & diff views get fed the path
+	 * that is correct for the commit they are showing, avoiding the
+	 * need to walk the entire history leading back to every commit we
+	 * show in order detect renames.
+	 */
+	if (0 != strcmp(ctx.qry.vpath, pair->two->path)) {
+		free(ctx.qry.vpath);
+		ctx.qry.vpath = xstrdup(pair->two->path);
+	}
+	inspect_files(pair);
+}
+
+static int show_commit(struct commit *commit, struct rev_info *revs)
+{
+	struct commit_list *parents = commit->parents;
+	struct commit *parent;
+	int found = 0, saved_fmt;
+	struct diff_flags saved_flags = revs->diffopt.flags;
+
+	/* Always show if we're not in "follow" mode with a single file. */
+	if (!ctx.qry.follow)
+		return 1;
+
+	/*
+	 * In "follow" mode, we don't show merges.  This is consistent with
+	 * "git log --follow -- <file>".
+	 */
+	if (parents && parents->next)
+		return 0;
+
+	/*
+	 * If this is the root commit, do what rev_info tells us.
+	 */
+	if (!parents)
+		return revs->show_root_diff;
+
+	/* When we get here we have precisely one parent. */
+	parent = parents->item;
+	/* If we can't parse the commit, let print_commit() report an error. */
+	if (parse_commit(parent))
+		return 1;
+
+	files = 0;
+	add_lines = 0;
+	rem_lines = 0;
+
+	revs->diffopt.flags.recursive = 1;
+	diff_tree_oid(&parent->maybe_tree->object.oid,
+		      &commit->maybe_tree->object.oid,
+		      "", &revs->diffopt);
+	diffcore_std(&revs->diffopt);
+
+	found = !diff_queue_is_empty();
+	saved_fmt = revs->diffopt.output_format;
+	revs->diffopt.output_format = DIFF_FORMAT_CALLBACK;
+	revs->diffopt.format_callback = cgit_diff_tree_cb;
+	revs->diffopt.format_callback_data = handle_rename;
+	diff_flush(&revs->diffopt);
+	revs->diffopt.output_format = saved_fmt;
+	revs->diffopt.flags = saved_flags;
+
+	lines_counted = 1;
+	return found;
+}
+
+static void print_commit(struct commit *commit, struct rev_info *revs)
+{
+	struct commitinfo *info;
+	int columns = revs->graph ? 4 : 3;
+	struct strbuf graphbuf = STRBUF_INIT;
+	struct strbuf msgbuf = STRBUF_INIT;
+
+	if (ctx.repo->enable_log_filecount)
+		columns++;
+	if (ctx.repo->enable_log_linecount)
+		columns++;
+
+	if (revs->graph) {
+		/* Advance graph until current commit */
+		while (!graph_next_line(revs->graph, &graphbuf)) {
+			/* Print graph segment in otherwise empty table row */
+			html("<tr class='nohover'><td class='commitgraph'>");
+			html(graphbuf.buf);
+			htmlf("</td><td colspan='%d' /></tr>\n", columns);
+			strbuf_setlen(&graphbuf, 0);
+		}
+		/* Current commit's graph segment is now ready in graphbuf */
+	}
+
+	info = cgit_parse_commit(commit);
+	htmlf("<tr%s>", ctx.qry.showmsg ? " class='logheader'" : "");
+
+	if (revs->graph) {
+		/* Print graph segment for current commit */
+		html("<td class='commitgraph'>");
+		html(graphbuf.buf);
+		html("</td>");
+		strbuf_setlen(&graphbuf, 0);
+	}
+	else {
+		html("<td>");
+		cgit_print_age(info->committer_date, info->committer_tz, TM_WEEK * 2);
+		html("</td>");
+	}
+
+	htmlf("<td%s>", ctx.qry.showmsg ? " class='logsubject'" : "");
+	if (ctx.qry.showmsg) {
+		/* line-wrap long commit subjects instead of truncating them */
+		size_t subject_len = strlen(info->subject);
+
+		if (subject_len > ctx.cfg.max_msg_len &&
+		    ctx.cfg.max_msg_len >= 15) {
+			/* symbol for signaling line-wrap (in PAGE_ENCODING) */
+			const char wrap_symbol[] = { ' ', 0xE2, 0x86, 0xB5, 0 };
+			int i = ctx.cfg.max_msg_len - strlen(wrap_symbol);
+
+			/* Rewind i to preceding space character */
+			while (i > 0 && !isspace(info->subject[i]))
+				--i;
+			if (!i) /* Oops, zero spaces. Reset i */
+				i = ctx.cfg.max_msg_len - strlen(wrap_symbol);
+
+			/* add remainder starting at i to msgbuf */
+			strbuf_add(&msgbuf, info->subject + i, subject_len - i);
+			strbuf_trim(&msgbuf);
+			strbuf_add(&msgbuf, "\n\n", 2);
+
+			/* Place wrap_symbol at position i in info->subject */
+			strlcpy(info->subject + i, wrap_symbol, subject_len - i + 1);
+		}
+	}
+	cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head,
+			 oid_to_hex(&commit->object.oid), ctx.qry.vpath);
+	show_commit_decorations(commit);
+	html("</td><td>");
+	cgit_open_filter(ctx.repo->email_filter, info->author_email, "log");
+	html_txt(info->author);
+	cgit_close_filter(ctx.repo->email_filter);
+
+	if (revs->graph) {
+		html("</td><td>");
+		cgit_print_age(info->committer_date, info->committer_tz, TM_WEEK * 2);
+	}
+
+	if (!lines_counted && (ctx.repo->enable_log_filecount ||
+			       ctx.repo->enable_log_linecount)) {
+		files = 0;
+		add_lines = 0;
+		rem_lines = 0;
+		cgit_diff_commit(commit, inspect_files, ctx.qry.vpath);
+	}
+
+	if (ctx.repo->enable_log_filecount)
+		htmlf("</td><td>%d", files);
+	if (ctx.repo->enable_log_linecount)
+		htmlf("</td><td><span class='deletions'>-%d</span>/"
+			"<span class='insertions'>+%d</span>", rem_lines, add_lines);
+
+	html("</td></tr>\n");
+
+	if ((revs->graph && !graph_is_commit_finished(revs->graph))
+			|| ctx.qry.showmsg) { /* Print a second table row */
+		html("<tr class='nohover-highlight'>");
+
+		if (ctx.qry.showmsg) {
+			/* Concatenate commit message + notes in msgbuf */
+			if (info->msg && *(info->msg)) {
+				strbuf_addstr(&msgbuf, info->msg);
+				strbuf_addch(&msgbuf, '\n');
+			}
+			format_display_notes(&commit->object.oid,
+					     &msgbuf, PAGE_ENCODING, 0);
+			strbuf_addch(&msgbuf, '\n');
+			strbuf_ltrim(&msgbuf);
+		}
+
+		if (revs->graph) {
+			int lines = 0;
+
+			/* Calculate graph padding */
+			if (ctx.qry.showmsg) {
+				/* Count #lines in commit message + notes */
+				const char *p = msgbuf.buf;
+				lines = 1;
+				while ((p = strchr(p, '\n'))) {
+					p++;
+					lines++;
+				}
+			}
+
+			/* Print graph padding */
+			html("<td class='commitgraph'>");
+			while (lines > 0 || !graph_is_commit_finished(revs->graph)) {
+				if (graphbuf.len)
+					html("\n");
+				strbuf_setlen(&graphbuf, 0);
+				graph_next_line(revs->graph, &graphbuf);
+				html(graphbuf.buf);
+				lines--;
+			}
+			html("</td>\n");
+		}
+		else
+			html("<td/>"); /* Empty 'Age' column */
+
+		/* Print msgbuf into remainder of table row */
+		htmlf("<td colspan='%d'%s>\n", columns - (revs->graph ? 1 : 0),
+			ctx.qry.showmsg ? " class='logmsg'" : "");
+		html_txt(msgbuf.buf);
+		html("</td></tr>\n");
+	}
+
+	strbuf_release(&msgbuf);
+	strbuf_release(&graphbuf);
+	cgit_free_commitinfo(info);
+}
+
+static const char *disambiguate_ref(const char *ref, int *must_free_result)
+{
+	struct object_id oid;
+	struct strbuf longref = STRBUF_INIT;
+
+	strbuf_addf(&longref, "refs/heads/%s", ref);
+	if (get_oid(longref.buf, &oid) == 0) {
+		*must_free_result = 1;
+		return strbuf_detach(&longref, NULL);
+	}
+
+	*must_free_result = 0;
+	strbuf_release(&longref);
+	return ref;
+}
+
+static char *next_token(char **src)
+{
+	char *result;
+
+	if (!src || !*src)
+		return NULL;
+	while (isspace(**src))
+		(*src)++;
+	if (!**src)
+		return NULL;
+	result = *src;
+	while (**src) {
+		if (isspace(**src)) {
+			**src = '\0';
+			(*src)++;
+			break;
+		}
+		(*src)++;
+	}
+	return result;
+}
+
+void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern,
+		    const char *path, int pager, int commit_graph, int commit_sort)
+{
+	struct rev_info rev;
+	struct commit *commit;
+	struct argv_array rev_argv = ARGV_ARRAY_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");
+
+	if (!tip)
+		tip = ctx.qry.head;
+	tip = disambiguate_ref(tip, &must_free_tip);
+	argv_array_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);
+		} else if (!strcmp(grep, "range")) {
+			char *arg;
+			/* Split the pattern at whitespace and add each token
+			 * as a revision expression. Do not accept other
+			 * rev-list options. Also, replace the previously
+			 * pushed tip (it's no longer relevant).
+			 */
+			argv_array_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);
+			}
+		}
+	}
+
+	if (!path || !ctx.cfg.enable_follow_links) {
+		/*
+		 * If we don't have a path, "follow" is a no-op so make sure
+		 * the variable is set to false to avoid needing to check
+		 * both this and whether we have a path everywhere.
+		 */
+		ctx.qry.follow = 0;
+	}
+
+	if (commit_graph && !ctx.qry.follow) {
+		argv_array_push(&rev_argv, "--graph");
+		argv_array_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");
+	else if (commit_sort == 2)
+		argv_array_push(&rev_argv, "--topo-order");
+
+	if (path && ctx.qry.follow)
+		argv_array_push(&rev_argv, "--follow");
+	argv_array_push(&rev_argv, "--");
+	if (path)
+		argv_array_push(&rev_argv, path);
+
+	init_revisions(&rev, NULL);
+	rev.abbrev = DEFAULT_ABBREV;
+	rev.commit_format = CMIT_FMT_DEFAULT;
+	rev.verbose_header = 1;
+	rev.show_root_diff = 0;
+	rev.ignore_missing = 1;
+	rev.simplify_history = 1;
+	setup_revisions(rev_argv.argc, rev_argv.argv, &rev, NULL);
+	load_ref_decorations(NULL, DECORATE_FULL_REFS);
+	rev.show_decorations = 1;
+	rev.grep_filter.ignore_case = 1;
+
+	rev.diffopt.detect_rename = 1;
+	rev.diffopt.rename_limit = ctx.cfg.renamelimit;
+	if (ctx.qry.ignorews)
+		DIFF_XDL_SET(&rev.diffopt, IGNORE_WHITESPACE);
+
+	compile_grep_patterns(&rev.grep_filter);
+	prepare_revision_walk(&rev);
+
+	if (pager) {
+		cgit_print_layout_start();
+		html("<table class='list nowrap'>");
+	}
+
+	html("<tr class='nohover'>");
+	if (commit_graph)
+		html("<th></th>");
+	else
+		html("<th class='left'>Age</th>");
+	html("<th class='left'>Commit message");
+	if (pager) {
+		html(" (");
+		cgit_log_link(ctx.qry.showmsg ? "Collapse" : "Expand", NULL,
+			      NULL, ctx.qry.head, ctx.qry.sha1,
+			      ctx.qry.vpath, ctx.qry.ofs, ctx.qry.grep,
+			      ctx.qry.search, ctx.qry.showmsg ? 0 : 1,
+			      ctx.qry.follow);
+		html(")");
+	}
+	html("</th><th class='left'>Author</th>");
+	if (rev.graph)
+		html("<th class='left'>Age</th>");
+	if (ctx.repo->enable_log_filecount) {
+		html("<th class='left'>Files</th>");
+		columns++;
+	}
+	if (ctx.repo->enable_log_linecount) {
+		html("<th class='left'>Lines</th>");
+		columns++;
+	}
+	html("</tr>\n");
+
+	if (ofs<0)
+		ofs = 0;
+
+	for (i = 0; i < ofs && (commit = get_revision(&rev)) != NULL; /* nop */) {
+		if (show_commit(commit, &rev))
+			i++;
+		free_commit_buffer(the_repository->parsed_objects, commit);
+		free_commit_list(commit->parents);
+		commit->parents = NULL;
+	}
+
+	for (i = 0; i < cnt && (commit = get_revision(&rev)) != NULL; /* nop */) {
+		/*
+		 * In "follow" mode, we must count the files and lines the
+		 * first time we invoke diff on a given commit, and we need
+		 * to do that to see if the commit touches the path we care
+		 * about, so we do it in show_commit.  Hence we must clear
+		 * lines_counted here.
+		 *
+		 * This has the side effect of avoiding running diff twice
+		 * when we are both following renames and showing file
+		 * and/or line counts.
+		 */
+		lines_counted = 0;
+		if (show_commit(commit, &rev)) {
+			i++;
+			print_commit(commit, &rev);
+		}
+		free_commit_buffer(the_repository->parsed_objects, commit);
+		free_commit_list(commit->parents);
+		commit->parents = NULL;
+	}
+	if (pager) {
+		html("</table><ul class='pager'>");
+		if (ofs > 0) {
+			html("<li>");
+			cgit_log_link("[prev]", NULL, NULL, ctx.qry.head,
+				      ctx.qry.sha1, ctx.qry.vpath,
+				      ofs - cnt, ctx.qry.grep,
+				      ctx.qry.search, ctx.qry.showmsg,
+				      ctx.qry.follow);
+			html("</li>");
+		}
+		if ((commit = get_revision(&rev)) != NULL) {
+			html("<li>");
+			cgit_log_link("[next]", NULL, NULL, ctx.qry.head,
+				      ctx.qry.sha1, ctx.qry.vpath,
+				      ofs + cnt, ctx.qry.grep,
+				      ctx.qry.search, ctx.qry.showmsg,
+				      ctx.qry.follow);
+			html("</li>");
+		}
+		html("</ul>");
+		cgit_print_layout_end();
+	} else if ((commit = get_revision(&rev)) != NULL) {
+		htmlf("<tr class='nohover'><td colspan='%d'>", columns);
+		cgit_log_link("[...]", NULL, NULL, ctx.qry.head, NULL,
+			      ctx.qry.vpath, 0, NULL, NULL, ctx.qry.showmsg,
+			      ctx.qry.follow);
+		html("</td></tr>\n");
+	}
+
+	/* If we allocated tip then it is safe to cast away const. */
+	if (must_free_tip)
+		free((char*) tip);
+}
diff --git a/third_party/cgit/ui-log.h b/third_party/cgit/ui-log.h
new file mode 100644
index 0000000000..325607cdab
--- /dev/null
+++ b/third_party/cgit/ui-log.h
@@ -0,0 +1,9 @@
+#ifndef UI_LOG_H
+#define UI_LOG_H
+
+extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep,
+			   char *pattern, const char *path, int pager,
+			   int commit_graph, int commit_sort);
+extern void show_commit_decorations(struct commit *commit);
+
+#endif /* UI_LOG_H */
diff --git a/third_party/cgit/ui-patch.c b/third_party/cgit/ui-patch.c
new file mode 100644
index 0000000000..5a964108e5
--- /dev/null
+++ b/third_party/cgit/ui-patch.c
@@ -0,0 +1,98 @@
+/* ui-patch.c: generate patch view
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-patch.h"
+#include "html.h"
+#include "ui-shared.h"
+
+/* two commit hashes with two dots in between and termination */
+#define REV_RANGE_LEN 2 * GIT_MAX_HEXSZ + 3
+
+void cgit_print_patch(const char *new_rev, const char *old_rev,
+		      const char *prefix)
+{
+	struct rev_info rev;
+	struct commit *commit;
+	struct object_id new_rev_oid, old_rev_oid;
+	char rev_range[REV_RANGE_LEN];
+	const char *rev_argv[] = { NULL, "--reverse", "--format=email", rev_range, "--", prefix, NULL };
+	int rev_argc = ARRAY_SIZE(rev_argv) - 1;
+	char *patchname;
+
+	if (!prefix)
+		rev_argc--;
+
+	if (!new_rev)
+		new_rev = ctx.qry.head;
+
+	if (get_oid(new_rev, &new_rev_oid)) {
+		cgit_print_error_page(404, "Not found",
+				"Bad object id: %s", new_rev);
+		return;
+	}
+	commit = lookup_commit_reference(the_repository, &new_rev_oid);
+	if (!commit) {
+		cgit_print_error_page(404, "Not found",
+				"Bad commit reference: %s", new_rev);
+		return;
+	}
+
+	if (old_rev) {
+		if (get_oid(old_rev, &old_rev_oid)) {
+			cgit_print_error_page(404, "Not found",
+					"Bad object id: %s", old_rev);
+			return;
+		}
+		if (!lookup_commit_reference(the_repository, &old_rev_oid)) {
+			cgit_print_error_page(404, "Not found",
+					"Bad commit reference: %s", old_rev);
+			return;
+		}
+	} else if (commit->parents && commit->parents->item) {
+		oidcpy(&old_rev_oid, &commit->parents->item->object.oid);
+	} else {
+		oidclr(&old_rev_oid);
+	}
+
+	if (is_null_oid(&old_rev_oid)) {
+		memcpy(rev_range, oid_to_hex(&new_rev_oid), GIT_SHA1_HEXSZ + 1);
+	} else {
+		xsnprintf(rev_range, REV_RANGE_LEN, "%s..%s", oid_to_hex(&old_rev_oid),
+			oid_to_hex(&new_rev_oid));
+	}
+
+	patchname = fmt("%s.patch", rev_range);
+	ctx.page.mimetype = "text/plain";
+	ctx.page.filename = patchname;
+	cgit_print_http_headers();
+
+	if (ctx.cfg.noplainemail) {
+		rev_argv[2] = "--format=format:From %H Mon Sep 17 00:00:00 "
+			      "2001%nFrom: %an%nDate: %aD%n%w(78,0,1)Subject: "
+			      "%s%n%n%w(0)%b";
+	}
+
+	init_revisions(&rev, NULL);
+	rev.abbrev = DEFAULT_ABBREV;
+	rev.verbose_header = 1;
+	rev.diff = 1;
+	rev.show_root_diff = 1;
+	rev.max_parents = 1;
+	rev.diffopt.output_format |= DIFF_FORMAT_DIFFSTAT |
+			DIFF_FORMAT_PATCH | DIFF_FORMAT_SUMMARY;
+	if (prefix)
+		rev.diffopt.stat_sep = fmt("(limited to '%s')\n\n", prefix);
+	setup_revisions(rev_argc, rev_argv, &rev, NULL);
+	prepare_revision_walk(&rev);
+
+	while ((commit = get_revision(&rev)) != NULL) {
+		log_tree_commit(&rev, commit);
+		printf("-- \ncgit %s\n\n", cgit_version);
+	}
+}
diff --git a/third_party/cgit/ui-patch.h b/third_party/cgit/ui-patch.h
new file mode 100644
index 0000000000..7a6cacd5ac
--- /dev/null
+++ b/third_party/cgit/ui-patch.h
@@ -0,0 +1,7 @@
+#ifndef UI_PATCH_H
+#define UI_PATCH_H
+
+extern void cgit_print_patch(const char *new_rev, const char *old_rev,
+			     const char *prefix);
+
+#endif /* UI_PATCH_H */
diff --git a/third_party/cgit/ui-plain.c b/third_party/cgit/ui-plain.c
new file mode 100644
index 0000000000..b73c1cfed1
--- /dev/null
+++ b/third_party/cgit/ui-plain.c
@@ -0,0 +1,207 @@
+/* ui-plain.c: functions for output of plain blobs by path
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-plain.h"
+#include "html.h"
+#include "ui-shared.h"
+
+struct walk_tree_context {
+	int match_baselen;
+	int match;
+};
+
+static int print_object(const struct object_id *oid, const char *path)
+{
+	enum object_type type;
+	char *buf, *mimetype;
+	unsigned long size;
+
+	type = oid_object_info(the_repository, oid, &size);
+	if (type == OBJ_BAD) {
+		cgit_print_error_page(404, "Not found", "Not found");
+		return 0;
+	}
+
+	buf = read_object_file(oid, &type, &size);
+	if (!buf) {
+		cgit_print_error_page(404, "Not found", "Not found");
+		return 0;
+	}
+
+	mimetype = get_mimetype_for_filename(path);
+	ctx.page.mimetype = mimetype;
+
+	if (!ctx.repo->enable_html_serving) {
+		html("X-Content-Type-Options: nosniff\n");
+		html("Content-Security-Policy: default-src 'none'\n");
+		if (mimetype) {
+			/* Built-in white list allows PDF and everything that isn't text/ and application/ */
+			if ((!strncmp(mimetype, "text/", 5) || !strncmp(mimetype, "application/", 12)) && strcmp(mimetype, "application/pdf"))
+				ctx.page.mimetype = NULL;
+		}
+	}
+
+	if (!ctx.page.mimetype) {
+		if (buffer_is_binary(buf, size)) {
+			ctx.page.mimetype = "application/octet-stream";
+			ctx.page.charset = NULL;
+		} else {
+			ctx.page.mimetype = "text/plain";
+		}
+	}
+	ctx.page.filename = path;
+	ctx.page.size = size;
+	ctx.page.etag = oid_to_hex(oid);
+	cgit_print_http_headers();
+	html_raw(buf, size);
+	free(mimetype);
+	free(buf);
+	return 1;
+}
+
+static char *buildpath(const char *base, int baselen, const char *path)
+{
+	if (path[0])
+		return fmtalloc("%.*s%s/", baselen, base, path);
+	else
+		return fmtalloc("%.*s/", baselen, base);
+}
+
+static void print_dir(const struct object_id *oid, const char *base,
+		      int baselen, const char *path)
+{
+	char *fullpath, *slash;
+	size_t len;
+
+	fullpath = buildpath(base, baselen, path);
+	slash = (fullpath[0] == '/' ? "" : "/");
+	ctx.page.etag = oid_to_hex(oid);
+	cgit_print_http_headers();
+	htmlf("<html><head><title>%s", slash);
+	html_txt(fullpath);
+	htmlf("</title></head>\n<body>\n<h2>%s", slash);
+	html_txt(fullpath);
+	html("</h2>\n<ul>\n");
+	len = strlen(fullpath);
+	if (len > 1) {
+		fullpath[len - 1] = 0;
+		slash = strrchr(fullpath, '/');
+		if (slash)
+			*(slash + 1) = 0;
+		else {
+			free(fullpath);
+			fullpath = NULL;
+		}
+		html("<li>");
+		cgit_plain_link("../", NULL, NULL, ctx.qry.head, ctx.qry.sha1,
+				fullpath);
+		html("</li>\n");
+	}
+	free(fullpath);
+}
+
+static void print_dir_entry(const struct object_id *oid, const char *base,
+			    int baselen, const char *path, unsigned mode)
+{
+	char *fullpath;
+
+	fullpath = buildpath(base, baselen, path);
+	if (!S_ISDIR(mode) && !S_ISGITLINK(mode))
+		fullpath[strlen(fullpath) - 1] = 0;
+	html("  <li>");
+	if (S_ISGITLINK(mode)) {
+		cgit_submodule_link(NULL, fullpath, oid_to_hex(oid));
+	} else
+		cgit_plain_link(path, NULL, NULL, ctx.qry.head, ctx.qry.sha1,
+				fullpath);
+	html("</li>\n");
+	free(fullpath);
+}
+
+static void print_dir_tail(void)
+{
+	html(" </ul>\n</body></html>\n");
+}
+
+static int walk_tree(const struct object_id *oid, struct strbuf *base,
+		const char *pathname, unsigned mode, int stage, void *cbdata)
+{
+	struct walk_tree_context *walk_tree_ctx = cbdata;
+
+	if (base->len == walk_tree_ctx->match_baselen) {
+		if (S_ISREG(mode) || S_ISLNK(mode)) {
+			if (print_object(oid, pathname))
+				walk_tree_ctx->match = 1;
+		} else if (S_ISDIR(mode)) {
+			print_dir(oid, base->buf, base->len, pathname);
+			walk_tree_ctx->match = 2;
+			return READ_TREE_RECURSIVE;
+		}
+	} else if (base->len < INT_MAX && (int)base->len > walk_tree_ctx->match_baselen) {
+		print_dir_entry(oid, base->buf, base->len, pathname, mode);
+		walk_tree_ctx->match = 2;
+	} else if (S_ISDIR(mode)) {
+		return READ_TREE_RECURSIVE;
+	}
+
+	return 0;
+}
+
+static int basedir_len(const char *path)
+{
+	char *p = strrchr(path, '/');
+	if (p)
+		return p - path + 1;
+	return 0;
+}
+
+void cgit_print_plain(void)
+{
+	const char *rev = ctx.qry.sha1;
+	struct object_id oid;
+	struct commit *commit;
+	struct pathspec_item path_items = {
+		.match = ctx.qry.path,
+		.len = ctx.qry.path ? strlen(ctx.qry.path) : 0
+	};
+	struct pathspec paths = {
+		.nr = 1,
+		.items = &path_items
+	};
+	struct walk_tree_context walk_tree_ctx = {
+		.match = 0
+	};
+
+	if (!rev)
+		rev = ctx.qry.head;
+
+	if (get_oid(rev, &oid)) {
+		cgit_print_error_page(404, "Not found", "Not found");
+		return;
+	}
+	commit = lookup_commit_reference(the_repository, &oid);
+	if (!commit || parse_commit(commit)) {
+		cgit_print_error_page(404, "Not found", "Not found");
+		return;
+	}
+	if (!path_items.match) {
+		path_items.match = "";
+		walk_tree_ctx.match_baselen = -1;
+		print_dir(&commit->maybe_tree->object.oid, "", 0, "");
+		walk_tree_ctx.match = 2;
+	}
+	else
+		walk_tree_ctx.match_baselen = basedir_len(path_items.match);
+	read_tree_recursive(the_repository, commit->maybe_tree,
+		"", 0, 0, &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)
+		print_dir_tail();
+}
diff --git a/third_party/cgit/ui-plain.h b/third_party/cgit/ui-plain.h
new file mode 100644
index 0000000000..5bff07b83b
--- /dev/null
+++ b/third_party/cgit/ui-plain.h
@@ -0,0 +1,6 @@
+#ifndef UI_PLAIN_H
+#define UI_PLAIN_H
+
+extern void cgit_print_plain(void);
+
+#endif /* UI_PLAIN_H */
diff --git a/third_party/cgit/ui-refs.c b/third_party/cgit/ui-refs.c
new file mode 100644
index 0000000000..456f610df4
--- /dev/null
+++ b/third_party/cgit/ui-refs.c
@@ -0,0 +1,219 @@
+/* ui-refs.c: browse symbolic refs
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-refs.h"
+#include "html.h"
+#include "ui-shared.h"
+
+static inline int cmp_age(int age1, int age2)
+{
+	/* age1 and age2 are assumed to be non-negative */
+	return age2 - age1;
+}
+
+static int cmp_ref_name(const void *a, const void *b)
+{
+	struct refinfo *r1 = *(struct refinfo **)a;
+	struct refinfo *r2 = *(struct refinfo **)b;
+
+	return strcmp(r1->refname, r2->refname);
+}
+
+static int cmp_branch_age(const void *a, const void *b)
+{
+	struct refinfo *r1 = *(struct refinfo **)a;
+	struct refinfo *r2 = *(struct refinfo **)b;
+
+	return cmp_age(r1->commit->committer_date, r2->commit->committer_date);
+}
+
+static int get_ref_age(struct refinfo *ref)
+{
+	if (!ref->object)
+		return 0;
+	switch (ref->object->type) {
+	case OBJ_TAG:
+		return ref->tag ? ref->tag->tagger_date : 0;
+	case OBJ_COMMIT:
+		return ref->commit ? ref->commit->committer_date : 0;
+	}
+	return 0;
+}
+
+static int cmp_tag_age(const void *a, const void *b)
+{
+	struct refinfo *r1 = *(struct refinfo **)a;
+	struct refinfo *r2 = *(struct refinfo **)b;
+
+	return cmp_age(get_ref_age(r1), get_ref_age(r2));
+}
+
+static int print_branch(struct refinfo *ref)
+{
+	struct commitinfo *info = ref->commit;
+	char *name = (char *)ref->refname;
+
+	if (!info)
+		return 1;
+	html("<tr><td>");
+	cgit_log_link(name, NULL, NULL, name, NULL, NULL, 0, NULL, NULL,
+		      ctx.qry.showmsg, 0);
+	html("</td><td>");
+
+	if (ref->object->type == OBJ_COMMIT) {
+		cgit_commit_link(info->subject, NULL, NULL, name, NULL, NULL);
+		html("</td><td>");
+		cgit_open_filter(ctx.repo->email_filter, info->author_email, "refs");
+		html_txt(info->author);
+		cgit_close_filter(ctx.repo->email_filter);
+		html("</td><td colspan='2'>");
+		cgit_print_age(info->committer_date, info->committer_tz, -1);
+	} else {
+		html("</td><td></td><td>");
+		cgit_object_link(ref->object);
+	}
+	html("</td></tr>\n");
+	return 0;
+}
+
+static void print_tag_header(void)
+{
+	html("<tr class='nohover'><th class='left'>Tag</th>"
+	     "<th class='left'>Download</th>"
+	     "<th class='left'>Author</th>"
+	     "<th class='left' colspan='2'>Age</th></tr>\n");
+}
+
+static int print_tag(struct refinfo *ref)
+{
+	struct tag *tag = NULL;
+	struct taginfo *info = NULL;
+	char *name = (char *)ref->refname;
+	struct object *obj = ref->object;
+
+	if (obj->type == OBJ_TAG) {
+		tag = (struct tag *)obj;
+		obj = tag->tagged;
+		info = ref->tag;
+		if (!info)
+			return 1;
+	}
+
+	html("<tr><td>");
+	cgit_tag_link(name, NULL, NULL, name);
+	html("</td><td>");
+	if (ctx.repo->snapshots && (obj->type == OBJ_COMMIT))
+		cgit_print_snapshot_links(ctx.repo, name, "&nbsp;&nbsp;");
+	else
+		cgit_object_link(obj);
+	html("</td><td>");
+	if (info) {
+		if (info->tagger) {
+			cgit_open_filter(ctx.repo->email_filter, info->tagger_email, "refs");
+			html_txt(info->tagger);
+			cgit_close_filter(ctx.repo->email_filter);
+		}
+	} else if (ref->object->type == OBJ_COMMIT) {
+		cgit_open_filter(ctx.repo->email_filter, ref->commit->author_email, "refs");
+		html_txt(ref->commit->author);
+		cgit_close_filter(ctx.repo->email_filter);
+	}
+	html("</td><td colspan='2'>");
+	if (info) {
+		if (info->tagger_date > 0)
+			cgit_print_age(info->tagger_date, info->tagger_tz, -1);
+	} else if (ref->object->type == OBJ_COMMIT) {
+		cgit_print_age(ref->commit->commit->date, 0, -1);
+	}
+	html("</td></tr>\n");
+
+	return 0;
+}
+
+static void print_refs_link(const char *path)
+{
+	html("<tr class='nohover'><td colspan='5'>");
+	cgit_refs_link("[...]", NULL, NULL, ctx.qry.head, NULL, path);
+	html("</td></tr>");
+}
+
+void cgit_print_branches(int maxcount)
+{
+	struct reflist list;
+	int i;
+
+	html("<tr class='nohover'><th class='left'>Branch</th>"
+	     "<th class='left'>Commit message</th>"
+	     "<th class='left'>Author</th>"
+	     "<th class='left' colspan='2'>Age</th></tr>\n");
+
+	list.refs = NULL;
+	list.alloc = list.count = 0;
+	for_each_branch_ref(cgit_refs_cb, &list);
+	if (ctx.repo->enable_remote_branches)
+		for_each_remote_ref(cgit_refs_cb, &list);
+
+	if (maxcount == 0 || maxcount > list.count)
+		maxcount = list.count;
+
+	qsort(list.refs, list.count, sizeof(*list.refs), cmp_branch_age);
+	if (ctx.repo->branch_sort == 0)
+		qsort(list.refs, maxcount, sizeof(*list.refs), cmp_ref_name);
+
+	for (i = 0; i < maxcount; i++)
+		print_branch(list.refs[i]);
+
+	if (maxcount < list.count)
+		print_refs_link("heads");
+
+	cgit_free_reflist_inner(&list);
+}
+
+void cgit_print_tags(int maxcount)
+{
+	struct reflist list;
+	int i;
+
+	list.refs = NULL;
+	list.alloc = list.count = 0;
+	for_each_tag_ref(cgit_refs_cb, &list);
+	if (list.count == 0)
+		return;
+	qsort(list.refs, list.count, sizeof(*list.refs), cmp_tag_age);
+	if (!maxcount)
+		maxcount = list.count;
+	else if (maxcount > list.count)
+		maxcount = list.count;
+	print_tag_header();
+	for (i = 0; i < maxcount; i++)
+		print_tag(list.refs[i]);
+
+	if (maxcount < list.count)
+		print_refs_link("tags");
+
+	cgit_free_reflist_inner(&list);
+}
+
+void cgit_print_refs(void)
+{
+	cgit_print_layout_start();
+	html("<table class='list nowrap'>");
+
+	if (ctx.qry.path && starts_with(ctx.qry.path, "heads"))
+		cgit_print_branches(0);
+	else if (ctx.qry.path && starts_with(ctx.qry.path, "tags"))
+		cgit_print_tags(0);
+	else {
+		cgit_print_branches(0);
+		html("<tr class='nohover'><td colspan='5'>&nbsp;</td></tr>");
+		cgit_print_tags(0);
+	}
+	html("</table>");
+	cgit_print_layout_end();
+}
diff --git a/third_party/cgit/ui-refs.h b/third_party/cgit/ui-refs.h
new file mode 100644
index 0000000000..1d4a54a2c8
--- /dev/null
+++ b/third_party/cgit/ui-refs.h
@@ -0,0 +1,8 @@
+#ifndef UI_REFS_H
+#define UI_REFS_H
+
+extern void cgit_print_branches(int maxcount);
+extern void cgit_print_tags(int maxcount);
+extern void cgit_print_refs(void);
+
+#endif /* UI_REFS_H */
diff --git a/third_party/cgit/ui-repolist.c b/third_party/cgit/ui-repolist.c
new file mode 100644
index 0000000000..7cf763891f
--- /dev/null
+++ b/third_party/cgit/ui-repolist.c
@@ -0,0 +1,379 @@
+/* ui-repolist.c: functions for generating the repolist page
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-repolist.h"
+#include "html.h"
+#include "ui-shared.h"
+
+static time_t read_agefile(const char *path)
+{
+	time_t result;
+	size_t size;
+	char *buf = NULL;
+	struct strbuf date_buf = STRBUF_INIT;
+
+	if (readfile(path, &buf, &size)) {
+		free(buf);
+		return -1;
+	}
+
+	if (parse_date(buf, &date_buf) == 0)
+		result = strtoul(date_buf.buf, NULL, 10);
+	else
+		result = 0;
+	free(buf);
+	strbuf_release(&date_buf);
+	return result;
+}
+
+static int get_repo_modtime(const struct cgit_repo *repo, time_t *mtime)
+{
+	struct strbuf path = STRBUF_INIT;
+	struct stat s;
+	struct cgit_repo *r = (struct cgit_repo *)repo;
+
+	if (repo->mtime != -1) {
+		*mtime = repo->mtime;
+		return 1;
+	}
+	strbuf_addf(&path, "%s/%s", repo->path, ctx.cfg.agefile);
+	if (stat(path.buf, &s) == 0) {
+		*mtime = read_agefile(path.buf);
+		if (*mtime) {
+			r->mtime = *mtime;
+			goto end;
+		}
+	}
+
+	strbuf_reset(&path);
+	strbuf_addf(&path, "%s/refs/heads/%s", repo->path,
+		    repo->defbranch ? repo->defbranch : "master");
+	if (stat(path.buf, &s) == 0) {
+		*mtime = s.st_mtime;
+		r->mtime = *mtime;
+		goto end;
+	}
+
+	strbuf_reset(&path);
+	strbuf_addf(&path, "%s/%s", repo->path, "packed-refs");
+	if (stat(path.buf, &s) == 0) {
+		*mtime = s.st_mtime;
+		r->mtime = *mtime;
+		goto end;
+	}
+
+	*mtime = 0;
+	r->mtime = *mtime;
+end:
+	strbuf_release(&path);
+	return (r->mtime != 0);
+}
+
+static void print_modtime(struct cgit_repo *repo)
+{
+	time_t t;
+	if (get_repo_modtime(repo, &t))
+		cgit_print_age(t, 0, -1);
+}
+
+static int is_match(struct cgit_repo *repo)
+{
+	if (!ctx.qry.search)
+		return 1;
+	if (repo->url && strcasestr(repo->url, ctx.qry.search))
+		return 1;
+	if (repo->name && strcasestr(repo->name, ctx.qry.search))
+		return 1;
+	if (repo->desc && strcasestr(repo->desc, ctx.qry.search))
+		return 1;
+	if (repo->owner && strcasestr(repo->owner, ctx.qry.search))
+		return 1;
+	return 0;
+}
+
+static int is_in_url(struct cgit_repo *repo)
+{
+	if (!ctx.qry.url)
+		return 1;
+	if (repo->url && starts_with(repo->url, ctx.qry.url))
+		return 1;
+	return 0;
+}
+
+static int is_visible(struct cgit_repo *repo)
+{
+	if (repo->hide || repo->ignore)
+		return 0;
+	if (!(is_match(repo) && is_in_url(repo)))
+		return 0;
+	return 1;
+}
+
+static int any_repos_visible(void)
+{
+	int i;
+
+	for (i = 0; i < cgit_repolist.count; i++) {
+		if (is_visible(&cgit_repolist.repos[i]))
+			return 1;
+	}
+	return 0;
+}
+
+static void print_sort_header(const char *title, const char *sort)
+{
+	char *currenturl = cgit_currenturl();
+	html("<th class='left'><a href='");
+	html_attr(currenturl);
+	htmlf("?s=%s", sort);
+	if (ctx.qry.search) {
+		html("&amp;q=");
+		html_url_arg(ctx.qry.search);
+	}
+	htmlf("'>%s</a></th>", title);
+	free(currenturl);
+}
+
+static void print_header(void)
+{
+	html("<tr class='nohover'>");
+	print_sort_header("Name", "name");
+	print_sort_header("Description", "desc");
+	if (ctx.cfg.enable_index_owner)
+		print_sort_header("Owner", "owner");
+	print_sort_header("Idle", "idle");
+	if (ctx.cfg.enable_index_links)
+		html("<th class='left'>Links</th>");
+	html("</tr>\n");
+}
+
+
+static void print_pager(int items, int pagelen, char *search, char *sort)
+{
+	int i, ofs;
+	char *class = NULL;
+	html("<ul class='pager'>");
+	for (i = 0, ofs = 0; ofs < items; i++, ofs = i * pagelen) {
+		class = (ctx.qry.ofs == ofs) ? "current" : NULL;
+		html("<li>");
+		cgit_index_link(fmt("[%d]", i + 1), fmt("Page %d", i + 1),
+				class, search, sort, ofs, 0);
+		html("</li>");
+	}
+	html("</ul>");
+}
+
+static int cmp(const char *s1, const char *s2)
+{
+	if (s1 && s2) {
+		if (ctx.cfg.case_sensitive_sort)
+			return strcmp(s1, s2);
+		else
+			return strcasecmp(s1, s2);
+	}
+	if (s1 && !s2)
+		return -1;
+	if (s2 && !s1)
+		return 1;
+	return 0;
+}
+
+static int sort_name(const void *a, const void *b)
+{
+	const struct cgit_repo *r1 = a;
+	const struct cgit_repo *r2 = b;
+
+	return cmp(r1->name, r2->name);
+}
+
+static int sort_desc(const void *a, const void *b)
+{
+	const struct cgit_repo *r1 = a;
+	const struct cgit_repo *r2 = b;
+
+	return cmp(r1->desc, r2->desc);
+}
+
+static int sort_owner(const void *a, const void *b)
+{
+	const struct cgit_repo *r1 = a;
+	const struct cgit_repo *r2 = b;
+
+	return cmp(r1->owner, r2->owner);
+}
+
+static int sort_idle(const void *a, const void *b)
+{
+	const struct cgit_repo *r1 = a;
+	const struct cgit_repo *r2 = b;
+	time_t t1, t2;
+
+	t1 = t2 = 0;
+	get_repo_modtime(r1, &t1);
+	get_repo_modtime(r2, &t2);
+	return t2 - t1;
+}
+
+static int sort_section(const void *a, const void *b)
+{
+	const struct cgit_repo *r1 = a;
+	const struct cgit_repo *r2 = b;
+	int result;
+
+	result = cmp(r1->section, r2->section);
+	if (!result) {
+		if (!strcmp(ctx.cfg.repository_sort, "age"))
+			result = sort_idle(r1, r2);
+		if (!result)
+			result = cmp(r1->name, r2->name);
+	}
+	return result;
+}
+
+struct sortcolumn {
+	const char *name;
+	int (*fn)(const void *a, const void *b);
+};
+
+static const struct sortcolumn sortcolumn[] = {
+	{"section", sort_section},
+	{"name", sort_name},
+	{"desc", sort_desc},
+	{"owner", sort_owner},
+	{"idle", sort_idle},
+	{NULL, NULL}
+};
+
+static int sort_repolist(char *field)
+{
+	const struct sortcolumn *column;
+
+	for (column = &sortcolumn[0]; column->name; column++) {
+		if (strcmp(field, column->name))
+			continue;
+		qsort(cgit_repolist.repos, cgit_repolist.count,
+			sizeof(struct cgit_repo), column->fn);
+		return 1;
+	}
+	return 0;
+}
+
+
+void cgit_print_repolist(void)
+{
+	int i, columns = 3, hits = 0, header = 0;
+	char *last_section = NULL;
+	char *section;
+	char *repourl;
+	int sorted = 0;
+
+	if (!any_repos_visible()) {
+		cgit_print_error_page(404, "Not found", "No repositories found");
+		return;
+	}
+
+	if (ctx.cfg.enable_index_links)
+		++columns;
+	if (ctx.cfg.enable_index_owner)
+		++columns;
+
+	ctx.page.title = ctx.cfg.root_title;
+	cgit_print_http_headers();
+	cgit_print_docstart();
+	cgit_print_pageheader();
+
+	if (ctx.qry.sort)
+		sorted = sort_repolist(ctx.qry.sort);
+	else if (ctx.cfg.section_sort)
+		sort_repolist("section");
+
+	html("<table summary='repository list' class='list nowrap'>");
+	for (i = 0; i < cgit_repolist.count; i++) {
+		ctx.repo = &cgit_repolist.repos[i];
+		if (!is_visible(ctx.repo))
+			continue;
+		hits++;
+		if (hits <= ctx.qry.ofs)
+			continue;
+		if (hits > ctx.qry.ofs + ctx.cfg.max_repo_count)
+			continue;
+		if (!header++)
+			print_header();
+		section = ctx.repo->section;
+		if (section && !strcmp(section, ""))
+			section = NULL;
+		if (!sorted &&
+		    ((last_section == NULL && section != NULL) ||
+		    (last_section != NULL && section == NULL) ||
+		    (last_section != NULL && section != NULL &&
+		     strcmp(section, last_section)))) {
+			htmlf("<tr class='nohover-highlight'><td colspan='%d' class='reposection'>",
+			      columns);
+			html_txt(section);
+			html("</td></tr>");
+			last_section = section;
+		}
+		htmlf("<tr><td class='%s'>",
+		      !sorted && section ? "sublevel-repo" : "toplevel-repo");
+		cgit_summary_link(ctx.repo->name, ctx.repo->name, NULL, NULL);
+		html("</td><td>");
+		repourl = cgit_repourl(ctx.repo->url);
+		html_link_open(repourl, NULL, NULL);
+		free(repourl);
+		if (html_ntxt(ctx.repo->desc, ctx.cfg.max_repodesc_len) < 0)
+			html("...");
+		html_link_close();
+		html("</td><td>");
+		if (ctx.cfg.enable_index_owner) {
+			if (ctx.repo->owner_filter) {
+				cgit_open_filter(ctx.repo->owner_filter);
+				html_txt(ctx.repo->owner);
+				cgit_close_filter(ctx.repo->owner_filter);
+			} else {
+				char *currenturl = cgit_currenturl();
+				html("<a href='");
+				html_attr(currenturl);
+				html("?q=");
+				html_url_arg(ctx.repo->owner);
+				html("'>");
+				html_txt(ctx.repo->owner);
+				html("</a>");
+				free(currenturl);
+			}
+			html("</td><td>");
+		}
+		print_modtime(ctx.repo);
+		html("</td>");
+		if (ctx.cfg.enable_index_links) {
+			html("<td>");
+			cgit_summary_link("summary", NULL, "button", NULL);
+			cgit_log_link("log", NULL, "button", NULL, NULL, NULL,
+				      0, NULL, NULL, ctx.qry.showmsg, 0);
+			cgit_tree_link("tree", NULL, "button", NULL, NULL, NULL);
+			html("</td>");
+		}
+		html("</tr>\n");
+	}
+	html("</table>");
+	if (hits > ctx.cfg.max_repo_count)
+		print_pager(hits, ctx.cfg.max_repo_count, ctx.qry.search, ctx.qry.sort);
+	cgit_print_docend();
+}
+
+void cgit_print_site_readme(void)
+{
+	cgit_print_layout_start();
+	if (!ctx.cfg.root_readme)
+		goto done;
+	cgit_open_filter(ctx.cfg.about_filter, ctx.cfg.root_readme);
+	html_include(ctx.cfg.root_readme);
+	cgit_close_filter(ctx.cfg.about_filter);
+done:
+	cgit_print_layout_end();
+}
diff --git a/third_party/cgit/ui-repolist.h b/third_party/cgit/ui-repolist.h
new file mode 100644
index 0000000000..1b6b3227db
--- /dev/null
+++ b/third_party/cgit/ui-repolist.h
@@ -0,0 +1,7 @@
+#ifndef UI_REPOLIST_H
+#define UI_REPOLIST_H
+
+extern void cgit_print_repolist(void);
+extern void cgit_print_site_readme(void);
+
+#endif /* UI_REPOLIST_H */
diff --git a/third_party/cgit/ui-shared.c b/third_party/cgit/ui-shared.c
new file mode 100644
index 0000000000..d2358f2928
--- /dev/null
+++ b/third_party/cgit/ui-shared.c
@@ -0,0 +1,1210 @@
+/* ui-shared.c: common web output functions
+ *
+ * Copyright (C) 2006-2017 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-shared.h"
+#include "cmd.h"
+#include "html.h"
+#include "version.h"
+
+static const char cgit_doctype[] =
+"<!DOCTYPE html>\n";
+
+static char *http_date(time_t t)
+{
+	static char day[][4] =
+		{"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
+	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);
+}
+
+void cgit_print_error(const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	cgit_vprint_error(fmt, ap);
+	va_end(ap);
+}
+
+void cgit_vprint_error(const char *fmt, va_list ap)
+{
+	va_list cp;
+	html("<div class='error'>");
+	va_copy(cp, ap);
+	html_vtxtf(fmt, cp);
+	va_end(cp);
+	html("</div>\n");
+}
+
+const char *cgit_httpscheme(void)
+{
+	if (ctx.env.https && !strcmp(ctx.env.https, "on"))
+		return "https://";
+	else
+		return "http://";
+}
+
+char *cgit_hosturl(void)
+{
+	if (ctx.env.http_host)
+		return xstrdup(ctx.env.http_host);
+	if (!ctx.env.server_name)
+		return NULL;
+	if (!ctx.env.server_port || atoi(ctx.env.server_port) == 80)
+		return xstrdup(ctx.env.server_name);
+	return fmtalloc("%s:%s", ctx.env.server_name, ctx.env.server_port);
+}
+
+char *cgit_currenturl(void)
+{
+	const char *root = cgit_rooturl();
+
+	if (!ctx.qry.url)
+		return xstrdup(root);
+	if (root[0] && root[strlen(root) - 1] == '/')
+		return fmtalloc("%s%s", root, ctx.qry.url);
+	return fmtalloc("%s/%s", root, ctx.qry.url);
+}
+
+char *cgit_currentfullurl(void)
+{
+	const char *root = cgit_rooturl();
+	const char *orig_query = ctx.env.query_string ? ctx.env.query_string : "";
+	size_t len = strlen(orig_query);
+	char *query = xmalloc(len + 2), *start_url, *ret;
+
+	/* Remove all url=... parts from query string */
+	memcpy(query + 1, orig_query, len + 1);
+	query[0] = '?';
+	start_url = query;
+	while ((start_url = strstr(start_url, "url=")) != NULL) {
+		if (start_url[-1] == '?' || start_url[-1] == '&') {
+			const char *end_url = strchr(start_url, '&');
+			if (end_url)
+				memmove(start_url, end_url + 1, strlen(end_url));
+			else
+				start_url[0] = '\0';
+		} else
+			++start_url;
+	}
+	if (!query[1])
+		query[0] = '\0';
+
+	if (!ctx.qry.url)
+		ret = fmtalloc("%s%s", root, query);
+	else if (root[0] && root[strlen(root) - 1] == '/')
+		ret = fmtalloc("%s%s%s", root, ctx.qry.url, query);
+	else
+		ret = fmtalloc("%s/%s%s", root, ctx.qry.url, query);
+	free(query);
+	return ret;
+}
+
+const char *cgit_rooturl(void)
+{
+	if (ctx.cfg.virtual_root)
+		return ctx.cfg.virtual_root;
+	else
+		return ctx.cfg.script_name;
+}
+
+const char *cgit_loginurl(void)
+{
+	static const char *login_url;
+	if (!login_url)
+		login_url = fmtalloc("%s?p=login", cgit_rooturl());
+	return login_url;
+}
+
+char *cgit_repourl(const char *reponame)
+{
+	if (ctx.cfg.virtual_root)
+		return fmtalloc("%s%s/", ctx.cfg.virtual_root, reponame);
+	else
+		return fmtalloc("?r=%s", reponame);
+}
+
+char *cgit_fileurl(const char *reponame, const char *pagename,
+		   const char *filename, const char *query)
+{
+	struct strbuf sb = STRBUF_INIT;
+	char *delim;
+
+	if (ctx.cfg.virtual_root) {
+		strbuf_addf(&sb, "%s%s/%s/%s", ctx.cfg.virtual_root, reponame,
+			    pagename, (filename ? filename:""));
+		delim = "?";
+	} else {
+		strbuf_addf(&sb, "?url=%s/%s/%s", reponame, pagename,
+			    (filename ? filename : ""));
+		delim = "&amp;";
+	}
+	if (query)
+		strbuf_addf(&sb, "%s%s", delim, query);
+	return strbuf_detach(&sb, NULL);
+}
+
+char *cgit_pageurl(const char *reponame, const char *pagename,
+		   const char *query)
+{
+	return cgit_fileurl(reponame, pagename, NULL, query);
+}
+
+const char *cgit_repobasename(const char *reponame)
+{
+	/* I assume we don't need to store more than one repo basename */
+	static char rvbuf[1024];
+	int p;
+	const char *rv;
+	size_t len;
+
+	len = strlcpy(rvbuf, reponame, sizeof(rvbuf));
+	if (len >= sizeof(rvbuf))
+		die("cgit_repobasename: truncated repository name '%s'", reponame);
+	p = len - 1;
+	/* strip trailing slashes */
+	while (p && rvbuf[p] == '/')
+		rvbuf[p--] = '\0';
+	/* strip trailing .git */
+	if (p >= 3 && starts_with(&rvbuf[p-3], ".git")) {
+		p -= 3;
+		rvbuf[p--] = '\0';
+	}
+	/* strip more trailing slashes if any */
+	while (p && rvbuf[p] == '/')
+		rvbuf[p--] = '\0';
+	/* find last slash in the remaining string */
+	rv = strrchr(rvbuf, '/');
+	if (rv)
+		return ++rv;
+	return rvbuf;
+}
+
+const char *cgit_snapshot_prefix(const struct cgit_repo *repo)
+{
+	if (repo->snapshot_prefix)
+		return repo->snapshot_prefix;
+
+	return cgit_repobasename(repo->url);
+}
+
+static void site_url(const char *page, const char *search, const char *sort, int ofs, int always_root)
+{
+	char *delim = "?";
+
+	if (always_root || page)
+		html_attr(cgit_rooturl());
+	else {
+		char *currenturl = cgit_currenturl();
+		html_attr(currenturl);
+		free(currenturl);
+	}
+
+	if (page) {
+		htmlf("?p=%s", page);
+		delim = "&amp;";
+	}
+	if (search) {
+		html(delim);
+		html("q=");
+		html_attr(search);
+		delim = "&amp;";
+	}
+	if (sort) {
+		html(delim);
+		html("s=");
+		html_attr(sort);
+		delim = "&amp;";
+	}
+	if (ofs) {
+		html(delim);
+		htmlf("ofs=%d", ofs);
+	}
+}
+
+static void site_link(const char *page, const char *name, const char *title,
+		      const char *class, const char *search, const char *sort, int ofs, int always_root)
+{
+	html("<a");
+	if (title) {
+		html(" title='");
+		html_attr(title);
+		html("'");
+	}
+	if (class) {
+		html(" class='");
+		html_attr(class);
+		html("'");
+	}
+	html(" href='");
+	site_url(page, search, sort, ofs, always_root);
+	html("'>");
+	html_txt(name);
+	html("</a>");
+}
+
+void cgit_index_link(const char *name, const char *title, const char *class,
+		     const char *pattern, const char *sort, int ofs, int always_root)
+{
+	site_link(NULL, name, title, class, pattern, sort, ofs, always_root);
+}
+
+static char *repolink(const char *title, const char *class, const char *page,
+		      const char *head, const char *path)
+{
+	char *delim = "?";
+
+	html("<a");
+	if (title) {
+		html(" title='");
+		html_attr(title);
+		html("'");
+	}
+	if (class) {
+		html(" class='");
+		html_attr(class);
+		html("'");
+	}
+	html(" href='");
+	if (ctx.cfg.virtual_root) {
+		html_url_path(ctx.cfg.virtual_root);
+		html_url_path(ctx.repo->url);
+		if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/')
+			html("/");
+		if (page) {
+			html_url_path(page);
+			html("/");
+			if (path)
+				html_url_path(path);
+		}
+	} else {
+		html_url_path(ctx.cfg.script_name);
+		html("?url=");
+		html_url_arg(ctx.repo->url);
+		if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/')
+			html("/");
+		if (page) {
+			html_url_arg(page);
+			html("/");
+			if (path)
+				html_url_arg(path);
+		}
+		delim = "&amp;";
+	}
+	if (head && ctx.repo->defbranch && strcmp(head, ctx.repo->defbranch)) {
+		html(delim);
+		html("h=");
+		html_url_arg(head);
+		delim = "&amp;";
+	}
+	return fmt("%s", delim);
+}
+
+static void reporevlink(const char *page, const char *name, const char *title,
+			const char *class, const char *head, const char *rev,
+			const char *path)
+{
+	char *delim;
+
+	delim = repolink(title, class, page, head, path);
+	if (rev && ctx.qry.head != NULL && strcmp(rev, ctx.qry.head)) {
+		html(delim);
+		html("id=");
+		html_url_arg(rev);
+	}
+	html("'>");
+	html_txt(name);
+	html("</a>");
+}
+
+void cgit_summary_link(const char *name, const char *title, const char *class,
+		       const char *head)
+{
+	reporevlink(NULL, name, title, class, head, NULL, NULL);
+}
+
+void cgit_tag_link(const char *name, const char *title, const char *class,
+		   const char *tag)
+{
+	reporevlink("tag", name, title, class, tag, NULL, NULL);
+}
+
+void cgit_tree_link(const char *name, const char *title, const char *class,
+		    const char *head, const char *rev, const char *path)
+{
+	reporevlink("tree", name, title, class, head, rev, path);
+}
+
+void cgit_plain_link(const char *name, const char *title, const char *class,
+		     const char *head, const char *rev, const char *path)
+{
+	reporevlink("plain", name, title, class, head, rev, path);
+}
+
+void cgit_blame_link(const char *name, const char *title, const char *class,
+		     const char *head, const char *rev, const char *path)
+{
+	reporevlink("blame", name, title, class, head, rev, path);
+}
+
+void cgit_log_link(const char *name, const char *title, const char *class,
+		   const char *head, const char *rev, const char *path,
+		   int ofs, const char *grep, const char *pattern, int showmsg,
+		   int follow)
+{
+	char *delim;
+
+	delim = repolink(title, class, "log", head, path);
+	if (rev && ctx.qry.head && strcmp(rev, ctx.qry.head)) {
+		html(delim);
+		html("id=");
+		html_url_arg(rev);
+		delim = "&amp;";
+	}
+	if (grep && pattern) {
+		html(delim);
+		html("qt=");
+		html_url_arg(grep);
+		delim = "&amp;";
+		html(delim);
+		html("q=");
+		html_url_arg(pattern);
+	}
+	if (ofs > 0) {
+		html(delim);
+		html("ofs=");
+		htmlf("%d", ofs);
+		delim = "&amp;";
+	}
+	if (showmsg) {
+		html(delim);
+		html("showmsg=1");
+		delim = "&amp;";
+	}
+	if (follow) {
+		html(delim);
+		html("follow=1");
+	}
+	html("'>");
+	html_txt(name);
+	html("</a>");
+}
+
+void cgit_commit_link(const char *name, const char *title, const char *class,
+		      const char *head, const char *rev, const char *path)
+{
+	char *delim;
+
+	delim = repolink(title, class, "commit", head, path);
+	if (rev && ctx.qry.head && strcmp(rev, ctx.qry.head)) {
+		html(delim);
+		html("id=");
+		html_url_arg(rev);
+		delim = "&amp;";
+	}
+	if (ctx.qry.difftype) {
+		html(delim);
+		htmlf("dt=%d", ctx.qry.difftype);
+		delim = "&amp;";
+	}
+	if (ctx.qry.context > 0 && ctx.qry.context != 3) {
+		html(delim);
+		html("context=");
+		htmlf("%d", ctx.qry.context);
+		delim = "&amp;";
+	}
+	if (ctx.qry.ignorews) {
+		html(delim);
+		html("ignorews=1");
+		delim = "&amp;";
+	}
+	if (ctx.qry.follow) {
+		html(delim);
+		html("follow=1");
+	}
+	html("'>");
+	if (name[0] != '\0') {
+		if (strlen(name) > ctx.cfg.max_msg_len && ctx.cfg.max_msg_len >= 15) {
+			html_ntxt(name, ctx.cfg.max_msg_len - 3);
+			html("...");
+		} else
+			html_txt(name);
+	} else
+		html_txt("(no commit message)");
+	html("</a>");
+}
+
+void cgit_refs_link(const char *name, const char *title, const char *class,
+		    const char *head, const char *rev, const char *path)
+{
+	reporevlink("refs", name, title, class, head, rev, path);
+}
+
+void cgit_snapshot_link(const char *name, const char *title, const char *class,
+			const char *head, const char *rev,
+			const char *archivename)
+{
+	reporevlink("snapshot", name, title, class, head, rev, archivename);
+}
+
+void cgit_diff_link(const char *name, const char *title, const char *class,
+		    const char *head, const char *new_rev, const char *old_rev,
+		    const char *path)
+{
+	char *delim;
+
+	delim = repolink(title, class, "diff", head, path);
+	if (new_rev && ctx.qry.head != NULL && strcmp(new_rev, ctx.qry.head)) {
+		html(delim);
+		html("id=");
+		html_url_arg(new_rev);
+		delim = "&amp;";
+	}
+	if (old_rev) {
+		html(delim);
+		html("id2=");
+		html_url_arg(old_rev);
+		delim = "&amp;";
+	}
+	if (ctx.qry.difftype) {
+		html(delim);
+		htmlf("dt=%d", ctx.qry.difftype);
+		delim = "&amp;";
+	}
+	if (ctx.qry.context > 0 && ctx.qry.context != 3) {
+		html(delim);
+		html("context=");
+		htmlf("%d", ctx.qry.context);
+		delim = "&amp;";
+	}
+	if (ctx.qry.ignorews) {
+		html(delim);
+		html("ignorews=1");
+		delim = "&amp;";
+	}
+	if (ctx.qry.follow) {
+		html(delim);
+		html("follow=1");
+	}
+	html("'>");
+	html_txt(name);
+	html("</a>");
+}
+
+void cgit_patch_link(const char *name, const char *title, const char *class,
+		     const char *head, const char *rev, const char *path)
+{
+	reporevlink("patch", name, title, class, head, rev, path);
+}
+
+void cgit_stats_link(const char *name, const char *title, const char *class,
+		     const char *head, const char *path)
+{
+	reporevlink("stats", name, title, class, head, NULL, path);
+}
+
+static void cgit_self_link(char *name, const char *title, const char *class)
+{
+	if (!strcmp(ctx.qry.page, "repolist"))
+		cgit_index_link(name, title, class, ctx.qry.search, ctx.qry.sort,
+				ctx.qry.ofs, 1);
+	else if (!strcmp(ctx.qry.page, "summary"))
+		cgit_summary_link(name, title, class, ctx.qry.head);
+	else if (!strcmp(ctx.qry.page, "tag"))
+		cgit_tag_link(name, title, class, ctx.qry.has_sha1 ?
+			       ctx.qry.sha1 : ctx.qry.head);
+	else if (!strcmp(ctx.qry.page, "tree"))
+		cgit_tree_link(name, title, class, ctx.qry.head,
+			       ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+			       ctx.qry.path);
+	else if (!strcmp(ctx.qry.page, "plain"))
+		cgit_plain_link(name, title, class, ctx.qry.head,
+				ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+				ctx.qry.path);
+	else if (!strcmp(ctx.qry.page, "blame"))
+		cgit_blame_link(name, title, class, ctx.qry.head,
+				ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+				ctx.qry.path);
+	else if (!strcmp(ctx.qry.page, "log"))
+		cgit_log_link(name, title, class, ctx.qry.head,
+			      ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+			      ctx.qry.path, ctx.qry.ofs,
+			      ctx.qry.grep, ctx.qry.search,
+			      ctx.qry.showmsg, ctx.qry.follow);
+	else if (!strcmp(ctx.qry.page, "commit"))
+		cgit_commit_link(name, title, class, ctx.qry.head,
+				 ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+				 ctx.qry.path);
+	else if (!strcmp(ctx.qry.page, "patch"))
+		cgit_patch_link(name, title, class, ctx.qry.head,
+				ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+				ctx.qry.path);
+	else if (!strcmp(ctx.qry.page, "refs"))
+		cgit_refs_link(name, title, class, ctx.qry.head,
+			       ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+			       ctx.qry.path);
+	else if (!strcmp(ctx.qry.page, "snapshot"))
+		cgit_snapshot_link(name, title, class, ctx.qry.head,
+				   ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL,
+				   ctx.qry.path);
+	else if (!strcmp(ctx.qry.page, "diff"))
+		cgit_diff_link(name, title, class, ctx.qry.head,
+			       ctx.qry.sha1, ctx.qry.sha2,
+			       ctx.qry.path);
+	else if (!strcmp(ctx.qry.page, "stats"))
+		cgit_stats_link(name, title, class, ctx.qry.head,
+				ctx.qry.path);
+	else {
+		/* Don't known how to make link for this page */
+		repolink(title, class, ctx.qry.page, ctx.qry.head, ctx.qry.path);
+		html("><!-- cgit_self_link() doesn't know how to make link for page '");
+		html_txt(ctx.qry.page);
+		html("' -->");
+		html_txt(name);
+		html("</a>");
+	}
+}
+
+void cgit_object_link(struct object *obj)
+{
+	char *page, *shortrev, *fullrev, *name;
+
+	fullrev = oid_to_hex(&obj->oid);
+	shortrev = xstrdup(fullrev);
+	shortrev[10] = '\0';
+	if (obj->type == OBJ_COMMIT) {
+		cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL,
+				 ctx.qry.head, fullrev, NULL);
+		return;
+	} else if (obj->type == OBJ_TREE)
+		page = "tree";
+	else if (obj->type == OBJ_TAG)
+		page = "tag";
+	else
+		page = "blob";
+	name = fmt("%s %s...", type_name(obj->type), shortrev);
+	reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL);
+}
+
+static struct string_list_item *lookup_path(struct string_list *list,
+					    const char *path)
+{
+	struct string_list_item *item;
+
+	while (path && path[0]) {
+		if ((item = string_list_lookup(list, path)))
+			return item;
+		if (!(path = strchr(path, '/')))
+			break;
+		path++;
+	}
+	return NULL;
+}
+
+void cgit_submodule_link(const char *class, char *path, const char *rev)
+{
+	struct string_list *list;
+	struct string_list_item *item;
+	char tail, *dir;
+	size_t len;
+
+	len = 0;
+	tail = 0;
+	list = &ctx.repo->submodules;
+	item = lookup_path(list, path);
+	if (!item) {
+		len = strlen(path);
+		tail = path[len - 1];
+		if (tail == '/') {
+			path[len - 1] = 0;
+			item = lookup_path(list, path);
+		}
+	}
+	if (item || ctx.repo->module_link) {
+		html("<a ");
+		if (class)
+			htmlf("class='%s' ", class);
+		html("href='");
+		if (item) {
+			html_attrf(item->util, rev);
+		} else {
+			dir = strrchr(path, '/');
+			if (dir)
+				dir++;
+			else
+				dir = path;
+			html_attrf(ctx.repo->module_link, dir, rev);
+		}
+		html("'>");
+		html_txt(path);
+		html("</a>");
+	} else {
+		html("<span");
+		if (class)
+			htmlf(" class='%s'", class);
+		html(">");
+		html_txt(path);
+		html("</span>");
+	}
+	html_txtf(" @ %.7s", rev);
+	if (item && tail)
+		path[len - 1] = tail;
+}
+
+const struct date_mode *cgit_date_mode(enum date_mode_type type)
+{
+	static struct date_mode mode;
+	mode.type = type;
+	mode.local = ctx.cfg.local_time;
+	return &mode;
+}
+
+static void print_rel_date(time_t t, int tz, double value,
+	const char *class, const char *suffix)
+{
+	htmlf("<span class='%s' title='", class);
+	html_attr(show_date(t, tz, cgit_date_mode(DATE_ISO8601)));
+	htmlf("'>%.0f %s</span>", value, suffix);
+}
+
+void cgit_print_age(time_t t, int tz, time_t max_relative)
+{
+	time_t now, secs;
+
+	if (!t)
+		return;
+	time(&now);
+	secs = now - t;
+	if (secs < 0)
+		secs = 0;
+
+	if (secs > max_relative && max_relative >= 0) {
+		html("<span title='");
+		html_attr(show_date(t, tz, cgit_date_mode(DATE_ISO8601)));
+		html("'>");
+		html_txt(show_date(t, tz, cgit_date_mode(DATE_SHORT)));
+		html("</span>");
+		return;
+	}
+
+	if (secs < TM_HOUR * 2) {
+		print_rel_date(t, tz, secs * 1.0 / TM_MIN, "age-mins", "min.");
+		return;
+	}
+	if (secs < TM_DAY * 2) {
+		print_rel_date(t, tz, secs * 1.0 / TM_HOUR, "age-hours", "hours");
+		return;
+	}
+	if (secs < TM_WEEK * 2) {
+		print_rel_date(t, tz, secs * 1.0 / TM_DAY, "age-days", "days");
+		return;
+	}
+	if (secs < TM_MONTH * 2) {
+		print_rel_date(t, tz, secs * 1.0 / TM_WEEK, "age-weeks", "weeks");
+		return;
+	}
+	if (secs < TM_YEAR * 2) {
+		print_rel_date(t, tz, secs * 1.0 / TM_MONTH, "age-months", "months");
+		return;
+	}
+	print_rel_date(t, tz, secs * 1.0 / TM_YEAR, "age-years", "years");
+}
+
+void cgit_print_http_headers(void)
+{
+	if (ctx.env.no_http && !strcmp(ctx.env.no_http, "1"))
+		return;
+
+	if (ctx.page.status)
+		htmlf("Status: %d %s\n", ctx.page.status, ctx.page.statusmsg);
+	if (ctx.page.mimetype && ctx.page.charset)
+		htmlf("Content-Type: %s; charset=%s\n", ctx.page.mimetype,
+		      ctx.page.charset);
+	else if (ctx.page.mimetype)
+		htmlf("Content-Type: %s\n", ctx.page.mimetype);
+	if (ctx.page.size)
+		htmlf("Content-Length: %zd\n", ctx.page.size);
+	if (ctx.page.filename) {
+		html("Content-Disposition: inline; filename=\"");
+		html_header_arg_in_quotes(ctx.page.filename);
+		html("\"\n");
+	}
+	if (!ctx.env.authenticated)
+		html("Cache-Control: no-cache, no-store\n");
+	htmlf("Last-Modified: %s\n", http_date(ctx.page.modified));
+	htmlf("Expires: %s\n", http_date(ctx.page.expires));
+	if (ctx.page.etag)
+		htmlf("ETag: \"%s\"\n", ctx.page.etag);
+	html("\n");
+	if (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD"))
+		exit(0);
+}
+
+void cgit_redirect(const char *url, bool permanent)
+{
+	htmlf("Status: %d %s\n", permanent ? 301 : 302, permanent ? "Moved" : "Found");
+	html("Location: ");
+	html_url_path(url);
+	html("\n\n");
+}
+
+static void print_rel_vcs_link(const char *url)
+{
+	html("<link rel='vcs-git' href='");
+	html_attr(url);
+	html("' title='");
+	html_attr(ctx.repo->name);
+	html(" Git repository'/>\n");
+}
+
+void cgit_print_docstart(void)
+{
+	char *host = cgit_hosturl();
+
+	if (ctx.cfg.embedded) {
+		if (ctx.cfg.header)
+			html_include(ctx.cfg.header);
+		return;
+	}
+
+	html(cgit_doctype);
+	html("<html lang='en'>\n");
+	html("<head>\n");
+	html("<title>");
+	html_txt(ctx.page.title);
+	html("</title>\n");
+	htmlf("<meta name='generator' content='cgit %s'/>\n", cgit_version);
+	if (ctx.cfg.robots && *ctx.cfg.robots)
+		htmlf("<meta name='robots' content='%s'/>\n", ctx.cfg.robots);
+	html("<link rel='stylesheet' type='text/css' href='");
+	html_attr(ctx.cfg.css);
+	html("'/>\n");
+	if (ctx.cfg.favicon) {
+		html("<link rel='shortcut icon' href='");
+		html_attr(ctx.cfg.favicon);
+		html("'/>\n");
+	}
+	if (host && ctx.repo && ctx.qry.head) {
+		char *fileurl;
+		struct strbuf sb = STRBUF_INIT;
+		strbuf_addf(&sb, "h=%s", ctx.qry.head);
+
+		html("<link rel='alternate' title='Atom feed' href='");
+		html(cgit_httpscheme());
+		html_attr(host);
+		fileurl = cgit_fileurl(ctx.repo->url, "atom", ctx.qry.vpath,
+				       sb.buf);
+		html_attr(fileurl);
+		html("' type='application/atom+xml'/>\n");
+		strbuf_release(&sb);
+		free(fileurl);
+	}
+	if (ctx.repo)
+		cgit_add_clone_urls(print_rel_vcs_link);
+	if (ctx.cfg.head_include)
+		html_include(ctx.cfg.head_include);
+	if (ctx.repo && ctx.repo->extra_head_content)
+		html(ctx.repo->extra_head_content);
+	html("</head>\n");
+	html("<body>\n");
+	if (ctx.cfg.header)
+		html_include(ctx.cfg.header);
+	free(host);
+}
+
+void cgit_print_docend(void)
+{
+	html("</div> <!-- class=content -->\n");
+	if (ctx.cfg.embedded) {
+		html("</div> <!-- id=cgit -->\n");
+		if (ctx.cfg.footer)
+			html_include(ctx.cfg.footer);
+		return;
+	}
+	if (ctx.cfg.footer)
+		html_include(ctx.cfg.footer);
+	else {
+		htmlf("<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit %s</a> "
+			"(<a href='https://git-scm.com/'>git %s</a>) at ", cgit_version, git_version_string);
+		html_txt(show_date(time(NULL), 0, cgit_date_mode(DATE_ISO8601)));
+		html("</div>\n");
+	}
+	html("</div> <!-- id=cgit -->\n");
+	html("</body>\n</html>\n");
+}
+
+void cgit_print_error_page(int code, const char *msg, const char *fmt, ...)
+{
+	va_list ap;
+	ctx.page.expires = ctx.cfg.cache_dynamic_ttl;
+	ctx.page.status = code;
+	ctx.page.statusmsg = msg;
+	cgit_print_layout_start();
+	va_start(ap, fmt);
+	cgit_vprint_error(fmt, ap);
+	va_end(ap);
+	cgit_print_layout_end();
+}
+
+void cgit_print_layout_start(void)
+{
+	cgit_print_http_headers();
+	cgit_print_docstart();
+	cgit_print_pageheader();
+}
+
+void cgit_print_layout_end(void)
+{
+	cgit_print_docend();
+}
+
+static void add_clone_urls(void (*fn)(const char *), char *txt, char *suffix)
+{
+	struct strbuf **url_list = strbuf_split_str(txt, ' ', 0);
+	int i;
+
+	for (i = 0; url_list[i]; i++) {
+		strbuf_rtrim(url_list[i]);
+		if (url_list[i]->len == 0)
+			continue;
+		if (suffix && *suffix)
+			strbuf_addf(url_list[i], "/%s", suffix);
+		fn(url_list[i]->buf);
+	}
+
+	strbuf_list_free(url_list);
+}
+
+void cgit_add_clone_urls(void (*fn)(const char *))
+{
+	if (ctx.repo->clone_url)
+		add_clone_urls(fn, expand_macros(ctx.repo->clone_url), NULL);
+	else if (ctx.cfg.clone_prefix)
+		add_clone_urls(fn, ctx.cfg.clone_prefix, ctx.repo->url);
+}
+
+static int print_branch_option(const char *refname, const struct object_id *oid,
+			       int flags, void *cb_data)
+{
+	char *name = (char *)refname;
+	html_option(name, name, ctx.qry.head);
+	return 0;
+}
+
+void cgit_add_hidden_formfields(int incl_head, int incl_search,
+				const char *page)
+{
+	if (!ctx.cfg.virtual_root) {
+		struct strbuf url = STRBUF_INIT;
+
+		strbuf_addf(&url, "%s/%s", ctx.qry.repo, page);
+		if (ctx.qry.vpath)
+			strbuf_addf(&url, "/%s", ctx.qry.vpath);
+		html_hidden("url", url.buf);
+		strbuf_release(&url);
+	}
+
+	if (incl_head && ctx.qry.head && ctx.repo->defbranch &&
+	    strcmp(ctx.qry.head, ctx.repo->defbranch))
+		html_hidden("h", ctx.qry.head);
+
+	if (ctx.qry.sha1)
+		html_hidden("id", ctx.qry.sha1);
+	if (ctx.qry.sha2)
+		html_hidden("id2", ctx.qry.sha2);
+	if (ctx.qry.showmsg)
+		html_hidden("showmsg", "1");
+
+	if (incl_search) {
+		if (ctx.qry.grep)
+			html_hidden("qt", ctx.qry.grep);
+		if (ctx.qry.search)
+			html_hidden("q", ctx.qry.search);
+	}
+}
+
+static const char *hc(const char *page)
+{
+	if (!ctx.qry.page)
+		return NULL;
+
+	return strcmp(ctx.qry.page, page) ? NULL : "active";
+}
+
+static void cgit_print_path_crumbs(char *path)
+{
+	char *old_path = ctx.qry.path;
+	char *p = path, *q, *end = path + strlen(path);
+	int levels = 0;
+
+	ctx.qry.path = NULL;
+	cgit_self_link("root", NULL, NULL);
+	ctx.qry.path = p = path;
+	while (p < end) {
+		if (!(q = strchr(p, '/')) || levels > 15)
+			q = end;
+		*q = '\0';
+		html_txt("/");
+		cgit_self_link(p, NULL, NULL);
+		if (q < end)
+			*q = '/';
+		p = q + 1;
+		++levels;
+	}
+	ctx.qry.path = old_path;
+}
+
+static void print_header(void)
+{
+	char *logo = NULL, *logo_link = NULL;
+
+	html("<table id='header'>\n");
+	html("<tr>\n");
+
+	if (ctx.repo && ctx.repo->logo && *ctx.repo->logo)
+		logo = ctx.repo->logo;
+	else
+		logo = ctx.cfg.logo;
+	if (ctx.repo && ctx.repo->logo_link && *ctx.repo->logo_link)
+		logo_link = ctx.repo->logo_link;
+	else
+		logo_link = ctx.cfg.logo_link;
+	if (logo && *logo) {
+		html("<td class='logo' rowspan='2'><a href='");
+		if (logo_link && *logo_link)
+			html_attr(logo_link);
+		else
+			html_attr(cgit_rooturl());
+		html("'><img src='");
+		html_attr(logo);
+		html("' alt='cgit logo'/></a></td>\n");
+	}
+
+	html("<td class='main'>");
+	if (ctx.repo) {
+		cgit_index_link("index", NULL, NULL, NULL, NULL, 0, 1);
+		html(" : ");
+		cgit_summary_link(ctx.repo->name, ctx.repo->name, NULL, NULL);
+		if (ctx.env.authenticated) {
+			html("</td><td class='form'>");
+			html("<form method='get'>\n");
+			cgit_add_hidden_formfields(0, 1, ctx.qry.page);
+			html("<select name='h' onchange='this.form.submit();'>\n");
+			for_each_branch_ref(print_branch_option, ctx.qry.head);
+			if (ctx.repo->enable_remote_branches)
+				for_each_remote_ref(print_branch_option, ctx.qry.head);
+			html("</select> ");
+			html("<input type='submit' value='switch'/>");
+			html("</form>");
+		}
+	} else
+		html_txt(ctx.cfg.root_title);
+	html("</td></tr>\n");
+
+	html("<tr><td class='sub'>");
+	if (ctx.repo) {
+		html_txt(ctx.repo->desc);
+		html("</td><td class='sub right'>");
+		html_txt(ctx.repo->owner);
+	} else {
+		if (ctx.cfg.root_desc)
+			html_txt(ctx.cfg.root_desc);
+	}
+	html("</td></tr></table>\n");
+}
+
+void cgit_print_pageheader(void)
+{
+	html("<div id='cgit'>");
+	if (!ctx.env.authenticated || !ctx.cfg.noheader)
+		print_header();
+
+	html("<table class='tabs'><tr><td>\n");
+	if (ctx.env.authenticated && ctx.repo) {
+		if (ctx.repo->readme.nr)
+			reporevlink("about", "about", NULL,
+				    hc("about"), ctx.qry.head, NULL,
+				    NULL);
+		cgit_summary_link("summary", NULL, hc("summary"),
+				  ctx.qry.head);
+		cgit_refs_link("refs", NULL, hc("refs"), ctx.qry.head,
+			       ctx.qry.sha1, NULL);
+		cgit_log_link("log", NULL, hc("log"), ctx.qry.head,
+			      NULL, ctx.qry.vpath, 0, NULL, NULL,
+			      ctx.qry.showmsg, ctx.qry.follow);
+		if (ctx.qry.page && !strcmp(ctx.qry.page, "blame"))
+			cgit_blame_link("blame", NULL, hc("blame"), ctx.qry.head,
+				        ctx.qry.sha1, ctx.qry.vpath);
+		else
+			cgit_tree_link("tree", NULL, hc("tree"), ctx.qry.head,
+				       ctx.qry.sha1, ctx.qry.vpath);
+		cgit_commit_link("commit", NULL, hc("commit"),
+				 ctx.qry.head, ctx.qry.sha1, ctx.qry.vpath);
+		cgit_diff_link("diff", NULL, hc("diff"), ctx.qry.head,
+			       ctx.qry.sha1, ctx.qry.sha2, ctx.qry.vpath);
+		if (ctx.repo->max_stats)
+			cgit_stats_link("stats", NULL, hc("stats"),
+					ctx.qry.head, ctx.qry.vpath);
+		if (ctx.repo->homepage) {
+			html("<a href='");
+			html_attr(ctx.repo->homepage);
+			html("'>homepage</a>");
+		}
+		html("</td><td class='form'>");
+		html("<form class='right' method='get' action='");
+		if (ctx.cfg.virtual_root) {
+			char *fileurl = cgit_fileurl(ctx.qry.repo, "log",
+						   ctx.qry.vpath, NULL);
+			html_url_path(fileurl);
+			free(fileurl);
+		}
+		html("'>\n");
+		cgit_add_hidden_formfields(1, 0, "log");
+		html("<select name='qt'>\n");
+		html_option("grep", "log msg", ctx.qry.grep);
+		html_option("author", "author", ctx.qry.grep);
+		html_option("committer", "committer", ctx.qry.grep);
+		html_option("range", "range", ctx.qry.grep);
+		html("</select>\n");
+		html("<input class='txt' type='search' size='10' name='q' value='");
+		html_attr(ctx.qry.search);
+		html("'/>\n");
+		html("<input type='submit' value='search'/>\n");
+		html("</form>\n");
+	} else if (ctx.env.authenticated) {
+		char *currenturl = cgit_currenturl();
+		site_link(NULL, "index", NULL, hc("repolist"), NULL, NULL, 0, 1);
+		if (ctx.cfg.root_readme)
+			site_link("about", "about", NULL, hc("about"),
+				  NULL, NULL, 0, 1);
+		html("</td><td class='form'>");
+		html("<form method='get' action='");
+		html_attr(currenturl);
+		html("'>\n");
+		html("<input type='search' name='q' size='10' value='");
+		html_attr(ctx.qry.search);
+		html("'/>\n");
+		html("<input type='submit' value='search'/>\n");
+		html("</form>");
+		free(currenturl);
+	}
+	html("</td></tr></table>\n");
+	if (ctx.env.authenticated && ctx.repo && ctx.qry.vpath) {
+		html("<div class='path'>");
+		html("path: ");
+		cgit_print_path_crumbs(ctx.qry.vpath);
+		if (ctx.cfg.enable_follow_links && !strcmp(ctx.qry.page, "log")) {
+			html(" (");
+			ctx.qry.follow = !ctx.qry.follow;
+			cgit_self_link(ctx.qry.follow ? "follow" : "unfollow",
+					NULL, NULL);
+			ctx.qry.follow = !ctx.qry.follow;
+			html(")");
+		}
+		html("</div>");
+	}
+	html("<div class='content'>");
+}
+
+void cgit_print_filemode(unsigned short mode)
+{
+	if (S_ISDIR(mode))
+		html("d");
+	else if (S_ISLNK(mode))
+		html("l");
+	else if (S_ISGITLINK(mode))
+		html("m");
+	else
+		html("-");
+	html_fileperm(mode >> 6);
+	html_fileperm(mode >> 3);
+	html_fileperm(mode);
+}
+
+void cgit_compose_snapshot_prefix(struct strbuf *filename, const char *base,
+				  const char *ref)
+{
+	struct object_id oid;
+
+	/*
+	 * Prettify snapshot names by stripping leading "v" or "V" if the tag
+	 * name starts with {v,V}[0-9] and the prettify mapping is injective,
+	 * i.e. each stripped tag can be inverted without ambiguities.
+	 */
+	if (get_oid(fmt("refs/tags/%s", ref), &oid) == 0 &&
+	    (ref[0] == 'v' || ref[0] == 'V') && isdigit(ref[1]) &&
+	    ((get_oid(fmt("refs/tags/%s", ref + 1), &oid) == 0) +
+	     (get_oid(fmt("refs/tags/v%s", ref + 1), &oid) == 0) +
+	     (get_oid(fmt("refs/tags/V%s", ref + 1), &oid) == 0) == 1))
+		ref++;
+
+	strbuf_addf(filename, "%s-%s", base, ref);
+}
+
+void cgit_print_snapshot_links(const struct cgit_repo *repo, const char *ref,
+			       const char *separator)
+{
+	const struct cgit_snapshot_format *f;
+	struct strbuf filename = STRBUF_INIT;
+	const char *basename;
+	size_t prefixlen;
+
+	basename = cgit_snapshot_prefix(repo);
+	if (starts_with(ref, basename))
+		strbuf_addstr(&filename, ref);
+	else
+		cgit_compose_snapshot_prefix(&filename, basename, ref);
+
+	prefixlen = filename.len;
+	for (f = cgit_snapshot_formats; f->suffix; f++) {
+		if (!(repo->snapshots & cgit_snapshot_format_bit(f)))
+			continue;
+		strbuf_setlen(&filename, prefixlen);
+		strbuf_addstr(&filename, f->suffix);
+		cgit_snapshot_link(filename.buf, NULL, NULL, NULL, NULL,
+				   filename.buf);
+		if (cgit_snapshot_get_sig(ref, f)) {
+			strbuf_addstr(&filename, ".asc");
+			html(" (");
+			cgit_snapshot_link("sig", NULL, NULL, NULL, NULL,
+					   filename.buf);
+			html(")");
+		} else if (starts_with(f->suffix, ".tar") && cgit_snapshot_get_sig(ref, &cgit_snapshot_formats[0])) {
+			strbuf_setlen(&filename, strlen(filename.buf) - strlen(f->suffix));
+			strbuf_addstr(&filename, ".tar.asc");
+			html(" (");
+			cgit_snapshot_link("sig", NULL, NULL, NULL, NULL,
+					   filename.buf);
+			html(")");
+		}
+		html(separator);
+	}
+	strbuf_release(&filename);
+}
+
+void cgit_set_title_from_path(const char *path)
+{
+	struct strbuf sb = STRBUF_INIT;
+	const char *slash, *last_slash;
+
+	if (!path)
+		return;
+
+	for (last_slash = path + strlen(path); (slash = memrchr(path, '/', last_slash - path)) != NULL; last_slash = slash) {
+		strbuf_add(&sb, slash + 1, last_slash - slash - 1);
+		strbuf_addstr(&sb, " \xc2\xab ");
+	}
+	strbuf_add(&sb, path, last_slash - path);
+	strbuf_addf(&sb, " - %s", ctx.page.title);
+	ctx.page.title = strbuf_detach(&sb, NULL);
+}
diff --git a/third_party/cgit/ui-shared.h b/third_party/cgit/ui-shared.h
new file mode 100644
index 0000000000..6964873a63
--- /dev/null
+++ b/third_party/cgit/ui-shared.h
@@ -0,0 +1,87 @@
+#ifndef UI_SHARED_H
+#define UI_SHARED_H
+
+extern const char *cgit_httpscheme(void);
+extern char *cgit_hosturl(void);
+extern const char *cgit_rooturl(void);
+extern char *cgit_currenturl(void);
+extern char *cgit_currentfullurl(void);
+extern const char *cgit_loginurl(void);
+extern char *cgit_repourl(const char *reponame);
+extern char *cgit_fileurl(const char *reponame, const char *pagename,
+			  const char *filename, const char *query);
+extern char *cgit_pageurl(const char *reponame, const char *pagename,
+			  const char *query);
+
+extern void cgit_add_clone_urls(void (*fn)(const char *));
+
+extern void cgit_index_link(const char *name, const char *title,
+			    const char *class, const char *pattern, const char *sort, int ofs, int always_root);
+extern void cgit_summary_link(const char *name, const char *title,
+			      const char *class, const char *head);
+extern void cgit_tag_link(const char *name, const char *title,
+			  const char *class, const char *tag);
+extern void cgit_tree_link(const char *name, const char *title,
+			   const char *class, const char *head,
+			   const char *rev, const char *path);
+extern void cgit_plain_link(const char *name, const char *title,
+			    const char *class, const char *head,
+			    const char *rev, const char *path);
+extern void cgit_blame_link(const char *name, const char *title,
+			    const char *class, const char *head,
+			    const char *rev, const char *path);
+extern void cgit_log_link(const char *name, const char *title,
+			  const char *class, const char *head, const char *rev,
+			  const char *path, int ofs, const char *grep,
+			  const char *pattern, int showmsg, int follow);
+extern void cgit_commit_link(const char *name, const char *title,
+			     const char *class, const char *head,
+			     const char *rev, const char *path);
+extern void cgit_patch_link(const char *name, const char *title,
+			    const char *class, const char *head,
+			    const char *rev, const char *path);
+extern void cgit_refs_link(const char *name, const char *title,
+			   const char *class, const char *head,
+			   const char *rev, const char *path);
+extern void cgit_snapshot_link(const char *name, const char *title,
+			       const char *class, const char *head,
+			       const char *rev, const char *archivename);
+extern void cgit_diff_link(const char *name, const char *title,
+			   const char *class, const char *head,
+			   const char *new_rev, const char *old_rev,
+			   const char *path);
+extern void cgit_stats_link(const char *name, const char *title,
+			    const char *class, const char *head,
+			    const char *path);
+extern void cgit_object_link(struct object *obj);
+
+extern void cgit_submodule_link(const char *class, char *path,
+				const char *rev);
+
+extern void cgit_print_layout_start(void);
+extern void cgit_print_layout_end(void);
+
+__attribute__((format (printf,1,2)))
+extern void cgit_print_error(const char *fmt, ...);
+__attribute__((format (printf,1,0)))
+extern void cgit_vprint_error(const char *fmt, va_list ap);
+extern const struct date_mode *cgit_date_mode(enum date_mode_type type);
+extern void cgit_print_age(time_t t, int tz, time_t max_relative);
+extern void cgit_print_http_headers(void);
+extern void cgit_redirect(const char *url, bool permanent);
+extern void cgit_print_docstart(void);
+extern void cgit_print_docend(void);
+__attribute__((format (printf,3,4)))
+extern void cgit_print_error_page(int code, const char *msg, const char *fmt, ...);
+extern void cgit_print_pageheader(void);
+extern void cgit_print_filemode(unsigned short mode);
+extern void cgit_compose_snapshot_prefix(struct strbuf *filename,
+					 const char *base, const char *ref);
+extern void cgit_print_snapshot_links(const struct cgit_repo *repo,
+				      const char *ref, const char *separator);
+extern const char *cgit_snapshot_prefix(const struct cgit_repo *repo);
+extern void cgit_add_hidden_formfields(int incl_head, int incl_search,
+				       const char *page);
+
+extern void cgit_set_title_from_path(const char *path);
+#endif /* UI_SHARED_H */
diff --git a/third_party/cgit/ui-snapshot.c b/third_party/cgit/ui-snapshot.c
new file mode 100644
index 0000000000..9461d51a59
--- /dev/null
+++ b/third_party/cgit/ui-snapshot.c
@@ -0,0 +1,302 @@
+/* ui-snapshot.c: generate snapshot of a commit
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-snapshot.h"
+#include "html.h"
+#include "ui-shared.h"
+
+static int write_archive_type(const char *format, const char *hex, const char *prefix)
+{
+	struct argv_array argv = ARGV_ARRAY_INIT;
+	const char **nargv;
+	int result;
+	argv_array_push(&argv, "snapshot");
+	argv_array_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);
+		strbuf_release(&buf);
+	}
+	argv_array_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.
+	 */
+	nargv = xmalloc(sizeof(char *) * (argv.argc + 1));
+	/* argv_array guarantees a trailing NULL entry. */
+	memcpy(nargv, argv.argv, sizeof(char *) * (argv.argc + 1));
+
+	result = write_archive(argv.argc, nargv, NULL, the_repository, NULL, 0);
+	argv_array_clear(&argv);
+	free(nargv);
+	return result;
+}
+
+static int write_tar_archive(const char *hex, const char *prefix)
+{
+	return write_archive_type("--format=tar", hex, prefix);
+}
+
+static int write_zip_archive(const char *hex, const char *prefix)
+{
+	return write_archive_type("--format=zip", hex, prefix);
+}
+
+static int write_compressed_tar_archive(const char *hex,
+					const char *prefix,
+					char *filter_argv[])
+{
+	int rv;
+	struct cgit_exec_filter f;
+	cgit_exec_filter_init(&f, filter_argv[0], filter_argv);
+
+	cgit_open_filter(&f.base);
+	rv = write_tar_archive(hex, prefix);
+	cgit_close_filter(&f.base);
+	return rv;
+}
+
+static int write_tar_gzip_archive(const char *hex, const char *prefix)
+{
+	char *argv[] = { "gzip", "-n", NULL };
+	return write_compressed_tar_archive(hex, prefix, argv);
+}
+
+static int write_tar_bzip2_archive(const char *hex, const char *prefix)
+{
+	char *argv[] = { "bzip2", NULL };
+	return write_compressed_tar_archive(hex, prefix, argv);
+}
+
+static int write_tar_xz_archive(const char *hex, const char *prefix)
+{
+	char *argv[] = { "xz", NULL };
+	return write_compressed_tar_archive(hex, prefix, argv);
+}
+
+const struct cgit_snapshot_format cgit_snapshot_formats[] = {
+	/* .tar must remain the 0 index */
+	{ ".tar",	"application/x-tar",	write_tar_archive	},
+	{ ".tar.gz",	"application/x-gzip",	write_tar_gzip_archive	},
+	{ ".tar.bz2",	"application/x-bzip2",	write_tar_bzip2_archive	},
+	{ ".tar.xz",	"application/x-xz",	write_tar_xz_archive	},
+	{ ".zip",	"application/x-zip",	write_zip_archive	},
+	{ NULL }
+};
+
+static struct notes_tree snapshot_sig_notes[ARRAY_SIZE(cgit_snapshot_formats)];
+
+const struct object_id *cgit_snapshot_get_sig(const char *ref,
+					      const struct cgit_snapshot_format *f)
+{
+	struct notes_tree *tree;
+	struct object_id oid;
+
+	if (get_oid(ref, &oid))
+		return NULL;
+
+	tree = &snapshot_sig_notes[f - &cgit_snapshot_formats[0]];
+	if (!tree->initialized) {
+		struct strbuf notes_ref = STRBUF_INIT;
+
+		strbuf_addf(&notes_ref, "refs/notes/signatures/%s",
+			    f->suffix + 1);
+
+		init_notes(tree, notes_ref.buf, combine_notes_ignore, 0);
+		strbuf_release(&notes_ref);
+	}
+
+	return get_note(tree, &oid);
+}
+
+static const struct cgit_snapshot_format *get_format(const char *filename)
+{
+	const struct cgit_snapshot_format *fmt;
+
+	for (fmt = cgit_snapshot_formats; fmt->suffix; fmt++) {
+		if (ends_with(filename, fmt->suffix))
+			return fmt;
+	}
+	return NULL;
+}
+
+const unsigned cgit_snapshot_format_bit(const struct cgit_snapshot_format *f)
+{
+	return BIT(f - &cgit_snapshot_formats[0]);
+}
+
+static int make_snapshot(const struct cgit_snapshot_format *format,
+			 const char *hex, const char *prefix,
+			 const char *filename)
+{
+	struct object_id oid;
+
+	if (get_oid(hex, &oid)) {
+		cgit_print_error_page(404, "Not found",
+				"Bad object id: %s", hex);
+		return 1;
+	}
+	if (!lookup_commit_reference(the_repository, &oid)) {
+		cgit_print_error_page(400, "Bad request",
+				"Not a commit reference: %s", hex);
+		return 1;
+	}
+	ctx.page.etag = oid_to_hex(&oid);
+	ctx.page.mimetype = xstrdup(format->mimetype);
+	ctx.page.filename = xstrdup(filename);
+	cgit_print_http_headers();
+	init_archivers();
+	format->write_func(hex, prefix);
+	return 0;
+}
+
+static int write_sig(const struct cgit_snapshot_format *format,
+		     const char *hex, const char *archive,
+		     const char *filename)
+{
+	const struct object_id *note = cgit_snapshot_get_sig(hex, format);
+	enum object_type type;
+	unsigned long size;
+	char *buf;
+
+	if (!note) {
+		cgit_print_error_page(404, "Not found",
+				"No signature for %s", archive);
+		return 0;
+	}
+
+	buf = read_object_file(note, &type, &size);
+	if (!buf) {
+		cgit_print_error_page(404, "Not found", "Not found");
+		return 0;
+	}
+
+	html("X-Content-Type-Options: nosniff\n");
+	html("Content-Security-Policy: default-src 'none'\n");
+	ctx.page.etag = oid_to_hex(note);
+	ctx.page.mimetype = xstrdup("application/pgp-signature");
+	ctx.page.filename = xstrdup(filename);
+	cgit_print_http_headers();
+
+	html_raw(buf, size);
+	free(buf);
+	return 0;
+}
+
+/* Try to guess the requested revision from the requested snapshot name.
+ * First the format extension is stripped, e.g. "cgit-0.7.2.tar.gz" become
+ * "cgit-0.7.2". If this is a valid commit object name we've got a winner.
+ * Otherwise, if the snapshot name has a prefix matching the result from
+ * repo_basename(), we strip the basename and any following '-' and '_'
+ * characters ("cgit-0.7.2" -> "0.7.2") and check the resulting name once
+ * more. If this still isn't a valid commit object name, we check if pre-
+ * pending a 'v' or a 'V' to the remaining snapshot name ("0.7.2" ->
+ * "v0.7.2") gives us something valid.
+ */
+static const char *get_ref_from_filename(const struct cgit_repo *repo,
+					 const char *filename,
+					 const struct cgit_snapshot_format *format)
+{
+	const char *reponame;
+	struct object_id oid;
+	struct strbuf snapshot = STRBUF_INIT;
+	int result = 1;
+
+	strbuf_addstr(&snapshot, filename);
+	strbuf_setlen(&snapshot, snapshot.len - strlen(format->suffix));
+
+	if (get_oid(snapshot.buf, &oid) == 0)
+		goto out;
+
+	reponame = cgit_snapshot_prefix(repo);
+	if (starts_with(snapshot.buf, reponame)) {
+		const char *new_start = snapshot.buf;
+		new_start += strlen(reponame);
+		while (new_start && (*new_start == '-' || *new_start == '_'))
+			new_start++;
+		strbuf_splice(&snapshot, 0, new_start - snapshot.buf, "", 0);
+	}
+
+	if (get_oid(snapshot.buf, &oid) == 0)
+		goto out;
+
+	strbuf_insert(&snapshot, 0, "v", 1);
+	if (get_oid(snapshot.buf, &oid) == 0)
+		goto out;
+
+	strbuf_splice(&snapshot, 0, 1, "V", 1);
+	if (get_oid(snapshot.buf, &oid) == 0)
+		goto out;
+
+	result = 0;
+	strbuf_release(&snapshot);
+
+out:
+	return result ? strbuf_detach(&snapshot, NULL) : NULL;
+}
+
+void cgit_print_snapshot(const char *head, const char *hex,
+			 const char *filename, int dwim)
+{
+	const struct cgit_snapshot_format* f;
+	const char *sig_filename = NULL;
+	char *adj_filename = NULL;
+	char *prefix = NULL;
+
+	if (!filename) {
+		cgit_print_error_page(400, "Bad request",
+				"No snapshot name specified");
+		return;
+	}
+
+	if (ends_with(filename, ".asc")) {
+		sig_filename = filename;
+
+		/* Strip ".asc" from filename for common format processing */
+		adj_filename = xstrdup(filename);
+		adj_filename[strlen(adj_filename) - 4] = '\0';
+		filename = adj_filename;
+	}
+
+	f = get_format(filename);
+	if (!f || (!sig_filename && !(ctx.repo->snapshots & cgit_snapshot_format_bit(f)))) {
+		cgit_print_error_page(400, "Bad request",
+				"Unsupported snapshot format: %s", filename);
+		return;
+	}
+
+	if (!hex && dwim) {
+		hex = get_ref_from_filename(ctx.repo, filename, f);
+		if (hex == NULL) {
+			cgit_print_error_page(404, "Not found", "Not found");
+			return;
+		}
+		prefix = xstrdup(filename);
+		prefix[strlen(filename) - strlen(f->suffix)] = '\0';
+	}
+
+	if (!hex)
+		hex = head;
+
+	if (!prefix)
+		prefix = xstrdup(cgit_snapshot_prefix(ctx.repo));
+
+	if (sig_filename)
+		write_sig(f, hex, filename, sig_filename);
+	else
+		make_snapshot(f, hex, prefix, filename);
+
+	free(prefix);
+	free(adj_filename);
+}
diff --git a/third_party/cgit/ui-snapshot.h b/third_party/cgit/ui-snapshot.h
new file mode 100644
index 0000000000..a8deec3697
--- /dev/null
+++ b/third_party/cgit/ui-snapshot.h
@@ -0,0 +1,7 @@
+#ifndef UI_SNAPSHOT_H
+#define UI_SNAPSHOT_H
+
+extern void cgit_print_snapshot(const char *head, const char *hex,
+				const char *filename, int dwim);
+
+#endif /* UI_SNAPSHOT_H */
diff --git a/third_party/cgit/ui-ssdiff.c b/third_party/cgit/ui-ssdiff.c
new file mode 100644
index 0000000000..af8bc9e065
--- /dev/null
+++ b/third_party/cgit/ui-ssdiff.c
@@ -0,0 +1,420 @@
+#include "cgit.h"
+#include "ui-ssdiff.h"
+#include "html.h"
+#include "ui-shared.h"
+#include "ui-diff.h"
+
+extern int use_ssdiff;
+
+static int current_old_line, current_new_line;
+static int **L = NULL;
+
+struct deferred_lines {
+	int line_no;
+	char *line;
+	struct deferred_lines *next;
+};
+
+static struct deferred_lines *deferred_old, *deferred_old_last;
+static struct deferred_lines *deferred_new, *deferred_new_last;
+
+static void create_or_reset_lcs_table(void)
+{
+	int i;
+
+	if (L != NULL) {
+		memset(*L, 0, sizeof(int) * MAX_SSDIFF_SIZE);
+		return;
+	}
+
+	// xcalloc will die if we ran out of memory;
+	// not very helpful for debugging
+	L = (int**)xcalloc(MAX_SSDIFF_M, sizeof(int *));
+	*L = (int*)xcalloc(MAX_SSDIFF_SIZE, sizeof(int));
+
+	for (i = 1; i < MAX_SSDIFF_M; i++) {
+		L[i] = *L + i * MAX_SSDIFF_N;
+	}
+}
+
+static char *longest_common_subsequence(char *A, char *B)
+{
+	int i, j, ri;
+	int m = strlen(A);
+	int n = strlen(B);
+	int tmp1, tmp2;
+	int lcs_length;
+	char *result;
+
+	// We bail if the lines are too long
+	if (m >= MAX_SSDIFF_M || n >= MAX_SSDIFF_N)
+		return NULL;
+
+	create_or_reset_lcs_table();
+
+	for (i = m; i >= 0; i--) {
+		for (j = n; j >= 0; j--) {
+			if (A[i] == '\0' || B[j] == '\0') {
+				L[i][j] = 0;
+			} else if (A[i] == B[j]) {
+				L[i][j] = 1 + L[i + 1][j + 1];
+			} else {
+				tmp1 = L[i + 1][j];
+				tmp2 = L[i][j + 1];
+				L[i][j] = (tmp1 > tmp2 ? tmp1 : tmp2);
+			}
+		}
+	}
+
+	lcs_length = L[0][0];
+	result = xmalloc(lcs_length + 2);
+	memset(result, 0, sizeof(*result) * (lcs_length + 2));
+
+	ri = 0;
+	i = 0;
+	j = 0;
+	while (i < m && j < n) {
+		if (A[i] == B[j]) {
+			result[ri] = A[i];
+			ri += 1;
+			i += 1;
+			j += 1;
+		} else if (L[i + 1][j] >= L[i][j + 1]) {
+			i += 1;
+		} else {
+			j += 1;
+		}
+	}
+
+	return result;
+}
+
+static int line_from_hunk(char *line, char type)
+{
+	char *buf1, *buf2;
+	int len, res;
+
+	buf1 = strchr(line, type);
+	if (buf1 == NULL)
+		return 0;
+	buf1 += 1;
+	buf2 = strchr(buf1, ',');
+	if (buf2 == NULL)
+		return 0;
+	len = buf2 - buf1;
+	buf2 = xmalloc(len + 1);
+	strlcpy(buf2, buf1, len + 1);
+	res = atoi(buf2);
+	free(buf2);
+	return res;
+}
+
+static char *replace_tabs(char *line)
+{
+	char *prev_buf = line;
+	char *cur_buf;
+	size_t linelen = strlen(line);
+	int n_tabs = 0;
+	int i;
+	char *result;
+	size_t result_len;
+
+	if (linelen == 0) {
+		result = xmalloc(1);
+		result[0] = '\0';
+		return result;
+	}
+
+	for (i = 0; i < linelen; i++) {
+		if (line[i] == '\t')
+			n_tabs += 1;
+	}
+	result_len = linelen + n_tabs * 8;
+	result = xmalloc(result_len + 1);
+	result[0] = '\0';
+
+	for (;;) {
+		cur_buf = strchr(prev_buf, '\t');
+		if (!cur_buf) {
+			linelen = strlen(result);
+			strlcpy(&result[linelen], prev_buf, result_len - linelen + 1);
+			break;
+		} else {
+			linelen = strlen(result);
+			strlcpy(&result[linelen], prev_buf, cur_buf - prev_buf + 1);
+			linelen = strlen(result);
+			memset(&result[linelen], ' ', 8 - (linelen % 8));
+			result[linelen + 8 - (linelen % 8)] = '\0';
+		}
+		prev_buf = cur_buf + 1;
+	}
+	return result;
+}
+
+static int calc_deferred_lines(struct deferred_lines *start)
+{
+	struct deferred_lines *item = start;
+	int result = 0;
+	while (item) {
+		result += 1;
+		item = item->next;
+	}
+	return result;
+}
+
+static void deferred_old_add(char *line, int line_no)
+{
+	struct deferred_lines *item = xmalloc(sizeof(struct deferred_lines));
+	item->line = xstrdup(line);
+	item->line_no = line_no;
+	item->next = NULL;
+	if (deferred_old) {
+		deferred_old_last->next = item;
+		deferred_old_last = item;
+	} else {
+		deferred_old = deferred_old_last = item;
+	}
+}
+
+static void deferred_new_add(char *line, int line_no)
+{
+	struct deferred_lines *item = xmalloc(sizeof(struct deferred_lines));
+	item->line = xstrdup(line);
+	item->line_no = line_no;
+	item->next = NULL;
+	if (deferred_new) {
+		deferred_new_last->next = item;
+		deferred_new_last = item;
+	} else {
+		deferred_new = deferred_new_last = item;
+	}
+}
+
+static void print_part_with_lcs(char *class, char *line, char *lcs)
+{
+	int line_len = strlen(line);
+	int i, j;
+	char c[2] = " ";
+	int same = 1;
+
+	j = 0;
+	for (i = 0; i < line_len; i++) {
+		c[0] = line[i];
+		if (same) {
+			if (line[i] == lcs[j])
+				j += 1;
+			else {
+				same = 0;
+				htmlf("<span class='%s'>", class);
+			}
+		} else if (line[i] == lcs[j]) {
+			same = 1;
+			html("</span>");
+			j += 1;
+		}
+		html_txt(c);
+	}
+	if (!same)
+		html("</span>");
+}
+
+static void print_ssdiff_line(char *class,
+			      int old_line_no,
+			      char *old_line,
+			      int new_line_no,
+			      char *new_line, int individual_chars)
+{
+	char *lcs = NULL;
+
+	if (old_line)
+		old_line = replace_tabs(old_line + 1);
+	if (new_line)
+		new_line = replace_tabs(new_line + 1);
+	if (individual_chars && old_line && new_line)
+		lcs = longest_common_subsequence(old_line, new_line);
+	html("<tr>\n");
+	if (old_line_no > 0) {
+		struct diff_filespec *old_file = cgit_get_current_old_file();
+		char *lineno_str = fmt("n%d", old_line_no);
+		char *id_str = fmt("id=%s#%s", is_null_oid(&old_file->oid)?"HEAD":oid_to_hex(old_rev_oid), lineno_str);
+		char *fileurl = cgit_fileurl(ctx.repo->url, "tree", old_file->path, id_str);
+		html("<td class='lineno'><a href='");
+		html(fileurl);
+		htmlf("'>%s</a>", lineno_str + 1);
+		html("</td>");
+		htmlf("<td class='%s'>", class);
+		free(fileurl);
+	} else if (old_line)
+		htmlf("<td class='lineno'></td><td class='%s'>", class);
+	else
+		htmlf("<td class='lineno'></td><td class='%s_dark'>", class);
+	if (old_line) {
+		if (lcs)
+			print_part_with_lcs("del", old_line, lcs);
+		else
+			html_txt(old_line);
+	}
+
+	html("</td>\n");
+	if (new_line_no > 0) {
+		struct diff_filespec *new_file = cgit_get_current_new_file();
+		char *lineno_str = fmt("n%d", new_line_no);
+		char *id_str = fmt("id=%s#%s", is_null_oid(&new_file->oid)?"HEAD":oid_to_hex(new_rev_oid), lineno_str);
+		char *fileurl = cgit_fileurl(ctx.repo->url, "tree", new_file->path, id_str);
+		html("<td class='lineno'><a href='");
+		html(fileurl);
+		htmlf("'>%s</a>", lineno_str + 1);
+		html("</td>");
+		htmlf("<td class='%s'>", class);
+		free(fileurl);
+	} else if (new_line)
+		htmlf("<td class='lineno'></td><td class='%s'>", class);
+	else
+		htmlf("<td class='lineno'></td><td class='%s_dark'>", class);
+	if (new_line) {
+		if (lcs)
+			print_part_with_lcs("add", new_line, lcs);
+		else
+			html_txt(new_line);
+	}
+
+	html("</td></tr>");
+	if (lcs)
+		free(lcs);
+	if (new_line)
+		free(new_line);
+	if (old_line)
+		free(old_line);
+}
+
+static void print_deferred_old_lines(void)
+{
+	struct deferred_lines *iter_old, *tmp;
+	iter_old = deferred_old;
+	while (iter_old) {
+		print_ssdiff_line("del", iter_old->line_no,
+				  iter_old->line, -1, NULL, 0);
+		tmp = iter_old->next;
+		free(iter_old);
+		iter_old = tmp;
+	}
+}
+
+static void print_deferred_new_lines(void)
+{
+	struct deferred_lines *iter_new, *tmp;
+	iter_new = deferred_new;
+	while (iter_new) {
+		print_ssdiff_line("add", -1, NULL,
+				  iter_new->line_no, iter_new->line, 0);
+		tmp = iter_new->next;
+		free(iter_new);
+		iter_new = tmp;
+	}
+}
+
+static void print_deferred_changed_lines(void)
+{
+	struct deferred_lines *iter_old, *iter_new, *tmp;
+	int n_old_lines = calc_deferred_lines(deferred_old);
+	int n_new_lines = calc_deferred_lines(deferred_new);
+	int individual_chars = (n_old_lines == n_new_lines ? 1 : 0);
+
+	iter_old = deferred_old;
+	iter_new = deferred_new;
+	while (iter_old || iter_new) {
+		if (iter_old && iter_new)
+			print_ssdiff_line("changed", iter_old->line_no,
+					  iter_old->line,
+					  iter_new->line_no, iter_new->line,
+					  individual_chars);
+		else if (iter_old)
+			print_ssdiff_line("changed", iter_old->line_no,
+					  iter_old->line, -1, NULL, 0);
+		else if (iter_new)
+			print_ssdiff_line("changed", -1, NULL,
+					  iter_new->line_no, iter_new->line, 0);
+		if (iter_old) {
+			tmp = iter_old->next;
+			free(iter_old);
+			iter_old = tmp;
+		}
+
+		if (iter_new) {
+			tmp = iter_new->next;
+			free(iter_new);
+			iter_new = tmp;
+		}
+	}
+}
+
+void cgit_ssdiff_print_deferred_lines(void)
+{
+	if (!deferred_old && !deferred_new)
+		return;
+	if (deferred_old && !deferred_new)
+		print_deferred_old_lines();
+	else if (!deferred_old && deferred_new)
+		print_deferred_new_lines();
+	else
+		print_deferred_changed_lines();
+	deferred_old = deferred_old_last = NULL;
+	deferred_new = deferred_new_last = NULL;
+}
+
+/*
+ * print a single line returned from xdiff
+ */
+void cgit_ssdiff_line_cb(char *line, int len)
+{
+	char c = line[len - 1];
+	line[len - 1] = '\0';
+	if (line[0] == '@') {
+		current_old_line = line_from_hunk(line, '-');
+		current_new_line = line_from_hunk(line, '+');
+	}
+
+	if (line[0] == ' ') {
+		if (deferred_old || deferred_new)
+			cgit_ssdiff_print_deferred_lines();
+		print_ssdiff_line("ctx", current_old_line, line,
+				  current_new_line, line, 0);
+		current_old_line += 1;
+		current_new_line += 1;
+	} else if (line[0] == '+') {
+		deferred_new_add(line, current_new_line);
+		current_new_line += 1;
+	} else if (line[0] == '-') {
+		deferred_old_add(line, current_old_line);
+		current_old_line += 1;
+	} else if (line[0] == '@') {
+		html("<tr><td colspan='4' class='hunk'>");
+		html_txt(line);
+		html("</td></tr>");
+	} else {
+		html("<tr><td colspan='4' class='ctx'>");
+		html_txt(line);
+		html("</td></tr>");
+	}
+	line[len - 1] = c;
+}
+
+void cgit_ssdiff_header_begin(void)
+{
+	current_old_line = -1;
+	current_new_line = -1;
+	html("<tr><td class='space' colspan='4'><div></div></td></tr>");
+	html("<tr><td class='head' colspan='4'>");
+}
+
+void cgit_ssdiff_header_end(void)
+{
+	html("</td></tr>");
+}
+
+void cgit_ssdiff_footer(void)
+{
+	if (deferred_old || deferred_new)
+		cgit_ssdiff_print_deferred_lines();
+	html("<tr><td class='foot' colspan='4'></td></tr>");
+}
diff --git a/third_party/cgit/ui-ssdiff.h b/third_party/cgit/ui-ssdiff.h
new file mode 100644
index 0000000000..11f2714407
--- /dev/null
+++ b/third_party/cgit/ui-ssdiff.h
@@ -0,0 +1,25 @@
+#ifndef UI_SSDIFF_H
+#define UI_SSDIFF_H
+
+/*
+ * ssdiff line limits
+ */
+#ifndef MAX_SSDIFF_M
+#define MAX_SSDIFF_M 128
+#endif
+
+#ifndef MAX_SSDIFF_N
+#define MAX_SSDIFF_N 128
+#endif
+#define MAX_SSDIFF_SIZE ((MAX_SSDIFF_M) * (MAX_SSDIFF_N))
+
+extern void cgit_ssdiff_print_deferred_lines(void);
+
+extern void cgit_ssdiff_line_cb(char *line, int len);
+
+extern void cgit_ssdiff_header_begin(void);
+extern void cgit_ssdiff_header_end(void);
+
+extern void cgit_ssdiff_footer(void);
+
+#endif /* UI_SSDIFF_H */
diff --git a/third_party/cgit/ui-stats.c b/third_party/cgit/ui-stats.c
new file mode 100644
index 0000000000..7272a61a2f
--- /dev/null
+++ b/third_party/cgit/ui-stats.c
@@ -0,0 +1,426 @@
+#include "cgit.h"
+#include "ui-stats.h"
+#include "html.h"
+#include "ui-shared.h"
+
+struct authorstat {
+	long total;
+	struct string_list list;
+};
+
+#define DAY_SECS (60 * 60 * 24)
+#define WEEK_SECS (DAY_SECS * 7)
+
+static void trunc_week(struct tm *tm)
+{
+	time_t t = timegm(tm);
+	t -= ((tm->tm_wday + 6) % 7) * DAY_SECS;
+	gmtime_r(&t, tm);
+}
+
+static void dec_week(struct tm *tm)
+{
+	time_t t = timegm(tm);
+	t -= WEEK_SECS;
+	gmtime_r(&t, tm);
+}
+
+static void inc_week(struct tm *tm)
+{
+	time_t t = timegm(tm);
+	t += WEEK_SECS;
+	gmtime_r(&t, tm);
+}
+
+static char *pretty_week(struct tm *tm)
+{
+	static char buf[10];
+
+	strftime(buf, sizeof(buf), "W%V %G", tm);
+	return buf;
+}
+
+static void trunc_month(struct tm *tm)
+{
+	tm->tm_mday = 1;
+}
+
+static void dec_month(struct tm *tm)
+{
+	tm->tm_mon--;
+	if (tm->tm_mon < 0) {
+		tm->tm_year--;
+		tm->tm_mon = 11;
+	}
+}
+
+static void inc_month(struct tm *tm)
+{
+	tm->tm_mon++;
+	if (tm->tm_mon > 11) {
+		tm->tm_year++;
+		tm->tm_mon = 0;
+	}
+}
+
+static char *pretty_month(struct tm *tm)
+{
+	static const char *months[] = {
+		"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+	};
+	return fmt("%s %d", months[tm->tm_mon], tm->tm_year + 1900);
+}
+
+static void trunc_quarter(struct tm *tm)
+{
+	trunc_month(tm);
+	while (tm->tm_mon % 3 != 0)
+		dec_month(tm);
+}
+
+static void dec_quarter(struct tm *tm)
+{
+	dec_month(tm);
+	dec_month(tm);
+	dec_month(tm);
+}
+
+static void inc_quarter(struct tm *tm)
+{
+	inc_month(tm);
+	inc_month(tm);
+	inc_month(tm);
+}
+
+static char *pretty_quarter(struct tm *tm)
+{
+	return fmt("Q%d %d", tm->tm_mon / 3 + 1, tm->tm_year + 1900);
+}
+
+static void trunc_year(struct tm *tm)
+{
+	trunc_month(tm);
+	tm->tm_mon = 0;
+}
+
+static void dec_year(struct tm *tm)
+{
+	tm->tm_year--;
+}
+
+static void inc_year(struct tm *tm)
+{
+	tm->tm_year++;
+}
+
+static char *pretty_year(struct tm *tm)
+{
+	return fmt("%d", tm->tm_year + 1900);
+}
+
+static const struct cgit_period periods[] = {
+	{'w', "week", 12, 4, trunc_week, dec_week, inc_week, pretty_week},
+	{'m', "month", 12, 4, trunc_month, dec_month, inc_month, pretty_month},
+	{'q', "quarter", 12, 4, trunc_quarter, dec_quarter, inc_quarter, pretty_quarter},
+	{'y', "year", 12, 4, trunc_year, dec_year, inc_year, pretty_year},
+};
+
+/* Given a period code or name, return a period index (1, 2, 3 or 4)
+ * and update the period pointer to the correcsponding struct.
+ * If no matching code is found, return 0.
+ */
+int cgit_find_stats_period(const char *expr, const struct cgit_period **period)
+{
+	int i;
+	char code = '\0';
+
+	if (!expr)
+		return 0;
+
+	if (strlen(expr) == 1)
+		code = expr[0];
+
+	for (i = 0; i < sizeof(periods) / sizeof(periods[0]); i++)
+		if (periods[i].code == code || !strcmp(periods[i].name, expr)) {
+			if (period)
+				*period = &periods[i];
+			return i + 1;
+		}
+	return 0;
+}
+
+const char *cgit_find_stats_periodname(int idx)
+{
+	if (idx > 0 && idx < 4)
+		return periods[idx - 1].name;
+	else
+		return "";
+}
+
+static void add_commit(struct string_list *authors, struct commit *commit,
+	const struct cgit_period *period)
+{
+	struct commitinfo *info;
+	struct string_list_item *author, *item;
+	struct authorstat *authorstat;
+	struct string_list *items;
+	char *tmp;
+	struct tm *date;
+	time_t t;
+	uintptr_t *counter;
+
+	info = cgit_parse_commit(commit);
+	tmp = xstrdup(info->author);
+	author = string_list_insert(authors, tmp);
+	if (!author->util)
+		author->util = xcalloc(1, sizeof(struct authorstat));
+	else
+		free(tmp);
+	authorstat = author->util;
+	items = &authorstat->list;
+	t = info->committer_date;
+	date = gmtime(&t);
+	period->trunc(date);
+	tmp = xstrdup(period->pretty(date));
+	item = string_list_insert(items, tmp);
+	counter = (uintptr_t *)&item->util;
+	if (*counter)
+		free(tmp);
+	(*counter)++;
+
+	authorstat->total++;
+	cgit_free_commitinfo(info);
+}
+
+static int cmp_total_commits(const void *a1, const void *a2)
+{
+	const struct string_list_item *i1 = a1;
+	const struct string_list_item *i2 = a2;
+	const struct authorstat *auth1 = i1->util;
+	const struct authorstat *auth2 = i2->util;
+
+	return auth2->total - auth1->total;
+}
+
+/* Walk the commit DAG and collect number of commits per author per
+ * timeperiod into a nested string_list collection.
+ */
+static struct string_list collect_stats(const struct cgit_period *period)
+{
+	struct string_list authors;
+	struct rev_info rev;
+	struct commit *commit;
+	const char *argv[] = {NULL, ctx.qry.head, NULL, NULL, NULL, NULL};
+	int argc = 3;
+	time_t now;
+	long i;
+	struct tm *tm;
+	char tmp[11];
+
+	time(&now);
+	tm = gmtime(&now);
+	period->trunc(tm);
+	for (i = 1; i < period->count; i++)
+		period->dec(tm);
+	strftime(tmp, sizeof(tmp), "%Y-%m-%d", tm);
+	argv[2] = xstrdup(fmt("--since=%s", tmp));
+	if (ctx.qry.path) {
+		argv[3] = "--";
+		argv[4] = ctx.qry.path;
+		argc += 2;
+	}
+	init_revisions(&rev, NULL);
+	rev.abbrev = DEFAULT_ABBREV;
+	rev.commit_format = CMIT_FMT_DEFAULT;
+	rev.max_parents = 1;
+	rev.verbose_header = 1;
+	rev.show_root_diff = 0;
+	setup_revisions(argc, argv, &rev, NULL);
+	prepare_revision_walk(&rev);
+	memset(&authors, 0, sizeof(authors));
+	while ((commit = get_revision(&rev)) != NULL) {
+		add_commit(&authors, commit, period);
+		free_commit_buffer(the_repository->parsed_objects, commit);
+		free_commit_list(commit->parents);
+		commit->parents = NULL;
+	}
+	return authors;
+}
+
+static void print_combined_authorrow(struct string_list *authors, int from,
+				     int to, const char *name,
+				     const char *leftclass,
+				     const char *centerclass,
+				     const char *rightclass,
+				     const struct cgit_period *period)
+{
+	struct string_list_item *author;
+	struct authorstat *authorstat;
+	struct string_list *items;
+	struct string_list_item *date;
+	time_t now;
+	long i, j, total, subtotal;
+	struct tm *tm;
+	char *tmp;
+
+	time(&now);
+	tm = gmtime(&now);
+	period->trunc(tm);
+	for (i = 1; i < period->count; i++)
+		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);
+		subtotal = 0;
+		for (i = from; i <= to; i++) {
+			author = &authors->items[i];
+			authorstat = author->util;
+			items = &authorstat->list;
+			date = string_list_lookup(items, tmp);
+			if (date)
+				subtotal += (uintptr_t)date->util;
+		}
+		htmlf("<td class='%s'>%ld</td>", centerclass, subtotal);
+		total += subtotal;
+	}
+	htmlf("<td class='%s'>%ld</td></tr>", rightclass, total);
+}
+
+static void print_authors(struct string_list *authors, int top,
+			  const struct cgit_period *period)
+{
+	struct string_list_item *author;
+	struct authorstat *authorstat;
+	struct string_list *items;
+	struct string_list_item *date;
+	time_t now;
+	long i, j, total;
+	struct tm *tm;
+	char *tmp;
+
+	time(&now);
+	tm = gmtime(&now);
+	period->trunc(tm);
+	for (i = 1; i < period->count; i++)
+		period->dec(tm);
+
+	html("<table class='stats'><tr><th>Author</th>");
+	for (j = 0; j < period->count; j++) {
+		tmp = period->pretty(tm);
+		htmlf("<th>%s</th>", tmp);
+		period->inc(tm);
+	}
+	html("<th>Total</th></tr>\n");
+
+	if (top <= 0 || top > authors->nr)
+		top = authors->nr;
+
+	for (i = 0; i < top; i++) {
+		author = &authors->items[i];
+		html("<tr><td class='left'>");
+		html_txt(author->string);
+		html("</td>");
+		authorstat = author->util;
+		items = &authorstat->list;
+		total = 0;
+		for (j = 0; j < period->count; j++)
+			period->dec(tm);
+		for (j = 0; j < period->count; j++) {
+			tmp = period->pretty(tm);
+			period->inc(tm);
+			date = string_list_lookup(items, tmp);
+			if (!date)
+				html("<td>0</td>");
+			else {
+				htmlf("<td>%lu</td>", (uintptr_t)date->util);
+				total += (uintptr_t)date->util;
+			}
+		}
+		htmlf("<td class='sum'>%ld</td></tr>", total);
+	}
+
+	if (top < authors->nr)
+		print_combined_authorrow(authors, top, authors->nr - 1,
+			"Others (%ld)", "left", "", "sum", period);
+
+	print_combined_authorrow(authors, 0, authors->nr - 1, "Total",
+		"total", "sum", "sum", period);
+	html("</table>");
+}
+
+/* Create a sorted string_list with one entry per author. The util-field
+ * for each author is another string_list which is used to calculate the
+ * number of commits per time-interval.
+ */
+void cgit_show_stats(void)
+{
+	struct string_list authors;
+	const struct cgit_period *period;
+	int top, i;
+	const char *code = "w";
+
+	if (ctx.qry.period)
+		code = ctx.qry.period;
+
+	i = cgit_find_stats_period(code, &period);
+	if (!i) {
+		cgit_print_error_page(404, "Not found",
+			"Unknown statistics type: %c", code[0]);
+		return;
+	}
+	if (i > ctx.repo->max_stats) {
+		cgit_print_error_page(400, "Bad request",
+			"Statistics type disabled: %s", period->name);
+		return;
+	}
+	authors = collect_stats(period);
+	qsort(authors.items, authors.nr, sizeof(struct string_list_item),
+		cmp_total_commits);
+
+	top = ctx.qry.ofs;
+	if (!top)
+		top = 10;
+
+	cgit_print_layout_start();
+	html("<div class='cgit-panel'>");
+	html("<b>stat options</b>");
+	html("<form method='get'>");
+	cgit_add_hidden_formfields(1, 0, "stats");
+	html("<table><tr><td colspan='2'/></tr>");
+	if (ctx.repo->max_stats > 1) {
+		html("<tr><td class='label'>Period:</td>");
+		html("<td class='ctrl'><select name='period' onchange='this.form.submit();'>");
+		for (i = 0; i < ctx.repo->max_stats; i++)
+			html_option(fmt("%c", periods[i].code),
+				    periods[i].name, fmt("%c", period->code));
+		html("</select></td></tr>");
+	}
+	html("<tr><td class='label'>Authors:</td>");
+	html("<td class='ctrl'><select name='ofs' onchange='this.form.submit();'>");
+	html_intoption(10, "10", top);
+	html_intoption(25, "25", top);
+	html_intoption(50, "50", top);
+	html_intoption(100, "100", top);
+	html_intoption(-1, "all", top);
+	html("</select></td></tr>");
+	html("<tr><td/><td class='ctrl'>");
+	html("<noscript><input type='submit' value='Reload'/></noscript>");
+	html("</td></tr></table>");
+	html("</form>");
+	html("</div>");
+	htmlf("<h2>Commits per author per %s", period->name);
+	if (ctx.qry.path) {
+		html(" (path '");
+		html_txt(ctx.qry.path);
+		html("')");
+	}
+	html("</h2>");
+	print_authors(&authors, top, period);
+	cgit_print_layout_end();
+}
+
diff --git a/third_party/cgit/ui-stats.h b/third_party/cgit/ui-stats.h
new file mode 100644
index 0000000000..0e61b03da3
--- /dev/null
+++ b/third_party/cgit/ui-stats.h
@@ -0,0 +1,28 @@
+#ifndef UI_STATS_H
+#define UI_STATS_H
+
+#include "cgit.h"
+
+struct cgit_period {
+	const char code;
+	const char *name;
+	int max_periods;
+	int count;
+
+	/* Convert a tm value to the first day in the period */
+	void (*trunc)(struct tm *tm);
+
+	/* Update tm value to start of next/previous period */
+	void (*dec)(struct tm *tm);
+	void (*inc)(struct tm *tm);
+
+	/* Pretty-print a tm value */
+	char *(*pretty)(struct tm *tm);
+};
+
+extern int cgit_find_stats_period(const char *expr, const struct cgit_period **period);
+extern const char *cgit_find_stats_periodname(int idx);
+
+extern void cgit_show_stats(void);
+
+#endif /* UI_STATS_H */
diff --git a/third_party/cgit/ui-summary.c b/third_party/cgit/ui-summary.c
new file mode 100644
index 0000000000..947812a814
--- /dev/null
+++ b/third_party/cgit/ui-summary.c
@@ -0,0 +1,148 @@
+/* ui-summary.c: functions for generating repo summary page
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-summary.h"
+#include "html.h"
+#include "ui-blob.h"
+#include "ui-log.h"
+#include "ui-plain.h"
+#include "ui-refs.h"
+#include "ui-shared.h"
+
+static int urls;
+
+static void print_url(const char *url)
+{
+	int columns = 3;
+
+	if (ctx.repo->enable_log_filecount)
+		columns++;
+	if (ctx.repo->enable_log_linecount)
+		columns++;
+
+	if (urls++ == 0) {
+		htmlf("<tr class='nohover'><td colspan='%d'>&nbsp;</td></tr>", columns);
+		htmlf("<tr class='nohover'><th class='left' colspan='%d'>Clone</th></tr>\n", columns);
+	}
+
+	htmlf("<tr><td colspan='%d'><a rel='vcs-git' href='", columns);
+	html_url_path(url);
+	html("' title='");
+	html_attr(ctx.repo->name);
+	html(" Git repository'>");
+	html_txt(url);
+	html("</a></td></tr>\n");
+}
+
+void cgit_print_summary(void)
+{
+	int columns = 3;
+
+	if (ctx.repo->enable_log_filecount)
+		columns++;
+	if (ctx.repo->enable_log_linecount)
+		columns++;
+
+	cgit_print_layout_start();
+	html("<table summary='repository info' class='list nowrap'>");
+	cgit_print_branches(ctx.cfg.summary_branches);
+	htmlf("<tr class='nohover'><td colspan='%d'>&nbsp;</td></tr>", columns);
+	cgit_print_tags(ctx.cfg.summary_tags);
+	if (ctx.cfg.summary_log > 0) {
+		htmlf("<tr class='nohover'><td colspan='%d'>&nbsp;</td></tr>", columns);
+		cgit_print_log(ctx.qry.head, 0, ctx.cfg.summary_log, NULL,
+			       NULL, NULL, 0, 0, 0);
+	}
+	urls = 0;
+	cgit_add_clone_urls(print_url);
+	html("</table>");
+	cgit_print_layout_end();
+}
+
+/* The caller must free the return value. */
+static char* append_readme_path(const char *filename, const char *ref, const char *path)
+{
+	char *file, *base_dir, *full_path, *resolved_base = NULL, *resolved_full = NULL;
+	/* If a subpath is specified for the about page, make it relative
+	 * to the directory containing the configured readme. */
+
+	file = xstrdup(filename);
+	base_dir = dirname(file);
+	if (!strcmp(base_dir, ".") || !strcmp(base_dir, "..")) {
+		if (!ref) {
+			free(file);
+			return NULL;
+		}
+		full_path = xstrdup(path);
+	} else
+		full_path = fmtalloc("%s/%s", base_dir, path);
+
+	if (!ref) {
+		resolved_base = realpath(base_dir, NULL);
+		resolved_full = realpath(full_path, NULL);
+		if (!resolved_base || !resolved_full || !starts_with(resolved_full, resolved_base)) {
+			free(full_path);
+			full_path = NULL;
+		}
+	}
+
+	free(file);
+	free(resolved_base);
+	free(resolved_full);
+
+	return full_path;
+}
+
+void cgit_print_repo_readme(const char *path)
+{
+	char *filename, *ref, *mimetype;
+	int free_filename = 0;
+
+	mimetype = get_mimetype_for_filename(path);
+	if (mimetype && (!strncmp(mimetype, "image/", 6) || !strncmp(mimetype, "video/", 6))) {
+		ctx.page.mimetype = mimetype;
+		ctx.page.charset = NULL;
+		cgit_print_plain();
+		free(mimetype);
+		return;
+	}
+	free(mimetype);
+
+	cgit_print_layout_start();
+	if (ctx.repo->readme.nr == 0)
+		goto done;
+
+	filename = ctx.repo->readme.items[0].string;
+	ref = ctx.repo->readme.items[0].util;
+
+	if (path) {
+		free_filename = 1;
+		filename = append_readme_path(filename, ref, path);
+		if (!filename)
+			goto done;
+	}
+
+	/* Print the calculated readme, either from the git repo or from the
+	 * filesystem, while applying the about-filter.
+	 */
+	html("<div id='summary'>");
+	cgit_open_filter(ctx.repo->about_filter, filename);
+	if (ref)
+		cgit_print_file(filename, ref, 1);
+	else
+		html_include(filename);
+	cgit_close_filter(ctx.repo->about_filter);
+
+	html("</div>");
+	if (free_filename)
+		free(filename);
+
+done:
+	cgit_print_layout_end();
+}
diff --git a/third_party/cgit/ui-summary.h b/third_party/cgit/ui-summary.h
new file mode 100644
index 0000000000..cba696af53
--- /dev/null
+++ b/third_party/cgit/ui-summary.h
@@ -0,0 +1,7 @@
+#ifndef UI_SUMMARY_H
+#define UI_SUMMARY_H
+
+extern void cgit_print_summary(void);
+extern void cgit_print_repo_readme(const char *path);
+
+#endif /* UI_SUMMARY_H */
diff --git a/third_party/cgit/ui-tag.c b/third_party/cgit/ui-tag.c
new file mode 100644
index 0000000000..846d5b141f
--- /dev/null
+++ b/third_party/cgit/ui-tag.c
@@ -0,0 +1,120 @@
+/* ui-tag.c: display a tag
+ *
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-tag.h"
+#include "html.h"
+#include "ui-shared.h"
+
+static void print_tag_content(char *buf)
+{
+	char *p;
+
+	if (!buf)
+		return;
+
+	html("<div class='commit-subject'>");
+	p = strchr(buf, '\n');
+	if (p)
+		*p = '\0';
+	html_txt(buf);
+	html("</div>");
+	if (p) {
+		html("<div class='commit-msg'>");
+		html_txt(++p);
+		html("</div>");
+	}
+}
+
+static void print_download_links(char *revname)
+{
+	html("<tr><th>download</th><td class='sha1'>");
+	cgit_print_snapshot_links(ctx.repo, revname, "<br/>");
+	html("</td></tr>");
+}
+
+void cgit_print_tag(char *revname)
+{
+	struct strbuf fullref = STRBUF_INIT;
+	struct object_id oid;
+	struct object *obj;
+
+	if (!revname)
+		revname = ctx.qry.head;
+
+	strbuf_addf(&fullref, "refs/tags/%s", revname);
+	if (get_oid(fullref.buf, &oid)) {
+		cgit_print_error_page(404, "Not found",
+			"Bad tag reference: %s", revname);
+		goto cleanup;
+	}
+	obj = parse_object(the_repository, &oid);
+	if (!obj) {
+		cgit_print_error_page(500, "Internal server error",
+			"Bad object id: %s", oid_to_hex(&oid));
+		goto cleanup;
+	}
+	if (obj->type == OBJ_TAG) {
+		struct tag *tag;
+		struct taginfo *info;
+
+		tag = lookup_tag(the_repository, &oid);
+		if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag))) {
+			cgit_print_error_page(500, "Internal server error",
+				"Bad tag object: %s", revname);
+			goto cleanup;
+		}
+		cgit_print_layout_start();
+		html("<table class='commit-info'>\n");
+		html("<tr><td>tag name</td><td>");
+		html_txt(revname);
+		htmlf(" (%s)</td></tr>\n", oid_to_hex(&oid));
+		if (info->tagger_date > 0) {
+			html("<tr><td>tag date</td><td>");
+			html_txt(show_date(info->tagger_date, info->tagger_tz,
+						cgit_date_mode(DATE_ISO8601)));
+			html("</td></tr>\n");
+		}
+		if (info->tagger) {
+			html("<tr><td>tagged by</td><td>");
+			cgit_open_filter(ctx.repo->email_filter, info->tagger_email, "tag");
+			html_txt(info->tagger);
+			if (info->tagger_email && !ctx.cfg.noplainemail) {
+				html(" ");
+				html_txt(info->tagger_email);
+			}
+			cgit_close_filter(ctx.repo->email_filter);
+			html("</td></tr>\n");
+		}
+		html("<tr><td>tagged object</td><td class='sha1'>");
+		cgit_object_link(tag->tagged);
+		html("</td></tr>\n");
+		if (ctx.repo->snapshots)
+			print_download_links(revname);
+		html("</table>\n");
+		print_tag_content(info->msg);
+		cgit_print_layout_end();
+		cgit_free_taginfo(info);
+	} else {
+		cgit_print_layout_start();
+		html("<table class='commit-info'>\n");
+		html("<tr><td>tag name</td><td>");
+		html_txt(revname);
+		html("</td></tr>\n");
+		html("<tr><td>tagged object</td><td class='sha1'>");
+		cgit_object_link(obj);
+		html("</td></tr>\n");
+		if (ctx.repo->snapshots)
+			print_download_links(revname);
+		html("</table>\n");
+		cgit_print_layout_end();
+	}
+
+cleanup:
+	strbuf_release(&fullref);
+}
diff --git a/third_party/cgit/ui-tag.h b/third_party/cgit/ui-tag.h
new file mode 100644
index 0000000000..d295cdcdbd
--- /dev/null
+++ b/third_party/cgit/ui-tag.h
@@ -0,0 +1,6 @@
+#ifndef UI_TAG_H
+#define UI_TAG_H
+
+extern void cgit_print_tag(char *revname);
+
+#endif /* UI_TAG_H */
diff --git a/third_party/cgit/ui-tree.c b/third_party/cgit/ui-tree.c
new file mode 100644
index 0000000000..84eb17d647
--- /dev/null
+++ b/third_party/cgit/ui-tree.c
@@ -0,0 +1,388 @@
+/* ui-tree.c: functions for tree output
+ *
+ * Copyright (C) 2006-2017 cgit Development Team <cgit@lists.zx2c4.com>
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
+#include "cgit.h"
+#include "ui-tree.h"
+#include "html.h"
+#include "ui-shared.h"
+
+struct walk_tree_context {
+	char *curr_rev;
+	char *match_path;
+	int state;
+};
+
+static void print_text_buffer(const char *name, char *buf, unsigned long size)
+{
+	unsigned long lineno, idx;
+	const char *numberfmt = "<a id='n%1$d' href='#n%1$d'>%1$d</a>\n";
+
+	html("<table summary='blob content' class='blob'>\n");
+
+	if (ctx.cfg.enable_tree_linenumbers) {
+		html("<tr><td class='linenumbers'><pre>");
+		idx = 0;
+		lineno = 0;
+
+		if (size) {
+			htmlf(numberfmt, ++lineno);
+			while (idx < size - 1) { // skip absolute last newline
+				if (buf[idx] == '\n')
+					htmlf(numberfmt, ++lineno);
+				idx++;
+			}
+		}
+		html("</pre></td>\n");
+	}
+	else {
+		html("<tr>\n");
+	}
+
+	if (ctx.repo->source_filter) {
+		char *filter_arg = xstrdup(name);
+		html("<td class='lines'><pre><code>");
+		cgit_open_filter(ctx.repo->source_filter, filter_arg);
+		html_raw(buf, size);
+		cgit_close_filter(ctx.repo->source_filter);
+		free(filter_arg);
+		html("</code></pre></td></tr></table>\n");
+		return;
+	}
+
+	html("<td class='lines'><pre><code>");
+	html_txt(buf);
+	html("</code></pre></td></tr></table>\n");
+}
+
+#define ROWLEN 32
+
+static void print_binary_buffer(char *buf, unsigned long size)
+{
+	unsigned long ofs, idx;
+	static char ascii[ROWLEN + 1];
+
+	html("<table summary='blob content' class='bin-blob'>\n");
+	html("<tr><th>ofs</th><th>hex dump</th><th>ascii</th></tr>");
+	for (ofs = 0; ofs < size; ofs += ROWLEN, buf += ROWLEN) {
+		htmlf("<tr><td class='right'>%04lx</td><td class='hex'>", ofs);
+		for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++)
+			htmlf("%*s%02x",
+			      idx == 16 ? 4 : 1, "",
+			      buf[idx] & 0xff);
+		html(" </td><td class='hex'>");
+		for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++)
+			ascii[idx] = isgraph(buf[idx]) ? buf[idx] : '.';
+		ascii[idx] = '\0';
+		html_txt(ascii);
+		html("</td></tr>\n");
+	}
+	html("</table>\n");
+}
+
+static void print_object(const struct object_id *oid, const char *path, const char *basename, const char *rev)
+{
+	enum object_type type;
+	char *buf;
+	unsigned long size;
+
+	type = oid_object_info(the_repository, oid, &size);
+	if (type == OBJ_BAD) {
+		cgit_print_error_page(404, "Not found",
+			"Bad object name: %s", oid_to_hex(oid));
+		return;
+	}
+
+	buf = read_object_file(oid, &type, &size);
+	if (!buf) {
+		cgit_print_error_page(500, "Internal server error",
+			"Error reading object %s", oid_to_hex(oid));
+		return;
+	}
+
+	cgit_set_title_from_path(path);
+
+	cgit_print_layout_start();
+	htmlf("blob: %s (", oid_to_hex(oid));
+	cgit_plain_link("plain", NULL, NULL, ctx.qry.head,
+		        rev, path);
+	if (ctx.repo->enable_blame) {
+		html(") (");
+		cgit_blame_link("blame", NULL, NULL, ctx.qry.head,
+			        rev, path);
+	}
+	html(")\n");
+
+	if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) {
+		htmlf("<div class='error'>blob size (%ldKB) exceeds display size limit (%dKB).</div>",
+				size / 1024, ctx.cfg.max_blob_size);
+		return;
+	}
+
+	if (buffer_is_binary(buf, size))
+		print_binary_buffer(buf, size);
+	else
+		print_text_buffer(basename, buf, size);
+
+	free(buf);
+}
+
+struct single_tree_ctx {
+	struct strbuf *path;
+	struct object_id oid;
+	char *name;
+	size_t count;
+};
+
+static int single_tree_cb(const struct object_id *oid, struct strbuf *base,
+			  const char *pathname, unsigned mode, int stage,
+			  void *cbdata)
+{
+	struct single_tree_ctx *ctx = cbdata;
+
+	if (++ctx->count > 1)
+		return -1;
+
+	if (!S_ISDIR(mode)) {
+		ctx->count = 2;
+		return -1;
+	}
+
+	ctx->name = xstrdup(pathname);
+	oidcpy(&ctx->oid, oid);
+	strbuf_addf(ctx->path, "/%s", pathname);
+	return 0;
+}
+
+static void write_tree_link(const struct object_id *oid, char *name,
+			    char *rev, struct strbuf *fullpath)
+{
+	size_t initial_length = fullpath->len;
+	struct tree *tree;
+	struct single_tree_ctx tree_ctx = {
+		.path = fullpath,
+		.count = 1,
+	};
+	struct pathspec paths = {
+		.nr = 0
+	};
+
+	oidcpy(&tree_ctx.oid, oid);
+
+	while (tree_ctx.count == 1) {
+		cgit_tree_link(name, NULL, "ls-dir", ctx.qry.head, rev,
+			       fullpath->buf);
+
+		tree = lookup_tree(the_repository, &tree_ctx.oid);
+		if (!tree)
+			return;
+
+		free(tree_ctx.name);
+		tree_ctx.name = NULL;
+		tree_ctx.count = 0;
+
+		read_tree_recursive(the_repository, tree, "", 0, 1,
+			&paths, single_tree_cb, &tree_ctx);
+
+		if (tree_ctx.count != 1)
+			break;
+
+		html(" / ");
+		name = tree_ctx.name;
+	}
+
+	strbuf_setlen(fullpath, initial_length);
+}
+
+static int ls_item(const struct object_id *oid, struct strbuf *base,
+		const char *pathname, unsigned mode, int stage, void *cbdata)
+{
+	struct walk_tree_context *walk_tree_ctx = cbdata;
+	char *name;
+	struct strbuf fullpath = STRBUF_INIT;
+	struct strbuf class = STRBUF_INIT;
+	enum object_type type;
+	unsigned long size = 0;
+
+	name = xstrdup(pathname);
+	strbuf_addf(&fullpath, "%s%s%s", ctx.qry.path ? ctx.qry.path : "",
+		    ctx.qry.path ? "/" : "", name);
+
+	if (!S_ISGITLINK(mode)) {
+		type = oid_object_info(the_repository, oid, &size);
+		if (type == OBJ_BAD) {
+			htmlf("<tr><td colspan='3'>Bad object: %s %s</td></tr>",
+			      name,
+			      oid_to_hex(oid));
+			free(name);
+			return 0;
+		}
+	}
+
+	html("<tr><td class='ls-mode'>");
+	cgit_print_filemode(mode);
+	html("</td><td>");
+	if (S_ISGITLINK(mode)) {
+		cgit_submodule_link("ls-mod", fullpath.buf, oid_to_hex(oid));
+	} else if (S_ISDIR(mode)) {
+		write_tree_link(oid, name, walk_tree_ctx->curr_rev,
+				&fullpath);
+	} else {
+		char *ext = strrchr(name, '.');
+		strbuf_addstr(&class, "ls-blob");
+		if (ext)
+			strbuf_addf(&class, " %s", ext + 1);
+		cgit_tree_link(name, NULL, class.buf, ctx.qry.head,
+			       walk_tree_ctx->curr_rev, fullpath.buf);
+	}
+	htmlf("</td><td class='ls-size'>%li</td>", size);
+
+	html("<td>");
+	cgit_log_link("log", NULL, "button", ctx.qry.head,
+		      walk_tree_ctx->curr_rev, fullpath.buf, 0, NULL, NULL,
+		      ctx.qry.showmsg, 0);
+	if (ctx.repo->max_stats)
+		cgit_stats_link("stats", NULL, "button", ctx.qry.head,
+				fullpath.buf);
+	if (!S_ISGITLINK(mode))
+		cgit_plain_link("plain", NULL, "button", ctx.qry.head,
+				walk_tree_ctx->curr_rev, fullpath.buf);
+	if (!S_ISDIR(mode) && ctx.repo->enable_blame)
+		cgit_blame_link("blame", NULL, "button", ctx.qry.head,
+				walk_tree_ctx->curr_rev, fullpath.buf);
+	html("</td></tr>\n");
+	free(name);
+	strbuf_release(&fullpath);
+	strbuf_release(&class);
+	return 0;
+}
+
+static void ls_head(void)
+{
+	cgit_print_layout_start();
+	html("<table summary='tree listing' class='list'>\n");
+	html("<tr class='nohover'>");
+	html("<th class='left'>Mode</th>");
+	html("<th class='left'>Name</th>");
+	html("<th class='right'>Size</th>");
+	html("<th/>");
+	html("</tr>\n");
+}
+
+static void ls_tail(void)
+{
+	html("</table>\n");
+	cgit_print_layout_end();
+}
+
+static void ls_tree(const struct object_id *oid, const char *path, struct walk_tree_context *walk_tree_ctx)
+{
+	struct tree *tree;
+	struct pathspec paths = {
+		.nr = 0
+	};
+
+	tree = parse_tree_indirect(oid);
+	if (!tree) {
+		cgit_print_error_page(404, "Not found",
+			"Not a tree object: %s", oid_to_hex(oid));
+		return;
+	}
+
+	ls_head();
+	read_tree_recursive(the_repository, tree, "", 0, 1,
+		&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)
+{
+	struct walk_tree_context *walk_tree_ctx = cbdata;
+
+	if (walk_tree_ctx->state == 0) {
+		struct strbuf buffer = STRBUF_INIT;
+
+		strbuf_addbuf(&buffer, base);
+		strbuf_addstr(&buffer, pathname);
+		if (strcmp(walk_tree_ctx->match_path, buffer.buf))
+			return READ_TREE_RECURSIVE;
+
+		if (S_ISDIR(mode)) {
+			walk_tree_ctx->state = 1;
+			cgit_set_title_from_path(buffer.buf);
+			strbuf_release(&buffer);
+			ls_head();
+			return READ_TREE_RECURSIVE;
+		} else {
+			walk_tree_ctx->state = 2;
+			print_object(oid, buffer.buf, pathname, walk_tree_ctx->curr_rev);
+			strbuf_release(&buffer);
+			return 0;
+		}
+	}
+	ls_item(oid, base, pathname, mode, stage, walk_tree_ctx);
+	return 0;
+}
+
+/*
+ * Show a tree or a blob
+ *   rev:  the commit pointing at the root tree object
+ *   path: path to tree or blob
+ */
+void cgit_print_tree(const char *rev, char *path)
+{
+	struct object_id oid;
+	struct commit *commit;
+	struct pathspec_item path_items = {
+		.match = path,
+		.len = path ? strlen(path) : 0
+	};
+	struct pathspec paths = {
+		.nr = path ? 1 : 0,
+		.items = &path_items
+	};
+	struct walk_tree_context walk_tree_ctx = {
+		.match_path = path,
+		.state = 0
+	};
+
+	if (!rev)
+		rev = ctx.qry.head;
+
+	if (get_oid(rev, &oid)) {
+		cgit_print_error_page(404, "Not found",
+			"Invalid revision name: %s", rev);
+		return;
+	}
+	commit = lookup_commit_reference(the_repository, &oid);
+	if (!commit || parse_commit(commit)) {
+		cgit_print_error_page(404, "Not found",
+			"Invalid commit reference: %s", rev);
+		return;
+	}
+
+	walk_tree_ctx.curr_rev = xstrdup(rev);
+
+	if (path == NULL) {
+		ls_tree(&commit->maybe_tree->object.oid, NULL, &walk_tree_ctx);
+		goto cleanup;
+	}
+
+	read_tree_recursive(the_repository, commit->maybe_tree, "", 0, 0,
+		&paths, walk_tree, &walk_tree_ctx);
+	if (walk_tree_ctx.state == 1)
+		ls_tail();
+	else if (walk_tree_ctx.state == 2)
+		cgit_print_layout_end();
+	else
+		cgit_print_error_page(404, "Not found", "Path not found");
+
+cleanup:
+	free(walk_tree_ctx.curr_rev);
+}
diff --git a/third_party/cgit/ui-tree.h b/third_party/cgit/ui-tree.h
new file mode 100644
index 0000000000..bbd34e3566
--- /dev/null
+++ b/third_party/cgit/ui-tree.h
@@ -0,0 +1,6 @@
+#ifndef UI_TREE_H
+#define UI_TREE_H
+
+extern void cgit_print_tree(const char *rev, char *path);
+
+#endif /* UI_TREE_H */
diff --git a/third_party/default.nix b/third_party/default.nix
new file mode 100644
index 0000000000..6e7bf873c6
--- /dev/null
+++ b/third_party/default.nix
@@ -0,0 +1,111 @@
+# This file controls the import of external dependencies (i.e.
+# third-party code) into my package tree.
+#
+# This includes *all packages needed from nixpkgs*.
+
+{ pkgs, ... }:
+let
+  commit = "e0470e11c7a02f9e6e70f5ec5e1d9470c742b396";
+  nixpkgsSrc = fetchTarball {
+    url = "https://github.com/NixOS/nixpkgs-channels/archive/${commit}.tar.gz";
+    sha256 = "1amczhr8m7lvxnxzwhfamz4ga78sgnyzdfr759iq26azkh6fa03a";
+  };
+  nixpkgs = import nixpkgsSrc {
+    config.allowUnfree = true;
+    config.allowBroken = true;
+  };
+
+  exposed = {
+    # Inherit the packages from nixpkgs that should be available inside
+    # of the repo. They become available under `pkgs.third_party.<name>`
+    inherit (nixpkgs)
+      age
+      bashInteractive
+      bat
+      buildGoPackage
+      cacert
+      cachix
+      cargo
+      cgit
+      coreutils
+      darwin
+      dockerTools
+      emacs26
+      emacs26-nox
+      emacsPackagesNg
+      emacsPackagesNgGen
+      fetchFromGitHub
+      fetchurl
+      fira
+      fira-code
+      fira-mono
+      gettext
+      glibc
+      gnutar
+      go
+      google-cloud-sdk
+      gzip
+      haskell
+      iana-etc
+      imagemagickBig
+      jq
+      kontemplate
+      lib
+      lispPackages
+      llvmPackages
+      luatex
+      makeFontsConf
+      makeWrapper
+      mdbook
+      mime-types
+      moreutils
+      nano
+      nginx
+      nix
+      openssh
+      openssl
+      parallel
+      pkgconfig
+      protobuf
+      python3Packages
+      remarshal
+      rink
+      ripgrep
+      rsync
+      runCommand
+      runCommandNoCC
+      rustPlatform
+      rustc
+      sbcl
+      stdenv
+      stern
+      symlinkJoin
+      systemd
+      tdlib
+      terraform_0_12
+      texlive
+      thttpd
+      tree
+      writeShellScript
+      writeShellScriptBin
+      writeText
+      writeTextFile
+      zlib
+      zstd;
+  };
+
+in exposed // {
+  callPackage = nixpkgs.lib.callPackageWith exposed;
+
+  # Provide the source code of nixpkgs, but do not provide an imported
+  # version of it.
+  inherit nixpkgsSrc;
+
+  # Packages to be overridden
+  originals = {
+    inherit (nixpkgs) git notmuch;
+  };
+
+  # Make NixOS available
+  nixos = import "${nixpkgsSrc}/nixos";
+}
diff --git a/third_party/emacs/carp-mode.nix b/third_party/emacs/carp-mode.nix
new file mode 100644
index 0000000000..869cf05c19
--- /dev/null
+++ b/third_party/emacs/carp-mode.nix
@@ -0,0 +1,23 @@
+{ pkgs, ... }:
+
+with pkgs.third_party;
+with emacsPackagesNg;
+
+melpaBuild rec {
+  pname = "carp-mode";
+  version = "3.0";
+  packageRequires = [ clojure-mode ];
+
+  recipe = builtins.toFile "recipe" ''
+    (carp-mode :fetcher github
+        :repo "carp-lang/carp"
+        :files ("emacs/*.el"))
+  '';
+
+  src = fetchFromGitHub {
+    owner = "carp-lang";
+    repo = "carp";
+    rev = "6954642cadee730885717201c3180c7acfb1bfa9";
+    sha256 = "1pz4x2qkwjbz789bwc6nkacrjpzlxawxhl2nv0xdp731y7q7xyk9";
+  };
+}
diff --git a/.clang-format b/third_party/git/.clang-format
index c592dda681..c592dda681 100644
--- a/.clang-format
+++ b/third_party/git/.clang-format
diff --git a/.editorconfig b/third_party/git/.editorconfig
index 42cdc4bbfb..42cdc4bbfb 100644
--- a/.editorconfig
+++ b/third_party/git/.editorconfig
diff --git a/.gitattributes b/third_party/git/.gitattributes
index b08a1416d8..b08a1416d8 100644
--- a/.gitattributes
+++ b/third_party/git/.gitattributes
diff --git a/.github/CONTRIBUTING.md b/third_party/git/.github/CONTRIBUTING.md
index e7b4e2f3c2..e7b4e2f3c2 100644
--- a/.github/CONTRIBUTING.md
+++ b/third_party/git/.github/CONTRIBUTING.md
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/third_party/git/.github/PULL_REQUEST_TEMPLATE.md
index 952c7c3a2a..952c7c3a2a 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/third_party/git/.github/PULL_REQUEST_TEMPLATE.md
diff --git a/third_party/git/.gitignore b/third_party/git/.gitignore
new file mode 100644
index 0000000000..521d8f4fb4
--- /dev/null
+++ b/third_party/git/.gitignore
@@ -0,0 +1,240 @@
+/fuzz-commit-graph
+/fuzz_corpora
+/fuzz-pack-headers
+/fuzz-pack-idx
+/GIT-BUILD-OPTIONS
+/GIT-CFLAGS
+/GIT-LDFLAGS
+/GIT-PREFIX
+/GIT-PERL-DEFINES
+/GIT-PERL-HEADER
+/GIT-PYTHON-VARS
+/GIT-SCRIPT-DEFINES
+/GIT-USER-AGENT
+/GIT-VERSION-FILE
+/bin-wrappers/
+/git
+/git-add
+/git-add--interactive
+/git-am
+/git-annotate
+/git-apply
+/git-archimport
+/git-archive
+/git-bisect
+/git-bisect--helper
+/git-blame
+/git-branch
+/git-bundle
+/git-cat-file
+/git-check-attr
+/git-check-ignore
+/git-check-mailmap
+/git-check-ref-format
+/git-checkout
+/git-checkout-index
+/git-cherry
+/git-cherry-pick
+/git-clean
+/git-clone
+/git-column
+/git-commit
+/git-commit-graph
+/git-commit-tree
+/git-config
+/git-count-objects
+/git-credential
+/git-credential-cache
+/git-credential-cache--daemon
+/git-credential-store
+/git-cvsexportcommit
+/git-cvsimport
+/git-cvsserver
+/git-daemon
+/git-diff
+/git-diff-files
+/git-diff-index
+/git-diff-tree
+/git-difftool
+/git-difftool--helper
+/git-describe
+/git-env--helper
+/git-fast-export
+/git-fast-import
+/git-fetch
+/git-fetch-pack
+/git-filter-branch
+/git-fmt-merge-msg
+/git-for-each-ref
+/git-format-patch
+/git-fsck
+/git-fsck-objects
+/git-gc
+/git-get-tar-commit-id
+/git-grep
+/git-hash-object
+/git-help
+/git-http-backend
+/git-http-fetch
+/git-http-push
+/git-imap-send
+/git-index-pack
+/git-init
+/git-init-db
+/git-interpret-trailers
+/git-instaweb
+/git-legacy-stash
+/git-log
+/git-ls-files
+/git-ls-remote
+/git-ls-tree
+/git-mailinfo
+/git-mailsplit
+/git-merge
+/git-merge-base
+/git-merge-index
+/git-merge-file
+/git-merge-tree
+/git-merge-octopus
+/git-merge-one-file
+/git-merge-ours
+/git-merge-recursive
+/git-merge-resolve
+/git-merge-subtree
+/git-mergetool
+/git-mergetool--lib
+/git-mktag
+/git-mktree
+/git-multi-pack-index
+/git-mv
+/git-name-rev
+/git-notes
+/git-p4
+/git-pack-redundant
+/git-pack-objects
+/git-pack-refs
+/git-parse-remote
+/git-patch-id
+/git-prune
+/git-prune-packed
+/git-pull
+/git-push
+/git-quiltimport
+/git-range-diff
+/git-read-tree
+/git-rebase
+/git-rebase--preserve-merges
+/git-receive-pack
+/git-reflog
+/git-remote
+/git-remote-http
+/git-remote-https
+/git-remote-ftp
+/git-remote-ftps
+/git-remote-fd
+/git-remote-ext
+/git-remote-testpy
+/git-remote-testsvn
+/git-repack
+/git-replace
+/git-request-pull
+/git-rerere
+/git-reset
+/git-restore
+/git-rev-list
+/git-rev-parse
+/git-revert
+/git-rm
+/git-send-email
+/git-send-pack
+/git-serve
+/git-sh-i18n
+/git-sh-i18n--envsubst
+/git-sh-setup
+/git-sh-i18n
+/git-shell
+/git-shortlog
+/git-show
+/git-show-branch
+/git-show-index
+/git-show-ref
+/git-stage
+/git-stash
+/git-status
+/git-stripspace
+/git-submodule
+/git-submodule--helper
+/git-svn
+/git-switch
+/git-symbolic-ref
+/git-tag
+/git-unpack-file
+/git-unpack-objects
+/git-update-index
+/git-update-ref
+/git-update-server-info
+/git-upload-archive
+/git-upload-pack
+/git-var
+/git-verify-commit
+/git-verify-pack
+/git-verify-tag
+/git-web--browse
+/git-whatchanged
+/git-worktree
+/git-write-tree
+/git-core-*/?*
+/gitweb/GITWEB-BUILD-OPTIONS
+/gitweb/gitweb.cgi
+/gitweb/static/gitweb.js
+/gitweb/static/gitweb.min.*
+/command-list.h
+*.tar.gz
+*.dsc
+*.deb
+/git.spec
+*.exe
+*.[aos]
+*.py[co]
+.depend/
+*.gcda
+*.gcno
+*.gcov
+/coverage-untested-functions
+/cover_db/
+/cover_db_html/
+*+
+/config.mak
+/autom4te.cache
+/config.cache
+/config.log
+/config.status
+/config.mak.autogen
+/config.mak.append
+/configure
+/.vscode/
+/tags
+/TAGS
+/cscope*
+*.obj
+*.lib
+*.res
+*.sln
+*.suo
+*.ncb
+*.vcproj
+*.user
+*.idb
+*.pdb
+*.ilk
+*.iobj
+*.ipdb
+*.dll
+.vs/
+*.manifest
+Debug/
+Release/
+/UpgradeLog*.htm
+/git.VC.VC.opendb
+/git.VC.db
+*.dSYM
diff --git a/.gitmodules b/third_party/git/.gitmodules
index cbeebdab7a..cbeebdab7a 100644
--- a/.gitmodules
+++ b/third_party/git/.gitmodules
diff --git a/.mailmap b/third_party/git/.mailmap
index 9a5ff04753..9a5ff04753 100644
--- a/.mailmap
+++ b/third_party/git/.mailmap
diff --git a/.travis.yml b/third_party/git/.travis.yml
index fc5730b085..fc5730b085 100644
--- a/.travis.yml
+++ b/third_party/git/.travis.yml
diff --git a/.tsan-suppressions b/third_party/git/.tsan-suppressions
index 8c85014a0a..8c85014a0a 100644
--- a/.tsan-suppressions
+++ b/third_party/git/.tsan-suppressions
diff --git a/COPYING b/third_party/git/COPYING
index 536e55524d..536e55524d 100644
--- a/COPYING
+++ b/third_party/git/COPYING
diff --git a/Documentation/.gitattributes b/third_party/git/Documentation/.gitattributes
index ddb030137d..ddb030137d 100644
--- a/Documentation/.gitattributes
+++ b/third_party/git/Documentation/.gitattributes
diff --git a/Documentation/.gitignore b/third_party/git/Documentation/.gitignore
index 9022d48355..9022d48355 100644
--- a/Documentation/.gitignore
+++ b/third_party/git/Documentation/.gitignore
diff --git a/Documentation/CodingGuidelines b/third_party/git/Documentation/CodingGuidelines
index f45db5b727..f45db5b727 100644
--- a/Documentation/CodingGuidelines
+++ b/third_party/git/Documentation/CodingGuidelines
diff --git a/Documentation/Makefile b/third_party/git/Documentation/Makefile
index 76f2ecfc1b..76f2ecfc1b 100644
--- a/Documentation/Makefile
+++ b/third_party/git/Documentation/Makefile
diff --git a/Documentation/MyFirstContribution.txt b/third_party/git/Documentation/MyFirstContribution.txt
index f8670379c0..f8670379c0 100644
--- a/Documentation/MyFirstContribution.txt
+++ b/third_party/git/Documentation/MyFirstContribution.txt
diff --git a/Documentation/RelNotes/1.5.0.1.txt b/third_party/git/Documentation/RelNotes/1.5.0.1.txt
index fea3f9935b..fea3f9935b 100644
--- a/Documentation/RelNotes/1.5.0.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.0.1.txt
diff --git a/Documentation/RelNotes/1.5.0.2.txt b/third_party/git/Documentation/RelNotes/1.5.0.2.txt
index b061e50ff0..b061e50ff0 100644
--- a/Documentation/RelNotes/1.5.0.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.0.2.txt
diff --git a/Documentation/RelNotes/1.5.0.3.txt b/third_party/git/Documentation/RelNotes/1.5.0.3.txt
index cd500f96bf..cd500f96bf 100644
--- a/Documentation/RelNotes/1.5.0.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.0.3.txt
diff --git a/Documentation/RelNotes/1.5.0.4.txt b/third_party/git/Documentation/RelNotes/1.5.0.4.txt
index feefa5dfd4..feefa5dfd4 100644
--- a/Documentation/RelNotes/1.5.0.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.0.4.txt
diff --git a/Documentation/RelNotes/1.5.0.5.txt b/third_party/git/Documentation/RelNotes/1.5.0.5.txt
index eeec3d73d0..eeec3d73d0 100644
--- a/Documentation/RelNotes/1.5.0.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.0.5.txt
diff --git a/Documentation/RelNotes/1.5.0.6.txt b/third_party/git/Documentation/RelNotes/1.5.0.6.txt
index c02015ad5f..c02015ad5f 100644
--- a/Documentation/RelNotes/1.5.0.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.0.6.txt
diff --git a/Documentation/RelNotes/1.5.0.7.txt b/third_party/git/Documentation/RelNotes/1.5.0.7.txt
index 670ad32b85..670ad32b85 100644
--- a/Documentation/RelNotes/1.5.0.7.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.0.7.txt
diff --git a/Documentation/RelNotes/1.5.0.txt b/third_party/git/Documentation/RelNotes/1.5.0.txt
index daf4bdb0d7..daf4bdb0d7 100644
--- a/Documentation/RelNotes/1.5.0.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.0.txt
diff --git a/Documentation/RelNotes/1.5.1.1.txt b/third_party/git/Documentation/RelNotes/1.5.1.1.txt
index 91471213bd..91471213bd 100644
--- a/Documentation/RelNotes/1.5.1.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.1.1.txt
diff --git a/Documentation/RelNotes/1.5.1.2.txt b/third_party/git/Documentation/RelNotes/1.5.1.2.txt
index d88456306c..d88456306c 100644
--- a/Documentation/RelNotes/1.5.1.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.1.2.txt
diff --git a/Documentation/RelNotes/1.5.1.3.txt b/third_party/git/Documentation/RelNotes/1.5.1.3.txt
index 876408b65a..876408b65a 100644
--- a/Documentation/RelNotes/1.5.1.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.1.3.txt
diff --git a/Documentation/RelNotes/1.5.1.4.txt b/third_party/git/Documentation/RelNotes/1.5.1.4.txt
index df2f66ccb5..df2f66ccb5 100644
--- a/Documentation/RelNotes/1.5.1.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.1.4.txt
diff --git a/Documentation/RelNotes/1.5.1.5.txt b/third_party/git/Documentation/RelNotes/1.5.1.5.txt
index b0ab8eb371..b0ab8eb371 100644
--- a/Documentation/RelNotes/1.5.1.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.1.5.txt
diff --git a/Documentation/RelNotes/1.5.1.6.txt b/third_party/git/Documentation/RelNotes/1.5.1.6.txt
index 55f3ac13e3..55f3ac13e3 100644
--- a/Documentation/RelNotes/1.5.1.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.1.6.txt
diff --git a/Documentation/RelNotes/1.5.1.txt b/third_party/git/Documentation/RelNotes/1.5.1.txt
index daed367270..daed367270 100644
--- a/Documentation/RelNotes/1.5.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.1.txt
diff --git a/Documentation/RelNotes/1.5.2.1.txt b/third_party/git/Documentation/RelNotes/1.5.2.1.txt
index d41984df0b..d41984df0b 100644
--- a/Documentation/RelNotes/1.5.2.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.2.1.txt
diff --git a/Documentation/RelNotes/1.5.2.2.txt b/third_party/git/Documentation/RelNotes/1.5.2.2.txt
index 7bfa341750..7bfa341750 100644
--- a/Documentation/RelNotes/1.5.2.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.2.2.txt
diff --git a/Documentation/RelNotes/1.5.2.3.txt b/third_party/git/Documentation/RelNotes/1.5.2.3.txt
index addb22955b..addb22955b 100644
--- a/Documentation/RelNotes/1.5.2.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.2.3.txt
diff --git a/Documentation/RelNotes/1.5.2.4.txt b/third_party/git/Documentation/RelNotes/1.5.2.4.txt
index 75cff475f6..75cff475f6 100644
--- a/Documentation/RelNotes/1.5.2.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.2.4.txt
diff --git a/Documentation/RelNotes/1.5.2.5.txt b/third_party/git/Documentation/RelNotes/1.5.2.5.txt
index e8281c72a0..e8281c72a0 100644
--- a/Documentation/RelNotes/1.5.2.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.2.5.txt
diff --git a/Documentation/RelNotes/1.5.2.txt b/third_party/git/Documentation/RelNotes/1.5.2.txt
index e8328d090a..e8328d090a 100644
--- a/Documentation/RelNotes/1.5.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.2.txt
diff --git a/Documentation/RelNotes/1.5.3.1.txt b/third_party/git/Documentation/RelNotes/1.5.3.1.txt
index 7ff546c743..7ff546c743 100644
--- a/Documentation/RelNotes/1.5.3.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.3.1.txt
diff --git a/Documentation/RelNotes/1.5.3.2.txt b/third_party/git/Documentation/RelNotes/1.5.3.2.txt
index 4bbde3cab4..4bbde3cab4 100644
--- a/Documentation/RelNotes/1.5.3.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.3.2.txt
diff --git a/Documentation/RelNotes/1.5.3.3.txt b/third_party/git/Documentation/RelNotes/1.5.3.3.txt
index d213846951..d213846951 100644
--- a/Documentation/RelNotes/1.5.3.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.3.3.txt
diff --git a/Documentation/RelNotes/1.5.3.4.txt b/third_party/git/Documentation/RelNotes/1.5.3.4.txt
index b04b3a45a5..b04b3a45a5 100644
--- a/Documentation/RelNotes/1.5.3.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.3.4.txt
diff --git a/Documentation/RelNotes/1.5.3.5.txt b/third_party/git/Documentation/RelNotes/1.5.3.5.txt
index 7ff1d5d0d1..7ff1d5d0d1 100644
--- a/Documentation/RelNotes/1.5.3.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.3.5.txt
diff --git a/Documentation/RelNotes/1.5.3.6.txt b/third_party/git/Documentation/RelNotes/1.5.3.6.txt
index 069a2b2cf9..069a2b2cf9 100644
--- a/Documentation/RelNotes/1.5.3.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.3.6.txt
diff --git a/Documentation/RelNotes/1.5.3.7.txt b/third_party/git/Documentation/RelNotes/1.5.3.7.txt
index 2f690616c8..2f690616c8 100644
--- a/Documentation/RelNotes/1.5.3.7.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.3.7.txt
diff --git a/Documentation/RelNotes/1.5.3.8.txt b/third_party/git/Documentation/RelNotes/1.5.3.8.txt
index 0e3ff58a46..0e3ff58a46 100644
--- a/Documentation/RelNotes/1.5.3.8.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.3.8.txt
diff --git a/Documentation/RelNotes/1.5.3.txt b/third_party/git/Documentation/RelNotes/1.5.3.txt
index 0668d3c0ca..0668d3c0ca 100644
--- a/Documentation/RelNotes/1.5.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.3.txt
diff --git a/Documentation/RelNotes/1.5.4.1.txt b/third_party/git/Documentation/RelNotes/1.5.4.1.txt
index d4e44b8b09..d4e44b8b09 100644
--- a/Documentation/RelNotes/1.5.4.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.4.1.txt
diff --git a/Documentation/RelNotes/1.5.4.2.txt b/third_party/git/Documentation/RelNotes/1.5.4.2.txt
index 21d0df59fb..21d0df59fb 100644
--- a/Documentation/RelNotes/1.5.4.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.4.2.txt
diff --git a/Documentation/RelNotes/1.5.4.3.txt b/third_party/git/Documentation/RelNotes/1.5.4.3.txt
index b0fc67fb2a..b0fc67fb2a 100644
--- a/Documentation/RelNotes/1.5.4.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.4.3.txt
diff --git a/Documentation/RelNotes/1.5.4.4.txt b/third_party/git/Documentation/RelNotes/1.5.4.4.txt
index 323c1a88c7..323c1a88c7 100644
--- a/Documentation/RelNotes/1.5.4.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.4.4.txt
diff --git a/Documentation/RelNotes/1.5.4.5.txt b/third_party/git/Documentation/RelNotes/1.5.4.5.txt
index bbd130e36d..bbd130e36d 100644
--- a/Documentation/RelNotes/1.5.4.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.4.5.txt
diff --git a/Documentation/RelNotes/1.5.4.6.txt b/third_party/git/Documentation/RelNotes/1.5.4.6.txt
index 3e3c3e55a3..3e3c3e55a3 100644
--- a/Documentation/RelNotes/1.5.4.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.4.6.txt
diff --git a/Documentation/RelNotes/1.5.4.7.txt b/third_party/git/Documentation/RelNotes/1.5.4.7.txt
index 9065a0e273..9065a0e273 100644
--- a/Documentation/RelNotes/1.5.4.7.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.4.7.txt
diff --git a/Documentation/RelNotes/1.5.4.txt b/third_party/git/Documentation/RelNotes/1.5.4.txt
index f1323b6174..f1323b6174 100644
--- a/Documentation/RelNotes/1.5.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.4.txt
diff --git a/Documentation/RelNotes/1.5.5.1.txt b/third_party/git/Documentation/RelNotes/1.5.5.1.txt
index 7de419708f..7de419708f 100644
--- a/Documentation/RelNotes/1.5.5.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.5.1.txt
diff --git a/Documentation/RelNotes/1.5.5.2.txt b/third_party/git/Documentation/RelNotes/1.5.5.2.txt
index 391a7b02ea..391a7b02ea 100644
--- a/Documentation/RelNotes/1.5.5.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.5.2.txt
diff --git a/Documentation/RelNotes/1.5.5.3.txt b/third_party/git/Documentation/RelNotes/1.5.5.3.txt
index f22f98b734..f22f98b734 100644
--- a/Documentation/RelNotes/1.5.5.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.5.3.txt
diff --git a/Documentation/RelNotes/1.5.5.4.txt b/third_party/git/Documentation/RelNotes/1.5.5.4.txt
index 2d0279ecce..2d0279ecce 100644
--- a/Documentation/RelNotes/1.5.5.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.5.4.txt
diff --git a/Documentation/RelNotes/1.5.5.5.txt b/third_party/git/Documentation/RelNotes/1.5.5.5.txt
index 30fa3615c7..30fa3615c7 100644
--- a/Documentation/RelNotes/1.5.5.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.5.5.txt
diff --git a/Documentation/RelNotes/1.5.5.6.txt b/third_party/git/Documentation/RelNotes/1.5.5.6.txt
index d5e85cb70e..d5e85cb70e 100644
--- a/Documentation/RelNotes/1.5.5.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.5.6.txt
diff --git a/Documentation/RelNotes/1.5.5.txt b/third_party/git/Documentation/RelNotes/1.5.5.txt
index 2932212488..2932212488 100644
--- a/Documentation/RelNotes/1.5.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.5.txt
diff --git a/Documentation/RelNotes/1.5.6.1.txt b/third_party/git/Documentation/RelNotes/1.5.6.1.txt
index 4864b16445..4864b16445 100644
--- a/Documentation/RelNotes/1.5.6.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.6.1.txt
diff --git a/Documentation/RelNotes/1.5.6.2.txt b/third_party/git/Documentation/RelNotes/1.5.6.2.txt
index 5902a85a78..5902a85a78 100644
--- a/Documentation/RelNotes/1.5.6.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.6.2.txt
diff --git a/Documentation/RelNotes/1.5.6.3.txt b/third_party/git/Documentation/RelNotes/1.5.6.3.txt
index f61dd3504a..f61dd3504a 100644
--- a/Documentation/RelNotes/1.5.6.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.6.3.txt
diff --git a/Documentation/RelNotes/1.5.6.4.txt b/third_party/git/Documentation/RelNotes/1.5.6.4.txt
index d8968f1ecb..d8968f1ecb 100644
--- a/Documentation/RelNotes/1.5.6.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.6.4.txt
diff --git a/Documentation/RelNotes/1.5.6.5.txt b/third_party/git/Documentation/RelNotes/1.5.6.5.txt
index 47ca172462..47ca172462 100644
--- a/Documentation/RelNotes/1.5.6.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.6.5.txt
diff --git a/Documentation/RelNotes/1.5.6.6.txt b/third_party/git/Documentation/RelNotes/1.5.6.6.txt
index 79da23db5a..79da23db5a 100644
--- a/Documentation/RelNotes/1.5.6.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.6.6.txt
diff --git a/Documentation/RelNotes/1.5.6.txt b/third_party/git/Documentation/RelNotes/1.5.6.txt
index e143d8d61b..e143d8d61b 100644
--- a/Documentation/RelNotes/1.5.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.5.6.txt
diff --git a/Documentation/RelNotes/1.6.0.1.txt b/third_party/git/Documentation/RelNotes/1.6.0.1.txt
index 49d7a1cafa..49d7a1cafa 100644
--- a/Documentation/RelNotes/1.6.0.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.0.1.txt
diff --git a/Documentation/RelNotes/1.6.0.2.txt b/third_party/git/Documentation/RelNotes/1.6.0.2.txt
index 7d8fb85e1b..7d8fb85e1b 100644
--- a/Documentation/RelNotes/1.6.0.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.0.2.txt
diff --git a/Documentation/RelNotes/1.6.0.3.txt b/third_party/git/Documentation/RelNotes/1.6.0.3.txt
index ae0577836a..ae0577836a 100644
--- a/Documentation/RelNotes/1.6.0.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.0.3.txt
diff --git a/Documentation/RelNotes/1.6.0.4.txt b/third_party/git/Documentation/RelNotes/1.6.0.4.txt
index d522661d31..d522661d31 100644
--- a/Documentation/RelNotes/1.6.0.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.0.4.txt
diff --git a/Documentation/RelNotes/1.6.0.5.txt b/third_party/git/Documentation/RelNotes/1.6.0.5.txt
index a08bb96738..a08bb96738 100644
--- a/Documentation/RelNotes/1.6.0.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.0.5.txt
diff --git a/Documentation/RelNotes/1.6.0.6.txt b/third_party/git/Documentation/RelNotes/1.6.0.6.txt
index 64ece1ffd5..64ece1ffd5 100644
--- a/Documentation/RelNotes/1.6.0.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.0.6.txt
diff --git a/Documentation/RelNotes/1.6.0.txt b/third_party/git/Documentation/RelNotes/1.6.0.txt
index de7ef166b6..de7ef166b6 100644
--- a/Documentation/RelNotes/1.6.0.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.0.txt
diff --git a/Documentation/RelNotes/1.6.1.1.txt b/third_party/git/Documentation/RelNotes/1.6.1.1.txt
index 8c594ba02f..8c594ba02f 100644
--- a/Documentation/RelNotes/1.6.1.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.1.1.txt
diff --git a/Documentation/RelNotes/1.6.1.2.txt b/third_party/git/Documentation/RelNotes/1.6.1.2.txt
index be37cbb858..be37cbb858 100644
--- a/Documentation/RelNotes/1.6.1.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.1.2.txt
diff --git a/Documentation/RelNotes/1.6.1.3.txt b/third_party/git/Documentation/RelNotes/1.6.1.3.txt
index cd08d8174e..cd08d8174e 100644
--- a/Documentation/RelNotes/1.6.1.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.1.3.txt
diff --git a/Documentation/RelNotes/1.6.1.4.txt b/third_party/git/Documentation/RelNotes/1.6.1.4.txt
index ccbad794c0..ccbad794c0 100644
--- a/Documentation/RelNotes/1.6.1.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.1.4.txt
diff --git a/Documentation/RelNotes/1.6.1.txt b/third_party/git/Documentation/RelNotes/1.6.1.txt
index 7b152a6fdc..7b152a6fdc 100644
--- a/Documentation/RelNotes/1.6.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.1.txt
diff --git a/Documentation/RelNotes/1.6.2.1.txt b/third_party/git/Documentation/RelNotes/1.6.2.1.txt
index dfa36416af..dfa36416af 100644
--- a/Documentation/RelNotes/1.6.2.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.2.1.txt
diff --git a/Documentation/RelNotes/1.6.2.2.txt b/third_party/git/Documentation/RelNotes/1.6.2.2.txt
index fafa9986b0..fafa9986b0 100644
--- a/Documentation/RelNotes/1.6.2.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.2.2.txt
diff --git a/Documentation/RelNotes/1.6.2.3.txt b/third_party/git/Documentation/RelNotes/1.6.2.3.txt
index 4d3c1ac91c..4d3c1ac91c 100644
--- a/Documentation/RelNotes/1.6.2.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.2.3.txt
diff --git a/Documentation/RelNotes/1.6.2.4.txt b/third_party/git/Documentation/RelNotes/1.6.2.4.txt
index f4bf1d0986..f4bf1d0986 100644
--- a/Documentation/RelNotes/1.6.2.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.2.4.txt
diff --git a/Documentation/RelNotes/1.6.2.5.txt b/third_party/git/Documentation/RelNotes/1.6.2.5.txt
index b23f9e95d1..b23f9e95d1 100644
--- a/Documentation/RelNotes/1.6.2.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.2.5.txt
diff --git a/Documentation/RelNotes/1.6.2.txt b/third_party/git/Documentation/RelNotes/1.6.2.txt
index ad060f4f89..ad060f4f89 100644
--- a/Documentation/RelNotes/1.6.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.2.txt
diff --git a/Documentation/RelNotes/1.6.3.1.txt b/third_party/git/Documentation/RelNotes/1.6.3.1.txt
index 2400b72ef7..2400b72ef7 100644
--- a/Documentation/RelNotes/1.6.3.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.3.1.txt
diff --git a/Documentation/RelNotes/1.6.3.2.txt b/third_party/git/Documentation/RelNotes/1.6.3.2.txt
index b2f3f0293c..b2f3f0293c 100644
--- a/Documentation/RelNotes/1.6.3.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.3.2.txt
diff --git a/Documentation/RelNotes/1.6.3.3.txt b/third_party/git/Documentation/RelNotes/1.6.3.3.txt
index 1c28398bb6..1c28398bb6 100644
--- a/Documentation/RelNotes/1.6.3.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.3.3.txt
diff --git a/Documentation/RelNotes/1.6.3.4.txt b/third_party/git/Documentation/RelNotes/1.6.3.4.txt
index cad461bc76..cad461bc76 100644
--- a/Documentation/RelNotes/1.6.3.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.3.4.txt
diff --git a/Documentation/RelNotes/1.6.3.txt b/third_party/git/Documentation/RelNotes/1.6.3.txt
index 418c685cf8..418c685cf8 100644
--- a/Documentation/RelNotes/1.6.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.3.txt
diff --git a/Documentation/RelNotes/1.6.4.1.txt b/third_party/git/Documentation/RelNotes/1.6.4.1.txt
index e439e45b96..e439e45b96 100644
--- a/Documentation/RelNotes/1.6.4.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.4.1.txt
diff --git a/Documentation/RelNotes/1.6.4.2.txt b/third_party/git/Documentation/RelNotes/1.6.4.2.txt
index c11ec0115c..c11ec0115c 100644
--- a/Documentation/RelNotes/1.6.4.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.4.2.txt
diff --git a/Documentation/RelNotes/1.6.4.3.txt b/third_party/git/Documentation/RelNotes/1.6.4.3.txt
index 5643e6537d..5643e6537d 100644
--- a/Documentation/RelNotes/1.6.4.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.4.3.txt
diff --git a/Documentation/RelNotes/1.6.4.4.txt b/third_party/git/Documentation/RelNotes/1.6.4.4.txt
index 0ead45fc72..0ead45fc72 100644
--- a/Documentation/RelNotes/1.6.4.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.4.4.txt
diff --git a/Documentation/RelNotes/1.6.4.5.txt b/third_party/git/Documentation/RelNotes/1.6.4.5.txt
index eb6307dcbb..eb6307dcbb 100644
--- a/Documentation/RelNotes/1.6.4.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.4.5.txt
diff --git a/Documentation/RelNotes/1.6.4.txt b/third_party/git/Documentation/RelNotes/1.6.4.txt
index 7a904419f7..7a904419f7 100644
--- a/Documentation/RelNotes/1.6.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.4.txt
diff --git a/Documentation/RelNotes/1.6.5.1.txt b/third_party/git/Documentation/RelNotes/1.6.5.1.txt
index 309ba181b2..309ba181b2 100644
--- a/Documentation/RelNotes/1.6.5.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.5.1.txt
diff --git a/Documentation/RelNotes/1.6.5.2.txt b/third_party/git/Documentation/RelNotes/1.6.5.2.txt
index aa7ccce3a2..aa7ccce3a2 100644
--- a/Documentation/RelNotes/1.6.5.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.5.2.txt
diff --git a/Documentation/RelNotes/1.6.5.3.txt b/third_party/git/Documentation/RelNotes/1.6.5.3.txt
index b2fad1b22e..b2fad1b22e 100644
--- a/Documentation/RelNotes/1.6.5.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.5.3.txt
diff --git a/Documentation/RelNotes/1.6.5.4.txt b/third_party/git/Documentation/RelNotes/1.6.5.4.txt
index d3a2a3e712..d3a2a3e712 100644
--- a/Documentation/RelNotes/1.6.5.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.5.4.txt
diff --git a/Documentation/RelNotes/1.6.5.5.txt b/third_party/git/Documentation/RelNotes/1.6.5.5.txt
index ecfc57d875..ecfc57d875 100644
--- a/Documentation/RelNotes/1.6.5.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.5.5.txt
diff --git a/Documentation/RelNotes/1.6.5.6.txt b/third_party/git/Documentation/RelNotes/1.6.5.6.txt
index a9eaf76f62..a9eaf76f62 100644
--- a/Documentation/RelNotes/1.6.5.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.5.6.txt
diff --git a/Documentation/RelNotes/1.6.5.7.txt b/third_party/git/Documentation/RelNotes/1.6.5.7.txt
index dc5302c21c..dc5302c21c 100644
--- a/Documentation/RelNotes/1.6.5.7.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.5.7.txt
diff --git a/Documentation/RelNotes/1.6.5.8.txt b/third_party/git/Documentation/RelNotes/1.6.5.8.txt
index 8b24bebb96..8b24bebb96 100644
--- a/Documentation/RelNotes/1.6.5.8.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.5.8.txt
diff --git a/Documentation/RelNotes/1.6.5.9.txt b/third_party/git/Documentation/RelNotes/1.6.5.9.txt
index bb469dd71e..bb469dd71e 100644
--- a/Documentation/RelNotes/1.6.5.9.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.5.9.txt
diff --git a/Documentation/RelNotes/1.6.5.txt b/third_party/git/Documentation/RelNotes/1.6.5.txt
index ee141c19ad..ee141c19ad 100644
--- a/Documentation/RelNotes/1.6.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.5.txt
diff --git a/Documentation/RelNotes/1.6.6.1.txt b/third_party/git/Documentation/RelNotes/1.6.6.1.txt
index f1d0a4ae2d..f1d0a4ae2d 100644
--- a/Documentation/RelNotes/1.6.6.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.6.1.txt
diff --git a/Documentation/RelNotes/1.6.6.2.txt b/third_party/git/Documentation/RelNotes/1.6.6.2.txt
index 4eaddc0106..4eaddc0106 100644
--- a/Documentation/RelNotes/1.6.6.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.6.2.txt
diff --git a/Documentation/RelNotes/1.6.6.3.txt b/third_party/git/Documentation/RelNotes/1.6.6.3.txt
index 11483acaec..11483acaec 100644
--- a/Documentation/RelNotes/1.6.6.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.6.3.txt
diff --git a/Documentation/RelNotes/1.6.6.txt b/third_party/git/Documentation/RelNotes/1.6.6.txt
index c50b59c495..c50b59c495 100644
--- a/Documentation/RelNotes/1.6.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.6.6.txt
diff --git a/Documentation/RelNotes/1.7.0.1.txt b/third_party/git/Documentation/RelNotes/1.7.0.1.txt
index 8ff5bcada8..8ff5bcada8 100644
--- a/Documentation/RelNotes/1.7.0.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.0.1.txt
diff --git a/Documentation/RelNotes/1.7.0.2.txt b/third_party/git/Documentation/RelNotes/1.7.0.2.txt
index fcb46ca6a4..fcb46ca6a4 100644
--- a/Documentation/RelNotes/1.7.0.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.0.2.txt
diff --git a/Documentation/RelNotes/1.7.0.3.txt b/third_party/git/Documentation/RelNotes/1.7.0.3.txt
index 3b355737c0..3b355737c0 100644
--- a/Documentation/RelNotes/1.7.0.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.0.3.txt
diff --git a/Documentation/RelNotes/1.7.0.4.txt b/third_party/git/Documentation/RelNotes/1.7.0.4.txt
index cf7f60e60d..cf7f60e60d 100644
--- a/Documentation/RelNotes/1.7.0.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.0.4.txt
diff --git a/Documentation/RelNotes/1.7.0.5.txt b/third_party/git/Documentation/RelNotes/1.7.0.5.txt
index 3149c91b7b..3149c91b7b 100644
--- a/Documentation/RelNotes/1.7.0.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.0.5.txt
diff --git a/Documentation/RelNotes/1.7.0.6.txt b/third_party/git/Documentation/RelNotes/1.7.0.6.txt
index b2852b67d0..b2852b67d0 100644
--- a/Documentation/RelNotes/1.7.0.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.0.6.txt
diff --git a/Documentation/RelNotes/1.7.0.7.txt b/third_party/git/Documentation/RelNotes/1.7.0.7.txt
index d0cb7ca7e2..d0cb7ca7e2 100644
--- a/Documentation/RelNotes/1.7.0.7.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.0.7.txt
diff --git a/Documentation/RelNotes/1.7.0.8.txt b/third_party/git/Documentation/RelNotes/1.7.0.8.txt
index 7f05b48e17..7f05b48e17 100644
--- a/Documentation/RelNotes/1.7.0.8.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.0.8.txt
diff --git a/Documentation/RelNotes/1.7.0.9.txt b/third_party/git/Documentation/RelNotes/1.7.0.9.txt
index bfb3166387..bfb3166387 100644
--- a/Documentation/RelNotes/1.7.0.9.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.0.9.txt
diff --git a/Documentation/RelNotes/1.7.0.txt b/third_party/git/Documentation/RelNotes/1.7.0.txt
index 0bb8c0b2a2..0bb8c0b2a2 100644
--- a/Documentation/RelNotes/1.7.0.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.0.txt
diff --git a/Documentation/RelNotes/1.7.1.1.txt b/third_party/git/Documentation/RelNotes/1.7.1.1.txt
index 3f6b3148a3..3f6b3148a3 100644
--- a/Documentation/RelNotes/1.7.1.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.1.1.txt
diff --git a/Documentation/RelNotes/1.7.1.2.txt b/third_party/git/Documentation/RelNotes/1.7.1.2.txt
index 61ba14e262..61ba14e262 100644
--- a/Documentation/RelNotes/1.7.1.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.1.2.txt
diff --git a/Documentation/RelNotes/1.7.1.3.txt b/third_party/git/Documentation/RelNotes/1.7.1.3.txt
index 5b18518449..5b18518449 100644
--- a/Documentation/RelNotes/1.7.1.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.1.3.txt
diff --git a/Documentation/RelNotes/1.7.1.4.txt b/third_party/git/Documentation/RelNotes/1.7.1.4.txt
index 7c734b4f7b..7c734b4f7b 100644
--- a/Documentation/RelNotes/1.7.1.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.1.4.txt
diff --git a/Documentation/RelNotes/1.7.1.txt b/third_party/git/Documentation/RelNotes/1.7.1.txt
index 9d89fedb36..9d89fedb36 100644
--- a/Documentation/RelNotes/1.7.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.1.txt
diff --git a/Documentation/RelNotes/1.7.10.1.txt b/third_party/git/Documentation/RelNotes/1.7.10.1.txt
index 71a86cb7c6..71a86cb7c6 100644
--- a/Documentation/RelNotes/1.7.10.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.10.1.txt
diff --git a/Documentation/RelNotes/1.7.10.2.txt b/third_party/git/Documentation/RelNotes/1.7.10.2.txt
index 7a7e9d6fd1..7a7e9d6fd1 100644
--- a/Documentation/RelNotes/1.7.10.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.10.2.txt
diff --git a/Documentation/RelNotes/1.7.10.3.txt b/third_party/git/Documentation/RelNotes/1.7.10.3.txt
index 703fbf1d60..703fbf1d60 100644
--- a/Documentation/RelNotes/1.7.10.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.10.3.txt
diff --git a/Documentation/RelNotes/1.7.10.4.txt b/third_party/git/Documentation/RelNotes/1.7.10.4.txt
index 326670df6e..326670df6e 100644
--- a/Documentation/RelNotes/1.7.10.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.10.4.txt
diff --git a/Documentation/RelNotes/1.7.10.5.txt b/third_party/git/Documentation/RelNotes/1.7.10.5.txt
index 4db1770e38..4db1770e38 100644
--- a/Documentation/RelNotes/1.7.10.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.10.5.txt
diff --git a/Documentation/RelNotes/1.7.10.txt b/third_party/git/Documentation/RelNotes/1.7.10.txt
index 58100bf04e..58100bf04e 100644
--- a/Documentation/RelNotes/1.7.10.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.10.txt
diff --git a/Documentation/RelNotes/1.7.11.1.txt b/third_party/git/Documentation/RelNotes/1.7.11.1.txt
index 577eccaacd..577eccaacd 100644
--- a/Documentation/RelNotes/1.7.11.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.11.1.txt
diff --git a/Documentation/RelNotes/1.7.11.2.txt b/third_party/git/Documentation/RelNotes/1.7.11.2.txt
index f0cfd02d6f..f0cfd02d6f 100644
--- a/Documentation/RelNotes/1.7.11.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.11.2.txt
diff --git a/Documentation/RelNotes/1.7.11.3.txt b/third_party/git/Documentation/RelNotes/1.7.11.3.txt
index 64494f89d9..64494f89d9 100644
--- a/Documentation/RelNotes/1.7.11.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.11.3.txt
diff --git a/Documentation/RelNotes/1.7.11.4.txt b/third_party/git/Documentation/RelNotes/1.7.11.4.txt
index 3a640c2d4d..3a640c2d4d 100644
--- a/Documentation/RelNotes/1.7.11.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.11.4.txt
diff --git a/Documentation/RelNotes/1.7.11.5.txt b/third_party/git/Documentation/RelNotes/1.7.11.5.txt
index 0a2ed855c5..0a2ed855c5 100644
--- a/Documentation/RelNotes/1.7.11.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.11.5.txt
diff --git a/Documentation/RelNotes/1.7.11.6.txt b/third_party/git/Documentation/RelNotes/1.7.11.6.txt
index ba7d3c3966..ba7d3c3966 100644
--- a/Documentation/RelNotes/1.7.11.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.11.6.txt
diff --git a/Documentation/RelNotes/1.7.11.7.txt b/third_party/git/Documentation/RelNotes/1.7.11.7.txt
index e743a2a8e4..e743a2a8e4 100644
--- a/Documentation/RelNotes/1.7.11.7.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.11.7.txt
diff --git a/Documentation/RelNotes/1.7.11.txt b/third_party/git/Documentation/RelNotes/1.7.11.txt
index 15b954ca4b..15b954ca4b 100644
--- a/Documentation/RelNotes/1.7.11.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.11.txt
diff --git a/Documentation/RelNotes/1.7.12.1.txt b/third_party/git/Documentation/RelNotes/1.7.12.1.txt
index b8f04af19f..b8f04af19f 100644
--- a/Documentation/RelNotes/1.7.12.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.12.1.txt
diff --git a/Documentation/RelNotes/1.7.12.2.txt b/third_party/git/Documentation/RelNotes/1.7.12.2.txt
index 69255745e6..69255745e6 100644
--- a/Documentation/RelNotes/1.7.12.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.12.2.txt
diff --git a/Documentation/RelNotes/1.7.12.3.txt b/third_party/git/Documentation/RelNotes/1.7.12.3.txt
index ecda427a35..ecda427a35 100644
--- a/Documentation/RelNotes/1.7.12.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.12.3.txt
diff --git a/Documentation/RelNotes/1.7.12.4.txt b/third_party/git/Documentation/RelNotes/1.7.12.4.txt
index c6da3cc939..c6da3cc939 100644
--- a/Documentation/RelNotes/1.7.12.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.12.4.txt
diff --git a/Documentation/RelNotes/1.7.12.txt b/third_party/git/Documentation/RelNotes/1.7.12.txt
index 010d8c7de4..010d8c7de4 100644
--- a/Documentation/RelNotes/1.7.12.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.12.txt
diff --git a/Documentation/RelNotes/1.7.2.1.txt b/third_party/git/Documentation/RelNotes/1.7.2.1.txt
index 1103c47a4f..1103c47a4f 100644
--- a/Documentation/RelNotes/1.7.2.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.2.1.txt
diff --git a/Documentation/RelNotes/1.7.2.2.txt b/third_party/git/Documentation/RelNotes/1.7.2.2.txt
index 71eb6a8b0a..71eb6a8b0a 100644
--- a/Documentation/RelNotes/1.7.2.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.2.2.txt
diff --git a/Documentation/RelNotes/1.7.2.3.txt b/third_party/git/Documentation/RelNotes/1.7.2.3.txt
index 610960cfe1..610960cfe1 100644
--- a/Documentation/RelNotes/1.7.2.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.2.3.txt
diff --git a/Documentation/RelNotes/1.7.2.4.txt b/third_party/git/Documentation/RelNotes/1.7.2.4.txt
index f7950a4c04..f7950a4c04 100644
--- a/Documentation/RelNotes/1.7.2.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.2.4.txt
diff --git a/Documentation/RelNotes/1.7.2.5.txt b/third_party/git/Documentation/RelNotes/1.7.2.5.txt
index bf976c40db..bf976c40db 100644
--- a/Documentation/RelNotes/1.7.2.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.2.5.txt
diff --git a/Documentation/RelNotes/1.7.2.txt b/third_party/git/Documentation/RelNotes/1.7.2.txt
index 15cf01178c..15cf01178c 100644
--- a/Documentation/RelNotes/1.7.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.2.txt
diff --git a/Documentation/RelNotes/1.7.3.1.txt b/third_party/git/Documentation/RelNotes/1.7.3.1.txt
index 002c93b961..002c93b961 100644
--- a/Documentation/RelNotes/1.7.3.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.3.1.txt
diff --git a/Documentation/RelNotes/1.7.3.2.txt b/third_party/git/Documentation/RelNotes/1.7.3.2.txt
index 5c93b85af4..5c93b85af4 100644
--- a/Documentation/RelNotes/1.7.3.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.3.2.txt
diff --git a/Documentation/RelNotes/1.7.3.3.txt b/third_party/git/Documentation/RelNotes/1.7.3.3.txt
index 9b2b2448df..9b2b2448df 100644
--- a/Documentation/RelNotes/1.7.3.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.3.3.txt
diff --git a/Documentation/RelNotes/1.7.3.4.txt b/third_party/git/Documentation/RelNotes/1.7.3.4.txt
index e57f7c176d..e57f7c176d 100644
--- a/Documentation/RelNotes/1.7.3.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.3.4.txt
diff --git a/Documentation/RelNotes/1.7.3.5.txt b/third_party/git/Documentation/RelNotes/1.7.3.5.txt
index 40f3ba5795..40f3ba5795 100644
--- a/Documentation/RelNotes/1.7.3.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.3.5.txt
diff --git a/Documentation/RelNotes/1.7.3.txt b/third_party/git/Documentation/RelNotes/1.7.3.txt
index 309c33181f..309c33181f 100644
--- a/Documentation/RelNotes/1.7.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.3.txt
diff --git a/Documentation/RelNotes/1.7.4.1.txt b/third_party/git/Documentation/RelNotes/1.7.4.1.txt
index 79923a6d2f..79923a6d2f 100644
--- a/Documentation/RelNotes/1.7.4.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.4.1.txt
diff --git a/Documentation/RelNotes/1.7.4.2.txt b/third_party/git/Documentation/RelNotes/1.7.4.2.txt
index ef4ce1fcd3..ef4ce1fcd3 100644
--- a/Documentation/RelNotes/1.7.4.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.4.2.txt
diff --git a/Documentation/RelNotes/1.7.4.3.txt b/third_party/git/Documentation/RelNotes/1.7.4.3.txt
index 02a3d5bdf6..02a3d5bdf6 100644
--- a/Documentation/RelNotes/1.7.4.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.4.3.txt
diff --git a/Documentation/RelNotes/1.7.4.4.txt b/third_party/git/Documentation/RelNotes/1.7.4.4.txt
index ff06e04a58..ff06e04a58 100644
--- a/Documentation/RelNotes/1.7.4.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.4.4.txt
diff --git a/Documentation/RelNotes/1.7.4.5.txt b/third_party/git/Documentation/RelNotes/1.7.4.5.txt
index b7a0eeb22f..b7a0eeb22f 100644
--- a/Documentation/RelNotes/1.7.4.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.4.5.txt
diff --git a/Documentation/RelNotes/1.7.4.txt b/third_party/git/Documentation/RelNotes/1.7.4.txt
index d5bca731b5..d5bca731b5 100644
--- a/Documentation/RelNotes/1.7.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.4.txt
diff --git a/Documentation/RelNotes/1.7.5.1.txt b/third_party/git/Documentation/RelNotes/1.7.5.1.txt
index c6ebd76d19..c6ebd76d19 100644
--- a/Documentation/RelNotes/1.7.5.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.5.1.txt
diff --git a/Documentation/RelNotes/1.7.5.2.txt b/third_party/git/Documentation/RelNotes/1.7.5.2.txt
index 951eb7cb08..951eb7cb08 100644
--- a/Documentation/RelNotes/1.7.5.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.5.2.txt
diff --git a/Documentation/RelNotes/1.7.5.3.txt b/third_party/git/Documentation/RelNotes/1.7.5.3.txt
index 9c03353af2..9c03353af2 100644
--- a/Documentation/RelNotes/1.7.5.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.5.3.txt
diff --git a/Documentation/RelNotes/1.7.5.4.txt b/third_party/git/Documentation/RelNotes/1.7.5.4.txt
index 7796df3fe4..7796df3fe4 100644
--- a/Documentation/RelNotes/1.7.5.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.5.4.txt
diff --git a/Documentation/RelNotes/1.7.5.txt b/third_party/git/Documentation/RelNotes/1.7.5.txt
index 987919c321..987919c321 100644
--- a/Documentation/RelNotes/1.7.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.5.txt
diff --git a/Documentation/RelNotes/1.7.6.1.txt b/third_party/git/Documentation/RelNotes/1.7.6.1.txt
index 42e46ab17f..42e46ab17f 100644
--- a/Documentation/RelNotes/1.7.6.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.6.1.txt
diff --git a/Documentation/RelNotes/1.7.6.2.txt b/third_party/git/Documentation/RelNotes/1.7.6.2.txt
index 67ae414965..67ae414965 100644
--- a/Documentation/RelNotes/1.7.6.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.6.2.txt
diff --git a/Documentation/RelNotes/1.7.6.3.txt b/third_party/git/Documentation/RelNotes/1.7.6.3.txt
index 95971831b9..95971831b9 100644
--- a/Documentation/RelNotes/1.7.6.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.6.3.txt
diff --git a/Documentation/RelNotes/1.7.6.4.txt b/third_party/git/Documentation/RelNotes/1.7.6.4.txt
index e19acac2da..e19acac2da 100644
--- a/Documentation/RelNotes/1.7.6.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.6.4.txt
diff --git a/Documentation/RelNotes/1.7.6.5.txt b/third_party/git/Documentation/RelNotes/1.7.6.5.txt
index 6713132a9e..6713132a9e 100644
--- a/Documentation/RelNotes/1.7.6.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.6.5.txt
diff --git a/Documentation/RelNotes/1.7.6.6.txt b/third_party/git/Documentation/RelNotes/1.7.6.6.txt
index 5343e00400..5343e00400 100644
--- a/Documentation/RelNotes/1.7.6.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.6.6.txt
diff --git a/Documentation/RelNotes/1.7.6.txt b/third_party/git/Documentation/RelNotes/1.7.6.txt
index 9ec498ea39..9ec498ea39 100644
--- a/Documentation/RelNotes/1.7.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.6.txt
diff --git a/Documentation/RelNotes/1.7.7.1.txt b/third_party/git/Documentation/RelNotes/1.7.7.1.txt
index ac9b838e25..ac9b838e25 100644
--- a/Documentation/RelNotes/1.7.7.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.7.1.txt
diff --git a/Documentation/RelNotes/1.7.7.2.txt b/third_party/git/Documentation/RelNotes/1.7.7.2.txt
index e6bbef2f01..e6bbef2f01 100644
--- a/Documentation/RelNotes/1.7.7.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.7.2.txt
diff --git a/Documentation/RelNotes/1.7.7.3.txt b/third_party/git/Documentation/RelNotes/1.7.7.3.txt
index 09301f0957..09301f0957 100644
--- a/Documentation/RelNotes/1.7.7.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.7.3.txt
diff --git a/Documentation/RelNotes/1.7.7.4.txt b/third_party/git/Documentation/RelNotes/1.7.7.4.txt
index e5234485e7..e5234485e7 100644
--- a/Documentation/RelNotes/1.7.7.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.7.4.txt
diff --git a/Documentation/RelNotes/1.7.7.5.txt b/third_party/git/Documentation/RelNotes/1.7.7.5.txt
index 7b0931987b..7b0931987b 100644
--- a/Documentation/RelNotes/1.7.7.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.7.5.txt
diff --git a/Documentation/RelNotes/1.7.7.6.txt b/third_party/git/Documentation/RelNotes/1.7.7.6.txt
index 8df606d452..8df606d452 100644
--- a/Documentation/RelNotes/1.7.7.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.7.6.txt
diff --git a/Documentation/RelNotes/1.7.7.7.txt b/third_party/git/Documentation/RelNotes/1.7.7.7.txt
index e79118d063..e79118d063 100644
--- a/Documentation/RelNotes/1.7.7.7.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.7.7.txt
diff --git a/Documentation/RelNotes/1.7.7.txt b/third_party/git/Documentation/RelNotes/1.7.7.txt
index 6eff128c80..6eff128c80 100644
--- a/Documentation/RelNotes/1.7.7.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.7.txt
diff --git a/Documentation/RelNotes/1.7.8.1.txt b/third_party/git/Documentation/RelNotes/1.7.8.1.txt
index 33dc948b94..33dc948b94 100644
--- a/Documentation/RelNotes/1.7.8.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.8.1.txt
diff --git a/Documentation/RelNotes/1.7.8.2.txt b/third_party/git/Documentation/RelNotes/1.7.8.2.txt
index b9c66aa1b7..b9c66aa1b7 100644
--- a/Documentation/RelNotes/1.7.8.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.8.2.txt
diff --git a/Documentation/RelNotes/1.7.8.3.txt b/third_party/git/Documentation/RelNotes/1.7.8.3.txt
index a92714c14b..a92714c14b 100644
--- a/Documentation/RelNotes/1.7.8.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.8.3.txt
diff --git a/Documentation/RelNotes/1.7.8.4.txt b/third_party/git/Documentation/RelNotes/1.7.8.4.txt
index 9bebdbf13d..9bebdbf13d 100644
--- a/Documentation/RelNotes/1.7.8.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.8.4.txt
diff --git a/Documentation/RelNotes/1.7.8.5.txt b/third_party/git/Documentation/RelNotes/1.7.8.5.txt
index 011fd2a428..011fd2a428 100644
--- a/Documentation/RelNotes/1.7.8.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.8.5.txt
diff --git a/Documentation/RelNotes/1.7.8.6.txt b/third_party/git/Documentation/RelNotes/1.7.8.6.txt
index d9bf2b741a..d9bf2b741a 100644
--- a/Documentation/RelNotes/1.7.8.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.8.6.txt
diff --git a/Documentation/RelNotes/1.7.8.txt b/third_party/git/Documentation/RelNotes/1.7.8.txt
index 249311361e..249311361e 100644
--- a/Documentation/RelNotes/1.7.8.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.8.txt
diff --git a/Documentation/RelNotes/1.7.9.1.txt b/third_party/git/Documentation/RelNotes/1.7.9.1.txt
index 6957183dbb..6957183dbb 100644
--- a/Documentation/RelNotes/1.7.9.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.9.1.txt
diff --git a/Documentation/RelNotes/1.7.9.2.txt b/third_party/git/Documentation/RelNotes/1.7.9.2.txt
index e500da75dd..e500da75dd 100644
--- a/Documentation/RelNotes/1.7.9.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.9.2.txt
diff --git a/Documentation/RelNotes/1.7.9.3.txt b/third_party/git/Documentation/RelNotes/1.7.9.3.txt
index 91c65012f9..91c65012f9 100644
--- a/Documentation/RelNotes/1.7.9.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.9.3.txt
diff --git a/Documentation/RelNotes/1.7.9.4.txt b/third_party/git/Documentation/RelNotes/1.7.9.4.txt
index e5217a1889..e5217a1889 100644
--- a/Documentation/RelNotes/1.7.9.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.9.4.txt
diff --git a/Documentation/RelNotes/1.7.9.5.txt b/third_party/git/Documentation/RelNotes/1.7.9.5.txt
index 95cc2bbf2c..95cc2bbf2c 100644
--- a/Documentation/RelNotes/1.7.9.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.9.5.txt
diff --git a/Documentation/RelNotes/1.7.9.6.txt b/third_party/git/Documentation/RelNotes/1.7.9.6.txt
index 74bf8825e2..74bf8825e2 100644
--- a/Documentation/RelNotes/1.7.9.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.9.6.txt
diff --git a/Documentation/RelNotes/1.7.9.7.txt b/third_party/git/Documentation/RelNotes/1.7.9.7.txt
index 59667d0f2a..59667d0f2a 100644
--- a/Documentation/RelNotes/1.7.9.7.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.9.7.txt
diff --git a/Documentation/RelNotes/1.7.9.txt b/third_party/git/Documentation/RelNotes/1.7.9.txt
index 95320aad5d..95320aad5d 100644
--- a/Documentation/RelNotes/1.7.9.txt
+++ b/third_party/git/Documentation/RelNotes/1.7.9.txt
diff --git a/Documentation/RelNotes/1.8.0.1.txt b/third_party/git/Documentation/RelNotes/1.8.0.1.txt
index 1f372fa0b5..1f372fa0b5 100644
--- a/Documentation/RelNotes/1.8.0.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.0.1.txt
diff --git a/Documentation/RelNotes/1.8.0.2.txt b/third_party/git/Documentation/RelNotes/1.8.0.2.txt
index 8497e051de..8497e051de 100644
--- a/Documentation/RelNotes/1.8.0.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.0.2.txt
diff --git a/Documentation/RelNotes/1.8.0.3.txt b/third_party/git/Documentation/RelNotes/1.8.0.3.txt
index 92b1e4b363..92b1e4b363 100644
--- a/Documentation/RelNotes/1.8.0.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.0.3.txt
diff --git a/Documentation/RelNotes/1.8.0.txt b/third_party/git/Documentation/RelNotes/1.8.0.txt
index 43883c14f0..43883c14f0 100644
--- a/Documentation/RelNotes/1.8.0.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.0.txt
diff --git a/Documentation/RelNotes/1.8.1.1.txt b/third_party/git/Documentation/RelNotes/1.8.1.1.txt
index 6cde07ba29..6cde07ba29 100644
--- a/Documentation/RelNotes/1.8.1.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.1.1.txt
diff --git a/Documentation/RelNotes/1.8.1.2.txt b/third_party/git/Documentation/RelNotes/1.8.1.2.txt
index 5ab7b18906..5ab7b18906 100644
--- a/Documentation/RelNotes/1.8.1.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.1.2.txt
diff --git a/Documentation/RelNotes/1.8.1.3.txt b/third_party/git/Documentation/RelNotes/1.8.1.3.txt
index 681cb35c0a..681cb35c0a 100644
--- a/Documentation/RelNotes/1.8.1.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.1.3.txt
diff --git a/Documentation/RelNotes/1.8.1.4.txt b/third_party/git/Documentation/RelNotes/1.8.1.4.txt
index 22af1d1643..22af1d1643 100644
--- a/Documentation/RelNotes/1.8.1.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.1.4.txt
diff --git a/Documentation/RelNotes/1.8.1.5.txt b/third_party/git/Documentation/RelNotes/1.8.1.5.txt
index efa68aef22..efa68aef22 100644
--- a/Documentation/RelNotes/1.8.1.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.1.5.txt
diff --git a/Documentation/RelNotes/1.8.1.6.txt b/third_party/git/Documentation/RelNotes/1.8.1.6.txt
index c15cf2e805..c15cf2e805 100644
--- a/Documentation/RelNotes/1.8.1.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.1.6.txt
diff --git a/Documentation/RelNotes/1.8.1.txt b/third_party/git/Documentation/RelNotes/1.8.1.txt
index d6f9555923..d6f9555923 100644
--- a/Documentation/RelNotes/1.8.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.1.txt
diff --git a/Documentation/RelNotes/1.8.2.1.txt b/third_party/git/Documentation/RelNotes/1.8.2.1.txt
index 769a6fc06c..769a6fc06c 100644
--- a/Documentation/RelNotes/1.8.2.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.2.1.txt
diff --git a/Documentation/RelNotes/1.8.2.2.txt b/third_party/git/Documentation/RelNotes/1.8.2.2.txt
index 708df1ae19..708df1ae19 100644
--- a/Documentation/RelNotes/1.8.2.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.2.2.txt
diff --git a/Documentation/RelNotes/1.8.2.3.txt b/third_party/git/Documentation/RelNotes/1.8.2.3.txt
index 613948251a..613948251a 100644
--- a/Documentation/RelNotes/1.8.2.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.2.3.txt
diff --git a/Documentation/RelNotes/1.8.2.txt b/third_party/git/Documentation/RelNotes/1.8.2.txt
index fc606ae116..fc606ae116 100644
--- a/Documentation/RelNotes/1.8.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.2.txt
diff --git a/Documentation/RelNotes/1.8.3.1.txt b/third_party/git/Documentation/RelNotes/1.8.3.1.txt
index 986637b755..986637b755 100644
--- a/Documentation/RelNotes/1.8.3.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.3.1.txt
diff --git a/Documentation/RelNotes/1.8.3.2.txt b/third_party/git/Documentation/RelNotes/1.8.3.2.txt
index 26ae142c3d..26ae142c3d 100644
--- a/Documentation/RelNotes/1.8.3.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.3.2.txt
diff --git a/Documentation/RelNotes/1.8.3.3.txt b/third_party/git/Documentation/RelNotes/1.8.3.3.txt
index 9ba4f4da0f..9ba4f4da0f 100644
--- a/Documentation/RelNotes/1.8.3.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.3.3.txt
diff --git a/Documentation/RelNotes/1.8.3.4.txt b/third_party/git/Documentation/RelNotes/1.8.3.4.txt
index 56f106e262..56f106e262 100644
--- a/Documentation/RelNotes/1.8.3.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.3.4.txt
diff --git a/Documentation/RelNotes/1.8.3.txt b/third_party/git/Documentation/RelNotes/1.8.3.txt
index ead568e7f1..ead568e7f1 100644
--- a/Documentation/RelNotes/1.8.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.3.txt
diff --git a/Documentation/RelNotes/1.8.4.1.txt b/third_party/git/Documentation/RelNotes/1.8.4.1.txt
index 96090ef599..96090ef599 100644
--- a/Documentation/RelNotes/1.8.4.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.4.1.txt
diff --git a/Documentation/RelNotes/1.8.4.2.txt b/third_party/git/Documentation/RelNotes/1.8.4.2.txt
index bf6fb1a023..bf6fb1a023 100644
--- a/Documentation/RelNotes/1.8.4.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.4.2.txt
diff --git a/Documentation/RelNotes/1.8.4.3.txt b/third_party/git/Documentation/RelNotes/1.8.4.3.txt
index 267a1b34b4..267a1b34b4 100644
--- a/Documentation/RelNotes/1.8.4.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.4.3.txt
diff --git a/Documentation/RelNotes/1.8.4.4.txt b/third_party/git/Documentation/RelNotes/1.8.4.4.txt
index a7c1ce15c0..a7c1ce15c0 100644
--- a/Documentation/RelNotes/1.8.4.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.4.4.txt
diff --git a/Documentation/RelNotes/1.8.4.5.txt b/third_party/git/Documentation/RelNotes/1.8.4.5.txt
index 215bd1a7a2..215bd1a7a2 100644
--- a/Documentation/RelNotes/1.8.4.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.4.5.txt
diff --git a/Documentation/RelNotes/1.8.4.txt b/third_party/git/Documentation/RelNotes/1.8.4.txt
index 02f681b710..02f681b710 100644
--- a/Documentation/RelNotes/1.8.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.4.txt
diff --git a/Documentation/RelNotes/1.8.5.1.txt b/third_party/git/Documentation/RelNotes/1.8.5.1.txt
index 7236aaf232..7236aaf232 100644
--- a/Documentation/RelNotes/1.8.5.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.5.1.txt
diff --git a/Documentation/RelNotes/1.8.5.2.txt b/third_party/git/Documentation/RelNotes/1.8.5.2.txt
index 3ac4984f10..3ac4984f10 100644
--- a/Documentation/RelNotes/1.8.5.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.5.2.txt
diff --git a/Documentation/RelNotes/1.8.5.3.txt b/third_party/git/Documentation/RelNotes/1.8.5.3.txt
index 3de2dd0f19..3de2dd0f19 100644
--- a/Documentation/RelNotes/1.8.5.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.5.3.txt
diff --git a/Documentation/RelNotes/1.8.5.4.txt b/third_party/git/Documentation/RelNotes/1.8.5.4.txt
index d18c40389e..d18c40389e 100644
--- a/Documentation/RelNotes/1.8.5.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.5.4.txt
diff --git a/Documentation/RelNotes/1.8.5.5.txt b/third_party/git/Documentation/RelNotes/1.8.5.5.txt
index 9191ce948f..9191ce948f 100644
--- a/Documentation/RelNotes/1.8.5.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.5.5.txt
diff --git a/Documentation/RelNotes/1.8.5.6.txt b/third_party/git/Documentation/RelNotes/1.8.5.6.txt
index 92ff92b1e6..92ff92b1e6 100644
--- a/Documentation/RelNotes/1.8.5.6.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.5.6.txt
diff --git a/Documentation/RelNotes/1.8.5.txt b/third_party/git/Documentation/RelNotes/1.8.5.txt
index 602df0cac2..602df0cac2 100644
--- a/Documentation/RelNotes/1.8.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.8.5.txt
diff --git a/Documentation/RelNotes/1.9.0.txt b/third_party/git/Documentation/RelNotes/1.9.0.txt
index 4e4b88aa5c..4e4b88aa5c 100644
--- a/Documentation/RelNotes/1.9.0.txt
+++ b/third_party/git/Documentation/RelNotes/1.9.0.txt
diff --git a/Documentation/RelNotes/1.9.1.txt b/third_party/git/Documentation/RelNotes/1.9.1.txt
index 5b0602053c..5b0602053c 100644
--- a/Documentation/RelNotes/1.9.1.txt
+++ b/third_party/git/Documentation/RelNotes/1.9.1.txt
diff --git a/Documentation/RelNotes/1.9.2.txt b/third_party/git/Documentation/RelNotes/1.9.2.txt
index 47a34ca964..47a34ca964 100644
--- a/Documentation/RelNotes/1.9.2.txt
+++ b/third_party/git/Documentation/RelNotes/1.9.2.txt
diff --git a/Documentation/RelNotes/1.9.3.txt b/third_party/git/Documentation/RelNotes/1.9.3.txt
index 17b05ca7b5..17b05ca7b5 100644
--- a/Documentation/RelNotes/1.9.3.txt
+++ b/third_party/git/Documentation/RelNotes/1.9.3.txt
diff --git a/Documentation/RelNotes/1.9.4.txt b/third_party/git/Documentation/RelNotes/1.9.4.txt
index e1d1835436..e1d1835436 100644
--- a/Documentation/RelNotes/1.9.4.txt
+++ b/third_party/git/Documentation/RelNotes/1.9.4.txt
diff --git a/Documentation/RelNotes/1.9.5.txt b/third_party/git/Documentation/RelNotes/1.9.5.txt
index 8d6ac0cf53..8d6ac0cf53 100644
--- a/Documentation/RelNotes/1.9.5.txt
+++ b/third_party/git/Documentation/RelNotes/1.9.5.txt
diff --git a/Documentation/RelNotes/2.0.0.txt b/third_party/git/Documentation/RelNotes/2.0.0.txt
index 2617372a0c..2617372a0c 100644
--- a/Documentation/RelNotes/2.0.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.0.0.txt
diff --git a/Documentation/RelNotes/2.0.1.txt b/third_party/git/Documentation/RelNotes/2.0.1.txt
index ce5579db3e..ce5579db3e 100644
--- a/Documentation/RelNotes/2.0.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.0.1.txt
diff --git a/Documentation/RelNotes/2.0.2.txt b/third_party/git/Documentation/RelNotes/2.0.2.txt
index 8e8321b2ef..8e8321b2ef 100644
--- a/Documentation/RelNotes/2.0.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.0.2.txt
diff --git a/Documentation/RelNotes/2.0.3.txt b/third_party/git/Documentation/RelNotes/2.0.3.txt
index 4047b46bbe..4047b46bbe 100644
--- a/Documentation/RelNotes/2.0.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.0.3.txt
diff --git a/Documentation/RelNotes/2.0.4.txt b/third_party/git/Documentation/RelNotes/2.0.4.txt
index 7e340921a2..7e340921a2 100644
--- a/Documentation/RelNotes/2.0.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.0.4.txt
diff --git a/Documentation/RelNotes/2.0.5.txt b/third_party/git/Documentation/RelNotes/2.0.5.txt
index 3a16f697e8..3a16f697e8 100644
--- a/Documentation/RelNotes/2.0.5.txt
+++ b/third_party/git/Documentation/RelNotes/2.0.5.txt
diff --git a/Documentation/RelNotes/2.1.0.txt b/third_party/git/Documentation/RelNotes/2.1.0.txt
index ae4753728e..ae4753728e 100644
--- a/Documentation/RelNotes/2.1.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.1.0.txt
diff --git a/Documentation/RelNotes/2.1.1.txt b/third_party/git/Documentation/RelNotes/2.1.1.txt
index 830fc3cc6d..830fc3cc6d 100644
--- a/Documentation/RelNotes/2.1.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.1.1.txt
diff --git a/Documentation/RelNotes/2.1.2.txt b/third_party/git/Documentation/RelNotes/2.1.2.txt
index abc3b8928a..abc3b8928a 100644
--- a/Documentation/RelNotes/2.1.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.1.2.txt
diff --git a/Documentation/RelNotes/2.1.3.txt b/third_party/git/Documentation/RelNotes/2.1.3.txt
index acc9ebb886..acc9ebb886 100644
--- a/Documentation/RelNotes/2.1.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.1.3.txt
diff --git a/Documentation/RelNotes/2.1.4.txt b/third_party/git/Documentation/RelNotes/2.1.4.txt
index d16e5f041f..d16e5f041f 100644
--- a/Documentation/RelNotes/2.1.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.1.4.txt
diff --git a/Documentation/RelNotes/2.10.0.txt b/third_party/git/Documentation/RelNotes/2.10.0.txt
index f4da28ab66..f4da28ab66 100644
--- a/Documentation/RelNotes/2.10.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.10.0.txt
diff --git a/Documentation/RelNotes/2.10.1.txt b/third_party/git/Documentation/RelNotes/2.10.1.txt
index 70462f7f7e..70462f7f7e 100644
--- a/Documentation/RelNotes/2.10.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.10.1.txt
diff --git a/Documentation/RelNotes/2.10.2.txt b/third_party/git/Documentation/RelNotes/2.10.2.txt
index c4d4397023..c4d4397023 100644
--- a/Documentation/RelNotes/2.10.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.10.2.txt
diff --git a/Documentation/RelNotes/2.10.3.txt b/third_party/git/Documentation/RelNotes/2.10.3.txt
index ad6a01bf83..ad6a01bf83 100644
--- a/Documentation/RelNotes/2.10.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.10.3.txt
diff --git a/Documentation/RelNotes/2.10.4.txt b/third_party/git/Documentation/RelNotes/2.10.4.txt
index ee8142ad24..ee8142ad24 100644
--- a/Documentation/RelNotes/2.10.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.10.4.txt
diff --git a/Documentation/RelNotes/2.10.5.txt b/third_party/git/Documentation/RelNotes/2.10.5.txt
index a498fd6fdc..a498fd6fdc 100644
--- a/Documentation/RelNotes/2.10.5.txt
+++ b/third_party/git/Documentation/RelNotes/2.10.5.txt
diff --git a/Documentation/RelNotes/2.11.0.txt b/third_party/git/Documentation/RelNotes/2.11.0.txt
index b7b7dd361e..b7b7dd361e 100644
--- a/Documentation/RelNotes/2.11.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.11.0.txt
diff --git a/Documentation/RelNotes/2.11.1.txt b/third_party/git/Documentation/RelNotes/2.11.1.txt
index 9cd14c8197..9cd14c8197 100644
--- a/Documentation/RelNotes/2.11.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.11.1.txt
diff --git a/Documentation/RelNotes/2.11.2.txt b/third_party/git/Documentation/RelNotes/2.11.2.txt
index 7428851168..7428851168 100644
--- a/Documentation/RelNotes/2.11.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.11.2.txt
diff --git a/Documentation/RelNotes/2.11.3.txt b/third_party/git/Documentation/RelNotes/2.11.3.txt
index 4e3b78d0e8..4e3b78d0e8 100644
--- a/Documentation/RelNotes/2.11.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.11.3.txt
diff --git a/Documentation/RelNotes/2.11.4.txt b/third_party/git/Documentation/RelNotes/2.11.4.txt
index ad4da8eb09..ad4da8eb09 100644
--- a/Documentation/RelNotes/2.11.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.11.4.txt
diff --git a/Documentation/RelNotes/2.12.0.txt b/third_party/git/Documentation/RelNotes/2.12.0.txt
index ef8b97da9b..ef8b97da9b 100644
--- a/Documentation/RelNotes/2.12.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.12.0.txt
diff --git a/Documentation/RelNotes/2.12.1.txt b/third_party/git/Documentation/RelNotes/2.12.1.txt
index a74f7db747..a74f7db747 100644
--- a/Documentation/RelNotes/2.12.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.12.1.txt
diff --git a/Documentation/RelNotes/2.12.2.txt b/third_party/git/Documentation/RelNotes/2.12.2.txt
index 441939709c..441939709c 100644
--- a/Documentation/RelNotes/2.12.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.12.2.txt
diff --git a/Documentation/RelNotes/2.12.3.txt b/third_party/git/Documentation/RelNotes/2.12.3.txt
index ebca846d5d..ebca846d5d 100644
--- a/Documentation/RelNotes/2.12.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.12.3.txt
diff --git a/Documentation/RelNotes/2.12.4.txt b/third_party/git/Documentation/RelNotes/2.12.4.txt
index 3f56938221..3f56938221 100644
--- a/Documentation/RelNotes/2.12.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.12.4.txt
diff --git a/Documentation/RelNotes/2.12.5.txt b/third_party/git/Documentation/RelNotes/2.12.5.txt
index 8fa73cfce7..8fa73cfce7 100644
--- a/Documentation/RelNotes/2.12.5.txt
+++ b/third_party/git/Documentation/RelNotes/2.12.5.txt
diff --git a/Documentation/RelNotes/2.13.0.txt b/third_party/git/Documentation/RelNotes/2.13.0.txt
index aa99d4b3ce..aa99d4b3ce 100644
--- a/Documentation/RelNotes/2.13.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.13.0.txt
diff --git a/Documentation/RelNotes/2.13.1.txt b/third_party/git/Documentation/RelNotes/2.13.1.txt
index ed7cd976d9..ed7cd976d9 100644
--- a/Documentation/RelNotes/2.13.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.13.1.txt
diff --git a/Documentation/RelNotes/2.13.2.txt b/third_party/git/Documentation/RelNotes/2.13.2.txt
index 8c2b20071e..8c2b20071e 100644
--- a/Documentation/RelNotes/2.13.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.13.2.txt
diff --git a/Documentation/RelNotes/2.13.3.txt b/third_party/git/Documentation/RelNotes/2.13.3.txt
index 5d76ad5310..5d76ad5310 100644
--- a/Documentation/RelNotes/2.13.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.13.3.txt
diff --git a/Documentation/RelNotes/2.13.4.txt b/third_party/git/Documentation/RelNotes/2.13.4.txt
index 9a9f8f9599..9a9f8f9599 100644
--- a/Documentation/RelNotes/2.13.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.13.4.txt
diff --git a/Documentation/RelNotes/2.13.5.txt b/third_party/git/Documentation/RelNotes/2.13.5.txt
index 6949fcda78..6949fcda78 100644
--- a/Documentation/RelNotes/2.13.5.txt
+++ b/third_party/git/Documentation/RelNotes/2.13.5.txt
diff --git a/Documentation/RelNotes/2.13.6.txt b/third_party/git/Documentation/RelNotes/2.13.6.txt
index afcae9c808..afcae9c808 100644
--- a/Documentation/RelNotes/2.13.6.txt
+++ b/third_party/git/Documentation/RelNotes/2.13.6.txt
diff --git a/Documentation/RelNotes/2.13.7.txt b/third_party/git/Documentation/RelNotes/2.13.7.txt
index 09fc01406c..09fc01406c 100644
--- a/Documentation/RelNotes/2.13.7.txt
+++ b/third_party/git/Documentation/RelNotes/2.13.7.txt
diff --git a/Documentation/RelNotes/2.14.0.txt b/third_party/git/Documentation/RelNotes/2.14.0.txt
index 4246c68ff5..4246c68ff5 100644
--- a/Documentation/RelNotes/2.14.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.14.0.txt
diff --git a/Documentation/RelNotes/2.14.1.txt b/third_party/git/Documentation/RelNotes/2.14.1.txt
index 9403340f7f..9403340f7f 100644
--- a/Documentation/RelNotes/2.14.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.14.1.txt
diff --git a/Documentation/RelNotes/2.14.2.txt b/third_party/git/Documentation/RelNotes/2.14.2.txt
index bec9186ade..bec9186ade 100644
--- a/Documentation/RelNotes/2.14.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.14.2.txt
diff --git a/Documentation/RelNotes/2.14.3.txt b/third_party/git/Documentation/RelNotes/2.14.3.txt
index 977c9e857c..977c9e857c 100644
--- a/Documentation/RelNotes/2.14.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.14.3.txt
diff --git a/Documentation/RelNotes/2.14.4.txt b/third_party/git/Documentation/RelNotes/2.14.4.txt
index 97755a89d9..97755a89d9 100644
--- a/Documentation/RelNotes/2.14.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.14.4.txt
diff --git a/Documentation/RelNotes/2.14.5.txt b/third_party/git/Documentation/RelNotes/2.14.5.txt
index 130645fb29..130645fb29 100644
--- a/Documentation/RelNotes/2.14.5.txt
+++ b/third_party/git/Documentation/RelNotes/2.14.5.txt
diff --git a/Documentation/RelNotes/2.15.0.txt b/third_party/git/Documentation/RelNotes/2.15.0.txt
index cdd761bcc2..cdd761bcc2 100644
--- a/Documentation/RelNotes/2.15.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.15.0.txt
diff --git a/Documentation/RelNotes/2.15.1.txt b/third_party/git/Documentation/RelNotes/2.15.1.txt
index ec06704e63..ec06704e63 100644
--- a/Documentation/RelNotes/2.15.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.15.1.txt
diff --git a/Documentation/RelNotes/2.15.2.txt b/third_party/git/Documentation/RelNotes/2.15.2.txt
index b480e56b68..b480e56b68 100644
--- a/Documentation/RelNotes/2.15.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.15.2.txt
diff --git a/Documentation/RelNotes/2.15.3.txt b/third_party/git/Documentation/RelNotes/2.15.3.txt
index fd2e6f8df7..fd2e6f8df7 100644
--- a/Documentation/RelNotes/2.15.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.15.3.txt
diff --git a/Documentation/RelNotes/2.16.0.txt b/third_party/git/Documentation/RelNotes/2.16.0.txt
index 0c81c5915f..0c81c5915f 100644
--- a/Documentation/RelNotes/2.16.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.16.0.txt
diff --git a/Documentation/RelNotes/2.16.1.txt b/third_party/git/Documentation/RelNotes/2.16.1.txt
index 66e64361fd..66e64361fd 100644
--- a/Documentation/RelNotes/2.16.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.16.1.txt
diff --git a/Documentation/RelNotes/2.16.2.txt b/third_party/git/Documentation/RelNotes/2.16.2.txt
index a216466d3d..a216466d3d 100644
--- a/Documentation/RelNotes/2.16.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.16.2.txt
diff --git a/Documentation/RelNotes/2.16.3.txt b/third_party/git/Documentation/RelNotes/2.16.3.txt
index 64a0bcb0d2..64a0bcb0d2 100644
--- a/Documentation/RelNotes/2.16.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.16.3.txt
diff --git a/Documentation/RelNotes/2.16.4.txt b/third_party/git/Documentation/RelNotes/2.16.4.txt
index 6be538ba30..6be538ba30 100644
--- a/Documentation/RelNotes/2.16.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.16.4.txt
diff --git a/Documentation/RelNotes/2.16.5.txt b/third_party/git/Documentation/RelNotes/2.16.5.txt
index cb8ee02a9a..cb8ee02a9a 100644
--- a/Documentation/RelNotes/2.16.5.txt
+++ b/third_party/git/Documentation/RelNotes/2.16.5.txt
diff --git a/Documentation/RelNotes/2.17.0.txt b/third_party/git/Documentation/RelNotes/2.17.0.txt
index c2cf891f71..c2cf891f71 100644
--- a/Documentation/RelNotes/2.17.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.17.0.txt
diff --git a/Documentation/RelNotes/2.17.1.txt b/third_party/git/Documentation/RelNotes/2.17.1.txt
index e01384fe8e..e01384fe8e 100644
--- a/Documentation/RelNotes/2.17.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.17.1.txt
diff --git a/Documentation/RelNotes/2.17.2.txt b/third_party/git/Documentation/RelNotes/2.17.2.txt
index ef021be870..ef021be870 100644
--- a/Documentation/RelNotes/2.17.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.17.2.txt
diff --git a/Documentation/RelNotes/2.18.0.txt b/third_party/git/Documentation/RelNotes/2.18.0.txt
index 3ea280cf68..3ea280cf68 100644
--- a/Documentation/RelNotes/2.18.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.18.0.txt
diff --git a/Documentation/RelNotes/2.18.1.txt b/third_party/git/Documentation/RelNotes/2.18.1.txt
index 2098cdd776..2098cdd776 100644
--- a/Documentation/RelNotes/2.18.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.18.1.txt
diff --git a/Documentation/RelNotes/2.19.0.txt b/third_party/git/Documentation/RelNotes/2.19.0.txt
index a06ccf6e2a..a06ccf6e2a 100644
--- a/Documentation/RelNotes/2.19.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.19.0.txt
diff --git a/Documentation/RelNotes/2.19.1.txt b/third_party/git/Documentation/RelNotes/2.19.1.txt
index da7672674e..da7672674e 100644
--- a/Documentation/RelNotes/2.19.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.19.1.txt
diff --git a/Documentation/RelNotes/2.19.2.txt b/third_party/git/Documentation/RelNotes/2.19.2.txt
index 759e6ca957..759e6ca957 100644
--- a/Documentation/RelNotes/2.19.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.19.2.txt
diff --git a/Documentation/RelNotes/2.2.0.txt b/third_party/git/Documentation/RelNotes/2.2.0.txt
index e98ecbcff6..e98ecbcff6 100644
--- a/Documentation/RelNotes/2.2.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.2.0.txt
diff --git a/Documentation/RelNotes/2.2.1.txt b/third_party/git/Documentation/RelNotes/2.2.1.txt
index d5a3cd9e73..d5a3cd9e73 100644
--- a/Documentation/RelNotes/2.2.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.2.1.txt
diff --git a/Documentation/RelNotes/2.2.2.txt b/third_party/git/Documentation/RelNotes/2.2.2.txt
index b19a35d94f..b19a35d94f 100644
--- a/Documentation/RelNotes/2.2.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.2.2.txt
diff --git a/Documentation/RelNotes/2.2.3.txt b/third_party/git/Documentation/RelNotes/2.2.3.txt
index 5bfffa4106..5bfffa4106 100644
--- a/Documentation/RelNotes/2.2.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.2.3.txt
diff --git a/Documentation/RelNotes/2.20.0.txt b/third_party/git/Documentation/RelNotes/2.20.0.txt
index e71fe3dee1..e71fe3dee1 100644
--- a/Documentation/RelNotes/2.20.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.20.0.txt
diff --git a/Documentation/RelNotes/2.20.1.txt b/third_party/git/Documentation/RelNotes/2.20.1.txt
index dcba888dba..dcba888dba 100644
--- a/Documentation/RelNotes/2.20.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.20.1.txt
diff --git a/Documentation/RelNotes/2.21.0.txt b/third_party/git/Documentation/RelNotes/2.21.0.txt
index 7a49deddf3..7a49deddf3 100644
--- a/Documentation/RelNotes/2.21.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.21.0.txt
diff --git a/Documentation/RelNotes/2.22.0.txt b/third_party/git/Documentation/RelNotes/2.22.0.txt
index 91e6ae9887..91e6ae9887 100644
--- a/Documentation/RelNotes/2.22.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.22.0.txt
diff --git a/Documentation/RelNotes/2.22.1.txt b/third_party/git/Documentation/RelNotes/2.22.1.txt
index 432762f270..432762f270 100644
--- a/Documentation/RelNotes/2.22.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.22.1.txt
diff --git a/Documentation/RelNotes/2.23.0.txt b/third_party/git/Documentation/RelNotes/2.23.0.txt
index e3c4e78265..e3c4e78265 100644
--- a/Documentation/RelNotes/2.23.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.23.0.txt
diff --git a/Documentation/RelNotes/2.3.0.txt b/third_party/git/Documentation/RelNotes/2.3.0.txt
index e3c639c840..e3c639c840 100644
--- a/Documentation/RelNotes/2.3.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.3.0.txt
diff --git a/Documentation/RelNotes/2.3.1.txt b/third_party/git/Documentation/RelNotes/2.3.1.txt
index cf96186288..cf96186288 100644
--- a/Documentation/RelNotes/2.3.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.3.1.txt
diff --git a/Documentation/RelNotes/2.3.10.txt b/third_party/git/Documentation/RelNotes/2.3.10.txt
index 20c2d2cacc..20c2d2cacc 100644
--- a/Documentation/RelNotes/2.3.10.txt
+++ b/third_party/git/Documentation/RelNotes/2.3.10.txt
diff --git a/Documentation/RelNotes/2.3.2.txt b/third_party/git/Documentation/RelNotes/2.3.2.txt
index 93462e45c2..93462e45c2 100644
--- a/Documentation/RelNotes/2.3.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.3.2.txt
diff --git a/Documentation/RelNotes/2.3.3.txt b/third_party/git/Documentation/RelNotes/2.3.3.txt
index 5ef12644c2..5ef12644c2 100644
--- a/Documentation/RelNotes/2.3.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.3.3.txt
diff --git a/Documentation/RelNotes/2.3.4.txt b/third_party/git/Documentation/RelNotes/2.3.4.txt
index 094c7b853b..094c7b853b 100644
--- a/Documentation/RelNotes/2.3.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.3.4.txt
diff --git a/Documentation/RelNotes/2.3.5.txt b/third_party/git/Documentation/RelNotes/2.3.5.txt
index 5b309db689..5b309db689 100644
--- a/Documentation/RelNotes/2.3.5.txt
+++ b/third_party/git/Documentation/RelNotes/2.3.5.txt
diff --git a/Documentation/RelNotes/2.3.6.txt b/third_party/git/Documentation/RelNotes/2.3.6.txt
index 432f770ef3..432f770ef3 100644
--- a/Documentation/RelNotes/2.3.6.txt
+++ b/third_party/git/Documentation/RelNotes/2.3.6.txt
diff --git a/Documentation/RelNotes/2.3.7.txt b/third_party/git/Documentation/RelNotes/2.3.7.txt
index fc95812cb3..fc95812cb3 100644
--- a/Documentation/RelNotes/2.3.7.txt
+++ b/third_party/git/Documentation/RelNotes/2.3.7.txt
diff --git a/Documentation/RelNotes/2.3.8.txt b/third_party/git/Documentation/RelNotes/2.3.8.txt
index 0b67268a96..0b67268a96 100644
--- a/Documentation/RelNotes/2.3.8.txt
+++ b/third_party/git/Documentation/RelNotes/2.3.8.txt
diff --git a/Documentation/RelNotes/2.3.9.txt b/third_party/git/Documentation/RelNotes/2.3.9.txt
index 1a2ad3235a..1a2ad3235a 100644
--- a/Documentation/RelNotes/2.3.9.txt
+++ b/third_party/git/Documentation/RelNotes/2.3.9.txt
diff --git a/Documentation/RelNotes/2.4.0.txt b/third_party/git/Documentation/RelNotes/2.4.0.txt
index cde64be535..cde64be535 100644
--- a/Documentation/RelNotes/2.4.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.4.0.txt
diff --git a/Documentation/RelNotes/2.4.1.txt b/third_party/git/Documentation/RelNotes/2.4.1.txt
index a65a6c5829..a65a6c5829 100644
--- a/Documentation/RelNotes/2.4.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.4.1.txt
diff --git a/Documentation/RelNotes/2.4.10.txt b/third_party/git/Documentation/RelNotes/2.4.10.txt
index 702d8d4e22..702d8d4e22 100644
--- a/Documentation/RelNotes/2.4.10.txt
+++ b/third_party/git/Documentation/RelNotes/2.4.10.txt
diff --git a/Documentation/RelNotes/2.4.11.txt b/third_party/git/Documentation/RelNotes/2.4.11.txt
index 723360295c..723360295c 100644
--- a/Documentation/RelNotes/2.4.11.txt
+++ b/third_party/git/Documentation/RelNotes/2.4.11.txt
diff --git a/Documentation/RelNotes/2.4.12.txt b/third_party/git/Documentation/RelNotes/2.4.12.txt
index 7d15f94725..7d15f94725 100644
--- a/Documentation/RelNotes/2.4.12.txt
+++ b/third_party/git/Documentation/RelNotes/2.4.12.txt
diff --git a/Documentation/RelNotes/2.4.2.txt b/third_party/git/Documentation/RelNotes/2.4.2.txt
index 250cdc423c..250cdc423c 100644
--- a/Documentation/RelNotes/2.4.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.4.2.txt
diff --git a/Documentation/RelNotes/2.4.3.txt b/third_party/git/Documentation/RelNotes/2.4.3.txt
index 914d2c1860..914d2c1860 100644
--- a/Documentation/RelNotes/2.4.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.4.3.txt
diff --git a/Documentation/RelNotes/2.4.4.txt b/third_party/git/Documentation/RelNotes/2.4.4.txt
index f1ccd001be..f1ccd001be 100644
--- a/Documentation/RelNotes/2.4.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.4.4.txt
diff --git a/Documentation/RelNotes/2.4.5.txt b/third_party/git/Documentation/RelNotes/2.4.5.txt
index 568297ccb7..568297ccb7 100644
--- a/Documentation/RelNotes/2.4.5.txt
+++ b/third_party/git/Documentation/RelNotes/2.4.5.txt
diff --git a/Documentation/RelNotes/2.4.6.txt b/third_party/git/Documentation/RelNotes/2.4.6.txt
index b53f353939..b53f353939 100644
--- a/Documentation/RelNotes/2.4.6.txt
+++ b/third_party/git/Documentation/RelNotes/2.4.6.txt
diff --git a/Documentation/RelNotes/2.4.7.txt b/third_party/git/Documentation/RelNotes/2.4.7.txt
index b3ac412b82..b3ac412b82 100644
--- a/Documentation/RelNotes/2.4.7.txt
+++ b/third_party/git/Documentation/RelNotes/2.4.7.txt
diff --git a/Documentation/RelNotes/2.4.8.txt b/third_party/git/Documentation/RelNotes/2.4.8.txt
index ad946b2673..ad946b2673 100644
--- a/Documentation/RelNotes/2.4.8.txt
+++ b/third_party/git/Documentation/RelNotes/2.4.8.txt
diff --git a/Documentation/RelNotes/2.4.9.txt b/third_party/git/Documentation/RelNotes/2.4.9.txt
index 09af9ddbc7..09af9ddbc7 100644
--- a/Documentation/RelNotes/2.4.9.txt
+++ b/third_party/git/Documentation/RelNotes/2.4.9.txt
diff --git a/Documentation/RelNotes/2.5.0.txt b/third_party/git/Documentation/RelNotes/2.5.0.txt
index 87044504c5..87044504c5 100644
--- a/Documentation/RelNotes/2.5.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.5.0.txt
diff --git a/Documentation/RelNotes/2.5.1.txt b/third_party/git/Documentation/RelNotes/2.5.1.txt
index b70553308a..b70553308a 100644
--- a/Documentation/RelNotes/2.5.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.5.1.txt
diff --git a/Documentation/RelNotes/2.5.2.txt b/third_party/git/Documentation/RelNotes/2.5.2.txt
index 3f749398bb..3f749398bb 100644
--- a/Documentation/RelNotes/2.5.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.5.2.txt
diff --git a/Documentation/RelNotes/2.5.3.txt b/third_party/git/Documentation/RelNotes/2.5.3.txt
index d1436857cb..d1436857cb 100644
--- a/Documentation/RelNotes/2.5.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.5.3.txt
diff --git a/Documentation/RelNotes/2.5.4.txt b/third_party/git/Documentation/RelNotes/2.5.4.txt
index b8a2f93ee7..b8a2f93ee7 100644
--- a/Documentation/RelNotes/2.5.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.5.4.txt
diff --git a/Documentation/RelNotes/2.5.5.txt b/third_party/git/Documentation/RelNotes/2.5.5.txt
index 37eae9a2d9..37eae9a2d9 100644
--- a/Documentation/RelNotes/2.5.5.txt
+++ b/third_party/git/Documentation/RelNotes/2.5.5.txt
diff --git a/Documentation/RelNotes/2.5.6.txt b/third_party/git/Documentation/RelNotes/2.5.6.txt
index 9cd025bb1c..9cd025bb1c 100644
--- a/Documentation/RelNotes/2.5.6.txt
+++ b/third_party/git/Documentation/RelNotes/2.5.6.txt
diff --git a/Documentation/RelNotes/2.6.0.txt b/third_party/git/Documentation/RelNotes/2.6.0.txt
index 7288aaf716..7288aaf716 100644
--- a/Documentation/RelNotes/2.6.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.6.0.txt
diff --git a/Documentation/RelNotes/2.6.1.txt b/third_party/git/Documentation/RelNotes/2.6.1.txt
index f37ea89cda..f37ea89cda 100644
--- a/Documentation/RelNotes/2.6.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.6.1.txt
diff --git a/Documentation/RelNotes/2.6.2.txt b/third_party/git/Documentation/RelNotes/2.6.2.txt
index 5b65e35245..5b65e35245 100644
--- a/Documentation/RelNotes/2.6.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.6.2.txt
diff --git a/Documentation/RelNotes/2.6.3.txt b/third_party/git/Documentation/RelNotes/2.6.3.txt
index fc6fe1711f..fc6fe1711f 100644
--- a/Documentation/RelNotes/2.6.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.6.3.txt
diff --git a/Documentation/RelNotes/2.6.4.txt b/third_party/git/Documentation/RelNotes/2.6.4.txt
index b0256a2dc9..b0256a2dc9 100644
--- a/Documentation/RelNotes/2.6.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.6.4.txt
diff --git a/Documentation/RelNotes/2.6.5.txt b/third_party/git/Documentation/RelNotes/2.6.5.txt
index f0924b62e0..f0924b62e0 100644
--- a/Documentation/RelNotes/2.6.5.txt
+++ b/third_party/git/Documentation/RelNotes/2.6.5.txt
diff --git a/Documentation/RelNotes/2.6.6.txt b/third_party/git/Documentation/RelNotes/2.6.6.txt
index 023ad85ec6..023ad85ec6 100644
--- a/Documentation/RelNotes/2.6.6.txt
+++ b/third_party/git/Documentation/RelNotes/2.6.6.txt
diff --git a/Documentation/RelNotes/2.6.7.txt b/third_party/git/Documentation/RelNotes/2.6.7.txt
index 1335de49a6..1335de49a6 100644
--- a/Documentation/RelNotes/2.6.7.txt
+++ b/third_party/git/Documentation/RelNotes/2.6.7.txt
diff --git a/Documentation/RelNotes/2.7.0.txt b/third_party/git/Documentation/RelNotes/2.7.0.txt
index 563dadc57e..563dadc57e 100644
--- a/Documentation/RelNotes/2.7.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.7.0.txt
diff --git a/Documentation/RelNotes/2.7.1.txt b/third_party/git/Documentation/RelNotes/2.7.1.txt
index 6553d69e33..6553d69e33 100644
--- a/Documentation/RelNotes/2.7.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.7.1.txt
diff --git a/Documentation/RelNotes/2.7.2.txt b/third_party/git/Documentation/RelNotes/2.7.2.txt
index 4feef76704..4feef76704 100644
--- a/Documentation/RelNotes/2.7.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.7.2.txt
diff --git a/Documentation/RelNotes/2.7.3.txt b/third_party/git/Documentation/RelNotes/2.7.3.txt
index 6adf038915..6adf038915 100644
--- a/Documentation/RelNotes/2.7.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.7.3.txt
diff --git a/Documentation/RelNotes/2.7.4.txt b/third_party/git/Documentation/RelNotes/2.7.4.txt
index 883ae896fe..883ae896fe 100644
--- a/Documentation/RelNotes/2.7.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.7.4.txt
diff --git a/Documentation/RelNotes/2.7.5.txt b/third_party/git/Documentation/RelNotes/2.7.5.txt
index 83559ce3b2..83559ce3b2 100644
--- a/Documentation/RelNotes/2.7.5.txt
+++ b/third_party/git/Documentation/RelNotes/2.7.5.txt
diff --git a/Documentation/RelNotes/2.7.6.txt b/third_party/git/Documentation/RelNotes/2.7.6.txt
index 4c6d1dcd4a..4c6d1dcd4a 100644
--- a/Documentation/RelNotes/2.7.6.txt
+++ b/third_party/git/Documentation/RelNotes/2.7.6.txt
diff --git a/Documentation/RelNotes/2.8.0.txt b/third_party/git/Documentation/RelNotes/2.8.0.txt
index 25079710fa..25079710fa 100644
--- a/Documentation/RelNotes/2.8.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.8.0.txt
diff --git a/Documentation/RelNotes/2.8.1.txt b/third_party/git/Documentation/RelNotes/2.8.1.txt
index ef6d80b008..ef6d80b008 100644
--- a/Documentation/RelNotes/2.8.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.8.1.txt
diff --git a/Documentation/RelNotes/2.8.2.txt b/third_party/git/Documentation/RelNotes/2.8.2.txt
index 447b1933a8..447b1933a8 100644
--- a/Documentation/RelNotes/2.8.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.8.2.txt
diff --git a/Documentation/RelNotes/2.8.3.txt b/third_party/git/Documentation/RelNotes/2.8.3.txt
index fedd9968e5..fedd9968e5 100644
--- a/Documentation/RelNotes/2.8.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.8.3.txt
diff --git a/Documentation/RelNotes/2.8.4.txt b/third_party/git/Documentation/RelNotes/2.8.4.txt
index f4e2552836..f4e2552836 100644
--- a/Documentation/RelNotes/2.8.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.8.4.txt
diff --git a/Documentation/RelNotes/2.8.5.txt b/third_party/git/Documentation/RelNotes/2.8.5.txt
index 7bd179fa12..7bd179fa12 100644
--- a/Documentation/RelNotes/2.8.5.txt
+++ b/third_party/git/Documentation/RelNotes/2.8.5.txt
diff --git a/Documentation/RelNotes/2.8.6.txt b/third_party/git/Documentation/RelNotes/2.8.6.txt
index d8db55d920..d8db55d920 100644
--- a/Documentation/RelNotes/2.8.6.txt
+++ b/third_party/git/Documentation/RelNotes/2.8.6.txt
diff --git a/Documentation/RelNotes/2.9.0.txt b/third_party/git/Documentation/RelNotes/2.9.0.txt
index b61d36712f..b61d36712f 100644
--- a/Documentation/RelNotes/2.9.0.txt
+++ b/third_party/git/Documentation/RelNotes/2.9.0.txt
diff --git a/Documentation/RelNotes/2.9.1.txt b/third_party/git/Documentation/RelNotes/2.9.1.txt
index 338394097e..338394097e 100644
--- a/Documentation/RelNotes/2.9.1.txt
+++ b/third_party/git/Documentation/RelNotes/2.9.1.txt
diff --git a/Documentation/RelNotes/2.9.2.txt b/third_party/git/Documentation/RelNotes/2.9.2.txt
index 2620003dcf..2620003dcf 100644
--- a/Documentation/RelNotes/2.9.2.txt
+++ b/third_party/git/Documentation/RelNotes/2.9.2.txt
diff --git a/Documentation/RelNotes/2.9.3.txt b/third_party/git/Documentation/RelNotes/2.9.3.txt
index 695b86f612..695b86f612 100644
--- a/Documentation/RelNotes/2.9.3.txt
+++ b/third_party/git/Documentation/RelNotes/2.9.3.txt
diff --git a/Documentation/RelNotes/2.9.4.txt b/third_party/git/Documentation/RelNotes/2.9.4.txt
index 9768293831..9768293831 100644
--- a/Documentation/RelNotes/2.9.4.txt
+++ b/third_party/git/Documentation/RelNotes/2.9.4.txt
diff --git a/Documentation/RelNotes/2.9.5.txt b/third_party/git/Documentation/RelNotes/2.9.5.txt
index 668313ae55..668313ae55 100644
--- a/Documentation/RelNotes/2.9.5.txt
+++ b/third_party/git/Documentation/RelNotes/2.9.5.txt
diff --git a/Documentation/SubmittingPatches b/third_party/git/Documentation/SubmittingPatches
index 6d589e118c..6d589e118c 100644
--- a/Documentation/SubmittingPatches
+++ b/third_party/git/Documentation/SubmittingPatches
diff --git a/Documentation/asciidoc.conf b/third_party/git/Documentation/asciidoc.conf
index 2c16c536ba..2c16c536ba 100644
--- a/Documentation/asciidoc.conf
+++ b/third_party/git/Documentation/asciidoc.conf
diff --git a/Documentation/asciidoctor-extensions.rb b/third_party/git/Documentation/asciidoctor-extensions.rb
index 0089e0cfb8..0089e0cfb8 100644
--- a/Documentation/asciidoctor-extensions.rb
+++ b/third_party/git/Documentation/asciidoctor-extensions.rb
diff --git a/Documentation/blame-options.txt b/third_party/git/Documentation/blame-options.txt
index 5d122db6e9..5d122db6e9 100644
--- a/Documentation/blame-options.txt
+++ b/third_party/git/Documentation/blame-options.txt
diff --git a/Documentation/build-docdep.perl b/third_party/git/Documentation/build-docdep.perl
index ba4205e030..ba4205e030 100755
--- a/Documentation/build-docdep.perl
+++ b/third_party/git/Documentation/build-docdep.perl
diff --git a/Documentation/cat-texi.perl b/third_party/git/Documentation/cat-texi.perl
index 14d2f83415..14d2f83415 100755
--- a/Documentation/cat-texi.perl
+++ b/third_party/git/Documentation/cat-texi.perl
diff --git a/Documentation/cmd-list.perl b/third_party/git/Documentation/cmd-list.perl
index 5aa73cfe45..5aa73cfe45 100755
--- a/Documentation/cmd-list.perl
+++ b/third_party/git/Documentation/cmd-list.perl
diff --git a/Documentation/config.txt b/third_party/git/Documentation/config.txt
index e3f5bc3396..e3f5bc3396 100644
--- a/Documentation/config.txt
+++ b/third_party/git/Documentation/config.txt
diff --git a/Documentation/config/add.txt b/third_party/git/Documentation/config/add.txt
index 4d753f006e..4d753f006e 100644
--- a/Documentation/config/add.txt
+++ b/third_party/git/Documentation/config/add.txt
diff --git a/Documentation/config/advice.txt b/third_party/git/Documentation/config/advice.txt
index 6aaa360202..6aaa360202 100644
--- a/Documentation/config/advice.txt
+++ b/third_party/git/Documentation/config/advice.txt
diff --git a/Documentation/config/alias.txt b/third_party/git/Documentation/config/alias.txt
index f1ca739d57..f1ca739d57 100644
--- a/Documentation/config/alias.txt
+++ b/third_party/git/Documentation/config/alias.txt
diff --git a/Documentation/config/am.txt b/third_party/git/Documentation/config/am.txt
index 5bcad2efb1..5bcad2efb1 100644
--- a/Documentation/config/am.txt
+++ b/third_party/git/Documentation/config/am.txt
diff --git a/Documentation/config/apply.txt b/third_party/git/Documentation/config/apply.txt
index 8fb8ef763d..8fb8ef763d 100644
--- a/Documentation/config/apply.txt
+++ b/third_party/git/Documentation/config/apply.txt
diff --git a/Documentation/config/blame.txt b/third_party/git/Documentation/config/blame.txt
index 9468e8599c..9468e8599c 100644
--- a/Documentation/config/blame.txt
+++ b/third_party/git/Documentation/config/blame.txt
diff --git a/Documentation/config/branch.txt b/third_party/git/Documentation/config/branch.txt
index a592d522a7..a592d522a7 100644
--- a/Documentation/config/branch.txt
+++ b/third_party/git/Documentation/config/branch.txt
diff --git a/Documentation/config/browser.txt b/third_party/git/Documentation/config/browser.txt
index 195df207a6..195df207a6 100644
--- a/Documentation/config/browser.txt
+++ b/third_party/git/Documentation/config/browser.txt
diff --git a/Documentation/config/checkout.txt b/third_party/git/Documentation/config/checkout.txt
index 6b646813ab..6b646813ab 100644
--- a/Documentation/config/checkout.txt
+++ b/third_party/git/Documentation/config/checkout.txt
diff --git a/Documentation/config/clean.txt b/third_party/git/Documentation/config/clean.txt
index a807c925b9..a807c925b9 100644
--- a/Documentation/config/clean.txt
+++ b/third_party/git/Documentation/config/clean.txt
diff --git a/Documentation/config/color.txt b/third_party/git/Documentation/config/color.txt
index d5daacb13a..d5daacb13a 100644
--- a/Documentation/config/color.txt
+++ b/third_party/git/Documentation/config/color.txt
diff --git a/Documentation/config/column.txt b/third_party/git/Documentation/config/column.txt
index 76aa2f29dc..76aa2f29dc 100644
--- a/Documentation/config/column.txt
+++ b/third_party/git/Documentation/config/column.txt
diff --git a/Documentation/config/commit.txt b/third_party/git/Documentation/config/commit.txt
index 2c95573930..2c95573930 100644
--- a/Documentation/config/commit.txt
+++ b/third_party/git/Documentation/config/commit.txt
diff --git a/Documentation/config/completion.txt b/third_party/git/Documentation/config/completion.txt
index 4d99bf33c9..4d99bf33c9 100644
--- a/Documentation/config/completion.txt
+++ b/third_party/git/Documentation/config/completion.txt
diff --git a/Documentation/config/core.txt b/third_party/git/Documentation/config/core.txt
index 75538d27e7..75538d27e7 100644
--- a/Documentation/config/core.txt
+++ b/third_party/git/Documentation/config/core.txt
diff --git a/Documentation/config/credential.txt b/third_party/git/Documentation/config/credential.txt
index 60fb3189e1..60fb3189e1 100644
--- a/Documentation/config/credential.txt
+++ b/third_party/git/Documentation/config/credential.txt
diff --git a/Documentation/config/diff.txt b/third_party/git/Documentation/config/diff.txt
index 5afb5a2cbc..5afb5a2cbc 100644
--- a/Documentation/config/diff.txt
+++ b/third_party/git/Documentation/config/diff.txt
diff --git a/Documentation/config/difftool.txt b/third_party/git/Documentation/config/difftool.txt
index 6762594480..6762594480 100644
--- a/Documentation/config/difftool.txt
+++ b/third_party/git/Documentation/config/difftool.txt
diff --git a/Documentation/config/fastimport.txt b/third_party/git/Documentation/config/fastimport.txt
index c1166e330d..c1166e330d 100644
--- a/Documentation/config/fastimport.txt
+++ b/third_party/git/Documentation/config/fastimport.txt
diff --git a/Documentation/config/fetch.txt b/third_party/git/Documentation/config/fetch.txt
index ba890b5884..ba890b5884 100644
--- a/Documentation/config/fetch.txt
+++ b/third_party/git/Documentation/config/fetch.txt
diff --git a/Documentation/config/filter.txt b/third_party/git/Documentation/config/filter.txt
index 90dfe0ba5a..90dfe0ba5a 100644
--- a/Documentation/config/filter.txt
+++ b/third_party/git/Documentation/config/filter.txt
diff --git a/Documentation/config/fmt-merge-msg.txt b/third_party/git/Documentation/config/fmt-merge-msg.txt
index c73cfa90b7..c73cfa90b7 100644
--- a/Documentation/config/fmt-merge-msg.txt
+++ b/third_party/git/Documentation/config/fmt-merge-msg.txt
diff --git a/Documentation/config/format.txt b/third_party/git/Documentation/config/format.txt
index 414a5a8a9d..414a5a8a9d 100644
--- a/Documentation/config/format.txt
+++ b/third_party/git/Documentation/config/format.txt
diff --git a/Documentation/config/fsck.txt b/third_party/git/Documentation/config/fsck.txt
index 450e8c38e3..450e8c38e3 100644
--- a/Documentation/config/fsck.txt
+++ b/third_party/git/Documentation/config/fsck.txt
diff --git a/Documentation/config/gc.txt b/third_party/git/Documentation/config/gc.txt
index 02b92b18b5..02b92b18b5 100644
--- a/Documentation/config/gc.txt
+++ b/third_party/git/Documentation/config/gc.txt
diff --git a/Documentation/config/gitcvs.txt b/third_party/git/Documentation/config/gitcvs.txt
index 02da427fd9..02da427fd9 100644
--- a/Documentation/config/gitcvs.txt
+++ b/third_party/git/Documentation/config/gitcvs.txt
diff --git a/Documentation/config/gitweb.txt b/third_party/git/Documentation/config/gitweb.txt
index 1b51475108..1b51475108 100644
--- a/Documentation/config/gitweb.txt
+++ b/third_party/git/Documentation/config/gitweb.txt
diff --git a/Documentation/config/gpg.txt b/third_party/git/Documentation/config/gpg.txt
index cce2c89245..cce2c89245 100644
--- a/Documentation/config/gpg.txt
+++ b/third_party/git/Documentation/config/gpg.txt
diff --git a/Documentation/config/grep.txt b/third_party/git/Documentation/config/grep.txt
index 44abe45a7c..44abe45a7c 100644
--- a/Documentation/config/grep.txt
+++ b/third_party/git/Documentation/config/grep.txt
diff --git a/Documentation/config/gui.txt b/third_party/git/Documentation/config/gui.txt
index d30831a130..d30831a130 100644
--- a/Documentation/config/gui.txt
+++ b/third_party/git/Documentation/config/gui.txt
diff --git a/Documentation/config/guitool.txt b/third_party/git/Documentation/config/guitool.txt
index 43fb9466ff..43fb9466ff 100644
--- a/Documentation/config/guitool.txt
+++ b/third_party/git/Documentation/config/guitool.txt
diff --git a/Documentation/config/help.txt b/third_party/git/Documentation/config/help.txt
index 224bbf5a28..224bbf5a28 100644
--- a/Documentation/config/help.txt
+++ b/third_party/git/Documentation/config/help.txt
diff --git a/Documentation/config/http.txt b/third_party/git/Documentation/config/http.txt
index 5a32f5b0a5..5a32f5b0a5 100644
--- a/Documentation/config/http.txt
+++ b/third_party/git/Documentation/config/http.txt
diff --git a/Documentation/config/i18n.txt b/third_party/git/Documentation/config/i18n.txt
index cc25621731..cc25621731 100644
--- a/Documentation/config/i18n.txt
+++ b/third_party/git/Documentation/config/i18n.txt
diff --git a/Documentation/config/imap.txt b/third_party/git/Documentation/config/imap.txt
index 06166fb5c0..06166fb5c0 100644
--- a/Documentation/config/imap.txt
+++ b/third_party/git/Documentation/config/imap.txt
diff --git a/Documentation/config/index.txt b/third_party/git/Documentation/config/index.txt
index f181503041..f181503041 100644
--- a/Documentation/config/index.txt
+++ b/third_party/git/Documentation/config/index.txt
diff --git a/Documentation/config/init.txt b/third_party/git/Documentation/config/init.txt
index 46fa8c6a08..46fa8c6a08 100644
--- a/Documentation/config/init.txt
+++ b/third_party/git/Documentation/config/init.txt
diff --git a/Documentation/config/instaweb.txt b/third_party/git/Documentation/config/instaweb.txt
index 50cb2f7d62..50cb2f7d62 100644
--- a/Documentation/config/instaweb.txt
+++ b/third_party/git/Documentation/config/instaweb.txt
diff --git a/Documentation/config/interactive.txt b/third_party/git/Documentation/config/interactive.txt
index a2d3c7ec44..a2d3c7ec44 100644
--- a/Documentation/config/interactive.txt
+++ b/third_party/git/Documentation/config/interactive.txt
diff --git a/Documentation/config/log.txt b/third_party/git/Documentation/config/log.txt
index e9e1e397f3..e9e1e397f3 100644
--- a/Documentation/config/log.txt
+++ b/third_party/git/Documentation/config/log.txt
diff --git a/Documentation/config/mailinfo.txt b/third_party/git/Documentation/config/mailinfo.txt
index 3854d4ae37..3854d4ae37 100644
--- a/Documentation/config/mailinfo.txt
+++ b/third_party/git/Documentation/config/mailinfo.txt
diff --git a/Documentation/config/mailmap.txt b/third_party/git/Documentation/config/mailmap.txt
index 48cbc30722..48cbc30722 100644
--- a/Documentation/config/mailmap.txt
+++ b/third_party/git/Documentation/config/mailmap.txt
diff --git a/Documentation/config/man.txt b/third_party/git/Documentation/config/man.txt
index a727d987a8..a727d987a8 100644
--- a/Documentation/config/man.txt
+++ b/third_party/git/Documentation/config/man.txt
diff --git a/Documentation/config/merge.txt b/third_party/git/Documentation/config/merge.txt
index 6a313937f8..6a313937f8 100644
--- a/Documentation/config/merge.txt
+++ b/third_party/git/Documentation/config/merge.txt
diff --git a/Documentation/config/mergetool.txt b/third_party/git/Documentation/config/mergetool.txt
index 09ed31dbfa..09ed31dbfa 100644
--- a/Documentation/config/mergetool.txt
+++ b/third_party/git/Documentation/config/mergetool.txt
diff --git a/Documentation/config/notes.txt b/third_party/git/Documentation/config/notes.txt
index aeef56d49a..aeef56d49a 100644
--- a/Documentation/config/notes.txt
+++ b/third_party/git/Documentation/config/notes.txt
diff --git a/Documentation/config/pack.txt b/third_party/git/Documentation/config/pack.txt
index 9cdcfa7324..9cdcfa7324 100644
--- a/Documentation/config/pack.txt
+++ b/third_party/git/Documentation/config/pack.txt
diff --git a/Documentation/config/pager.txt b/third_party/git/Documentation/config/pager.txt
index d3731cf66c..d3731cf66c 100644
--- a/Documentation/config/pager.txt
+++ b/third_party/git/Documentation/config/pager.txt
diff --git a/Documentation/config/pretty.txt b/third_party/git/Documentation/config/pretty.txt
index 063c6b63d9..063c6b63d9 100644
--- a/Documentation/config/pretty.txt
+++ b/third_party/git/Documentation/config/pretty.txt
diff --git a/Documentation/config/protocol.txt b/third_party/git/Documentation/config/protocol.txt
index bfccc07491..bfccc07491 100644
--- a/Documentation/config/protocol.txt
+++ b/third_party/git/Documentation/config/protocol.txt
diff --git a/Documentation/config/pull.txt b/third_party/git/Documentation/config/pull.txt
index b87cab31b3..b87cab31b3 100644
--- a/Documentation/config/pull.txt
+++ b/third_party/git/Documentation/config/pull.txt
diff --git a/Documentation/config/push.txt b/third_party/git/Documentation/config/push.txt
index 0a0e000569..0a0e000569 100644
--- a/Documentation/config/push.txt
+++ b/third_party/git/Documentation/config/push.txt
diff --git a/Documentation/config/rebase.txt b/third_party/git/Documentation/config/rebase.txt
index d98e32d812..d98e32d812 100644
--- a/Documentation/config/rebase.txt
+++ b/third_party/git/Documentation/config/rebase.txt
diff --git a/Documentation/config/receive.txt b/third_party/git/Documentation/config/receive.txt
index 65f78aac37..65f78aac37 100644
--- a/Documentation/config/receive.txt
+++ b/third_party/git/Documentation/config/receive.txt
diff --git a/Documentation/config/remote.txt b/third_party/git/Documentation/config/remote.txt
index 6c4cad83a2..6c4cad83a2 100644
--- a/Documentation/config/remote.txt
+++ b/third_party/git/Documentation/config/remote.txt
diff --git a/Documentation/config/remotes.txt b/third_party/git/Documentation/config/remotes.txt
index 4cfe03221e..4cfe03221e 100644
--- a/Documentation/config/remotes.txt
+++ b/third_party/git/Documentation/config/remotes.txt
diff --git a/Documentation/config/repack.txt b/third_party/git/Documentation/config/repack.txt
index 9c413e177e..9c413e177e 100644
--- a/Documentation/config/repack.txt
+++ b/third_party/git/Documentation/config/repack.txt
diff --git a/Documentation/config/rerere.txt b/third_party/git/Documentation/config/rerere.txt
index 40abdf6a6b..40abdf6a6b 100644
--- a/Documentation/config/rerere.txt
+++ b/third_party/git/Documentation/config/rerere.txt
diff --git a/Documentation/config/reset.txt b/third_party/git/Documentation/config/reset.txt
index 63b7c45aac..63b7c45aac 100644
--- a/Documentation/config/reset.txt
+++ b/third_party/git/Documentation/config/reset.txt
diff --git a/Documentation/config/sendemail.txt b/third_party/git/Documentation/config/sendemail.txt
index 0006faf800..0006faf800 100644
--- a/Documentation/config/sendemail.txt
+++ b/third_party/git/Documentation/config/sendemail.txt
diff --git a/Documentation/config/sequencer.txt b/third_party/git/Documentation/config/sequencer.txt
index b48d532a96..b48d532a96 100644
--- a/Documentation/config/sequencer.txt
+++ b/third_party/git/Documentation/config/sequencer.txt
diff --git a/Documentation/config/showbranch.txt b/third_party/git/Documentation/config/showbranch.txt
index e79ecd9ee9..e79ecd9ee9 100644
--- a/Documentation/config/showbranch.txt
+++ b/third_party/git/Documentation/config/showbranch.txt
diff --git a/Documentation/config/splitindex.txt b/third_party/git/Documentation/config/splitindex.txt
index afdb186df8..afdb186df8 100644
--- a/Documentation/config/splitindex.txt
+++ b/third_party/git/Documentation/config/splitindex.txt
diff --git a/Documentation/config/ssh.txt b/third_party/git/Documentation/config/ssh.txt
index 2ca4bf93e1..2ca4bf93e1 100644
--- a/Documentation/config/ssh.txt
+++ b/third_party/git/Documentation/config/ssh.txt
diff --git a/Documentation/config/stash.txt b/third_party/git/Documentation/config/stash.txt
index abc7ef4a3a..abc7ef4a3a 100644
--- a/Documentation/config/stash.txt
+++ b/third_party/git/Documentation/config/stash.txt
diff --git a/Documentation/config/status.txt b/third_party/git/Documentation/config/status.txt
index 0fc704ab80..0fc704ab80 100644
--- a/Documentation/config/status.txt
+++ b/third_party/git/Documentation/config/status.txt
diff --git a/Documentation/config/submodule.txt b/third_party/git/Documentation/config/submodule.txt
index 0a1293b051..0a1293b051 100644
--- a/Documentation/config/submodule.txt
+++ b/third_party/git/Documentation/config/submodule.txt
diff --git a/Documentation/config/tag.txt b/third_party/git/Documentation/config/tag.txt
index ef5adb3f42..ef5adb3f42 100644
--- a/Documentation/config/tag.txt
+++ b/third_party/git/Documentation/config/tag.txt
diff --git a/Documentation/config/trace2.txt b/third_party/git/Documentation/config/trace2.txt
index 2edbfb02fe..2edbfb02fe 100644
--- a/Documentation/config/trace2.txt
+++ b/third_party/git/Documentation/config/trace2.txt
diff --git a/Documentation/config/transfer.txt b/third_party/git/Documentation/config/transfer.txt
index f5b6245270..f5b6245270 100644
--- a/Documentation/config/transfer.txt
+++ b/third_party/git/Documentation/config/transfer.txt
diff --git a/Documentation/config/uploadarchive.txt b/third_party/git/Documentation/config/uploadarchive.txt
index e0698e8c1d..e0698e8c1d 100644
--- a/Documentation/config/uploadarchive.txt
+++ b/third_party/git/Documentation/config/uploadarchive.txt
diff --git a/Documentation/config/uploadpack.txt b/third_party/git/Documentation/config/uploadpack.txt
index ed1c835695..ed1c835695 100644
--- a/Documentation/config/uploadpack.txt
+++ b/third_party/git/Documentation/config/uploadpack.txt
diff --git a/Documentation/config/url.txt b/third_party/git/Documentation/config/url.txt
index e5566c371d..e5566c371d 100644
--- a/Documentation/config/url.txt
+++ b/third_party/git/Documentation/config/url.txt
diff --git a/Documentation/config/user.txt b/third_party/git/Documentation/config/user.txt
index 0557cbbceb..0557cbbceb 100644
--- a/Documentation/config/user.txt
+++ b/third_party/git/Documentation/config/user.txt
diff --git a/Documentation/config/versionsort.txt b/third_party/git/Documentation/config/versionsort.txt
index 6c7cc054fa..6c7cc054fa 100644
--- a/Documentation/config/versionsort.txt
+++ b/third_party/git/Documentation/config/versionsort.txt
diff --git a/Documentation/config/web.txt b/third_party/git/Documentation/config/web.txt
index beec8d1303..beec8d1303 100644
--- a/Documentation/config/web.txt
+++ b/third_party/git/Documentation/config/web.txt
diff --git a/Documentation/config/worktree.txt b/third_party/git/Documentation/config/worktree.txt
index 048e349482..048e349482 100644
--- a/Documentation/config/worktree.txt
+++ b/third_party/git/Documentation/config/worktree.txt
diff --git a/Documentation/date-formats.txt b/third_party/git/Documentation/date-formats.txt
index 6926e0a4c8..6926e0a4c8 100644
--- a/Documentation/date-formats.txt
+++ b/third_party/git/Documentation/date-formats.txt
diff --git a/Documentation/diff-format.txt b/third_party/git/Documentation/diff-format.txt
index 4d846d7346..4d846d7346 100644
--- a/Documentation/diff-format.txt
+++ b/third_party/git/Documentation/diff-format.txt
diff --git a/Documentation/diff-generate-patch.txt b/third_party/git/Documentation/diff-generate-patch.txt
index f10ca410ad..f10ca410ad 100644
--- a/Documentation/diff-generate-patch.txt
+++ b/third_party/git/Documentation/diff-generate-patch.txt
diff --git a/Documentation/diff-options.txt b/third_party/git/Documentation/diff-options.txt
index 09faee3b44..09faee3b44 100644
--- a/Documentation/diff-options.txt
+++ b/third_party/git/Documentation/diff-options.txt
diff --git a/Documentation/doc-diff b/third_party/git/Documentation/doc-diff
index 3355be4798..3355be4798 100755
--- a/Documentation/doc-diff
+++ b/third_party/git/Documentation/doc-diff
diff --git a/Documentation/docbook-xsl.css b/third_party/git/Documentation/docbook-xsl.css
index e11c8f053a..e11c8f053a 100644
--- a/Documentation/docbook-xsl.css
+++ b/third_party/git/Documentation/docbook-xsl.css
diff --git a/Documentation/docbook.xsl b/third_party/git/Documentation/docbook.xsl
index da8b05b922..da8b05b922 100644
--- a/Documentation/docbook.xsl
+++ b/third_party/git/Documentation/docbook.xsl
diff --git a/Documentation/everyday.txto b/third_party/git/Documentation/everyday.txto
index ae555bd47e..ae555bd47e 100644
--- a/Documentation/everyday.txto
+++ b/third_party/git/Documentation/everyday.txto
diff --git a/Documentation/fetch-options.txt b/third_party/git/Documentation/fetch-options.txt
index 3c9b4f9e09..3c9b4f9e09 100644
--- a/Documentation/fetch-options.txt
+++ b/third_party/git/Documentation/fetch-options.txt
diff --git a/Documentation/fix-texi.perl b/third_party/git/Documentation/fix-texi.perl
index ff7d78f620..ff7d78f620 100755
--- a/Documentation/fix-texi.perl
+++ b/third_party/git/Documentation/fix-texi.perl
diff --git a/Documentation/git-add.txt b/third_party/git/Documentation/git-add.txt
index 8b0e4c7fa8..8b0e4c7fa8 100644
--- a/Documentation/git-add.txt
+++ b/third_party/git/Documentation/git-add.txt
diff --git a/Documentation/git-am.txt b/third_party/git/Documentation/git-am.txt
index fc3b993c33..fc3b993c33 100644
--- a/Documentation/git-am.txt
+++ b/third_party/git/Documentation/git-am.txt
diff --git a/Documentation/git-annotate.txt b/third_party/git/Documentation/git-annotate.txt
index e44a831339..e44a831339 100644
--- a/Documentation/git-annotate.txt
+++ b/third_party/git/Documentation/git-annotate.txt
diff --git a/Documentation/git-apply.txt b/third_party/git/Documentation/git-apply.txt
index b9aa39000f..b9aa39000f 100644
--- a/Documentation/git-apply.txt
+++ b/third_party/git/Documentation/git-apply.txt
diff --git a/Documentation/git-archimport.txt b/third_party/git/Documentation/git-archimport.txt
index a595a0ffee..a595a0ffee 100644
--- a/Documentation/git-archimport.txt
+++ b/third_party/git/Documentation/git-archimport.txt
diff --git a/Documentation/git-archive.txt b/third_party/git/Documentation/git-archive.txt
index cfa1e4ebe4..cfa1e4ebe4 100644
--- a/Documentation/git-archive.txt
+++ b/third_party/git/Documentation/git-archive.txt
diff --git a/Documentation/git-bisect-lk2009.txt b/third_party/git/Documentation/git-bisect-lk2009.txt
index e99925184d..e99925184d 100644
--- a/Documentation/git-bisect-lk2009.txt
+++ b/third_party/git/Documentation/git-bisect-lk2009.txt
diff --git a/Documentation/git-bisect.txt b/third_party/git/Documentation/git-bisect.txt
index 4b45d837a7..4b45d837a7 100644
--- a/Documentation/git-bisect.txt
+++ b/third_party/git/Documentation/git-bisect.txt
diff --git a/Documentation/git-blame.txt b/third_party/git/Documentation/git-blame.txt
index 7e81541996..7e81541996 100644
--- a/Documentation/git-blame.txt
+++ b/third_party/git/Documentation/git-blame.txt
diff --git a/Documentation/git-branch.txt b/third_party/git/Documentation/git-branch.txt
index 135206ff4a..135206ff4a 100644
--- a/Documentation/git-branch.txt
+++ b/third_party/git/Documentation/git-branch.txt
diff --git a/Documentation/git-bundle.txt b/third_party/git/Documentation/git-bundle.txt
index 7d6c9dcd17..7d6c9dcd17 100644
--- a/Documentation/git-bundle.txt
+++ b/third_party/git/Documentation/git-bundle.txt
diff --git a/Documentation/git-cat-file.txt b/third_party/git/Documentation/git-cat-file.txt
index 8eca671b82..8eca671b82 100644
--- a/Documentation/git-cat-file.txt
+++ b/third_party/git/Documentation/git-cat-file.txt
diff --git a/Documentation/git-check-attr.txt b/third_party/git/Documentation/git-check-attr.txt
index 3c0578217b..3c0578217b 100644
--- a/Documentation/git-check-attr.txt
+++ b/third_party/git/Documentation/git-check-attr.txt
diff --git a/Documentation/git-check-ignore.txt b/third_party/git/Documentation/git-check-ignore.txt
index 8b42cb3fb2..8b42cb3fb2 100644
--- a/Documentation/git-check-ignore.txt
+++ b/third_party/git/Documentation/git-check-ignore.txt
diff --git a/Documentation/git-check-mailmap.txt b/third_party/git/Documentation/git-check-mailmap.txt
index aa2055dbeb..aa2055dbeb 100644
--- a/Documentation/git-check-mailmap.txt
+++ b/third_party/git/Documentation/git-check-mailmap.txt
diff --git a/Documentation/git-check-ref-format.txt b/third_party/git/Documentation/git-check-ref-format.txt
index ee6a4144fb..ee6a4144fb 100644
--- a/Documentation/git-check-ref-format.txt
+++ b/third_party/git/Documentation/git-check-ref-format.txt
diff --git a/Documentation/git-checkout-index.txt b/third_party/git/Documentation/git-checkout-index.txt
index 4d33e7be0f..4d33e7be0f 100644
--- a/Documentation/git-checkout-index.txt
+++ b/third_party/git/Documentation/git-checkout-index.txt
diff --git a/Documentation/git-checkout.txt b/third_party/git/Documentation/git-checkout.txt
index cf3cac0a2b..cf3cac0a2b 100644
--- a/Documentation/git-checkout.txt
+++ b/third_party/git/Documentation/git-checkout.txt
diff --git a/Documentation/git-cherry-pick.txt b/third_party/git/Documentation/git-cherry-pick.txt
index 83ce51aedf..83ce51aedf 100644
--- a/Documentation/git-cherry-pick.txt
+++ b/third_party/git/Documentation/git-cherry-pick.txt
diff --git a/Documentation/git-cherry.txt b/third_party/git/Documentation/git-cherry.txt
index 0ea921a593..0ea921a593 100644
--- a/Documentation/git-cherry.txt
+++ b/third_party/git/Documentation/git-cherry.txt
diff --git a/Documentation/git-citool.txt b/third_party/git/Documentation/git-citool.txt
index c7a11c36c1..c7a11c36c1 100644
--- a/Documentation/git-citool.txt
+++ b/third_party/git/Documentation/git-citool.txt
diff --git a/Documentation/git-clean.txt b/third_party/git/Documentation/git-clean.txt
index 0028ff12d1..0028ff12d1 100644
--- a/Documentation/git-clean.txt
+++ b/third_party/git/Documentation/git-clean.txt
diff --git a/Documentation/git-clone.txt b/third_party/git/Documentation/git-clone.txt
index 34011c2940..34011c2940 100644
--- a/Documentation/git-clone.txt
+++ b/third_party/git/Documentation/git-clone.txt
diff --git a/Documentation/git-column.txt b/third_party/git/Documentation/git-column.txt
index f58e9c43e6..f58e9c43e6 100644
--- a/Documentation/git-column.txt
+++ b/third_party/git/Documentation/git-column.txt
diff --git a/Documentation/git-commit-graph.txt b/third_party/git/Documentation/git-commit-graph.txt
index eb5e7865f0..eb5e7865f0 100644
--- a/Documentation/git-commit-graph.txt
+++ b/third_party/git/Documentation/git-commit-graph.txt
diff --git a/Documentation/git-commit-tree.txt b/third_party/git/Documentation/git-commit-tree.txt
index 4b90b9c12a..4b90b9c12a 100644
--- a/Documentation/git-commit-tree.txt
+++ b/third_party/git/Documentation/git-commit-tree.txt
diff --git a/Documentation/git-commit.txt b/third_party/git/Documentation/git-commit.txt
index 7628193284..7628193284 100644
--- a/Documentation/git-commit.txt
+++ b/third_party/git/Documentation/git-commit.txt
diff --git a/Documentation/git-config.txt b/third_party/git/Documentation/git-config.txt
index ff9310f958..ff9310f958 100644
--- a/Documentation/git-config.txt
+++ b/third_party/git/Documentation/git-config.txt
diff --git a/Documentation/git-count-objects.txt b/third_party/git/Documentation/git-count-objects.txt
index cb9b4d2e46..cb9b4d2e46 100644
--- a/Documentation/git-count-objects.txt
+++ b/third_party/git/Documentation/git-count-objects.txt
diff --git a/Documentation/git-credential-cache--daemon.txt b/third_party/git/Documentation/git-credential-cache--daemon.txt
index 7051c6bdf8..7051c6bdf8 100644
--- a/Documentation/git-credential-cache--daemon.txt
+++ b/third_party/git/Documentation/git-credential-cache--daemon.txt
diff --git a/Documentation/git-credential-cache.txt b/third_party/git/Documentation/git-credential-cache.txt
index 0216c18ef8..0216c18ef8 100644
--- a/Documentation/git-credential-cache.txt
+++ b/third_party/git/Documentation/git-credential-cache.txt
diff --git a/Documentation/git-credential-store.txt b/third_party/git/Documentation/git-credential-store.txt
index 693dd9d9d7..693dd9d9d7 100644
--- a/Documentation/git-credential-store.txt
+++ b/third_party/git/Documentation/git-credential-store.txt
diff --git a/Documentation/git-credential.txt b/third_party/git/Documentation/git-credential.txt
index b211440373..b211440373 100644
--- a/Documentation/git-credential.txt
+++ b/third_party/git/Documentation/git-credential.txt
diff --git a/Documentation/git-cvsexportcommit.txt b/third_party/git/Documentation/git-cvsexportcommit.txt
index 00154b6c85..00154b6c85 100644
--- a/Documentation/git-cvsexportcommit.txt
+++ b/third_party/git/Documentation/git-cvsexportcommit.txt
diff --git a/Documentation/git-cvsimport.txt b/third_party/git/Documentation/git-cvsimport.txt
index de1ebed67d..de1ebed67d 100644
--- a/Documentation/git-cvsimport.txt
+++ b/third_party/git/Documentation/git-cvsimport.txt
diff --git a/Documentation/git-cvsserver.txt b/third_party/git/Documentation/git-cvsserver.txt
index 79e22b1f3a..79e22b1f3a 100644
--- a/Documentation/git-cvsserver.txt
+++ b/third_party/git/Documentation/git-cvsserver.txt
diff --git a/Documentation/git-daemon.txt b/third_party/git/Documentation/git-daemon.txt
index fdc28c041c..fdc28c041c 100644
--- a/Documentation/git-daemon.txt
+++ b/third_party/git/Documentation/git-daemon.txt
diff --git a/Documentation/git-describe.txt b/third_party/git/Documentation/git-describe.txt
index a88f6ae2c6..a88f6ae2c6 100644
--- a/Documentation/git-describe.txt
+++ b/third_party/git/Documentation/git-describe.txt
diff --git a/Documentation/git-diff-files.txt b/third_party/git/Documentation/git-diff-files.txt
index 906774f0f7..906774f0f7 100644
--- a/Documentation/git-diff-files.txt
+++ b/third_party/git/Documentation/git-diff-files.txt
diff --git a/Documentation/git-diff-index.txt b/third_party/git/Documentation/git-diff-index.txt
index f4bd8155c0..f4bd8155c0 100644
--- a/Documentation/git-diff-index.txt
+++ b/third_party/git/Documentation/git-diff-index.txt
diff --git a/Documentation/git-diff-tree.txt b/third_party/git/Documentation/git-diff-tree.txt
index 5c8a2a5e97..5c8a2a5e97 100644
--- a/Documentation/git-diff-tree.txt
+++ b/third_party/git/Documentation/git-diff-tree.txt
diff --git a/Documentation/git-diff.txt b/third_party/git/Documentation/git-diff.txt
index 72179d993c..72179d993c 100644
--- a/Documentation/git-diff.txt
+++ b/third_party/git/Documentation/git-diff.txt
diff --git a/Documentation/git-difftool.txt b/third_party/git/Documentation/git-difftool.txt
index 484c485fd0..484c485fd0 100644
--- a/Documentation/git-difftool.txt
+++ b/third_party/git/Documentation/git-difftool.txt
diff --git a/Documentation/git-fast-export.txt b/third_party/git/Documentation/git-fast-export.txt
index cc940eb9ad..cc940eb9ad 100644
--- a/Documentation/git-fast-export.txt
+++ b/third_party/git/Documentation/git-fast-export.txt
diff --git a/Documentation/git-fast-import.txt b/third_party/git/Documentation/git-fast-import.txt
index fad327aecc..fad327aecc 100644
--- a/Documentation/git-fast-import.txt
+++ b/third_party/git/Documentation/git-fast-import.txt
diff --git a/Documentation/git-fetch-pack.txt b/third_party/git/Documentation/git-fetch-pack.txt
index c975884793..c975884793 100644
--- a/Documentation/git-fetch-pack.txt
+++ b/third_party/git/Documentation/git-fetch-pack.txt
diff --git a/Documentation/git-fetch.txt b/third_party/git/Documentation/git-fetch.txt
index 5b1909fdf4..5b1909fdf4 100644
--- a/Documentation/git-fetch.txt
+++ b/third_party/git/Documentation/git-fetch.txt
diff --git a/Documentation/git-filter-branch.txt b/third_party/git/Documentation/git-filter-branch.txt
index 6b53dd7e06..6b53dd7e06 100644
--- a/Documentation/git-filter-branch.txt
+++ b/third_party/git/Documentation/git-filter-branch.txt
diff --git a/Documentation/git-fmt-merge-msg.txt b/third_party/git/Documentation/git-fmt-merge-msg.txt
index 6793d8fc05..6793d8fc05 100644
--- a/Documentation/git-fmt-merge-msg.txt
+++ b/third_party/git/Documentation/git-fmt-merge-msg.txt
diff --git a/Documentation/git-for-each-ref.txt b/third_party/git/Documentation/git-for-each-ref.txt
index 6dcd39f6f6..6dcd39f6f6 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/third_party/git/Documentation/git-for-each-ref.txt
diff --git a/Documentation/git-format-patch.txt b/third_party/git/Documentation/git-format-patch.txt
index b9b97e63ae..b9b97e63ae 100644
--- a/Documentation/git-format-patch.txt
+++ b/third_party/git/Documentation/git-format-patch.txt
diff --git a/Documentation/git-fsck-objects.txt b/third_party/git/Documentation/git-fsck-objects.txt
index eec4bdb600..eec4bdb600 100644
--- a/Documentation/git-fsck-objects.txt
+++ b/third_party/git/Documentation/git-fsck-objects.txt
diff --git a/Documentation/git-fsck.txt b/third_party/git/Documentation/git-fsck.txt
index d72d15be5b..d72d15be5b 100644
--- a/Documentation/git-fsck.txt
+++ b/third_party/git/Documentation/git-fsck.txt
diff --git a/Documentation/git-gc.txt b/third_party/git/Documentation/git-gc.txt
index 247f765604..247f765604 100644
--- a/Documentation/git-gc.txt
+++ b/third_party/git/Documentation/git-gc.txt
diff --git a/Documentation/git-get-tar-commit-id.txt b/third_party/git/Documentation/git-get-tar-commit-id.txt
index ac44d85b0b..ac44d85b0b 100644
--- a/Documentation/git-get-tar-commit-id.txt
+++ b/third_party/git/Documentation/git-get-tar-commit-id.txt
diff --git a/Documentation/git-grep.txt b/third_party/git/Documentation/git-grep.txt
index 2d27969057..2d27969057 100644
--- a/Documentation/git-grep.txt
+++ b/third_party/git/Documentation/git-grep.txt
diff --git a/Documentation/git-gui.txt b/third_party/git/Documentation/git-gui.txt
index 5f93f8003d..5f93f8003d 100644
--- a/Documentation/git-gui.txt
+++ b/third_party/git/Documentation/git-gui.txt
diff --git a/Documentation/git-hash-object.txt b/third_party/git/Documentation/git-hash-object.txt
index df9e2c58bd..df9e2c58bd 100644
--- a/Documentation/git-hash-object.txt
+++ b/third_party/git/Documentation/git-hash-object.txt
diff --git a/Documentation/git-help.txt b/third_party/git/Documentation/git-help.txt
index f71db0daa2..f71db0daa2 100644
--- a/Documentation/git-help.txt
+++ b/third_party/git/Documentation/git-help.txt
diff --git a/Documentation/git-http-backend.txt b/third_party/git/Documentation/git-http-backend.txt
index 558966aa83..558966aa83 100644
--- a/Documentation/git-http-backend.txt
+++ b/third_party/git/Documentation/git-http-backend.txt
diff --git a/Documentation/git-http-fetch.txt b/third_party/git/Documentation/git-http-fetch.txt
index 666b042679..666b042679 100644
--- a/Documentation/git-http-fetch.txt
+++ b/third_party/git/Documentation/git-http-fetch.txt
diff --git a/Documentation/git-http-push.txt b/third_party/git/Documentation/git-http-push.txt
index ea03a4eeb0..ea03a4eeb0 100644
--- a/Documentation/git-http-push.txt
+++ b/third_party/git/Documentation/git-http-push.txt
diff --git a/Documentation/git-imap-send.txt b/third_party/git/Documentation/git-imap-send.txt
index 65b53fcc47..65b53fcc47 100644
--- a/Documentation/git-imap-send.txt
+++ b/third_party/git/Documentation/git-imap-send.txt
diff --git a/Documentation/git-index-pack.txt b/third_party/git/Documentation/git-index-pack.txt
index d5b7560bfe..d5b7560bfe 100644
--- a/Documentation/git-index-pack.txt
+++ b/third_party/git/Documentation/git-index-pack.txt
diff --git a/Documentation/git-init-db.txt b/third_party/git/Documentation/git-init-db.txt
index 648a6cd78a..648a6cd78a 100644
--- a/Documentation/git-init-db.txt
+++ b/third_party/git/Documentation/git-init-db.txt
diff --git a/Documentation/git-init.txt b/third_party/git/Documentation/git-init.txt
index 32880aafb0..32880aafb0 100644
--- a/Documentation/git-init.txt
+++ b/third_party/git/Documentation/git-init.txt
diff --git a/Documentation/git-instaweb.txt b/third_party/git/Documentation/git-instaweb.txt
index a54fe4401b..a54fe4401b 100644
--- a/Documentation/git-instaweb.txt
+++ b/third_party/git/Documentation/git-instaweb.txt
diff --git a/Documentation/git-interpret-trailers.txt b/third_party/git/Documentation/git-interpret-trailers.txt
index 96ec6499f0..96ec6499f0 100644
--- a/Documentation/git-interpret-trailers.txt
+++ b/third_party/git/Documentation/git-interpret-trailers.txt
diff --git a/Documentation/git-log.txt b/third_party/git/Documentation/git-log.txt
index b406bc4c48..b406bc4c48 100644
--- a/Documentation/git-log.txt
+++ b/third_party/git/Documentation/git-log.txt
diff --git a/Documentation/git-ls-files.txt b/third_party/git/Documentation/git-ls-files.txt
index 8461c0e83e..8461c0e83e 100644
--- a/Documentation/git-ls-files.txt
+++ b/third_party/git/Documentation/git-ls-files.txt
diff --git a/Documentation/git-ls-remote.txt b/third_party/git/Documentation/git-ls-remote.txt
index 0b057cbb10..0b057cbb10 100644
--- a/Documentation/git-ls-remote.txt
+++ b/third_party/git/Documentation/git-ls-remote.txt
diff --git a/Documentation/git-ls-tree.txt b/third_party/git/Documentation/git-ls-tree.txt
index a7515714da..a7515714da 100644
--- a/Documentation/git-ls-tree.txt
+++ b/third_party/git/Documentation/git-ls-tree.txt
diff --git a/Documentation/git-mailinfo.txt b/third_party/git/Documentation/git-mailinfo.txt
index 3bbc731f67..3bbc731f67 100644
--- a/Documentation/git-mailinfo.txt
+++ b/third_party/git/Documentation/git-mailinfo.txt
diff --git a/Documentation/git-mailsplit.txt b/third_party/git/Documentation/git-mailsplit.txt
index e3b2a88c4b..e3b2a88c4b 100644
--- a/Documentation/git-mailsplit.txt
+++ b/third_party/git/Documentation/git-mailsplit.txt
diff --git a/Documentation/git-merge-base.txt b/third_party/git/Documentation/git-merge-base.txt
index 261d5c1164..261d5c1164 100644
--- a/Documentation/git-merge-base.txt
+++ b/third_party/git/Documentation/git-merge-base.txt
diff --git a/Documentation/git-merge-file.txt b/third_party/git/Documentation/git-merge-file.txt
index f856032613..f856032613 100644
--- a/Documentation/git-merge-file.txt
+++ b/third_party/git/Documentation/git-merge-file.txt
diff --git a/Documentation/git-merge-index.txt b/third_party/git/Documentation/git-merge-index.txt
index 02676fb391..02676fb391 100644
--- a/Documentation/git-merge-index.txt
+++ b/third_party/git/Documentation/git-merge-index.txt
diff --git a/Documentation/git-merge-one-file.txt b/third_party/git/Documentation/git-merge-one-file.txt
index 04e803d5d3..04e803d5d3 100644
--- a/Documentation/git-merge-one-file.txt
+++ b/third_party/git/Documentation/git-merge-one-file.txt
diff --git a/Documentation/git-merge-tree.txt b/third_party/git/Documentation/git-merge-tree.txt
index 58731c1942..58731c1942 100644
--- a/Documentation/git-merge-tree.txt
+++ b/third_party/git/Documentation/git-merge-tree.txt
diff --git a/Documentation/git-merge.txt b/third_party/git/Documentation/git-merge.txt
index 01fd52dc70..01fd52dc70 100644
--- a/Documentation/git-merge.txt
+++ b/third_party/git/Documentation/git-merge.txt
diff --git a/Documentation/git-mergetool--lib.txt b/third_party/git/Documentation/git-mergetool--lib.txt
index 4da9d24096..4da9d24096 100644
--- a/Documentation/git-mergetool--lib.txt
+++ b/third_party/git/Documentation/git-mergetool--lib.txt
diff --git a/Documentation/git-mergetool.txt b/third_party/git/Documentation/git-mergetool.txt
index 6b14702e78..6b14702e78 100644
--- a/Documentation/git-mergetool.txt
+++ b/third_party/git/Documentation/git-mergetool.txt
diff --git a/Documentation/git-mktag.txt b/third_party/git/Documentation/git-mktag.txt
index fa6a756123..fa6a756123 100644
--- a/Documentation/git-mktag.txt
+++ b/third_party/git/Documentation/git-mktag.txt
diff --git a/Documentation/git-mktree.txt b/third_party/git/Documentation/git-mktree.txt
index 27fe2b32e1..27fe2b32e1 100644
--- a/Documentation/git-mktree.txt
+++ b/third_party/git/Documentation/git-mktree.txt
diff --git a/Documentation/git-multi-pack-index.txt b/third_party/git/Documentation/git-multi-pack-index.txt
index 233b2b7862..233b2b7862 100644
--- a/Documentation/git-multi-pack-index.txt
+++ b/third_party/git/Documentation/git-multi-pack-index.txt
diff --git a/Documentation/git-mv.txt b/third_party/git/Documentation/git-mv.txt
index 79449bf98f..79449bf98f 100644
--- a/Documentation/git-mv.txt
+++ b/third_party/git/Documentation/git-mv.txt
diff --git a/Documentation/git-name-rev.txt b/third_party/git/Documentation/git-name-rev.txt
index 5cb0eb0855..5cb0eb0855 100644
--- a/Documentation/git-name-rev.txt
+++ b/third_party/git/Documentation/git-name-rev.txt
diff --git a/Documentation/git-notes.txt b/third_party/git/Documentation/git-notes.txt
index f56a5a9197..f56a5a9197 100644
--- a/Documentation/git-notes.txt
+++ b/third_party/git/Documentation/git-notes.txt
diff --git a/Documentation/git-p4.txt b/third_party/git/Documentation/git-p4.txt
index 3494a1db3e..3494a1db3e 100644
--- a/Documentation/git-p4.txt
+++ b/third_party/git/Documentation/git-p4.txt
diff --git a/Documentation/git-pack-objects.txt b/third_party/git/Documentation/git-pack-objects.txt
index fecdf2600c..fecdf2600c 100644
--- a/Documentation/git-pack-objects.txt
+++ b/third_party/git/Documentation/git-pack-objects.txt
diff --git a/Documentation/git-pack-redundant.txt b/third_party/git/Documentation/git-pack-redundant.txt
index f2869da572..f2869da572 100644
--- a/Documentation/git-pack-redundant.txt
+++ b/third_party/git/Documentation/git-pack-redundant.txt
diff --git a/Documentation/git-pack-refs.txt b/third_party/git/Documentation/git-pack-refs.txt
index 154081f2de..154081f2de 100644
--- a/Documentation/git-pack-refs.txt
+++ b/third_party/git/Documentation/git-pack-refs.txt
diff --git a/Documentation/git-parse-remote.txt b/third_party/git/Documentation/git-parse-remote.txt
index a45ea1ece8..a45ea1ece8 100644
--- a/Documentation/git-parse-remote.txt
+++ b/third_party/git/Documentation/git-parse-remote.txt
diff --git a/Documentation/git-patch-id.txt b/third_party/git/Documentation/git-patch-id.txt
index 442caff8a9..442caff8a9 100644
--- a/Documentation/git-patch-id.txt
+++ b/third_party/git/Documentation/git-patch-id.txt
diff --git a/Documentation/git-prune-packed.txt b/third_party/git/Documentation/git-prune-packed.txt
index 9fed59a317..9fed59a317 100644
--- a/Documentation/git-prune-packed.txt
+++ b/third_party/git/Documentation/git-prune-packed.txt
diff --git a/Documentation/git-prune.txt b/third_party/git/Documentation/git-prune.txt
index 03552dd86f..03552dd86f 100644
--- a/Documentation/git-prune.txt
+++ b/third_party/git/Documentation/git-prune.txt
diff --git a/Documentation/git-pull.txt b/third_party/git/Documentation/git-pull.txt
index dfb901f8b8..dfb901f8b8 100644
--- a/Documentation/git-pull.txt
+++ b/third_party/git/Documentation/git-pull.txt
diff --git a/Documentation/git-push.txt b/third_party/git/Documentation/git-push.txt
index 3b8053447e..3b8053447e 100644
--- a/Documentation/git-push.txt
+++ b/third_party/git/Documentation/git-push.txt
diff --git a/Documentation/git-quiltimport.txt b/third_party/git/Documentation/git-quiltimport.txt
index 70562dc4c0..70562dc4c0 100644
--- a/Documentation/git-quiltimport.txt
+++ b/third_party/git/Documentation/git-quiltimport.txt
diff --git a/Documentation/git-range-diff.txt b/third_party/git/Documentation/git-range-diff.txt
index 8a6ea2c6c5..8a6ea2c6c5 100644
--- a/Documentation/git-range-diff.txt
+++ b/third_party/git/Documentation/git-range-diff.txt
diff --git a/Documentation/git-read-tree.txt b/third_party/git/Documentation/git-read-tree.txt
index d271842608..d271842608 100644
--- a/Documentation/git-read-tree.txt
+++ b/third_party/git/Documentation/git-read-tree.txt
diff --git a/Documentation/git-rebase.txt b/third_party/git/Documentation/git-rebase.txt
index 6156609cf7..6156609cf7 100644
--- a/Documentation/git-rebase.txt
+++ b/third_party/git/Documentation/git-rebase.txt
diff --git a/Documentation/git-receive-pack.txt b/third_party/git/Documentation/git-receive-pack.txt
index dedf97efbb..dedf97efbb 100644
--- a/Documentation/git-receive-pack.txt
+++ b/third_party/git/Documentation/git-receive-pack.txt
diff --git a/Documentation/git-reflog.txt b/third_party/git/Documentation/git-reflog.txt
index ff487ff77d..ff487ff77d 100644
--- a/Documentation/git-reflog.txt
+++ b/third_party/git/Documentation/git-reflog.txt
diff --git a/Documentation/git-remote-ext.txt b/third_party/git/Documentation/git-remote-ext.txt
index 88ea7e1cc0..88ea7e1cc0 100644
--- a/Documentation/git-remote-ext.txt
+++ b/third_party/git/Documentation/git-remote-ext.txt
diff --git a/Documentation/git-remote-fd.txt b/third_party/git/Documentation/git-remote-fd.txt
index 0451ceb8a2..0451ceb8a2 100644
--- a/Documentation/git-remote-fd.txt
+++ b/third_party/git/Documentation/git-remote-fd.txt
diff --git a/Documentation/git-remote-helpers.txto b/third_party/git/Documentation/git-remote-helpers.txto
index 6f353ebfd3..6f353ebfd3 100644
--- a/Documentation/git-remote-helpers.txto
+++ b/third_party/git/Documentation/git-remote-helpers.txto
diff --git a/Documentation/git-remote.txt b/third_party/git/Documentation/git-remote.txt
index 9659abbf8e..9659abbf8e 100644
--- a/Documentation/git-remote.txt
+++ b/third_party/git/Documentation/git-remote.txt
diff --git a/Documentation/git-repack.txt b/third_party/git/Documentation/git-repack.txt
index 92f146d27d..92f146d27d 100644
--- a/Documentation/git-repack.txt
+++ b/third_party/git/Documentation/git-repack.txt
diff --git a/Documentation/git-replace.txt b/third_party/git/Documentation/git-replace.txt
index 246dc9943c..246dc9943c 100644
--- a/Documentation/git-replace.txt
+++ b/third_party/git/Documentation/git-replace.txt
diff --git a/Documentation/git-request-pull.txt b/third_party/git/Documentation/git-request-pull.txt
index 4d4392d0f8..4d4392d0f8 100644
--- a/Documentation/git-request-pull.txt
+++ b/third_party/git/Documentation/git-request-pull.txt
diff --git a/Documentation/git-rerere.txt b/third_party/git/Documentation/git-rerere.txt
index 4cfc883378..4cfc883378 100644
--- a/Documentation/git-rerere.txt
+++ b/third_party/git/Documentation/git-rerere.txt
diff --git a/Documentation/git-reset.txt b/third_party/git/Documentation/git-reset.txt
index 97e0544d9e..97e0544d9e 100644
--- a/Documentation/git-reset.txt
+++ b/third_party/git/Documentation/git-reset.txt
diff --git a/Documentation/git-restore.txt b/third_party/git/Documentation/git-restore.txt
index 1ab2e40ea9..1ab2e40ea9 100644
--- a/Documentation/git-restore.txt
+++ b/third_party/git/Documentation/git-restore.txt
diff --git a/Documentation/git-rev-list.txt b/third_party/git/Documentation/git-rev-list.txt
index 9392760b25..9392760b25 100644
--- a/Documentation/git-rev-list.txt
+++ b/third_party/git/Documentation/git-rev-list.txt
diff --git a/Documentation/git-rev-parse.txt b/third_party/git/Documentation/git-rev-parse.txt
index e72d332b83..e72d332b83 100644
--- a/Documentation/git-rev-parse.txt
+++ b/third_party/git/Documentation/git-rev-parse.txt
diff --git a/Documentation/git-revert.txt b/third_party/git/Documentation/git-revert.txt
index 9d22270757..9d22270757 100644
--- a/Documentation/git-revert.txt
+++ b/third_party/git/Documentation/git-revert.txt
diff --git a/Documentation/git-rm.txt b/third_party/git/Documentation/git-rm.txt
index b5c46223c4..b5c46223c4 100644
--- a/Documentation/git-rm.txt
+++ b/third_party/git/Documentation/git-rm.txt
diff --git a/Documentation/git-send-email.txt b/third_party/git/Documentation/git-send-email.txt
index d93e5d0f58..d93e5d0f58 100644
--- a/Documentation/git-send-email.txt
+++ b/third_party/git/Documentation/git-send-email.txt
diff --git a/Documentation/git-send-pack.txt b/third_party/git/Documentation/git-send-pack.txt
index 44fd146b91..44fd146b91 100644
--- a/Documentation/git-send-pack.txt
+++ b/third_party/git/Documentation/git-send-pack.txt
diff --git a/Documentation/git-sh-i18n--envsubst.txt b/third_party/git/Documentation/git-sh-i18n--envsubst.txt
index 2ffaf9392e..2ffaf9392e 100644
--- a/Documentation/git-sh-i18n--envsubst.txt
+++ b/third_party/git/Documentation/git-sh-i18n--envsubst.txt
diff --git a/Documentation/git-sh-i18n.txt b/third_party/git/Documentation/git-sh-i18n.txt
index 60cf49cb2a..60cf49cb2a 100644
--- a/Documentation/git-sh-i18n.txt
+++ b/third_party/git/Documentation/git-sh-i18n.txt
diff --git a/Documentation/git-sh-setup.txt b/third_party/git/Documentation/git-sh-setup.txt
index 8632612c31..8632612c31 100644
--- a/Documentation/git-sh-setup.txt
+++ b/third_party/git/Documentation/git-sh-setup.txt
diff --git a/Documentation/git-shell.txt b/third_party/git/Documentation/git-shell.txt
index 11361f33e9..11361f33e9 100644
--- a/Documentation/git-shell.txt
+++ b/third_party/git/Documentation/git-shell.txt
diff --git a/Documentation/git-shortlog.txt b/third_party/git/Documentation/git-shortlog.txt
index bc80905a8a..bc80905a8a 100644
--- a/Documentation/git-shortlog.txt
+++ b/third_party/git/Documentation/git-shortlog.txt
diff --git a/Documentation/git-show-branch.txt b/third_party/git/Documentation/git-show-branch.txt
index 5cc2fcefba..5cc2fcefba 100644
--- a/Documentation/git-show-branch.txt
+++ b/third_party/git/Documentation/git-show-branch.txt
diff --git a/Documentation/git-show-index.txt b/third_party/git/Documentation/git-show-index.txt
index 424e4ba84c..424e4ba84c 100644
--- a/Documentation/git-show-index.txt
+++ b/third_party/git/Documentation/git-show-index.txt
diff --git a/Documentation/git-show-ref.txt b/third_party/git/Documentation/git-show-ref.txt
index ab4d271925..ab4d271925 100644
--- a/Documentation/git-show-ref.txt
+++ b/third_party/git/Documentation/git-show-ref.txt
diff --git a/Documentation/git-show.txt b/third_party/git/Documentation/git-show.txt
index fcf528c1b3..fcf528c1b3 100644
--- a/Documentation/git-show.txt
+++ b/third_party/git/Documentation/git-show.txt
diff --git a/Documentation/git-stage.txt b/third_party/git/Documentation/git-stage.txt
index 25bcda936d..25bcda936d 100644
--- a/Documentation/git-stage.txt
+++ b/third_party/git/Documentation/git-stage.txt
diff --git a/Documentation/git-stash.txt b/third_party/git/Documentation/git-stash.txt
index 8fbe12c66c..8fbe12c66c 100644
--- a/Documentation/git-stash.txt
+++ b/third_party/git/Documentation/git-stash.txt
diff --git a/Documentation/git-status.txt b/third_party/git/Documentation/git-status.txt
index d4e8f24f0c..d4e8f24f0c 100644
--- a/Documentation/git-status.txt
+++ b/third_party/git/Documentation/git-status.txt
diff --git a/Documentation/git-stripspace.txt b/third_party/git/Documentation/git-stripspace.txt
index 2438f76da0..2438f76da0 100644
--- a/Documentation/git-stripspace.txt
+++ b/third_party/git/Documentation/git-stripspace.txt
diff --git a/Documentation/git-submodule.txt b/third_party/git/Documentation/git-submodule.txt
index 0ed5c24dc1..0ed5c24dc1 100644
--- a/Documentation/git-submodule.txt
+++ b/third_party/git/Documentation/git-submodule.txt
diff --git a/Documentation/git-svn.txt b/third_party/git/Documentation/git-svn.txt
index 30711625fd..30711625fd 100644
--- a/Documentation/git-svn.txt
+++ b/third_party/git/Documentation/git-svn.txt
diff --git a/Documentation/git-switch.txt b/third_party/git/Documentation/git-switch.txt
index 197900363b..197900363b 100644
--- a/Documentation/git-switch.txt
+++ b/third_party/git/Documentation/git-switch.txt
diff --git a/Documentation/git-symbolic-ref.txt b/third_party/git/Documentation/git-symbolic-ref.txt
index ef68ad2b71..ef68ad2b71 100644
--- a/Documentation/git-symbolic-ref.txt
+++ b/third_party/git/Documentation/git-symbolic-ref.txt
diff --git a/Documentation/git-tag.txt b/third_party/git/Documentation/git-tag.txt
index 2e5599a67f..2e5599a67f 100644
--- a/Documentation/git-tag.txt
+++ b/third_party/git/Documentation/git-tag.txt
diff --git a/Documentation/git-tools.txt b/third_party/git/Documentation/git-tools.txt
index d0fec4cddd..d0fec4cddd 100644
--- a/Documentation/git-tools.txt
+++ b/third_party/git/Documentation/git-tools.txt
diff --git a/Documentation/git-unpack-file.txt b/third_party/git/Documentation/git-unpack-file.txt
index e9f148a00d..e9f148a00d 100644
--- a/Documentation/git-unpack-file.txt
+++ b/third_party/git/Documentation/git-unpack-file.txt
diff --git a/Documentation/git-unpack-objects.txt b/third_party/git/Documentation/git-unpack-objects.txt
index b3de50d710..b3de50d710 100644
--- a/Documentation/git-unpack-objects.txt
+++ b/third_party/git/Documentation/git-unpack-objects.txt
diff --git a/Documentation/git-update-index.txt b/third_party/git/Documentation/git-update-index.txt
index 1c4d146a41..1c4d146a41 100644
--- a/Documentation/git-update-index.txt
+++ b/third_party/git/Documentation/git-update-index.txt
diff --git a/Documentation/git-update-ref.txt b/third_party/git/Documentation/git-update-ref.txt
index 9671423117..9671423117 100644
--- a/Documentation/git-update-ref.txt
+++ b/third_party/git/Documentation/git-update-ref.txt
diff --git a/Documentation/git-update-server-info.txt b/third_party/git/Documentation/git-update-server-info.txt
index 969bb2e15f..969bb2e15f 100644
--- a/Documentation/git-update-server-info.txt
+++ b/third_party/git/Documentation/git-update-server-info.txt
diff --git a/Documentation/git-upload-archive.txt b/third_party/git/Documentation/git-upload-archive.txt
index fba0f1c1b2..fba0f1c1b2 100644
--- a/Documentation/git-upload-archive.txt
+++ b/third_party/git/Documentation/git-upload-archive.txt
diff --git a/Documentation/git-upload-pack.txt b/third_party/git/Documentation/git-upload-pack.txt
index 9822c1eb1a..9822c1eb1a 100644
--- a/Documentation/git-upload-pack.txt
+++ b/third_party/git/Documentation/git-upload-pack.txt
diff --git a/Documentation/git-var.txt b/third_party/git/Documentation/git-var.txt
index 6072f936ab..6072f936ab 100644
--- a/Documentation/git-var.txt
+++ b/third_party/git/Documentation/git-var.txt
diff --git a/Documentation/git-verify-commit.txt b/third_party/git/Documentation/git-verify-commit.txt
index 92097f6673..92097f6673 100644
--- a/Documentation/git-verify-commit.txt
+++ b/third_party/git/Documentation/git-verify-commit.txt
diff --git a/Documentation/git-verify-pack.txt b/third_party/git/Documentation/git-verify-pack.txt
index 61ca6d04c2..61ca6d04c2 100644
--- a/Documentation/git-verify-pack.txt
+++ b/third_party/git/Documentation/git-verify-pack.txt
diff --git a/Documentation/git-verify-tag.txt b/third_party/git/Documentation/git-verify-tag.txt
index 0b8075dad9..0b8075dad9 100644
--- a/Documentation/git-verify-tag.txt
+++ b/third_party/git/Documentation/git-verify-tag.txt
diff --git a/Documentation/git-web--browse.txt b/third_party/git/Documentation/git-web--browse.txt
index 8d162b56c5..8d162b56c5 100644
--- a/Documentation/git-web--browse.txt
+++ b/third_party/git/Documentation/git-web--browse.txt
diff --git a/Documentation/git-whatchanged.txt b/third_party/git/Documentation/git-whatchanged.txt
index 8b63ceb00e..8b63ceb00e 100644
--- a/Documentation/git-whatchanged.txt
+++ b/third_party/git/Documentation/git-whatchanged.txt
diff --git a/Documentation/git-worktree.txt b/third_party/git/Documentation/git-worktree.txt
index 85d92c9761..85d92c9761 100644
--- a/Documentation/git-worktree.txt
+++ b/third_party/git/Documentation/git-worktree.txt
diff --git a/Documentation/git-write-tree.txt b/third_party/git/Documentation/git-write-tree.txt
index f22041a9dc..f22041a9dc 100644
--- a/Documentation/git-write-tree.txt
+++ b/third_party/git/Documentation/git-write-tree.txt
diff --git a/Documentation/git.txt b/third_party/git/Documentation/git.txt
index 9b82564d1a..9b82564d1a 100644
--- a/Documentation/git.txt
+++ b/third_party/git/Documentation/git.txt
diff --git a/Documentation/gitattributes.txt b/third_party/git/Documentation/gitattributes.txt
index fb1d188d44..fb1d188d44 100644
--- a/Documentation/gitattributes.txt
+++ b/third_party/git/Documentation/gitattributes.txt
diff --git a/Documentation/gitcli.txt b/third_party/git/Documentation/gitcli.txt
index 1ed3ca33b7..1ed3ca33b7 100644
--- a/Documentation/gitcli.txt
+++ b/third_party/git/Documentation/gitcli.txt
diff --git a/Documentation/gitcore-tutorial.txt b/third_party/git/Documentation/gitcore-tutorial.txt
index f880d21dfb..f880d21dfb 100644
--- a/Documentation/gitcore-tutorial.txt
+++ b/third_party/git/Documentation/gitcore-tutorial.txt
diff --git a/Documentation/gitcredentials.txt b/third_party/git/Documentation/gitcredentials.txt
index adc759612d..adc759612d 100644
--- a/Documentation/gitcredentials.txt
+++ b/third_party/git/Documentation/gitcredentials.txt
diff --git a/Documentation/gitcvs-migration.txt b/third_party/git/Documentation/gitcvs-migration.txt
index 1cd1283d0f..1cd1283d0f 100644
--- a/Documentation/gitcvs-migration.txt
+++ b/third_party/git/Documentation/gitcvs-migration.txt
diff --git a/Documentation/gitdiffcore.txt b/third_party/git/Documentation/gitdiffcore.txt
index c970d9fe43..c970d9fe43 100644
--- a/Documentation/gitdiffcore.txt
+++ b/third_party/git/Documentation/gitdiffcore.txt
diff --git a/Documentation/giteveryday.txt b/third_party/git/Documentation/giteveryday.txt
index 1bd919f92b..1bd919f92b 100644
--- a/Documentation/giteveryday.txt
+++ b/third_party/git/Documentation/giteveryday.txt
diff --git a/Documentation/gitglossary.txt b/third_party/git/Documentation/gitglossary.txt
index 571f640f5c..571f640f5c 100644
--- a/Documentation/gitglossary.txt
+++ b/third_party/git/Documentation/gitglossary.txt
diff --git a/Documentation/githooks.txt b/third_party/git/Documentation/githooks.txt
index 82cd573776..82cd573776 100644
--- a/Documentation/githooks.txt
+++ b/third_party/git/Documentation/githooks.txt
diff --git a/Documentation/gitignore.txt b/third_party/git/Documentation/gitignore.txt
index d47b1ae296..d47b1ae296 100644
--- a/Documentation/gitignore.txt
+++ b/third_party/git/Documentation/gitignore.txt
diff --git a/Documentation/gitk.txt b/third_party/git/Documentation/gitk.txt
index 1eabb0aaf3..1eabb0aaf3 100644
--- a/Documentation/gitk.txt
+++ b/third_party/git/Documentation/gitk.txt
diff --git a/Documentation/gitmodules.txt b/third_party/git/Documentation/gitmodules.txt
index a66e95b70c..a66e95b70c 100644
--- a/Documentation/gitmodules.txt
+++ b/third_party/git/Documentation/gitmodules.txt
diff --git a/Documentation/gitnamespaces.txt b/third_party/git/Documentation/gitnamespaces.txt
index b614969ad2..b614969ad2 100644
--- a/Documentation/gitnamespaces.txt
+++ b/third_party/git/Documentation/gitnamespaces.txt
diff --git a/Documentation/gitremote-helpers.txt b/third_party/git/Documentation/gitremote-helpers.txt
index 43f80c8068..43f80c8068 100644
--- a/Documentation/gitremote-helpers.txt
+++ b/third_party/git/Documentation/gitremote-helpers.txt
diff --git a/Documentation/gitrepository-layout.txt b/third_party/git/Documentation/gitrepository-layout.txt
index 216b11ee88..216b11ee88 100644
--- a/Documentation/gitrepository-layout.txt
+++ b/third_party/git/Documentation/gitrepository-layout.txt
diff --git a/Documentation/gitrevisions.txt b/third_party/git/Documentation/gitrevisions.txt
index d407b7dee1..d407b7dee1 100644
--- a/Documentation/gitrevisions.txt
+++ b/third_party/git/Documentation/gitrevisions.txt
diff --git a/Documentation/gitsubmodules.txt b/third_party/git/Documentation/gitsubmodules.txt
index 0a890205b8..0a890205b8 100644
--- a/Documentation/gitsubmodules.txt
+++ b/third_party/git/Documentation/gitsubmodules.txt
diff --git a/Documentation/gittutorial-2.txt b/third_party/git/Documentation/gittutorial-2.txt
index 8bdb7d0bd3..8bdb7d0bd3 100644
--- a/Documentation/gittutorial-2.txt
+++ b/third_party/git/Documentation/gittutorial-2.txt
diff --git a/Documentation/gittutorial.txt b/third_party/git/Documentation/gittutorial.txt
index 59ef5cef1f..59ef5cef1f 100644
--- a/Documentation/gittutorial.txt
+++ b/third_party/git/Documentation/gittutorial.txt
diff --git a/Documentation/gitweb.conf.txt b/third_party/git/Documentation/gitweb.conf.txt
index 35317e71c8..35317e71c8 100644
--- a/Documentation/gitweb.conf.txt
+++ b/third_party/git/Documentation/gitweb.conf.txt
diff --git a/Documentation/gitweb.txt b/third_party/git/Documentation/gitweb.txt
index 3cc9b034c4..3cc9b034c4 100644
--- a/Documentation/gitweb.txt
+++ b/third_party/git/Documentation/gitweb.txt
diff --git a/Documentation/gitworkflows.txt b/third_party/git/Documentation/gitworkflows.txt
index abc0dc6bc7..abc0dc6bc7 100644
--- a/Documentation/gitworkflows.txt
+++ b/third_party/git/Documentation/gitworkflows.txt
diff --git a/Documentation/glossary-content.txt b/third_party/git/Documentation/glossary-content.txt
index 090c888335..090c888335 100644
--- a/Documentation/glossary-content.txt
+++ b/third_party/git/Documentation/glossary-content.txt
diff --git a/Documentation/howto-index.sh b/third_party/git/Documentation/howto-index.sh
index 167b363668..167b363668 100755
--- a/Documentation/howto-index.sh
+++ b/third_party/git/Documentation/howto-index.sh
diff --git a/Documentation/howto/keep-canonical-history-correct.txt b/third_party/git/Documentation/howto/keep-canonical-history-correct.txt
index 35d48ef714..35d48ef714 100644
--- a/Documentation/howto/keep-canonical-history-correct.txt
+++ b/third_party/git/Documentation/howto/keep-canonical-history-correct.txt
diff --git a/Documentation/howto/maintain-git.txt b/third_party/git/Documentation/howto/maintain-git.txt
index ca4378740c..ca4378740c 100644
--- a/Documentation/howto/maintain-git.txt
+++ b/third_party/git/Documentation/howto/maintain-git.txt
diff --git a/Documentation/howto/new-command.txt b/third_party/git/Documentation/howto/new-command.txt
index 15a4c8031f..15a4c8031f 100644
--- a/Documentation/howto/new-command.txt
+++ b/third_party/git/Documentation/howto/new-command.txt
diff --git a/Documentation/howto/rebase-from-internal-branch.txt b/third_party/git/Documentation/howto/rebase-from-internal-branch.txt
index 02cb5f758d..02cb5f758d 100644
--- a/Documentation/howto/rebase-from-internal-branch.txt
+++ b/third_party/git/Documentation/howto/rebase-from-internal-branch.txt
diff --git a/Documentation/howto/rebuild-from-update-hook.txt b/third_party/git/Documentation/howto/rebuild-from-update-hook.txt
index db219f5c07..db219f5c07 100644
--- a/Documentation/howto/rebuild-from-update-hook.txt
+++ b/third_party/git/Documentation/howto/rebuild-from-update-hook.txt
diff --git a/Documentation/howto/recover-corrupted-blob-object.txt b/third_party/git/Documentation/howto/recover-corrupted-blob-object.txt
index 1b3b188d3c..1b3b188d3c 100644
--- a/Documentation/howto/recover-corrupted-blob-object.txt
+++ b/third_party/git/Documentation/howto/recover-corrupted-blob-object.txt
diff --git a/Documentation/howto/recover-corrupted-object-harder.txt b/third_party/git/Documentation/howto/recover-corrupted-object-harder.txt
index 8994e2559e..8994e2559e 100644
--- a/Documentation/howto/recover-corrupted-object-harder.txt
+++ b/third_party/git/Documentation/howto/recover-corrupted-object-harder.txt
diff --git a/Documentation/howto/revert-a-faulty-merge.txt b/third_party/git/Documentation/howto/revert-a-faulty-merge.txt
index 19f59cc888..19f59cc888 100644
--- a/Documentation/howto/revert-a-faulty-merge.txt
+++ b/third_party/git/Documentation/howto/revert-a-faulty-merge.txt
diff --git a/Documentation/howto/revert-branch-rebase.txt b/third_party/git/Documentation/howto/revert-branch-rebase.txt
index 149508e13b..149508e13b 100644
--- a/Documentation/howto/revert-branch-rebase.txt
+++ b/third_party/git/Documentation/howto/revert-branch-rebase.txt
diff --git a/Documentation/howto/separating-topic-branches.txt b/third_party/git/Documentation/howto/separating-topic-branches.txt
index bd1027433b..bd1027433b 100644
--- a/Documentation/howto/separating-topic-branches.txt
+++ b/third_party/git/Documentation/howto/separating-topic-branches.txt
diff --git a/Documentation/howto/setup-git-server-over-http.txt b/third_party/git/Documentation/howto/setup-git-server-over-http.txt
index bfe6f9b500..bfe6f9b500 100644
--- a/Documentation/howto/setup-git-server-over-http.txt
+++ b/third_party/git/Documentation/howto/setup-git-server-over-http.txt
diff --git a/Documentation/howto/update-hook-example.txt b/third_party/git/Documentation/howto/update-hook-example.txt
index 89821ec74f..89821ec74f 100644
--- a/Documentation/howto/update-hook-example.txt
+++ b/third_party/git/Documentation/howto/update-hook-example.txt
diff --git a/Documentation/howto/use-git-daemon.txt b/third_party/git/Documentation/howto/use-git-daemon.txt
index 7af2e52cf3..7af2e52cf3 100644
--- a/Documentation/howto/use-git-daemon.txt
+++ b/third_party/git/Documentation/howto/use-git-daemon.txt
diff --git a/Documentation/howto/using-merge-subtree.txt b/third_party/git/Documentation/howto/using-merge-subtree.txt
index a499a94ac2..a499a94ac2 100644
--- a/Documentation/howto/using-merge-subtree.txt
+++ b/third_party/git/Documentation/howto/using-merge-subtree.txt
diff --git a/Documentation/howto/using-signed-tag-in-pull-request.txt b/third_party/git/Documentation/howto/using-signed-tag-in-pull-request.txt
index bbf040eda8..bbf040eda8 100644
--- a/Documentation/howto/using-signed-tag-in-pull-request.txt
+++ b/third_party/git/Documentation/howto/using-signed-tag-in-pull-request.txt
diff --git a/Documentation/i18n.txt b/third_party/git/Documentation/i18n.txt
index 7e36e5b55b..7e36e5b55b 100644
--- a/Documentation/i18n.txt
+++ b/third_party/git/Documentation/i18n.txt
diff --git a/Documentation/install-doc-quick.sh b/third_party/git/Documentation/install-doc-quick.sh
index 17231d8e59..17231d8e59 100755
--- a/Documentation/install-doc-quick.sh
+++ b/third_party/git/Documentation/install-doc-quick.sh
diff --git a/Documentation/install-webdoc.sh b/third_party/git/Documentation/install-webdoc.sh
index ed8b4ff3e5..ed8b4ff3e5 100755
--- a/Documentation/install-webdoc.sh
+++ b/third_party/git/Documentation/install-webdoc.sh
diff --git a/Documentation/line-range-format.txt b/third_party/git/Documentation/line-range-format.txt
index 829676ff98..829676ff98 100644
--- a/Documentation/line-range-format.txt
+++ b/third_party/git/Documentation/line-range-format.txt
diff --git a/Documentation/lint-gitlink.perl b/third_party/git/Documentation/lint-gitlink.perl
index 476cc30b83..476cc30b83 100755
--- a/Documentation/lint-gitlink.perl
+++ b/third_party/git/Documentation/lint-gitlink.perl
diff --git a/Documentation/mailmap.txt b/third_party/git/Documentation/mailmap.txt
index 4a8c276529..4a8c276529 100644
--- a/Documentation/mailmap.txt
+++ b/third_party/git/Documentation/mailmap.txt
diff --git a/Documentation/manpage-1.72.xsl b/third_party/git/Documentation/manpage-1.72.xsl
index b4d315cb8c..b4d315cb8c 100644
--- a/Documentation/manpage-1.72.xsl
+++ b/third_party/git/Documentation/manpage-1.72.xsl
diff --git a/Documentation/manpage-base-url.xsl.in b/third_party/git/Documentation/manpage-base-url.xsl.in
index e800904df3..e800904df3 100644
--- a/Documentation/manpage-base-url.xsl.in
+++ b/third_party/git/Documentation/manpage-base-url.xsl.in
diff --git a/Documentation/manpage-base.xsl b/third_party/git/Documentation/manpage-base.xsl
index a264fa6160..a264fa6160 100644
--- a/Documentation/manpage-base.xsl
+++ b/third_party/git/Documentation/manpage-base.xsl
diff --git a/Documentation/manpage-bold-literal.xsl b/third_party/git/Documentation/manpage-bold-literal.xsl
index 608eb5df62..608eb5df62 100644
--- a/Documentation/manpage-bold-literal.xsl
+++ b/third_party/git/Documentation/manpage-bold-literal.xsl
diff --git a/Documentation/manpage-normal.xsl b/third_party/git/Documentation/manpage-normal.xsl
index a48f5b11f3..a48f5b11f3 100644
--- a/Documentation/manpage-normal.xsl
+++ b/third_party/git/Documentation/manpage-normal.xsl
diff --git a/Documentation/manpage-quote-apos.xsl b/third_party/git/Documentation/manpage-quote-apos.xsl
index aeb8839f33..aeb8839f33 100644
--- a/Documentation/manpage-quote-apos.xsl
+++ b/third_party/git/Documentation/manpage-quote-apos.xsl
diff --git a/Documentation/manpage-suppress-sp.xsl b/third_party/git/Documentation/manpage-suppress-sp.xsl
index a63c7632a8..a63c7632a8 100644
--- a/Documentation/manpage-suppress-sp.xsl
+++ b/third_party/git/Documentation/manpage-suppress-sp.xsl
diff --git a/Documentation/merge-options.txt b/third_party/git/Documentation/merge-options.txt
index 79a00d2a4a..79a00d2a4a 100644
--- a/Documentation/merge-options.txt
+++ b/third_party/git/Documentation/merge-options.txt
diff --git a/Documentation/merge-strategies.txt b/third_party/git/Documentation/merge-strategies.txt
index aa66cbe41e..aa66cbe41e 100644
--- a/Documentation/merge-strategies.txt
+++ b/third_party/git/Documentation/merge-strategies.txt
diff --git a/Documentation/pretty-formats.txt b/third_party/git/Documentation/pretty-formats.txt
index 079598307a..079598307a 100644
--- a/Documentation/pretty-formats.txt
+++ b/third_party/git/Documentation/pretty-formats.txt
diff --git a/Documentation/pretty-options.txt b/third_party/git/Documentation/pretty-options.txt
index e44fc8f738..e44fc8f738 100644
--- a/Documentation/pretty-options.txt
+++ b/third_party/git/Documentation/pretty-options.txt
diff --git a/Documentation/pull-fetch-param.txt b/third_party/git/Documentation/pull-fetch-param.txt
index 7d3a60f5b9..7d3a60f5b9 100644
--- a/Documentation/pull-fetch-param.txt
+++ b/third_party/git/Documentation/pull-fetch-param.txt
diff --git a/Documentation/rev-list-options.txt b/third_party/git/Documentation/rev-list-options.txt
index bb1251c036..bb1251c036 100644
--- a/Documentation/rev-list-options.txt
+++ b/third_party/git/Documentation/rev-list-options.txt
diff --git a/Documentation/revisions.txt b/third_party/git/Documentation/revisions.txt
index 97f995e5a9..97f995e5a9 100644
--- a/Documentation/revisions.txt
+++ b/third_party/git/Documentation/revisions.txt
diff --git a/Documentation/sequencer.txt b/third_party/git/Documentation/sequencer.txt
index 3bceb56474..3bceb56474 100644
--- a/Documentation/sequencer.txt
+++ b/third_party/git/Documentation/sequencer.txt
diff --git a/Documentation/technical/.gitignore b/third_party/git/Documentation/technical/.gitignore
index 8aa891daee..8aa891daee 100644
--- a/Documentation/technical/.gitignore
+++ b/third_party/git/Documentation/technical/.gitignore
diff --git a/Documentation/technical/api-allocation-growing.txt b/third_party/git/Documentation/technical/api-allocation-growing.txt
index 5a59b54844..5a59b54844 100644
--- a/Documentation/technical/api-allocation-growing.txt
+++ b/third_party/git/Documentation/technical/api-allocation-growing.txt
diff --git a/Documentation/technical/api-argv-array.txt b/third_party/git/Documentation/technical/api-argv-array.txt
index 870c8edbfb..870c8edbfb 100644
--- a/Documentation/technical/api-argv-array.txt
+++ b/third_party/git/Documentation/technical/api-argv-array.txt
diff --git a/Documentation/technical/api-config.txt b/third_party/git/Documentation/technical/api-config.txt
index 7d20716c32..7d20716c32 100644
--- a/Documentation/technical/api-config.txt
+++ b/third_party/git/Documentation/technical/api-config.txt
diff --git a/Documentation/technical/api-credentials.txt b/third_party/git/Documentation/technical/api-credentials.txt
index 75368f26ca..75368f26ca 100644
--- a/Documentation/technical/api-credentials.txt
+++ b/third_party/git/Documentation/technical/api-credentials.txt
diff --git a/Documentation/technical/api-diff.txt b/third_party/git/Documentation/technical/api-diff.txt
index 30fc0e9c93..30fc0e9c93 100644
--- a/Documentation/technical/api-diff.txt
+++ b/third_party/git/Documentation/technical/api-diff.txt
diff --git a/Documentation/technical/api-directory-listing.txt b/third_party/git/Documentation/technical/api-directory-listing.txt
index 5abb8e8b1f..5abb8e8b1f 100644
--- a/Documentation/technical/api-directory-listing.txt
+++ b/third_party/git/Documentation/technical/api-directory-listing.txt
diff --git a/Documentation/technical/api-error-handling.txt b/third_party/git/Documentation/technical/api-error-handling.txt
index ceeedd485c..ceeedd485c 100644
--- a/Documentation/technical/api-error-handling.txt
+++ b/third_party/git/Documentation/technical/api-error-handling.txt
diff --git a/Documentation/technical/api-gitattributes.txt b/third_party/git/Documentation/technical/api-gitattributes.txt
index 45f0df600f..45f0df600f 100644
--- a/Documentation/technical/api-gitattributes.txt
+++ b/third_party/git/Documentation/technical/api-gitattributes.txt
diff --git a/Documentation/technical/api-grep.txt b/third_party/git/Documentation/technical/api-grep.txt
index a69cc8964d..a69cc8964d 100644
--- a/Documentation/technical/api-grep.txt
+++ b/third_party/git/Documentation/technical/api-grep.txt
diff --git a/Documentation/technical/api-history-graph.txt b/third_party/git/Documentation/technical/api-history-graph.txt
index d0d1707c8c..d0d1707c8c 100644
--- a/Documentation/technical/api-history-graph.txt
+++ b/third_party/git/Documentation/technical/api-history-graph.txt
diff --git a/Documentation/technical/api-index-skel.txt b/third_party/git/Documentation/technical/api-index-skel.txt
index eda8c195c1..eda8c195c1 100644
--- a/Documentation/technical/api-index-skel.txt
+++ b/third_party/git/Documentation/technical/api-index-skel.txt
diff --git a/Documentation/technical/api-index.sh b/third_party/git/Documentation/technical/api-index.sh
index 9c3f4131b8..9c3f4131b8 100755
--- a/Documentation/technical/api-index.sh
+++ b/third_party/git/Documentation/technical/api-index.sh
diff --git a/Documentation/technical/api-merge.txt b/third_party/git/Documentation/technical/api-merge.txt
index 9dc1bed768..9dc1bed768 100644
--- a/Documentation/technical/api-merge.txt
+++ b/third_party/git/Documentation/technical/api-merge.txt
diff --git a/Documentation/technical/api-object-access.txt b/third_party/git/Documentation/technical/api-object-access.txt
index 5b29622d00..5b29622d00 100644
--- a/Documentation/technical/api-object-access.txt
+++ b/third_party/git/Documentation/technical/api-object-access.txt
diff --git a/Documentation/technical/api-oid-array.txt b/third_party/git/Documentation/technical/api-oid-array.txt
index c97428c2c3..c97428c2c3 100644
--- a/Documentation/technical/api-oid-array.txt
+++ b/third_party/git/Documentation/technical/api-oid-array.txt
diff --git a/Documentation/technical/api-parse-options.txt b/third_party/git/Documentation/technical/api-parse-options.txt
index 2e2e7c10c6..2e2e7c10c6 100644
--- a/Documentation/technical/api-parse-options.txt
+++ b/third_party/git/Documentation/technical/api-parse-options.txt
diff --git a/Documentation/technical/api-quote.txt b/third_party/git/Documentation/technical/api-quote.txt
index e8a1bce94e..e8a1bce94e 100644
--- a/Documentation/technical/api-quote.txt
+++ b/third_party/git/Documentation/technical/api-quote.txt
diff --git a/Documentation/technical/api-ref-iteration.txt b/third_party/git/Documentation/technical/api-ref-iteration.txt
index ad9d019ff9..ad9d019ff9 100644
--- a/Documentation/technical/api-ref-iteration.txt
+++ b/third_party/git/Documentation/technical/api-ref-iteration.txt
diff --git a/Documentation/technical/api-remote.txt b/third_party/git/Documentation/technical/api-remote.txt
index f10941b2e8..f10941b2e8 100644
--- a/Documentation/technical/api-remote.txt
+++ b/third_party/git/Documentation/technical/api-remote.txt
diff --git a/Documentation/technical/api-revision-walking.txt b/third_party/git/Documentation/technical/api-revision-walking.txt
index 03f9ea6ac4..03f9ea6ac4 100644
--- a/Documentation/technical/api-revision-walking.txt
+++ b/third_party/git/Documentation/technical/api-revision-walking.txt
diff --git a/Documentation/technical/api-run-command.txt b/third_party/git/Documentation/technical/api-run-command.txt
index 8bf3e37f53..8bf3e37f53 100644
--- a/Documentation/technical/api-run-command.txt
+++ b/third_party/git/Documentation/technical/api-run-command.txt
diff --git a/Documentation/technical/api-setup.txt b/third_party/git/Documentation/technical/api-setup.txt
index eb1fa9853e..eb1fa9853e 100644
--- a/Documentation/technical/api-setup.txt
+++ b/third_party/git/Documentation/technical/api-setup.txt
diff --git a/Documentation/technical/api-sigchain.txt b/third_party/git/Documentation/technical/api-sigchain.txt
index 9e1189ef01..9e1189ef01 100644
--- a/Documentation/technical/api-sigchain.txt
+++ b/third_party/git/Documentation/technical/api-sigchain.txt
diff --git a/Documentation/technical/api-submodule-config.txt b/third_party/git/Documentation/technical/api-submodule-config.txt
index fb06089393..fb06089393 100644
--- a/Documentation/technical/api-submodule-config.txt
+++ b/third_party/git/Documentation/technical/api-submodule-config.txt
diff --git a/Documentation/technical/api-trace.txt b/third_party/git/Documentation/technical/api-trace.txt
index fadb5979c4..fadb5979c4 100644
--- a/Documentation/technical/api-trace.txt
+++ b/third_party/git/Documentation/technical/api-trace.txt
diff --git a/Documentation/technical/api-trace2.txt b/third_party/git/Documentation/technical/api-trace2.txt
index 71eb081fed..71eb081fed 100644
--- a/Documentation/technical/api-trace2.txt
+++ b/third_party/git/Documentation/technical/api-trace2.txt
diff --git a/Documentation/technical/api-tree-walking.txt b/third_party/git/Documentation/technical/api-tree-walking.txt
index bde18622a8..bde18622a8 100644
--- a/Documentation/technical/api-tree-walking.txt
+++ b/third_party/git/Documentation/technical/api-tree-walking.txt
diff --git a/Documentation/technical/api-xdiff-interface.txt b/third_party/git/Documentation/technical/api-xdiff-interface.txt
index 6296ecad1d..6296ecad1d 100644
--- a/Documentation/technical/api-xdiff-interface.txt
+++ b/third_party/git/Documentation/technical/api-xdiff-interface.txt
diff --git a/Documentation/technical/bitmap-format.txt b/third_party/git/Documentation/technical/bitmap-format.txt
index f8c18a0f7a..f8c18a0f7a 100644
--- a/Documentation/technical/bitmap-format.txt
+++ b/third_party/git/Documentation/technical/bitmap-format.txt
diff --git a/Documentation/technical/commit-graph-format.txt b/third_party/git/Documentation/technical/commit-graph-format.txt
index a4f17441ae..a4f17441ae 100644
--- a/Documentation/technical/commit-graph-format.txt
+++ b/third_party/git/Documentation/technical/commit-graph-format.txt
diff --git a/Documentation/technical/commit-graph.txt b/third_party/git/Documentation/technical/commit-graph.txt
index 729fbcb32f..729fbcb32f 100644
--- a/Documentation/technical/commit-graph.txt
+++ b/third_party/git/Documentation/technical/commit-graph.txt
diff --git a/Documentation/technical/directory-rename-detection.txt b/third_party/git/Documentation/technical/directory-rename-detection.txt
index 844629c8c4..844629c8c4 100644
--- a/Documentation/technical/directory-rename-detection.txt
+++ b/third_party/git/Documentation/technical/directory-rename-detection.txt
diff --git a/Documentation/technical/hash-function-transition.txt b/third_party/git/Documentation/technical/hash-function-transition.txt
index 2ae8fa470a..2ae8fa470a 100644
--- a/Documentation/technical/hash-function-transition.txt
+++ b/third_party/git/Documentation/technical/hash-function-transition.txt
diff --git a/Documentation/technical/http-protocol.txt b/third_party/git/Documentation/technical/http-protocol.txt
index 9c5b6f0fac..9c5b6f0fac 100644
--- a/Documentation/technical/http-protocol.txt
+++ b/third_party/git/Documentation/technical/http-protocol.txt
diff --git a/Documentation/technical/index-format.txt b/third_party/git/Documentation/technical/index-format.txt
index 7c4d67aa6a..7c4d67aa6a 100644
--- a/Documentation/technical/index-format.txt
+++ b/third_party/git/Documentation/technical/index-format.txt
diff --git a/Documentation/technical/long-running-process-protocol.txt b/third_party/git/Documentation/technical/long-running-process-protocol.txt
index aa0aa9af1c..aa0aa9af1c 100644
--- a/Documentation/technical/long-running-process-protocol.txt
+++ b/third_party/git/Documentation/technical/long-running-process-protocol.txt
diff --git a/Documentation/technical/multi-pack-index.txt b/third_party/git/Documentation/technical/multi-pack-index.txt
index d7e57639f7..d7e57639f7 100644
--- a/Documentation/technical/multi-pack-index.txt
+++ b/third_party/git/Documentation/technical/multi-pack-index.txt
diff --git a/Documentation/technical/pack-format.txt b/third_party/git/Documentation/technical/pack-format.txt
index cab5bdd2ff..cab5bdd2ff 100644
--- a/Documentation/technical/pack-format.txt
+++ b/third_party/git/Documentation/technical/pack-format.txt
diff --git a/Documentation/technical/pack-heuristics.txt b/third_party/git/Documentation/technical/pack-heuristics.txt
index 95a07db6e8..95a07db6e8 100644
--- a/Documentation/technical/pack-heuristics.txt
+++ b/third_party/git/Documentation/technical/pack-heuristics.txt
diff --git a/Documentation/technical/pack-protocol.txt b/third_party/git/Documentation/technical/pack-protocol.txt
index c73e72de0e..c73e72de0e 100644
--- a/Documentation/technical/pack-protocol.txt
+++ b/third_party/git/Documentation/technical/pack-protocol.txt
diff --git a/Documentation/technical/partial-clone.txt b/third_party/git/Documentation/technical/partial-clone.txt
index 896c7b3878..896c7b3878 100644
--- a/Documentation/technical/partial-clone.txt
+++ b/third_party/git/Documentation/technical/partial-clone.txt
diff --git a/Documentation/technical/protocol-capabilities.txt b/third_party/git/Documentation/technical/protocol-capabilities.txt
index 2b267c0da6..2b267c0da6 100644
--- a/Documentation/technical/protocol-capabilities.txt
+++ b/third_party/git/Documentation/technical/protocol-capabilities.txt
diff --git a/Documentation/technical/protocol-common.txt b/third_party/git/Documentation/technical/protocol-common.txt
index ecedb34bba..ecedb34bba 100644
--- a/Documentation/technical/protocol-common.txt
+++ b/third_party/git/Documentation/technical/protocol-common.txt
diff --git a/Documentation/technical/protocol-v2.txt b/third_party/git/Documentation/technical/protocol-v2.txt
index 40f91f6b1e..40f91f6b1e 100644
--- a/Documentation/technical/protocol-v2.txt
+++ b/third_party/git/Documentation/technical/protocol-v2.txt
diff --git a/Documentation/technical/racy-git.txt b/third_party/git/Documentation/technical/racy-git.txt
index 4a8be4d144..4a8be4d144 100644
--- a/Documentation/technical/racy-git.txt
+++ b/third_party/git/Documentation/technical/racy-git.txt
diff --git a/Documentation/technical/repository-version.txt b/third_party/git/Documentation/technical/repository-version.txt
index 7844ef30ff..7844ef30ff 100644
--- a/Documentation/technical/repository-version.txt
+++ b/third_party/git/Documentation/technical/repository-version.txt
diff --git a/Documentation/technical/rerere.txt b/third_party/git/Documentation/technical/rerere.txt
index aa22d7ace8..aa22d7ace8 100644
--- a/Documentation/technical/rerere.txt
+++ b/third_party/git/Documentation/technical/rerere.txt
diff --git a/Documentation/technical/send-pack-pipeline.txt b/third_party/git/Documentation/technical/send-pack-pipeline.txt
index 9b5a0bc186..9b5a0bc186 100644
--- a/Documentation/technical/send-pack-pipeline.txt
+++ b/third_party/git/Documentation/technical/send-pack-pipeline.txt
diff --git a/Documentation/technical/shallow.txt b/third_party/git/Documentation/technical/shallow.txt
index 01dedfe9ff..01dedfe9ff 100644
--- a/Documentation/technical/shallow.txt
+++ b/third_party/git/Documentation/technical/shallow.txt
diff --git a/Documentation/technical/signature-format.txt b/third_party/git/Documentation/technical/signature-format.txt
index 2c9406a56a..2c9406a56a 100644
--- a/Documentation/technical/signature-format.txt
+++ b/third_party/git/Documentation/technical/signature-format.txt
diff --git a/Documentation/technical/trivial-merge.txt b/third_party/git/Documentation/technical/trivial-merge.txt
index 1f1c33d0da..1f1c33d0da 100644
--- a/Documentation/technical/trivial-merge.txt
+++ b/third_party/git/Documentation/technical/trivial-merge.txt
diff --git a/Documentation/texi.xsl b/third_party/git/Documentation/texi.xsl
index 0f8ff07eca..0f8ff07eca 100644
--- a/Documentation/texi.xsl
+++ b/third_party/git/Documentation/texi.xsl
diff --git a/Documentation/trace2-target-values.txt b/third_party/git/Documentation/trace2-target-values.txt
index 27d3c64e66..27d3c64e66 100644
--- a/Documentation/trace2-target-values.txt
+++ b/third_party/git/Documentation/trace2-target-values.txt
diff --git a/Documentation/transfer-data-leaks.txt b/third_party/git/Documentation/transfer-data-leaks.txt
index 914bacc39e..914bacc39e 100644
--- a/Documentation/transfer-data-leaks.txt
+++ b/third_party/git/Documentation/transfer-data-leaks.txt
diff --git a/Documentation/urls-remotes.txt b/third_party/git/Documentation/urls-remotes.txt
index bd184cd653..bd184cd653 100644
--- a/Documentation/urls-remotes.txt
+++ b/third_party/git/Documentation/urls-remotes.txt
diff --git a/Documentation/urls.txt b/third_party/git/Documentation/urls.txt
index bc354fe2dc..bc354fe2dc 100644
--- a/Documentation/urls.txt
+++ b/third_party/git/Documentation/urls.txt
diff --git a/Documentation/user-manual.conf b/third_party/git/Documentation/user-manual.conf
index d87294de2f..d87294de2f 100644
--- a/Documentation/user-manual.conf
+++ b/third_party/git/Documentation/user-manual.conf
diff --git a/Documentation/user-manual.txt b/third_party/git/Documentation/user-manual.txt
index 8bce75b2cf..8bce75b2cf 100644
--- a/Documentation/user-manual.txt
+++ b/third_party/git/Documentation/user-manual.txt
diff --git a/GIT-VERSION-GEN b/third_party/git/GIT-VERSION-GEN
index a1539a7ce6..a1539a7ce6 100755
--- a/GIT-VERSION-GEN
+++ b/third_party/git/GIT-VERSION-GEN
diff --git a/INSTALL b/third_party/git/INSTALL
index c39006e8e7..c39006e8e7 100644
--- a/INSTALL
+++ b/third_party/git/INSTALL
diff --git a/LGPL-2.1 b/third_party/git/LGPL-2.1
index d38b1b92bd..d38b1b92bd 100644
--- a/LGPL-2.1
+++ b/third_party/git/LGPL-2.1
diff --git a/Makefile b/third_party/git/Makefile
index f9255344ae..f9255344ae 100644
--- a/Makefile
+++ b/third_party/git/Makefile
diff --git a/third_party/git/README.md b/third_party/git/README.md
new file mode 100644
index 0000000000..e1d2b82209
--- /dev/null
+++ b/third_party/git/README.md
@@ -0,0 +1,66 @@
+[![Build Status](https://dev.azure.com/git/git/_apis/build/status/git.git)](https://dev.azure.com/git/git/_build/latest?definitionId=11)
+
+Git - fast, scalable, distributed revision control system
+=========================================================
+
+Git is a fast, scalable, distributed revision control system with an
+unusually rich command set that provides both high-level operations
+and full access to internals.
+
+Git is an Open Source project covered by the GNU General Public
+License version 2 (some parts of it are under different licenses,
+compatible with the GPLv2). It was originally written by Linus
+Torvalds with help of a group of hackers around the net.
+
+Please read the file [INSTALL][] for installation instructions.
+
+Many Git online resources are accessible from <https://git-scm.com/>
+including full documentation and Git related tools.
+
+See [Documentation/gittutorial.txt][] to get started, then see
+[Documentation/giteveryday.txt][] for a useful minimum set of commands, and
+`Documentation/git-<commandname>.txt` for documentation of each command.
+If git has been correctly installed, then the tutorial can also be
+read with `man gittutorial` or `git help tutorial`, and the
+documentation of each command with `man git-<commandname>` or `git help
+<commandname>`.
+
+CVS users may also want to read [Documentation/gitcvs-migration.txt][]
+(`man gitcvs-migration` or `git help cvs-migration` if git is
+installed).
+
+The user discussion and development of Git take place on the Git
+mailing list -- everyone is welcome to post bug reports, feature
+requests, comments and patches to git@vger.kernel.org (read
+[Documentation/SubmittingPatches][] for instructions on patch submission).
+To subscribe to the list, send an email with just "subscribe git" in
+the body to majordomo@vger.kernel.org. The mailing list archives are
+available at <https://public-inbox.org/git/>,
+<http://marc.info/?l=git> and other archival sites.
+
+Issues which are security relevant should be disclosed privately to
+the Git Security mailing list <git-security@googlegroups.com>.
+
+The maintainer frequently sends the "What's cooking" reports that
+list the current status of various development topics to the mailing
+list.  The discussion following them give a good reference for
+project status, development direction and remaining tasks.
+
+The name "git" was given by Linus Torvalds when he wrote the very
+first version. He described the tool as "the stupid content tracker"
+and the name as (depending on your mood):
+
+ - random three-letter combination that is pronounceable, and not
+   actually used by any common UNIX command.  The fact that it is a
+   mispronunciation of "get" may or may not be relevant.
+ - stupid. contemptible and despicable. simple. Take your pick from the
+   dictionary of slang.
+ - "global information tracker": you're in a good mood, and it actually
+   works for you. Angels sing, and a light suddenly fills the room.
+ - "goddamn idiotic truckload of sh*t": when it breaks
+
+[INSTALL]: INSTALL
+[Documentation/gittutorial.txt]: Documentation/gittutorial.txt
+[Documentation/giteveryday.txt]: Documentation/giteveryday.txt
+[Documentation/gitcvs-migration.txt]: Documentation/gitcvs-migration.txt
+[Documentation/SubmittingPatches]: Documentation/SubmittingPatches
diff --git a/RelNotes b/third_party/git/RelNotes
index 248d137c43..248d137c43 120000
--- a/RelNotes
+++ b/third_party/git/RelNotes
diff --git a/abspath.c b/third_party/git/abspath.c
index 9857985329..9857985329 100644
--- a/abspath.c
+++ b/third_party/git/abspath.c
diff --git a/aclocal.m4 b/third_party/git/aclocal.m4
index f11bc7ed7d..f11bc7ed7d 100644
--- a/aclocal.m4
+++ b/third_party/git/aclocal.m4
diff --git a/advice.c b/third_party/git/advice.c
index 3ee0ee2d8f..3ee0ee2d8f 100644
--- a/advice.c
+++ b/third_party/git/advice.c
diff --git a/advice.h b/third_party/git/advice.h
index d015404843..d015404843 100644
--- a/advice.h
+++ b/third_party/git/advice.h
diff --git a/alias.c b/third_party/git/alias.c
index c471538020..c471538020 100644
--- a/alias.c
+++ b/third_party/git/alias.c
diff --git a/alias.h b/third_party/git/alias.h
index aef4843bb7..aef4843bb7 100644
--- a/alias.h
+++ b/third_party/git/alias.h
diff --git a/alloc.c b/third_party/git/alloc.c
index 1c64c4dd16..1c64c4dd16 100644
--- a/alloc.c
+++ b/third_party/git/alloc.c
diff --git a/alloc.h b/third_party/git/alloc.h
index ed1071c11e..ed1071c11e 100644
--- a/alloc.h
+++ b/third_party/git/alloc.h
diff --git a/apply.c b/third_party/git/apply.c
index cde95369bb..cde95369bb 100644
--- a/apply.c
+++ b/third_party/git/apply.c
diff --git a/apply.h b/third_party/git/apply.h
index a795193435..a795193435 100644
--- a/apply.h
+++ b/third_party/git/apply.h
diff --git a/archive-tar.c b/third_party/git/archive-tar.c
index 3e53aac1e6..3e53aac1e6 100644
--- a/archive-tar.c
+++ b/third_party/git/archive-tar.c
diff --git a/archive-zip.c b/third_party/git/archive-zip.c
index 4d66b5be6e..4d66b5be6e 100644
--- a/archive-zip.c
+++ b/third_party/git/archive-zip.c
diff --git a/archive.c b/third_party/git/archive.c
index a8da0fcc4f..a8da0fcc4f 100644
--- a/archive.c
+++ b/third_party/git/archive.c
diff --git a/archive.h b/third_party/git/archive.h
index e60e3dd31c..e60e3dd31c 100644
--- a/archive.h
+++ b/third_party/git/archive.h
diff --git a/argv-array.c b/third_party/git/argv-array.c
index f352ea9357..f352ea9357 100644
--- a/argv-array.c
+++ b/third_party/git/argv-array.c
diff --git a/argv-array.h b/third_party/git/argv-array.h
index a39ba43f57..a39ba43f57 100644
--- a/argv-array.h
+++ b/third_party/git/argv-array.h
diff --git a/attr.c b/third_party/git/attr.c
index 93dc16b59c..93dc16b59c 100644
--- a/attr.c
+++ b/third_party/git/attr.c
diff --git a/attr.h b/third_party/git/attr.h
index b0378bfe5f..b0378bfe5f 100644
--- a/attr.h
+++ b/third_party/git/attr.h
diff --git a/azure-pipelines.yml b/third_party/git/azure-pipelines.yml
index c329b7218b..c329b7218b 100644
--- a/azure-pipelines.yml
+++ b/third_party/git/azure-pipelines.yml
diff --git a/banned.h b/third_party/git/banned.h
index 447af24807..447af24807 100644
--- a/banned.h
+++ b/third_party/git/banned.h
diff --git a/base85.c b/third_party/git/base85.c
index 5ca601ee14..5ca601ee14 100644
--- a/base85.c
+++ b/third_party/git/base85.c
diff --git a/bisect.c b/third_party/git/bisect.c
index e87ac29a51..e87ac29a51 100644
--- a/bisect.c
+++ b/third_party/git/bisect.c
diff --git a/bisect.h b/third_party/git/bisect.h
index 4e69a11ea8..4e69a11ea8 100644
--- a/bisect.h
+++ b/third_party/git/bisect.h
diff --git a/blame.c b/third_party/git/blame.c
index 36a2e7ef11..36a2e7ef11 100644
--- a/blame.c
+++ b/third_party/git/blame.c
diff --git a/blame.h b/third_party/git/blame.h
index 4a9e1270b0..4a9e1270b0 100644
--- a/blame.h
+++ b/third_party/git/blame.h
diff --git a/blob.c b/third_party/git/blob.c
index 36f9abda19..36f9abda19 100644
--- a/blob.c
+++ b/third_party/git/blob.c
diff --git a/blob.h b/third_party/git/blob.h
index 1664872055..1664872055 100644
--- a/blob.h
+++ b/third_party/git/blob.h
diff --git a/block-sha1/sha1.c b/third_party/git/block-sha1/sha1.c
index 22b125cf8c..22b125cf8c 100644
--- a/block-sha1/sha1.c
+++ b/third_party/git/block-sha1/sha1.c
diff --git a/block-sha1/sha1.h b/third_party/git/block-sha1/sha1.h
index 4df6747752..4df6747752 100644
--- a/block-sha1/sha1.h
+++ b/third_party/git/block-sha1/sha1.h
diff --git a/branch.c b/third_party/git/branch.c
index 579494738a..579494738a 100644
--- a/branch.c
+++ b/third_party/git/branch.c
diff --git a/branch.h b/third_party/git/branch.h
index df0be61506..df0be61506 100644
--- a/branch.h
+++ b/third_party/git/branch.h
diff --git a/builtin.h b/third_party/git/builtin.h
index 5cf5df69f7..5cf5df69f7 100644
--- a/builtin.h
+++ b/third_party/git/builtin.h
diff --git a/builtin/add.c b/third_party/git/builtin/add.c
index dd18e5c9b6..dd18e5c9b6 100644
--- a/builtin/add.c
+++ b/third_party/git/builtin/add.c
diff --git a/builtin/am.c b/third_party/git/builtin/am.c
index 1aea657a7f..1aea657a7f 100644
--- a/builtin/am.c
+++ b/third_party/git/builtin/am.c
diff --git a/builtin/annotate.c b/third_party/git/builtin/annotate.c
index da413ae0d1..da413ae0d1 100644
--- a/builtin/annotate.c
+++ b/third_party/git/builtin/annotate.c
diff --git a/builtin/apply.c b/third_party/git/builtin/apply.c
index 3f099b9605..3f099b9605 100644
--- a/builtin/apply.c
+++ b/third_party/git/builtin/apply.c
diff --git a/builtin/archive.c b/third_party/git/builtin/archive.c
index 45d11669aa..45d11669aa 100644
--- a/builtin/archive.c
+++ b/third_party/git/builtin/archive.c
diff --git a/builtin/bisect--helper.c b/third_party/git/builtin/bisect--helper.c
index 1fbe156e67..1fbe156e67 100644
--- a/builtin/bisect--helper.c
+++ b/third_party/git/builtin/bisect--helper.c
diff --git a/builtin/blame.c b/third_party/git/builtin/blame.c
index b6534d4dea..b6534d4dea 100644
--- a/builtin/blame.c
+++ b/third_party/git/builtin/blame.c
diff --git a/builtin/branch.c b/third_party/git/builtin/branch.c
index 2ef214632f..2ef214632f 100644
--- a/builtin/branch.c
+++ b/third_party/git/builtin/branch.c
diff --git a/builtin/bundle.c b/third_party/git/builtin/bundle.c
index 1ea4bfdfc1..1ea4bfdfc1 100644
--- a/builtin/bundle.c
+++ b/third_party/git/builtin/bundle.c
diff --git a/builtin/cat-file.c b/third_party/git/builtin/cat-file.c
index 995d47c85a..995d47c85a 100644
--- a/builtin/cat-file.c
+++ b/third_party/git/builtin/cat-file.c
diff --git a/builtin/check-attr.c b/third_party/git/builtin/check-attr.c
index dd83397786..dd83397786 100644
--- a/builtin/check-attr.c
+++ b/third_party/git/builtin/check-attr.c
diff --git a/builtin/check-ignore.c b/third_party/git/builtin/check-ignore.c
index 599097304b..599097304b 100644
--- a/builtin/check-ignore.c
+++ b/third_party/git/builtin/check-ignore.c
diff --git a/builtin/check-mailmap.c b/third_party/git/builtin/check-mailmap.c
index cdce144f3b..cdce144f3b 100644
--- a/builtin/check-mailmap.c
+++ b/third_party/git/builtin/check-mailmap.c
diff --git a/builtin/check-ref-format.c b/third_party/git/builtin/check-ref-format.c
index bc67d3f0a8..bc67d3f0a8 100644
--- a/builtin/check-ref-format.c
+++ b/third_party/git/builtin/check-ref-format.c
diff --git a/builtin/checkout-index.c b/third_party/git/builtin/checkout-index.c
index 1ac1cc290e..1ac1cc290e 100644
--- a/builtin/checkout-index.c
+++ b/third_party/git/builtin/checkout-index.c
diff --git a/builtin/checkout.c b/third_party/git/builtin/checkout.c
index 6123f732a2..6123f732a2 100644
--- a/builtin/checkout.c
+++ b/third_party/git/builtin/checkout.c
diff --git a/builtin/clean.c b/third_party/git/builtin/clean.c
index d5579da716..d5579da716 100644
--- a/builtin/clean.c
+++ b/third_party/git/builtin/clean.c
diff --git a/builtin/clone.c b/third_party/git/builtin/clone.c
index f665b28ccc..f665b28ccc 100644
--- a/builtin/clone.c
+++ b/third_party/git/builtin/clone.c
diff --git a/builtin/column.c b/third_party/git/builtin/column.c
index e815e148aa..e815e148aa 100644
--- a/builtin/column.c
+++ b/third_party/git/builtin/column.c
diff --git a/builtin/commit-graph.c b/third_party/git/builtin/commit-graph.c
index 38027b83d9..38027b83d9 100644
--- a/builtin/commit-graph.c
+++ b/third_party/git/builtin/commit-graph.c
diff --git a/builtin/commit-tree.c b/third_party/git/builtin/commit-tree.c
index b866d83951..b866d83951 100644
--- a/builtin/commit-tree.c
+++ b/third_party/git/builtin/commit-tree.c
diff --git a/builtin/commit.c b/third_party/git/builtin/commit.c
index ae7aaf6dc6..ae7aaf6dc6 100644
--- a/builtin/commit.c
+++ b/third_party/git/builtin/commit.c
diff --git a/builtin/config.c b/third_party/git/builtin/config.c
index 98d65bc0ad..98d65bc0ad 100644
--- a/builtin/config.c
+++ b/third_party/git/builtin/config.c
diff --git a/builtin/count-objects.c b/third_party/git/builtin/count-objects.c
index 3fae474f6f..3fae474f6f 100644
--- a/builtin/count-objects.c
+++ b/third_party/git/builtin/count-objects.c
diff --git a/builtin/credential.c b/third_party/git/builtin/credential.c
index 879acfbcda..879acfbcda 100644
--- a/builtin/credential.c
+++ b/third_party/git/builtin/credential.c
diff --git a/builtin/describe.c b/third_party/git/builtin/describe.c
index 200154297d..200154297d 100644
--- a/builtin/describe.c
+++ b/third_party/git/builtin/describe.c
diff --git a/builtin/diff-files.c b/third_party/git/builtin/diff-files.c
index 86ae474fbf..86ae474fbf 100644
--- a/builtin/diff-files.c
+++ b/third_party/git/builtin/diff-files.c
diff --git a/builtin/diff-index.c b/third_party/git/builtin/diff-index.c
index 93ec642423..93ec642423 100644
--- a/builtin/diff-index.c
+++ b/third_party/git/builtin/diff-index.c
diff --git a/builtin/diff-tree.c b/third_party/git/builtin/diff-tree.c
index cb9ea79367..cb9ea79367 100644
--- a/builtin/diff-tree.c
+++ b/third_party/git/builtin/diff-tree.c
diff --git a/builtin/diff.c b/third_party/git/builtin/diff.c
index 42ac803091..42ac803091 100644
--- a/builtin/diff.c
+++ b/third_party/git/builtin/diff.c
diff --git a/builtin/difftool.c b/third_party/git/builtin/difftool.c
index 16eb8b70ea..16eb8b70ea 100644
--- a/builtin/difftool.c
+++ b/third_party/git/builtin/difftool.c
diff --git a/builtin/env--helper.c b/third_party/git/builtin/env--helper.c
index 23c214fff6..23c214fff6 100644
--- a/builtin/env--helper.c
+++ b/third_party/git/builtin/env--helper.c
diff --git a/builtin/fast-export.c b/third_party/git/builtin/fast-export.c
index f541f55d33..f541f55d33 100644
--- a/builtin/fast-export.c
+++ b/third_party/git/builtin/fast-export.c
diff --git a/builtin/fetch-pack.c b/third_party/git/builtin/fetch-pack.c
index dc1485c8aa..dc1485c8aa 100644
--- a/builtin/fetch-pack.c
+++ b/third_party/git/builtin/fetch-pack.c
diff --git a/builtin/fetch.c b/third_party/git/builtin/fetch.c
index 717dd14e89..717dd14e89 100644
--- a/builtin/fetch.c
+++ b/third_party/git/builtin/fetch.c
diff --git a/builtin/fmt-merge-msg.c b/third_party/git/builtin/fmt-merge-msg.c
index a4615587fd..a4615587fd 100644
--- a/builtin/fmt-merge-msg.c
+++ b/third_party/git/builtin/fmt-merge-msg.c
diff --git a/builtin/for-each-ref.c b/third_party/git/builtin/for-each-ref.c
index 465153e853..465153e853 100644
--- a/builtin/for-each-ref.c
+++ b/third_party/git/builtin/for-each-ref.c
diff --git a/builtin/fsck.c b/third_party/git/builtin/fsck.c
index 18403a94fa..18403a94fa 100644
--- a/builtin/fsck.c
+++ b/third_party/git/builtin/fsck.c
diff --git a/builtin/gc.c b/third_party/git/builtin/gc.c
index c18efadda5..c18efadda5 100644
--- a/builtin/gc.c
+++ b/third_party/git/builtin/gc.c
diff --git a/builtin/get-tar-commit-id.c b/third_party/git/builtin/get-tar-commit-id.c
index 491af9202d..491af9202d 100644
--- a/builtin/get-tar-commit-id.c
+++ b/third_party/git/builtin/get-tar-commit-id.c
diff --git a/builtin/grep.c b/third_party/git/builtin/grep.c
index 560051784e..560051784e 100644
--- a/builtin/grep.c
+++ b/third_party/git/builtin/grep.c
diff --git a/builtin/hash-object.c b/third_party/git/builtin/hash-object.c
index 640ef4ded5..640ef4ded5 100644
--- a/builtin/hash-object.c
+++ b/third_party/git/builtin/hash-object.c
diff --git a/builtin/help.c b/third_party/git/builtin/help.c
index e5590d7787..e5590d7787 100644
--- a/builtin/help.c
+++ b/third_party/git/builtin/help.c
diff --git a/builtin/index-pack.c b/third_party/git/builtin/index-pack.c
index 0d55f73b0b..0d55f73b0b 100644
--- a/builtin/index-pack.c
+++ b/third_party/git/builtin/index-pack.c
diff --git a/builtin/init-db.c b/third_party/git/builtin/init-db.c
index 944ec77fe1..944ec77fe1 100644
--- a/builtin/init-db.c
+++ b/third_party/git/builtin/init-db.c
diff --git a/builtin/interpret-trailers.c b/third_party/git/builtin/interpret-trailers.c
index f101d092b8..f101d092b8 100644
--- a/builtin/interpret-trailers.c
+++ b/third_party/git/builtin/interpret-trailers.c
diff --git a/builtin/log.c b/third_party/git/builtin/log.c
index 44b10b3415..44b10b3415 100644
--- a/builtin/log.c
+++ b/third_party/git/builtin/log.c
diff --git a/builtin/ls-files.c b/third_party/git/builtin/ls-files.c
index 670e8fb93c..670e8fb93c 100644
--- a/builtin/ls-files.c
+++ b/third_party/git/builtin/ls-files.c
diff --git a/builtin/ls-remote.c b/third_party/git/builtin/ls-remote.c
index 6ef519514b..6ef519514b 100644
--- a/builtin/ls-remote.c
+++ b/third_party/git/builtin/ls-remote.c
diff --git a/builtin/ls-tree.c b/third_party/git/builtin/ls-tree.c
index 7cad3f24eb..7cad3f24eb 100644
--- a/builtin/ls-tree.c
+++ b/third_party/git/builtin/ls-tree.c
diff --git a/builtin/mailinfo.c b/third_party/git/builtin/mailinfo.c
index cfb667a594..cfb667a594 100644
--- a/builtin/mailinfo.c
+++ b/third_party/git/builtin/mailinfo.c
diff --git a/builtin/mailsplit.c b/third_party/git/builtin/mailsplit.c
index 664400b816..664400b816 100644
--- a/builtin/mailsplit.c
+++ b/third_party/git/builtin/mailsplit.c
diff --git a/builtin/merge-base.c b/third_party/git/builtin/merge-base.c
index e3f8da13b6..e3f8da13b6 100644
--- a/builtin/merge-base.c
+++ b/third_party/git/builtin/merge-base.c
diff --git a/builtin/merge-file.c b/third_party/git/builtin/merge-file.c
index 06a2f90c48..06a2f90c48 100644
--- a/builtin/merge-file.c
+++ b/third_party/git/builtin/merge-file.c
diff --git a/builtin/merge-index.c b/third_party/git/builtin/merge-index.c
index 38ea6ad6ca..38ea6ad6ca 100644
--- a/builtin/merge-index.c
+++ b/third_party/git/builtin/merge-index.c
diff --git a/builtin/merge-ours.c b/third_party/git/builtin/merge-ours.c
index 4594507420..4594507420 100644
--- a/builtin/merge-ours.c
+++ b/third_party/git/builtin/merge-ours.c
diff --git a/builtin/merge-recursive.c b/third_party/git/builtin/merge-recursive.c
index 5b910e351e..5b910e351e 100644
--- a/builtin/merge-recursive.c
+++ b/third_party/git/builtin/merge-recursive.c
diff --git a/builtin/merge-tree.c b/third_party/git/builtin/merge-tree.c
index 97b54caeb9..97b54caeb9 100644
--- a/builtin/merge-tree.c
+++ b/third_party/git/builtin/merge-tree.c
diff --git a/builtin/merge.c b/third_party/git/builtin/merge.c
index e2ccbc44e2..e2ccbc44e2 100644
--- a/builtin/merge.c
+++ b/third_party/git/builtin/merge.c
diff --git a/builtin/mktag.c b/third_party/git/builtin/mktag.c
index 6fb7dc8578..6fb7dc8578 100644
--- a/builtin/mktag.c
+++ b/third_party/git/builtin/mktag.c
diff --git a/builtin/mktree.c b/third_party/git/builtin/mktree.c
index 891991b00d..891991b00d 100644
--- a/builtin/mktree.c
+++ b/third_party/git/builtin/mktree.c
diff --git a/builtin/multi-pack-index.c b/third_party/git/builtin/multi-pack-index.c
index b1ea1a6aa1..b1ea1a6aa1 100644
--- a/builtin/multi-pack-index.c
+++ b/third_party/git/builtin/multi-pack-index.c
diff --git a/builtin/mv.c b/third_party/git/builtin/mv.c
index be15ba7044..be15ba7044 100644
--- a/builtin/mv.c
+++ b/third_party/git/builtin/mv.c
diff --git a/builtin/name-rev.c b/third_party/git/builtin/name-rev.c
index c785fe16ba..c785fe16ba 100644
--- a/builtin/name-rev.c
+++ b/third_party/git/builtin/name-rev.c
diff --git a/builtin/notes.c b/third_party/git/builtin/notes.c
index 02e97f55c5..02e97f55c5 100644
--- a/builtin/notes.c
+++ b/third_party/git/builtin/notes.c
diff --git a/builtin/pack-objects.c b/third_party/git/builtin/pack-objects.c
index 76ce906946..76ce906946 100644
--- a/builtin/pack-objects.c
+++ b/third_party/git/builtin/pack-objects.c
diff --git a/builtin/pack-redundant.c b/third_party/git/builtin/pack-redundant.c
index 178e3409b7..178e3409b7 100644
--- a/builtin/pack-redundant.c
+++ b/third_party/git/builtin/pack-redundant.c
diff --git a/builtin/pack-refs.c b/third_party/git/builtin/pack-refs.c
index cfbd5c36c7..cfbd5c36c7 100644
--- a/builtin/pack-refs.c
+++ b/third_party/git/builtin/pack-refs.c
diff --git a/builtin/patch-id.c b/third_party/git/builtin/patch-id.c
index bd28b80b2d..bd28b80b2d 100644
--- a/builtin/patch-id.c
+++ b/third_party/git/builtin/patch-id.c
diff --git a/builtin/prune-packed.c b/third_party/git/builtin/prune-packed.c
index 48c5e78e33..48c5e78e33 100644
--- a/builtin/prune-packed.c
+++ b/third_party/git/builtin/prune-packed.c
diff --git a/builtin/prune.c b/third_party/git/builtin/prune.c
index 2b76872ad2..2b76872ad2 100644
--- a/builtin/prune.c
+++ b/third_party/git/builtin/prune.c
diff --git a/builtin/pull.c b/third_party/git/builtin/pull.c
index f1eaf6e6ed..f1eaf6e6ed 100644
--- a/builtin/pull.c
+++ b/third_party/git/builtin/pull.c
diff --git a/builtin/push.c b/third_party/git/builtin/push.c
index 021dd3b1e4..021dd3b1e4 100644
--- a/builtin/push.c
+++ b/third_party/git/builtin/push.c
diff --git a/builtin/range-diff.c b/third_party/git/builtin/range-diff.c
index 9202e75544..9202e75544 100644
--- a/builtin/range-diff.c
+++ b/third_party/git/builtin/range-diff.c
diff --git a/builtin/read-tree.c b/third_party/git/builtin/read-tree.c
index ca5e655d2f..ca5e655d2f 100644
--- a/builtin/read-tree.c
+++ b/third_party/git/builtin/read-tree.c
diff --git a/builtin/rebase.c b/third_party/git/builtin/rebase.c
index 670096c065..670096c065 100644
--- a/builtin/rebase.c
+++ b/third_party/git/builtin/rebase.c
diff --git a/builtin/receive-pack.c b/third_party/git/builtin/receive-pack.c
index dcf385511f..dcf385511f 100644
--- a/builtin/receive-pack.c
+++ b/third_party/git/builtin/receive-pack.c
diff --git a/builtin/reflog.c b/third_party/git/builtin/reflog.c
index 4d3430900d..4d3430900d 100644
--- a/builtin/reflog.c
+++ b/third_party/git/builtin/reflog.c
diff --git a/builtin/remote-ext.c b/third_party/git/builtin/remote-ext.c
index 6a9127a33c..6a9127a33c 100644
--- a/builtin/remote-ext.c
+++ b/third_party/git/builtin/remote-ext.c
diff --git a/builtin/remote-fd.c b/third_party/git/builtin/remote-fd.c
index 91dfe07e06..91dfe07e06 100644
--- a/builtin/remote-fd.c
+++ b/third_party/git/builtin/remote-fd.c
diff --git a/builtin/remote.c b/third_party/git/builtin/remote.c
index 5591cef775..5591cef775 100644
--- a/builtin/remote.c
+++ b/third_party/git/builtin/remote.c
diff --git a/builtin/repack.c b/third_party/git/builtin/repack.c
index 632c0c0a79..632c0c0a79 100644
--- a/builtin/repack.c
+++ b/third_party/git/builtin/repack.c
diff --git a/builtin/replace.c b/third_party/git/builtin/replace.c
index 644b21ca8d..644b21ca8d 100644
--- a/builtin/replace.c
+++ b/third_party/git/builtin/replace.c
diff --git a/builtin/rerere.c b/third_party/git/builtin/rerere.c
index fd3be17b97..fd3be17b97 100644
--- a/builtin/rerere.c
+++ b/third_party/git/builtin/rerere.c
diff --git a/builtin/reset.c b/third_party/git/builtin/reset.c
index fdd572168b..fdd572168b 100644
--- a/builtin/reset.c
+++ b/third_party/git/builtin/reset.c
diff --git a/builtin/rev-list.c b/third_party/git/builtin/rev-list.c
index 301ccb970b..301ccb970b 100644
--- a/builtin/rev-list.c
+++ b/third_party/git/builtin/rev-list.c
diff --git a/builtin/rev-parse.c b/third_party/git/builtin/rev-parse.c
index f8bbe6d47e..f8bbe6d47e 100644
--- a/builtin/rev-parse.c
+++ b/third_party/git/builtin/rev-parse.c
diff --git a/builtin/revert.c b/third_party/git/builtin/revert.c
index f61cc5d82c..f61cc5d82c 100644
--- a/builtin/revert.c
+++ b/third_party/git/builtin/revert.c
diff --git a/builtin/rm.c b/third_party/git/builtin/rm.c
index 19ce95a901..19ce95a901 100644
--- a/builtin/rm.c
+++ b/third_party/git/builtin/rm.c
diff --git a/builtin/send-pack.c b/third_party/git/builtin/send-pack.c
index 098ebf22d0..098ebf22d0 100644
--- a/builtin/send-pack.c
+++ b/third_party/git/builtin/send-pack.c
diff --git a/builtin/shortlog.c b/third_party/git/builtin/shortlog.c
index 65cd41392c..65cd41392c 100644
--- a/builtin/shortlog.c
+++ b/third_party/git/builtin/shortlog.c
diff --git a/builtin/show-branch.c b/third_party/git/builtin/show-branch.c
index 35d7f51c23..35d7f51c23 100644
--- a/builtin/show-branch.c
+++ b/third_party/git/builtin/show-branch.c
diff --git a/builtin/show-index.c b/third_party/git/builtin/show-index.c
index a6e678809e..a6e678809e 100644
--- a/builtin/show-index.c
+++ b/third_party/git/builtin/show-index.c
diff --git a/builtin/show-ref.c b/third_party/git/builtin/show-ref.c
index 6456da70cc..6456da70cc 100644
--- a/builtin/show-ref.c
+++ b/third_party/git/builtin/show-ref.c
diff --git a/builtin/stash.c b/third_party/git/builtin/stash.c
index b5a301f24d..b5a301f24d 100644
--- a/builtin/stash.c
+++ b/third_party/git/builtin/stash.c
diff --git a/builtin/stripspace.c b/third_party/git/builtin/stripspace.c
index be33eb83c1..be33eb83c1 100644
--- a/builtin/stripspace.c
+++ b/third_party/git/builtin/stripspace.c
diff --git a/builtin/submodule--helper.c b/third_party/git/builtin/submodule--helper.c
index 909e77e802..909e77e802 100644
--- a/builtin/submodule--helper.c
+++ b/third_party/git/builtin/submodule--helper.c
diff --git a/builtin/symbolic-ref.c b/third_party/git/builtin/symbolic-ref.c
index 80237f0df1..80237f0df1 100644
--- a/builtin/symbolic-ref.c
+++ b/third_party/git/builtin/symbolic-ref.c
diff --git a/builtin/tag.c b/third_party/git/builtin/tag.c
index e0a4c25382..e0a4c25382 100644
--- a/builtin/tag.c
+++ b/third_party/git/builtin/tag.c
diff --git a/builtin/unpack-file.c b/third_party/git/builtin/unpack-file.c
index 58652229f2..58652229f2 100644
--- a/builtin/unpack-file.c
+++ b/third_party/git/builtin/unpack-file.c
diff --git a/builtin/unpack-objects.c b/third_party/git/builtin/unpack-objects.c
index a87a4bfd2c..a87a4bfd2c 100644
--- a/builtin/unpack-objects.c
+++ b/third_party/git/builtin/unpack-objects.c
diff --git a/builtin/update-index.c b/third_party/git/builtin/update-index.c
index dff2f4b837..dff2f4b837 100644
--- a/builtin/update-index.c
+++ b/third_party/git/builtin/update-index.c
diff --git a/builtin/update-ref.c b/third_party/git/builtin/update-ref.c
index 2d8f7f0578..2d8f7f0578 100644
--- a/builtin/update-ref.c
+++ b/third_party/git/builtin/update-ref.c
diff --git a/builtin/update-server-info.c b/third_party/git/builtin/update-server-info.c
index 4321a34456..4321a34456 100644
--- a/builtin/update-server-info.c
+++ b/third_party/git/builtin/update-server-info.c
diff --git a/builtin/upload-archive.c b/third_party/git/builtin/upload-archive.c
index 018879737a..018879737a 100644
--- a/builtin/upload-archive.c
+++ b/third_party/git/builtin/upload-archive.c
diff --git a/builtin/upload-pack.c b/third_party/git/builtin/upload-pack.c
index 6da8fa2607..6da8fa2607 100644
--- a/builtin/upload-pack.c
+++ b/third_party/git/builtin/upload-pack.c
diff --git a/builtin/var.c b/third_party/git/builtin/var.c
index 6c6f46b4ae..6c6f46b4ae 100644
--- a/builtin/var.c
+++ b/third_party/git/builtin/var.c
diff --git a/builtin/verify-commit.c b/third_party/git/builtin/verify-commit.c
index 40c69a0bed..40c69a0bed 100644
--- a/builtin/verify-commit.c
+++ b/third_party/git/builtin/verify-commit.c
diff --git a/builtin/verify-pack.c b/third_party/git/builtin/verify-pack.c
index c2a1a5c504..c2a1a5c504 100644
--- a/builtin/verify-pack.c
+++ b/third_party/git/builtin/verify-pack.c
diff --git a/builtin/verify-tag.c b/third_party/git/builtin/verify-tag.c
index f45136a06b..f45136a06b 100644
--- a/builtin/verify-tag.c
+++ b/third_party/git/builtin/verify-tag.c
diff --git a/builtin/worktree.c b/third_party/git/builtin/worktree.c
index a5bb02b207..a5bb02b207 100644
--- a/builtin/worktree.c
+++ b/third_party/git/builtin/worktree.c
diff --git a/builtin/write-tree.c b/third_party/git/builtin/write-tree.c
index 45d61707e7..45d61707e7 100644
--- a/builtin/write-tree.c
+++ b/third_party/git/builtin/write-tree.c
diff --git a/bulk-checkin.c b/third_party/git/bulk-checkin.c
index 39ee7d6107..39ee7d6107 100644
--- a/bulk-checkin.c
+++ b/third_party/git/bulk-checkin.c
diff --git a/bulk-checkin.h b/third_party/git/bulk-checkin.h
index b26f3dc3b7..b26f3dc3b7 100644
--- a/bulk-checkin.h
+++ b/third_party/git/bulk-checkin.h
diff --git a/bundle.c b/third_party/git/bundle.c
index b5d21cd80f..b5d21cd80f 100644
--- a/bundle.c
+++ b/third_party/git/bundle.c
diff --git a/bundle.h b/third_party/git/bundle.h
index 37c37d7f65..37c37d7f65 100644
--- a/bundle.h
+++ b/third_party/git/bundle.h
diff --git a/cache-tree.c b/third_party/git/cache-tree.c
index 706ffcf188..706ffcf188 100644
--- a/cache-tree.c
+++ b/third_party/git/cache-tree.c
diff --git a/cache-tree.h b/third_party/git/cache-tree.h
index 757bbc48bc..757bbc48bc 100644
--- a/cache-tree.h
+++ b/third_party/git/cache-tree.h
diff --git a/cache.h b/third_party/git/cache.h
index b1da1ab08f..b1da1ab08f 100644
--- a/cache.h
+++ b/third_party/git/cache.h
diff --git a/chdir-notify.c b/third_party/git/chdir-notify.c
index 5f7f2c2ac2..5f7f2c2ac2 100644
--- a/chdir-notify.c
+++ b/third_party/git/chdir-notify.c
diff --git a/chdir-notify.h b/third_party/git/chdir-notify.h
index 366e4c1ee9..366e4c1ee9 100644
--- a/chdir-notify.h
+++ b/third_party/git/chdir-notify.h
diff --git a/check-builtins.sh b/third_party/git/check-builtins.sh
index a0aaf3a347..a0aaf3a347 100755
--- a/check-builtins.sh
+++ b/third_party/git/check-builtins.sh
diff --git a/check_bindir b/third_party/git/check_bindir
index 623eadcbb7..623eadcbb7 100755
--- a/check_bindir
+++ b/third_party/git/check_bindir
diff --git a/checkout.c b/third_party/git/checkout.c
index c72e9f9773..c72e9f9773 100644
--- a/checkout.c
+++ b/third_party/git/checkout.c
diff --git a/checkout.h b/third_party/git/checkout.h
index 1152133bd7..1152133bd7 100644
--- a/checkout.h
+++ b/third_party/git/checkout.h
diff --git a/ci/install-dependencies.sh b/third_party/git/ci/install-dependencies.sh
index 8cc72503cb..8cc72503cb 100755
--- a/ci/install-dependencies.sh
+++ b/third_party/git/ci/install-dependencies.sh
diff --git a/ci/lib.sh b/third_party/git/ci/lib.sh
index 44db2d5cbb..44db2d5cbb 100755
--- a/ci/lib.sh
+++ b/third_party/git/ci/lib.sh
diff --git a/ci/make-test-artifacts.sh b/third_party/git/ci/make-test-artifacts.sh
index 646967481f..646967481f 100755
--- a/ci/make-test-artifacts.sh
+++ b/third_party/git/ci/make-test-artifacts.sh
diff --git a/ci/mount-fileshare.sh b/third_party/git/ci/mount-fileshare.sh
index 26b58a8096..26b58a8096 100755
--- a/ci/mount-fileshare.sh
+++ b/third_party/git/ci/mount-fileshare.sh
diff --git a/ci/print-test-failures.sh b/third_party/git/ci/print-test-failures.sh
index e688a26f0d..e688a26f0d 100755
--- a/ci/print-test-failures.sh
+++ b/third_party/git/ci/print-test-failures.sh
diff --git a/ci/run-build-and-tests.sh b/third_party/git/ci/run-build-and-tests.sh
index ff0ef7f08e..ff0ef7f08e 100755
--- a/ci/run-build-and-tests.sh
+++ b/third_party/git/ci/run-build-and-tests.sh
diff --git a/ci/run-linux32-build.sh b/third_party/git/ci/run-linux32-build.sh
index e3a193adbc..e3a193adbc 100755
--- a/ci/run-linux32-build.sh
+++ b/third_party/git/ci/run-linux32-build.sh
diff --git a/ci/run-linux32-docker.sh b/third_party/git/ci/run-linux32-docker.sh
index 751acfcf8a..751acfcf8a 100755
--- a/ci/run-linux32-docker.sh
+++ b/third_party/git/ci/run-linux32-docker.sh
diff --git a/ci/run-static-analysis.sh b/third_party/git/ci/run-static-analysis.sh
index a19aa7ebbc..a19aa7ebbc 100755
--- a/ci/run-static-analysis.sh
+++ b/third_party/git/ci/run-static-analysis.sh
diff --git a/ci/run-test-slice.sh b/third_party/git/ci/run-test-slice.sh
index f8c2c3106a..f8c2c3106a 100755
--- a/ci/run-test-slice.sh
+++ b/third_party/git/ci/run-test-slice.sh
diff --git a/ci/test-documentation.sh b/third_party/git/ci/test-documentation.sh
index d49089832d..d49089832d 100755
--- a/ci/test-documentation.sh
+++ b/third_party/git/ci/test-documentation.sh
diff --git a/ci/util/extract-trash-dirs.sh b/third_party/git/ci/util/extract-trash-dirs.sh
index 8e67bec21a..8e67bec21a 100755
--- a/ci/util/extract-trash-dirs.sh
+++ b/third_party/git/ci/util/extract-trash-dirs.sh
diff --git a/color.c b/third_party/git/color.c
index ebb222ec33..ebb222ec33 100644
--- a/color.c
+++ b/third_party/git/color.c
diff --git a/color.h b/third_party/git/color.h
index 98894d6a17..98894d6a17 100644
--- a/color.h
+++ b/third_party/git/color.h
diff --git a/column.c b/third_party/git/column.c
index 7a17c14b82..7a17c14b82 100644
--- a/column.c
+++ b/third_party/git/column.c
diff --git a/column.h b/third_party/git/column.h
index 448c7440b3..448c7440b3 100644
--- a/column.h
+++ b/third_party/git/column.h
diff --git a/combine-diff.c b/third_party/git/combine-diff.c
index 3e49f3bda8..3e49f3bda8 100644
--- a/combine-diff.c
+++ b/third_party/git/combine-diff.c
diff --git a/command-list.txt b/third_party/git/command-list.txt
index a9ac72bef4..a9ac72bef4 100644
--- a/command-list.txt
+++ b/third_party/git/command-list.txt
diff --git a/commit-graph.c b/third_party/git/commit-graph.c
index fe954ab5f8..fe954ab5f8 100644
--- a/commit-graph.c
+++ b/third_party/git/commit-graph.c
diff --git a/commit-graph.h b/third_party/git/commit-graph.h
index df9a3b20e4..df9a3b20e4 100644
--- a/commit-graph.h
+++ b/third_party/git/commit-graph.h
diff --git a/commit-reach.c b/third_party/git/commit-reach.c
index 3ea174788a..3ea174788a 100644
--- a/commit-reach.c
+++ b/third_party/git/commit-reach.c
diff --git a/commit-reach.h b/third_party/git/commit-reach.h
index 99a43e8b64..99a43e8b64 100644
--- a/commit-reach.h
+++ b/third_party/git/commit-reach.h
diff --git a/commit-slab-decl.h b/third_party/git/commit-slab-decl.h
index adc7b46c83..adc7b46c83 100644
--- a/commit-slab-decl.h
+++ b/third_party/git/commit-slab-decl.h
diff --git a/commit-slab-impl.h b/third_party/git/commit-slab-impl.h
index 5c0eb91a5d..5c0eb91a5d 100644
--- a/commit-slab-impl.h
+++ b/third_party/git/commit-slab-impl.h
diff --git a/commit-slab.h b/third_party/git/commit-slab.h
index 69bf0c807c..69bf0c807c 100644
--- a/commit-slab.h
+++ b/third_party/git/commit-slab.h
diff --git a/commit.c b/third_party/git/commit.c
index a98de16e3d..a98de16e3d 100644
--- a/commit.c
+++ b/third_party/git/commit.c
diff --git a/commit.h b/third_party/git/commit.h
index f5295ca7f3..f5295ca7f3 100644
--- a/commit.h
+++ b/third_party/git/commit.h
diff --git a/common-main.c b/third_party/git/common-main.c
index 582a7b1886..582a7b1886 100644
--- a/common-main.c
+++ b/third_party/git/common-main.c
diff --git a/compat/access.c b/third_party/git/compat/access.c
index 19fda3e877..19fda3e877 100644
--- a/compat/access.c
+++ b/third_party/git/compat/access.c
diff --git a/compat/apple-common-crypto.h b/third_party/git/compat/apple-common-crypto.h
index 11727f3e1e..11727f3e1e 100644
--- a/compat/apple-common-crypto.h
+++ b/third_party/git/compat/apple-common-crypto.h
diff --git a/compat/basename.c b/third_party/git/compat/basename.c
index 96bd9533b4..96bd9533b4 100644
--- a/compat/basename.c
+++ b/third_party/git/compat/basename.c
diff --git a/compat/bswap.h b/third_party/git/compat/bswap.h
index e4e25735ce..e4e25735ce 100644
--- a/compat/bswap.h
+++ b/third_party/git/compat/bswap.h
diff --git a/compat/fileno.c b/third_party/git/compat/fileno.c
index 8e80ef335d..8e80ef335d 100644
--- a/compat/fileno.c
+++ b/third_party/git/compat/fileno.c
diff --git a/compat/fopen.c b/third_party/git/compat/fopen.c
index 107b3e8182..107b3e8182 100644
--- a/compat/fopen.c
+++ b/third_party/git/compat/fopen.c
diff --git a/compat/gmtime.c b/third_party/git/compat/gmtime.c
index e8362dd2b9..e8362dd2b9 100644
--- a/compat/gmtime.c
+++ b/third_party/git/compat/gmtime.c
diff --git a/compat/hstrerror.c b/third_party/git/compat/hstrerror.c
index b85a2fa956..b85a2fa956 100644
--- a/compat/hstrerror.c
+++ b/third_party/git/compat/hstrerror.c
diff --git a/compat/inet_ntop.c b/third_party/git/compat/inet_ntop.c
index 68307262be..68307262be 100644
--- a/compat/inet_ntop.c
+++ b/third_party/git/compat/inet_ntop.c
diff --git a/compat/inet_pton.c b/third_party/git/compat/inet_pton.c
index 2b9a0a4e22..2b9a0a4e22 100644
--- a/compat/inet_pton.c
+++ b/third_party/git/compat/inet_pton.c
diff --git a/compat/memmem.c b/third_party/git/compat/memmem.c
index 56bcb4277f..56bcb4277f 100644
--- a/compat/memmem.c
+++ b/third_party/git/compat/memmem.c
diff --git a/compat/mingw.c b/third_party/git/compat/mingw.c
index 738f0a826a..738f0a826a 100644
--- a/compat/mingw.c
+++ b/third_party/git/compat/mingw.c
diff --git a/compat/mingw.h b/third_party/git/compat/mingw.h
index a03e40e6e2..a03e40e6e2 100644
--- a/compat/mingw.h
+++ b/third_party/git/compat/mingw.h
diff --git a/compat/mkdir.c b/third_party/git/compat/mkdir.c
index 9e253fb72f..9e253fb72f 100644
--- a/compat/mkdir.c
+++ b/third_party/git/compat/mkdir.c
diff --git a/compat/mkdtemp.c b/third_party/git/compat/mkdtemp.c
index 1136119592..1136119592 100644
--- a/compat/mkdtemp.c
+++ b/third_party/git/compat/mkdtemp.c
diff --git a/compat/mmap.c b/third_party/git/compat/mmap.c
index 14d31010df..14d31010df 100644
--- a/compat/mmap.c
+++ b/third_party/git/compat/mmap.c
diff --git a/compat/msvc.c b/third_party/git/compat/msvc.c
index 71843d7eef..71843d7eef 100644
--- a/compat/msvc.c
+++ b/third_party/git/compat/msvc.c
diff --git a/compat/msvc.h b/third_party/git/compat/msvc.h
index 1d7a8c6145..1d7a8c6145 100644
--- a/compat/msvc.h
+++ b/third_party/git/compat/msvc.h
diff --git a/compat/nedmalloc/License.txt b/third_party/git/compat/nedmalloc/License.txt
index 36b7cd93cd..36b7cd93cd 100644
--- a/compat/nedmalloc/License.txt
+++ b/third_party/git/compat/nedmalloc/License.txt
diff --git a/compat/nedmalloc/Readme.txt b/third_party/git/compat/nedmalloc/Readme.txt
index 07cbf50c0f..07cbf50c0f 100644
--- a/compat/nedmalloc/Readme.txt
+++ b/third_party/git/compat/nedmalloc/Readme.txt
diff --git a/compat/nedmalloc/malloc.c.h b/third_party/git/compat/nedmalloc/malloc.c.h
index b833ff9225..b833ff9225 100644
--- a/compat/nedmalloc/malloc.c.h
+++ b/third_party/git/compat/nedmalloc/malloc.c.h
diff --git a/compat/nedmalloc/nedmalloc.c b/third_party/git/compat/nedmalloc/nedmalloc.c
index 1cc31c3502..1cc31c3502 100644
--- a/compat/nedmalloc/nedmalloc.c
+++ b/third_party/git/compat/nedmalloc/nedmalloc.c
diff --git a/compat/nedmalloc/nedmalloc.h b/third_party/git/compat/nedmalloc/nedmalloc.h
index f960e66063..f960e66063 100644
--- a/compat/nedmalloc/nedmalloc.h
+++ b/third_party/git/compat/nedmalloc/nedmalloc.h
diff --git a/compat/obstack.c b/third_party/git/compat/obstack.c
index 27cd5c1ea1..27cd5c1ea1 100644
--- a/compat/obstack.c
+++ b/third_party/git/compat/obstack.c
diff --git a/compat/obstack.h b/third_party/git/compat/obstack.h
index ae36ed6a66..ae36ed6a66 100644
--- a/compat/obstack.h
+++ b/third_party/git/compat/obstack.h
diff --git a/compat/poll/poll.c b/third_party/git/compat/poll/poll.c
index 0e95dd493c..0e95dd493c 100644
--- a/compat/poll/poll.c
+++ b/third_party/git/compat/poll/poll.c
diff --git a/compat/poll/poll.h b/third_party/git/compat/poll/poll.h
index 1e1597360f..1e1597360f 100644
--- a/compat/poll/poll.h
+++ b/third_party/git/compat/poll/poll.h
diff --git a/compat/pread.c b/third_party/git/compat/pread.c
index 978cac4ec9..978cac4ec9 100644
--- a/compat/pread.c
+++ b/third_party/git/compat/pread.c
diff --git a/compat/precompose_utf8.c b/third_party/git/compat/precompose_utf8.c
index 136250fbf6..136250fbf6 100644
--- a/compat/precompose_utf8.c
+++ b/third_party/git/compat/precompose_utf8.c
diff --git a/compat/precompose_utf8.h b/third_party/git/compat/precompose_utf8.h
index 6f843d3e1a..6f843d3e1a 100644
--- a/compat/precompose_utf8.h
+++ b/third_party/git/compat/precompose_utf8.h
diff --git a/compat/qsort.c b/third_party/git/compat/qsort.c
index 7d071afb70..7d071afb70 100644
--- a/compat/qsort.c
+++ b/third_party/git/compat/qsort.c
diff --git a/compat/qsort_s.c b/third_party/git/compat/qsort_s.c
index 52d1f0a73d..52d1f0a73d 100644
--- a/compat/qsort_s.c
+++ b/third_party/git/compat/qsort_s.c
diff --git a/compat/regex/regcomp.c b/third_party/git/compat/regex/regcomp.c
index c0d838834a..c0d838834a 100644
--- a/compat/regex/regcomp.c
+++ b/third_party/git/compat/regex/regcomp.c
diff --git a/compat/regex/regex.c b/third_party/git/compat/regex/regex.c
index f3e03a9eab..f3e03a9eab 100644
--- a/compat/regex/regex.c
+++ b/third_party/git/compat/regex/regex.c
diff --git a/compat/regex/regex.h b/third_party/git/compat/regex/regex.h
index 4d81358a83..4d81358a83 100644
--- a/compat/regex/regex.h
+++ b/third_party/git/compat/regex/regex.h
diff --git a/compat/regex/regex_internal.c b/third_party/git/compat/regex/regex_internal.c
index 59bf151336..59bf151336 100644
--- a/compat/regex/regex_internal.c
+++ b/third_party/git/compat/regex/regex_internal.c
diff --git a/compat/regex/regex_internal.h b/third_party/git/compat/regex/regex_internal.h
index 3ee8aae59d..3ee8aae59d 100644
--- a/compat/regex/regex_internal.h
+++ b/third_party/git/compat/regex/regex_internal.h
diff --git a/compat/regex/regexec.c b/third_party/git/compat/regex/regexec.c
index 1b5d89fd5e..1b5d89fd5e 100644
--- a/compat/regex/regexec.c
+++ b/third_party/git/compat/regex/regexec.c
diff --git a/compat/setenv.c b/third_party/git/compat/setenv.c
index 7849f258d2..7849f258d2 100644
--- a/compat/setenv.c
+++ b/third_party/git/compat/setenv.c
diff --git a/compat/sha1-chunked.c b/third_party/git/compat/sha1-chunked.c
index 6adfcfd540..6adfcfd540 100644
--- a/compat/sha1-chunked.c
+++ b/third_party/git/compat/sha1-chunked.c
diff --git a/compat/sha1-chunked.h b/third_party/git/compat/sha1-chunked.h
index 7b2df28eec..7b2df28eec 100644
--- a/compat/sha1-chunked.h
+++ b/third_party/git/compat/sha1-chunked.h
diff --git a/compat/snprintf.c b/third_party/git/compat/snprintf.c
index 0b11688537..0b11688537 100644
--- a/compat/snprintf.c
+++ b/third_party/git/compat/snprintf.c
diff --git a/compat/stat.c b/third_party/git/compat/stat.c
index a2d3931cb7..a2d3931cb7 100644
--- a/compat/stat.c
+++ b/third_party/git/compat/stat.c
diff --git a/compat/strcasestr.c b/third_party/git/compat/strcasestr.c
index 26896deca6..26896deca6 100644
--- a/compat/strcasestr.c
+++ b/third_party/git/compat/strcasestr.c
diff --git a/compat/strdup.c b/third_party/git/compat/strdup.c
index f3fb978eb3..f3fb978eb3 100644
--- a/compat/strdup.c
+++ b/third_party/git/compat/strdup.c
diff --git a/compat/strlcpy.c b/third_party/git/compat/strlcpy.c
index 4024c36030..4024c36030 100644
--- a/compat/strlcpy.c
+++ b/third_party/git/compat/strlcpy.c
diff --git a/compat/strtoimax.c b/third_party/git/compat/strtoimax.c
index ac09ed89e7..ac09ed89e7 100644
--- a/compat/strtoimax.c
+++ b/third_party/git/compat/strtoimax.c
diff --git a/compat/strtoumax.c b/third_party/git/compat/strtoumax.c
index 5541353a77..5541353a77 100644
--- a/compat/strtoumax.c
+++ b/third_party/git/compat/strtoumax.c
diff --git a/compat/terminal.c b/third_party/git/compat/terminal.c
index fa13ee672d..fa13ee672d 100644
--- a/compat/terminal.c
+++ b/third_party/git/compat/terminal.c
diff --git a/compat/terminal.h b/third_party/git/compat/terminal.h
index 97db7cd69d..97db7cd69d 100644
--- a/compat/terminal.h
+++ b/third_party/git/compat/terminal.h
diff --git a/compat/unsetenv.c b/third_party/git/compat/unsetenv.c
index bf5fd7063b..bf5fd7063b 100644
--- a/compat/unsetenv.c
+++ b/third_party/git/compat/unsetenv.c
diff --git a/compat/vcbuild/.gitignore b/third_party/git/compat/vcbuild/.gitignore
index 8f8b794ef3..8f8b794ef3 100644
--- a/compat/vcbuild/.gitignore
+++ b/third_party/git/compat/vcbuild/.gitignore
diff --git a/compat/vcbuild/README b/third_party/git/compat/vcbuild/README
index 1b6dabf5a2..1b6dabf5a2 100644
--- a/compat/vcbuild/README
+++ b/third_party/git/compat/vcbuild/README
diff --git a/compat/vcbuild/find_vs_env.bat b/third_party/git/compat/vcbuild/find_vs_env.bat
index 40194dd230..40194dd230 100644
--- a/compat/vcbuild/find_vs_env.bat
+++ b/third_party/git/compat/vcbuild/find_vs_env.bat
diff --git a/compat/vcbuild/include/sys/param.h b/third_party/git/compat/vcbuild/include/sys/param.h
index 0d8552a2c6..0d8552a2c6 100644
--- a/compat/vcbuild/include/sys/param.h
+++ b/third_party/git/compat/vcbuild/include/sys/param.h
diff --git a/compat/vcbuild/include/sys/time.h b/third_party/git/compat/vcbuild/include/sys/time.h
index 0d8552a2c6..0d8552a2c6 100644
--- a/compat/vcbuild/include/sys/time.h
+++ b/third_party/git/compat/vcbuild/include/sys/time.h
diff --git a/compat/vcbuild/include/sys/utime.h b/third_party/git/compat/vcbuild/include/sys/utime.h
index 582589c70a..582589c70a 100644
--- a/compat/vcbuild/include/sys/utime.h
+++ b/third_party/git/compat/vcbuild/include/sys/utime.h
diff --git a/compat/vcbuild/include/unistd.h b/third_party/git/compat/vcbuild/include/unistd.h
index 3a959d124c..3a959d124c 100644
--- a/compat/vcbuild/include/unistd.h
+++ b/third_party/git/compat/vcbuild/include/unistd.h
diff --git a/compat/vcbuild/include/utime.h b/third_party/git/compat/vcbuild/include/utime.h
index 8285f38fde..8285f38fde 100644
--- a/compat/vcbuild/include/utime.h
+++ b/third_party/git/compat/vcbuild/include/utime.h
diff --git a/compat/vcbuild/scripts/clink.pl b/third_party/git/compat/vcbuild/scripts/clink.pl
index c7b021bfac..c7b021bfac 100755
--- a/compat/vcbuild/scripts/clink.pl
+++ b/third_party/git/compat/vcbuild/scripts/clink.pl
diff --git a/compat/vcbuild/scripts/lib.pl b/third_party/git/compat/vcbuild/scripts/lib.pl
index d8054e469f..d8054e469f 100755
--- a/compat/vcbuild/scripts/lib.pl
+++ b/third_party/git/compat/vcbuild/scripts/lib.pl
diff --git a/compat/vcbuild/vcpkg_copy_dlls.bat b/third_party/git/compat/vcbuild/vcpkg_copy_dlls.bat
index 13661c14f8..13661c14f8 100644
--- a/compat/vcbuild/vcpkg_copy_dlls.bat
+++ b/third_party/git/compat/vcbuild/vcpkg_copy_dlls.bat
diff --git a/compat/vcbuild/vcpkg_install.bat b/third_party/git/compat/vcbuild/vcpkg_install.bat
index ebd0bad242..ebd0bad242 100644
--- a/compat/vcbuild/vcpkg_install.bat
+++ b/third_party/git/compat/vcbuild/vcpkg_install.bat
diff --git a/compat/win32.h b/third_party/git/compat/win32.h
index a97e880757..a97e880757 100644
--- a/compat/win32.h
+++ b/third_party/git/compat/win32.h
diff --git a/compat/win32/alloca.h b/third_party/git/compat/win32/alloca.h
index c0d7985b7e..c0d7985b7e 100644
--- a/compat/win32/alloca.h
+++ b/third_party/git/compat/win32/alloca.h
diff --git a/compat/win32/dirent.c b/third_party/git/compat/win32/dirent.c
index 52420ec7d4..52420ec7d4 100644
--- a/compat/win32/dirent.c
+++ b/third_party/git/compat/win32/dirent.c
diff --git a/compat/win32/dirent.h b/third_party/git/compat/win32/dirent.h
index 058207e4bf..058207e4bf 100644
--- a/compat/win32/dirent.h
+++ b/third_party/git/compat/win32/dirent.h
diff --git a/compat/win32/git.manifest b/third_party/git/compat/win32/git.manifest
index 771e3cce43..771e3cce43 100644
--- a/compat/win32/git.manifest
+++ b/third_party/git/compat/win32/git.manifest
diff --git a/compat/win32/lazyload.h b/third_party/git/compat/win32/lazyload.h
index 9e631c8593..9e631c8593 100644
--- a/compat/win32/lazyload.h
+++ b/third_party/git/compat/win32/lazyload.h
diff --git a/compat/win32/path-utils.c b/third_party/git/compat/win32/path-utils.c
index d9d3641de8..d9d3641de8 100644
--- a/compat/win32/path-utils.c
+++ b/third_party/git/compat/win32/path-utils.c
diff --git a/compat/win32/path-utils.h b/third_party/git/compat/win32/path-utils.h
index 0f70d43920..0f70d43920 100644
--- a/compat/win32/path-utils.h
+++ b/third_party/git/compat/win32/path-utils.h
diff --git a/compat/win32/pthread.c b/third_party/git/compat/win32/pthread.c
index 2e7eead42c..2e7eead42c 100644
--- a/compat/win32/pthread.c
+++ b/third_party/git/compat/win32/pthread.c
diff --git a/compat/win32/pthread.h b/third_party/git/compat/win32/pthread.h
index c6cb8dd219..c6cb8dd219 100644
--- a/compat/win32/pthread.h
+++ b/third_party/git/compat/win32/pthread.h
diff --git a/compat/win32/syslog.c b/third_party/git/compat/win32/syslog.c
index 161978d720..161978d720 100644
--- a/compat/win32/syslog.c
+++ b/third_party/git/compat/win32/syslog.c
diff --git a/compat/win32/syslog.h b/third_party/git/compat/win32/syslog.h
index 70daa7c08b..70daa7c08b 100644
--- a/compat/win32/syslog.h
+++ b/third_party/git/compat/win32/syslog.h
diff --git a/compat/win32/trace2_win32_process_info.c b/third_party/git/compat/win32/trace2_win32_process_info.c
index 8ccbd1c2c6..8ccbd1c2c6 100644
--- a/compat/win32/trace2_win32_process_info.c
+++ b/third_party/git/compat/win32/trace2_win32_process_info.c
diff --git a/compat/win32mmap.c b/third_party/git/compat/win32mmap.c
index 519d51f2b6..519d51f2b6 100644
--- a/compat/win32mmap.c
+++ b/third_party/git/compat/win32mmap.c
diff --git a/compat/winansi.c b/third_party/git/compat/winansi.c
index cacd82c833..cacd82c833 100644
--- a/compat/winansi.c
+++ b/third_party/git/compat/winansi.c
diff --git a/config.c b/third_party/git/config.c
index 3900e4947b..3900e4947b 100644
--- a/config.c
+++ b/third_party/git/config.c
diff --git a/config.h b/third_party/git/config.h
index f0ed464004..f0ed464004 100644
--- a/config.h
+++ b/third_party/git/config.h
diff --git a/config.mak.dev b/third_party/git/config.mak.dev
index bf1f3fcdee..bf1f3fcdee 100644
--- a/config.mak.dev
+++ b/third_party/git/config.mak.dev
diff --git a/config.mak.in b/third_party/git/config.mak.in
index e6a6d0f941..e6a6d0f941 100644
--- a/config.mak.in
+++ b/third_party/git/config.mak.in
diff --git a/config.mak.uname b/third_party/git/config.mak.uname
index db7f06b95f..db7f06b95f 100644
--- a/config.mak.uname
+++ b/third_party/git/config.mak.uname
diff --git a/configure.ac b/third_party/git/configure.ac
index a43b476402..a43b476402 100644
--- a/configure.ac
+++ b/third_party/git/configure.ac
diff --git a/connect.c b/third_party/git/connect.c
index 2778481264..2778481264 100644
--- a/connect.c
+++ b/third_party/git/connect.c
diff --git a/connect.h b/third_party/git/connect.h
index 5f2382e018..5f2382e018 100644
--- a/connect.h
+++ b/third_party/git/connect.h
diff --git a/connected.c b/third_party/git/connected.c
index cd9b324afa..cd9b324afa 100644
--- a/connected.c
+++ b/third_party/git/connected.c
diff --git a/connected.h b/third_party/git/connected.h
index ce2e7d8f2e..ce2e7d8f2e 100644
--- a/connected.h
+++ b/third_party/git/connected.h
diff --git a/contrib/README b/third_party/git/contrib/README
index 05f291c1f1..05f291c1f1 100644
--- a/contrib/README
+++ b/third_party/git/contrib/README
diff --git a/contrib/buildsystems/Generators.pm b/third_party/git/contrib/buildsystems/Generators.pm
index aa4cbaa2ad..aa4cbaa2ad 100644
--- a/contrib/buildsystems/Generators.pm
+++ b/third_party/git/contrib/buildsystems/Generators.pm
diff --git a/contrib/buildsystems/Generators/QMake.pm b/third_party/git/contrib/buildsystems/Generators/QMake.pm
index ff3b657e61..ff3b657e61 100644
--- a/contrib/buildsystems/Generators/QMake.pm
+++ b/third_party/git/contrib/buildsystems/Generators/QMake.pm
diff --git a/contrib/buildsystems/Generators/Vcproj.pm b/third_party/git/contrib/buildsystems/Generators/Vcproj.pm
index 737647e76a..737647e76a 100644
--- a/contrib/buildsystems/Generators/Vcproj.pm
+++ b/third_party/git/contrib/buildsystems/Generators/Vcproj.pm
diff --git a/contrib/buildsystems/Generators/Vcxproj.pm b/third_party/git/contrib/buildsystems/Generators/Vcxproj.pm
index 576ccabe1d..576ccabe1d 100644
--- a/contrib/buildsystems/Generators/Vcxproj.pm
+++ b/third_party/git/contrib/buildsystems/Generators/Vcxproj.pm
diff --git a/contrib/buildsystems/engine.pl b/third_party/git/contrib/buildsystems/engine.pl
index fba8a3f056..fba8a3f056 100755
--- a/contrib/buildsystems/engine.pl
+++ b/third_party/git/contrib/buildsystems/engine.pl
diff --git a/contrib/buildsystems/generate b/third_party/git/contrib/buildsystems/generate
index bc10f25ff2..bc10f25ff2 100755
--- a/contrib/buildsystems/generate
+++ b/third_party/git/contrib/buildsystems/generate
diff --git a/contrib/buildsystems/parse.pl b/third_party/git/contrib/buildsystems/parse.pl
index c9656ece99..c9656ece99 100755
--- a/contrib/buildsystems/parse.pl
+++ b/third_party/git/contrib/buildsystems/parse.pl
diff --git a/contrib/coccinelle/.gitignore b/third_party/git/contrib/coccinelle/.gitignore
index d3f29646dc..d3f29646dc 100644
--- a/contrib/coccinelle/.gitignore
+++ b/third_party/git/contrib/coccinelle/.gitignore
diff --git a/contrib/coccinelle/README b/third_party/git/contrib/coccinelle/README
index f0e80bd7f0..f0e80bd7f0 100644
--- a/contrib/coccinelle/README
+++ b/third_party/git/contrib/coccinelle/README
diff --git a/contrib/coccinelle/array.cocci b/third_party/git/contrib/coccinelle/array.cocci
index 46b8d2ee11..46b8d2ee11 100644
--- a/contrib/coccinelle/array.cocci
+++ b/third_party/git/contrib/coccinelle/array.cocci
diff --git a/contrib/coccinelle/commit.cocci b/third_party/git/contrib/coccinelle/commit.cocci
index d03453341e..d03453341e 100644
--- a/contrib/coccinelle/commit.cocci
+++ b/third_party/git/contrib/coccinelle/commit.cocci
diff --git a/contrib/coccinelle/flex_alloc.cocci b/third_party/git/contrib/coccinelle/flex_alloc.cocci
index e9f7f6d861..e9f7f6d861 100644
--- a/contrib/coccinelle/flex_alloc.cocci
+++ b/third_party/git/contrib/coccinelle/flex_alloc.cocci
diff --git a/contrib/coccinelle/free.cocci b/third_party/git/contrib/coccinelle/free.cocci
index 4490069df9..4490069df9 100644
--- a/contrib/coccinelle/free.cocci
+++ b/third_party/git/contrib/coccinelle/free.cocci
diff --git a/contrib/coccinelle/object_id.cocci b/third_party/git/contrib/coccinelle/object_id.cocci
index 3e536a9834..3e536a9834 100644
--- a/contrib/coccinelle/object_id.cocci
+++ b/third_party/git/contrib/coccinelle/object_id.cocci
diff --git a/contrib/coccinelle/preincr.cocci b/third_party/git/contrib/coccinelle/preincr.cocci
index 7fe1e8d2d9..7fe1e8d2d9 100644
--- a/contrib/coccinelle/preincr.cocci
+++ b/third_party/git/contrib/coccinelle/preincr.cocci
diff --git a/contrib/coccinelle/qsort.cocci b/third_party/git/contrib/coccinelle/qsort.cocci
index 22b93a9966..22b93a9966 100644
--- a/contrib/coccinelle/qsort.cocci
+++ b/third_party/git/contrib/coccinelle/qsort.cocci
diff --git a/contrib/coccinelle/strbuf.cocci b/third_party/git/contrib/coccinelle/strbuf.cocci
index d9ada69b43..d9ada69b43 100644
--- a/contrib/coccinelle/strbuf.cocci
+++ b/third_party/git/contrib/coccinelle/strbuf.cocci
diff --git a/contrib/coccinelle/swap.cocci b/third_party/git/contrib/coccinelle/swap.cocci
index a0934d1fda..a0934d1fda 100644
--- a/contrib/coccinelle/swap.cocci
+++ b/third_party/git/contrib/coccinelle/swap.cocci
diff --git a/contrib/coccinelle/the_repository.pending.cocci b/third_party/git/contrib/coccinelle/the_repository.pending.cocci
index 2ee702ecf7..2ee702ecf7 100644
--- a/contrib/coccinelle/the_repository.pending.cocci
+++ b/third_party/git/contrib/coccinelle/the_repository.pending.cocci
diff --git a/contrib/coccinelle/xstrdup_or_null.cocci b/third_party/git/contrib/coccinelle/xstrdup_or_null.cocci
index 8e05d1ca4b..8e05d1ca4b 100644
--- a/contrib/coccinelle/xstrdup_or_null.cocci
+++ b/third_party/git/contrib/coccinelle/xstrdup_or_null.cocci
diff --git a/contrib/completion/.gitattributes b/third_party/git/contrib/completion/.gitattributes
index 19116944c1..19116944c1 100644
--- a/contrib/completion/.gitattributes
+++ b/third_party/git/contrib/completion/.gitattributes
diff --git a/contrib/completion/git-completion.bash b/third_party/git/contrib/completion/git-completion.bash
index e087c4bf00..e087c4bf00 100644
--- a/contrib/completion/git-completion.bash
+++ b/third_party/git/contrib/completion/git-completion.bash
diff --git a/contrib/completion/git-completion.tcsh b/third_party/git/contrib/completion/git-completion.tcsh
index 4a790d8f4e..4a790d8f4e 100644
--- a/contrib/completion/git-completion.tcsh
+++ b/third_party/git/contrib/completion/git-completion.tcsh
diff --git a/contrib/completion/git-completion.zsh b/third_party/git/contrib/completion/git-completion.zsh
index 886bf95d1f..886bf95d1f 100644
--- a/contrib/completion/git-completion.zsh
+++ b/third_party/git/contrib/completion/git-completion.zsh
diff --git a/contrib/completion/git-prompt.sh b/third_party/git/contrib/completion/git-prompt.sh
index 1d510cd47b..1d510cd47b 100644
--- a/contrib/completion/git-prompt.sh
+++ b/third_party/git/contrib/completion/git-prompt.sh
diff --git a/contrib/contacts/.gitignore b/third_party/git/contrib/contacts/.gitignore
index f385ee643c..f385ee643c 100644
--- a/contrib/contacts/.gitignore
+++ b/third_party/git/contrib/contacts/.gitignore
diff --git a/contrib/contacts/Makefile b/third_party/git/contrib/contacts/Makefile
index a2990f0dcb..a2990f0dcb 100644
--- a/contrib/contacts/Makefile
+++ b/third_party/git/contrib/contacts/Makefile
diff --git a/contrib/contacts/git-contacts b/third_party/git/contrib/contacts/git-contacts
index 85ad732fc0..85ad732fc0 100755
--- a/contrib/contacts/git-contacts
+++ b/third_party/git/contrib/contacts/git-contacts
diff --git a/contrib/contacts/git-contacts.txt b/third_party/git/contrib/contacts/git-contacts.txt
index dd914d1261..dd914d1261 100644
--- a/contrib/contacts/git-contacts.txt
+++ b/third_party/git/contrib/contacts/git-contacts.txt
diff --git a/contrib/coverage-diff.sh b/third_party/git/contrib/coverage-diff.sh
index 4ec419f900..4ec419f900 100755
--- a/contrib/coverage-diff.sh
+++ b/third_party/git/contrib/coverage-diff.sh
diff --git a/contrib/credential/gnome-keyring/.gitignore b/third_party/git/contrib/credential/gnome-keyring/.gitignore
index 88d8fcdbce..88d8fcdbce 100644
--- a/contrib/credential/gnome-keyring/.gitignore
+++ b/third_party/git/contrib/credential/gnome-keyring/.gitignore
diff --git a/contrib/credential/gnome-keyring/Makefile b/third_party/git/contrib/credential/gnome-keyring/Makefile
index 22c19df94b..22c19df94b 100644
--- a/contrib/credential/gnome-keyring/Makefile
+++ b/third_party/git/contrib/credential/gnome-keyring/Makefile
diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/third_party/git/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c
index d389bfadce..d389bfadce 100644
--- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c
+++ b/third_party/git/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c
diff --git a/contrib/credential/libsecret/Makefile b/third_party/git/contrib/credential/libsecret/Makefile
index 3e67552cc5..3e67552cc5 100644
--- a/contrib/credential/libsecret/Makefile
+++ b/third_party/git/contrib/credential/libsecret/Makefile
diff --git a/contrib/credential/libsecret/git-credential-libsecret.c b/third_party/git/contrib/credential/libsecret/git-credential-libsecret.c
index e6598b6383..e6598b6383 100644
--- a/contrib/credential/libsecret/git-credential-libsecret.c
+++ b/third_party/git/contrib/credential/libsecret/git-credential-libsecret.c
diff --git a/contrib/credential/netrc/Makefile b/third_party/git/contrib/credential/netrc/Makefile
index 6174e3bb83..6174e3bb83 100644
--- a/contrib/credential/netrc/Makefile
+++ b/third_party/git/contrib/credential/netrc/Makefile
diff --git a/contrib/credential/netrc/git-credential-netrc b/third_party/git/contrib/credential/netrc/git-credential-netrc
index ebfc123ec6..ebfc123ec6 100755
--- a/contrib/credential/netrc/git-credential-netrc
+++ b/third_party/git/contrib/credential/netrc/git-credential-netrc
diff --git a/contrib/credential/netrc/t-git-credential-netrc.sh b/third_party/git/contrib/credential/netrc/t-git-credential-netrc.sh
index 07227d0228..07227d0228 100755
--- a/contrib/credential/netrc/t-git-credential-netrc.sh
+++ b/third_party/git/contrib/credential/netrc/t-git-credential-netrc.sh
diff --git a/contrib/credential/netrc/test.command-option-gpg b/third_party/git/contrib/credential/netrc/test.command-option-gpg
index d8f1285d41..d8f1285d41 100755
--- a/contrib/credential/netrc/test.command-option-gpg
+++ b/third_party/git/contrib/credential/netrc/test.command-option-gpg
diff --git a/contrib/credential/netrc/test.git-config-gpg b/third_party/git/contrib/credential/netrc/test.git-config-gpg
index 65cf594c20..65cf594c20 100755
--- a/contrib/credential/netrc/test.git-config-gpg
+++ b/third_party/git/contrib/credential/netrc/test.git-config-gpg
diff --git a/contrib/credential/netrc/test.netrc b/third_party/git/contrib/credential/netrc/test.netrc
index ba119a937f..ba119a937f 100644
--- a/contrib/credential/netrc/test.netrc
+++ b/third_party/git/contrib/credential/netrc/test.netrc
diff --git a/t/t5100/empty b/third_party/git/contrib/credential/netrc/test.netrc.gpg
index e69de29bb2..e69de29bb2 100644
--- a/t/t5100/empty
+++ b/third_party/git/contrib/credential/netrc/test.netrc.gpg
diff --git a/contrib/credential/netrc/test.pl b/third_party/git/contrib/credential/netrc/test.pl
index c0fb3718b2..c0fb3718b2 100755
--- a/contrib/credential/netrc/test.pl
+++ b/third_party/git/contrib/credential/netrc/test.pl
diff --git a/contrib/credential/osxkeychain/.gitignore b/third_party/git/contrib/credential/osxkeychain/.gitignore
index 6c5b7026c5..6c5b7026c5 100644
--- a/contrib/credential/osxkeychain/.gitignore
+++ b/third_party/git/contrib/credential/osxkeychain/.gitignore
diff --git a/contrib/credential/osxkeychain/Makefile b/third_party/git/contrib/credential/osxkeychain/Makefile
index 4b3a08a2ba..4b3a08a2ba 100644
--- a/contrib/credential/osxkeychain/Makefile
+++ b/third_party/git/contrib/credential/osxkeychain/Makefile
diff --git a/contrib/credential/osxkeychain/git-credential-osxkeychain.c b/third_party/git/contrib/credential/osxkeychain/git-credential-osxkeychain.c
index bcd3f575a3..bcd3f575a3 100644
--- a/contrib/credential/osxkeychain/git-credential-osxkeychain.c
+++ b/third_party/git/contrib/credential/osxkeychain/git-credential-osxkeychain.c
diff --git a/contrib/credential/wincred/Makefile b/third_party/git/contrib/credential/wincred/Makefile
index 6e992c0866..6e992c0866 100644
--- a/contrib/credential/wincred/Makefile
+++ b/third_party/git/contrib/credential/wincred/Makefile
diff --git a/contrib/credential/wincred/git-credential-wincred.c b/third_party/git/contrib/credential/wincred/git-credential-wincred.c
index 5bdad41de1..5bdad41de1 100644
--- a/contrib/credential/wincred/git-credential-wincred.c
+++ b/third_party/git/contrib/credential/wincred/git-credential-wincred.c
diff --git a/contrib/diff-highlight/.gitignore b/third_party/git/contrib/diff-highlight/.gitignore
index c07454824e..c07454824e 100644
--- a/contrib/diff-highlight/.gitignore
+++ b/third_party/git/contrib/diff-highlight/.gitignore
diff --git a/contrib/diff-highlight/DiffHighlight.pm b/third_party/git/contrib/diff-highlight/DiffHighlight.pm
index 7440aa1c46..7440aa1c46 100644
--- a/contrib/diff-highlight/DiffHighlight.pm
+++ b/third_party/git/contrib/diff-highlight/DiffHighlight.pm
diff --git a/contrib/diff-highlight/Makefile b/third_party/git/contrib/diff-highlight/Makefile
index f2be7cc924..f2be7cc924 100644
--- a/contrib/diff-highlight/Makefile
+++ b/third_party/git/contrib/diff-highlight/Makefile
diff --git a/contrib/diff-highlight/README b/third_party/git/contrib/diff-highlight/README
index d4c2343175..d4c2343175 100644
--- a/contrib/diff-highlight/README
+++ b/third_party/git/contrib/diff-highlight/README
diff --git a/contrib/diff-highlight/diff-highlight.perl b/third_party/git/contrib/diff-highlight/diff-highlight.perl
index 9b3e9c1f4d..9b3e9c1f4d 100644
--- a/contrib/diff-highlight/diff-highlight.perl
+++ b/third_party/git/contrib/diff-highlight/diff-highlight.perl
diff --git a/contrib/diff-highlight/t/.gitignore b/third_party/git/contrib/diff-highlight/t/.gitignore
index 7dcbb232cd..7dcbb232cd 100644
--- a/contrib/diff-highlight/t/.gitignore
+++ b/third_party/git/contrib/diff-highlight/t/.gitignore
diff --git a/contrib/diff-highlight/t/Makefile b/third_party/git/contrib/diff-highlight/t/Makefile
index 5ff5275496..5ff5275496 100644
--- a/contrib/diff-highlight/t/Makefile
+++ b/third_party/git/contrib/diff-highlight/t/Makefile
diff --git a/contrib/diff-highlight/t/t9400-diff-highlight.sh b/third_party/git/contrib/diff-highlight/t/t9400-diff-highlight.sh
index f6f5195d00..f6f5195d00 100755
--- a/contrib/diff-highlight/t/t9400-diff-highlight.sh
+++ b/third_party/git/contrib/diff-highlight/t/t9400-diff-highlight.sh
diff --git a/contrib/emacs/README b/third_party/git/contrib/emacs/README
index 977a16f1e3..977a16f1e3 100644
--- a/contrib/emacs/README
+++ b/third_party/git/contrib/emacs/README
diff --git a/contrib/emacs/git-blame.el b/third_party/git/contrib/emacs/git-blame.el
index 6a8a2b8ff1..6a8a2b8ff1 100644
--- a/contrib/emacs/git-blame.el
+++ b/third_party/git/contrib/emacs/git-blame.el
diff --git a/contrib/emacs/git.el b/third_party/git/contrib/emacs/git.el
index 03f926281f..03f926281f 100644
--- a/contrib/emacs/git.el
+++ b/third_party/git/contrib/emacs/git.el
diff --git a/contrib/examples/README b/third_party/git/contrib/examples/README
index 18bc60b021..18bc60b021 100644
--- a/contrib/examples/README
+++ b/third_party/git/contrib/examples/README
diff --git a/contrib/fast-import/git-import.perl b/third_party/git/contrib/fast-import/git-import.perl
index 0891b9e366..0891b9e366 100755
--- a/contrib/fast-import/git-import.perl
+++ b/third_party/git/contrib/fast-import/git-import.perl
diff --git a/contrib/fast-import/git-import.sh b/third_party/git/contrib/fast-import/git-import.sh
index f8d803c5e2..f8d803c5e2 100755
--- a/contrib/fast-import/git-import.sh
+++ b/third_party/git/contrib/fast-import/git-import.sh
diff --git a/contrib/fast-import/git-p4.README b/third_party/git/contrib/fast-import/git-p4.README
index cec5ecfa7c..cec5ecfa7c 100644
--- a/contrib/fast-import/git-p4.README
+++ b/third_party/git/contrib/fast-import/git-p4.README
diff --git a/contrib/fast-import/import-directories.perl b/third_party/git/contrib/fast-import/import-directories.perl
index a16f79cfdc..a16f79cfdc 100755
--- a/contrib/fast-import/import-directories.perl
+++ b/third_party/git/contrib/fast-import/import-directories.perl
diff --git a/contrib/fast-import/import-tars.perl b/third_party/git/contrib/fast-import/import-tars.perl
index e800d9f5c9..e800d9f5c9 100755
--- a/contrib/fast-import/import-tars.perl
+++ b/third_party/git/contrib/fast-import/import-tars.perl
diff --git a/contrib/fast-import/import-zips.py b/third_party/git/contrib/fast-import/import-zips.py
index d12c296223..d12c296223 100755
--- a/contrib/fast-import/import-zips.py
+++ b/third_party/git/contrib/fast-import/import-zips.py
diff --git a/contrib/git-jump/README b/third_party/git/contrib/git-jump/README
index 2f618a7f97..2f618a7f97 100644
--- a/contrib/git-jump/README
+++ b/third_party/git/contrib/git-jump/README
diff --git a/contrib/git-jump/git-jump b/third_party/git/contrib/git-jump/git-jump
index 931b0fe3a9..931b0fe3a9 100755
--- a/contrib/git-jump/git-jump
+++ b/third_party/git/contrib/git-jump/git-jump
diff --git a/contrib/git-resurrect.sh b/third_party/git/contrib/git-resurrect.sh
index 8c171dd959..8c171dd959 100755
--- a/contrib/git-resurrect.sh
+++ b/third_party/git/contrib/git-resurrect.sh
diff --git a/contrib/git-shell-commands/README b/third_party/git/contrib/git-shell-commands/README
index 438463b160..438463b160 100644
--- a/contrib/git-shell-commands/README
+++ b/third_party/git/contrib/git-shell-commands/README
diff --git a/contrib/git-shell-commands/help b/third_party/git/contrib/git-shell-commands/help
index 535770c6ec..535770c6ec 100755
--- a/contrib/git-shell-commands/help
+++ b/third_party/git/contrib/git-shell-commands/help
diff --git a/contrib/git-shell-commands/list b/third_party/git/contrib/git-shell-commands/list
index 6f89938821..6f89938821 100755
--- a/contrib/git-shell-commands/list
+++ b/third_party/git/contrib/git-shell-commands/list
diff --git a/contrib/hg-to-git/hg-to-git.py b/third_party/git/contrib/hg-to-git/hg-to-git.py
index de3f81667e..de3f81667e 100755
--- a/contrib/hg-to-git/hg-to-git.py
+++ b/third_party/git/contrib/hg-to-git/hg-to-git.py
diff --git a/contrib/hg-to-git/hg-to-git.txt b/third_party/git/contrib/hg-to-git/hg-to-git.txt
index 91f8fe6410..91f8fe6410 100644
--- a/contrib/hg-to-git/hg-to-git.txt
+++ b/third_party/git/contrib/hg-to-git/hg-to-git.txt
diff --git a/contrib/hooks/multimail/CHANGES b/third_party/git/contrib/hooks/multimail/CHANGES
index 35791fd02c..35791fd02c 100644
--- a/contrib/hooks/multimail/CHANGES
+++ b/third_party/git/contrib/hooks/multimail/CHANGES
diff --git a/contrib/hooks/multimail/CONTRIBUTING.rst b/third_party/git/contrib/hooks/multimail/CONTRIBUTING.rst
index de20a54287..de20a54287 100644
--- a/contrib/hooks/multimail/CONTRIBUTING.rst
+++ b/third_party/git/contrib/hooks/multimail/CONTRIBUTING.rst
diff --git a/contrib/hooks/multimail/README.Git b/third_party/git/contrib/hooks/multimail/README.Git
index 044444245d..044444245d 100644
--- a/contrib/hooks/multimail/README.Git
+++ b/third_party/git/contrib/hooks/multimail/README.Git
diff --git a/contrib/hooks/multimail/README.migrate-from-post-receive-email b/third_party/git/contrib/hooks/multimail/README.migrate-from-post-receive-email
index 1e6a976699..1e6a976699 100644
--- a/contrib/hooks/multimail/README.migrate-from-post-receive-email
+++ b/third_party/git/contrib/hooks/multimail/README.migrate-from-post-receive-email
diff --git a/contrib/hooks/multimail/README.rst b/third_party/git/contrib/hooks/multimail/README.rst
index 7c0fc4a6ef..7c0fc4a6ef 100644
--- a/contrib/hooks/multimail/README.rst
+++ b/third_party/git/contrib/hooks/multimail/README.rst
diff --git a/contrib/hooks/multimail/doc/customizing-emails.rst b/third_party/git/contrib/hooks/multimail/doc/customizing-emails.rst
index 3f5b67f768..3f5b67f768 100644
--- a/contrib/hooks/multimail/doc/customizing-emails.rst
+++ b/third_party/git/contrib/hooks/multimail/doc/customizing-emails.rst
diff --git a/contrib/hooks/multimail/doc/gerrit.rst b/third_party/git/contrib/hooks/multimail/doc/gerrit.rst
index 8011d05dec..8011d05dec 100644
--- a/contrib/hooks/multimail/doc/gerrit.rst
+++ b/third_party/git/contrib/hooks/multimail/doc/gerrit.rst
diff --git a/contrib/hooks/multimail/doc/gitolite.rst b/third_party/git/contrib/hooks/multimail/doc/gitolite.rst
index 5054833105..5054833105 100644
--- a/contrib/hooks/multimail/doc/gitolite.rst
+++ b/third_party/git/contrib/hooks/multimail/doc/gitolite.rst
diff --git a/contrib/hooks/multimail/doc/troubleshooting.rst b/third_party/git/contrib/hooks/multimail/doc/troubleshooting.rst
index 651b509ee6..651b509ee6 100644
--- a/contrib/hooks/multimail/doc/troubleshooting.rst
+++ b/third_party/git/contrib/hooks/multimail/doc/troubleshooting.rst
diff --git a/contrib/hooks/multimail/git_multimail.py b/third_party/git/contrib/hooks/multimail/git_multimail.py
index 8823399e75..8823399e75 100755
--- a/contrib/hooks/multimail/git_multimail.py
+++ b/third_party/git/contrib/hooks/multimail/git_multimail.py
diff --git a/contrib/hooks/multimail/migrate-mailhook-config b/third_party/git/contrib/hooks/multimail/migrate-mailhook-config
index 241ba22fa3..241ba22fa3 100755
--- a/contrib/hooks/multimail/migrate-mailhook-config
+++ b/third_party/git/contrib/hooks/multimail/migrate-mailhook-config
diff --git a/contrib/hooks/multimail/post-receive.example b/third_party/git/contrib/hooks/multimail/post-receive.example
index b9bb11834e..b9bb11834e 100755
--- a/contrib/hooks/multimail/post-receive.example
+++ b/third_party/git/contrib/hooks/multimail/post-receive.example
diff --git a/contrib/hooks/post-receive-email b/third_party/git/contrib/hooks/post-receive-email
index 8747b84334..8747b84334 100755
--- a/contrib/hooks/post-receive-email
+++ b/third_party/git/contrib/hooks/post-receive-email
diff --git a/contrib/hooks/pre-auto-gc-battery b/third_party/git/contrib/hooks/pre-auto-gc-battery
index 7ba78c4dff..7ba78c4dff 100755
--- a/contrib/hooks/pre-auto-gc-battery
+++ b/third_party/git/contrib/hooks/pre-auto-gc-battery
diff --git a/contrib/hooks/setgitperms.perl b/third_party/git/contrib/hooks/setgitperms.perl
index 2770a1b1d2..2770a1b1d2 100755
--- a/contrib/hooks/setgitperms.perl
+++ b/third_party/git/contrib/hooks/setgitperms.perl
diff --git a/contrib/hooks/update-paranoid b/third_party/git/contrib/hooks/update-paranoid
index d18b317b2f..d18b317b2f 100755
--- a/contrib/hooks/update-paranoid
+++ b/third_party/git/contrib/hooks/update-paranoid
diff --git a/contrib/long-running-filter/example.pl b/third_party/git/contrib/long-running-filter/example.pl
index a677569ddd..a677569ddd 100755
--- a/contrib/long-running-filter/example.pl
+++ b/third_party/git/contrib/long-running-filter/example.pl
diff --git a/contrib/mw-to-git/.gitignore b/third_party/git/contrib/mw-to-git/.gitignore
index ae545b013d..ae545b013d 100644
--- a/contrib/mw-to-git/.gitignore
+++ b/third_party/git/contrib/mw-to-git/.gitignore
diff --git a/contrib/mw-to-git/.perlcriticrc b/third_party/git/contrib/mw-to-git/.perlcriticrc
index 158958d363..158958d363 100644
--- a/contrib/mw-to-git/.perlcriticrc
+++ b/third_party/git/contrib/mw-to-git/.perlcriticrc
diff --git a/contrib/mw-to-git/Git/Mediawiki.pm b/third_party/git/contrib/mw-to-git/Git/Mediawiki.pm
index 917d9e2d32..917d9e2d32 100644
--- a/contrib/mw-to-git/Git/Mediawiki.pm
+++ b/third_party/git/contrib/mw-to-git/Git/Mediawiki.pm
diff --git a/contrib/mw-to-git/Makefile b/third_party/git/contrib/mw-to-git/Makefile
index 4e603512a3..4e603512a3 100644
--- a/contrib/mw-to-git/Makefile
+++ b/third_party/git/contrib/mw-to-git/Makefile
diff --git a/contrib/mw-to-git/bin-wrapper/git b/third_party/git/contrib/mw-to-git/bin-wrapper/git
index 6663ae57e8..6663ae57e8 100755
--- a/contrib/mw-to-git/bin-wrapper/git
+++ b/third_party/git/contrib/mw-to-git/bin-wrapper/git
diff --git a/contrib/mw-to-git/git-mw.perl b/third_party/git/contrib/mw-to-git/git-mw.perl
index 28df3ee321..28df3ee321 100755
--- a/contrib/mw-to-git/git-mw.perl
+++ b/third_party/git/contrib/mw-to-git/git-mw.perl
diff --git a/contrib/mw-to-git/git-remote-mediawiki.perl b/third_party/git/contrib/mw-to-git/git-remote-mediawiki.perl
index af9cbc9d0f..af9cbc9d0f 100755
--- a/contrib/mw-to-git/git-remote-mediawiki.perl
+++ b/third_party/git/contrib/mw-to-git/git-remote-mediawiki.perl
diff --git a/contrib/mw-to-git/git-remote-mediawiki.txt b/third_party/git/contrib/mw-to-git/git-remote-mediawiki.txt
index 23b7ef9f62..23b7ef9f62 100644
--- a/contrib/mw-to-git/git-remote-mediawiki.txt
+++ b/third_party/git/contrib/mw-to-git/git-remote-mediawiki.txt
diff --git a/contrib/mw-to-git/t/.gitignore b/third_party/git/contrib/mw-to-git/t/.gitignore
index a7a40b4964..a7a40b4964 100644
--- a/contrib/mw-to-git/t/.gitignore
+++ b/third_party/git/contrib/mw-to-git/t/.gitignore
diff --git a/contrib/mw-to-git/t/Makefile b/third_party/git/contrib/mw-to-git/t/Makefile
index f422203fa0..f422203fa0 100644
--- a/contrib/mw-to-git/t/Makefile
+++ b/third_party/git/contrib/mw-to-git/t/Makefile
diff --git a/contrib/mw-to-git/t/README b/third_party/git/contrib/mw-to-git/t/README
index 2ee34be7e4..2ee34be7e4 100644
--- a/contrib/mw-to-git/t/README
+++ b/third_party/git/contrib/mw-to-git/t/README
diff --git a/contrib/mw-to-git/t/install-wiki.sh b/third_party/git/contrib/mw-to-git/t/install-wiki.sh
index c215213c4b..c215213c4b 100755
--- a/contrib/mw-to-git/t/install-wiki.sh
+++ b/third_party/git/contrib/mw-to-git/t/install-wiki.sh
diff --git a/contrib/mw-to-git/t/install-wiki/.gitignore b/third_party/git/contrib/mw-to-git/t/install-wiki/.gitignore
index b5a2a4408c..b5a2a4408c 100644
--- a/contrib/mw-to-git/t/install-wiki/.gitignore
+++ b/third_party/git/contrib/mw-to-git/t/install-wiki/.gitignore
diff --git a/contrib/mw-to-git/t/install-wiki/LocalSettings.php b/third_party/git/contrib/mw-to-git/t/install-wiki/LocalSettings.php
index 745e47e881..745e47e881 100644
--- a/contrib/mw-to-git/t/install-wiki/LocalSettings.php
+++ b/third_party/git/contrib/mw-to-git/t/install-wiki/LocalSettings.php
diff --git a/contrib/mw-to-git/t/install-wiki/db_install.php b/third_party/git/contrib/mw-to-git/t/install-wiki/db_install.php
index 0f3f4e018a..0f3f4e018a 100644
--- a/contrib/mw-to-git/t/install-wiki/db_install.php
+++ b/third_party/git/contrib/mw-to-git/t/install-wiki/db_install.php
diff --git a/contrib/mw-to-git/t/push-pull-tests.sh b/third_party/git/contrib/mw-to-git/t/push-pull-tests.sh
index 9da2dc5ff0..9da2dc5ff0 100644
--- a/contrib/mw-to-git/t/push-pull-tests.sh
+++ b/third_party/git/contrib/mw-to-git/t/push-pull-tests.sh
diff --git a/contrib/mw-to-git/t/t9360-mw-to-git-clone.sh b/third_party/git/contrib/mw-to-git/t/t9360-mw-to-git-clone.sh
index cfbfe7ddf6..cfbfe7ddf6 100755
--- a/contrib/mw-to-git/t/t9360-mw-to-git-clone.sh
+++ b/third_party/git/contrib/mw-to-git/t/t9360-mw-to-git-clone.sh
diff --git a/contrib/mw-to-git/t/t9361-mw-to-git-push-pull.sh b/third_party/git/contrib/mw-to-git/t/t9361-mw-to-git-push-pull.sh
index 9ea201459b..9ea201459b 100755
--- a/contrib/mw-to-git/t/t9361-mw-to-git-push-pull.sh
+++ b/third_party/git/contrib/mw-to-git/t/t9361-mw-to-git-push-pull.sh
diff --git a/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh b/third_party/git/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh
index 6b0dbdac4d..6b0dbdac4d 100755
--- a/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh
+++ b/third_party/git/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh
diff --git a/contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh b/third_party/git/contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh
index 3ff3a09567..3ff3a09567 100755
--- a/contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh
+++ b/third_party/git/contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh
diff --git a/contrib/mw-to-git/t/t9364-pull-by-rev.sh b/third_party/git/contrib/mw-to-git/t/t9364-pull-by-rev.sh
index 5c22457a0b..5c22457a0b 100755
--- a/contrib/mw-to-git/t/t9364-pull-by-rev.sh
+++ b/third_party/git/contrib/mw-to-git/t/t9364-pull-by-rev.sh
diff --git a/contrib/mw-to-git/t/t9365-continuing-queries.sh b/third_party/git/contrib/mw-to-git/t/t9365-continuing-queries.sh
index 016454749f..016454749f 100755
--- a/contrib/mw-to-git/t/t9365-continuing-queries.sh
+++ b/third_party/git/contrib/mw-to-git/t/t9365-continuing-queries.sh
diff --git a/contrib/mw-to-git/t/test-gitmw-lib.sh b/third_party/git/contrib/mw-to-git/t/test-gitmw-lib.sh
index 6546294f15..6546294f15 100755
--- a/contrib/mw-to-git/t/test-gitmw-lib.sh
+++ b/third_party/git/contrib/mw-to-git/t/test-gitmw-lib.sh
diff --git a/contrib/mw-to-git/t/test-gitmw.pl b/third_party/git/contrib/mw-to-git/t/test-gitmw.pl
index 0ff76259fa..0ff76259fa 100755
--- a/contrib/mw-to-git/t/test-gitmw.pl
+++ b/third_party/git/contrib/mw-to-git/t/test-gitmw.pl
diff --git a/contrib/mw-to-git/t/test.config b/third_party/git/contrib/mw-to-git/t/test.config
index 5ba0684162..5ba0684162 100644
--- a/contrib/mw-to-git/t/test.config
+++ b/third_party/git/contrib/mw-to-git/t/test.config
diff --git a/contrib/persistent-https/LICENSE b/third_party/git/contrib/persistent-https/LICENSE
index d645695673..d645695673 100644
--- a/contrib/persistent-https/LICENSE
+++ b/third_party/git/contrib/persistent-https/LICENSE
diff --git a/contrib/persistent-https/Makefile b/third_party/git/contrib/persistent-https/Makefile
index 52b84ba3d4..52b84ba3d4 100644
--- a/contrib/persistent-https/Makefile
+++ b/third_party/git/contrib/persistent-https/Makefile
diff --git a/contrib/persistent-https/README b/third_party/git/contrib/persistent-https/README
index 7c4cd8d257..7c4cd8d257 100644
--- a/contrib/persistent-https/README
+++ b/third_party/git/contrib/persistent-https/README
diff --git a/contrib/persistent-https/client.go b/third_party/git/contrib/persistent-https/client.go
index 71125b5832..71125b5832 100644
--- a/contrib/persistent-https/client.go
+++ b/third_party/git/contrib/persistent-https/client.go
diff --git a/contrib/persistent-https/main.go b/third_party/git/contrib/persistent-https/main.go
index fd1b107743..fd1b107743 100644
--- a/contrib/persistent-https/main.go
+++ b/third_party/git/contrib/persistent-https/main.go
diff --git a/contrib/persistent-https/proxy.go b/third_party/git/contrib/persistent-https/proxy.go
index bb0cdba386..bb0cdba386 100644
--- a/contrib/persistent-https/proxy.go
+++ b/third_party/git/contrib/persistent-https/proxy.go
diff --git a/contrib/persistent-https/socket.go b/third_party/git/contrib/persistent-https/socket.go
index 193b911dd1..193b911dd1 100644
--- a/contrib/persistent-https/socket.go
+++ b/third_party/git/contrib/persistent-https/socket.go
diff --git a/contrib/remote-helpers/README b/third_party/git/contrib/remote-helpers/README
index ac72332517..ac72332517 100644
--- a/contrib/remote-helpers/README
+++ b/third_party/git/contrib/remote-helpers/README
diff --git a/contrib/remote-helpers/git-remote-bzr b/third_party/git/contrib/remote-helpers/git-remote-bzr
index 1c3d87f861..1c3d87f861 100755
--- a/contrib/remote-helpers/git-remote-bzr
+++ b/third_party/git/contrib/remote-helpers/git-remote-bzr
diff --git a/contrib/remote-helpers/git-remote-hg b/third_party/git/contrib/remote-helpers/git-remote-hg
index 8e9188364c..8e9188364c 100755
--- a/contrib/remote-helpers/git-remote-hg
+++ b/third_party/git/contrib/remote-helpers/git-remote-hg
diff --git a/contrib/remotes2config.sh b/third_party/git/contrib/remotes2config.sh
index 1cda19f66a..1cda19f66a 100755
--- a/contrib/remotes2config.sh
+++ b/third_party/git/contrib/remotes2config.sh
diff --git a/contrib/rerere-train.sh b/third_party/git/contrib/rerere-train.sh
index eeee45dd34..eeee45dd34 100755
--- a/contrib/rerere-train.sh
+++ b/third_party/git/contrib/rerere-train.sh
diff --git a/contrib/stats/git-common-hash b/third_party/git/contrib/stats/git-common-hash
index e27fd088be..e27fd088be 100755
--- a/contrib/stats/git-common-hash
+++ b/third_party/git/contrib/stats/git-common-hash
diff --git a/contrib/stats/mailmap.pl b/third_party/git/contrib/stats/mailmap.pl
index 9513f5e35b..9513f5e35b 100755
--- a/contrib/stats/mailmap.pl
+++ b/third_party/git/contrib/stats/mailmap.pl
diff --git a/contrib/stats/packinfo.pl b/third_party/git/contrib/stats/packinfo.pl
index be188c0f11..be188c0f11 100755
--- a/contrib/stats/packinfo.pl
+++ b/third_party/git/contrib/stats/packinfo.pl
diff --git a/contrib/subtree/.gitignore b/third_party/git/contrib/subtree/.gitignore
index 0b9381abca..0b9381abca 100644
--- a/contrib/subtree/.gitignore
+++ b/third_party/git/contrib/subtree/.gitignore
diff --git a/contrib/subtree/COPYING b/third_party/git/contrib/subtree/COPYING
index d511905c16..d511905c16 100644
--- a/contrib/subtree/COPYING
+++ b/third_party/git/contrib/subtree/COPYING
diff --git a/contrib/subtree/INSTALL b/third_party/git/contrib/subtree/INSTALL
index 7ab0cf4509..7ab0cf4509 100644
--- a/contrib/subtree/INSTALL
+++ b/third_party/git/contrib/subtree/INSTALL
diff --git a/contrib/subtree/Makefile b/third_party/git/contrib/subtree/Makefile
index 6906aae441..6906aae441 100644
--- a/contrib/subtree/Makefile
+++ b/third_party/git/contrib/subtree/Makefile
diff --git a/contrib/subtree/README b/third_party/git/contrib/subtree/README
index c686b4a69b..c686b4a69b 100644
--- a/contrib/subtree/README
+++ b/third_party/git/contrib/subtree/README
diff --git a/contrib/subtree/git-subtree.sh b/third_party/git/contrib/subtree/git-subtree.sh
index 868e18b9a1..868e18b9a1 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/third_party/git/contrib/subtree/git-subtree.sh
diff --git a/contrib/subtree/git-subtree.txt b/third_party/git/contrib/subtree/git-subtree.txt
index 352deda69d..352deda69d 100644
--- a/contrib/subtree/git-subtree.txt
+++ b/third_party/git/contrib/subtree/git-subtree.txt
diff --git a/contrib/subtree/t/Makefile b/third_party/git/contrib/subtree/t/Makefile
index 276898eb6b..276898eb6b 100644
--- a/contrib/subtree/t/Makefile
+++ b/third_party/git/contrib/subtree/t/Makefile
diff --git a/contrib/subtree/t/t7900-subtree.sh b/third_party/git/contrib/subtree/t/t7900-subtree.sh
index 57ff4b25c1..57ff4b25c1 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/third_party/git/contrib/subtree/t/t7900-subtree.sh
diff --git a/contrib/subtree/todo b/third_party/git/contrib/subtree/todo
index 0d0e777651..0d0e777651 100644
--- a/contrib/subtree/todo
+++ b/third_party/git/contrib/subtree/todo
diff --git a/contrib/svn-fe/.gitignore b/third_party/git/contrib/svn-fe/.gitignore
index 02a7791585..02a7791585 100644
--- a/contrib/svn-fe/.gitignore
+++ b/third_party/git/contrib/svn-fe/.gitignore
diff --git a/contrib/svn-fe/Makefile b/third_party/git/contrib/svn-fe/Makefile
index e8651aaf4b..e8651aaf4b 100644
--- a/contrib/svn-fe/Makefile
+++ b/third_party/git/contrib/svn-fe/Makefile
diff --git a/contrib/svn-fe/svn-fe.c b/third_party/git/contrib/svn-fe/svn-fe.c
index f363505abb..f363505abb 100644
--- a/contrib/svn-fe/svn-fe.c
+++ b/third_party/git/contrib/svn-fe/svn-fe.c
diff --git a/contrib/svn-fe/svn-fe.txt b/third_party/git/contrib/svn-fe/svn-fe.txt
index a3425f4770..a3425f4770 100644
--- a/contrib/svn-fe/svn-fe.txt
+++ b/third_party/git/contrib/svn-fe/svn-fe.txt
diff --git a/contrib/svn-fe/svnrdump_sim.py b/third_party/git/contrib/svn-fe/svnrdump_sim.py
index 11ac6f6927..11ac6f6927 100755
--- a/contrib/svn-fe/svnrdump_sim.py
+++ b/third_party/git/contrib/svn-fe/svnrdump_sim.py
diff --git a/contrib/thunderbird-patch-inline/README b/third_party/git/contrib/thunderbird-patch-inline/README
index 000147bbe4..000147bbe4 100644
--- a/contrib/thunderbird-patch-inline/README
+++ b/third_party/git/contrib/thunderbird-patch-inline/README
diff --git a/contrib/thunderbird-patch-inline/appp.sh b/third_party/git/contrib/thunderbird-patch-inline/appp.sh
index 1053872eea..1053872eea 100755
--- a/contrib/thunderbird-patch-inline/appp.sh
+++ b/third_party/git/contrib/thunderbird-patch-inline/appp.sh
diff --git a/contrib/update-unicode/.gitignore b/third_party/git/contrib/update-unicode/.gitignore
index b0ebc6aad2..b0ebc6aad2 100644
--- a/contrib/update-unicode/.gitignore
+++ b/third_party/git/contrib/update-unicode/.gitignore
diff --git a/contrib/update-unicode/README b/third_party/git/contrib/update-unicode/README
index 151a197041..151a197041 100644
--- a/contrib/update-unicode/README
+++ b/third_party/git/contrib/update-unicode/README
diff --git a/contrib/update-unicode/update_unicode.sh b/third_party/git/contrib/update-unicode/update_unicode.sh
index aa90865bef..aa90865bef 100755
--- a/contrib/update-unicode/update_unicode.sh
+++ b/third_party/git/contrib/update-unicode/update_unicode.sh
diff --git a/contrib/vscode/.gitattributes b/third_party/git/contrib/vscode/.gitattributes
index e89f2236ef..e89f2236ef 100644
--- a/contrib/vscode/.gitattributes
+++ b/third_party/git/contrib/vscode/.gitattributes
diff --git a/contrib/vscode/README.md b/third_party/git/contrib/vscode/README.md
index 8202d62035..8202d62035 100644
--- a/contrib/vscode/README.md
+++ b/third_party/git/contrib/vscode/README.md
diff --git a/contrib/vscode/init.sh b/third_party/git/contrib/vscode/init.sh
index 27de94994b..27de94994b 100755
--- a/contrib/vscode/init.sh
+++ b/third_party/git/contrib/vscode/init.sh
diff --git a/contrib/workdir/.gitattributes b/third_party/git/contrib/workdir/.gitattributes
index 1f78c5d1bd..1f78c5d1bd 100644
--- a/contrib/workdir/.gitattributes
+++ b/third_party/git/contrib/workdir/.gitattributes
diff --git a/contrib/workdir/git-new-workdir b/third_party/git/contrib/workdir/git-new-workdir
index 888c34a521..888c34a521 100755
--- a/contrib/workdir/git-new-workdir
+++ b/third_party/git/contrib/workdir/git-new-workdir
diff --git a/convert.c b/third_party/git/convert.c
index 94ff837649..94ff837649 100644
--- a/convert.c
+++ b/third_party/git/convert.c
diff --git a/convert.h b/third_party/git/convert.h
index 831559f10d..831559f10d 100644
--- a/convert.h
+++ b/third_party/git/convert.h
diff --git a/copy.c b/third_party/git/copy.c
index 4de6a110f0..4de6a110f0 100644
--- a/copy.c
+++ b/third_party/git/copy.c
diff --git a/credential-cache--daemon.c b/third_party/git/credential-cache--daemon.c
index ec1271f89c..ec1271f89c 100644
--- a/credential-cache--daemon.c
+++ b/third_party/git/credential-cache--daemon.c
diff --git a/credential-cache.c b/third_party/git/credential-cache.c
index 1cccc3a0b9..1cccc3a0b9 100644
--- a/credential-cache.c
+++ b/third_party/git/credential-cache.c
diff --git a/credential-store.c b/third_party/git/credential-store.c
index ac295420dd..ac295420dd 100644
--- a/credential-store.c
+++ b/third_party/git/credential-store.c
diff --git a/credential.c b/third_party/git/credential.c
index 62be651b03..62be651b03 100644
--- a/credential.c
+++ b/third_party/git/credential.c
diff --git a/credential.h b/third_party/git/credential.h
index 6b0cd16be2..6b0cd16be2 100644
--- a/credential.h
+++ b/third_party/git/credential.h
diff --git a/csum-file.c b/third_party/git/csum-file.c
index 53ce37f7ca..53ce37f7ca 100644
--- a/csum-file.c
+++ b/third_party/git/csum-file.c
diff --git a/csum-file.h b/third_party/git/csum-file.h
index a98b1eee53..a98b1eee53 100644
--- a/csum-file.h
+++ b/third_party/git/csum-file.h
diff --git a/ctype.c b/third_party/git/ctype.c
index fc0225cebd..fc0225cebd 100644
--- a/ctype.c
+++ b/third_party/git/ctype.c
diff --git a/daemon.c b/third_party/git/daemon.c
index 9d2e0d20ef..9d2e0d20ef 100644
--- a/daemon.c
+++ b/third_party/git/daemon.c
diff --git a/date.c b/third_party/git/date.c
index 8126146c50..8126146c50 100644
--- a/date.c
+++ b/third_party/git/date.c
diff --git a/decorate.c b/third_party/git/decorate.c
index a605b1b5f4..a605b1b5f4 100644
--- a/decorate.c
+++ b/third_party/git/decorate.c
diff --git a/decorate.h b/third_party/git/decorate.h
index ee43dee1f0..ee43dee1f0 100644
--- a/decorate.h
+++ b/third_party/git/decorate.h
diff --git a/delta-islands.c b/third_party/git/delta-islands.c
index 09dbd3cf72..09dbd3cf72 100644
--- a/delta-islands.c
+++ b/third_party/git/delta-islands.c
diff --git a/delta-islands.h b/third_party/git/delta-islands.h
index eb0f952629..eb0f952629 100644
--- a/delta-islands.h
+++ b/third_party/git/delta-islands.h
diff --git a/delta.h b/third_party/git/delta.h
index 2df5fe13d9..2df5fe13d9 100644
--- a/delta.h
+++ b/third_party/git/delta.h
diff --git a/detect-compiler b/third_party/git/detect-compiler
index 70b754481c..70b754481c 100755
--- a/detect-compiler
+++ b/third_party/git/detect-compiler
diff --git a/diff-delta.c b/third_party/git/diff-delta.c
index e49643353b..e49643353b 100644
--- a/diff-delta.c
+++ b/third_party/git/diff-delta.c
diff --git a/diff-lib.c b/third_party/git/diff-lib.c
index 61812f48c2..61812f48c2 100644
--- a/diff-lib.c
+++ b/third_party/git/diff-lib.c
diff --git a/diff-no-index.c b/third_party/git/diff-no-index.c
index 7814eabfe0..7814eabfe0 100644
--- a/diff-no-index.c
+++ b/third_party/git/diff-no-index.c
diff --git a/diff.c b/third_party/git/diff.c
index efe42b341a..efe42b341a 100644
--- a/diff.c
+++ b/third_party/git/diff.c
diff --git a/diff.h b/third_party/git/diff.h
index c2c3056810..c2c3056810 100644
--- a/diff.h
+++ b/third_party/git/diff.h
diff --git a/diffcore-break.c b/third_party/git/diffcore-break.c
index 875aefd3fe..875aefd3fe 100644
--- a/diffcore-break.c
+++ b/third_party/git/diffcore-break.c
diff --git a/diffcore-delta.c b/third_party/git/diffcore-delta.c
index 5668ace60d..5668ace60d 100644
--- a/diffcore-delta.c
+++ b/third_party/git/diffcore-delta.c
diff --git a/diffcore-order.c b/third_party/git/diffcore-order.c
index 19e73311f9..19e73311f9 100644
--- a/diffcore-order.c
+++ b/third_party/git/diffcore-order.c
diff --git a/diffcore-pickaxe.c b/third_party/git/diffcore-pickaxe.c
index a9c6d60df2..a9c6d60df2 100644
--- a/diffcore-pickaxe.c
+++ b/third_party/git/diffcore-pickaxe.c
diff --git a/diffcore-rename.c b/third_party/git/diffcore-rename.c
index 9624864858..9624864858 100644
--- a/diffcore-rename.c
+++ b/third_party/git/diffcore-rename.c
diff --git a/diffcore.h b/third_party/git/diffcore.h
index b651061c0e..b651061c0e 100644
--- a/diffcore.h
+++ b/third_party/git/diffcore.h
diff --git a/dir-iterator.c b/third_party/git/dir-iterator.c
index b17e9f970a..b17e9f970a 100644
--- a/dir-iterator.c
+++ b/third_party/git/dir-iterator.c
diff --git a/dir-iterator.h b/third_party/git/dir-iterator.h
index 08229157c6..08229157c6 100644
--- a/dir-iterator.h
+++ b/third_party/git/dir-iterator.h
diff --git a/dir.c b/third_party/git/dir.c
index d021c908e5..d021c908e5 100644
--- a/dir.c
+++ b/third_party/git/dir.c
diff --git a/dir.h b/third_party/git/dir.h
index 680079bbe3..680079bbe3 100644
--- a/dir.h
+++ b/third_party/git/dir.h
diff --git a/editor.c b/third_party/git/editor.c
index f079abbf11..f079abbf11 100644
--- a/editor.c
+++ b/third_party/git/editor.c
diff --git a/entry.c b/third_party/git/entry.c
index 53380bb614..53380bb614 100644
--- a/entry.c
+++ b/third_party/git/entry.c
diff --git a/environment.c b/third_party/git/environment.c
index 89af47cb85..89af47cb85 100644
--- a/environment.c
+++ b/third_party/git/environment.c
diff --git a/ewah/bitmap.c b/third_party/git/ewah/bitmap.c
index 52f1178db4..52f1178db4 100644
--- a/ewah/bitmap.c
+++ b/third_party/git/ewah/bitmap.c
diff --git a/ewah/ewah_bitmap.c b/third_party/git/ewah/ewah_bitmap.c
index d59b1afe3d..d59b1afe3d 100644
--- a/ewah/ewah_bitmap.c
+++ b/third_party/git/ewah/ewah_bitmap.c
diff --git a/ewah/ewah_io.c b/third_party/git/ewah/ewah_io.c
index 9035ee65ea..9035ee65ea 100644
--- a/ewah/ewah_io.c
+++ b/third_party/git/ewah/ewah_io.c
diff --git a/ewah/ewah_rlw.c b/third_party/git/ewah/ewah_rlw.c
index 5093d43e2f..5093d43e2f 100644
--- a/ewah/ewah_rlw.c
+++ b/third_party/git/ewah/ewah_rlw.c
diff --git a/ewah/ewok.h b/third_party/git/ewah/ewok.h
index 84b2a29faa..84b2a29faa 100644
--- a/ewah/ewok.h
+++ b/third_party/git/ewah/ewok.h
diff --git a/ewah/ewok_rlw.h b/third_party/git/ewah/ewok_rlw.h
index bafa24f4c3..bafa24f4c3 100644
--- a/ewah/ewok_rlw.h
+++ b/third_party/git/ewah/ewok_rlw.h
diff --git a/exec-cmd.c b/third_party/git/exec-cmd.c
index 7deeab3039..7deeab3039 100644
--- a/exec-cmd.c
+++ b/third_party/git/exec-cmd.c
diff --git a/exec-cmd.h b/third_party/git/exec-cmd.h
index 8cd1df28d3..8cd1df28d3 100644
--- a/exec-cmd.h
+++ b/third_party/git/exec-cmd.h
diff --git a/fast-import.c b/third_party/git/fast-import.c
index b44d6a467e..b44d6a467e 100644
--- a/fast-import.c
+++ b/third_party/git/fast-import.c
diff --git a/fetch-negotiator.c b/third_party/git/fetch-negotiator.c
index d6d685cba0..d6d685cba0 100644
--- a/fetch-negotiator.c
+++ b/third_party/git/fetch-negotiator.c
diff --git a/fetch-negotiator.h b/third_party/git/fetch-negotiator.h
index 9e3967ce66..9e3967ce66 100644
--- a/fetch-negotiator.h
+++ b/third_party/git/fetch-negotiator.h
diff --git a/fetch-object.c b/third_party/git/fetch-object.c
index 4266548800..4266548800 100644
--- a/fetch-object.c
+++ b/third_party/git/fetch-object.c
diff --git a/fetch-object.h b/third_party/git/fetch-object.h
index d6444caa5a..d6444caa5a 100644
--- a/fetch-object.h
+++ b/third_party/git/fetch-object.h
diff --git a/fetch-pack.c b/third_party/git/fetch-pack.c
index 65be043f2a..65be043f2a 100644
--- a/fetch-pack.c
+++ b/third_party/git/fetch-pack.c
diff --git a/fetch-pack.h b/third_party/git/fetch-pack.h
index 67f684229a..67f684229a 100644
--- a/fetch-pack.h
+++ b/third_party/git/fetch-pack.h
diff --git a/fmt-merge-msg.h b/third_party/git/fmt-merge-msg.h
index 01e3aa88c5..01e3aa88c5 100644
--- a/fmt-merge-msg.h
+++ b/third_party/git/fmt-merge-msg.h
diff --git a/fsck.c b/third_party/git/fsck.c
index cdb7d8db03..cdb7d8db03 100644
--- a/fsck.c
+++ b/third_party/git/fsck.c
diff --git a/fsck.h b/third_party/git/fsck.h
index b95595ae5f..b95595ae5f 100644
--- a/fsck.h
+++ b/third_party/git/fsck.h
diff --git a/fsmonitor.c b/third_party/git/fsmonitor.c
index 231e83a94d..231e83a94d 100644
--- a/fsmonitor.c
+++ b/third_party/git/fsmonitor.c
diff --git a/fsmonitor.h b/third_party/git/fsmonitor.h
index 739318ab6d..739318ab6d 100644
--- a/fsmonitor.h
+++ b/third_party/git/fsmonitor.h
diff --git a/fuzz-commit-graph.c b/third_party/git/fuzz-commit-graph.c
index 0157acbf2e..0157acbf2e 100644
--- a/fuzz-commit-graph.c
+++ b/third_party/git/fuzz-commit-graph.c
diff --git a/fuzz-pack-headers.c b/third_party/git/fuzz-pack-headers.c
index 99da1d0fd3..99da1d0fd3 100644
--- a/fuzz-pack-headers.c
+++ b/third_party/git/fuzz-pack-headers.c
diff --git a/fuzz-pack-idx.c b/third_party/git/fuzz-pack-idx.c
index 0c3d777aac..0c3d777aac 100644
--- a/fuzz-pack-idx.c
+++ b/third_party/git/fuzz-pack-idx.c
diff --git a/generate-cmdlist.sh b/third_party/git/generate-cmdlist.sh
index 71158f7d8b..71158f7d8b 100755
--- a/generate-cmdlist.sh
+++ b/third_party/git/generate-cmdlist.sh
diff --git a/gettext.c b/third_party/git/gettext.c
index 35d2c1218d..35d2c1218d 100644
--- a/gettext.c
+++ b/third_party/git/gettext.c
diff --git a/gettext.h b/third_party/git/gettext.h
index bee52eb113..bee52eb113 100644
--- a/gettext.h
+++ b/third_party/git/gettext.h
diff --git a/git-add--interactive.perl b/third_party/git/git-add--interactive.perl
index c20ae9e210..c20ae9e210 100755
--- a/git-add--interactive.perl
+++ b/third_party/git/git-add--interactive.perl
diff --git a/git-archimport.perl b/third_party/git/git-archimport.perl
index b7c173c345..b7c173c345 100755
--- a/git-archimport.perl
+++ b/third_party/git/git-archimport.perl
diff --git a/git-bisect.sh b/third_party/git/git-bisect.sh
index efee12b8b1..efee12b8b1 100755
--- a/git-bisect.sh
+++ b/third_party/git/git-bisect.sh
diff --git a/git-compat-util.h b/third_party/git/git-compat-util.h
index 83be89de0a..83be89de0a 100644
--- a/git-compat-util.h
+++ b/third_party/git/git-compat-util.h
diff --git a/git-cvsexportcommit.perl b/third_party/git/git-cvsexportcommit.perl
index fc00d5946a..fc00d5946a 100755
--- a/git-cvsexportcommit.perl
+++ b/third_party/git/git-cvsexportcommit.perl
diff --git a/git-cvsimport.perl b/third_party/git/git-cvsimport.perl
index b31613cb8a..b31613cb8a 100755
--- a/git-cvsimport.perl
+++ b/third_party/git/git-cvsimport.perl
diff --git a/git-cvsserver.perl b/third_party/git/git-cvsserver.perl
index ae1044273d..ae1044273d 100755
--- a/git-cvsserver.perl
+++ b/third_party/git/git-cvsserver.perl
diff --git a/git-difftool--helper.sh b/third_party/git/git-difftool--helper.sh
index 46af3e60b7..46af3e60b7 100755
--- a/git-difftool--helper.sh
+++ b/third_party/git/git-difftool--helper.sh
diff --git a/git-filter-branch.sh b/third_party/git/git-filter-branch.sh
index 5c5afa2b98..5c5afa2b98 100755
--- a/git-filter-branch.sh
+++ b/third_party/git/git-filter-branch.sh
diff --git a/git-gui/.gitattributes b/third_party/git/git-gui/.gitattributes
index 59cd41dbff..59cd41dbff 100644
--- a/git-gui/.gitattributes
+++ b/third_party/git/git-gui/.gitattributes
diff --git a/git-gui/.gitignore b/third_party/git/git-gui/.gitignore
index 6483b21cbf..6483b21cbf 100644
--- a/git-gui/.gitignore
+++ b/third_party/git/git-gui/.gitignore
diff --git a/git-gui/GIT-VERSION-GEN b/third_party/git/git-gui/GIT-VERSION-GEN
index 92373d251a..92373d251a 100755
--- a/git-gui/GIT-VERSION-GEN
+++ b/third_party/git/git-gui/GIT-VERSION-GEN
diff --git a/git-gui/Makefile b/third_party/git/git-gui/Makefile
index f10caedaa7..f10caedaa7 100644
--- a/git-gui/Makefile
+++ b/third_party/git/git-gui/Makefile
diff --git a/git-gui/git-gui--askpass b/third_party/git/git-gui/git-gui--askpass
index 4277f30c41..4277f30c41 100755
--- a/git-gui/git-gui--askpass
+++ b/third_party/git/git-gui/git-gui--askpass
diff --git a/git-gui/git-gui.sh b/third_party/git/git-gui/git-gui.sh
index 6de74ce639..6de74ce639 100755
--- a/git-gui/git-gui.sh
+++ b/third_party/git/git-gui/git-gui.sh
diff --git a/git-gui/lib/about.tcl b/third_party/git/git-gui/lib/about.tcl
index cfa50fca87..cfa50fca87 100644
--- a/git-gui/lib/about.tcl
+++ b/third_party/git/git-gui/lib/about.tcl
diff --git a/git-gui/lib/blame.tcl b/third_party/git/git-gui/lib/blame.tcl
index a1aeb8b96e..a1aeb8b96e 100644
--- a/git-gui/lib/blame.tcl
+++ b/third_party/git/git-gui/lib/blame.tcl
diff --git a/git-gui/lib/branch.tcl b/third_party/git/git-gui/lib/branch.tcl
index 777eeb79c1..777eeb79c1 100644
--- a/git-gui/lib/branch.tcl
+++ b/third_party/git/git-gui/lib/branch.tcl
diff --git a/git-gui/lib/branch_checkout.tcl b/third_party/git/git-gui/lib/branch_checkout.tcl
index d06037decc..d06037decc 100644
--- a/git-gui/lib/branch_checkout.tcl
+++ b/third_party/git/git-gui/lib/branch_checkout.tcl
diff --git a/git-gui/lib/branch_create.tcl b/third_party/git/git-gui/lib/branch_create.tcl
index ba367d551d..ba367d551d 100644
--- a/git-gui/lib/branch_create.tcl
+++ b/third_party/git/git-gui/lib/branch_create.tcl
diff --git a/git-gui/lib/branch_delete.tcl b/third_party/git/git-gui/lib/branch_delete.tcl
index a5051637bb..a5051637bb 100644
--- a/git-gui/lib/branch_delete.tcl
+++ b/third_party/git/git-gui/lib/branch_delete.tcl
diff --git a/git-gui/lib/branch_rename.tcl b/third_party/git/git-gui/lib/branch_rename.tcl
index 3a2d79a9cc..3a2d79a9cc 100644
--- a/git-gui/lib/branch_rename.tcl
+++ b/third_party/git/git-gui/lib/branch_rename.tcl
diff --git a/git-gui/lib/browser.tcl b/third_party/git/git-gui/lib/browser.tcl
index a982983667..a982983667 100644
--- a/git-gui/lib/browser.tcl
+++ b/third_party/git/git-gui/lib/browser.tcl
diff --git a/git-gui/lib/checkout_op.tcl b/third_party/git/git-gui/lib/checkout_op.tcl
index 9e7412c446..9e7412c446 100644
--- a/git-gui/lib/checkout_op.tcl
+++ b/third_party/git/git-gui/lib/checkout_op.tcl
diff --git a/git-gui/lib/choose_font.tcl b/third_party/git/git-gui/lib/choose_font.tcl
index ebe50bd7d0..ebe50bd7d0 100644
--- a/git-gui/lib/choose_font.tcl
+++ b/third_party/git/git-gui/lib/choose_font.tcl
diff --git a/git-gui/lib/choose_repository.tcl b/third_party/git/git-gui/lib/choose_repository.tcl
index 80f5a59bbb..80f5a59bbb 100644
--- a/git-gui/lib/choose_repository.tcl
+++ b/third_party/git/git-gui/lib/choose_repository.tcl
diff --git a/git-gui/lib/choose_rev.tcl b/third_party/git/git-gui/lib/choose_rev.tcl
index 6dae7937d5..6dae7937d5 100644
--- a/git-gui/lib/choose_rev.tcl
+++ b/third_party/git/git-gui/lib/choose_rev.tcl
diff --git a/git-gui/lib/class.tcl b/third_party/git/git-gui/lib/class.tcl
index f08506f383..f08506f383 100644
--- a/git-gui/lib/class.tcl
+++ b/third_party/git/git-gui/lib/class.tcl
diff --git a/git-gui/lib/commit.tcl b/third_party/git/git-gui/lib/commit.tcl
index 75ea965dac..75ea965dac 100644
--- a/git-gui/lib/commit.tcl
+++ b/third_party/git/git-gui/lib/commit.tcl
diff --git a/git-gui/lib/console.tcl b/third_party/git/git-gui/lib/console.tcl
index 1f3248ffd1..1f3248ffd1 100644
--- a/git-gui/lib/console.tcl
+++ b/third_party/git/git-gui/lib/console.tcl
diff --git a/git-gui/lib/database.tcl b/third_party/git/git-gui/lib/database.tcl
index 85783081e0..85783081e0 100644
--- a/git-gui/lib/database.tcl
+++ b/third_party/git/git-gui/lib/database.tcl
diff --git a/git-gui/lib/date.tcl b/third_party/git/git-gui/lib/date.tcl
index abe82992b6..abe82992b6 100644
--- a/git-gui/lib/date.tcl
+++ b/third_party/git/git-gui/lib/date.tcl
diff --git a/git-gui/lib/diff.tcl b/third_party/git/git-gui/lib/diff.tcl
index 68c4a6c736..68c4a6c736 100644
--- a/git-gui/lib/diff.tcl
+++ b/third_party/git/git-gui/lib/diff.tcl
diff --git a/git-gui/lib/encoding.tcl b/third_party/git/git-gui/lib/encoding.tcl
index 32668fc9c6..32668fc9c6 100644
--- a/git-gui/lib/encoding.tcl
+++ b/third_party/git/git-gui/lib/encoding.tcl
diff --git a/git-gui/lib/error.tcl b/third_party/git/git-gui/lib/error.tcl
index 8968a57f33..8968a57f33 100644
--- a/git-gui/lib/error.tcl
+++ b/third_party/git/git-gui/lib/error.tcl
diff --git a/git-gui/lib/git-gui.ico b/third_party/git/git-gui/lib/git-gui.ico
index 334cfa5a1a..334cfa5a1a 100644
--- a/git-gui/lib/git-gui.ico
+++ b/third_party/git/git-gui/lib/git-gui.ico
Binary files differdiff --git a/git-gui/lib/index.tcl b/third_party/git/git-gui/lib/index.tcl
index b588db11d9..b588db11d9 100644
--- a/git-gui/lib/index.tcl
+++ b/third_party/git/git-gui/lib/index.tcl
diff --git a/git-gui/lib/line.tcl b/third_party/git/git-gui/lib/line.tcl
index a026de954c..a026de954c 100644
--- a/git-gui/lib/line.tcl
+++ b/third_party/git/git-gui/lib/line.tcl
diff --git a/git-gui/lib/logo.tcl b/third_party/git/git-gui/lib/logo.tcl
index 5ff76692f5..5ff76692f5 100644
--- a/git-gui/lib/logo.tcl
+++ b/third_party/git/git-gui/lib/logo.tcl
diff --git a/git-gui/lib/merge.tcl b/third_party/git/git-gui/lib/merge.tcl
index 9f253db5b3..9f253db5b3 100644
--- a/git-gui/lib/merge.tcl
+++ b/third_party/git/git-gui/lib/merge.tcl
diff --git a/git-gui/lib/mergetool.tcl b/third_party/git/git-gui/lib/mergetool.tcl
index 120bc4064b..120bc4064b 100644
--- a/git-gui/lib/mergetool.tcl
+++ b/third_party/git/git-gui/lib/mergetool.tcl
diff --git a/git-gui/lib/option.tcl b/third_party/git/git-gui/lib/option.tcl
index e43971bfa3..e43971bfa3 100644
--- a/git-gui/lib/option.tcl
+++ b/third_party/git/git-gui/lib/option.tcl
diff --git a/git-gui/lib/remote.tcl b/third_party/git/git-gui/lib/remote.tcl
index ef77ed7399..ef77ed7399 100644
--- a/git-gui/lib/remote.tcl
+++ b/third_party/git/git-gui/lib/remote.tcl
diff --git a/git-gui/lib/remote_add.tcl b/third_party/git/git-gui/lib/remote_add.tcl
index 480a6b30d0..480a6b30d0 100644
--- a/git-gui/lib/remote_add.tcl
+++ b/third_party/git/git-gui/lib/remote_add.tcl
diff --git a/git-gui/lib/remote_branch_delete.tcl b/third_party/git/git-gui/lib/remote_branch_delete.tcl
index 5ba9fcadd1..5ba9fcadd1 100644
--- a/git-gui/lib/remote_branch_delete.tcl
+++ b/third_party/git/git-gui/lib/remote_branch_delete.tcl
diff --git a/git-gui/lib/search.tcl b/third_party/git/git-gui/lib/search.tcl
index ef1e55521d..ef1e55521d 100644
--- a/git-gui/lib/search.tcl
+++ b/third_party/git/git-gui/lib/search.tcl
diff --git a/git-gui/lib/shortcut.tcl b/third_party/git/git-gui/lib/shortcut.tcl
index 97d1d7aa02..97d1d7aa02 100644
--- a/git-gui/lib/shortcut.tcl
+++ b/third_party/git/git-gui/lib/shortcut.tcl
diff --git a/git-gui/lib/spellcheck.tcl b/third_party/git/git-gui/lib/spellcheck.tcl
index 538d61c792..538d61c792 100644
--- a/git-gui/lib/spellcheck.tcl
+++ b/third_party/git/git-gui/lib/spellcheck.tcl
diff --git a/git-gui/lib/sshkey.tcl b/third_party/git/git-gui/lib/sshkey.tcl
index 589ff8f78a..589ff8f78a 100644
--- a/git-gui/lib/sshkey.tcl
+++ b/third_party/git/git-gui/lib/sshkey.tcl
diff --git a/git-gui/lib/status_bar.tcl b/third_party/git/git-gui/lib/status_bar.tcl
index 02111a1742..02111a1742 100644
--- a/git-gui/lib/status_bar.tcl
+++ b/third_party/git/git-gui/lib/status_bar.tcl
diff --git a/git-gui/lib/themed.tcl b/third_party/git/git-gui/lib/themed.tcl
index 88b3119a75..88b3119a75 100644
--- a/git-gui/lib/themed.tcl
+++ b/third_party/git/git-gui/lib/themed.tcl
diff --git a/git-gui/lib/tools.tcl b/third_party/git/git-gui/lib/tools.tcl
index 413f1a1700..413f1a1700 100644
--- a/git-gui/lib/tools.tcl
+++ b/third_party/git/git-gui/lib/tools.tcl
diff --git a/git-gui/lib/tools_dlg.tcl b/third_party/git/git-gui/lib/tools_dlg.tcl
index c05413ce43..c05413ce43 100644
--- a/git-gui/lib/tools_dlg.tcl
+++ b/third_party/git/git-gui/lib/tools_dlg.tcl
diff --git a/git-gui/lib/transport.tcl b/third_party/git/git-gui/lib/transport.tcl
index a1a424aab5..a1a424aab5 100644
--- a/git-gui/lib/transport.tcl
+++ b/third_party/git/git-gui/lib/transport.tcl
diff --git a/git-gui/lib/win32.tcl b/third_party/git/git-gui/lib/win32.tcl
index db91ab84a5..db91ab84a5 100644
--- a/git-gui/lib/win32.tcl
+++ b/third_party/git/git-gui/lib/win32.tcl
diff --git a/git-gui/lib/win32_shortcut.js b/third_party/git/git-gui/lib/win32_shortcut.js
index 117923f886..117923f886 100644
--- a/git-gui/lib/win32_shortcut.js
+++ b/third_party/git/git-gui/lib/win32_shortcut.js
diff --git a/git-gui/macosx/AppMain.tcl b/third_party/git/git-gui/macosx/AppMain.tcl
index b6c6dc3500..b6c6dc3500 100644
--- a/git-gui/macosx/AppMain.tcl
+++ b/third_party/git/git-gui/macosx/AppMain.tcl
diff --git a/git-gui/macosx/Info.plist b/third_party/git/git-gui/macosx/Info.plist
index 1ade121c4c..1ade121c4c 100644
--- a/git-gui/macosx/Info.plist
+++ b/third_party/git/git-gui/macosx/Info.plist
diff --git a/git-gui/macosx/git-gui.icns b/third_party/git/git-gui/macosx/git-gui.icns
index 77d88a77a7..77d88a77a7 100644
--- a/git-gui/macosx/git-gui.icns
+++ b/third_party/git/git-gui/macosx/git-gui.icns
Binary files differdiff --git a/git-gui/po/.gitignore b/third_party/git/git-gui/po/.gitignore
index a89cf44969..a89cf44969 100644
--- a/git-gui/po/.gitignore
+++ b/third_party/git/git-gui/po/.gitignore
diff --git a/git-gui/po/README b/third_party/git/git-gui/po/README
index 2514bc22ab..2514bc22ab 100644
--- a/git-gui/po/README
+++ b/third_party/git/git-gui/po/README
diff --git a/git-gui/po/bg.po b/third_party/git/git-gui/po/bg.po
index 5af78f15a8..5af78f15a8 100644
--- a/git-gui/po/bg.po
+++ b/third_party/git/git-gui/po/bg.po
diff --git a/git-gui/po/de.po b/third_party/git/git-gui/po/de.po
index baebff2fff..baebff2fff 100644
--- a/git-gui/po/de.po
+++ b/third_party/git/git-gui/po/de.po
diff --git a/git-gui/po/el.po b/third_party/git/git-gui/po/el.po
index 3634ba469d..3634ba469d 100644
--- a/git-gui/po/el.po
+++ b/third_party/git/git-gui/po/el.po
diff --git a/git-gui/po/fr.po b/third_party/git/git-gui/po/fr.po
index 0aff18691d..0aff18691d 100644
--- a/git-gui/po/fr.po
+++ b/third_party/git/git-gui/po/fr.po
diff --git a/git-gui/po/git-gui.pot b/third_party/git/git-gui/po/git-gui.pot
index 0c94f9c2c6..0c94f9c2c6 100644
--- a/git-gui/po/git-gui.pot
+++ b/third_party/git/git-gui/po/git-gui.pot
diff --git a/git-gui/po/glossary/Makefile b/third_party/git/git-gui/po/glossary/Makefile
index 749aa2e7ec..749aa2e7ec 100644
--- a/git-gui/po/glossary/Makefile
+++ b/third_party/git/git-gui/po/glossary/Makefile
diff --git a/git-gui/po/glossary/bg.po b/third_party/git/git-gui/po/glossary/bg.po
index 8b71fad9a5..8b71fad9a5 100644
--- a/git-gui/po/glossary/bg.po
+++ b/third_party/git/git-gui/po/glossary/bg.po
diff --git a/git-gui/po/glossary/de.po b/third_party/git/git-gui/po/glossary/de.po
index 35764d1d22..35764d1d22 100644
--- a/git-gui/po/glossary/de.po
+++ b/third_party/git/git-gui/po/glossary/de.po
diff --git a/git-gui/po/glossary/el.po b/third_party/git/git-gui/po/glossary/el.po
index 1d3cc818d5..1d3cc818d5 100644
--- a/git-gui/po/glossary/el.po
+++ b/third_party/git/git-gui/po/glossary/el.po
diff --git a/git-gui/po/glossary/fr.po b/third_party/git/git-gui/po/glossary/fr.po
index 27c006abb2..27c006abb2 100644
--- a/git-gui/po/glossary/fr.po
+++ b/third_party/git/git-gui/po/glossary/fr.po
diff --git a/git-gui/po/glossary/git-gui-glossary.pot b/third_party/git/git-gui/po/glossary/git-gui-glossary.pot
index 40eb3e9c07..40eb3e9c07 100644
--- a/git-gui/po/glossary/git-gui-glossary.pot
+++ b/third_party/git/git-gui/po/glossary/git-gui-glossary.pot
diff --git a/git-gui/po/glossary/git-gui-glossary.txt b/third_party/git/git-gui/po/glossary/git-gui-glossary.txt
index 409304692d..409304692d 100644
--- a/git-gui/po/glossary/git-gui-glossary.txt
+++ b/third_party/git/git-gui/po/glossary/git-gui-glossary.txt
diff --git a/git-gui/po/glossary/it.po b/third_party/git/git-gui/po/glossary/it.po
index bb46b48d6b..bb46b48d6b 100644
--- a/git-gui/po/glossary/it.po
+++ b/third_party/git/git-gui/po/glossary/it.po
diff --git a/git-gui/po/glossary/pt_br.po b/third_party/git/git-gui/po/glossary/pt_br.po
index eb039b2b49..eb039b2b49 100644
--- a/git-gui/po/glossary/pt_br.po
+++ b/third_party/git/git-gui/po/glossary/pt_br.po
diff --git a/git-gui/po/glossary/pt_pt.po b/third_party/git/git-gui/po/glossary/pt_pt.po
index adc3b542a6..adc3b542a6 100644
--- a/git-gui/po/glossary/pt_pt.po
+++ b/third_party/git/git-gui/po/glossary/pt_pt.po
diff --git a/git-gui/po/glossary/txt-to-pot.sh b/third_party/git/git-gui/po/glossary/txt-to-pot.sh
index 8249915d3c..8249915d3c 100755
--- a/git-gui/po/glossary/txt-to-pot.sh
+++ b/third_party/git/git-gui/po/glossary/txt-to-pot.sh
diff --git a/git-gui/po/glossary/zh_cn.po b/third_party/git/git-gui/po/glossary/zh_cn.po
index 158835b5c1..158835b5c1 100644
--- a/git-gui/po/glossary/zh_cn.po
+++ b/third_party/git/git-gui/po/glossary/zh_cn.po
diff --git a/git-gui/po/hu.po b/third_party/git/git-gui/po/hu.po
index d106dadac8..d106dadac8 100644
--- a/git-gui/po/hu.po
+++ b/third_party/git/git-gui/po/hu.po
diff --git a/git-gui/po/it.po b/third_party/git/git-gui/po/it.po
index 1bd8b8e04f..1bd8b8e04f 100644
--- a/git-gui/po/it.po
+++ b/third_party/git/git-gui/po/it.po
diff --git a/git-gui/po/ja.po b/third_party/git/git-gui/po/ja.po
index 208651c1af..208651c1af 100644
--- a/git-gui/po/ja.po
+++ b/third_party/git/git-gui/po/ja.po
diff --git a/git-gui/po/nb.po b/third_party/git/git-gui/po/nb.po
index d66aa50263..d66aa50263 100644
--- a/git-gui/po/nb.po
+++ b/third_party/git/git-gui/po/nb.po
diff --git a/git-gui/po/po2msg.sh b/third_party/git/git-gui/po/po2msg.sh
index 1e9f992528..1e9f992528 100755
--- a/git-gui/po/po2msg.sh
+++ b/third_party/git/git-gui/po/po2msg.sh
diff --git a/git-gui/po/pt_br.po b/third_party/git/git-gui/po/pt_br.po
index bad116c780..bad116c780 100644
--- a/git-gui/po/pt_br.po
+++ b/third_party/git/git-gui/po/pt_br.po
diff --git a/git-gui/po/pt_pt.po b/third_party/git/git-gui/po/pt_pt.po
index 0ef3c7927d..0ef3c7927d 100644
--- a/git-gui/po/pt_pt.po
+++ b/third_party/git/git-gui/po/pt_pt.po
diff --git a/git-gui/po/ru.po b/third_party/git/git-gui/po/ru.po
index 9f5305c43e..9f5305c43e 100644
--- a/git-gui/po/ru.po
+++ b/third_party/git/git-gui/po/ru.po
diff --git a/git-gui/po/sv.po b/third_party/git/git-gui/po/sv.po
index 1b4ad8368e..1b4ad8368e 100644
--- a/git-gui/po/sv.po
+++ b/third_party/git/git-gui/po/sv.po
diff --git a/git-gui/po/vi.po b/third_party/git/git-gui/po/vi.po
index d956b59a9e..d956b59a9e 100644
--- a/git-gui/po/vi.po
+++ b/third_party/git/git-gui/po/vi.po
diff --git a/git-gui/po/zh_cn.po b/third_party/git/git-gui/po/zh_cn.po
index 91c1be23c2..91c1be23c2 100644
--- a/git-gui/po/zh_cn.po
+++ b/third_party/git/git-gui/po/zh_cn.po
diff --git a/git-gui/windows/git-gui.sh b/third_party/git/git-gui/windows/git-gui.sh
index b1845c5055..b1845c5055 100755
--- a/git-gui/windows/git-gui.sh
+++ b/third_party/git/git-gui/windows/git-gui.sh
diff --git a/git-instaweb.sh b/third_party/git/git-instaweb.sh
index 7c55229773..7c55229773 100755
--- a/git-instaweb.sh
+++ b/third_party/git/git-instaweb.sh
diff --git a/git-legacy-stash.sh b/third_party/git/git-legacy-stash.sh
index f60e9b3e87..f60e9b3e87 100755
--- a/git-legacy-stash.sh
+++ b/third_party/git/git-legacy-stash.sh
diff --git a/git-merge-octopus.sh b/third_party/git/git-merge-octopus.sh
index 7d19d37951..7d19d37951 100755
--- a/git-merge-octopus.sh
+++ b/third_party/git/git-merge-octopus.sh
diff --git a/git-merge-one-file.sh b/third_party/git/git-merge-one-file.sh
index f6d9852d2f..f6d9852d2f 100755
--- a/git-merge-one-file.sh
+++ b/third_party/git/git-merge-one-file.sh
diff --git a/git-merge-resolve.sh b/third_party/git/git-merge-resolve.sh
index 343fe7bccd..343fe7bccd 100755
--- a/git-merge-resolve.sh
+++ b/third_party/git/git-merge-resolve.sh
diff --git a/git-mergetool--lib.sh b/third_party/git/git-mergetool--lib.sh
index 204a5acd66..204a5acd66 100644
--- a/git-mergetool--lib.sh
+++ b/third_party/git/git-mergetool--lib.sh
diff --git a/git-mergetool.sh b/third_party/git/git-mergetool.sh
index e3f6d543fb..e3f6d543fb 100755
--- a/git-mergetool.sh
+++ b/third_party/git/git-mergetool.sh
diff --git a/git-p4.py b/third_party/git/git-p4.py
index 3991e7d1a7..3991e7d1a7 100755
--- a/git-p4.py
+++ b/third_party/git/git-p4.py
diff --git a/git-parse-remote.sh b/third_party/git/git-parse-remote.sh
index d3c39980f3..d3c39980f3 100644
--- a/git-parse-remote.sh
+++ b/third_party/git/git-parse-remote.sh
diff --git a/git-quiltimport.sh b/third_party/git/git-quiltimport.sh
index e3d3909743..e3d3909743 100755
--- a/git-quiltimport.sh
+++ b/third_party/git/git-quiltimport.sh
diff --git a/git-rebase--preserve-merges.sh b/third_party/git/git-rebase--preserve-merges.sh
index dec90e9af6..dec90e9af6 100644
--- a/git-rebase--preserve-merges.sh
+++ b/third_party/git/git-rebase--preserve-merges.sh
diff --git a/git-request-pull.sh b/third_party/git/git-request-pull.sh
index 2d0e44656c..2d0e44656c 100755
--- a/git-request-pull.sh
+++ b/third_party/git/git-request-pull.sh
diff --git a/git-send-email.perl b/third_party/git/git-send-email.perl
index 5f92c89c1c..5f92c89c1c 100755
--- a/git-send-email.perl
+++ b/third_party/git/git-send-email.perl
diff --git a/git-sh-i18n.sh b/third_party/git/git-sh-i18n.sh
index 8eef60b43f..8eef60b43f 100644
--- a/git-sh-i18n.sh
+++ b/third_party/git/git-sh-i18n.sh
diff --git a/git-sh-setup.sh b/third_party/git/git-sh-setup.sh
index 10d9764185..10d9764185 100644
--- a/git-sh-setup.sh
+++ b/third_party/git/git-sh-setup.sh
diff --git a/git-submodule.sh b/third_party/git/git-submodule.sh
index c7f58c5756..c7f58c5756 100755
--- a/git-submodule.sh
+++ b/third_party/git/git-submodule.sh
diff --git a/git-svn.perl b/third_party/git/git-svn.perl
index 050f2a36f4..050f2a36f4 100755
--- a/git-svn.perl
+++ b/third_party/git/git-svn.perl
diff --git a/git-web--browse.sh b/third_party/git/git-web--browse.sh
index ae152534f5..ae152534f5 100755
--- a/git-web--browse.sh
+++ b/third_party/git/git-web--browse.sh
diff --git a/git.c b/third_party/git/git.c
index c1ee7124ed..c1ee7124ed 100644
--- a/git.c
+++ b/third_party/git/git.c
diff --git a/git.rc b/third_party/git/git.rc
index cc3fdc6cc6..cc3fdc6cc6 100644
--- a/git.rc
+++ b/third_party/git/git.rc
diff --git a/gitk-git/.gitignore b/third_party/git/gitk-git/.gitignore
index d7ebcaf366..d7ebcaf366 100644
--- a/gitk-git/.gitignore
+++ b/third_party/git/gitk-git/.gitignore
diff --git a/gitk-git/Makefile b/third_party/git/gitk-git/Makefile
index 5bdd52a6eb..5bdd52a6eb 100644
--- a/gitk-git/Makefile
+++ b/third_party/git/gitk-git/Makefile
diff --git a/gitk-git/gitk b/third_party/git/gitk-git/gitk
index a14d7a16b2..a14d7a16b2 100755
--- a/gitk-git/gitk
+++ b/third_party/git/gitk-git/gitk
diff --git a/gitk-git/po/.gitignore b/third_party/git/gitk-git/po/.gitignore
index e358dd1903..e358dd1903 100644
--- a/gitk-git/po/.gitignore
+++ b/third_party/git/gitk-git/po/.gitignore
diff --git a/gitk-git/po/bg.po b/third_party/git/gitk-git/po/bg.po
index 87ab1fac24..87ab1fac24 100644
--- a/gitk-git/po/bg.po
+++ b/third_party/git/gitk-git/po/bg.po
diff --git a/gitk-git/po/ca.po b/third_party/git/gitk-git/po/ca.po
index 87dfc18b44..87dfc18b44 100644
--- a/gitk-git/po/ca.po
+++ b/third_party/git/gitk-git/po/ca.po
diff --git a/gitk-git/po/de.po b/third_party/git/gitk-git/po/de.po
index 5db3824828..5db3824828 100644
--- a/gitk-git/po/de.po
+++ b/third_party/git/gitk-git/po/de.po
diff --git a/gitk-git/po/es.po b/third_party/git/gitk-git/po/es.po
index fef3bbafee..fef3bbafee 100644
--- a/gitk-git/po/es.po
+++ b/third_party/git/gitk-git/po/es.po
diff --git a/gitk-git/po/fr.po b/third_party/git/gitk-git/po/fr.po
index e4fac932e5..e4fac932e5 100644
--- a/gitk-git/po/fr.po
+++ b/third_party/git/gitk-git/po/fr.po
diff --git a/gitk-git/po/hu.po b/third_party/git/gitk-git/po/hu.po
index 79ec5a5656..79ec5a5656 100644
--- a/gitk-git/po/hu.po
+++ b/third_party/git/gitk-git/po/hu.po
diff --git a/gitk-git/po/it.po b/third_party/git/gitk-git/po/it.po
index b58d23eb2b..b58d23eb2b 100644
--- a/gitk-git/po/it.po
+++ b/third_party/git/gitk-git/po/it.po
diff --git a/gitk-git/po/ja.po b/third_party/git/gitk-git/po/ja.po
index ca3c29b457..ca3c29b457 100644
--- a/gitk-git/po/ja.po
+++ b/third_party/git/gitk-git/po/ja.po
diff --git a/gitk-git/po/po2msg.sh b/third_party/git/gitk-git/po/po2msg.sh
index c63248e375..c63248e375 100755
--- a/gitk-git/po/po2msg.sh
+++ b/third_party/git/gitk-git/po/po2msg.sh
diff --git a/gitk-git/po/pt_br.po b/third_party/git/gitk-git/po/pt_br.po
index 1feb34854b..1feb34854b 100644
--- a/gitk-git/po/pt_br.po
+++ b/third_party/git/gitk-git/po/pt_br.po
diff --git a/gitk-git/po/pt_pt.po b/third_party/git/gitk-git/po/pt_pt.po
index f680ea86aa..f680ea86aa 100644
--- a/gitk-git/po/pt_pt.po
+++ b/third_party/git/gitk-git/po/pt_pt.po
diff --git a/gitk-git/po/ru.po b/third_party/git/gitk-git/po/ru.po
index 9b08c263ea..9b08c263ea 100644
--- a/gitk-git/po/ru.po
+++ b/third_party/git/gitk-git/po/ru.po
diff --git a/gitk-git/po/sv.po b/third_party/git/gitk-git/po/sv.po
index 2a06fe5bbc..2a06fe5bbc 100644
--- a/gitk-git/po/sv.po
+++ b/third_party/git/gitk-git/po/sv.po
diff --git a/gitk-git/po/vi.po b/third_party/git/gitk-git/po/vi.po
index 5967498660..5967498660 100644
--- a/gitk-git/po/vi.po
+++ b/third_party/git/gitk-git/po/vi.po
diff --git a/gitweb/INSTALL b/third_party/git/gitweb/INSTALL
index a58e6b3c44..a58e6b3c44 100644
--- a/gitweb/INSTALL
+++ b/third_party/git/gitweb/INSTALL
diff --git a/gitweb/Makefile b/third_party/git/gitweb/Makefile
index cd194d057f..cd194d057f 100644
--- a/gitweb/Makefile
+++ b/third_party/git/gitweb/Makefile
diff --git a/gitweb/README b/third_party/git/gitweb/README
index 471dcfb691..471dcfb691 100644
--- a/gitweb/README
+++ b/third_party/git/gitweb/README
diff --git a/gitweb/gitweb.perl b/third_party/git/gitweb/gitweb.perl
index 7fef19fe59..7fef19fe59 100755
--- a/gitweb/gitweb.perl
+++ b/third_party/git/gitweb/gitweb.perl
diff --git a/gitweb/static/git-favicon.png b/third_party/git/gitweb/static/git-favicon.png
index aae35a70e7..aae35a70e7 100644
--- a/gitweb/static/git-favicon.png
+++ b/third_party/git/gitweb/static/git-favicon.png
Binary files differdiff --git a/gitweb/static/git-logo.png b/third_party/git/gitweb/static/git-logo.png
index f4ede2e944..f4ede2e944 100644
--- a/gitweb/static/git-logo.png
+++ b/third_party/git/gitweb/static/git-logo.png
Binary files differdiff --git a/gitweb/static/gitweb.css b/third_party/git/gitweb/static/gitweb.css
index 3212601032..3212601032 100644
--- a/gitweb/static/gitweb.css
+++ b/third_party/git/gitweb/static/gitweb.css
diff --git a/gitweb/static/js/README b/third_party/git/gitweb/static/js/README
index f8460ed32f..f8460ed32f 100644
--- a/gitweb/static/js/README
+++ b/third_party/git/gitweb/static/js/README
diff --git a/gitweb/static/js/adjust-timezone.js b/third_party/git/gitweb/static/js/adjust-timezone.js
index 0c67779500..0c67779500 100644
--- a/gitweb/static/js/adjust-timezone.js
+++ b/third_party/git/gitweb/static/js/adjust-timezone.js
diff --git a/gitweb/static/js/blame_incremental.js b/third_party/git/gitweb/static/js/blame_incremental.js
index db6eb50584..db6eb50584 100644
--- a/gitweb/static/js/blame_incremental.js
+++ b/third_party/git/gitweb/static/js/blame_incremental.js
diff --git a/gitweb/static/js/javascript-detection.js b/third_party/git/gitweb/static/js/javascript-detection.js
index fa2596f77c..fa2596f77c 100644
--- a/gitweb/static/js/javascript-detection.js
+++ b/third_party/git/gitweb/static/js/javascript-detection.js
diff --git a/gitweb/static/js/lib/common-lib.js b/third_party/git/gitweb/static/js/lib/common-lib.js
index 018bbb7d4c..018bbb7d4c 100644
--- a/gitweb/static/js/lib/common-lib.js
+++ b/third_party/git/gitweb/static/js/lib/common-lib.js
diff --git a/gitweb/static/js/lib/cookies.js b/third_party/git/gitweb/static/js/lib/cookies.js
index 66b9a072a4..66b9a072a4 100644
--- a/gitweb/static/js/lib/cookies.js
+++ b/third_party/git/gitweb/static/js/lib/cookies.js
diff --git a/gitweb/static/js/lib/datetime.js b/third_party/git/gitweb/static/js/lib/datetime.js
index f78c60a912..f78c60a912 100644
--- a/gitweb/static/js/lib/datetime.js
+++ b/third_party/git/gitweb/static/js/lib/datetime.js
diff --git a/gpg-interface.c b/third_party/git/gpg-interface.c
index d60115ca40..d60115ca40 100644
--- a/gpg-interface.c
+++ b/third_party/git/gpg-interface.c
diff --git a/gpg-interface.h b/third_party/git/gpg-interface.h
index 3e624ec289..3e624ec289 100644
--- a/gpg-interface.h
+++ b/third_party/git/gpg-interface.h
diff --git a/graph.c b/third_party/git/graph.c
index f53135485f..f53135485f 100644
--- a/graph.c
+++ b/third_party/git/graph.c
diff --git a/graph.h b/third_party/git/graph.h
index af623390b6..af623390b6 100644
--- a/graph.h
+++ b/third_party/git/graph.h
diff --git a/grep.c b/third_party/git/grep.c
index cd952ef5d3..cd952ef5d3 100644
--- a/grep.c
+++ b/third_party/git/grep.c
diff --git a/grep.h b/third_party/git/grep.h
index 1875880f37..1875880f37 100644
--- a/grep.h
+++ b/third_party/git/grep.h
diff --git a/hash.h b/third_party/git/hash.h
index 52a4f1a3f4..52a4f1a3f4 100644
--- a/hash.h
+++ b/third_party/git/hash.h
diff --git a/hashmap.c b/third_party/git/hashmap.c
index d42f01ff5a..d42f01ff5a 100644
--- a/hashmap.c
+++ b/third_party/git/hashmap.c
diff --git a/hashmap.h b/third_party/git/hashmap.h
index 8424911566..8424911566 100644
--- a/hashmap.h
+++ b/third_party/git/hashmap.h
diff --git a/help.c b/third_party/git/help.c
index 5261d83ecf..5261d83ecf 100644
--- a/help.c
+++ b/third_party/git/help.c
diff --git a/help.h b/third_party/git/help.h
index b8780fbd0f..b8780fbd0f 100644
--- a/help.h
+++ b/third_party/git/help.h
diff --git a/hex.c b/third_party/git/hex.c
index 7850a8879d..7850a8879d 100644
--- a/hex.c
+++ b/third_party/git/hex.c
diff --git a/http-backend.c b/third_party/git/http-backend.c
index ec3144b444..ec3144b444 100644
--- a/http-backend.c
+++ b/third_party/git/http-backend.c
diff --git a/http-fetch.c b/third_party/git/http-fetch.c
index a32ac118d9..a32ac118d9 100644
--- a/http-fetch.c
+++ b/third_party/git/http-fetch.c
diff --git a/http-push.c b/third_party/git/http-push.c
index 0353f9f514..0353f9f514 100644
--- a/http-push.c
+++ b/third_party/git/http-push.c
diff --git a/http-walker.c b/third_party/git/http-walker.c
index fe15e325fa..fe15e325fa 100644
--- a/http-walker.c
+++ b/third_party/git/http-walker.c
diff --git a/http.c b/third_party/git/http.c
index 27aa0a3192..27aa0a3192 100644
--- a/http.c
+++ b/third_party/git/http.c
diff --git a/http.h b/third_party/git/http.h
index b429f1cf04..b429f1cf04 100644
--- a/http.h
+++ b/third_party/git/http.h
diff --git a/ident.c b/third_party/git/ident.c
index e666ee4e59..e666ee4e59 100644
--- a/ident.c
+++ b/third_party/git/ident.c
diff --git a/imap-send.c b/third_party/git/imap-send.c
index 6c54d8c29d..6c54d8c29d 100644
--- a/imap-send.c
+++ b/third_party/git/imap-send.c
diff --git a/interdiff.c b/third_party/git/interdiff.c
index c81d680a6c..c81d680a6c 100644
--- a/interdiff.c
+++ b/third_party/git/interdiff.c
diff --git a/interdiff.h b/third_party/git/interdiff.h
index 01c730a5c9..01c730a5c9 100644
--- a/interdiff.h
+++ b/third_party/git/interdiff.h
diff --git a/iterator.h b/third_party/git/iterator.h
index 0f6900e43a..0f6900e43a 100644
--- a/iterator.h
+++ b/third_party/git/iterator.h
diff --git a/json-writer.c b/third_party/git/json-writer.c
index aadb9dbddc..aadb9dbddc 100644
--- a/json-writer.c
+++ b/third_party/git/json-writer.c
diff --git a/json-writer.h b/third_party/git/json-writer.h
index 83906b09c1..83906b09c1 100644
--- a/json-writer.h
+++ b/third_party/git/json-writer.h
diff --git a/khash.h b/third_party/git/khash.h
index 21c2095216..21c2095216 100644
--- a/khash.h
+++ b/third_party/git/khash.h
diff --git a/kwset.c b/third_party/git/kwset.c
index fc439e0667..fc439e0667 100644
--- a/kwset.c
+++ b/third_party/git/kwset.c
diff --git a/kwset.h b/third_party/git/kwset.h
index df99a92178..df99a92178 100644
--- a/kwset.h
+++ b/third_party/git/kwset.h
diff --git a/levenshtein.c b/third_party/git/levenshtein.c
index d2632690d5..d2632690d5 100644
--- a/levenshtein.c
+++ b/third_party/git/levenshtein.c
diff --git a/levenshtein.h b/third_party/git/levenshtein.h
index 4105bf3549..4105bf3549 100644
--- a/levenshtein.h
+++ b/third_party/git/levenshtein.h
diff --git a/line-log.c b/third_party/git/line-log.c
index 3aff1849e7..3aff1849e7 100644
--- a/line-log.c
+++ b/third_party/git/line-log.c
diff --git a/line-log.h b/third_party/git/line-log.h
index 8ee7a2bd4a..8ee7a2bd4a 100644
--- a/line-log.h
+++ b/third_party/git/line-log.h
diff --git a/line-range.c b/third_party/git/line-range.c
index 9b50583dc0..9b50583dc0 100644
--- a/line-range.c
+++ b/third_party/git/line-range.c
diff --git a/line-range.h b/third_party/git/line-range.h
index e69bf7c017..e69bf7c017 100644
--- a/line-range.h
+++ b/third_party/git/line-range.h
diff --git a/linear-assignment.c b/third_party/git/linear-assignment.c
index ecffc09be6..ecffc09be6 100644
--- a/linear-assignment.c
+++ b/third_party/git/linear-assignment.c
diff --git a/linear-assignment.h b/third_party/git/linear-assignment.h
index 1dfea76629..1dfea76629 100644
--- a/linear-assignment.h
+++ b/third_party/git/linear-assignment.h
diff --git a/list-objects-filter-options.c b/third_party/git/list-objects-filter-options.c
index 1cb20c659c..1cb20c659c 100644
--- a/list-objects-filter-options.c
+++ b/third_party/git/list-objects-filter-options.c
diff --git a/list-objects-filter-options.h b/third_party/git/list-objects-filter-options.h
index c54f0000fb..c54f0000fb 100644
--- a/list-objects-filter-options.h
+++ b/third_party/git/list-objects-filter-options.h
diff --git a/list-objects-filter.c b/third_party/git/list-objects-filter.c
index 36e1f774bc..36e1f774bc 100644
--- a/list-objects-filter.c
+++ b/third_party/git/list-objects-filter.c
diff --git a/list-objects-filter.h b/third_party/git/list-objects-filter.h
index 1d45a4ad57..1d45a4ad57 100644
--- a/list-objects-filter.h
+++ b/third_party/git/list-objects-filter.h
diff --git a/list-objects.c b/third_party/git/list-objects.c
index b5651ddd5b..b5651ddd5b 100644
--- a/list-objects.c
+++ b/third_party/git/list-objects.c
diff --git a/list-objects.h b/third_party/git/list-objects.h
index a952680e46..a952680e46 100644
--- a/list-objects.h
+++ b/third_party/git/list-objects.h
diff --git a/list.h b/third_party/git/list.h
index eb601192f4..eb601192f4 100644
--- a/list.h
+++ b/third_party/git/list.h
diff --git a/ll-merge.c b/third_party/git/ll-merge.c
index 5b8d46aede..5b8d46aede 100644
--- a/ll-merge.c
+++ b/third_party/git/ll-merge.c
diff --git a/ll-merge.h b/third_party/git/ll-merge.h
index b9e2af1c88..b9e2af1c88 100644
--- a/ll-merge.h
+++ b/third_party/git/ll-merge.h
diff --git a/lockfile.c b/third_party/git/lockfile.c
index 8e8ab4f29f..8e8ab4f29f 100644
--- a/lockfile.c
+++ b/third_party/git/lockfile.c
diff --git a/lockfile.h b/third_party/git/lockfile.h
index 9843053ce8..9843053ce8 100644
--- a/lockfile.h
+++ b/third_party/git/lockfile.h
diff --git a/log-tree.c b/third_party/git/log-tree.c
index 1e56df62a7..1e56df62a7 100644
--- a/log-tree.c
+++ b/third_party/git/log-tree.c
diff --git a/log-tree.h b/third_party/git/log-tree.h
index e668628074..e668628074 100644
--- a/log-tree.h
+++ b/third_party/git/log-tree.h
diff --git a/ls-refs.c b/third_party/git/ls-refs.c
index 818aef70a0..818aef70a0 100644
--- a/ls-refs.c
+++ b/third_party/git/ls-refs.c
diff --git a/ls-refs.h b/third_party/git/ls-refs.h
index 7e5646f5f6..7e5646f5f6 100644
--- a/ls-refs.h
+++ b/third_party/git/ls-refs.h
diff --git a/mailinfo.c b/third_party/git/mailinfo.c
index b395adbdf2..b395adbdf2 100644
--- a/mailinfo.c
+++ b/third_party/git/mailinfo.c
diff --git a/mailinfo.h b/third_party/git/mailinfo.h
index 79b1d6774e..79b1d6774e 100644
--- a/mailinfo.h
+++ b/third_party/git/mailinfo.h
diff --git a/mailmap.c b/third_party/git/mailmap.c
index 962fd86d6d..962fd86d6d 100644
--- a/mailmap.c
+++ b/third_party/git/mailmap.c
diff --git a/mailmap.h b/third_party/git/mailmap.h
index d0e65646cb..d0e65646cb 100644
--- a/mailmap.h
+++ b/third_party/git/mailmap.h
diff --git a/match-trees.c b/third_party/git/match-trees.c
index f6c194c1cc..f6c194c1cc 100644
--- a/match-trees.c
+++ b/third_party/git/match-trees.c
diff --git a/mem-pool.c b/third_party/git/mem-pool.c
index a2841a4a9a..a2841a4a9a 100644
--- a/mem-pool.c
+++ b/third_party/git/mem-pool.c
diff --git a/mem-pool.h b/third_party/git/mem-pool.h
index 999d3c3a52..999d3c3a52 100644
--- a/mem-pool.h
+++ b/third_party/git/mem-pool.h
diff --git a/merge-blobs.c b/third_party/git/merge-blobs.c
index ee0a0e90c9..ee0a0e90c9 100644
--- a/merge-blobs.c
+++ b/third_party/git/merge-blobs.c
diff --git a/merge-blobs.h b/third_party/git/merge-blobs.h
index 13cf9669e5..13cf9669e5 100644
--- a/merge-blobs.h
+++ b/third_party/git/merge-blobs.h
diff --git a/merge-recursive.c b/third_party/git/merge-recursive.c
index 6b812d67e3..6b812d67e3 100644
--- a/merge-recursive.c
+++ b/third_party/git/merge-recursive.c
diff --git a/merge-recursive.h b/third_party/git/merge-recursive.h
index c2b7bb65c6..c2b7bb65c6 100644
--- a/merge-recursive.h
+++ b/third_party/git/merge-recursive.h
diff --git a/merge.c b/third_party/git/merge.c
index 7c1d756c3f..7c1d756c3f 100644
--- a/merge.c
+++ b/third_party/git/merge.c
diff --git a/mergesort.c b/third_party/git/mergesort.c
index e5fdf2ee4a..e5fdf2ee4a 100644
--- a/mergesort.c
+++ b/third_party/git/mergesort.c
diff --git a/mergesort.h b/third_party/git/mergesort.h
index 644cff1f96..644cff1f96 100644
--- a/mergesort.h
+++ b/third_party/git/mergesort.h
diff --git a/mergetools/araxis b/third_party/git/mergetools/araxis
index e2407b65b7..e2407b65b7 100644
--- a/mergetools/araxis
+++ b/third_party/git/mergetools/araxis
diff --git a/mergetools/bc b/third_party/git/mergetools/bc
index 3a69e60faa..3a69e60faa 100644
--- a/mergetools/bc
+++ b/third_party/git/mergetools/bc
diff --git a/mergetools/bc3 b/third_party/git/mergetools/bc3
index 5d8dd48184..5d8dd48184 100644
--- a/mergetools/bc3
+++ b/third_party/git/mergetools/bc3
diff --git a/mergetools/codecompare b/third_party/git/mergetools/codecompare
index 9f60e8da65..9f60e8da65 100644
--- a/mergetools/codecompare
+++ b/third_party/git/mergetools/codecompare
diff --git a/mergetools/deltawalker b/third_party/git/mergetools/deltawalker
index ee6f374bce..ee6f374bce 100644
--- a/mergetools/deltawalker
+++ b/third_party/git/mergetools/deltawalker
diff --git a/mergetools/diffmerge b/third_party/git/mergetools/diffmerge
index 9b6355b98a..9b6355b98a 100644
--- a/mergetools/diffmerge
+++ b/third_party/git/mergetools/diffmerge
diff --git a/mergetools/diffuse b/third_party/git/mergetools/diffuse
index 5a3ae8b569..5a3ae8b569 100644
--- a/mergetools/diffuse
+++ b/third_party/git/mergetools/diffuse
diff --git a/mergetools/ecmerge b/third_party/git/mergetools/ecmerge
index 6c5101c4f7..6c5101c4f7 100644
--- a/mergetools/ecmerge
+++ b/third_party/git/mergetools/ecmerge
diff --git a/mergetools/emerge b/third_party/git/mergetools/emerge
index d1ce513ff5..d1ce513ff5 100644
--- a/mergetools/emerge
+++ b/third_party/git/mergetools/emerge
diff --git a/mergetools/examdiff b/third_party/git/mergetools/examdiff
index e72b06fc4d..e72b06fc4d 100644
--- a/mergetools/examdiff
+++ b/third_party/git/mergetools/examdiff
diff --git a/mergetools/guiffy b/third_party/git/mergetools/guiffy
index 8b23a13c41..8b23a13c41 100644
--- a/mergetools/guiffy
+++ b/third_party/git/mergetools/guiffy
diff --git a/mergetools/gvimdiff b/third_party/git/mergetools/gvimdiff
index 04a5bb0ea8..04a5bb0ea8 100644
--- a/mergetools/gvimdiff
+++ b/third_party/git/mergetools/gvimdiff
diff --git a/mergetools/gvimdiff2 b/third_party/git/mergetools/gvimdiff2
index 04a5bb0ea8..04a5bb0ea8 100644
--- a/mergetools/gvimdiff2
+++ b/third_party/git/mergetools/gvimdiff2
diff --git a/mergetools/gvimdiff3 b/third_party/git/mergetools/gvimdiff3
index 04a5bb0ea8..04a5bb0ea8 100644
--- a/mergetools/gvimdiff3
+++ b/third_party/git/mergetools/gvimdiff3
diff --git a/mergetools/kdiff3 b/third_party/git/mergetools/kdiff3
index 0264ed5b20..0264ed5b20 100644
--- a/mergetools/kdiff3
+++ b/third_party/git/mergetools/kdiff3
diff --git a/mergetools/kompare b/third_party/git/mergetools/kompare
index e8c0bfa678..e8c0bfa678 100644
--- a/mergetools/kompare
+++ b/third_party/git/mergetools/kompare
diff --git a/mergetools/meld b/third_party/git/mergetools/meld
index 7a08470f88..7a08470f88 100644
--- a/mergetools/meld
+++ b/third_party/git/mergetools/meld
diff --git a/mergetools/opendiff b/third_party/git/mergetools/opendiff
index b608dd6de3..b608dd6de3 100644
--- a/mergetools/opendiff
+++ b/third_party/git/mergetools/opendiff
diff --git a/mergetools/p4merge b/third_party/git/mergetools/p4merge
index 7a5b291dd2..7a5b291dd2 100644
--- a/mergetools/p4merge
+++ b/third_party/git/mergetools/p4merge
diff --git a/mergetools/smerge b/third_party/git/mergetools/smerge
index 9c2e6f6fd7..9c2e6f6fd7 100644
--- a/mergetools/smerge
+++ b/third_party/git/mergetools/smerge
diff --git a/mergetools/tkdiff b/third_party/git/mergetools/tkdiff
index eee5cb57e3..eee5cb57e3 100644
--- a/mergetools/tkdiff
+++ b/third_party/git/mergetools/tkdiff
diff --git a/mergetools/tortoisemerge b/third_party/git/mergetools/tortoisemerge
index d7ab666a59..d7ab666a59 100644
--- a/mergetools/tortoisemerge
+++ b/third_party/git/mergetools/tortoisemerge
diff --git a/mergetools/vimdiff b/third_party/git/mergetools/vimdiff
index 10d86f3e19..10d86f3e19 100644
--- a/mergetools/vimdiff
+++ b/third_party/git/mergetools/vimdiff
diff --git a/mergetools/vimdiff2 b/third_party/git/mergetools/vimdiff2
index 04a5bb0ea8..04a5bb0ea8 100644
--- a/mergetools/vimdiff2
+++ b/third_party/git/mergetools/vimdiff2
diff --git a/mergetools/vimdiff3 b/third_party/git/mergetools/vimdiff3
index 04a5bb0ea8..04a5bb0ea8 100644
--- a/mergetools/vimdiff3
+++ b/third_party/git/mergetools/vimdiff3
diff --git a/mergetools/winmerge b/third_party/git/mergetools/winmerge
index 74d03259fd..74d03259fd 100644
--- a/mergetools/winmerge
+++ b/third_party/git/mergetools/winmerge
diff --git a/mergetools/xxdiff b/third_party/git/mergetools/xxdiff
index ce5b8e9f29..ce5b8e9f29 100644
--- a/mergetools/xxdiff
+++ b/third_party/git/mergetools/xxdiff
diff --git a/midx.c b/third_party/git/midx.c
index d649644420..d649644420 100644
--- a/midx.c
+++ b/third_party/git/midx.c
diff --git a/midx.h b/third_party/git/midx.h
index f0ae656b5d..f0ae656b5d 100644
--- a/midx.h
+++ b/third_party/git/midx.h
diff --git a/name-hash.c b/third_party/git/name-hash.c
index 695908609f..695908609f 100644
--- a/name-hash.c
+++ b/third_party/git/name-hash.c
diff --git a/negotiator/default.c b/third_party/git/negotiator/default.c
index 4b78f6bf36..4b78f6bf36 100644
--- a/negotiator/default.c
+++ b/third_party/git/negotiator/default.c
diff --git a/negotiator/default.h b/third_party/git/negotiator/default.h
index d23a8f2fb8..d23a8f2fb8 100644
--- a/negotiator/default.h
+++ b/third_party/git/negotiator/default.h
diff --git a/negotiator/skipping.c b/third_party/git/negotiator/skipping.c
index dffbc76c49..dffbc76c49 100644
--- a/negotiator/skipping.c
+++ b/third_party/git/negotiator/skipping.c
diff --git a/negotiator/skipping.h b/third_party/git/negotiator/skipping.h
index d7dfa6c6e4..d7dfa6c6e4 100644
--- a/negotiator/skipping.h
+++ b/third_party/git/negotiator/skipping.h
diff --git a/notes-cache.c b/third_party/git/notes-cache.c
index 2473314d68..2473314d68 100644
--- a/notes-cache.c
+++ b/third_party/git/notes-cache.c
diff --git a/notes-cache.h b/third_party/git/notes-cache.h
index 56f8c98e24..56f8c98e24 100644
--- a/notes-cache.h
+++ b/third_party/git/notes-cache.h
diff --git a/notes-merge.c b/third_party/git/notes-merge.c
index 2fe724f1cf..2fe724f1cf 100644
--- a/notes-merge.c
+++ b/third_party/git/notes-merge.c
diff --git a/notes-merge.h b/third_party/git/notes-merge.h
index 99f9c709c5..99f9c709c5 100644
--- a/notes-merge.h
+++ b/third_party/git/notes-merge.h
diff --git a/notes-utils.c b/third_party/git/notes-utils.c
index a819410698..a819410698 100644
--- a/notes-utils.c
+++ b/third_party/git/notes-utils.c
diff --git a/notes-utils.h b/third_party/git/notes-utils.h
index d9b3c09eaf..d9b3c09eaf 100644
--- a/notes-utils.h
+++ b/third_party/git/notes-utils.h
diff --git a/notes.c b/third_party/git/notes.c
index 75c028b300..75c028b300 100644
--- a/notes.c
+++ b/third_party/git/notes.c
diff --git a/notes.h b/third_party/git/notes.h
index 76337f2384..76337f2384 100644
--- a/notes.h
+++ b/third_party/git/notes.h
diff --git a/object-store.h b/third_party/git/object-store.h
index 7f7b3cdd80..7f7b3cdd80 100644
--- a/object-store.h
+++ b/third_party/git/object-store.h
diff --git a/object.c b/third_party/git/object.c
index 07bdd5b26e..07bdd5b26e 100644
--- a/object.c
+++ b/third_party/git/object.c
diff --git a/object.h b/third_party/git/object.h
index 0120892bbd..0120892bbd 100644
--- a/object.h
+++ b/third_party/git/object.h
diff --git a/oidmap.c b/third_party/git/oidmap.c
index 6d6e840d03..6d6e840d03 100644
--- a/oidmap.c
+++ b/third_party/git/oidmap.c
diff --git a/oidmap.h b/third_party/git/oidmap.h
index 7a939461ff..7a939461ff 100644
--- a/oidmap.h
+++ b/third_party/git/oidmap.h
diff --git a/oidset.c b/third_party/git/oidset.c
index f63ce818f6..f63ce818f6 100644
--- a/oidset.c
+++ b/third_party/git/oidset.c
diff --git a/oidset.h b/third_party/git/oidset.h
index 5346563b0b..5346563b0b 100644
--- a/oidset.h
+++ b/third_party/git/oidset.h
diff --git a/pack-bitmap-write.c b/third_party/git/pack-bitmap-write.c
index fa78a460c9..fa78a460c9 100644
--- a/pack-bitmap-write.c
+++ b/third_party/git/pack-bitmap-write.c
diff --git a/pack-bitmap.c b/third_party/git/pack-bitmap.c
index ed2befaac6..ed2befaac6 100644
--- a/pack-bitmap.c
+++ b/third_party/git/pack-bitmap.c
diff --git a/pack-bitmap.h b/third_party/git/pack-bitmap.h
index 00de3ec8e4..00de3ec8e4 100644
--- a/pack-bitmap.h
+++ b/third_party/git/pack-bitmap.h
diff --git a/pack-check.c b/third_party/git/pack-check.c
index 2cc3603189..2cc3603189 100644
--- a/pack-check.c
+++ b/third_party/git/pack-check.c
diff --git a/pack-objects.c b/third_party/git/pack-objects.c
index 52560293b6..52560293b6 100644
--- a/pack-objects.c
+++ b/third_party/git/pack-objects.c
diff --git a/pack-objects.h b/third_party/git/pack-objects.h
index 857d43850b..857d43850b 100644
--- a/pack-objects.h
+++ b/third_party/git/pack-objects.h
diff --git a/pack-revindex.c b/third_party/git/pack-revindex.c
index d28a7e43d0..d28a7e43d0 100644
--- a/pack-revindex.c
+++ b/third_party/git/pack-revindex.c
diff --git a/pack-revindex.h b/third_party/git/pack-revindex.h
index 848331d5d6..848331d5d6 100644
--- a/pack-revindex.h
+++ b/third_party/git/pack-revindex.h
diff --git a/pack-write.c b/third_party/git/pack-write.c
index 29d17a9bec..29d17a9bec 100644
--- a/pack-write.c
+++ b/third_party/git/pack-write.c
diff --git a/pack.h b/third_party/git/pack.h
index 9fc0945ac9..9fc0945ac9 100644
--- a/pack.h
+++ b/third_party/git/pack.h
diff --git a/packfile.c b/third_party/git/packfile.c
index fc43a6c52c..fc43a6c52c 100644
--- a/packfile.c
+++ b/third_party/git/packfile.c
diff --git a/packfile.h b/third_party/git/packfile.h
index 3e98910bdd..3e98910bdd 100644
--- a/packfile.h
+++ b/third_party/git/packfile.h
diff --git a/pager.c b/third_party/git/pager.c
index 41446d4f05..41446d4f05 100644
--- a/pager.c
+++ b/third_party/git/pager.c
diff --git a/parse-options-cb.c b/third_party/git/parse-options-cb.c
index 1240a8514e..1240a8514e 100644
--- a/parse-options-cb.c
+++ b/third_party/git/parse-options-cb.c
diff --git a/parse-options.c b/third_party/git/parse-options.c
index 87b26a1d92..87b26a1d92 100644
--- a/parse-options.c
+++ b/third_party/git/parse-options.c
diff --git a/parse-options.h b/third_party/git/parse-options.h
index a4bd40bb6a..a4bd40bb6a 100644
--- a/parse-options.h
+++ b/third_party/git/parse-options.h
diff --git a/patch-delta.c b/third_party/git/patch-delta.c
index b5c8594db6..b5c8594db6 100644
--- a/patch-delta.c
+++ b/third_party/git/patch-delta.c
diff --git a/patch-ids.c b/third_party/git/patch-ids.c
index e8c150d0c9..e8c150d0c9 100644
--- a/patch-ids.c
+++ b/third_party/git/patch-ids.c
diff --git a/patch-ids.h b/third_party/git/patch-ids.h
index 03bb04e707..03bb04e707 100644
--- a/patch-ids.h
+++ b/third_party/git/patch-ids.h
diff --git a/path.c b/third_party/git/path.c
index 25e97b8c3f..25e97b8c3f 100644
--- a/path.c
+++ b/third_party/git/path.c
diff --git a/path.h b/third_party/git/path.h
index 2ba6ca58c8..2ba6ca58c8 100644
--- a/path.h
+++ b/third_party/git/path.h
diff --git a/pathspec.c b/third_party/git/pathspec.c
index 12c2b322b3..12c2b322b3 100644
--- a/pathspec.c
+++ b/third_party/git/pathspec.c
diff --git a/pathspec.h b/third_party/git/pathspec.h
index 1c18a2c90c..1c18a2c90c 100644
--- a/pathspec.h
+++ b/third_party/git/pathspec.h
diff --git a/perl/.gitignore b/third_party/git/perl/.gitignore
index 84c048a73c..84c048a73c 100644
--- a/perl/.gitignore
+++ b/third_party/git/perl/.gitignore
diff --git a/perl/FromCPAN/.gitattributes b/third_party/git/perl/FromCPAN/.gitattributes
index 8b64fc5e22..8b64fc5e22 100644
--- a/perl/FromCPAN/.gitattributes
+++ b/third_party/git/perl/FromCPAN/.gitattributes
diff --git a/perl/FromCPAN/Error.pm b/third_party/git/perl/FromCPAN/Error.pm
index 8b95e2d73d..8b95e2d73d 100644
--- a/perl/FromCPAN/Error.pm
+++ b/third_party/git/perl/FromCPAN/Error.pm
diff --git a/perl/FromCPAN/Mail/Address.pm b/third_party/git/perl/FromCPAN/Mail/Address.pm
index 683d490b2b..683d490b2b 100644
--- a/perl/FromCPAN/Mail/Address.pm
+++ b/third_party/git/perl/FromCPAN/Mail/Address.pm
diff --git a/perl/Git.pm b/third_party/git/perl/Git.pm
index 62c472e0ce..62c472e0ce 100644
--- a/perl/Git.pm
+++ b/third_party/git/perl/Git.pm
diff --git a/perl/Git/I18N.pm b/third_party/git/perl/Git/I18N.pm
index bfb4fb67a1..bfb4fb67a1 100644
--- a/perl/Git/I18N.pm
+++ b/third_party/git/perl/Git/I18N.pm
diff --git a/perl/Git/IndexInfo.pm b/third_party/git/perl/Git/IndexInfo.pm
index a43108c985..a43108c985 100644
--- a/perl/Git/IndexInfo.pm
+++ b/third_party/git/perl/Git/IndexInfo.pm
diff --git a/perl/Git/LoadCPAN.pm b/third_party/git/perl/Git/LoadCPAN.pm
index e5585e75e8..e5585e75e8 100644
--- a/perl/Git/LoadCPAN.pm
+++ b/third_party/git/perl/Git/LoadCPAN.pm
diff --git a/perl/Git/LoadCPAN/Error.pm b/third_party/git/perl/Git/LoadCPAN/Error.pm
index c6d2c45d80..c6d2c45d80 100644
--- a/perl/Git/LoadCPAN/Error.pm
+++ b/third_party/git/perl/Git/LoadCPAN/Error.pm
diff --git a/perl/Git/LoadCPAN/Mail/Address.pm b/third_party/git/perl/Git/LoadCPAN/Mail/Address.pm
index f70a4f064c..f70a4f064c 100644
--- a/perl/Git/LoadCPAN/Mail/Address.pm
+++ b/third_party/git/perl/Git/LoadCPAN/Mail/Address.pm
diff --git a/perl/Git/Packet.pm b/third_party/git/perl/Git/Packet.pm
index b75738bed4..b75738bed4 100644
--- a/perl/Git/Packet.pm
+++ b/third_party/git/perl/Git/Packet.pm
diff --git a/perl/Git/SVN.pm b/third_party/git/perl/Git/SVN.pm
index 76b2965905..76b2965905 100644
--- a/perl/Git/SVN.pm
+++ b/third_party/git/perl/Git/SVN.pm
diff --git a/perl/Git/SVN/Editor.pm b/third_party/git/perl/Git/SVN/Editor.pm
index 0df16ed726..0df16ed726 100644
--- a/perl/Git/SVN/Editor.pm
+++ b/third_party/git/perl/Git/SVN/Editor.pm
diff --git a/perl/Git/SVN/Fetcher.pm b/third_party/git/perl/Git/SVN/Fetcher.pm
index 64e900a0e9..64e900a0e9 100644
--- a/perl/Git/SVN/Fetcher.pm
+++ b/third_party/git/perl/Git/SVN/Fetcher.pm
diff --git a/perl/Git/SVN/GlobSpec.pm b/third_party/git/perl/Git/SVN/GlobSpec.pm
index a0a8d17621..a0a8d17621 100644
--- a/perl/Git/SVN/GlobSpec.pm
+++ b/third_party/git/perl/Git/SVN/GlobSpec.pm
diff --git a/perl/Git/SVN/Log.pm b/third_party/git/perl/Git/SVN/Log.pm
index 664105357c..664105357c 100644
--- a/perl/Git/SVN/Log.pm
+++ b/third_party/git/perl/Git/SVN/Log.pm
diff --git a/perl/Git/SVN/Memoize/YAML.pm b/third_party/git/perl/Git/SVN/Memoize/YAML.pm
index 9676b8f2f7..9676b8f2f7 100644
--- a/perl/Git/SVN/Memoize/YAML.pm
+++ b/third_party/git/perl/Git/SVN/Memoize/YAML.pm
diff --git a/perl/Git/SVN/Migration.pm b/third_party/git/perl/Git/SVN/Migration.pm
index dc90f6a621..dc90f6a621 100644
--- a/perl/Git/SVN/Migration.pm
+++ b/third_party/git/perl/Git/SVN/Migration.pm
diff --git a/perl/Git/SVN/Prompt.pm b/third_party/git/perl/Git/SVN/Prompt.pm
index e940b08505..e940b08505 100644
--- a/perl/Git/SVN/Prompt.pm
+++ b/third_party/git/perl/Git/SVN/Prompt.pm
diff --git a/perl/Git/SVN/Ra.pm b/third_party/git/perl/Git/SVN/Ra.pm
index 56ad9870bc..56ad9870bc 100644
--- a/perl/Git/SVN/Ra.pm
+++ b/third_party/git/perl/Git/SVN/Ra.pm
diff --git a/perl/Git/SVN/Utils.pm b/third_party/git/perl/Git/SVN/Utils.pm
index 3d1a0933a2..3d1a0933a2 100644
--- a/perl/Git/SVN/Utils.pm
+++ b/third_party/git/perl/Git/SVN/Utils.pm
diff --git a/perl/header_templates/fixed_prefix.template.pl b/third_party/git/perl/header_templates/fixed_prefix.template.pl
index 857b4391a4..857b4391a4 100644
--- a/perl/header_templates/fixed_prefix.template.pl
+++ b/third_party/git/perl/header_templates/fixed_prefix.template.pl
diff --git a/perl/header_templates/runtime_prefix.template.pl b/third_party/git/perl/header_templates/runtime_prefix.template.pl
index 9d28b3d863..9d28b3d863 100644
--- a/perl/header_templates/runtime_prefix.template.pl
+++ b/third_party/git/perl/header_templates/runtime_prefix.template.pl
diff --git a/pkt-line.c b/third_party/git/pkt-line.c
index a0e87b1e81..a0e87b1e81 100644
--- a/pkt-line.c
+++ b/third_party/git/pkt-line.c
diff --git a/pkt-line.h b/third_party/git/pkt-line.h
index 5c62015db4..5c62015db4 100644
--- a/pkt-line.h
+++ b/third_party/git/pkt-line.h
diff --git a/po/.gitignore b/third_party/git/po/.gitignore
index 796b96d1c4..796b96d1c4 100644
--- a/po/.gitignore
+++ b/third_party/git/po/.gitignore
diff --git a/po/README b/third_party/git/po/README
index 07595d369b..07595d369b 100644
--- a/po/README
+++ b/third_party/git/po/README
diff --git a/po/TEAMS b/third_party/git/po/TEAMS
index 00472a4713..00472a4713 100644
--- a/po/TEAMS
+++ b/third_party/git/po/TEAMS
diff --git a/po/bg.po b/third_party/git/po/bg.po
index e1d10db688..e1d10db688 100644
--- a/po/bg.po
+++ b/third_party/git/po/bg.po
diff --git a/po/ca.po b/third_party/git/po/ca.po
index 73a08242c3..73a08242c3 100644
--- a/po/ca.po
+++ b/third_party/git/po/ca.po
diff --git a/po/de.po b/third_party/git/po/de.po
index 6d80cfb158..6d80cfb158 100644
--- a/po/de.po
+++ b/third_party/git/po/de.po
diff --git a/po/el.po b/third_party/git/po/el.po
index 703f46d0c7..703f46d0c7 100644
--- a/po/el.po
+++ b/third_party/git/po/el.po
diff --git a/po/es.po b/third_party/git/po/es.po
index 87c77ff993..87c77ff993 100644
--- a/po/es.po
+++ b/third_party/git/po/es.po
diff --git a/po/fr.po b/third_party/git/po/fr.po
index 55c7db6aa6..55c7db6aa6 100644
--- a/po/fr.po
+++ b/third_party/git/po/fr.po
diff --git a/po/git.pot b/third_party/git/po/git.pot
index d799696ad0..d799696ad0 100644
--- a/po/git.pot
+++ b/third_party/git/po/git.pot
diff --git a/po/is.po b/third_party/git/po/is.po
index b8b34fd65e..b8b34fd65e 100644
--- a/po/is.po
+++ b/third_party/git/po/is.po
diff --git a/po/it.po b/third_party/git/po/it.po
index 30ec99c744..30ec99c744 100644
--- a/po/it.po
+++ b/third_party/git/po/it.po
diff --git a/po/ko.po b/third_party/git/po/ko.po
index dcfe21c223..dcfe21c223 100644
--- a/po/ko.po
+++ b/third_party/git/po/ko.po
diff --git a/po/pt_PT.po b/third_party/git/po/pt_PT.po
index 8a2d55a8b6..8a2d55a8b6 100644
--- a/po/pt_PT.po
+++ b/third_party/git/po/pt_PT.po
diff --git a/po/ru.po b/third_party/git/po/ru.po
index a77b462e62..a77b462e62 100644
--- a/po/ru.po
+++ b/third_party/git/po/ru.po
diff --git a/po/sv.po b/third_party/git/po/sv.po
index 4ad206df70..4ad206df70 100644
--- a/po/sv.po
+++ b/third_party/git/po/sv.po
diff --git a/po/vi.po b/third_party/git/po/vi.po
index b8aa93a2c7..b8aa93a2c7 100644
--- a/po/vi.po
+++ b/third_party/git/po/vi.po
diff --git a/po/zh_CN.po b/third_party/git/po/zh_CN.po
index c6bdb3e300..c6bdb3e300 100644
--- a/po/zh_CN.po
+++ b/third_party/git/po/zh_CN.po
diff --git a/ppc/sha1.c b/third_party/git/ppc/sha1.c
index 1b705cee1f..1b705cee1f 100644
--- a/ppc/sha1.c
+++ b/third_party/git/ppc/sha1.c
diff --git a/ppc/sha1.h b/third_party/git/ppc/sha1.h
index 9b24b32615..9b24b32615 100644
--- a/ppc/sha1.h
+++ b/third_party/git/ppc/sha1.h
diff --git a/ppc/sha1ppc.S b/third_party/git/ppc/sha1ppc.S
index 1711eef6e7..1711eef6e7 100644
--- a/ppc/sha1ppc.S
+++ b/third_party/git/ppc/sha1ppc.S
diff --git a/preload-index.c b/third_party/git/preload-index.c
index ed6eaa4738..ed6eaa4738 100644
--- a/preload-index.c
+++ b/third_party/git/preload-index.c
diff --git a/pretty.c b/third_party/git/pretty.c
index e4ed14effe..e4ed14effe 100644
--- a/pretty.c
+++ b/third_party/git/pretty.c
diff --git a/pretty.h b/third_party/git/pretty.h
index 4ad1fc31ff..4ad1fc31ff 100644
--- a/pretty.h
+++ b/third_party/git/pretty.h
diff --git a/prio-queue.c b/third_party/git/prio-queue.c
index d3f488cb05..d3f488cb05 100644
--- a/prio-queue.c
+++ b/third_party/git/prio-queue.c
diff --git a/prio-queue.h b/third_party/git/prio-queue.h
index 4f9a37e6be..4f9a37e6be 100644
--- a/prio-queue.h
+++ b/third_party/git/prio-queue.h
diff --git a/progress.c b/third_party/git/progress.c
index 277db8afa2..277db8afa2 100644
--- a/progress.c
+++ b/third_party/git/progress.c
diff --git a/progress.h b/third_party/git/progress.h
index 847338911f..847338911f 100644
--- a/progress.h
+++ b/third_party/git/progress.h
diff --git a/prompt.c b/third_party/git/prompt.c
index 6d5885d009..6d5885d009 100644
--- a/prompt.c
+++ b/third_party/git/prompt.c
diff --git a/prompt.h b/third_party/git/prompt.h
index e04cced030..e04cced030 100644
--- a/prompt.h
+++ b/third_party/git/prompt.h
diff --git a/protocol.c b/third_party/git/protocol.c
index 9741f05750..9741f05750 100644
--- a/protocol.c
+++ b/third_party/git/protocol.c
diff --git a/protocol.h b/third_party/git/protocol.h
index cef1a4a01c..cef1a4a01c 100644
--- a/protocol.h
+++ b/third_party/git/protocol.h
diff --git a/quote.c b/third_party/git/quote.c
index 7f2aa6faa4..7f2aa6faa4 100644
--- a/quote.c
+++ b/third_party/git/quote.c
diff --git a/quote.h b/third_party/git/quote.h
index fb08dc085c..fb08dc085c 100644
--- a/quote.h
+++ b/third_party/git/quote.h
diff --git a/range-diff.c b/third_party/git/range-diff.c
index ba1e9a4265..ba1e9a4265 100644
--- a/range-diff.c
+++ b/third_party/git/range-diff.c
diff --git a/range-diff.h b/third_party/git/range-diff.h
index 08a50b6e98..08a50b6e98 100644
--- a/range-diff.h
+++ b/third_party/git/range-diff.h
diff --git a/reachable.c b/third_party/git/reachable.c
index 8f50235b28..8f50235b28 100644
--- a/reachable.c
+++ b/third_party/git/reachable.c
diff --git a/reachable.h b/third_party/git/reachable.h
index 5df932ad8f..5df932ad8f 100644
--- a/reachable.h
+++ b/third_party/git/reachable.h
diff --git a/read-cache.c b/third_party/git/read-cache.c
index 52ffa8a313..52ffa8a313 100644
--- a/read-cache.c
+++ b/third_party/git/read-cache.c
diff --git a/rebase-interactive.c b/third_party/git/rebase-interactive.c
index aa18ae82b7..aa18ae82b7 100644
--- a/rebase-interactive.c
+++ b/third_party/git/rebase-interactive.c
diff --git a/rebase-interactive.h b/third_party/git/rebase-interactive.h
index 44dbb06311..44dbb06311 100644
--- a/rebase-interactive.h
+++ b/third_party/git/rebase-interactive.h
diff --git a/ref-filter.c b/third_party/git/ref-filter.c
index f27cfc8c3e..f27cfc8c3e 100644
--- a/ref-filter.c
+++ b/third_party/git/ref-filter.c
diff --git a/ref-filter.h b/third_party/git/ref-filter.h
index f1dcff4c6e..f1dcff4c6e 100644
--- a/ref-filter.h
+++ b/third_party/git/ref-filter.h
diff --git a/reflog-walk.c b/third_party/git/reflog-walk.c
index 3a25b27d8f..3a25b27d8f 100644
--- a/reflog-walk.c
+++ b/third_party/git/reflog-walk.c
diff --git a/reflog-walk.h b/third_party/git/reflog-walk.h
index f26408f6cc..f26408f6cc 100644
--- a/reflog-walk.h
+++ b/third_party/git/reflog-walk.h
diff --git a/refs.c b/third_party/git/refs.c
index cd297ee4bd..cd297ee4bd 100644
--- a/refs.c
+++ b/third_party/git/refs.c
diff --git a/refs.h b/third_party/git/refs.h
index 730d05ad91..730d05ad91 100644
--- a/refs.h
+++ b/third_party/git/refs.h
diff --git a/refs/files-backend.c b/third_party/git/refs/files-backend.c
index d60767ab73..d60767ab73 100644
--- a/refs/files-backend.c
+++ b/third_party/git/refs/files-backend.c
diff --git a/refs/iterator.c b/third_party/git/refs/iterator.c
index 629e00a122..629e00a122 100644
--- a/refs/iterator.c
+++ b/third_party/git/refs/iterator.c
diff --git a/refs/packed-backend.c b/third_party/git/refs/packed-backend.c
index c01c7f5901..c01c7f5901 100644
--- a/refs/packed-backend.c
+++ b/third_party/git/refs/packed-backend.c
diff --git a/refs/packed-backend.h b/third_party/git/refs/packed-backend.h
index a01a0aff9c..a01a0aff9c 100644
--- a/refs/packed-backend.h
+++ b/third_party/git/refs/packed-backend.h
diff --git a/refs/ref-cache.c b/third_party/git/refs/ref-cache.c
index b7052f72e2..b7052f72e2 100644
--- a/refs/ref-cache.c
+++ b/third_party/git/refs/ref-cache.c
diff --git a/refs/ref-cache.h b/third_party/git/refs/ref-cache.h
index 3bfb89d2b3..3bfb89d2b3 100644
--- a/refs/ref-cache.h
+++ b/third_party/git/refs/ref-cache.h
diff --git a/refs/refs-internal.h b/third_party/git/refs/refs-internal.h
index f2d8c0123a..f2d8c0123a 100644
--- a/refs/refs-internal.h
+++ b/third_party/git/refs/refs-internal.h
diff --git a/refspec.c b/third_party/git/refspec.c
index 9a9bf21934..9a9bf21934 100644
--- a/refspec.c
+++ b/third_party/git/refspec.c
diff --git a/refspec.h b/third_party/git/refspec.h
index 9b6e64a824..9b6e64a824 100644
--- a/refspec.h
+++ b/third_party/git/refspec.h
diff --git a/remote-curl.c b/third_party/git/remote-curl.c
index 051f26629d..051f26629d 100644
--- a/remote-curl.c
+++ b/third_party/git/remote-curl.c
diff --git a/remote-testsvn.c b/third_party/git/remote-testsvn.c
index 3af708c5b6..3af708c5b6 100644
--- a/remote-testsvn.c
+++ b/third_party/git/remote-testsvn.c
diff --git a/remote.c b/third_party/git/remote.c
index e50f7602ed..e50f7602ed 100644
--- a/remote.c
+++ b/third_party/git/remote.c
diff --git a/remote.h b/third_party/git/remote.h
index 83e885672b..83e885672b 100644
--- a/remote.h
+++ b/third_party/git/remote.h
diff --git a/replace-object.c b/third_party/git/replace-object.c
index e295e87943..e295e87943 100644
--- a/replace-object.c
+++ b/third_party/git/replace-object.c
diff --git a/replace-object.h b/third_party/git/replace-object.h
index 04ed7a85a2..04ed7a85a2 100644
--- a/replace-object.h
+++ b/third_party/git/replace-object.h
diff --git a/repository.c b/third_party/git/repository.c
index 682c239fe3..682c239fe3 100644
--- a/repository.c
+++ b/third_party/git/repository.c
diff --git a/repository.h b/third_party/git/repository.h
index 4fb6a5885f..4fb6a5885f 100644
--- a/repository.h
+++ b/third_party/git/repository.h
diff --git a/rerere.c b/third_party/git/rerere.c
index 17abb47321..17abb47321 100644
--- a/rerere.c
+++ b/third_party/git/rerere.c
diff --git a/rerere.h b/third_party/git/rerere.h
index c32d79c3bd..c32d79c3bd 100644
--- a/rerere.h
+++ b/third_party/git/rerere.h
diff --git a/resolve-undo.c b/third_party/git/resolve-undo.c
index 236320f179..236320f179 100644
--- a/resolve-undo.c
+++ b/third_party/git/resolve-undo.c
diff --git a/resolve-undo.h b/third_party/git/resolve-undo.h
index 2b3f0f901e..2b3f0f901e 100644
--- a/resolve-undo.h
+++ b/third_party/git/resolve-undo.h
diff --git a/revision.c b/third_party/git/revision.c
index 07412297f0..07412297f0 100644
--- a/revision.c
+++ b/third_party/git/revision.c
diff --git a/revision.h b/third_party/git/revision.h
index 4134dc6029..4134dc6029 100644
--- a/revision.h
+++ b/third_party/git/revision.h
diff --git a/run-command.c b/third_party/git/run-command.c
index 3449db319b..3449db319b 100644
--- a/run-command.c
+++ b/third_party/git/run-command.c
diff --git a/run-command.h b/third_party/git/run-command.h
index f769e03f01..f769e03f01 100644
--- a/run-command.h
+++ b/third_party/git/run-command.h
diff --git a/send-pack.c b/third_party/git/send-pack.c
index 6dc16c3211..6dc16c3211 100644
--- a/send-pack.c
+++ b/third_party/git/send-pack.c
diff --git a/send-pack.h b/third_party/git/send-pack.h
index e148fcd960..e148fcd960 100644
--- a/send-pack.h
+++ b/third_party/git/send-pack.h
diff --git a/sequencer.c b/third_party/git/sequencer.c
index 34ebf8ed94..34ebf8ed94 100644
--- a/sequencer.c
+++ b/third_party/git/sequencer.c
diff --git a/sequencer.h b/third_party/git/sequencer.h
index 6704acbb9c..6704acbb9c 100644
--- a/sequencer.h
+++ b/third_party/git/sequencer.h
diff --git a/serve.c b/third_party/git/serve.c
index 317256c1a4..317256c1a4 100644
--- a/serve.c
+++ b/third_party/git/serve.c
diff --git a/serve.h b/third_party/git/serve.h
index 42ddca7f8b..42ddca7f8b 100644
--- a/serve.h
+++ b/third_party/git/serve.h
diff --git a/server-info.c b/third_party/git/server-info.c
index 4d8199b1d9..4d8199b1d9 100644
--- a/server-info.c
+++ b/third_party/git/server-info.c
diff --git a/setup.c b/third_party/git/setup.c
index 8dcb4631f7..8dcb4631f7 100644
--- a/setup.c
+++ b/third_party/git/setup.c
diff --git a/sh-i18n--envsubst.c b/third_party/git/sh-i18n--envsubst.c
index e7430b9aa8..e7430b9aa8 100644
--- a/sh-i18n--envsubst.c
+++ b/third_party/git/sh-i18n--envsubst.c
diff --git a/sha1-array.c b/third_party/git/sha1-array.c
index d922e94e3f..d922e94e3f 100644
--- a/sha1-array.c
+++ b/third_party/git/sha1-array.c
diff --git a/sha1-array.h b/third_party/git/sha1-array.h
index 55d016c4bf..55d016c4bf 100644
--- a/sha1-array.h
+++ b/third_party/git/sha1-array.h
diff --git a/sha1-file.c b/third_party/git/sha1-file.c
index 487ea35d2d..487ea35d2d 100644
--- a/sha1-file.c
+++ b/third_party/git/sha1-file.c
diff --git a/sha1-lookup.c b/third_party/git/sha1-lookup.c
index 796ab68da8..796ab68da8 100644
--- a/sha1-lookup.c
+++ b/third_party/git/sha1-lookup.c
diff --git a/sha1-lookup.h b/third_party/git/sha1-lookup.h
index 5afcd011c6..5afcd011c6 100644
--- a/sha1-lookup.h
+++ b/third_party/git/sha1-lookup.h
diff --git a/sha1-name.c b/third_party/git/sha1-name.c
index 2989e27b71..2989e27b71 100644
--- a/sha1-name.c
+++ b/third_party/git/sha1-name.c
diff --git a/sha1collisiondetection b/third_party/git/sha1collisiondetection
-Subproject 855827c583bc30645ba427885caa40c5b81764d
+Subproject 855827c583bc30645ba427885caa40c5b81764d
diff --git a/sha1dc/.gitattributes b/third_party/git/sha1dc/.gitattributes
index da53f40548..da53f40548 100644
--- a/sha1dc/.gitattributes
+++ b/third_party/git/sha1dc/.gitattributes
diff --git a/sha1dc/LICENSE.txt b/third_party/git/sha1dc/LICENSE.txt
index 4a3e6a1b15..4a3e6a1b15 100644
--- a/sha1dc/LICENSE.txt
+++ b/third_party/git/sha1dc/LICENSE.txt
diff --git a/sha1dc/sha1.c b/third_party/git/sha1dc/sha1.c
index 9d3cf81d4d..9d3cf81d4d 100644
--- a/sha1dc/sha1.c
+++ b/third_party/git/sha1dc/sha1.c
diff --git a/sha1dc/sha1.h b/third_party/git/sha1dc/sha1.h
index 1e4e94be54..1e4e94be54 100644
--- a/sha1dc/sha1.h
+++ b/third_party/git/sha1dc/sha1.h
diff --git a/sha1dc/ubc_check.c b/third_party/git/sha1dc/ubc_check.c
index b3beff2afb..b3beff2afb 100644
--- a/sha1dc/ubc_check.c
+++ b/third_party/git/sha1dc/ubc_check.c
diff --git a/sha1dc/ubc_check.h b/third_party/git/sha1dc/ubc_check.h
index d7e17dc734..d7e17dc734 100644
--- a/sha1dc/ubc_check.h
+++ b/third_party/git/sha1dc/ubc_check.h
diff --git a/sha1dc_git.c b/third_party/git/sha1dc_git.c
index e0cc9d988c..e0cc9d988c 100644
--- a/sha1dc_git.c
+++ b/third_party/git/sha1dc_git.c
diff --git a/sha1dc_git.h b/third_party/git/sha1dc_git.h
index 41e1c3fd3f..41e1c3fd3f 100644
--- a/sha1dc_git.h
+++ b/third_party/git/sha1dc_git.h
diff --git a/sha256/block/sha256.c b/third_party/git/sha256/block/sha256.c
index 37850b4e52..37850b4e52 100644
--- a/sha256/block/sha256.c
+++ b/third_party/git/sha256/block/sha256.c
diff --git a/sha256/block/sha256.h b/third_party/git/sha256/block/sha256.h
index 5099d6421d..5099d6421d 100644
--- a/sha256/block/sha256.h
+++ b/third_party/git/sha256/block/sha256.h
diff --git a/sha256/gcrypt.h b/third_party/git/sha256/gcrypt.h
index 09bd8bb200..09bd8bb200 100644
--- a/sha256/gcrypt.h
+++ b/third_party/git/sha256/gcrypt.h
diff --git a/shallow.c b/third_party/git/shallow.c
index 5fa2b15d37..5fa2b15d37 100644
--- a/shallow.c
+++ b/third_party/git/shallow.c
diff --git a/shell.c b/third_party/git/shell.c
index 40084a3013..40084a3013 100644
--- a/shell.c
+++ b/third_party/git/shell.c
diff --git a/shortlog.h b/third_party/git/shortlog.h
index 2fa61c4294..2fa61c4294 100644
--- a/shortlog.h
+++ b/third_party/git/shortlog.h
diff --git a/sideband.c b/third_party/git/sideband.c
index ef851113c4..ef851113c4 100644
--- a/sideband.c
+++ b/third_party/git/sideband.c
diff --git a/sideband.h b/third_party/git/sideband.h
index 227740a58e..227740a58e 100644
--- a/sideband.h
+++ b/third_party/git/sideband.h
diff --git a/sigchain.c b/third_party/git/sigchain.c
index 022677b6ab..022677b6ab 100644
--- a/sigchain.c
+++ b/third_party/git/sigchain.c
diff --git a/sigchain.h b/third_party/git/sigchain.h
index 138b20f54b..138b20f54b 100644
--- a/sigchain.h
+++ b/third_party/git/sigchain.h
diff --git a/split-index.c b/third_party/git/split-index.c
index e6154e4ea9..e6154e4ea9 100644
--- a/split-index.c
+++ b/third_party/git/split-index.c
diff --git a/split-index.h b/third_party/git/split-index.h
index 7a435ca2c9..7a435ca2c9 100644
--- a/split-index.h
+++ b/third_party/git/split-index.h
diff --git a/strbuf.c b/third_party/git/strbuf.c
index d30f916858..d30f916858 100644
--- a/strbuf.c
+++ b/third_party/git/strbuf.c
diff --git a/strbuf.h b/third_party/git/strbuf.h
index f62278a0be..f62278a0be 100644
--- a/strbuf.h
+++ b/third_party/git/strbuf.h
diff --git a/streaming.c b/third_party/git/streaming.c
index fcd6303219..fcd6303219 100644
--- a/streaming.c
+++ b/third_party/git/streaming.c
diff --git a/streaming.h b/third_party/git/streaming.h
index f465a3cd31..f465a3cd31 100644
--- a/streaming.h
+++ b/third_party/git/streaming.h
diff --git a/string-list.c b/third_party/git/string-list.c
index a917955fbd..a917955fbd 100644
--- a/string-list.c
+++ b/third_party/git/string-list.c
diff --git a/string-list.h b/third_party/git/string-list.h
index f964399949..f964399949 100644
--- a/string-list.h
+++ b/third_party/git/string-list.h
diff --git a/sub-process.c b/third_party/git/sub-process.c
index 3f4af93555..3f4af93555 100644
--- a/sub-process.c
+++ b/third_party/git/sub-process.c
diff --git a/sub-process.h b/third_party/git/sub-process.h
index 5c182fad98..5c182fad98 100644
--- a/sub-process.h
+++ b/third_party/git/sub-process.h
diff --git a/submodule-config.c b/third_party/git/submodule-config.c
index 4264ee216f..4264ee216f 100644
--- a/submodule-config.c
+++ b/third_party/git/submodule-config.c
diff --git a/submodule-config.h b/third_party/git/submodule-config.h
index 1b4e2da658..1b4e2da658 100644
--- a/submodule-config.h
+++ b/third_party/git/submodule-config.h
diff --git a/submodule.c b/third_party/git/submodule.c
index 0f199c5137..0f199c5137 100644
--- a/submodule.c
+++ b/third_party/git/submodule.c
diff --git a/submodule.h b/third_party/git/submodule.h
index 8072e6d6dd..8072e6d6dd 100644
--- a/submodule.h
+++ b/third_party/git/submodule.h
diff --git a/symlinks.c b/third_party/git/symlinks.c
index 69d458a24d..69d458a24d 100644
--- a/symlinks.c
+++ b/third_party/git/symlinks.c
diff --git a/t/.gitattributes b/third_party/git/t/.gitattributes
index df05434d32..df05434d32 100644
--- a/t/.gitattributes
+++ b/third_party/git/t/.gitattributes
diff --git a/t/.gitignore b/third_party/git/t/.gitignore
index 91cf5772fe..91cf5772fe 100644
--- a/t/.gitignore
+++ b/third_party/git/t/.gitignore
diff --git a/t/Git-SVN/00compile.t b/third_party/git/t/Git-SVN/00compile.t
index c92fee453f..c92fee453f 100755
--- a/t/Git-SVN/00compile.t
+++ b/third_party/git/t/Git-SVN/00compile.t
diff --git a/t/Git-SVN/Utils/add_path_to_url.t b/third_party/git/t/Git-SVN/Utils/add_path_to_url.t
index bfbd87845f..bfbd87845f 100755
--- a/t/Git-SVN/Utils/add_path_to_url.t
+++ b/third_party/git/t/Git-SVN/Utils/add_path_to_url.t
diff --git a/t/Git-SVN/Utils/can_compress.t b/third_party/git/t/Git-SVN/Utils/can_compress.t
index d7b49b8d54..d7b49b8d54 100755
--- a/t/Git-SVN/Utils/can_compress.t
+++ b/third_party/git/t/Git-SVN/Utils/can_compress.t
diff --git a/t/Git-SVN/Utils/canonicalize_url.t b/third_party/git/t/Git-SVN/Utils/canonicalize_url.t
index 05795ab636..05795ab636 100755
--- a/t/Git-SVN/Utils/canonicalize_url.t
+++ b/third_party/git/t/Git-SVN/Utils/canonicalize_url.t
diff --git a/t/Git-SVN/Utils/collapse_dotdot.t b/third_party/git/t/Git-SVN/Utils/collapse_dotdot.t
index 1da1cce156..1da1cce156 100755
--- a/t/Git-SVN/Utils/collapse_dotdot.t
+++ b/third_party/git/t/Git-SVN/Utils/collapse_dotdot.t
diff --git a/t/Git-SVN/Utils/fatal.t b/third_party/git/t/Git-SVN/Utils/fatal.t
index 49e1438295..49e1438295 100755
--- a/t/Git-SVN/Utils/fatal.t
+++ b/third_party/git/t/Git-SVN/Utils/fatal.t
diff --git a/t/Git-SVN/Utils/join_paths.t b/third_party/git/t/Git-SVN/Utils/join_paths.t
index d4488e7162..d4488e7162 100755
--- a/t/Git-SVN/Utils/join_paths.t
+++ b/third_party/git/t/Git-SVN/Utils/join_paths.t
diff --git a/t/Makefile b/third_party/git/t/Makefile
index c83fd18861..c83fd18861 100644
--- a/t/Makefile
+++ b/third_party/git/t/Makefile
diff --git a/t/README b/third_party/git/t/README
index 60d5b77bcc..60d5b77bcc 100644
--- a/t/README
+++ b/third_party/git/t/README
diff --git a/t/aggregate-results.sh b/third_party/git/t/aggregate-results.sh
index 7913e206ed..7913e206ed 100755
--- a/t/aggregate-results.sh
+++ b/third_party/git/t/aggregate-results.sh
diff --git a/t/annotate-tests.sh b/third_party/git/t/annotate-tests.sh
index d933af5714..d933af5714 100644
--- a/t/annotate-tests.sh
+++ b/third_party/git/t/annotate-tests.sh
diff --git a/t/chainlint.sed b/third_party/git/t/chainlint.sed
index 70df40e34b..70df40e34b 100644
--- a/t/chainlint.sed
+++ b/third_party/git/t/chainlint.sed
diff --git a/t/chainlint/arithmetic-expansion.expect b/third_party/git/t/chainlint/arithmetic-expansion.expect
index 09457d3196..09457d3196 100644
--- a/t/chainlint/arithmetic-expansion.expect
+++ b/third_party/git/t/chainlint/arithmetic-expansion.expect
diff --git a/t/chainlint/arithmetic-expansion.test b/third_party/git/t/chainlint/arithmetic-expansion.test
index 16206960d8..16206960d8 100644
--- a/t/chainlint/arithmetic-expansion.test
+++ b/third_party/git/t/chainlint/arithmetic-expansion.test
diff --git a/t/chainlint/bash-array.expect b/third_party/git/t/chainlint/bash-array.expect
index c4a830d1c1..c4a830d1c1 100644
--- a/t/chainlint/bash-array.expect
+++ b/third_party/git/t/chainlint/bash-array.expect
diff --git a/t/chainlint/bash-array.test b/third_party/git/t/chainlint/bash-array.test
index 92bbb777b8..92bbb777b8 100644
--- a/t/chainlint/bash-array.test
+++ b/third_party/git/t/chainlint/bash-array.test
diff --git a/t/chainlint/blank-line.expect b/third_party/git/t/chainlint/blank-line.expect
index 3be939ed38..3be939ed38 100644
--- a/t/chainlint/blank-line.expect
+++ b/third_party/git/t/chainlint/blank-line.expect
diff --git a/t/chainlint/blank-line.test b/third_party/git/t/chainlint/blank-line.test
index f6dd14302b..f6dd14302b 100644
--- a/t/chainlint/blank-line.test
+++ b/third_party/git/t/chainlint/blank-line.test
diff --git a/t/chainlint/block.expect b/third_party/git/t/chainlint/block.expect
index fed7e89ae8..fed7e89ae8 100644
--- a/t/chainlint/block.expect
+++ b/third_party/git/t/chainlint/block.expect
diff --git a/t/chainlint/block.test b/third_party/git/t/chainlint/block.test
index d859151af1..d859151af1 100644
--- a/t/chainlint/block.test
+++ b/third_party/git/t/chainlint/block.test
diff --git a/t/chainlint/broken-chain.expect b/third_party/git/t/chainlint/broken-chain.expect
index 55b0f42a53..55b0f42a53 100644
--- a/t/chainlint/broken-chain.expect
+++ b/third_party/git/t/chainlint/broken-chain.expect
diff --git a/t/chainlint/broken-chain.test b/third_party/git/t/chainlint/broken-chain.test
index 3cc67b65d0..3cc67b65d0 100644
--- a/t/chainlint/broken-chain.test
+++ b/third_party/git/t/chainlint/broken-chain.test
diff --git a/t/chainlint/case.expect b/third_party/git/t/chainlint/case.expect
index 41f121fbbf..41f121fbbf 100644
--- a/t/chainlint/case.expect
+++ b/third_party/git/t/chainlint/case.expect
diff --git a/t/chainlint/case.test b/third_party/git/t/chainlint/case.test
index 5ef6ff7db5..5ef6ff7db5 100644
--- a/t/chainlint/case.test
+++ b/third_party/git/t/chainlint/case.test
diff --git a/t/chainlint/close-nested-and-parent-together.expect b/third_party/git/t/chainlint/close-nested-and-parent-together.expect
index 2a910f9d66..2a910f9d66 100644
--- a/t/chainlint/close-nested-and-parent-together.expect
+++ b/third_party/git/t/chainlint/close-nested-and-parent-together.expect
diff --git a/t/chainlint/close-nested-and-parent-together.test b/third_party/git/t/chainlint/close-nested-and-parent-together.test
index 72d482f76d..72d482f76d 100644
--- a/t/chainlint/close-nested-and-parent-together.test
+++ b/third_party/git/t/chainlint/close-nested-and-parent-together.test
diff --git a/t/chainlint/close-subshell.expect b/third_party/git/t/chainlint/close-subshell.expect
index 184688718a..184688718a 100644
--- a/t/chainlint/close-subshell.expect
+++ b/third_party/git/t/chainlint/close-subshell.expect
diff --git a/t/chainlint/close-subshell.test b/third_party/git/t/chainlint/close-subshell.test
index 508ca447fd..508ca447fd 100644
--- a/t/chainlint/close-subshell.test
+++ b/third_party/git/t/chainlint/close-subshell.test
diff --git a/t/chainlint/command-substitution.expect b/third_party/git/t/chainlint/command-substitution.expect
index ad4118e537..ad4118e537 100644
--- a/t/chainlint/command-substitution.expect
+++ b/third_party/git/t/chainlint/command-substitution.expect
diff --git a/t/chainlint/command-substitution.test b/third_party/git/t/chainlint/command-substitution.test
index 3bbb002a4c..3bbb002a4c 100644
--- a/t/chainlint/command-substitution.test
+++ b/third_party/git/t/chainlint/command-substitution.test
diff --git a/t/chainlint/comment.expect b/third_party/git/t/chainlint/comment.expect
index 3be939ed38..3be939ed38 100644
--- a/t/chainlint/comment.expect
+++ b/third_party/git/t/chainlint/comment.expect
diff --git a/t/chainlint/comment.test b/third_party/git/t/chainlint/comment.test
index 113c0c466f..113c0c466f 100644
--- a/t/chainlint/comment.test
+++ b/third_party/git/t/chainlint/comment.test
diff --git a/t/chainlint/complex-if-in-cuddled-loop.expect b/third_party/git/t/chainlint/complex-if-in-cuddled-loop.expect
index 9674b88cf2..9674b88cf2 100644
--- a/t/chainlint/complex-if-in-cuddled-loop.expect
+++ b/third_party/git/t/chainlint/complex-if-in-cuddled-loop.expect
diff --git a/t/chainlint/complex-if-in-cuddled-loop.test b/third_party/git/t/chainlint/complex-if-in-cuddled-loop.test
index 571bbd85cd..571bbd85cd 100644
--- a/t/chainlint/complex-if-in-cuddled-loop.test
+++ b/third_party/git/t/chainlint/complex-if-in-cuddled-loop.test
diff --git a/t/chainlint/cuddled-if-then-else.expect b/third_party/git/t/chainlint/cuddled-if-then-else.expect
index ab2a026fbc..ab2a026fbc 100644
--- a/t/chainlint/cuddled-if-then-else.expect
+++ b/third_party/git/t/chainlint/cuddled-if-then-else.expect
diff --git a/t/chainlint/cuddled-if-then-else.test b/third_party/git/t/chainlint/cuddled-if-then-else.test
index eed774a9d6..eed774a9d6 100644
--- a/t/chainlint/cuddled-if-then-else.test
+++ b/third_party/git/t/chainlint/cuddled-if-then-else.test
diff --git a/t/chainlint/cuddled-loop.expect b/third_party/git/t/chainlint/cuddled-loop.expect
index 8c0260d7f1..8c0260d7f1 100644
--- a/t/chainlint/cuddled-loop.expect
+++ b/third_party/git/t/chainlint/cuddled-loop.expect
diff --git a/t/chainlint/cuddled-loop.test b/third_party/git/t/chainlint/cuddled-loop.test
index a841d781f0..a841d781f0 100644
--- a/t/chainlint/cuddled-loop.test
+++ b/third_party/git/t/chainlint/cuddled-loop.test
diff --git a/t/chainlint/cuddled.expect b/third_party/git/t/chainlint/cuddled.expect
index b506d46221..b506d46221 100644
--- a/t/chainlint/cuddled.expect
+++ b/third_party/git/t/chainlint/cuddled.expect
diff --git a/t/chainlint/cuddled.test b/third_party/git/t/chainlint/cuddled.test
index 0499fa4180..0499fa4180 100644
--- a/t/chainlint/cuddled.test
+++ b/third_party/git/t/chainlint/cuddled.test
diff --git a/t/chainlint/exit-loop.expect b/third_party/git/t/chainlint/exit-loop.expect
index 84d8bdebc0..84d8bdebc0 100644
--- a/t/chainlint/exit-loop.expect
+++ b/third_party/git/t/chainlint/exit-loop.expect
diff --git a/t/chainlint/exit-loop.test b/third_party/git/t/chainlint/exit-loop.test
index 2f038207e1..2f038207e1 100644
--- a/t/chainlint/exit-loop.test
+++ b/third_party/git/t/chainlint/exit-loop.test
diff --git a/t/chainlint/exit-subshell.expect b/third_party/git/t/chainlint/exit-subshell.expect
index bf78454f74..bf78454f74 100644
--- a/t/chainlint/exit-subshell.expect
+++ b/third_party/git/t/chainlint/exit-subshell.expect
diff --git a/t/chainlint/exit-subshell.test b/third_party/git/t/chainlint/exit-subshell.test
index 4e6ab69b88..4e6ab69b88 100644
--- a/t/chainlint/exit-subshell.test
+++ b/third_party/git/t/chainlint/exit-subshell.test
diff --git a/t/chainlint/for-loop.expect b/third_party/git/t/chainlint/for-loop.expect
index c33cf56ee7..c33cf56ee7 100644
--- a/t/chainlint/for-loop.expect
+++ b/third_party/git/t/chainlint/for-loop.expect
diff --git a/t/chainlint/for-loop.test b/third_party/git/t/chainlint/for-loop.test
index 7db76262bc..7db76262bc 100644
--- a/t/chainlint/for-loop.test
+++ b/third_party/git/t/chainlint/for-loop.test
diff --git a/t/chainlint/here-doc-close-subshell.expect b/third_party/git/t/chainlint/here-doc-close-subshell.expect
index f011e335e5..f011e335e5 100644
--- a/t/chainlint/here-doc-close-subshell.expect
+++ b/third_party/git/t/chainlint/here-doc-close-subshell.expect
diff --git a/t/chainlint/here-doc-close-subshell.test b/third_party/git/t/chainlint/here-doc-close-subshell.test
index b857ff5467..b857ff5467 100644
--- a/t/chainlint/here-doc-close-subshell.test
+++ b/third_party/git/t/chainlint/here-doc-close-subshell.test
diff --git a/t/chainlint/here-doc-multi-line-command-subst.expect b/third_party/git/t/chainlint/here-doc-multi-line-command-subst.expect
index e5fb752d2f..e5fb752d2f 100644
--- a/t/chainlint/here-doc-multi-line-command-subst.expect
+++ b/third_party/git/t/chainlint/here-doc-multi-line-command-subst.expect
diff --git a/t/chainlint/here-doc-multi-line-command-subst.test b/third_party/git/t/chainlint/here-doc-multi-line-command-subst.test
index 899bc5de8b..899bc5de8b 100644
--- a/t/chainlint/here-doc-multi-line-command-subst.test
+++ b/third_party/git/t/chainlint/here-doc-multi-line-command-subst.test
diff --git a/t/chainlint/here-doc-multi-line-string.expect b/third_party/git/t/chainlint/here-doc-multi-line-string.expect
index 32038a070c..32038a070c 100644
--- a/t/chainlint/here-doc-multi-line-string.expect
+++ b/third_party/git/t/chainlint/here-doc-multi-line-string.expect
diff --git a/t/chainlint/here-doc-multi-line-string.test b/third_party/git/t/chainlint/here-doc-multi-line-string.test
index a53edbcc8d..a53edbcc8d 100644
--- a/t/chainlint/here-doc-multi-line-string.test
+++ b/third_party/git/t/chainlint/here-doc-multi-line-string.test
diff --git a/t/chainlint/here-doc.expect b/third_party/git/t/chainlint/here-doc.expect
index 534b065e38..534b065e38 100644
--- a/t/chainlint/here-doc.expect
+++ b/third_party/git/t/chainlint/here-doc.expect
diff --git a/t/chainlint/here-doc.test b/third_party/git/t/chainlint/here-doc.test
index ad4ce8afd9..ad4ce8afd9 100644
--- a/t/chainlint/here-doc.test
+++ b/third_party/git/t/chainlint/here-doc.test
diff --git a/t/chainlint/if-in-loop.expect b/third_party/git/t/chainlint/if-in-loop.expect
index 03d3ceb22d..03d3ceb22d 100644
--- a/t/chainlint/if-in-loop.expect
+++ b/third_party/git/t/chainlint/if-in-loop.expect
diff --git a/t/chainlint/if-in-loop.test b/third_party/git/t/chainlint/if-in-loop.test
index daf22da164..daf22da164 100644
--- a/t/chainlint/if-in-loop.test
+++ b/third_party/git/t/chainlint/if-in-loop.test
diff --git a/t/chainlint/if-then-else.expect b/third_party/git/t/chainlint/if-then-else.expect
index 5953c7bfbc..5953c7bfbc 100644
--- a/t/chainlint/if-then-else.expect
+++ b/third_party/git/t/chainlint/if-then-else.expect
diff --git a/t/chainlint/if-then-else.test b/third_party/git/t/chainlint/if-then-else.test
index 9bd8e9a4c6..9bd8e9a4c6 100644
--- a/t/chainlint/if-then-else.test
+++ b/third_party/git/t/chainlint/if-then-else.test
diff --git a/t/chainlint/incomplete-line.expect b/third_party/git/t/chainlint/incomplete-line.expect
index 2f3ebabdc2..2f3ebabdc2 100644
--- a/t/chainlint/incomplete-line.expect
+++ b/third_party/git/t/chainlint/incomplete-line.expect
diff --git a/t/chainlint/incomplete-line.test b/third_party/git/t/chainlint/incomplete-line.test
index d856658083..d856658083 100644
--- a/t/chainlint/incomplete-line.test
+++ b/third_party/git/t/chainlint/incomplete-line.test
diff --git a/t/chainlint/inline-comment.expect b/third_party/git/t/chainlint/inline-comment.expect
index fc9f250ac4..fc9f250ac4 100644
--- a/t/chainlint/inline-comment.expect
+++ b/third_party/git/t/chainlint/inline-comment.expect
diff --git a/t/chainlint/inline-comment.test b/third_party/git/t/chainlint/inline-comment.test
index 8f26856e77..8f26856e77 100644
--- a/t/chainlint/inline-comment.test
+++ b/third_party/git/t/chainlint/inline-comment.test
diff --git a/t/chainlint/loop-in-if.expect b/third_party/git/t/chainlint/loop-in-if.expect
index 088e622c31..088e622c31 100644
--- a/t/chainlint/loop-in-if.expect
+++ b/third_party/git/t/chainlint/loop-in-if.expect
diff --git a/t/chainlint/loop-in-if.test b/third_party/git/t/chainlint/loop-in-if.test
index 93e8ba8e4d..93e8ba8e4d 100644
--- a/t/chainlint/loop-in-if.test
+++ b/third_party/git/t/chainlint/loop-in-if.test
diff --git a/t/chainlint/multi-line-nested-command-substitution.expect b/third_party/git/t/chainlint/multi-line-nested-command-substitution.expect
index 59b6c8b850..59b6c8b850 100644
--- a/t/chainlint/multi-line-nested-command-substitution.expect
+++ b/third_party/git/t/chainlint/multi-line-nested-command-substitution.expect
diff --git a/t/chainlint/multi-line-nested-command-substitution.test b/third_party/git/t/chainlint/multi-line-nested-command-substitution.test
index 300058341b..300058341b 100644
--- a/t/chainlint/multi-line-nested-command-substitution.test
+++ b/third_party/git/t/chainlint/multi-line-nested-command-substitution.test
diff --git a/t/chainlint/multi-line-string.expect b/third_party/git/t/chainlint/multi-line-string.expect
index 170cb59993..170cb59993 100644
--- a/t/chainlint/multi-line-string.expect
+++ b/third_party/git/t/chainlint/multi-line-string.expect
diff --git a/t/chainlint/multi-line-string.test b/third_party/git/t/chainlint/multi-line-string.test
index 287ab89705..287ab89705 100644
--- a/t/chainlint/multi-line-string.test
+++ b/third_party/git/t/chainlint/multi-line-string.test
diff --git a/t/chainlint/negated-one-liner.expect b/third_party/git/t/chainlint/negated-one-liner.expect
index cf18429d03..cf18429d03 100644
--- a/t/chainlint/negated-one-liner.expect
+++ b/third_party/git/t/chainlint/negated-one-liner.expect
diff --git a/t/chainlint/negated-one-liner.test b/third_party/git/t/chainlint/negated-one-liner.test
index c9598e9153..c9598e9153 100644
--- a/t/chainlint/negated-one-liner.test
+++ b/third_party/git/t/chainlint/negated-one-liner.test
diff --git a/t/chainlint/nested-cuddled-subshell.expect b/third_party/git/t/chainlint/nested-cuddled-subshell.expect
index c2a59ffc33..c2a59ffc33 100644
--- a/t/chainlint/nested-cuddled-subshell.expect
+++ b/third_party/git/t/chainlint/nested-cuddled-subshell.expect
diff --git a/t/chainlint/nested-cuddled-subshell.test b/third_party/git/t/chainlint/nested-cuddled-subshell.test
index 8fd656c7b5..8fd656c7b5 100644
--- a/t/chainlint/nested-cuddled-subshell.test
+++ b/third_party/git/t/chainlint/nested-cuddled-subshell.test
diff --git a/t/chainlint/nested-here-doc.expect b/third_party/git/t/chainlint/nested-here-doc.expect
index 0c9ef1cfc6..0c9ef1cfc6 100644
--- a/t/chainlint/nested-here-doc.expect
+++ b/third_party/git/t/chainlint/nested-here-doc.expect
diff --git a/t/chainlint/nested-here-doc.test b/third_party/git/t/chainlint/nested-here-doc.test
index f35404bf0f..f35404bf0f 100644
--- a/t/chainlint/nested-here-doc.test
+++ b/third_party/git/t/chainlint/nested-here-doc.test
diff --git a/t/chainlint/nested-subshell-comment.expect b/third_party/git/t/chainlint/nested-subshell-comment.expect
index 15b68d4373..15b68d4373 100644
--- a/t/chainlint/nested-subshell-comment.expect
+++ b/third_party/git/t/chainlint/nested-subshell-comment.expect
diff --git a/t/chainlint/nested-subshell-comment.test b/third_party/git/t/chainlint/nested-subshell-comment.test
index 0ff136ab3c..0ff136ab3c 100644
--- a/t/chainlint/nested-subshell-comment.test
+++ b/third_party/git/t/chainlint/nested-subshell-comment.test
diff --git a/t/chainlint/nested-subshell.expect b/third_party/git/t/chainlint/nested-subshell.expect
index c8165ad19e..c8165ad19e 100644
--- a/t/chainlint/nested-subshell.expect
+++ b/third_party/git/t/chainlint/nested-subshell.expect
diff --git a/t/chainlint/nested-subshell.test b/third_party/git/t/chainlint/nested-subshell.test
index 998b05a47d..998b05a47d 100644
--- a/t/chainlint/nested-subshell.test
+++ b/third_party/git/t/chainlint/nested-subshell.test
diff --git a/t/chainlint/one-liner.expect b/third_party/git/t/chainlint/one-liner.expect
index 237f227349..237f227349 100644
--- a/t/chainlint/one-liner.expect
+++ b/third_party/git/t/chainlint/one-liner.expect
diff --git a/t/chainlint/one-liner.test b/third_party/git/t/chainlint/one-liner.test
index ec9acb9825..ec9acb9825 100644
--- a/t/chainlint/one-liner.test
+++ b/third_party/git/t/chainlint/one-liner.test
diff --git a/t/chainlint/p4-filespec.expect b/third_party/git/t/chainlint/p4-filespec.expect
index 98b3d881fd..98b3d881fd 100644
--- a/t/chainlint/p4-filespec.expect
+++ b/third_party/git/t/chainlint/p4-filespec.expect
diff --git a/t/chainlint/p4-filespec.test b/third_party/git/t/chainlint/p4-filespec.test
index 4fd2d6e2b8..4fd2d6e2b8 100644
--- a/t/chainlint/p4-filespec.test
+++ b/third_party/git/t/chainlint/p4-filespec.test
diff --git a/t/chainlint/pipe.expect b/third_party/git/t/chainlint/pipe.expect
index 211b901dbc..211b901dbc 100644
--- a/t/chainlint/pipe.expect
+++ b/third_party/git/t/chainlint/pipe.expect
diff --git a/t/chainlint/pipe.test b/third_party/git/t/chainlint/pipe.test
index e6af4de916..e6af4de916 100644
--- a/t/chainlint/pipe.test
+++ b/third_party/git/t/chainlint/pipe.test
diff --git a/t/chainlint/semicolon.expect b/third_party/git/t/chainlint/semicolon.expect
index 1d79384606..1d79384606 100644
--- a/t/chainlint/semicolon.expect
+++ b/third_party/git/t/chainlint/semicolon.expect
diff --git a/t/chainlint/semicolon.test b/third_party/git/t/chainlint/semicolon.test
index d82c8ebbc0..d82c8ebbc0 100644
--- a/t/chainlint/semicolon.test
+++ b/third_party/git/t/chainlint/semicolon.test
diff --git a/t/chainlint/subshell-here-doc.expect b/third_party/git/t/chainlint/subshell-here-doc.expect
index 74723e7340..74723e7340 100644
--- a/t/chainlint/subshell-here-doc.expect
+++ b/third_party/git/t/chainlint/subshell-here-doc.expect
diff --git a/t/chainlint/subshell-here-doc.test b/third_party/git/t/chainlint/subshell-here-doc.test
index f6b3ba4214..f6b3ba4214 100644
--- a/t/chainlint/subshell-here-doc.test
+++ b/third_party/git/t/chainlint/subshell-here-doc.test
diff --git a/t/chainlint/subshell-one-liner.expect b/third_party/git/t/chainlint/subshell-one-liner.expect
index 51162821d7..51162821d7 100644
--- a/t/chainlint/subshell-one-liner.expect
+++ b/third_party/git/t/chainlint/subshell-one-liner.expect
diff --git a/t/chainlint/subshell-one-liner.test b/third_party/git/t/chainlint/subshell-one-liner.test
index 37fa643c20..37fa643c20 100644
--- a/t/chainlint/subshell-one-liner.test
+++ b/third_party/git/t/chainlint/subshell-one-liner.test
diff --git a/t/chainlint/t7900-subtree.expect b/third_party/git/t/chainlint/t7900-subtree.expect
index c9913429e6..c9913429e6 100644
--- a/t/chainlint/t7900-subtree.expect
+++ b/third_party/git/t/chainlint/t7900-subtree.expect
diff --git a/t/chainlint/t7900-subtree.test b/third_party/git/t/chainlint/t7900-subtree.test
index 277d8358df..277d8358df 100644
--- a/t/chainlint/t7900-subtree.test
+++ b/third_party/git/t/chainlint/t7900-subtree.test
diff --git a/t/chainlint/while-loop.expect b/third_party/git/t/chainlint/while-loop.expect
index 13cff2c0a5..13cff2c0a5 100644
--- a/t/chainlint/while-loop.expect
+++ b/third_party/git/t/chainlint/while-loop.expect
diff --git a/t/chainlint/while-loop.test b/third_party/git/t/chainlint/while-loop.test
index f1df085bf0..f1df085bf0 100644
--- a/t/chainlint/while-loop.test
+++ b/third_party/git/t/chainlint/while-loop.test
diff --git a/t/check-non-portable-shell.pl b/third_party/git/t/check-non-portable-shell.pl
index 38bfeebd88..38bfeebd88 100755
--- a/t/check-non-portable-shell.pl
+++ b/third_party/git/t/check-non-portable-shell.pl
diff --git a/t/diff-lib.sh b/third_party/git/t/diff-lib.sh
index 2de880f7a5..2de880f7a5 100644
--- a/t/diff-lib.sh
+++ b/third_party/git/t/diff-lib.sh
diff --git a/t/diff-lib/COPYING b/third_party/git/t/diff-lib/COPYING
index 6ff87c4664..6ff87c4664 100644
--- a/t/diff-lib/COPYING
+++ b/third_party/git/t/diff-lib/COPYING
diff --git a/t/diff-lib/README b/third_party/git/t/diff-lib/README
index 548142c327..548142c327 100644
--- a/t/diff-lib/README
+++ b/third_party/git/t/diff-lib/README
diff --git a/t/gitweb-lib.sh b/third_party/git/t/gitweb-lib.sh
index 006d2a8152..006d2a8152 100644
--- a/t/gitweb-lib.sh
+++ b/third_party/git/t/gitweb-lib.sh
diff --git a/t/helper/.gitignore b/third_party/git/t/helper/.gitignore
index 2bad28af92..2bad28af92 100644
--- a/t/helper/.gitignore
+++ b/third_party/git/t/helper/.gitignore
diff --git a/t/helper/test-chmtime.c b/third_party/git/t/helper/test-chmtime.c
index aa22af48c2..aa22af48c2 100644
--- a/t/helper/test-chmtime.c
+++ b/third_party/git/t/helper/test-chmtime.c
diff --git a/t/helper/test-config.c b/third_party/git/t/helper/test-config.c
index 214003d5b2..214003d5b2 100644
--- a/t/helper/test-config.c
+++ b/third_party/git/t/helper/test-config.c
diff --git a/t/helper/test-ctype.c b/third_party/git/t/helper/test-ctype.c
index 92c4c2313e..92c4c2313e 100644
--- a/t/helper/test-ctype.c
+++ b/third_party/git/t/helper/test-ctype.c
diff --git a/t/helper/test-date.c b/third_party/git/t/helper/test-date.c
index 585347ea48..585347ea48 100644
--- a/t/helper/test-date.c
+++ b/third_party/git/t/helper/test-date.c
diff --git a/t/helper/test-delta.c b/third_party/git/t/helper/test-delta.c
index e749a49c88..e749a49c88 100644
--- a/t/helper/test-delta.c
+++ b/third_party/git/t/helper/test-delta.c
diff --git a/t/helper/test-dir-iterator.c b/third_party/git/t/helper/test-dir-iterator.c
index 659b6bfa81..659b6bfa81 100644
--- a/t/helper/test-dir-iterator.c
+++ b/third_party/git/t/helper/test-dir-iterator.c
diff --git a/t/helper/test-drop-caches.c b/third_party/git/t/helper/test-drop-caches.c
index f65e301f9d..f65e301f9d 100644
--- a/t/helper/test-drop-caches.c
+++ b/third_party/git/t/helper/test-drop-caches.c
diff --git a/t/helper/test-dump-cache-tree.c b/third_party/git/t/helper/test-dump-cache-tree.c
index 6a3f88f5f5..6a3f88f5f5 100644
--- a/t/helper/test-dump-cache-tree.c
+++ b/third_party/git/t/helper/test-dump-cache-tree.c
diff --git a/t/helper/test-dump-fsmonitor.c b/third_party/git/t/helper/test-dump-fsmonitor.c
index 2786f47088..2786f47088 100644
--- a/t/helper/test-dump-fsmonitor.c
+++ b/third_party/git/t/helper/test-dump-fsmonitor.c
diff --git a/t/helper/test-dump-split-index.c b/third_party/git/t/helper/test-dump-split-index.c
index 63c689d6ee..63c689d6ee 100644
--- a/t/helper/test-dump-split-index.c
+++ b/third_party/git/t/helper/test-dump-split-index.c
diff --git a/t/helper/test-dump-untracked-cache.c b/third_party/git/t/helper/test-dump-untracked-cache.c
index cf0f2c7228..cf0f2c7228 100644
--- a/t/helper/test-dump-untracked-cache.c
+++ b/third_party/git/t/helper/test-dump-untracked-cache.c
diff --git a/t/helper/test-example-decorate.c b/third_party/git/t/helper/test-example-decorate.c
index c8a1cde7d2..c8a1cde7d2 100644
--- a/t/helper/test-example-decorate.c
+++ b/third_party/git/t/helper/test-example-decorate.c
diff --git a/t/helper/test-fake-ssh.c b/third_party/git/t/helper/test-fake-ssh.c
index 12beee99ad..12beee99ad 100644
--- a/t/helper/test-fake-ssh.c
+++ b/third_party/git/t/helper/test-fake-ssh.c
diff --git a/t/helper/test-genrandom.c b/third_party/git/t/helper/test-genrandom.c
index 99b8dc1e2d..99b8dc1e2d 100644
--- a/t/helper/test-genrandom.c
+++ b/third_party/git/t/helper/test-genrandom.c
diff --git a/t/helper/test-genzeros.c b/third_party/git/t/helper/test-genzeros.c
index 9532f5bac9..9532f5bac9 100644
--- a/t/helper/test-genzeros.c
+++ b/third_party/git/t/helper/test-genzeros.c
diff --git a/t/helper/test-hash-speed.c b/third_party/git/t/helper/test-hash-speed.c
index 432233c7f0..432233c7f0 100644
--- a/t/helper/test-hash-speed.c
+++ b/third_party/git/t/helper/test-hash-speed.c
diff --git a/t/helper/test-hash.c b/third_party/git/t/helper/test-hash.c
index 0a31de66f3..0a31de66f3 100644
--- a/t/helper/test-hash.c
+++ b/third_party/git/t/helper/test-hash.c
diff --git a/t/helper/test-hashmap.c b/third_party/git/t/helper/test-hashmap.c
index aaf17b0ddf..aaf17b0ddf 100644
--- a/t/helper/test-hashmap.c
+++ b/third_party/git/t/helper/test-hashmap.c
diff --git a/t/helper/test-index-version.c b/third_party/git/t/helper/test-index-version.c
index fcd10968cc..fcd10968cc 100644
--- a/t/helper/test-index-version.c
+++ b/third_party/git/t/helper/test-index-version.c
diff --git a/t/helper/test-json-writer.c b/third_party/git/t/helper/test-json-writer.c
index 37c452535f..37c452535f 100644
--- a/t/helper/test-json-writer.c
+++ b/third_party/git/t/helper/test-json-writer.c
diff --git a/t/helper/test-lazy-init-name-hash.c b/third_party/git/t/helper/test-lazy-init-name-hash.c
index b99a37080d..b99a37080d 100644
--- a/t/helper/test-lazy-init-name-hash.c
+++ b/third_party/git/t/helper/test-lazy-init-name-hash.c
diff --git a/t/helper/test-line-buffer.c b/third_party/git/t/helper/test-line-buffer.c
index 078dd7e29d..078dd7e29d 100644
--- a/t/helper/test-line-buffer.c
+++ b/third_party/git/t/helper/test-line-buffer.c
diff --git a/t/helper/test-match-trees.c b/third_party/git/t/helper/test-match-trees.c
index b9fd427571..b9fd427571 100644
--- a/t/helper/test-match-trees.c
+++ b/third_party/git/t/helper/test-match-trees.c
diff --git a/t/helper/test-mergesort.c b/third_party/git/t/helper/test-mergesort.c
index c5cffaa4b7..c5cffaa4b7 100644
--- a/t/helper/test-mergesort.c
+++ b/third_party/git/t/helper/test-mergesort.c
diff --git a/t/helper/test-mktemp.c b/third_party/git/t/helper/test-mktemp.c
index 2290688940..2290688940 100644
--- a/t/helper/test-mktemp.c
+++ b/third_party/git/t/helper/test-mktemp.c
diff --git a/t/helper/test-oidmap.c b/third_party/git/t/helper/test-oidmap.c
index 0acf99931e..0acf99931e 100644
--- a/t/helper/test-oidmap.c
+++ b/third_party/git/t/helper/test-oidmap.c
diff --git a/t/helper/test-online-cpus.c b/third_party/git/t/helper/test-online-cpus.c
index 8cb0d53840..8cb0d53840 100644
--- a/t/helper/test-online-cpus.c
+++ b/third_party/git/t/helper/test-online-cpus.c
diff --git a/t/helper/test-parse-options.c b/third_party/git/t/helper/test-parse-options.c
index af82db06ac..af82db06ac 100644
--- a/t/helper/test-parse-options.c
+++ b/third_party/git/t/helper/test-parse-options.c
diff --git a/t/helper/test-path-utils.c b/third_party/git/t/helper/test-path-utils.c
index 5d543ad21f..5d543ad21f 100644
--- a/t/helper/test-path-utils.c
+++ b/third_party/git/t/helper/test-path-utils.c
diff --git a/t/helper/test-pkt-line.c b/third_party/git/t/helper/test-pkt-line.c
index 282d536384..282d536384 100644
--- a/t/helper/test-pkt-line.c
+++ b/third_party/git/t/helper/test-pkt-line.c
diff --git a/t/helper/test-prio-queue.c b/third_party/git/t/helper/test-prio-queue.c
index f4028442e3..f4028442e3 100644
--- a/t/helper/test-prio-queue.c
+++ b/third_party/git/t/helper/test-prio-queue.c
diff --git a/t/helper/test-reach.c b/third_party/git/t/helper/test-reach.c
index a0272178b7..a0272178b7 100644
--- a/t/helper/test-reach.c
+++ b/third_party/git/t/helper/test-reach.c
diff --git a/t/helper/test-read-cache.c b/third_party/git/t/helper/test-read-cache.c
index 7e79b555de..7e79b555de 100644
--- a/t/helper/test-read-cache.c
+++ b/third_party/git/t/helper/test-read-cache.c
diff --git a/t/helper/test-read-midx.c b/third_party/git/t/helper/test-read-midx.c
index 831b586d02..831b586d02 100644
--- a/t/helper/test-read-midx.c
+++ b/third_party/git/t/helper/test-read-midx.c
diff --git a/t/helper/test-ref-store.c b/third_party/git/t/helper/test-ref-store.c
index 799fc00aa1..799fc00aa1 100644
--- a/t/helper/test-ref-store.c
+++ b/third_party/git/t/helper/test-ref-store.c
diff --git a/t/helper/test-regex.c b/third_party/git/t/helper/test-regex.c
index 10284cc56f..10284cc56f 100644
--- a/t/helper/test-regex.c
+++ b/third_party/git/t/helper/test-regex.c
diff --git a/t/helper/test-repository.c b/third_party/git/t/helper/test-repository.c
index f7f8618445..f7f8618445 100644
--- a/t/helper/test-repository.c
+++ b/third_party/git/t/helper/test-repository.c
diff --git a/t/helper/test-revision-walking.c b/third_party/git/t/helper/test-revision-walking.c
index 625b2dbf82..625b2dbf82 100644
--- a/t/helper/test-revision-walking.c
+++ b/third_party/git/t/helper/test-revision-walking.c
diff --git a/t/helper/test-run-command.c b/third_party/git/t/helper/test-run-command.c
index 2cc93bb69c..2cc93bb69c 100644
--- a/t/helper/test-run-command.c
+++ b/third_party/git/t/helper/test-run-command.c
diff --git a/t/helper/test-scrap-cache-tree.c b/third_party/git/t/helper/test-scrap-cache-tree.c
index 393f1604ff..393f1604ff 100644
--- a/t/helper/test-scrap-cache-tree.c
+++ b/third_party/git/t/helper/test-scrap-cache-tree.c
diff --git a/t/helper/test-serve-v2.c b/third_party/git/t/helper/test-serve-v2.c
index aee35e5aef..aee35e5aef 100644
--- a/t/helper/test-serve-v2.c
+++ b/third_party/git/t/helper/test-serve-v2.c
diff --git a/t/helper/test-sha1-array.c b/third_party/git/t/helper/test-sha1-array.c
index ad5e69f9d3..ad5e69f9d3 100644
--- a/t/helper/test-sha1-array.c
+++ b/third_party/git/t/helper/test-sha1-array.c
diff --git a/t/helper/test-sha1.c b/third_party/git/t/helper/test-sha1.c
index d860c387c3..d860c387c3 100644
--- a/t/helper/test-sha1.c
+++ b/third_party/git/t/helper/test-sha1.c
diff --git a/t/helper/test-sha1.sh b/third_party/git/t/helper/test-sha1.sh
index 84594885c7..84594885c7 100755
--- a/t/helper/test-sha1.sh
+++ b/third_party/git/t/helper/test-sha1.sh
diff --git a/t/helper/test-sha256.c b/third_party/git/t/helper/test-sha256.c
index 0ac6a99d5f..0ac6a99d5f 100644
--- a/t/helper/test-sha256.c
+++ b/third_party/git/t/helper/test-sha256.c
diff --git a/t/helper/test-sigchain.c b/third_party/git/t/helper/test-sigchain.c
index d013bccdda..d013bccdda 100644
--- a/t/helper/test-sigchain.c
+++ b/third_party/git/t/helper/test-sigchain.c
diff --git a/t/helper/test-strcmp-offset.c b/third_party/git/t/helper/test-strcmp-offset.c
index 44e4a6d143..44e4a6d143 100644
--- a/t/helper/test-strcmp-offset.c
+++ b/third_party/git/t/helper/test-strcmp-offset.c
diff --git a/t/helper/test-string-list.c b/third_party/git/t/helper/test-string-list.c
index 2123dda85b..2123dda85b 100644
--- a/t/helper/test-string-list.c
+++ b/third_party/git/t/helper/test-string-list.c
diff --git a/t/helper/test-submodule-config.c b/third_party/git/t/helper/test-submodule-config.c
index e2692746df..e2692746df 100644
--- a/t/helper/test-submodule-config.c
+++ b/third_party/git/t/helper/test-submodule-config.c
diff --git a/t/helper/test-submodule-nested-repo-config.c b/third_party/git/t/helper/test-submodule-nested-repo-config.c
index bc97929bbc..bc97929bbc 100644
--- a/t/helper/test-submodule-nested-repo-config.c
+++ b/third_party/git/t/helper/test-submodule-nested-repo-config.c
diff --git a/t/helper/test-subprocess.c b/third_party/git/t/helper/test-subprocess.c
index 92b69de635..92b69de635 100644
--- a/t/helper/test-subprocess.c
+++ b/third_party/git/t/helper/test-subprocess.c
diff --git a/t/helper/test-svn-fe.c b/third_party/git/t/helper/test-svn-fe.c
index 7667c0803f..7667c0803f 100644
--- a/t/helper/test-svn-fe.c
+++ b/third_party/git/t/helper/test-svn-fe.c
diff --git a/t/helper/test-tool.c b/third_party/git/t/helper/test-tool.c
index ce7e89028c..ce7e89028c 100644
--- a/t/helper/test-tool.c
+++ b/third_party/git/t/helper/test-tool.c
diff --git a/t/helper/test-tool.h b/third_party/git/t/helper/test-tool.h
index f805bb39ae..f805bb39ae 100644
--- a/t/helper/test-tool.h
+++ b/third_party/git/t/helper/test-tool.h
diff --git a/t/helper/test-trace2.c b/third_party/git/t/helper/test-trace2.c
index 197819c872..197819c872 100644
--- a/t/helper/test-trace2.c
+++ b/third_party/git/t/helper/test-trace2.c
diff --git a/t/helper/test-urlmatch-normalization.c b/third_party/git/t/helper/test-urlmatch-normalization.c
index 8f4d67e646..8f4d67e646 100644
--- a/t/helper/test-urlmatch-normalization.c
+++ b/third_party/git/t/helper/test-urlmatch-normalization.c
diff --git a/t/helper/test-wildmatch.c b/third_party/git/t/helper/test-wildmatch.c
index 2c103d1824..2c103d1824 100644
--- a/t/helper/test-wildmatch.c
+++ b/third_party/git/t/helper/test-wildmatch.c
diff --git a/t/helper/test-windows-named-pipe.c b/third_party/git/t/helper/test-windows-named-pipe.c
index b4b752b01a..b4b752b01a 100644
--- a/t/helper/test-windows-named-pipe.c
+++ b/third_party/git/t/helper/test-windows-named-pipe.c
diff --git a/t/helper/test-write-cache.c b/third_party/git/t/helper/test-write-cache.c
index 8837717d36..8837717d36 100644
--- a/t/helper/test-write-cache.c
+++ b/third_party/git/t/helper/test-write-cache.c
diff --git a/t/helper/test-xml-encode.c b/third_party/git/t/helper/test-xml-encode.c
index a648bbd961..a648bbd961 100644
--- a/t/helper/test-xml-encode.c
+++ b/third_party/git/t/helper/test-xml-encode.c
diff --git a/t/interop/.gitignore b/third_party/git/t/interop/.gitignore
index 49c78d3dba..49c78d3dba 100644
--- a/t/interop/.gitignore
+++ b/third_party/git/t/interop/.gitignore
diff --git a/t/interop/Makefile b/third_party/git/t/interop/Makefile
index 31a4bbc716..31a4bbc716 100644
--- a/t/interop/Makefile
+++ b/third_party/git/t/interop/Makefile
diff --git a/t/interop/README b/third_party/git/t/interop/README
index 72d42bd856..72d42bd856 100644
--- a/t/interop/README
+++ b/third_party/git/t/interop/README
diff --git a/t/interop/i0000-basic.sh b/third_party/git/t/interop/i0000-basic.sh
index 903e9193f8..903e9193f8 100755
--- a/t/interop/i0000-basic.sh
+++ b/third_party/git/t/interop/i0000-basic.sh
diff --git a/t/interop/i5500-git-daemon.sh b/third_party/git/t/interop/i5500-git-daemon.sh
index 4d22e42f84..4d22e42f84 100755
--- a/t/interop/i5500-git-daemon.sh
+++ b/third_party/git/t/interop/i5500-git-daemon.sh
diff --git a/t/interop/i5700-protocol-transition.sh b/third_party/git/t/interop/i5700-protocol-transition.sh
index 97e8e580ef..97e8e580ef 100755
--- a/t/interop/i5700-protocol-transition.sh
+++ b/third_party/git/t/interop/i5700-protocol-transition.sh
diff --git a/t/interop/interop-lib.sh b/third_party/git/t/interop/interop-lib.sh
index 3e0a2911d4..3e0a2911d4 100644
--- a/t/interop/interop-lib.sh
+++ b/third_party/git/t/interop/interop-lib.sh
diff --git a/t/lib-bash.sh b/third_party/git/t/lib-bash.sh
index 2be955fafb..2be955fafb 100644
--- a/t/lib-bash.sh
+++ b/third_party/git/t/lib-bash.sh
diff --git a/t/lib-credential.sh b/third_party/git/t/lib-credential.sh
index 937b831ea6..937b831ea6 100755
--- a/t/lib-credential.sh
+++ b/third_party/git/t/lib-credential.sh
diff --git a/t/lib-cvs.sh b/third_party/git/t/lib-cvs.sh
index 9b2bcfb1b0..9b2bcfb1b0 100644
--- a/t/lib-cvs.sh
+++ b/third_party/git/t/lib-cvs.sh
diff --git a/t/lib-diff-alternative.sh b/third_party/git/t/lib-diff-alternative.sh
index 8d1e408bb5..8d1e408bb5 100644
--- a/t/lib-diff-alternative.sh
+++ b/third_party/git/t/lib-diff-alternative.sh
diff --git a/t/lib-gettext.sh b/third_party/git/t/lib-gettext.sh
index 2139b427ca..2139b427ca 100644
--- a/t/lib-gettext.sh
+++ b/third_party/git/t/lib-gettext.sh
diff --git a/t/lib-git-daemon.sh b/third_party/git/t/lib-git-daemon.sh
index fb8f887080..fb8f887080 100644
--- a/t/lib-git-daemon.sh
+++ b/third_party/git/t/lib-git-daemon.sh
diff --git a/t/lib-git-p4.sh b/third_party/git/t/lib-git-p4.sh
index 547b9f88e1..547b9f88e1 100644
--- a/t/lib-git-p4.sh
+++ b/third_party/git/t/lib-git-p4.sh
diff --git a/t/lib-git-svn.sh b/third_party/git/t/lib-git-svn.sh
index 5d4ae629e1..5d4ae629e1 100644
--- a/t/lib-git-svn.sh
+++ b/third_party/git/t/lib-git-svn.sh
diff --git a/t/lib-gpg.sh b/third_party/git/t/lib-gpg.sh
index 8d28652b72..8d28652b72 100755
--- a/t/lib-gpg.sh
+++ b/third_party/git/t/lib-gpg.sh
diff --git a/t/lib-gpg/gpgsm-gen-key.in b/third_party/git/t/lib-gpg/gpgsm-gen-key.in
index a7fd87c069..a7fd87c069 100644
--- a/t/lib-gpg/gpgsm-gen-key.in
+++ b/third_party/git/t/lib-gpg/gpgsm-gen-key.in
diff --git a/t/lib-gpg/gpgsm_cert.p12 b/third_party/git/t/lib-gpg/gpgsm_cert.p12
index 94ffad0d31..94ffad0d31 100644
--- a/t/lib-gpg/gpgsm_cert.p12
+++ b/third_party/git/t/lib-gpg/gpgsm_cert.p12
Binary files differdiff --git a/t/lib-gpg/keyring.gpg b/third_party/git/t/lib-gpg/keyring.gpg
index 918dfce332..918dfce332 100644
--- a/t/lib-gpg/keyring.gpg
+++ b/third_party/git/t/lib-gpg/keyring.gpg
diff --git a/t/lib-gpg/ownertrust b/third_party/git/t/lib-gpg/ownertrust
index b3e3c4f1cd..b3e3c4f1cd 100644
--- a/t/lib-gpg/ownertrust
+++ b/third_party/git/t/lib-gpg/ownertrust
diff --git a/t/lib-httpd.sh b/third_party/git/t/lib-httpd.sh
index 0d985758c6..0d985758c6 100644
--- a/t/lib-httpd.sh
+++ b/third_party/git/t/lib-httpd.sh
diff --git a/t/lib-httpd/apache.conf b/third_party/git/t/lib-httpd/apache.conf
index 5c1c86c193..5c1c86c193 100644
--- a/t/lib-httpd/apache.conf
+++ b/third_party/git/t/lib-httpd/apache.conf
diff --git a/t/lib-httpd/apply-one-time-sed.sh b/third_party/git/t/lib-httpd/apply-one-time-sed.sh
index fcef728925..fcef728925 100644
--- a/t/lib-httpd/apply-one-time-sed.sh
+++ b/third_party/git/t/lib-httpd/apply-one-time-sed.sh
diff --git a/t/lib-httpd/broken-smart-http.sh b/third_party/git/t/lib-httpd/broken-smart-http.sh
index 82cc610b0a..82cc610b0a 100644
--- a/t/lib-httpd/broken-smart-http.sh
+++ b/third_party/git/t/lib-httpd/broken-smart-http.sh
diff --git a/t/lib-httpd/error-smart-http.sh b/third_party/git/t/lib-httpd/error-smart-http.sh
index e65d447fc4..e65d447fc4 100644
--- a/t/lib-httpd/error-smart-http.sh
+++ b/third_party/git/t/lib-httpd/error-smart-http.sh
diff --git a/t/lib-httpd/error.sh b/third_party/git/t/lib-httpd/error.sh
index a77b8e5469..a77b8e5469 100755
--- a/t/lib-httpd/error.sh
+++ b/third_party/git/t/lib-httpd/error.sh
diff --git a/t/lib-httpd/passwd b/third_party/git/t/lib-httpd/passwd
index 99a34d6487..99a34d6487 100644
--- a/t/lib-httpd/passwd
+++ b/third_party/git/t/lib-httpd/passwd
diff --git a/t/lib-httpd/ssl.cnf b/third_party/git/t/lib-httpd/ssl.cnf
index 6dab2579cb..6dab2579cb 100644
--- a/t/lib-httpd/ssl.cnf
+++ b/third_party/git/t/lib-httpd/ssl.cnf
diff --git a/t/lib-pack.sh b/third_party/git/t/lib-pack.sh
index c4d907a450..c4d907a450 100644
--- a/t/lib-pack.sh
+++ b/third_party/git/t/lib-pack.sh
diff --git a/t/lib-pager.sh b/third_party/git/t/lib-pager.sh
index 3aa7a3ffd8..3aa7a3ffd8 100644
--- a/t/lib-pager.sh
+++ b/third_party/git/t/lib-pager.sh
diff --git a/t/lib-patch-mode.sh b/third_party/git/t/lib-patch-mode.sh
index cfd76bf987..cfd76bf987 100644
--- a/t/lib-patch-mode.sh
+++ b/third_party/git/t/lib-patch-mode.sh
diff --git a/t/lib-proto-disable.sh b/third_party/git/t/lib-proto-disable.sh
index 83babe57d9..83babe57d9 100644
--- a/t/lib-proto-disable.sh
+++ b/third_party/git/t/lib-proto-disable.sh
diff --git a/t/lib-read-tree-m-3way.sh b/third_party/git/t/lib-read-tree-m-3way.sh
index 168329adbc..168329adbc 100644
--- a/t/lib-read-tree-m-3way.sh
+++ b/third_party/git/t/lib-read-tree-m-3way.sh
diff --git a/t/lib-read-tree.sh b/third_party/git/t/lib-read-tree.sh
index b95f485606..b95f485606 100644
--- a/t/lib-read-tree.sh
+++ b/third_party/git/t/lib-read-tree.sh
diff --git a/t/lib-rebase.sh b/third_party/git/t/lib-rebase.sh
index 7ea30e5006..7ea30e5006 100644
--- a/t/lib-rebase.sh
+++ b/third_party/git/t/lib-rebase.sh
diff --git a/t/lib-submodule-update.sh b/third_party/git/t/lib-submodule-update.sh
index 1dd17fc03e..1dd17fc03e 100755
--- a/t/lib-submodule-update.sh
+++ b/third_party/git/t/lib-submodule-update.sh
diff --git a/t/lib-t6000.sh b/third_party/git/t/lib-t6000.sh
index b0ed4767e3..b0ed4767e3 100644
--- a/t/lib-t6000.sh
+++ b/third_party/git/t/lib-t6000.sh
diff --git a/t/lib-terminal.sh b/third_party/git/t/lib-terminal.sh
index e3809dcead..e3809dcead 100644
--- a/t/lib-terminal.sh
+++ b/third_party/git/t/lib-terminal.sh
diff --git a/t/oid-info/README b/third_party/git/t/oid-info/README
index 27f843fc00..27f843fc00 100644
--- a/t/oid-info/README
+++ b/third_party/git/t/oid-info/README
diff --git a/t/oid-info/hash-info b/third_party/git/t/oid-info/hash-info
index ccdbfdf974..ccdbfdf974 100644
--- a/t/oid-info/hash-info
+++ b/third_party/git/t/oid-info/hash-info
diff --git a/t/oid-info/oid b/third_party/git/t/oid-info/oid
index a754970523..a754970523 100644
--- a/t/oid-info/oid
+++ b/third_party/git/t/oid-info/oid
diff --git a/t/perf/.gitignore b/third_party/git/t/perf/.gitignore
index 982eb8e3a9..982eb8e3a9 100644
--- a/t/perf/.gitignore
+++ b/third_party/git/t/perf/.gitignore
diff --git a/t/perf/Makefile b/third_party/git/t/perf/Makefile
index 8c47155a7c..8c47155a7c 100644
--- a/t/perf/Makefile
+++ b/third_party/git/t/perf/Makefile
diff --git a/t/perf/README b/third_party/git/t/perf/README
index c7b70e2d28..c7b70e2d28 100644
--- a/t/perf/README
+++ b/third_party/git/t/perf/README
diff --git a/t/perf/aggregate.perl b/third_party/git/t/perf/aggregate.perl
index 66554d2161..66554d2161 100755
--- a/t/perf/aggregate.perl
+++ b/third_party/git/t/perf/aggregate.perl
diff --git a/t/perf/bisect_regression b/third_party/git/t/perf/bisect_regression
index a94d9955d0..a94d9955d0 100755
--- a/t/perf/bisect_regression
+++ b/third_party/git/t/perf/bisect_regression
diff --git a/t/perf/bisect_run_script b/third_party/git/t/perf/bisect_run_script
index 3ebaf15521..3ebaf15521 100755
--- a/t/perf/bisect_run_script
+++ b/third_party/git/t/perf/bisect_run_script
diff --git a/t/perf/lib-pack.sh b/third_party/git/t/perf/lib-pack.sh
index d3865db286..d3865db286 100644
--- a/t/perf/lib-pack.sh
+++ b/third_party/git/t/perf/lib-pack.sh
diff --git a/t/perf/min_time.perl b/third_party/git/t/perf/min_time.perl
index c1a2717e07..c1a2717e07 100755
--- a/t/perf/min_time.perl
+++ b/third_party/git/t/perf/min_time.perl
diff --git a/t/perf/p0000-perf-lib-sanity.sh b/third_party/git/t/perf/p0000-perf-lib-sanity.sh
index 002c21e52a..002c21e52a 100755
--- a/t/perf/p0000-perf-lib-sanity.sh
+++ b/third_party/git/t/perf/p0000-perf-lib-sanity.sh
diff --git a/t/perf/p0001-rev-list.sh b/third_party/git/t/perf/p0001-rev-list.sh
index 3042a85666..3042a85666 100755
--- a/t/perf/p0001-rev-list.sh
+++ b/third_party/git/t/perf/p0001-rev-list.sh
diff --git a/t/perf/p0002-read-cache.sh b/third_party/git/t/perf/p0002-read-cache.sh
index cdd105a594..cdd105a594 100755
--- a/t/perf/p0002-read-cache.sh
+++ b/third_party/git/t/perf/p0002-read-cache.sh
diff --git a/t/perf/p0003-delta-base-cache.sh b/third_party/git/t/perf/p0003-delta-base-cache.sh
index 62369eaaf0..62369eaaf0 100755
--- a/t/perf/p0003-delta-base-cache.sh
+++ b/third_party/git/t/perf/p0003-delta-base-cache.sh
diff --git a/t/perf/p0004-lazy-init-name-hash.sh b/third_party/git/t/perf/p0004-lazy-init-name-hash.sh
index 1afc08fe7f..1afc08fe7f 100755
--- a/t/perf/p0004-lazy-init-name-hash.sh
+++ b/third_party/git/t/perf/p0004-lazy-init-name-hash.sh
diff --git a/t/perf/p0005-status.sh b/third_party/git/t/perf/p0005-status.sh
index 0b0aa9858f..0b0aa9858f 100755
--- a/t/perf/p0005-status.sh
+++ b/third_party/git/t/perf/p0005-status.sh
diff --git a/t/perf/p0006-read-tree-checkout.sh b/third_party/git/t/perf/p0006-read-tree-checkout.sh
index 78cc23fe2f..78cc23fe2f 100755
--- a/t/perf/p0006-read-tree-checkout.sh
+++ b/third_party/git/t/perf/p0006-read-tree-checkout.sh
diff --git a/t/perf/p0007-write-cache.sh b/third_party/git/t/perf/p0007-write-cache.sh
index 09595264f0..09595264f0 100755
--- a/t/perf/p0007-write-cache.sh
+++ b/third_party/git/t/perf/p0007-write-cache.sh
diff --git a/t/perf/p0071-sort.sh b/third_party/git/t/perf/p0071-sort.sh
index 6e924f5fa3..6e924f5fa3 100755
--- a/t/perf/p0071-sort.sh
+++ b/third_party/git/t/perf/p0071-sort.sh
diff --git a/t/perf/p0100-globbing.sh b/third_party/git/t/perf/p0100-globbing.sh
index dd18a9ce2b..dd18a9ce2b 100755
--- a/t/perf/p0100-globbing.sh
+++ b/third_party/git/t/perf/p0100-globbing.sh
diff --git a/t/perf/p1450-fsck.sh b/third_party/git/t/perf/p1450-fsck.sh
index ae1b84198b..ae1b84198b 100755
--- a/t/perf/p1450-fsck.sh
+++ b/third_party/git/t/perf/p1450-fsck.sh
diff --git a/t/perf/p1451-fsck-skip-list.sh b/third_party/git/t/perf/p1451-fsck-skip-list.sh
index c2b97d2487..c2b97d2487 100755
--- a/t/perf/p1451-fsck-skip-list.sh
+++ b/third_party/git/t/perf/p1451-fsck-skip-list.sh
diff --git a/t/perf/p3400-rebase.sh b/third_party/git/t/perf/p3400-rebase.sh
index d202aaed06..d202aaed06 100755
--- a/t/perf/p3400-rebase.sh
+++ b/third_party/git/t/perf/p3400-rebase.sh
diff --git a/t/perf/p3404-rebase-interactive.sh b/third_party/git/t/perf/p3404-rebase-interactive.sh
index 88f47de282..88f47de282 100755
--- a/t/perf/p3404-rebase-interactive.sh
+++ b/third_party/git/t/perf/p3404-rebase-interactive.sh
diff --git a/t/perf/p4000-diff-algorithms.sh b/third_party/git/t/perf/p4000-diff-algorithms.sh
index 7e00c9da47..7e00c9da47 100755
--- a/t/perf/p4000-diff-algorithms.sh
+++ b/third_party/git/t/perf/p4000-diff-algorithms.sh
diff --git a/t/perf/p4001-diff-no-index.sh b/third_party/git/t/perf/p4001-diff-no-index.sh
index 683be6984f..683be6984f 100755
--- a/t/perf/p4001-diff-no-index.sh
+++ b/third_party/git/t/perf/p4001-diff-no-index.sh
diff --git a/t/perf/p4205-log-pretty-formats.sh b/third_party/git/t/perf/p4205-log-pretty-formats.sh
index 7c26f4f337..7c26f4f337 100755
--- a/t/perf/p4205-log-pretty-formats.sh
+++ b/third_party/git/t/perf/p4205-log-pretty-formats.sh
diff --git a/t/perf/p4211-line-log.sh b/third_party/git/t/perf/p4211-line-log.sh
index 392bcc0e51..392bcc0e51 100755
--- a/t/perf/p4211-line-log.sh
+++ b/third_party/git/t/perf/p4211-line-log.sh
diff --git a/t/perf/p4220-log-grep-engines.sh b/third_party/git/t/perf/p4220-log-grep-engines.sh
index 2bc47ded4d..2bc47ded4d 100755
--- a/t/perf/p4220-log-grep-engines.sh
+++ b/third_party/git/t/perf/p4220-log-grep-engines.sh
diff --git a/t/perf/p4221-log-grep-engines-fixed.sh b/third_party/git/t/perf/p4221-log-grep-engines-fixed.sh
index 060971265a..060971265a 100755
--- a/t/perf/p4221-log-grep-engines-fixed.sh
+++ b/third_party/git/t/perf/p4221-log-grep-engines-fixed.sh
diff --git a/t/perf/p5302-pack-index.sh b/third_party/git/t/perf/p5302-pack-index.sh
index a9b3e112d9..a9b3e112d9 100755
--- a/t/perf/p5302-pack-index.sh
+++ b/third_party/git/t/perf/p5302-pack-index.sh
diff --git a/t/perf/p5303-many-packs.sh b/third_party/git/t/perf/p5303-many-packs.sh
index 3779851941..3779851941 100755
--- a/t/perf/p5303-many-packs.sh
+++ b/third_party/git/t/perf/p5303-many-packs.sh
diff --git a/t/perf/p5304-prune.sh b/third_party/git/t/perf/p5304-prune.sh
index 83baedb8a4..83baedb8a4 100755
--- a/t/perf/p5304-prune.sh
+++ b/third_party/git/t/perf/p5304-prune.sh
diff --git a/t/perf/p5310-pack-bitmaps.sh b/third_party/git/t/perf/p5310-pack-bitmaps.sh
index 6a3a42531b..6a3a42531b 100755
--- a/t/perf/p5310-pack-bitmaps.sh
+++ b/third_party/git/t/perf/p5310-pack-bitmaps.sh
diff --git a/t/perf/p5311-pack-bitmaps-fetch.sh b/third_party/git/t/perf/p5311-pack-bitmaps-fetch.sh
index 47c3fd7581..47c3fd7581 100755
--- a/t/perf/p5311-pack-bitmaps-fetch.sh
+++ b/third_party/git/t/perf/p5311-pack-bitmaps-fetch.sh
diff --git a/t/perf/p5550-fetch-tags.sh b/third_party/git/t/perf/p5550-fetch-tags.sh
index d0e0e019ea..d0e0e019ea 100755
--- a/t/perf/p5550-fetch-tags.sh
+++ b/third_party/git/t/perf/p5550-fetch-tags.sh
diff --git a/t/perf/p5551-fetch-rescan.sh b/third_party/git/t/perf/p5551-fetch-rescan.sh
index b99dc23e32..b99dc23e32 100755
--- a/t/perf/p5551-fetch-rescan.sh
+++ b/third_party/git/t/perf/p5551-fetch-rescan.sh
diff --git a/t/perf/p5600-clone-reference.sh b/third_party/git/t/perf/p5600-clone-reference.sh
index 68fed66347..68fed66347 100755
--- a/t/perf/p5600-clone-reference.sh
+++ b/third_party/git/t/perf/p5600-clone-reference.sh
diff --git a/t/perf/p5600-partial-clone.sh b/third_party/git/t/perf/p5600-partial-clone.sh
index 3e04bd2ae1..3e04bd2ae1 100755
--- a/t/perf/p5600-partial-clone.sh
+++ b/third_party/git/t/perf/p5600-partial-clone.sh
diff --git a/t/perf/p7000-filter-branch.sh b/third_party/git/t/perf/p7000-filter-branch.sh
index b029586ccb..b029586ccb 100755
--- a/t/perf/p7000-filter-branch.sh
+++ b/third_party/git/t/perf/p7000-filter-branch.sh
diff --git a/t/perf/p7300-clean.sh b/third_party/git/t/perf/p7300-clean.sh
index 7c1888a27e..7c1888a27e 100755
--- a/t/perf/p7300-clean.sh
+++ b/third_party/git/t/perf/p7300-clean.sh
diff --git a/t/perf/p7519-fsmonitor.sh b/third_party/git/t/perf/p7519-fsmonitor.sh
index def7ecdbc7..def7ecdbc7 100755
--- a/t/perf/p7519-fsmonitor.sh
+++ b/third_party/git/t/perf/p7519-fsmonitor.sh
diff --git a/t/perf/p7810-grep.sh b/third_party/git/t/perf/p7810-grep.sh
index 9f4ade639f..9f4ade639f 100755
--- a/t/perf/p7810-grep.sh
+++ b/third_party/git/t/perf/p7810-grep.sh
diff --git a/t/perf/p7820-grep-engines.sh b/third_party/git/t/perf/p7820-grep-engines.sh
index 8b09c5bf32..8b09c5bf32 100755
--- a/t/perf/p7820-grep-engines.sh
+++ b/third_party/git/t/perf/p7820-grep-engines.sh
diff --git a/t/perf/p7821-grep-engines-fixed.sh b/third_party/git/t/perf/p7821-grep-engines-fixed.sh
index 61e41b82cf..61e41b82cf 100755
--- a/t/perf/p7821-grep-engines-fixed.sh
+++ b/third_party/git/t/perf/p7821-grep-engines-fixed.sh
diff --git a/t/perf/perf-lib.sh b/third_party/git/t/perf/perf-lib.sh
index b58a43ea43..b58a43ea43 100644
--- a/t/perf/perf-lib.sh
+++ b/third_party/git/t/perf/perf-lib.sh
diff --git a/t/perf/repos/.gitignore b/third_party/git/t/perf/repos/.gitignore
index 72e3dc3e19..72e3dc3e19 100644
--- a/t/perf/repos/.gitignore
+++ b/third_party/git/t/perf/repos/.gitignore
diff --git a/t/perf/repos/inflate-repo.sh b/third_party/git/t/perf/repos/inflate-repo.sh
index fcfc992b5b..fcfc992b5b 100755
--- a/t/perf/repos/inflate-repo.sh
+++ b/third_party/git/t/perf/repos/inflate-repo.sh
diff --git a/t/perf/repos/many-files.sh b/third_party/git/t/perf/repos/many-files.sh
index 28720e4e10..28720e4e10 100755
--- a/t/perf/repos/many-files.sh
+++ b/third_party/git/t/perf/repos/many-files.sh
diff --git a/t/perf/run b/third_party/git/t/perf/run
index c7b86104e1..c7b86104e1 100755
--- a/t/perf/run
+++ b/third_party/git/t/perf/run
diff --git a/t/t0000-basic.sh b/third_party/git/t/t0000-basic.sh
index 9ca0818cbe..9ca0818cbe 100755
--- a/t/t0000-basic.sh
+++ b/third_party/git/t/t0000-basic.sh
diff --git a/t/t0001-init.sh b/third_party/git/t/t0001-init.sh
index 26f8206326..26f8206326 100755
--- a/t/t0001-init.sh
+++ b/third_party/git/t/t0001-init.sh
diff --git a/t/t0002-gitfile.sh b/third_party/git/t/t0002-gitfile.sh
index 0aa9908ea1..0aa9908ea1 100755
--- a/t/t0002-gitfile.sh
+++ b/third_party/git/t/t0002-gitfile.sh
diff --git a/t/t0003-attributes.sh b/third_party/git/t/t0003-attributes.sh
index 71e63d8b50..71e63d8b50 100755
--- a/t/t0003-attributes.sh
+++ b/third_party/git/t/t0003-attributes.sh
diff --git a/t/t0004-unwritable.sh b/third_party/git/t/t0004-unwritable.sh
index e3137d638e..e3137d638e 100755
--- a/t/t0004-unwritable.sh
+++ b/third_party/git/t/t0004-unwritable.sh
diff --git a/t/t0005-signals.sh b/third_party/git/t/t0005-signals.sh
index 4c214bd11c..4c214bd11c 100755
--- a/t/t0005-signals.sh
+++ b/third_party/git/t/t0005-signals.sh
diff --git a/t/t0006-date.sh b/third_party/git/t/t0006-date.sh
index d9fcc829a9..d9fcc829a9 100755
--- a/t/t0006-date.sh
+++ b/third_party/git/t/t0006-date.sh
diff --git a/t/t0007-git-var.sh b/third_party/git/t/t0007-git-var.sh
index 1f600e2cae..1f600e2cae 100755
--- a/t/t0007-git-var.sh
+++ b/third_party/git/t/t0007-git-var.sh
diff --git a/t/t0008-ignores.sh b/third_party/git/t/t0008-ignores.sh
index 1744cee5e9..1744cee5e9 100755
--- a/t/t0008-ignores.sh
+++ b/third_party/git/t/t0008-ignores.sh
diff --git a/t/t0009-prio-queue.sh b/third_party/git/t/t0009-prio-queue.sh
index 3941ad2528..3941ad2528 100755
--- a/t/t0009-prio-queue.sh
+++ b/third_party/git/t/t0009-prio-queue.sh
diff --git a/t/t0010-racy-git.sh b/third_party/git/t/t0010-racy-git.sh
index 5657c5a87b..5657c5a87b 100755
--- a/t/t0010-racy-git.sh
+++ b/third_party/git/t/t0010-racy-git.sh
diff --git a/t/t0011-hashmap.sh b/third_party/git/t/t0011-hashmap.sh
index 5343ffd3f9..5343ffd3f9 100755
--- a/t/t0011-hashmap.sh
+++ b/third_party/git/t/t0011-hashmap.sh
diff --git a/t/t0012-help.sh b/third_party/git/t/t0012-help.sh
index e8ef7300ec..e8ef7300ec 100755
--- a/t/t0012-help.sh
+++ b/third_party/git/t/t0012-help.sh
diff --git a/t/t0013-sha1dc.sh b/third_party/git/t/t0013-sha1dc.sh
index 419f31a8f7..419f31a8f7 100755
--- a/t/t0013-sha1dc.sh
+++ b/third_party/git/t/t0013-sha1dc.sh
diff --git a/t/t0013/shattered-1.pdf b/third_party/git/t/t0013/shattered-1.pdf
index ba9aaa145c..ba9aaa145c 100644
--- a/t/t0013/shattered-1.pdf
+++ b/third_party/git/t/t0013/shattered-1.pdf
Binary files differdiff --git a/t/t0014-alias.sh b/third_party/git/t/t0014-alias.sh
index a070e645d7..a070e645d7 100755
--- a/t/t0014-alias.sh
+++ b/third_party/git/t/t0014-alias.sh
diff --git a/t/t0015-hash.sh b/third_party/git/t/t0015-hash.sh
index 291e9061f3..291e9061f3 100755
--- a/t/t0015-hash.sh
+++ b/third_party/git/t/t0015-hash.sh
diff --git a/t/t0016-oidmap.sh b/third_party/git/t/t0016-oidmap.sh
index 31f8276ba8..31f8276ba8 100755
--- a/t/t0016-oidmap.sh
+++ b/third_party/git/t/t0016-oidmap.sh
diff --git a/t/t0017-env-helper.sh b/third_party/git/t/t0017-env-helper.sh
index c1ecf6aeac..c1ecf6aeac 100755
--- a/t/t0017-env-helper.sh
+++ b/third_party/git/t/t0017-env-helper.sh
diff --git a/t/t0019-json-writer.sh b/third_party/git/t/t0019-json-writer.sh
index 3b0c336b38..3b0c336b38 100755
--- a/t/t0019-json-writer.sh
+++ b/third_party/git/t/t0019-json-writer.sh
diff --git a/t/t0019/parse_json.perl b/third_party/git/t/t0019/parse_json.perl
index fea87fb81b..fea87fb81b 100644
--- a/t/t0019/parse_json.perl
+++ b/third_party/git/t/t0019/parse_json.perl
diff --git a/t/t0020-crlf.sh b/third_party/git/t/t0020-crlf.sh
index 854da0ae16..854da0ae16 100755
--- a/t/t0020-crlf.sh
+++ b/third_party/git/t/t0020-crlf.sh
diff --git a/t/t0021-conversion.sh b/third_party/git/t/t0021-conversion.sh
index e10f5f787f..e10f5f787f 100755
--- a/t/t0021-conversion.sh
+++ b/third_party/git/t/t0021-conversion.sh
diff --git a/t/t0021/rot13-filter.pl b/third_party/git/t/t0021/rot13-filter.pl
index 470107248e..470107248e 100644
--- a/t/t0021/rot13-filter.pl
+++ b/third_party/git/t/t0021/rot13-filter.pl
diff --git a/t/t0022-crlf-rename.sh b/third_party/git/t/t0022-crlf-rename.sh
index 7af3fbcc7b..7af3fbcc7b 100755
--- a/t/t0022-crlf-rename.sh
+++ b/third_party/git/t/t0022-crlf-rename.sh
diff --git a/t/t0023-crlf-am.sh b/third_party/git/t/t0023-crlf-am.sh
index f9bbb91f64..f9bbb91f64 100755
--- a/t/t0023-crlf-am.sh
+++ b/third_party/git/t/t0023-crlf-am.sh
diff --git a/t/t0024-crlf-archive.sh b/third_party/git/t/t0024-crlf-archive.sh
index 4e9fa3cd68..4e9fa3cd68 100755
--- a/t/t0024-crlf-archive.sh
+++ b/third_party/git/t/t0024-crlf-archive.sh
diff --git a/t/t0025-crlf-renormalize.sh b/third_party/git/t/t0025-crlf-renormalize.sh
index e13363ade5..e13363ade5 100755
--- a/t/t0025-crlf-renormalize.sh
+++ b/third_party/git/t/t0025-crlf-renormalize.sh
diff --git a/t/t0026-eol-config.sh b/third_party/git/t/t0026-eol-config.sh
index c5203e232c..c5203e232c 100755
--- a/t/t0026-eol-config.sh
+++ b/third_party/git/t/t0026-eol-config.sh
diff --git a/t/t0027-auto-crlf.sh b/third_party/git/t/t0027-auto-crlf.sh
index 959b6da449..959b6da449 100755
--- a/t/t0027-auto-crlf.sh
+++ b/third_party/git/t/t0027-auto-crlf.sh
diff --git a/t/t0028-working-tree-encoding.sh b/third_party/git/t/t0028-working-tree-encoding.sh
index 1090e650ed..1090e650ed 100755
--- a/t/t0028-working-tree-encoding.sh
+++ b/third_party/git/t/t0028-working-tree-encoding.sh
diff --git a/t/t0029-core-unsetenvvars.sh b/third_party/git/t/t0029-core-unsetenvvars.sh
index 24ce46a6ea..24ce46a6ea 100755
--- a/t/t0029-core-unsetenvvars.sh
+++ b/third_party/git/t/t0029-core-unsetenvvars.sh
diff --git a/t/t0030-stripspace.sh b/third_party/git/t/t0030-stripspace.sh
index 0c24a0f9a3..0c24a0f9a3 100755
--- a/t/t0030-stripspace.sh
+++ b/third_party/git/t/t0030-stripspace.sh
diff --git a/t/t0040-parse-options.sh b/third_party/git/t/t0040-parse-options.sh
index cebc77fab0..cebc77fab0 100755
--- a/t/t0040-parse-options.sh
+++ b/third_party/git/t/t0040-parse-options.sh
diff --git a/t/t0041-usage.sh b/third_party/git/t/t0041-usage.sh
index 5b927b76fe..5b927b76fe 100755
--- a/t/t0041-usage.sh
+++ b/third_party/git/t/t0041-usage.sh
diff --git a/t/t0050-filesystem.sh b/third_party/git/t/t0050-filesystem.sh
index 192c94eccd..192c94eccd 100755
--- a/t/t0050-filesystem.sh
+++ b/third_party/git/t/t0050-filesystem.sh
diff --git a/t/t0051-windows-named-pipe.sh b/third_party/git/t/t0051-windows-named-pipe.sh
index 10ac92d225..10ac92d225 100755
--- a/t/t0051-windows-named-pipe.sh
+++ b/third_party/git/t/t0051-windows-named-pipe.sh
diff --git a/t/t0055-beyond-symlinks.sh b/third_party/git/t/t0055-beyond-symlinks.sh
index 0c6ff567a1..0c6ff567a1 100755
--- a/t/t0055-beyond-symlinks.sh
+++ b/third_party/git/t/t0055-beyond-symlinks.sh
diff --git a/t/t0056-git-C.sh b/third_party/git/t/t0056-git-C.sh
index 2630e756da..2630e756da 100755
--- a/t/t0056-git-C.sh
+++ b/third_party/git/t/t0056-git-C.sh
diff --git a/t/t0060-path-utils.sh b/third_party/git/t/t0060-path-utils.sh
index c7b53e494b..c7b53e494b 100755
--- a/t/t0060-path-utils.sh
+++ b/third_party/git/t/t0060-path-utils.sh
diff --git a/t/t0061-run-command.sh b/third_party/git/t/t0061-run-command.sh
index 015fac8b5d..015fac8b5d 100755
--- a/t/t0061-run-command.sh
+++ b/third_party/git/t/t0061-run-command.sh
diff --git a/t/t0062-revision-walking.sh b/third_party/git/t/t0062-revision-walking.sh
index 8e215867b8..8e215867b8 100755
--- a/t/t0062-revision-walking.sh
+++ b/third_party/git/t/t0062-revision-walking.sh
diff --git a/t/t0063-string-list.sh b/third_party/git/t/t0063-string-list.sh
index c6ee9f66b1..c6ee9f66b1 100755
--- a/t/t0063-string-list.sh
+++ b/third_party/git/t/t0063-string-list.sh
diff --git a/t/t0064-sha1-array.sh b/third_party/git/t/t0064-sha1-array.sh
index 5dda570b9a..5dda570b9a 100755
--- a/t/t0064-sha1-array.sh
+++ b/third_party/git/t/t0064-sha1-array.sh
diff --git a/t/t0065-strcmp-offset.sh b/third_party/git/t/t0065-strcmp-offset.sh
index 91fa639c4a..91fa639c4a 100755
--- a/t/t0065-strcmp-offset.sh
+++ b/third_party/git/t/t0065-strcmp-offset.sh
diff --git a/t/t0066-dir-iterator.sh b/third_party/git/t/t0066-dir-iterator.sh
index 92910e4e6c..92910e4e6c 100755
--- a/t/t0066-dir-iterator.sh
+++ b/third_party/git/t/t0066-dir-iterator.sh
diff --git a/t/t0070-fundamental.sh b/third_party/git/t/t0070-fundamental.sh
index 7b111a56fd..7b111a56fd 100755
--- a/t/t0070-fundamental.sh
+++ b/third_party/git/t/t0070-fundamental.sh
diff --git a/t/t0081-line-buffer.sh b/third_party/git/t/t0081-line-buffer.sh
index ce92e6acad..ce92e6acad 100755
--- a/t/t0081-line-buffer.sh
+++ b/third_party/git/t/t0081-line-buffer.sh
diff --git a/t/t0090-cache-tree.sh b/third_party/git/t/t0090-cache-tree.sh
index ce9a4a5f32..ce9a4a5f32 100755
--- a/t/t0090-cache-tree.sh
+++ b/third_party/git/t/t0090-cache-tree.sh
diff --git a/t/t0100-previous.sh b/third_party/git/t/t0100-previous.sh
index 58c0b7e9b6..58c0b7e9b6 100755
--- a/t/t0100-previous.sh
+++ b/third_party/git/t/t0100-previous.sh
diff --git a/t/t0101-at-syntax.sh b/third_party/git/t/t0101-at-syntax.sh
index a1998b558f..a1998b558f 100755
--- a/t/t0101-at-syntax.sh
+++ b/third_party/git/t/t0101-at-syntax.sh
diff --git a/t/t0110-urlmatch-normalization.sh b/third_party/git/t/t0110-urlmatch-normalization.sh
index f99529d838..f99529d838 100755
--- a/t/t0110-urlmatch-normalization.sh
+++ b/third_party/git/t/t0110-urlmatch-normalization.sh
diff --git a/t/t0110/README b/third_party/git/t/t0110/README
index ad4a50ecd8..ad4a50ecd8 100644
--- a/t/t0110/README
+++ b/third_party/git/t/t0110/README
diff --git a/t/t0110/url-1 b/third_party/git/t/t0110/url-1
index 519019c5ce..519019c5ce 100644
--- a/t/t0110/url-1
+++ b/third_party/git/t/t0110/url-1
diff --git a/t/t0110/url-10 b/third_party/git/t/t0110/url-10
index b9965de6a5..b9965de6a5 100644
--- a/t/t0110/url-10
+++ b/third_party/git/t/t0110/url-10
diff --git a/t/t0110/url-11 b/third_party/git/t/t0110/url-11
index f0a50f1009..f0a50f1009 100644
--- a/t/t0110/url-11
+++ b/third_party/git/t/t0110/url-11
diff --git a/t/t0110/url-2 b/third_party/git/t/t0110/url-2
index 43334b05b2..43334b05b2 100644
--- a/t/t0110/url-2
+++ b/third_party/git/t/t0110/url-2
diff --git a/t/t0110/url-3 b/third_party/git/t/t0110/url-3
index 7378c7bec2..7378c7bec2 100644
--- a/t/t0110/url-3
+++ b/third_party/git/t/t0110/url-3
diff --git a/t/t0110/url-4 b/third_party/git/t/t0110/url-4
index 220b198c97..220b198c97 100644
--- a/t/t0110/url-4
+++ b/third_party/git/t/t0110/url-4
diff --git a/t/t0110/url-5 b/third_party/git/t/t0110/url-5
index 1ccd927779..1ccd927779 100644
--- a/t/t0110/url-5
+++ b/third_party/git/t/t0110/url-5
diff --git a/t/t0110/url-6 b/third_party/git/t/t0110/url-6
index e8283aac6d..e8283aac6d 100644
--- a/t/t0110/url-6
+++ b/third_party/git/t/t0110/url-6
diff --git a/t/t0110/url-7 b/third_party/git/t/t0110/url-7
index fa7c10b615..fa7c10b615 100644
--- a/t/t0110/url-7
+++ b/third_party/git/t/t0110/url-7
diff --git a/t/t0110/url-8 b/third_party/git/t/t0110/url-8
index 79a0ba836f..79a0ba836f 100644
--- a/t/t0110/url-8
+++ b/third_party/git/t/t0110/url-8
diff --git a/t/t0110/url-9 b/third_party/git/t/t0110/url-9
index 8b44bec48b..8b44bec48b 100644
--- a/t/t0110/url-9
+++ b/third_party/git/t/t0110/url-9
diff --git a/t/t0200-gettext-basic.sh b/third_party/git/t/t0200-gettext-basic.sh
index 8853d8afb9..8853d8afb9 100755
--- a/t/t0200-gettext-basic.sh
+++ b/third_party/git/t/t0200-gettext-basic.sh
diff --git a/t/t0200/test.c b/third_party/git/t/t0200/test.c
index 584d45cf36..584d45cf36 100644
--- a/t/t0200/test.c
+++ b/third_party/git/t/t0200/test.c
diff --git a/t/t0200/test.perl b/third_party/git/t/t0200/test.perl
index 36fba341ba..36fba341ba 100644
--- a/t/t0200/test.perl
+++ b/third_party/git/t/t0200/test.perl
diff --git a/t/t0200/test.sh b/third_party/git/t/t0200/test.sh
index 022d607f4c..022d607f4c 100644
--- a/t/t0200/test.sh
+++ b/third_party/git/t/t0200/test.sh
diff --git a/t/t0201-gettext-fallbacks.sh b/third_party/git/t/t0201-gettext-fallbacks.sh
index 90da1c7ddc..90da1c7ddc 100755
--- a/t/t0201-gettext-fallbacks.sh
+++ b/third_party/git/t/t0201-gettext-fallbacks.sh
diff --git a/t/t0202-gettext-perl.sh b/third_party/git/t/t0202-gettext-perl.sh
index a29d166e00..a29d166e00 100755
--- a/t/t0202-gettext-perl.sh
+++ b/third_party/git/t/t0202-gettext-perl.sh
diff --git a/t/t0202/test.pl b/third_party/git/t/t0202/test.pl
index 2cbf7b9590..2cbf7b9590 100755
--- a/t/t0202/test.pl
+++ b/third_party/git/t/t0202/test.pl
diff --git a/t/t0203-gettext-setlocale-sanity.sh b/third_party/git/t/t0203-gettext-setlocale-sanity.sh
index 0ce1f22eff..0ce1f22eff 100755
--- a/t/t0203-gettext-setlocale-sanity.sh
+++ b/third_party/git/t/t0203-gettext-setlocale-sanity.sh
diff --git a/t/t0204-gettext-reencode-sanity.sh b/third_party/git/t/t0204-gettext-reencode-sanity.sh
index 8437e51eb5..8437e51eb5 100755
--- a/t/t0204-gettext-reencode-sanity.sh
+++ b/third_party/git/t/t0204-gettext-reencode-sanity.sh
diff --git a/t/t0205-gettext-poison.sh b/third_party/git/t/t0205-gettext-poison.sh
index f9fa16ad83..f9fa16ad83 100755
--- a/t/t0205-gettext-poison.sh
+++ b/third_party/git/t/t0205-gettext-poison.sh
diff --git a/t/t0210-trace2-normal.sh b/third_party/git/t/t0210-trace2-normal.sh
index ce7574edb1..ce7574edb1 100755
--- a/t/t0210-trace2-normal.sh
+++ b/third_party/git/t/t0210-trace2-normal.sh
diff --git a/t/t0210/scrub_normal.perl b/third_party/git/t/t0210/scrub_normal.perl
index c65d1a815e..c65d1a815e 100644
--- a/t/t0210/scrub_normal.perl
+++ b/third_party/git/t/t0210/scrub_normal.perl
diff --git a/t/t0211-trace2-perf.sh b/third_party/git/t/t0211-trace2-perf.sh
index 2c3ad6e8c1..2c3ad6e8c1 100755
--- a/t/t0211-trace2-perf.sh
+++ b/third_party/git/t/t0211-trace2-perf.sh
diff --git a/t/t0211/scrub_perf.perl b/third_party/git/t/t0211/scrub_perf.perl
index 351af7844e..351af7844e 100644
--- a/t/t0211/scrub_perf.perl
+++ b/third_party/git/t/t0211/scrub_perf.perl
diff --git a/t/t0212-trace2-event.sh b/third_party/git/t/t0212-trace2-event.sh
index ff5b9cc729..ff5b9cc729 100755
--- a/t/t0212-trace2-event.sh
+++ b/third_party/git/t/t0212-trace2-event.sh
diff --git a/t/t0212/parse_events.perl b/third_party/git/t/t0212/parse_events.perl
index 6584bb5634..6584bb5634 100644
--- a/t/t0212/parse_events.perl
+++ b/third_party/git/t/t0212/parse_events.perl
diff --git a/t/t0300-credentials.sh b/third_party/git/t/t0300-credentials.sh
index 82eaaea0f4..82eaaea0f4 100755
--- a/t/t0300-credentials.sh
+++ b/third_party/git/t/t0300-credentials.sh
diff --git a/t/t0301-credential-cache.sh b/third_party/git/t/t0301-credential-cache.sh
index ebd5fa5249..ebd5fa5249 100755
--- a/t/t0301-credential-cache.sh
+++ b/third_party/git/t/t0301-credential-cache.sh
diff --git a/t/t0302-credential-store.sh b/third_party/git/t/t0302-credential-store.sh
index d6b54e8c65..d6b54e8c65 100755
--- a/t/t0302-credential-store.sh
+++ b/third_party/git/t/t0302-credential-store.sh
diff --git a/t/t0303-credential-external.sh b/third_party/git/t/t0303-credential-external.sh
index f028fd1418..f028fd1418 100755
--- a/t/t0303-credential-external.sh
+++ b/third_party/git/t/t0303-credential-external.sh
diff --git a/t/t0410-partial-clone.sh b/third_party/git/t/t0410-partial-clone.sh
index 5bd892f2f7..5bd892f2f7 100755
--- a/t/t0410-partial-clone.sh
+++ b/third_party/git/t/t0410-partial-clone.sh
diff --git a/t/t1000-read-tree-m-3way.sh b/third_party/git/t/t1000-read-tree-m-3way.sh
index 013c5a7bc3..013c5a7bc3 100755
--- a/t/t1000-read-tree-m-3way.sh
+++ b/third_party/git/t/t1000-read-tree-m-3way.sh
diff --git a/t/t1001-read-tree-m-2way.sh b/third_party/git/t/t1001-read-tree-m-2way.sh
index 1057a96b24..1057a96b24 100755
--- a/t/t1001-read-tree-m-2way.sh
+++ b/third_party/git/t/t1001-read-tree-m-2way.sh
diff --git a/t/t1002-read-tree-m-u-2way.sh b/third_party/git/t/t1002-read-tree-m-u-2way.sh
index 9c05f5e1f5..9c05f5e1f5 100755
--- a/t/t1002-read-tree-m-u-2way.sh
+++ b/third_party/git/t/t1002-read-tree-m-u-2way.sh
diff --git a/t/t1003-read-tree-prefix.sh b/third_party/git/t/t1003-read-tree-prefix.sh
index b6111cd150..b6111cd150 100755
--- a/t/t1003-read-tree-prefix.sh
+++ b/third_party/git/t/t1003-read-tree-prefix.sh
diff --git a/t/t1004-read-tree-m-u-wf.sh b/third_party/git/t/t1004-read-tree-m-u-wf.sh
index c13578a635..c13578a635 100755
--- a/t/t1004-read-tree-m-u-wf.sh
+++ b/third_party/git/t/t1004-read-tree-m-u-wf.sh
diff --git a/t/t1005-read-tree-reset.sh b/third_party/git/t/t1005-read-tree-reset.sh
index 83b09e1310..83b09e1310 100755
--- a/t/t1005-read-tree-reset.sh
+++ b/third_party/git/t/t1005-read-tree-reset.sh
diff --git a/t/t1006-cat-file.sh b/third_party/git/t/t1006-cat-file.sh
index 43c4be1e5e..43c4be1e5e 100755
--- a/t/t1006-cat-file.sh
+++ b/third_party/git/t/t1006-cat-file.sh
diff --git a/t/t1007-hash-object.sh b/third_party/git/t/t1007-hash-object.sh
index 64b340f227..64b340f227 100755
--- a/t/t1007-hash-object.sh
+++ b/third_party/git/t/t1007-hash-object.sh
diff --git a/t/t1008-read-tree-overlay.sh b/third_party/git/t/t1008-read-tree-overlay.sh
index cf96016844..cf96016844 100755
--- a/t/t1008-read-tree-overlay.sh
+++ b/third_party/git/t/t1008-read-tree-overlay.sh
diff --git a/t/t1009-read-tree-new-index.sh b/third_party/git/t/t1009-read-tree-new-index.sh
index 59b3aa4bc4..59b3aa4bc4 100755
--- a/t/t1009-read-tree-new-index.sh
+++ b/third_party/git/t/t1009-read-tree-new-index.sh
diff --git a/t/t1010-mktree.sh b/third_party/git/t/t1010-mktree.sh
index b946f87686..b946f87686 100755
--- a/t/t1010-mktree.sh
+++ b/third_party/git/t/t1010-mktree.sh
diff --git a/t/t1011-read-tree-sparse-checkout.sh b/third_party/git/t/t1011-read-tree-sparse-checkout.sh
index ba71b159ba..ba71b159ba 100755
--- a/t/t1011-read-tree-sparse-checkout.sh
+++ b/third_party/git/t/t1011-read-tree-sparse-checkout.sh
diff --git a/t/t1012-read-tree-df.sh b/third_party/git/t/t1012-read-tree-df.sh
index 57f0770df1..57f0770df1 100755
--- a/t/t1012-read-tree-df.sh
+++ b/third_party/git/t/t1012-read-tree-df.sh
diff --git a/t/t1013-read-tree-submodule.sh b/third_party/git/t/t1013-read-tree-submodule.sh
index 91a6fafcb4..91a6fafcb4 100755
--- a/t/t1013-read-tree-submodule.sh
+++ b/third_party/git/t/t1013-read-tree-submodule.sh
diff --git a/t/t1014-read-tree-confusing.sh b/third_party/git/t/t1014-read-tree-confusing.sh
index 2f5a25d503..2f5a25d503 100755
--- a/t/t1014-read-tree-confusing.sh
+++ b/third_party/git/t/t1014-read-tree-confusing.sh
diff --git a/t/t1015-read-index-unmerged.sh b/third_party/git/t/t1015-read-index-unmerged.sh
index 55d22da32c..55d22da32c 100755
--- a/t/t1015-read-index-unmerged.sh
+++ b/third_party/git/t/t1015-read-index-unmerged.sh
diff --git a/t/t1020-subdirectory.sh b/third_party/git/t/t1020-subdirectory.sh
index c2df75e495..c2df75e495 100755
--- a/t/t1020-subdirectory.sh
+++ b/third_party/git/t/t1020-subdirectory.sh
diff --git a/t/t1021-rerere-in-workdir.sh b/third_party/git/t/t1021-rerere-in-workdir.sh
index 301e071ff7..301e071ff7 100755
--- a/t/t1021-rerere-in-workdir.sh
+++ b/third_party/git/t/t1021-rerere-in-workdir.sh
diff --git a/t/t1050-large.sh b/third_party/git/t/t1050-large.sh
index dcb4dbba67..dcb4dbba67 100755
--- a/t/t1050-large.sh
+++ b/third_party/git/t/t1050-large.sh
diff --git a/t/t1051-large-conversion.sh b/third_party/git/t/t1051-large-conversion.sh
index 8b7640b3ba..8b7640b3ba 100755
--- a/t/t1051-large-conversion.sh
+++ b/third_party/git/t/t1051-large-conversion.sh
diff --git a/t/t1060-object-corruption.sh b/third_party/git/t/t1060-object-corruption.sh
index bc89371f53..bc89371f53 100755
--- a/t/t1060-object-corruption.sh
+++ b/third_party/git/t/t1060-object-corruption.sh
diff --git a/t/t1090-sparse-checkout-scope.sh b/third_party/git/t/t1090-sparse-checkout-scope.sh
index 40cc004326..40cc004326 100755
--- a/t/t1090-sparse-checkout-scope.sh
+++ b/third_party/git/t/t1090-sparse-checkout-scope.sh
diff --git a/t/t1100-commit-tree-options.sh b/third_party/git/t/t1100-commit-tree-options.sh
index ae66ba5bab..ae66ba5bab 100755
--- a/t/t1100-commit-tree-options.sh
+++ b/third_party/git/t/t1100-commit-tree-options.sh
diff --git a/t/t1300-config.sh b/third_party/git/t/t1300-config.sh
index 428177c390..428177c390 100755
--- a/t/t1300-config.sh
+++ b/third_party/git/t/t1300-config.sh
diff --git a/t/t1301-shared-repo.sh b/third_party/git/t/t1301-shared-repo.sh
index 2dc853d1be..2dc853d1be 100755
--- a/t/t1301-shared-repo.sh
+++ b/third_party/git/t/t1301-shared-repo.sh
diff --git a/t/t1302-repo-version.sh b/third_party/git/t/t1302-repo-version.sh
index ce4cff13bb..ce4cff13bb 100755
--- a/t/t1302-repo-version.sh
+++ b/third_party/git/t/t1302-repo-version.sh
diff --git a/t/t1303-wacky-config.sh b/third_party/git/t/t1303-wacky-config.sh
index 0000e664e7..0000e664e7 100755
--- a/t/t1303-wacky-config.sh
+++ b/third_party/git/t/t1303-wacky-config.sh
diff --git a/t/t1304-default-acl.sh b/third_party/git/t/t1304-default-acl.sh
index 335d3f3211..335d3f3211 100755
--- a/t/t1304-default-acl.sh
+++ b/third_party/git/t/t1304-default-acl.sh
diff --git a/t/t1305-config-include.sh b/third_party/git/t/t1305-config-include.sh
index d20b4d150d..d20b4d150d 100755
--- a/t/t1305-config-include.sh
+++ b/third_party/git/t/t1305-config-include.sh
diff --git a/t/t1306-xdg-files.sh b/third_party/git/t/t1306-xdg-files.sh
index 21e139a313..21e139a313 100755
--- a/t/t1306-xdg-files.sh
+++ b/third_party/git/t/t1306-xdg-files.sh
diff --git a/t/t1307-config-blob.sh b/third_party/git/t/t1307-config-blob.sh
index 37dc689d8c..37dc689d8c 100755
--- a/t/t1307-config-blob.sh
+++ b/third_party/git/t/t1307-config-blob.sh
diff --git a/t/t1308-config-set.sh b/third_party/git/t/t1308-config-set.sh
index d0a2727b85..d0a2727b85 100755
--- a/t/t1308-config-set.sh
+++ b/third_party/git/t/t1308-config-set.sh
diff --git a/t/t1309-early-config.sh b/third_party/git/t/t1309-early-config.sh
index 0c37e7180d..0c37e7180d 100755
--- a/t/t1309-early-config.sh
+++ b/third_party/git/t/t1309-early-config.sh
diff --git a/t/t1310-config-default.sh b/third_party/git/t/t1310-config-default.sh
index 6049d91708..6049d91708 100755
--- a/t/t1310-config-default.sh
+++ b/third_party/git/t/t1310-config-default.sh
diff --git a/t/t1350-config-hooks-path.sh b/third_party/git/t/t1350-config-hooks-path.sh
index f1f9aee9f5..f1f9aee9f5 100755
--- a/t/t1350-config-hooks-path.sh
+++ b/third_party/git/t/t1350-config-hooks-path.sh
diff --git a/t/t1400-update-ref.sh b/third_party/git/t/t1400-update-ref.sh
index 1fbd940408..1fbd940408 100755
--- a/t/t1400-update-ref.sh
+++ b/third_party/git/t/t1400-update-ref.sh
diff --git a/t/t1401-symbolic-ref.sh b/third_party/git/t/t1401-symbolic-ref.sh
index a4ebb0b65f..a4ebb0b65f 100755
--- a/t/t1401-symbolic-ref.sh
+++ b/third_party/git/t/t1401-symbolic-ref.sh
diff --git a/t/t1402-check-ref-format.sh b/third_party/git/t/t1402-check-ref-format.sh
index 98e4a8613b..98e4a8613b 100755
--- a/t/t1402-check-ref-format.sh
+++ b/third_party/git/t/t1402-check-ref-format.sh
diff --git a/t/t1403-show-ref.sh b/third_party/git/t/t1403-show-ref.sh
index 5d955c3bff..5d955c3bff 100755
--- a/t/t1403-show-ref.sh
+++ b/third_party/git/t/t1403-show-ref.sh
diff --git a/t/t1404-update-ref-errors.sh b/third_party/git/t/t1404-update-ref-errors.sh
index 970c5c36b9..970c5c36b9 100755
--- a/t/t1404-update-ref-errors.sh
+++ b/third_party/git/t/t1404-update-ref-errors.sh
diff --git a/t/t1405-main-ref-store.sh b/third_party/git/t/t1405-main-ref-store.sh
index 331899ddc4..331899ddc4 100755
--- a/t/t1405-main-ref-store.sh
+++ b/third_party/git/t/t1405-main-ref-store.sh
diff --git a/t/t1406-submodule-ref-store.sh b/third_party/git/t/t1406-submodule-ref-store.sh
index d199d872fb..d199d872fb 100755
--- a/t/t1406-submodule-ref-store.sh
+++ b/third_party/git/t/t1406-submodule-ref-store.sh
diff --git a/t/t1407-worktree-ref-store.sh b/third_party/git/t/t1407-worktree-ref-store.sh
index 9a84858118..9a84858118 100755
--- a/t/t1407-worktree-ref-store.sh
+++ b/third_party/git/t/t1407-worktree-ref-store.sh
diff --git a/t/t1408-packed-refs.sh b/third_party/git/t/t1408-packed-refs.sh
index 1e44a17eea..1e44a17eea 100755
--- a/t/t1408-packed-refs.sh
+++ b/third_party/git/t/t1408-packed-refs.sh
diff --git a/t/t1409-avoid-packing-refs.sh b/third_party/git/t/t1409-avoid-packing-refs.sh
index e5cb8a252d..e5cb8a252d 100755
--- a/t/t1409-avoid-packing-refs.sh
+++ b/third_party/git/t/t1409-avoid-packing-refs.sh
diff --git a/t/t1410-reflog.sh b/third_party/git/t/t1410-reflog.sh
index 82950c0282..82950c0282 100755
--- a/t/t1410-reflog.sh
+++ b/third_party/git/t/t1410-reflog.sh
diff --git a/t/t1411-reflog-show.sh b/third_party/git/t/t1411-reflog-show.sh
index 985daf1def..985daf1def 100755
--- a/t/t1411-reflog-show.sh
+++ b/third_party/git/t/t1411-reflog-show.sh
diff --git a/t/t1412-reflog-loop.sh b/third_party/git/t/t1412-reflog-loop.sh
index 3acd895afb..3acd895afb 100755
--- a/t/t1412-reflog-loop.sh
+++ b/third_party/git/t/t1412-reflog-loop.sh
diff --git a/t/t1413-reflog-detach.sh b/third_party/git/t/t1413-reflog-detach.sh
index c730600d8a..c730600d8a 100755
--- a/t/t1413-reflog-detach.sh
+++ b/third_party/git/t/t1413-reflog-detach.sh
diff --git a/t/t1414-reflog-walk.sh b/third_party/git/t/t1414-reflog-walk.sh
index feb1efd8ff..feb1efd8ff 100755
--- a/t/t1414-reflog-walk.sh
+++ b/third_party/git/t/t1414-reflog-walk.sh
diff --git a/t/t1415-worktree-refs.sh b/third_party/git/t/t1415-worktree-refs.sh
index bb2c7572a3..bb2c7572a3 100755
--- a/t/t1415-worktree-refs.sh
+++ b/third_party/git/t/t1415-worktree-refs.sh
diff --git a/t/t1420-lost-found.sh b/third_party/git/t/t1420-lost-found.sh
index dc9e402c55..dc9e402c55 100755
--- a/t/t1420-lost-found.sh
+++ b/third_party/git/t/t1420-lost-found.sh
diff --git a/t/t1430-bad-ref-name.sh b/third_party/git/t/t1430-bad-ref-name.sh
index c7878a60ed..c7878a60ed 100755
--- a/t/t1430-bad-ref-name.sh
+++ b/third_party/git/t/t1430-bad-ref-name.sh
diff --git a/t/t1450-fsck.sh b/third_party/git/t/t1450-fsck.sh
index b36e0528d0..b36e0528d0 100755
--- a/t/t1450-fsck.sh
+++ b/third_party/git/t/t1450-fsck.sh
diff --git a/t/t1500-rev-parse.sh b/third_party/git/t/t1500-rev-parse.sh
index 01abee533d..01abee533d 100755
--- a/t/t1500-rev-parse.sh
+++ b/third_party/git/t/t1500-rev-parse.sh
diff --git a/t/t1501-work-tree.sh b/third_party/git/t/t1501-work-tree.sh
index 3498d3d55e..3498d3d55e 100755
--- a/t/t1501-work-tree.sh
+++ b/third_party/git/t/t1501-work-tree.sh
diff --git a/t/t1502-rev-parse-parseopt.sh b/third_party/git/t/t1502-rev-parse-parseopt.sh
index a859abedf5..a859abedf5 100755
--- a/t/t1502-rev-parse-parseopt.sh
+++ b/third_party/git/t/t1502-rev-parse-parseopt.sh
diff --git a/t/t1503-rev-parse-verify.sh b/third_party/git/t/t1503-rev-parse-verify.sh
index 492edffa9c..492edffa9c 100755
--- a/t/t1503-rev-parse-verify.sh
+++ b/third_party/git/t/t1503-rev-parse-verify.sh
diff --git a/t/t1504-ceiling-dirs.sh b/third_party/git/t/t1504-ceiling-dirs.sh
index 3d51615e42..3d51615e42 100755
--- a/t/t1504-ceiling-dirs.sh
+++ b/third_party/git/t/t1504-ceiling-dirs.sh
diff --git a/t/t1505-rev-parse-last.sh b/third_party/git/t/t1505-rev-parse-last.sh
index 4969edb314..4969edb314 100755
--- a/t/t1505-rev-parse-last.sh
+++ b/third_party/git/t/t1505-rev-parse-last.sh
diff --git a/t/t1506-rev-parse-diagnosis.sh b/third_party/git/t/t1506-rev-parse-diagnosis.sh
index 4ee009da66..4ee009da66 100755
--- a/t/t1506-rev-parse-diagnosis.sh
+++ b/third_party/git/t/t1506-rev-parse-diagnosis.sh
diff --git a/t/t1507-rev-parse-upstream.sh b/third_party/git/t/t1507-rev-parse-upstream.sh
index fa3e499641..fa3e499641 100755
--- a/t/t1507-rev-parse-upstream.sh
+++ b/third_party/git/t/t1507-rev-parse-upstream.sh
diff --git a/t/t1508-at-combinations.sh b/third_party/git/t/t1508-at-combinations.sh
index 4a9964e9dc..4a9964e9dc 100755
--- a/t/t1508-at-combinations.sh
+++ b/third_party/git/t/t1508-at-combinations.sh
diff --git a/t/t1509-root-work-tree.sh b/third_party/git/t/t1509-root-work-tree.sh
index 553a3f601b..553a3f601b 100755
--- a/t/t1509-root-work-tree.sh
+++ b/third_party/git/t/t1509-root-work-tree.sh
diff --git a/t/t1509/excludes b/third_party/git/t/t1509/excludes
index d4d21d31a9..d4d21d31a9 100644
--- a/t/t1509/excludes
+++ b/third_party/git/t/t1509/excludes
diff --git a/t/t1509/prepare-chroot.sh b/third_party/git/t/t1509/prepare-chroot.sh
index 6d47e2c725..6d47e2c725 100755
--- a/t/t1509/prepare-chroot.sh
+++ b/third_party/git/t/t1509/prepare-chroot.sh
diff --git a/t/t1510-repo-setup.sh b/third_party/git/t/t1510-repo-setup.sh
index 9974457f56..9974457f56 100755
--- a/t/t1510-repo-setup.sh
+++ b/third_party/git/t/t1510-repo-setup.sh
diff --git a/t/t1511-rev-parse-caret.sh b/third_party/git/t/t1511-rev-parse-caret.sh
index e0a49a651f..e0a49a651f 100755
--- a/t/t1511-rev-parse-caret.sh
+++ b/third_party/git/t/t1511-rev-parse-caret.sh
diff --git a/t/t1512-rev-parse-disambiguation.sh b/third_party/git/t/t1512-rev-parse-disambiguation.sh
index c19fb500cb..c19fb500cb 100755
--- a/t/t1512-rev-parse-disambiguation.sh
+++ b/third_party/git/t/t1512-rev-parse-disambiguation.sh
diff --git a/t/t1513-rev-parse-prefix.sh b/third_party/git/t/t1513-rev-parse-prefix.sh
index 87ec3ae714..87ec3ae714 100755
--- a/t/t1513-rev-parse-prefix.sh
+++ b/third_party/git/t/t1513-rev-parse-prefix.sh
diff --git a/t/t1514-rev-parse-push.sh b/third_party/git/t/t1514-rev-parse-push.sh
index 788cc91e45..788cc91e45 100755
--- a/t/t1514-rev-parse-push.sh
+++ b/third_party/git/t/t1514-rev-parse-push.sh
diff --git a/t/t1515-rev-parse-outside-repo.sh b/third_party/git/t/t1515-rev-parse-outside-repo.sh
index 3ec2971ee5..3ec2971ee5 100755
--- a/t/t1515-rev-parse-outside-repo.sh
+++ b/third_party/git/t/t1515-rev-parse-outside-repo.sh
diff --git a/t/t1600-index.sh b/third_party/git/t/t1600-index.sh
index 42962ed7d4..42962ed7d4 100755
--- a/t/t1600-index.sh
+++ b/third_party/git/t/t1600-index.sh
diff --git a/t/t1601-index-bogus.sh b/third_party/git/t/t1601-index-bogus.sh
index 4171f1e141..4171f1e141 100755
--- a/t/t1601-index-bogus.sh
+++ b/third_party/git/t/t1601-index-bogus.sh
diff --git a/t/t1700-split-index.sh b/third_party/git/t/t1700-split-index.sh
index 12a5568844..12a5568844 100755
--- a/t/t1700-split-index.sh
+++ b/third_party/git/t/t1700-split-index.sh
diff --git a/t/t1701-racy-split-index.sh b/third_party/git/t/t1701-racy-split-index.sh
index 5dc221ef38..5dc221ef38 100755
--- a/t/t1701-racy-split-index.sh
+++ b/third_party/git/t/t1701-racy-split-index.sh
diff --git a/t/t2000-conflict-when-checking-files-out.sh b/third_party/git/t/t2000-conflict-when-checking-files-out.sh
index f18616ad2b..f18616ad2b 100755
--- a/t/t2000-conflict-when-checking-files-out.sh
+++ b/third_party/git/t/t2000-conflict-when-checking-files-out.sh
diff --git a/t/t2002-checkout-cache-u.sh b/third_party/git/t/t2002-checkout-cache-u.sh
index 70361c806e..70361c806e 100755
--- a/t/t2002-checkout-cache-u.sh
+++ b/third_party/git/t/t2002-checkout-cache-u.sh
diff --git a/t/t2003-checkout-cache-mkdir.sh b/third_party/git/t/t2003-checkout-cache-mkdir.sh
index ff163cf675..ff163cf675 100755
--- a/t/t2003-checkout-cache-mkdir.sh
+++ b/third_party/git/t/t2003-checkout-cache-mkdir.sh
diff --git a/t/t2004-checkout-cache-temp.sh b/third_party/git/t/t2004-checkout-cache-temp.sh
index a12afe93f3..a12afe93f3 100755
--- a/t/t2004-checkout-cache-temp.sh
+++ b/third_party/git/t/t2004-checkout-cache-temp.sh
diff --git a/t/t2005-checkout-index-symlinks.sh b/third_party/git/t/t2005-checkout-index-symlinks.sh
index 9fa5610474..9fa5610474 100755
--- a/t/t2005-checkout-index-symlinks.sh
+++ b/third_party/git/t/t2005-checkout-index-symlinks.sh
diff --git a/t/t2006-checkout-index-basic.sh b/third_party/git/t/t2006-checkout-index-basic.sh
index 57cbdfe9bc..57cbdfe9bc 100755
--- a/t/t2006-checkout-index-basic.sh
+++ b/third_party/git/t/t2006-checkout-index-basic.sh
diff --git a/t/t2007-checkout-symlink.sh b/third_party/git/t/t2007-checkout-symlink.sh
index fc9aad530e..fc9aad530e 100755
--- a/t/t2007-checkout-symlink.sh
+++ b/third_party/git/t/t2007-checkout-symlink.sh
diff --git a/t/t2008-checkout-subdir.sh b/third_party/git/t/t2008-checkout-subdir.sh
index eadb9434ae..eadb9434ae 100755
--- a/t/t2008-checkout-subdir.sh
+++ b/third_party/git/t/t2008-checkout-subdir.sh
diff --git a/t/t2009-checkout-statinfo.sh b/third_party/git/t/t2009-checkout-statinfo.sh
index f3c2152087..f3c2152087 100755
--- a/t/t2009-checkout-statinfo.sh
+++ b/third_party/git/t/t2009-checkout-statinfo.sh
diff --git a/t/t2010-checkout-ambiguous.sh b/third_party/git/t/t2010-checkout-ambiguous.sh
index 2e47fe01cf..2e47fe01cf 100755
--- a/t/t2010-checkout-ambiguous.sh
+++ b/third_party/git/t/t2010-checkout-ambiguous.sh
diff --git a/t/t2011-checkout-invalid-head.sh b/third_party/git/t/t2011-checkout-invalid-head.sh
index 0e8d56aa76..0e8d56aa76 100755
--- a/t/t2011-checkout-invalid-head.sh
+++ b/third_party/git/t/t2011-checkout-invalid-head.sh
diff --git a/t/t2012-checkout-last.sh b/third_party/git/t/t2012-checkout-last.sh
index e7ba8c505f..e7ba8c505f 100755
--- a/t/t2012-checkout-last.sh
+++ b/third_party/git/t/t2012-checkout-last.sh
diff --git a/t/t2013-checkout-submodule.sh b/third_party/git/t/t2013-checkout-submodule.sh
index 8f86b5f4b2..8f86b5f4b2 100755
--- a/t/t2013-checkout-submodule.sh
+++ b/third_party/git/t/t2013-checkout-submodule.sh
diff --git a/t/t2014-checkout-switch.sh b/third_party/git/t/t2014-checkout-switch.sh
index ccfb147113..ccfb147113 100755
--- a/t/t2014-checkout-switch.sh
+++ b/third_party/git/t/t2014-checkout-switch.sh
diff --git a/t/t2015-checkout-unborn.sh b/third_party/git/t/t2015-checkout-unborn.sh
index 37bdcedcc9..37bdcedcc9 100755
--- a/t/t2015-checkout-unborn.sh
+++ b/third_party/git/t/t2015-checkout-unborn.sh
diff --git a/t/t2016-checkout-patch.sh b/third_party/git/t/t2016-checkout-patch.sh
index 47aeb0b167..47aeb0b167 100755
--- a/t/t2016-checkout-patch.sh
+++ b/third_party/git/t/t2016-checkout-patch.sh
diff --git a/t/t2017-checkout-orphan.sh b/third_party/git/t/t2017-checkout-orphan.sh
index 655f278c5f..655f278c5f 100755
--- a/t/t2017-checkout-orphan.sh
+++ b/third_party/git/t/t2017-checkout-orphan.sh
diff --git a/t/t2018-checkout-branch.sh b/third_party/git/t/t2018-checkout-branch.sh
index 822381dd9d..822381dd9d 100755
--- a/t/t2018-checkout-branch.sh
+++ b/third_party/git/t/t2018-checkout-branch.sh
diff --git a/t/t2019-checkout-ambiguous-ref.sh b/third_party/git/t/t2019-checkout-ambiguous-ref.sh
index b99d5192a9..b99d5192a9 100755
--- a/t/t2019-checkout-ambiguous-ref.sh
+++ b/third_party/git/t/t2019-checkout-ambiguous-ref.sh
diff --git a/t/t2020-checkout-detach.sh b/third_party/git/t/t2020-checkout-detach.sh
index b748db9946..b748db9946 100755
--- a/t/t2020-checkout-detach.sh
+++ b/third_party/git/t/t2020-checkout-detach.sh
diff --git a/t/t2021-checkout-overwrite.sh b/third_party/git/t/t2021-checkout-overwrite.sh
index c2ada7de37..c2ada7de37 100755
--- a/t/t2021-checkout-overwrite.sh
+++ b/third_party/git/t/t2021-checkout-overwrite.sh
diff --git a/t/t2022-checkout-paths.sh b/third_party/git/t/t2022-checkout-paths.sh
index fc3eb43b89..fc3eb43b89 100755
--- a/t/t2022-checkout-paths.sh
+++ b/third_party/git/t/t2022-checkout-paths.sh
diff --git a/t/t2023-checkout-m.sh b/third_party/git/t/t2023-checkout-m.sh
index fca3f85824..fca3f85824 100755
--- a/t/t2023-checkout-m.sh
+++ b/third_party/git/t/t2023-checkout-m.sh
diff --git a/t/t2024-checkout-dwim.sh b/third_party/git/t/t2024-checkout-dwim.sh
index fa0718c730..fa0718c730 100755
--- a/t/t2024-checkout-dwim.sh
+++ b/third_party/git/t/t2024-checkout-dwim.sh
diff --git a/t/t2025-checkout-no-overlay.sh b/third_party/git/t/t2025-checkout-no-overlay.sh
index 76330cb5ab..76330cb5ab 100755
--- a/t/t2025-checkout-no-overlay.sh
+++ b/third_party/git/t/t2025-checkout-no-overlay.sh
diff --git a/t/t2030-unresolve-info.sh b/third_party/git/t/t2030-unresolve-info.sh
index 309199bca2..309199bca2 100755
--- a/t/t2030-unresolve-info.sh
+++ b/third_party/git/t/t2030-unresolve-info.sh
diff --git a/t/t2050-git-dir-relative.sh b/third_party/git/t/t2050-git-dir-relative.sh
index 21f4659a9d..21f4659a9d 100755
--- a/t/t2050-git-dir-relative.sh
+++ b/third_party/git/t/t2050-git-dir-relative.sh
diff --git a/t/t2060-switch.sh b/third_party/git/t/t2060-switch.sh
index f9efa29dfb..f9efa29dfb 100755
--- a/t/t2060-switch.sh
+++ b/third_party/git/t/t2060-switch.sh
diff --git a/t/t2070-restore.sh b/third_party/git/t/t2070-restore.sh
index 2650df1966..2650df1966 100755
--- a/t/t2070-restore.sh
+++ b/third_party/git/t/t2070-restore.sh
diff --git a/t/t2071-restore-patch.sh b/third_party/git/t/t2071-restore-patch.sh
index 98b2476e7c..98b2476e7c 100755
--- a/t/t2071-restore-patch.sh
+++ b/third_party/git/t/t2071-restore-patch.sh
diff --git a/t/t2100-update-cache-badpath.sh b/third_party/git/t/t2100-update-cache-badpath.sh
index 2df3fdde8b..2df3fdde8b 100755
--- a/t/t2100-update-cache-badpath.sh
+++ b/third_party/git/t/t2100-update-cache-badpath.sh
diff --git a/t/t2101-update-index-reupdate.sh b/third_party/git/t/t2101-update-index-reupdate.sh
index 6c32d42c8c..6c32d42c8c 100755
--- a/t/t2101-update-index-reupdate.sh
+++ b/third_party/git/t/t2101-update-index-reupdate.sh
diff --git a/t/t2102-update-index-symlinks.sh b/third_party/git/t/t2102-update-index-symlinks.sh
index 22f2c730ae..22f2c730ae 100755
--- a/t/t2102-update-index-symlinks.sh
+++ b/third_party/git/t/t2102-update-index-symlinks.sh
diff --git a/t/t2103-update-index-ignore-missing.sh b/third_party/git/t/t2103-update-index-ignore-missing.sh
index 0114f05228..0114f05228 100755
--- a/t/t2103-update-index-ignore-missing.sh
+++ b/third_party/git/t/t2103-update-index-ignore-missing.sh
diff --git a/t/t2104-update-index-skip-worktree.sh b/third_party/git/t/t2104-update-index-skip-worktree.sh
index 7e2e7dd4ae..7e2e7dd4ae 100755
--- a/t/t2104-update-index-skip-worktree.sh
+++ b/third_party/git/t/t2104-update-index-skip-worktree.sh
diff --git a/t/t2105-update-index-gitfile.sh b/third_party/git/t/t2105-update-index-gitfile.sh
index a7f3d47aec..a7f3d47aec 100755
--- a/t/t2105-update-index-gitfile.sh
+++ b/third_party/git/t/t2105-update-index-gitfile.sh
diff --git a/t/t2106-update-index-assume-unchanged.sh b/third_party/git/t/t2106-update-index-assume-unchanged.sh
index 99d858c6b7..99d858c6b7 100755
--- a/t/t2106-update-index-assume-unchanged.sh
+++ b/third_party/git/t/t2106-update-index-assume-unchanged.sh
diff --git a/t/t2107-update-index-basic.sh b/third_party/git/t/t2107-update-index-basic.sh
index 2242cd098e..2242cd098e 100755
--- a/t/t2107-update-index-basic.sh
+++ b/third_party/git/t/t2107-update-index-basic.sh
diff --git a/t/t2200-add-update.sh b/third_party/git/t/t2200-add-update.sh
index f764b7e3f5..f764b7e3f5 100755
--- a/t/t2200-add-update.sh
+++ b/third_party/git/t/t2200-add-update.sh
diff --git a/t/t2201-add-update-typechange.sh b/third_party/git/t/t2201-add-update-typechange.sh
index a4eec0a346..a4eec0a346 100755
--- a/t/t2201-add-update-typechange.sh
+++ b/third_party/git/t/t2201-add-update-typechange.sh
diff --git a/t/t2202-add-addremove.sh b/third_party/git/t/t2202-add-addremove.sh
index 9ee659098c..9ee659098c 100755
--- a/t/t2202-add-addremove.sh
+++ b/third_party/git/t/t2202-add-addremove.sh
diff --git a/t/t2203-add-intent.sh b/third_party/git/t/t2203-add-intent.sh
index 5bbe8dcce4..5bbe8dcce4 100755
--- a/t/t2203-add-intent.sh
+++ b/third_party/git/t/t2203-add-intent.sh
diff --git a/t/t2204-add-ignored.sh b/third_party/git/t/t2204-add-ignored.sh
index 2e07365bbb..2e07365bbb 100755
--- a/t/t2204-add-ignored.sh
+++ b/third_party/git/t/t2204-add-ignored.sh
diff --git a/t/t2300-cd-to-toplevel.sh b/third_party/git/t/t2300-cd-to-toplevel.sh
index c8de6d8a19..c8de6d8a19 100755
--- a/t/t2300-cd-to-toplevel.sh
+++ b/third_party/git/t/t2300-cd-to-toplevel.sh
diff --git a/t/t2400-worktree-add.sh b/third_party/git/t/t2400-worktree-add.sh
index e819ba741e..e819ba741e 100755
--- a/t/t2400-worktree-add.sh
+++ b/third_party/git/t/t2400-worktree-add.sh
diff --git a/t/t2401-worktree-prune.sh b/third_party/git/t/t2401-worktree-prune.sh
index b7d6d5d45a..b7d6d5d45a 100755
--- a/t/t2401-worktree-prune.sh
+++ b/third_party/git/t/t2401-worktree-prune.sh
diff --git a/t/t2402-worktree-list.sh b/third_party/git/t/t2402-worktree-list.sh
index bb6fb9b12c..bb6fb9b12c 100755
--- a/t/t2402-worktree-list.sh
+++ b/third_party/git/t/t2402-worktree-list.sh
diff --git a/t/t2403-worktree-move.sh b/third_party/git/t/t2403-worktree-move.sh
index 939d18d728..939d18d728 100755
--- a/t/t2403-worktree-move.sh
+++ b/third_party/git/t/t2403-worktree-move.sh
diff --git a/t/t2404-worktree-config.sh b/third_party/git/t/t2404-worktree-config.sh
index 286121d8de..286121d8de 100755
--- a/t/t2404-worktree-config.sh
+++ b/third_party/git/t/t2404-worktree-config.sh
diff --git a/t/t3000-ls-files-others.sh b/third_party/git/t/t3000-ls-files-others.sh
index 0aefadacb0..0aefadacb0 100755
--- a/t/t3000-ls-files-others.sh
+++ b/third_party/git/t/t3000-ls-files-others.sh
diff --git a/t/t3001-ls-files-others-exclude.sh b/third_party/git/t/t3001-ls-files-others-exclude.sh
index 1ec7cb57c7..1ec7cb57c7 100755
--- a/t/t3001-ls-files-others-exclude.sh
+++ b/third_party/git/t/t3001-ls-files-others-exclude.sh
diff --git a/t/t3002-ls-files-dashpath.sh b/third_party/git/t/t3002-ls-files-dashpath.sh
index 8704b04e1b..8704b04e1b 100755
--- a/t/t3002-ls-files-dashpath.sh
+++ b/third_party/git/t/t3002-ls-files-dashpath.sh
diff --git a/t/t3003-ls-files-exclude.sh b/third_party/git/t/t3003-ls-files-exclude.sh
index d5ec333131..d5ec333131 100755
--- a/t/t3003-ls-files-exclude.sh
+++ b/third_party/git/t/t3003-ls-files-exclude.sh
diff --git a/t/t3004-ls-files-basic.sh b/third_party/git/t/t3004-ls-files-basic.sh
index 9fd5a1f188..9fd5a1f188 100755
--- a/t/t3004-ls-files-basic.sh
+++ b/third_party/git/t/t3004-ls-files-basic.sh
diff --git a/t/t3005-ls-files-relative.sh b/third_party/git/t/t3005-ls-files-relative.sh
index 209b4c7cd8..209b4c7cd8 100755
--- a/t/t3005-ls-files-relative.sh
+++ b/third_party/git/t/t3005-ls-files-relative.sh
diff --git a/t/t3006-ls-files-long.sh b/third_party/git/t/t3006-ls-files-long.sh
index e109c3fbfb..e109c3fbfb 100755
--- a/t/t3006-ls-files-long.sh
+++ b/third_party/git/t/t3006-ls-files-long.sh
diff --git a/t/t3007-ls-files-recurse-submodules.sh b/third_party/git/t/t3007-ls-files-recurse-submodules.sh
index 318b5bce7e..318b5bce7e 100755
--- a/t/t3007-ls-files-recurse-submodules.sh
+++ b/third_party/git/t/t3007-ls-files-recurse-submodules.sh
diff --git a/t/t3008-ls-files-lazy-init-name-hash.sh b/third_party/git/t/t3008-ls-files-lazy-init-name-hash.sh
index 64f047332b..64f047332b 100755
--- a/t/t3008-ls-files-lazy-init-name-hash.sh
+++ b/third_party/git/t/t3008-ls-files-lazy-init-name-hash.sh
diff --git a/t/t3009-ls-files-others-nonsubmodule.sh b/third_party/git/t/t3009-ls-files-others-nonsubmodule.sh
index 963f3462b7..963f3462b7 100755
--- a/t/t3009-ls-files-others-nonsubmodule.sh
+++ b/third_party/git/t/t3009-ls-files-others-nonsubmodule.sh
diff --git a/t/t3010-ls-files-killed-modified.sh b/third_party/git/t/t3010-ls-files-killed-modified.sh
index 580e158f99..580e158f99 100755
--- a/t/t3010-ls-files-killed-modified.sh
+++ b/third_party/git/t/t3010-ls-files-killed-modified.sh
diff --git a/t/t3020-ls-files-error-unmatch.sh b/third_party/git/t/t3020-ls-files-error-unmatch.sh
index 124e73b8e6..124e73b8e6 100755
--- a/t/t3020-ls-files-error-unmatch.sh
+++ b/third_party/git/t/t3020-ls-files-error-unmatch.sh
diff --git a/t/t3030-merge-recursive.sh b/third_party/git/t/t3030-merge-recursive.sh
index ff641b348a..ff641b348a 100755
--- a/t/t3030-merge-recursive.sh
+++ b/third_party/git/t/t3030-merge-recursive.sh
diff --git a/t/t3031-merge-criscross.sh b/third_party/git/t/t3031-merge-criscross.sh
index 3824756a02..3824756a02 100755
--- a/t/t3031-merge-criscross.sh
+++ b/third_party/git/t/t3031-merge-criscross.sh
diff --git a/t/t3032-merge-recursive-space-options.sh b/third_party/git/t/t3032-merge-recursive-space-options.sh
index b56180ee4a..b56180ee4a 100755
--- a/t/t3032-merge-recursive-space-options.sh
+++ b/third_party/git/t/t3032-merge-recursive-space-options.sh
diff --git a/t/t3033-merge-toplevel.sh b/third_party/git/t/t3033-merge-toplevel.sh
index d314599428..d314599428 100755
--- a/t/t3033-merge-toplevel.sh
+++ b/third_party/git/t/t3033-merge-toplevel.sh
diff --git a/t/t3034-merge-recursive-rename-options.sh b/third_party/git/t/t3034-merge-recursive-rename-options.sh
index 3d9fae68c4..3d9fae68c4 100755
--- a/t/t3034-merge-recursive-rename-options.sh
+++ b/third_party/git/t/t3034-merge-recursive-rename-options.sh
diff --git a/t/t3035-merge-sparse.sh b/third_party/git/t/t3035-merge-sparse.sh
index c4b4a94324..c4b4a94324 100755
--- a/t/t3035-merge-sparse.sh
+++ b/third_party/git/t/t3035-merge-sparse.sh
diff --git a/t/t3040-subprojects-basic.sh b/third_party/git/t/t3040-subprojects-basic.sh
index b81eb5fd6f..b81eb5fd6f 100755
--- a/t/t3040-subprojects-basic.sh
+++ b/third_party/git/t/t3040-subprojects-basic.sh
diff --git a/t/t3050-subprojects-fetch.sh b/third_party/git/t/t3050-subprojects-fetch.sh
index f1f09abdd9..f1f09abdd9 100755
--- a/t/t3050-subprojects-fetch.sh
+++ b/third_party/git/t/t3050-subprojects-fetch.sh
diff --git a/t/t3060-ls-files-with-tree.sh b/third_party/git/t/t3060-ls-files-with-tree.sh
index 44f378ce41..44f378ce41 100755
--- a/t/t3060-ls-files-with-tree.sh
+++ b/third_party/git/t/t3060-ls-files-with-tree.sh
diff --git a/t/t3070-wildmatch.sh b/third_party/git/t/t3070-wildmatch.sh
index 891d4d7cb9..891d4d7cb9 100755
--- a/t/t3070-wildmatch.sh
+++ b/third_party/git/t/t3070-wildmatch.sh
diff --git a/t/t3100-ls-tree-restrict.sh b/third_party/git/t/t3100-ls-tree-restrict.sh
index 18baf49a49..18baf49a49 100755
--- a/t/t3100-ls-tree-restrict.sh
+++ b/third_party/git/t/t3100-ls-tree-restrict.sh
diff --git a/t/t3101-ls-tree-dirname.sh b/third_party/git/t/t3101-ls-tree-dirname.sh
index 12bf31022a..12bf31022a 100755
--- a/t/t3101-ls-tree-dirname.sh
+++ b/third_party/git/t/t3101-ls-tree-dirname.sh
diff --git a/t/t3102-ls-tree-wildcards.sh b/third_party/git/t/t3102-ls-tree-wildcards.sh
index 1e16c6b8ea..1e16c6b8ea 100755
--- a/t/t3102-ls-tree-wildcards.sh
+++ b/third_party/git/t/t3102-ls-tree-wildcards.sh
diff --git a/t/t3103-ls-tree-misc.sh b/third_party/git/t/t3103-ls-tree-misc.sh
index 14520913af..14520913af 100755
--- a/t/t3103-ls-tree-misc.sh
+++ b/third_party/git/t/t3103-ls-tree-misc.sh
diff --git a/t/t3200-branch.sh b/third_party/git/t/t3200-branch.sh
index 411a70b0ce..411a70b0ce 100755
--- a/t/t3200-branch.sh
+++ b/third_party/git/t/t3200-branch.sh
diff --git a/t/t3201-branch-contains.sh b/third_party/git/t/t3201-branch-contains.sh
index 0ea4fc4694..0ea4fc4694 100755
--- a/t/t3201-branch-contains.sh
+++ b/third_party/git/t/t3201-branch-contains.sh
diff --git a/t/t3202-show-branch-octopus.sh b/third_party/git/t/t3202-show-branch-octopus.sh
index 6adf47869c..6adf47869c 100755
--- a/t/t3202-show-branch-octopus.sh
+++ b/third_party/git/t/t3202-show-branch-octopus.sh
diff --git a/t/t3203-branch-output.sh b/third_party/git/t/t3203-branch-output.sh
index 71818b90f0..71818b90f0 100755
--- a/t/t3203-branch-output.sh
+++ b/third_party/git/t/t3203-branch-output.sh
diff --git a/t/t3204-branch-name-interpretation.sh b/third_party/git/t/t3204-branch-name-interpretation.sh
index 698d9cc4f3..698d9cc4f3 100755
--- a/t/t3204-branch-name-interpretation.sh
+++ b/third_party/git/t/t3204-branch-name-interpretation.sh
diff --git a/t/t3205-branch-color.sh b/third_party/git/t/t3205-branch-color.sh
index 4f1e16bb44..4f1e16bb44 100755
--- a/t/t3205-branch-color.sh
+++ b/third_party/git/t/t3205-branch-color.sh
diff --git a/t/t3206-range-diff.sh b/third_party/git/t/t3206-range-diff.sh
index ec548654ce..ec548654ce 100755
--- a/t/t3206-range-diff.sh
+++ b/third_party/git/t/t3206-range-diff.sh
diff --git a/t/t3206/history.export b/third_party/git/t/t3206/history.export
index 7bb3814962..7bb3814962 100644
--- a/t/t3206/history.export
+++ b/third_party/git/t/t3206/history.export
diff --git a/t/t3210-pack-refs.sh b/third_party/git/t/t3210-pack-refs.sh
index 9ea5fa4fd2..9ea5fa4fd2 100755
--- a/t/t3210-pack-refs.sh
+++ b/third_party/git/t/t3210-pack-refs.sh
diff --git a/t/t3211-peel-ref.sh b/third_party/git/t/t3211-peel-ref.sh
index 3b7caca421..3b7caca421 100755
--- a/t/t3211-peel-ref.sh
+++ b/third_party/git/t/t3211-peel-ref.sh
diff --git a/t/t3300-funny-names.sh b/third_party/git/t/t3300-funny-names.sh
index 04de03cad0..04de03cad0 100755
--- a/t/t3300-funny-names.sh
+++ b/third_party/git/t/t3300-funny-names.sh
diff --git a/t/t3301-notes.sh b/third_party/git/t/t3301-notes.sh
index 704bbc6541..704bbc6541 100755
--- a/t/t3301-notes.sh
+++ b/third_party/git/t/t3301-notes.sh
diff --git a/t/t3302-notes-index-expensive.sh b/third_party/git/t/t3302-notes-index-expensive.sh
index 7217c5e222..7217c5e222 100755
--- a/t/t3302-notes-index-expensive.sh
+++ b/third_party/git/t/t3302-notes-index-expensive.sh
diff --git a/t/t3303-notes-subtrees.sh b/third_party/git/t/t3303-notes-subtrees.sh
index 704aee81ef..704aee81ef 100755
--- a/t/t3303-notes-subtrees.sh
+++ b/third_party/git/t/t3303-notes-subtrees.sh
diff --git a/t/t3304-notes-mixed.sh b/third_party/git/t/t3304-notes-mixed.sh
index 1709e8c00b..1709e8c00b 100755
--- a/t/t3304-notes-mixed.sh
+++ b/third_party/git/t/t3304-notes-mixed.sh
diff --git a/t/t3305-notes-fanout.sh b/third_party/git/t/t3305-notes-fanout.sh
index 54460beec4..54460beec4 100755
--- a/t/t3305-notes-fanout.sh
+++ b/third_party/git/t/t3305-notes-fanout.sh
diff --git a/t/t3306-notes-prune.sh b/third_party/git/t/t3306-notes-prune.sh
index 61748088eb..61748088eb 100755
--- a/t/t3306-notes-prune.sh
+++ b/third_party/git/t/t3306-notes-prune.sh
diff --git a/t/t3307-notes-man.sh b/third_party/git/t/t3307-notes-man.sh
index 1aa366a410..1aa366a410 100755
--- a/t/t3307-notes-man.sh
+++ b/third_party/git/t/t3307-notes-man.sh
diff --git a/t/t3308-notes-merge.sh b/third_party/git/t/t3308-notes-merge.sh
index d60588ec8f..d60588ec8f 100755
--- a/t/t3308-notes-merge.sh
+++ b/third_party/git/t/t3308-notes-merge.sh
diff --git a/t/t3309-notes-merge-auto-resolve.sh b/third_party/git/t/t3309-notes-merge-auto-resolve.sh
index 14c2adf970..14c2adf970 100755
--- a/t/t3309-notes-merge-auto-resolve.sh
+++ b/third_party/git/t/t3309-notes-merge-auto-resolve.sh
diff --git a/t/t3310-notes-merge-manual-resolve.sh b/third_party/git/t/t3310-notes-merge-manual-resolve.sh
index 2dea846e25..2dea846e25 100755
--- a/t/t3310-notes-merge-manual-resolve.sh
+++ b/third_party/git/t/t3310-notes-merge-manual-resolve.sh
diff --git a/t/t3311-notes-merge-fanout.sh b/third_party/git/t/t3311-notes-merge-fanout.sh
index 37151a3adc..37151a3adc 100755
--- a/t/t3311-notes-merge-fanout.sh
+++ b/third_party/git/t/t3311-notes-merge-fanout.sh
diff --git a/t/t3320-notes-merge-worktrees.sh b/third_party/git/t/t3320-notes-merge-worktrees.sh
index 823fdbda1f..823fdbda1f 100755
--- a/t/t3320-notes-merge-worktrees.sh
+++ b/third_party/git/t/t3320-notes-merge-worktrees.sh
diff --git a/t/t3400-rebase.sh b/third_party/git/t/t3400-rebase.sh
index 80b23fd326..80b23fd326 100755
--- a/t/t3400-rebase.sh
+++ b/third_party/git/t/t3400-rebase.sh
diff --git a/t/t3401-rebase-and-am-rename.sh b/third_party/git/t/t3401-rebase-and-am-rename.sh
index a0b9438b22..a0b9438b22 100755
--- a/t/t3401-rebase-and-am-rename.sh
+++ b/third_party/git/t/t3401-rebase-and-am-rename.sh
diff --git a/t/t3402-rebase-merge.sh b/third_party/git/t/t3402-rebase-merge.sh
index a1ec501a87..a1ec501a87 100755
--- a/t/t3402-rebase-merge.sh
+++ b/third_party/git/t/t3402-rebase-merge.sh
diff --git a/t/t3403-rebase-skip.sh b/third_party/git/t/t3403-rebase-skip.sh
index 1f5122b632..1f5122b632 100755
--- a/t/t3403-rebase-skip.sh
+++ b/third_party/git/t/t3403-rebase-skip.sh
diff --git a/t/t3404-rebase-interactive.sh b/third_party/git/t/t3404-rebase-interactive.sh
index 461dd539ff..461dd539ff 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/third_party/git/t/t3404-rebase-interactive.sh
diff --git a/t/t3405-rebase-malformed.sh b/third_party/git/t/t3405-rebase-malformed.sh
index 860e63e444..860e63e444 100755
--- a/t/t3405-rebase-malformed.sh
+++ b/third_party/git/t/t3405-rebase-malformed.sh
diff --git a/t/t3406-rebase-message.sh b/third_party/git/t/t3406-rebase-message.sh
index b393e1e9fe..b393e1e9fe 100755
--- a/t/t3406-rebase-message.sh
+++ b/third_party/git/t/t3406-rebase-message.sh
diff --git a/t/t3407-rebase-abort.sh b/third_party/git/t/t3407-rebase-abort.sh
index 910f218284..910f218284 100755
--- a/t/t3407-rebase-abort.sh
+++ b/third_party/git/t/t3407-rebase-abort.sh
diff --git a/t/t3408-rebase-multi-line.sh b/third_party/git/t/t3408-rebase-multi-line.sh
index d2bd7c17b0..d2bd7c17b0 100755
--- a/t/t3408-rebase-multi-line.sh
+++ b/third_party/git/t/t3408-rebase-multi-line.sh
diff --git a/t/t3409-rebase-preserve-merges.sh b/third_party/git/t/t3409-rebase-preserve-merges.sh
index 3b340f1ece..3b340f1ece 100755
--- a/t/t3409-rebase-preserve-merges.sh
+++ b/third_party/git/t/t3409-rebase-preserve-merges.sh
diff --git a/t/t3410-rebase-preserve-dropped-merges.sh b/third_party/git/t/t3410-rebase-preserve-dropped-merges.sh
index 2e29866993..2e29866993 100755
--- a/t/t3410-rebase-preserve-dropped-merges.sh
+++ b/third_party/git/t/t3410-rebase-preserve-dropped-merges.sh
diff --git a/t/t3411-rebase-preserve-around-merges.sh b/third_party/git/t/t3411-rebase-preserve-around-merges.sh
index fb45e7bf7b..fb45e7bf7b 100755
--- a/t/t3411-rebase-preserve-around-merges.sh
+++ b/third_party/git/t/t3411-rebase-preserve-around-merges.sh
diff --git a/t/t3412-rebase-root.sh b/third_party/git/t/t3412-rebase-root.sh
index 21632a984e..21632a984e 100755
--- a/t/t3412-rebase-root.sh
+++ b/third_party/git/t/t3412-rebase-root.sh
diff --git a/t/t3413-rebase-hook.sh b/third_party/git/t/t3413-rebase-hook.sh
index b6833e9a5f..b6833e9a5f 100755
--- a/t/t3413-rebase-hook.sh
+++ b/third_party/git/t/t3413-rebase-hook.sh
diff --git a/t/t3414-rebase-preserve-onto.sh b/third_party/git/t/t3414-rebase-preserve-onto.sh
index 72e04b5386..72e04b5386 100755
--- a/t/t3414-rebase-preserve-onto.sh
+++ b/third_party/git/t/t3414-rebase-preserve-onto.sh
diff --git a/t/t3415-rebase-autosquash.sh b/third_party/git/t/t3415-rebase-autosquash.sh
index 22d218698e..22d218698e 100755
--- a/t/t3415-rebase-autosquash.sh
+++ b/third_party/git/t/t3415-rebase-autosquash.sh
diff --git a/t/t3416-rebase-onto-threedots.sh b/third_party/git/t/t3416-rebase-onto-threedots.sh
index ddf2f64853..ddf2f64853 100755
--- a/t/t3416-rebase-onto-threedots.sh
+++ b/third_party/git/t/t3416-rebase-onto-threedots.sh
diff --git a/t/t3417-rebase-whitespace-fix.sh b/third_party/git/t/t3417-rebase-whitespace-fix.sh
index e85cdc7037..e85cdc7037 100755
--- a/t/t3417-rebase-whitespace-fix.sh
+++ b/third_party/git/t/t3417-rebase-whitespace-fix.sh
diff --git a/t/t3418-rebase-continue.sh b/third_party/git/t/t3418-rebase-continue.sh
index 4eff14dae5..4eff14dae5 100755
--- a/t/t3418-rebase-continue.sh
+++ b/third_party/git/t/t3418-rebase-continue.sh
diff --git a/t/t3419-rebase-patch-id.sh b/third_party/git/t/t3419-rebase-patch-id.sh
index 49f548cdb9..49f548cdb9 100755
--- a/t/t3419-rebase-patch-id.sh
+++ b/third_party/git/t/t3419-rebase-patch-id.sh
diff --git a/t/t3420-rebase-autostash.sh b/third_party/git/t/t3420-rebase-autostash.sh
index b8f4d03467..b8f4d03467 100755
--- a/t/t3420-rebase-autostash.sh
+++ b/third_party/git/t/t3420-rebase-autostash.sh
diff --git a/t/t3421-rebase-topology-linear.sh b/third_party/git/t/t3421-rebase-topology-linear.sh
index 7274dca40b..7274dca40b 100755
--- a/t/t3421-rebase-topology-linear.sh
+++ b/third_party/git/t/t3421-rebase-topology-linear.sh
diff --git a/t/t3422-rebase-incompatible-options.sh b/third_party/git/t/t3422-rebase-incompatible-options.sh
index a5868ea152..a5868ea152 100755
--- a/t/t3422-rebase-incompatible-options.sh
+++ b/third_party/git/t/t3422-rebase-incompatible-options.sh
diff --git a/t/t3423-rebase-reword.sh b/third_party/git/t/t3423-rebase-reword.sh
index 6963750794..6963750794 100755
--- a/t/t3423-rebase-reword.sh
+++ b/third_party/git/t/t3423-rebase-reword.sh
diff --git a/t/t3425-rebase-topology-merges.sh b/third_party/git/t/t3425-rebase-topology-merges.sh
index fd8efe84fe..fd8efe84fe 100755
--- a/t/t3425-rebase-topology-merges.sh
+++ b/third_party/git/t/t3425-rebase-topology-merges.sh
diff --git a/t/t3426-rebase-submodule.sh b/third_party/git/t/t3426-rebase-submodule.sh
index a2bba04ba9..a2bba04ba9 100755
--- a/t/t3426-rebase-submodule.sh
+++ b/third_party/git/t/t3426-rebase-submodule.sh
diff --git a/t/t3427-rebase-subtree.sh b/third_party/git/t/t3427-rebase-subtree.sh
index d8640522a0..d8640522a0 100755
--- a/t/t3427-rebase-subtree.sh
+++ b/third_party/git/t/t3427-rebase-subtree.sh
diff --git a/t/t3428-rebase-signoff.sh b/third_party/git/t/t3428-rebase-signoff.sh
index f6993b7e14..f6993b7e14 100755
--- a/t/t3428-rebase-signoff.sh
+++ b/third_party/git/t/t3428-rebase-signoff.sh
diff --git a/t/t3429-rebase-edit-todo.sh b/third_party/git/t/t3429-rebase-edit-todo.sh
index 76f6d306ea..76f6d306ea 100755
--- a/t/t3429-rebase-edit-todo.sh
+++ b/third_party/git/t/t3429-rebase-edit-todo.sh
diff --git a/t/t3430-rebase-merges.sh b/third_party/git/t/t3430-rebase-merges.sh
index 7b6c4847ad..7b6c4847ad 100755
--- a/t/t3430-rebase-merges.sh
+++ b/third_party/git/t/t3430-rebase-merges.sh
diff --git a/t/t3500-cherry.sh b/third_party/git/t/t3500-cherry.sh
index f038f34b7c..f038f34b7c 100755
--- a/t/t3500-cherry.sh
+++ b/third_party/git/t/t3500-cherry.sh
diff --git a/t/t3501-revert-cherry-pick.sh b/third_party/git/t/t3501-revert-cherry-pick.sh
index d1c68af8c5..d1c68af8c5 100755
--- a/t/t3501-revert-cherry-pick.sh
+++ b/third_party/git/t/t3501-revert-cherry-pick.sh
diff --git a/t/t3502-cherry-pick-merge.sh b/third_party/git/t/t3502-cherry-pick-merge.sh
index 8b635a196d..8b635a196d 100755
--- a/t/t3502-cherry-pick-merge.sh
+++ b/third_party/git/t/t3502-cherry-pick-merge.sh
diff --git a/t/t3503-cherry-pick-root.sh b/third_party/git/t/t3503-cherry-pick-root.sh
index e27f39d1e5..e27f39d1e5 100755
--- a/t/t3503-cherry-pick-root.sh
+++ b/third_party/git/t/t3503-cherry-pick-root.sh
diff --git a/t/t3504-cherry-pick-rerere.sh b/third_party/git/t/t3504-cherry-pick-rerere.sh
index a267b2d144..a267b2d144 100755
--- a/t/t3504-cherry-pick-rerere.sh
+++ b/third_party/git/t/t3504-cherry-pick-rerere.sh
diff --git a/t/t3505-cherry-pick-empty.sh b/third_party/git/t/t3505-cherry-pick-empty.sh
index 5f911bb529..5f911bb529 100755
--- a/t/t3505-cherry-pick-empty.sh
+++ b/third_party/git/t/t3505-cherry-pick-empty.sh
diff --git a/t/t3506-cherry-pick-ff.sh b/third_party/git/t/t3506-cherry-pick-ff.sh
index 127dd0082f..127dd0082f 100755
--- a/t/t3506-cherry-pick-ff.sh
+++ b/third_party/git/t/t3506-cherry-pick-ff.sh
diff --git a/t/t3507-cherry-pick-conflict.sh b/third_party/git/t/t3507-cherry-pick-conflict.sh
index 9b9b4ca8d4..9b9b4ca8d4 100755
--- a/t/t3507-cherry-pick-conflict.sh
+++ b/third_party/git/t/t3507-cherry-pick-conflict.sh
diff --git a/t/t3508-cherry-pick-many-commits.sh b/third_party/git/t/t3508-cherry-pick-many-commits.sh
index b457333e18..b457333e18 100755
--- a/t/t3508-cherry-pick-many-commits.sh
+++ b/third_party/git/t/t3508-cherry-pick-many-commits.sh
diff --git a/t/t3509-cherry-pick-merge-df.sh b/third_party/git/t/t3509-cherry-pick-merge-df.sh
index 1e5b3948df..1e5b3948df 100755
--- a/t/t3509-cherry-pick-merge-df.sh
+++ b/third_party/git/t/t3509-cherry-pick-merge-df.sh
diff --git a/t/t3510-cherry-pick-sequence.sh b/third_party/git/t/t3510-cherry-pick-sequence.sh
index 793bcc7fe3..793bcc7fe3 100755
--- a/t/t3510-cherry-pick-sequence.sh
+++ b/third_party/git/t/t3510-cherry-pick-sequence.sh
diff --git a/t/t3511-cherry-pick-x.sh b/third_party/git/t/t3511-cherry-pick-x.sh
index 84a587daf3..84a587daf3 100755
--- a/t/t3511-cherry-pick-x.sh
+++ b/third_party/git/t/t3511-cherry-pick-x.sh
diff --git a/t/t3512-cherry-pick-submodule.sh b/third_party/git/t/t3512-cherry-pick-submodule.sh
index bd78287841..bd78287841 100755
--- a/t/t3512-cherry-pick-submodule.sh
+++ b/third_party/git/t/t3512-cherry-pick-submodule.sh
diff --git a/t/t3513-revert-submodule.sh b/third_party/git/t/t3513-revert-submodule.sh
index 5e39fcdb66..5e39fcdb66 100755
--- a/t/t3513-revert-submodule.sh
+++ b/third_party/git/t/t3513-revert-submodule.sh
diff --git a/t/t3600-rm.sh b/third_party/git/t/t3600-rm.sh
index 66282a720e..66282a720e 100755
--- a/t/t3600-rm.sh
+++ b/third_party/git/t/t3600-rm.sh
diff --git a/t/t3700-add.sh b/third_party/git/t/t3700-add.sh
index c325167b90..c325167b90 100755
--- a/t/t3700-add.sh
+++ b/third_party/git/t/t3700-add.sh
diff --git a/t/t3701-add-interactive.sh b/third_party/git/t/t3701-add-interactive.sh
index 69991a3168..69991a3168 100755
--- a/t/t3701-add-interactive.sh
+++ b/third_party/git/t/t3701-add-interactive.sh
diff --git a/t/t3702-add-edit.sh b/third_party/git/t/t3702-add-edit.sh
index 6c676645d8..6c676645d8 100755
--- a/t/t3702-add-edit.sh
+++ b/third_party/git/t/t3702-add-edit.sh
diff --git a/t/t3703-add-magic-pathspec.sh b/third_party/git/t/t3703-add-magic-pathspec.sh
index 3ef525a559..3ef525a559 100755
--- a/t/t3703-add-magic-pathspec.sh
+++ b/third_party/git/t/t3703-add-magic-pathspec.sh
diff --git a/t/t3800-mktag.sh b/third_party/git/t/t3800-mktag.sh
index 8eb47942e2..8eb47942e2 100755
--- a/t/t3800-mktag.sh
+++ b/third_party/git/t/t3800-mktag.sh
diff --git a/t/t3900-i18n-commit.sh b/third_party/git/t/t3900-i18n-commit.sh
index b92ff95977..b92ff95977 100755
--- a/t/t3900-i18n-commit.sh
+++ b/third_party/git/t/t3900-i18n-commit.sh
diff --git a/t/t3900/1-UTF-8.txt b/third_party/git/t/t3900/1-UTF-8.txt
index ee31e19738..ee31e19738 100644
--- a/t/t3900/1-UTF-8.txt
+++ b/third_party/git/t/t3900/1-UTF-8.txt
diff --git a/t/t3900/2-UTF-8.txt b/third_party/git/t/t3900/2-UTF-8.txt
index 63f4f8f121..63f4f8f121 100644
--- a/t/t3900/2-UTF-8.txt
+++ b/third_party/git/t/t3900/2-UTF-8.txt
diff --git a/t/t3900/ISO-2022-JP.txt b/third_party/git/t/t3900/ISO-2022-JP.txt
index 74b533042f..74b533042f 100644
--- a/t/t3900/ISO-2022-JP.txt
+++ b/third_party/git/t/t3900/ISO-2022-JP.txt
diff --git a/t/t3900/ISO8859-1.txt b/third_party/git/t/t3900/ISO8859-1.txt
index 7cbef0ee6f..7cbef0ee6f 100644
--- a/t/t3900/ISO8859-1.txt
+++ b/third_party/git/t/t3900/ISO8859-1.txt
diff --git a/t/t3900/UTF-16.txt b/third_party/git/t/t3900/UTF-16.txt
index 2257f05a99..2257f05a99 100644
--- a/t/t3900/UTF-16.txt
+++ b/third_party/git/t/t3900/UTF-16.txt
Binary files differdiff --git a/t/t3900/eucJP.txt b/third_party/git/t/t3900/eucJP.txt
index 546f2aac01..546f2aac01 100644
--- a/t/t3900/eucJP.txt
+++ b/third_party/git/t/t3900/eucJP.txt
diff --git a/t/t3901-i18n-patch.sh b/third_party/git/t/t3901-i18n-patch.sh
index 923eb01f0e..923eb01f0e 100755
--- a/t/t3901-i18n-patch.sh
+++ b/third_party/git/t/t3901-i18n-patch.sh
diff --git a/t/t3901/8859-1.txt b/third_party/git/t/t3901/8859-1.txt
index 38c21a6a7f..38c21a6a7f 100755
--- a/t/t3901/8859-1.txt
+++ b/third_party/git/t/t3901/8859-1.txt
diff --git a/t/t3901/utf8.txt b/third_party/git/t/t3901/utf8.txt
index 5f5205cd02..5f5205cd02 100755
--- a/t/t3901/utf8.txt
+++ b/third_party/git/t/t3901/utf8.txt
diff --git a/t/t3902-quoted.sh b/third_party/git/t/t3902-quoted.sh
index f528008c36..f528008c36 100755
--- a/t/t3902-quoted.sh
+++ b/third_party/git/t/t3902-quoted.sh
diff --git a/t/t3903-stash.sh b/third_party/git/t/t3903-stash.sh
index b8e337893f..b8e337893f 100755
--- a/t/t3903-stash.sh
+++ b/third_party/git/t/t3903-stash.sh
diff --git a/t/t3904-stash-patch.sh b/third_party/git/t/t3904-stash-patch.sh
index 9546b6f8a4..9546b6f8a4 100755
--- a/t/t3904-stash-patch.sh
+++ b/third_party/git/t/t3904-stash-patch.sh
diff --git a/t/t3905-stash-include-untracked.sh b/third_party/git/t/t3905-stash-include-untracked.sh
index 29ca76f2fb..29ca76f2fb 100755
--- a/t/t3905-stash-include-untracked.sh
+++ b/third_party/git/t/t3905-stash-include-untracked.sh
diff --git a/t/t3906-stash-submodule.sh b/third_party/git/t/t3906-stash-submodule.sh
index d7219d6f8f..d7219d6f8f 100755
--- a/t/t3906-stash-submodule.sh
+++ b/third_party/git/t/t3906-stash-submodule.sh
diff --git a/t/t3907-stash-show-config.sh b/third_party/git/t/t3907-stash-show-config.sh
index 10914bba7b..10914bba7b 100755
--- a/t/t3907-stash-show-config.sh
+++ b/third_party/git/t/t3907-stash-show-config.sh
diff --git a/t/t3910-mac-os-precompose.sh b/third_party/git/t/t3910-mac-os-precompose.sh
index 54ce19e353..54ce19e353 100755
--- a/t/t3910-mac-os-precompose.sh
+++ b/third_party/git/t/t3910-mac-os-precompose.sh
diff --git a/t/t4000-diff-format.sh b/third_party/git/t/t4000-diff-format.sh
index 8de36b7d12..8de36b7d12 100755
--- a/t/t4000-diff-format.sh
+++ b/third_party/git/t/t4000-diff-format.sh
diff --git a/t/t4001-diff-rename.sh b/third_party/git/t/t4001-diff-rename.sh
index c16486a9d4..c16486a9d4 100755
--- a/t/t4001-diff-rename.sh
+++ b/third_party/git/t/t4001-diff-rename.sh
diff --git a/t/t4002-diff-basic.sh b/third_party/git/t/t4002-diff-basic.sh
index 3a6c21e825..3a6c21e825 100755
--- a/t/t4002-diff-basic.sh
+++ b/third_party/git/t/t4002-diff-basic.sh
diff --git a/t/t4003-diff-rename-1.sh b/third_party/git/t/t4003-diff-rename-1.sh
index df2accb655..df2accb655 100755
--- a/t/t4003-diff-rename-1.sh
+++ b/third_party/git/t/t4003-diff-rename-1.sh
diff --git a/t/t4004-diff-rename-symlink.sh b/third_party/git/t/t4004-diff-rename-symlink.sh
index 6e562c80d1..6e562c80d1 100755
--- a/t/t4004-diff-rename-symlink.sh
+++ b/third_party/git/t/t4004-diff-rename-symlink.sh
diff --git a/t/t4005-diff-rename-2.sh b/third_party/git/t/t4005-diff-rename-2.sh
index f542d2929d..f542d2929d 100755
--- a/t/t4005-diff-rename-2.sh
+++ b/third_party/git/t/t4005-diff-rename-2.sh
diff --git a/t/t4006-diff-mode.sh b/third_party/git/t/t4006-diff-mode.sh
index 03489aff14..03489aff14 100755
--- a/t/t4006-diff-mode.sh
+++ b/third_party/git/t/t4006-diff-mode.sh
diff --git a/t/t4007-rename-3.sh b/third_party/git/t/t4007-rename-3.sh
index b187b7f6c6..b187b7f6c6 100755
--- a/t/t4007-rename-3.sh
+++ b/third_party/git/t/t4007-rename-3.sh
diff --git a/t/t4008-diff-break-rewrite.sh b/third_party/git/t/t4008-diff-break-rewrite.sh
index b1ccd4102e..b1ccd4102e 100755
--- a/t/t4008-diff-break-rewrite.sh
+++ b/third_party/git/t/t4008-diff-break-rewrite.sh
diff --git a/t/t4009-diff-rename-4.sh b/third_party/git/t/t4009-diff-rename-4.sh
index 3641fd84d6..3641fd84d6 100755
--- a/t/t4009-diff-rename-4.sh
+++ b/third_party/git/t/t4009-diff-rename-4.sh
diff --git a/t/t4010-diff-pathspec.sh b/third_party/git/t/t4010-diff-pathspec.sh
index 281f8fad0c..281f8fad0c 100755
--- a/t/t4010-diff-pathspec.sh
+++ b/third_party/git/t/t4010-diff-pathspec.sh
diff --git a/t/t4011-diff-symlink.sh b/third_party/git/t/t4011-diff-symlink.sh
index 5ae19b987d..5ae19b987d 100755
--- a/t/t4011-diff-symlink.sh
+++ b/third_party/git/t/t4011-diff-symlink.sh
diff --git a/t/t4012-diff-binary.sh b/third_party/git/t/t4012-diff-binary.sh
index 6579c81216..6579c81216 100755
--- a/t/t4012-diff-binary.sh
+++ b/third_party/git/t/t4012-diff-binary.sh
diff --git a/t/t4013-diff-various.sh b/third_party/git/t/t4013-diff-various.sh
index a9054d2db1..a9054d2db1 100755
--- a/t/t4013-diff-various.sh
+++ b/third_party/git/t/t4013-diff-various.sh
diff --git a/t/t4013/diff.config_format.subjectprefix_DIFFERENT_PREFIX b/third_party/git/t/t4013/diff.config_format.subjectprefix_DIFFERENT_PREFIX
index 78f8970e2b..78f8970e2b 100644
--- a/t/t4013/diff.config_format.subjectprefix_DIFFERENT_PREFIX
+++ b/third_party/git/t/t4013/diff.config_format.subjectprefix_DIFFERENT_PREFIX
diff --git a/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_master b/third_party/git/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_master
index 9951e3677d..9951e3677d 100644
--- a/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_master
+++ b/third_party/git/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_master
diff --git a/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_side b/third_party/git/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_side
index cec33fa3f0..cec33fa3f0 100644
--- a/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_side
+++ b/third_party/git/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_side
diff --git a/t/t4013/diff.diff-tree_--cc_--patch-with-stat_master b/third_party/git/t/t4013/diff.diff-tree_--cc_--patch-with-stat_master
index db3c0a7b2c..db3c0a7b2c 100644
--- a/t/t4013/diff.diff-tree_--cc_--patch-with-stat_master
+++ b/third_party/git/t/t4013/diff.diff-tree_--cc_--patch-with-stat_master
diff --git a/t/t4013/diff.diff-tree_--cc_--shortstat_master b/third_party/git/t/t4013/diff.diff-tree_--cc_--shortstat_master
index a4ca42df2a..a4ca42df2a 100644
--- a/t/t4013/diff.diff-tree_--cc_--shortstat_master
+++ b/third_party/git/t/t4013/diff.diff-tree_--cc_--shortstat_master
diff --git a/t/t4013/diff.diff-tree_--cc_--stat_--summary_master b/third_party/git/t/t4013/diff.diff-tree_--cc_--stat_--summary_master
index d019867dd9..d019867dd9 100644
--- a/t/t4013/diff.diff-tree_--cc_--stat_--summary_master
+++ b/third_party/git/t/t4013/diff.diff-tree_--cc_--stat_--summary_master
diff --git a/t/t4013/diff.diff-tree_--cc_--stat_--summary_side b/third_party/git/t/t4013/diff.diff-tree_--cc_--stat_--summary_side
index 12b2eee17e..12b2eee17e 100644
--- a/t/t4013/diff.diff-tree_--cc_--stat_--summary_side
+++ b/third_party/git/t/t4013/diff.diff-tree_--cc_--stat_--summary_side
diff --git a/t/t4013/diff.diff-tree_--cc_--stat_master b/third_party/git/t/t4013/diff.diff-tree_--cc_--stat_master
index 40b91796b3..40b91796b3 100644
--- a/t/t4013/diff.diff-tree_--cc_--stat_master
+++ b/third_party/git/t/t4013/diff.diff-tree_--cc_--stat_master
diff --git a/t/t4013/diff.diff-tree_--cc_--summary_REVERSE b/third_party/git/t/t4013/diff.diff-tree_--cc_--summary_REVERSE
index e208dd5682..e208dd5682 100644
--- a/t/t4013/diff.diff-tree_--cc_--summary_REVERSE
+++ b/third_party/git/t/t4013/diff.diff-tree_--cc_--summary_REVERSE
diff --git a/t/t4013/diff.diff-tree_--cc_master b/third_party/git/t/t4013/diff.diff-tree_--cc_master
index 5ecb4e14ae..5ecb4e14ae 100644
--- a/t/t4013/diff.diff-tree_--cc_master
+++ b/third_party/git/t/t4013/diff.diff-tree_--cc_master
diff --git a/t/t4013/diff.diff-tree_--patch-with-raw_initial b/third_party/git/t/t4013/diff.diff-tree_--patch-with-raw_initial
index fc177ab3f2..fc177ab3f2 100644
--- a/t/t4013/diff.diff-tree_--patch-with-raw_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--patch-with-raw_initial
diff --git a/t/t4013/diff.diff-tree_--patch-with-stat_initial b/third_party/git/t/t4013/diff.diff-tree_--patch-with-stat_initial
index bd905b1c57..bd905b1c57 100644
--- a/t/t4013/diff.diff-tree_--patch-with-stat_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--patch-with-stat_initial
diff --git a/t/t4013/diff.diff-tree_--pretty=oneline_--patch-with-raw_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--patch-with-raw_initial
index 7bb8b45e3e..7bb8b45e3e 100644
--- a/t/t4013/diff.diff-tree_--pretty=oneline_--patch-with-raw_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--patch-with-raw_initial
diff --git a/t/t4013/diff.diff-tree_--pretty=oneline_--patch-with-stat_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--patch-with-stat_initial
index cbdde4f400..cbdde4f400 100644
--- a/t/t4013/diff.diff-tree_--pretty=oneline_--patch-with-stat_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--patch-with-stat_initial
diff --git a/t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-raw_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-raw_initial
index cd79f1a0ff..cd79f1a0ff 100644
--- a/t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-raw_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-raw_initial
diff --git a/t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-stat_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-stat_initial
index 817ed06f82..817ed06f82 100644
--- a/t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-stat_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-stat_initial
diff --git a/t/t4013/diff.diff-tree_--pretty=oneline_--root_-p_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--root_-p_initial
index 3c5092c699..3c5092c699 100644
--- a/t/t4013/diff.diff-tree_--pretty=oneline_--root_-p_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--root_-p_initial
diff --git a/t/t4013/diff.diff-tree_--pretty=oneline_--root_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--root_initial
index 08920ac658..08920ac658 100644
--- a/t/t4013/diff.diff-tree_--pretty=oneline_--root_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_--root_initial
diff --git a/t/t4013/diff.diff-tree_--pretty=oneline_-p_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_-p_initial
index 94b76bfef1..94b76bfef1 100644
--- a/t/t4013/diff.diff-tree_--pretty=oneline_-p_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_-p_initial
diff --git a/t/t4013/diff.diff-tree_--pretty=oneline_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_initial
index d50970d574..d50970d574 100644
--- a/t/t4013/diff.diff-tree_--pretty=oneline_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty=oneline_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_--patch-with-raw_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_--patch-with-raw_initial
index 3a85316d8a..3a85316d8a 100644
--- a/t/t4013/diff.diff-tree_--pretty_--patch-with-raw_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--patch-with-raw_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_--patch-with-stat_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_--patch-with-stat_initial
index 2e08239a46..2e08239a46 100644
--- a/t/t4013/diff.diff-tree_--pretty_--patch-with-stat_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--patch-with-stat_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_--patch-with-stat_side b/third_party/git/t/t4013/diff.diff-tree_--pretty_--patch-with-stat_side
index fe3f6b7c7e..fe3f6b7c7e 100644
--- a/t/t4013/diff.diff-tree_--pretty_--patch-with-stat_side
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--patch-with-stat_side
diff --git a/t/t4013/diff.diff-tree_--pretty_--root_--patch-with-raw_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--patch-with-raw_initial
index a3203bd19b..a3203bd19b 100644
--- a/t/t4013/diff.diff-tree_--pretty_--root_--patch-with-raw_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--patch-with-raw_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_--root_--patch-with-stat_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--patch-with-stat_initial
index 06eb77e386..06eb77e386 100644
--- a/t/t4013/diff.diff-tree_--pretty_--root_--patch-with-stat_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--patch-with-stat_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_--root_--stat_--compact-summary_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--stat_--compact-summary_initial
index d6451ff7cc..d6451ff7cc 100644
--- a/t/t4013/diff.diff-tree_--pretty_--root_--stat_--compact-summary_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--stat_--compact-summary_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_--root_--stat_--summary_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--stat_--summary_initial
index 680eab5f27..680eab5f27 100644
--- a/t/t4013/diff.diff-tree_--pretty_--root_--stat_--summary_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--stat_--summary_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_--root_--stat_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--stat_initial
index 9722d1b3a7..9722d1b3a7 100644
--- a/t/t4013/diff.diff-tree_--pretty_--root_--stat_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--stat_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_--root_--summary_-r_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--summary_-r_initial
index ccdaafb377..ccdaafb377 100644
--- a/t/t4013/diff.diff-tree_--pretty_--root_--summary_-r_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--summary_-r_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_--root_--summary_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--summary_initial
index 58e5f74aea..58e5f74aea 100644
--- a/t/t4013/diff.diff-tree_--pretty_--root_--summary_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_--summary_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_--root_-p_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_-p_initial
index d0411f64ec..d0411f64ec 100644
--- a/t/t4013/diff.diff-tree_--pretty_--root_-p_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_-p_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_--root_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_initial
index 94e32eabb1..94e32eabb1 100644
--- a/t/t4013/diff.diff-tree_--pretty_--root_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--root_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_--stat_--summary_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_--stat_--summary_initial
index c22983ac4a..c22983ac4a 100644
--- a/t/t4013/diff.diff-tree_--pretty_--stat_--summary_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--stat_--summary_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_--stat_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_--stat_initial
index 8fdcfb4c0a..8fdcfb4c0a 100644
--- a/t/t4013/diff.diff-tree_--pretty_--stat_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--stat_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_--summary_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_--summary_initial
index 9bc2c4fbad..9bc2c4fbad 100644
--- a/t/t4013/diff.diff-tree_--pretty_--summary_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_--summary_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_-R_--root_--stat_--compact-summary_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_-R_--root_--stat_--compact-summary_initial
index 1989e55cd0..1989e55cd0 100644
--- a/t/t4013/diff.diff-tree_--pretty_-R_--root_--stat_--compact-summary_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_-R_--root_--stat_--compact-summary_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_-p_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_-p_initial
index 3c9942faf4..3c9942faf4 100644
--- a/t/t4013/diff.diff-tree_--pretty_-p_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_-p_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_-p_side b/third_party/git/t/t4013/diff.diff-tree_--pretty_-p_side
index b993aa7b89..b993aa7b89 100644
--- a/t/t4013/diff.diff-tree_--pretty_-p_side
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_-p_side
diff --git a/t/t4013/diff.diff-tree_--pretty_initial b/third_party/git/t/t4013/diff.diff-tree_--pretty_initial
index 14715bf7d0..14715bf7d0 100644
--- a/t/t4013/diff.diff-tree_--pretty_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_initial
diff --git a/t/t4013/diff.diff-tree_--pretty_side b/third_party/git/t/t4013/diff.diff-tree_--pretty_side
index e9b6e1c102..e9b6e1c102 100644
--- a/t/t4013/diff.diff-tree_--pretty_side
+++ b/third_party/git/t/t4013/diff.diff-tree_--pretty_side
diff --git a/t/t4013/diff.diff-tree_--root_--abbrev_initial b/third_party/git/t/t4013/diff.diff-tree_--root_--abbrev_initial
index 5aa84b2a86..5aa84b2a86 100644
--- a/t/t4013/diff.diff-tree_--root_--abbrev_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--root_--abbrev_initial
diff --git a/t/t4013/diff.diff-tree_--root_--patch-with-raw_initial b/third_party/git/t/t4013/diff.diff-tree_--root_--patch-with-raw_initial
index d295e475dd..d295e475dd 100644
--- a/t/t4013/diff.diff-tree_--root_--patch-with-raw_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--root_--patch-with-raw_initial
diff --git a/t/t4013/diff.diff-tree_--root_--patch-with-stat_initial b/third_party/git/t/t4013/diff.diff-tree_--root_--patch-with-stat_initial
index ad69ffe647..ad69ffe647 100644
--- a/t/t4013/diff.diff-tree_--root_--patch-with-stat_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--root_--patch-with-stat_initial
diff --git a/t/t4013/diff.diff-tree_--root_-p_initial b/third_party/git/t/t4013/diff.diff-tree_--root_-p_initial
index 3219c72fcb..3219c72fcb 100644
--- a/t/t4013/diff.diff-tree_--root_-p_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--root_-p_initial
diff --git a/t/t4013/diff.diff-tree_--root_-r_--abbrev=4_initial b/third_party/git/t/t4013/diff.diff-tree_--root_-r_--abbrev=4_initial
index 0c5361688c..0c5361688c 100644
--- a/t/t4013/diff.diff-tree_--root_-r_--abbrev=4_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--root_-r_--abbrev=4_initial
diff --git a/t/t4013/diff.diff-tree_--root_-r_--abbrev_initial b/third_party/git/t/t4013/diff.diff-tree_--root_-r_--abbrev_initial
index c7b460faf6..c7b460faf6 100644
--- a/t/t4013/diff.diff-tree_--root_-r_--abbrev_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--root_-r_--abbrev_initial
diff --git a/t/t4013/diff.diff-tree_--root_-r_initial b/third_party/git/t/t4013/diff.diff-tree_--root_-r_initial
index eed435e175..eed435e175 100644
--- a/t/t4013/diff.diff-tree_--root_-r_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--root_-r_initial
diff --git a/t/t4013/diff.diff-tree_--root_initial b/third_party/git/t/t4013/diff.diff-tree_--root_initial
index ddf6b068ab..ddf6b068ab 100644
--- a/t/t4013/diff.diff-tree_--root_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_--root_initial
diff --git a/t/t4013/diff.diff-tree_--stat_--compact-summary_initial_mode b/third_party/git/t/t4013/diff.diff-tree_--stat_--compact-summary_initial_mode
index 9c7c8f63af..9c7c8f63af 100644
--- a/t/t4013/diff.diff-tree_--stat_--compact-summary_initial_mode
+++ b/third_party/git/t/t4013/diff.diff-tree_--stat_--compact-summary_initial_mode
diff --git a/t/t4013/diff.diff-tree_--stat_initial_mode b/third_party/git/t/t4013/diff.diff-tree_--stat_initial_mode
index 0e5943c2c6..0e5943c2c6 100644
--- a/t/t4013/diff.diff-tree_--stat_initial_mode
+++ b/third_party/git/t/t4013/diff.diff-tree_--stat_initial_mode
diff --git a/t/t4013/diff.diff-tree_--summary_initial_mode b/third_party/git/t/t4013/diff.diff-tree_--summary_initial_mode
index 25846b6af8..25846b6af8 100644
--- a/t/t4013/diff.diff-tree_--summary_initial_mode
+++ b/third_party/git/t/t4013/diff.diff-tree_--summary_initial_mode
diff --git a/t/t4013/diff.diff-tree_-R_--stat_--compact-summary_initial_mode b/third_party/git/t/t4013/diff.diff-tree_-R_--stat_--compact-summary_initial_mode
index e38f3d3bfb..e38f3d3bfb 100644
--- a/t/t4013/diff.diff-tree_-R_--stat_--compact-summary_initial_mode
+++ b/third_party/git/t/t4013/diff.diff-tree_-R_--stat_--compact-summary_initial_mode
diff --git a/t/t4013/diff.diff-tree_-c_--abbrev_master b/third_party/git/t/t4013/diff.diff-tree_-c_--abbrev_master
index b8e4aa2530..b8e4aa2530 100644
--- a/t/t4013/diff.diff-tree_-c_--abbrev_master
+++ b/third_party/git/t/t4013/diff.diff-tree_-c_--abbrev_master
diff --git a/t/t4013/diff.diff-tree_-c_--stat_--summary_master b/third_party/git/t/t4013/diff.diff-tree_-c_--stat_--summary_master
index 81c3021541..81c3021541 100644
--- a/t/t4013/diff.diff-tree_-c_--stat_--summary_master
+++ b/third_party/git/t/t4013/diff.diff-tree_-c_--stat_--summary_master
diff --git a/t/t4013/diff.diff-tree_-c_--stat_--summary_side b/third_party/git/t/t4013/diff.diff-tree_-c_--stat_--summary_side
index e8dc12bfbf..e8dc12bfbf 100644
--- a/t/t4013/diff.diff-tree_-c_--stat_--summary_side
+++ b/third_party/git/t/t4013/diff.diff-tree_-c_--stat_--summary_side
diff --git a/t/t4013/diff.diff-tree_-c_--stat_master b/third_party/git/t/t4013/diff.diff-tree_-c_--stat_master
index 89d59b1548..89d59b1548 100644
--- a/t/t4013/diff.diff-tree_-c_--stat_master
+++ b/third_party/git/t/t4013/diff.diff-tree_-c_--stat_master
diff --git a/t/t4013/diff.diff-tree_-c_master b/third_party/git/t/t4013/diff.diff-tree_-c_master
index e2d2bb2611..e2d2bb2611 100644
--- a/t/t4013/diff.diff-tree_-c_master
+++ b/third_party/git/t/t4013/diff.diff-tree_-c_master
diff --git a/t/t4013/diff.diff-tree_-p_-m_master b/third_party/git/t/t4013/diff.diff-tree_-p_-m_master
index b60bea039d..b60bea039d 100644
--- a/t/t4013/diff.diff-tree_-p_-m_master
+++ b/third_party/git/t/t4013/diff.diff-tree_-p_-m_master
diff --git a/t/t4013/diff.diff-tree_-p_initial b/third_party/git/t/t4013/diff.diff-tree_-p_initial
index e20ce88370..e20ce88370 100644
--- a/t/t4013/diff.diff-tree_-p_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_-p_initial
diff --git a/t/t4013/diff.diff-tree_-p_master b/third_party/git/t/t4013/diff.diff-tree_-p_master
index b182875fb2..b182875fb2 100644
--- a/t/t4013/diff.diff-tree_-p_master
+++ b/third_party/git/t/t4013/diff.diff-tree_-p_master
diff --git a/t/t4013/diff.diff-tree_-r_--abbrev=4_initial b/third_party/git/t/t4013/diff.diff-tree_-r_--abbrev=4_initial
index c5a3aa5aa4..c5a3aa5aa4 100644
--- a/t/t4013/diff.diff-tree_-r_--abbrev=4_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_-r_--abbrev=4_initial
diff --git a/t/t4013/diff.diff-tree_-r_--abbrev_initial b/third_party/git/t/t4013/diff.diff-tree_-r_--abbrev_initial
index 0b689b773c..0b689b773c 100644
--- a/t/t4013/diff.diff-tree_-r_--abbrev_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_-r_--abbrev_initial
diff --git a/t/t4013/diff.diff-tree_-r_initial b/third_party/git/t/t4013/diff.diff-tree_-r_initial
index 1765d83ce4..1765d83ce4 100644
--- a/t/t4013/diff.diff-tree_-r_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_-r_initial
diff --git a/t/t4013/diff.diff-tree_initial b/third_party/git/t/t4013/diff.diff-tree_initial
index b49fc53457..b49fc53457 100644
--- a/t/t4013/diff.diff-tree_initial
+++ b/third_party/git/t/t4013/diff.diff-tree_initial
diff --git a/t/t4013/diff.diff-tree_initial_mode b/third_party/git/t/t4013/diff.diff-tree_initial_mode
index c47c09423e..c47c09423e 100644
--- a/t/t4013/diff.diff-tree_initial_mode
+++ b/third_party/git/t/t4013/diff.diff-tree_initial_mode
diff --git a/t/t4013/diff.diff-tree_master b/third_party/git/t/t4013/diff.diff-tree_master
index fe9226f8a1..fe9226f8a1 100644
--- a/t/t4013/diff.diff-tree_master
+++ b/third_party/git/t/t4013/diff.diff-tree_master
diff --git a/t/t4013/diff.diff_--abbrev_initial..side b/third_party/git/t/t4013/diff.diff_--abbrev_initial..side
index a88e66f817..a88e66f817 100644
--- a/t/t4013/diff.diff_--abbrev_initial..side
+++ b/third_party/git/t/t4013/diff.diff_--abbrev_initial..side
diff --git a/t/t4013/diff.diff_--cached b/third_party/git/t/t4013/diff.diff_--cached
index ff16e83e7c..ff16e83e7c 100644
--- a/t/t4013/diff.diff_--cached
+++ b/third_party/git/t/t4013/diff.diff_--cached
diff --git a/t/t4013/diff.diff_--cached_--_file0 b/third_party/git/t/t4013/diff.diff_--cached_--_file0
index b9bb858a03..b9bb858a03 100644
--- a/t/t4013/diff.diff_--cached_--_file0
+++ b/third_party/git/t/t4013/diff.diff_--cached_--_file0
diff --git a/t/t4013/diff.diff_--dirstat-by-file_initial_rearrange b/third_party/git/t/t4013/diff.diff_--dirstat-by-file_initial_rearrange
index e48e33f678..e48e33f678 100644
--- a/t/t4013/diff.diff_--dirstat-by-file_initial_rearrange
+++ b/third_party/git/t/t4013/diff.diff_--dirstat-by-file_initial_rearrange
diff --git a/t/t4013/diff.diff_--dirstat_--cc_master~1_master b/third_party/git/t/t4013/diff.diff_--dirstat_--cc_master~1_master
index fba4e34175..fba4e34175 100644
--- a/t/t4013/diff.diff_--dirstat_--cc_master~1_master
+++ b/third_party/git/t/t4013/diff.diff_--dirstat_--cc_master~1_master
diff --git a/t/t4013/diff.diff_--dirstat_initial_rearrange b/third_party/git/t/t4013/diff.diff_--dirstat_initial_rearrange
index 5fb02c13bc..5fb02c13bc 100644
--- a/t/t4013/diff.diff_--dirstat_initial_rearrange
+++ b/third_party/git/t/t4013/diff.diff_--dirstat_initial_rearrange
diff --git a/t/t4013/diff.diff_--dirstat_master~1_master~2 b/third_party/git/t/t4013/diff.diff_--dirstat_master~1_master~2
index b672e1ca63..b672e1ca63 100644
--- a/t/t4013/diff.diff_--dirstat_master~1_master~2
+++ b/third_party/git/t/t4013/diff.diff_--dirstat_master~1_master~2
diff --git a/t/t4013/diff.diff_--line-prefix=abc_master_master^_side b/third_party/git/t/t4013/diff.diff_--line-prefix=abc_master_master^_side
index 99f91e7f0e..99f91e7f0e 100644
--- a/t/t4013/diff.diff_--line-prefix=abc_master_master^_side
+++ b/third_party/git/t/t4013/diff.diff_--line-prefix=abc_master_master^_side
diff --git a/t/t4013/diff.diff_--line-prefix_--cached_--_file0 b/third_party/git/t/t4013/diff.diff_--line-prefix_--cached_--_file0
index f41ba4d36a..f41ba4d36a 100644
--- a/t/t4013/diff.diff_--line-prefix_--cached_--_file0
+++ b/third_party/git/t/t4013/diff.diff_--line-prefix_--cached_--_file0
diff --git a/t/t4013/diff.diff_--name-status_dir2_dir b/third_party/git/t/t4013/diff.diff_--name-status_dir2_dir
index d0d96aaa91..d0d96aaa91 100644
--- a/t/t4013/diff.diff_--name-status_dir2_dir
+++ b/third_party/git/t/t4013/diff.diff_--name-status_dir2_dir
diff --git a/t/t4013/diff.diff_--no-index_--name-status_--_dir2_dir b/third_party/git/t/t4013/diff.diff_--no-index_--name-status_--_dir2_dir
index 6756f8de67..6756f8de67 100644
--- a/t/t4013/diff.diff_--no-index_--name-status_--_dir2_dir
+++ b/third_party/git/t/t4013/diff.diff_--no-index_--name-status_--_dir2_dir
diff --git a/t/t4013/diff.diff_--no-index_--name-status_dir2_dir b/third_party/git/t/t4013/diff.diff_--no-index_--name-status_dir2_dir
index 6a47584777..6a47584777 100644
--- a/t/t4013/diff.diff_--no-index_--name-status_dir2_dir
+++ b/third_party/git/t/t4013/diff.diff_--no-index_--name-status_dir2_dir
diff --git a/t/t4013/diff.diff_--no-index_--raw_--abbrev=4_dir2_dir b/third_party/git/t/t4013/diff.diff_--no-index_--raw_--abbrev=4_dir2_dir
index a71b38a833..a71b38a833 100644
--- a/t/t4013/diff.diff_--no-index_--raw_--abbrev=4_dir2_dir
+++ b/third_party/git/t/t4013/diff.diff_--no-index_--raw_--abbrev=4_dir2_dir
diff --git a/t/t4013/diff.diff_--no-index_--raw_--no-abbrev_dir2_dir b/third_party/git/t/t4013/diff.diff_--no-index_--raw_--no-abbrev_dir2_dir
index e0f00977c8..e0f00977c8 100644
--- a/t/t4013/diff.diff_--no-index_--raw_--no-abbrev_dir2_dir
+++ b/third_party/git/t/t4013/diff.diff_--no-index_--raw_--no-abbrev_dir2_dir
diff --git a/t/t4013/diff.diff_--no-index_--raw_dir2_dir b/third_party/git/t/t4013/diff.diff_--no-index_--raw_dir2_dir
index 3cb4ee7a9a..3cb4ee7a9a 100644
--- a/t/t4013/diff.diff_--no-index_--raw_dir2_dir
+++ b/third_party/git/t/t4013/diff.diff_--no-index_--raw_dir2_dir
diff --git a/t/t4013/diff.diff_--no-index_dir_dir3 b/third_party/git/t/t4013/diff.diff_--no-index_dir_dir3
index 2142c2b9ad..2142c2b9ad 100644
--- a/t/t4013/diff.diff_--no-index_dir_dir3
+++ b/third_party/git/t/t4013/diff.diff_--no-index_dir_dir3
diff --git a/t/t4013/diff.diff_--patch-with-raw_-r_initial..side b/third_party/git/t/t4013/diff.diff_--patch-with-raw_-r_initial..side
index 3590dc79a6..3590dc79a6 100644
--- a/t/t4013/diff.diff_--patch-with-raw_-r_initial..side
+++ b/third_party/git/t/t4013/diff.diff_--patch-with-raw_-r_initial..side
diff --git a/t/t4013/diff.diff_--patch-with-raw_initial..side b/third_party/git/t/t4013/diff.diff_--patch-with-raw_initial..side
index b21d5dc6f3..b21d5dc6f3 100644
--- a/t/t4013/diff.diff_--patch-with-raw_initial..side
+++ b/third_party/git/t/t4013/diff.diff_--patch-with-raw_initial..side
diff --git a/t/t4013/diff.diff_--patch-with-stat_-r_initial..side b/third_party/git/t/t4013/diff.diff_--patch-with-stat_-r_initial..side
index be8d1ea1bd..be8d1ea1bd 100644
--- a/t/t4013/diff.diff_--patch-with-stat_-r_initial..side
+++ b/third_party/git/t/t4013/diff.diff_--patch-with-stat_-r_initial..side
diff --git a/t/t4013/diff.diff_--patch-with-stat_initial..side b/third_party/git/t/t4013/diff.diff_--patch-with-stat_initial..side
index 5424e6d566..5424e6d566 100644
--- a/t/t4013/diff.diff_--patch-with-stat_initial..side
+++ b/third_party/git/t/t4013/diff.diff_--patch-with-stat_initial..side
diff --git a/t/t4013/diff.diff_--raw_--abbrev=4_initial b/third_party/git/t/t4013/diff.diff_--raw_--abbrev=4_initial
index c3641db31d..c3641db31d 100644
--- a/t/t4013/diff.diff_--raw_--abbrev=4_initial
+++ b/third_party/git/t/t4013/diff.diff_--raw_--abbrev=4_initial
diff --git a/t/t4013/diff.diff_--raw_--no-abbrev_initial b/third_party/git/t/t4013/diff.diff_--raw_--no-abbrev_initial
index c87a1258e3..c87a1258e3 100644
--- a/t/t4013/diff.diff_--raw_--no-abbrev_initial
+++ b/third_party/git/t/t4013/diff.diff_--raw_--no-abbrev_initial
diff --git a/t/t4013/diff.diff_--raw_initial b/third_party/git/t/t4013/diff.diff_--raw_initial
index a3e978040d..a3e978040d 100644
--- a/t/t4013/diff.diff_--raw_initial
+++ b/third_party/git/t/t4013/diff.diff_--raw_initial
diff --git a/t/t4013/diff.diff_--stat_initial..side b/third_party/git/t/t4013/diff.diff_--stat_initial..side
index b7741e2b83..b7741e2b83 100644
--- a/t/t4013/diff.diff_--stat_initial..side
+++ b/third_party/git/t/t4013/diff.diff_--stat_initial..side
diff --git a/t/t4013/diff.diff_-U1_initial..side b/third_party/git/t/t4013/diff.diff_-U1_initial..side
index b69f8f048a..b69f8f048a 100644
--- a/t/t4013/diff.diff_-U1_initial..side
+++ b/third_party/git/t/t4013/diff.diff_-U1_initial..side
diff --git a/t/t4013/diff.diff_-U2_initial..side b/third_party/git/t/t4013/diff.diff_-U2_initial..side
index 8ffe04f203..8ffe04f203 100644
--- a/t/t4013/diff.diff_-U2_initial..side
+++ b/third_party/git/t/t4013/diff.diff_-U2_initial..side
diff --git a/t/t4013/diff.diff_-U_initial..side b/third_party/git/t/t4013/diff.diff_-U_initial..side
index c66c0dd5c6..c66c0dd5c6 100644
--- a/t/t4013/diff.diff_-U_initial..side
+++ b/third_party/git/t/t4013/diff.diff_-U_initial..side
diff --git a/t/t4013/diff.diff_-r_--stat_initial..side b/third_party/git/t/t4013/diff.diff_-r_--stat_initial..side
index 5d514f55b9..5d514f55b9 100644
--- a/t/t4013/diff.diff_-r_--stat_initial..side
+++ b/third_party/git/t/t4013/diff.diff_-r_--stat_initial..side
diff --git a/t/t4013/diff.diff_-r_initial..side b/third_party/git/t/t4013/diff.diff_-r_initial..side
index 5bb2fe2f28..5bb2fe2f28 100644
--- a/t/t4013/diff.diff_-r_initial..side
+++ b/third_party/git/t/t4013/diff.diff_-r_initial..side
diff --git a/t/t4013/diff.diff_initial..side b/third_party/git/t/t4013/diff.diff_initial..side
index c8adaf5958..c8adaf5958 100644
--- a/t/t4013/diff.diff_initial..side
+++ b/third_party/git/t/t4013/diff.diff_initial..side
diff --git a/t/t4013/diff.diff_master_master^_side b/third_party/git/t/t4013/diff.diff_master_master^_side
index 50ec9cadd6..50ec9cadd6 100644
--- a/t/t4013/diff.diff_master_master^_side
+++ b/third_party/git/t/t4013/diff.diff_master_master^_side
diff --git a/t/t4013/diff.format-patch_--attach_--stdout_--suffix=.diff_initial..side b/third_party/git/t/t4013/diff.format-patch_--attach_--stdout_--suffix=.diff_initial..side
index 547ca065a5..547ca065a5 100644
--- a/t/t4013/diff.format-patch_--attach_--stdout_--suffix=.diff_initial..side
+++ b/third_party/git/t/t4013/diff.format-patch_--attach_--stdout_--suffix=.diff_initial..side
diff --git a/t/t4013/diff.format-patch_--attach_--stdout_initial..master b/third_party/git/t/t4013/diff.format-patch_--attach_--stdout_initial..master
index 52fedc179e..52fedc179e 100644
--- a/t/t4013/diff.format-patch_--attach_--stdout_initial..master
+++ b/third_party/git/t/t4013/diff.format-patch_--attach_--stdout_initial..master
diff --git a/t/t4013/diff.format-patch_--attach_--stdout_initial..master^ b/third_party/git/t/t4013/diff.format-patch_--attach_--stdout_initial..master^
index 1c3cde251b..1c3cde251b 100644
--- a/t/t4013/diff.format-patch_--attach_--stdout_initial..master^
+++ b/third_party/git/t/t4013/diff.format-patch_--attach_--stdout_initial..master^
diff --git a/t/t4013/diff.format-patch_--attach_--stdout_initial..side b/third_party/git/t/t4013/diff.format-patch_--attach_--stdout_initial..side
index 4717bd8313..4717bd8313 100644
--- a/t/t4013/diff.format-patch_--attach_--stdout_initial..side
+++ b/third_party/git/t/t4013/diff.format-patch_--attach_--stdout_initial..side
diff --git a/t/t4013/diff.format-patch_--inline_--stdout_--numbered-files_initial..master b/third_party/git/t/t4013/diff.format-patch_--inline_--stdout_--numbered-files_initial..master
index 02c4db7ec5..02c4db7ec5 100644
--- a/t/t4013/diff.format-patch_--inline_--stdout_--numbered-files_initial..master
+++ b/third_party/git/t/t4013/diff.format-patch_--inline_--stdout_--numbered-files_initial..master
diff --git a/t/t4013/diff.format-patch_--inline_--stdout_--subject-prefix=TESTCASE_initial..master b/third_party/git/t/t4013/diff.format-patch_--inline_--stdout_--subject-prefix=TESTCASE_initial..master
index c7677c5951..c7677c5951 100644
--- a/t/t4013/diff.format-patch_--inline_--stdout_--subject-prefix=TESTCASE_initial..master
+++ b/third_party/git/t/t4013/diff.format-patch_--inline_--stdout_--subject-prefix=TESTCASE_initial..master
diff --git a/t/t4013/diff.format-patch_--inline_--stdout_initial..master b/third_party/git/t/t4013/diff.format-patch_--inline_--stdout_initial..master
index 5b3e34e2c0..5b3e34e2c0 100644
--- a/t/t4013/diff.format-patch_--inline_--stdout_initial..master
+++ b/third_party/git/t/t4013/diff.format-patch_--inline_--stdout_initial..master
diff --git a/t/t4013/diff.format-patch_--inline_--stdout_initial..master^ b/third_party/git/t/t4013/diff.format-patch_--inline_--stdout_initial..master^
index d13f8a8128..d13f8a8128 100644
--- a/t/t4013/diff.format-patch_--inline_--stdout_initial..master^
+++ b/third_party/git/t/t4013/diff.format-patch_--inline_--stdout_initial..master^
diff --git a/t/t4013/diff.format-patch_--inline_--stdout_initial..master^^ b/third_party/git/t/t4013/diff.format-patch_--inline_--stdout_initial..master^^
index caec5537de..caec5537de 100644
--- a/t/t4013/diff.format-patch_--inline_--stdout_initial..master^^
+++ b/third_party/git/t/t4013/diff.format-patch_--inline_--stdout_initial..master^^
diff --git a/t/t4013/diff.format-patch_--inline_--stdout_initial..side b/third_party/git/t/t4013/diff.format-patch_--inline_--stdout_initial..side
index d3a6762130..d3a6762130 100644
--- a/t/t4013/diff.format-patch_--inline_--stdout_initial..side
+++ b/third_party/git/t/t4013/diff.format-patch_--inline_--stdout_initial..side
diff --git a/t/t4013/diff.format-patch_--stdout_--cover-letter_-n_initial..master^ b/third_party/git/t/t4013/diff.format-patch_--stdout_--cover-letter_-n_initial..master^
index 244d964fc6..244d964fc6 100644
--- a/t/t4013/diff.format-patch_--stdout_--cover-letter_-n_initial..master^
+++ b/third_party/git/t/t4013/diff.format-patch_--stdout_--cover-letter_-n_initial..master^
diff --git a/t/t4013/diff.format-patch_--stdout_--no-numbered_initial..master b/third_party/git/t/t4013/diff.format-patch_--stdout_--no-numbered_initial..master
index bfc287a147..bfc287a147 100644
--- a/t/t4013/diff.format-patch_--stdout_--no-numbered_initial..master
+++ b/third_party/git/t/t4013/diff.format-patch_--stdout_--no-numbered_initial..master
diff --git a/t/t4013/diff.format-patch_--stdout_--numbered_initial..master b/third_party/git/t/t4013/diff.format-patch_--stdout_--numbered_initial..master
index 568f6f584e..568f6f584e 100644
--- a/t/t4013/diff.format-patch_--stdout_--numbered_initial..master
+++ b/third_party/git/t/t4013/diff.format-patch_--stdout_--numbered_initial..master
diff --git a/t/t4013/diff.format-patch_--stdout_initial..master b/third_party/git/t/t4013/diff.format-patch_--stdout_initial..master
index 5f0352f9f7..5f0352f9f7 100644
--- a/t/t4013/diff.format-patch_--stdout_initial..master
+++ b/third_party/git/t/t4013/diff.format-patch_--stdout_initial..master
diff --git a/t/t4013/diff.format-patch_--stdout_initial..master^ b/third_party/git/t/t4013/diff.format-patch_--stdout_initial..master^
index 2ae454d807..2ae454d807 100644
--- a/t/t4013/diff.format-patch_--stdout_initial..master^
+++ b/third_party/git/t/t4013/diff.format-patch_--stdout_initial..master^
diff --git a/t/t4013/diff.format-patch_--stdout_initial..side b/third_party/git/t/t4013/diff.format-patch_--stdout_initial..side
index a7d52fbeea..a7d52fbeea 100644
--- a/t/t4013/diff.format-patch_--stdout_initial..side
+++ b/third_party/git/t/t4013/diff.format-patch_--stdout_initial..side
diff --git a/t/t4013/diff.log_--decorate=full_--all b/third_party/git/t/t4013/diff.log_--decorate=full_--all
index 2afe91f116..2afe91f116 100644
--- a/t/t4013/diff.log_--decorate=full_--all
+++ b/third_party/git/t/t4013/diff.log_--decorate=full_--all
diff --git a/t/t4013/diff.log_--decorate_--all b/third_party/git/t/t4013/diff.log_--decorate_--all
index d0f308ab2b..d0f308ab2b 100644
--- a/t/t4013/diff.log_--decorate_--all
+++ b/third_party/git/t/t4013/diff.log_--decorate_--all
diff --git a/t/t4013/diff.log_--patch-with-stat_--summary_master_--_dir_ b/third_party/git/t/t4013/diff.log_--patch-with-stat_--summary_master_--_dir_
index a18f1472a9..a18f1472a9 100644
--- a/t/t4013/diff.log_--patch-with-stat_--summary_master_--_dir_
+++ b/third_party/git/t/t4013/diff.log_--patch-with-stat_--summary_master_--_dir_
diff --git a/t/t4013/diff.log_--patch-with-stat_master b/third_party/git/t/t4013/diff.log_--patch-with-stat_master
index ae425c4672..ae425c4672 100644
--- a/t/t4013/diff.log_--patch-with-stat_master
+++ b/third_party/git/t/t4013/diff.log_--patch-with-stat_master
diff --git a/t/t4013/diff.log_--patch-with-stat_master_--_dir_ b/third_party/git/t/t4013/diff.log_--patch-with-stat_master_--_dir_
index d5207cadf4..d5207cadf4 100644
--- a/t/t4013/diff.log_--patch-with-stat_master_--_dir_
+++ b/third_party/git/t/t4013/diff.log_--patch-with-stat_master_--_dir_
diff --git a/t/t4013/diff.log_--root_--cc_--patch-with-stat_--summary_master b/third_party/git/t/t4013/diff.log_--root_--cc_--patch-with-stat_--summary_master
index 0fc1e8cd71..0fc1e8cd71 100644
--- a/t/t4013/diff.log_--root_--cc_--patch-with-stat_--summary_master
+++ b/third_party/git/t/t4013/diff.log_--root_--cc_--patch-with-stat_--summary_master
diff --git a/t/t4013/diff.log_--root_--patch-with-stat_--summary_master b/third_party/git/t/t4013/diff.log_--root_--patch-with-stat_--summary_master
index dffc09dde9..dffc09dde9 100644
--- a/t/t4013/diff.log_--root_--patch-with-stat_--summary_master
+++ b/third_party/git/t/t4013/diff.log_--root_--patch-with-stat_--summary_master
diff --git a/t/t4013/diff.log_--root_--patch-with-stat_master b/third_party/git/t/t4013/diff.log_--root_--patch-with-stat_master
index 55aa98012d..55aa98012d 100644
--- a/t/t4013/diff.log_--root_--patch-with-stat_master
+++ b/third_party/git/t/t4013/diff.log_--root_--patch-with-stat_master
diff --git a/t/t4013/diff.log_--root_-c_--patch-with-stat_--summary_master b/third_party/git/t/t4013/diff.log_--root_-c_--patch-with-stat_--summary_master
index 019d85f7de..019d85f7de 100644
--- a/t/t4013/diff.log_--root_-c_--patch-with-stat_--summary_master
+++ b/third_party/git/t/t4013/diff.log_--root_-c_--patch-with-stat_--summary_master
diff --git a/t/t4013/diff.log_--root_-p_master b/third_party/git/t/t4013/diff.log_--root_-p_master
index b42c334439..b42c334439 100644
--- a/t/t4013/diff.log_--root_-p_master
+++ b/third_party/git/t/t4013/diff.log_--root_-p_master
diff --git a/t/t4013/diff.log_--root_master b/third_party/git/t/t4013/diff.log_--root_master
index e8f46159da..e8f46159da 100644
--- a/t/t4013/diff.log_--root_master
+++ b/third_party/git/t/t4013/diff.log_--root_master
diff --git a/t/t4013/diff.log_-GF_-p_--pickaxe-all_master b/third_party/git/t/t4013/diff.log_-GF_-p_--pickaxe-all_master
index d36f88098b..d36f88098b 100644
--- a/t/t4013/diff.log_-GF_-p_--pickaxe-all_master
+++ b/third_party/git/t/t4013/diff.log_-GF_-p_--pickaxe-all_master
diff --git a/t/t4013/diff.log_-GF_-p_master b/third_party/git/t/t4013/diff.log_-GF_-p_master
index 9d93f2c23a..9d93f2c23a 100644
--- a/t/t4013/diff.log_-GF_-p_master
+++ b/third_party/git/t/t4013/diff.log_-GF_-p_master
diff --git a/t/t4013/diff.log_-GF_master b/third_party/git/t/t4013/diff.log_-GF_master
index 4c6708d2d0..4c6708d2d0 100644
--- a/t/t4013/diff.log_-GF_master
+++ b/third_party/git/t/t4013/diff.log_-GF_master
diff --git a/t/t4013/diff.log_-SF_-p_master b/third_party/git/t/t4013/diff.log_-SF_-p_master
index 5e32438972..5e32438972 100644
--- a/t/t4013/diff.log_-SF_-p_master
+++ b/third_party/git/t/t4013/diff.log_-SF_-p_master
diff --git a/t/t4013/diff.log_-SF_master b/third_party/git/t/t4013/diff.log_-SF_master
index c1599f2f52..c1599f2f52 100644
--- a/t/t4013/diff.log_-SF_master
+++ b/third_party/git/t/t4013/diff.log_-SF_master
diff --git a/t/t4013/diff.log_-SF_master_--max-count=0 b/third_party/git/t/t4013/diff.log_-SF_master_--max-count=0
index c1fc6c8731..c1fc6c8731 100644
--- a/t/t4013/diff.log_-SF_master_--max-count=0
+++ b/third_party/git/t/t4013/diff.log_-SF_master_--max-count=0
diff --git a/t/t4013/diff.log_-SF_master_--max-count=1 b/third_party/git/t/t4013/diff.log_-SF_master_--max-count=1
index c981a03814..c981a03814 100644
--- a/t/t4013/diff.log_-SF_master_--max-count=1
+++ b/third_party/git/t/t4013/diff.log_-SF_master_--max-count=1
diff --git a/t/t4013/diff.log_-SF_master_--max-count=2 b/third_party/git/t/t4013/diff.log_-SF_master_--max-count=2
index a6c55fd482..a6c55fd482 100644
--- a/t/t4013/diff.log_-SF_master_--max-count=2
+++ b/third_party/git/t/t4013/diff.log_-SF_master_--max-count=2
diff --git a/t/t4013/diff.log_-S_F_master b/third_party/git/t/t4013/diff.log_-S_F_master
index 978d2b4118..978d2b4118 100644
--- a/t/t4013/diff.log_-S_F_master
+++ b/third_party/git/t/t4013/diff.log_-S_F_master
diff --git a/t/t4013/diff.log_-m_-p_--first-parent_master b/third_party/git/t/t4013/diff.log_-m_-p_--first-parent_master
index 7a0073f529..7a0073f529 100644
--- a/t/t4013/diff.log_-m_-p_--first-parent_master
+++ b/third_party/git/t/t4013/diff.log_-m_-p_--first-parent_master
diff --git a/t/t4013/diff.log_-m_-p_master b/third_party/git/t/t4013/diff.log_-m_-p_master
index 9ca62a01ed..9ca62a01ed 100644
--- a/t/t4013/diff.log_-m_-p_master
+++ b/third_party/git/t/t4013/diff.log_-m_-p_master
diff --git a/t/t4013/diff.log_-p_--first-parent_master b/third_party/git/t/t4013/diff.log_-p_--first-parent_master
index 3fc896d424..3fc896d424 100644
--- a/t/t4013/diff.log_-p_--first-parent_master
+++ b/third_party/git/t/t4013/diff.log_-p_--first-parent_master
diff --git a/t/t4013/diff.log_-p_master b/third_party/git/t/t4013/diff.log_-p_master
index bf1326dc36..bf1326dc36 100644
--- a/t/t4013/diff.log_-p_master
+++ b/third_party/git/t/t4013/diff.log_-p_master
diff --git a/t/t4013/diff.log_master b/third_party/git/t/t4013/diff.log_master
index a8f6ce5abd..a8f6ce5abd 100644
--- a/t/t4013/diff.log_master
+++ b/third_party/git/t/t4013/diff.log_master
diff --git a/t/t4013/diff.noellipses-diff-tree_--root_--abbrev_initial b/third_party/git/t/t4013/diff.noellipses-diff-tree_--root_--abbrev_initial
index 4bdad4072e..4bdad4072e 100644
--- a/t/t4013/diff.noellipses-diff-tree_--root_--abbrev_initial
+++ b/third_party/git/t/t4013/diff.noellipses-diff-tree_--root_--abbrev_initial
diff --git a/t/t4013/diff.noellipses-diff-tree_--root_-r_--abbrev=4_initial b/third_party/git/t/t4013/diff.noellipses-diff-tree_--root_-r_--abbrev=4_initial
index 26fbfeb177..26fbfeb177 100644
--- a/t/t4013/diff.noellipses-diff-tree_--root_-r_--abbrev=4_initial
+++ b/third_party/git/t/t4013/diff.noellipses-diff-tree_--root_-r_--abbrev=4_initial
diff --git a/t/t4013/diff.noellipses-diff-tree_--root_-r_--abbrev_initial b/third_party/git/t/t4013/diff.noellipses-diff-tree_--root_-r_--abbrev_initial
index 2ac8561191..2ac8561191 100644
--- a/t/t4013/diff.noellipses-diff-tree_--root_-r_--abbrev_initial
+++ b/third_party/git/t/t4013/diff.noellipses-diff-tree_--root_-r_--abbrev_initial
diff --git a/t/t4013/diff.noellipses-diff-tree_-c_--abbrev_master b/third_party/git/t/t4013/diff.noellipses-diff-tree_-c_--abbrev_master
index bb80f013b3..bb80f013b3 100644
--- a/t/t4013/diff.noellipses-diff-tree_-c_--abbrev_master
+++ b/third_party/git/t/t4013/diff.noellipses-diff-tree_-c_--abbrev_master
diff --git a/t/t4013/diff.noellipses-diff_--no-index_--raw_--abbrev=4_dir2_dir b/third_party/git/t/t4013/diff.noellipses-diff_--no-index_--raw_--abbrev=4_dir2_dir
index 41b7baf0a5..41b7baf0a5 100644
--- a/t/t4013/diff.noellipses-diff_--no-index_--raw_--abbrev=4_dir2_dir
+++ b/third_party/git/t/t4013/diff.noellipses-diff_--no-index_--raw_--abbrev=4_dir2_dir
diff --git a/t/t4013/diff.noellipses-diff_--no-index_--raw_dir2_dir b/third_party/git/t/t4013/diff.noellipses-diff_--no-index_--raw_dir2_dir
index 0cf3a3efea..0cf3a3efea 100644
--- a/t/t4013/diff.noellipses-diff_--no-index_--raw_dir2_dir
+++ b/third_party/git/t/t4013/diff.noellipses-diff_--no-index_--raw_dir2_dir
diff --git a/t/t4013/diff.noellipses-diff_--patch-with-raw_-r_initial..side b/third_party/git/t/t4013/diff.noellipses-diff_--patch-with-raw_-r_initial..side
index 8d1f1e3721..8d1f1e3721 100644
--- a/t/t4013/diff.noellipses-diff_--patch-with-raw_-r_initial..side
+++ b/third_party/git/t/t4013/diff.noellipses-diff_--patch-with-raw_-r_initial..side
diff --git a/t/t4013/diff.noellipses-diff_--patch-with-raw_initial..side b/third_party/git/t/t4013/diff.noellipses-diff_--patch-with-raw_initial..side
index 50d8aee4f7..50d8aee4f7 100644
--- a/t/t4013/diff.noellipses-diff_--patch-with-raw_initial..side
+++ b/third_party/git/t/t4013/diff.noellipses-diff_--patch-with-raw_initial..side
diff --git a/t/t4013/diff.noellipses-diff_--raw_--abbrev=4_initial b/third_party/git/t/t4013/diff.noellipses-diff_--raw_--abbrev=4_initial
index 8ae44d6c83..8ae44d6c83 100644
--- a/t/t4013/diff.noellipses-diff_--raw_--abbrev=4_initial
+++ b/third_party/git/t/t4013/diff.noellipses-diff_--raw_--abbrev=4_initial
diff --git a/t/t4013/diff.noellipses-diff_--raw_initial b/third_party/git/t/t4013/diff.noellipses-diff_--raw_initial
index 0175bfb281..0175bfb281 100644
--- a/t/t4013/diff.noellipses-diff_--raw_initial
+++ b/third_party/git/t/t4013/diff.noellipses-diff_--raw_initial
diff --git a/t/t4013/diff.noellipses-show_--patch-with-raw_side b/third_party/git/t/t4013/diff.noellipses-show_--patch-with-raw_side
index 32fed3d576..32fed3d576 100644
--- a/t/t4013/diff.noellipses-show_--patch-with-raw_side
+++ b/third_party/git/t/t4013/diff.noellipses-show_--patch-with-raw_side
diff --git a/t/t4013/diff.noellipses-whatchanged_--root_master b/third_party/git/t/t4013/diff.noellipses-whatchanged_--root_master
index c2cfd4e729..c2cfd4e729 100644
--- a/t/t4013/diff.noellipses-whatchanged_--root_master
+++ b/third_party/git/t/t4013/diff.noellipses-whatchanged_--root_master
diff --git a/t/t4013/diff.noellipses-whatchanged_-SF_master b/third_party/git/t/t4013/diff.noellipses-whatchanged_-SF_master
index b36ce5886e..b36ce5886e 100644
--- a/t/t4013/diff.noellipses-whatchanged_-SF_master
+++ b/third_party/git/t/t4013/diff.noellipses-whatchanged_-SF_master
diff --git a/t/t4013/diff.noellipses-whatchanged_master b/third_party/git/t/t4013/diff.noellipses-whatchanged_master
index 55e500f2ed..55e500f2ed 100644
--- a/t/t4013/diff.noellipses-whatchanged_master
+++ b/third_party/git/t/t4013/diff.noellipses-whatchanged_master
diff --git a/t/t4013/diff.rev-list_--children_HEAD b/third_party/git/t/t4013/diff.rev-list_--children_HEAD
index e7f17d5aa0..e7f17d5aa0 100644
--- a/t/t4013/diff.rev-list_--children_HEAD
+++ b/third_party/git/t/t4013/diff.rev-list_--children_HEAD
diff --git a/t/t4013/diff.rev-list_--parents_HEAD b/third_party/git/t/t4013/diff.rev-list_--parents_HEAD
index 65d2a80208..65d2a80208 100644
--- a/t/t4013/diff.rev-list_--parents_HEAD
+++ b/third_party/git/t/t4013/diff.rev-list_--parents_HEAD
diff --git a/t/t4013/diff.show_--first-parent_master b/third_party/git/t/t4013/diff.show_--first-parent_master
index 3dcbe473a0..3dcbe473a0 100644
--- a/t/t4013/diff.show_--first-parent_master
+++ b/third_party/git/t/t4013/diff.show_--first-parent_master
diff --git a/t/t4013/diff.show_--patch-with-raw_side b/third_party/git/t/t4013/diff.show_--patch-with-raw_side
index 221b46a7cc..221b46a7cc 100644
--- a/t/t4013/diff.show_--patch-with-raw_side
+++ b/third_party/git/t/t4013/diff.show_--patch-with-raw_side
diff --git a/t/t4013/diff.show_--patch-with-stat_--summary_side b/third_party/git/t/t4013/diff.show_--patch-with-stat_--summary_side
index 95a474ef1d..95a474ef1d 100644
--- a/t/t4013/diff.show_--patch-with-stat_--summary_side
+++ b/third_party/git/t/t4013/diff.show_--patch-with-stat_--summary_side
diff --git a/t/t4013/diff.show_--patch-with-stat_side b/third_party/git/t/t4013/diff.show_--patch-with-stat_side
index 974e99be82..974e99be82 100644
--- a/t/t4013/diff.show_--patch-with-stat_side
+++ b/third_party/git/t/t4013/diff.show_--patch-with-stat_side
diff --git a/t/t4013/diff.show_--root_initial b/third_party/git/t/t4013/diff.show_--root_initial
index 8c89136c4d..8c89136c4d 100644
--- a/t/t4013/diff.show_--root_initial
+++ b/third_party/git/t/t4013/diff.show_--root_initial
diff --git a/t/t4013/diff.show_--stat_--summary_side b/third_party/git/t/t4013/diff.show_--stat_--summary_side
index a71492f9bf..a71492f9bf 100644
--- a/t/t4013/diff.show_--stat_--summary_side
+++ b/third_party/git/t/t4013/diff.show_--stat_--summary_side
diff --git a/t/t4013/diff.show_--stat_side b/third_party/git/t/t4013/diff.show_--stat_side
index 9be712458f..9be712458f 100644
--- a/t/t4013/diff.show_--stat_side
+++ b/third_party/git/t/t4013/diff.show_--stat_side
diff --git a/t/t4013/diff.show_-c_master b/third_party/git/t/t4013/diff.show_-c_master
index 81aba8da96..81aba8da96 100644
--- a/t/t4013/diff.show_-c_master
+++ b/third_party/git/t/t4013/diff.show_-c_master
diff --git a/t/t4013/diff.show_-m_master b/third_party/git/t/t4013/diff.show_-m_master
index 4ea2ee453d..4ea2ee453d 100644
--- a/t/t4013/diff.show_-m_master
+++ b/third_party/git/t/t4013/diff.show_-m_master
diff --git a/t/t4013/diff.show_initial b/third_party/git/t/t4013/diff.show_initial
index 4c4066ae48..4c4066ae48 100644
--- a/t/t4013/diff.show_initial
+++ b/third_party/git/t/t4013/diff.show_initial
diff --git a/t/t4013/diff.show_master b/third_party/git/t/t4013/diff.show_master
index fb08ce0e46..fb08ce0e46 100644
--- a/t/t4013/diff.show_master
+++ b/third_party/git/t/t4013/diff.show_master
diff --git a/t/t4013/diff.show_side b/third_party/git/t/t4013/diff.show_side
index 530a073b19..530a073b19 100644
--- a/t/t4013/diff.show_side
+++ b/third_party/git/t/t4013/diff.show_side
diff --git a/t/t4013/diff.whatchanged_--patch-with-stat_--summary_master_--_dir_ b/third_party/git/t/t4013/diff.whatchanged_--patch-with-stat_--summary_master_--_dir_
index c8b6af2f43..c8b6af2f43 100644
--- a/t/t4013/diff.whatchanged_--patch-with-stat_--summary_master_--_dir_
+++ b/third_party/git/t/t4013/diff.whatchanged_--patch-with-stat_--summary_master_--_dir_
diff --git a/t/t4013/diff.whatchanged_--patch-with-stat_master b/third_party/git/t/t4013/diff.whatchanged_--patch-with-stat_master
index 1ac431ba92..1ac431ba92 100644
--- a/t/t4013/diff.whatchanged_--patch-with-stat_master
+++ b/third_party/git/t/t4013/diff.whatchanged_--patch-with-stat_master
diff --git a/t/t4013/diff.whatchanged_--patch-with-stat_master_--_dir_ b/third_party/git/t/t4013/diff.whatchanged_--patch-with-stat_master_--_dir_
index b30c28588f..b30c28588f 100644
--- a/t/t4013/diff.whatchanged_--patch-with-stat_master_--_dir_
+++ b/third_party/git/t/t4013/diff.whatchanged_--patch-with-stat_master_--_dir_
diff --git a/t/t4013/diff.whatchanged_--root_--cc_--patch-with-stat_--summary_master b/third_party/git/t/t4013/diff.whatchanged_--root_--cc_--patch-with-stat_--summary_master
index 30aae7817b..30aae7817b 100644
--- a/t/t4013/diff.whatchanged_--root_--cc_--patch-with-stat_--summary_master
+++ b/third_party/git/t/t4013/diff.whatchanged_--root_--cc_--patch-with-stat_--summary_master
diff --git a/t/t4013/diff.whatchanged_--root_--patch-with-stat_--summary_master b/third_party/git/t/t4013/diff.whatchanged_--root_--patch-with-stat_--summary_master
index db90e51525..db90e51525 100644
--- a/t/t4013/diff.whatchanged_--root_--patch-with-stat_--summary_master
+++ b/third_party/git/t/t4013/diff.whatchanged_--root_--patch-with-stat_--summary_master
diff --git a/t/t4013/diff.whatchanged_--root_--patch-with-stat_master b/third_party/git/t/t4013/diff.whatchanged_--root_--patch-with-stat_master
index 9a6cc92ce7..9a6cc92ce7 100644
--- a/t/t4013/diff.whatchanged_--root_--patch-with-stat_master
+++ b/third_party/git/t/t4013/diff.whatchanged_--root_--patch-with-stat_master
diff --git a/t/t4013/diff.whatchanged_--root_-c_--patch-with-stat_--summary_master b/third_party/git/t/t4013/diff.whatchanged_--root_-c_--patch-with-stat_--summary_master
index d1d32bd34c..d1d32bd34c 100644
--- a/t/t4013/diff.whatchanged_--root_-c_--patch-with-stat_--summary_master
+++ b/third_party/git/t/t4013/diff.whatchanged_--root_-c_--patch-with-stat_--summary_master
diff --git a/t/t4013/diff.whatchanged_--root_-p_master b/third_party/git/t/t4013/diff.whatchanged_--root_-p_master
index ebf1f0661e..ebf1f0661e 100644
--- a/t/t4013/diff.whatchanged_--root_-p_master
+++ b/third_party/git/t/t4013/diff.whatchanged_--root_-p_master
diff --git a/t/t4013/diff.whatchanged_--root_master b/third_party/git/t/t4013/diff.whatchanged_--root_master
index a405cb6138..a405cb6138 100644
--- a/t/t4013/diff.whatchanged_--root_master
+++ b/third_party/git/t/t4013/diff.whatchanged_--root_master
diff --git a/t/t4013/diff.whatchanged_-SF_-p_master b/third_party/git/t/t4013/diff.whatchanged_-SF_-p_master
index f39da84822..f39da84822 100644
--- a/t/t4013/diff.whatchanged_-SF_-p_master
+++ b/third_party/git/t/t4013/diff.whatchanged_-SF_-p_master
diff --git a/t/t4013/diff.whatchanged_-SF_master b/third_party/git/t/t4013/diff.whatchanged_-SF_master
index 0499321d0e..0499321d0e 100644
--- a/t/t4013/diff.whatchanged_-SF_master
+++ b/third_party/git/t/t4013/diff.whatchanged_-SF_master
diff --git a/t/t4013/diff.whatchanged_-p_master b/third_party/git/t/t4013/diff.whatchanged_-p_master
index f18d43209c..f18d43209c 100644
--- a/t/t4013/diff.whatchanged_-p_master
+++ b/third_party/git/t/t4013/diff.whatchanged_-p_master
diff --git a/t/t4013/diff.whatchanged_master b/third_party/git/t/t4013/diff.whatchanged_master
index cd3bcc2c72..cd3bcc2c72 100644
--- a/t/t4013/diff.whatchanged_master
+++ b/third_party/git/t/t4013/diff.whatchanged_master
diff --git a/t/t4014-format-patch.sh b/third_party/git/t/t4014-format-patch.sh
index ca7debf1d4..ca7debf1d4 100755
--- a/t/t4014-format-patch.sh
+++ b/third_party/git/t/t4014-format-patch.sh
diff --git a/t/t4015-diff-whitespace.sh b/third_party/git/t/t4015-diff-whitespace.sh
index 6b087df3dc..6b087df3dc 100755
--- a/t/t4015-diff-whitespace.sh
+++ b/third_party/git/t/t4015-diff-whitespace.sh
diff --git a/t/t4016-diff-quote.sh b/third_party/git/t/t4016-diff-quote.sh
index 9c48e5c2c9..9c48e5c2c9 100755
--- a/t/t4016-diff-quote.sh
+++ b/third_party/git/t/t4016-diff-quote.sh
diff --git a/t/t4017-diff-retval.sh b/third_party/git/t/t4017-diff-retval.sh
index 95a7ca7070..95a7ca7070 100755
--- a/t/t4017-diff-retval.sh
+++ b/third_party/git/t/t4017-diff-retval.sh
diff --git a/t/t4018-diff-funcname.sh b/third_party/git/t/t4018-diff-funcname.sh
index 9261d6d3a0..9261d6d3a0 100755
--- a/t/t4018-diff-funcname.sh
+++ b/third_party/git/t/t4018-diff-funcname.sh
diff --git a/t/t4018/README b/third_party/git/t/t4018/README
index 283e01cca1..283e01cca1 100644
--- a/t/t4018/README
+++ b/third_party/git/t/t4018/README
diff --git a/t/t4018/cpp-c++-function b/third_party/git/t/t4018/cpp-c++-function
index 9ee6bbef55..9ee6bbef55 100644
--- a/t/t4018/cpp-c++-function
+++ b/third_party/git/t/t4018/cpp-c++-function
diff --git a/t/t4018/cpp-class-constructor b/third_party/git/t/t4018/cpp-class-constructor
index ec4f115c25..ec4f115c25 100644
--- a/t/t4018/cpp-class-constructor
+++ b/third_party/git/t/t4018/cpp-class-constructor
diff --git a/t/t4018/cpp-class-constructor-mem-init b/third_party/git/t/t4018/cpp-class-constructor-mem-init
index 49a69f37e1..49a69f37e1 100644
--- a/t/t4018/cpp-class-constructor-mem-init
+++ b/third_party/git/t/t4018/cpp-class-constructor-mem-init
diff --git a/t/t4018/cpp-class-definition b/third_party/git/t/t4018/cpp-class-definition
index 11b61da3b7..11b61da3b7 100644
--- a/t/t4018/cpp-class-definition
+++ b/third_party/git/t/t4018/cpp-class-definition
diff --git a/t/t4018/cpp-class-definition-derived b/third_party/git/t/t4018/cpp-class-definition-derived
index 3b98cd09ab..3b98cd09ab 100644
--- a/t/t4018/cpp-class-definition-derived
+++ b/third_party/git/t/t4018/cpp-class-definition-derived
diff --git a/t/t4018/cpp-class-destructor b/third_party/git/t/t4018/cpp-class-destructor
index 5487665096..5487665096 100644
--- a/t/t4018/cpp-class-destructor
+++ b/third_party/git/t/t4018/cpp-class-destructor
diff --git a/t/t4018/cpp-function-returning-global-type b/third_party/git/t/t4018/cpp-function-returning-global-type
index 1084d5990e..1084d5990e 100644
--- a/t/t4018/cpp-function-returning-global-type
+++ b/third_party/git/t/t4018/cpp-function-returning-global-type
diff --git a/t/t4018/cpp-function-returning-nested b/third_party/git/t/t4018/cpp-function-returning-nested
index d9750aa61a..d9750aa61a 100644
--- a/t/t4018/cpp-function-returning-nested
+++ b/third_party/git/t/t4018/cpp-function-returning-nested
diff --git a/t/t4018/cpp-function-returning-pointer b/third_party/git/t/t4018/cpp-function-returning-pointer
index ef15657ea8..ef15657ea8 100644
--- a/t/t4018/cpp-function-returning-pointer
+++ b/third_party/git/t/t4018/cpp-function-returning-pointer
diff --git a/t/t4018/cpp-function-returning-reference b/third_party/git/t/t4018/cpp-function-returning-reference
index 01b051df70..01b051df70 100644
--- a/t/t4018/cpp-function-returning-reference
+++ b/third_party/git/t/t4018/cpp-function-returning-reference
diff --git a/t/t4018/cpp-gnu-style-function b/third_party/git/t/t4018/cpp-gnu-style-function
index 08c7c7565a..08c7c7565a 100644
--- a/t/t4018/cpp-gnu-style-function
+++ b/third_party/git/t/t4018/cpp-gnu-style-function
diff --git a/t/t4018/cpp-namespace-definition b/third_party/git/t/t4018/cpp-namespace-definition
index 6749980241..6749980241 100644
--- a/t/t4018/cpp-namespace-definition
+++ b/third_party/git/t/t4018/cpp-namespace-definition
diff --git a/t/t4018/cpp-operator-definition b/third_party/git/t/t4018/cpp-operator-definition
index 1acd827159..1acd827159 100644
--- a/t/t4018/cpp-operator-definition
+++ b/third_party/git/t/t4018/cpp-operator-definition
diff --git a/t/t4018/cpp-skip-access-specifiers b/third_party/git/t/t4018/cpp-skip-access-specifiers
index 4d4a9dbb9d..4d4a9dbb9d 100644
--- a/t/t4018/cpp-skip-access-specifiers
+++ b/third_party/git/t/t4018/cpp-skip-access-specifiers
diff --git a/t/t4018/cpp-skip-comment-block b/third_party/git/t/t4018/cpp-skip-comment-block
index 3800b9967a..3800b9967a 100644
--- a/t/t4018/cpp-skip-comment-block
+++ b/third_party/git/t/t4018/cpp-skip-comment-block
diff --git a/t/t4018/cpp-skip-labels b/third_party/git/t/t4018/cpp-skip-labels
index b9c10aba22..b9c10aba22 100644
--- a/t/t4018/cpp-skip-labels
+++ b/third_party/git/t/t4018/cpp-skip-labels
diff --git a/t/t4018/cpp-struct-definition b/third_party/git/t/t4018/cpp-struct-definition
index 521c59fd15..521c59fd15 100644
--- a/t/t4018/cpp-struct-definition
+++ b/third_party/git/t/t4018/cpp-struct-definition
diff --git a/t/t4018/cpp-struct-single-line b/third_party/git/t/t4018/cpp-struct-single-line
index a0de5fb800..a0de5fb800 100644
--- a/t/t4018/cpp-struct-single-line
+++ b/third_party/git/t/t4018/cpp-struct-single-line
diff --git a/t/t4018/cpp-template-function-definition b/third_party/git/t/t4018/cpp-template-function-definition
index 0cdf5ba5bd..0cdf5ba5bd 100644
--- a/t/t4018/cpp-template-function-definition
+++ b/third_party/git/t/t4018/cpp-template-function-definition
diff --git a/t/t4018/cpp-union-definition b/third_party/git/t/t4018/cpp-union-definition
index 7ec94df697..7ec94df697 100644
--- a/t/t4018/cpp-union-definition
+++ b/third_party/git/t/t4018/cpp-union-definition
diff --git a/t/t4018/cpp-void-c-function b/third_party/git/t/t4018/cpp-void-c-function
index 153081e872..153081e872 100644
--- a/t/t4018/cpp-void-c-function
+++ b/third_party/git/t/t4018/cpp-void-c-function
diff --git a/t/t4018/css-brace-in-col-1 b/third_party/git/t/t4018/css-brace-in-col-1
index 7831577506..7831577506 100644
--- a/t/t4018/css-brace-in-col-1
+++ b/third_party/git/t/t4018/css-brace-in-col-1
diff --git a/t/t4018/css-colon-eol b/third_party/git/t/t4018/css-colon-eol
index 5a30553d29..5a30553d29 100644
--- a/t/t4018/css-colon-eol
+++ b/third_party/git/t/t4018/css-colon-eol
diff --git a/t/t4018/css-colon-selector b/third_party/git/t/t4018/css-colon-selector
index c6d71fb42d..c6d71fb42d 100644
--- a/t/t4018/css-colon-selector
+++ b/third_party/git/t/t4018/css-colon-selector
diff --git a/t/t4018/css-common b/third_party/git/t/t4018/css-common
index 84ed754b33..84ed754b33 100644
--- a/t/t4018/css-common
+++ b/third_party/git/t/t4018/css-common
diff --git a/t/t4018/css-long-selector-list b/third_party/git/t/t4018/css-long-selector-list
index 7ccd25d9ed..7ccd25d9ed 100644
--- a/t/t4018/css-long-selector-list
+++ b/third_party/git/t/t4018/css-long-selector-list
diff --git a/t/t4018/css-prop-sans-indent b/third_party/git/t/t4018/css-prop-sans-indent
index a9e3c86b3c..a9e3c86b3c 100644
--- a/t/t4018/css-prop-sans-indent
+++ b/third_party/git/t/t4018/css-prop-sans-indent
diff --git a/t/t4018/css-short-selector-list b/third_party/git/t/t4018/css-short-selector-list
index 6a0bdee336..6a0bdee336 100644
--- a/t/t4018/css-short-selector-list
+++ b/third_party/git/t/t4018/css-short-selector-list
diff --git a/t/t4018/css-trailing-space b/third_party/git/t/t4018/css-trailing-space
index 32b5606c70..32b5606c70 100644
--- a/t/t4018/css-trailing-space
+++ b/third_party/git/t/t4018/css-trailing-space
diff --git a/t/t4018/custom1-pattern b/third_party/git/t/t4018/custom1-pattern
index e8fd59f884..e8fd59f884 100644
--- a/t/t4018/custom1-pattern
+++ b/third_party/git/t/t4018/custom1-pattern
diff --git a/t/t4018/custom2-match-to-end-of-line b/third_party/git/t/t4018/custom2-match-to-end-of-line
index f88ac318b7..f88ac318b7 100644
--- a/t/t4018/custom2-match-to-end-of-line
+++ b/third_party/git/t/t4018/custom2-match-to-end-of-line
diff --git a/t/t4018/custom3-alternation-in-pattern b/third_party/git/t/t4018/custom3-alternation-in-pattern
index 5f3769c64f..5f3769c64f 100644
--- a/t/t4018/custom3-alternation-in-pattern
+++ b/third_party/git/t/t4018/custom3-alternation-in-pattern
diff --git a/t/t4018/fountain-scene b/third_party/git/t/t4018/fountain-scene
index 6b3257d680..6b3257d680 100644
--- a/t/t4018/fountain-scene
+++ b/third_party/git/t/t4018/fountain-scene
diff --git a/t/t4018/golang-complex-function b/third_party/git/t/t4018/golang-complex-function
index e057dcefed..e057dcefed 100644
--- a/t/t4018/golang-complex-function
+++ b/third_party/git/t/t4018/golang-complex-function
diff --git a/t/t4018/golang-func b/third_party/git/t/t4018/golang-func
index 8e9c9ac7c3..8e9c9ac7c3 100644
--- a/t/t4018/golang-func
+++ b/third_party/git/t/t4018/golang-func
diff --git a/t/t4018/golang-interface b/third_party/git/t/t4018/golang-interface
index 553bedec96..553bedec96 100644
--- a/t/t4018/golang-interface
+++ b/third_party/git/t/t4018/golang-interface
diff --git a/t/t4018/golang-long-func b/third_party/git/t/t4018/golang-long-func
index ac3a77b5c4..ac3a77b5c4 100644
--- a/t/t4018/golang-long-func
+++ b/third_party/git/t/t4018/golang-long-func
diff --git a/t/t4018/golang-struct b/third_party/git/t/t4018/golang-struct
index 5deda77fee..5deda77fee 100644
--- a/t/t4018/golang-struct
+++ b/third_party/git/t/t4018/golang-struct
diff --git a/t/t4018/java-class-member-function b/third_party/git/t/t4018/java-class-member-function
index 298bc7a71b..298bc7a71b 100644
--- a/t/t4018/java-class-member-function
+++ b/third_party/git/t/t4018/java-class-member-function
diff --git a/t/t4018/matlab-class-definition b/third_party/git/t/t4018/matlab-class-definition
index 84daedfb4e..84daedfb4e 100644
--- a/t/t4018/matlab-class-definition
+++ b/third_party/git/t/t4018/matlab-class-definition
diff --git a/t/t4018/matlab-function b/third_party/git/t/t4018/matlab-function
index 897a9b13ff..897a9b13ff 100644
--- a/t/t4018/matlab-function
+++ b/third_party/git/t/t4018/matlab-function
diff --git a/t/t4018/matlab-octave-section-1 b/third_party/git/t/t4018/matlab-octave-section-1
index 3bb6c4670e..3bb6c4670e 100644
--- a/t/t4018/matlab-octave-section-1
+++ b/third_party/git/t/t4018/matlab-octave-section-1
diff --git a/t/t4018/matlab-octave-section-2 b/third_party/git/t/t4018/matlab-octave-section-2
index ab2980f7f2..ab2980f7f2 100644
--- a/t/t4018/matlab-octave-section-2
+++ b/third_party/git/t/t4018/matlab-octave-section-2
diff --git a/t/t4018/matlab-section b/third_party/git/t/t4018/matlab-section
index 5ea59a5de0..5ea59a5de0 100644
--- a/t/t4018/matlab-section
+++ b/third_party/git/t/t4018/matlab-section
diff --git a/t/t4018/perl-skip-end-of-heredoc b/third_party/git/t/t4018/perl-skip-end-of-heredoc
index c22d39b256..c22d39b256 100644
--- a/t/t4018/perl-skip-end-of-heredoc
+++ b/third_party/git/t/t4018/perl-skip-end-of-heredoc
diff --git a/t/t4018/perl-skip-forward-decl b/third_party/git/t/t4018/perl-skip-forward-decl
index a98cb8bdad..a98cb8bdad 100644
--- a/t/t4018/perl-skip-forward-decl
+++ b/third_party/git/t/t4018/perl-skip-forward-decl
diff --git a/t/t4018/perl-skip-sub-in-pod b/third_party/git/t/t4018/perl-skip-sub-in-pod
index e39f02462e..e39f02462e 100644
--- a/t/t4018/perl-skip-sub-in-pod
+++ b/third_party/git/t/t4018/perl-skip-sub-in-pod
diff --git a/t/t4018/perl-sub-definition b/third_party/git/t/t4018/perl-sub-definition
index a507d1f645..a507d1f645 100644
--- a/t/t4018/perl-sub-definition
+++ b/third_party/git/t/t4018/perl-sub-definition
diff --git a/t/t4018/perl-sub-definition-kr-brace b/third_party/git/t/t4018/perl-sub-definition-kr-brace
index 330b3df114..330b3df114 100644
--- a/t/t4018/perl-sub-definition-kr-brace
+++ b/third_party/git/t/t4018/perl-sub-definition-kr-brace
diff --git a/t/t4018/php-abstract-class b/third_party/git/t/t4018/php-abstract-class
index 5213e12494..5213e12494 100644
--- a/t/t4018/php-abstract-class
+++ b/third_party/git/t/t4018/php-abstract-class
diff --git a/t/t4018/php-class b/third_party/git/t/t4018/php-class
index 7785b6303c..7785b6303c 100644
--- a/t/t4018/php-class
+++ b/third_party/git/t/t4018/php-class
diff --git a/t/t4018/php-final-class b/third_party/git/t/t4018/php-final-class
index 69f5710552..69f5710552 100644
--- a/t/t4018/php-final-class
+++ b/third_party/git/t/t4018/php-final-class
diff --git a/t/t4018/php-function b/third_party/git/t/t4018/php-function
index 35717c51c3..35717c51c3 100644
--- a/t/t4018/php-function
+++ b/third_party/git/t/t4018/php-function
diff --git a/t/t4018/php-interface b/third_party/git/t/t4018/php-interface
index 86b49ad5d9..86b49ad5d9 100644
--- a/t/t4018/php-interface
+++ b/third_party/git/t/t4018/php-interface
diff --git a/t/t4018/php-method b/third_party/git/t/t4018/php-method
index 03af1a6d9d..03af1a6d9d 100644
--- a/t/t4018/php-method
+++ b/third_party/git/t/t4018/php-method
diff --git a/t/t4018/php-trait b/third_party/git/t/t4018/php-trait
index 65b8c82a61..65b8c82a61 100644
--- a/t/t4018/php-trait
+++ b/third_party/git/t/t4018/php-trait
diff --git a/t/t4018/rust-fn b/third_party/git/t/t4018/rust-fn
index cbe02155f1..cbe02155f1 100644
--- a/t/t4018/rust-fn
+++ b/third_party/git/t/t4018/rust-fn
diff --git a/t/t4018/rust-impl b/third_party/git/t/t4018/rust-impl
index 09df3cd93b..09df3cd93b 100644
--- a/t/t4018/rust-impl
+++ b/third_party/git/t/t4018/rust-impl
diff --git a/t/t4018/rust-struct b/third_party/git/t/t4018/rust-struct
index 76aff1c0d8..76aff1c0d8 100644
--- a/t/t4018/rust-struct
+++ b/third_party/git/t/t4018/rust-struct
diff --git a/t/t4018/rust-trait b/third_party/git/t/t4018/rust-trait
index ea397f09ed..ea397f09ed 100644
--- a/t/t4018/rust-trait
+++ b/third_party/git/t/t4018/rust-trait
diff --git a/t/t4019-diff-wserror.sh b/third_party/git/t/t4019-diff-wserror.sh
index c6135c7548..c6135c7548 100755
--- a/t/t4019-diff-wserror.sh
+++ b/third_party/git/t/t4019-diff-wserror.sh
diff --git a/t/t4020-diff-external.sh b/third_party/git/t/t4020-diff-external.sh
index e009826fcb..e009826fcb 100755
--- a/t/t4020-diff-external.sh
+++ b/third_party/git/t/t4020-diff-external.sh
diff --git a/t/t4020/diff.NUL b/third_party/git/t/t4020/diff.NUL
index db2f89090c..db2f89090c 100644
--- a/t/t4020/diff.NUL
+++ b/third_party/git/t/t4020/diff.NUL
Binary files differdiff --git a/t/t4021-format-patch-numbered.sh b/third_party/git/t/t4021-format-patch-numbered.sh
index 9be65fd444..9be65fd444 100755
--- a/t/t4021-format-patch-numbered.sh
+++ b/third_party/git/t/t4021-format-patch-numbered.sh
diff --git a/t/t4022-diff-rewrite.sh b/third_party/git/t/t4022-diff-rewrite.sh
index 6d1c3d949c..6d1c3d949c 100755
--- a/t/t4022-diff-rewrite.sh
+++ b/third_party/git/t/t4022-diff-rewrite.sh
diff --git a/t/t4023-diff-rename-typechange.sh b/third_party/git/t/t4023-diff-rename-typechange.sh
index 8c9823765e..8c9823765e 100755
--- a/t/t4023-diff-rename-typechange.sh
+++ b/third_party/git/t/t4023-diff-rename-typechange.sh
diff --git a/t/t4024-diff-optimize-common.sh b/third_party/git/t/t4024-diff-optimize-common.sh
index 6b44ce1493..6b44ce1493 100755
--- a/t/t4024-diff-optimize-common.sh
+++ b/third_party/git/t/t4024-diff-optimize-common.sh
diff --git a/t/t4025-hunk-header.sh b/third_party/git/t/t4025-hunk-header.sh
index 35578f2bb9..35578f2bb9 100755
--- a/t/t4025-hunk-header.sh
+++ b/third_party/git/t/t4025-hunk-header.sh
diff --git a/t/t4026-color.sh b/third_party/git/t/t4026-color.sh
index 671e951ee5..671e951ee5 100755
--- a/t/t4026-color.sh
+++ b/third_party/git/t/t4026-color.sh
diff --git a/t/t4027-diff-submodule.sh b/third_party/git/t/t4027-diff-submodule.sh
index 9aa8e2b39b..9aa8e2b39b 100755
--- a/t/t4027-diff-submodule.sh
+++ b/third_party/git/t/t4027-diff-submodule.sh
diff --git a/t/t4028-format-patch-mime-headers.sh b/third_party/git/t/t4028-format-patch-mime-headers.sh
index 204ba673cb..204ba673cb 100755
--- a/t/t4028-format-patch-mime-headers.sh
+++ b/third_party/git/t/t4028-format-patch-mime-headers.sh
diff --git a/t/t4029-diff-trailing-space.sh b/third_party/git/t/t4029-diff-trailing-space.sh
index 32b6e9a4e7..32b6e9a4e7 100755
--- a/t/t4029-diff-trailing-space.sh
+++ b/third_party/git/t/t4029-diff-trailing-space.sh
diff --git a/t/t4030-diff-textconv.sh b/third_party/git/t/t4030-diff-textconv.sh
index 4cb9f0e523..4cb9f0e523 100755
--- a/t/t4030-diff-textconv.sh
+++ b/third_party/git/t/t4030-diff-textconv.sh
diff --git a/t/t4031-diff-rewrite-binary.sh b/third_party/git/t/t4031-diff-rewrite-binary.sh
index eacc6694f7..eacc6694f7 100755
--- a/t/t4031-diff-rewrite-binary.sh
+++ b/third_party/git/t/t4031-diff-rewrite-binary.sh
diff --git a/t/t4032-diff-inter-hunk-context.sh b/third_party/git/t/t4032-diff-inter-hunk-context.sh
index bada0cbd32..bada0cbd32 100755
--- a/t/t4032-diff-inter-hunk-context.sh
+++ b/third_party/git/t/t4032-diff-inter-hunk-context.sh
diff --git a/t/t4033-diff-patience.sh b/third_party/git/t/t4033-diff-patience.sh
index 113304dc59..113304dc59 100755
--- a/t/t4033-diff-patience.sh
+++ b/third_party/git/t/t4033-diff-patience.sh
diff --git a/t/t4034-diff-words.sh b/third_party/git/t/t4034-diff-words.sh
index 912df91226..912df91226 100755
--- a/t/t4034-diff-words.sh
+++ b/third_party/git/t/t4034-diff-words.sh
diff --git a/t/t4034/ada/expect b/third_party/git/t/t4034/ada/expect
index a682d288b2..a682d288b2 100644
--- a/t/t4034/ada/expect
+++ b/third_party/git/t/t4034/ada/expect
diff --git a/t/t4034/ada/post b/third_party/git/t/t4034/ada/post
index df21bb044f..df21bb044f 100644
--- a/t/t4034/ada/post
+++ b/third_party/git/t/t4034/ada/post
diff --git a/t/t4034/ada/pre b/third_party/git/t/t4034/ada/pre
index d96fdd1e8e..d96fdd1e8e 100644
--- a/t/t4034/ada/pre
+++ b/third_party/git/t/t4034/ada/pre
diff --git a/t/t4034/bibtex/expect b/third_party/git/t/t4034/bibtex/expect
index a157774f9d..a157774f9d 100644
--- a/t/t4034/bibtex/expect
+++ b/third_party/git/t/t4034/bibtex/expect
diff --git a/t/t4034/bibtex/post b/third_party/git/t/t4034/bibtex/post
index ddcba9b2fc..ddcba9b2fc 100644
--- a/t/t4034/bibtex/post
+++ b/third_party/git/t/t4034/bibtex/post
diff --git a/t/t4034/bibtex/pre b/third_party/git/t/t4034/bibtex/pre
index 95cd55bd7b..95cd55bd7b 100644
--- a/t/t4034/bibtex/pre
+++ b/third_party/git/t/t4034/bibtex/pre
diff --git a/t/t4034/cpp/expect b/third_party/git/t/t4034/cpp/expect
index 37d1ea2587..37d1ea2587 100644
--- a/t/t4034/cpp/expect
+++ b/third_party/git/t/t4034/cpp/expect
diff --git a/t/t4034/cpp/post b/third_party/git/t/t4034/cpp/post
index 7e8c026cef..7e8c026cef 100644
--- a/t/t4034/cpp/post
+++ b/third_party/git/t/t4034/cpp/post
diff --git a/t/t4034/cpp/pre b/third_party/git/t/t4034/cpp/pre
index 23d5c8adf5..23d5c8adf5 100644
--- a/t/t4034/cpp/pre
+++ b/third_party/git/t/t4034/cpp/pre
diff --git a/t/t4034/csharp/expect b/third_party/git/t/t4034/csharp/expect
index e5d1dd2b3d..e5d1dd2b3d 100644
--- a/t/t4034/csharp/expect
+++ b/third_party/git/t/t4034/csharp/expect
diff --git a/t/t4034/csharp/post b/third_party/git/t/t4034/csharp/post
index dd5f4218a6..dd5f4218a6 100644
--- a/t/t4034/csharp/post
+++ b/third_party/git/t/t4034/csharp/post
diff --git a/t/t4034/csharp/pre b/third_party/git/t/t4034/csharp/pre
index 9106d63e87..9106d63e87 100644
--- a/t/t4034/csharp/pre
+++ b/third_party/git/t/t4034/csharp/pre
diff --git a/t/t4034/css/expect b/third_party/git/t/t4034/css/expect
index ed10393bda..ed10393bda 100644
--- a/t/t4034/css/expect
+++ b/third_party/git/t/t4034/css/expect
diff --git a/t/t4034/css/post b/third_party/git/t/t4034/css/post
index fe500b7a4f..fe500b7a4f 100644
--- a/t/t4034/css/post
+++ b/third_party/git/t/t4034/css/post
diff --git a/t/t4034/css/pre b/third_party/git/t/t4034/css/pre
index b8ae0bb48f..b8ae0bb48f 100644
--- a/t/t4034/css/pre
+++ b/third_party/git/t/t4034/css/pre
diff --git a/t/t4034/fortran/expect b/third_party/git/t/t4034/fortran/expect
index b233dbd621..b233dbd621 100644
--- a/t/t4034/fortran/expect
+++ b/third_party/git/t/t4034/fortran/expect
diff --git a/t/t4034/fortran/post b/third_party/git/t/t4034/fortran/post
index d308da2ad2..d308da2ad2 100644
--- a/t/t4034/fortran/post
+++ b/third_party/git/t/t4034/fortran/post
diff --git a/t/t4034/fortran/pre b/third_party/git/t/t4034/fortran/pre
index 87f0d0b031..87f0d0b031 100644
--- a/t/t4034/fortran/pre
+++ b/third_party/git/t/t4034/fortran/pre
diff --git a/t/t4034/html/expect b/third_party/git/t/t4034/html/expect
index 447b49ab6d..447b49ab6d 100644
--- a/t/t4034/html/expect
+++ b/third_party/git/t/t4034/html/expect
diff --git a/t/t4034/html/post b/third_party/git/t/t4034/html/post
index 46921e586c..46921e586c 100644
--- a/t/t4034/html/post
+++ b/third_party/git/t/t4034/html/post
diff --git a/t/t4034/html/pre b/third_party/git/t/t4034/html/pre
index 8ca4aeae83..8ca4aeae83 100644
--- a/t/t4034/html/pre
+++ b/third_party/git/t/t4034/html/pre
diff --git a/t/t4034/java/expect b/third_party/git/t/t4034/java/expect
index 37d1ea2587..37d1ea2587 100644
--- a/t/t4034/java/expect
+++ b/third_party/git/t/t4034/java/expect
diff --git a/t/t4034/java/post b/third_party/git/t/t4034/java/post
index 7e8c026cef..7e8c026cef 100644
--- a/t/t4034/java/post
+++ b/third_party/git/t/t4034/java/post
diff --git a/t/t4034/java/pre b/third_party/git/t/t4034/java/pre
index 23d5c8adf5..23d5c8adf5 100644
--- a/t/t4034/java/pre
+++ b/third_party/git/t/t4034/java/pre
diff --git a/t/t4034/matlab/expect b/third_party/git/t/t4034/matlab/expect
index 72cf3e93a2..72cf3e93a2 100644
--- a/t/t4034/matlab/expect
+++ b/third_party/git/t/t4034/matlab/expect
diff --git a/t/t4034/matlab/post b/third_party/git/t/t4034/matlab/post
index 70e05f0753..70e05f0753 100644
--- a/t/t4034/matlab/post
+++ b/third_party/git/t/t4034/matlab/post
diff --git a/t/t4034/matlab/pre b/third_party/git/t/t4034/matlab/pre
index dc204db486..dc204db486 100644
--- a/t/t4034/matlab/pre
+++ b/third_party/git/t/t4034/matlab/pre
diff --git a/t/t4034/objc/expect b/third_party/git/t/t4034/objc/expect
index e5d1dd2b3d..e5d1dd2b3d 100644
--- a/t/t4034/objc/expect
+++ b/third_party/git/t/t4034/objc/expect
diff --git a/t/t4034/objc/post b/third_party/git/t/t4034/objc/post
index dd5f4218a6..dd5f4218a6 100644
--- a/t/t4034/objc/post
+++ b/third_party/git/t/t4034/objc/post
diff --git a/t/t4034/objc/pre b/third_party/git/t/t4034/objc/pre
index 9106d63e87..9106d63e87 100644
--- a/t/t4034/objc/pre
+++ b/third_party/git/t/t4034/objc/pre
diff --git a/t/t4034/pascal/expect b/third_party/git/t/t4034/pascal/expect
index 2ce4230954..2ce4230954 100644
--- a/t/t4034/pascal/expect
+++ b/third_party/git/t/t4034/pascal/expect
diff --git a/t/t4034/pascal/post b/third_party/git/t/t4034/pascal/post
index 8865e6bddd..8865e6bddd 100644
--- a/t/t4034/pascal/post
+++ b/third_party/git/t/t4034/pascal/post
diff --git a/t/t4034/pascal/pre b/third_party/git/t/t4034/pascal/pre
index 077046c832..077046c832 100644
--- a/t/t4034/pascal/pre
+++ b/third_party/git/t/t4034/pascal/pre
diff --git a/t/t4034/perl/expect b/third_party/git/t/t4034/perl/expect
index a1deb6b6ad..a1deb6b6ad 100644
--- a/t/t4034/perl/expect
+++ b/third_party/git/t/t4034/perl/expect
diff --git a/t/t4034/perl/post b/third_party/git/t/t4034/perl/post
index e8b72ef5dc..e8b72ef5dc 100644
--- a/t/t4034/perl/post
+++ b/third_party/git/t/t4034/perl/post
diff --git a/t/t4034/perl/pre b/third_party/git/t/t4034/perl/pre
index f6610d37b8..f6610d37b8 100644
--- a/t/t4034/perl/pre
+++ b/third_party/git/t/t4034/perl/pre
diff --git a/t/t4034/php/expect b/third_party/git/t/t4034/php/expect
index 040440860a..040440860a 100644
--- a/t/t4034/php/expect
+++ b/third_party/git/t/t4034/php/expect
diff --git a/t/t4034/php/post b/third_party/git/t/t4034/php/post
index 4420a49192..4420a49192 100644
--- a/t/t4034/php/post
+++ b/third_party/git/t/t4034/php/post
diff --git a/t/t4034/php/pre b/third_party/git/t/t4034/php/pre
index cf6e06bc22..cf6e06bc22 100644
--- a/t/t4034/php/pre
+++ b/third_party/git/t/t4034/php/pre
diff --git a/t/t4034/python/expect b/third_party/git/t/t4034/python/expect
index 8abb8a48b4..8abb8a48b4 100644
--- a/t/t4034/python/expect
+++ b/third_party/git/t/t4034/python/expect
diff --git a/t/t4034/python/post b/third_party/git/t/t4034/python/post
index 68baf34f0e..68baf34f0e 100644
--- a/t/t4034/python/post
+++ b/third_party/git/t/t4034/python/post
diff --git a/t/t4034/python/pre b/third_party/git/t/t4034/python/pre
index 438f776875..438f776875 100644
--- a/t/t4034/python/pre
+++ b/third_party/git/t/t4034/python/pre
diff --git a/t/t4034/ruby/expect b/third_party/git/t/t4034/ruby/expect
index 16e1dd5674..16e1dd5674 100644
--- a/t/t4034/ruby/expect
+++ b/third_party/git/t/t4034/ruby/expect
diff --git a/t/t4034/ruby/post b/third_party/git/t/t4034/ruby/post
index 7678f14e14..7678f14e14 100644
--- a/t/t4034/ruby/post
+++ b/third_party/git/t/t4034/ruby/post
diff --git a/t/t4034/ruby/pre b/third_party/git/t/t4034/ruby/pre
index 30ed9a1595..30ed9a1595 100644
--- a/t/t4034/ruby/pre
+++ b/third_party/git/t/t4034/ruby/pre
diff --git a/t/t4034/tex/expect b/third_party/git/t/t4034/tex/expect
index 604969bcde..604969bcde 100644
--- a/t/t4034/tex/expect
+++ b/third_party/git/t/t4034/tex/expect
diff --git a/t/t4034/tex/post b/third_party/git/t/t4034/tex/post
index 65cab61a10..65cab61a10 100644
--- a/t/t4034/tex/post
+++ b/third_party/git/t/t4034/tex/post
diff --git a/t/t4034/tex/pre b/third_party/git/t/t4034/tex/pre
index 2b2dfcb65c..2b2dfcb65c 100644
--- a/t/t4034/tex/pre
+++ b/third_party/git/t/t4034/tex/pre
diff --git a/t/t4035-diff-quiet.sh b/third_party/git/t/t4035-diff-quiet.sh
index 0352bf81a9..0352bf81a9 100755
--- a/t/t4035-diff-quiet.sh
+++ b/third_party/git/t/t4035-diff-quiet.sh
diff --git a/t/t4036-format-patch-signer-mime.sh b/third_party/git/t/t4036-format-patch-signer-mime.sh
index 98d9713d8b..98d9713d8b 100755
--- a/t/t4036-format-patch-signer-mime.sh
+++ b/third_party/git/t/t4036-format-patch-signer-mime.sh
diff --git a/t/t4037-diff-r-t-dirs.sh b/third_party/git/t/t4037-diff-r-t-dirs.sh
index f5ce3b29a2..f5ce3b29a2 100755
--- a/t/t4037-diff-r-t-dirs.sh
+++ b/third_party/git/t/t4037-diff-r-t-dirs.sh
diff --git a/t/t4038-diff-combined.sh b/third_party/git/t/t4038-diff-combined.sh
index d4afe12554..d4afe12554 100755
--- a/t/t4038-diff-combined.sh
+++ b/third_party/git/t/t4038-diff-combined.sh
diff --git a/t/t4039-diff-assume-unchanged.sh b/third_party/git/t/t4039-diff-assume-unchanged.sh
index 53ac44b0f0..53ac44b0f0 100755
--- a/t/t4039-diff-assume-unchanged.sh
+++ b/third_party/git/t/t4039-diff-assume-unchanged.sh
diff --git a/t/t4040-whitespace-status.sh b/third_party/git/t/t4040-whitespace-status.sh
index 3c728a3ebf..3c728a3ebf 100755
--- a/t/t4040-whitespace-status.sh
+++ b/third_party/git/t/t4040-whitespace-status.sh
diff --git a/t/t4041-diff-submodule-option.sh b/third_party/git/t/t4041-diff-submodule-option.sh
index 619bf97098..619bf97098 100755
--- a/t/t4041-diff-submodule-option.sh
+++ b/third_party/git/t/t4041-diff-submodule-option.sh
diff --git a/t/t4042-diff-textconv-caching.sh b/third_party/git/t/t4042-diff-textconv-caching.sh
index bf33aedf4b..bf33aedf4b 100755
--- a/t/t4042-diff-textconv-caching.sh
+++ b/third_party/git/t/t4042-diff-textconv-caching.sh
diff --git a/t/t4043-diff-rename-binary.sh b/third_party/git/t/t4043-diff-rename-binary.sh
index 2a2cf91352..2a2cf91352 100755
--- a/t/t4043-diff-rename-binary.sh
+++ b/third_party/git/t/t4043-diff-rename-binary.sh
diff --git a/t/t4044-diff-index-unique-abbrev.sh b/third_party/git/t/t4044-diff-index-unique-abbrev.sh
index 647905e01f..647905e01f 100755
--- a/t/t4044-diff-index-unique-abbrev.sh
+++ b/third_party/git/t/t4044-diff-index-unique-abbrev.sh
diff --git a/t/t4045-diff-relative.sh b/third_party/git/t/t4045-diff-relative.sh
index 36f8ed8a81..36f8ed8a81 100755
--- a/t/t4045-diff-relative.sh
+++ b/third_party/git/t/t4045-diff-relative.sh
diff --git a/t/t4046-diff-unmerged.sh b/third_party/git/t/t4046-diff-unmerged.sh
index ff7cfd884a..ff7cfd884a 100755
--- a/t/t4046-diff-unmerged.sh
+++ b/third_party/git/t/t4046-diff-unmerged.sh
diff --git a/t/t4047-diff-dirstat.sh b/third_party/git/t/t4047-diff-dirstat.sh
index 7fec2cb9cd..7fec2cb9cd 100755
--- a/t/t4047-diff-dirstat.sh
+++ b/third_party/git/t/t4047-diff-dirstat.sh
diff --git a/t/t4048-diff-combined-binary.sh b/third_party/git/t/t4048-diff-combined-binary.sh
index 87a8949500..87a8949500 100755
--- a/t/t4048-diff-combined-binary.sh
+++ b/third_party/git/t/t4048-diff-combined-binary.sh
diff --git a/t/t4049-diff-stat-count.sh b/third_party/git/t/t4049-diff-stat-count.sh
index a34121740a..a34121740a 100755
--- a/t/t4049-diff-stat-count.sh
+++ b/third_party/git/t/t4049-diff-stat-count.sh
diff --git a/t/t4050-diff-histogram.sh b/third_party/git/t/t4050-diff-histogram.sh
index fd3e86a74f..fd3e86a74f 100755
--- a/t/t4050-diff-histogram.sh
+++ b/third_party/git/t/t4050-diff-histogram.sh
diff --git a/t/t4051-diff-function-context.sh b/third_party/git/t/t4051-diff-function-context.sh
index 4838a1df8b..4838a1df8b 100755
--- a/t/t4051-diff-function-context.sh
+++ b/third_party/git/t/t4051-diff-function-context.sh
diff --git a/t/t4051/appended1.c b/third_party/git/t/t4051/appended1.c
index a9f56f11db..a9f56f11db 100644
--- a/t/t4051/appended1.c
+++ b/third_party/git/t/t4051/appended1.c
diff --git a/t/t4051/appended2.c b/third_party/git/t/t4051/appended2.c
index e651f7147b..e651f7147b 100644
--- a/t/t4051/appended2.c
+++ b/third_party/git/t/t4051/appended2.c
diff --git a/t/t4051/dummy.c b/third_party/git/t/t4051/dummy.c
index a43016e870..a43016e870 100644
--- a/t/t4051/dummy.c
+++ b/third_party/git/t/t4051/dummy.c
diff --git a/t/t4051/hello.c b/third_party/git/t/t4051/hello.c
index 73e767e178..73e767e178 100644
--- a/t/t4051/hello.c
+++ b/third_party/git/t/t4051/hello.c
diff --git a/t/t4051/includes.c b/third_party/git/t/t4051/includes.c
index efc68f8bf6..efc68f8bf6 100644
--- a/t/t4051/includes.c
+++ b/third_party/git/t/t4051/includes.c
diff --git a/t/t4052-stat-output.sh b/third_party/git/t/t4052-stat-output.sh
index 28c053849a..28c053849a 100755
--- a/t/t4052-stat-output.sh
+++ b/third_party/git/t/t4052-stat-output.sh
diff --git a/t/t4053-diff-no-index.sh b/third_party/git/t/t4053-diff-no-index.sh
index 0168946b63..0168946b63 100755
--- a/t/t4053-diff-no-index.sh
+++ b/third_party/git/t/t4053-diff-no-index.sh
diff --git a/t/t4054-diff-bogus-tree.sh b/third_party/git/t/t4054-diff-bogus-tree.sh
index fcae82fffa..fcae82fffa 100755
--- a/t/t4054-diff-bogus-tree.sh
+++ b/third_party/git/t/t4054-diff-bogus-tree.sh
diff --git a/t/t4055-diff-context.sh b/third_party/git/t/t4055-diff-context.sh
index 741e0803c1..741e0803c1 100755
--- a/t/t4055-diff-context.sh
+++ b/third_party/git/t/t4055-diff-context.sh
diff --git a/t/t4056-diff-order.sh b/third_party/git/t/t4056-diff-order.sh
index 43dd474a12..43dd474a12 100755
--- a/t/t4056-diff-order.sh
+++ b/third_party/git/t/t4056-diff-order.sh
diff --git a/t/t4057-diff-combined-paths.sh b/third_party/git/t/t4057-diff-combined-paths.sh
index dff36b77ec..dff36b77ec 100755
--- a/t/t4057-diff-combined-paths.sh
+++ b/third_party/git/t/t4057-diff-combined-paths.sh
diff --git a/t/t4058-diff-duplicates.sh b/third_party/git/t/t4058-diff-duplicates.sh
index c24ee175ef..c24ee175ef 100755
--- a/t/t4058-diff-duplicates.sh
+++ b/third_party/git/t/t4058-diff-duplicates.sh
diff --git a/t/t4059-diff-submodule-not-initialized.sh b/third_party/git/t/t4059-diff-submodule-not-initialized.sh
index 49bca7b48d..49bca7b48d 100755
--- a/t/t4059-diff-submodule-not-initialized.sh
+++ b/third_party/git/t/t4059-diff-submodule-not-initialized.sh
diff --git a/t/t4060-diff-submodule-option-diff-format.sh b/third_party/git/t/t4060-diff-submodule-option-diff-format.sh
index 9dcb69df5c..9dcb69df5c 100755
--- a/t/t4060-diff-submodule-option-diff-format.sh
+++ b/third_party/git/t/t4060-diff-submodule-option-diff-format.sh
diff --git a/t/t4061-diff-indent.sh b/third_party/git/t/t4061-diff-indent.sh
index 2affd7a100..2affd7a100 100755
--- a/t/t4061-diff-indent.sh
+++ b/third_party/git/t/t4061-diff-indent.sh
diff --git a/t/t4062-diff-pickaxe.sh b/third_party/git/t/t4062-diff-pickaxe.sh
index 1130c8019b..1130c8019b 100755
--- a/t/t4062-diff-pickaxe.sh
+++ b/third_party/git/t/t4062-diff-pickaxe.sh
diff --git a/t/t4063-diff-blobs.sh b/third_party/git/t/t4063-diff-blobs.sh
index bc69e26c52..bc69e26c52 100755
--- a/t/t4063-diff-blobs.sh
+++ b/third_party/git/t/t4063-diff-blobs.sh
diff --git a/t/t4064-diff-oidfind.sh b/third_party/git/t/t4064-diff-oidfind.sh
index 3bdf317af8..3bdf317af8 100755
--- a/t/t4064-diff-oidfind.sh
+++ b/third_party/git/t/t4064-diff-oidfind.sh
diff --git a/t/t4065-diff-anchored.sh b/third_party/git/t/t4065-diff-anchored.sh
index b3f510f040..b3f510f040 100755
--- a/t/t4065-diff-anchored.sh
+++ b/third_party/git/t/t4065-diff-anchored.sh
diff --git a/t/t4066-diff-emit-delay.sh b/third_party/git/t/t4066-diff-emit-delay.sh
index 5df6b5e64e..5df6b5e64e 100755
--- a/t/t4066-diff-emit-delay.sh
+++ b/third_party/git/t/t4066-diff-emit-delay.sh
diff --git a/t/t4067-diff-partial-clone.sh b/third_party/git/t/t4067-diff-partial-clone.sh
index 90c8fb2901..90c8fb2901 100755
--- a/t/t4067-diff-partial-clone.sh
+++ b/third_party/git/t/t4067-diff-partial-clone.sh
diff --git a/t/t4100-apply-stat.sh b/third_party/git/t/t4100-apply-stat.sh
index 744b8e51be..744b8e51be 100755
--- a/t/t4100-apply-stat.sh
+++ b/third_party/git/t/t4100-apply-stat.sh
diff --git a/t/t4100/t-apply-1.expect b/third_party/git/t/t4100/t-apply-1.expect
index 540e64db85..540e64db85 100644
--- a/t/t4100/t-apply-1.expect
+++ b/third_party/git/t/t4100/t-apply-1.expect
diff --git a/t/t4100/t-apply-1.patch b/third_party/git/t/t4100/t-apply-1.patch
index 90ab54f0f5..90ab54f0f5 100644
--- a/t/t4100/t-apply-1.patch
+++ b/third_party/git/t/t4100/t-apply-1.patch
diff --git a/t/t4100/t-apply-2.expect b/third_party/git/t/t4100/t-apply-2.expect
index d1e6459749..d1e6459749 100644
--- a/t/t4100/t-apply-2.expect
+++ b/third_party/git/t/t4100/t-apply-2.expect
diff --git a/t/t4100/t-apply-2.patch b/third_party/git/t/t4100/t-apply-2.patch
index f5c7d601fc..f5c7d601fc 100644
--- a/t/t4100/t-apply-2.patch
+++ b/third_party/git/t/t4100/t-apply-2.patch
diff --git a/t/t4100/t-apply-3.expect b/third_party/git/t/t4100/t-apply-3.expect
index 912a552a7a..912a552a7a 100644
--- a/t/t4100/t-apply-3.expect
+++ b/third_party/git/t/t4100/t-apply-3.expect
diff --git a/t/t4100/t-apply-3.patch b/third_party/git/t/t4100/t-apply-3.patch
index 90cdbaa5bb..90cdbaa5bb 100644
--- a/t/t4100/t-apply-3.patch
+++ b/third_party/git/t/t4100/t-apply-3.patch
diff --git a/t/t4100/t-apply-4.expect b/third_party/git/t/t4100/t-apply-4.expect
index 1ec028b3d0..1ec028b3d0 100644
--- a/t/t4100/t-apply-4.expect
+++ b/third_party/git/t/t4100/t-apply-4.expect
diff --git a/t/t4100/t-apply-4.patch b/third_party/git/t/t4100/t-apply-4.patch
index 4a56ab5cf4..4a56ab5cf4 100644
--- a/t/t4100/t-apply-4.patch
+++ b/third_party/git/t/t4100/t-apply-4.patch
diff --git a/t/t4100/t-apply-5.expect b/third_party/git/t/t4100/t-apply-5.expect
index b387df15d4..b387df15d4 100644
--- a/t/t4100/t-apply-5.expect
+++ b/third_party/git/t/t4100/t-apply-5.expect
diff --git a/t/t4100/t-apply-5.patch b/third_party/git/t/t4100/t-apply-5.patch
index 5f6ddc1059..5f6ddc1059 100644
--- a/t/t4100/t-apply-5.patch
+++ b/third_party/git/t/t4100/t-apply-5.patch
diff --git a/t/t4100/t-apply-6.expect b/third_party/git/t/t4100/t-apply-6.expect
index 1c343d459e..1c343d459e 100644
--- a/t/t4100/t-apply-6.expect
+++ b/third_party/git/t/t4100/t-apply-6.expect
diff --git a/t/t4100/t-apply-6.patch b/third_party/git/t/t4100/t-apply-6.patch
index a72729a712..a72729a712 100644
--- a/t/t4100/t-apply-6.patch
+++ b/third_party/git/t/t4100/t-apply-6.patch
diff --git a/t/t4100/t-apply-7.expect b/third_party/git/t/t4100/t-apply-7.expect
index 1283164d99..1283164d99 100644
--- a/t/t4100/t-apply-7.expect
+++ b/third_party/git/t/t4100/t-apply-7.expect
diff --git a/t/t4100/t-apply-7.patch b/third_party/git/t/t4100/t-apply-7.patch
index 07c6589e74..07c6589e74 100644
--- a/t/t4100/t-apply-7.patch
+++ b/third_party/git/t/t4100/t-apply-7.patch
diff --git a/t/t4100/t-apply-8.expect b/third_party/git/t/t4100/t-apply-8.expect
index 55a55c3cc7..55a55c3cc7 100644
--- a/t/t4100/t-apply-8.expect
+++ b/third_party/git/t/t4100/t-apply-8.expect
diff --git a/t/t4100/t-apply-8.patch b/third_party/git/t/t4100/t-apply-8.patch
index 5ca13e6594..5ca13e6594 100644
--- a/t/t4100/t-apply-8.patch
+++ b/third_party/git/t/t4100/t-apply-8.patch
diff --git a/t/t4100/t-apply-9.expect b/third_party/git/t/t4100/t-apply-9.expect
index 55a55c3cc7..55a55c3cc7 100644
--- a/t/t4100/t-apply-9.expect
+++ b/third_party/git/t/t4100/t-apply-9.expect
diff --git a/t/t4100/t-apply-9.patch b/third_party/git/t/t4100/t-apply-9.patch
index 875d57d567..875d57d567 100644
--- a/t/t4100/t-apply-9.patch
+++ b/third_party/git/t/t4100/t-apply-9.patch
diff --git a/t/t4101-apply-nonl.sh b/third_party/git/t/t4101-apply-nonl.sh
index e3443d004d..e3443d004d 100755
--- a/t/t4101-apply-nonl.sh
+++ b/third_party/git/t/t4101-apply-nonl.sh
diff --git a/t/t4101/diff.0-1 b/third_party/git/t/t4101/diff.0-1
index 1010a88f47..1010a88f47 100644
--- a/t/t4101/diff.0-1
+++ b/third_party/git/t/t4101/diff.0-1
diff --git a/t/t4101/diff.0-2 b/third_party/git/t/t4101/diff.0-2
index 36460a243a..36460a243a 100644
--- a/t/t4101/diff.0-2
+++ b/third_party/git/t/t4101/diff.0-2
diff --git a/t/t4101/diff.0-3 b/third_party/git/t/t4101/diff.0-3
index b281c43e5b..b281c43e5b 100644
--- a/t/t4101/diff.0-3
+++ b/third_party/git/t/t4101/diff.0-3
diff --git a/t/t4101/diff.1-0 b/third_party/git/t/t4101/diff.1-0
index f0a2e92770..f0a2e92770 100644
--- a/t/t4101/diff.1-0
+++ b/third_party/git/t/t4101/diff.1-0
diff --git a/t/t4101/diff.1-2 b/third_party/git/t/t4101/diff.1-2
index 2a440a5ce2..2a440a5ce2 100644
--- a/t/t4101/diff.1-2
+++ b/third_party/git/t/t4101/diff.1-2
diff --git a/t/t4101/diff.1-3 b/third_party/git/t/t4101/diff.1-3
index 61aff975b6..61aff975b6 100644
--- a/t/t4101/diff.1-3
+++ b/third_party/git/t/t4101/diff.1-3
diff --git a/t/t4101/diff.2-0 b/third_party/git/t/t4101/diff.2-0
index c2e71ee344..c2e71ee344 100644
--- a/t/t4101/diff.2-0
+++ b/third_party/git/t/t4101/diff.2-0
diff --git a/t/t4101/diff.2-1 b/third_party/git/t/t4101/diff.2-1
index a66d9fd3a1..a66d9fd3a1 100644
--- a/t/t4101/diff.2-1
+++ b/third_party/git/t/t4101/diff.2-1
diff --git a/t/t4101/diff.2-3 b/third_party/git/t/t4101/diff.2-3
index 5633c831de..5633c831de 100644
--- a/t/t4101/diff.2-3
+++ b/third_party/git/t/t4101/diff.2-3
diff --git a/t/t4101/diff.3-0 b/third_party/git/t/t4101/diff.3-0
index 10b1a41edf..10b1a41edf 100644
--- a/t/t4101/diff.3-0
+++ b/third_party/git/t/t4101/diff.3-0
diff --git a/t/t4101/diff.3-1 b/third_party/git/t/t4101/diff.3-1
index c799c60fb9..c799c60fb9 100644
--- a/t/t4101/diff.3-1
+++ b/third_party/git/t/t4101/diff.3-1
diff --git a/t/t4101/diff.3-2 b/third_party/git/t/t4101/diff.3-2
index f8d1ba6dc2..f8d1ba6dc2 100644
--- a/t/t4101/diff.3-2
+++ b/third_party/git/t/t4101/diff.3-2
diff --git a/t/t4102-apply-rename.sh b/third_party/git/t/t4102-apply-rename.sh
index fae305979a..fae305979a 100755
--- a/t/t4102-apply-rename.sh
+++ b/third_party/git/t/t4102-apply-rename.sh
diff --git a/t/t4103-apply-binary.sh b/third_party/git/t/t4103-apply-binary.sh
index 1b420e3b5f..1b420e3b5f 100755
--- a/t/t4103-apply-binary.sh
+++ b/third_party/git/t/t4103-apply-binary.sh
diff --git a/t/t4104-apply-boundary.sh b/third_party/git/t/t4104-apply-boundary.sh
index 32e3b0ee0b..32e3b0ee0b 100755
--- a/t/t4104-apply-boundary.sh
+++ b/third_party/git/t/t4104-apply-boundary.sh
diff --git a/t/t4105-apply-fuzz.sh b/third_party/git/t/t4105-apply-fuzz.sh
index 3266e39400..3266e39400 100755
--- a/t/t4105-apply-fuzz.sh
+++ b/third_party/git/t/t4105-apply-fuzz.sh
diff --git a/t/t4106-apply-stdin.sh b/third_party/git/t/t4106-apply-stdin.sh
index 72467a1e8e..72467a1e8e 100755
--- a/t/t4106-apply-stdin.sh
+++ b/third_party/git/t/t4106-apply-stdin.sh
diff --git a/t/t4107-apply-ignore-whitespace.sh b/third_party/git/t/t4107-apply-ignore-whitespace.sh
index ac72eeaf27..ac72eeaf27 100755
--- a/t/t4107-apply-ignore-whitespace.sh
+++ b/third_party/git/t/t4107-apply-ignore-whitespace.sh
diff --git a/t/t4108-apply-threeway.sh b/third_party/git/t/t4108-apply-threeway.sh
index fa5d4efb89..fa5d4efb89 100755
--- a/t/t4108-apply-threeway.sh
+++ b/third_party/git/t/t4108-apply-threeway.sh
diff --git a/t/t4109-apply-multifrag.sh b/third_party/git/t/t4109-apply-multifrag.sh
index ac58083fe2..ac58083fe2 100755
--- a/t/t4109-apply-multifrag.sh
+++ b/third_party/git/t/t4109-apply-multifrag.sh
diff --git a/t/t4109/expect-1 b/third_party/git/t/t4109/expect-1
index 1db5ff1050..1db5ff1050 100644
--- a/t/t4109/expect-1
+++ b/third_party/git/t/t4109/expect-1
diff --git a/t/t4109/expect-2 b/third_party/git/t/t4109/expect-2
index bc52924112..bc52924112 100644
--- a/t/t4109/expect-2
+++ b/third_party/git/t/t4109/expect-2
diff --git a/t/t4109/expect-3 b/third_party/git/t/t4109/expect-3
index cd2a475feb..cd2a475feb 100644
--- a/t/t4109/expect-3
+++ b/third_party/git/t/t4109/expect-3
diff --git a/t/t4109/patch1.patch b/third_party/git/t/t4109/patch1.patch
index 1d411fc3cc..1d411fc3cc 100644
--- a/t/t4109/patch1.patch
+++ b/third_party/git/t/t4109/patch1.patch
diff --git a/t/t4109/patch2.patch b/third_party/git/t/t4109/patch2.patch
index 8c6b06d536..8c6b06d536 100644
--- a/t/t4109/patch2.patch
+++ b/third_party/git/t/t4109/patch2.patch
diff --git a/t/t4109/patch3.patch b/third_party/git/t/t4109/patch3.patch
index d696c55a75..d696c55a75 100644
--- a/t/t4109/patch3.patch
+++ b/third_party/git/t/t4109/patch3.patch
diff --git a/t/t4109/patch4.patch b/third_party/git/t/t4109/patch4.patch
index 4b085909b1..4b085909b1 100644
--- a/t/t4109/patch4.patch
+++ b/third_party/git/t/t4109/patch4.patch
diff --git a/t/t4110-apply-scan.sh b/third_party/git/t/t4110-apply-scan.sh
index 09f58112e0..09f58112e0 100755
--- a/t/t4110-apply-scan.sh
+++ b/third_party/git/t/t4110-apply-scan.sh
diff --git a/t/t4110/expect b/third_party/git/t/t4110/expect
index 87cc493ec8..87cc493ec8 100644
--- a/t/t4110/expect
+++ b/third_party/git/t/t4110/expect
diff --git a/t/t4110/patch1.patch b/third_party/git/t/t4110/patch1.patch
index 56139080dc..56139080dc 100644
--- a/t/t4110/patch1.patch
+++ b/third_party/git/t/t4110/patch1.patch
diff --git a/t/t4110/patch2.patch b/third_party/git/t/t4110/patch2.patch
index 04974247ec..04974247ec 100644
--- a/t/t4110/patch2.patch
+++ b/third_party/git/t/t4110/patch2.patch
diff --git a/t/t4110/patch3.patch b/third_party/git/t/t4110/patch3.patch
index 26bd4427f8..26bd4427f8 100644
--- a/t/t4110/patch3.patch
+++ b/third_party/git/t/t4110/patch3.patch
diff --git a/t/t4110/patch4.patch b/third_party/git/t/t4110/patch4.patch
index 9ffb9c2d7e..9ffb9c2d7e 100644
--- a/t/t4110/patch4.patch
+++ b/third_party/git/t/t4110/patch4.patch
diff --git a/t/t4110/patch5.patch b/third_party/git/t/t4110/patch5.patch
index c5ac6914f9..c5ac6914f9 100644
--- a/t/t4110/patch5.patch
+++ b/third_party/git/t/t4110/patch5.patch
diff --git a/t/t4111-apply-subdir.sh b/third_party/git/t/t4111-apply-subdir.sh
index 1618a6dbc7..1618a6dbc7 100755
--- a/t/t4111-apply-subdir.sh
+++ b/third_party/git/t/t4111-apply-subdir.sh
diff --git a/t/t4112-apply-renames.sh b/third_party/git/t/t4112-apply-renames.sh
index f9ad183758..f9ad183758 100755
--- a/t/t4112-apply-renames.sh
+++ b/third_party/git/t/t4112-apply-renames.sh
diff --git a/t/t4113-apply-ending.sh b/third_party/git/t/t4113-apply-ending.sh
index 66fa51591e..66fa51591e 100755
--- a/t/t4113-apply-ending.sh
+++ b/third_party/git/t/t4113-apply-ending.sh
diff --git a/t/t4114-apply-typechange.sh b/third_party/git/t/t4114-apply-typechange.sh
index ebadbc347f..ebadbc347f 100755
--- a/t/t4114-apply-typechange.sh
+++ b/third_party/git/t/t4114-apply-typechange.sh
diff --git a/t/t4115-apply-symlink.sh b/third_party/git/t/t4115-apply-symlink.sh
index 872fcda6cb..872fcda6cb 100755
--- a/t/t4115-apply-symlink.sh
+++ b/third_party/git/t/t4115-apply-symlink.sh
diff --git a/t/t4116-apply-reverse.sh b/third_party/git/t/t4116-apply-reverse.sh
index b99e65c086..b99e65c086 100755
--- a/t/t4116-apply-reverse.sh
+++ b/third_party/git/t/t4116-apply-reverse.sh
diff --git a/t/t4117-apply-reject.sh b/third_party/git/t/t4117-apply-reject.sh
index f7de6f077a..f7de6f077a 100755
--- a/t/t4117-apply-reject.sh
+++ b/third_party/git/t/t4117-apply-reject.sh
diff --git a/t/t4118-apply-empty-context.sh b/third_party/git/t/t4118-apply-empty-context.sh
index 65f2e4c3ef..65f2e4c3ef 100755
--- a/t/t4118-apply-empty-context.sh
+++ b/third_party/git/t/t4118-apply-empty-context.sh
diff --git a/t/t4119-apply-config.sh b/third_party/git/t/t4119-apply-config.sh
index a9a0583811..a9a0583811 100755
--- a/t/t4119-apply-config.sh
+++ b/third_party/git/t/t4119-apply-config.sh
diff --git a/t/t4120-apply-popt.sh b/third_party/git/t/t4120-apply-popt.sh
index 497b62868d..497b62868d 100755
--- a/t/t4120-apply-popt.sh
+++ b/third_party/git/t/t4120-apply-popt.sh
diff --git a/t/t4121-apply-diffs.sh b/third_party/git/t/t4121-apply-diffs.sh
index 66368effd5..66368effd5 100755
--- a/t/t4121-apply-diffs.sh
+++ b/third_party/git/t/t4121-apply-diffs.sh
diff --git a/t/t4122-apply-symlink-inside.sh b/third_party/git/t/t4122-apply-symlink-inside.sh
index 4acb3f336e..4acb3f336e 100755
--- a/t/t4122-apply-symlink-inside.sh
+++ b/third_party/git/t/t4122-apply-symlink-inside.sh
diff --git a/t/t4123-apply-shrink.sh b/third_party/git/t/t4123-apply-shrink.sh
index 984157f03b..984157f03b 100755
--- a/t/t4123-apply-shrink.sh
+++ b/third_party/git/t/t4123-apply-shrink.sh
diff --git a/t/t4124-apply-ws-rule.sh b/third_party/git/t/t4124-apply-ws-rule.sh
index ff51e9e789..ff51e9e789 100755
--- a/t/t4124-apply-ws-rule.sh
+++ b/third_party/git/t/t4124-apply-ws-rule.sh
diff --git a/t/t4125-apply-ws-fuzz.sh b/third_party/git/t/t4125-apply-ws-fuzz.sh
index 9671de7999..9671de7999 100755
--- a/t/t4125-apply-ws-fuzz.sh
+++ b/third_party/git/t/t4125-apply-ws-fuzz.sh
diff --git a/t/t4126-apply-empty.sh b/third_party/git/t/t4126-apply-empty.sh
index ceb6a79fe0..ceb6a79fe0 100755
--- a/t/t4126-apply-empty.sh
+++ b/third_party/git/t/t4126-apply-empty.sh
diff --git a/t/t4127-apply-same-fn.sh b/third_party/git/t/t4127-apply-same-fn.sh
index 972946c174..972946c174 100755
--- a/t/t4127-apply-same-fn.sh
+++ b/third_party/git/t/t4127-apply-same-fn.sh
diff --git a/t/t4128-apply-root.sh b/third_party/git/t/t4128-apply-root.sh
index 6cc741a634..6cc741a634 100755
--- a/t/t4128-apply-root.sh
+++ b/third_party/git/t/t4128-apply-root.sh
diff --git a/t/t4129-apply-samemode.sh b/third_party/git/t/t4129-apply-samemode.sh
index 5cdd76dfa7..5cdd76dfa7 100755
--- a/t/t4129-apply-samemode.sh
+++ b/third_party/git/t/t4129-apply-samemode.sh
diff --git a/t/t4130-apply-criss-cross-rename.sh b/third_party/git/t/t4130-apply-criss-cross-rename.sh
index f8a313bcb9..f8a313bcb9 100755
--- a/t/t4130-apply-criss-cross-rename.sh
+++ b/third_party/git/t/t4130-apply-criss-cross-rename.sh
diff --git a/t/t4131-apply-fake-ancestor.sh b/third_party/git/t/t4131-apply-fake-ancestor.sh
index b1361ce546..b1361ce546 100755
--- a/t/t4131-apply-fake-ancestor.sh
+++ b/third_party/git/t/t4131-apply-fake-ancestor.sh
diff --git a/t/t4132-apply-removal.sh b/third_party/git/t/t4132-apply-removal.sh
index fec1d6fa51..fec1d6fa51 100755
--- a/t/t4132-apply-removal.sh
+++ b/third_party/git/t/t4132-apply-removal.sh
diff --git a/t/t4133-apply-filenames.sh b/third_party/git/t/t4133-apply-filenames.sh
index c5ed3b17c4..c5ed3b17c4 100755
--- a/t/t4133-apply-filenames.sh
+++ b/third_party/git/t/t4133-apply-filenames.sh
diff --git a/t/t4134-apply-submodule.sh b/third_party/git/t/t4134-apply-submodule.sh
index 0043930ca6..0043930ca6 100755
--- a/t/t4134-apply-submodule.sh
+++ b/third_party/git/t/t4134-apply-submodule.sh
diff --git a/t/t4135-apply-weird-filenames.sh b/third_party/git/t/t4135-apply-weird-filenames.sh
index 6bc3fb97a7..6bc3fb97a7 100755
--- a/t/t4135-apply-weird-filenames.sh
+++ b/third_party/git/t/t4135-apply-weird-filenames.sh
diff --git a/t/t4135/.gitignore b/third_party/git/t/t4135/.gitignore
index 3e58e65f57..3e58e65f57 100644
--- a/t/t4135/.gitignore
+++ b/third_party/git/t/t4135/.gitignore
diff --git a/t/t4135/add-plain.diff b/third_party/git/t/t4135/add-plain.diff
index cf5970a089..cf5970a089 100644
--- a/t/t4135/add-plain.diff
+++ b/third_party/git/t/t4135/add-plain.diff
diff --git a/t/t4135/add-with backslash.diff b/third_party/git/t/t4135/add-with backslash.diff
index c6861e1966..c6861e1966 100644
--- a/t/t4135/add-with backslash.diff
+++ b/third_party/git/t/t4135/add-with backslash.diff
diff --git a/t/t4135/add-with quote.diff b/third_party/git/t/t4135/add-with quote.diff
index 866de78ca1..866de78ca1 100644
--- a/t/t4135/add-with quote.diff
+++ b/third_party/git/t/t4135/add-with quote.diff
diff --git a/t/t4135/add-with spaces.diff b/third_party/git/t/t4135/add-with spaces.diff
index a9a1212a21..a9a1212a21 100644
--- a/t/t4135/add-with spaces.diff
+++ b/third_party/git/t/t4135/add-with spaces.diff
diff --git a/t/t4135/add-with tab.diff b/third_party/git/t/t4135/add-with tab.diff
index bb67cb7930..bb67cb7930 100644
--- a/t/t4135/add-with tab.diff
+++ b/third_party/git/t/t4135/add-with tab.diff
diff --git a/t/t4135/damaged-tz.diff b/third_party/git/t/t4135/damaged-tz.diff
index 07aaf08370..07aaf08370 100644
--- a/t/t4135/damaged-tz.diff
+++ b/third_party/git/t/t4135/damaged-tz.diff
diff --git a/t/t4135/damaged.diff b/third_party/git/t/t4135/damaged.diff
index 68f7ededf9..68f7ededf9 100644
--- a/t/t4135/damaged.diff
+++ b/third_party/git/t/t4135/damaged.diff
diff --git a/t/t4135/diff-plain.diff b/third_party/git/t/t4135/diff-plain.diff
index acedcfa612..acedcfa612 100644
--- a/t/t4135/diff-plain.diff
+++ b/third_party/git/t/t4135/diff-plain.diff
diff --git a/t/t4135/diff-with backslash.diff b/third_party/git/t/t4135/diff-with backslash.diff
index 9068a61bd9..9068a61bd9 100644
--- a/t/t4135/diff-with backslash.diff
+++ b/third_party/git/t/t4135/diff-with backslash.diff
diff --git a/t/t4135/diff-with quote.diff b/third_party/git/t/t4135/diff-with quote.diff
index c8e8cc1a8d..c8e8cc1a8d 100644
--- a/t/t4135/diff-with quote.diff
+++ b/third_party/git/t/t4135/diff-with quote.diff
diff --git a/t/t4135/diff-with spaces.diff b/third_party/git/t/t4135/diff-with spaces.diff
index 3512056f21..3512056f21 100644
--- a/t/t4135/diff-with spaces.diff
+++ b/third_party/git/t/t4135/diff-with spaces.diff
diff --git a/t/t4135/diff-with tab.diff b/third_party/git/t/t4135/diff-with tab.diff
index 4e6d9b2941..4e6d9b2941 100644
--- a/t/t4135/diff-with tab.diff
+++ b/third_party/git/t/t4135/diff-with tab.diff
diff --git a/t/t4135/funny-tz.diff b/third_party/git/t/t4135/funny-tz.diff
index 998e3a867e..998e3a867e 100644
--- a/t/t4135/funny-tz.diff
+++ b/third_party/git/t/t4135/funny-tz.diff
diff --git a/t/t4135/git-plain.diff b/third_party/git/t/t4135/git-plain.diff
index db47d1a693..db47d1a693 100644
--- a/t/t4135/git-plain.diff
+++ b/third_party/git/t/t4135/git-plain.diff
diff --git a/t/t4135/git-with backslash.diff b/third_party/git/t/t4135/git-with backslash.diff
index 0e84a10e93..0e84a10e93 100644
--- a/t/t4135/git-with backslash.diff
+++ b/third_party/git/t/t4135/git-with backslash.diff
diff --git a/t/t4135/git-with quote.diff b/third_party/git/t/t4135/git-with quote.diff
index bdbea8af35..bdbea8af35 100644
--- a/t/t4135/git-with quote.diff
+++ b/third_party/git/t/t4135/git-with quote.diff
diff --git a/t/t4135/git-with spaces.diff b/third_party/git/t/t4135/git-with spaces.diff
index baaa810de0..baaa810de0 100644
--- a/t/t4135/git-with spaces.diff
+++ b/third_party/git/t/t4135/git-with spaces.diff
diff --git a/t/t4135/git-with tab.diff b/third_party/git/t/t4135/git-with tab.diff
index cca3c9287b..cca3c9287b 100644
--- a/t/t4135/git-with tab.diff
+++ b/third_party/git/t/t4135/git-with tab.diff
diff --git a/t/t4135/make-patches b/third_party/git/t/t4135/make-patches
index f5f45ddd09..f5f45ddd09 100755
--- a/t/t4135/make-patches
+++ b/third_party/git/t/t4135/make-patches
diff --git a/t/t4136-apply-check.sh b/third_party/git/t/t4136-apply-check.sh
index 4c3f264a63..4c3f264a63 100755
--- a/t/t4136-apply-check.sh
+++ b/third_party/git/t/t4136-apply-check.sh
diff --git a/t/t4137-apply-submodule.sh b/third_party/git/t/t4137-apply-submodule.sh
index a9bd40a6d0..a9bd40a6d0 100755
--- a/t/t4137-apply-submodule.sh
+++ b/third_party/git/t/t4137-apply-submodule.sh
diff --git a/t/t4138-apply-ws-expansion.sh b/third_party/git/t/t4138-apply-ws-expansion.sh
index 3b636a63a3..3b636a63a3 100755
--- a/t/t4138-apply-ws-expansion.sh
+++ b/third_party/git/t/t4138-apply-ws-expansion.sh
diff --git a/t/t4139-apply-escape.sh b/third_party/git/t/t4139-apply-escape.sh
index 45b5660a47..45b5660a47 100755
--- a/t/t4139-apply-escape.sh
+++ b/third_party/git/t/t4139-apply-escape.sh
diff --git a/t/t4150-am.sh b/third_party/git/t/t4150-am.sh
index 3f7f750cc8..3f7f750cc8 100755
--- a/t/t4150-am.sh
+++ b/third_party/git/t/t4150-am.sh
diff --git a/t/t4151-am-abort.sh b/third_party/git/t/t4151-am-abort.sh
index 9d8d3c72e7..9d8d3c72e7 100755
--- a/t/t4151-am-abort.sh
+++ b/third_party/git/t/t4151-am-abort.sh
diff --git a/t/t4152-am-subjects.sh b/third_party/git/t/t4152-am-subjects.sh
index 4c68245aca..4c68245aca 100755
--- a/t/t4152-am-subjects.sh
+++ b/third_party/git/t/t4152-am-subjects.sh
diff --git a/t/t4153-am-resume-override-opts.sh b/third_party/git/t/t4153-am-resume-override-opts.sh
index 8ea22d1bcb..8ea22d1bcb 100755
--- a/t/t4153-am-resume-override-opts.sh
+++ b/third_party/git/t/t4153-am-resume-override-opts.sh
diff --git a/t/t4200-rerere.sh b/third_party/git/t/t4200-rerere.sh
index 55b7750ade..55b7750ade 100755
--- a/t/t4200-rerere.sh
+++ b/third_party/git/t/t4200-rerere.sh
diff --git a/t/t4201-shortlog.sh b/third_party/git/t/t4201-shortlog.sh
index d3a7ce6bbb..d3a7ce6bbb 100755
--- a/t/t4201-shortlog.sh
+++ b/third_party/git/t/t4201-shortlog.sh
diff --git a/t/t4202-log.sh b/third_party/git/t/t4202-log.sh
index c20209324c..c20209324c 100755
--- a/t/t4202-log.sh
+++ b/third_party/git/t/t4202-log.sh
diff --git a/t/t4203-mailmap.sh b/third_party/git/t/t4203-mailmap.sh
index 918ada69eb..918ada69eb 100755
--- a/t/t4203-mailmap.sh
+++ b/third_party/git/t/t4203-mailmap.sh
diff --git a/t/t4204-patch-id.sh b/third_party/git/t/t4204-patch-id.sh
index 0288c17ec6..0288c17ec6 100755
--- a/t/t4204-patch-id.sh
+++ b/third_party/git/t/t4204-patch-id.sh
diff --git a/t/t4205-log-pretty-formats.sh b/third_party/git/t/t4205-log-pretty-formats.sh
index f42a69faa2..f42a69faa2 100755
--- a/t/t4205-log-pretty-formats.sh
+++ b/third_party/git/t/t4205-log-pretty-formats.sh
diff --git a/t/t4206-log-follow-harder-copies.sh b/third_party/git/t/t4206-log-follow-harder-copies.sh
index ad29e65fcb..ad29e65fcb 100755
--- a/t/t4206-log-follow-harder-copies.sh
+++ b/third_party/git/t/t4206-log-follow-harder-copies.sh
diff --git a/t/t4207-log-decoration-colors.sh b/third_party/git/t/t4207-log-decoration-colors.sh
index 60f040cab8..60f040cab8 100755
--- a/t/t4207-log-decoration-colors.sh
+++ b/third_party/git/t/t4207-log-decoration-colors.sh
diff --git a/t/t4208-log-magic-pathspec.sh b/third_party/git/t/t4208-log-magic-pathspec.sh
index 4c8f3b8e1b..4c8f3b8e1b 100755
--- a/t/t4208-log-magic-pathspec.sh
+++ b/third_party/git/t/t4208-log-magic-pathspec.sh
diff --git a/t/t4209-log-pickaxe.sh b/third_party/git/t/t4209-log-pickaxe.sh
index 5d06f5f45e..5d06f5f45e 100755
--- a/t/t4209-log-pickaxe.sh
+++ b/third_party/git/t/t4209-log-pickaxe.sh
diff --git a/t/t4210-log-i18n.sh b/third_party/git/t/t4210-log-i18n.sh
index 7c519436ef..7c519436ef 100755
--- a/t/t4210-log-i18n.sh
+++ b/third_party/git/t/t4210-log-i18n.sh
diff --git a/t/t4211-line-log.sh b/third_party/git/t/t4211-line-log.sh
index 1db7bd0f59..1db7bd0f59 100755
--- a/t/t4211-line-log.sh
+++ b/third_party/git/t/t4211-line-log.sh
diff --git a/t/t4211/expect.beginning-of-file b/third_party/git/t/t4211/expect.beginning-of-file
index 91b4054898..91b4054898 100644
--- a/t/t4211/expect.beginning-of-file
+++ b/third_party/git/t/t4211/expect.beginning-of-file
diff --git a/t/t4211/expect.end-of-file b/third_party/git/t/t4211/expect.end-of-file
index bd25bb2f59..bd25bb2f59 100644
--- a/t/t4211/expect.end-of-file
+++ b/third_party/git/t/t4211/expect.end-of-file
diff --git a/t/t4211/expect.move-support-f b/third_party/git/t/t4211/expect.move-support-f
index c905e01bc2..c905e01bc2 100644
--- a/t/t4211/expect.move-support-f
+++ b/third_party/git/t/t4211/expect.move-support-f
diff --git a/t/t4211/expect.multiple b/third_party/git/t/t4211/expect.multiple
index 76ad5b598c..76ad5b598c 100644
--- a/t/t4211/expect.multiple
+++ b/third_party/git/t/t4211/expect.multiple
diff --git a/t/t4211/expect.multiple-overlapping b/third_party/git/t/t4211/expect.multiple-overlapping
index d930b6eec4..d930b6eec4 100644
--- a/t/t4211/expect.multiple-overlapping
+++ b/third_party/git/t/t4211/expect.multiple-overlapping
diff --git a/t/t4211/expect.multiple-superset b/third_party/git/t/t4211/expect.multiple-superset
index d930b6eec4..d930b6eec4 100644
--- a/t/t4211/expect.multiple-superset
+++ b/third_party/git/t/t4211/expect.multiple-superset
diff --git a/t/t4211/expect.parallel-change-f-to-main b/third_party/git/t/t4211/expect.parallel-change-f-to-main
index 052def8074..052def8074 100644
--- a/t/t4211/expect.parallel-change-f-to-main
+++ b/third_party/git/t/t4211/expect.parallel-change-f-to-main
diff --git a/t/t4211/expect.simple-f b/third_party/git/t/t4211/expect.simple-f
index a1f5bc49c8..a1f5bc49c8 100644
--- a/t/t4211/expect.simple-f
+++ b/third_party/git/t/t4211/expect.simple-f
diff --git a/t/t4211/expect.simple-f-to-main b/third_party/git/t/t4211/expect.simple-f-to-main
index a475768710..a475768710 100644
--- a/t/t4211/expect.simple-f-to-main
+++ b/third_party/git/t/t4211/expect.simple-f-to-main
diff --git a/t/t4211/expect.simple-main b/third_party/git/t/t4211/expect.simple-main
index 39ce39bebe..39ce39bebe 100644
--- a/t/t4211/expect.simple-main
+++ b/third_party/git/t/t4211/expect.simple-main
diff --git a/t/t4211/expect.simple-main-to-end b/third_party/git/t/t4211/expect.simple-main-to-end
index 8480bd9cc4..8480bd9cc4 100644
--- a/t/t4211/expect.simple-main-to-end
+++ b/third_party/git/t/t4211/expect.simple-main-to-end
diff --git a/t/t4211/expect.two-ranges b/third_party/git/t/t4211/expect.two-ranges
index 6109aa0dce..6109aa0dce 100644
--- a/t/t4211/expect.two-ranges
+++ b/third_party/git/t/t4211/expect.two-ranges
diff --git a/t/t4211/expect.vanishes-early b/third_party/git/t/t4211/expect.vanishes-early
index 1f7cd06941..1f7cd06941 100644
--- a/t/t4211/expect.vanishes-early
+++ b/third_party/git/t/t4211/expect.vanishes-early
diff --git a/t/t4211/history.export b/third_party/git/t/t4211/history.export
index f9f41e211e..f9f41e211e 100644
--- a/t/t4211/history.export
+++ b/third_party/git/t/t4211/history.export
diff --git a/t/t4212-log-corrupt.sh b/third_party/git/t/t4212-log-corrupt.sh
index 03b952c90d..03b952c90d 100755
--- a/t/t4212-log-corrupt.sh
+++ b/third_party/git/t/t4212-log-corrupt.sh
diff --git a/t/t4213-log-tabexpand.sh b/third_party/git/t/t4213-log-tabexpand.sh
index 7f90f58c03..7f90f58c03 100755
--- a/t/t4213-log-tabexpand.sh
+++ b/third_party/git/t/t4213-log-tabexpand.sh
diff --git a/t/t4214-log-graph-octopus.sh b/third_party/git/t/t4214-log-graph-octopus.sh
index dab96c89aa..dab96c89aa 100755
--- a/t/t4214-log-graph-octopus.sh
+++ b/third_party/git/t/t4214-log-graph-octopus.sh
diff --git a/t/t4252-am-options.sh b/third_party/git/t/t4252-am-options.sh
index e758e634a3..e758e634a3 100755
--- a/t/t4252-am-options.sh
+++ b/third_party/git/t/t4252-am-options.sh
diff --git a/t/t4252/am-test-1-1 b/third_party/git/t/t4252/am-test-1-1
index b0c09dc965..b0c09dc965 100644
--- a/t/t4252/am-test-1-1
+++ b/third_party/git/t/t4252/am-test-1-1
diff --git a/t/t4252/am-test-1-2 b/third_party/git/t/t4252/am-test-1-2
index 1b874ae115..1b874ae115 100644
--- a/t/t4252/am-test-1-2
+++ b/third_party/git/t/t4252/am-test-1-2
diff --git a/t/t4252/am-test-2-1 b/third_party/git/t/t4252/am-test-2-1
index feda94a0cc..feda94a0cc 100644
--- a/t/t4252/am-test-2-1
+++ b/third_party/git/t/t4252/am-test-2-1
diff --git a/t/t4252/am-test-2-2 b/third_party/git/t/t4252/am-test-2-2
index 2ac6600976..2ac6600976 100644
--- a/t/t4252/am-test-2-2
+++ b/third_party/git/t/t4252/am-test-2-2
diff --git a/t/t4252/am-test-3-1 b/third_party/git/t/t4252/am-test-3-1
index 608e5abba4..608e5abba4 100644
--- a/t/t4252/am-test-3-1
+++ b/third_party/git/t/t4252/am-test-3-1
diff --git a/t/t4252/am-test-3-2 b/third_party/git/t/t4252/am-test-3-2
index 0081b96f2a..0081b96f2a 100644
--- a/t/t4252/am-test-3-2
+++ b/third_party/git/t/t4252/am-test-3-2
diff --git a/t/t4252/am-test-4-1 b/third_party/git/t/t4252/am-test-4-1
index e48cd6cbde..e48cd6cbde 100644
--- a/t/t4252/am-test-4-1
+++ b/third_party/git/t/t4252/am-test-4-1
diff --git a/t/t4252/am-test-4-2 b/third_party/git/t/t4252/am-test-4-2
index 0e69bfa55b..0e69bfa55b 100644
--- a/t/t4252/am-test-4-2
+++ b/third_party/git/t/t4252/am-test-4-2
diff --git a/t/t4252/am-test-5-1 b/third_party/git/t/t4252/am-test-5-1
index da7bf29cbe..da7bf29cbe 100644
--- a/t/t4252/am-test-5-1
+++ b/third_party/git/t/t4252/am-test-5-1
diff --git a/t/t4252/am-test-5-2 b/third_party/git/t/t4252/am-test-5-2
index 373025bcf6..373025bcf6 100644
--- a/t/t4252/am-test-5-2
+++ b/third_party/git/t/t4252/am-test-5-2
diff --git a/t/t4252/am-test-6-1 b/third_party/git/t/t4252/am-test-6-1
index a8859e9b8f..a8859e9b8f 100644
--- a/t/t4252/am-test-6-1
+++ b/third_party/git/t/t4252/am-test-6-1
diff --git a/t/t4252/file-1-0 b/third_party/git/t/t4252/file-1-0
index 06e567b11d..06e567b11d 100644
--- a/t/t4252/file-1-0
+++ b/third_party/git/t/t4252/file-1-0
diff --git a/t/t4252/file-2-0 b/third_party/git/t/t4252/file-2-0
index 06e567b11d..06e567b11d 100644
--- a/t/t4252/file-2-0
+++ b/third_party/git/t/t4252/file-2-0
diff --git a/t/t4253-am-keep-cr-dos.sh b/third_party/git/t/t4253-am-keep-cr-dos.sh
index 6e1b73ec3a..6e1b73ec3a 100755
--- a/t/t4253-am-keep-cr-dos.sh
+++ b/third_party/git/t/t4253-am-keep-cr-dos.sh
diff --git a/t/t4254-am-corrupt.sh b/third_party/git/t/t4254-am-corrupt.sh
index fd3bdbfe2c..fd3bdbfe2c 100755
--- a/t/t4254-am-corrupt.sh
+++ b/third_party/git/t/t4254-am-corrupt.sh
diff --git a/t/t4255-am-submodule.sh b/third_party/git/t/t4255-am-submodule.sh
index 0ba8194403..0ba8194403 100755
--- a/t/t4255-am-submodule.sh
+++ b/third_party/git/t/t4255-am-submodule.sh
diff --git a/t/t4256-am-format-flowed.sh b/third_party/git/t/t4256-am-format-flowed.sh
index 6340310e9a..6340310e9a 100755
--- a/t/t4256-am-format-flowed.sh
+++ b/third_party/git/t/t4256-am-format-flowed.sh
diff --git a/t/t4256/1/mailinfo.c b/third_party/git/t/t4256/1/mailinfo.c
index b395adbdf2..b395adbdf2 100644
--- a/t/t4256/1/mailinfo.c
+++ b/third_party/git/t/t4256/1/mailinfo.c
diff --git a/t/t4256/1/mailinfo.c.orig b/third_party/git/t/t4256/1/mailinfo.c.orig
index 3281a37d51..3281a37d51 100644
--- a/t/t4256/1/mailinfo.c.orig
+++ b/third_party/git/t/t4256/1/mailinfo.c.orig
diff --git a/t/t4256/1/patch b/third_party/git/t/t4256/1/patch
index bd0d8b0251..bd0d8b0251 100644
--- a/t/t4256/1/patch
+++ b/third_party/git/t/t4256/1/patch
diff --git a/t/t4257-am-interactive.sh b/third_party/git/t/t4257-am-interactive.sh
index 5344bd248a..5344bd248a 100755
--- a/t/t4257-am-interactive.sh
+++ b/third_party/git/t/t4257-am-interactive.sh
diff --git a/t/t4300-merge-tree.sh b/third_party/git/t/t4300-merge-tree.sh
index d87cc7d9ef..d87cc7d9ef 100755
--- a/t/t4300-merge-tree.sh
+++ b/third_party/git/t/t4300-merge-tree.sh
diff --git a/t/t5000-tar-tree.sh b/third_party/git/t/t5000-tar-tree.sh
index 37655a237c..37655a237c 100755
--- a/t/t5000-tar-tree.sh
+++ b/third_party/git/t/t5000-tar-tree.sh
diff --git a/t/t5000/huge-and-future.tar b/third_party/git/t/t5000/huge-and-future.tar
index 63155e1855..63155e1855 100644
--- a/t/t5000/huge-and-future.tar
+++ b/third_party/git/t/t5000/huge-and-future.tar
Binary files differdiff --git a/t/t5000/huge-object b/third_party/git/t/t5000/huge-object
index 5cbe9ec312..5cbe9ec312 100644
--- a/t/t5000/huge-object
+++ b/third_party/git/t/t5000/huge-object
Binary files differdiff --git a/t/t5000/pax.tar b/third_party/git/t/t5000/pax.tar
index d911737149..d911737149 100644
--- a/t/t5000/pax.tar
+++ b/third_party/git/t/t5000/pax.tar
Binary files differdiff --git a/t/t5001-archive-attr.sh b/third_party/git/t/t5001-archive-attr.sh
index e9aa97117a..e9aa97117a 100755
--- a/t/t5001-archive-attr.sh
+++ b/third_party/git/t/t5001-archive-attr.sh
diff --git a/t/t5002-archive-attr-pattern.sh b/third_party/git/t/t5002-archive-attr-pattern.sh
index bda6d7d7e9..bda6d7d7e9 100755
--- a/t/t5002-archive-attr-pattern.sh
+++ b/third_party/git/t/t5002-archive-attr-pattern.sh
diff --git a/t/t5003-archive-zip.sh b/third_party/git/t/t5003-archive-zip.sh
index 106eddbd85..106eddbd85 100755
--- a/t/t5003-archive-zip.sh
+++ b/third_party/git/t/t5003-archive-zip.sh
diff --git a/t/t5003/infozip-symlinks.zip b/third_party/git/t/t5003/infozip-symlinks.zip
index 065728c631..065728c631 100644
--- a/t/t5003/infozip-symlinks.zip
+++ b/third_party/git/t/t5003/infozip-symlinks.zip
Binary files differdiff --git a/t/t5004-archive-corner-cases.sh b/third_party/git/t/t5004-archive-corner-cases.sh
index 271eb5a1fd..271eb5a1fd 100755
--- a/t/t5004-archive-corner-cases.sh
+++ b/third_party/git/t/t5004-archive-corner-cases.sh
diff --git a/t/t5004/big-pack.zip b/third_party/git/t/t5004/big-pack.zip
index caaf614eee..caaf614eee 100644
--- a/t/t5004/big-pack.zip
+++ b/third_party/git/t/t5004/big-pack.zip
Binary files differdiff --git a/t/t5004/empty-with-pax-header.tar b/third_party/git/t/t5004/empty-with-pax-header.tar
index da9e39e6cf..da9e39e6cf 100644
--- a/t/t5004/empty-with-pax-header.tar
+++ b/third_party/git/t/t5004/empty-with-pax-header.tar
Binary files differdiff --git a/t/t5004/empty.zip b/third_party/git/t/t5004/empty.zip
index 1a76bb6005..1a76bb6005 100644
--- a/t/t5004/empty.zip
+++ b/third_party/git/t/t5004/empty.zip
Binary files differdiff --git a/t/t5100-mailinfo.sh b/third_party/git/t/t5100-mailinfo.sh
index 9690dcad4f..9690dcad4f 100755
--- a/t/t5100-mailinfo.sh
+++ b/third_party/git/t/t5100-mailinfo.sh
diff --git a/t/t5100/.gitattributes b/third_party/git/t/t5100/.gitattributes
index c93f5142fa..c93f5142fa 100644
--- a/t/t5100/.gitattributes
+++ b/third_party/git/t/t5100/.gitattributes
diff --git a/t/t5100/0001mboxrd b/third_party/git/t/t5100/0001mboxrd
index 494ec554b9..494ec554b9 100644
--- a/t/t5100/0001mboxrd
+++ b/third_party/git/t/t5100/0001mboxrd
diff --git a/t/t5100/0002mboxrd b/third_party/git/t/t5100/0002mboxrd
index 71343d41f2..71343d41f2 100644
--- a/t/t5100/0002mboxrd
+++ b/third_party/git/t/t5100/0002mboxrd
diff --git a/t/t5100/comment.expect b/third_party/git/t/t5100/comment.expect
index 7228177984..7228177984 100644
--- a/t/t5100/comment.expect
+++ b/third_party/git/t/t5100/comment.expect
diff --git a/t/t5100/comment.in b/third_party/git/t/t5100/comment.in
index c53a192dfe..c53a192dfe 100644
--- a/t/t5100/comment.in
+++ b/third_party/git/t/t5100/comment.in
diff --git a/t/t5100/embed-from.expect b/third_party/git/t/t5100/embed-from.expect
index 06a3a3859a..06a3a3859a 100644
--- a/t/t5100/embed-from.expect
+++ b/third_party/git/t/t5100/embed-from.expect
diff --git a/t/t5100/embed-from.in b/third_party/git/t/t5100/embed-from.in
index 5f3f84e508..5f3f84e508 100644
--- a/t/t5100/embed-from.in
+++ b/third_party/git/t/t5100/embed-from.in
diff --git a/t/t5100/msg0013 b/third_party/git/t/t5100/empty
index e69de29bb2..e69de29bb2 100644
--- a/t/t5100/msg0013
+++ b/third_party/git/t/t5100/empty
diff --git a/t/t5100/info-from.expect b/third_party/git/t/t5100/info-from.expect
index c31d2eb550..c31d2eb550 100644
--- a/t/t5100/info-from.expect
+++ b/third_party/git/t/t5100/info-from.expect
diff --git a/t/t5100/info-from.in b/third_party/git/t/t5100/info-from.in
index 4f082093fc..4f082093fc 100644
--- a/t/t5100/info-from.in
+++ b/third_party/git/t/t5100/info-from.in
diff --git a/t/t5100/info0001 b/third_party/git/t/t5100/info0001
index f951538acc..f951538acc 100644
--- a/t/t5100/info0001
+++ b/third_party/git/t/t5100/info0001
diff --git a/t/t5100/info0002 b/third_party/git/t/t5100/info0002
index 49bb0fec85..49bb0fec85 100644
--- a/t/t5100/info0002
+++ b/third_party/git/t/t5100/info0002
diff --git a/t/t5100/info0003 b/third_party/git/t/t5100/info0003
index bd0d1221aa..bd0d1221aa 100644
--- a/t/t5100/info0003
+++ b/third_party/git/t/t5100/info0003
diff --git a/t/t5100/info0004 b/third_party/git/t/t5100/info0004
index 616c3092a2..616c3092a2 100644
--- a/t/t5100/info0004
+++ b/third_party/git/t/t5100/info0004
diff --git a/t/t5100/info0005 b/third_party/git/t/t5100/info0005
index 46a46fc772..46a46fc772 100644
--- a/t/t5100/info0005
+++ b/third_party/git/t/t5100/info0005
diff --git a/t/t5100/info0006 b/third_party/git/t/t5100/info0006
index 8c052777e0..8c052777e0 100644
--- a/t/t5100/info0006
+++ b/third_party/git/t/t5100/info0006
diff --git a/t/t5100/info0007 b/third_party/git/t/t5100/info0007
index 49bb0fec85..49bb0fec85 100644
--- a/t/t5100/info0007
+++ b/third_party/git/t/t5100/info0007
diff --git a/t/t5100/info0008 b/third_party/git/t/t5100/info0008
index e8a2951383..e8a2951383 100644
--- a/t/t5100/info0008
+++ b/third_party/git/t/t5100/info0008
diff --git a/t/t5100/info0009 b/third_party/git/t/t5100/info0009
index 2a66321c80..2a66321c80 100644
--- a/t/t5100/info0009
+++ b/third_party/git/t/t5100/info0009
diff --git a/t/t5100/info0010 b/third_party/git/t/t5100/info0010
index 1791241e46..1791241e46 100644
--- a/t/t5100/info0010
+++ b/third_party/git/t/t5100/info0010
diff --git a/t/t5100/info0011 b/third_party/git/t/t5100/info0011
index da5a605a12..da5a605a12 100644
--- a/t/t5100/info0011
+++ b/third_party/git/t/t5100/info0011
diff --git a/t/t5100/info0012 b/third_party/git/t/t5100/info0012
index ac1216ff75..ac1216ff75 100644
--- a/t/t5100/info0012
+++ b/third_party/git/t/t5100/info0012
diff --git a/t/t5100/info0012--message-id b/third_party/git/t/t5100/info0012--message-id
index ac1216ff75..ac1216ff75 100644
--- a/t/t5100/info0012--message-id
+++ b/third_party/git/t/t5100/info0012--message-id
diff --git a/t/t5100/info0013 b/third_party/git/t/t5100/info0013
index bbe049e20e..bbe049e20e 100644
--- a/t/t5100/info0013
+++ b/third_party/git/t/t5100/info0013
diff --git a/t/t5100/info0014 b/third_party/git/t/t5100/info0014
index 08566b34b9..08566b34b9 100644
--- a/t/t5100/info0014
+++ b/third_party/git/t/t5100/info0014
diff --git a/t/t5100/info0014--scissors b/third_party/git/t/t5100/info0014--scissors
index ab9c8d0905..ab9c8d0905 100644
--- a/t/t5100/info0014--scissors
+++ b/third_party/git/t/t5100/info0014--scissors
diff --git a/t/t5100/info0015 b/third_party/git/t/t5100/info0015
index 0114f106c5..0114f106c5 100644
--- a/t/t5100/info0015
+++ b/third_party/git/t/t5100/info0015
diff --git a/t/t5100/info0015--no-inbody-headers b/third_party/git/t/t5100/info0015--no-inbody-headers
index c4d8d7720e..c4d8d7720e 100644
--- a/t/t5100/info0015--no-inbody-headers
+++ b/third_party/git/t/t5100/info0015--no-inbody-headers
diff --git a/t/t5100/info0016 b/third_party/git/t/t5100/info0016
index 38ccd0dcf2..38ccd0dcf2 100644
--- a/t/t5100/info0016
+++ b/third_party/git/t/t5100/info0016
diff --git a/t/t5100/info0016--no-inbody-headers b/third_party/git/t/t5100/info0016--no-inbody-headers
index f4857d45df..f4857d45df 100644
--- a/t/t5100/info0016--no-inbody-headers
+++ b/third_party/git/t/t5100/info0016--no-inbody-headers
diff --git a/t/t5100/info0017 b/third_party/git/t/t5100/info0017
index d2bc89ffe9..d2bc89ffe9 100644
--- a/t/t5100/info0017
+++ b/third_party/git/t/t5100/info0017
diff --git a/t/t5100/info0018 b/third_party/git/t/t5100/info0018
index d53e7491c7..d53e7491c7 100644
--- a/t/t5100/info0018
+++ b/third_party/git/t/t5100/info0018
diff --git a/t/t5100/info0018--no-inbody-headers b/third_party/git/t/t5100/info0018--no-inbody-headers
index 30b17bd913..30b17bd913 100644
--- a/t/t5100/info0018--no-inbody-headers
+++ b/third_party/git/t/t5100/info0018--no-inbody-headers
diff --git a/t/t5100/msg0001 b/third_party/git/t/t5100/msg0001
index b275a9a9b2..b275a9a9b2 100644
--- a/t/t5100/msg0001
+++ b/third_party/git/t/t5100/msg0001
diff --git a/t/t5100/msg0002 b/third_party/git/t/t5100/msg0002
index e2546ec733..e2546ec733 100644
--- a/t/t5100/msg0002
+++ b/third_party/git/t/t5100/msg0002
diff --git a/t/t5100/msg0003 b/third_party/git/t/t5100/msg0003
index 1ac68101b1..1ac68101b1 100644
--- a/t/t5100/msg0003
+++ b/third_party/git/t/t5100/msg0003
diff --git a/t/t5100/msg0004 b/third_party/git/t/t5100/msg0004
index 6f8ba3b8e0..6f8ba3b8e0 100644
--- a/t/t5100/msg0004
+++ b/third_party/git/t/t5100/msg0004
diff --git a/t/t5100/msg0005 b/third_party/git/t/t5100/msg0005
index dd94cd7b9f..dd94cd7b9f 100644
--- a/t/t5100/msg0005
+++ b/third_party/git/t/t5100/msg0005
diff --git a/t/t5100/msg0006 b/third_party/git/t/t5100/msg0006
index b275a9a9b2..b275a9a9b2 100644
--- a/t/t5100/msg0006
+++ b/third_party/git/t/t5100/msg0006
diff --git a/t/t5100/msg0007 b/third_party/git/t/t5100/msg0007
index 71b23c0236..71b23c0236 100644
--- a/t/t5100/msg0007
+++ b/third_party/git/t/t5100/msg0007
diff --git a/t/t5100/msg0008 b/third_party/git/t/t5100/msg0008
index a80ecb97ef..a80ecb97ef 100644
--- a/t/t5100/msg0008
+++ b/third_party/git/t/t5100/msg0008
diff --git a/t/t5100/msg0009 b/third_party/git/t/t5100/msg0009
index 9ffe131489..9ffe131489 100644
--- a/t/t5100/msg0009
+++ b/third_party/git/t/t5100/msg0009
diff --git a/t/t5100/msg0010 b/third_party/git/t/t5100/msg0010
index a96c230092..a96c230092 100644
--- a/t/t5100/msg0010
+++ b/third_party/git/t/t5100/msg0010
diff --git a/t/t5100/msg0011 b/third_party/git/t/t5100/msg0011
index 4667f21007..4667f21007 100644
--- a/t/t5100/msg0011
+++ b/third_party/git/t/t5100/msg0011
diff --git a/t/t5100/msg0012 b/third_party/git/t/t5100/msg0012
index 1dc2bf7f7f..1dc2bf7f7f 100644
--- a/t/t5100/msg0012
+++ b/third_party/git/t/t5100/msg0012
diff --git a/t/t5100/msg0012--message-id b/third_party/git/t/t5100/msg0012--message-id
index 376e26e9ae..376e26e9ae 100644
--- a/t/t5100/msg0012--message-id
+++ b/third_party/git/t/t5100/msg0012--message-id
diff --git a/t/t5100/msg0015 b/third_party/git/t/t5100/msg0013
index e69de29bb2..e69de29bb2 100644
--- a/t/t5100/msg0015
+++ b/third_party/git/t/t5100/msg0013
diff --git a/t/t5100/msg0014 b/third_party/git/t/t5100/msg0014
index 62e5cd2ecd..62e5cd2ecd 100644
--- a/t/t5100/msg0014
+++ b/third_party/git/t/t5100/msg0014
diff --git a/t/t5100/msg0014--scissors b/third_party/git/t/t5100/msg0014--scissors
index 259c6a46d2..259c6a46d2 100644
--- a/t/t5100/msg0014--scissors
+++ b/third_party/git/t/t5100/msg0014--scissors
diff --git a/t/t5100/patch0007 b/third_party/git/t/t5100/msg0015
index e69de29bb2..e69de29bb2 100644
--- a/t/t5100/patch0007
+++ b/third_party/git/t/t5100/msg0015
diff --git a/t/t5100/msg0015--no-inbody-headers b/third_party/git/t/t5100/msg0015--no-inbody-headers
index be5115b1c1..be5115b1c1 100644
--- a/t/t5100/msg0015--no-inbody-headers
+++ b/third_party/git/t/t5100/msg0015--no-inbody-headers
diff --git a/t/t5100/msg0016 b/third_party/git/t/t5100/msg0016
index 0d9adada96..0d9adada96 100644
--- a/t/t5100/msg0016
+++ b/third_party/git/t/t5100/msg0016
diff --git a/t/t5100/msg0016--no-inbody-headers b/third_party/git/t/t5100/msg0016--no-inbody-headers
index 1063f51178..1063f51178 100644
--- a/t/t5100/msg0016--no-inbody-headers
+++ b/third_party/git/t/t5100/msg0016--no-inbody-headers
diff --git a/t/t5100/msg0017 b/third_party/git/t/t5100/msg0017
index 2ee0900850..2ee0900850 100644
--- a/t/t5100/msg0017
+++ b/third_party/git/t/t5100/msg0017
diff --git a/t/t5100/msg0018 b/third_party/git/t/t5100/msg0018
index 56de83d7fc..56de83d7fc 100644
--- a/t/t5100/msg0018
+++ b/third_party/git/t/t5100/msg0018
diff --git a/t/t5100/msg0018--no-inbody-headers b/third_party/git/t/t5100/msg0018--no-inbody-headers
index b1e05d3862..b1e05d3862 100644
--- a/t/t5100/msg0018--no-inbody-headers
+++ b/third_party/git/t/t5100/msg0018--no-inbody-headers
diff --git a/t/t5100/nul-b64.expect b/third_party/git/t/t5100/nul-b64.expect
index d7d680f631..d7d680f631 100644
--- a/t/t5100/nul-b64.expect
+++ b/third_party/git/t/t5100/nul-b64.expect
Binary files differdiff --git a/t/t5100/nul-b64.in b/third_party/git/t/t5100/nul-b64.in
index 16540d961f..16540d961f 100644
--- a/t/t5100/nul-b64.in
+++ b/third_party/git/t/t5100/nul-b64.in
diff --git a/t/t5100/nul-plain b/third_party/git/t/t5100/nul-plain
index 3d40691787..3d40691787 100644
--- a/t/t5100/nul-plain
+++ b/third_party/git/t/t5100/nul-plain
Binary files differdiff --git a/t/t5100/patch0001 b/third_party/git/t/t5100/patch0001
index 02c97746d6..02c97746d6 100644
--- a/t/t5100/patch0001
+++ b/third_party/git/t/t5100/patch0001
diff --git a/t/t5100/patch0002 b/third_party/git/t/t5100/patch0002
index 02c97746d6..02c97746d6 100644
--- a/t/t5100/patch0002
+++ b/third_party/git/t/t5100/patch0002
diff --git a/t/t5100/patch0003 b/third_party/git/t/t5100/patch0003
index 02c97746d6..02c97746d6 100644
--- a/t/t5100/patch0003
+++ b/third_party/git/t/t5100/patch0003
diff --git a/t/t5100/patch0004 b/third_party/git/t/t5100/patch0004
index 196458e44e..196458e44e 100644
--- a/t/t5100/patch0004
+++ b/third_party/git/t/t5100/patch0004
diff --git a/t/t5100/patch0005 b/third_party/git/t/t5100/patch0005
index ab7a38373b..ab7a38373b 100644
--- a/t/t5100/patch0005
+++ b/third_party/git/t/t5100/patch0005
diff --git a/t/t5100/patch0006 b/third_party/git/t/t5100/patch0006
index 02c97746d6..02c97746d6 100644
--- a/t/t5100/patch0006
+++ b/third_party/git/t/t5100/patch0006
diff --git a/t/t5100/patch0008 b/third_party/git/t/t5100/patch0007
index e69de29bb2..e69de29bb2 100644
--- a/t/t5100/patch0008
+++ b/third_party/git/t/t5100/patch0007
diff --git a/t/t5100/patch0013 b/third_party/git/t/t5100/patch0008
index e69de29bb2..e69de29bb2 100644
--- a/t/t5100/patch0013
+++ b/third_party/git/t/t5100/patch0008
diff --git a/t/t5100/patch0009 b/third_party/git/t/t5100/patch0009
index 65615c34af..65615c34af 100644
--- a/t/t5100/patch0009
+++ b/third_party/git/t/t5100/patch0009
diff --git a/t/t5100/patch0010 b/third_party/git/t/t5100/patch0010
index 436821c97a..436821c97a 100644
--- a/t/t5100/patch0010
+++ b/third_party/git/t/t5100/patch0010
diff --git a/t/t5100/patch0011 b/third_party/git/t/t5100/patch0011
index 0988713761..0988713761 100644
--- a/t/t5100/patch0011
+++ b/third_party/git/t/t5100/patch0011
diff --git a/t/t5100/patch0012 b/third_party/git/t/t5100/patch0012
index 36a0b68161..36a0b68161 100644
--- a/t/t5100/patch0012
+++ b/third_party/git/t/t5100/patch0012
diff --git a/t/t5100/patch0012--message-id b/third_party/git/t/t5100/patch0012--message-id
index 36a0b68161..36a0b68161 100644
--- a/t/t5100/patch0012--message-id
+++ b/third_party/git/t/t5100/patch0012--message-id
diff --git a/third_party/git/t/t5100/patch0013 b/third_party/git/t/t5100/patch0013
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/third_party/git/t/t5100/patch0013
diff --git a/t/t5100/patch0014 b/third_party/git/t/t5100/patch0014
index 3f3825f9f2..3f3825f9f2 100644
--- a/t/t5100/patch0014
+++ b/third_party/git/t/t5100/patch0014
diff --git a/t/t5100/patch0014--scissors b/third_party/git/t/t5100/patch0014--scissors
index 3f3825f9f2..3f3825f9f2 100644
--- a/t/t5100/patch0014--scissors
+++ b/third_party/git/t/t5100/patch0014--scissors
diff --git a/t/t5100/patch0015 b/third_party/git/t/t5100/patch0015
index ad64848873..ad64848873 100644
--- a/t/t5100/patch0015
+++ b/third_party/git/t/t5100/patch0015
diff --git a/t/t5100/patch0015--no-inbody-headers b/third_party/git/t/t5100/patch0015--no-inbody-headers
index ad64848873..ad64848873 100644
--- a/t/t5100/patch0015--no-inbody-headers
+++ b/third_party/git/t/t5100/patch0015--no-inbody-headers
diff --git a/t/t5100/patch0016 b/third_party/git/t/t5100/patch0016
index ad64848873..ad64848873 100644
--- a/t/t5100/patch0016
+++ b/third_party/git/t/t5100/patch0016
diff --git a/t/t5100/patch0016--no-inbody-headers b/third_party/git/t/t5100/patch0016--no-inbody-headers
index ad64848873..ad64848873 100644
--- a/t/t5100/patch0016--no-inbody-headers
+++ b/third_party/git/t/t5100/patch0016--no-inbody-headers
diff --git a/t/t5100/patch0017 b/third_party/git/t/t5100/patch0017
index 35cf84c9a1..35cf84c9a1 100644
--- a/t/t5100/patch0017
+++ b/third_party/git/t/t5100/patch0017
diff --git a/t/t5100/patch0018 b/third_party/git/t/t5100/patch0018
index 789df6d030..789df6d030 100644
--- a/t/t5100/patch0018
+++ b/third_party/git/t/t5100/patch0018
diff --git a/t/t5100/patch0018--no-inbody-headers b/third_party/git/t/t5100/patch0018--no-inbody-headers
index 789df6d030..789df6d030 100644
--- a/t/t5100/patch0018--no-inbody-headers
+++ b/third_party/git/t/t5100/patch0018--no-inbody-headers
diff --git a/t/t5100/quoted-from.expect b/third_party/git/t/t5100/quoted-from.expect
index 8c9d48c852..8c9d48c852 100644
--- a/t/t5100/quoted-from.expect
+++ b/third_party/git/t/t5100/quoted-from.expect
diff --git a/t/t5100/quoted-from.in b/third_party/git/t/t5100/quoted-from.in
index 847e1c4d3e..847e1c4d3e 100644
--- a/t/t5100/quoted-from.in
+++ b/third_party/git/t/t5100/quoted-from.in
diff --git a/t/t5100/quoted-string.expect b/third_party/git/t/t5100/quoted-string.expect
index cab1bcebf9..cab1bcebf9 100644
--- a/t/t5100/quoted-string.expect
+++ b/third_party/git/t/t5100/quoted-string.expect
diff --git a/t/t5100/quoted-string.in b/third_party/git/t/t5100/quoted-string.in
index e2e627ae23..e2e627ae23 100644
--- a/t/t5100/quoted-string.in
+++ b/third_party/git/t/t5100/quoted-string.in
diff --git a/t/t5100/rfc2047-info-0001 b/third_party/git/t/t5100/rfc2047-info-0001
index 0a383b07e3..0a383b07e3 100644
--- a/t/t5100/rfc2047-info-0001
+++ b/third_party/git/t/t5100/rfc2047-info-0001
diff --git a/t/t5100/rfc2047-info-0002 b/third_party/git/t/t5100/rfc2047-info-0002
index 881be75d6f..881be75d6f 100644
--- a/t/t5100/rfc2047-info-0002
+++ b/third_party/git/t/t5100/rfc2047-info-0002
diff --git a/t/t5100/rfc2047-info-0003 b/third_party/git/t/t5100/rfc2047-info-0003
index d0f789177c..d0f789177c 100644
--- a/t/t5100/rfc2047-info-0003
+++ b/third_party/git/t/t5100/rfc2047-info-0003
diff --git a/t/t5100/rfc2047-info-0004 b/third_party/git/t/t5100/rfc2047-info-0004
index f67a90a974..f67a90a974 100644
--- a/t/t5100/rfc2047-info-0004
+++ b/third_party/git/t/t5100/rfc2047-info-0004
diff --git a/t/t5100/rfc2047-info-0005 b/third_party/git/t/t5100/rfc2047-info-0005
index c27be3bf24..c27be3bf24 100644
--- a/t/t5100/rfc2047-info-0005
+++ b/third_party/git/t/t5100/rfc2047-info-0005
diff --git a/t/t5100/rfc2047-info-0006 b/third_party/git/t/t5100/rfc2047-info-0006
index 9dad474456..9dad474456 100644
--- a/t/t5100/rfc2047-info-0006
+++ b/third_party/git/t/t5100/rfc2047-info-0006
diff --git a/t/t5100/rfc2047-info-0007 b/third_party/git/t/t5100/rfc2047-info-0007
index 294f195a57..294f195a57 100644
--- a/t/t5100/rfc2047-info-0007
+++ b/third_party/git/t/t5100/rfc2047-info-0007
diff --git a/t/t5100/rfc2047-info-0008 b/third_party/git/t/t5100/rfc2047-info-0008
index 294f195a57..294f195a57 100644
--- a/t/t5100/rfc2047-info-0008
+++ b/third_party/git/t/t5100/rfc2047-info-0008
diff --git a/t/t5100/rfc2047-info-0009 b/third_party/git/t/t5100/rfc2047-info-0009
index 294f195a57..294f195a57 100644
--- a/t/t5100/rfc2047-info-0009
+++ b/third_party/git/t/t5100/rfc2047-info-0009
diff --git a/t/t5100/rfc2047-info-0010 b/third_party/git/t/t5100/rfc2047-info-0010
index 9dad474456..9dad474456 100644
--- a/t/t5100/rfc2047-info-0010
+++ b/third_party/git/t/t5100/rfc2047-info-0010
diff --git a/t/t5100/rfc2047-info-0011 b/third_party/git/t/t5100/rfc2047-info-0011
index 9dad474456..9dad474456 100644
--- a/t/t5100/rfc2047-info-0011
+++ b/third_party/git/t/t5100/rfc2047-info-0011
diff --git a/t/t5100/rfc2047-samples.mbox b/third_party/git/t/t5100/rfc2047-samples.mbox
index 1fc224810d..1fc224810d 100644
--- a/t/t5100/rfc2047-samples.mbox
+++ b/third_party/git/t/t5100/rfc2047-samples.mbox
diff --git a/t/t5100/sample.mbox b/third_party/git/t/t5100/sample.mbox
index 6d4d0e4474..6d4d0e4474 100644
--- a/t/t5100/sample.mbox
+++ b/third_party/git/t/t5100/sample.mbox
diff --git a/t/t5100/sample.mboxrd b/third_party/git/t/t5100/sample.mboxrd
index 79ad5ae0e7..79ad5ae0e7 100644
--- a/t/t5100/sample.mboxrd
+++ b/third_party/git/t/t5100/sample.mboxrd
diff --git a/t/t5150-request-pull.sh b/third_party/git/t/t5150-request-pull.sh
index 852dcd913f..852dcd913f 100755
--- a/t/t5150-request-pull.sh
+++ b/third_party/git/t/t5150-request-pull.sh
diff --git a/t/t5200-update-server-info.sh b/third_party/git/t/t5200-update-server-info.sh
index 21a58eecb9..21a58eecb9 100755
--- a/t/t5200-update-server-info.sh
+++ b/third_party/git/t/t5200-update-server-info.sh
diff --git a/t/t5300-pack-object.sh b/third_party/git/t/t5300-pack-object.sh
index 410a09b0dd..410a09b0dd 100755
--- a/t/t5300-pack-object.sh
+++ b/third_party/git/t/t5300-pack-object.sh
diff --git a/t/t5301-sliding-window.sh b/third_party/git/t/t5301-sliding-window.sh
index 76f9798ab9..76f9798ab9 100755
--- a/t/t5301-sliding-window.sh
+++ b/third_party/git/t/t5301-sliding-window.sh
diff --git a/t/t5302-pack-index.sh b/third_party/git/t/t5302-pack-index.sh
index 91d51b35f9..91d51b35f9 100755
--- a/t/t5302-pack-index.sh
+++ b/third_party/git/t/t5302-pack-index.sh
diff --git a/t/t5303-pack-corruption-resilience.sh b/third_party/git/t/t5303-pack-corruption-resilience.sh
index 41e6dc4dcf..41e6dc4dcf 100755
--- a/t/t5303-pack-corruption-resilience.sh
+++ b/third_party/git/t/t5303-pack-corruption-resilience.sh
diff --git a/t/t5304-prune.sh b/third_party/git/t/t5304-prune.sh
index df60f18fb8..df60f18fb8 100755
--- a/t/t5304-prune.sh
+++ b/third_party/git/t/t5304-prune.sh
diff --git a/t/t5305-include-tag.sh b/third_party/git/t/t5305-include-tag.sh
index a5eca210b8..a5eca210b8 100755
--- a/t/t5305-include-tag.sh
+++ b/third_party/git/t/t5305-include-tag.sh
diff --git a/t/t5306-pack-nobase.sh b/third_party/git/t/t5306-pack-nobase.sh
index f4931c0c2a..f4931c0c2a 100755
--- a/t/t5306-pack-nobase.sh
+++ b/third_party/git/t/t5306-pack-nobase.sh
diff --git a/t/t5307-pack-missing-commit.sh b/third_party/git/t/t5307-pack-missing-commit.sh
index dacb440b27..dacb440b27 100755
--- a/t/t5307-pack-missing-commit.sh
+++ b/third_party/git/t/t5307-pack-missing-commit.sh
diff --git a/t/t5308-pack-detect-duplicates.sh b/third_party/git/t/t5308-pack-detect-duplicates.sh
index 6845c1f3c3..6845c1f3c3 100755
--- a/t/t5308-pack-detect-duplicates.sh
+++ b/third_party/git/t/t5308-pack-detect-duplicates.sh
diff --git a/t/t5309-pack-delta-cycles.sh b/third_party/git/t/t5309-pack-delta-cycles.sh
index 491556dad9..491556dad9 100755
--- a/t/t5309-pack-delta-cycles.sh
+++ b/third_party/git/t/t5309-pack-delta-cycles.sh
diff --git a/t/t5310-pack-bitmaps.sh b/third_party/git/t/t5310-pack-bitmaps.sh
index 6640329ebf..6640329ebf 100755
--- a/t/t5310-pack-bitmaps.sh
+++ b/third_party/git/t/t5310-pack-bitmaps.sh
diff --git a/t/t5311-pack-bitmaps-shallow.sh b/third_party/git/t/t5311-pack-bitmaps-shallow.sh
index 872a95df33..872a95df33 100755
--- a/t/t5311-pack-bitmaps-shallow.sh
+++ b/third_party/git/t/t5311-pack-bitmaps-shallow.sh
diff --git a/t/t5312-prune-corruption.sh b/third_party/git/t/t5312-prune-corruption.sh
index da9d59940d..da9d59940d 100755
--- a/t/t5312-prune-corruption.sh
+++ b/third_party/git/t/t5312-prune-corruption.sh
diff --git a/t/t5313-pack-bounds-checks.sh b/third_party/git/t/t5313-pack-bounds-checks.sh
index f1708d415e..f1708d415e 100755
--- a/t/t5313-pack-bounds-checks.sh
+++ b/third_party/git/t/t5313-pack-bounds-checks.sh
diff --git a/t/t5314-pack-cycle-detection.sh b/third_party/git/t/t5314-pack-cycle-detection.sh
index e525466de0..e525466de0 100755
--- a/t/t5314-pack-cycle-detection.sh
+++ b/third_party/git/t/t5314-pack-cycle-detection.sh
diff --git a/t/t5315-pack-objects-compression.sh b/third_party/git/t/t5315-pack-objects-compression.sh
index df970d7584..df970d7584 100755
--- a/t/t5315-pack-objects-compression.sh
+++ b/third_party/git/t/t5315-pack-objects-compression.sh
diff --git a/t/t5316-pack-delta-depth.sh b/third_party/git/t/t5316-pack-delta-depth.sh
index 0f06c40eb1..0f06c40eb1 100755
--- a/t/t5316-pack-delta-depth.sh
+++ b/third_party/git/t/t5316-pack-delta-depth.sh
diff --git a/t/t5317-pack-objects-filter-objects.sh b/third_party/git/t/t5317-pack-objects-filter-objects.sh
index 2d2f5d0229..2d2f5d0229 100755
--- a/t/t5317-pack-objects-filter-objects.sh
+++ b/third_party/git/t/t5317-pack-objects-filter-objects.sh
diff --git a/t/t5318-commit-graph.sh b/third_party/git/t/t5318-commit-graph.sh
index 22cb9d6643..22cb9d6643 100755
--- a/t/t5318-commit-graph.sh
+++ b/third_party/git/t/t5318-commit-graph.sh
diff --git a/t/t5319-multi-pack-index.sh b/third_party/git/t/t5319-multi-pack-index.sh
index c72ca04399..c72ca04399 100755
--- a/t/t5319-multi-pack-index.sh
+++ b/third_party/git/t/t5319-multi-pack-index.sh
diff --git a/t/t5320-delta-islands.sh b/third_party/git/t/t5320-delta-islands.sh
index fea92a5777..fea92a5777 100755
--- a/t/t5320-delta-islands.sh
+++ b/third_party/git/t/t5320-delta-islands.sh
diff --git a/t/t5321-pack-large-objects.sh b/third_party/git/t/t5321-pack-large-objects.sh
index a75eab87d3..a75eab87d3 100755
--- a/t/t5321-pack-large-objects.sh
+++ b/third_party/git/t/t5321-pack-large-objects.sh
diff --git a/t/t5322-pack-objects-sparse.sh b/third_party/git/t/t5322-pack-objects-sparse.sh
index 7124b5581a..7124b5581a 100755
--- a/t/t5322-pack-objects-sparse.sh
+++ b/third_party/git/t/t5322-pack-objects-sparse.sh
diff --git a/t/t5323-pack-redundant.sh b/third_party/git/t/t5323-pack-redundant.sh
index 6b4d1ca353..6b4d1ca353 100755
--- a/t/t5323-pack-redundant.sh
+++ b/third_party/git/t/t5323-pack-redundant.sh
diff --git a/t/t5324-split-commit-graph.sh b/third_party/git/t/t5324-split-commit-graph.sh
index 99f4ef4c19..99f4ef4c19 100755
--- a/t/t5324-split-commit-graph.sh
+++ b/third_party/git/t/t5324-split-commit-graph.sh
diff --git a/t/t5400-send-pack.sh b/third_party/git/t/t5400-send-pack.sh
index 571d620aed..571d620aed 100755
--- a/t/t5400-send-pack.sh
+++ b/third_party/git/t/t5400-send-pack.sh
diff --git a/t/t5401-update-hooks.sh b/third_party/git/t/t5401-update-hooks.sh
index 956d69f5b1..956d69f5b1 100755
--- a/t/t5401-update-hooks.sh
+++ b/third_party/git/t/t5401-update-hooks.sh
diff --git a/t/t5402-post-merge-hook.sh b/third_party/git/t/t5402-post-merge-hook.sh
index 6eb2ffd6ec..6eb2ffd6ec 100755
--- a/t/t5402-post-merge-hook.sh
+++ b/third_party/git/t/t5402-post-merge-hook.sh
diff --git a/t/t5403-post-checkout-hook.sh b/third_party/git/t/t5403-post-checkout-hook.sh
index a39b3b5c78..a39b3b5c78 100755
--- a/t/t5403-post-checkout-hook.sh
+++ b/third_party/git/t/t5403-post-checkout-hook.sh
diff --git a/t/t5404-tracking-branches.sh b/third_party/git/t/t5404-tracking-branches.sh
index 2762f420bc..2762f420bc 100755
--- a/t/t5404-tracking-branches.sh
+++ b/third_party/git/t/t5404-tracking-branches.sh
diff --git a/t/t5405-send-pack-rewind.sh b/third_party/git/t/t5405-send-pack-rewind.sh
index 235fb7686a..235fb7686a 100755
--- a/t/t5405-send-pack-rewind.sh
+++ b/third_party/git/t/t5405-send-pack-rewind.sh
diff --git a/t/t5406-remote-rejects.sh b/third_party/git/t/t5406-remote-rejects.sh
index ff06f99649..ff06f99649 100755
--- a/t/t5406-remote-rejects.sh
+++ b/third_party/git/t/t5406-remote-rejects.sh
diff --git a/t/t5407-post-rewrite-hook.sh b/third_party/git/t/t5407-post-rewrite-hook.sh
index 7344253bfb..7344253bfb 100755
--- a/t/t5407-post-rewrite-hook.sh
+++ b/third_party/git/t/t5407-post-rewrite-hook.sh
diff --git a/t/t5408-send-pack-stdin.sh b/third_party/git/t/t5408-send-pack-stdin.sh
index e8737df6f9..e8737df6f9 100755
--- a/t/t5408-send-pack-stdin.sh
+++ b/third_party/git/t/t5408-send-pack-stdin.sh
diff --git a/t/t5409-colorize-remote-messages.sh b/third_party/git/t/t5409-colorize-remote-messages.sh
index 2a8c449661..2a8c449661 100755
--- a/t/t5409-colorize-remote-messages.sh
+++ b/third_party/git/t/t5409-colorize-remote-messages.sh
diff --git a/t/t5410-receive-pack-alternates.sh b/third_party/git/t/t5410-receive-pack-alternates.sh
index f00d0da860..f00d0da860 100755
--- a/t/t5410-receive-pack-alternates.sh
+++ b/third_party/git/t/t5410-receive-pack-alternates.sh
diff --git a/t/t5500-fetch-pack.sh b/third_party/git/t/t5500-fetch-pack.sh
index 1c71c0ec77..1c71c0ec77 100755
--- a/t/t5500-fetch-pack.sh
+++ b/third_party/git/t/t5500-fetch-pack.sh
diff --git a/t/t5501-fetch-push-alternates.sh b/third_party/git/t/t5501-fetch-push-alternates.sh
index 1bc57ac03f..1bc57ac03f 100755
--- a/t/t5501-fetch-push-alternates.sh
+++ b/third_party/git/t/t5501-fetch-push-alternates.sh
diff --git a/t/t5502-quickfetch.sh b/third_party/git/t/t5502-quickfetch.sh
index 7a46cbdbe6..7a46cbdbe6 100755
--- a/t/t5502-quickfetch.sh
+++ b/third_party/git/t/t5502-quickfetch.sh
diff --git a/t/t5503-tagfollow.sh b/third_party/git/t/t5503-tagfollow.sh
index 6041a4dd32..6041a4dd32 100755
--- a/t/t5503-tagfollow.sh
+++ b/third_party/git/t/t5503-tagfollow.sh
diff --git a/t/t5504-fetch-receive-strict.sh b/third_party/git/t/t5504-fetch-receive-strict.sh
index fdfe179b11..fdfe179b11 100755
--- a/t/t5504-fetch-receive-strict.sh
+++ b/third_party/git/t/t5504-fetch-receive-strict.sh
diff --git a/t/t5505-remote.sh b/third_party/git/t/t5505-remote.sh
index 883b32efa0..883b32efa0 100755
--- a/t/t5505-remote.sh
+++ b/third_party/git/t/t5505-remote.sh
diff --git a/t/t5506-remote-groups.sh b/third_party/git/t/t5506-remote-groups.sh
index 83d5558c0e..83d5558c0e 100755
--- a/t/t5506-remote-groups.sh
+++ b/third_party/git/t/t5506-remote-groups.sh
diff --git a/t/t5507-remote-environment.sh b/third_party/git/t/t5507-remote-environment.sh
index e6149295b1..e6149295b1 100755
--- a/t/t5507-remote-environment.sh
+++ b/third_party/git/t/t5507-remote-environment.sh
diff --git a/t/t5509-fetch-push-namespaces.sh b/third_party/git/t/t5509-fetch-push-namespaces.sh
index 75cbfcc392..75cbfcc392 100755
--- a/t/t5509-fetch-push-namespaces.sh
+++ b/third_party/git/t/t5509-fetch-push-namespaces.sh
diff --git a/t/t5510-fetch.sh b/third_party/git/t/t5510-fetch.sh
index 139f7106f7..139f7106f7 100755
--- a/t/t5510-fetch.sh
+++ b/third_party/git/t/t5510-fetch.sh
diff --git a/t/t5511-refspec.sh b/third_party/git/t/t5511-refspec.sh
index f541f30bc2..f541f30bc2 100755
--- a/t/t5511-refspec.sh
+++ b/third_party/git/t/t5511-refspec.sh
diff --git a/t/t5512-ls-remote.sh b/third_party/git/t/t5512-ls-remote.sh
index 43e1d8d4d2..43e1d8d4d2 100755
--- a/t/t5512-ls-remote.sh
+++ b/third_party/git/t/t5512-ls-remote.sh
diff --git a/t/t5513-fetch-track.sh b/third_party/git/t/t5513-fetch-track.sh
index 65d1e05bd6..65d1e05bd6 100755
--- a/t/t5513-fetch-track.sh
+++ b/third_party/git/t/t5513-fetch-track.sh
diff --git a/t/t5514-fetch-multiple.sh b/third_party/git/t/t5514-fetch-multiple.sh
index 5426d4b5ab..5426d4b5ab 100755
--- a/t/t5514-fetch-multiple.sh
+++ b/third_party/git/t/t5514-fetch-multiple.sh
diff --git a/t/t5515-fetch-merge-logic.sh b/third_party/git/t/t5515-fetch-merge-logic.sh
index e55d8474ef..e55d8474ef 100755
--- a/t/t5515-fetch-merge-logic.sh
+++ b/third_party/git/t/t5515-fetch-merge-logic.sh
diff --git a/t/t5515/fetch.br-branches-default b/third_party/git/t/t5515/fetch.br-branches-default
index a1bc3d53a6..a1bc3d53a6 100644
--- a/t/t5515/fetch.br-branches-default
+++ b/third_party/git/t/t5515/fetch.br-branches-default
diff --git a/t/t5515/fetch.br-branches-default-merge b/third_party/git/t/t5515/fetch.br-branches-default-merge
index 12ab08e8ac..12ab08e8ac 100644
--- a/t/t5515/fetch.br-branches-default-merge
+++ b/third_party/git/t/t5515/fetch.br-branches-default-merge
diff --git a/t/t5515/fetch.br-branches-default-merge_branches-default b/third_party/git/t/t5515/fetch.br-branches-default-merge_branches-default
index 54427522dd..54427522dd 100644
--- a/t/t5515/fetch.br-branches-default-merge_branches-default
+++ b/third_party/git/t/t5515/fetch.br-branches-default-merge_branches-default
diff --git a/t/t5515/fetch.br-branches-default-octopus b/third_party/git/t/t5515/fetch.br-branches-default-octopus
index 498a761aae..498a761aae 100644
--- a/t/t5515/fetch.br-branches-default-octopus
+++ b/third_party/git/t/t5515/fetch.br-branches-default-octopus
diff --git a/t/t5515/fetch.br-branches-default-octopus_branches-default b/third_party/git/t/t5515/fetch.br-branches-default-octopus_branches-default
index 0857f134e1..0857f134e1 100644
--- a/t/t5515/fetch.br-branches-default-octopus_branches-default
+++ b/third_party/git/t/t5515/fetch.br-branches-default-octopus_branches-default
diff --git a/t/t5515/fetch.br-branches-default_branches-default b/third_party/git/t/t5515/fetch.br-branches-default_branches-default
index 8cbd718936..8cbd718936 100644
--- a/t/t5515/fetch.br-branches-default_branches-default
+++ b/third_party/git/t/t5515/fetch.br-branches-default_branches-default
diff --git a/t/t5515/fetch.br-branches-one b/third_party/git/t/t5515/fetch.br-branches-one
index c98f670526..c98f670526 100644
--- a/t/t5515/fetch.br-branches-one
+++ b/third_party/git/t/t5515/fetch.br-branches-one
diff --git a/t/t5515/fetch.br-branches-one-merge b/third_party/git/t/t5515/fetch.br-branches-one-merge
index 54a77420d5..54a77420d5 100644
--- a/t/t5515/fetch.br-branches-one-merge
+++ b/third_party/git/t/t5515/fetch.br-branches-one-merge
diff --git a/t/t5515/fetch.br-branches-one-merge_branches-one b/third_party/git/t/t5515/fetch.br-branches-one-merge_branches-one
index b4d1bb0b0b..b4d1bb0b0b 100644
--- a/t/t5515/fetch.br-branches-one-merge_branches-one
+++ b/third_party/git/t/t5515/fetch.br-branches-one-merge_branches-one
diff --git a/t/t5515/fetch.br-branches-one-octopus b/third_party/git/t/t5515/fetch.br-branches-one-octopus
index 97c4b544b8..97c4b544b8 100644
--- a/t/t5515/fetch.br-branches-one-octopus
+++ b/third_party/git/t/t5515/fetch.br-branches-one-octopus
diff --git a/t/t5515/fetch.br-branches-one-octopus_branches-one b/third_party/git/t/t5515/fetch.br-branches-one-octopus_branches-one
index df705f74c7..df705f74c7 100644
--- a/t/t5515/fetch.br-branches-one-octopus_branches-one
+++ b/third_party/git/t/t5515/fetch.br-branches-one-octopus_branches-one
diff --git a/t/t5515/fetch.br-branches-one_branches-one b/third_party/git/t/t5515/fetch.br-branches-one_branches-one
index 96890e5bd9..96890e5bd9 100644
--- a/t/t5515/fetch.br-branches-one_branches-one
+++ b/third_party/git/t/t5515/fetch.br-branches-one_branches-one
diff --git a/t/t5515/fetch.br-config-explicit b/third_party/git/t/t5515/fetch.br-config-explicit
index 68fc927263..68fc927263 100644
--- a/t/t5515/fetch.br-config-explicit
+++ b/third_party/git/t/t5515/fetch.br-config-explicit
diff --git a/t/t5515/fetch.br-config-explicit-merge b/third_party/git/t/t5515/fetch.br-config-explicit-merge
index 5ce764a06e..5ce764a06e 100644
--- a/t/t5515/fetch.br-config-explicit-merge
+++ b/third_party/git/t/t5515/fetch.br-config-explicit-merge
diff --git a/t/t5515/fetch.br-config-explicit-merge_config-explicit b/third_party/git/t/t5515/fetch.br-config-explicit-merge_config-explicit
index b1152b76dc..b1152b76dc 100644
--- a/t/t5515/fetch.br-config-explicit-merge_config-explicit
+++ b/third_party/git/t/t5515/fetch.br-config-explicit-merge_config-explicit
diff --git a/t/t5515/fetch.br-config-explicit-octopus b/third_party/git/t/t5515/fetch.br-config-explicit-octopus
index 110577bb67..110577bb67 100644
--- a/t/t5515/fetch.br-config-explicit-octopus
+++ b/third_party/git/t/t5515/fetch.br-config-explicit-octopus
diff --git a/t/t5515/fetch.br-config-explicit-octopus_config-explicit b/third_party/git/t/t5515/fetch.br-config-explicit-octopus_config-explicit
index a29dd8baba..a29dd8baba 100644
--- a/t/t5515/fetch.br-config-explicit-octopus_config-explicit
+++ b/third_party/git/t/t5515/fetch.br-config-explicit-octopus_config-explicit
diff --git a/t/t5515/fetch.br-config-explicit_config-explicit b/third_party/git/t/t5515/fetch.br-config-explicit_config-explicit
index b19b0162e1..b19b0162e1 100644
--- a/t/t5515/fetch.br-config-explicit_config-explicit
+++ b/third_party/git/t/t5515/fetch.br-config-explicit_config-explicit
diff --git a/t/t5515/fetch.br-config-glob b/third_party/git/t/t5515/fetch.br-config-glob
index 946d70ca07..946d70ca07 100644
--- a/t/t5515/fetch.br-config-glob
+++ b/third_party/git/t/t5515/fetch.br-config-glob
diff --git a/t/t5515/fetch.br-config-glob-merge b/third_party/git/t/t5515/fetch.br-config-glob-merge
index 89f2596cb9..89f2596cb9 100644
--- a/t/t5515/fetch.br-config-glob-merge
+++ b/third_party/git/t/t5515/fetch.br-config-glob-merge
diff --git a/t/t5515/fetch.br-config-glob-merge_config-glob b/third_party/git/t/t5515/fetch.br-config-glob-merge_config-glob
index 2ba4832160..2ba4832160 100644
--- a/t/t5515/fetch.br-config-glob-merge_config-glob
+++ b/third_party/git/t/t5515/fetch.br-config-glob-merge_config-glob
diff --git a/t/t5515/fetch.br-config-glob-octopus b/third_party/git/t/t5515/fetch.br-config-glob-octopus
index 64994df7e2..64994df7e2 100644
--- a/t/t5515/fetch.br-config-glob-octopus
+++ b/third_party/git/t/t5515/fetch.br-config-glob-octopus
diff --git a/t/t5515/fetch.br-config-glob-octopus_config-glob b/third_party/git/t/t5515/fetch.br-config-glob-octopus_config-glob
index 681a725adc..681a725adc 100644
--- a/t/t5515/fetch.br-config-glob-octopus_config-glob
+++ b/third_party/git/t/t5515/fetch.br-config-glob-octopus_config-glob
diff --git a/t/t5515/fetch.br-config-glob_config-glob b/third_party/git/t/t5515/fetch.br-config-glob_config-glob
index 19daf0cb77..19daf0cb77 100644
--- a/t/t5515/fetch.br-config-glob_config-glob
+++ b/third_party/git/t/t5515/fetch.br-config-glob_config-glob
diff --git a/t/t5515/fetch.br-remote-explicit b/third_party/git/t/t5515/fetch.br-remote-explicit
index ab44bc5519..ab44bc5519 100644
--- a/t/t5515/fetch.br-remote-explicit
+++ b/third_party/git/t/t5515/fetch.br-remote-explicit
diff --git a/t/t5515/fetch.br-remote-explicit-merge b/third_party/git/t/t5515/fetch.br-remote-explicit-merge
index d018b3515f..d018b3515f 100644
--- a/t/t5515/fetch.br-remote-explicit-merge
+++ b/third_party/git/t/t5515/fetch.br-remote-explicit-merge
diff --git a/t/t5515/fetch.br-remote-explicit-merge_remote-explicit b/third_party/git/t/t5515/fetch.br-remote-explicit-merge_remote-explicit
index 0d3d780dd0..0d3d780dd0 100644
--- a/t/t5515/fetch.br-remote-explicit-merge_remote-explicit
+++ b/third_party/git/t/t5515/fetch.br-remote-explicit-merge_remote-explicit
diff --git a/t/t5515/fetch.br-remote-explicit-octopus b/third_party/git/t/t5515/fetch.br-remote-explicit-octopus
index 6f843044ed..6f843044ed 100644
--- a/t/t5515/fetch.br-remote-explicit-octopus
+++ b/third_party/git/t/t5515/fetch.br-remote-explicit-octopus
diff --git a/t/t5515/fetch.br-remote-explicit-octopus_remote-explicit b/third_party/git/t/t5515/fetch.br-remote-explicit-octopus_remote-explicit
index 3546a83713..3546a83713 100644
--- a/t/t5515/fetch.br-remote-explicit-octopus_remote-explicit
+++ b/third_party/git/t/t5515/fetch.br-remote-explicit-octopus_remote-explicit
diff --git a/t/t5515/fetch.br-remote-explicit_remote-explicit b/third_party/git/t/t5515/fetch.br-remote-explicit_remote-explicit
index 01e014e6a0..01e014e6a0 100644
--- a/t/t5515/fetch.br-remote-explicit_remote-explicit
+++ b/third_party/git/t/t5515/fetch.br-remote-explicit_remote-explicit
diff --git a/t/t5515/fetch.br-remote-glob b/third_party/git/t/t5515/fetch.br-remote-glob
index 09bfcee00f..09bfcee00f 100644
--- a/t/t5515/fetch.br-remote-glob
+++ b/third_party/git/t/t5515/fetch.br-remote-glob
diff --git a/t/t5515/fetch.br-remote-glob-merge b/third_party/git/t/t5515/fetch.br-remote-glob-merge
index 7e1a433a64..7e1a433a64 100644
--- a/t/t5515/fetch.br-remote-glob-merge
+++ b/third_party/git/t/t5515/fetch.br-remote-glob-merge
diff --git a/t/t5515/fetch.br-remote-glob-merge_remote-glob b/third_party/git/t/t5515/fetch.br-remote-glob-merge_remote-glob
index 53571bb4ec..53571bb4ec 100644
--- a/t/t5515/fetch.br-remote-glob-merge_remote-glob
+++ b/third_party/git/t/t5515/fetch.br-remote-glob-merge_remote-glob
diff --git a/t/t5515/fetch.br-remote-glob-octopus b/third_party/git/t/t5515/fetch.br-remote-glob-octopus
index c7c8b6d7f4..c7c8b6d7f4 100644
--- a/t/t5515/fetch.br-remote-glob-octopus
+++ b/third_party/git/t/t5515/fetch.br-remote-glob-octopus
diff --git a/t/t5515/fetch.br-remote-glob-octopus_remote-glob b/third_party/git/t/t5515/fetch.br-remote-glob-octopus_remote-glob
index 36076fba0c..36076fba0c 100644
--- a/t/t5515/fetch.br-remote-glob-octopus_remote-glob
+++ b/third_party/git/t/t5515/fetch.br-remote-glob-octopus_remote-glob
diff --git a/t/t5515/fetch.br-remote-glob_remote-glob b/third_party/git/t/t5515/fetch.br-remote-glob_remote-glob
index 20ba5cb172..20ba5cb172 100644
--- a/t/t5515/fetch.br-remote-glob_remote-glob
+++ b/third_party/git/t/t5515/fetch.br-remote-glob_remote-glob
diff --git a/t/t5515/fetch.br-unconfig b/third_party/git/t/t5515/fetch.br-unconfig
index 887ccfc41f..887ccfc41f 100644
--- a/t/t5515/fetch.br-unconfig
+++ b/third_party/git/t/t5515/fetch.br-unconfig
diff --git a/t/t5515/fetch.br-unconfig_--tags_.._.git b/third_party/git/t/t5515/fetch.br-unconfig_--tags_.._.git
index 0f70f66c70..0f70f66c70 100644
--- a/t/t5515/fetch.br-unconfig_--tags_.._.git
+++ b/third_party/git/t/t5515/fetch.br-unconfig_--tags_.._.git
diff --git a/t/t5515/fetch.br-unconfig_.._.git b/third_party/git/t/t5515/fetch.br-unconfig_.._.git
index 284bb1fb61..284bb1fb61 100644
--- a/t/t5515/fetch.br-unconfig_.._.git
+++ b/third_party/git/t/t5515/fetch.br-unconfig_.._.git
diff --git a/t/t5515/fetch.br-unconfig_.._.git_one b/third_party/git/t/t5515/fetch.br-unconfig_.._.git_one
index 11eb5a6ef2..11eb5a6ef2 100644
--- a/t/t5515/fetch.br-unconfig_.._.git_one
+++ b/third_party/git/t/t5515/fetch.br-unconfig_.._.git_one
diff --git a/t/t5515/fetch.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file b/third_party/git/t/t5515/fetch.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file
index 74115361ba..74115361ba 100644
--- a/t/t5515/fetch.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file
+++ b/third_party/git/t/t5515/fetch.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file
diff --git a/t/t5515/fetch.br-unconfig_.._.git_one_two b/third_party/git/t/t5515/fetch.br-unconfig_.._.git_one_two
index 3f1be224b8..3f1be224b8 100644
--- a/t/t5515/fetch.br-unconfig_.._.git_one_two
+++ b/third_party/git/t/t5515/fetch.br-unconfig_.._.git_one_two
diff --git a/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file b/third_party/git/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file
index 7726983818..7726983818 100644
--- a/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file
+++ b/third_party/git/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file
diff --git a/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one_tag_tag-three b/third_party/git/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one_tag_tag-three
index 7b3750ce5c..7b3750ce5c 100644
--- a/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one_tag_tag-three
+++ b/third_party/git/t/t5515/fetch.br-unconfig_.._.git_tag_tag-one_tag_tag-three
diff --git a/t/t5515/fetch.br-unconfig_branches-default b/third_party/git/t/t5515/fetch.br-unconfig_branches-default
index da30e3c62c..da30e3c62c 100644
--- a/t/t5515/fetch.br-unconfig_branches-default
+++ b/third_party/git/t/t5515/fetch.br-unconfig_branches-default
diff --git a/t/t5515/fetch.br-unconfig_branches-one b/third_party/git/t/t5515/fetch.br-unconfig_branches-one
index e4614314c5..e4614314c5 100644
--- a/t/t5515/fetch.br-unconfig_branches-one
+++ b/third_party/git/t/t5515/fetch.br-unconfig_branches-one
diff --git a/t/t5515/fetch.br-unconfig_config-explicit b/third_party/git/t/t5515/fetch.br-unconfig_config-explicit
index ed323c9871..ed323c9871 100644
--- a/t/t5515/fetch.br-unconfig_config-explicit
+++ b/third_party/git/t/t5515/fetch.br-unconfig_config-explicit
diff --git a/t/t5515/fetch.br-unconfig_config-glob b/third_party/git/t/t5515/fetch.br-unconfig_config-glob
index 2372ed03c5..2372ed03c5 100644
--- a/t/t5515/fetch.br-unconfig_config-glob
+++ b/third_party/git/t/t5515/fetch.br-unconfig_config-glob
diff --git a/t/t5515/fetch.br-unconfig_remote-explicit b/third_party/git/t/t5515/fetch.br-unconfig_remote-explicit
index 6318dd11b4..6318dd11b4 100644
--- a/t/t5515/fetch.br-unconfig_remote-explicit
+++ b/third_party/git/t/t5515/fetch.br-unconfig_remote-explicit
diff --git a/t/t5515/fetch.br-unconfig_remote-glob b/third_party/git/t/t5515/fetch.br-unconfig_remote-glob
index 1d9afad7d8..1d9afad7d8 100644
--- a/t/t5515/fetch.br-unconfig_remote-glob
+++ b/third_party/git/t/t5515/fetch.br-unconfig_remote-glob
diff --git a/t/t5515/fetch.master b/third_party/git/t/t5515/fetch.master
index 9b29d67200..9b29d67200 100644
--- a/t/t5515/fetch.master
+++ b/third_party/git/t/t5515/fetch.master
diff --git a/t/t5515/fetch.master_--tags_.._.git b/third_party/git/t/t5515/fetch.master_--tags_.._.git
index ab473a6e1f..ab473a6e1f 100644
--- a/t/t5515/fetch.master_--tags_.._.git
+++ b/third_party/git/t/t5515/fetch.master_--tags_.._.git
diff --git a/t/t5515/fetch.master_.._.git b/third_party/git/t/t5515/fetch.master_.._.git
index 66d1aaddae..66d1aaddae 100644
--- a/t/t5515/fetch.master_.._.git
+++ b/third_party/git/t/t5515/fetch.master_.._.git
diff --git a/t/t5515/fetch.master_.._.git_one b/third_party/git/t/t5515/fetch.master_.._.git_one
index 35deddbd2c..35deddbd2c 100644
--- a/t/t5515/fetch.master_.._.git_one
+++ b/third_party/git/t/t5515/fetch.master_.._.git_one
diff --git a/t/t5515/fetch.master_.._.git_one_tag_tag-one_tag_tag-three-file b/third_party/git/t/t5515/fetch.master_.._.git_one_tag_tag-one_tag_tag-three-file
index 0672d1292f..0672d1292f 100644
--- a/t/t5515/fetch.master_.._.git_one_tag_tag-one_tag_tag-three-file
+++ b/third_party/git/t/t5515/fetch.master_.._.git_one_tag_tag-one_tag_tag-three-file
diff --git a/t/t5515/fetch.master_.._.git_one_two b/third_party/git/t/t5515/fetch.master_.._.git_one_two
index 35ec5782c8..35ec5782c8 100644
--- a/t/t5515/fetch.master_.._.git_one_two
+++ b/third_party/git/t/t5515/fetch.master_.._.git_one_two
diff --git a/t/t5515/fetch.master_.._.git_tag_tag-one-tree_tag_tag-three-file b/third_party/git/t/t5515/fetch.master_.._.git_tag_tag-one-tree_tag_tag-three-file
index 0fd737cf81..0fd737cf81 100644
--- a/t/t5515/fetch.master_.._.git_tag_tag-one-tree_tag_tag-three-file
+++ b/third_party/git/t/t5515/fetch.master_.._.git_tag_tag-one-tree_tag_tag-three-file
diff --git a/t/t5515/fetch.master_.._.git_tag_tag-one_tag_tag-three b/third_party/git/t/t5515/fetch.master_.._.git_tag_tag-one_tag_tag-three
index e488986653..e488986653 100644
--- a/t/t5515/fetch.master_.._.git_tag_tag-one_tag_tag-three
+++ b/third_party/git/t/t5515/fetch.master_.._.git_tag_tag-one_tag_tag-three
diff --git a/t/t5515/fetch.master_branches-default b/third_party/git/t/t5515/fetch.master_branches-default
index 2eedd3bfa4..2eedd3bfa4 100644
--- a/t/t5515/fetch.master_branches-default
+++ b/third_party/git/t/t5515/fetch.master_branches-default
diff --git a/t/t5515/fetch.master_branches-one b/third_party/git/t/t5515/fetch.master_branches-one
index 901ce21d33..901ce21d33 100644
--- a/t/t5515/fetch.master_branches-one
+++ b/third_party/git/t/t5515/fetch.master_branches-one
diff --git a/t/t5515/fetch.master_config-explicit b/third_party/git/t/t5515/fetch.master_config-explicit
index 251c826aa9..251c826aa9 100644
--- a/t/t5515/fetch.master_config-explicit
+++ b/third_party/git/t/t5515/fetch.master_config-explicit
diff --git a/t/t5515/fetch.master_config-glob b/third_party/git/t/t5515/fetch.master_config-glob
index 27c158e332..27c158e332 100644
--- a/t/t5515/fetch.master_config-glob
+++ b/third_party/git/t/t5515/fetch.master_config-glob
diff --git a/t/t5515/fetch.master_remote-explicit b/third_party/git/t/t5515/fetch.master_remote-explicit
index b3cfe6b98b..b3cfe6b98b 100644
--- a/t/t5515/fetch.master_remote-explicit
+++ b/third_party/git/t/t5515/fetch.master_remote-explicit
diff --git a/t/t5515/fetch.master_remote-glob b/third_party/git/t/t5515/fetch.master_remote-glob
index 118befd1e4..118befd1e4 100644
--- a/t/t5515/fetch.master_remote-glob
+++ b/third_party/git/t/t5515/fetch.master_remote-glob
diff --git a/t/t5515/refs.br-branches-default b/third_party/git/t/t5515/refs.br-branches-default
index 21917c1e5d..21917c1e5d 100644
--- a/t/t5515/refs.br-branches-default
+++ b/third_party/git/t/t5515/refs.br-branches-default
diff --git a/t/t5515/refs.br-branches-default-merge b/third_party/git/t/t5515/refs.br-branches-default-merge
index 21917c1e5d..21917c1e5d 100644
--- a/t/t5515/refs.br-branches-default-merge
+++ b/third_party/git/t/t5515/refs.br-branches-default-merge
diff --git a/t/t5515/refs.br-branches-default-merge_branches-default b/third_party/git/t/t5515/refs.br-branches-default-merge_branches-default
index 21917c1e5d..21917c1e5d 100644
--- a/t/t5515/refs.br-branches-default-merge_branches-default
+++ b/third_party/git/t/t5515/refs.br-branches-default-merge_branches-default
diff --git a/t/t5515/refs.br-branches-default-octopus b/third_party/git/t/t5515/refs.br-branches-default-octopus
index 21917c1e5d..21917c1e5d 100644
--- a/t/t5515/refs.br-branches-default-octopus
+++ b/third_party/git/t/t5515/refs.br-branches-default-octopus
diff --git a/t/t5515/refs.br-branches-default-octopus_branches-default b/third_party/git/t/t5515/refs.br-branches-default-octopus_branches-default
index 21917c1e5d..21917c1e5d 100644
--- a/t/t5515/refs.br-branches-default-octopus_branches-default
+++ b/third_party/git/t/t5515/refs.br-branches-default-octopus_branches-default
diff --git a/t/t5515/refs.br-branches-default_branches-default b/third_party/git/t/t5515/refs.br-branches-default_branches-default
index 21917c1e5d..21917c1e5d 100644
--- a/t/t5515/refs.br-branches-default_branches-default
+++ b/third_party/git/t/t5515/refs.br-branches-default_branches-default
diff --git a/t/t5515/refs.br-branches-one b/third_party/git/t/t5515/refs.br-branches-one
index 8a705a5df2..8a705a5df2 100644
--- a/t/t5515/refs.br-branches-one
+++ b/third_party/git/t/t5515/refs.br-branches-one
diff --git a/t/t5515/refs.br-branches-one-merge b/third_party/git/t/t5515/refs.br-branches-one-merge
index 8a705a5df2..8a705a5df2 100644
--- a/t/t5515/refs.br-branches-one-merge
+++ b/third_party/git/t/t5515/refs.br-branches-one-merge
diff --git a/t/t5515/refs.br-branches-one-merge_branches-one b/third_party/git/t/t5515/refs.br-branches-one-merge_branches-one
index 8a705a5df2..8a705a5df2 100644
--- a/t/t5515/refs.br-branches-one-merge_branches-one
+++ b/third_party/git/t/t5515/refs.br-branches-one-merge_branches-one
diff --git a/t/t5515/refs.br-branches-one-octopus b/third_party/git/t/t5515/refs.br-branches-one-octopus
index 8a705a5df2..8a705a5df2 100644
--- a/t/t5515/refs.br-branches-one-octopus
+++ b/third_party/git/t/t5515/refs.br-branches-one-octopus
diff --git a/t/t5515/refs.br-branches-one-octopus_branches-one b/third_party/git/t/t5515/refs.br-branches-one-octopus_branches-one
index 8a705a5df2..8a705a5df2 100644
--- a/t/t5515/refs.br-branches-one-octopus_branches-one
+++ b/third_party/git/t/t5515/refs.br-branches-one-octopus_branches-one
diff --git a/t/t5515/refs.br-branches-one_branches-one b/third_party/git/t/t5515/refs.br-branches-one_branches-one
index 8a705a5df2..8a705a5df2 100644
--- a/t/t5515/refs.br-branches-one_branches-one
+++ b/third_party/git/t/t5515/refs.br-branches-one_branches-one
diff --git a/t/t5515/refs.br-config-explicit b/third_party/git/t/t5515/refs.br-config-explicit
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-config-explicit
+++ b/third_party/git/t/t5515/refs.br-config-explicit
diff --git a/t/t5515/refs.br-config-explicit-merge b/third_party/git/t/t5515/refs.br-config-explicit-merge
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-config-explicit-merge
+++ b/third_party/git/t/t5515/refs.br-config-explicit-merge
diff --git a/t/t5515/refs.br-config-explicit-merge_config-explicit b/third_party/git/t/t5515/refs.br-config-explicit-merge_config-explicit
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-config-explicit-merge_config-explicit
+++ b/third_party/git/t/t5515/refs.br-config-explicit-merge_config-explicit
diff --git a/t/t5515/refs.br-config-explicit-octopus b/third_party/git/t/t5515/refs.br-config-explicit-octopus
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-config-explicit-octopus
+++ b/third_party/git/t/t5515/refs.br-config-explicit-octopus
diff --git a/t/t5515/refs.br-config-explicit-octopus_config-explicit b/third_party/git/t/t5515/refs.br-config-explicit-octopus_config-explicit
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-config-explicit-octopus_config-explicit
+++ b/third_party/git/t/t5515/refs.br-config-explicit-octopus_config-explicit
diff --git a/t/t5515/refs.br-config-explicit_config-explicit b/third_party/git/t/t5515/refs.br-config-explicit_config-explicit
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-config-explicit_config-explicit
+++ b/third_party/git/t/t5515/refs.br-config-explicit_config-explicit
diff --git a/t/t5515/refs.br-config-glob b/third_party/git/t/t5515/refs.br-config-glob
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-config-glob
+++ b/third_party/git/t/t5515/refs.br-config-glob
diff --git a/t/t5515/refs.br-config-glob-merge b/third_party/git/t/t5515/refs.br-config-glob-merge
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-config-glob-merge
+++ b/third_party/git/t/t5515/refs.br-config-glob-merge
diff --git a/t/t5515/refs.br-config-glob-merge_config-glob b/third_party/git/t/t5515/refs.br-config-glob-merge_config-glob
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-config-glob-merge_config-glob
+++ b/third_party/git/t/t5515/refs.br-config-glob-merge_config-glob
diff --git a/t/t5515/refs.br-config-glob-octopus b/third_party/git/t/t5515/refs.br-config-glob-octopus
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-config-glob-octopus
+++ b/third_party/git/t/t5515/refs.br-config-glob-octopus
diff --git a/t/t5515/refs.br-config-glob-octopus_config-glob b/third_party/git/t/t5515/refs.br-config-glob-octopus_config-glob
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-config-glob-octopus_config-glob
+++ b/third_party/git/t/t5515/refs.br-config-glob-octopus_config-glob
diff --git a/t/t5515/refs.br-config-glob_config-glob b/third_party/git/t/t5515/refs.br-config-glob_config-glob
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-config-glob_config-glob
+++ b/third_party/git/t/t5515/refs.br-config-glob_config-glob
diff --git a/t/t5515/refs.br-remote-explicit b/third_party/git/t/t5515/refs.br-remote-explicit
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-remote-explicit
+++ b/third_party/git/t/t5515/refs.br-remote-explicit
diff --git a/t/t5515/refs.br-remote-explicit-merge b/third_party/git/t/t5515/refs.br-remote-explicit-merge
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-remote-explicit-merge
+++ b/third_party/git/t/t5515/refs.br-remote-explicit-merge
diff --git a/t/t5515/refs.br-remote-explicit-merge_remote-explicit b/third_party/git/t/t5515/refs.br-remote-explicit-merge_remote-explicit
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-remote-explicit-merge_remote-explicit
+++ b/third_party/git/t/t5515/refs.br-remote-explicit-merge_remote-explicit
diff --git a/t/t5515/refs.br-remote-explicit-octopus b/third_party/git/t/t5515/refs.br-remote-explicit-octopus
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-remote-explicit-octopus
+++ b/third_party/git/t/t5515/refs.br-remote-explicit-octopus
diff --git a/t/t5515/refs.br-remote-explicit-octopus_remote-explicit b/third_party/git/t/t5515/refs.br-remote-explicit-octopus_remote-explicit
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-remote-explicit-octopus_remote-explicit
+++ b/third_party/git/t/t5515/refs.br-remote-explicit-octopus_remote-explicit
diff --git a/t/t5515/refs.br-remote-explicit_remote-explicit b/third_party/git/t/t5515/refs.br-remote-explicit_remote-explicit
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-remote-explicit_remote-explicit
+++ b/third_party/git/t/t5515/refs.br-remote-explicit_remote-explicit
diff --git a/t/t5515/refs.br-remote-glob b/third_party/git/t/t5515/refs.br-remote-glob
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-remote-glob
+++ b/third_party/git/t/t5515/refs.br-remote-glob
diff --git a/t/t5515/refs.br-remote-glob-merge b/third_party/git/t/t5515/refs.br-remote-glob-merge
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-remote-glob-merge
+++ b/third_party/git/t/t5515/refs.br-remote-glob-merge
diff --git a/t/t5515/refs.br-remote-glob-merge_remote-glob b/third_party/git/t/t5515/refs.br-remote-glob-merge_remote-glob
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-remote-glob-merge_remote-glob
+++ b/third_party/git/t/t5515/refs.br-remote-glob-merge_remote-glob
diff --git a/t/t5515/refs.br-remote-glob-octopus b/third_party/git/t/t5515/refs.br-remote-glob-octopus
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-remote-glob-octopus
+++ b/third_party/git/t/t5515/refs.br-remote-glob-octopus
diff --git a/t/t5515/refs.br-remote-glob-octopus_remote-glob b/third_party/git/t/t5515/refs.br-remote-glob-octopus_remote-glob
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-remote-glob-octopus_remote-glob
+++ b/third_party/git/t/t5515/refs.br-remote-glob-octopus_remote-glob
diff --git a/t/t5515/refs.br-remote-glob_remote-glob b/third_party/git/t/t5515/refs.br-remote-glob_remote-glob
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-remote-glob_remote-glob
+++ b/third_party/git/t/t5515/refs.br-remote-glob_remote-glob
diff --git a/t/t5515/refs.br-unconfig b/third_party/git/t/t5515/refs.br-unconfig
index 13e4ad2e46..13e4ad2e46 100644
--- a/t/t5515/refs.br-unconfig
+++ b/third_party/git/t/t5515/refs.br-unconfig
diff --git a/t/t5515/refs.br-unconfig_--tags_.._.git b/third_party/git/t/t5515/refs.br-unconfig_--tags_.._.git
index 13e4ad2e46..13e4ad2e46 100644
--- a/t/t5515/refs.br-unconfig_--tags_.._.git
+++ b/third_party/git/t/t5515/refs.br-unconfig_--tags_.._.git
diff --git a/t/t5515/refs.br-unconfig_.._.git b/third_party/git/t/t5515/refs.br-unconfig_.._.git
index 70962eaac1..70962eaac1 100644
--- a/t/t5515/refs.br-unconfig_.._.git
+++ b/third_party/git/t/t5515/refs.br-unconfig_.._.git
diff --git a/t/t5515/refs.br-unconfig_.._.git_one b/third_party/git/t/t5515/refs.br-unconfig_.._.git_one
index 70962eaac1..70962eaac1 100644
--- a/t/t5515/refs.br-unconfig_.._.git_one
+++ b/third_party/git/t/t5515/refs.br-unconfig_.._.git_one
diff --git a/t/t5515/refs.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file b/third_party/git/t/t5515/refs.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file
index 13e4ad2e46..13e4ad2e46 100644
--- a/t/t5515/refs.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file
+++ b/third_party/git/t/t5515/refs.br-unconfig_.._.git_one_tag_tag-one_tag_tag-three-file
diff --git a/t/t5515/refs.br-unconfig_.._.git_one_two b/third_party/git/t/t5515/refs.br-unconfig_.._.git_one_two
index 70962eaac1..70962eaac1 100644
--- a/t/t5515/refs.br-unconfig_.._.git_one_two
+++ b/third_party/git/t/t5515/refs.br-unconfig_.._.git_one_two
diff --git a/t/t5515/refs.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file b/third_party/git/t/t5515/refs.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file
index 13e4ad2e46..13e4ad2e46 100644
--- a/t/t5515/refs.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file
+++ b/third_party/git/t/t5515/refs.br-unconfig_.._.git_tag_tag-one-tree_tag_tag-three-file
diff --git a/t/t5515/refs.br-unconfig_.._.git_tag_tag-one_tag_tag-three b/third_party/git/t/t5515/refs.br-unconfig_.._.git_tag_tag-one_tag_tag-three
index 13e4ad2e46..13e4ad2e46 100644
--- a/t/t5515/refs.br-unconfig_.._.git_tag_tag-one_tag_tag-three
+++ b/third_party/git/t/t5515/refs.br-unconfig_.._.git_tag_tag-one_tag_tag-three
diff --git a/t/t5515/refs.br-unconfig_branches-default b/third_party/git/t/t5515/refs.br-unconfig_branches-default
index 21917c1e5d..21917c1e5d 100644
--- a/t/t5515/refs.br-unconfig_branches-default
+++ b/third_party/git/t/t5515/refs.br-unconfig_branches-default
diff --git a/t/t5515/refs.br-unconfig_branches-one b/third_party/git/t/t5515/refs.br-unconfig_branches-one
index 8a705a5df2..8a705a5df2 100644
--- a/t/t5515/refs.br-unconfig_branches-one
+++ b/third_party/git/t/t5515/refs.br-unconfig_branches-one
diff --git a/t/t5515/refs.br-unconfig_config-explicit b/third_party/git/t/t5515/refs.br-unconfig_config-explicit
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-unconfig_config-explicit
+++ b/third_party/git/t/t5515/refs.br-unconfig_config-explicit
diff --git a/t/t5515/refs.br-unconfig_config-glob b/third_party/git/t/t5515/refs.br-unconfig_config-glob
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-unconfig_config-glob
+++ b/third_party/git/t/t5515/refs.br-unconfig_config-glob
diff --git a/t/t5515/refs.br-unconfig_remote-explicit b/third_party/git/t/t5515/refs.br-unconfig_remote-explicit
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-unconfig_remote-explicit
+++ b/third_party/git/t/t5515/refs.br-unconfig_remote-explicit
diff --git a/t/t5515/refs.br-unconfig_remote-glob b/third_party/git/t/t5515/refs.br-unconfig_remote-glob
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.br-unconfig_remote-glob
+++ b/third_party/git/t/t5515/refs.br-unconfig_remote-glob
diff --git a/t/t5515/refs.master b/third_party/git/t/t5515/refs.master
index 13e4ad2e46..13e4ad2e46 100644
--- a/t/t5515/refs.master
+++ b/third_party/git/t/t5515/refs.master
diff --git a/t/t5515/refs.master_--tags_.._.git b/third_party/git/t/t5515/refs.master_--tags_.._.git
index 13e4ad2e46..13e4ad2e46 100644
--- a/t/t5515/refs.master_--tags_.._.git
+++ b/third_party/git/t/t5515/refs.master_--tags_.._.git
diff --git a/t/t5515/refs.master_.._.git b/third_party/git/t/t5515/refs.master_.._.git
index 70962eaac1..70962eaac1 100644
--- a/t/t5515/refs.master_.._.git
+++ b/third_party/git/t/t5515/refs.master_.._.git
diff --git a/t/t5515/refs.master_.._.git_one b/third_party/git/t/t5515/refs.master_.._.git_one
index 70962eaac1..70962eaac1 100644
--- a/t/t5515/refs.master_.._.git_one
+++ b/third_party/git/t/t5515/refs.master_.._.git_one
diff --git a/t/t5515/refs.master_.._.git_one_tag_tag-one_tag_tag-three-file b/third_party/git/t/t5515/refs.master_.._.git_one_tag_tag-one_tag_tag-three-file
index 13e4ad2e46..13e4ad2e46 100644
--- a/t/t5515/refs.master_.._.git_one_tag_tag-one_tag_tag-three-file
+++ b/third_party/git/t/t5515/refs.master_.._.git_one_tag_tag-one_tag_tag-three-file
diff --git a/t/t5515/refs.master_.._.git_one_two b/third_party/git/t/t5515/refs.master_.._.git_one_two
index 70962eaac1..70962eaac1 100644
--- a/t/t5515/refs.master_.._.git_one_two
+++ b/third_party/git/t/t5515/refs.master_.._.git_one_two
diff --git a/t/t5515/refs.master_.._.git_tag_tag-one-tree_tag_tag-three-file b/third_party/git/t/t5515/refs.master_.._.git_tag_tag-one-tree_tag_tag-three-file
index 13e4ad2e46..13e4ad2e46 100644
--- a/t/t5515/refs.master_.._.git_tag_tag-one-tree_tag_tag-three-file
+++ b/third_party/git/t/t5515/refs.master_.._.git_tag_tag-one-tree_tag_tag-three-file
diff --git a/t/t5515/refs.master_.._.git_tag_tag-one_tag_tag-three b/third_party/git/t/t5515/refs.master_.._.git_tag_tag-one_tag_tag-three
index 13e4ad2e46..13e4ad2e46 100644
--- a/t/t5515/refs.master_.._.git_tag_tag-one_tag_tag-three
+++ b/third_party/git/t/t5515/refs.master_.._.git_tag_tag-one_tag_tag-three
diff --git a/t/t5515/refs.master_branches-default b/third_party/git/t/t5515/refs.master_branches-default
index 21917c1e5d..21917c1e5d 100644
--- a/t/t5515/refs.master_branches-default
+++ b/third_party/git/t/t5515/refs.master_branches-default
diff --git a/t/t5515/refs.master_branches-one b/third_party/git/t/t5515/refs.master_branches-one
index 8a705a5df2..8a705a5df2 100644
--- a/t/t5515/refs.master_branches-one
+++ b/third_party/git/t/t5515/refs.master_branches-one
diff --git a/t/t5515/refs.master_config-explicit b/third_party/git/t/t5515/refs.master_config-explicit
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.master_config-explicit
+++ b/third_party/git/t/t5515/refs.master_config-explicit
diff --git a/t/t5515/refs.master_config-glob b/third_party/git/t/t5515/refs.master_config-glob
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.master_config-glob
+++ b/third_party/git/t/t5515/refs.master_config-glob
diff --git a/t/t5515/refs.master_remote-explicit b/third_party/git/t/t5515/refs.master_remote-explicit
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.master_remote-explicit
+++ b/third_party/git/t/t5515/refs.master_remote-explicit
diff --git a/t/t5515/refs.master_remote-glob b/third_party/git/t/t5515/refs.master_remote-glob
index 9bbbfd9fc5..9bbbfd9fc5 100644
--- a/t/t5515/refs.master_remote-glob
+++ b/third_party/git/t/t5515/refs.master_remote-glob
diff --git a/t/t5516-fetch-push.sh b/third_party/git/t/t5516-fetch-push.sh
index c81ca360ac..c81ca360ac 100755
--- a/t/t5516-fetch-push.sh
+++ b/third_party/git/t/t5516-fetch-push.sh
diff --git a/t/t5517-push-mirror.sh b/third_party/git/t/t5517-push-mirror.sh
index c05a661400..c05a661400 100755
--- a/t/t5517-push-mirror.sh
+++ b/third_party/git/t/t5517-push-mirror.sh
diff --git a/t/t5518-fetch-exit-status.sh b/third_party/git/t/t5518-fetch-exit-status.sh
index c2060bb870..c2060bb870 100755
--- a/t/t5518-fetch-exit-status.sh
+++ b/third_party/git/t/t5518-fetch-exit-status.sh
diff --git a/t/t5519-push-alternates.sh b/third_party/git/t/t5519-push-alternates.sh
index 11fcd37700..11fcd37700 100755
--- a/t/t5519-push-alternates.sh
+++ b/third_party/git/t/t5519-push-alternates.sh
diff --git a/t/t5520-pull.sh b/third_party/git/t/t5520-pull.sh
index cf4cc32fd0..cf4cc32fd0 100755
--- a/t/t5520-pull.sh
+++ b/third_party/git/t/t5520-pull.sh
diff --git a/t/t5521-pull-options.sh b/third_party/git/t/t5521-pull-options.sh
index ccde8ba491..ccde8ba491 100755
--- a/t/t5521-pull-options.sh
+++ b/third_party/git/t/t5521-pull-options.sh
diff --git a/t/t5522-pull-symlink.sh b/third_party/git/t/t5522-pull-symlink.sh
index bcff460d0a..bcff460d0a 100755
--- a/t/t5522-pull-symlink.sh
+++ b/third_party/git/t/t5522-pull-symlink.sh
diff --git a/t/t5523-push-upstream.sh b/third_party/git/t/t5523-push-upstream.sh
index c0df81a014..c0df81a014 100755
--- a/t/t5523-push-upstream.sh
+++ b/third_party/git/t/t5523-push-upstream.sh
diff --git a/t/t5524-pull-msg.sh b/third_party/git/t/t5524-pull-msg.sh
index c278adaa5a..c278adaa5a 100755
--- a/t/t5524-pull-msg.sh
+++ b/third_party/git/t/t5524-pull-msg.sh
diff --git a/t/t5525-fetch-tagopt.sh b/third_party/git/t/t5525-fetch-tagopt.sh
index 45815f7378..45815f7378 100755
--- a/t/t5525-fetch-tagopt.sh
+++ b/third_party/git/t/t5525-fetch-tagopt.sh
diff --git a/t/t5526-fetch-submodules.sh b/third_party/git/t/t5526-fetch-submodules.sh
index 63205dfdf9..63205dfdf9 100755
--- a/t/t5526-fetch-submodules.sh
+++ b/third_party/git/t/t5526-fetch-submodules.sh
diff --git a/t/t5527-fetch-odd-refs.sh b/third_party/git/t/t5527-fetch-odd-refs.sh
index 3b0cb98422..3b0cb98422 100755
--- a/t/t5527-fetch-odd-refs.sh
+++ b/third_party/git/t/t5527-fetch-odd-refs.sh
diff --git a/t/t5528-push-default.sh b/third_party/git/t/t5528-push-default.sh
index 44309566f1..44309566f1 100755
--- a/t/t5528-push-default.sh
+++ b/third_party/git/t/t5528-push-default.sh
diff --git a/t/t5529-push-errors.sh b/third_party/git/t/t5529-push-errors.sh
index 9871307fd4..9871307fd4 100755
--- a/t/t5529-push-errors.sh
+++ b/third_party/git/t/t5529-push-errors.sh
diff --git a/t/t5530-upload-pack-error.sh b/third_party/git/t/t5530-upload-pack-error.sh
index a1d3031d40..a1d3031d40 100755
--- a/t/t5530-upload-pack-error.sh
+++ b/third_party/git/t/t5530-upload-pack-error.sh
diff --git a/t/t5531-deep-submodule-push.sh b/third_party/git/t/t5531-deep-submodule-push.sh
index 4ad059e6be..4ad059e6be 100755
--- a/t/t5531-deep-submodule-push.sh
+++ b/third_party/git/t/t5531-deep-submodule-push.sh
diff --git a/t/t5532-fetch-proxy.sh b/third_party/git/t/t5532-fetch-proxy.sh
index 9c2798603b..9c2798603b 100755
--- a/t/t5532-fetch-proxy.sh
+++ b/third_party/git/t/t5532-fetch-proxy.sh
diff --git a/t/t5533-push-cas.sh b/third_party/git/t/t5533-push-cas.sh
index 0b0eb1d025..0b0eb1d025 100755
--- a/t/t5533-push-cas.sh
+++ b/third_party/git/t/t5533-push-cas.sh
diff --git a/t/t5534-push-signed.sh b/third_party/git/t/t5534-push-signed.sh
index 030331f1c5..030331f1c5 100755
--- a/t/t5534-push-signed.sh
+++ b/third_party/git/t/t5534-push-signed.sh
diff --git a/t/t5535-fetch-push-symref.sh b/third_party/git/t/t5535-fetch-push-symref.sh
index 8ed58d27f2..8ed58d27f2 100755
--- a/t/t5535-fetch-push-symref.sh
+++ b/third_party/git/t/t5535-fetch-push-symref.sh
diff --git a/t/t5536-fetch-conflicts.sh b/third_party/git/t/t5536-fetch-conflicts.sh
index 91f28c2f78..91f28c2f78 100755
--- a/t/t5536-fetch-conflicts.sh
+++ b/third_party/git/t/t5536-fetch-conflicts.sh
diff --git a/t/t5537-fetch-shallow.sh b/third_party/git/t/t5537-fetch-shallow.sh
index 66f0b64d39..66f0b64d39 100755
--- a/t/t5537-fetch-shallow.sh
+++ b/third_party/git/t/t5537-fetch-shallow.sh
diff --git a/t/t5538-push-shallow.sh b/third_party/git/t/t5538-push-shallow.sh
index ecbf84d21c..ecbf84d21c 100755
--- a/t/t5538-push-shallow.sh
+++ b/third_party/git/t/t5538-push-shallow.sh
diff --git a/t/t5539-fetch-http-shallow.sh b/third_party/git/t/t5539-fetch-http-shallow.sh
index b4ad81f006..b4ad81f006 100755
--- a/t/t5539-fetch-http-shallow.sh
+++ b/third_party/git/t/t5539-fetch-http-shallow.sh
diff --git a/t/t5540-http-push-webdav.sh b/third_party/git/t/t5540-http-push-webdav.sh
index a094fd5e71..a094fd5e71 100755
--- a/t/t5540-http-push-webdav.sh
+++ b/third_party/git/t/t5540-http-push-webdav.sh
diff --git a/t/t5541-http-push-smart.sh b/third_party/git/t/t5541-http-push-smart.sh
index b86ddb60f2..b86ddb60f2 100755
--- a/t/t5541-http-push-smart.sh
+++ b/third_party/git/t/t5541-http-push-smart.sh
diff --git a/t/t5542-push-http-shallow.sh b/third_party/git/t/t5542-push-http-shallow.sh
index ddc1db722d..ddc1db722d 100755
--- a/t/t5542-push-http-shallow.sh
+++ b/third_party/git/t/t5542-push-http-shallow.sh
diff --git a/t/t5543-atomic-push.sh b/third_party/git/t/t5543-atomic-push.sh
index 7079bcf9a0..7079bcf9a0 100755
--- a/t/t5543-atomic-push.sh
+++ b/third_party/git/t/t5543-atomic-push.sh
diff --git a/t/t5544-pack-objects-hook.sh b/third_party/git/t/t5544-pack-objects-hook.sh
index 4357af1525..4357af1525 100755
--- a/t/t5544-pack-objects-hook.sh
+++ b/third_party/git/t/t5544-pack-objects-hook.sh
diff --git a/t/t5545-push-options.sh b/third_party/git/t/t5545-push-options.sh
index 6d1d59c9b1..6d1d59c9b1 100755
--- a/t/t5545-push-options.sh
+++ b/third_party/git/t/t5545-push-options.sh
diff --git a/t/t5546-receive-limits.sh b/third_party/git/t/t5546-receive-limits.sh
index 0b0e987fdb..0b0e987fdb 100755
--- a/t/t5546-receive-limits.sh
+++ b/third_party/git/t/t5546-receive-limits.sh
diff --git a/t/t5547-push-quarantine.sh b/third_party/git/t/t5547-push-quarantine.sh
index faaa51ccc5..faaa51ccc5 100755
--- a/t/t5547-push-quarantine.sh
+++ b/third_party/git/t/t5547-push-quarantine.sh
diff --git a/t/t5550-http-fetch-dumb.sh b/third_party/git/t/t5550-http-fetch-dumb.sh
index b811d89cfd..b811d89cfd 100755
--- a/t/t5550-http-fetch-dumb.sh
+++ b/third_party/git/t/t5550-http-fetch-dumb.sh
diff --git a/t/t5551-http-fetch-smart.sh b/third_party/git/t/t5551-http-fetch-smart.sh
index e38e543867..e38e543867 100755
--- a/t/t5551-http-fetch-smart.sh
+++ b/third_party/git/t/t5551-http-fetch-smart.sh
diff --git a/t/t5552-skipping-fetch-negotiator.sh b/third_party/git/t/t5552-skipping-fetch-negotiator.sh
index 8a14be51a1..8a14be51a1 100755
--- a/t/t5552-skipping-fetch-negotiator.sh
+++ b/third_party/git/t/t5552-skipping-fetch-negotiator.sh
diff --git a/t/t5560-http-backend-noserver.sh b/third_party/git/t/t5560-http-backend-noserver.sh
index 9fafcf1945..9fafcf1945 100755
--- a/t/t5560-http-backend-noserver.sh
+++ b/third_party/git/t/t5560-http-backend-noserver.sh
diff --git a/t/t5561-http-backend.sh b/third_party/git/t/t5561-http-backend.sh
index 6eb0294978..6eb0294978 100755
--- a/t/t5561-http-backend.sh
+++ b/third_party/git/t/t5561-http-backend.sh
diff --git a/t/t5562-http-backend-content-length.sh b/third_party/git/t/t5562-http-backend-content-length.sh
index f0f425b2cf..f0f425b2cf 100755
--- a/t/t5562-http-backend-content-length.sh
+++ b/third_party/git/t/t5562-http-backend-content-length.sh
diff --git a/t/t5562/invoke-with-content-length.pl b/third_party/git/t/t5562/invoke-with-content-length.pl
index 0943474af2..0943474af2 100644
--- a/t/t5562/invoke-with-content-length.pl
+++ b/third_party/git/t/t5562/invoke-with-content-length.pl
diff --git a/t/t556x_common b/third_party/git/t/t556x_common
index 359fcfe32b..359fcfe32b 100755
--- a/t/t556x_common
+++ b/third_party/git/t/t556x_common
diff --git a/t/t5570-git-daemon.sh b/third_party/git/t/t5570-git-daemon.sh
index 34487bbb8c..34487bbb8c 100755
--- a/t/t5570-git-daemon.sh
+++ b/third_party/git/t/t5570-git-daemon.sh
diff --git a/t/t5571-pre-push-hook.sh b/third_party/git/t/t5571-pre-push-hook.sh
index ac53d63869..ac53d63869 100755
--- a/t/t5571-pre-push-hook.sh
+++ b/third_party/git/t/t5571-pre-push-hook.sh
diff --git a/t/t5572-pull-submodule.sh b/third_party/git/t/t5572-pull-submodule.sh
index f916729a12..f916729a12 100755
--- a/t/t5572-pull-submodule.sh
+++ b/third_party/git/t/t5572-pull-submodule.sh
diff --git a/t/t5573-pull-verify-signatures.sh b/third_party/git/t/t5573-pull-verify-signatures.sh
index 3e9876e197..3e9876e197 100755
--- a/t/t5573-pull-verify-signatures.sh
+++ b/third_party/git/t/t5573-pull-verify-signatures.sh
diff --git a/t/t5580-clone-push-unc.sh b/third_party/git/t/t5580-clone-push-unc.sh
index b3c8a92450..b3c8a92450 100755
--- a/t/t5580-clone-push-unc.sh
+++ b/third_party/git/t/t5580-clone-push-unc.sh
diff --git a/t/t5581-http-curl-verbose.sh b/third_party/git/t/t5581-http-curl-verbose.sh
index 5129b0724f..5129b0724f 100755
--- a/t/t5581-http-curl-verbose.sh
+++ b/third_party/git/t/t5581-http-curl-verbose.sh
diff --git a/t/t5600-clone-fail-cleanup.sh b/third_party/git/t/t5600-clone-fail-cleanup.sh
index 4a1a912e03..4a1a912e03 100755
--- a/t/t5600-clone-fail-cleanup.sh
+++ b/third_party/git/t/t5600-clone-fail-cleanup.sh
diff --git a/t/t5601-clone.sh b/third_party/git/t/t5601-clone.sh
index 37d76808d4..37d76808d4 100755
--- a/t/t5601-clone.sh
+++ b/third_party/git/t/t5601-clone.sh
diff --git a/t/t5602-clone-remote-exec.sh b/third_party/git/t/t5602-clone-remote-exec.sh
index cbcceab9d5..cbcceab9d5 100755
--- a/t/t5602-clone-remote-exec.sh
+++ b/third_party/git/t/t5602-clone-remote-exec.sh
diff --git a/t/t5603-clone-dirname.sh b/third_party/git/t/t5603-clone-dirname.sh
index 13b5e5eb9b..13b5e5eb9b 100755
--- a/t/t5603-clone-dirname.sh
+++ b/third_party/git/t/t5603-clone-dirname.sh
diff --git a/t/t5604-clone-reference.sh b/third_party/git/t/t5604-clone-reference.sh
index 4894237ab8..4894237ab8 100755
--- a/t/t5604-clone-reference.sh
+++ b/third_party/git/t/t5604-clone-reference.sh
diff --git a/t/t5605-clone-local.sh b/third_party/git/t/t5605-clone-local.sh
index af23419ebf..af23419ebf 100755
--- a/t/t5605-clone-local.sh
+++ b/third_party/git/t/t5605-clone-local.sh
diff --git a/t/t5606-clone-options.sh b/third_party/git/t/t5606-clone-options.sh
index 9e24ec88e6..9e24ec88e6 100755
--- a/t/t5606-clone-options.sh
+++ b/third_party/git/t/t5606-clone-options.sh
diff --git a/t/t5607-clone-bundle.sh b/third_party/git/t/t5607-clone-bundle.sh
index 2a0fb15cf1..2a0fb15cf1 100755
--- a/t/t5607-clone-bundle.sh
+++ b/third_party/git/t/t5607-clone-bundle.sh
diff --git a/t/t5608-clone-2gb.sh b/third_party/git/t/t5608-clone-2gb.sh
index 2c6bc07344..2c6bc07344 100755
--- a/t/t5608-clone-2gb.sh
+++ b/third_party/git/t/t5608-clone-2gb.sh
diff --git a/t/t5609-clone-branch.sh b/third_party/git/t/t5609-clone-branch.sh
index 6e7a7be052..6e7a7be052 100755
--- a/t/t5609-clone-branch.sh
+++ b/third_party/git/t/t5609-clone-branch.sh
diff --git a/t/t5610-clone-detached.sh b/third_party/git/t/t5610-clone-detached.sh
index 8b0d607df1..8b0d607df1 100755
--- a/t/t5610-clone-detached.sh
+++ b/third_party/git/t/t5610-clone-detached.sh
diff --git a/t/t5611-clone-config.sh b/third_party/git/t/t5611-clone-config.sh
index 60c1ba951b..60c1ba951b 100755
--- a/t/t5611-clone-config.sh
+++ b/third_party/git/t/t5611-clone-config.sh
diff --git a/t/t5612-clone-refspec.sh b/third_party/git/t/t5612-clone-refspec.sh
index e36ac01661..e36ac01661 100755
--- a/t/t5612-clone-refspec.sh
+++ b/third_party/git/t/t5612-clone-refspec.sh
diff --git a/t/t5613-info-alternate.sh b/third_party/git/t/t5613-info-alternate.sh
index 895f46bb91..895f46bb91 100755
--- a/t/t5613-info-alternate.sh
+++ b/third_party/git/t/t5613-info-alternate.sh
diff --git a/t/t5614-clone-submodules-shallow.sh b/third_party/git/t/t5614-clone-submodules-shallow.sh
index e4e6ea4d52..e4e6ea4d52 100755
--- a/t/t5614-clone-submodules-shallow.sh
+++ b/third_party/git/t/t5614-clone-submodules-shallow.sh
diff --git a/t/t5615-alternate-env.sh b/third_party/git/t/t5615-alternate-env.sh
index b4905b822c..b4905b822c 100755
--- a/t/t5615-alternate-env.sh
+++ b/third_party/git/t/t5615-alternate-env.sh
diff --git a/t/t5616-partial-clone.sh b/third_party/git/t/t5616-partial-clone.sh
index b91ef548f8..b91ef548f8 100755
--- a/t/t5616-partial-clone.sh
+++ b/third_party/git/t/t5616-partial-clone.sh
diff --git a/t/t5617-clone-submodules-remote.sh b/third_party/git/t/t5617-clone-submodules-remote.sh
index 37fcce9c40..37fcce9c40 100755
--- a/t/t5617-clone-submodules-remote.sh
+++ b/third_party/git/t/t5617-clone-submodules-remote.sh
diff --git a/t/t5618-alternate-refs.sh b/third_party/git/t/t5618-alternate-refs.sh
index 3353216f09..3353216f09 100755
--- a/t/t5618-alternate-refs.sh
+++ b/third_party/git/t/t5618-alternate-refs.sh
diff --git a/t/t5700-protocol-v1.sh b/third_party/git/t/t5700-protocol-v1.sh
index 7c9511c593..7c9511c593 100755
--- a/t/t5700-protocol-v1.sh
+++ b/third_party/git/t/t5700-protocol-v1.sh
diff --git a/t/t5701-git-serve.sh b/third_party/git/t/t5701-git-serve.sh
index ffb9613885..ffb9613885 100755
--- a/t/t5701-git-serve.sh
+++ b/third_party/git/t/t5701-git-serve.sh
diff --git a/t/t5702-protocol-v2.sh b/third_party/git/t/t5702-protocol-v2.sh
index 011b81d4fc..011b81d4fc 100755
--- a/t/t5702-protocol-v2.sh
+++ b/third_party/git/t/t5702-protocol-v2.sh
diff --git a/t/t5703-upload-pack-ref-in-want.sh b/third_party/git/t/t5703-upload-pack-ref-in-want.sh
index de4b6106ef..de4b6106ef 100755
--- a/t/t5703-upload-pack-ref-in-want.sh
+++ b/third_party/git/t/t5703-upload-pack-ref-in-want.sh
diff --git a/t/t5801-remote-helpers.sh b/third_party/git/t/t5801-remote-helpers.sh
index 2d6c4a281e..2d6c4a281e 100755
--- a/t/t5801-remote-helpers.sh
+++ b/third_party/git/t/t5801-remote-helpers.sh
diff --git a/t/t5801/git-remote-testgit b/third_party/git/t/t5801/git-remote-testgit
index 6b9f0b5dc7..6b9f0b5dc7 100755
--- a/t/t5801/git-remote-testgit
+++ b/third_party/git/t/t5801/git-remote-testgit
diff --git a/t/t5802-connect-helper.sh b/third_party/git/t/t5802-connect-helper.sh
index c6c2661878..c6c2661878 100755
--- a/t/t5802-connect-helper.sh
+++ b/third_party/git/t/t5802-connect-helper.sh
diff --git a/t/t5810-proto-disable-local.sh b/third_party/git/t/t5810-proto-disable-local.sh
index c1ef99b85c..c1ef99b85c 100755
--- a/t/t5810-proto-disable-local.sh
+++ b/third_party/git/t/t5810-proto-disable-local.sh
diff --git a/t/t5811-proto-disable-git.sh b/third_party/git/t/t5811-proto-disable-git.sh
index 8ac6b2a1d0..8ac6b2a1d0 100755
--- a/t/t5811-proto-disable-git.sh
+++ b/third_party/git/t/t5811-proto-disable-git.sh
diff --git a/t/t5812-proto-disable-http.sh b/third_party/git/t/t5812-proto-disable-http.sh
index af8772fada..af8772fada 100755
--- a/t/t5812-proto-disable-http.sh
+++ b/third_party/git/t/t5812-proto-disable-http.sh
diff --git a/t/t5813-proto-disable-ssh.sh b/third_party/git/t/t5813-proto-disable-ssh.sh
index 3f084ee306..3f084ee306 100755
--- a/t/t5813-proto-disable-ssh.sh
+++ b/third_party/git/t/t5813-proto-disable-ssh.sh
diff --git a/t/t5814-proto-disable-ext.sh b/third_party/git/t/t5814-proto-disable-ext.sh
index 9d6f7dfa2c..9d6f7dfa2c 100755
--- a/t/t5814-proto-disable-ext.sh
+++ b/third_party/git/t/t5814-proto-disable-ext.sh
diff --git a/t/t5815-submodule-protos.sh b/third_party/git/t/t5815-submodule-protos.sh
index 06f55a1b8a..06f55a1b8a 100755
--- a/t/t5815-submodule-protos.sh
+++ b/third_party/git/t/t5815-submodule-protos.sh
diff --git a/t/t5900-repo-selection.sh b/third_party/git/t/t5900-repo-selection.sh
index 14e59c5b3e..14e59c5b3e 100755
--- a/t/t5900-repo-selection.sh
+++ b/third_party/git/t/t5900-repo-selection.sh
diff --git a/t/t6000-rev-list-misc.sh b/third_party/git/t/t6000-rev-list-misc.sh
index 52a9e38d66..52a9e38d66 100755
--- a/t/t6000-rev-list-misc.sh
+++ b/third_party/git/t/t6000-rev-list-misc.sh
diff --git a/t/t6001-rev-list-graft.sh b/third_party/git/t/t6001-rev-list-graft.sh
index 7504ba4751..7504ba4751 100755
--- a/t/t6001-rev-list-graft.sh
+++ b/third_party/git/t/t6001-rev-list-graft.sh
diff --git a/t/t6002-rev-list-bisect.sh b/third_party/git/t/t6002-rev-list-bisect.sh
index a661408038..a661408038 100755
--- a/t/t6002-rev-list-bisect.sh
+++ b/third_party/git/t/t6002-rev-list-bisect.sh
diff --git a/t/t6003-rev-list-topo-order.sh b/third_party/git/t/t6003-rev-list-topo-order.sh
index 24d1836f41..24d1836f41 100755
--- a/t/t6003-rev-list-topo-order.sh
+++ b/third_party/git/t/t6003-rev-list-topo-order.sh
diff --git a/t/t6004-rev-list-path-optim.sh b/third_party/git/t/t6004-rev-list-path-optim.sh
index 3e8c42ee0b..3e8c42ee0b 100755
--- a/t/t6004-rev-list-path-optim.sh
+++ b/third_party/git/t/t6004-rev-list-path-optim.sh
diff --git a/t/t6005-rev-list-count.sh b/third_party/git/t/t6005-rev-list-count.sh
index 0b64822bf6..0b64822bf6 100755
--- a/t/t6005-rev-list-count.sh
+++ b/third_party/git/t/t6005-rev-list-count.sh
diff --git a/t/t6006-rev-list-format.sh b/third_party/git/t/t6006-rev-list-format.sh
index da113d975b..da113d975b 100755
--- a/t/t6006-rev-list-format.sh
+++ b/third_party/git/t/t6006-rev-list-format.sh
diff --git a/t/t6007-rev-list-cherry-pick-file.sh b/third_party/git/t/t6007-rev-list-cherry-pick-file.sh
index f0268372d2..f0268372d2 100755
--- a/t/t6007-rev-list-cherry-pick-file.sh
+++ b/third_party/git/t/t6007-rev-list-cherry-pick-file.sh
diff --git a/t/t6008-rev-list-submodule.sh b/third_party/git/t/t6008-rev-list-submodule.sh
index c4af9ca0a7..c4af9ca0a7 100755
--- a/t/t6008-rev-list-submodule.sh
+++ b/third_party/git/t/t6008-rev-list-submodule.sh
diff --git a/t/t6009-rev-list-parent.sh b/third_party/git/t/t6009-rev-list-parent.sh
index 916d9692bc..916d9692bc 100755
--- a/t/t6009-rev-list-parent.sh
+++ b/third_party/git/t/t6009-rev-list-parent.sh
diff --git a/t/t6010-merge-base.sh b/third_party/git/t/t6010-merge-base.sh
index 44c726ea39..44c726ea39 100755
--- a/t/t6010-merge-base.sh
+++ b/third_party/git/t/t6010-merge-base.sh
diff --git a/t/t6011-rev-list-with-bad-commit.sh b/third_party/git/t/t6011-rev-list-with-bad-commit.sh
index 545b461e51..545b461e51 100755
--- a/t/t6011-rev-list-with-bad-commit.sh
+++ b/third_party/git/t/t6011-rev-list-with-bad-commit.sh
diff --git a/t/t6012-rev-list-simplify.sh b/third_party/git/t/t6012-rev-list-simplify.sh
index a10f0df02b..a10f0df02b 100755
--- a/t/t6012-rev-list-simplify.sh
+++ b/third_party/git/t/t6012-rev-list-simplify.sh
diff --git a/t/t6013-rev-list-reverse-parents.sh b/third_party/git/t/t6013-rev-list-reverse-parents.sh
index 89458d370f..89458d370f 100755
--- a/t/t6013-rev-list-reverse-parents.sh
+++ b/third_party/git/t/t6013-rev-list-reverse-parents.sh
diff --git a/t/t6014-rev-list-all.sh b/third_party/git/t/t6014-rev-list-all.sh
index c9bedd29cb..c9bedd29cb 100755
--- a/t/t6014-rev-list-all.sh
+++ b/third_party/git/t/t6014-rev-list-all.sh
diff --git a/t/t6016-rev-list-graph-simplify-history.sh b/third_party/git/t/t6016-rev-list-graph-simplify-history.sh
index f7181d1d6a..f7181d1d6a 100755
--- a/t/t6016-rev-list-graph-simplify-history.sh
+++ b/third_party/git/t/t6016-rev-list-graph-simplify-history.sh
diff --git a/t/t6017-rev-list-stdin.sh b/third_party/git/t/t6017-rev-list-stdin.sh
index 667b37564e..667b37564e 100755
--- a/t/t6017-rev-list-stdin.sh
+++ b/third_party/git/t/t6017-rev-list-stdin.sh
diff --git a/t/t6018-rev-list-glob.sh b/third_party/git/t/t6018-rev-list-glob.sh
index bb5aeac07f..bb5aeac07f 100755
--- a/t/t6018-rev-list-glob.sh
+++ b/third_party/git/t/t6018-rev-list-glob.sh
diff --git a/t/t6019-rev-list-ancestry-path.sh b/third_party/git/t/t6019-rev-list-ancestry-path.sh
index beadaf6cca..beadaf6cca 100755
--- a/t/t6019-rev-list-ancestry-path.sh
+++ b/third_party/git/t/t6019-rev-list-ancestry-path.sh
diff --git a/t/t6020-merge-df.sh b/third_party/git/t/t6020-merge-df.sh
index 46b506b3b7..46b506b3b7 100755
--- a/t/t6020-merge-df.sh
+++ b/third_party/git/t/t6020-merge-df.sh
diff --git a/t/t6021-merge-criss-cross.sh b/third_party/git/t/t6021-merge-criss-cross.sh
index 213deecab1..213deecab1 100755
--- a/t/t6021-merge-criss-cross.sh
+++ b/third_party/git/t/t6021-merge-criss-cross.sh
diff --git a/t/t6022-merge-rename.sh b/third_party/git/t/t6022-merge-rename.sh
index 53cc9b2ffb..53cc9b2ffb 100755
--- a/t/t6022-merge-rename.sh
+++ b/third_party/git/t/t6022-merge-rename.sh
diff --git a/t/t6023-merge-file.sh b/third_party/git/t/t6023-merge-file.sh
index 51ee887a77..51ee887a77 100755
--- a/t/t6023-merge-file.sh
+++ b/third_party/git/t/t6023-merge-file.sh
diff --git a/t/t6024-recursive-merge.sh b/third_party/git/t/t6024-recursive-merge.sh
index 27c7de90ce..27c7de90ce 100755
--- a/t/t6024-recursive-merge.sh
+++ b/third_party/git/t/t6024-recursive-merge.sh
diff --git a/t/t6025-merge-symlinks.sh b/third_party/git/t/t6025-merge-symlinks.sh
index 433c4de08f..433c4de08f 100755
--- a/t/t6025-merge-symlinks.sh
+++ b/third_party/git/t/t6025-merge-symlinks.sh
diff --git a/t/t6026-merge-attr.sh b/third_party/git/t/t6026-merge-attr.sh
index 8f9b48a493..8f9b48a493 100755
--- a/t/t6026-merge-attr.sh
+++ b/third_party/git/t/t6026-merge-attr.sh
diff --git a/t/t6027-merge-binary.sh b/third_party/git/t/t6027-merge-binary.sh
index 4e6c7cb77e..4e6c7cb77e 100755
--- a/t/t6027-merge-binary.sh
+++ b/third_party/git/t/t6027-merge-binary.sh
diff --git a/t/t6028-merge-up-to-date.sh b/third_party/git/t/t6028-merge-up-to-date.sh
index 7763c1ba98..7763c1ba98 100755
--- a/t/t6028-merge-up-to-date.sh
+++ b/third_party/git/t/t6028-merge-up-to-date.sh
diff --git a/t/t6029-merge-subtree.sh b/third_party/git/t/t6029-merge-subtree.sh
index 793f0c8bf3..793f0c8bf3 100755
--- a/t/t6029-merge-subtree.sh
+++ b/third_party/git/t/t6029-merge-subtree.sh
diff --git a/t/t6030-bisect-porcelain.sh b/third_party/git/t/t6030-bisect-porcelain.sh
index bdc42e9440..bdc42e9440 100755
--- a/t/t6030-bisect-porcelain.sh
+++ b/third_party/git/t/t6030-bisect-porcelain.sh
diff --git a/t/t6031-merge-filemode.sh b/third_party/git/t/t6031-merge-filemode.sh
index 87741efad3..87741efad3 100755
--- a/t/t6031-merge-filemode.sh
+++ b/third_party/git/t/t6031-merge-filemode.sh
diff --git a/t/t6032-merge-large-rename.sh b/third_party/git/t/t6032-merge-large-rename.sh
index 80777386dc..80777386dc 100755
--- a/t/t6032-merge-large-rename.sh
+++ b/third_party/git/t/t6032-merge-large-rename.sh
diff --git a/t/t6033-merge-crlf.sh b/third_party/git/t/t6033-merge-crlf.sh
index e8d65eefb5..e8d65eefb5 100755
--- a/t/t6033-merge-crlf.sh
+++ b/third_party/git/t/t6033-merge-crlf.sh
diff --git a/t/t6034-merge-rename-nocruft.sh b/third_party/git/t/t6034-merge-rename-nocruft.sh
index 89871aa5b0..89871aa5b0 100755
--- a/t/t6034-merge-rename-nocruft.sh
+++ b/third_party/git/t/t6034-merge-rename-nocruft.sh
diff --git a/t/t6035-merge-dir-to-symlink.sh b/third_party/git/t/t6035-merge-dir-to-symlink.sh
index 9324ea4416..9324ea4416 100755
--- a/t/t6035-merge-dir-to-symlink.sh
+++ b/third_party/git/t/t6035-merge-dir-to-symlink.sh
diff --git a/t/t6036-recursive-corner-cases.sh b/third_party/git/t/t6036-recursive-corner-cases.sh
index d23b948f27..d23b948f27 100755
--- a/t/t6036-recursive-corner-cases.sh
+++ b/third_party/git/t/t6036-recursive-corner-cases.sh
diff --git a/t/t6037-merge-ours-theirs.sh b/third_party/git/t/t6037-merge-ours-theirs.sh
index 0aebc6c028..0aebc6c028 100755
--- a/t/t6037-merge-ours-theirs.sh
+++ b/third_party/git/t/t6037-merge-ours-theirs.sh
diff --git a/t/t6038-merge-text-auto.sh b/third_party/git/t/t6038-merge-text-auto.sh
index 5e8d5fa50c..5e8d5fa50c 100755
--- a/t/t6038-merge-text-auto.sh
+++ b/third_party/git/t/t6038-merge-text-auto.sh
diff --git a/t/t6039-merge-ignorecase.sh b/third_party/git/t/t6039-merge-ignorecase.sh
index 531850d834..531850d834 100755
--- a/t/t6039-merge-ignorecase.sh
+++ b/third_party/git/t/t6039-merge-ignorecase.sh
diff --git a/t/t6040-tracking-info.sh b/third_party/git/t/t6040-tracking-info.sh
index ad1922b999..ad1922b999 100755
--- a/t/t6040-tracking-info.sh
+++ b/third_party/git/t/t6040-tracking-info.sh
diff --git a/t/t6041-bisect-submodule.sh b/third_party/git/t/t6041-bisect-submodule.sh
index 62b8a2e7bb..62b8a2e7bb 100755
--- a/t/t6041-bisect-submodule.sh
+++ b/third_party/git/t/t6041-bisect-submodule.sh
diff --git a/t/t6042-merge-rename-corner-cases.sh b/third_party/git/t/t6042-merge-rename-corner-cases.sh
index c5b57f40c3..c5b57f40c3 100755
--- a/t/t6042-merge-rename-corner-cases.sh
+++ b/third_party/git/t/t6042-merge-rename-corner-cases.sh
diff --git a/t/t6043-merge-rename-directories.sh b/third_party/git/t/t6043-merge-rename-directories.sh
index c966147d5d..c966147d5d 100755
--- a/t/t6043-merge-rename-directories.sh
+++ b/third_party/git/t/t6043-merge-rename-directories.sh
diff --git a/t/t6044-merge-unrelated-index-changes.sh b/third_party/git/t/t6044-merge-unrelated-index-changes.sh
index 5e3779ebc9..5e3779ebc9 100755
--- a/t/t6044-merge-unrelated-index-changes.sh
+++ b/third_party/git/t/t6044-merge-unrelated-index-changes.sh
diff --git a/t/t6045-merge-rename-delete.sh b/third_party/git/t/t6045-merge-rename-delete.sh
index 5d33577d2f..5d33577d2f 100755
--- a/t/t6045-merge-rename-delete.sh
+++ b/third_party/git/t/t6045-merge-rename-delete.sh
diff --git a/t/t6046-merge-skip-unneeded-updates.sh b/third_party/git/t/t6046-merge-skip-unneeded-updates.sh
index 3a47623ed3..3a47623ed3 100755
--- a/t/t6046-merge-skip-unneeded-updates.sh
+++ b/third_party/git/t/t6046-merge-skip-unneeded-updates.sh
diff --git a/t/t6050-replace.sh b/third_party/git/t/t6050-replace.sh
index e7e64e085d..e7e64e085d 100755
--- a/t/t6050-replace.sh
+++ b/third_party/git/t/t6050-replace.sh
diff --git a/t/t6060-merge-index.sh b/third_party/git/t/t6060-merge-index.sh
index ddf34f0115..ddf34f0115 100755
--- a/t/t6060-merge-index.sh
+++ b/third_party/git/t/t6060-merge-index.sh
diff --git a/t/t6100-rev-list-in-order.sh b/third_party/git/t/t6100-rev-list-in-order.sh
index b2bb0a7f61..b2bb0a7f61 100755
--- a/t/t6100-rev-list-in-order.sh
+++ b/third_party/git/t/t6100-rev-list-in-order.sh
diff --git a/t/t6101-rev-parse-parents.sh b/third_party/git/t/t6101-rev-parse-parents.sh
index 7683e4a114..7683e4a114 100755
--- a/t/t6101-rev-parse-parents.sh
+++ b/third_party/git/t/t6101-rev-parse-parents.sh
diff --git a/t/t6102-rev-list-unexpected-objects.sh b/third_party/git/t/t6102-rev-list-unexpected-objects.sh
index 28611c978e..28611c978e 100755
--- a/t/t6102-rev-list-unexpected-objects.sh
+++ b/third_party/git/t/t6102-rev-list-unexpected-objects.sh
diff --git a/t/t6110-rev-list-sparse.sh b/third_party/git/t/t6110-rev-list-sparse.sh
index 656ac7fe9d..656ac7fe9d 100755
--- a/t/t6110-rev-list-sparse.sh
+++ b/third_party/git/t/t6110-rev-list-sparse.sh
diff --git a/t/t6111-rev-list-treesame.sh b/third_party/git/t/t6111-rev-list-treesame.sh
index 4244638285..4244638285 100755
--- a/t/t6111-rev-list-treesame.sh
+++ b/third_party/git/t/t6111-rev-list-treesame.sh
diff --git a/t/t6112-rev-list-filters-objects.sh b/third_party/git/t/t6112-rev-list-filters-objects.sh
index acd7f5ab80..acd7f5ab80 100755
--- a/t/t6112-rev-list-filters-objects.sh
+++ b/third_party/git/t/t6112-rev-list-filters-objects.sh
diff --git a/t/t6120-describe.sh b/third_party/git/t/t6120-describe.sh
index 2b883d8174..2b883d8174 100755
--- a/t/t6120-describe.sh
+++ b/third_party/git/t/t6120-describe.sh
diff --git a/t/t6130-pathspec-noglob.sh b/third_party/git/t/t6130-pathspec-noglob.sh
index 37760233a5..37760233a5 100755
--- a/t/t6130-pathspec-noglob.sh
+++ b/third_party/git/t/t6130-pathspec-noglob.sh
diff --git a/t/t6131-pathspec-icase.sh b/third_party/git/t/t6131-pathspec-icase.sh
index 39fc3f6769..39fc3f6769 100755
--- a/t/t6131-pathspec-icase.sh
+++ b/third_party/git/t/t6131-pathspec-icase.sh
diff --git a/t/t6132-pathspec-exclude.sh b/third_party/git/t/t6132-pathspec-exclude.sh
index 2462b19ddd..2462b19ddd 100755
--- a/t/t6132-pathspec-exclude.sh
+++ b/third_party/git/t/t6132-pathspec-exclude.sh
diff --git a/t/t6133-pathspec-rev-dwim.sh b/third_party/git/t/t6133-pathspec-rev-dwim.sh
index a290ffca0d..a290ffca0d 100755
--- a/t/t6133-pathspec-rev-dwim.sh
+++ b/third_party/git/t/t6133-pathspec-rev-dwim.sh
diff --git a/t/t6134-pathspec-in-submodule.sh b/third_party/git/t/t6134-pathspec-in-submodule.sh
index c670668409..c670668409 100755
--- a/t/t6134-pathspec-in-submodule.sh
+++ b/third_party/git/t/t6134-pathspec-in-submodule.sh
diff --git a/t/t6135-pathspec-with-attrs.sh b/third_party/git/t/t6135-pathspec-with-attrs.sh
index 457cc167c7..457cc167c7 100755
--- a/t/t6135-pathspec-with-attrs.sh
+++ b/third_party/git/t/t6135-pathspec-with-attrs.sh
diff --git a/t/t6200-fmt-merge-msg.sh b/third_party/git/t/t6200-fmt-merge-msg.sh
index 8a72b4c43a..8a72b4c43a 100755
--- a/t/t6200-fmt-merge-msg.sh
+++ b/third_party/git/t/t6200-fmt-merge-msg.sh
diff --git a/t/t6300-for-each-ref.sh b/third_party/git/t/t6300-for-each-ref.sh
index ab69aa176d..ab69aa176d 100755
--- a/t/t6300-for-each-ref.sh
+++ b/third_party/git/t/t6300-for-each-ref.sh
diff --git a/t/t6301-for-each-ref-errors.sh b/third_party/git/t/t6301-for-each-ref-errors.sh
index 49cc65bb58..49cc65bb58 100755
--- a/t/t6301-for-each-ref-errors.sh
+++ b/third_party/git/t/t6301-for-each-ref-errors.sh
diff --git a/t/t6302-for-each-ref-filter.sh b/third_party/git/t/t6302-for-each-ref-filter.sh
index 35408d53fd..35408d53fd 100755
--- a/t/t6302-for-each-ref-filter.sh
+++ b/third_party/git/t/t6302-for-each-ref-filter.sh
diff --git a/t/t6500-gc.sh b/third_party/git/t/t6500-gc.sh
index c0f04dc6b0..c0f04dc6b0 100755
--- a/t/t6500-gc.sh
+++ b/third_party/git/t/t6500-gc.sh
diff --git a/t/t6501-freshen-objects.sh b/third_party/git/t/t6501-freshen-objects.sh
index 033871ee5f..033871ee5f 100755
--- a/t/t6501-freshen-objects.sh
+++ b/third_party/git/t/t6501-freshen-objects.sh
diff --git a/t/t6600-test-reach.sh b/third_party/git/t/t6600-test-reach.sh
index b24d850036..b24d850036 100755
--- a/t/t6600-test-reach.sh
+++ b/third_party/git/t/t6600-test-reach.sh
diff --git a/t/t7001-mv.sh b/third_party/git/t/t7001-mv.sh
index 36b50d0b4c..36b50d0b4c 100755
--- a/t/t7001-mv.sh
+++ b/third_party/git/t/t7001-mv.sh
diff --git a/t/t7003-filter-branch.sh b/third_party/git/t/t7003-filter-branch.sh
index e23de7d0b5..e23de7d0b5 100755
--- a/t/t7003-filter-branch.sh
+++ b/third_party/git/t/t7003-filter-branch.sh
diff --git a/t/t7004-tag.sh b/third_party/git/t/t7004-tag.sh
index 80eb13d94e..80eb13d94e 100755
--- a/t/t7004-tag.sh
+++ b/third_party/git/t/t7004-tag.sh
diff --git a/t/t7005-editor.sh b/third_party/git/t/t7005-editor.sh
index 5fcf281dfb..5fcf281dfb 100755
--- a/t/t7005-editor.sh
+++ b/third_party/git/t/t7005-editor.sh
diff --git a/t/t7006-pager.sh b/third_party/git/t/t7006-pager.sh
index 00e09a375c..00e09a375c 100755
--- a/t/t7006-pager.sh
+++ b/third_party/git/t/t7006-pager.sh
diff --git a/t/t7007-show.sh b/third_party/git/t/t7007-show.sh
index 42d3db6246..42d3db6246 100755
--- a/t/t7007-show.sh
+++ b/third_party/git/t/t7007-show.sh
diff --git a/t/t7008-grep-binary.sh b/third_party/git/t/t7008-grep-binary.sh
index 2d87c49b75..2d87c49b75 100755
--- a/t/t7008-grep-binary.sh
+++ b/third_party/git/t/t7008-grep-binary.sh
diff --git a/t/t7009-filter-branch-null-sha1.sh b/third_party/git/t/t7009-filter-branch-null-sha1.sh
index 9ba9f24ad2..9ba9f24ad2 100755
--- a/t/t7009-filter-branch-null-sha1.sh
+++ b/third_party/git/t/t7009-filter-branch-null-sha1.sh
diff --git a/t/t7010-setup.sh b/third_party/git/t/t7010-setup.sh
index 0335a9a158..0335a9a158 100755
--- a/t/t7010-setup.sh
+++ b/third_party/git/t/t7010-setup.sh
diff --git a/t/t7011-skip-worktree-reading.sh b/third_party/git/t/t7011-skip-worktree-reading.sh
index 37525cae3a..37525cae3a 100755
--- a/t/t7011-skip-worktree-reading.sh
+++ b/third_party/git/t/t7011-skip-worktree-reading.sh
diff --git a/t/t7012-skip-worktree-writing.sh b/third_party/git/t/t7012-skip-worktree-writing.sh
index 9d1abe50ef..9d1abe50ef 100755
--- a/t/t7012-skip-worktree-writing.sh
+++ b/third_party/git/t/t7012-skip-worktree-writing.sh
diff --git a/t/t7030-verify-tag.sh b/third_party/git/t/t7030-verify-tag.sh
index 041e319e79..041e319e79 100755
--- a/t/t7030-verify-tag.sh
+++ b/third_party/git/t/t7030-verify-tag.sh
diff --git a/t/t7060-wtstatus.sh b/third_party/git/t/t7060-wtstatus.sh
index d5218743e9..d5218743e9 100755
--- a/t/t7060-wtstatus.sh
+++ b/third_party/git/t/t7060-wtstatus.sh
diff --git a/t/t7061-wtstatus-ignore.sh b/third_party/git/t/t7061-wtstatus-ignore.sh
index 0c394cf995..0c394cf995 100755
--- a/t/t7061-wtstatus-ignore.sh
+++ b/third_party/git/t/t7061-wtstatus-ignore.sh
diff --git a/t/t7062-wtstatus-ignorecase.sh b/third_party/git/t/t7062-wtstatus-ignorecase.sh
index 73709dbeee..73709dbeee 100755
--- a/t/t7062-wtstatus-ignorecase.sh
+++ b/third_party/git/t/t7062-wtstatus-ignorecase.sh
diff --git a/t/t7063-status-untracked-cache.sh b/third_party/git/t/t7063-status-untracked-cache.sh
index 190ae149cf..190ae149cf 100755
--- a/t/t7063-status-untracked-cache.sh
+++ b/third_party/git/t/t7063-status-untracked-cache.sh
diff --git a/t/t7064-wtstatus-pv2.sh b/third_party/git/t/t7064-wtstatus-pv2.sh
index 537787e598..537787e598 100755
--- a/t/t7064-wtstatus-pv2.sh
+++ b/third_party/git/t/t7064-wtstatus-pv2.sh
diff --git a/t/t7101-reset-empty-subdirs.sh b/third_party/git/t/t7101-reset-empty-subdirs.sh
index 96e163f084..96e163f084 100755
--- a/t/t7101-reset-empty-subdirs.sh
+++ b/third_party/git/t/t7101-reset-empty-subdirs.sh
diff --git a/t/t7102-reset.sh b/third_party/git/t/t7102-reset.sh
index 97be0d968d..97be0d968d 100755
--- a/t/t7102-reset.sh
+++ b/third_party/git/t/t7102-reset.sh
diff --git a/t/t7103-reset-bare.sh b/third_party/git/t/t7103-reset-bare.sh
index afe36a533c..afe36a533c 100755
--- a/t/t7103-reset-bare.sh
+++ b/third_party/git/t/t7103-reset-bare.sh
diff --git a/t/t7104-reset-hard.sh b/third_party/git/t/t7104-reset-hard.sh
index 16faa07813..16faa07813 100755
--- a/t/t7104-reset-hard.sh
+++ b/third_party/git/t/t7104-reset-hard.sh
diff --git a/t/t7105-reset-patch.sh b/third_party/git/t/t7105-reset-patch.sh
index bd10a96727..bd10a96727 100755
--- a/t/t7105-reset-patch.sh
+++ b/third_party/git/t/t7105-reset-patch.sh
diff --git a/t/t7106-reset-unborn-branch.sh b/third_party/git/t/t7106-reset-unborn-branch.sh
index ecb85c3b82..ecb85c3b82 100755
--- a/t/t7106-reset-unborn-branch.sh
+++ b/third_party/git/t/t7106-reset-unborn-branch.sh
diff --git a/t/t7110-reset-merge.sh b/third_party/git/t/t7110-reset-merge.sh
index a82a07a04a..a82a07a04a 100755
--- a/t/t7110-reset-merge.sh
+++ b/third_party/git/t/t7110-reset-merge.sh
diff --git a/t/t7111-reset-table.sh b/third_party/git/t/t7111-reset-table.sh
index ce421ad5ac..ce421ad5ac 100755
--- a/t/t7111-reset-table.sh
+++ b/third_party/git/t/t7111-reset-table.sh
diff --git a/t/t7112-reset-submodule.sh b/third_party/git/t/t7112-reset-submodule.sh
index a1cb9ff858..a1cb9ff858 100755
--- a/t/t7112-reset-submodule.sh
+++ b/third_party/git/t/t7112-reset-submodule.sh
diff --git a/t/t7113-post-index-change-hook.sh b/third_party/git/t/t7113-post-index-change-hook.sh
index f011ad7eec..f011ad7eec 100755
--- a/t/t7113-post-index-change-hook.sh
+++ b/third_party/git/t/t7113-post-index-change-hook.sh
diff --git a/t/t7201-co.sh b/third_party/git/t/t7201-co.sh
index b696bae5f5..b696bae5f5 100755
--- a/t/t7201-co.sh
+++ b/third_party/git/t/t7201-co.sh
diff --git a/t/t7300-clean.sh b/third_party/git/t/t7300-clean.sh
index a2c45d1902..a2c45d1902 100755
--- a/t/t7300-clean.sh
+++ b/third_party/git/t/t7300-clean.sh
diff --git a/t/t7301-clean-interactive.sh b/third_party/git/t/t7301-clean-interactive.sh
index a07e8b86de..a07e8b86de 100755
--- a/t/t7301-clean-interactive.sh
+++ b/third_party/git/t/t7301-clean-interactive.sh
diff --git a/t/t7400-submodule-basic.sh b/third_party/git/t/t7400-submodule-basic.sh
index a208cb26e1..a208cb26e1 100755
--- a/t/t7400-submodule-basic.sh
+++ b/third_party/git/t/t7400-submodule-basic.sh
diff --git a/t/t7401-submodule-summary.sh b/third_party/git/t/t7401-submodule-summary.sh
index 9bc841d085..9bc841d085 100755
--- a/t/t7401-submodule-summary.sh
+++ b/third_party/git/t/t7401-submodule-summary.sh
diff --git a/t/t7402-submodule-rebase.sh b/third_party/git/t/t7402-submodule-rebase.sh
index 8e32f19007..8e32f19007 100755
--- a/t/t7402-submodule-rebase.sh
+++ b/third_party/git/t/t7402-submodule-rebase.sh
diff --git a/t/t7403-submodule-sync.sh b/third_party/git/t/t7403-submodule-sync.sh
index 0726799e74..0726799e74 100755
--- a/t/t7403-submodule-sync.sh
+++ b/third_party/git/t/t7403-submodule-sync.sh
diff --git a/t/t7405-submodule-merge.sh b/third_party/git/t/t7405-submodule-merge.sh
index aa33978ed2..aa33978ed2 100755
--- a/t/t7405-submodule-merge.sh
+++ b/third_party/git/t/t7405-submodule-merge.sh
diff --git a/t/t7406-submodule-update.sh b/third_party/git/t/t7406-submodule-update.sh
index c973278300..c973278300 100755
--- a/t/t7406-submodule-update.sh
+++ b/third_party/git/t/t7406-submodule-update.sh
diff --git a/t/t7407-submodule-foreach.sh b/third_party/git/t/t7407-submodule-foreach.sh
index 6b2aa917e1..6b2aa917e1 100755
--- a/t/t7407-submodule-foreach.sh
+++ b/third_party/git/t/t7407-submodule-foreach.sh
diff --git a/t/t7408-submodule-reference.sh b/third_party/git/t/t7408-submodule-reference.sh
index 34ac28c056..34ac28c056 100755
--- a/t/t7408-submodule-reference.sh
+++ b/third_party/git/t/t7408-submodule-reference.sh
diff --git a/t/t7409-submodule-detached-work-tree.sh b/third_party/git/t/t7409-submodule-detached-work-tree.sh
index fc018e3638..fc018e3638 100755
--- a/t/t7409-submodule-detached-work-tree.sh
+++ b/third_party/git/t/t7409-submodule-detached-work-tree.sh
diff --git a/t/t7410-submodule-checkout-to.sh b/third_party/git/t/t7410-submodule-checkout-to.sh
index f1b492ebc4..f1b492ebc4 100755
--- a/t/t7410-submodule-checkout-to.sh
+++ b/third_party/git/t/t7410-submodule-checkout-to.sh
diff --git a/t/t7411-submodule-config.sh b/third_party/git/t/t7411-submodule-config.sh
index ad28e93880..ad28e93880 100755
--- a/t/t7411-submodule-config.sh
+++ b/third_party/git/t/t7411-submodule-config.sh
diff --git a/t/t7412-submodule-absorbgitdirs.sh b/third_party/git/t/t7412-submodule-absorbgitdirs.sh
index 1cfa150768..1cfa150768 100755
--- a/t/t7412-submodule-absorbgitdirs.sh
+++ b/third_party/git/t/t7412-submodule-absorbgitdirs.sh
diff --git a/t/t7413-submodule-is-active.sh b/third_party/git/t/t7413-submodule-is-active.sh
index c8e7e98331..c8e7e98331 100755
--- a/t/t7413-submodule-is-active.sh
+++ b/third_party/git/t/t7413-submodule-is-active.sh
diff --git a/t/t7414-submodule-mistakes.sh b/third_party/git/t/t7414-submodule-mistakes.sh
index f2e7df59cf..f2e7df59cf 100755
--- a/t/t7414-submodule-mistakes.sh
+++ b/third_party/git/t/t7414-submodule-mistakes.sh
diff --git a/t/t7415-submodule-names.sh b/third_party/git/t/t7415-submodule-names.sh
index 49a37efe9c..49a37efe9c 100755
--- a/t/t7415-submodule-names.sh
+++ b/third_party/git/t/t7415-submodule-names.sh
diff --git a/t/t7416-submodule-dash-url.sh b/third_party/git/t/t7416-submodule-dash-url.sh
index 1cd2c1c1ea..1cd2c1c1ea 100755
--- a/t/t7416-submodule-dash-url.sh
+++ b/third_party/git/t/t7416-submodule-dash-url.sh
diff --git a/t/t7417-submodule-path-url.sh b/third_party/git/t/t7417-submodule-path-url.sh
index 756af8c4d6..756af8c4d6 100755
--- a/t/t7417-submodule-path-url.sh
+++ b/third_party/git/t/t7417-submodule-path-url.sh
diff --git a/t/t7418-submodule-sparse-gitmodules.sh b/third_party/git/t/t7418-submodule-sparse-gitmodules.sh
index 3f7f271883..3f7f271883 100755
--- a/t/t7418-submodule-sparse-gitmodules.sh
+++ b/third_party/git/t/t7418-submodule-sparse-gitmodules.sh
diff --git a/t/t7419-submodule-set-branch.sh b/third_party/git/t/t7419-submodule-set-branch.sh
index c4b370ea85..c4b370ea85 100755
--- a/t/t7419-submodule-set-branch.sh
+++ b/third_party/git/t/t7419-submodule-set-branch.sh
diff --git a/t/t7500-commit-template-squash-signoff.sh b/third_party/git/t/t7500-commit-template-squash-signoff.sh
index 46a5cd4b73..46a5cd4b73 100755
--- a/t/t7500-commit-template-squash-signoff.sh
+++ b/third_party/git/t/t7500-commit-template-squash-signoff.sh
diff --git a/t/t7500/add-comments b/third_party/git/t/t7500/add-comments
index a72e65c891..a72e65c891 100755
--- a/t/t7500/add-comments
+++ b/third_party/git/t/t7500/add-comments
diff --git a/t/t7500/add-content b/third_party/git/t/t7500/add-content
index 2fa3d86a10..2fa3d86a10 100755
--- a/t/t7500/add-content
+++ b/third_party/git/t/t7500/add-content
diff --git a/t/t7500/add-content-and-comment b/third_party/git/t/t7500/add-content-and-comment
index c4dccff13a..c4dccff13a 100755
--- a/t/t7500/add-content-and-comment
+++ b/third_party/git/t/t7500/add-content-and-comment
diff --git a/t/t7500/add-signed-off b/third_party/git/t/t7500/add-signed-off
index e1d856af6d..e1d856af6d 100755
--- a/t/t7500/add-signed-off
+++ b/third_party/git/t/t7500/add-signed-off
diff --git a/t/t7500/add-whitespaced-content b/third_party/git/t/t7500/add-whitespaced-content
index ccf07c61a4..ccf07c61a4 100755
--- a/t/t7500/add-whitespaced-content
+++ b/third_party/git/t/t7500/add-whitespaced-content
diff --git a/t/t7500/edit-content b/third_party/git/t/t7500/edit-content
index 08db9fdd2e..08db9fdd2e 100755
--- a/t/t7500/edit-content
+++ b/third_party/git/t/t7500/edit-content
diff --git a/t/t7501-commit-basic-functionality.sh b/third_party/git/t/t7501-commit-basic-functionality.sh
index f1349af56e..f1349af56e 100755
--- a/t/t7501-commit-basic-functionality.sh
+++ b/third_party/git/t/t7501-commit-basic-functionality.sh
diff --git a/t/t7502-commit-porcelain.sh b/third_party/git/t/t7502-commit-porcelain.sh
index 14c92e4c25..14c92e4c25 100755
--- a/t/t7502-commit-porcelain.sh
+++ b/third_party/git/t/t7502-commit-porcelain.sh
diff --git a/t/t7503-pre-commit-hook.sh b/third_party/git/t/t7503-pre-commit-hook.sh
index 984889b39d..984889b39d 100755
--- a/t/t7503-pre-commit-hook.sh
+++ b/third_party/git/t/t7503-pre-commit-hook.sh
diff --git a/t/t7504-commit-msg-hook.sh b/third_party/git/t/t7504-commit-msg-hook.sh
index 31b9c6a2c1..31b9c6a2c1 100755
--- a/t/t7504-commit-msg-hook.sh
+++ b/third_party/git/t/t7504-commit-msg-hook.sh
diff --git a/t/t7505-prepare-commit-msg-hook.sh b/third_party/git/t/t7505-prepare-commit-msg-hook.sh
index ba8bd1b514..ba8bd1b514 100755
--- a/t/t7505-prepare-commit-msg-hook.sh
+++ b/third_party/git/t/t7505-prepare-commit-msg-hook.sh
diff --git a/t/t7505/expected-rebase-i b/third_party/git/t/t7505/expected-rebase-i
index c514bdbb94..c514bdbb94 100644
--- a/t/t7505/expected-rebase-i
+++ b/third_party/git/t/t7505/expected-rebase-i
diff --git a/t/t7505/expected-rebase-p b/third_party/git/t/t7505/expected-rebase-p
index 93bada596e..93bada596e 100644
--- a/t/t7505/expected-rebase-p
+++ b/third_party/git/t/t7505/expected-rebase-p
diff --git a/t/t7506-status-submodule.sh b/third_party/git/t/t7506-status-submodule.sh
index 08629a6e70..08629a6e70 100755
--- a/t/t7506-status-submodule.sh
+++ b/third_party/git/t/t7506-status-submodule.sh
diff --git a/t/t7507-commit-verbose.sh b/third_party/git/t/t7507-commit-verbose.sh
index ed2653d46f..ed2653d46f 100755
--- a/t/t7507-commit-verbose.sh
+++ b/third_party/git/t/t7507-commit-verbose.sh
diff --git a/t/t7508-status.sh b/third_party/git/t/t7508-status.sh
index 4e676cdce8..4e676cdce8 100755
--- a/t/t7508-status.sh
+++ b/third_party/git/t/t7508-status.sh
diff --git a/t/t7509-commit-authorship.sh b/third_party/git/t/t7509-commit-authorship.sh
index 500ab2fe72..500ab2fe72 100755
--- a/t/t7509-commit-authorship.sh
+++ b/third_party/git/t/t7509-commit-authorship.sh
diff --git a/t/t7510-signed-commit.sh b/third_party/git/t/t7510-signed-commit.sh
index 682b23a068..682b23a068 100755
--- a/t/t7510-signed-commit.sh
+++ b/third_party/git/t/t7510-signed-commit.sh
diff --git a/t/t7511-status-index.sh b/third_party/git/t/t7511-status-index.sh
index b5fdc048a5..b5fdc048a5 100755
--- a/t/t7511-status-index.sh
+++ b/third_party/git/t/t7511-status-index.sh
diff --git a/t/t7512-status-help.sh b/third_party/git/t/t7512-status-help.sh
index e01c285cbf..e01c285cbf 100755
--- a/t/t7512-status-help.sh
+++ b/third_party/git/t/t7512-status-help.sh
diff --git a/t/t7513-interpret-trailers.sh b/third_party/git/t/t7513-interpret-trailers.sh
index f19202b509..f19202b509 100755
--- a/t/t7513-interpret-trailers.sh
+++ b/third_party/git/t/t7513-interpret-trailers.sh
diff --git a/t/t7514-commit-patch.sh b/third_party/git/t/t7514-commit-patch.sh
index 998a2103c7..998a2103c7 100755
--- a/t/t7514-commit-patch.sh
+++ b/third_party/git/t/t7514-commit-patch.sh
diff --git a/t/t7515-status-symlinks.sh b/third_party/git/t/t7515-status-symlinks.sh
index 9f989be01b..9f989be01b 100755
--- a/t/t7515-status-symlinks.sh
+++ b/third_party/git/t/t7515-status-symlinks.sh
diff --git a/t/t7516-commit-races.sh b/third_party/git/t/t7516-commit-races.sh
index f2ce14e907..f2ce14e907 100755
--- a/t/t7516-commit-races.sh
+++ b/third_party/git/t/t7516-commit-races.sh
diff --git a/t/t7517-per-repo-email.sh b/third_party/git/t/t7517-per-repo-email.sh
index b2401cec3e..b2401cec3e 100755
--- a/t/t7517-per-repo-email.sh
+++ b/third_party/git/t/t7517-per-repo-email.sh
diff --git a/t/t7518-ident-corner-cases.sh b/third_party/git/t/t7518-ident-corner-cases.sh
index b22f631261..b22f631261 100755
--- a/t/t7518-ident-corner-cases.sh
+++ b/third_party/git/t/t7518-ident-corner-cases.sh
diff --git a/t/t7519-status-fsmonitor.sh b/third_party/git/t/t7519-status-fsmonitor.sh
index 81a375fa0f..81a375fa0f 100755
--- a/t/t7519-status-fsmonitor.sh
+++ b/third_party/git/t/t7519-status-fsmonitor.sh
diff --git a/t/t7519/fsmonitor-all b/third_party/git/t/t7519/fsmonitor-all
index 691bc94dc2..691bc94dc2 100755
--- a/t/t7519/fsmonitor-all
+++ b/third_party/git/t/t7519/fsmonitor-all
diff --git a/t/t7519/fsmonitor-none b/third_party/git/t/t7519/fsmonitor-none
index ed9cf5a6a9..ed9cf5a6a9 100755
--- a/t/t7519/fsmonitor-none
+++ b/third_party/git/t/t7519/fsmonitor-none
diff --git a/t/t7519/fsmonitor-watchman b/third_party/git/t/t7519/fsmonitor-watchman
index 5514edcf68..5514edcf68 100755
--- a/t/t7519/fsmonitor-watchman
+++ b/third_party/git/t/t7519/fsmonitor-watchman
diff --git a/t/t7520-ignored-hook-warning.sh b/third_party/git/t/t7520-ignored-hook-warning.sh
index 634fb7f23a..634fb7f23a 100755
--- a/t/t7520-ignored-hook-warning.sh
+++ b/third_party/git/t/t7520-ignored-hook-warning.sh
diff --git a/t/t7521-ignored-mode.sh b/third_party/git/t/t7521-ignored-mode.sh
index 91790943c3..91790943c3 100755
--- a/t/t7521-ignored-mode.sh
+++ b/third_party/git/t/t7521-ignored-mode.sh
diff --git a/t/t7525-status-rename.sh b/third_party/git/t/t7525-status-rename.sh
index a62736dce0..a62736dce0 100755
--- a/t/t7525-status-rename.sh
+++ b/third_party/git/t/t7525-status-rename.sh
diff --git a/t/t7600-merge.sh b/third_party/git/t/t7600-merge.sh
index 132608879a..132608879a 100755
--- a/t/t7600-merge.sh
+++ b/third_party/git/t/t7600-merge.sh
diff --git a/t/t7601-merge-pull-config.sh b/third_party/git/t/t7601-merge-pull-config.sh
index c6c44ec570..c6c44ec570 100755
--- a/t/t7601-merge-pull-config.sh
+++ b/third_party/git/t/t7601-merge-pull-config.sh
diff --git a/t/t7602-merge-octopus-many.sh b/third_party/git/t/t7602-merge-octopus-many.sh
index 6abe441ae3..6abe441ae3 100755
--- a/t/t7602-merge-octopus-many.sh
+++ b/third_party/git/t/t7602-merge-octopus-many.sh
diff --git a/t/t7603-merge-reduce-heads.sh b/third_party/git/t/t7603-merge-reduce-heads.sh
index 98948955ae..98948955ae 100755
--- a/t/t7603-merge-reduce-heads.sh
+++ b/third_party/git/t/t7603-merge-reduce-heads.sh
diff --git a/t/t7604-merge-custom-message.sh b/third_party/git/t/t7604-merge-custom-message.sh
index cd4f9607dc..cd4f9607dc 100755
--- a/t/t7604-merge-custom-message.sh
+++ b/third_party/git/t/t7604-merge-custom-message.sh
diff --git a/t/t7605-merge-resolve.sh b/third_party/git/t/t7605-merge-resolve.sh
index 5d56c38546..5d56c38546 100755
--- a/t/t7605-merge-resolve.sh
+++ b/third_party/git/t/t7605-merge-resolve.sh
diff --git a/t/t7606-merge-custom.sh b/third_party/git/t/t7606-merge-custom.sh
index 8e8c4d7246..8e8c4d7246 100755
--- a/t/t7606-merge-custom.sh
+++ b/third_party/git/t/t7606-merge-custom.sh
diff --git a/t/t7607-merge-overwrite.sh b/third_party/git/t/t7607-merge-overwrite.sh
index dd8ab7ede1..dd8ab7ede1 100755
--- a/t/t7607-merge-overwrite.sh
+++ b/third_party/git/t/t7607-merge-overwrite.sh
diff --git a/t/t7608-merge-messages.sh b/third_party/git/t/t7608-merge-messages.sh
index 8e7e0a5865..8e7e0a5865 100755
--- a/t/t7608-merge-messages.sh
+++ b/third_party/git/t/t7608-merge-messages.sh
diff --git a/t/t7609-merge-co-error-msgs.sh b/third_party/git/t/t7609-merge-co-error-msgs.sh
index e90413204e..e90413204e 100755
--- a/t/t7609-merge-co-error-msgs.sh
+++ b/third_party/git/t/t7609-merge-co-error-msgs.sh
diff --git a/t/t7610-mergetool.sh b/third_party/git/t/t7610-mergetool.sh
index ad288ddc69..ad288ddc69 100755
--- a/t/t7610-mergetool.sh
+++ b/third_party/git/t/t7610-mergetool.sh
diff --git a/t/t7611-merge-abort.sh b/third_party/git/t/t7611-merge-abort.sh
index 7c84a518aa..7c84a518aa 100755
--- a/t/t7611-merge-abort.sh
+++ b/third_party/git/t/t7611-merge-abort.sh
diff --git a/t/t7612-merge-verify-signatures.sh b/third_party/git/t/t7612-merge-verify-signatures.sh
index d99218a725..d99218a725 100755
--- a/t/t7612-merge-verify-signatures.sh
+++ b/third_party/git/t/t7612-merge-verify-signatures.sh
diff --git a/t/t7613-merge-submodule.sh b/third_party/git/t/t7613-merge-submodule.sh
index d1e9fcc781..d1e9fcc781 100755
--- a/t/t7613-merge-submodule.sh
+++ b/third_party/git/t/t7613-merge-submodule.sh
diff --git a/t/t7614-merge-signoff.sh b/third_party/git/t/t7614-merge-signoff.sh
index c1b8446f49..c1b8446f49 100755
--- a/t/t7614-merge-signoff.sh
+++ b/third_party/git/t/t7614-merge-signoff.sh
diff --git a/t/t7700-repack.sh b/third_party/git/t/t7700-repack.sh
index 4e855bc21b..4e855bc21b 100755
--- a/t/t7700-repack.sh
+++ b/third_party/git/t/t7700-repack.sh
diff --git a/t/t7701-repack-unpack-unreachable.sh b/third_party/git/t/t7701-repack-unpack-unreachable.sh
index 48261ba080..48261ba080 100755
--- a/t/t7701-repack-unpack-unreachable.sh
+++ b/third_party/git/t/t7701-repack-unpack-unreachable.sh
diff --git a/t/t7702-repack-cyclic-alternate.sh b/third_party/git/t/t7702-repack-cyclic-alternate.sh
index 93b74867ac..93b74867ac 100755
--- a/t/t7702-repack-cyclic-alternate.sh
+++ b/third_party/git/t/t7702-repack-cyclic-alternate.sh
diff --git a/t/t7800-difftool.sh b/third_party/git/t/t7800-difftool.sh
index 6bac9ed180..6bac9ed180 100755
--- a/t/t7800-difftool.sh
+++ b/third_party/git/t/t7800-difftool.sh
diff --git a/t/t7810-grep.sh b/third_party/git/t/t7810-grep.sh
index 7d7b396c23..7d7b396c23 100755
--- a/t/t7810-grep.sh
+++ b/third_party/git/t/t7810-grep.sh
diff --git a/t/t7811-grep-open.sh b/third_party/git/t/t7811-grep-open.sh
index d1ebfd88c7..d1ebfd88c7 100755
--- a/t/t7811-grep-open.sh
+++ b/third_party/git/t/t7811-grep-open.sh
diff --git a/t/t7812-grep-icase-non-ascii.sh b/third_party/git/t/t7812-grep-icase-non-ascii.sh
index 0c685d3598..0c685d3598 100755
--- a/t/t7812-grep-icase-non-ascii.sh
+++ b/third_party/git/t/t7812-grep-icase-non-ascii.sh
diff --git a/t/t7813-grep-icase-iso.sh b/third_party/git/t/t7813-grep-icase-iso.sh
index 701e08a8e5..701e08a8e5 100755
--- a/t/t7813-grep-icase-iso.sh
+++ b/third_party/git/t/t7813-grep-icase-iso.sh
diff --git a/t/t7814-grep-recurse-submodules.sh b/third_party/git/t/t7814-grep-recurse-submodules.sh
index a11366b4ce..a11366b4ce 100755
--- a/t/t7814-grep-recurse-submodules.sh
+++ b/third_party/git/t/t7814-grep-recurse-submodules.sh
diff --git a/t/t8001-annotate.sh b/third_party/git/t/t8001-annotate.sh
index 72176e42c1..72176e42c1 100755
--- a/t/t8001-annotate.sh
+++ b/third_party/git/t/t8001-annotate.sh
diff --git a/t/t8002-blame.sh b/third_party/git/t/t8002-blame.sh
index eea048e52c..eea048e52c 100755
--- a/t/t8002-blame.sh
+++ b/third_party/git/t/t8002-blame.sh
diff --git a/t/t8003-blame-corner-cases.sh b/third_party/git/t/t8003-blame-corner-cases.sh
index 1c5fb1d1f8..1c5fb1d1f8 100755
--- a/t/t8003-blame-corner-cases.sh
+++ b/third_party/git/t/t8003-blame-corner-cases.sh
diff --git a/t/t8004-blame-with-conflicts.sh b/third_party/git/t/t8004-blame-with-conflicts.sh
index 9c353ab222..9c353ab222 100755
--- a/t/t8004-blame-with-conflicts.sh
+++ b/third_party/git/t/t8004-blame-with-conflicts.sh
diff --git a/t/t8005-blame-i18n.sh b/third_party/git/t/t8005-blame-i18n.sh
index 75da219ed1..75da219ed1 100755
--- a/t/t8005-blame-i18n.sh
+++ b/third_party/git/t/t8005-blame-i18n.sh
diff --git a/t/t8005/euc-japan.txt b/third_party/git/t/t8005/euc-japan.txt
index 288f040c99..288f040c99 100644
--- a/t/t8005/euc-japan.txt
+++ b/third_party/git/t/t8005/euc-japan.txt
diff --git a/t/t8005/sjis.txt b/third_party/git/t/t8005/sjis.txt
index bbdefeaced..bbdefeaced 100644
--- a/t/t8005/sjis.txt
+++ b/third_party/git/t/t8005/sjis.txt
diff --git a/t/t8005/utf8.txt b/third_party/git/t/t8005/utf8.txt
index 4d00dbea76..4d00dbea76 100644
--- a/t/t8005/utf8.txt
+++ b/third_party/git/t/t8005/utf8.txt
diff --git a/t/t8006-blame-textconv.sh b/third_party/git/t/t8006-blame-textconv.sh
index 7683515155..7683515155 100755
--- a/t/t8006-blame-textconv.sh
+++ b/third_party/git/t/t8006-blame-textconv.sh
diff --git a/t/t8007-cat-file-textconv.sh b/third_party/git/t/t8007-cat-file-textconv.sh
index eacd49ade6..eacd49ade6 100755
--- a/t/t8007-cat-file-textconv.sh
+++ b/third_party/git/t/t8007-cat-file-textconv.sh
diff --git a/t/t8008-blame-formats.sh b/third_party/git/t/t8008-blame-formats.sh
index ae4b579d24..ae4b579d24 100755
--- a/t/t8008-blame-formats.sh
+++ b/third_party/git/t/t8008-blame-formats.sh
diff --git a/t/t8009-blame-vs-topicbranches.sh b/third_party/git/t/t8009-blame-vs-topicbranches.sh
index 72596e38b2..72596e38b2 100755
--- a/t/t8009-blame-vs-topicbranches.sh
+++ b/third_party/git/t/t8009-blame-vs-topicbranches.sh
diff --git a/t/t8010-cat-file-filters.sh b/third_party/git/t/t8010-cat-file-filters.sh
index 31de4b64dc..31de4b64dc 100755
--- a/t/t8010-cat-file-filters.sh
+++ b/third_party/git/t/t8010-cat-file-filters.sh
diff --git a/t/t8011-blame-split-file.sh b/third_party/git/t/t8011-blame-split-file.sh
index 831125047b..831125047b 100755
--- a/t/t8011-blame-split-file.sh
+++ b/third_party/git/t/t8011-blame-split-file.sh
diff --git a/t/t8012-blame-colors.sh b/third_party/git/t/t8012-blame-colors.sh
index ed38f74de9..ed38f74de9 100755
--- a/t/t8012-blame-colors.sh
+++ b/third_party/git/t/t8012-blame-colors.sh
diff --git a/t/t8013-blame-ignore-revs.sh b/third_party/git/t/t8013-blame-ignore-revs.sh
index 36dc31eb39..36dc31eb39 100755
--- a/t/t8013-blame-ignore-revs.sh
+++ b/third_party/git/t/t8013-blame-ignore-revs.sh
diff --git a/t/t8014-blame-ignore-fuzzy.sh b/third_party/git/t/t8014-blame-ignore-fuzzy.sh
index 6e61882b6f..6e61882b6f 100755
--- a/t/t8014-blame-ignore-fuzzy.sh
+++ b/third_party/git/t/t8014-blame-ignore-fuzzy.sh
diff --git a/t/t9001-send-email.sh b/third_party/git/t/t9001-send-email.sh
index 997f90b42b..997f90b42b 100755
--- a/t/t9001-send-email.sh
+++ b/third_party/git/t/t9001-send-email.sh
diff --git a/t/t9002-column.sh b/third_party/git/t/t9002-column.sh
index 89983527b6..89983527b6 100755
--- a/t/t9002-column.sh
+++ b/third_party/git/t/t9002-column.sh
diff --git a/t/t9003-help-autocorrect.sh b/third_party/git/t/t9003-help-autocorrect.sh
index b1c7919c4a..b1c7919c4a 100755
--- a/t/t9003-help-autocorrect.sh
+++ b/third_party/git/t/t9003-help-autocorrect.sh
diff --git a/t/t9004-example.sh b/third_party/git/t/t9004-example.sh
index 7e8894a4a7..7e8894a4a7 100755
--- a/t/t9004-example.sh
+++ b/third_party/git/t/t9004-example.sh
diff --git a/t/t9010-svn-fe.sh b/third_party/git/t/t9010-svn-fe.sh
index 0b20b07e68..0b20b07e68 100755
--- a/t/t9010-svn-fe.sh
+++ b/third_party/git/t/t9010-svn-fe.sh
diff --git a/t/t9011-svn-da.sh b/third_party/git/t/t9011-svn-da.sh
index ab1ef28fd9..ab1ef28fd9 100755
--- a/t/t9011-svn-da.sh
+++ b/third_party/git/t/t9011-svn-da.sh
diff --git a/t/t9020-remote-svn.sh b/third_party/git/t/t9020-remote-svn.sh
index 6fca08e5e3..6fca08e5e3 100755
--- a/t/t9020-remote-svn.sh
+++ b/third_party/git/t/t9020-remote-svn.sh
diff --git a/t/t9100-git-svn-basic.sh b/third_party/git/t/t9100-git-svn-basic.sh
index 2c309a57d9..2c309a57d9 100755
--- a/t/t9100-git-svn-basic.sh
+++ b/third_party/git/t/t9100-git-svn-basic.sh
diff --git a/t/t9101-git-svn-props.sh b/third_party/git/t/t9101-git-svn-props.sh
index c26c4b0927..c26c4b0927 100755
--- a/t/t9101-git-svn-props.sh
+++ b/third_party/git/t/t9101-git-svn-props.sh
diff --git a/t/t9102-git-svn-deep-rmdir.sh b/third_party/git/t/t9102-git-svn-deep-rmdir.sh
index 66cd51102c..66cd51102c 100755
--- a/t/t9102-git-svn-deep-rmdir.sh
+++ b/third_party/git/t/t9102-git-svn-deep-rmdir.sh
diff --git a/t/t9103-git-svn-tracked-directory-removed.sh b/third_party/git/t/t9103-git-svn-tracked-directory-removed.sh
index b28271345c..b28271345c 100755
--- a/t/t9103-git-svn-tracked-directory-removed.sh
+++ b/third_party/git/t/t9103-git-svn-tracked-directory-removed.sh
diff --git a/t/t9104-git-svn-follow-parent.sh b/third_party/git/t/t9104-git-svn-follow-parent.sh
index 5e0ad19177..5e0ad19177 100755
--- a/t/t9104-git-svn-follow-parent.sh
+++ b/third_party/git/t/t9104-git-svn-follow-parent.sh
diff --git a/t/t9105-git-svn-commit-diff.sh b/third_party/git/t/t9105-git-svn-commit-diff.sh
index 6ed5f74e25..6ed5f74e25 100755
--- a/t/t9105-git-svn-commit-diff.sh
+++ b/third_party/git/t/t9105-git-svn-commit-diff.sh
diff --git a/t/t9106-git-svn-commit-diff-clobber.sh b/third_party/git/t/t9106-git-svn-commit-diff-clobber.sh
index dbe8deac0d..dbe8deac0d 100755
--- a/t/t9106-git-svn-commit-diff-clobber.sh
+++ b/third_party/git/t/t9106-git-svn-commit-diff-clobber.sh
diff --git a/t/t9107-git-svn-migrate.sh b/third_party/git/t/t9107-git-svn-migrate.sh
index ceaa5bad10..ceaa5bad10 100755
--- a/t/t9107-git-svn-migrate.sh
+++ b/third_party/git/t/t9107-git-svn-migrate.sh
diff --git a/t/t9108-git-svn-glob.sh b/third_party/git/t/t9108-git-svn-glob.sh
index 6990f64364..6990f64364 100755
--- a/t/t9108-git-svn-glob.sh
+++ b/third_party/git/t/t9108-git-svn-glob.sh
diff --git a/t/t9109-git-svn-multi-glob.sh b/third_party/git/t/t9109-git-svn-multi-glob.sh
index c1e7542a37..c1e7542a37 100755
--- a/t/t9109-git-svn-multi-glob.sh
+++ b/third_party/git/t/t9109-git-svn-multi-glob.sh
diff --git a/t/t9110-git-svn-use-svm-props.sh b/third_party/git/t/t9110-git-svn-use-svm-props.sh
index ad37d980c9..ad37d980c9 100755
--- a/t/t9110-git-svn-use-svm-props.sh
+++ b/third_party/git/t/t9110-git-svn-use-svm-props.sh
diff --git a/t/t9110/svm.dump b/third_party/git/t/t9110/svm.dump
index cc799c238d..cc799c238d 100644
--- a/t/t9110/svm.dump
+++ b/third_party/git/t/t9110/svm.dump
diff --git a/t/t9111-git-svn-use-svnsync-props.sh b/third_party/git/t/t9111-git-svn-use-svnsync-props.sh
index 6c93073551..6c93073551 100755
--- a/t/t9111-git-svn-use-svnsync-props.sh
+++ b/third_party/git/t/t9111-git-svn-use-svnsync-props.sh
diff --git a/t/t9111/svnsync.dump b/third_party/git/t/t9111/svnsync.dump
index 499fa9594f..499fa9594f 100644
--- a/t/t9111/svnsync.dump
+++ b/third_party/git/t/t9111/svnsync.dump
diff --git a/t/t9112-git-svn-md5less-file.sh b/third_party/git/t/t9112-git-svn-md5less-file.sh
index 9861c719f8..9861c719f8 100755
--- a/t/t9112-git-svn-md5less-file.sh
+++ b/third_party/git/t/t9112-git-svn-md5less-file.sh
diff --git a/t/t9113-git-svn-dcommit-new-file.sh b/third_party/git/t/t9113-git-svn-dcommit-new-file.sh
index e8479cec7a..e8479cec7a 100755
--- a/t/t9113-git-svn-dcommit-new-file.sh
+++ b/third_party/git/t/t9113-git-svn-dcommit-new-file.sh
diff --git a/t/t9114-git-svn-dcommit-merge.sh b/third_party/git/t/t9114-git-svn-dcommit-merge.sh
index 32317d6bca..32317d6bca 100755
--- a/t/t9114-git-svn-dcommit-merge.sh
+++ b/third_party/git/t/t9114-git-svn-dcommit-merge.sh
diff --git a/t/t9115-git-svn-dcommit-funky-renames.sh b/third_party/git/t/t9115-git-svn-dcommit-funky-renames.sh
index 9b44a44bc1..9b44a44bc1 100755
--- a/t/t9115-git-svn-dcommit-funky-renames.sh
+++ b/third_party/git/t/t9115-git-svn-dcommit-funky-renames.sh
diff --git a/t/t9115/funky-names.dump b/third_party/git/t/t9115/funky-names.dump
index 42422f791e..42422f791e 100644
--- a/t/t9115/funky-names.dump
+++ b/third_party/git/t/t9115/funky-names.dump
diff --git a/t/t9116-git-svn-log.sh b/third_party/git/t/t9116-git-svn-log.sh
index 45773ee560..45773ee560 100755
--- a/t/t9116-git-svn-log.sh
+++ b/third_party/git/t/t9116-git-svn-log.sh
diff --git a/t/t9117-git-svn-init-clone.sh b/third_party/git/t/t9117-git-svn-init-clone.sh
index 044f65e916..044f65e916 100755
--- a/t/t9117-git-svn-init-clone.sh
+++ b/third_party/git/t/t9117-git-svn-init-clone.sh
diff --git a/t/t9118-git-svn-funky-branch-names.sh b/third_party/git/t/t9118-git-svn-funky-branch-names.sh
index a159ff96b7..a159ff96b7 100755
--- a/t/t9118-git-svn-funky-branch-names.sh
+++ b/third_party/git/t/t9118-git-svn-funky-branch-names.sh
diff --git a/t/t9119-git-svn-info.sh b/third_party/git/t/t9119-git-svn-info.sh
index 8201c3e808..8201c3e808 100755
--- a/t/t9119-git-svn-info.sh
+++ b/third_party/git/t/t9119-git-svn-info.sh
diff --git a/t/t9120-git-svn-clone-with-percent-escapes.sh b/third_party/git/t/t9120-git-svn-clone-with-percent-escapes.sh
index 40b714df31..40b714df31 100755
--- a/t/t9120-git-svn-clone-with-percent-escapes.sh
+++ b/third_party/git/t/t9120-git-svn-clone-with-percent-escapes.sh
diff --git a/t/t9121-git-svn-fetch-renamed-dir.sh b/third_party/git/t/t9121-git-svn-fetch-renamed-dir.sh
index 000cad37c6..000cad37c6 100755
--- a/t/t9121-git-svn-fetch-renamed-dir.sh
+++ b/third_party/git/t/t9121-git-svn-fetch-renamed-dir.sh
diff --git a/t/t9121/renamed-dir.dump b/third_party/git/t/t9121/renamed-dir.dump
index 5f9127be92..5f9127be92 100644
--- a/t/t9121/renamed-dir.dump
+++ b/third_party/git/t/t9121/renamed-dir.dump
diff --git a/t/t9122-git-svn-author.sh b/third_party/git/t/t9122-git-svn-author.sh
index 9e8fe38e7e..9e8fe38e7e 100755
--- a/t/t9122-git-svn-author.sh
+++ b/third_party/git/t/t9122-git-svn-author.sh
diff --git a/t/t9123-git-svn-rebuild-with-rewriteroot.sh b/third_party/git/t/t9123-git-svn-rebuild-with-rewriteroot.sh
index ead404589e..ead404589e 100755
--- a/t/t9123-git-svn-rebuild-with-rewriteroot.sh
+++ b/third_party/git/t/t9123-git-svn-rebuild-with-rewriteroot.sh
diff --git a/t/t9124-git-svn-dcommit-auto-props.sh b/third_party/git/t/t9124-git-svn-dcommit-auto-props.sh
index 9f7231d5b7..9f7231d5b7 100755
--- a/t/t9124-git-svn-dcommit-auto-props.sh
+++ b/third_party/git/t/t9124-git-svn-dcommit-auto-props.sh
diff --git a/t/t9125-git-svn-multi-glob-branch-names.sh b/third_party/git/t/t9125-git-svn-multi-glob-branch-names.sh
index 0d53fc9014..0d53fc9014 100755
--- a/t/t9125-git-svn-multi-glob-branch-names.sh
+++ b/third_party/git/t/t9125-git-svn-multi-glob-branch-names.sh
diff --git a/t/t9126-git-svn-follow-deleted-readded-directory.sh b/third_party/git/t/t9126-git-svn-follow-deleted-readded-directory.sh
index edec640e97..edec640e97 100755
--- a/t/t9126-git-svn-follow-deleted-readded-directory.sh
+++ b/third_party/git/t/t9126-git-svn-follow-deleted-readded-directory.sh
diff --git a/t/t9126/follow-deleted-readded.dump b/third_party/git/t/t9126/follow-deleted-readded.dump
index 19da5d1ddc..19da5d1ddc 100644
--- a/t/t9126/follow-deleted-readded.dump
+++ b/third_party/git/t/t9126/follow-deleted-readded.dump
diff --git a/t/t9127-git-svn-partial-rebuild.sh b/third_party/git/t/t9127-git-svn-partial-rebuild.sh
index 2e4789d061..2e4789d061 100755
--- a/t/t9127-git-svn-partial-rebuild.sh
+++ b/third_party/git/t/t9127-git-svn-partial-rebuild.sh
diff --git a/t/t9128-git-svn-cmd-branch.sh b/third_party/git/t/t9128-git-svn-cmd-branch.sh
index 4e95f791db..4e95f791db 100755
--- a/t/t9128-git-svn-cmd-branch.sh
+++ b/third_party/git/t/t9128-git-svn-cmd-branch.sh
diff --git a/t/t9129-git-svn-i18n-commitencoding.sh b/third_party/git/t/t9129-git-svn-i18n-commitencoding.sh
index 2c213ae654..2c213ae654 100755
--- a/t/t9129-git-svn-i18n-commitencoding.sh
+++ b/third_party/git/t/t9129-git-svn-i18n-commitencoding.sh
diff --git a/t/t9130-git-svn-authors-file.sh b/third_party/git/t/t9130-git-svn-authors-file.sh
index cb764bcadc..cb764bcadc 100755
--- a/t/t9130-git-svn-authors-file.sh
+++ b/third_party/git/t/t9130-git-svn-authors-file.sh
diff --git a/t/t9131-git-svn-empty-symlink.sh b/third_party/git/t/t9131-git-svn-empty-symlink.sh
index 3bf4255aa3..3bf4255aa3 100755
--- a/t/t9131-git-svn-empty-symlink.sh
+++ b/third_party/git/t/t9131-git-svn-empty-symlink.sh
diff --git a/t/t9132-git-svn-broken-symlink.sh b/third_party/git/t/t9132-git-svn-broken-symlink.sh
index aeceffaf7b..aeceffaf7b 100755
--- a/t/t9132-git-svn-broken-symlink.sh
+++ b/third_party/git/t/t9132-git-svn-broken-symlink.sh
diff --git a/t/t9133-git-svn-nested-git-repo.sh b/third_party/git/t/t9133-git-svn-nested-git-repo.sh
index f894860867..f894860867 100755
--- a/t/t9133-git-svn-nested-git-repo.sh
+++ b/third_party/git/t/t9133-git-svn-nested-git-repo.sh
diff --git a/t/t9134-git-svn-ignore-paths.sh b/third_party/git/t/t9134-git-svn-ignore-paths.sh
index fff49c4100..fff49c4100 100755
--- a/t/t9134-git-svn-ignore-paths.sh
+++ b/third_party/git/t/t9134-git-svn-ignore-paths.sh
diff --git a/t/t9135-git-svn-moved-branch-empty-file.sh b/third_party/git/t/t9135-git-svn-moved-branch-empty-file.sh
index 2f80b216fe..2f80b216fe 100755
--- a/t/t9135-git-svn-moved-branch-empty-file.sh
+++ b/third_party/git/t/t9135-git-svn-moved-branch-empty-file.sh
diff --git a/t/t9135/svn.dump b/third_party/git/t/t9135/svn.dump
index b51c0ccceb..b51c0ccceb 100644
--- a/t/t9135/svn.dump
+++ b/third_party/git/t/t9135/svn.dump
diff --git a/t/t9136-git-svn-recreated-branch-empty-file.sh b/third_party/git/t/t9136-git-svn-recreated-branch-empty-file.sh
index 733d16e0b2..733d16e0b2 100755
--- a/t/t9136-git-svn-recreated-branch-empty-file.sh
+++ b/third_party/git/t/t9136-git-svn-recreated-branch-empty-file.sh
diff --git a/t/t9136/svn.dump b/third_party/git/t/t9136/svn.dump
index 6b1ce0b2e8..6b1ce0b2e8 100644
--- a/t/t9136/svn.dump
+++ b/third_party/git/t/t9136/svn.dump
diff --git a/t/t9137-git-svn-dcommit-clobber-series.sh b/third_party/git/t/t9137-git-svn-dcommit-clobber-series.sh
index 067b15bad2..067b15bad2 100755
--- a/t/t9137-git-svn-dcommit-clobber-series.sh
+++ b/third_party/git/t/t9137-git-svn-dcommit-clobber-series.sh
diff --git a/t/t9138-git-svn-authors-prog.sh b/third_party/git/t/t9138-git-svn-authors-prog.sh
index 027b416720..027b416720 100755
--- a/t/t9138-git-svn-authors-prog.sh
+++ b/third_party/git/t/t9138-git-svn-authors-prog.sh
diff --git a/t/t9139-git-svn-non-utf8-commitencoding.sh b/third_party/git/t/t9139-git-svn-non-utf8-commitencoding.sh
index 22d80b0be2..22d80b0be2 100755
--- a/t/t9139-git-svn-non-utf8-commitencoding.sh
+++ b/third_party/git/t/t9139-git-svn-non-utf8-commitencoding.sh
diff --git a/t/t9140-git-svn-reset.sh b/third_party/git/t/t9140-git-svn-reset.sh
index e855904629..e855904629 100755
--- a/t/t9140-git-svn-reset.sh
+++ b/third_party/git/t/t9140-git-svn-reset.sh
diff --git a/t/t9141-git-svn-multiple-branches.sh b/third_party/git/t/t9141-git-svn-multiple-branches.sh
index 8e7f7d68b7..8e7f7d68b7 100755
--- a/t/t9141-git-svn-multiple-branches.sh
+++ b/third_party/git/t/t9141-git-svn-multiple-branches.sh
diff --git a/t/t9142-git-svn-shallow-clone.sh b/third_party/git/t/t9142-git-svn-shallow-clone.sh
index a30730502d..a30730502d 100755
--- a/t/t9142-git-svn-shallow-clone.sh
+++ b/third_party/git/t/t9142-git-svn-shallow-clone.sh
diff --git a/t/t9143-git-svn-gc.sh b/third_party/git/t/t9143-git-svn-gc.sh
index 4594e1ae2f..4594e1ae2f 100755
--- a/t/t9143-git-svn-gc.sh
+++ b/third_party/git/t/t9143-git-svn-gc.sh
diff --git a/t/t9144-git-svn-old-rev_map.sh b/third_party/git/t/t9144-git-svn-old-rev_map.sh
index 7600a35cd4..7600a35cd4 100755
--- a/t/t9144-git-svn-old-rev_map.sh
+++ b/third_party/git/t/t9144-git-svn-old-rev_map.sh
diff --git a/t/t9145-git-svn-master-branch.sh b/third_party/git/t/t9145-git-svn-master-branch.sh
index 3bbf341f6a..3bbf341f6a 100755
--- a/t/t9145-git-svn-master-branch.sh
+++ b/third_party/git/t/t9145-git-svn-master-branch.sh
diff --git a/t/t9146-git-svn-empty-dirs.sh b/third_party/git/t/t9146-git-svn-empty-dirs.sh
index 5f91c0d68b..5f91c0d68b 100755
--- a/t/t9146-git-svn-empty-dirs.sh
+++ b/third_party/git/t/t9146-git-svn-empty-dirs.sh
diff --git a/t/t9147-git-svn-include-paths.sh b/third_party/git/t/t9147-git-svn-include-paths.sh
index d292bf9f55..d292bf9f55 100755
--- a/t/t9147-git-svn-include-paths.sh
+++ b/third_party/git/t/t9147-git-svn-include-paths.sh
diff --git a/t/t9148-git-svn-propset.sh b/third_party/git/t/t9148-git-svn-propset.sh
index 102639090c..102639090c 100755
--- a/t/t9148-git-svn-propset.sh
+++ b/third_party/git/t/t9148-git-svn-propset.sh
diff --git a/t/t9150-svk-mergetickets.sh b/third_party/git/t/t9150-svk-mergetickets.sh
index 1bb676bede..1bb676bede 100755
--- a/t/t9150-svk-mergetickets.sh
+++ b/third_party/git/t/t9150-svk-mergetickets.sh
diff --git a/t/t9150/make-svk-dump b/third_party/git/t/t9150/make-svk-dump
index 2242f14ebe..2242f14ebe 100755
--- a/t/t9150/make-svk-dump
+++ b/third_party/git/t/t9150/make-svk-dump
diff --git a/t/t9150/svk-merge.dump b/third_party/git/t/t9150/svk-merge.dump
index 42f70dbec7..42f70dbec7 100644
--- a/t/t9150/svk-merge.dump
+++ b/third_party/git/t/t9150/svk-merge.dump
diff --git a/t/t9151-svn-mergeinfo.sh b/third_party/git/t/t9151-svn-mergeinfo.sh
index 4f6c06ecb2..4f6c06ecb2 100755
--- a/t/t9151-svn-mergeinfo.sh
+++ b/third_party/git/t/t9151-svn-mergeinfo.sh
diff --git a/t/t9151/.gitignore b/third_party/git/t/t9151/.gitignore
index 587c37dba3..587c37dba3 100644
--- a/t/t9151/.gitignore
+++ b/third_party/git/t/t9151/.gitignore
diff --git a/t/t9151/make-svnmerge-dump b/third_party/git/t/t9151/make-svnmerge-dump
index e1e138cb1a..e1e138cb1a 100755
--- a/t/t9151/make-svnmerge-dump
+++ b/third_party/git/t/t9151/make-svnmerge-dump
diff --git a/t/t9151/svn-mergeinfo.dump b/third_party/git/t/t9151/svn-mergeinfo.dump
index 47cafcf528..47cafcf528 100644
--- a/t/t9151/svn-mergeinfo.dump
+++ b/third_party/git/t/t9151/svn-mergeinfo.dump
diff --git a/t/t9152-svn-empty-dirs-after-gc.sh b/third_party/git/t/t9152-svn-empty-dirs-after-gc.sh
index 89f285d082..89f285d082 100755
--- a/t/t9152-svn-empty-dirs-after-gc.sh
+++ b/third_party/git/t/t9152-svn-empty-dirs-after-gc.sh
diff --git a/t/t9153-git-svn-rewrite-uuid.sh b/third_party/git/t/t9153-git-svn-rewrite-uuid.sh
index 8cb2b5c69c..8cb2b5c69c 100755
--- a/t/t9153-git-svn-rewrite-uuid.sh
+++ b/third_party/git/t/t9153-git-svn-rewrite-uuid.sh
diff --git a/t/t9153/svn.dump b/third_party/git/t/t9153/svn.dump
index 0ddfe7025d..0ddfe7025d 100644
--- a/t/t9153/svn.dump
+++ b/third_party/git/t/t9153/svn.dump
diff --git a/t/t9154-git-svn-fancy-glob.sh b/third_party/git/t/t9154-git-svn-fancy-glob.sh
index a0150f057d..a0150f057d 100755
--- a/t/t9154-git-svn-fancy-glob.sh
+++ b/third_party/git/t/t9154-git-svn-fancy-glob.sh
diff --git a/t/t9154/svn.dump b/third_party/git/t/t9154/svn.dump
index 3dfabb67db..3dfabb67db 100644
--- a/t/t9154/svn.dump
+++ b/third_party/git/t/t9154/svn.dump
diff --git a/t/t9155-git-svn-fetch-deleted-tag.sh b/third_party/git/t/t9155-git-svn-fetch-deleted-tag.sh
index 184336f346..184336f346 100755
--- a/t/t9155-git-svn-fetch-deleted-tag.sh
+++ b/third_party/git/t/t9155-git-svn-fetch-deleted-tag.sh
diff --git a/t/t9156-git-svn-fetch-deleted-tag-2.sh b/third_party/git/t/t9156-git-svn-fetch-deleted-tag-2.sh
index 7a6e33ba3c..7a6e33ba3c 100755
--- a/t/t9156-git-svn-fetch-deleted-tag-2.sh
+++ b/third_party/git/t/t9156-git-svn-fetch-deleted-tag-2.sh
diff --git a/t/t9157-git-svn-fetch-merge.sh b/third_party/git/t/t9157-git-svn-fetch-merge.sh
index 991d2aa1be..991d2aa1be 100755
--- a/t/t9157-git-svn-fetch-merge.sh
+++ b/third_party/git/t/t9157-git-svn-fetch-merge.sh
diff --git a/t/t9158-git-svn-mergeinfo.sh b/third_party/git/t/t9158-git-svn-mergeinfo.sh
index a875b45102..a875b45102 100755
--- a/t/t9158-git-svn-mergeinfo.sh
+++ b/third_party/git/t/t9158-git-svn-mergeinfo.sh
diff --git a/t/t9159-git-svn-no-parent-mergeinfo.sh b/third_party/git/t/t9159-git-svn-no-parent-mergeinfo.sh
index 69e4815781..69e4815781 100755
--- a/t/t9159-git-svn-no-parent-mergeinfo.sh
+++ b/third_party/git/t/t9159-git-svn-no-parent-mergeinfo.sh
diff --git a/t/t9160-git-svn-preserve-empty-dirs.sh b/third_party/git/t/t9160-git-svn-preserve-empty-dirs.sh
index 0ede3cfedb..0ede3cfedb 100755
--- a/t/t9160-git-svn-preserve-empty-dirs.sh
+++ b/third_party/git/t/t9160-git-svn-preserve-empty-dirs.sh
diff --git a/t/t9161-git-svn-mergeinfo-push.sh b/third_party/git/t/t9161-git-svn-mergeinfo-push.sh
index f113acaa6c..f113acaa6c 100755
--- a/t/t9161-git-svn-mergeinfo-push.sh
+++ b/third_party/git/t/t9161-git-svn-mergeinfo-push.sh
diff --git a/t/t9161/branches.dump b/third_party/git/t/t9161/branches.dump
index e61c3e7236..e61c3e7236 100644
--- a/t/t9161/branches.dump
+++ b/third_party/git/t/t9161/branches.dump
diff --git a/t/t9162-git-svn-dcommit-interactive.sh b/third_party/git/t/t9162-git-svn-dcommit-interactive.sh
index e38d9fa37b..e38d9fa37b 100755
--- a/t/t9162-git-svn-dcommit-interactive.sh
+++ b/third_party/git/t/t9162-git-svn-dcommit-interactive.sh
diff --git a/t/t9163-git-svn-reset-clears-caches.sh b/third_party/git/t/t9163-git-svn-reset-clears-caches.sh
index d6245cee08..d6245cee08 100755
--- a/t/t9163-git-svn-reset-clears-caches.sh
+++ b/third_party/git/t/t9163-git-svn-reset-clears-caches.sh
diff --git a/t/t9164-git-svn-dcommit-concurrent.sh b/third_party/git/t/t9164-git-svn-dcommit-concurrent.sh
index 90346ff4e9..90346ff4e9 100755
--- a/t/t9164-git-svn-dcommit-concurrent.sh
+++ b/third_party/git/t/t9164-git-svn-dcommit-concurrent.sh
diff --git a/t/t9165-git-svn-fetch-merge-branch-of-branch.sh b/third_party/git/t/t9165-git-svn-fetch-merge-branch-of-branch.sh
index a4813c2b09..a4813c2b09 100755
--- a/t/t9165-git-svn-fetch-merge-branch-of-branch.sh
+++ b/third_party/git/t/t9165-git-svn-fetch-merge-branch-of-branch.sh
diff --git a/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh b/third_party/git/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh
index 52f2e46a5b..52f2e46a5b 100755
--- a/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh
+++ b/third_party/git/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh
diff --git a/t/t9167-git-svn-cmd-branch-subproject.sh b/third_party/git/t/t9167-git-svn-cmd-branch-subproject.sh
index ba35fc06fc..ba35fc06fc 100755
--- a/t/t9167-git-svn-cmd-branch-subproject.sh
+++ b/third_party/git/t/t9167-git-svn-cmd-branch-subproject.sh
diff --git a/t/t9168-git-svn-partially-globbed-names.sh b/third_party/git/t/t9168-git-svn-partially-globbed-names.sh
index bdf6e84999..bdf6e84999 100755
--- a/t/t9168-git-svn-partially-globbed-names.sh
+++ b/third_party/git/t/t9168-git-svn-partially-globbed-names.sh
diff --git a/t/t9169-git-svn-dcommit-crlf.sh b/third_party/git/t/t9169-git-svn-dcommit-crlf.sh
index 54b1f61a2a..54b1f61a2a 100755
--- a/t/t9169-git-svn-dcommit-crlf.sh
+++ b/third_party/git/t/t9169-git-svn-dcommit-crlf.sh
diff --git a/t/t9200-git-cvsexportcommit.sh b/third_party/git/t/t9200-git-cvsexportcommit.sh
index c5946cb0b8..c5946cb0b8 100755
--- a/t/t9200-git-cvsexportcommit.sh
+++ b/third_party/git/t/t9200-git-cvsexportcommit.sh
diff --git a/t/t9300-fast-import.sh b/third_party/git/t/t9300-fast-import.sh
index 141b7fa35e..141b7fa35e 100755
--- a/t/t9300-fast-import.sh
+++ b/third_party/git/t/t9300-fast-import.sh
diff --git a/t/t9301-fast-import-notes.sh b/third_party/git/t/t9301-fast-import-notes.sh
index dadc70b7d5..dadc70b7d5 100755
--- a/t/t9301-fast-import-notes.sh
+++ b/third_party/git/t/t9301-fast-import-notes.sh
diff --git a/t/t9302-fast-import-unpack-limit.sh b/third_party/git/t/t9302-fast-import-unpack-limit.sh
index bb1c39cfcc..bb1c39cfcc 100755
--- a/t/t9302-fast-import-unpack-limit.sh
+++ b/third_party/git/t/t9302-fast-import-unpack-limit.sh
diff --git a/t/t9303-fast-import-compression.sh b/third_party/git/t/t9303-fast-import-compression.sh
index 5045f02a53..5045f02a53 100755
--- a/t/t9303-fast-import-compression.sh
+++ b/third_party/git/t/t9303-fast-import-compression.sh
diff --git a/t/t9350-fast-export.sh b/third_party/git/t/t9350-fast-export.sh
index b4004e05c2..b4004e05c2 100755
--- a/t/t9350-fast-export.sh
+++ b/third_party/git/t/t9350-fast-export.sh
diff --git a/t/t9350/broken-iso-8859-7-commit-message.txt b/third_party/git/t/t9350/broken-iso-8859-7-commit-message.txt
index d06ad75b44..d06ad75b44 100644
--- a/t/t9350/broken-iso-8859-7-commit-message.txt
+++ b/third_party/git/t/t9350/broken-iso-8859-7-commit-message.txt
diff --git a/t/t9350/simple-iso-8859-7-commit-message.txt b/third_party/git/t/t9350/simple-iso-8859-7-commit-message.txt
index 8b3f0c3dba..8b3f0c3dba 100644
--- a/t/t9350/simple-iso-8859-7-commit-message.txt
+++ b/third_party/git/t/t9350/simple-iso-8859-7-commit-message.txt
diff --git a/t/t9351-fast-export-anonymize.sh b/third_party/git/t/t9351-fast-export-anonymize.sh
index 897dc50907..897dc50907 100755
--- a/t/t9351-fast-export-anonymize.sh
+++ b/third_party/git/t/t9351-fast-export-anonymize.sh
diff --git a/t/t9400-git-cvsserver-server.sh b/third_party/git/t/t9400-git-cvsserver-server.sh
index a5e5dca753..a5e5dca753 100755
--- a/t/t9400-git-cvsserver-server.sh
+++ b/third_party/git/t/t9400-git-cvsserver-server.sh
diff --git a/t/t9401-git-cvsserver-crlf.sh b/third_party/git/t/t9401-git-cvsserver-crlf.sh
index 84787eee9a..84787eee9a 100755
--- a/t/t9401-git-cvsserver-crlf.sh
+++ b/third_party/git/t/t9401-git-cvsserver-crlf.sh
diff --git a/t/t9402-git-cvsserver-refs.sh b/third_party/git/t/t9402-git-cvsserver-refs.sh
index cf31ace667..cf31ace667 100755
--- a/t/t9402-git-cvsserver-refs.sh
+++ b/third_party/git/t/t9402-git-cvsserver-refs.sh
diff --git a/t/t9500-gitweb-standalone-no-errors.sh b/third_party/git/t/t9500-gitweb-standalone-no-errors.sh
index cc8d463e01..cc8d463e01 100755
--- a/t/t9500-gitweb-standalone-no-errors.sh
+++ b/third_party/git/t/t9500-gitweb-standalone-no-errors.sh
diff --git a/t/t9501-gitweb-standalone-http-status.sh b/third_party/git/t/t9501-gitweb-standalone-http-status.sh
index 2a0ffed870..2a0ffed870 100755
--- a/t/t9501-gitweb-standalone-http-status.sh
+++ b/third_party/git/t/t9501-gitweb-standalone-http-status.sh
diff --git a/t/t9502-gitweb-standalone-parse-output.sh b/third_party/git/t/t9502-gitweb-standalone-parse-output.sh
index 0796a438bc..0796a438bc 100755
--- a/t/t9502-gitweb-standalone-parse-output.sh
+++ b/third_party/git/t/t9502-gitweb-standalone-parse-output.sh
diff --git a/t/t9600-cvsimport.sh b/third_party/git/t/t9600-cvsimport.sh
index 251fdd66c4..251fdd66c4 100755
--- a/t/t9600-cvsimport.sh
+++ b/third_party/git/t/t9600-cvsimport.sh
diff --git a/t/t9601-cvsimport-vendor-branch.sh b/third_party/git/t/t9601-cvsimport-vendor-branch.sh
index 827d39f5bf..827d39f5bf 100755
--- a/t/t9601-cvsimport-vendor-branch.sh
+++ b/third_party/git/t/t9601-cvsimport-vendor-branch.sh
diff --git a/t/t9601/cvsroot/.gitattributes b/third_party/git/t/t9601/cvsroot/.gitattributes
index 562b12e16e..562b12e16e 100644
--- a/t/t9601/cvsroot/.gitattributes
+++ b/third_party/git/t/t9601/cvsroot/.gitattributes
diff --git a/t/t9601/cvsroot/CVSROOT/.gitignore b/third_party/git/t/t9601/cvsroot/CVSROOT/.gitignore
index 3bb9b34173..3bb9b34173 100644
--- a/t/t9601/cvsroot/CVSROOT/.gitignore
+++ b/third_party/git/t/t9601/cvsroot/CVSROOT/.gitignore
diff --git a/t/t9601/cvsroot/module/added-imported.txt,v b/third_party/git/t/t9601/cvsroot/module/added-imported.txt,v
index 5f83072ea4..5f83072ea4 100644
--- a/t/t9601/cvsroot/module/added-imported.txt,v
+++ b/third_party/git/t/t9601/cvsroot/module/added-imported.txt,v
diff --git a/t/t9601/cvsroot/module/imported-anonymously.txt,v b/third_party/git/t/t9601/cvsroot/module/imported-anonymously.txt,v
index 55e1b0ca5d..55e1b0ca5d 100644
--- a/t/t9601/cvsroot/module/imported-anonymously.txt,v
+++ b/third_party/git/t/t9601/cvsroot/module/imported-anonymously.txt,v
diff --git a/t/t9601/cvsroot/module/imported-modified-imported.txt,v b/third_party/git/t/t9601/cvsroot/module/imported-modified-imported.txt,v
index e5830aeb37..e5830aeb37 100644
--- a/t/t9601/cvsroot/module/imported-modified-imported.txt,v
+++ b/third_party/git/t/t9601/cvsroot/module/imported-modified-imported.txt,v
diff --git a/t/t9601/cvsroot/module/imported-modified.txt,v b/third_party/git/t/t9601/cvsroot/module/imported-modified.txt,v
index bbcfe447b9..bbcfe447b9 100644
--- a/t/t9601/cvsroot/module/imported-modified.txt,v
+++ b/third_party/git/t/t9601/cvsroot/module/imported-modified.txt,v
diff --git a/t/t9601/cvsroot/module/imported-once.txt,v b/third_party/git/t/t9601/cvsroot/module/imported-once.txt,v
index c5dd82b12d..c5dd82b12d 100644
--- a/t/t9601/cvsroot/module/imported-once.txt,v
+++ b/third_party/git/t/t9601/cvsroot/module/imported-once.txt,v
diff --git a/t/t9601/cvsroot/module/imported-twice.txt,v b/third_party/git/t/t9601/cvsroot/module/imported-twice.txt,v
index d1f3f1b344..d1f3f1b344 100644
--- a/t/t9601/cvsroot/module/imported-twice.txt,v
+++ b/third_party/git/t/t9601/cvsroot/module/imported-twice.txt,v
diff --git a/t/t9602-cvsimport-branches-tags.sh b/third_party/git/t/t9602-cvsimport-branches-tags.sh
index e1db323f54..e1db323f54 100755
--- a/t/t9602-cvsimport-branches-tags.sh
+++ b/third_party/git/t/t9602-cvsimport-branches-tags.sh
diff --git a/t/t9602/README b/third_party/git/t/t9602/README
index c231e0f26f..c231e0f26f 100644
--- a/t/t9602/README
+++ b/third_party/git/t/t9602/README
diff --git a/t/t9602/cvsroot/.gitattributes b/third_party/git/t/t9602/cvsroot/.gitattributes
index 562b12e16e..562b12e16e 100644
--- a/t/t9602/cvsroot/.gitattributes
+++ b/third_party/git/t/t9602/cvsroot/.gitattributes
diff --git a/t/t9602/cvsroot/CVSROOT/.gitignore b/third_party/git/t/t9602/cvsroot/CVSROOT/.gitignore
index 3bb9b34173..3bb9b34173 100644
--- a/t/t9602/cvsroot/CVSROOT/.gitignore
+++ b/third_party/git/t/t9602/cvsroot/CVSROOT/.gitignore
diff --git a/t/t9602/cvsroot/module/default,v b/third_party/git/t/t9602/cvsroot/module/default,v
index 3b68382a3b..3b68382a3b 100644
--- a/t/t9602/cvsroot/module/default,v
+++ b/third_party/git/t/t9602/cvsroot/module/default,v
diff --git a/t/t9602/cvsroot/module/sub1/default,v b/third_party/git/t/t9602/cvsroot/module/sub1/default,v
index b7fdccdfdf..b7fdccdfdf 100644
--- a/t/t9602/cvsroot/module/sub1/default,v
+++ b/third_party/git/t/t9602/cvsroot/module/sub1/default,v
diff --git a/t/t9602/cvsroot/module/sub1/subsubA/default,v b/third_party/git/t/t9602/cvsroot/module/sub1/subsubA/default,v
index 472b7b2bd9..472b7b2bd9 100644
--- a/t/t9602/cvsroot/module/sub1/subsubA/default,v
+++ b/third_party/git/t/t9602/cvsroot/module/sub1/subsubA/default,v
diff --git a/t/t9602/cvsroot/module/sub1/subsubB/default,v b/third_party/git/t/t9602/cvsroot/module/sub1/subsubB/default,v
index fe6efa4554..fe6efa4554 100644
--- a/t/t9602/cvsroot/module/sub1/subsubB/default,v
+++ b/third_party/git/t/t9602/cvsroot/module/sub1/subsubB/default,v
diff --git a/t/t9602/cvsroot/module/sub2/Attic/branch_B_MIXED_only,v b/third_party/git/t/t9602/cvsroot/module/sub2/Attic/branch_B_MIXED_only,v
index 34c9789f2f..34c9789f2f 100644
--- a/t/t9602/cvsroot/module/sub2/Attic/branch_B_MIXED_only,v
+++ b/third_party/git/t/t9602/cvsroot/module/sub2/Attic/branch_B_MIXED_only,v
diff --git a/t/t9602/cvsroot/module/sub2/default,v b/third_party/git/t/t9602/cvsroot/module/sub2/default,v
index 018f7f8ece..018f7f8ece 100644
--- a/t/t9602/cvsroot/module/sub2/default,v
+++ b/third_party/git/t/t9602/cvsroot/module/sub2/default,v
diff --git a/t/t9602/cvsroot/module/sub2/subsubA/default,v b/third_party/git/t/t9602/cvsroot/module/sub2/subsubA/default,v
index d13242cb09..d13242cb09 100644
--- a/t/t9602/cvsroot/module/sub2/subsubA/default,v
+++ b/third_party/git/t/t9602/cvsroot/module/sub2/subsubA/default,v
diff --git a/t/t9602/cvsroot/module/sub3/default,v b/third_party/git/t/t9602/cvsroot/module/sub3/default,v
index 88e4567434..88e4567434 100644
--- a/t/t9602/cvsroot/module/sub3/default,v
+++ b/third_party/git/t/t9602/cvsroot/module/sub3/default,v
diff --git a/t/t9603-cvsimport-patchsets.sh b/third_party/git/t/t9603-cvsimport-patchsets.sh
index 3e64b11eac..3e64b11eac 100755
--- a/t/t9603-cvsimport-patchsets.sh
+++ b/third_party/git/t/t9603-cvsimport-patchsets.sh
diff --git a/t/t9603/cvsroot/.gitattributes b/third_party/git/t/t9603/cvsroot/.gitattributes
index 562b12e16e..562b12e16e 100644
--- a/t/t9603/cvsroot/.gitattributes
+++ b/third_party/git/t/t9603/cvsroot/.gitattributes
diff --git a/t/t9603/cvsroot/CVSROOT/.gitignore b/third_party/git/t/t9603/cvsroot/CVSROOT/.gitignore
index 3bb9b34173..3bb9b34173 100644
--- a/t/t9603/cvsroot/CVSROOT/.gitignore
+++ b/third_party/git/t/t9603/cvsroot/CVSROOT/.gitignore
diff --git a/t/t9603/cvsroot/module/a,v b/third_party/git/t/t9603/cvsroot/module/a,v
index ba8fd5af23..ba8fd5af23 100644
--- a/t/t9603/cvsroot/module/a,v
+++ b/third_party/git/t/t9603/cvsroot/module/a,v
diff --git a/t/t9603/cvsroot/module/b,v b/third_party/git/t/t9603/cvsroot/module/b,v
index d26885518a..d26885518a 100644
--- a/t/t9603/cvsroot/module/b,v
+++ b/third_party/git/t/t9603/cvsroot/module/b,v
diff --git a/t/t9604-cvsimport-timestamps.sh b/third_party/git/t/t9604-cvsimport-timestamps.sh
index 2ff4aa932d..2ff4aa932d 100755
--- a/t/t9604-cvsimport-timestamps.sh
+++ b/third_party/git/t/t9604-cvsimport-timestamps.sh
diff --git a/t/t9604/cvsroot/.gitattributes b/third_party/git/t/t9604/cvsroot/.gitattributes
index 562b12e16e..562b12e16e 100644
--- a/t/t9604/cvsroot/.gitattributes
+++ b/third_party/git/t/t9604/cvsroot/.gitattributes
diff --git a/t/t9604/cvsroot/CVSROOT/.gitignore b/third_party/git/t/t9604/cvsroot/CVSROOT/.gitignore
index 3bb9b34173..3bb9b34173 100644
--- a/t/t9604/cvsroot/CVSROOT/.gitignore
+++ b/third_party/git/t/t9604/cvsroot/CVSROOT/.gitignore
diff --git a/t/t9604/cvsroot/module/a,v b/third_party/git/t/t9604/cvsroot/module/a,v
index 80658c3c8d..80658c3c8d 100644
--- a/t/t9604/cvsroot/module/a,v
+++ b/third_party/git/t/t9604/cvsroot/module/a,v
diff --git a/t/t9700-perl-git.sh b/third_party/git/t/t9700-perl-git.sh
index 102c133112..102c133112 100755
--- a/t/t9700-perl-git.sh
+++ b/third_party/git/t/t9700-perl-git.sh
diff --git a/t/t9700/test.pl b/third_party/git/t/t9700/test.pl
index 34cd01366f..34cd01366f 100755
--- a/t/t9700/test.pl
+++ b/third_party/git/t/t9700/test.pl
diff --git a/t/t9800-git-p4-basic.sh b/third_party/git/t/t9800-git-p4-basic.sh
index 5856563068..5856563068 100755
--- a/t/t9800-git-p4-basic.sh
+++ b/third_party/git/t/t9800-git-p4-basic.sh
diff --git a/t/t9801-git-p4-branch.sh b/third_party/git/t/t9801-git-p4-branch.sh
index 67ff2711f5..67ff2711f5 100755
--- a/t/t9801-git-p4-branch.sh
+++ b/third_party/git/t/t9801-git-p4-branch.sh
diff --git a/t/t9802-git-p4-filetype.sh b/third_party/git/t/t9802-git-p4-filetype.sh
index 94edebe272..94edebe272 100755
--- a/t/t9802-git-p4-filetype.sh
+++ b/third_party/git/t/t9802-git-p4-filetype.sh
diff --git a/t/t9803-git-p4-shell-metachars.sh b/third_party/git/t/t9803-git-p4-shell-metachars.sh
index 2913277013..2913277013 100755
--- a/t/t9803-git-p4-shell-metachars.sh
+++ b/third_party/git/t/t9803-git-p4-shell-metachars.sh
diff --git a/t/t9804-git-p4-label.sh b/third_party/git/t/t9804-git-p4-label.sh
index 3236457106..3236457106 100755
--- a/t/t9804-git-p4-label.sh
+++ b/third_party/git/t/t9804-git-p4-label.sh
diff --git a/t/t9805-git-p4-skip-submit-edit.sh b/third_party/git/t/t9805-git-p4-skip-submit-edit.sh
index 90ef647db7..90ef647db7 100755
--- a/t/t9805-git-p4-skip-submit-edit.sh
+++ b/third_party/git/t/t9805-git-p4-skip-submit-edit.sh
diff --git a/t/t9806-git-p4-options.sh b/third_party/git/t/t9806-git-p4-options.sh
index 4e794a01bf..4e794a01bf 100755
--- a/t/t9806-git-p4-options.sh
+++ b/third_party/git/t/t9806-git-p4-options.sh
diff --git a/t/t9807-git-p4-submit.sh b/third_party/git/t/t9807-git-p4-submit.sh
index eaaae414a1..eaaae414a1 100755
--- a/t/t9807-git-p4-submit.sh
+++ b/third_party/git/t/t9807-git-p4-submit.sh
diff --git a/t/t9808-git-p4-chdir.sh b/third_party/git/t/t9808-git-p4-chdir.sh
index 58a9b3b71e..58a9b3b71e 100755
--- a/t/t9808-git-p4-chdir.sh
+++ b/third_party/git/t/t9808-git-p4-chdir.sh
diff --git a/t/t9809-git-p4-client-view.sh b/third_party/git/t/t9809-git-p4-client-view.sh
index 3cff1fce1b..3cff1fce1b 100755
--- a/t/t9809-git-p4-client-view.sh
+++ b/third_party/git/t/t9809-git-p4-client-view.sh
diff --git a/t/t9810-git-p4-rcs.sh b/third_party/git/t/t9810-git-p4-rcs.sh
index 57b533dc6f..57b533dc6f 100755
--- a/t/t9810-git-p4-rcs.sh
+++ b/third_party/git/t/t9810-git-p4-rcs.sh
diff --git a/t/t9811-git-p4-label-import.sh b/third_party/git/t/t9811-git-p4-label-import.sh
index c1446f26ab..c1446f26ab 100755
--- a/t/t9811-git-p4-label-import.sh
+++ b/third_party/git/t/t9811-git-p4-label-import.sh
diff --git a/t/t9812-git-p4-wildcards.sh b/third_party/git/t/t9812-git-p4-wildcards.sh
index 254a7c2446..254a7c2446 100755
--- a/t/t9812-git-p4-wildcards.sh
+++ b/third_party/git/t/t9812-git-p4-wildcards.sh
diff --git a/t/t9813-git-p4-preserve-users.sh b/third_party/git/t/t9813-git-p4-preserve-users.sh
index fd018c87a8..fd018c87a8 100755
--- a/t/t9813-git-p4-preserve-users.sh
+++ b/third_party/git/t/t9813-git-p4-preserve-users.sh
diff --git a/t/t9814-git-p4-rename.sh b/third_party/git/t/t9814-git-p4-rename.sh
index 468767cbf4..468767cbf4 100755
--- a/t/t9814-git-p4-rename.sh
+++ b/third_party/git/t/t9814-git-p4-rename.sh
diff --git a/t/t9815-git-p4-submit-fail.sh b/third_party/git/t/t9815-git-p4-submit-fail.sh
index 9779dc0d11..9779dc0d11 100755
--- a/t/t9815-git-p4-submit-fail.sh
+++ b/third_party/git/t/t9815-git-p4-submit-fail.sh
diff --git a/t/t9816-git-p4-locked.sh b/third_party/git/t/t9816-git-p4-locked.sh
index 932841003c..932841003c 100755
--- a/t/t9816-git-p4-locked.sh
+++ b/third_party/git/t/t9816-git-p4-locked.sh
diff --git a/t/t9817-git-p4-exclude.sh b/third_party/git/t/t9817-git-p4-exclude.sh
index ec3d937c6a..ec3d937c6a 100755
--- a/t/t9817-git-p4-exclude.sh
+++ b/third_party/git/t/t9817-git-p4-exclude.sh
diff --git a/t/t9818-git-p4-block.sh b/third_party/git/t/t9818-git-p4-block.sh
index 0db7ab9918..0db7ab9918 100755
--- a/t/t9818-git-p4-block.sh
+++ b/third_party/git/t/t9818-git-p4-block.sh
diff --git a/t/t9819-git-p4-case-folding.sh b/third_party/git/t/t9819-git-p4-case-folding.sh
index 600ce1e0b0..600ce1e0b0 100755
--- a/t/t9819-git-p4-case-folding.sh
+++ b/third_party/git/t/t9819-git-p4-case-folding.sh
diff --git a/t/t9820-git-p4-editor-handling.sh b/third_party/git/t/t9820-git-p4-editor-handling.sh
index fa1bba1dd9..fa1bba1dd9 100755
--- a/t/t9820-git-p4-editor-handling.sh
+++ b/third_party/git/t/t9820-git-p4-editor-handling.sh
diff --git a/t/t9821-git-p4-path-variations.sh b/third_party/git/t/t9821-git-p4-path-variations.sh
index ef80f1690b..ef80f1690b 100755
--- a/t/t9821-git-p4-path-variations.sh
+++ b/third_party/git/t/t9821-git-p4-path-variations.sh
diff --git a/t/t9822-git-p4-path-encoding.sh b/third_party/git/t/t9822-git-p4-path-encoding.sh
index 572d395498..572d395498 100755
--- a/t/t9822-git-p4-path-encoding.sh
+++ b/third_party/git/t/t9822-git-p4-path-encoding.sh
diff --git a/t/t9823-git-p4-mock-lfs.sh b/third_party/git/t/t9823-git-p4-mock-lfs.sh
index 88b76dc4d6..88b76dc4d6 100755
--- a/t/t9823-git-p4-mock-lfs.sh
+++ b/third_party/git/t/t9823-git-p4-mock-lfs.sh
diff --git a/t/t9824-git-p4-git-lfs.sh b/third_party/git/t/t9824-git-p4-git-lfs.sh
index a28dbbdd56..a28dbbdd56 100755
--- a/t/t9824-git-p4-git-lfs.sh
+++ b/third_party/git/t/t9824-git-p4-git-lfs.sh
diff --git a/t/t9825-git-p4-handle-utf16-without-bom.sh b/third_party/git/t/t9825-git-p4-handle-utf16-without-bom.sh
index f049ff8229..f049ff8229 100755
--- a/t/t9825-git-p4-handle-utf16-without-bom.sh
+++ b/third_party/git/t/t9825-git-p4-handle-utf16-without-bom.sh
diff --git a/t/t9826-git-p4-keep-empty-commits.sh b/third_party/git/t/t9826-git-p4-keep-empty-commits.sh
index fd64afe064..fd64afe064 100755
--- a/t/t9826-git-p4-keep-empty-commits.sh
+++ b/third_party/git/t/t9826-git-p4-keep-empty-commits.sh
diff --git a/t/t9827-git-p4-change-filetype.sh b/third_party/git/t/t9827-git-p4-change-filetype.sh
index d3670bd7a2..d3670bd7a2 100755
--- a/t/t9827-git-p4-change-filetype.sh
+++ b/third_party/git/t/t9827-git-p4-change-filetype.sh
diff --git a/t/t9828-git-p4-map-user.sh b/third_party/git/t/t9828-git-p4-map-user.sh
index ca6c2942bd..ca6c2942bd 100755
--- a/t/t9828-git-p4-map-user.sh
+++ b/third_party/git/t/t9828-git-p4-map-user.sh
diff --git a/t/t9829-git-p4-jobs.sh b/third_party/git/t/t9829-git-p4-jobs.sh
index 88cfb1fcd3..88cfb1fcd3 100755
--- a/t/t9829-git-p4-jobs.sh
+++ b/third_party/git/t/t9829-git-p4-jobs.sh
diff --git a/t/t9830-git-p4-symlink-dir.sh b/third_party/git/t/t9830-git-p4-symlink-dir.sh
index 3fb6960c18..3fb6960c18 100755
--- a/t/t9830-git-p4-symlink-dir.sh
+++ b/third_party/git/t/t9830-git-p4-symlink-dir.sh
diff --git a/t/t9831-git-p4-triggers.sh b/third_party/git/t/t9831-git-p4-triggers.sh
index d743ca33ee..d743ca33ee 100755
--- a/t/t9831-git-p4-triggers.sh
+++ b/third_party/git/t/t9831-git-p4-triggers.sh
diff --git a/t/t9832-unshelve.sh b/third_party/git/t/t9832-unshelve.sh
index e9276c48f4..e9276c48f4 100755
--- a/t/t9832-unshelve.sh
+++ b/third_party/git/t/t9832-unshelve.sh
diff --git a/t/t9833-errors.sh b/third_party/git/t/t9833-errors.sh
index e22369ccdf..e22369ccdf 100755
--- a/t/t9833-errors.sh
+++ b/third_party/git/t/t9833-errors.sh
diff --git a/t/t9901-git-web--browse.sh b/third_party/git/t/t9901-git-web--browse.sh
index de7152f827..de7152f827 100755
--- a/t/t9901-git-web--browse.sh
+++ b/third_party/git/t/t9901-git-web--browse.sh
diff --git a/t/t9902-completion.sh b/third_party/git/t/t9902-completion.sh
index 75512c3403..75512c3403 100755
--- a/t/t9902-completion.sh
+++ b/third_party/git/t/t9902-completion.sh
diff --git a/t/t9903-bash-prompt.sh b/third_party/git/t/t9903-bash-prompt.sh
index 88bc733ad6..88bc733ad6 100755
--- a/t/t9903-bash-prompt.sh
+++ b/third_party/git/t/t9903-bash-prompt.sh
diff --git a/t/test-binary-1.png b/third_party/git/t/test-binary-1.png
index 7b181d15ce..7b181d15ce 100644
--- a/t/test-binary-1.png
+++ b/third_party/git/t/test-binary-1.png
Binary files differdiff --git a/t/test-binary-2.png b/third_party/git/t/test-binary-2.png
index ac22ccbd3e..ac22ccbd3e 100644
--- a/t/test-binary-2.png
+++ b/third_party/git/t/test-binary-2.png
Binary files differdiff --git a/t/test-lib-functions.sh b/third_party/git/t/test-lib-functions.sh
index e0b3f28d3a..e0b3f28d3a 100644
--- a/t/test-lib-functions.sh
+++ b/third_party/git/t/test-lib-functions.sh
diff --git a/t/test-lib.sh b/third_party/git/t/test-lib.sh
index 30b07e310f..30b07e310f 100644
--- a/t/test-lib.sh
+++ b/third_party/git/t/test-lib.sh
diff --git a/t/test-terminal.perl b/third_party/git/t/test-terminal.perl
index 46bf618479..46bf618479 100755
--- a/t/test-terminal.perl
+++ b/third_party/git/t/test-terminal.perl
diff --git a/t/valgrind/.gitignore b/third_party/git/t/valgrind/.gitignore
index d4ae6676d1..d4ae6676d1 100644
--- a/t/valgrind/.gitignore
+++ b/third_party/git/t/valgrind/.gitignore
diff --git a/t/valgrind/analyze.sh b/third_party/git/t/valgrind/analyze.sh
index 2ffc80f721..2ffc80f721 100755
--- a/t/valgrind/analyze.sh
+++ b/third_party/git/t/valgrind/analyze.sh
diff --git a/t/valgrind/default.supp b/third_party/git/t/valgrind/default.supp
index 0a6724fcc4..0a6724fcc4 100644
--- a/t/valgrind/default.supp
+++ b/third_party/git/t/valgrind/default.supp
diff --git a/t/valgrind/valgrind.sh b/third_party/git/t/valgrind/valgrind.sh
index 669ebaf68b..669ebaf68b 100755
--- a/t/valgrind/valgrind.sh
+++ b/third_party/git/t/valgrind/valgrind.sh
diff --git a/tag.c b/third_party/git/tag.c
index 5db870edb9..5db870edb9 100644
--- a/tag.c
+++ b/third_party/git/tag.c
diff --git a/tag.h b/third_party/git/tag.h
index 03265fbfe2..03265fbfe2 100644
--- a/tag.h
+++ b/third_party/git/tag.h
diff --git a/tar.h b/third_party/git/tar.h
index 3467705e9b..3467705e9b 100644
--- a/tar.h
+++ b/third_party/git/tar.h
diff --git a/tempfile.c b/third_party/git/tempfile.c
index d43ad8c191..d43ad8c191 100644
--- a/tempfile.c
+++ b/third_party/git/tempfile.c
diff --git a/tempfile.h b/third_party/git/tempfile.h
index cddda0a33c..cddda0a33c 100644
--- a/tempfile.h
+++ b/third_party/git/tempfile.h
diff --git a/templates/.gitignore b/third_party/git/templates/.gitignore
index 6759ecbf98..6759ecbf98 100644
--- a/templates/.gitignore
+++ b/third_party/git/templates/.gitignore
diff --git a/templates/Makefile b/third_party/git/templates/Makefile
index d22a71a399..d22a71a399 100644
--- a/templates/Makefile
+++ b/third_party/git/templates/Makefile
diff --git a/templates/branches-- b/third_party/git/templates/branches--
index fae88709a6..fae88709a6 100644
--- a/templates/branches--
+++ b/third_party/git/templates/branches--
diff --git a/templates/hooks--applypatch-msg.sample b/third_party/git/templates/hooks--applypatch-msg.sample
index a5d7b84a67..a5d7b84a67 100755
--- a/templates/hooks--applypatch-msg.sample
+++ b/third_party/git/templates/hooks--applypatch-msg.sample
diff --git a/templates/hooks--commit-msg.sample b/third_party/git/templates/hooks--commit-msg.sample
index b58d1184a9..b58d1184a9 100755
--- a/templates/hooks--commit-msg.sample
+++ b/third_party/git/templates/hooks--commit-msg.sample
diff --git a/templates/hooks--fsmonitor-watchman.sample b/third_party/git/templates/hooks--fsmonitor-watchman.sample
index e673bb3980..e673bb3980 100755
--- a/templates/hooks--fsmonitor-watchman.sample
+++ b/third_party/git/templates/hooks--fsmonitor-watchman.sample
diff --git a/templates/hooks--post-update.sample b/third_party/git/templates/hooks--post-update.sample
index ec17ec1939..ec17ec1939 100755
--- a/templates/hooks--post-update.sample
+++ b/third_party/git/templates/hooks--post-update.sample
diff --git a/templates/hooks--pre-applypatch.sample b/third_party/git/templates/hooks--pre-applypatch.sample
index 4142082bcb..4142082bcb 100755
--- a/templates/hooks--pre-applypatch.sample
+++ b/third_party/git/templates/hooks--pre-applypatch.sample
diff --git a/templates/hooks--pre-commit.sample b/third_party/git/templates/hooks--pre-commit.sample
index 6a75641638..6a75641638 100755
--- a/templates/hooks--pre-commit.sample
+++ b/third_party/git/templates/hooks--pre-commit.sample
diff --git a/templates/hooks--pre-push.sample b/third_party/git/templates/hooks--pre-push.sample
index 6187dbf439..6187dbf439 100755
--- a/templates/hooks--pre-push.sample
+++ b/third_party/git/templates/hooks--pre-push.sample
diff --git a/templates/hooks--pre-rebase.sample b/third_party/git/templates/hooks--pre-rebase.sample
index db5feab8a1..db5feab8a1 100755
--- a/templates/hooks--pre-rebase.sample
+++ b/third_party/git/templates/hooks--pre-rebase.sample
diff --git a/templates/hooks--pre-receive.sample b/third_party/git/templates/hooks--pre-receive.sample
index a1fd29ec14..a1fd29ec14 100755
--- a/templates/hooks--pre-receive.sample
+++ b/third_party/git/templates/hooks--pre-receive.sample
diff --git a/templates/hooks--prepare-commit-msg.sample b/third_party/git/templates/hooks--prepare-commit-msg.sample
index 318afe3fd8..318afe3fd8 100755
--- a/templates/hooks--prepare-commit-msg.sample
+++ b/third_party/git/templates/hooks--prepare-commit-msg.sample
diff --git a/templates/hooks--update.sample b/third_party/git/templates/hooks--update.sample
index 80ba94135c..80ba94135c 100755
--- a/templates/hooks--update.sample
+++ b/third_party/git/templates/hooks--update.sample
diff --git a/templates/info--exclude b/third_party/git/templates/info--exclude
index a5196d1be8..a5196d1be8 100644
--- a/templates/info--exclude
+++ b/third_party/git/templates/info--exclude
diff --git a/templates/this--description b/third_party/git/templates/this--description
index 498b267a8c..498b267a8c 100644
--- a/templates/this--description
+++ b/third_party/git/templates/this--description
diff --git a/thread-utils.c b/third_party/git/thread-utils.c
index 5329845691..5329845691 100644
--- a/thread-utils.c
+++ b/third_party/git/thread-utils.c
diff --git a/thread-utils.h b/third_party/git/thread-utils.h
index 4961487ed9..4961487ed9 100644
--- a/thread-utils.h
+++ b/third_party/git/thread-utils.h
diff --git a/tmp-objdir.c b/third_party/git/tmp-objdir.c
index 91c00567f4..91c00567f4 100644
--- a/tmp-objdir.c
+++ b/third_party/git/tmp-objdir.c
diff --git a/tmp-objdir.h b/third_party/git/tmp-objdir.h
index b1e45b4c75..b1e45b4c75 100644
--- a/tmp-objdir.h
+++ b/third_party/git/tmp-objdir.h
diff --git a/trace.c b/third_party/git/trace.c
index fa4a2e7120..fa4a2e7120 100644
--- a/trace.c
+++ b/third_party/git/trace.c
diff --git a/trace.h b/third_party/git/trace.h
index 9fa3e7a594..9fa3e7a594 100644
--- a/trace.h
+++ b/third_party/git/trace.h
diff --git a/trace2.c b/third_party/git/trace2.c
index c7b4f14d29..c7b4f14d29 100644
--- a/trace2.c
+++ b/third_party/git/trace2.c
diff --git a/trace2.h b/third_party/git/trace2.h
index 050bf3c8c1..050bf3c8c1 100644
--- a/trace2.h
+++ b/third_party/git/trace2.h
diff --git a/trace2/tr2_cfg.c b/third_party/git/trace2/tr2_cfg.c
index caa7f06948..caa7f06948 100644
--- a/trace2/tr2_cfg.c
+++ b/third_party/git/trace2/tr2_cfg.c
diff --git a/trace2/tr2_cfg.h b/third_party/git/trace2/tr2_cfg.h
index d9c98f64dd..d9c98f64dd 100644
--- a/trace2/tr2_cfg.h
+++ b/third_party/git/trace2/tr2_cfg.h
diff --git a/trace2/tr2_cmd_name.c b/third_party/git/trace2/tr2_cmd_name.c
index dd313204f5..dd313204f5 100644
--- a/trace2/tr2_cmd_name.c
+++ b/third_party/git/trace2/tr2_cmd_name.c
diff --git a/trace2/tr2_cmd_name.h b/third_party/git/trace2/tr2_cmd_name.h
index ab70b67a8e..ab70b67a8e 100644
--- a/trace2/tr2_cmd_name.h
+++ b/third_party/git/trace2/tr2_cmd_name.h
diff --git a/trace2/tr2_dst.c b/third_party/git/trace2/tr2_dst.c
index 5dda0ca1cd..5dda0ca1cd 100644
--- a/trace2/tr2_dst.c
+++ b/third_party/git/trace2/tr2_dst.c
diff --git a/trace2/tr2_dst.h b/third_party/git/trace2/tr2_dst.h
index 3adf3bac13..3adf3bac13 100644
--- a/trace2/tr2_dst.h
+++ b/third_party/git/trace2/tr2_dst.h
diff --git a/trace2/tr2_sid.c b/third_party/git/trace2/tr2_sid.c
index 6948fd4108..6948fd4108 100644
--- a/trace2/tr2_sid.c
+++ b/third_party/git/trace2/tr2_sid.c
diff --git a/trace2/tr2_sid.h b/third_party/git/trace2/tr2_sid.h
index 9bef321708..9bef321708 100644
--- a/trace2/tr2_sid.h
+++ b/third_party/git/trace2/tr2_sid.h
diff --git a/trace2/tr2_sysenv.c b/third_party/git/trace2/tr2_sysenv.c
index 5958cfc424..5958cfc424 100644
--- a/trace2/tr2_sysenv.c
+++ b/third_party/git/trace2/tr2_sysenv.c
diff --git a/trace2/tr2_sysenv.h b/third_party/git/trace2/tr2_sysenv.h
index 8dd82a7a56..8dd82a7a56 100644
--- a/trace2/tr2_sysenv.h
+++ b/third_party/git/trace2/tr2_sysenv.h
diff --git a/trace2/tr2_tbuf.c b/third_party/git/trace2/tr2_tbuf.c
index 2498482d9a..2498482d9a 100644
--- a/trace2/tr2_tbuf.c
+++ b/third_party/git/trace2/tr2_tbuf.c
diff --git a/trace2/tr2_tbuf.h b/third_party/git/trace2/tr2_tbuf.h
index fa853d8f42..fa853d8f42 100644
--- a/trace2/tr2_tbuf.h
+++ b/third_party/git/trace2/tr2_tbuf.h
diff --git a/trace2/tr2_tgt.h b/third_party/git/trace2/tr2_tgt.h
index 7b90469212..7b90469212 100644
--- a/trace2/tr2_tgt.h
+++ b/third_party/git/trace2/tr2_tgt.h
diff --git a/trace2/tr2_tgt_event.c b/third_party/git/trace2/tr2_tgt_event.c
index c2852d1bd2..c2852d1bd2 100644
--- a/trace2/tr2_tgt_event.c
+++ b/third_party/git/trace2/tr2_tgt_event.c
diff --git a/trace2/tr2_tgt_normal.c b/third_party/git/trace2/tr2_tgt_normal.c
index 00b116d797..00b116d797 100644
--- a/trace2/tr2_tgt_normal.c
+++ b/third_party/git/trace2/tr2_tgt_normal.c
diff --git a/trace2/tr2_tgt_perf.c b/third_party/git/trace2/tr2_tgt_perf.c
index ea0cbbe13e..ea0cbbe13e 100644
--- a/trace2/tr2_tgt_perf.c
+++ b/third_party/git/trace2/tr2_tgt_perf.c
diff --git a/trace2/tr2_tls.c b/third_party/git/trace2/tr2_tls.c
index 067c23755f..067c23755f 100644
--- a/trace2/tr2_tls.c
+++ b/third_party/git/trace2/tr2_tls.c
diff --git a/trace2/tr2_tls.h b/third_party/git/trace2/tr2_tls.h
index b1e327a928..b1e327a928 100644
--- a/trace2/tr2_tls.h
+++ b/third_party/git/trace2/tr2_tls.h
diff --git a/trailer.c b/third_party/git/trailer.c
index 0c414f2fed..0c414f2fed 100644
--- a/trailer.c
+++ b/third_party/git/trailer.c
diff --git a/trailer.h b/third_party/git/trailer.h
index 203acf4ee1..203acf4ee1 100644
--- a/trailer.h
+++ b/third_party/git/trailer.h
diff --git a/transport-helper.c b/third_party/git/transport-helper.c
index 6b05a88faf..6b05a88faf 100644
--- a/transport-helper.c
+++ b/third_party/git/transport-helper.c
diff --git a/transport-internal.h b/third_party/git/transport-internal.h
index 004bee5e36..004bee5e36 100644
--- a/transport-internal.h
+++ b/third_party/git/transport-internal.h
diff --git a/transport.c b/third_party/git/transport.c
index 778c60bf57..778c60bf57 100644
--- a/transport.c
+++ b/third_party/git/transport.c
diff --git a/transport.h b/third_party/git/transport.h
index 0b5f7806f6..0b5f7806f6 100644
--- a/transport.h
+++ b/third_party/git/transport.h
diff --git a/tree-diff.c b/third_party/git/tree-diff.c
index 33ded7f8b3..33ded7f8b3 100644
--- a/tree-diff.c
+++ b/third_party/git/tree-diff.c
diff --git a/tree-walk.c b/third_party/git/tree-walk.c
index c20b62f49e..c20b62f49e 100644
--- a/tree-walk.c
+++ b/third_party/git/tree-walk.c
diff --git a/tree-walk.h b/third_party/git/tree-walk.h
index 2a5db29e8f..2a5db29e8f 100644
--- a/tree-walk.h
+++ b/third_party/git/tree-walk.h
diff --git a/tree.c b/third_party/git/tree.c
index 4720945e6a..4720945e6a 100644
--- a/tree.c
+++ b/third_party/git/tree.c
diff --git a/tree.h b/third_party/git/tree.h
index 9383745073..9383745073 100644
--- a/tree.h
+++ b/third_party/git/tree.h
diff --git a/unicode-width.h b/third_party/git/unicode-width.h
index c9d027625d..c9d027625d 100644
--- a/unicode-width.h
+++ b/third_party/git/unicode-width.h
diff --git a/unimplemented.sh b/third_party/git/unimplemented.sh
index fee21d24e8..fee21d24e8 100644
--- a/unimplemented.sh
+++ b/third_party/git/unimplemented.sh
diff --git a/unix-socket.c b/third_party/git/unix-socket.c
index 19ed48be99..19ed48be99 100644
--- a/unix-socket.c
+++ b/third_party/git/unix-socket.c
diff --git a/unix-socket.h b/third_party/git/unix-socket.h
index e271aeec5a..e271aeec5a 100644
--- a/unix-socket.h
+++ b/third_party/git/unix-socket.h
diff --git a/unpack-trees.c b/third_party/git/unpack-trees.c
index 62276d4fef..62276d4fef 100644
--- a/unpack-trees.c
+++ b/third_party/git/unpack-trees.c
diff --git a/unpack-trees.h b/third_party/git/unpack-trees.h
index d344d7d296..d344d7d296 100644
--- a/unpack-trees.h
+++ b/third_party/git/unpack-trees.h
diff --git a/upload-pack.c b/third_party/git/upload-pack.c
index 222cd3ad89..222cd3ad89 100644
--- a/upload-pack.c
+++ b/third_party/git/upload-pack.c
diff --git a/upload-pack.h b/third_party/git/upload-pack.h
index 4bafe16a22..4bafe16a22 100644
--- a/upload-pack.h
+++ b/third_party/git/upload-pack.h
diff --git a/url.c b/third_party/git/url.c
index 1b8ef78cea..1b8ef78cea 100644
--- a/url.c
+++ b/third_party/git/url.c
diff --git a/url.h b/third_party/git/url.h
index 00b7d58c33..00b7d58c33 100644
--- a/url.h
+++ b/third_party/git/url.h
diff --git a/urlmatch.c b/third_party/git/urlmatch.c
index 3e42bd7504..3e42bd7504 100644
--- a/urlmatch.c
+++ b/third_party/git/urlmatch.c
diff --git a/urlmatch.h b/third_party/git/urlmatch.h
index eed5f29235..eed5f29235 100644
--- a/urlmatch.h
+++ b/third_party/git/urlmatch.h
diff --git a/usage.c b/third_party/git/usage.c
index 2fdb20086b..2fdb20086b 100644
--- a/usage.c
+++ b/third_party/git/usage.c
diff --git a/userdiff.c b/third_party/git/userdiff.c
index e74a6d4022..e74a6d4022 100644
--- a/userdiff.c
+++ b/third_party/git/userdiff.c
diff --git a/userdiff.h b/third_party/git/userdiff.h
index 203057e13e..203057e13e 100644
--- a/userdiff.h
+++ b/third_party/git/userdiff.h
diff --git a/utf8.c b/third_party/git/utf8.c
index 3b42fadffd..3b42fadffd 100644
--- a/utf8.c
+++ b/third_party/git/utf8.c
diff --git a/utf8.h b/third_party/git/utf8.h
index fcd5167baf..fcd5167baf 100644
--- a/utf8.h
+++ b/third_party/git/utf8.h
diff --git a/varint.c b/third_party/git/varint.c
index 409c4977a1..409c4977a1 100644
--- a/varint.c
+++ b/third_party/git/varint.c
diff --git a/varint.h b/third_party/git/varint.h
index f78bb0ca52..f78bb0ca52 100644
--- a/varint.h
+++ b/third_party/git/varint.h
diff --git a/vcs-svn/LICENSE b/third_party/git/vcs-svn/LICENSE
index eb91858b82..eb91858b82 100644
--- a/vcs-svn/LICENSE
+++ b/third_party/git/vcs-svn/LICENSE
diff --git a/vcs-svn/fast_export.c b/third_party/git/vcs-svn/fast_export.c
index b5b8913cb0..b5b8913cb0 100644
--- a/vcs-svn/fast_export.c
+++ b/third_party/git/vcs-svn/fast_export.c
diff --git a/vcs-svn/fast_export.h b/third_party/git/vcs-svn/fast_export.h
index 9dcf9337c1..9dcf9337c1 100644
--- a/vcs-svn/fast_export.h
+++ b/third_party/git/vcs-svn/fast_export.h
diff --git a/vcs-svn/line_buffer.c b/third_party/git/vcs-svn/line_buffer.c
index e416caf8a4..e416caf8a4 100644
--- a/vcs-svn/line_buffer.c
+++ b/third_party/git/vcs-svn/line_buffer.c
diff --git a/vcs-svn/line_buffer.h b/third_party/git/vcs-svn/line_buffer.h
index e192aedea2..e192aedea2 100644
--- a/vcs-svn/line_buffer.h
+++ b/third_party/git/vcs-svn/line_buffer.h
diff --git a/vcs-svn/line_buffer.txt b/third_party/git/vcs-svn/line_buffer.txt
index 8e139eb22d..8e139eb22d 100644
--- a/vcs-svn/line_buffer.txt
+++ b/third_party/git/vcs-svn/line_buffer.txt
diff --git a/vcs-svn/sliding_window.c b/third_party/git/vcs-svn/sliding_window.c
index 06d273c9e8..06d273c9e8 100644
--- a/vcs-svn/sliding_window.c
+++ b/third_party/git/vcs-svn/sliding_window.c
diff --git a/vcs-svn/sliding_window.h b/third_party/git/vcs-svn/sliding_window.h
index a7fc0999cb..a7fc0999cb 100644
--- a/vcs-svn/sliding_window.h
+++ b/third_party/git/vcs-svn/sliding_window.h
diff --git a/vcs-svn/svndiff.c b/third_party/git/vcs-svn/svndiff.c
index 75c753162a..75c753162a 100644
--- a/vcs-svn/svndiff.c
+++ b/third_party/git/vcs-svn/svndiff.c
diff --git a/vcs-svn/svndiff.h b/third_party/git/vcs-svn/svndiff.h
index 625d950bb8..625d950bb8 100644
--- a/vcs-svn/svndiff.h
+++ b/third_party/git/vcs-svn/svndiff.h
diff --git a/vcs-svn/svndump.c b/third_party/git/vcs-svn/svndump.c
index 08d136b8cc..08d136b8cc 100644
--- a/vcs-svn/svndump.c
+++ b/third_party/git/vcs-svn/svndump.c
diff --git a/vcs-svn/svndump.h b/third_party/git/vcs-svn/svndump.h
index 26faed5968..26faed5968 100644
--- a/vcs-svn/svndump.h
+++ b/third_party/git/vcs-svn/svndump.h
diff --git a/version.c b/third_party/git/version.c
index 41b718c29e..41b718c29e 100644
--- a/version.c
+++ b/third_party/git/version.c
diff --git a/version.h b/third_party/git/version.h
index 7c62e80577..7c62e80577 100644
--- a/version.h
+++ b/third_party/git/version.h
diff --git a/versioncmp.c b/third_party/git/versioncmp.c
index 069ee94a4d..069ee94a4d 100644
--- a/versioncmp.c
+++ b/third_party/git/versioncmp.c
diff --git a/walker.c b/third_party/git/walker.c
index 06cd2bd569..06cd2bd569 100644
--- a/walker.c
+++ b/third_party/git/walker.c
diff --git a/walker.h b/third_party/git/walker.h
index 6d8ae00e5b..6d8ae00e5b 100644
--- a/walker.h
+++ b/third_party/git/walker.h
diff --git a/wildmatch.c b/third_party/git/wildmatch.c
index 9e9e2a2f95..9e9e2a2f95 100644
--- a/wildmatch.c
+++ b/third_party/git/wildmatch.c
diff --git a/wildmatch.h b/third_party/git/wildmatch.h
index 5993696298..5993696298 100644
--- a/wildmatch.h
+++ b/third_party/git/wildmatch.h
diff --git a/worktree.c b/third_party/git/worktree.c
index 5b4793caa3..5b4793caa3 100644
--- a/worktree.c
+++ b/third_party/git/worktree.c
diff --git a/worktree.h b/third_party/git/worktree.h
index caecc7a281..caecc7a281 100644
--- a/worktree.h
+++ b/third_party/git/worktree.h
diff --git a/wrap-for-bin.sh b/third_party/git/wrap-for-bin.sh
index 95851b85b6..95851b85b6 100644
--- a/wrap-for-bin.sh
+++ b/third_party/git/wrap-for-bin.sh
diff --git a/wrapper.c b/third_party/git/wrapper.c
index 1e45ab7b92..1e45ab7b92 100644
--- a/wrapper.c
+++ b/third_party/git/wrapper.c
diff --git a/write-or-die.c b/third_party/git/write-or-die.c
index eab8c8d0b9..eab8c8d0b9 100644
--- a/write-or-die.c
+++ b/third_party/git/write-or-die.c
diff --git a/ws.c b/third_party/git/ws.c
index 6e69877f25..6e69877f25 100644
--- a/ws.c
+++ b/third_party/git/ws.c
diff --git a/wt-status.c b/third_party/git/wt-status.c
index 9f6c65a580..9f6c65a580 100644
--- a/wt-status.c
+++ b/third_party/git/wt-status.c
diff --git a/wt-status.h b/third_party/git/wt-status.h
index 77dad5b920..77dad5b920 100644
--- a/wt-status.h
+++ b/third_party/git/wt-status.h
diff --git a/xdiff-interface.c b/third_party/git/xdiff-interface.c
index 8509f9ea22..8509f9ea22 100644
--- a/xdiff-interface.c
+++ b/third_party/git/xdiff-interface.c
diff --git a/xdiff-interface.h b/third_party/git/xdiff-interface.h
index ede4246bbd..ede4246bbd 100644
--- a/xdiff-interface.h
+++ b/third_party/git/xdiff-interface.h
diff --git a/xdiff/xdiff.h b/third_party/git/xdiff/xdiff.h
index 032e3a9f41..032e3a9f41 100644
--- a/xdiff/xdiff.h
+++ b/third_party/git/xdiff/xdiff.h
diff --git a/xdiff/xdiffi.c b/third_party/git/xdiff/xdiffi.c
index 1f1f4a3c78..1f1f4a3c78 100644
--- a/xdiff/xdiffi.c
+++ b/third_party/git/xdiff/xdiffi.c
diff --git a/xdiff/xdiffi.h b/third_party/git/xdiff/xdiffi.h
index 8f1c7c8b04..8f1c7c8b04 100644
--- a/xdiff/xdiffi.h
+++ b/third_party/git/xdiff/xdiffi.h
diff --git a/xdiff/xemit.c b/third_party/git/xdiff/xemit.c
index 30713ae9a9..30713ae9a9 100644
--- a/xdiff/xemit.c
+++ b/third_party/git/xdiff/xemit.c
diff --git a/xdiff/xemit.h b/third_party/git/xdiff/xemit.h
index 1b9887e670..1b9887e670 100644
--- a/xdiff/xemit.h
+++ b/third_party/git/xdiff/xemit.h
diff --git a/xdiff/xhistogram.c b/third_party/git/xdiff/xhistogram.c
index c7b35a9667..c7b35a9667 100644
--- a/xdiff/xhistogram.c
+++ b/third_party/git/xdiff/xhistogram.c
diff --git a/xdiff/xinclude.h b/third_party/git/xdiff/xinclude.h
index a4285ac0eb..a4285ac0eb 100644
--- a/xdiff/xinclude.h
+++ b/third_party/git/xdiff/xinclude.h
diff --git a/xdiff/xmacros.h b/third_party/git/xdiff/xmacros.h
index 2809a28ca9..2809a28ca9 100644
--- a/xdiff/xmacros.h
+++ b/third_party/git/xdiff/xmacros.h
diff --git a/xdiff/xmerge.c b/third_party/git/xdiff/xmerge.c
index 1659edb453..1659edb453 100644
--- a/xdiff/xmerge.c
+++ b/third_party/git/xdiff/xmerge.c
diff --git a/xdiff/xpatience.c b/third_party/git/xdiff/xpatience.c
index 3c5601b602..3c5601b602 100644
--- a/xdiff/xpatience.c
+++ b/third_party/git/xdiff/xpatience.c
diff --git a/xdiff/xprepare.c b/third_party/git/xdiff/xprepare.c
index abeb8fb84e..abeb8fb84e 100644
--- a/xdiff/xprepare.c
+++ b/third_party/git/xdiff/xprepare.c
diff --git a/xdiff/xprepare.h b/third_party/git/xdiff/xprepare.h
index 947d9fc1bb..947d9fc1bb 100644
--- a/xdiff/xprepare.h
+++ b/third_party/git/xdiff/xprepare.h
diff --git a/xdiff/xtypes.h b/third_party/git/xdiff/xtypes.h
index 8442bd436e..8442bd436e 100644
--- a/xdiff/xtypes.h
+++ b/third_party/git/xdiff/xtypes.h
diff --git a/xdiff/xutils.c b/third_party/git/xdiff/xutils.c
index cfa6e2220f..cfa6e2220f 100644
--- a/xdiff/xutils.c
+++ b/third_party/git/xdiff/xutils.c
diff --git a/xdiff/xutils.h b/third_party/git/xdiff/xutils.h
index fba7bae03c..fba7bae03c 100644
--- a/xdiff/xutils.h
+++ b/third_party/git/xdiff/xutils.h
diff --git a/zlib.c b/third_party/git/zlib.c
index d594cba3fc..d594cba3fc 100644
--- a/zlib.c
+++ b/third_party/git/zlib.c
diff --git a/third_party/gopkgs/cloud.google.com/go/default.nix b/third_party/gopkgs/cloud.google.com/go/default.nix
new file mode 100644
index 0000000000..d3855291a9
--- /dev/null
+++ b/third_party/gopkgs/cloud.google.com/go/default.nix
@@ -0,0 +1,12 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "cloud.google.com/go";
+  src = builtins.fetchGit {
+    url = "https://code.googlesource.com/gocloud";
+    rev = "4f03f8e4ba168c636e1c218da7ab41a1c8c0d8cf";
+  };
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+  ];
+}
diff --git a/third_party/gopkgs/github.com/emirpasic/gods/default.nix b/third_party/gopkgs/github.com/emirpasic/gods/default.nix
new file mode 100644
index 0000000000..72979ef80d
--- /dev/null
+++ b/third_party/gopkgs/github.com/emirpasic/gods/default.nix
@@ -0,0 +1,12 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "github.com/emirpasic/gods";
+
+  src = pkgs.third_party.fetchFromGitHub {
+    owner = "emirpasic";
+    repo = "gods";
+    rev = "4e23915b9a82f35f320a68a395a7a5045c826932";
+    sha256 = "00f8ch1rccakc62f9nj97hapvnx84z7wbcdmbmz7p802b9mxk5nl";
+  };
+}
diff --git a/third_party/gopkgs/github.com/golang/groupcache/default.nix b/third_party/gopkgs/github.com/golang/groupcache/default.nix
new file mode 100644
index 0000000000..2dfa1241e9
--- /dev/null
+++ b/third_party/gopkgs/github.com/golang/groupcache/default.nix
@@ -0,0 +1,9 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "github.com/golang/groupcache";
+  src = builtins.fetchGit {
+    url = "https://github.com/golang/groupcache";
+    rev = "611e8accdfc92c4187d399e95ce826046d4c8d73";
+  };
+}
diff --git a/third_party/gopkgs/github.com/golang/protobuf/default.nix b/third_party/gopkgs/github.com/golang/protobuf/default.nix
new file mode 100644
index 0000000000..f1c54cd496
--- /dev/null
+++ b/third_party/gopkgs/github.com/golang/protobuf/default.nix
@@ -0,0 +1,12 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "github.com/golang/protobuf";
+  src = builtins.fetchGit {
+    url = "https://github.com/golang/protobuf";
+    rev = "ed6926b37a637426117ccab59282c3839528a700";
+  };
+
+  deps = with pkgs.third_party; [
+  ];
+}
diff --git a/third_party/gopkgs/github.com/google/uuid/default.nix b/third_party/gopkgs/github.com/google/uuid/default.nix
new file mode 100644
index 0000000000..8d60209681
--- /dev/null
+++ b/third_party/gopkgs/github.com/google/uuid/default.nix
@@ -0,0 +1,12 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "github.com/google/uuid";
+
+  src = pkgs.third_party.fetchFromGitHub {
+    owner = "google";
+    repo = "uuid";
+    rev = "c2e93f3ae59f2904160ceaab466009f965df46d6";
+    sha256 = "0zw8fvl6jqg0fmv6kmvhss0g4gkrbvgyvl2zgy5wdbdlgp4fja0h";
+  };
+}
diff --git a/third_party/gopkgs/github.com/googleapis/gax-go/default.nix b/third_party/gopkgs/github.com/googleapis/gax-go/default.nix
new file mode 100644
index 0000000000..fe694fdbbe
--- /dev/null
+++ b/third_party/gopkgs/github.com/googleapis/gax-go/default.nix
@@ -0,0 +1,19 @@
+{ pkgs, ... }:
+
+let
+  inherit (pkgs) buildGo;
+  inherit (builtins) fetchGit;
+in pkgs.buildGo.external {
+  path = "github.com/googleapis/gax-go";
+  src = fetchGit {
+    url = "https://github.com/googleapis/gax-go";
+    rev = "b443e5a67ec8eeac76f5f384004931878cab24b3";
+  };
+
+  deps = with pkgs.third_party; [
+    gopkgs."golang.org".x.net.trace.gopkg
+    gopkgs."google.golang.org".grpc.gopkg
+    gopkgs."google.golang.org".grpc.codes.gopkg
+    gopkgs."google.golang.org".grpc.status.gopkg
+  ];
+}
diff --git a/third_party/gopkgs/github.com/hashicorp/golang-lru/default.nix b/third_party/gopkgs/github.com/hashicorp/golang-lru/default.nix
new file mode 100644
index 0000000000..04efc3144d
--- /dev/null
+++ b/third_party/gopkgs/github.com/hashicorp/golang-lru/default.nix
@@ -0,0 +1,14 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "github.com/hashicorp/golang-lru";
+  src = builtins.fetchGit {
+    url = "https://github.com/hashicorp/golang-lru";
+    rev = "7f827b33c0f158ec5dfbba01bb0b14a4541fd81d";
+  };
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+    gopkgs."golang.org".x.net.context.ctxhttp
+    gopkgs."cloud.google.com".go.compute.metadata
+  ];
+}
diff --git a/third_party/gopkgs/github.com/jbenet/go-context/default.nix b/third_party/gopkgs/github.com/jbenet/go-context/default.nix
new file mode 100644
index 0000000000..454b27312a
--- /dev/null
+++ b/third_party/gopkgs/github.com/jbenet/go-context/default.nix
@@ -0,0 +1,16 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "github.com/jbenet/go-context";
+
+  src = pkgs.third_party.fetchFromGitHub {
+    owner = "jbenet";
+    repo = "go-context";
+    rev = "d14ea06fba99483203c19d92cfcd13ebe73135f4";
+    sha256 = "0q91f5549n81w3z5927n4a1mdh220bdmgl42zi3h992dcc4ls0sl";
+  };
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+    gopkgs."golang.org".x.net.context
+  ];
+}
diff --git a/third_party/gopkgs/github.com/kevinburke/ssh_config/default.nix b/third_party/gopkgs/github.com/kevinburke/ssh_config/default.nix
new file mode 100644
index 0000000000..ed8dadc40c
--- /dev/null
+++ b/third_party/gopkgs/github.com/kevinburke/ssh_config/default.nix
@@ -0,0 +1,15 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "github.com/kevinburke/ssh_config";
+
+  src = pkgs.third_party.fetchFromGitHub {
+    owner = "kevinburke";
+    repo = "ssh_config";
+    rev = "01f96b0aa0cdcaa93f9495f89bbc6cb5a992ce6e";
+    sha256 = "1bxfjkjl3ibzdkwyvgdwawmd0skz30ah1ha10rg6fkxvj7lgg4jz";
+  };
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+  ];
+}
diff --git a/third_party/gopkgs/github.com/mitchellh/go-homedir/default.nix b/third_party/gopkgs/github.com/mitchellh/go-homedir/default.nix
new file mode 100644
index 0000000000..0d94f6cf6e
--- /dev/null
+++ b/third_party/gopkgs/github.com/mitchellh/go-homedir/default.nix
@@ -0,0 +1,12 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "github.com/mitchellh/go-homedir";
+
+  src = pkgs.third_party.fetchFromGitHub {
+    owner = "mitchellh";
+    repo = "go-homedir";
+    rev = "af06845cf3004701891bf4fdb884bfe4920b3727";
+    sha256 = "0ydzkipf28hwj2bfxqmwlww47khyk6d152xax4bnyh60f4lq3nx1";
+  };
+}
diff --git a/third_party/gopkgs/github.com/sergi/go-diff/default.nix b/third_party/gopkgs/github.com/sergi/go-diff/default.nix
new file mode 100644
index 0000000000..45f6889151
--- /dev/null
+++ b/third_party/gopkgs/github.com/sergi/go-diff/default.nix
@@ -0,0 +1,12 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "github.com/sergi/go-diff";
+
+  src = pkgs.third_party.fetchFromGitHub {
+    owner = "sergi";
+    repo = "go-diff";
+    rev = "58c5cb1602ee9676b5d3590d782bedde80706fcc";
+    sha256 = "0ir8ali2vx0j7pipmlfd6k8c973akyy2nmbjrf008fm800zcp7z2";
+  };
+}
diff --git a/third_party/gopkgs/github.com/src-d/gcfg/default.nix b/third_party/gopkgs/github.com/src-d/gcfg/default.nix
new file mode 100644
index 0000000000..5dde56d5f3
--- /dev/null
+++ b/third_party/gopkgs/github.com/src-d/gcfg/default.nix
@@ -0,0 +1,16 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "github.com/src-d/gcfg";
+
+  src = pkgs.third_party.fetchFromGitHub {
+    owner = "src-d";
+    repo = "gcfg";
+    rev = "1ac3a1ac202429a54835fe8408a92880156b489d";
+    sha256 = "044j95skmyrwjw5fwjk6ka32rjgsg0ar0mfp9np19sh1acwv4x4r";
+  };
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+    gopkgs."gopkg.in".warnings
+  ];
+}
diff --git a/third_party/gopkgs/github.com/xanzy/ssh-agent/default.nix b/third_party/gopkgs/github.com/xanzy/ssh-agent/default.nix
new file mode 100644
index 0000000000..e179618a72
--- /dev/null
+++ b/third_party/gopkgs/github.com/xanzy/ssh-agent/default.nix
@@ -0,0 +1,16 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "github.com/xanzy/ssh-agent";
+
+  src = pkgs.third_party.fetchFromGitHub {
+    owner = "xanzy";
+    repo = "ssh-agent";
+    rev = "6a3e2ff9e7c564f36873c2e36413f634534f1c44";
+    sha256 = "1chjlnv5d6svpymxgsr62d992m2xi6jb5lybjc5zn1h3hv1m01av";
+  };
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+    gopkgs."golang.org".x.crypto.ssh.agent
+  ];
+}
diff --git a/third_party/gopkgs/go.opencensus.io/default.nix b/third_party/gopkgs/go.opencensus.io/default.nix
new file mode 100644
index 0000000000..4cab5e5dce
--- /dev/null
+++ b/third_party/gopkgs/go.opencensus.io/default.nix
@@ -0,0 +1,14 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "go.opencensus.io";
+  src = builtins.fetchGit {
+    url = "https://github.com/census-instrumentation/opencensus-go";
+    rev = "643eada29081047b355cfaa1ceb9bc307a10423c";
+  };
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+    gopkgs."github.com".hashicorp.golang-lru.simplelru
+    gopkgs."github.com".golang.groupcache.lru
+  ];
+}
diff --git a/third_party/gopkgs/golang.org/x/crypto/default.nix b/third_party/gopkgs/golang.org/x/crypto/default.nix
new file mode 100644
index 0000000000..11c9b0ea8b
--- /dev/null
+++ b/third_party/gopkgs/golang.org/x/crypto/default.nix
@@ -0,0 +1,13 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "golang.org/x/crypto";
+  src = builtins.fetchGit {
+    url = "https://go.googlesource.com/crypto";
+    rev = "e9b2fee46413994441b28dfca259d911d963dfed";
+  };
+
+  deps = with pkgs.third_party; [
+    gopkgs."golang.org".x.sys.unix.gopkg
+  ];
+}
diff --git a/third_party/gopkgs/golang.org/x/net/default.nix b/third_party/gopkgs/golang.org/x/net/default.nix
new file mode 100644
index 0000000000..400ba6922b
--- /dev/null
+++ b/third_party/gopkgs/golang.org/x/net/default.nix
@@ -0,0 +1,15 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "golang.org/x/net";
+  src = builtins.fetchGit {
+    url = "https://go.googlesource.com/net";
+    rev = "c0dbc17a35534bf2e581d7a942408dc936316da4";
+  };
+
+  deps = with pkgs.third_party; [
+    gopkgs."golang.org".x.text.secure.bidirule.gopkg
+    gopkgs."golang.org".x.text.unicode.bidi.gopkg
+    gopkgs."golang.org".x.text.unicode.norm.gopkg
+  ];
+}
diff --git a/third_party/gopkgs/golang.org/x/oauth2/default.nix b/third_party/gopkgs/golang.org/x/oauth2/default.nix
new file mode 100644
index 0000000000..f5e783b6d1
--- /dev/null
+++ b/third_party/gopkgs/golang.org/x/oauth2/default.nix
@@ -0,0 +1,14 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "golang.org/x/oauth2";
+  src = builtins.fetchGit {
+    url = "https://go.googlesource.com/oauth2";
+    rev = "858c2ad4c8b6c5d10852cb89079f6ca1c7309787";
+  };
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+    gopkgs."golang.org".x.net.context.ctxhttp
+    gopkgs."cloud.google.com".go.compute.metadata
+  ];
+}
diff --git a/third_party/gopkgs/golang.org/x/sys/default.nix b/third_party/gopkgs/golang.org/x/sys/default.nix
new file mode 100644
index 0000000000..5655c08d82
--- /dev/null
+++ b/third_party/gopkgs/golang.org/x/sys/default.nix
@@ -0,0 +1,9 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "golang.org/x/sys";
+  src = builtins.fetchGit {
+    url = "https://go.googlesource.com/sys";
+    rev = "ac6580df4449443a05718fd7858c1f91ad5f8d20";
+  };
+}
diff --git a/third_party/gopkgs/golang.org/x/text/default.nix b/third_party/gopkgs/golang.org/x/text/default.nix
new file mode 100644
index 0000000000..409b0d0b9e
--- /dev/null
+++ b/third_party/gopkgs/golang.org/x/text/default.nix
@@ -0,0 +1,12 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "golang.org/x/text";
+  src = builtins.fetchGit {
+    url = "https://go.googlesource.com/text";
+    rev = "cbf43d21aaebfdfeb81d91a5f444d13a3046e686";
+  };
+
+  deps = with pkgs.third_party; [
+  ];
+}
diff --git a/third_party/gopkgs/golang.org/x/time/default.nix b/third_party/gopkgs/golang.org/x/time/default.nix
new file mode 100644
index 0000000000..6ccfc8a652
--- /dev/null
+++ b/third_party/gopkgs/golang.org/x/time/default.nix
@@ -0,0 +1,10 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "golang.org/x/time";
+
+  src = builtins.fetchGit {
+    url = "https://go.googlesource.com/time";
+    rev = "555d28b269f0569763d25dbe1a237ae74c6bcc82";
+  };
+}
diff --git a/third_party/gopkgs/google.golang.org/api/default.nix b/third_party/gopkgs/google.golang.org/api/default.nix
new file mode 100644
index 0000000000..a4e7339a3f
--- /dev/null
+++ b/third_party/gopkgs/google.golang.org/api/default.nix
@@ -0,0 +1,20 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "google.golang.org/api";
+  src = builtins.fetchGit {
+    url = "https://code.googlesource.com/google-api-go-client";
+    rev = "8b4e46d953bd748a9ff098644a42389b3d8dab41";
+  };
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+    gopkgs."github.com".googleapis.gax-go.v2
+    gopkgs."golang.org".x.oauth2.google
+    gopkgs."golang.org".x.oauth2
+    gopkgs."google.golang.org".grpc
+    gopkgs."google.golang.org".grpc.naming
+    gopkgs."go.opencensus.io".plugin.ochttp
+    gopkgs."go.opencensus.io".trace
+    gopkgs."go.opencensus.io".trace.propagation
+  ];
+}
diff --git a/third_party/gopkgs/google.golang.org/genproto/default.nix b/third_party/gopkgs/google.golang.org/genproto/default.nix
new file mode 100644
index 0000000000..50280296b8
--- /dev/null
+++ b/third_party/gopkgs/google.golang.org/genproto/default.nix
@@ -0,0 +1,14 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "google.golang.org/genproto";
+  src = builtins.fetchGit {
+    url = "https://github.com/google/go-genproto";
+    rev = "0243a4be9c8f1264d238fdc2895620b4d9baf9e1";
+  };
+
+  deps = with pkgs.third_party; [
+    gopkgs."github.com".golang.protobuf.proto.gopkg
+    gopkgs."github.com".golang.protobuf.ptypes.any.gopkg
+  ];
+}
diff --git a/third_party/gopkgs/google.golang.org/grpc/default.nix b/third_party/gopkgs/google.golang.org/grpc/default.nix
new file mode 100644
index 0000000000..badc811c9f
--- /dev/null
+++ b/third_party/gopkgs/google.golang.org/grpc/default.nix
@@ -0,0 +1,21 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "google.golang.org/grpc";
+  src = builtins.fetchGit {
+    url = "https://github.com/grpc/grpc-go";
+    rev = "085c980048876e2735d4aba8f0d5bca4d7acaaa5";
+  };
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+    gopkgs."golang.org".x.net.trace
+    gopkgs."golang.org".x.net.http2
+    gopkgs."golang.org".x.net.http2.hpack
+    gopkgs."golang.org".x.sys.unix
+    gopkgs."github.com".golang.protobuf.proto
+    gopkgs."github.com".golang.protobuf.ptypes
+    gopkgs."github.com".golang.protobuf.ptypes.duration
+    gopkgs."github.com".golang.protobuf.ptypes.timestamp
+    gopkgs."google.golang.org".genproto.googleapis.rpc.status
+  ];
+}
diff --git a/third_party/gopkgs/googlemaps.github.io/maps.nix b/third_party/gopkgs/googlemaps.github.io/maps.nix
new file mode 100644
index 0000000000..4c0ee4fb6d
--- /dev/null
+++ b/third_party/gopkgs/googlemaps.github.io/maps.nix
@@ -0,0 +1,17 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "googlemaps.github.io/maps";
+
+  src = pkgs.third_party.fetchFromGitHub {
+    owner = "googlemaps";
+    repo = "google-maps-services-go";
+    rev = "a46d9fca56ac82caa79408b2417ea93a75e3b986";
+    sha256 = "1zpl85yd3m417060isdlhxzakqkf4f59jgpz3kcjp2i0mkrskkjs";
+  };
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+    gopkgs."github.com".google.uuid
+    gopkgs."golang.org".x.time.rate
+  ];
+}
diff --git a/third_party/gopkgs/gopkg.in/src-d/go-billy/default.nix b/third_party/gopkgs/gopkg.in/src-d/go-billy/default.nix
new file mode 100644
index 0000000000..4272ed7d67
--- /dev/null
+++ b/third_party/gopkgs/gopkg.in/src-d/go-billy/default.nix
@@ -0,0 +1,16 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "gopkg.in/src-d/go-billy.v4";
+
+  src = pkgs.third_party.fetchFromGitHub {
+    owner = "src-d";
+    repo = "go-billy";
+    rev = "fd409ff12f33d0d60af0ce0abeb8d93df360af49";
+    sha256 = "1j0pl6ggzmd2lrqj71vmsnl6cqm43145h7yg6sy3j5n7hhd592qv";
+  };
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+    gopkgs."golang.org".x.sys.unix
+  ];
+}
diff --git a/third_party/gopkgs/gopkg.in/src-d/go-git/default.nix b/third_party/gopkgs/gopkg.in/src-d/go-git/default.nix
new file mode 100644
index 0000000000..75d053f777
--- /dev/null
+++ b/third_party/gopkgs/gopkg.in/src-d/go-git/default.nix
@@ -0,0 +1,31 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  # .v4 is used throughout the codebase and I can't be bothered to do
+  # anything else about it other than using that package path here.
+  path = "gopkg.in/src-d/go-git.v4";
+
+  src = pkgs.third_party.fetchFromGitHub {
+    owner = "src-d";
+    repo = "go-git";
+    rev = "1a7db85bca7027d90afdb5ce711622aaac9feaed";
+    sha256 = "08jl4ljrzzil7c3qcl2y1859nhpgw9ixxy1g40ff7kmq989yhs6v";
+  };
+
+  deps = with pkgs.third_party; map (p: p.gopkg) [
+    gopkgs."github.com".emirpasic.gods.trees.binaryheap
+    gopkgs."github.com".jbenet.go-context.io
+    gopkgs."github.com".kevinburke.ssh_config
+    gopkgs."github.com".mitchellh.go-homedir
+    gopkgs."github.com".sergi.go-diff.diffmatchpatch
+    gopkgs."github.com".src-d.gcfg
+    gopkgs."github.com".xanzy.ssh-agent
+    gopkgs."golang.org".x.crypto.openpgp
+    gopkgs."golang.org".x.crypto.ssh
+    gopkgs."golang.org".x.crypto.ssh.knownhosts
+    gopkgs."golang.org".x.net.proxy
+    gopkgs."gopkg.in".src-d.go-billy
+    gopkgs."gopkg.in".src-d.go-billy.osfs
+    gopkgs."gopkg.in".src-d.go-billy.util
+  ];
+}
diff --git a/third_party/gopkgs/gopkg.in/warnings/default.nix b/third_party/gopkgs/gopkg.in/warnings/default.nix
new file mode 100644
index 0000000000..1299c2b541
--- /dev/null
+++ b/third_party/gopkgs/gopkg.in/warnings/default.nix
@@ -0,0 +1,12 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.external {
+  path = "gopkg.in/warnings.v0";
+
+  src = pkgs.third_party.fetchFromGitHub {
+    owner = "go-warnings";
+    repo = "warnings";
+    rev = "27b9fabbdaf131d2169ec3ff7db8ffc4d839635e";
+    sha256 = "1y276jd9gwvjriz8yd98k3srgbnmbja8f7f7m6lvr0h5sbq3g3w9";
+  };
+}
diff --git a/third_party/lieer/api_client.patch b/third_party/lieer/api_client.patch
new file mode 100644
index 0000000000..cbde914a6b
--- /dev/null
+++ b/third_party/lieer/api_client.patch
@@ -0,0 +1,20 @@
+diff --git a/lieer/remote.py b/lieer/remote.py
+index 6e3973a..62728f7 100644
+--- a/lieer/remote.py
++++ b/lieer/remote.py
+@@ -25,12 +25,12 @@ class Remote:
+   # * https://stackoverflow.com/questions/19615372/client-secret-in-oauth-2-0?rq=1
+   #
+   OAUTH2_CLIENT_SECRET = {
+-        "client_id":"753933720722-ju82fu305lii0v9rdo6mf9hj40l5juv0.apps.googleusercontent.com",
+-        "project_id":"capable-pixel-160614",
++        "client_id":"${CLIENT_ID}",
++        "project_id":"${PROJECT_ID}",
+         "auth_uri":"https://accounts.google.com/o/oauth2/auth",
+         "token_uri":"https://accounts.google.com/o/oauth2/token",
+         "auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs",
+-        "client_secret":"8oudEG0Tvb7YI2V0ykp2Pzz9",
++        "client_secret":"${CLIENT_SECRET}",
+         "redirect_uris":["urn:ietf:wg:oauth:2.0:oob", "http://localhost"]
+     }
+ 
diff --git a/third_party/lieer/default.nix b/third_party/lieer/default.nix
new file mode 100644
index 0000000000..2f58d5f117
--- /dev/null
+++ b/third_party/lieer/default.nix
@@ -0,0 +1,51 @@
+# Lieer is a small tool to synchronise a Gmail account with a local
+# maildir.
+#
+# Lieer is packaged in nixpkgs, but as of 2019-12-23 it is an old
+# version using the previous branding (gmailieer).
+{ pkgs, ... }:
+
+# For a variety of reasons (specific to my setup), custom OAuth2
+# scopes are used.
+#
+# The below client ID is the default for *@tazj.in and is overridden
+# in a private repository for my work account. Publishing it here is
+# not a security issue.
+{
+  clientId ? "515965513093-7b4bo4gm0q09ccsmikkuaas9a40j0jcj.apps.googleusercontent.com",
+  clientSecret ? "3jVbpfT4GmubFD64svctJSdQ",
+  project ? "tazjins-infrastructure"
+}:
+
+with pkgs.third_party;
+
+let
+  authPatch = runCommand "client_secret.patch" {} ''
+    export CLIENT_ID='${clientId}'
+    export CLIENT_SECRET='${clientSecret}'
+    export PROJECT_ID='${project}'
+    cat ${./api_client.patch} | ${gettext}/bin/envsubst > $out
+  '';
+in python3Packages.buildPythonApplication rec {
+  name = "lieer-${version}";
+  version = "1.0";
+
+  src = fetchFromGitHub {
+    owner = "gauteh";
+    repo = "lieer";
+    rev = "v${version}";
+    sha256 = "1zzylv8xbcrh34bz0s29dawzcyx39lai8y8wk0bl4x75v1jfynvf";
+  };
+
+  patches = [
+    authPatch
+    ./send_scope.patch
+  ];
+
+  propagatedBuildInputs = with python3Packages; [
+    notmuch
+    oauth2client
+    google_api_python_client
+    tqdm
+  ];
+}
diff --git a/third_party/lieer/send_scope.patch b/third_party/lieer/send_scope.patch
new file mode 100644
index 0000000000..c882a79ac5
--- /dev/null
+++ b/third_party/lieer/send_scope.patch
@@ -0,0 +1,13 @@
+diff --git a/lieer/remote.py b/lieer/remote.py
+index 6e3973a..ade1082 100644
+--- a/lieer/remote.py
++++ b/lieer/remote.py
+@@ -9,7 +9,7 @@ from oauth2client.file import Storage
+ from pathlib import Path
+ 
+ class Remote:
+-  SCOPES = 'https://www.googleapis.com/auth/gmail.readonly https://www.googleapis.com/auth/gmail.labels https://www.googleapis.com/auth/gmail.modify'
++  SCOPES = 'https://www.googleapis.com/auth/gmail.readonly https://www.googleapis.com/auth/gmail.labels https://www.googleapis.com/auth/gmail.modify https://mail.google.com/'
+   APPLICATION_NAME   = 'Lieer'
+   CLIENT_SECRET_FILE = None
+   authorized         = False
diff --git a/third_party/lisp/alexandria.nix b/third_party/lisp/alexandria.nix
new file mode 100644
index 0000000000..dbe0554d62
--- /dev/null
+++ b/third_party/lisp/alexandria.nix
@@ -0,0 +1,32 @@
+# Alexandria is one of the foundational Common Lisp libraries that
+# pretty much everything depends on:
+#
+# https://common-lisp.net/project/alexandria/
+{ pkgs, ... }:
+
+let src = builtins.fetchGit {
+  url = "https://gitlab.common-lisp.net/alexandria/alexandria";
+  rev = "1224346a48770dc07a68ef3e612b9ac3d611eb07";
+};
+in pkgs.nix.buildLisp.library {
+  name = "alexandria";
+  srcs = map (f: src + ("/" + f)) [
+    "package.lisp"
+    "definitions.lisp"
+    "binding.lisp"
+    "strings.lisp"
+    "conditions.lisp"
+    "symbols.lisp"
+    "macros.lisp"
+    "functions.lisp"
+    "io.lisp"
+    "hash-tables.lisp"
+    "control-flow.lisp"
+    "lists.lisp"
+    "types.lisp"
+    "arrays.lisp"
+    "sequences.lisp"
+    "numbers.lisp"
+    "features.lisp"
+  ];
+}
diff --git a/third_party/lisp/asdf.nix b/third_party/lisp/asdf.nix
new file mode 100644
index 0000000000..3d41a1f36d
--- /dev/null
+++ b/third_party/lisp/asdf.nix
@@ -0,0 +1,9 @@
+# ASDF ships with SBCL. This package just exists to force it to load.
+{ pkgs, ... }:
+
+with pkgs;
+
+nix.buildLisp.library {
+  name = "asdf";
+  srcs = lib.singleton (builtins.toFile "asdf.lisp" "(require 'asdf)");
+}
diff --git a/third_party/lisp/babel.nix b/third_party/lisp/babel.nix
new file mode 100644
index 0000000000..ba367df9ad
--- /dev/null
+++ b/third_party/lisp/babel.nix
@@ -0,0 +1,31 @@
+# Babel is an encoding conversion library for Common Lisp.
+{ pkgs, ... }:
+
+let src = builtins.fetchGit {
+  url = "https://github.com/cl-babel/babel.git";
+  rev = "ec9a17cdbdba3c1dd39609fc7961cfb3f0aa260e";
+};
+in pkgs.nix.buildLisp.library {
+  name = "babel";
+  deps = [ pkgs.third_party.lisp.alexandria ];
+
+  srcs = map (f: src + ("/src/" + f)) [
+    "packages.lisp"
+    "encodings.lisp"
+    "enc-ascii.lisp"
+    "enc-ebcdic.lisp"
+    "enc-ebcdic-int.lisp"
+    "enc-iso-8859.lisp"
+    "enc-unicode.lisp"
+    "enc-cp1251.lisp"
+    "enc-cp1252.lisp"
+    "jpn-table.lisp"
+    "enc-jpn.lisp"
+    "enc-gbk.lisp"
+    "enc-koi8.lisp"
+    "external-format.lisp"
+    "strings.lisp"
+    "gbk-map.lisp"
+    "sharp-backslash.lisp"
+  ];
+}
diff --git a/third_party/lisp/bordeaux-threads.nix b/third_party/lisp/bordeaux-threads.nix
new file mode 100644
index 0000000000..f1e458f4dc
--- /dev/null
+++ b/third_party/lisp/bordeaux-threads.nix
@@ -0,0 +1,20 @@
+# This library is meant to make writing portable multi-threaded apps
+# in Common Lisp simple.
+{ pkgs, ... }:
+
+let src = builtins.fetchGit {
+  url = "https://github.com/sionescu/bordeaux-threads.git";
+  rev = "499b6d3f0ce635417d6096acf0a671d8bf3f6e5f";
+};
+in pkgs.nix.buildLisp.library {
+  name = "bordeaux-threads";
+  deps = [ pkgs.third_party.lisp.alexandria ];
+
+  srcs = map (f: src + ("/src/" + f)) [
+    "pkgdcl.lisp"
+    "bordeaux-threads.lisp"
+    "impl-sbcl.lisp"
+    "condition-variables.lisp"
+    "default-implementations.lisp"
+  ];
+}
diff --git a/third_party/lisp/cffi.nix b/third_party/lisp/cffi.nix
new file mode 100644
index 0000000000..556dee0676
--- /dev/null
+++ b/third_party/lisp/cffi.nix
@@ -0,0 +1,32 @@
+# CFFI purports to be the Common Foreign Function Interface.
+{ pkgs, ... }:
+
+let src = builtins.fetchGit {
+  url = "https://github.com/cffi/cffi.git";
+  rev = "5e838bf46d0089c43ebd3ea014a207c403e29c61";
+};
+in pkgs.nix.buildLisp.library {
+  name = "cffi";
+  deps = with pkgs.third_party.lisp; [
+    alexandria
+    asdf
+    babel
+    trivial-features
+    uiop
+  ];
+
+  srcs = map (f: src + ("/src/" + f)) [
+    "cffi-sbcl.lisp"
+    "package.lisp"
+    "utils.lisp"
+    "libraries.lisp"
+    "early-types.lisp"
+    "types.lisp"
+    "enum.lisp"
+    "strings.lisp"
+    "structures.lisp"
+    "functions.lisp"
+    "foreign-vars.lisp"
+    "features.lisp"
+  ];
+}
diff --git a/third_party/lisp/cl-ansi-text.nix b/third_party/lisp/cl-ansi-text.nix
new file mode 100644
index 0000000000..88fcae318b
--- /dev/null
+++ b/third_party/lisp/cl-ansi-text.nix
@@ -0,0 +1,19 @@
+# Enables ANSI colors for printing.
+{ pkgs, ... }:
+
+let src = builtins.fetchGit {
+  url = "https://github.com/pnathan/cl-ansi-text.git";
+  rev = "257a5f19a2dc92d22f8fd772c0a78923b99b36a8";
+};
+in pkgs.nix.buildLisp.library {
+  name = "cl-ansi-text";
+  deps = with pkgs.third_party.lisp; [
+    alexandria
+    cl-colors2
+  ];
+
+  srcs = map (f: src + ("/src/" + f)) [
+    "cl-ansi-text.lisp"
+    "define-colors.lisp"
+  ];
+}
diff --git a/third_party/lisp/cl-colors2.nix b/third_party/lisp/cl-colors2.nix
new file mode 100644
index 0000000000..44417d7d94
--- /dev/null
+++ b/third_party/lisp/cl-colors2.nix
@@ -0,0 +1,21 @@
+
+{ pkgs, ... }:
+
+let src = builtins.fetchGit {
+  url = "https://notabug.org/cage/cl-colors2.git";
+  rev = "795aedee593b095fecde574bd999b520dd03ed24";
+};
+in pkgs.nix.buildLisp.library {
+  name = "cl-colors2";
+  deps = with pkgs.third_party.lisp; [
+    alexandria
+    cl-ppcre
+  ];
+
+  srcs = map (f: src + ("/" + f)) [
+    "package.lisp"
+    "colors.lisp"
+    "colornames.lisp"
+    "hexcolors.lisp"
+  ];
+}
diff --git a/third_party/lisp/cl-plus-ssl.nix b/third_party/lisp/cl-plus-ssl.nix
new file mode 100644
index 0000000000..1945d8a2e9
--- /dev/null
+++ b/third_party/lisp/cl-plus-ssl.nix
@@ -0,0 +1,38 @@
+# Common Lisp bindings to OpenSSL
+{ pkgs, ... }:
+
+let src = builtins.fetchGit {
+  url = "https://github.com/cl-plus-ssl/cl-plus-ssl.git";
+  rev = "29081992f6d7b4e3aa2c5eeece4cd92b745071f4";
+};
+in pkgs.nix.buildLisp.library {
+  name = "cl-plus-ssl";
+  deps = with pkgs.third_party.lisp; [
+    alexandria
+    bordeaux-threads
+    cffi
+    flexi-streams
+    sb-posix
+    trivial-features
+    trivial-garbage
+    trivial-gray-streams
+    uiop
+  ];
+
+  native = [ pkgs.third_party.openssl ];
+
+  srcs = map (f: src + ("/src/" + f)) [
+    "package.lisp"
+    "reload.lisp"
+    "conditions.lisp"
+    "ffi.lisp"
+    "x509.lisp"
+    "ffi-buffer-all.lisp"
+    "ffi-buffer.lisp"
+    "streams.lisp"
+    "bio.lisp"
+    "random.lisp"
+    "context.lisp"
+    "verify-hostname.lisp"
+  ];
+}
diff --git a/third_party/lisp/cl-ppcre.nix b/third_party/lisp/cl-ppcre.nix
new file mode 100644
index 0000000000..5bf9240104
--- /dev/null
+++ b/third_party/lisp/cl-ppcre.nix
@@ -0,0 +1,30 @@
+# cl-ppcre is a Common Lisp regular expression library.
+{ pkgs, ... }:
+
+let src = builtins.fetchGit {
+  url = "https://github.com/edicl/cl-ppcre";
+  rev = "1ca0cd9ca0d161acd49c463d6cb5fff897596e2f";
+};
+in pkgs.nix.buildLisp.library {
+  name = "prove";
+
+  srcs = map (f: src + ("/" + f)) [
+    "packages.lisp"
+    "specials.lisp"
+    "util.lisp"
+    "errors.lisp"
+    "charset.lisp"
+    "charmap.lisp"
+    "chartest.lisp"
+    "lexer.lisp"
+    "parser.lisp"
+    "regex-class.lisp"
+    "regex-class-util.lisp"
+    "convert.lisp"
+    "optimize.lisp"
+    "closures.lisp"
+    "repetition-closures.lisp"
+    "scanner.lisp"
+    "api.lisp"
+  ];
+}
diff --git a/third_party/lisp/flexi-streams.nix b/third_party/lisp/flexi-streams.nix
new file mode 100644
index 0000000000..56a7f7b92e
--- /dev/null
+++ b/third_party/lisp/flexi-streams.nix
@@ -0,0 +1,34 @@
+# Flexible bivalent streams for Common Lisp
+{ pkgs, ... }:
+
+let src = builtins.fetchGit {
+  url = "https://github.com/edicl/flexi-streams.git";
+  rev = "0fd872ae32022e834ef861a67d86879cf33a6b64";
+};
+in pkgs.nix.buildLisp.library {
+  name = "flexi-streams";
+  deps = [ pkgs.third_party.lisp.trivial-gray-streams ];
+
+  srcs = map (f: src + ("/" + f)) [
+    "packages.lisp"
+    "mapping.lisp"
+    "ascii.lisp"
+    "koi8-r.lisp"
+    "iso-8859.lisp"
+    "code-pages.lisp"
+    "specials.lisp"
+    "util.lisp"
+    "conditions.lisp"
+    "external-format.lisp"
+    "length.lisp"
+    "encode.lisp"
+    "decode.lisp"
+    "in-memory.lisp"
+    "stream.lisp"
+    "output.lisp"
+    "input.lisp"
+    "io.lisp"
+    "strings.lisp"
+ ];
+}
+
diff --git a/third_party/lisp/sb-posix.nix b/third_party/lisp/sb-posix.nix
new file mode 100644
index 0000000000..5fc65d3f59
--- /dev/null
+++ b/third_party/lisp/sb-posix.nix
@@ -0,0 +1,10 @@
+# SB-POSIX is an SBCL component. This package just forces it to be
+# loaded.
+{ pkgs, ... }:
+
+with pkgs;
+
+nix.buildLisp.library {
+  name = "sb-posix";
+  srcs = lib.singleton (builtins.toFile "sb-posix.lisp" "(require 'sb-posix)");
+}
diff --git a/third_party/lisp/trivial-features.nix b/third_party/lisp/trivial-features.nix
new file mode 100644
index 0000000000..c0ff0d2e20
--- /dev/null
+++ b/third_party/lisp/trivial-features.nix
@@ -0,0 +1,12 @@
+{ pkgs, ... }:
+
+let src = builtins.fetchGit {
+  url = "https://github.com/trivial-features/trivial-features.git";
+  rev = "b78b2df5d75bdf8fdfc69f0deec0a187d9664b0b";
+};
+in pkgs.nix.buildLisp.library {
+  name = "trivial-features";
+  srcs = [
+    (src + "/src/tf-sbcl.lisp")
+  ];
+}
diff --git a/third_party/lisp/trivial-garbage.nix b/third_party/lisp/trivial-garbage.nix
new file mode 100644
index 0000000000..8b2b6f0d31
--- /dev/null
+++ b/third_party/lisp/trivial-garbage.nix
@@ -0,0 +1,12 @@
+# trivial-garbage provides a portable API to finalizers, weak
+# hash-tables and weak pointers
+{ pkgs, ... }:
+
+let src = builtins.fetchGit {
+  url = "https://github.com/trivial-garbage/trivial-garbage.git";
+  rev = "dbc8e35acb0176b9a14fdc1027f5ebea93435a84";
+};
+in pkgs.nix.buildLisp.library {
+  name = "trivial-garbage";
+  srcs = [ (src + "/trivial-garbage.lisp") ];
+}
diff --git a/third_party/lisp/trivial-gray-streams.nix b/third_party/lisp/trivial-gray-streams.nix
new file mode 100644
index 0000000000..3d91f81209
--- /dev/null
+++ b/third_party/lisp/trivial-gray-streams.nix
@@ -0,0 +1,16 @@
+# Portability library for CL gray streams.
+{ pkgs, ... }:
+
+let src = builtins.fetchGit {
+  url = "https://github.com/trivial-gray-streams/trivial-gray-streams.git";
+  rev = "ebd59b1afed03b9dc8544320f8f432fdf92ab010";
+};
+in pkgs.nix.buildLisp.library {
+  name = "trivial-gray-streams";
+  srcs = [
+    (src + "/package.lisp")
+    (src + "/streams.lisp")
+  ];
+}
+
+
diff --git a/third_party/lisp/uiop.nix b/third_party/lisp/uiop.nix
new file mode 100644
index 0000000000..1a63041be6
--- /dev/null
+++ b/third_party/lisp/uiop.nix
@@ -0,0 +1,10 @@
+# UIOP ships with SBCL (due to ASDF). This package just exists to
+# force it to load.
+{ pkgs, ... }:
+
+with pkgs;
+
+nix.buildLisp.library {
+  name = "uiop";
+  srcs = lib.singleton (builtins.toFile "uiop.lisp" "(require 'uiop)");
+}
diff --git a/third_party/naersk/default.nix b/third_party/naersk/default.nix
new file mode 100644
index 0000000000..2da96d8266
--- /dev/null
+++ b/third_party/naersk/default.nix
@@ -0,0 +1,9 @@
+{ pkgs, ... }:
+
+let inherit (pkgs.third_party) callPackage fetchFromGitHub;
+in callPackage (fetchFromGitHub {
+  owner = "nmattia";
+  repo = "naersk";
+  rev = "551a2a63399589f97f503ddd8919f27bb2406354";
+  sha256 = "1jrrj4qjwgqa3yjyr0apsz8hlq28rv77ll2w4xmjg2wf4z2fgj0h";
+}) {}
diff --git a/third_party/nixery/default.nix b/third_party/nixery/default.nix
new file mode 100644
index 0000000000..7ef7b644f8
--- /dev/null
+++ b/third_party/nixery/default.nix
@@ -0,0 +1,18 @@
+# Technically I suppose Nixery is not a third-party program, but it's
+# outside of this repository ...
+{ pkgs, ... }:
+
+let src = pkgs.third_party.fetchFromGitHub {
+  owner = "google";
+  repo = "nixery";
+  rev = "4f6ce83f9296545d6c74321b37d18545764c8827";
+  sha256 = "19aiak1pss6vwm0fwn02827l5ir78fkqglfbdl2gchsyv3gps8bg";
+};
+in import src {
+  pkgs = pkgs.third_party;
+  preLaunch = ''
+    export USER=root
+    cachix use tazjin
+  '';
+  extraPackages = with pkgs.third_party; [ cachix openssh ];
+}
diff --git a/third_party/notmuch/default.nix b/third_party/notmuch/default.nix
new file mode 100644
index 0000000000..ddb764b0ae
--- /dev/null
+++ b/third_party/notmuch/default.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }:
+
+pkgs.third_party.originals.notmuch.overrideAttrs(old: {
+  doCheck = false;
+  patches = [ ./dottime.patch ] ++ (if old ? patches then old.patches else []);
+})
diff --git a/third_party/notmuch/dottime.patch b/third_party/notmuch/dottime.patch
new file mode 100644
index 0000000000..c9e0159ca2
--- /dev/null
+++ b/third_party/notmuch/dottime.patch
@@ -0,0 +1,63 @@
+diff --git a/notmuch-time.c b/notmuch-time.c
+index 2734b36a..b1ec4bdc 100644
+--- a/notmuch-time.c
++++ b/notmuch-time.c
+@@ -50,8 +50,8 @@ notmuch_time_relative_date (const void *ctx, time_t then)
+     time_t delta;
+     char *result;
+ 
+-    localtime_r (&now, &tm_now);
+-    localtime_r (&then, &tm_then);
++    gmtime_r (&now, &tm_now);
++    gmtime_r (&then, &tm_then);
+ 
+     result = talloc_zero_size (ctx, RELATIVE_DATE_MAX);
+     if (result == NULL)
+@@ -79,16 +79,16 @@ notmuch_time_relative_date (const void *ctx, time_t then)
+ 	    delta < DAY)
+ 	{
+ 	    strftime (result, RELATIVE_DATE_MAX,
+-		      "Today %R", &tm_then); /* Today 12:30 */
++		      "Today %k·%M", &tm_then); /* Today 12·30 */
+ 	    return result;
+ 	} else if ((tm_now.tm_wday + 7 - tm_then.tm_wday) % 7 == 1) {
+ 	    strftime (result, RELATIVE_DATE_MAX,
+-		      "Yest. %R", &tm_then); /* Yest. 12:30 */
++		      "Yest. %k·%M", &tm_then); /* Yest. 12·30 */
+ 	    return result;
+ 	} else {
+ 	    if (tm_then.tm_wday != tm_now.tm_wday) {
+ 		strftime (result, RELATIVE_DATE_MAX,
+-			  "%a. %R", &tm_then); /* Mon. 12:30 */
++			  "%a. %k·%M", &tm_then); /* Mon. 12·30 */
+ 		return result;
+ 	    }
+ 	}
+diff --git a/util/gmime-extra.c b/util/gmime-extra.c
+index d1bb1d47..9df5a454 100644
+--- a/util/gmime-extra.c
++++ b/util/gmime-extra.c
+@@ -124,7 +124,10 @@ g_mime_message_get_date_string (void *ctx, GMimeMessage *message)
+ {
+     GDateTime* parsed_date = g_mime_message_get_date (message);
+     if (parsed_date) {
+-	char *date = g_mime_utils_header_format_date (parsed_date);
++	char *date = g_date_time_format(
++		parsed_date,
++		"%a, %d %b %Y %H·%M%z"
++	);
+ 	return g_string_talloc_strdup (ctx, date);
+     } else {
+ 	return talloc_strdup(ctx, "Thu, 01 Jan 1970 00:00:00 +0000");
+diff --git a/util/gmime-extra.h b/util/gmime-extra.h
+index b0c8d3d8..40f748f8 100644
+--- a/util/gmime-extra.h
++++ b/util/gmime-extra.h
+@@ -1,5 +1,7 @@
+ #ifndef _GMIME_EXTRA_H
+ #define _GMIME_EXTRA_H
++#include <glib.h>
++#include <glib/gprintf.h>
+ #include <gmime/gmime.h>
+ #include <talloc.h>
+ 
diff --git a/third_party/ormolu/default.nix b/third_party/ormolu/default.nix
new file mode 100644
index 0000000000..eed5c7981e
--- /dev/null
+++ b/third_party/ormolu/default.nix
@@ -0,0 +1,8 @@
+{ pkgs, ... }:
+
+import (pkgs.third_party.fetchFromGitHub {
+  owner = "tweag";
+  repo = "ormolu";
+  rev = "a7076c0f83e5c06ea9067b71171859fa2ba8afd9";
+  sha256 = "1p4n2ja4ciw3qfskn65ggpy37mvgf2sslxqmqn8s8jjarnqcyfny";
+}) { pkgs = pkgs.third_party; }
diff --git a/third_party/telega/default.nix b/third_party/telega/default.nix
new file mode 100644
index 0000000000..4fdf0667ff
--- /dev/null
+++ b/third_party/telega/default.nix
@@ -0,0 +1,22 @@
+# Telega is an Emacs client for Telegram. It requires a native server
+# component to run correctly, which is built by this derivation.
+{ pkgs, ... }:
+
+with pkgs.third_party;
+
+stdenv.mkDerivation {
+  name = "telega";
+  buildInputs = [ tdlib ];
+
+  src = fetchFromGitHub {
+    owner = "zevlg";
+    repo = "telega.el";
+    rev = "d532b16067cf24728a2aa03a7aeaebe2ceac7df4";
+    sha256 = "1s2sd07sin9sy833wqprhbfk5j1d1s4azzvj6d8k68sxlgz8996m";
+  } + "/server";
+
+  installPhase = ''
+    mkdir -p $out/bin
+    mv telega-server $out/bin/
+  '';
+}
diff --git a/third_party/terraform-gcp/default.nix b/third_party/terraform-gcp/default.nix
new file mode 100644
index 0000000000..465b74e4e1
--- /dev/null
+++ b/third_party/terraform-gcp/default.nix
@@ -0,0 +1,3 @@
+{ pkgs, ... }:
+
+pkgs.third_party.terraform_0_12.withPlugins(p: [ p.google p.google-beta ])
diff --git a/tools/blog_cli/README.md b/tools/blog_cli/README.md
new file mode 100644
index 0000000000..7afa0fe920
--- /dev/null
+++ b/tools/blog_cli/README.md
@@ -0,0 +1,41 @@
+tazblog CLI
+===========
+
+My blog stores its content in DNS, spread out over three types of `TXT` entries:
+
+* `TXT _posts.blog.tazj.in.`: A sorted list of posts, serialised as a JSON list of
+  strings (e.g. `["1486830338", "1476807384"]`)
+
+* `TXT _chunks.$postID.blog.tazj.in`: JSON chunks containing the blog post text
+
+* `TXT _meta.$postID.blog.tazj.in`: JSON blob with blog post metadata
+
+All JSON blobs are base64-encoded.
+
+This CLI tool helps to update those records.
+
+Each blog post data is a series of JSON-encoded structures which follow one of
+these formats:
+
+```
+struct metadata {
+    chunks: int
+    title: string
+    date: date
+}
+```
+
+Where `chunks` describes the number of chunks following this format:
+
+```
+struct chunk {
+    c: int
+    t: string
+}
+```
+
+Writing a blog post to DNS means taking its text and metadata, chunking it up
+and writing the chunks.
+
+Reading a blog post means retrieving all data, reading the metadata and then
+assembling the chunks in order.
diff --git a/tools/blog_cli/default.nix b/tools/blog_cli/default.nix
new file mode 100644
index 0000000000..c22e4c949b
--- /dev/null
+++ b/tools/blog_cli/default.nix
@@ -0,0 +1,9 @@
+{ pkgs, ... }:
+
+pkgs.buildGo.program {
+  name = "blog_cli";
+  srcs = [ ./main.go ];
+  deps = with pkgs.third_party; [
+    gopkgs."google.golang.org".api.dns.v1.gopkg
+  ];
+} // { meta.enableCI = true; }
diff --git a/tools/blog_cli/main.go b/tools/blog_cli/main.go
new file mode 100644
index 0000000000..db64f8378e
--- /dev/null
+++ b/tools/blog_cli/main.go
@@ -0,0 +1,209 @@
+// The tazblog CLI implements updating my blog records in DNS, see the
+// README in this folder for details.
+//
+// The post input format is a file with the title on one line,
+// followed by the date on a line, followed by an empty line, followed
+// by the post text.
+package main
+
+import (
+	"context"
+	"encoding/base64"
+	"encoding/json"
+	"flag"
+	"fmt"
+	"io/ioutil"
+	"log"
+	"time"
+
+	"google.golang.org/api/dns/v1"
+)
+
+var (
+	project = flag.String("project", "tazjins-infrastructure", "Target GCP project")
+	zone    = flag.String("zone", "blog-tazj-in", "Target Cloud DNS zone")
+	title   = flag.String("title", "", "Title of the blog post")
+	date    = flag.String("date", "", "Date the post was written on")
+	infile  = flag.String("text", "", "Text file containing the blog post")
+	id      = flag.String("id", "", "Post ID - will be generated if unset")
+)
+
+// Number of runes to include in a single chunk. If any chunks exceed
+// the limit of what can be encoded, the chunk size is reduced and we
+// try again.
+var chunkSize = 200
+
+type day time.Time
+
+func (d day) MarshalJSON() ([]byte, error) {
+	j := (time.Time(d)).Format(`"2006-01-02"`)
+	return []byte(j), nil
+}
+
+type metadata struct {
+	Chunks int    `json:"c"`
+	Title  string `json:"t"`
+	Date   day    `json:"d"`
+}
+
+type chunk struct {
+	Chunk int
+	Text  string
+}
+
+type post struct {
+	ID     string
+	Meta   metadata
+	Chunks []string
+}
+
+func (p *post) writeToDNS() error {
+	var additions []*dns.ResourceRecordSet
+	additions = append(additions, &dns.ResourceRecordSet{
+		Name: fmt.Sprintf("_meta.%s.blog.tazj.in.", p.ID),
+		Type: "TXT",
+		Ttl:  1200,
+		Rrdatas: []string{
+			encodeJSON(p.Meta),
+		},
+	})
+
+	for i, c := range p.Chunks {
+		additions = append(additions, &dns.ResourceRecordSet{
+			Name:    fmt.Sprintf("_%v.%s.blog.tazj.in.", i, p.ID),
+			Type:    "TXT",
+			Ttl:     1200,
+			Rrdatas: []string{c},
+		})
+	}
+
+	ctx := context.Background()
+	dnsSvc, err := dns.NewService(ctx)
+	if err != nil {
+		return err
+	}
+
+	change := dns.Change{
+		Additions: additions,
+	}
+
+	_, err = dnsSvc.Changes.Create(*project, *zone, &change).Do()
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// Encode given value as JSON and base64-encode it.
+func encodeJSON(v interface{}) string {
+	outer, err := json.Marshal(v)
+	if err != nil {
+		log.Fatalln("Failed to encode JSON", err)
+	}
+
+	return base64.RawStdEncoding.EncodeToString(outer)
+}
+
+// Encode a chunk and check whether it is too large
+func encodeChunk(c chunk) (string, bool) {
+	tooLarge := false
+	s := base64.RawStdEncoding.EncodeToString([]byte(c.Text))
+
+	if len(s) >= 255 {
+		tooLarge = true
+	}
+
+	return s, tooLarge
+}
+
+func createPost(id, title, text string, date day) post {
+	runes := []rune(text)
+	n := 0
+	tooLarge := false
+
+	var chunks []string
+
+	for chunkSize < len(runes) {
+		c, l := encodeChunk(chunk{
+			Chunk: n,
+			Text:  string(runes[0:chunkSize:chunkSize]),
+		})
+
+		tooLarge = tooLarge || l
+		chunks = append(chunks, c)
+		runes = runes[chunkSize:]
+		n++
+	}
+
+	if len(runes) > 0 {
+		c, l := encodeChunk(chunk{
+			Chunk: n,
+			Text:  string(runes),
+		})
+
+		tooLarge = tooLarge || l
+		chunks = append(chunks, c)
+		n++
+	}
+
+	if tooLarge {
+		log.Println("Too large at chunk size", chunkSize)
+		chunkSize -= 5
+		return createPost(id, title, text, date)
+	}
+
+	return post{
+		ID: id,
+		Meta: metadata{
+			Chunks: n,
+			Title:  title,
+			Date:   date,
+		},
+		Chunks: chunks,
+	}
+}
+
+func main() {
+	flag.Parse()
+
+	if *title == "" {
+		log.Fatalln("Post title must be set (-title)")
+	}
+
+	if *infile == "" {
+		log.Fatalln("Post text file must be set (-text)")
+	}
+
+	if *id == "" {
+		log.Fatalln("Post ID must be set (-id)")
+	}
+
+	var postDate day
+	if *date != "" {
+		t, err := time.Parse("2006-01-02", *date)
+		if err != nil {
+			log.Fatalln("Invalid post date", err)
+		}
+
+		postDate = day(t)
+	} else {
+		postDate = day(time.Now())
+	}
+
+	t, err := ioutil.ReadFile(*infile)
+	if err != nil {
+		log.Fatalln("Failed to read post:", err)
+	}
+
+	post := createPost(*id, *title, string(t), postDate)
+
+	log.Println("Writing post to DNS ...")
+	err = post.writeToDNS()
+
+	if err != nil {
+		log.Fatalln("Failed to write post:", err)
+	}
+
+	log.Println("Successfully wrote entries")
+}
diff --git a/tools/cheddar/.gitignore b/tools/cheddar/.gitignore
new file mode 100644
index 0000000000..2f7896d1d1
--- /dev/null
+++ b/tools/cheddar/.gitignore
@@ -0,0 +1 @@
+target/
diff --git a/tools/cheddar/.skip-subtree b/tools/cheddar/.skip-subtree
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tools/cheddar/.skip-subtree
diff --git a/tools/cheddar/Cargo.lock b/tools/cheddar/Cargo.lock
new file mode 100644
index 0000000000..227db64fef
--- /dev/null
+++ b/tools/cheddar/Cargo.lock
@@ -0,0 +1,849 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "adler32"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "ansi_term"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "atty"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "backtrace"
+version = "0.3.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "backtrace-sys"
+version = "0.1.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "base64"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "bincode"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "bindgen"
+version = "0.50.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cexpr 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "clang-sys 0.28.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "block-buffer"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "block-padding"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "byte-tools"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "byteorder"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "cc"
+version = "1.0.48"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "cexpr"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "cheddar"
+version = "0.1.0"
+dependencies = [
+ "comrak 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syntect 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "clang-sys"
+version = "0.28.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "clap"
+version = "2.33.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "comrak"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "entities 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pest 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pest_derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "twoway 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "typed-arena 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode_categories 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "digest"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "entities"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "env_logger"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "failure"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "fake-simd"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "flate2"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
+ "miniz_oxide 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "fxhash"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "humantime"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "itoa"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "lazycell"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "libc"
+version = "0.2.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "libloading"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "line-wrap"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "linked-hash-map"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "log"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "maplit"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "memchr"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "nom"
+version = "4.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "onig"
+version = "5.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
+ "onig_sys 69.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "onig_sys"
+version = "69.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bindgen 0.50.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "opaque-debug"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "peeking_take_while"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "pest"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "ucd-trie 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "pest_derive"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "pest 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pest_generator 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "pest_generator"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "pest 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pest_meta 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "pest_meta"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pest 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "pkg-config"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "plist"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "line-wrap 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
+ "xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "0.4.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "quick-error"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "quote"
+version = "0.6.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "ryu"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "safemem"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "same-file"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.104"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "serde_derive"
+version = "1.0.104"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "sha-1"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "shlex"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "strsim"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "syn"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "syntect"
+version = "3.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "onig 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "plist 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)",
+ "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "twoway"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unchecked-index 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "typed-arena"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "typenum"
+version = "1.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "ucd-trie"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "unchecked-index"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "unicode-xid"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "unicode_categories"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "vec_map"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "version_check"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "walkdir"
+version = "2.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "which"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "wincolor"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "xml-rs"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "yaml-rust"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[metadata]
+"checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2"
+"checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d"
+"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
+"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90"
+"checksum backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "924c76597f0d9ca25d762c25a4d369d51267536465dc5064bdf0eb073ed477ea"
+"checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491"
+"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
+"checksum bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf"
+"checksum bindgen 0.50.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cb0e5a5f74b2bafe0b39379f616b5975e08bcaca4e779c078d5c31324147e9ba"
+"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
+"checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
+"checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
+"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
+"checksum cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)" = "f52a465a666ca3d838ebbf08b241383421412fe7ebb463527bba275526d89f76"
+"checksum cexpr 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fce5b5fb86b0c57c20c834c1b412fd09c77c8a59b9473f86272709e78874cd1d"
+"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+"checksum clang-sys 0.28.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81de550971c976f176130da4b2978d3b524eaa0fd9ac31f3ceb5ae1231fb4853"
+"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
+"checksum comrak 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea4c29f52463abf5c7a3ae33dd9b404e2031af82f547cfe65bfac17ba785ea2e"
+"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1"
+"checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
+"checksum entities 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5320ae4c3782150d900b79807611a59a99fc9a1d61d686faafc24b93fc8d7ca"
+"checksum env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3"
+"checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9"
+"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
+"checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f"
+"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
+"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
+"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec"
+"checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
+"checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
+"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
+"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f"
+"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558"
+"checksum libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753"
+"checksum line-wrap 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
+"checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83"
+"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
+"checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
+"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
+"checksum miniz_oxide 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6f3f74f726ae935c3f514300cc6773a0c9492abc5e972d42ba0c0ebb88757625"
+"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6"
+"checksum onig 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e4e723fc996fff1aeab8f62205f3e8528bf498bdd5eadb2784d2d31f30077947"
+"checksum onig_sys 69.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0a8d4efbf5f59cece01f539305191485b651acb3785b9d5eef05749f0496514e"
+"checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
+"checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
+"checksum pest 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e4fb201c5c22a55d8b24fef95f78be52738e5e1361129be1b5e862ecdb6894a"
+"checksum pest_derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0"
+"checksum pest_generator 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9fcf299b5712d06ee128a556c94709aaa04512c4dffb8ead07c5c998447fc0"
+"checksum pest_meta 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "df43fd99896fd72c485fe47542c7b500e4ac1e8700bf995544d1317a60ded547"
+"checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
+"checksum plist 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5f2a9f075f6394100e7c105ed1af73fb1859d6fd14e49d4290d578120beb167f"
+"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
+"checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27"
+"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
+"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
+"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+"checksum regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd"
+"checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716"
+"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
+"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8"
+"checksum safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
+"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421"
+"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449"
+"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64"
+"checksum serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)" = "48c575e0cc52bdd09b47f330f646cf59afc586e9c4e3ccd6fc1f625b8ea1dad7"
+"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68"
+"checksum shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2"
+"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+"checksum syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "dff0acdb207ae2fe6d5976617f887eb1e35a2ba52c13c7234c790960cdad9238"
+"checksum syntect 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "955e9da2455eea5635f7032fc3a229908e6af18c39600313866095e07db0d8b8"
+"checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e"
+"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
+"checksum twoway 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6b40075910de3a912adbd80b5d8bad6ad10a23eeb1f5bf9d4006839e899ba5bc"
+"checksum typed-arena 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9b2228007eba4120145f785df0f6c92ea538f5a3635a612ecf4e334c8c1446d"
+"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9"
+"checksum ucd-trie 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8f00ed7be0c1ff1e24f46c3d2af4859f7e863672ba3a6e92e7cff702bf9f06c2"
+"checksum unchecked-index 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eeba86d422ce181a719445e51872fa30f1f7413b62becb52e95ec91aa262d85c"
+"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479"
+"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
+"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
+"checksum unicode_categories 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
+"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
+"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
+"checksum walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e"
+"checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164"
+"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
+"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9"
+"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+"checksum wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96f5016b18804d24db43cebf3c77269e7569b8954a8464501c216cc5e070eaa9"
+"checksum xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "541b12c998c5b56aa2b4e6f18f03664eef9a4fd0a246a55594efae6cc2d964b5"
+"checksum yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d"
diff --git a/tools/cheddar/Cargo.toml b/tools/cheddar/Cargo.toml
new file mode 100644
index 0000000000..fe936deb4c
--- /dev/null
+++ b/tools/cheddar/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "cheddar"
+version = "0.1.0"
+authors = ["Vincent Ambo <mail@tazj.in>"]
+edition = "2018"
+
+[dependencies]
+comrak = "0.6"
+lazy_static = "1.4"
+syntect = "3.3"
diff --git a/tools/cheddar/README.md b/tools/cheddar/README.md
new file mode 100644
index 0000000000..706f3b62d5
--- /dev/null
+++ b/tools/cheddar/README.md
@@ -0,0 +1,21 @@
+cheddar
+=======
+
+Cheddar is a tiny Rust tool that uses [syntect][] to render source code to
+syntax-highlighted HTML.
+
+It's invocation is compatible with `cgit` filters, i.e. data is read from
+`stdin` and the filename is taken from `argv`:
+
+```shell
+cat README.md | cheddar README.md > README.html
+
+```
+
+In fact, if you are looking at this file on git.tazj.in chances are that it was
+rendered by cheddar.
+
+The name was chosen because I was eyeing a pack of cheddar-flavoured crisps
+while thinking about name selection.
+
+[syntect]: https://github.com/trishume/syntect
diff --git a/tools/cheddar/default.nix b/tools/cheddar/default.nix
new file mode 100644
index 0000000000..ed4814be0a
--- /dev/null
+++ b/tools/cheddar/default.nix
@@ -0,0 +1,20 @@
+{ pkgs, ... }:
+
+with pkgs.third_party;
+
+naersk.buildPackage {
+  src = ./.;
+  doDoc = false;
+  doCheck = false;
+
+  override = x: {
+    # bat contains syntax highlighting packages for a lot more
+    # languages than what ships with syntect, and we can make use of
+    # them!
+    BAT_SYNTAXES = "${bat.src}/assets/syntaxes.bin";
+
+    # LLVM packages (why are they even required?) are not found
+    # automatically if added to buildInputs, hence this ...
+    LIBCLANG_PATH = "${llvmPackages.libclang}/lib/libclang.so.7";
+  };
+}
diff --git a/tools/cheddar/src/main.rs b/tools/cheddar/src/main.rs
new file mode 100644
index 0000000000..d0115d391c
--- /dev/null
+++ b/tools/cheddar/src/main.rs
@@ -0,0 +1,198 @@
+use comrak::nodes::{AstNode, NodeValue, NodeHtmlBlock};
+use comrak::{Arena, parse_document, format_html, ComrakOptions};
+use lazy_static::lazy_static;
+use std::env;
+use std::ffi::OsStr;
+use std::io::BufRead;
+use std::io::Read;
+use std::io;
+use std::path::Path;
+use syntect::dumps::from_binary;
+use syntect::easy::HighlightLines;
+use syntect::highlighting::ThemeSet;
+use syntect::parsing::{SyntaxSet, SyntaxReference};
+use syntect::util::LinesWithEndings;
+
+use syntect::html::{
+    IncludeBackground,
+    append_highlighted_html_for_styled_line,
+    start_highlighted_html_snippet,
+};
+
+lazy_static! {
+    // Load syntaxes & themes lazily. Initialisation might not be
+    // required in the case of Markdown rendering (if there's no code
+    // blocks within the document).
+    static ref SYNTAXES: SyntaxSet = from_binary(include_bytes!(env!("BAT_SYNTAXES")));
+    static ref THEMES: ThemeSet = ThemeSet::load_defaults();
+
+    // Configure Comrak's Markdown rendering with all the bells &
+    // whistles!
+    static ref MD_OPTS: ComrakOptions = ComrakOptions{
+        ext_strikethrough: true,
+        ext_tagfilter: true,
+        ext_table: true,
+        ext_autolink: true,
+        ext_tasklist: true,
+        ext_header_ids: Some(String::new()), // yyeeesss!
+        ext_footnotes: true,
+        ext_description_lists: true,
+        unsafe_: true, // required for tagfilter
+        ..ComrakOptions::default()
+    };
+}
+
+// HTML fragment used when rendering inline blocks in Markdown documents.
+// Emulates the GitHub style (subtle background hue and padding).
+const BLOCK_PRE: &str = "<pre style=\"background-color:#f6f8fa;padding:16px;\">\n";
+
+fn args_extension() -> Option<String> {
+    // The name of the file to be formatted is usually passed in as
+    // the first argument and can be used to determine a syntax set.
+    let args = env::args().collect::<Vec<String>>();
+    if args.len() != 2 {
+        return None
+    }
+
+    Path::new(&args[1]).extension()
+        .and_then(OsStr::to_str)
+        .map(|s| s.to_string())
+}
+
+fn should_continue(res: &io::Result<usize>) -> bool {
+    match *res {
+        Ok(n) => n > 0,
+        Err(_) => false,
+    }
+}
+
+// This function is taken from the Comrak documentation.
+fn iter_nodes<'a, F>(node: &'a AstNode<'a>, f: &F) where F : Fn(&'a AstNode<'a>) {
+    f(node);
+    for c in node.children() {
+        iter_nodes(c, f);
+    }
+}
+
+// Many of the syntaxes in the syntax list have random capitalisations, which
+// means that name matching for the block info of a code block in HTML fails.
+//
+// Instead, try finding a syntax match by comparing case insensitively (for
+// ASCII characters, anyways).
+fn find_syntax_case_insensitive(info: &str) -> Option<&'static SyntaxReference> {
+    SYNTAXES.syntaxes().iter().rev().find(|&s| info.eq_ignore_ascii_case(&s.name))
+}
+
+fn format_markdown() {
+    let document = {
+        let mut buffer = String::new();
+        let stdin = io::stdin();
+        let mut stdin = stdin.lock();
+        stdin.read_to_string(&mut buffer).expect("failed to read stdin");
+        buffer
+    };
+
+    let arena = Arena::new();
+    let root = parse_document(&arena, &document, &MD_OPTS);
+
+    // Syntax highlighting is implemented by traversing the arena and
+    // replacing all code blocks with HTML blocks rendered by syntect.
+    iter_nodes(root, &|node| {
+        let mut ast = node.data.borrow_mut();
+        match &ast.value {
+            NodeValue::CodeBlock(code_block) => {
+                let theme = &THEMES.themes["InspiredGitHub"];
+                let info = String::from_utf8_lossy(&code_block.info);
+
+                let syntax = find_syntax_case_insensitive(&info)
+                    .or_else(|| SYNTAXES.find_syntax_by_extension(&info))
+                    .unwrap_or_else(|| SYNTAXES.find_syntax_plain_text());
+
+                let code = String::from_utf8_lossy(&code_block.literal);
+
+                let rendered = {
+                    // Write the block preamble manually to get exactly the
+                    // desired layout:
+                    let mut hl = HighlightLines::new(syntax, theme);
+                    let mut buf = BLOCK_PRE.to_string();
+
+                    for line in LinesWithEndings::from(&code) {
+                        let regions = hl.highlight(line, &SYNTAXES);
+                        append_highlighted_html_for_styled_line(
+                            &regions[..], IncludeBackground::No, &mut buf,
+                        );
+                    }
+
+                    buf.push_str("</pre>");
+                    buf
+                };
+
+                let block = NodeHtmlBlock {
+                    block_type: 1, // It's unclear what behaviour is toggled by this
+                    literal: rendered.into_bytes(),
+                };
+
+                ast.value = NodeValue::HtmlBlock(block);
+            },
+            _ => (),
+        };
+    });
+
+    format_html(root, &MD_OPTS, &mut io::stdout())
+        .expect("Markdown rendering failed");
+}
+
+fn format_code(extension: Option<&str>) {
+    let stdin = io::stdin();
+    let mut stdin = stdin.lock();
+    let mut linebuf = String::new();
+
+    // Get the first line, we might need it for syntax identification.
+    let mut read_result = stdin.read_line(&mut linebuf);
+
+    // Set up the highlighter
+    let theme = &THEMES.themes["InspiredGitHub"];
+
+    let syntax = extension
+        .and_then(|e| SYNTAXES.find_syntax_by_extension(e))
+        .or_else(|| SYNTAXES.find_syntax_by_first_line(&linebuf))
+        .unwrap_or_else(|| SYNTAXES.find_syntax_plain_text());
+
+    let mut hl = HighlightLines::new(syntax, theme);
+    let (mut outbuf, bg) = start_highlighted_html_snippet(theme);
+
+    // Rather than using the `lines` iterator, read each line manually
+    // and maintain buffer state.
+    //
+    // This is done because the syntax highlighter requires trailing
+    // newlines to be efficient, and those are stripped in the lines
+    // iterator.
+    while should_continue(&read_result) {
+        let regions = hl.highlight(&linebuf, &SYNTAXES);
+
+        append_highlighted_html_for_styled_line(
+            &regions[..],
+            IncludeBackground::IfDifferent(bg),
+            &mut outbuf,
+        );
+
+        // immediately output the current state to avoid keeping
+        // things in memory
+        print!("{}", outbuf);
+
+        // merry go round again
+        linebuf.clear();
+        outbuf.clear();
+        read_result = stdin.read_line(&mut linebuf);
+    }
+
+    println!("</pre>");
+}
+
+fn main() {
+    let extension = args_extension();
+    match extension.as_ref().map(String::as_str) {
+        Some("md") => format_markdown(),
+        extension => format_code(extension),
+    }
+}
diff --git a/tools/emacs-pkgs/dottime/default.nix b/tools/emacs-pkgs/dottime/default.nix
new file mode 100644
index 0000000000..b09756dea5
--- /dev/null
+++ b/tools/emacs-pkgs/dottime/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }:
+
+pkgs.third_party.emacsPackagesNg.trivialBuild rec {
+  pname = "dottime";
+  version = "1.0";
+  src = ./dottime.el;
+}
diff --git a/tools/emacs-pkgs/dottime/dottime.el b/tools/emacs-pkgs/dottime/dottime.el
new file mode 100644
index 0000000000..3500b1c9f4
--- /dev/null
+++ b/tools/emacs-pkgs/dottime/dottime.el
@@ -0,0 +1,82 @@
+;;; dottime.el --- use dottime in the modeline
+;;
+;; Copyright (C) 2019 Google Inc.
+;;
+;; Author: Vincent Ambo <tazjin@google.com>
+;; Version: 1.0
+;; Package-Requires: (cl-lib)
+;;
+;;; Commentary:
+;;
+;; This package changes the display of time in the modeline to use
+;; dottime (see https://dotti.me/) instead of the standard time
+;; display.
+;;
+;; Modeline dottime display is enabled by calling
+;; `dottime-display-mode' and dottime can be used in Lisp code via
+;; `dottime-format'.
+
+(require 'cl-lib)
+(require 'time)
+
+(defun dottime--format-string (&optional offset prefix)
+  "Creates the dottime format string for `format-time-string'
+  based on the local timezone."
+
+  (let* ((offset-sec (or offset (car (current-time-zone))))
+         (offset-hours (/ offset-sec 60 60))
+         (base (concat prefix "%m-%dT%H·%M")))
+    (if (/= offset-hours 0)
+        (concat base (format "%0+3d" offset-hours))
+      base)))
+
+(defun dottime--display-time-update-advice (orig)
+  "Function used as advice to `display-time-update' with a
+  rebound definition of `format-time-string' that renders all
+  timestamps as dottime."
+
+  (cl-letf* ((format-orig (symbol-function 'format-time-string))
+             ((symbol-function 'format-time-string)
+              (lambda (&rest _)
+                (funcall format-orig (dottime--format-string) nil t))))
+    (funcall orig)))
+
+(defun dottime-format (&optional time offset prefix)
+  "Format the given TIME in dottime at OFFSET. If TIME is nil,
+  the current time will be used. PREFIX is prefixed to the format
+  string verbatim.
+
+  OFFSET can be an integer representing an offset in seconds, or
+  the argument can be elided in which case the system time zone
+  is used."
+
+  (format-time-string (dottime--format-string offset prefix) time t))
+
+(defun dottime-display-mode (arg)
+  "Enable time display as dottime. Disables dottime if called
+  with prefix 0 or nil."
+
+  (interactive "p")
+  (if (or (eq arg 0) (eq arg nil))
+      (advice-remove 'display-time-update #'dottime--display-time-update-advice)
+    (advice-add 'display-time-update :around #'dottime--display-time-update-advice))
+  (display-time-update)
+
+  ;; Amend the time display in telega.el to use dottime.
+  ;;
+  ;; This will never display offsets in the chat window, as those are
+  ;; always visible in the modeline anyways.
+  (when (featurep 'telega)
+    (require 'telega)
+    (defun telega-ins--dottime-advice (orig timestamp)
+      (let* ((dtime (decode-time timestamp t))
+             (current-ts (time-to-seconds (current-time)))
+             (ctime (decode-time current-ts))
+             (today00 (telega--time-at00 current-ts ctime)))
+        (if (> timestamp today00)
+            (telega-ins-fmt "%02d·%02d" (nth 2 dtime) (nth 1 dtime))
+          (funcall orig timestamp))))
+
+    (advice-add 'telega-ins--date :around #'telega-ins--dottime-advice)))
+
+(provide 'dottime)
diff --git a/tools/emacs-pkgs/nix-util/default.nix b/tools/emacs-pkgs/nix-util/default.nix
new file mode 100644
index 0000000000..0e314ae719
--- /dev/null
+++ b/tools/emacs-pkgs/nix-util/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }:
+
+pkgs.third_party.emacsPackagesNg.trivialBuild rec {
+  pname = "nix-util";
+  version = "1.0";
+  src = ./nix-util.el;
+}
diff --git a/tools/emacs-pkgs/nix-util/nix-util.el b/tools/emacs-pkgs/nix-util/nix-util.el
new file mode 100644
index 0000000000..533e7e6f34
--- /dev/null
+++ b/tools/emacs-pkgs/nix-util/nix-util.el
@@ -0,0 +1,67 @@
+;;; nix-util.el --- Utilities for dealing with Nix code. -*- lexical-binding: t; -*-
+;;
+;; Copyright (C) 2019 Google Inc.
+;;
+;; Author: Vincent Ambo <tazjin@google.com>
+;; Version: 1.0
+;; Package-Requires: (json map)
+;;
+;;; Commentary:
+;;
+;; This package adds some functionality that I find useful when
+;; working in Nix buffers.
+
+(require 'json)
+(require 'map)
+
+(defun nix/prefetch-github (owner repo) ; TODO(tazjin): support different branches
+  "Fetch the master branch of a GitHub repository and insert the
+  call to `fetchFromGitHub' at point."
+
+  (interactive "sOwner: \nsRepository: ")
+
+  (let* (;; Keep these vars around for output insertion
+         (point (point))
+         (buffer (current-buffer))
+         (name (concat "github-fetcher/" owner "/" repo))
+         (outbuf (format "*%s*" name))
+         (errbuf (get-buffer-create "*github-fetcher/errors*"))
+         (cleanup (lambda ()
+                    (kill-buffer outbuf)
+                    (kill-buffer errbuf)
+                    (with-current-buffer buffer
+                      (read-only-mode -1))))
+         (prefetch-handler
+          (lambda (_process event)
+            (unwind-protect
+                (pcase event
+                  ("finished\n"
+                   (let* ((json-string (with-current-buffer outbuf
+                                         (buffer-string)))
+                          (result (json-parse-string json-string)))
+                     (with-current-buffer buffer
+                       (goto-char point)
+                       (map-let (("rev" rev) ("sha256" sha256)) result
+                         (read-only-mode -1)
+                         (insert (format "fetchFromGitHub {
+  owner = \"%s\";
+  repo = \"%s\";
+  rev = \"%s\";
+  sha256 = \"%s\";
+};" owner repo rev sha256))
+                         (indent-region point (point))))))
+                  (_ (with-current-buffer errbuf
+                       (error "Failed to prefetch %s/%s: %s"
+                              owner repo (buffer-string)))))
+              (funcall cleanup)))))
+
+    ;; Fetching happens asynchronously, but we'd like to make sure the
+    ;; point stays in place while that happens.
+    (read-only-mode)
+    (make-process :name name
+                  :buffer outbuf
+                  :command `("nix-prefetch-github" ,owner ,repo)
+                  :stderr errbuf
+                  :sentinel prefetch-handler)))
+
+(provide 'nix-util)
diff --git a/tools/emacs-pkgs/term-switcher/default.nix b/tools/emacs-pkgs/term-switcher/default.nix
new file mode 100644
index 0000000000..09b5353dc4
--- /dev/null
+++ b/tools/emacs-pkgs/term-switcher/default.nix
@@ -0,0 +1,14 @@
+{ pkgs, ... }:
+
+with pkgs.third_party.emacsPackagesNg;
+
+melpaBuild rec {
+  pname = "term-switcher";
+  version = "1.0";
+  src = ./term-switcher.el;
+  packageRequires = [ dash ivy s vterm ];
+
+  recipe = builtins.toFile "recipe" ''
+    (term-switcher :fetcher github :repo "tazjin/depot")
+  '';
+}
diff --git a/tools/emacs-pkgs/term-switcher/term-switcher.el b/tools/emacs-pkgs/term-switcher/term-switcher.el
new file mode 100644
index 0000000000..67595474fa
--- /dev/null
+++ b/tools/emacs-pkgs/term-switcher/term-switcher.el
@@ -0,0 +1,56 @@
+;;; term-switcher.el --- Easily switch between open vterms
+;;
+;; Copyright (C) 2019 Google Inc.
+;;
+;; Author: Vincent Ambo <tazjin@google.com>
+;; Version: 1.1
+;; Package-Requires: (dash ivy s vterm)
+;;
+;;; Commentary:
+;;
+;; This package adds a function that lets users quickly switch between
+;; different open vterms via ivy.
+
+(require 'dash)
+(require 'ivy)
+(require 's)
+(require 'vterm)
+
+(defgroup term-switcher nil
+  "Customization options `term-switcher'.")
+
+(defcustom term-switcher-buffer-prefix "vterm<"
+  "String prefix for vterm terminal buffers. For example, if you
+  set your titles to match `vterm<...>' a useful prefix might be
+  `vterm<'."
+  :type '(string)
+  :group 'term-switcher)
+
+(defun ts/open-or-create-vterm (buffer-name)
+  "Switch to the buffer with BUFFER-NAME or create a new vterm
+  buffer."
+  (let ((buffer (get-buffer buffer-name)))
+    (if (not buffer)
+        (vterm)
+      (switch-to-buffer buffer))))
+
+(defun ts/is-vterm-buffer (buffer)
+  "Determine whether BUFFER runs a vterm."
+  (equal 'vterm-mode (buffer-local-value 'major-mode buffer)))
+
+(defun ts/switch-to-terminal ()
+  "Switch to an existing vterm buffer or create a new one."
+
+  (interactive)
+  (let ((terms (-map #'buffer-name
+                     (-filter #'ts/is-vterm-buffer (buffer-list)))))
+    (if terms
+        (ivy-read "Switch to vterm: "
+                  (cons "New vterm" terms)
+                  :caller 'ts/switch-to-terminal
+                  :preselect (s-concat "^" term-switcher-buffer-prefix)
+                  :require-match t
+                  :action #'ts/open-or-create-vterm)
+      (vterm))))
+
+(provide 'term-switcher)
diff --git a/tools/emacs/.gitignore b/tools/emacs/.gitignore
new file mode 100644
index 0000000000..7b666905f8
--- /dev/null
+++ b/tools/emacs/.gitignore
@@ -0,0 +1,11 @@
+.smex-items
+*token*
+auto-save-list/
+clones/
+elpa/
+irc.el
+local.el
+other/
+scripts/
+themes/
+*.elc
diff --git a/tools/emacs/README.md b/tools/emacs/README.md
new file mode 100644
index 0000000000..5c66733396
--- /dev/null
+++ b/tools/emacs/README.md
@@ -0,0 +1,7 @@
+tools/emacs
+===========
+
+This sub-folder builds my Emacs configuration, supplying packages from
+Nix and configuration from this folder.
+
+I use Emacs for many things (including as my desktop environment).
diff --git a/tools/emacs/config/bindings.el b/tools/emacs/config/bindings.el
new file mode 100644
index 0000000000..e77af33895
--- /dev/null
+++ b/tools/emacs/config/bindings.el
@@ -0,0 +1,44 @@
+;; Font size
+(define-key global-map (kbd "C-=") 'increase-default-text-scale) ;; '=' because there lies '+'
+(define-key global-map (kbd "C--") 'decrease-default-text-scale)
+(define-key global-map (kbd "C-x C-0") 'set-default-text-scale)
+
+;; What does <tab> do? Well, it depends ...
+(define-key prog-mode-map (kbd "<tab>") #'company-indent-or-complete-common)
+
+;; imenu instead of insert-file
+(global-set-key (kbd "C-x i") 'imenu)
+
+;; Window switching. (C-x o goes to the next window)
+(windmove-default-keybindings) ;; Shift+direction
+
+;; Start eshell or switch to it if it's active.
+(global-set-key (kbd "C-x m") 'eshell)
+
+;; Start a new eshell even if one is active.
+(global-set-key (kbd "C-x C-p") 'ivy-browse-repositories)
+(global-set-key (kbd "M-g M-g") 'goto-line-with-feedback)
+
+;; Miscellaneous editing commands
+(global-set-key (kbd "C-c w") 'whitespace-cleanup)
+(global-set-key (kbd "C-c a") 'align-regexp)
+(global-set-key (kbd "C-c m") 'mc/mark-dwim)
+
+;; Browse URLs (very useful for Gitlab's SSH output!)
+(global-set-key (kbd "C-c b p") 'browse-url-at-point)
+(global-set-key (kbd "C-c b b") 'browse-url)
+
+;; C-x REALLY QUIT (idea by @magnars)
+(global-set-key (kbd "C-x r q") 'save-buffers-kill-terminal)
+(global-set-key (kbd "C-x C-c") 'ignore)
+
+;; Open Fefes Blog
+(global-set-key (kbd "C-c C-f") 'fefes-blog)
+
+;; Open a file in project:
+(global-set-key (kbd "C-c f") 'project-find-file)
+
+;; Insert TODO comments
+(global-set-key (kbd "C-c t") 'insert-todo-comment)
+
+(provide 'bindings)
diff --git a/tools/emacs/config/custom.el b/tools/emacs/config/custom.el
new file mode 100644
index 0000000000..a157c7a5fa
--- /dev/null
+++ b/tools/emacs/config/custom.el
@@ -0,0 +1,52 @@
+(custom-set-variables
+ ;; custom-set-variables was added by Custom.
+ ;; If you edit it by hand, you could mess it up, so be careful.
+ ;; Your init file should contain only one such instance.
+ ;; If there is more than one, they won't work right.
+ '(ac-auto-show-menu 0.8)
+ '(ac-delay 0.2)
+ '(avy-background t)
+ '(cargo-process--custom-path-to-bin "env CARGO_INCREMENTAL=1 cargo")
+ '(cargo-process--enable-rust-backtrace 1)
+ '(company-auto-complete (quote (quote company-explicit-action-p)))
+ '(company-idle-delay 0.5)
+ '(custom-enabled-themes (quote (gruber-darker)))
+ '(custom-safe-themes
+   (quote
+    ("d61fc0e6409f0c2a22e97162d7d151dee9e192a90fa623f8d6a071dbf49229c6" "3c83b3676d796422704082049fc38b6966bcad960f896669dfc21a7a37a748fa" "89336ca71dae5068c165d932418a368a394848c3b8881b2f96807405d8c6b5b6" default)))
+ '(display-time-default-load-average nil)
+ '(display-time-interval 30)
+ '(elnode-send-file-program "/run/current-system/sw/bin/cat")
+ '(frame-brackground-mode (quote dark))
+ '(global-auto-complete-mode t)
+ '(kubernetes-commands-display-buffer-function (quote display-buffer))
+ '(lsp-gopls-server-path "/home/tazjin/go/bin/gopls")
+ '(magit-log-show-gpg-status t)
+ '(ns-alternate-modifier (quote none))
+ '(ns-command-modifier (quote control))
+ '(ns-right-command-modifier (quote meta))
+ '(require-final-newline (quote visit-save))
+ '(tls-program (quote ("gnutls-cli --x509cafile %t -p %p %h"))))
+(custom-set-faces
+ ;; custom-set-faces was added by Custom.
+ ;; If you edit it by hand, you could mess it up, so be careful.
+ ;; Your init file should contain only one such instance.
+ ;; If there is more than one, they won't work right.
+ '(default ((t (:foreground "#e4e4ef" :background "#181818"))))
+ '(rainbow-delimiters-depth-1-face ((t (:foreground "#2aa198"))))
+ '(rainbow-delimiters-depth-2-face ((t (:foreground "#b58900"))))
+ '(rainbow-delimiters-depth-3-face ((t (:foreground "#268bd2"))))
+ '(rainbow-delimiters-depth-4-face ((t (:foreground "#dc322f"))))
+ '(rainbow-delimiters-depth-5-face ((t (:foreground "#859900"))))
+ '(rainbow-delimiters-depth-6-face ((t (:foreground "#268bd2"))))
+ '(rainbow-delimiters-depth-7-face ((t (:foreground "#cb4b16"))))
+ '(rainbow-delimiters-depth-8-face ((t (:foreground "#d33682"))))
+ '(rainbow-delimiters-depth-9-face ((t (:foreground "#839496"))))
+ '(term-color-black ((t (:background "#282828" :foreground "#282828"))))
+ '(term-color-blue ((t (:background "#96a6c8" :foreground "#96a6c8"))))
+ '(term-color-cyan ((t (:background "#1fad83" :foreground "#1fad83"))))
+ '(term-color-green ((t (:background "#73c936" :foreground "#73c936"))))
+ '(term-color-magenta ((t (:background "#9e95c7" :foreground "#9e95c7"))))
+ '(term-color-red ((t (:background "#f43841" :foreground "#f43841"))))
+ '(term-color-white ((t (:background "#f5f5f5" :foreground "#f5f5f5"))))
+ '(term-color-yellow ((t (:background "#ffdd33" :foreground "#ffdd33")))))
diff --git a/tools/emacs/config/desktop.el b/tools/emacs/config/desktop.el
new file mode 100644
index 0000000000..d923ab584c
--- /dev/null
+++ b/tools/emacs/config/desktop.el
@@ -0,0 +1,213 @@
+;; -*- lexical-binding: t; -*-
+;;
+;; Configure desktop environment settings, including both
+;; window-management (EXWM) as well as additional system-wide
+;; commands.
+
+(require 's)
+(require 'f)
+(require 'dash)
+(require 'exwm)
+(require 'exwm-config)
+(require 'exwm-randr)
+(require 'exwm-systemtray)
+
+(defun pactl (cmd)
+  (shell-command (concat "pactl " cmd))
+  (message "Volume command: %s" cmd))
+
+(defun volume-mute () (interactive) (pactl "set-sink-mute @DEFAULT_SINK@ toggle"))
+(defun volume-up () (interactive) (pactl "set-sink-volume @DEFAULT_SINK@ +5%"))
+(defun volume-down () (interactive) (pactl "set-sink-volume @DEFAULT_SINK@ -5%"))
+
+(defun brightness-up ()
+  (interactive)
+  (shell-command "xbacklight -inc 5")
+  (message "Brightness increased"))
+
+(defun brightness-down ()
+  (interactive)
+  (shell-command "xbacklight -dec 5")
+  (message "Brightness decreased"))
+
+(defun lock-screen ()
+  (interactive)
+  ;; A sudoers configuration is in place that lets me execute this
+  ;; particular command without having to enter a password.
+  ;;
+  ;; The reason for things being set up this way is that I want
+  ;; xsecurelock.service to be started as a system-wide service that
+  ;; is tied to suspend.target.
+  (shell-command "/usr/bin/sudo /usr/bin/systemctl start xsecurelock.service"))
+
+(defun generate-randr-config (primary secondary)
+  (-flatten `(,(-map (lambda (n) (list n primary)) (number-sequence 1 7))
+              (0 secondary)
+              ,(-map (lambda (n) (list n secondary)) (number-sequence 8 9)))))
+
+(defun randr-layout-dp1-extend ()
+  "Layout for connecting my X1 Carbon to my screen at home."
+
+  (interactive)
+  (setq exwm-randr-workspace-monitor-plist (generate-randr-config "DP1-1" "eDP1"))
+  (exwm-randr-refresh)
+  (shell-command "xrandr --output DP1-1 --right-of eDP1 --auto --primary"))
+
+(defun randr-layout-hdmi1-extend ()
+  "Office layout for The Big Screen(tm)"
+
+  (interactive)
+  (setq exwm-randr-workspace-monitor-plist (generate-randr-config "HDMI1" "eDP1"))
+  (exwm-randr-refresh)
+  (shell-command "xrandr --output HDMI1 --dpi 144 --auto --right-of eDP1 --primary")
+  (set-default-text-scale nil 165))
+
+(defun randr-layout-single ()
+  "Laptop screen only!"
+
+  (interactive)
+  (shell-command "xrandr --output HDMI1 --off")
+  (shell-command "xrandr --output DP1-1 --off")
+  (exwm-randr-refresh)
+  (set-default-text-scale nil))
+
+(defun set-xkb-layout (layout)
+  "Set the current X keyboard layout."
+
+  (shell-command (format "setxkbmap %s" layout))
+  (message "Set X11 keyboard layout to '%s'" layout))
+
+(defun create-window-name ()
+  "Construct window names to be used for EXWM buffers by
+  inspecting the window's X11 class and title.
+
+  A lot of commonly used applications either create titles that
+  are too long by default, or in the case of web
+  applications (such as Cider) end up being constructed in
+  awkward ways.
+
+  To avoid this issue, some rewrite rules are applied for more
+  human-accessible titles."
+
+  (pcase (list (or exwm-class-name "unknown") (or exwm-title "unknown"))
+    ;; In Cider windows, rename the class and keep the workspace/file
+    ;; as the title.
+    (`("Google-chrome" ,(and (pred (lambda (title) (s-ends-with? " - Cider" title))) title))
+     (format "Cider<%s>" (s-chop-suffix " - Cider" title)))
+
+    ;; Attempt to detect IRCCloud windows via their title, which is a
+    ;; combination of the channel name and network.
+    ;;
+    ;; This is what would often be referred to as a "hack". The regexp
+    ;; will not work if a network connection buffer is selected in
+    ;; IRCCloud, but since the title contains no other indication that
+    ;; we're dealing with an IRCCloud window
+    (`("Google-chrome"
+       ,(and (pred (lambda (title)
+                     (s-matches? "^[\*\+]\s#[a-zA-Z0-9/\-]+\s\|\s[a-zA-Z\.]+$" title)))
+             title))
+     (format "IRCCloud<%s>" title))
+
+    ;; For other Chrome windows, make the title shorter.
+    (`("Google-chrome" ,title)
+     (format "Chrome<%s>" (s-truncate 42 (s-chop-suffix " - Google Chrome" title))))
+
+    ;; Gnome-terminal -> Term
+    (`("Gnome-terminal" ,title)
+     ;; fish-shell buffers contain some unnecessary whitespace and
+     ;; such before the current working directory. This can be
+     ;; stripped since most of my terminals are fish shells anyways.
+     (format "Term<%s>" (s-trim-left (s-chop-prefix "fish" title))))
+
+    ;; For any other application, a name is constructed from the
+    ;; window's class and name.
+    (`(,class ,title) (format "%s<%s>" class (s-truncate 12 title)))))
+
+;; EXWM launch configuration
+;;
+;; This used to use use-package, but when something breaks use-package
+;; it doesn't exactly make debugging any easier.
+
+(let ((titlef (lambda ()
+                (exwm-workspace-rename-buffer (create-window-name)))))
+  (add-hook 'exwm-update-class-hook titlef)
+  (add-hook 'exwm-update-title-hook titlef))
+
+(fringe-mode 3)
+(exwm-enable)
+
+;; 's-N': Switch to certain workspace
+(setq exwm-workspace-number 10)
+(dotimes (i 10)
+  (exwm-input-set-key (kbd (format "s-%d" i))
+                      `(lambda ()
+                         (interactive)
+                         (exwm-workspace-switch-create ,i))))
+
+;; Launch applications / any command  with completion (dmenu style!)
+(exwm-input-set-key (kbd "s-d") #'counsel-linux-app)
+(exwm-input-set-key (kbd "s-x") #'ivy-run-external-command)
+(exwm-input-set-key (kbd "s-p") #'ivy-password-store)
+
+;; Add X11 terminal selector to a key
+(exwm-input-set-key (kbd "C-x t") #'ts/switch-to-terminal)
+
+;; Toggle between line-mode / char-mode
+(exwm-input-set-key (kbd "C-c C-t C-t") #'exwm-input-toggle-keyboard)
+
+;; Volume keys
+(exwm-input-set-key (kbd "<XF86AudioMute>") #'volume-mute)
+(exwm-input-set-key (kbd "<XF86AudioRaiseVolume>") #'volume-up)
+(exwm-input-set-key (kbd "<XF86AudioLowerVolume>") #'volume-down)
+
+;; Brightness keys
+(exwm-input-set-key (kbd "<XF86MonBrightnessDown>") #'brightness-down)
+(exwm-input-set-key (kbd "<XF86MonBrightnessUp>") #'brightness-up)
+(exwm-input-set-key (kbd "<XF86Display>") #'lock-screen)
+
+;; Keyboard layouts (these are bound separately in Cyrillic
+;; because I don't use reverse-im)
+;; (-map
+;;  (lambda (pair)
+;;    (exwm-input-set-key
+;;     (kbd (format "s-%s" (cadr pair)))
+;;     `(lambda () (interactive) (set-xkb-layout ,(car pair)))))
+;;  '(("de" "k d")
+;;    ("de" "л в")
+;;    ("no" "k n")
+;;    ("no" "л т")
+;;    ("ru" "k r")
+;;    ("ru" "л к")
+;;    ("us" "k u")
+;;    ("us" "л г")))
+
+;; Line-editing shortcuts
+(exwm-input-set-simulation-keys
+ '(([?\C-d] . delete)
+   ([?\C-w] . ?\C-c)))
+
+;; Show time & battery status in the mode line
+(display-time-mode)
+(display-battery-mode)
+
+;; enable display of X11 system tray within Emacs
+(exwm-systemtray-enable)
+
+;; Configure xrandr (multi-monitor setup)
+(setq exwm-randr-workspace-monitor-plist (generate-randr-config "HDMI1" "eDP1"))
+(exwm-randr-enable)
+
+;; Let buffers move seamlessly between workspaces by making them
+;; accessible in selectors on all frames.
+(setq exwm-workspace-show-all-buffers t)
+(setq exwm-layout-show-all-buffers t)
+
+;; Monitor layouts
+;;
+;; TODO(tazjin): Desired layout should be inferred based on
+;; connected screens - autorandr or something?
+(exwm-input-set-key (kbd "s-m d") #'randr-layout-dp1-extend)
+(exwm-input-set-key (kbd "s-m h") #'randr-layout-hdmi1-extend)
+(exwm-input-set-key (kbd "s-m s") #'randr-layout-single)
+
+(provide 'desktop)
diff --git a/tools/emacs/config/eshell-setup.el b/tools/emacs/config/eshell-setup.el
new file mode 100644
index 0000000000..0b23c5a2d1
--- /dev/null
+++ b/tools/emacs/config/eshell-setup.el
@@ -0,0 +1,68 @@
+;; EShell configuration
+
+(require 'eshell)
+
+;; Generic settings
+;; Hide banner message ...
+(setq eshell-banner-message "")
+
+;; Prompt configuration
+(defun clean-pwd (path)
+  "Turns a path of the form /foo/bar/baz into /f/b/baz
+   (inspired by fish shell)"
+  (let* ((hpath (replace-regexp-in-string home-dir
+                                          "~"
+                                          path))
+         (current-dir (split-string hpath "/"))
+	 (cdir (last current-dir))
+	 (head (butlast current-dir)))
+    (concat (mapconcat (lambda (s)
+			 (if (string= "" s) nil
+			   (substring s 0 1)))
+		       head
+		       "/")
+	    (if head "/" nil)
+	    (car cdir))))
+
+(defun vcprompt (&optional args)
+  "Call the external vcprompt command with optional arguments.
+   VCPrompt"
+  (replace-regexp-in-string
+   "\n" ""
+   (shell-command-to-string (concat  "vcprompt" args))))
+
+(defmacro with-face (str &rest properties)
+  `(propertize ,str 'face (list ,@properties)))
+
+(defun prompt-f ()
+  "EShell prompt displaying VC info and such"
+  (concat
+   (with-face (concat (clean-pwd (eshell/pwd)) " ") :foreground  "#96a6c8")
+   (if (= 0 (user-uid))
+       (with-face "#" :foreground "#f43841")
+     (with-face "$" :foreground "#73c936"))
+   (with-face " " :foreground "#95a99f")))
+
+
+(setq eshell-prompt-function 'prompt-f)
+(setq eshell-highlight-prompt nil)
+(setq eshell-prompt-regexp "^.+? \\((\\(git\\|svn\\|hg\\|darcs\\|cvs\\|bzr\\):.+?) \\)?[$#] ")
+
+;; Ignore version control folders in autocompletion
+(setq eshell-cmpl-cycle-completions nil
+      eshell-save-history-on-exit t
+      eshell-cmpl-dir-ignore "\\`\\(\\.\\.?\\|CVS\\|\\.svn\\|\\.git\\)/\\'")
+
+;; Load some EShell extensions
+(eval-after-load 'esh-opt
+  '(progn
+     (require 'em-term)
+     (require 'em-cmpl)
+     ;; More visual commands!
+     (add-to-list 'eshell-visual-commands "ssh")
+     (add-to-list 'eshell-visual-commands "tail")
+     (add-to-list 'eshell-visual-commands "sl")))
+
+(setq eshell-directory-name "~/.config/eshell/")
+
+(provide 'eshell-setup)
diff --git a/tools/emacs/config/functions.el b/tools/emacs/config/functions.el
new file mode 100644
index 0000000000..a7889ca915
--- /dev/null
+++ b/tools/emacs/config/functions.el
@@ -0,0 +1,241 @@
+(defun load-file-if-exists (filename)
+  (if (file-exists-p filename)
+      (load filename)))
+
+(defun goto-line-with-feedback ()
+  "Show line numbers temporarily, while prompting for the line number input"
+  (interactive)
+  (unwind-protect
+      (progn
+        (setq-local display-line-numbers t)
+        (let ((target (read-number "Goto line: ")))
+          (avy-push-mark)
+          (goto-line target)))
+    (setq-local display-line-numbers nil)))
+
+;; These come from the emacs starter kit
+
+(defun esk-add-watchwords ()
+  (font-lock-add-keywords
+   nil '(("\\<\\(FIX\\(ME\\)?\\|TODO\\|DEBUG\\|HACK\\|REFACTOR\\|NOCOMMIT\\)"
+          1 font-lock-warning-face t))))
+
+(defun esk-sudo-edit (&optional arg)
+  (interactive "p")
+  (if (or arg (not buffer-file-name))
+      (find-file (concat "/sudo:root@localhost:" (read-file-name "File: ")))
+    (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))
+
+;; Open Fefes blog
+(defun fefes-blog ()
+  (interactive)
+  (eww "https://blog.fefe.de/"))
+
+;; Open the NixOS man page
+(defun nixos-man ()
+  (interactive)
+  (man "configuration.nix"))
+
+;; Open my monorepo in magit
+(defun depot-status ()
+  (interactive)
+  (magit-status "~/depot"))
+
+;; Get the nix store path for a given derivation.
+;; If the derivation has not been built before, this will trigger a build.
+(defun nix-store-path (derivation)
+  (let ((expr (concat "with import <nixos> {}; " derivation)))
+    (s-chomp (shell-command-to-string (concat "nix-build -E '" expr "'")))))
+
+(defun insert-nix-store-path ()
+  (interactive)
+  (let ((derivation (read-string "Derivation name (in <nixos>): ")))
+    (insert (nix-store-path derivation))))
+
+(defun toggle-force-newline ()
+  "Buffer-local toggle for enforcing final newline on save."
+  (interactive)
+  (setq-local require-final-newline (not require-final-newline))
+  (message "require-final-newline in buffer %s is now %s"
+           (buffer-name)
+           require-final-newline))
+
+;; Helm includes a command to run external applications, which does
+;; not seem to exist in ivy. This implementation uses some of the
+;; logic from Helm to provide similar functionality using ivy.
+(defun list-external-commands ()
+  "Creates a list of all external commands available on $PATH
+  while filtering NixOS wrappers."
+  (cl-loop
+   for dir in (split-string (getenv "PATH") path-separator)
+   when (and (file-exists-p dir) (file-accessible-directory-p dir))
+   for lsdir = (cl-loop for i in (directory-files dir t)
+                        for bn = (file-name-nondirectory i)
+                        when (and (not (s-contains? "-wrapped" i))
+                                  (not (member bn completions))
+                                  (not (file-directory-p i))
+                                  (file-executable-p i))
+                        collect bn)
+   append lsdir into completions
+   finally return (sort completions 'string-lessp)))
+
+(defvar external-command-flag-overrides
+  '(("google-chrome" . "--force-device-scale-factor=1.4"))
+
+  "This setting lets me add additional flags to specific commands
+  that are run interactively via `ivy-run-external-command'.")
+
+(defun run-external-command (cmd)
+  "Execute the specified command and notify the user when it
+  finishes."
+    (let* ((extra-flags (cdr (assoc cmd external-command-flag-overrides)))
+           (cmd (if extra-flags (s-join " " (list cmd extra-flags)) cmd)))
+      (message "Starting %s..." cmd)
+      (set-process-sentinel
+       (start-process-shell-command cmd nil cmd)
+       (lambda (process event)
+         (when (string= event "finished\n")
+           (message "%s process finished." process))))))
+
+(defun ivy-run-external-command ()
+  "Prompts the user with a list of all installed applications and
+  lets them select one to launch."
+
+  (interactive)
+  (let ((external-commands-list (list-external-commands)))
+    (ivy-read "Command:" external-commands-list
+              :require-match t
+              :history 'external-commands-history
+              :action #'run-external-command)))
+
+(defun ivy-password-store (&optional password-store-dir)
+  "Custom version of password-store integration with ivy that
+  actually uses the GPG agent correctly."
+
+  (interactive)
+  (ivy-read "Copy password of entry: "
+            (password-store-list (or password-store-dir (password-store-dir)))
+            :require-match t
+            :keymap ivy-pass-map
+            :action (lambda (entry)
+                      (let ((password (auth-source-pass-get 'secret entry)))
+                        (password-store-clear)
+                        (kill-new password)
+                        (setq password-store-kill-ring-pointer kill-ring-yank-pointer)
+                        (message "Copied %s to the kill ring. Will clear in %s seconds."
+                                 entry (password-store-timeout))
+                        (setq password-store-timeout-timer
+                              (run-at-time (password-store-timeout)
+                                           nil 'password-store-clear))))))
+
+(defun ivy-browse-repositories ()
+  "Select a git repository and open its associated magit buffer."
+
+  (interactive)
+  (ivy-read "Repository: "
+            (magit-list-repos)
+            :require-match t
+            :sort t
+            :action #'magit-status))
+
+(defun bottom-right-window-p ()
+  "Determines whether the last (i.e. bottom-right) window of the
+  active frame is showing the buffer in which this function is
+  executed."
+  (let* ((frame (selected-frame))
+         (right-windows (window-at-side-list frame 'right))
+         (bottom-windows (window-at-side-list frame 'bottom))
+         (last-window (car (seq-intersection right-windows bottom-windows))))
+    (eq (current-buffer) (window-buffer last-window))))
+
+(defhydra mc/mark-more-hydra (:color pink)
+  ("<up>" mmlte--up "Mark previous like this")
+  ("<down>" mc/mmlte--down "Mark next like this")
+  ("<left>" mc/mmlte--left (if (eq mc/mark-more-like-this-extended-direction 'up)
+                               "Skip past the cursor furthest up"
+                             "Remove the cursor furthest down"))
+  ("<right>" mc/mmlte--right (if (eq mc/mark-more-like-this-extended-direction 'up)
+                                 "Remove the cursor furthest up"
+                               "Skip past the cursor furthest down"))
+  ("f" nil "Finish selecting"))
+
+;; Mute the message that mc/mmlte wants to print on its own
+(advice-add 'mc/mmlte--message :around (lambda (&rest args) (ignore)))
+
+(defun mc/mark-dwim (arg)
+  "Select multiple things, but do what I mean."
+
+  (interactive "p")
+  (if (not (region-active-p)) (mc/mark-next-lines arg)
+    (if (< 1 (count-lines (region-beginning)
+                          (region-end)))
+        (mc/edit-lines arg)
+      ;; The following is almost identical to `mc/mark-more-like-this-extended',
+      ;; but uses a hydra (`mc/mark-more-hydra') instead of a transient key map.
+      (mc/mmlte--down)
+      (mc/mark-more-hydra/body))))
+
+(defun memespace-region ()
+  "Make a meme out of it."
+
+  (interactive)
+  (let* ((start (region-beginning))
+         (end (region-end))
+         (memed
+          (message
+           (s-trim-right
+            (apply #'string
+                   (-flatten
+                    (nreverse
+                     (-reduce-from (lambda (acc x)
+                                     (cons (cons x (-repeat (+ 1 (length acc)) 32)) acc))
+                                   '()
+                                   (string-to-list (buffer-substring-no-properties start end))))))))))
+
+    (save-excursion (delete-region start end)
+                    (goto-char start)
+                    (insert memed))))
+
+(defun insert-todo-comment (prefix todo)
+  "Insert a comment at point with something for me to do."
+
+  (interactive "P\nsWhat needs doing? ")
+  (save-excursion
+    (move-end-of-line nil)
+    (insert (format " %s TODO(%s): %s"
+                    (s-trim-right comment-start)
+                    (if prefix (read-string "Who needs to do this? ")
+                      (getenv "USER"))
+                    todo))))
+
+;; Custom text scale adjustment functions that operate on the entire instance
+(defun modify-text-scale (factor)
+  (set-face-attribute 'default nil
+                      :height (+ (* factor 5) (face-attribute 'default :height))))
+
+(defun increase-default-text-scale (prefix)
+  "Increase default text scale in all Emacs frames, or just the
+  current frame if PREFIX is set."
+
+  (interactive "P")
+  (if prefix (text-scale-increase 1)
+    (modify-text-scale 1)))
+
+(defun decrease-default-text-scale (prefix)
+  "Increase default text scale in all Emacs frames, or just the
+  current frame if PREFIX is set."
+
+  (interactive "P")
+  (if prefix (text-scale-decrease 1)
+    (modify-text-scale -1)))
+
+(defun set-default-text-scale (prefix &optional to)
+  "Set the default text scale to the specified value, or the
+  default. Restores current frame's text scale only, if PREFIX is
+  set."
+
+  (interactive "P")
+  (if prefix (text-scale-adjust 0)
+    (set-face-attribute 'default nil :height (or to 120))))
+
+(provide 'functions)
diff --git a/tools/emacs/config/init.el b/tools/emacs/config/init.el
new file mode 100644
index 0000000000..eac109f985
--- /dev/null
+++ b/tools/emacs/config/init.el
@@ -0,0 +1,229 @@
+;;; init.el --- Package bootstrapping. -*- lexical-binding: t; -*-
+
+;; Packages are installed via Nix configuration, this file only
+;; initialises the newly loaded packages.
+
+(require 'use-package)
+(require 'seq)
+
+(package-initialize)
+
+;; Initialise all packages installed via Nix.
+;;
+;; TODO: Generate this section in Nix for all packages that do not
+;; require special configuration.
+
+;;
+;; Packages providing generic functionality.
+;;
+
+(use-package ace-window
+  :bind (("C-x o" . ace-window))
+  :config
+  (setq aw-keys '(?f ?j ?d ?k ?s ?l ?a)
+        aw-scope 'frame))
+
+(use-package auth-source-pass :config (auth-source-pass-enable))
+
+(use-package avy
+  :bind (("M-j" . avy-goto-char)
+         ("M-p" . avy-pop-mark)
+         ("M-g g" . avy-goto-line)))
+
+(use-package browse-kill-ring)
+
+(use-package company
+  :hook ((prog-mode . company-mode))
+  :config (setq company-tooltip-align-annotations t))
+
+(use-package counsel
+  :after (ivy)
+  :config (counsel-mode 1)
+  :bind (("C-c r g" . counsel-rg)))
+
+(use-package dash)
+(use-package dash-functional)
+
+(use-package dottime
+  :demand
+  :after (notmuch telega)
+  :config (dottime-display-mode t))
+
+(use-package gruber-darker-theme)
+(use-package ht)
+(use-package hydra)
+(use-package idle-highlight-mode :hook ((prog-mode . idle-highlight-mode)))
+
+(use-package ivy
+  :config
+  (ivy-mode 1)
+  (setq enable-recursive-minibuffers t)
+  (setq ivy-use-virtual-buffers t))
+
+(use-package ivy-pass :after (ivy))
+
+(use-package ivy-prescient
+  :after (ivy prescient)
+  :config
+  (ivy-prescient-mode)
+  ;; Fixes an issue with how regexes are passed to ripgrep from counsel,
+  ;; see raxod502/prescient.el#43
+  (setf (alist-get 'counsel-rg ivy-re-builders-alist) #'ivy--regex-plus))
+
+(use-package multiple-cursors)
+
+(use-package notmuch
+  :bind (:map global-map ("s-g m" . notmuch)) ;; g m -> gmail
+  :config
+  (setq notmuch-search-oldest-first nil))
+
+(use-package paredit :hook ((lisp-mode . paredit-mode)
+                            (emacs-lisp-mode . paredit-mode)))
+
+(use-package pinentry
+  :config
+  (setq epa-pinentry-mode 'loopback)
+  (pinentry-start))
+
+(use-package prescient
+  :after (ivy counsel)
+  :config (prescient-persist-mode))
+
+(use-package rainbow-delimiters :hook (prog-mode . rainbow-delimiters-mode))
+(use-package rainbow-mode)
+(use-package s)
+(use-package string-edit)
+
+(use-package swiper
+  :after (counsel ivy)
+  :bind (("C-s" . swiper)))
+
+(use-package telephone-line) ;; configuration happens outside of use-package
+(use-package term-switcher)
+(use-package undo-tree :config (global-undo-tree-mode))
+(use-package uuidgen)
+(use-package which-key :config (which-key-mode t))
+
+;;
+;; Applications in emacs
+;;
+
+(use-package magit
+  :bind ("C-c g" . magit-status)
+  :config (setq magit-repository-directories '(("/home/tazjin/projects" . 2)
+                                               ("/home/tazjin" . 1))))
+
+(use-package password-store)
+(use-package pg)
+(use-package restclient)
+
+(use-package vterm
+  :config (progn
+            (setq vterm-shell "fish")
+            (setq vterm-exit-functions
+                  (lambda (&rest _) (kill-buffer (current-buffer))))
+            (setq vterm-set-title-functions
+                  (lambda (title)
+                    (rename-buffer
+                     (generate-new-buffer-name
+                      (format "vterm<%s>"
+                              (s-trim-left
+                               (s-chop-prefix "fish" title)))))))))
+
+;;
+;; Packages providing language-specific functionality
+;;
+
+(use-package cargo
+  :hook ((rust-mode . cargo-minor-mode)
+         (cargo-process-mode . visual-line-mode))
+  :bind (:map cargo-minor-mode-map ("C-c C-c C-l" . ignore)))
+
+(use-package dockerfile-mode)
+
+(use-package erlang
+  :hook ((erlang-mode . (lambda ()
+                          ;; Don't indent after '>' while I'm writing
+                          (local-set-key ">" 'self-insert-command)))))
+
+(use-package f)
+
+(use-package go-mode
+  :bind (:map go-mode-map ("C-c C-r" . recompile))
+  :hook ((go-mode . (lambda ()
+                      (setq tab-width 2)
+                      (setq-local compile-command
+                                  (concat "go build " buffer-file-name))))))
+
+(use-package haskell-mode)
+
+(use-package jq-mode
+  :config (add-to-list 'auto-mode-alist '("\\.jq\\'" . jq-mode)))
+
+(use-package kotlin-mode
+  :hook ((kotlin-mode . (lambda ()
+                          (setq indent-line-function #'indent-relative)))))
+
+(use-package lsp-mode)
+
+(use-package markdown-mode
+  :config
+  (add-to-list 'auto-mode-alist '("\\.txt\\'" . markdown-mode))
+  (add-to-list 'auto-mode-alist '("\\.markdown\\'" . markdown-mode))
+  (add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode)))
+
+(use-package markdown-toc)
+
+(use-package nix-mode
+  :hook ((nix-mode . (lambda ()
+                       (setq indent-line-function #'nix-indent-line)))))
+
+(use-package nix-util)
+(use-package nginx-mode)
+(use-package rust-mode)
+
+(use-package telega
+  :bind (:map global-map ("s-t" . telega))
+  :config (telega-mode-line-mode 1))
+
+(use-package terraform-mode)
+(use-package toml-mode)
+(use-package web-mode)
+(use-package yaml-mode)
+
+;; Configuration changes in `customize` can not actually be persisted
+;; to the customise file that Emacs is currently using (since it comes
+;; from the Nix store).
+;;
+;; The way this will work for now is that Emacs will *write*
+;; configuration to the file tracked in my repository, while not
+;; actually *reading* it from there (unless Emacs is rebuilt).
+(setq custom-file (expand-file-name "~/depot/tools/emacs/config/custom.el"))
+(load-library "custom")
+
+(defvar home-dir (expand-file-name "~"))
+
+;; Seed RNG
+(random t)
+
+;; Load all other Emacs configuration. These configurations are
+;; added to `load-path' by Nix.
+(mapc 'require '(desktop
+                 mail-setup
+                 look-and-feel
+                 functions
+                 settings
+                 modes
+                 bindings
+                 eshell-setup))
+(telephone-line-setup)
+(ace-window-display-mode)
+
+;; If a local configuration library exists, it should be loaded.
+;;
+;; This can be provided by calling my Emacs derivation with
+;; `withLocalConfig'.
+(if-let (local-file (locate-library "local"))
+    (load local-file))
+
+(provide 'init)
diff --git a/tools/emacs/config/look-and-feel.el b/tools/emacs/config/look-and-feel.el
new file mode 100644
index 0000000000..98716dde64
--- /dev/null
+++ b/tools/emacs/config/look-and-feel.el
@@ -0,0 +1,114 @@
+;;; -*- lexical-binding: t; -*-
+
+;; Hide those ugly tool bars:
+(tool-bar-mode 0)
+(scroll-bar-mode 0)
+(menu-bar-mode 0)
+(add-hook 'after-make-frame-functions
+          (lambda (frame) (scroll-bar-mode 0)))
+
+;; Don't do any annoying things:
+(setq ring-bell-function 'ignore)
+(setq initial-scratch-message "")
+
+;; Remember layout changes
+(winner-mode 1)
+
+;; Usually emacs will run as a proper GUI application, in which case a few
+;; extra settings are nice-to-have:
+(when window-system
+  (setq frame-title-format '(buffer-file-name "%f" ("%b")))
+  (mouse-wheel-mode t)
+  (blink-cursor-mode -1))
+
+;; Configure editor fonts
+(let ((font (format "Input Mono-%d" 12)))
+  (setq default-frame-alist `((font-backend . "xft")
+                              (font . ,font)))
+  (set-frame-font font t t))
+
+;; Configure telephone-line
+(defun telephone-misc-if-last-window ()
+  "Renders the mode-line-misc-info string for display in the
+  mode-line if the currently active window is the last one in the
+  frame.
+
+  The idea is to not display information like the current time,
+  load, battery levels on all buffers."
+
+  (when (bottom-right-window-p)
+      (telephone-line-raw mode-line-misc-info t)))
+
+(defun telephone-line-setup ()
+  (telephone-line-defsegment telephone-line-last-window-segment ()
+    (telephone-misc-if-last-window))
+
+  ;; Display the current EXWM workspace index in the mode-line
+  (telephone-line-defsegment telephone-line-exwm-workspace-index ()
+    (when (bottom-right-window-p)
+      (format "[%s]" exwm-workspace-current-index)))
+
+  ;; Define a highlight font for ~ important ~ information in the last
+  ;; window.
+  (defface special-highlight '((t (:foreground "white" :background "#5f627f"))) "")
+  (add-to-list 'telephone-line-faces
+               '(highlight . (special-highlight . special-highlight)))
+
+  (setq telephone-line-lhs
+        '((nil . (telephone-line-position-segment))
+          (accent . (telephone-line-buffer-segment))))
+
+  (setq telephone-line-rhs
+        '((accent . (telephone-line-major-mode-segment))
+          (nil . (telephone-line-last-window-segment
+                  telephone-line-exwm-workspace-index))
+
+          ;; TODO(tazjin): lets not do this particular thing while I
+          ;; don't actually run notmuch, there are too many things
+          ;; that have a dependency on the modeline drawing correctly
+          ;; (including randr operations!)
+          ;;
+          ;; (highlight . (telephone-line-notmuch-counts))
+          ))
+
+  (setq telephone-line-primary-left-separator 'telephone-line-tan-left
+        telephone-line-primary-right-separator 'telephone-line-tan-right
+        telephone-line-secondary-left-separator 'telephone-line-tan-hollow-left
+        telephone-line-secondary-right-separator 'telephone-line-tan-hollow-right)
+
+  (telephone-line-mode 1))
+
+;; Auto refresh buffers
+(global-auto-revert-mode 1)
+
+;; Use clipboard properly
+(setq select-enable-clipboard t)
+
+;; Show in-progress chords in minibuffer
+(setq echo-keystrokes 0.1)
+
+;; Show column numbers in all buffers
+(column-number-mode t)
+
+(defalias 'yes-or-no-p 'y-or-n-p)
+(defalias 'auto-tail-revert-mode 'tail-mode)
+
+;; Style line numbers (shown with M-g g)
+(setq linum-format
+      (lambda (line)
+        (propertize
+         (format (concat " %"
+                         (number-to-string
+                          (length (number-to-string
+                                   (line-number-at-pos (point-max)))))
+                         "d ")
+                 line)
+         'face 'linum)))
+
+;; Display tabs as 2 spaces
+(setq tab-width 2)
+
+;; Don't wrap around when moving between buffers
+(setq windmove-wrap-around nil)
+
+(provide 'look-and-feel)
diff --git a/tools/emacs/config/mail-setup.el b/tools/emacs/config/mail-setup.el
new file mode 100644
index 0000000000..1167bcadd3
--- /dev/null
+++ b/tools/emacs/config/mail-setup.el
@@ -0,0 +1,83 @@
+(require 'notmuch)
+(require 'counsel-notmuch)
+
+;; (global-set-key (kbd "C-c m") 'notmuch-hello)
+;; (global-set-key (kbd "C-c C-m") 'counsel-notmuch)
+;; (global-set-key (kbd "C-c C-e n") 'notmuch-mua-new-mail)
+
+(setq notmuch-cache-dir (format "%s/.cache/notmuch" (getenv "HOME")))
+(make-directory notmuch-cache-dir t)
+
+;; Cache addresses for completion:
+(setq notmuch-address-save-filename (concat notmuch-cache-dir "/addresses"))
+
+;; Don't spam my home folder with drafts:
+(setq notmuch-draft-folder "drafts") ;; relative to notmuch database
+
+;; Mark things as read when archiving them:
+(setq notmuch-archive-tags '("-inbox" "-unread" "+archive"))
+
+;; Show me saved searches that I care about:
+(setq notmuch-saved-searches
+      '((:name "inbox" :query "tag:inbox" :count-query "tag:inbox AND tag:unread" :key "i")
+        (:name "sent" :query "tag:sent" :key "t")
+        (:name "drafts" :query "tag:draft")))
+(setq notmuch-show-empty-saved-searches t)
+
+;; Mail sending configuration
+(setq send-mail-function 'sendmail-send-it) ;; sendmail provided by MSMTP
+(setq notmuch-always-prompt-for-sender t)
+(setq notmuch-mua-user-agent-function
+      (lambda () (format "Emacs %s; notmuch.el %s" emacs-version notmuch-emacs-version)))
+(setq mail-host-address (system-name))
+(setq notmuch-mua-cite-function #'message-cite-original-without-signature)
+(setq notmuch-fcc-dirs nil) ;; Gmail does this server-side
+(setq message-signature nil) ;; Insert message signature manually with C-c C-w
+
+;; Close mail buffers after sending mail
+(setq message-kill-buffer-on-exit t)
+
+;; Ensure sender is correctly passed to msmtp
+(setq mail-specify-envelope-from t
+      message-sendmail-envelope-from 'header
+      mail-envelope-from 'header)
+
+;; Store sent mail in the correct folder per account
+(setq notmuch-maildir-use-notmuch-insert nil)
+
+;; I don't use drafts but I instinctively hit C-x C-s constantly, lets
+;; handle that gracefully.
+(define-key notmuch-message-mode-map (kbd "C-x C-s") #'ignore)
+
+;; Define a telephone-line segment for displaying the count of unread,
+;; important mails in the last window's mode-line:
+(defvar *last-notmuch-count-redraw* 0)
+(defvar *current-notmuch-count* nil)
+
+(defun update-display-notmuch-counts ()
+  "Update and render the current state of the notmuch unread
+  count for display in the mode-line.
+
+  The offlineimap-timer runs every 2 minutes, so it does not make
+  sense to refresh this much more often than that."
+
+  (when (> (- (float-time) *last-notmuch-count-redraw*) 30)
+    (setq *last-notmuch-count-redraw* (float-time))
+    (let* ((inbox-unread (notmuch-saved-search-count "tag:inbox and tag:unread"))
+           (notmuch-count (format "I: %s; D: %s" inbox-unread)))
+      (setq *current-notmuch-count* notmuch-count)))
+
+  (when (and (bottom-right-window-p)
+             ;; Only render if the initial update is done and there
+             ;; are unread mails:
+             *current-notmuch-count*
+             (not (equal *current-notmuch-count* "I: 0; D: 0")))
+    *current-notmuch-count*))
+
+(telephone-line-defsegment telephone-line-notmuch-counts ()
+  "This segment displays the count of unread notmuch messages in
+  the last window's mode-line (if unread messages are present)."
+
+  (update-display-notmuch-counts))
+
+(provide 'mail-setup)
diff --git a/tools/emacs/config/modes.el b/tools/emacs/config/modes.el
new file mode 100644
index 0000000000..8d47f2f9a5
--- /dev/null
+++ b/tools/emacs/config/modes.el
@@ -0,0 +1,36 @@
+;; Initializes modes I use.
+
+(add-hook 'prog-mode-hook 'esk-add-watchwords)
+(add-hook 'prog-mode-hook 'hl-line-mode)
+
+;; Use auto-complete as completion at point
+(defun set-auto-complete-as-completion-at-point-function ()
+  (setq completion-at-point-functions '(auto-complete)))
+
+(add-hook 'auto-complete-mode-hook
+          'set-auto-complete-as-completion-at-point-function)
+
+;; Enable rainbow-delimiters for all things programming
+(add-hook 'prog-mode-hook 'rainbow-delimiters-mode)
+
+;; Enable Paredit & Company in Emacs Lisp mode
+(add-hook 'emacs-lisp-mode-hook 'company-mode)
+
+;; Always highlight matching brackets
+(show-paren-mode 1)
+
+;; Always auto-close parantheses and other pairs
+(electric-pair-mode)
+
+;; Keep track of recent files
+(recentf-mode)
+
+;; Easily navigate sillycased words
+(global-subword-mode 1)
+
+;; Transparently open compressed files
+(auto-compression-mode t)
+
+;; Show available key chord completions
+
+(provide 'modes)
diff --git a/tools/emacs/config/settings.el b/tools/emacs/config/settings.el
new file mode 100644
index 0000000000..274dcdde35
--- /dev/null
+++ b/tools/emacs/config/settings.el
@@ -0,0 +1,50 @@
+(require 'uniquify)
+
+;; Move files to trash when deleting
+(setq delete-by-moving-to-trash t)
+
+;; We don't live in the 80s, but we're also not a shitty web app.
+(setq gc-cons-threshold 20000000)
+
+(setq uniquify-buffer-name-style 'forward)
+
+; Fix some defaults
+(setq visible-bell nil
+      inhibit-startup-message t
+      color-theme-is-global t
+      sentence-end-double-space nil
+      shift-select-mode nil
+      uniquify-buffer-name-style 'forward
+      whitespace-style '(face trailing lines-tail tabs)
+      whitespace-line-column 80
+      default-directory "~"
+      fill-column 80
+      ediff-split-window-function 'split-window-horizontally)
+
+(add-to-list 'safe-local-variable-values '(lexical-binding . t))
+(add-to-list 'safe-local-variable-values '(whitespace-line-column . 80))
+
+(set-default 'indent-tabs-mode nil)
+
+;; UTF-8 please
+(setq locale-coding-system 'utf-8) ; pretty
+(set-terminal-coding-system 'utf-8) ; pretty
+(set-keyboard-coding-system 'utf-8) ; pretty
+(set-selection-coding-system 'utf-8) ; please
+(prefer-coding-system 'utf-8) ; with sugar on top
+
+;; Make emacs behave sanely (overwrite selected text)
+(delete-selection-mode 1)
+
+;; Keep your temporary files in tmp, emacs!
+(setq auto-save-file-name-transforms
+      `((".*" ,temporary-file-directory t)))
+(setq backup-directory-alist
+      `((".*" . ,temporary-file-directory)))
+
+(remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)
+
+;; Show time in 24h format
+(setq display-time-24hr-format t)
+
+(provide 'settings)
diff --git a/tools/emacs/default.nix b/tools/emacs/default.nix
new file mode 100644
index 0000000000..ce515928a2
--- /dev/null
+++ b/tools/emacs/default.nix
@@ -0,0 +1,141 @@
+# This file builds an Emacs pre-configured with the packages I need
+# and my personal Emacs configuration.
+#
+# On NixOS machines, this Emacs currently does not support
+# Imagemagick, see https://github.com/NixOS/nixpkgs/issues/70631.
+#
+# Forcing Emacs to link against Imagemagick currently causes libvterm
+# to segfault, which is a lot less desirable than not having telega
+# render images correctly.
+{ pkgs, ... }:
+
+with pkgs;
+with third_party.emacsPackagesNg;
+with third_party.emacs;
+
+let
+  emacsWithPackages = (third_party.emacsPackagesNgGen third_party.emacs26).emacsWithPackages;
+
+  # $PATH for binaries that need to be available to Emacs
+  emacsBinPath = lib.makeBinPath [ third_party.telega ];
+
+  identity = x: x;
+  tazjinsEmacs = pkgfun: (emacsWithPackages(epkgs: pkgfun(
+  # Actual ELPA packages (the enlightened!)
+  (with epkgs.elpaPackages; [
+    ace-window
+    avy
+    pinentry
+    rainbow-mode
+    undo-tree
+  ]) ++
+
+  # MELPA packages:
+  (with epkgs.melpaPackages; [
+    browse-kill-ring
+    cargo
+    clojure-mode
+    counsel
+    counsel-notmuch
+    dash-functional
+    direnv
+    dockerfile-mode
+    elixir-mode
+    elm-mode
+    erlang
+    exwm
+    go-mode
+    gruber-darker-theme
+    haskell-mode
+    ht
+    hydra
+    idle-highlight-mode
+    intero
+    ivy
+    ivy-pass
+    ivy-prescient
+    jq-mode
+    kotlin-mode
+    lsp-mode
+    magit
+    markdown-toc
+    multi-term
+    multiple-cursors
+    nginx-mode
+    nix-mode
+    notmuch # this comes from pkgs.third_party
+    paredit
+    password-store
+    pg
+    prescient
+    racket-mode
+    rainbow-delimiters
+    refine
+    restclient
+    request
+    sly
+    string-edit
+    swiper
+    telega
+    telephone-line
+    terraform-mode
+    toml-mode
+    transient
+    use-package
+    uuidgen
+    web-mode
+    websocket
+    which-key
+    xelb
+    yaml-mode
+
+    (vterm.overrideAttrs(_: {
+      src = third_party.fetchFromGitHub{
+        owner = "akermu";
+        repo = "emacs-libvterm";
+        rev = "58b4cc40ee9872a08fc5cbfee78ad0e195a3306c";
+        sha256 = "1w5yfl8nq4k7xyldf0ivzv36vhz3dwdzk6q2vs3xwpx6ljy52px6";
+      };
+    }))
+  ]) ++
+
+  # Custom packages
+  (with pkgs.tools.emacs-pkgs; [
+    carp-mode
+    dottime
+    nix-util
+    term-switcher
+  ]))));
+in lib.fix(self: l: f: third_party.writeShellScriptBin "tazjins-emacs" ''
+  export PATH="${emacsBinPath}:$PATH"
+  exec ${tazjinsEmacs f}/bin/emacs \
+    --debug-init \
+    --no-site-file \
+    --no-site-lisp \
+    --no-init-file \
+    --directory ${./config} ${if l != null then "--directory ${l}" else ""} \
+    --eval "(require 'init)" $@
+  '' // {
+    # Call overrideEmacs with a function (pkgs -> pkgs) to modify the
+    # packages that should be included in this Emacs distribution.
+    overrideEmacs = f': self l f';
+
+    # Call withLocalConfig with the path to a *folder* containing a
+    # `local.el` which provides local system configuration.
+    withLocalConfig = confDir: self confDir f;
+
+    # Build a derivation that uses the specified local Emacs (i.e.
+    # built outside of Nix) instead
+    withLocalEmacs = emacsBin: third_party.writeShellScriptBin "tazjins-emacs" ''
+      export PATH="${emacsBinPath}:$PATH"
+      export EMACSLOADPATH="${(tazjinsEmacs f).deps}/share/emacs/site-lisp:"
+      exec ${emacsBin} \
+        --debug-init \
+        --no-site-file \
+        --no-site-lisp \
+        --no-init-file \
+        --directory ${./config} \
+        ${if l != null then "--directory ${l}" else ""} \
+        --eval "(require 'init)" $@
+    '';
+  }) null identity
diff --git a/web/cgit-taz/0001-cgit_monorepo_urls.patch b/web/cgit-taz/0001-cgit_monorepo_urls.patch
new file mode 100644
index 0000000000..624a74b5db
--- /dev/null
+++ b/web/cgit-taz/0001-cgit_monorepo_urls.patch
@@ -0,0 +1,114 @@
+From f6646e5a6da29da979d6954feba9d85556bc6936 Mon Sep 17 00:00:00 2001
+From: Vincent Ambo <tazjin@google.com>
+Date: Sat, 21 Dec 2019 18:41:45 +0000
+Subject: [PATCH 1/3] feat: Generate monorepo compatible URLs
+
+Generates URLs that do not include the repository name.
+
+On git.tazj.in, only one repository (depot) is served - hence URLs
+generated by cgit need not include the name.
+---
+ cmd.c       | 24 +-----------------------
+ ui-shared.c | 29 +++++++++--------------------
+ 2 files changed, 10 insertions(+), 43 deletions(-)
+
+diff --git a/cmd.c b/cmd.c
+index 63f0ae5..b37b79d 100644
+--- a/cmd.c
++++ b/cmd.c
+@@ -39,29 +39,7 @@ static void atom_fn(void)
+ 
+ static void about_fn(void)
+ {
+-	if (ctx.repo) {
+-		size_t path_info_len = ctx.env.path_info ? strlen(ctx.env.path_info) : 0;
+-		if (!ctx.qry.path &&
+-		    ctx.qry.url[strlen(ctx.qry.url) - 1] != '/' &&
+-		    (!path_info_len || ctx.env.path_info[path_info_len - 1] != '/')) {
+-			char *currenturl = cgit_currenturl();
+-			char *redirect = fmtalloc("%s/", currenturl);
+-			cgit_redirect(redirect, true);
+-			free(currenturl);
+-			free(redirect);
+-		} else if (ctx.repo->readme.nr)
+-			cgit_print_repo_readme(ctx.qry.path);
+-		else if (ctx.repo->homepage)
+-			cgit_redirect(ctx.repo->homepage, false);
+-		else {
+-			char *currenturl = cgit_currenturl();
+-			char *redirect = fmtalloc("%s../", currenturl);
+-			cgit_redirect(redirect, false);
+-			free(currenturl);
+-			free(redirect);
+-		}
+-	} else
+-		cgit_print_site_readme();
++	cgit_print_repo_readme(ctx.qry.path);
+ }
+ 
+ static void blame_fn(void)
+diff --git a/ui-shared.c b/ui-shared.c
+index 739505a..c7c3754 100644
+--- a/ui-shared.c
++++ b/ui-shared.c
+@@ -95,29 +95,23 @@ const char *cgit_loginurl(void)
+ 
+ char *cgit_repourl(const char *reponame)
+ {
+-	if (ctx.cfg.virtual_root)
+-		return fmtalloc("%s%s/", ctx.cfg.virtual_root, reponame);
+-	else
+-		return fmtalloc("?r=%s", reponame);
++	// my cgit instance *only* serves the depot, hence that's the only value ever
++	// needed.
++	return fmtalloc("/");
+ }
+ 
+ char *cgit_fileurl(const char *reponame, const char *pagename,
+ 		   const char *filename, const char *query)
+ {
+ 	struct strbuf sb = STRBUF_INIT;
+-	char *delim;
+ 
+-	if (ctx.cfg.virtual_root) {
+-		strbuf_addf(&sb, "%s%s/%s/%s", ctx.cfg.virtual_root, reponame,
+-			    pagename, (filename ? filename:""));
+-		delim = "?";
+-	} else {
+-		strbuf_addf(&sb, "?url=%s/%s/%s", reponame, pagename,
+-			    (filename ? filename : ""));
+-		delim = "&amp;";
++	strbuf_addf(&sb, "%s%s/%s", ctx.cfg.virtual_root,
++		pagename, (filename ? filename:""));
++
++	if (query) {
++		strbuf_addf(&sb, "%s%s", "?", query);
+ 	}
+-	if (query)
+-		strbuf_addf(&sb, "%s%s", delim, query);
++
+ 	return strbuf_detach(&sb, NULL);
+ }
+ 
+@@ -245,9 +239,6 @@ static char *repolink(const char *title, const char *class, const char *page,
+ 	html(" href='");
+ 	if (ctx.cfg.virtual_root) {
+ 		html_url_path(ctx.cfg.virtual_root);
+-		html_url_path(ctx.repo->url);
+-		if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/')
+-			html("/");
+ 		if (page) {
+ 			html_url_path(page);
+ 			html("/");
+@@ -957,8 +948,6 @@ static void print_header(void)
+ 
+ 	html("<td class='main'>");
+ 	if (ctx.repo) {
+-		cgit_index_link("index", NULL, NULL, NULL, NULL, 0, 1);
+-		html(" : ");
+ 		cgit_summary_link(ctx.repo->name, ctx.repo->name, NULL, NULL);
+ 		if (ctx.env.authenticated) {
+ 			html("</td><td class='form'>");
+-- 
+2.24.1.735.g03f4e72817-goog
+
diff --git a/web/cgit-taz/0002-cgit_subtree_readmes.patch b/web/cgit-taz/0002-cgit_subtree_readmes.patch
new file mode 100644
index 0000000000..f3aba10215
--- /dev/null
+++ b/web/cgit-taz/0002-cgit_subtree_readmes.patch
@@ -0,0 +1,46 @@
+From 61500898c7d1363f88b763c7778cf1a8dfd13aca Mon Sep 17 00:00:00 2001
+From: Vincent Ambo <tazjin@google.com>
+Date: Sat, 21 Dec 2019 22:58:19 +0000
+Subject: [PATCH 2/3] feat(ui-summary): Attempt to use README at each subtree
+
+This means that individual subtrees of a repository will also have
+their READMEs rendered on the about page, for example:
+
+    /foo/bar/README.md
+
+Will render on:
+
+    /about/foo/bar/
+
+This is useful for monorepo setups in which subtrees represent
+individual projects.
+---
+ ui-summary.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/ui-summary.c b/ui-summary.c
+index 8e81ac4..34ce4e9 100644
+--- a/ui-summary.c
++++ b/ui-summary.c
+@@ -128,6 +128,18 @@ void cgit_print_repo_readme(char *path)
+ 			goto done;
+ 	}
+ 
++	/* Determine which file to serve by checking whether the given filename is
++	 * already a valid file and otherwise appending the expected file name of
++	 * the readme.
++	 *
++	 * If neither yield a valid file, the user gets a blank page. Could probably
++	 * do with an error message in between there, but whatever.
++	 */
++	if (path && ref && !cgit_ref_path_exists(filename, ref, 1)) {
++	  filename = fmtalloc("%s/%s", path, ctx.repo->readme.items[0].string);
++	  free_filename = 1;
++	}
++
+ 	/* Print the calculated readme, either from the git repo or from the
+ 	 * filesystem, while applying the about-filter.
+ 	 */
+-- 
+2.24.1.735.g03f4e72817-goog
+
diff --git a/web/cgit-taz/0003-cgit_subtree_about_links.patch b/web/cgit-taz/0003-cgit_subtree_about_links.patch
new file mode 100644
index 0000000000..6b3d0a70b1
--- /dev/null
+++ b/web/cgit-taz/0003-cgit_subtree_about_links.patch
@@ -0,0 +1,50 @@
+From 531b55dc96bb7ee2ce52a3612021e1c1f4ddac8a Mon Sep 17 00:00:00 2001
+From: Vincent Ambo <tazjin@google.com>
+Date: Sat, 21 Dec 2019 23:27:28 +0000
+Subject: [PATCH 3/3] feat(ui-shared): Generate links to about pages from
+ subtrees
+
+If you're on tree/foo/bar, the about link will now point to
+about/foo/bar.
+
+Currently the annoying thing about this is that it will also do it for
+files.
+---
+ ui-shared.c | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+diff --git a/ui-shared.c b/ui-shared.c
+index c7c3754..c37835a 100644
+--- a/ui-shared.c
++++ b/ui-shared.c
+@@ -297,6 +297,12 @@ void cgit_tag_link(const char *name, const char *title, const char *class,
+ 	reporevlink("tag", name, title, class, tag, NULL, NULL);
+ }
+ 
++void cgit_about_link(const char *name, const char *title, const char *class,
++		    const char *head, const char *rev, const char *path)
++{
++	reporevlink("about", name, title, class, head, rev, path);
++}
++
+ void cgit_tree_link(const char *name, const char *title, const char *class,
+ 		    const char *head, const char *rev, const char *path)
+ {
+@@ -985,10 +991,10 @@ void cgit_print_pageheader(void)
+ 
+ 	html("<table class='tabs'><tr><td>\n");
+ 	if (ctx.env.authenticated && ctx.repo) {
+-		if (ctx.repo->readme.nr)
+-			reporevlink("about", "about", NULL,
+-				    hc("about"), ctx.qry.head, NULL,
+-				    NULL);
++		if (ctx.repo->readme.nr) {
++			cgit_about_link("about", NULL, hc("about"), ctx.qry.head,
++					 ctx.qry.sha1, ctx.qry.vpath);
++		}
+ 		cgit_summary_link("summary", NULL, hc("summary"),
+ 				  ctx.qry.head);
+ 		cgit_refs_link("refs", NULL, hc("refs"), ctx.qry.head,
+-- 
+2.24.1.735.g03f4e72817-goog
+
diff --git a/web/cgit-taz/default.nix b/web/cgit-taz/default.nix
new file mode 100644
index 0000000000..962efab91a
--- /dev/null
+++ b/web/cgit-taz/default.nix
@@ -0,0 +1,80 @@
+# This derivation configures a 'cgit' instance to serve repositories
+# from a different source.
+#
+# In the first round this will just serve my GitHub repositories until
+# I'm happy with the display.
+
+{ pkgs, ... }:
+
+with pkgs.third_party;
+
+let
+  # Patched version of cgit that has monorepo-specific features.
+  monocgit = cgit.overrideAttrs(old: {
+    patches = old.patches ++ [
+      ./0001-cgit_monorepo_urls.patch
+      ./0002-cgit_subtree_readmes.patch
+      ./0003-cgit_subtree_about_links.patch
+    ];
+  });
+
+  cgitConfig = writeText "cgitrc" ''
+    # Global configuration
+    virtual-root=/
+    enable-http-clone=1
+    readme=:README.md
+    about-filter=${pkgs.tools.cheddar}/bin/cheddar
+    source-filter=${pkgs.tools.cheddar}/bin/cheddar
+    enable-log-filecount=1
+    enable-log-linecount=1
+    enable-follow-links=1
+    enable-blame=1
+    mimetype-file=${mime-types}/etc/mime.types
+    logo=/plain/fun/logo/depot-logo.png
+
+    # Repository configuration
+    repo.url=depot
+    repo.path=/git/depot/
+    repo.desc=tazjin's personal monorepo
+    repo.owner=tazjin <mail@tazj.in>
+    repo.clone-url=https://git.tazj.in ssh://source.developers.google.com:2022/p/tazjins-infrastructure/r/depot
+  '';
+
+  thttpdConfig = writeText "thttpd.conf" ''
+    port=8080
+    dir=${monocgit}/cgit
+    nochroot
+    novhost
+    logfile=/dev/stdout
+    cgipat=**.cgi
+  '';
+
+  # Patched version of thttpd that serves cgit.cgi as the index and
+  # sets the environment variable for pointing cgit at the correct
+  # configuration.
+  #
+  # Things are done this way because recompilation of thttpd is much
+  # faster than cgit and I don't want to wait long when iterating on
+  # config.
+  thttpdConfigPatch = writeText "thttpd_cgit_conf.patch" ''
+    diff --git a/libhttpd.c b/libhttpd.c
+    index c6b1622..eef4b73 100644
+    --- a/libhttpd.c
+    +++ b/libhttpd.c
+    @@ -3055,4 +3055,6 @@ make_envp( httpd_conn* hc )
+
+         envn = 0;
+    +    // force cgit to load the correct configuration
+    +    envp[envn++] = "CGIT_CONFIG=${cgitConfig}";
+         envp[envn++] = build_env( "PATH=%s", CGI_PATH );
+     #ifdef CGI_LD_LIBRARY_PATH
+  '';
+  thttpdCgit = thttpd.overrideAttrs(old: {
+    patches = [
+      ./thttpd_cgi_idx.patch
+      thttpdConfigPatch
+    ];
+  });
+in writeShellScriptBin "cgit-launch" ''
+  exec ${thttpdCgit}/bin/thttpd -D -C ${thttpdConfig}
+# ''
diff --git a/web/cgit-taz/thttpd_cgi_idx.patch b/web/cgit-taz/thttpd_cgi_idx.patch
new file mode 100644
index 0000000000..67dbc0c7ab
--- /dev/null
+++ b/web/cgit-taz/thttpd_cgi_idx.patch
@@ -0,0 +1,13 @@
+diff --git a/config.h b/config.h
+index 65ab1e3..cde470f 100644
+--- a/config.h
++++ b/config.h
+@@ -327,7 +327,7 @@
+ /* CONFIGURE: A list of index filenames to check.  The files are searched
+ ** for in this order.
+ */
+-#define INDEX_NAMES "index.html", "index.htm", "index.xhtml", "index.xht", "Default.htm", "index.cgi"
++#define INDEX_NAMES "cgit.cgi"
+ 
+ /* CONFIGURE: If this is defined then thttpd will automatically generate
+ ** index pages for directories that don't have an explicit index file.
diff --git a/web/tazblog/blog/Main.hs b/web/tazblog/blog/Main.hs
new file mode 100644
index 0000000000..6074f96b76
--- /dev/null
+++ b/web/tazblog/blog/Main.hs
@@ -0,0 +1,24 @@
+-- | Main module for the blog's web server
+module Main where
+
+import Control.Applicative ((<$>), (<*>))
+import Server (runBlog)
+import System.Environment (getEnv)
+
+data MainOptions
+  = MainOptions
+      { blogPort :: Int,
+        resourceDir :: String
+        }
+
+readOpts :: IO MainOptions
+readOpts =
+  MainOptions
+    <$> (fmap read $ getEnv "PORT")
+    <*> getEnv "RESOURCE_DIR"
+
+main :: IO ()
+main = do
+  opts <- readOpts
+  putStrLn ("tazblog starting on port " ++ (show $ blogPort opts))
+  runBlog (blogPort opts) (resourceDir opts)
diff --git a/web/tazblog/default.nix b/web/tazblog/default.nix
new file mode 100644
index 0000000000..eecadff6ba
--- /dev/null
+++ b/web/tazblog/default.nix
@@ -0,0 +1,18 @@
+# Build configuration for the blog using plain Nix.
+#
+# tazblog.nix was generated using cabal2nix.
+
+{ pkgs, ... }:
+
+let
+  inherit (pkgs.third_party) writeShellScriptBin haskell;
+  tazblog = haskell.packages.ghc865.callPackage ./tazblog.nix {};
+  wrapper =  writeShellScriptBin "tazblog" ''
+    export PORT=8000
+    export RESOURCE_DIR=${./static}
+    exec ${tazblog}/bin/tazblog
+  '';
+in wrapper.overrideAttrs(_: {
+  allowSubstitutes = true;
+  meta.enableCI = true;
+})
diff --git a/web/tazblog/shell.nix b/web/tazblog/shell.nix
new file mode 100644
index 0000000000..ebb891a874
--- /dev/null
+++ b/web/tazblog/shell.nix
@@ -0,0 +1,11 @@
+{ pkgs ? (import ../../default.nix {}).third_party.nixpkgs }:
+
+let tazblog = import ./tazblog.nix;
+    depNames = with builtins; filter (
+      p: hasAttr p pkgs.haskellPackages
+    ) (attrNames (functionArgs tazblog));
+    ghc = pkgs.ghc.withPackages(p: map (x: p."${x}") depNames);
+in pkgs.stdenv.mkDerivation {
+  name = "shell";
+  buildInputs = [ ghc pkgs.hlint ];
+}
diff --git a/web/tazblog/src/Blog.hs b/web/tazblog/src/Blog.hs
new file mode 100644
index 0000000000..0a53b5f2fb
--- /dev/null
+++ b/web/tazblog/src/Blog.hs
@@ -0,0 +1,141 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Blog where
+
+import BlogStore
+import Data.Text (Text, pack)
+import qualified Data.Text as T
+import Data.Text.Lazy (fromStrict)
+import Data.Time
+import Text.Blaze.Html (preEscapedToHtml)
+import Text.Hamlet
+import Text.Markdown
+
+blogTitle :: Text = "tazjin's blog"
+
+repoURL :: Text = "https://bitbucket.org/tazjin/tazblog-haskell"
+
+mailTo :: Text = "mailto:mail@tazj.in"
+
+twitter :: Text = "https://twitter.com/tazjin"
+
+replace :: Eq a => a -> a -> [a] -> [a]
+replace x y = map (\z -> if z == x then y else z)
+
+-- |After this date all entries are Markdown
+markdownCutoff :: Day
+markdownCutoff = fromGregorian 2013 04 28
+
+blogTemplate :: Text -> Html -> Html
+blogTemplate t_append body =
+  [shamlet|
+$doctype 5
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content=#{blogTitle}#{t_append}>
+    <link rel="stylesheet" type="text/css" href="/static/blog.css" media="all">
+    <link rel="alternate" type="application/rss+xml" title="RSS-Feed" href="/rss.xml">
+    <title>#{blogTitle}#{t_append}
+  <body>
+    <header>
+      <h1>
+        <a href="/" .unstyled-link>#{blogTitle}
+      <hr>
+    ^{body}
+    ^{showFooter}
+|]
+
+showFooter :: Html
+showFooter =
+  [shamlet|
+<footer>
+  <p .footer>Served without any dynamic languages.
+  <p .footer>
+    <a href=#{repoURL} .uncoloured-link>
+    |
+    <a href=#{twitter} .uncoloured-link>Twitter
+    |
+    <a href=#{mailTo} .uncoloured-link>Mail
+  <p .lod>
+    ಠ_ಠ
+|]
+
+isEntryMarkdown :: Entry -> Bool
+isEntryMarkdown e = edate e > markdownCutoff
+
+renderEntryMarkdown :: Text -> Html
+renderEntryMarkdown = markdown def {msXssProtect = False} . fromStrict
+
+renderEntries :: [Entry] -> Maybe Html -> Html
+renderEntries entries pageLinks =
+  [shamlet|
+$forall entry <- entries
+  <article>
+    <h2 .inline>
+      <a href=#{linkElems entry} .unstyled-link>
+        #{title entry}
+    <aside .date>
+      #{pack $ formatTime defaultTimeLocale "%Y-%m-%d" $ edate entry}
+    $if (isEntryMarkdown entry)
+      ^{renderEntryMarkdown $ text entry}
+    $else
+      ^{preEscapedToHtml $ text entry}
+  <hr>
+$maybe links <- pageLinks
+  ^{links}
+|]
+  where
+    linkElems Entry {..} = "/" ++ show entryId
+
+showLinks :: Maybe Int -> Html
+showLinks (Just i) =
+  [shamlet|
+  $if ((>) i 1)
+    <div .navigation>
+      <a href=#{nLink $ succ i} .uncoloured-link>Earlier
+      |
+      <a href=#{nLink $ pred i} .uncoloured-link>Later
+  $elseif ((<=) i 1)
+    ^{showLinks Nothing}
+|]
+  where
+    nLink page = T.concat ["/?page=", show' page]
+showLinks Nothing =
+  [shamlet|
+<div .navigation>
+  <a href="/?page=2" .uncoloured-link>Earlier
+|]
+
+renderEntry :: Entry -> Html
+renderEntry e@Entry {..} =
+  [shamlet|
+<article>
+  <h2 .inline>
+    #{title}
+  <aside .date>
+    #{pack $ formatTime defaultTimeLocale "%Y-%m-%d" edate}
+  $if (isEntryMarkdown e)
+    ^{renderEntryMarkdown text}
+  $else
+    ^{preEscapedToHtml $ text}
+<hr>
+|]
+
+showError :: Text -> Text -> Html
+showError title err =
+  blogTemplate (": " <> title)
+    [shamlet|
+<p>:(
+<p>#{err}
+<hr>
+|]
diff --git a/web/tazblog/src/BlogStore.hs b/web/tazblog/src/BlogStore.hs
new file mode 100644
index 0000000000..60ccd0b5a0
--- /dev/null
+++ b/web/tazblog/src/BlogStore.hs
@@ -0,0 +1,182 @@
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- |This module implements fetching of individual blog entries from
+-- DNS. Yes, you read that correctly.
+--
+-- Each blog post is stored as a set of records in a designated DNS
+-- zone. For the production blog, this zone is `blog.tazj.in.`.
+--
+-- A top-level record at `_posts` contains a list of all published
+-- post IDs.
+--
+-- For each of these post IDs, there is a record at `_meta.$postID`
+-- that contains the title and number of post chunks.
+--
+-- For each post chunk, there is a record at `_$chunkID.$postID` that
+-- contains a base64-encoded post fragment.
+--
+-- This module implements logic for assembling a post out of these
+-- fragments and caching it based on the TTL of its `_meta` record.
+module BlogStore
+  ( BlogCache,
+    EntryId (..),
+    Entry (..),
+    withCache,
+    listEntries,
+    getEntry,
+    show'
+    )
+where
+
+import Control.Applicative ((<$>), (<*>))
+import Control.Monad (mzero)
+import Control.Monad.IO.Class (MonadIO, liftIO)
+import Data.Aeson ((.:), FromJSON (..), Value (Object), decodeStrict)
+import Data.ByteString.Base64 (decodeLenient)
+import Data.Either (fromRight)
+import Data.List (sortBy)
+import Data.Text as T (Text, concat, pack)
+import Data.Text.Encoding (decodeUtf8', encodeUtf8)
+import Data.Time (Day)
+import Network.DNS (DNSError, lookupTXT)
+import qualified Network.DNS.Resolver as R
+
+newtype EntryId = EntryId {unEntryId :: Integer}
+  deriving (Eq, Ord, FromJSON)
+
+instance Show EntryId where
+
+  show = show . unEntryId
+
+data Entry
+  = Entry
+      { entryId :: EntryId,
+        author :: Text,
+        title :: Text,
+        text :: Text,
+        edate :: Day
+        }
+  deriving (Eq, Ord, Show)
+
+-- | Wraps a DNS resolver with caching configured. For the initial
+-- version of this, all caching of entries is done by the resolver
+-- (i.e. no pre-assembled versions of entries are cached).
+data BlogCache = BlogCache R.Resolver Text
+
+data StoreError
+  = PostNotFound EntryId
+  | DNS DNSError
+  | InvalidMetadata
+  | InvalidChunk
+  | InvalidPosts
+  deriving (Show)
+
+type Offset = Int
+
+type Count = Int
+
+withCache :: Text -> (BlogCache -> IO a) -> IO a
+withCache zone f = do
+  let conf =
+        R.defaultResolvConf
+          { R.resolvCache = Just R.defaultCacheConf,
+            R.resolvConcurrent = True
+            }
+  seed <- R.makeResolvSeed conf
+  R.withResolver seed (\r -> f $ BlogCache r zone)
+
+listEntries :: MonadIO m => BlogCache -> Offset -> Count -> m [Entry]
+listEntries cache offset count = liftIO $ do
+  posts <- postList cache
+  entries <- mapM (entryFromDNS cache) $ take count $ drop offset $ fromRight (error "no posts") posts
+  -- TODO: maybe don't just drop broken entries
+  return
+    $ fromRight (error "no entries")
+    $ sequence entries
+
+getEntry :: MonadIO m => BlogCache -> EntryId -> m (Maybe Entry)
+getEntry cache eid = liftIO $ entryFromDNS cache eid >>= \case
+  Left _ -> return Nothing -- TODO: ??
+  Right entry -> return $ Just entry
+
+show' :: Show a => a -> Text
+show' = pack . show
+
+-- * DNS fetching implementation
+type Chunk = Integer
+
+-- | Represents the metadata stored for each post in the _meta record.
+data Meta = Meta Integer Text Day
+  deriving (Show)
+
+instance FromJSON Meta where
+
+  parseJSON (Object v) =
+    Meta
+      <$> v
+      .: "c"
+      <*> v
+      .: "t"
+      <*> v
+      .: "d"
+  parseJSON _ = mzero
+
+entryMetadata :: BlogCache -> EntryId -> IO (Either StoreError Meta)
+entryMetadata (BlogCache r z) (EntryId eid) =
+  let domain = encodeUtf8 ("_meta." <> show' eid <> "." <> z)
+      record = lookupTXT r domain
+      toMeta rrdata = case decodeStrict $ decodeLenient rrdata of
+        Nothing -> Left InvalidMetadata
+        Just m -> Right m
+   in record >>= \case
+        (Left err) -> return $ Left $ DNS err
+        (Right [bs]) -> return $ toMeta bs
+        _ -> return $ Left InvalidMetadata
+
+entryChunk :: BlogCache -> EntryId -> Chunk -> IO (Either StoreError Text)
+entryChunk (BlogCache r z) (EntryId eid) c =
+  let domain = encodeUtf8 ("_" <> show' c <> "." <> show' eid <> "." <> z)
+      record = lookupTXT r domain
+      toChunk rrdata = case decodeUtf8' $ decodeLenient rrdata of
+        Left _ -> Left InvalidChunk
+        Right chunk -> Right chunk
+   in record >>= \case
+        (Left err) -> return $ Left $ DNS err
+        (Right [bs]) -> return $ toChunk bs
+        _ -> return $ Left InvalidChunk
+
+fetchAssembleChunks :: BlogCache -> EntryId -> Meta -> IO (Either StoreError Text)
+fetchAssembleChunks cache eid (Meta n _ _) = do
+  chunks <- mapM (entryChunk cache eid) [0 .. (n - 1)]
+  return $ fmap T.concat $ sequence chunks
+
+entryFromDNS :: BlogCache -> EntryId -> IO (Either StoreError Entry)
+entryFromDNS cache eid = do
+  meta <- entryMetadata cache eid
+  case meta of
+    Left err -> return $ Left err
+    Right meta -> do
+      chunks <- fetchAssembleChunks cache eid meta
+      let (Meta _ t d) = meta
+      return
+        $ either Left
+            ( \text -> Right $ Entry
+                { entryId = eid,
+                  author = "tazjin",
+                  title = t,
+                  text = text,
+                  edate = d
+                  }
+              )
+            chunks
+
+postList :: BlogCache -> IO (Either StoreError [EntryId])
+postList (BlogCache r z) =
+  let domain = encodeUtf8 ("_posts." <> z)
+      record = lookupTXT r domain
+      toPosts =
+        fmap (sortBy (flip compare))
+          . mapM (maybe (Left InvalidPosts) Right . decodeStrict)
+   in either (Left . DNS) toPosts <$> record
diff --git a/web/tazblog/src/RSS.hs b/web/tazblog/src/RSS.hs
new file mode 100644
index 0000000000..913aa9a408
--- /dev/null
+++ b/web/tazblog/src/RSS.hs
@@ -0,0 +1,48 @@
+{-# LANGUAGE RecordWildCards #-}
+
+module RSS
+  ( renderFeed
+    )
+where
+
+import BlogStore
+import Data.Maybe (fromJust)
+import qualified Data.Text as T
+import Data.Time (UTCTime (..), getCurrentTime, secondsToDiffTime)
+import Network.URI (URI, parseURI)
+import Text.RSS
+
+createChannel :: UTCTime -> [ChannelElem]
+createChannel now =
+  [ Language "en",
+    Copyright "Vincent Ambo",
+    WebMaster "mail@tazj.in",
+    ChannelPubDate now
+    ]
+
+createRSS :: UTCTime -> [Item] -> RSS
+createRSS t =
+  let link = fromJust $ parseURI "https://tazj.in"
+   in RSS "tazjin's blog" link "tazjin's blog feed" (createChannel t)
+
+createItem :: Entry -> Item
+createItem Entry {..} =
+  [ Title "tazjin's blog",
+    Link $ entryLink entryId,
+    Description $ T.unpack text,
+    PubDate $ UTCTime edate $ secondsToDiffTime 0
+    ]
+
+entryLink :: EntryId -> URI
+entryLink i =
+  let url = "http://tazj.in/" ++ "/" ++ show i
+   in fromJust $ parseURI url
+
+createItems :: [Entry] -> [Item]
+createItems = map createItem
+
+createFeed :: [Entry] -> IO RSS
+createFeed e = getCurrentTime >>= (\t -> return $ createRSS t $ createItems e)
+
+renderFeed :: [Entry] -> IO String
+renderFeed e = fmap (showXML . rssToXML) (createFeed e)
diff --git a/web/tazblog/src/Server.hs b/web/tazblog/src/Server.hs
new file mode 100644
index 0000000000..4012998839
--- /dev/null
+++ b/web/tazblog/src/Server.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Server where
+
+import Blog
+import BlogStore
+import Control.Applicative (optional)
+import Control.Monad (msum)
+import Control.Monad.IO.Class (liftIO)
+import Data.Maybe (maybe)
+import qualified Data.Text as T
+import Happstack.Server hiding (Session)
+import RSS
+
+pageSize :: Int
+pageSize = 3
+
+tmpPolicy :: BodyPolicy
+tmpPolicy = defaultBodyPolicy "/tmp" 0 200000 1000
+
+runBlog :: Int -> String -> IO ()
+runBlog port respath =
+  withCache "blog.tazj.in." $ \cache ->
+    simpleHTTP nullConf {port = port} $ tazblog cache respath
+
+tazblog :: BlogCache -> String -> ServerPart Response
+tazblog cache resDir =
+  msum
+    [ -- legacy language-specific routes
+      dir "de" $ blogHandler cache,
+      dir "en" $ blogHandler cache,
+      dir "static" $ staticHandler resDir,
+      blogHandler cache,
+      staticHandler resDir,
+      notFound $ toResponse $ showError "Not found" "Page not found"
+      ]
+
+blogHandler :: BlogCache -> ServerPart Response
+blogHandler cache =
+  msum
+    [ path $ \(eId :: Integer) -> showEntry cache $ EntryId eId,
+      nullDir >> showIndex cache,
+      dir "rss" $ nullDir >> showRSS cache,
+      dir "rss.xml" $ nullDir >> showRSS cache
+      ]
+
+staticHandler :: String -> ServerPart Response
+staticHandler resDir = do
+  setHeaderM "cache-control" "max-age=630720000"
+  setHeaderM "expires" "Tue, 20 Jan 2037 04:20:42 GMT"
+  serveDirectory DisableBrowsing [] resDir
+
+showEntry :: BlogCache -> EntryId -> ServerPart Response
+showEntry cache eId = do
+  entry <- getEntry cache eId
+  tryEntry entry
+
+tryEntry :: Maybe Entry -> ServerPart Response
+tryEntry Nothing = notFound $ toResponse $ showError "Not found" "Blog entry not found"
+tryEntry (Just entry) = ok $ toResponse $ blogTemplate eTitle $ renderEntry entry
+  where
+    eTitle = T.append ": " (title entry)
+
+offset :: Maybe Int -> Int
+offset = maybe 0 (pageSize *)
+
+showIndex :: BlogCache -> ServerPart Response
+showIndex cache = do
+  (page :: Maybe Int) <- optional $ lookRead "page"
+  entries <- listEntries cache (offset page) pageSize
+  ok $ toResponse $ blogTemplate ""
+    $ renderEntries entries (Just $ showLinks page)
+
+showRSS :: BlogCache -> ServerPart Response
+showRSS cache = do
+  entries <- listEntries cache 0 4
+  feed <- liftIO $ renderFeed entries
+  setHeaderM "content-type" "text/xml"
+  ok $ toResponse feed
diff --git a/web/tazblog/static/apple-touch-icon.png b/web/tazblog/static/apple-touch-icon.png
new file mode 100644
index 0000000000..22ba058cdd
--- /dev/null
+++ b/web/tazblog/static/apple-touch-icon.png
Binary files differdiff --git a/web/tazblog/static/blog.css b/web/tazblog/static/blog.css
new file mode 100644
index 0000000000..e6e4ae3c2b
--- /dev/null
+++ b/web/tazblog/static/blog.css
@@ -0,0 +1,35 @@
+body {
+    margin: 40px auto;
+    max-width: 650px;
+    line-height: 1.6;
+    font-size: 18px;
+    color: #383838;
+    padding: 0 10px
+}
+h1, h2, h3 {
+    line-height: 1.2
+}
+.footer {
+    text-align: right;
+}
+.lod {
+    text-align: center;
+}
+.unstyled-link {
+    color: inherit;
+    text-decoration: none;
+}
+.uncoloured-link {
+    color: inherit;
+}
+.date {
+    text-align: right;
+    font-style: italic;
+    float: right;
+}
+.inline {
+    display: inline;
+}
+.navigation {
+    text-align: center;
+}
diff --git a/web/tazblog/static/favicon.ico b/web/tazblog/static/favicon.ico
new file mode 100644
index 0000000000..2958dd3afc
--- /dev/null
+++ b/web/tazblog/static/favicon.ico
Binary files differdiff --git a/web/tazblog/static/keybase.txt b/web/tazblog/static/keybase.txt
new file mode 100644
index 0000000000..661c33e01e
--- /dev/null
+++ b/web/tazblog/static/keybase.txt
@@ -0,0 +1,69 @@
+==================================================================
+https://keybase.io/tazjin
+--------------------------------------------------------------------
+
+I hereby claim:
+
+  * I am an admin of http://tazj.in
+  * I am tazjin (https://keybase.io/tazjin) on keybase.
+  * I have a public key with fingerprint DCF3 4CFA C1AC 44B8 7E26  3331 36EE 3481 4F6D 294A
+
+To claim this, I am signing this object:
+
+{
+    "body": {
+        "key": {
+            "fingerprint": "dcf34cfac1ac44b87e26333136ee34814f6d294a",
+            "host": "keybase.io",
+            "key_id": "36EE34814F6D294A",
+            "uid": "2268b75a56bb9693d3ef077bc1217900",
+            "username": "tazjin"
+        },
+        "service": {
+            "hostname": "tazj.in",
+            "protocol": "http:"
+        },
+        "type": "web_service_binding",
+        "version": 1
+    },
+    "ctime": 1397644545,
+    "expire_in": 157680000,
+    "prev": "4973fdda56a6cfa726a813411c915458c652be45dd19283f7a4ae4f9c217df14",
+    "seqno": 4,
+    "tag": "signature"
+}
+
+with the aforementioned key, yielding the PGP signature:
+
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v2.0.22 (GNU/Linux)
+
+owGbwMvMwMWY9pU1Q3bHF2vG0wdeJTEE+8WyVSsl5adUKllVK2Wngqm0zLz01KKC
+osy8EiUrpZTkNGOT5LTEZMPEZBOTJAvzVCMzY2NjQ2Oz1FRjEwtDkzSzFCNLk0Ql
+HaWM/GKQDqAxSYnFqXqZ+UAxICc+MwUoamzm6gpW72bmAlTvCJQrBUsYGZlZJJmb
+JpqaJSVZmlkapxinphmYmyclGxoZmlsaGIAUFqcW5SXmpgJVlyRWZWXmKdXqKAHF
+yjKTU0EuBlmMJK8HVKCjVFCUX5KfnJ8DFMwoKSmwAukpqSwAKSpPTYqHao9PysxL
+AXoYqKEstag4Mz9PycoQqDK5JBNknqGxpbmZiYmpiamOUmpFQWZRanwmSIWpuZmF
+ARCArEktAxppYmlunJaSAvRFohkwtMyNzBItDI1NDA2TLQ2Bui2SzUyNklJNTFNS
+DC2NLIzTzBNNElNN0iyTgZ5MSTM0UQJ5qDAvX8nKBOjMxHSgkcWZ6XmJJaVFqUq1
+nUwyLAyMXAxsrEygKGPg4hSARWSZH/8/0573HMdvfH5XxeayYZ2efPb8bw730i1/
+WBU3qru5pKlf3xKmeK5ihtKeT6VXGm3usV2reZWyvO/0joi83oT9P80s88Q6U/vb
+vmycHnB7e110v/3OZadu/Sx6+uXk/ZeCR8u+p/+6dNc8XWqX/68t06pnrGKU/BfU
+F7X5S/HUy4ysvyZN+v1Jj6NtMvvN1EvPpCpv3kz2tGU1EzpZFfl8Xujq1OopuxZJ
+l5kvDlgZ78ezdLZ1+aOlixbsXra4/3fdbZ8XnQX1DatzV18+e2rmMcPKm6qngqIf
+Xp8oKTAz+Mg1v6gHP0wLN/Mf3JKjYHnX5U6L/KIvkbsLArtES0r7w1iWZ3OvvSPr
+fW6heune1tOb7j3vP+1XeOyV2ekr6pPO3bdrv9X25HbTaqs7z06f0v35fmtQ3uUZ
+Z35eLYmaEmb/x/u3vFh6GsvMDocpCTpPlHa0z+xzOGbhzLFO18v21Zd9ISG3Hqtd
+F7jaLlWa2W+TsytNnXudVrfCBSbl8zNMfuk2e0Z8i9ix3PmEVa3rTEfhde3qwgtY
+dy8rUbzzd5d9ccF63btqO/VMb4oe04x4uCLB5RD3p+8+s77o/T4WP2cFw+0cviX6
+StlJX5f+U3Or3fZY7dUfPcmMJZ/eSs7m+1d5IUbs3jI27olHFzGVvTcsu7w79aOK
+SxmXvnEIUwZXgP6BL4LrPDY1rN2V0q1cZj1/efj880rzeu6+OQYA
+=xHfH
+-----END PGP MESSAGE-----
+
+And finally, I am proving ownership of this host by posting or
+appending to this document.
+
+View my publicly-auditable identity here: https://keybase.io/tazjin
+
+==================================================================
diff --git a/web/tazblog/tazblog.cabal b/web/tazblog/tazblog.cabal
new file mode 100644
index 0000000000..58aeb7049e
--- /dev/null
+++ b/web/tazblog/tazblog.cabal
@@ -0,0 +1,39 @@
+Name:                tazblog
+Version:             6.0.0
+Synopsis:            Tazjin's Blog
+License:             MIT
+Author:              Vincent Ambo
+Maintainer:          mail@tazj.in
+Category:            Web blog
+Build-type:          Simple
+cabal-version:       >= 1.10
+
+library
+  hs-source-dirs: src
+  default-language: Haskell2010
+  ghc-options: -W
+  exposed-modules: Blog, BlogStore, Server, RSS
+  build-depends: aeson,
+                 base,
+                 bytestring,
+                 happstack-server,
+                 text,
+                 blaze-html,
+                 dns,
+                 old-locale,
+                 time,
+                 base64-bytestring,
+                 network,
+                 network-uri,
+                 rss,
+                 shakespeare,
+                 markdown
+
+executable tazblog
+  hs-source-dirs: blog
+  main-is: Main.hs
+  default-language:    Haskell2010
+  ghc-options: -threaded -rtsopts -with-rtsopts=-N
+  build-depends: base,
+                 tazblog,
+                 network
diff --git a/web/tazblog/tazblog.nix b/web/tazblog/tazblog.nix
new file mode 100644
index 0000000000..b59cddec07
--- /dev/null
+++ b/web/tazblog/tazblog.nix
@@ -0,0 +1,30 @@
+{ mkDerivation, aeson, base, base64-bytestring, blaze-html , bytestring, dns
+, happstack-server, markdown, network, network-uri, old-locale, rss
+, shakespeare, stdenv, text, time }:
+mkDerivation {
+  pname = "tazblog";
+  version = "6.0.0";
+  src = ./.;
+  isLibrary = true;
+  isExecutable = true;
+  libraryHaskellDepends = [
+    aeson
+    base
+    base64-bytestring
+    blaze-html
+    bytestring
+    dns
+    happstack-server
+    markdown
+    network
+    network-uri
+    old-locale
+    rss
+    shakespeare
+    text
+    time
+  ];
+  executableHaskellDepends = [ base network ];
+  description = "Tazjin's Blog";
+  license = stdenv.lib.licenses.mit;
+}