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 000000000000..34fe568ce944
--- /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 521d8f4fb421..0b135e70341b 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 000000000000..904a76ed0488
--- /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 e1d2b82209bb..22ffdda4d3bf 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 000000000000..af56750872b1
--- /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 000000000000..8390ec9c9652
--- /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 000000000000..8390ec9c9652
--- /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 000000000000..8390ec9c9652
--- /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 000000000000..8390ec9c9652
--- /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 000000000000..8390ec9c9652
--- /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 000000000000..8390ec9c9652
--- /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 000000000000..8390ec9c9652
--- /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 000000000000..8390ec9c9652
--- /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 000000000000..8390ec9c9652
--- /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 000000000000..8390ec9c9652
--- /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 000000000000..913f4f2b6888
--- /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 000000000000..ad9e332cbff0
--- /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 000000000000..0e46bbedb0cd
--- /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 000000000000..df61c7ff7097
--- /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 000000000000..e5fc22a176ef
--- /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 000000000000..251598312a31
--- /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 000000000000..dda9995b7c1b
--- /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 000000000000..f5537c2c8f17
--- /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 000000000000..a53586eea9eb
--- /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 000000000000..d805c22ec870
--- /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 000000000000..6ecac1e2016c
--- /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 000000000000..b7dfdd245fb1
--- /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 000000000000..2805f3f4e9cd
--- /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 000000000000..e17052467a6a
--- /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 000000000000..6aa106405a4b
--- /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 000000000000..0fcd60373ff7
--- /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 000000000000..160158d177b8
--- /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 000000000000..26d56d77cf1b
--- /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 000000000000..eadac795f8bc
--- /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 000000000000..17ad8a6b5485
--- /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 000000000000..c531d9867f6c
--- /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 000000000000..994b1138ef8f
--- /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 000000000000..0d021f78e89b
--- /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 000000000000..102aa3791481
--- /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 000000000000..16a26218a0c0
--- /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 000000000000..be74b9207e72
--- /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 000000000000..c4013ac13ebc
--- /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 000000000000..94a9ed024d38
--- /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 000000000000..064742c0091f
--- /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 000000000000..e935ce25fde4
--- /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 000000000000..54f8e5f34462
--- /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 000000000000..f48af489217a
--- /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 000000000000..e449908e499c
--- /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 000000000000..2ae541ae0b95
--- /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 000000000000..0aea9c95ff92
--- /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 000000000000..b8a20addd907
--- /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 000000000000..5d4d0b5c047c
--- /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 000000000000..3bf6a6713182
--- /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 000000000000..622119552e47
--- /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 000000000000..de197a219ebf
--- /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 000000000000..173fa9efc390
--- /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 000000000000..8b005da8f67e
--- /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 000000000000..3daeac34d6bb
--- /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 000000000000..aa2e318262cd
--- /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 000000000000..0db2fe300e1e
--- /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 000000000000..50b47418d1a8
--- /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 000000000000..498cbac2f2ab
--- /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 000000000000..712c96cd95d4
--- /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 000000000000..51f14ab16381
--- /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 000000000000..a7ab65d3d196
--- /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 000000000000..1af52d0cd4eb
--- /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 000000000000..37f65e0faef4
--- /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 000000000000..143b1ca01474
--- /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 000000000000..40db6b7bd1cd
--- /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 000000000000..94a9ed024d38
--- /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 000000000000..b9ff57df4be3
--- /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 000000000000..c98bee61505d
--- /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 000000000000..81890986f8a2
--- /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 000000000000..693699042b1a
--- /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 000000000000..13c80f1f6950
--- /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 000000000000..94a9ed024d38
--- /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 000000000000..791c354fc1d9
--- /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 000000000000..b52ebc3ef09c
--- /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 000000000000..6c2bc4f5b37a
--- /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 000000000000..8e46d5a07f8f
--- /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 000000000000..b3bc54673d0b
--- /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 000000000000..21c95a11a2e9
--- /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 000000000000..30c933b56302
--- /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 000000000000..baf0e271d1f0
--- /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 000000000000..2ba3e69f992a
--- /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 000000000000..3a298bc9bf8b
--- /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 000000000000..80981d37ab52
--- /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 000000000000..8db1f814f653
--- /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 000000000000..e84ede663bf8
--- /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 000000000000..140cbf2d9d16
--- /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 000000000000..5abed1fbbcb5
--- /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 000000000000..8a61370e994c
--- /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 000000000000..bbcedbff8726
--- /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 000000000000..0cb34124dfb9
--- /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 000000000000..48f678688eec
--- /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 000000000000..aa4a813d32bd
--- /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 000000000000..2ece948ebd84
--- /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 000000000000..513656f5706d
--- /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 000000000000..66de38663108
--- /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 000000000000..4a8cba60023a
--- /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 000000000000..e557de4ae5fd
--- /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 000000000000..a29390cf4dba
--- /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 000000000000..c93cf2bfdd61
--- /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 000000000000..c48928ee19e4
--- /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 000000000000..5d551e5a49ab
--- /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 000000000000..aacc156b433b
--- /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 000000000000..71673e7ab63c
--- /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 000000000000..30ed50f8327b
--- /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 000000000000..6b03ed65ceb7
--- /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 000000000000..05a302cc6b9d
--- /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 000000000000..fcbcf6415fad
--- /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 000000000000..ae144db45a6e
--- /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 000000000000..cee24b75793c
--- /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 000000000000..e79e426b5553
--- /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 000000000000..326a129d2105
--- /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 000000000000..674687484b90
--- /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 000000000000..43db5834a0ca
--- /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 000000000000..96c7538dda8a
--- /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 000000000000..2cb57836fa6d
--- /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 000000000000..43bfe9d7fb45
--- /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 000000000000..517a658cf150
--- /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 000000000000..c7a85275ae67
--- /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 000000000000..069771a4217f
--- /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 000000000000..918aa6067806
--- /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 000000000000..983b265bafab
--- /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 000000000000..0775e79b5843
--- /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 000000000000..dc3fd617d0a1
--- /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 000000000000..6a2f84b5fb60
--- /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 000000000000..d9a674d2c9fc
--- /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 000000000000..78afbb0b039d
--- /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 000000000000..1d5d33e0bb26
--- /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 000000000000..dc63ce8e4b38
--- /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 000000000000..29e65519ba35
--- /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 000000000000..40bdc962800a
--- /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 000000000000..248b22807fe1
--- /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 000000000000..4dc9de0f617b
--- /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 000000000000..d64c82a88a71
--- /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 000000000000..2df5e58fc8df
--- /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 000000000000..a57bb3505ddc
--- /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 000000000000..779add7a7012
--- /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 000000000000..b8a97d1332f8
--- /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 000000000000..53a04aab3a89
--- /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 000000000000..94a9ed024d38
--- /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 000000000000..dd02943f89c5
--- /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 000000000000..e4258c53dd09
--- /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 000000000000..2d0378a0ec23
--- /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 000000000000..7ecd9d587d24
--- /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 000000000000..a619c8cfddcc
--- /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 000000000000..d589c99b4eaf
--- /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 000000000000..0ffa3cd81f24
--- /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 000000000000..2c81f83c0919
--- /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 000000000000..6cf86183229e
--- /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 000000000000..dd7804f719c3
--- /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 000000000000..29d3334fb54d
--- /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 000000000000..12244e1ab174
--- /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 000000000000..df30d3d8cbe3
--- /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 000000000000..2a51352571a6
--- /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 000000000000..040a19aaba25
--- /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 000000000000..5920b2720780
--- /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 000000000000..42676c3028fe
--- /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 000000000000..8459fd30405b
--- /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 000000000000..5215c559c136
--- /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 000000000000..af27bdc455bf
--- /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 000000000000..8a56bba7fe88
--- /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 000000000000..7693968bd550
--- /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 000000000000..4e870161796d
--- /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 000000000000..1444dd491249
--- /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 000000000000..32da205108de
--- /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 000000000000..5401ac91e5a3
--- /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 000000000000..87370569c46e
--- /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 000000000000..70e2365f1710
--- /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 000000000000..9f300a492080
--- /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 000000000000..f0188f9dbde3
--- /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 000000000000..733d5e16789a
--- /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 000000000000..a40fa83b0867
--- /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 000000000000..fe04765401be
--- /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 000000000000..bfd87c0201e7
--- /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 000000000000..e55d42465c6b
--- /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 000000000000..4af08f50c7bb
--- /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 000000000000..6cd974dd9324
--- /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 000000000000..f7fbcb433de5
--- /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 000000000000..a8f0c670a603
--- /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 000000000000..c20858c203b4
--- /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 000000000000..4f7997bd69d2
--- /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 000000000000..8155e174fe00
--- /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 000000000000..06f1cfc630c3
--- /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 000000000000..56fa1e3fc9c5
--- /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 000000000000..53c56081758c
--- /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 000000000000..773fa1667019
--- /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 000000000000..9e88193dad7e
--- /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 000000000000..d4aa9705d6a7
--- /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 000000000000..de2c99ae6007
--- /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 000000000000..624b6a77fc4b
--- /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 000000000000..a490774e635f
--- /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 000000000000..78315447e4bd
--- /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 000000000000..ba4ebfa06026
--- /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 000000000000..6a68926e43da
--- /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 000000000000..25dba2a344f4
--- /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 000000000000..5893de131560
--- /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 000000000000..6a4522646081
--- /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 000000000000..b8b544511685
--- /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 000000000000..798a1e5a66f8
--- /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 000000000000..5c4ff2023350
--- /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 000000000000..114ff221bed1
--- /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 000000000000..a02f6d552730
--- /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 000000000000..2159d45bd0b6
--- /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 000000000000..20026d9180ea
--- /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 000000000000..52da1ba32c5c
--- /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 000000000000..c6502975e310
--- /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 000000000000..4e5e3ec5d6e8
--- /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 000000000000..1c28ec6e2afd
--- /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 000000000000..ec12dde52231
--- /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 000000000000..1d23db762d34
--- /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 000000000000..a1616fb9d464
--- /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 000000000000..e9573ae3f2e1
--- /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 000000000000..28296d8bf3ba
--- /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 000000000000..4b036754384f
--- /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 000000000000..ce0c98c2cabb
--- /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 000000000000..363d75352e62
--- /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 000000000000..7f435fe5b539
--- /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 000000000000..d3aa61337554
--- /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 000000000000..5644dc3900e3
--- /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 000000000000..b0fa6c9a0ef8
--- /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 e69de29bb2d1..e69de29bb2d1 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 000000000000..e1b6c83b99cc
--- /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 000000000000..526564b88268
--- /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 000000000000..ec8d996704b2
--- /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 000000000000..56404a0c5a20
--- /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 000000000000..ca78261399e1
--- /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 000000000000..2d1f6c84c401
--- /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 000000000000..01df14ac57d5
--- /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 000000000000..24bb934ee503
--- /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 000000000000..7fee0928c575
--- /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 000000000000..96115ec2cbfc
--- /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 000000000000..8cfb04a42417
--- /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 000000000000..842a667e1bcc
--- /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 000000000000..ed46003768c0
--- /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 000000000000..d5947eb9421a
--- /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 000000000000..1a38620fe9cc
--- /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 000000000000..108b3507ddd1
--- /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 000000000000..ac5dde3cb32f
--- /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 000000000000..7f004b7d14ca
--- /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 000000000000..b2d4c9d34799
--- /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 000000000000..998185d26177
--- /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 000000000000..e25524b4e230
--- /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 000000000000..87f1342da995
--- /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 000000000000..7e14f13e29d9
--- /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 000000000000..34eccb98b02a
--- /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 000000000000..fcc710ad933f
--- /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 000000000000..b4866b1642bb
--- /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 000000000000..384db2a6e0af
--- /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 000000000000..99326bd8bf4e
--- /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 000000000000..c613cefd7ec4
--- /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 000000000000..a22c762f7e13
--- /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 000000000000..267f23469775
--- /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 000000000000..661df346c24f
--- /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 000000000000..5c6ecb4f89fd
--- /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 000000000000..03b54796cf83
--- /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 000000000000..031de338f904
--- /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 000000000000..d159169d1050
--- /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 000000000000..96ad7cd8783b
--- /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 000000000000..7a6b4a40ca57
--- /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 000000000000..2c70be784d61
--- /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 000000000000..470da4fc1564
--- /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 000000000000..ac8c6418ba46
--- /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 000000000000..d4aadbfa1084
--- /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 000000000000..7ec46b484640
--- /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 000000000000..3fcc1ca31440
--- /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 000000000000..425528ee3951
--- /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 000000000000..ba77826fd0c2
--- /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 000000000000..bf6d8f516fe0
--- /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 000000000000..6249b1d89243
--- /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 000000000000..e0391091e147
--- /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 000000000000..af7ca1973590
--- /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 000000000000..2f72ae9c0dd5
--- /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 000000000000..56ff59384f2c
--- /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 000000000000..70f5b749989c
--- /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 000000000000..85daf9c26b07
--- /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 000000000000..58819524ced8
--- /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 000000000000..c39b490d6bb6
--- /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 000000000000..d70440ea543c
--- /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 000000000000..7336baf830a1
--- /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 000000000000..024880463c2a
--- /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 000000000000..673c88d1021c
--- /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 000000000000..0ef78841810e
--- /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 000000000000..dc20f42a05cf
--- /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 000000000000..02d90f81c9af
--- /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 000000000000..495eeceb279e
--- /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 000000000000..50fc25a8e53c
--- /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 000000000000..23d345763bf6
--- /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 000000000000..e912594c48a7
--- /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 000000000000..840bc34fffd4
--- /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 000000000000..80cf49af486b
--- /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 000000000000..7f81965fddcd
--- /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 000000000000..fa4de77587f2
--- /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 000000000000..7b3980e6b1d0
--- /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 000000000000..4ce948fec2c9
--- /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 000000000000..6a2f65a86b2c
--- /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 000000000000..1afbd4bbcdbf
--- /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 000000000000..8115469a7cec
--- /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 000000000000..3fd2e965c8d2
--- /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 000000000000..65e111733803
--- /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 000000000000..1f15c931051c
--- /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 000000000000..da6f7a1b181b
--- /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 000000000000..7590f0494411
--- /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 000000000000..3200f31101a0
--- /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 000000000000..ca08d69d142b
--- /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 000000000000..657765d897b5
--- /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 000000000000..82ef9b04e55e
--- /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 000000000000..b8864cb18791
--- /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 000000000000..bdf1435a16fe
--- /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 000000000000..2e140f5939c1
--- /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 000000000000..9cdf55c02576
--- /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 000000000000..82b645ec72ab
--- /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 000000000000..6cf7aaa6fca5
--- /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 000000000000..013d68024d5d
--- /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 000000000000..3ba668490d97
--- /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 000000000000..66fa7d5d37e8
--- /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 000000000000..2fdc3669f492
--- /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 000000000000..dcdfbe532085
--- /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 000000000000..1056f3639752
--- /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 000000000000..dda953bbf4ff
--- /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 000000000000..644c30ad289e
--- /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 000000000000..5b97e035914e
--- /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 000000000000..30e2d4bf5f54
--- /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 000000000000..16847b20b17a
--- /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 000000000000..5dccb639761a
--- /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 000000000000..3e460a3dbcf2
--- /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 000000000000..9a47b54c5605
--- /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 000000000000..8198b4bacc36
--- /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 000000000000..c60aefd1d629
--- /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 000000000000..39264a164fbc
--- /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 000000000000..dc5cb1eb6a0b
--- /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 000000000000..325607cdab62
--- /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 000000000000..5a964108e51e
--- /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 000000000000..7a6cacd5acfe
--- /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 000000000000..b73c1cfed15f
--- /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 000000000000..5bff07b83b99
--- /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 000000000000..456f610df41c
--- /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 000000000000..1d4a54a2c869
--- /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 000000000000..7cf763891fcc
--- /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 000000000000..1b6b3227dbc0
--- /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 000000000000..d2358f292823
--- /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 000000000000..6964873a6394
--- /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 000000000000..9461d51a5979
--- /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 000000000000..a8deec3697b4
--- /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 000000000000..af8bc9e0659b
--- /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 000000000000..11f2714407c7
--- /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 000000000000..7272a61a2fff
--- /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 000000000000..0e61b03da3b3
--- /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 000000000000..947812a814ca
--- /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 000000000000..cba696af53af
--- /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 000000000000..846d5b141f43
--- /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 000000000000..d295cdcdbd59
--- /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 000000000000..84eb17d6470d
--- /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 000000000000..bbd34e3566a5
--- /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 000000000000..6e7bf873c603
--- /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 000000000000..869cf05c19a8
--- /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 c592dda681fe..c592dda681fe 100644
--- a/.clang-format
+++ b/third_party/git/.clang-format
diff --git a/.editorconfig b/third_party/git/.editorconfig
index 42cdc4bbfb05..42cdc4bbfb05 100644
--- a/.editorconfig
+++ b/third_party/git/.editorconfig
diff --git a/.gitattributes b/third_party/git/.gitattributes
index b08a1416d860..b08a1416d860 100644
--- a/.gitattributes
+++ b/third_party/git/.gitattributes
diff --git a/.github/CONTRIBUTING.md b/third_party/git/.github/CONTRIBUTING.md
index e7b4e2f3c204..e7b4e2f3c204 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 952c7c3a2aa1..952c7c3a2aa1 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 000000000000..521d8f4fb421
--- /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 cbeebdab7a5e..cbeebdab7a5e 100644
--- a/.gitmodules
+++ b/third_party/git/.gitmodules
diff --git a/.mailmap b/third_party/git/.mailmap
index 9a5ff0475373..9a5ff0475373 100644
--- a/.mailmap
+++ b/third_party/git/.mailmap
diff --git a/.travis.yml b/third_party/git/.travis.yml
index fc5730b085f1..fc5730b085f1 100644
--- a/.travis.yml
+++ b/third_party/git/.travis.yml
diff --git a/.tsan-suppressions b/third_party/git/.tsan-suppressions
index 8c85014a0a93..8c85014a0a93 100644
--- a/.tsan-suppressions
+++ b/third_party/git/.tsan-suppressions
diff --git a/COPYING b/third_party/git/COPYING
index 536e55524db7..536e55524db7 100644
--- a/COPYING
+++ b/third_party/git/COPYING
diff --git a/Documentation/.gitattributes b/third_party/git/Documentation/.gitattributes
index ddb030137d54..ddb030137d54 100644
--- a/Documentation/.gitattributes
+++ b/third_party/git/Documentation/.gitattributes
diff --git a/Documentation/.gitignore b/third_party/git/Documentation/.gitignore
index 9022d4835545..9022d4835545 100644
--- a/Documentation/.gitignore
+++ b/third_party/git/Documentation/.gitignore
diff --git a/Documentation/CodingGuidelines b/third_party/git/Documentation/CodingGuidelines
index f45db5b72740..f45db5b72740 100644
--- a/Documentation/CodingGuidelines
+++ b/third_party/git/Documentation/CodingGuidelines
diff --git a/Documentation/Makefile b/third_party/git/Documentation/Makefile
index 76f2ecfc1b1a..76f2ecfc1b1a 100644
--- a/Documentation/Makefile
+++ b/third_party/git/Documentation/Makefile
diff --git a/Documentation/MyFirstContribution.txt b/third_party/git/Documentation/MyFirstContribution.txt
index f8670379c0cf..f8670379c0cf 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 fea3f9935b77..fea3f9935b77 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 b061e50ff05b..b061e50ff05b 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 cd500f96bfd7..cd500f96bfd7 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 feefa5dfd4ee..feefa5dfd4ee 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 eeec3d73d01a..eeec3d73d01a 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 c02015ad5fdb..c02015ad5fdb 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 670ad32b8567..670ad32b8567 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 daf4bdb0d7bb..daf4bdb0d7bb 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 91471213bdec..91471213bdec 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 d88456306c50..d88456306c50 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 876408b65a0e..876408b65a0e 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 df2f66ccb5d2..df2f66ccb5d2 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 b0ab8eb371cc..b0ab8eb371cc 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 55f3ac13e3c2..55f3ac13e3c2 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 daed3672709f..daed3672709f 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 d41984df0b6b..d41984df0b6b 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 7bfa34175060..7bfa34175060 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 addb22955b4e..addb22955b4e 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 75cff475f654..75cff475f654 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 e8281c72a0b9..e8281c72a0b9 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 e8328d090a43..e8328d090a43 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 7ff546c743b3..7ff546c743b3 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 4bbde3cab4dc..4bbde3cab4dc 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 d2138469511d..d2138469511d 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 b04b3a45a562..b04b3a45a562 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 7ff1d5d0d100..7ff1d5d0d100 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 069a2b2cf9e9..069a2b2cf9e9 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 2f690616c832..2f690616c832 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 0e3ff58a46f3..0e3ff58a46f3 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 0668d3c0cadc..0668d3c0cadc 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 d4e44b8b09d7..d4e44b8b09d7 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 21d0df59fbb0..21d0df59fbb0 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 b0fc67fb2ade..b0fc67fb2ade 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 323c1a88c7fe..323c1a88c7fe 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 bbd130e36d41..bbd130e36d41 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 3e3c3e55a31f..3e3c3e55a31f 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 9065a0e27346..9065a0e27346 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 f1323b61746e..f1323b61746e 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 7de419708f77..7de419708f77 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 391a7b02eaf3..391a7b02eaf3 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 f22f98b734f8..f22f98b734f8 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 2d0279ecce62..2d0279ecce62 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 30fa3615c77d..30fa3615c77d 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 d5e85cb70ebe..d5e85cb70ebe 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 29322124881b..29322124881b 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 4864b16445f3..4864b16445f3 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 5902a85a7861..5902a85a7861 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 f61dd3504afb..f61dd3504afb 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 d8968f1ecbd9..d8968f1ecbd9 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 47ca1724620f..47ca1724620f 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 79da23db5ac6..79da23db5ac6 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 e143d8d61be1..e143d8d61be1 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 49d7a1cafabd..49d7a1cafabd 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 7d8fb85e1b49..7d8fb85e1b49 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 ae0577836ae8..ae0577836ae8 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 d522661d315c..d522661d315c 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 a08bb96738aa..a08bb96738aa 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 64ece1ffd5cb..64ece1ffd5cb 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 de7ef166b692..de7ef166b692 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 8c594ba02fe6..8c594ba02fe6 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 be37cbb8583b..be37cbb8583b 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 cd08d8174ec1..cd08d8174ec1 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 ccbad794c034..ccbad794c034 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 7b152a6fdc5d..7b152a6fdc5d 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 dfa36416af24..dfa36416af24 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 fafa9986b0e5..fafa9986b0e5 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 4d3c1ac91cf3..4d3c1ac91cf3 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 f4bf1d09863c..f4bf1d09863c 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 b23f9e95d1cb..b23f9e95d1cb 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 ad060f4f8900..ad060f4f8900 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 2400b72ef7bc..2400b72ef7bc 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 b2f3f0293c0d..b2f3f0293c0d 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 1c28398bb640..1c28398bb640 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 cad461bc76f7..cad461bc76f7 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 418c685cf832..418c685cf832 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 e439e45b96a6..e439e45b96a6 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 c11ec0115c64..c11ec0115c64 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 5643e6537de5..5643e6537de5 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 0ead45fc727e..0ead45fc727e 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 eb6307dcbb4a..eb6307dcbb4a 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 7a904419f781..7a904419f781 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 309ba181b27e..309ba181b27e 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 aa7ccce3a23b..aa7ccce3a23b 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 b2fad1b22e0b..b2fad1b22e0b 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 d3a2a3e71243..d3a2a3e71243 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 ecfc57d87563..ecfc57d87563 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 a9eaf76f62e3..a9eaf76f62e3 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 dc5302c21cd2..dc5302c21cd2 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 8b24bebb966c..8b24bebb966c 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 bb469dd71e55..bb469dd71e55 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 ee141c19add2..ee141c19add2 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 f1d0a4ae2d63..f1d0a4ae2d63 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 4eaddc0106e5..4eaddc0106e5 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 11483acaec55..11483acaec55 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 c50b59c4957a..c50b59c4957a 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 8ff5bcada81f..8ff5bcada81f 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 fcb46ca6a4ec..fcb46ca6a4ec 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 3b355737c0c0..3b355737c0c0 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 cf7f60e60d73..cf7f60e60d73 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 3149c91b7b9c..3149c91b7b9c 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 b2852b67d05b..b2852b67d05b 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 d0cb7ca7e27c..d0cb7ca7e27c 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 7f05b48e17b9..7f05b48e17b9 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 bfb31663873c..bfb31663873c 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 0bb8c0b2a2a7..0bb8c0b2a2a7 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 3f6b3148a309..3f6b3148a309 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 61ba14e262a4..61ba14e262a4 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 5b1851844907..5b1851844907 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 7c734b4f7b0e..7c734b4f7b0e 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 9d89fedb36b4..9d89fedb36b4 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 71a86cb7c6d8..71a86cb7c6d8 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 7a7e9d6fd128..7a7e9d6fd128 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 703fbf1d60a7..703fbf1d60a7 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 326670df6e6b..326670df6e6b 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 4db1770e3888..4db1770e3888 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 58100bf04e1c..58100bf04e1c 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 577eccaacd63..577eccaacd63 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 f0cfd02d6ff3..f0cfd02d6ff3 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 64494f89d93a..64494f89d93a 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 3a640c2d4dbd..3a640c2d4dbd 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 0a2ed855c595..0a2ed855c595 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 ba7d3c396653..ba7d3c396653 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 e743a2a8e46e..e743a2a8e46e 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 15b954ca4b01..15b954ca4b01 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 b8f04af19f96..b8f04af19f96 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 69255745e6ea..69255745e6ea 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 ecda427a35ef..ecda427a35ef 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 c6da3cc93956..c6da3cc93956 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 010d8c7de471..010d8c7de471 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 1103c47a4f69..1103c47a4f69 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 71eb6a8b0a5a..71eb6a8b0a5a 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 610960cfe120..610960cfe120 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 f7950a4c04d0..f7950a4c04d0 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 bf976c40db7a..bf976c40db7a 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 15cf01178c1f..15cf01178c1f 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 002c93b9612d..002c93b9612d 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 5c93b85af4a2..5c93b85af4a2 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 9b2b2448dfd4..9b2b2448dfd4 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 e57f7c176db8..e57f7c176db8 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 40f3ba579544..40f3ba579544 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 309c33181f86..309c33181f86 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 79923a6d2f57..79923a6d2f57 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 ef4ce1fcd37a..ef4ce1fcd37a 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 02a3d5bdf65c..02a3d5bdf65c 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 ff06e04a58c0..ff06e04a58c0 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 b7a0eeb22f86..b7a0eeb22f86 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 d5bca731b589..d5bca731b589 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 c6ebd76d1934..c6ebd76d1934 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 951eb7cb0842..951eb7cb0842 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 9c03353af2e9..9c03353af2e9 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 7796df3fe482..7796df3fe482 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 987919c32143..987919c32143 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 42e46ab17f8b..42e46ab17f8b 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 67ae41496511..67ae41496511 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 95971831b90d..95971831b90d 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 e19acac2da5f..e19acac2da5f 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 6713132a9e89..6713132a9e89 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 5343e004005e..5343e004005e 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 9ec498ea39d9..9ec498ea39d9 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 ac9b838e25b3..ac9b838e25b3 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 e6bbef2f0174..e6bbef2f0174 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 09301f095799..09301f095799 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 e5234485e714..e5234485e714 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 7b0931987b1f..7b0931987b1f 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 8df606d45273..8df606d45273 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 e79118d063bb..e79118d063bb 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 6eff128c80b7..6eff128c80b7 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 33dc948b9449..33dc948b9449 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 b9c66aa1b799..b9c66aa1b799 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 a92714c14bcb..a92714c14bcb 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 9bebdbf13d86..9bebdbf13d86 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 011fd2a42838..011fd2a42838 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 d9bf2b741aad..d9bf2b741aad 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 249311361e00..249311361e00 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 6957183dbb00..6957183dbb00 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 e500da75ddc9..e500da75ddc9 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 91c65012f981..91c65012f981 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 e5217a1889cf..e5217a1889cf 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 95cc2bbf2cda..95cc2bbf2cda 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 74bf8825e2be..74bf8825e2be 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 59667d0f2a6d..59667d0f2a6d 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 95320aad5dd2..95320aad5dd2 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 1f372fa0b552..1f372fa0b552 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 8497e051dee7..8497e051dee7 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 92b1e4b36303..92b1e4b36303 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 43883c14f08a..43883c14f08a 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 6cde07ba290c..6cde07ba290c 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 5ab7b18906f0..5ab7b18906f0 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 681cb35c0a3a..681cb35c0a3a 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 22af1d164326..22af1d164326 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 efa68aef226c..efa68aef226c 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 c15cf2e80545..c15cf2e80545 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 d6f9555923ae..d6f9555923ae 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 769a6fc06c9e..769a6fc06c9e 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 708df1ae196c..708df1ae196c 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 613948251add..613948251add 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 fc606ae11623..fc606ae11623 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 986637b7551f..986637b7551f 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 26ae142c3d90..26ae142c3d90 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 9ba4f4da0f4f..9ba4f4da0f4f 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 56f106e2623b..56f106e2623b 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 ead568e7f157..ead568e7f157 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 96090ef599d3..96090ef599d3 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 bf6fb1a02369..bf6fb1a02369 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 267a1b34b4d8..267a1b34b4d8 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 a7c1ce15c061..a7c1ce15c061 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 215bd1a7a27a..215bd1a7a27a 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 02f681b71051..02f681b71051 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 7236aaf2323d..7236aaf2323d 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 3ac4984f10f2..3ac4984f10f2 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 3de2dd0f1947..3de2dd0f1947 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 d18c40389eba..d18c40389eba 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 9191ce948fc8..9191ce948fc8 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 92ff92b1e6e2..92ff92b1e6e2 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 602df0cac2de..602df0cac2de 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 4e4b88aa5c89..4e4b88aa5c89 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 5b0602053caf..5b0602053caf 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 47a34ca964da..47a34ca964da 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 17b05ca7b546..17b05ca7b546 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 e1d183543684..e1d183543684 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 8d6ac0cf5357..8d6ac0cf5357 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 2617372a0c50..2617372a0c50 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 ce5579db3e7c..ce5579db3e7c 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 8e8321b2ef3b..8e8321b2ef3b 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 4047b46bbe8d..4047b46bbe8d 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 7e340921a267..7e340921a267 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 3a16f697e818..3a16f697e818 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 ae4753728eff..ae4753728eff 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 830fc3cc6dd7..830fc3cc6dd7 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 abc3b8928a00..abc3b8928a00 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 acc9ebb886ea..acc9ebb886ea 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 d16e5f041f5d..d16e5f041f5d 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 f4da28ab6690..f4da28ab6690 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 70462f7f7e9b..70462f7f7e9b 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 c4d4397023de..c4d4397023de 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 ad6a01bf8351..ad6a01bf8351 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 ee8142ad244d..ee8142ad244d 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 a498fd6fdc24..a498fd6fdc24 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 b7b7dd361ef0..b7b7dd361ef0 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 9cd14c8197f9..9cd14c8197f9 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 74288511686c..74288511686c 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 4e3b78d0e8f9..4e3b78d0e8f9 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 ad4da8eb09ef..ad4da8eb09ef 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 ef8b97da9b84..ef8b97da9b84 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 a74f7db74767..a74f7db74767 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 441939709c77..441939709c77 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 ebca846d5d80..ebca846d5d80 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 3f569382211d..3f569382211d 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 8fa73cfce7fa..8fa73cfce7fa 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 aa99d4b3cef0..aa99d4b3cef0 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 ed7cd976d923..ed7cd976d923 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 8c2b20071ed2..8c2b20071ed2 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 5d76ad53106b..5d76ad53106b 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 9a9f8f9599df..9a9f8f9599df 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 6949fcda78df..6949fcda78df 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 afcae9c808de..afcae9c808de 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 09fc01406c7c..09fc01406c7c 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 4246c68ff51e..4246c68ff51e 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 9403340f7f50..9403340f7f50 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 bec9186adefe..bec9186adefe 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 977c9e857c0e..977c9e857c0e 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 97755a89d9fb..97755a89d9fb 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 130645fb292a..130645fb292a 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 cdd761bcc207..cdd761bcc207 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 ec06704e637d..ec06704e637d 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 b480e56b684d..b480e56b684d 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 fd2e6f8df786..fd2e6f8df786 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 0c81c5915fdb..0c81c5915fdb 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 66e64361fd30..66e64361fd30 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 a216466d3d71..a216466d3d71 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 64a0bcb0d251..64a0bcb0d251 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 6be538ba30c6..6be538ba30c6 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 cb8ee02a9af8..cb8ee02a9af8 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 c2cf891f71ad..c2cf891f71ad 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 e01384fe8e84..e01384fe8e84 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 ef021be8704f..ef021be8704f 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 3ea280cf68e5..3ea280cf68e5 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 2098cdd776f5..2098cdd776f5 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 a06ccf6e2a26..a06ccf6e2a26 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 da7672674eb8..da7672674eb8 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 759e6ca95738..759e6ca95738 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 e98ecbcff60a..e98ecbcff60a 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 d5a3cd9e7312..d5a3cd9e7312 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 b19a35d94f68..b19a35d94f68 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 5bfffa41060f..5bfffa41060f 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 e71fe3dee13e..e71fe3dee13e 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 dcba888dba4d..dcba888dba4d 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 7a49deddf32a..7a49deddf32a 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 91e6ae9887f5..91e6ae9887f5 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 432762f270fa..432762f270fa 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 e3c4e7826510..e3c4e7826510 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 e3c639c8407f..e3c639c8407f 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 cf9618628874..cf9618628874 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 20c2d2caccfb..20c2d2caccfb 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 93462e45c2e9..93462e45c2e9 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 5ef12644c229..5ef12644c229 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 094c7b853bfc..094c7b853bfc 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 5b309db68924..5b309db68924 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 432f770ef3d2..432f770ef3d2 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 fc95812cb3f0..fc95812cb3f0 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 0b67268a9660..0b67268a9660 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 1a2ad3235a52..1a2ad3235a52 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 cde64be5359b..cde64be5359b 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 a65a6c582929..a65a6c582929 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 702d8d4e224e..702d8d4e224e 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 723360295c12..723360295c12 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 7d15f94725f1..7d15f94725f1 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 250cdc423c9f..250cdc423c9f 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 914d2c186000..914d2c186000 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 f1ccd001bec3..f1ccd001bec3 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 568297ccb7f1..568297ccb7f1 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 b53f3539399a..b53f3539399a 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 b3ac412b829c..b3ac412b829c 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 ad946b267378..ad946b267378 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 09af9ddbc77b..09af9ddbc77b 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 87044504c524..87044504c524 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 b70553308af8..b70553308af8 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 3f749398bbc8..3f749398bbc8 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 d1436857cb54..d1436857cb54 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 b8a2f93ee707..b8a2f93ee707 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 37eae9a2d98b..37eae9a2d98b 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 9cd025bb1c2e..9cd025bb1c2e 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 7288aaf71679..7288aaf71679 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 f37ea89cda2f..f37ea89cda2f 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 5b65e3524577..5b65e3524577 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 fc6fe1711f81..fc6fe1711f81 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 b0256a2dc9a8..b0256a2dc9a8 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 f0924b62e03b..f0924b62e03b 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 023ad85ec644..023ad85ec644 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 1335de49a614..1335de49a614 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 563dadc57e84..563dadc57e84 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 6553d69e332c..6553d69e332c 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 4feef7670483..4feef7670483 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 6adf038915e8..6adf038915e8 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 883ae896feef..883ae896feef 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 83559ce3b2f0..83559ce3b2f0 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 4c6d1dcd4a6a..4c6d1dcd4a6a 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 25079710fa28..25079710fa28 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 ef6d80b008a0..ef6d80b008a0 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 447b1933a8f3..447b1933a8f3 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 fedd9968e5e3..fedd9968e5e3 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 f4e255283667..f4e255283667 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 7bd179fa127f..7bd179fa127f 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 d8db55d920d5..d8db55d920d5 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 b61d36712fa7..b61d36712fa7 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 338394097ebf..338394097ebf 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 2620003dcf32..2620003dcf32 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 695b86f612fa..695b86f612fa 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 9768293831a5..9768293831a5 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 668313ae5567..668313ae5567 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 6d589e118c17..6d589e118c17 100644
--- a/Documentation/SubmittingPatches
+++ b/third_party/git/Documentation/SubmittingPatches
diff --git a/Documentation/asciidoc.conf b/third_party/git/Documentation/asciidoc.conf
index 2c16c536ba83..2c16c536ba83 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 0089e0cfb80d..0089e0cfb80d 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 5d122db6e9e6..5d122db6e9e6 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 ba4205e0302a..ba4205e0302a 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 14d2f8341517..14d2f8341517 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 5aa73cfe458d..5aa73cfe458d 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 e3f5bc3396d0..e3f5bc3396d0 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 4d753f006ec1..4d753f006ec1 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 6aaa36020298..6aaa36020298 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 f1ca739d5742..f1ca739d5742 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 5bcad2efb116..5bcad2efb116 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 8fb8ef763dfd..8fb8ef763dfd 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 9468e8599c0c..9468e8599c0c 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 a592d522a744..a592d522a744 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 195df207a6ef..195df207a6ef 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 6b646813abad..6b646813abad 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 a807c925b9ca..a807c925b9ca 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 d5daacb13a2c..d5daacb13a2c 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 76aa2f29dc21..76aa2f29dc21 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 2c95573930be..2c95573930be 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 4d99bf33c904..4d99bf33c904 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 75538d27e7e0..75538d27e7e0 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 60fb3189e161..60fb3189e161 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 5afb5a2cbc69..5afb5a2cbc69 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 67625944804f..67625944804f 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 c1166e330d55..c1166e330d55 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 ba890b5884fc..ba890b5884fc 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 90dfe0ba5aaa..90dfe0ba5aaa 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 c73cfa90b70c..c73cfa90b70c 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 414a5a8a9d7d..414a5a8a9d7d 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 450e8c38e343..450e8c38e343 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 02b92b18b5c2..02b92b18b5c2 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 02da427fd974..02da427fd974 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 1b51475108d7..1b51475108d7 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 cce2c8924598..cce2c8924598 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 44abe45a7cad..44abe45a7cad 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 d30831a13080..d30831a13080 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 43fb9466ff05..43fb9466ff05 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 224bbf5a28a2..224bbf5a28a2 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 5a32f5b0a5a9..5a32f5b0a5a9 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 cc256217317c..cc256217317c 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 06166fb5c04f..06166fb5c04f 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 f18150304106..f18150304106 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 46fa8c6a0827..46fa8c6a0827 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 50cb2f7d62ab..50cb2f7d62ab 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 a2d3c7ec449e..a2d3c7ec449e 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 e9e1e397f3fd..e9e1e397f3fd 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 3854d4ae37cd..3854d4ae37cd 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 48cbc30722bb..48cbc30722bb 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 a727d987a8d4..a727d987a8d4 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 6a313937f8c0..6a313937f8c0 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 09ed31dbfa9c..09ed31dbfa9c 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 aeef56d49ae9..aeef56d49ae9 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 9cdcfa732478..9cdcfa732478 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 d3731cf66c19..d3731cf66c19 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 063c6b63d929..063c6b63d929 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 bfccc074913e..bfccc074913e 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 b87cab31b39c..b87cab31b39c 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 0a0e000569d8..0a0e000569d8 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 d98e32d812e7..d98e32d812e7 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 65f78aac37fd..65f78aac37fd 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 6c4cad83a2c9..6c4cad83a2c9 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 4cfe03221e32..4cfe03221e32 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 9c413e177e02..9c413e177e02 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 40abdf6a6b5d..40abdf6a6b5d 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 63b7c45aac2c..63b7c45aac2c 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 0006faf800ae..0006faf800ae 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 b48d532a9697..b48d532a9697 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 e79ecd9ee90a..e79ecd9ee90a 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 afdb186df8ba..afdb186df8ba 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 2ca4bf93e1e3..2ca4bf93e1e3 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 abc7ef4a3a5c..abc7ef4a3a5c 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 0fc704ab80b2..0fc704ab80b2 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 0a1293b05135..0a1293b05135 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 ef5adb3f420d..ef5adb3f420d 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 2edbfb02fe5b..2edbfb02fe5b 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 f5b6245270e0..f5b6245270e0 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 e0698e8c1d91..e0698e8c1d91 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 ed1c835695c3..ed1c835695c3 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 e5566c371d16..e5566c371d16 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 0557cbbceb81..0557cbbceb81 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 6c7cc054fad2..6c7cc054fad2 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 beec8d1303a9..beec8d1303a9 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 048e349482df..048e349482df 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 6926e0a4c86a..6926e0a4c86a 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 4d846d73463c..4d846d73463c 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 f10ca410ad8a..f10ca410ad8a 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 09faee3b44db..09faee3b44db 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 3355be479812..3355be479812 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 e11c8f053ad7..e11c8f053ad7 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 da8b05b92283..da8b05b92283 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 ae555bd47e12..ae555bd47e12 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 3c9b4f9e0951..3c9b4f9e0951 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 ff7d78f620a3..ff7d78f620a3 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 8b0e4c7fa8c5..8b0e4c7fa8c5 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 fc3b993c3338..fc3b993c3338 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 e44a831339d4..e44a831339d4 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 b9aa39000fc8..b9aa39000fc8 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 a595a0ffeee5..a595a0ffeee5 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 cfa1e4ebe486..cfa1e4ebe486 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 e99925184d03..e99925184d03 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 4b45d837a7e7..4b45d837a7e7 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 7e8154199635..7e8154199635 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 135206ff4aba..135206ff4aba 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 7d6c9dcd177b..7d6c9dcd177b 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 8eca671b8278..8eca671b8278 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 3c0578217ba7..3c0578217ba7 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 8b42cb3fb20a..8b42cb3fb20a 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 aa2055dbebcd..aa2055dbebcd 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 ee6a4144fbef..ee6a4144fbef 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 4d33e7be0f55..4d33e7be0f55 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 cf3cac0a2b51..cf3cac0a2b51 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 83ce51aedfea..83ce51aedfea 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 0ea921a59316..0ea921a59316 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 c7a11c36c100..c7a11c36c100 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 0028ff12d1da..0028ff12d1da 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 34011c2940ad..34011c2940ad 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 f58e9c43e60c..f58e9c43e60c 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 eb5e7865f0ef..eb5e7865f0ef 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 4b90b9c12a4a..4b90b9c12a4a 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 76281932847b..76281932847b 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 ff9310f9588a..ff9310f9588a 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 cb9b4d2e460a..cb9b4d2e460a 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 7051c6bdf8f5..7051c6bdf8f5 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 0216c18ef80c..0216c18ef80c 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 693dd9d9d760..693dd9d9d760 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 b21144037311..b21144037311 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 00154b6c85a7..00154b6c85a7 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 de1ebed67d7c..de1ebed67d7c 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 79e22b1f3a13..79e22b1f3a13 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 fdc28c041c72..fdc28c041c72 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 a88f6ae2c6e7..a88f6ae2c6e7 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 906774f0f7e0..906774f0f7e0 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 f4bd8155c0a7..f4bd8155c0a7 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 5c8a2a5e9755..5c8a2a5e9755 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 72179d993cb9..72179d993cb9 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 484c485fd06c..484c485fd06c 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 cc940eb9ada3..cc940eb9ada3 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 fad327aecc1b..fad327aecc1b 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 c9758847937e..c9758847937e 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 5b1909fdf4ff..5b1909fdf4ff 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 6b53dd7e06a2..6b53dd7e06a2 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 6793d8fc0521..6793d8fc0521 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 6dcd39f6f63d..6dcd39f6f63d 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 b9b97e63aec5..b9b97e63aec5 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 eec4bdb600d8..eec4bdb600d8 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 d72d15be5bab..d72d15be5bab 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 247f765604b0..247f765604b0 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 ac44d85b0b5c..ac44d85b0b5c 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 2d27969057fd..2d27969057fd 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 5f93f8003d1d..5f93f8003d1d 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 df9e2c58bdbc..df9e2c58bdbc 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 f71db0daa243..f71db0daa243 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 558966aa8379..558966aa8379 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 666b042679f4..666b042679f4 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 ea03a4eeb0fd..ea03a4eeb0fd 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 65b53fcc47d6..65b53fcc47d6 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 d5b7560bfe2d..d5b7560bfe2d 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 648a6cd78ada..648a6cd78ada 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 32880aafb0c5..32880aafb0c5 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 a54fe4401bd1..a54fe4401bd1 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 96ec6499f001..96ec6499f001 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 b406bc4c48f4..b406bc4c48f4 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 8461c0e83e9d..8461c0e83e9d 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 0b057cbb100c..0b057cbb100c 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 a7515714da1a..a7515714da1a 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 3bbc731f67e5..3bbc731f67e5 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 e3b2a88c4b75..e3b2a88c4b75 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 261d5c116454..261d5c116454 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 f85603261325..f85603261325 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 02676fb39197..02676fb39197 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 04e803d5d336..04e803d5d336 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 58731c194229..58731c194229 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 01fd52dc7063..01fd52dc7063 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 4da9d240962f..4da9d240962f 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 6b14702e7849..6b14702e7849 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 fa6a7561236f..fa6a7561236f 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 27fe2b32e10b..27fe2b32e10b 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 233b2b786271..233b2b786271 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 79449bf98fe5..79449bf98fe5 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 5cb0eb0855fe..5cb0eb0855fe 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 f56a5a91975d..f56a5a91975d 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 3494a1db3ebf..3494a1db3ebf 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 fecdf2600cc9..fecdf2600cc9 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 f2869da57282..f2869da57282 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 154081f2de26..154081f2de26 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 a45ea1ece81a..a45ea1ece81a 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 442caff8a9c3..442caff8a9c3 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 9fed59a31724..9fed59a31724 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 03552dd86fc4..03552dd86fc4 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 dfb901f8b835..dfb901f8b835 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 3b8053447e20..3b8053447e20 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 70562dc4c023..70562dc4c023 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 8a6ea2c6c5c7..8a6ea2c6c5c7 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 d27184260856..d27184260856 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 6156609cf714..6156609cf714 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 dedf97efbb22..dedf97efbb22 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 ff487ff77d39..ff487ff77d39 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 88ea7e1cc012..88ea7e1cc012 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 0451ceb8a26d..0451ceb8a26d 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 6f353ebfd374..6f353ebfd374 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 9659abbf8e08..9659abbf8e08 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 92f146d27dc3..92f146d27dc3 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 246dc9943c22..246dc9943c22 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 4d4392d0f841..4d4392d0f841 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 4cfc88337808..4cfc88337808 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 97e0544d9e1e..97e0544d9e1e 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 1ab2e40ea938..1ab2e40ea938 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 9392760b2541..9392760b2541 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 e72d332b8316..e72d332b8316 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 9d22270757c9..9d22270757c9 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 b5c46223c44b..b5c46223c44b 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 d93e5d0f58f0..d93e5d0f58f0 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 44fd146b9120..44fd146b9120 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 2ffaf9392e59..2ffaf9392e59 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 60cf49cb2a38..60cf49cb2a38 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 8632612c31d0..8632612c31d0 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 11361f33e939..11361f33e939 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 bc80905a8a06..bc80905a8a06 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 5cc2fcefbab1..5cc2fcefbab1 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 424e4ba84cf9..424e4ba84cf9 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 ab4d271925da..ab4d271925da 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 fcf528c1b30d..fcf528c1b30d 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 25bcda936dbe..25bcda936dbe 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 8fbe12c66c82..8fbe12c66c82 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 d4e8f24f0c86..d4e8f24f0c86 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 2438f76da05e..2438f76da05e 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 0ed5c24dc1ce..0ed5c24dc1ce 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 30711625fdec..30711625fdec 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 197900363b0b..197900363b0b 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 ef68ad2b7112..ef68ad2b7112 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 2e5599a67f86..2e5599a67f86 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 d0fec4cddd2a..d0fec4cddd2a 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 e9f148a00ddb..e9f148a00ddb 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 b3de50d71068..b3de50d71068 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 1c4d146a41ce..1c4d146a41ce 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 96714231179c..96714231179c 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 969bb2e15f10..969bb2e15f10 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 fba0f1c1b27c..fba0f1c1b27c 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 9822c1eb1add..9822c1eb1add 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 6072f936ab5e..6072f936ab5e 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 92097f6673d8..92097f6673d8 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 61ca6d04c206..61ca6d04c206 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 0b8075dad965..0b8075dad965 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 8d162b56c590..8d162b56c590 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 8b63ceb00e71..8b63ceb00e71 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 85d92c9761da..85d92c9761da 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 f22041a9dc39..f22041a9dc39 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 9b82564d1aa9..9b82564d1aa9 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 fb1d188d440c..fb1d188d440c 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 1ed3ca33b7a9..1ed3ca33b7a9 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 f880d21dfb52..f880d21dfb52 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 adc759612de9..adc759612de9 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 1cd1283d0f81..1cd1283d0f81 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 c970d9fe438a..c970d9fe438a 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 1bd919f92bdd..1bd919f92bdd 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 571f640f5c1c..571f640f5c1c 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 82cd573776ce..82cd573776ce 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 d47b1ae29637..d47b1ae29637 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 1eabb0aaf3ae..1eabb0aaf3ae 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 a66e95b70c36..a66e95b70c36 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 b614969ad2c1..b614969ad2c1 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 43f80c806838..43f80c806838 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 216b11ee88f4..216b11ee88f4 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 d407b7dee127..d407b7dee127 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 0a890205b8b5..0a890205b8b5 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 8bdb7d0bd3aa..8bdb7d0bd3aa 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 59ef5cef1f08..59ef5cef1f08 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 35317e71c870..35317e71c870 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 3cc9b034c435..3cc9b034c435 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 abc0dc6bc79b..abc0dc6bc79b 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 090c888335d3..090c888335d3 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 167b363668b8..167b363668b8 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 35d48ef714e9..35d48ef714e9 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 ca4378740c6a..ca4378740c6a 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 15a4c8031f1f..15a4c8031f1f 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 02cb5f758d6f..02cb5f758d6f 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 db219f5c0745..db219f5c0745 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 1b3b188d3c15..1b3b188d3c15 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 8994e2559eac..8994e2559eac 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 19f59cc88808..19f59cc88808 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 149508e13bda..149508e13bda 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 bd1027433bb7..bd1027433bb7 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 bfe6f9b50063..bfe6f9b50063 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 89821ec74fe1..89821ec74fe1 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 7af2e52cf312..7af2e52cf312 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 a499a94ac228..a499a94ac228 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 bbf040eda8af..bbf040eda8af 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 7e36e5b55b1a..7e36e5b55b1a 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 17231d8e5959..17231d8e5959 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 ed8b4ff3e587..ed8b4ff3e587 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 829676ff9833..829676ff9833 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 476cc30b837e..476cc30b837e 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 4a8c276529a5..4a8c276529a5 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 b4d315cb8c47..b4d315cb8c47 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 e800904df332..e800904df332 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 a264fa616093..a264fa616093 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 608eb5df6281..608eb5df6281 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 a48f5b11f3dc..a48f5b11f3dc 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 aeb8839f33d0..aeb8839f33d0 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 a63c7632a87d..a63c7632a87d 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 79a00d2a4abd..79a00d2a4abd 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 aa66cbe41eaf..aa66cbe41eaf 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 079598307a38..079598307a38 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 e44fc8f7388d..e44fc8f7388d 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 7d3a60f5b936..7d3a60f5b936 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 bb1251c0364d..bb1251c0364d 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 97f995e5a9a6..97f995e5a9a6 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 3bceb5647411..3bceb5647411 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 8aa891daee05..8aa891daee05 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 5a59b548448f..5a59b548448f 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 870c8edbfb1d..870c8edbfb1d 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 7d20716c32a4..7d20716c32a4 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 75368f26ca28..75368f26ca28 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 30fc0e9c93b2..30fc0e9c93b2 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 5abb8e8b1fdb..5abb8e8b1fdb 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 ceeedd485c96..ceeedd485c96 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 45f0df600fab..45f0df600fab 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 a69cc8964d58..a69cc8964d58 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 d0d1707c8c88..d0d1707c8c88 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 eda8c195c196..eda8c195c196 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 9c3f4131b858..9c3f4131b858 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 9dc1bed768a4..9dc1bed768a4 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 5b29622d00ea..5b29622d00ea 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 c97428c2c349..c97428c2c349 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 2e2e7c10c620..2e2e7c10c620 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 e8a1bce94e05..e8a1bce94e05 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 ad9d019ff9b4..ad9d019ff9b4 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 f10941b2e816..f10941b2e816 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 03f9ea6ac4ba..03f9ea6ac4ba 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 8bf3e37f5375..8bf3e37f5375 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 eb1fa9853ef6..eb1fa9853ef6 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 9e1189ef01df..9e1189ef01df 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 fb060893931f..fb060893931f 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 fadb5979c48b..fadb5979c48b 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 71eb081fed25..71eb081fed25 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 bde18622a874..bde18622a874 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 6296ecad1d65..6296ecad1d65 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 f8c18a0f7aec..f8c18a0f7aec 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 a4f17441aed3..a4f17441aed3 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 729fbcb32f87..729fbcb32f87 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 844629c8c441..844629c8c441 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 2ae8fa470ada..2ae8fa470ada 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 9c5b6f0facbf..9c5b6f0facbf 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 7c4d67aa6a7f..7c4d67aa6a7f 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 aa0aa9af1c2e..aa0aa9af1c2e 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 d7e57639f70d..d7e57639f70d 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 cab5bdd2ff0f..cab5bdd2ff0f 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 95a07db6e82b..95a07db6e82b 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 c73e72de0e9c..c73e72de0e9c 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 896c7b387886..896c7b387886 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 2b267c0da6b2..2b267c0da6b2 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 ecedb34bba54..ecedb34bba54 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 40f91f6b1ee1..40f91f6b1ee1 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 4a8be4d144cf..4a8be4d144cf 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 7844ef30ffde..7844ef30ffde 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 aa22d7ace893..aa22d7ace893 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 9b5a0bc18667..9b5a0bc18667 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 01dedfe9ffed..01dedfe9ffed 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 2c9406a56a88..2c9406a56a88 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 1f1c33d0da30..1f1c33d0da30 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 0f8ff07ecaa3..0f8ff07ecaa3 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 27d3c64e6655..27d3c64e6655 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 914bacc39e0c..914bacc39e0c 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 bd184cd6539a..bd184cd6539a 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 bc354fe2dce5..bc354fe2dce5 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 d87294de2f54..d87294de2f54 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 8bce75b2cf2b..8bce75b2cf2b 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 a1539a7ce682..a1539a7ce682 100755
--- a/GIT-VERSION-GEN
+++ b/third_party/git/GIT-VERSION-GEN
diff --git a/INSTALL b/third_party/git/INSTALL
index c39006e8e7e5..c39006e8e7e5 100644
--- a/INSTALL
+++ b/third_party/git/INSTALL
diff --git a/LGPL-2.1 b/third_party/git/LGPL-2.1
index d38b1b92bdb2..d38b1b92bdb2 100644
--- a/LGPL-2.1
+++ b/third_party/git/LGPL-2.1
diff --git a/Makefile b/third_party/git/Makefile
index f9255344ae50..f9255344ae50 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 000000000000..e1d2b82209bb
--- /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 248d137c43b1..248d137c43b1 120000
--- a/RelNotes
+++ b/third_party/git/RelNotes
diff --git a/abspath.c b/third_party/git/abspath.c
index 985798532994..985798532994 100644
--- a/abspath.c
+++ b/third_party/git/abspath.c
diff --git a/aclocal.m4 b/third_party/git/aclocal.m4
index f11bc7ed7df2..f11bc7ed7df2 100644
--- a/aclocal.m4
+++ b/third_party/git/aclocal.m4
diff --git a/advice.c b/third_party/git/advice.c
index 3ee0ee2d8fbb..3ee0ee2d8fbb 100644
--- a/advice.c
+++ b/third_party/git/advice.c
diff --git a/advice.h b/third_party/git/advice.h
index d0154048431c..d0154048431c 100644
--- a/advice.h
+++ b/third_party/git/advice.h
diff --git a/alias.c b/third_party/git/alias.c
index c4715380205b..c4715380205b 100644
--- a/alias.c
+++ b/third_party/git/alias.c
diff --git a/alias.h b/third_party/git/alias.h
index aef4843bb782..aef4843bb782 100644
--- a/alias.h
+++ b/third_party/git/alias.h
diff --git a/alloc.c b/third_party/git/alloc.c
index 1c64c4dd1629..1c64c4dd1629 100644
--- a/alloc.c
+++ b/third_party/git/alloc.c
diff --git a/alloc.h b/third_party/git/alloc.h
index ed1071c11ea3..ed1071c11ea3 100644
--- a/alloc.h
+++ b/third_party/git/alloc.h
diff --git a/apply.c b/third_party/git/apply.c
index cde95369bb3f..cde95369bb3f 100644
--- a/apply.c
+++ b/third_party/git/apply.c
diff --git a/apply.h b/third_party/git/apply.h
index a7951934352c..a7951934352c 100644
--- a/apply.h
+++ b/third_party/git/apply.h
diff --git a/archive-tar.c b/third_party/git/archive-tar.c
index 3e53aac1e652..3e53aac1e652 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 4d66b5be6e88..4d66b5be6e88 100644
--- a/archive-zip.c
+++ b/third_party/git/archive-zip.c
diff --git a/archive.c b/third_party/git/archive.c
index a8da0fcc4f0c..a8da0fcc4f0c 100644
--- a/archive.c
+++ b/third_party/git/archive.c
diff --git a/archive.h b/third_party/git/archive.h
index e60e3dd31c79..e60e3dd31c79 100644
--- a/archive.h
+++ b/third_party/git/archive.h
diff --git a/argv-array.c b/third_party/git/argv-array.c
index f352ea9357d9..f352ea9357d9 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 a39ba43f57ce..a39ba43f57ce 100644
--- a/argv-array.h
+++ b/third_party/git/argv-array.h
diff --git a/attr.c b/third_party/git/attr.c
index 93dc16b59cd6..93dc16b59cd6 100644
--- a/attr.c
+++ b/third_party/git/attr.c
diff --git a/attr.h b/third_party/git/attr.h
index b0378bfe5fea..b0378bfe5fea 100644
--- a/attr.h
+++ b/third_party/git/attr.h
diff --git a/azure-pipelines.yml b/third_party/git/azure-pipelines.yml
index c329b7218bb3..c329b7218bb3 100644
--- a/azure-pipelines.yml
+++ b/third_party/git/azure-pipelines.yml
diff --git a/banned.h b/third_party/git/banned.h
index 447af24807f4..447af24807f4 100644
--- a/banned.h
+++ b/third_party/git/banned.h
diff --git a/base85.c b/third_party/git/base85.c
index 5ca601ee14fd..5ca601ee14fd 100644
--- a/base85.c
+++ b/third_party/git/base85.c
diff --git a/bisect.c b/third_party/git/bisect.c
index e87ac29a51be..e87ac29a51be 100644
--- a/bisect.c
+++ b/third_party/git/bisect.c
diff --git a/bisect.h b/third_party/git/bisect.h
index 4e69a11ea8f3..4e69a11ea8f3 100644
--- a/bisect.h
+++ b/third_party/git/bisect.h
diff --git a/blame.c b/third_party/git/blame.c
index 36a2e7ef119d..36a2e7ef119d 100644
--- a/blame.c
+++ b/third_party/git/blame.c
diff --git a/blame.h b/third_party/git/blame.h
index 4a9e1270b036..4a9e1270b036 100644
--- a/blame.h
+++ b/third_party/git/blame.h
diff --git a/blob.c b/third_party/git/blob.c
index 36f9abda19ec..36f9abda19ec 100644
--- a/blob.c
+++ b/third_party/git/blob.c
diff --git a/blob.h b/third_party/git/blob.h
index 166487205578..166487205578 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 22b125cf8c12..22b125cf8c12 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 4df67477526a..4df67477526a 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 579494738a7f..579494738a7f 100644
--- a/branch.c
+++ b/third_party/git/branch.c
diff --git a/branch.h b/third_party/git/branch.h
index df0be61506fd..df0be61506fd 100644
--- a/branch.h
+++ b/third_party/git/branch.h
diff --git a/builtin.h b/third_party/git/builtin.h
index 5cf5df69f72f..5cf5df69f72f 100644
--- a/builtin.h
+++ b/third_party/git/builtin.h
diff --git a/builtin/add.c b/third_party/git/builtin/add.c
index dd18e5c9b670..dd18e5c9b670 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 1aea657a7f0b..1aea657a7f0b 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 da413ae0d178..da413ae0d178 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 3f099b960565..3f099b960565 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 45d11669aae4..45d11669aae4 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 1fbe156e67a4..1fbe156e67a4 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 b6534d4dea9a..b6534d4dea9a 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 2ef214632f02..2ef214632f02 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 1ea4bfdfc198..1ea4bfdfc198 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 995d47c85aad..995d47c85aad 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 dd833977864d..dd833977864d 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 599097304b77..599097304b77 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 cdce144f3b7f..cdce144f3b7f 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 bc67d3f0a83d..bc67d3f0a83d 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 1ac1cc290ed7..1ac1cc290ed7 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 6123f732a2c8..6123f732a2c8 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 d5579da716e0..d5579da716e0 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 f665b28ccccf..f665b28ccccf 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 e815e148aa18..e815e148aa18 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 38027b83d9d8..38027b83d9d8 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 b866d8395104..b866d8395104 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 ae7aaf6dc683..ae7aaf6dc683 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 98d65bc0ad4f..98d65bc0ad4f 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 3fae474f6f1f..3fae474f6f1f 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 879acfbcda75..879acfbcda75 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 200154297d5e..200154297d5e 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 86ae474fbfb4..86ae474fbfb4 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 93ec6424234c..93ec6424234c 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 cb9ea793675c..cb9ea793675c 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 42ac803091e6..42ac803091e6 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 16eb8b70ea33..16eb8b70ea33 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 23c214fff6d6..23c214fff6d6 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 f541f55d333b..f541f55d333b 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 dc1485c8aa1b..dc1485c8aa1b 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 717dd14e8961..717dd14e8961 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 a4615587fd79..a4615587fd79 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 465153e85337..465153e85337 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 18403a94fa42..18403a94fa42 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 c18efadda53e..c18efadda53e 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 491af9202dc9..491af9202dc9 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 560051784ef7..560051784ef7 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 640ef4ded595..640ef4ded595 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 e5590d7787c5..e5590d7787c5 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 0d55f73b0b44..0d55f73b0b44 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 944ec77fe103..944ec77fe103 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 f101d092b883..f101d092b883 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 44b10b341541..44b10b341541 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 670e8fb93c93..670e8fb93c93 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 6ef519514bd1..6ef519514bd1 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 7cad3f24ebd0..7cad3f24ebd0 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 cfb667a594c8..cfb667a594c8 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 664400b8169b..664400b8169b 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 e3f8da13b69b..e3f8da13b69b 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 06a2f90c4875..06a2f90c4875 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 38ea6ad6ca25..38ea6ad6ca25 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 459450742053..459450742053 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 5b910e351e4d..5b910e351e4d 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 97b54caeb900..97b54caeb900 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 e2ccbc44e204..e2ccbc44e204 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 6fb7dc8578d6..6fb7dc8578d6 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 891991b00d67..891991b00d67 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 b1ea1a6aa177..b1ea1a6aa177 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 be15ba7044e0..be15ba7044e0 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 c785fe16bade..c785fe16bade 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 02e97f55c5a0..02e97f55c5a0 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 76ce9069467e..76ce9069467e 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 178e3409b7f8..178e3409b7f8 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 cfbd5c36c764..cfbd5c36c764 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 bd28b80b2d0f..bd28b80b2d0f 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 48c5e78e339d..48c5e78e339d 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 2b76872ad220..2b76872ad220 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 f1eaf6e6edb1..f1eaf6e6edb1 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 021dd3b1e489..021dd3b1e489 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 9202e7554476..9202e7554476 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 ca5e655d2f8b..ca5e655d2f8b 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 670096c065f5..670096c065f5 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 dcf385511f07..dcf385511f07 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 4d3430900d06..4d3430900d06 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 6a9127a33c01..6a9127a33c01 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 91dfe07e06a1..91dfe07e06a1 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 5591cef77543..5591cef77543 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 632c0c0a7942..632c0c0a7942 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 644b21ca8d57..644b21ca8d57 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 fd3be17b976c..fd3be17b976c 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 fdd572168b51..fdd572168b51 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 301ccb970bb3..301ccb970bb3 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 f8bbe6d47ec3..f8bbe6d47ec3 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 f61cc5d82cf2..f61cc5d82cf2 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 19ce95a901bc..19ce95a901bc 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 098ebf22d0d6..098ebf22d0d6 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 65cd41392c1c..65cd41392c1c 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 35d7f51c236d..35d7f51c236d 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 a6e678809efe..a6e678809efe 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 6456da70cc2c..6456da70cc2c 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 b5a301f24d7a..b5a301f24d7a 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 be33eb83c1b7..be33eb83c1b7 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 909e77e802d3..909e77e802d3 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 80237f0df10f..80237f0df10f 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 e0a4c2538284..e0a4c2538284 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 58652229f273..58652229f273 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 a87a4bfd2c55..a87a4bfd2c55 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 dff2f4b83720..dff2f4b83720 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 2d8f7f05785d..2d8f7f05785d 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 4321a344567e..4321a344567e 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 018879737aee..018879737aee 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 6da8fa2607c6..6da8fa2607c6 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 6c6f46b4aeaf..6c6f46b4aeaf 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 40c69a0bedde..40c69a0bedde 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 c2a1a5c50484..c2a1a5c50484 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 f45136a06ba7..f45136a06ba7 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 a5bb02b2076a..a5bb02b2076a 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 45d61707e7d1..45d61707e7d1 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 39ee7d6107c1..39ee7d6107c1 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 b26f3dc3b74c..b26f3dc3b74c 100644
--- a/bulk-checkin.h
+++ b/third_party/git/bulk-checkin.h
diff --git a/bundle.c b/third_party/git/bundle.c
index b5d21cd80f1c..b5d21cd80f1c 100644
--- a/bundle.c
+++ b/third_party/git/bundle.c
diff --git a/bundle.h b/third_party/git/bundle.h
index 37c37d7f653c..37c37d7f653c 100644
--- a/bundle.h
+++ b/third_party/git/bundle.h
diff --git a/cache-tree.c b/third_party/git/cache-tree.c
index 706ffcf1883a..706ffcf1883a 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 757bbc48bca1..757bbc48bca1 100644
--- a/cache-tree.h
+++ b/third_party/git/cache-tree.h
diff --git a/cache.h b/third_party/git/cache.h
index b1da1ab08faa..b1da1ab08faa 100644
--- a/cache.h
+++ b/third_party/git/cache.h
diff --git a/chdir-notify.c b/third_party/git/chdir-notify.c
index 5f7f2c2ac236..5f7f2c2ac236 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 366e4c1ee990..366e4c1ee990 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 a0aaf3a3473c..a0aaf3a3473c 100755
--- a/check-builtins.sh
+++ b/third_party/git/check-builtins.sh
diff --git a/check_bindir b/third_party/git/check_bindir
index 623eadcbb7dd..623eadcbb7dd 100755
--- a/check_bindir
+++ b/third_party/git/check_bindir
diff --git a/checkout.c b/third_party/git/checkout.c
index c72e9f9773e1..c72e9f9773e1 100644
--- a/checkout.c
+++ b/third_party/git/checkout.c
diff --git a/checkout.h b/third_party/git/checkout.h
index 1152133bd77a..1152133bd77a 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 8cc72503cb76..8cc72503cb76 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 44db2d5cbb22..44db2d5cbb22 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 646967481f6d..646967481f6d 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 26b58a80960f..26b58a80960f 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 e688a26f0d61..e688a26f0d61 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 ff0ef7f08e75..ff0ef7f08e75 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 e3a193adbce3..e3a193adbce3 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 751acfcf8a8c..751acfcf8a8c 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 a19aa7ebbc09..a19aa7ebbc09 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 f8c2c3106a2e..f8c2c3106a2e 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 d49089832de0..d49089832de0 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 8e67bec21a27..8e67bec21a27 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 ebb222ec3323..ebb222ec3323 100644
--- a/color.c
+++ b/third_party/git/color.c
diff --git a/color.h b/third_party/git/color.h
index 98894d6a1756..98894d6a1756 100644
--- a/color.h
+++ b/third_party/git/color.h
diff --git a/column.c b/third_party/git/column.c
index 7a17c14b822f..7a17c14b822f 100644
--- a/column.c
+++ b/third_party/git/column.c
diff --git a/column.h b/third_party/git/column.h
index 448c7440b3f0..448c7440b3f0 100644
--- a/column.h
+++ b/third_party/git/column.h
diff --git a/combine-diff.c b/third_party/git/combine-diff.c
index 3e49f3bda84b..3e49f3bda84b 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 a9ac72bef487..a9ac72bef487 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 fe954ab5f845..fe954ab5f845 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 df9a3b20e4ab..df9a3b20e4ab 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 3ea174788a4f..3ea174788a4f 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 99a43e8b64fc..99a43e8b64fc 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 adc7b46c83b1..adc7b46c83b1 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 5c0eb91a5d17..5c0eb91a5d17 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 69bf0c807c64..69bf0c807c64 100644
--- a/commit-slab.h
+++ b/third_party/git/commit-slab.h
diff --git a/commit.c b/third_party/git/commit.c
index a98de16e3d57..a98de16e3d57 100644
--- a/commit.c
+++ b/third_party/git/commit.c
diff --git a/commit.h b/third_party/git/commit.h
index f5295ca7f3ef..f5295ca7f3ef 100644
--- a/commit.h
+++ b/third_party/git/commit.h
diff --git a/common-main.c b/third_party/git/common-main.c
index 582a7b18869f..582a7b18869f 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 19fda3e87764..19fda3e87764 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 11727f3e1ed7..11727f3e1ed7 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 96bd9533b448..96bd9533b448 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 e4e25735ceb3..e4e25735ceb3 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 8e80ef335d84..8e80ef335d84 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 107b3e8182fd..107b3e8182fd 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 e8362dd2b965..e8362dd2b965 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 b85a2fa9561f..b85a2fa9561f 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 68307262be04..68307262be04 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 2b9a0a4e22fa..2b9a0a4e22fa 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 56bcb4277f47..56bcb4277f47 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 738f0a826a51..738f0a826a51 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 a03e40e6e2a6..a03e40e6e2a6 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 9e253fb72f2d..9e253fb72f2d 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 11361195925c..11361195925c 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 14d31010dfe5..14d31010dfe5 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 71843d7eefaf..71843d7eefaf 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 1d7a8c614565..1d7a8c614565 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 36b7cd93cdfb..36b7cd93cdfb 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 07cbf50c0f9a..07cbf50c0f9a 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 b833ff9225e7..b833ff9225e7 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 1cc31c350223..1cc31c350223 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 f960e66063a7..f960e66063a7 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 27cd5c1ea1f9..27cd5c1ea1f9 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 ae36ed6a669d..ae36ed6a669d 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 0e95dd493c94..0e95dd493c94 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 1e1597360f44..1e1597360f44 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 978cac4ec91e..978cac4ec91e 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 136250fbf6c4..136250fbf6c4 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 6f843d3e1a12..6f843d3e1a12 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 7d071afb7053..7d071afb7053 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 52d1f0a73dd8..52d1f0a73dd8 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 c0d838834ad8..c0d838834ad8 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 f3e03a9eabee..f3e03a9eabee 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 4d81358a83d0..4d81358a83d0 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 59bf151336c2..59bf151336c2 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 3ee8aae59d79..3ee8aae59d79 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 1b5d89fd5ed1..1b5d89fd5ed1 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 7849f258d201..7849f258d201 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 6adfcfd54051..6adfcfd54051 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 7b2df28eec45..7b2df28eec45 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 0b1168853778..0b1168853778 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 a2d3931cb73c..a2d3931cb73c 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 26896deca64c..26896deca64c 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 f3fb978eb3cc..f3fb978eb3cc 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 4024c360301e..4024c360301e 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 ac09ed89e710..ac09ed89e710 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 5541353a77a2..5541353a77a2 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 fa13ee672db3..fa13ee672db3 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 97db7cd69d65..97db7cd69d65 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 bf5fd7063bc9..bf5fd7063bc9 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 8f8b794ef39f..8f8b794ef39f 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 1b6dabf5a231..1b6dabf5a231 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 40194dd2309b..40194dd2309b 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 0d8552a2c6dc..0d8552a2c6dc 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 0d8552a2c6dc..0d8552a2c6dc 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 582589c70a1b..582589c70a1b 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 3a959d124ca7..3a959d124ca7 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 8285f38fdefe..8285f38fdefe 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 c7b021bfac7a..c7b021bfac7a 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 d8054e469fe8..d8054e469fe8 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 13661c14f870..13661c14f870 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 ebd0bad242a8..ebd0bad242a8 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 a97e880757b6..a97e880757b6 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 c0d7985b7edd..c0d7985b7edd 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 52420ec7d4da..52420ec7d4da 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 058207e4bfed..058207e4bfed 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 771e3cce4315..771e3cce4315 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 9e631c8593ff..9e631c8593ff 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 d9d3641de857..d9d3641de857 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 0f70d439204f..0f70d439204f 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 2e7eead42cb0..2e7eead42cb0 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 c6cb8dd21900..c6cb8dd21900 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 161978d720ae..161978d720ae 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 70daa7c08b8d..70daa7c08b8d 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 8ccbd1c2c6f8..8ccbd1c2c6f8 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 519d51f2b60a..519d51f2b60a 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 cacd82c833a6..cacd82c833a6 100644
--- a/compat/winansi.c
+++ b/third_party/git/compat/winansi.c
diff --git a/config.c b/third_party/git/config.c
index 3900e4947be9..3900e4947be9 100644
--- a/config.c
+++ b/third_party/git/config.c
diff --git a/config.h b/third_party/git/config.h
index f0ed464004da..f0ed464004da 100644
--- a/config.h
+++ b/third_party/git/config.h
diff --git a/config.mak.dev b/third_party/git/config.mak.dev
index bf1f3fcdeed3..bf1f3fcdeed3 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 e6a6d0f941cb..e6a6d0f941cb 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 db7f06b95fda..db7f06b95fda 100644
--- a/config.mak.uname
+++ b/third_party/git/config.mak.uname
diff --git a/configure.ac b/third_party/git/configure.ac
index a43b47640233..a43b47640233 100644
--- a/configure.ac
+++ b/third_party/git/configure.ac
diff --git a/connect.c b/third_party/git/connect.c
index 2778481264d0..2778481264d0 100644
--- a/connect.c
+++ b/third_party/git/connect.c
diff --git a/connect.h b/third_party/git/connect.h
index 5f2382e01868..5f2382e01868 100644
--- a/connect.h
+++ b/third_party/git/connect.h
diff --git a/connected.c b/third_party/git/connected.c
index cd9b324afa5a..cd9b324afa5a 100644
--- a/connected.c
+++ b/third_party/git/connected.c
diff --git a/connected.h b/third_party/git/connected.h
index ce2e7d8f2e53..ce2e7d8f2e53 100644
--- a/connected.h
+++ b/third_party/git/connected.h
diff --git a/contrib/README b/third_party/git/contrib/README
index 05f291c1f1d3..05f291c1f1d3 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 aa4cbaa2adac..aa4cbaa2adac 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 ff3b657e6105..ff3b657e6105 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 737647e76afd..737647e76afd 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 576ccabe1dbd..576ccabe1dbd 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 fba8a3f056a0..fba8a3f056a0 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 bc10f25ff24a..bc10f25ff24a 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 c9656ece9931..c9656ece9931 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 d3f29646dc3a..d3f29646dc3a 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 f0e80bd7f037..f0e80bd7f037 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 46b8d2ee1115..46b8d2ee1115 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 d03453341e84..d03453341e84 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 e9f7f6d861a4..e9f7f6d861a4 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 4490069df965..4490069df965 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 3e536a9834b6..3e536a9834b6 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 7fe1e8d2d9a0..7fe1e8d2d9a0 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 22b93a99664d..22b93a99664d 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 d9ada69b4323..d9ada69b4323 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 a0934d1fdaf0..a0934d1fdaf0 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 2ee702ecf7fe..2ee702ecf7fe 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 8e05d1ca4b61..8e05d1ca4b61 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 19116944c15c..19116944c15c 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 e087c4bf0085..e087c4bf0085 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 4a790d8f4ec1..4a790d8f4ec1 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 886bf95d1f59..886bf95d1f59 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 1d510cd47bef..1d510cd47bef 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 f385ee643c74..f385ee643c74 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 a2990f0dcb53..a2990f0dcb53 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 85ad732fc063..85ad732fc063 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 dd914d126123..dd914d126123 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 4ec419f90048..4ec419f90048 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 88d8fcdbce7d..88d8fcdbce7d 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 22c19df94b81..22c19df94b81 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 d389bfadceeb..d389bfadceeb 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 3e67552cc5b5..3e67552cc5b5 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 e6598b638339..e6598b638339 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 6174e3bb8382..6174e3bb8382 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 ebfc123ec641..ebfc123ec641 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 07227d022876..07227d022876 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 d8f1285d416d..d8f1285d416d 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 65cf594c2001..65cf594c2001 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 ba119a937f67..ba119a937f67 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 e69de29bb2d1..e69de29bb2d1 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 c0fb3718b280..c0fb3718b280 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 6c5b7026c53d..6c5b7026c53d 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 4b3a08a2bac4..4b3a08a2bac4 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 bcd3f575a3e3..bcd3f575a3e3 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 6e992c08667d..6e992c08667d 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 5bdad41de1f8..5bdad41de1f8 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 c07454824e3a..c07454824e3a 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 7440aa1c4638..7440aa1c4638 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 f2be7cc92437..f2be7cc92437 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 d4c234317520..d4c234317520 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 9b3e9c1f4d7b..9b3e9c1f4d7b 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 7dcbb232cd87..7dcbb232cd87 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 5ff5275496c5..5ff5275496c5 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 f6f5195d00f6..f6f5195d00f6 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 977a16f1e339..977a16f1e339 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 6a8a2b8ff190..6a8a2b8ff190 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 03f926281fb1..03f926281fb1 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 18bc60b021be..18bc60b021be 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 0891b9e36672..0891b9e36672 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 f8d803c5e2be..f8d803c5e2be 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 cec5ecfa7c78..cec5ecfa7c78 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 a16f79cfdc46..a16f79cfdc46 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 e800d9f5c9cf..e800d9f5c9cf 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 d12c2962230b..d12c2962230b 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 2f618a7f9788..2f618a7f9788 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 931b0fe3a948..931b0fe3a948 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 8c171dd959f6..8c171dd959f6 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 438463b16099..438463b16099 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 535770c6ec19..535770c6ec19 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 6f8993882114..6f8993882114 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 de3f81667ed9..de3f81667ed9 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 91f8fe6410c0..91f8fe6410c0 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 35791fd02c21..35791fd02c21 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 de20a5428730..de20a5428730 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 044444245d09..044444245d09 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 1e6a976699aa..1e6a976699aa 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 7c0fc4a6ef00..7c0fc4a6ef00 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 3f5b67f768db..3f5b67f768db 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 8011d05dec03..8011d05dec03 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 505483310552..505483310552 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 651b509ee66c..651b509ee66c 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 8823399e7522..8823399e7522 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 241ba22fa3c8..241ba22fa3c8 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 b9bb11834e1f..b9bb11834e1f 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 8747b84334f3..8747b84334f3 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 7ba78c4dff68..7ba78c4dff68 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 2770a1b1d205..2770a1b1d205 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 d18b317b2f01..d18b317b2f01 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 a677569ddd95..a677569ddd95 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 ae545b013dc8..ae545b013dc8 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 158958d36357..158958d36357 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 917d9e2d3222..917d9e2d3222 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 4e603512a39f..4e603512a39f 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 6663ae57e869..6663ae57e869 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 28df3ee321ec..28df3ee321ec 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 af9cbc9d0f7b..af9cbc9d0f7b 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 23b7ef9f6208..23b7ef9f6208 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 a7a40b49644f..a7a40b49644f 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 f422203fa069..f422203fa069 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 2ee34be7e491..2ee34be7e491 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 c215213c4bfd..c215213c4bfd 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 b5a2a4408c59..b5a2a4408c59 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 745e47e88173..745e47e88173 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 0f3f4e018a05..0f3f4e018a05 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 9da2dc5ff036..9da2dc5ff036 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 cfbfe7ddf622..cfbfe7ddf622 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 9ea201459b53..9ea201459b53 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 6b0dbdac4d35..6b0dbdac4d35 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 3ff3a095670e..3ff3a095670e 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 5c22457a0b6a..5c22457a0b6a 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 016454749f8d..016454749f8d 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 6546294f159e..6546294f159e 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 0ff76259faa6..0ff76259faa6 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 5ba068416247..5ba068416247 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 d64569567334..d64569567334 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 52b84ba3d439..52b84ba3d439 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 7c4cd8d257da..7c4cd8d257da 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 71125b5832d3..71125b5832d3 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 fd1b1077439b..fd1b1077439b 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 bb0cdba3864c..bb0cdba3864c 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 193b911dd13a..193b911dd13a 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 ac72332517a5..ac72332517a5 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 1c3d87f8619e..1c3d87f8619e 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 8e9188364c6f..8e9188364c6f 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 1cda19f66af9..1cda19f66af9 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 eeee45dd341b..eeee45dd341b 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 e27fd088be1b..e27fd088be1b 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 9513f5e35b44..9513f5e35b44 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 be188c0f11db..be188c0f11db 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 0b9381abcad3..0b9381abcad3 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 d511905c1647..d511905c1647 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 7ab0cf450967..7ab0cf450967 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 6906aae44147..6906aae44147 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 c686b4a69b12..c686b4a69b12 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 868e18b9a1ab..868e18b9a1ab 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 352deda69dcf..352deda69dcf 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 276898eb6bd7..276898eb6bd7 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 57ff4b25c17e..57ff4b25c17e 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 0d0e77765175..0d0e77765175 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 02a779158572..02a779158572 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 e8651aaf4b53..e8651aaf4b53 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 f363505abb27..f363505abb27 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 a3425f4770c5..a3425f4770c5 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 11ac6f692733..11ac6f692733 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 000147bbe4a0..000147bbe4a0 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 1053872eea90..1053872eea90 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 b0ebc6aad214..b0ebc6aad214 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 151a1970419f..151a1970419f 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 aa90865befa4..aa90865befa4 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 e89f2236efea..e89f2236efea 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 8202d62035f9..8202d62035f9 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 27de94994b5d..27de94994b5d 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 1f78c5d1bd30..1f78c5d1bd30 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 888c34a52152..888c34a52152 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 94ff83764922..94ff83764922 100644
--- a/convert.c
+++ b/third_party/git/convert.c
diff --git a/convert.h b/third_party/git/convert.h
index 831559f10d44..831559f10d44 100644
--- a/convert.h
+++ b/third_party/git/convert.h
diff --git a/copy.c b/third_party/git/copy.c
index 4de6a110f091..4de6a110f091 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 ec1271f89ce0..ec1271f89ce0 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 1cccc3a0b9cf..1cccc3a0b9cf 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 ac295420dd0d..ac295420dd0d 100644
--- a/credential-store.c
+++ b/third_party/git/credential-store.c
diff --git a/credential.c b/third_party/git/credential.c
index 62be651b03b5..62be651b03b5 100644
--- a/credential.c
+++ b/third_party/git/credential.c
diff --git a/credential.h b/third_party/git/credential.h
index 6b0cd16be2b9..6b0cd16be2b9 100644
--- a/credential.h
+++ b/third_party/git/credential.h
diff --git a/csum-file.c b/third_party/git/csum-file.c
index 53ce37f7ca42..53ce37f7ca42 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 a98b1eee53f4..a98b1eee53f4 100644
--- a/csum-file.h
+++ b/third_party/git/csum-file.h
diff --git a/ctype.c b/third_party/git/ctype.c
index fc0225cebd1a..fc0225cebd1a 100644
--- a/ctype.c
+++ b/third_party/git/ctype.c
diff --git a/daemon.c b/third_party/git/daemon.c
index 9d2e0d20ef30..9d2e0d20ef30 100644
--- a/daemon.c
+++ b/third_party/git/daemon.c
diff --git a/date.c b/third_party/git/date.c
index 8126146c5069..8126146c5069 100644
--- a/date.c
+++ b/third_party/git/date.c
diff --git a/decorate.c b/third_party/git/decorate.c
index a605b1b5f4ac..a605b1b5f4ac 100644
--- a/decorate.c
+++ b/third_party/git/decorate.c
diff --git a/decorate.h b/third_party/git/decorate.h
index ee43dee1f008..ee43dee1f008 100644
--- a/decorate.h
+++ b/third_party/git/decorate.h
diff --git a/delta-islands.c b/third_party/git/delta-islands.c
index 09dbd3cf72ba..09dbd3cf72ba 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 eb0f952629fc..eb0f952629fc 100644
--- a/delta-islands.h
+++ b/third_party/git/delta-islands.h
diff --git a/delta.h b/third_party/git/delta.h
index 2df5fe13d954..2df5fe13d954 100644
--- a/delta.h
+++ b/third_party/git/delta.h
diff --git a/detect-compiler b/third_party/git/detect-compiler
index 70b754481c87..70b754481c87 100755
--- a/detect-compiler
+++ b/third_party/git/detect-compiler
diff --git a/diff-delta.c b/third_party/git/diff-delta.c
index e49643353bf5..e49643353bf5 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 61812f48c273..61812f48c273 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 7814eabfe028..7814eabfe028 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 efe42b341ae1..efe42b341ae1 100644
--- a/diff.c
+++ b/third_party/git/diff.c
diff --git a/diff.h b/third_party/git/diff.h
index c2c30568101d..c2c30568101d 100644
--- a/diff.h
+++ b/third_party/git/diff.h
diff --git a/diffcore-break.c b/third_party/git/diffcore-break.c
index 875aefd3febf..875aefd3febf 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 5668ace60d60..5668ace60d60 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 19e73311f9cd..19e73311f9cd 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 a9c6d60df228..a9c6d60df228 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 9624864858dc..9624864858dc 100644
--- a/diffcore-rename.c
+++ b/third_party/git/diffcore-rename.c
diff --git a/diffcore.h b/third_party/git/diffcore.h
index b651061c0e3a..b651061c0e3a 100644
--- a/diffcore.h
+++ b/third_party/git/diffcore.h
diff --git a/dir-iterator.c b/third_party/git/dir-iterator.c
index b17e9f970a74..b17e9f970a74 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 08229157c638..08229157c638 100644
--- a/dir-iterator.h
+++ b/third_party/git/dir-iterator.h
diff --git a/dir.c b/third_party/git/dir.c
index d021c908e5d1..d021c908e5d1 100644
--- a/dir.c
+++ b/third_party/git/dir.c
diff --git a/dir.h b/third_party/git/dir.h
index 680079bbe324..680079bbe324 100644
--- a/dir.h
+++ b/third_party/git/dir.h
diff --git a/editor.c b/third_party/git/editor.c
index f079abbf1102..f079abbf1102 100644
--- a/editor.c
+++ b/third_party/git/editor.c
diff --git a/entry.c b/third_party/git/entry.c
index 53380bb614c1..53380bb614c1 100644
--- a/entry.c
+++ b/third_party/git/entry.c
diff --git a/environment.c b/third_party/git/environment.c
index 89af47cb8504..89af47cb8504 100644
--- a/environment.c
+++ b/third_party/git/environment.c
diff --git a/ewah/bitmap.c b/third_party/git/ewah/bitmap.c
index 52f1178db4ce..52f1178db4ce 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 d59b1afe3d6a..d59b1afe3d6a 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 9035ee65ea8d..9035ee65ea8d 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 5093d43e2f00..5093d43e2f00 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 84b2a29faa0c..84b2a29faa0c 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 bafa24f4c3a0..bafa24f4c3a0 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 7deeab30397c..7deeab30397c 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 8cd1df28d3f1..8cd1df28d3f1 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 b44d6a467ef1..b44d6a467ef1 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 d6d685cba012..d6d685cba012 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 9e3967ce6626..9e3967ce6626 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 42665488008b..42665488008b 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 d6444caa5ac1..d6444caa5ac1 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 65be043f2afa..65be043f2afa 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 67f684229a9a..67f684229a9a 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 01e3aa88c50c..01e3aa88c50c 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 cdb7d8db0301..cdb7d8db0301 100644
--- a/fsck.c
+++ b/third_party/git/fsck.c
diff --git a/fsck.h b/third_party/git/fsck.h
index b95595ae5fee..b95595ae5fee 100644
--- a/fsck.h
+++ b/third_party/git/fsck.h
diff --git a/fsmonitor.c b/third_party/git/fsmonitor.c
index 231e83a94db5..231e83a94db5 100644
--- a/fsmonitor.c
+++ b/third_party/git/fsmonitor.c
diff --git a/fsmonitor.h b/third_party/git/fsmonitor.h
index 739318ab6d10..739318ab6d10 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 0157acbf2e05..0157acbf2e05 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 99da1d0fd385..99da1d0fd385 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 0c3d777aac8d..0c3d777aac8d 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 71158f7d8ba9..71158f7d8ba9 100755
--- a/generate-cmdlist.sh
+++ b/third_party/git/generate-cmdlist.sh
diff --git a/gettext.c b/third_party/git/gettext.c
index 35d2c1218db2..35d2c1218db2 100644
--- a/gettext.c
+++ b/third_party/git/gettext.c
diff --git a/gettext.h b/third_party/git/gettext.h
index bee52eb11347..bee52eb11347 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 c20ae9e2102b..c20ae9e2102b 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 b7c173c34554..b7c173c34554 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 efee12b8b1e6..efee12b8b1e6 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 83be89de0aac..83be89de0aac 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 fc00d5946af6..fc00d5946af6 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 b31613cb8aa8..b31613cb8aa8 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 ae1044273d01..ae1044273d01 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 46af3e60b718..46af3e60b718 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 5c5afa2b985e..5c5afa2b985e 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 59cd41dbff72..59cd41dbff72 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 6483b21cbfc7..6483b21cbfc7 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 92373d251a84..92373d251a84 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 f10caedaa7a3..f10caedaa7a3 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 4277f30c4116..4277f30c4116 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 6de74ce639ce..6de74ce639ce 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 cfa50fca8782..cfa50fca8782 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 a1aeb8b96e2d..a1aeb8b96e2d 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 777eeb79c135..777eeb79c135 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 d06037decc1a..d06037decc1a 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 ba367d551d21..ba367d551d21 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 a5051637bbc2..a5051637bbc2 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 3a2d79a9cc3a..3a2d79a9cc3a 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 a98298366763..a98298366763 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 9e7412c446f7..9e7412c446f7 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 ebe50bd7d07e..ebe50bd7d07e 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 80f5a59bbbfc..80f5a59bbbfc 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 6dae7937d589..6dae7937d589 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 f08506f3834a..f08506f3834a 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 75ea965dacd7..75ea965dacd7 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 1f3248ffd113..1f3248ffd113 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 85783081e0d8..85783081e0d8 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 abe82992b652..abe82992b652 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 68c4a6c7366f..68c4a6c7366f 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 32668fc9c6de..32668fc9c6de 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 8968a57f33e3..8968a57f33e3 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 334cfa5a1a59..334cfa5a1a59 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 b588db11d9fc..b588db11d9fc 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 a026de954c3d..a026de954c3d 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 5ff76692f5ee..5ff76692f5ee 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 9f253db5b37e..9f253db5b37e 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 120bc4064b6f..120bc4064b6f 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 e43971bfa3e0..e43971bfa3e0 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 ef77ed7399c5..ef77ed7399c5 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 480a6b30d0a9..480a6b30d0a9 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 5ba9fcadd17f..5ba9fcadd17f 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 ef1e55521d7c..ef1e55521d7c 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 97d1d7aa0268..97d1d7aa0268 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 538d61c792de..538d61c792de 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 589ff8f78aba..589ff8f78aba 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 02111a1742f9..02111a1742f9 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 88b3119a7506..88b3119a7506 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 413f1a170079..413f1a170079 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 c05413ce432d..c05413ce432d 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 a1a424aab540..a1a424aab540 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 db91ab84a56d..db91ab84a56d 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 117923f8860b..117923f8860b 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 b6c6dc35003b..b6c6dc35003b 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 1ade121c4cc5..1ade121c4cc5 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 77d88a77a766..77d88a77a766 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 a89cf4496990..a89cf4496990 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 2514bc22abf4..2514bc22abf4 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 5af78f15a86d..5af78f15a86d 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 baebff2ffff7..baebff2ffff7 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 3634ba469da0..3634ba469da0 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 0aff18691d16..0aff18691d16 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 0c94f9c2c6df..0c94f9c2c6df 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 749aa2e7ec1b..749aa2e7ec1b 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 8b71fad9a590..8b71fad9a590 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 35764d1d22da..35764d1d22da 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 1d3cc818d5ef..1d3cc818d5ef 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 27c006abb2ad..27c006abb2ad 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 40eb3e9c07a4..40eb3e9c07a4 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 409304692dc1..409304692dc1 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 bb46b48d6b84..bb46b48d6b84 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 eb039b2b4952..eb039b2b4952 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 adc3b542a610..adc3b542a610 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 8249915d3c6c..8249915d3c6c 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 158835b5c1c9..158835b5c1c9 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 d106dadac89b..d106dadac89b 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 1bd8b8e04f71..1bd8b8e04f71 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 208651c1afc1..208651c1afc1 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 d66aa5026391..d66aa5026391 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 1e9f99252815..1e9f99252815 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 bad116c78038..bad116c78038 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 0ef3c7927d2c..0ef3c7927d2c 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 9f5305c43eeb..9f5305c43eeb 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 1b4ad8368ebf..1b4ad8368ebf 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 d956b59a9eb2..d956b59a9eb2 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 91c1be23c2bb..91c1be23c2bb 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 b1845c505500..b1845c505500 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 7c55229773e2..7c55229773e2 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 f60e9b3e877b..f60e9b3e877b 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 7d19d379512b..7d19d379512b 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 f6d9852d2f61..f6d9852d2f61 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 343fe7bccd0d..343fe7bccd0d 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 204a5acd66f5..204a5acd66f5 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 e3f6d543fb5b..e3f6d543fb5b 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 3991e7d1a7fc..3991e7d1a7fc 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 d3c39980f3fe..d3c39980f3fe 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 e3d390974331..e3d390974331 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 dec90e9af677..dec90e9af677 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 2d0e44656cc6..2d0e44656cc6 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 5f92c89c1c1b..5f92c89c1c1b 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 8eef60b43fd4..8eef60b43fd4 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 10d976418568..10d976418568 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 c7f58c5756f7..c7f58c5756f7 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 050f2a36f414..050f2a36f414 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 ae152534f502..ae152534f502 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 c1ee7124edcf..c1ee7124edcf 100644
--- a/git.c
+++ b/third_party/git/git.c
diff --git a/git.rc b/third_party/git/git.rc
index cc3fdc6cc6cb..cc3fdc6cc6cb 100644
--- a/git.rc
+++ b/third_party/git/git.rc
diff --git a/gitk-git/.gitignore b/third_party/git/gitk-git/.gitignore
index d7ebcaf366f6..d7ebcaf366f6 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 5bdd52a6ebfa..5bdd52a6ebfa 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 a14d7a16b2dd..a14d7a16b2dd 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 e358dd190335..e358dd190335 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 87ab1fac24d6..87ab1fac24d6 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 87dfc18b4406..87dfc18b4406 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 5db38248289b..5db38248289b 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 fef3bbafeead..fef3bbafeead 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 e4fac932e5b0..e4fac932e5b0 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 79ec5a565674..79ec5a565674 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 b58d23eb2b92..b58d23eb2b92 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 ca3c29b457bd..ca3c29b457bd 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 c63248e3752b..c63248e3752b 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 1feb34854b32..1feb34854b32 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 f680ea86aabd..f680ea86aabd 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 9b08c263eade..9b08c263eade 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 2a06fe5bbcf8..2a06fe5bbcf8 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 596749866048..596749866048 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 a58e6b3c44b0..a58e6b3c44b0 100644
--- a/gitweb/INSTALL
+++ b/third_party/git/gitweb/INSTALL
diff --git a/gitweb/Makefile b/third_party/git/gitweb/Makefile
index cd194d057f92..cd194d057f92 100644
--- a/gitweb/Makefile
+++ b/third_party/git/gitweb/Makefile
diff --git a/gitweb/README b/third_party/git/gitweb/README
index 471dcfb691bb..471dcfb691bb 100644
--- a/gitweb/README
+++ b/third_party/git/gitweb/README
diff --git a/gitweb/gitweb.perl b/third_party/git/gitweb/gitweb.perl
index 7fef19fe591c..7fef19fe591c 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 aae35a70e703..aae35a70e703 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 f4ede2e94486..f4ede2e94486 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 321260103262..321260103262 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 f8460ed32fa7..f8460ed32fa7 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 0c677795006a..0c677795006a 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 db6eb505846a..db6eb505846a 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 fa2596f77c64..fa2596f77c64 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 018bbb7d4cb7..018bbb7d4cb7 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 66b9a072a4a3..66b9a072a4a3 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 f78c60a9125f..f78c60a9125f 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 d60115ca404e..d60115ca404e 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 3e624ec289ab..3e624ec289ab 100644
--- a/gpg-interface.h
+++ b/third_party/git/gpg-interface.h
diff --git a/graph.c b/third_party/git/graph.c
index f53135485f56..f53135485f56 100644
--- a/graph.c
+++ b/third_party/git/graph.c
diff --git a/graph.h b/third_party/git/graph.h
index af623390b605..af623390b605 100644
--- a/graph.h
+++ b/third_party/git/graph.h
diff --git a/grep.c b/third_party/git/grep.c
index cd952ef5d3cc..cd952ef5d3cc 100644
--- a/grep.c
+++ b/third_party/git/grep.c
diff --git a/grep.h b/third_party/git/grep.h
index 1875880f3799..1875880f3799 100644
--- a/grep.h
+++ b/third_party/git/grep.h
diff --git a/hash.h b/third_party/git/hash.h
index 52a4f1a3f430..52a4f1a3f430 100644
--- a/hash.h
+++ b/third_party/git/hash.h
diff --git a/hashmap.c b/third_party/git/hashmap.c
index d42f01ff5ae6..d42f01ff5ae6 100644
--- a/hashmap.c
+++ b/third_party/git/hashmap.c
diff --git a/hashmap.h b/third_party/git/hashmap.h
index 84249115664b..84249115664b 100644
--- a/hashmap.h
+++ b/third_party/git/hashmap.h
diff --git a/help.c b/third_party/git/help.c
index 5261d83ecf15..5261d83ecf15 100644
--- a/help.c
+++ b/third_party/git/help.c
diff --git a/help.h b/third_party/git/help.h
index b8780fbd0fc3..b8780fbd0fc3 100644
--- a/help.h
+++ b/third_party/git/help.h
diff --git a/hex.c b/third_party/git/hex.c
index 7850a8879d5e..7850a8879d5e 100644
--- a/hex.c
+++ b/third_party/git/hex.c
diff --git a/http-backend.c b/third_party/git/http-backend.c
index ec3144b44475..ec3144b44475 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 a32ac118d90c..a32ac118d90c 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 0353f9f5143d..0353f9f5143d 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 fe15e325fabf..fe15e325fabf 100644
--- a/http-walker.c
+++ b/third_party/git/http-walker.c
diff --git a/http.c b/third_party/git/http.c
index 27aa0a319298..27aa0a319298 100644
--- a/http.c
+++ b/third_party/git/http.c
diff --git a/http.h b/third_party/git/http.h
index b429f1cf042b..b429f1cf042b 100644
--- a/http.h
+++ b/third_party/git/http.h
diff --git a/ident.c b/third_party/git/ident.c
index e666ee4e598e..e666ee4e598e 100644
--- a/ident.c
+++ b/third_party/git/ident.c
diff --git a/imap-send.c b/third_party/git/imap-send.c
index 6c54d8c29d64..6c54d8c29d64 100644
--- a/imap-send.c
+++ b/third_party/git/imap-send.c
diff --git a/interdiff.c b/third_party/git/interdiff.c
index c81d680a6cee..c81d680a6cee 100644
--- a/interdiff.c
+++ b/third_party/git/interdiff.c
diff --git a/interdiff.h b/third_party/git/interdiff.h
index 01c730a5c9d2..01c730a5c9d2 100644
--- a/interdiff.h
+++ b/third_party/git/interdiff.h
diff --git a/iterator.h b/third_party/git/iterator.h
index 0f6900e43ad6..0f6900e43ad6 100644
--- a/iterator.h
+++ b/third_party/git/iterator.h
diff --git a/json-writer.c b/third_party/git/json-writer.c
index aadb9dbddc33..aadb9dbddc33 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 83906b09c173..83906b09c173 100644
--- a/json-writer.h
+++ b/third_party/git/json-writer.h
diff --git a/khash.h b/third_party/git/khash.h
index 21c2095216cb..21c2095216cb 100644
--- a/khash.h
+++ b/third_party/git/khash.h
diff --git a/kwset.c b/third_party/git/kwset.c
index fc439e0667f1..fc439e0667f1 100644
--- a/kwset.c
+++ b/third_party/git/kwset.c
diff --git a/kwset.h b/third_party/git/kwset.h
index df99a9217823..df99a9217823 100644
--- a/kwset.h
+++ b/third_party/git/kwset.h
diff --git a/levenshtein.c b/third_party/git/levenshtein.c
index d2632690d510..d2632690d510 100644
--- a/levenshtein.c
+++ b/third_party/git/levenshtein.c
diff --git a/levenshtein.h b/third_party/git/levenshtein.h
index 4105bf354956..4105bf354956 100644
--- a/levenshtein.h
+++ b/third_party/git/levenshtein.h
diff --git a/line-log.c b/third_party/git/line-log.c
index 3aff1849e7d5..3aff1849e7d5 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 8ee7a2bd4a18..8ee7a2bd4a18 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 9b50583dc051..9b50583dc051 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 e69bf7c01765..e69bf7c01765 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 ecffc09be6ec..ecffc09be6ec 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 1dfea766290d..1dfea766290d 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 1cb20c659c82..1cb20c659c82 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 c54f0000fbad..c54f0000fbad 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 36e1f774bcfc..36e1f774bcfc 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 1d45a4ad5786..1d45a4ad5786 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 b5651ddd5bfd..b5651ddd5bfd 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 a952680e4667..a952680e4667 100644
--- a/list-objects.h
+++ b/third_party/git/list-objects.h
diff --git a/list.h b/third_party/git/list.h
index eb601192f4ca..eb601192f4ca 100644
--- a/list.h
+++ b/third_party/git/list.h
diff --git a/ll-merge.c b/third_party/git/ll-merge.c
index 5b8d46aedee7..5b8d46aedee7 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 b9e2af1c8840..b9e2af1c8840 100644
--- a/ll-merge.h
+++ b/third_party/git/ll-merge.h
diff --git a/lockfile.c b/third_party/git/lockfile.c
index 8e8ab4f29f3e..8e8ab4f29f3e 100644
--- a/lockfile.c
+++ b/third_party/git/lockfile.c
diff --git a/lockfile.h b/third_party/git/lockfile.h
index 9843053ce894..9843053ce894 100644
--- a/lockfile.h
+++ b/third_party/git/lockfile.h
diff --git a/log-tree.c b/third_party/git/log-tree.c
index 1e56df62a79c..1e56df62a79c 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 e66862807463..e66862807463 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 818aef70a09e..818aef70a09e 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 7e5646f5f62b..7e5646f5f62b 100644
--- a/ls-refs.h
+++ b/third_party/git/ls-refs.h
diff --git a/mailinfo.c b/third_party/git/mailinfo.c
index b395adbdf2a4..b395adbdf2a4 100644
--- a/mailinfo.c
+++ b/third_party/git/mailinfo.c
diff --git a/mailinfo.h b/third_party/git/mailinfo.h
index 79b1d6774ec9..79b1d6774ec9 100644
--- a/mailinfo.h
+++ b/third_party/git/mailinfo.h
diff --git a/mailmap.c b/third_party/git/mailmap.c
index 962fd86d6d70..962fd86d6d70 100644
--- a/mailmap.c
+++ b/third_party/git/mailmap.c
diff --git a/mailmap.h b/third_party/git/mailmap.h
index d0e65646cb57..d0e65646cb57 100644
--- a/mailmap.h
+++ b/third_party/git/mailmap.h
diff --git a/match-trees.c b/third_party/git/match-trees.c
index f6c194c1cca6..f6c194c1cca6 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 a2841a4a9ad7..a2841a4a9ad7 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 999d3c3a52cc..999d3c3a52cc 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 ee0a0e90c946..ee0a0e90c946 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 13cf9669e5b2..13cf9669e5b2 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 6b812d67e3ec..6b812d67e3ec 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 c2b7bb65c62f..c2b7bb65c62f 100644
--- a/merge-recursive.h
+++ b/third_party/git/merge-recursive.h
diff --git a/merge.c b/third_party/git/merge.c
index 7c1d756c3fad..7c1d756c3fad 100644
--- a/merge.c
+++ b/third_party/git/merge.c
diff --git a/mergesort.c b/third_party/git/mergesort.c
index e5fdf2ee4ad9..e5fdf2ee4ad9 100644
--- a/mergesort.c
+++ b/third_party/git/mergesort.c
diff --git a/mergesort.h b/third_party/git/mergesort.h
index 644cff1f9640..644cff1f9640 100644
--- a/mergesort.h
+++ b/third_party/git/mergesort.h
diff --git a/mergetools/araxis b/third_party/git/mergetools/araxis
index e2407b65b70d..e2407b65b70d 100644
--- a/mergetools/araxis
+++ b/third_party/git/mergetools/araxis
diff --git a/mergetools/bc b/third_party/git/mergetools/bc
index 3a69e60faa9c..3a69e60faa9c 100644
--- a/mergetools/bc
+++ b/third_party/git/mergetools/bc
diff --git a/mergetools/bc3 b/third_party/git/mergetools/bc3
index 5d8dd4818488..5d8dd4818488 100644
--- a/mergetools/bc3
+++ b/third_party/git/mergetools/bc3
diff --git a/mergetools/codecompare b/third_party/git/mergetools/codecompare
index 9f60e8da6527..9f60e8da6527 100644
--- a/mergetools/codecompare
+++ b/third_party/git/mergetools/codecompare
diff --git a/mergetools/deltawalker b/third_party/git/mergetools/deltawalker
index ee6f374bceb8..ee6f374bceb8 100644
--- a/mergetools/deltawalker
+++ b/third_party/git/mergetools/deltawalker
diff --git a/mergetools/diffmerge b/third_party/git/mergetools/diffmerge
index 9b6355b98a71..9b6355b98a71 100644
--- a/mergetools/diffmerge
+++ b/third_party/git/mergetools/diffmerge
diff --git a/mergetools/diffuse b/third_party/git/mergetools/diffuse
index 5a3ae8b5695d..5a3ae8b5695d 100644
--- a/mergetools/diffuse
+++ b/third_party/git/mergetools/diffuse
diff --git a/mergetools/ecmerge b/third_party/git/mergetools/ecmerge
index 6c5101c4f729..6c5101c4f729 100644
--- a/mergetools/ecmerge
+++ b/third_party/git/mergetools/ecmerge
diff --git a/mergetools/emerge b/third_party/git/mergetools/emerge
index d1ce513ff5d3..d1ce513ff5d3 100644
--- a/mergetools/emerge
+++ b/third_party/git/mergetools/emerge
diff --git a/mergetools/examdiff b/third_party/git/mergetools/examdiff
index e72b06fc4d8f..e72b06fc4d8f 100644
--- a/mergetools/examdiff
+++ b/third_party/git/mergetools/examdiff
diff --git a/mergetools/guiffy b/third_party/git/mergetools/guiffy
index 8b23a13c4111..8b23a13c4111 100644
--- a/mergetools/guiffy
+++ b/third_party/git/mergetools/guiffy
diff --git a/mergetools/gvimdiff b/third_party/git/mergetools/gvimdiff
index 04a5bb0ea848..04a5bb0ea848 100644
--- a/mergetools/gvimdiff
+++ b/third_party/git/mergetools/gvimdiff
diff --git a/mergetools/gvimdiff2 b/third_party/git/mergetools/gvimdiff2
index 04a5bb0ea848..04a5bb0ea848 100644
--- a/mergetools/gvimdiff2
+++ b/third_party/git/mergetools/gvimdiff2
diff --git a/mergetools/gvimdiff3 b/third_party/git/mergetools/gvimdiff3
index 04a5bb0ea848..04a5bb0ea848 100644
--- a/mergetools/gvimdiff3
+++ b/third_party/git/mergetools/gvimdiff3
diff --git a/mergetools/kdiff3 b/third_party/git/mergetools/kdiff3
index 0264ed5b20b2..0264ed5b20b2 100644
--- a/mergetools/kdiff3
+++ b/third_party/git/mergetools/kdiff3
diff --git a/mergetools/kompare b/third_party/git/mergetools/kompare
index e8c0bfa67854..e8c0bfa67854 100644
--- a/mergetools/kompare
+++ b/third_party/git/mergetools/kompare
diff --git a/mergetools/meld b/third_party/git/mergetools/meld
index 7a08470f8836..7a08470f8836 100644
--- a/mergetools/meld
+++ b/third_party/git/mergetools/meld
diff --git a/mergetools/opendiff b/third_party/git/mergetools/opendiff
index b608dd6de30a..b608dd6de30a 100644
--- a/mergetools/opendiff
+++ b/third_party/git/mergetools/opendiff
diff --git a/mergetools/p4merge b/third_party/git/mergetools/p4merge
index 7a5b291dd28a..7a5b291dd28a 100644
--- a/mergetools/p4merge
+++ b/third_party/git/mergetools/p4merge
diff --git a/mergetools/smerge b/third_party/git/mergetools/smerge
index 9c2e6f6fd7d0..9c2e6f6fd7d0 100644
--- a/mergetools/smerge
+++ b/third_party/git/mergetools/smerge
diff --git a/mergetools/tkdiff b/third_party/git/mergetools/tkdiff
index eee5cb57e3cc..eee5cb57e3cc 100644
--- a/mergetools/tkdiff
+++ b/third_party/git/mergetools/tkdiff
diff --git a/mergetools/tortoisemerge b/third_party/git/mergetools/tortoisemerge
index d7ab666a59a2..d7ab666a59a2 100644
--- a/mergetools/tortoisemerge
+++ b/third_party/git/mergetools/tortoisemerge
diff --git a/mergetools/vimdiff b/third_party/git/mergetools/vimdiff
index 10d86f3e1930..10d86f3e1930 100644
--- a/mergetools/vimdiff
+++ b/third_party/git/mergetools/vimdiff
diff --git a/mergetools/vimdiff2 b/third_party/git/mergetools/vimdiff2
index 04a5bb0ea848..04a5bb0ea848 100644
--- a/mergetools/vimdiff2
+++ b/third_party/git/mergetools/vimdiff2
diff --git a/mergetools/vimdiff3 b/third_party/git/mergetools/vimdiff3
index 04a5bb0ea848..04a5bb0ea848 100644
--- a/mergetools/vimdiff3
+++ b/third_party/git/mergetools/vimdiff3
diff --git a/mergetools/winmerge b/third_party/git/mergetools/winmerge
index 74d03259fdf1..74d03259fdf1 100644
--- a/mergetools/winmerge
+++ b/third_party/git/mergetools/winmerge
diff --git a/mergetools/xxdiff b/third_party/git/mergetools/xxdiff
index ce5b8e9f2962..ce5b8e9f2962 100644
--- a/mergetools/xxdiff
+++ b/third_party/git/mergetools/xxdiff
diff --git a/midx.c b/third_party/git/midx.c
index d6496444206a..d6496444206a 100644
--- a/midx.c
+++ b/third_party/git/midx.c
diff --git a/midx.h b/third_party/git/midx.h
index f0ae656b5d76..f0ae656b5d76 100644
--- a/midx.h
+++ b/third_party/git/midx.h
diff --git a/name-hash.c b/third_party/git/name-hash.c
index 695908609f40..695908609f40 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 4b78f6bf36a0..4b78f6bf36a0 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 d23a8f2fb8e0..d23a8f2fb8e0 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 dffbc76c49ef..dffbc76c49ef 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 d7dfa6c6e429..d7dfa6c6e429 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 2473314d6868..2473314d6868 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 56f8c98e2445..56f8c98e2445 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 2fe724f1cf8d..2fe724f1cf8d 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 99f9c709c536..99f9c709c536 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 a81941069873..a81941069873 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 d9b3c09eaf09..d9b3c09eaf09 100644
--- a/notes-utils.h
+++ b/third_party/git/notes-utils.h
diff --git a/notes.c b/third_party/git/notes.c
index 75c028b3005a..75c028b3005a 100644
--- a/notes.c
+++ b/third_party/git/notes.c
diff --git a/notes.h b/third_party/git/notes.h
index 76337f238472..76337f238472 100644
--- a/notes.h
+++ b/third_party/git/notes.h
diff --git a/object-store.h b/third_party/git/object-store.h
index 7f7b3cdd806b..7f7b3cdd806b 100644
--- a/object-store.h
+++ b/third_party/git/object-store.h
diff --git a/object.c b/third_party/git/object.c
index 07bdd5b26e2b..07bdd5b26e2b 100644
--- a/object.c
+++ b/third_party/git/object.c
diff --git a/object.h b/third_party/git/object.h
index 0120892bbd39..0120892bbd39 100644
--- a/object.h
+++ b/third_party/git/object.h
diff --git a/oidmap.c b/third_party/git/oidmap.c
index 6d6e840d0376..6d6e840d0376 100644
--- a/oidmap.c
+++ b/third_party/git/oidmap.c
diff --git a/oidmap.h b/third_party/git/oidmap.h
index 7a939461ff5b..7a939461ff5b 100644
--- a/oidmap.h
+++ b/third_party/git/oidmap.h
diff --git a/oidset.c b/third_party/git/oidset.c
index f63ce818f677..f63ce818f677 100644
--- a/oidset.c
+++ b/third_party/git/oidset.c
diff --git a/oidset.h b/third_party/git/oidset.h
index 5346563b0bcc..5346563b0bcc 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 fa78a460c9aa..fa78a460c9aa 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 ed2befaac653..ed2befaac653 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 00de3ec8e41d..00de3ec8e41d 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 2cc3603189b8..2cc3603189b8 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 52560293b626..52560293b626 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 857d43850b62..857d43850b62 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 d28a7e43d0bd..d28a7e43d0bd 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 848331d5d67b..848331d5d67b 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 29d17a9bec27..29d17a9bec27 100644
--- a/pack-write.c
+++ b/third_party/git/pack-write.c
diff --git a/pack.h b/third_party/git/pack.h
index 9fc0945ac916..9fc0945ac916 100644
--- a/pack.h
+++ b/third_party/git/pack.h
diff --git a/packfile.c b/third_party/git/packfile.c
index fc43a6c52c75..fc43a6c52c75 100644
--- a/packfile.c
+++ b/third_party/git/packfile.c
diff --git a/packfile.h b/third_party/git/packfile.h
index 3e98910bdd19..3e98910bdd19 100644
--- a/packfile.h
+++ b/third_party/git/packfile.h
diff --git a/pager.c b/third_party/git/pager.c
index 41446d4f0543..41446d4f0543 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 1240a8514e04..1240a8514e04 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 87b26a1d922e..87b26a1d922e 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 a4bd40bb6acf..a4bd40bb6acf 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 b5c8594db60d..b5c8594db60d 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 e8c150d0c92a..e8c150d0c92a 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 03bb04e7071f..03bb04e7071f 100644
--- a/patch-ids.h
+++ b/third_party/git/patch-ids.h
diff --git a/path.c b/third_party/git/path.c
index 25e97b8c3f76..25e97b8c3f76 100644
--- a/path.c
+++ b/third_party/git/path.c
diff --git a/path.h b/third_party/git/path.h
index 2ba6ca58c834..2ba6ca58c834 100644
--- a/path.h
+++ b/third_party/git/path.h
diff --git a/pathspec.c b/third_party/git/pathspec.c
index 12c2b322b30a..12c2b322b30a 100644
--- a/pathspec.c
+++ b/third_party/git/pathspec.c
diff --git a/pathspec.h b/third_party/git/pathspec.h
index 1c18a2c90c41..1c18a2c90c41 100644
--- a/pathspec.h
+++ b/third_party/git/pathspec.h
diff --git a/perl/.gitignore b/third_party/git/perl/.gitignore
index 84c048a73cc2..84c048a73cc2 100644
--- a/perl/.gitignore
+++ b/third_party/git/perl/.gitignore
diff --git a/perl/FromCPAN/.gitattributes b/third_party/git/perl/FromCPAN/.gitattributes
index 8b64fc5e227a..8b64fc5e227a 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 8b95e2d73d0f..8b95e2d73d0f 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 683d490b2b0b..683d490b2b0b 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 62c472e0ce41..62c472e0ce41 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 bfb4fb67a13f..bfb4fb67a13f 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 a43108c98544..a43108c98544 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 e5585e75e809..e5585e75e809 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 c6d2c45d808b..c6d2c45d808b 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 f70a4f064c3c..f70a4f064c3c 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 b75738bed4b5..b75738bed4b5 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 76b29659057d..76b29659057d 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 0df16ed72688..0df16ed72688 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 64e900a0e910..64e900a0e910 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 a0a8d1762150..a0a8d1762150 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 664105357c00..664105357c00 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 9676b8f2f735..9676b8f2f735 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 dc90f6a62142..dc90f6a62142 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 e940b08505f1..e940b08505f1 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 56ad9870bcfd..56ad9870bcfd 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 3d1a0933a2eb..3d1a0933a2eb 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 857b4391a499..857b4391a499 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 9d28b3d8636c..9d28b3d8636c 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 a0e87b1e8140..a0e87b1e8140 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 5c62015db4df..5c62015db4df 100644
--- a/pkt-line.h
+++ b/third_party/git/pkt-line.h
diff --git a/po/.gitignore b/third_party/git/po/.gitignore
index 796b96d1c402..796b96d1c402 100644
--- a/po/.gitignore
+++ b/third_party/git/po/.gitignore
diff --git a/po/README b/third_party/git/po/README
index 07595d369b0a..07595d369b0a 100644
--- a/po/README
+++ b/third_party/git/po/README
diff --git a/po/TEAMS b/third_party/git/po/TEAMS
index 00472a47135c..00472a47135c 100644
--- a/po/TEAMS
+++ b/third_party/git/po/TEAMS
diff --git a/po/bg.po b/third_party/git/po/bg.po
index e1d10db68804..e1d10db68804 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 73a08242c324..73a08242c324 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 6d80cfb158a0..6d80cfb158a0 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 703f46d0c7c3..703f46d0c7c3 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 87c77ff9931b..87c77ff9931b 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 55c7db6aa6d0..55c7db6aa6d0 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 d799696ad09a..d799696ad09a 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 b8b34fd65eff..b8b34fd65eff 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 30ec99c74462..30ec99c74462 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 dcfe21c22351..dcfe21c22351 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 8a2d55a8b666..8a2d55a8b666 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 a77b462e6239..a77b462e6239 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 4ad206df703f..4ad206df703f 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 b8aa93a2c719..b8aa93a2c719 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 c6bdb3e3005a..c6bdb3e3005a 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 1b705cee1fe9..1b705cee1fe9 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 9b24b3261592..9b24b3261592 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 1711eef6e71b..1711eef6e71b 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 ed6eaa47388a..ed6eaa47388a 100644
--- a/preload-index.c
+++ b/third_party/git/preload-index.c
diff --git a/pretty.c b/third_party/git/pretty.c
index e4ed14effe1a..e4ed14effe1a 100644
--- a/pretty.c
+++ b/third_party/git/pretty.c
diff --git a/pretty.h b/third_party/git/pretty.h
index 4ad1fc31ff33..4ad1fc31ff33 100644
--- a/pretty.h
+++ b/third_party/git/pretty.h
diff --git a/prio-queue.c b/third_party/git/prio-queue.c
index d3f488cb05f2..d3f488cb05f2 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 4f9a37e6bee5..4f9a37e6bee5 100644
--- a/prio-queue.h
+++ b/third_party/git/prio-queue.h
diff --git a/progress.c b/third_party/git/progress.c
index 277db8afa26d..277db8afa26d 100644
--- a/progress.c
+++ b/third_party/git/progress.c
diff --git a/progress.h b/third_party/git/progress.h
index 847338911fbb..847338911fbb 100644
--- a/progress.h
+++ b/third_party/git/progress.h
diff --git a/prompt.c b/third_party/git/prompt.c
index 6d5885d00964..6d5885d00964 100644
--- a/prompt.c
+++ b/third_party/git/prompt.c
diff --git a/prompt.h b/third_party/git/prompt.h
index e04cced030ca..e04cced030ca 100644
--- a/prompt.h
+++ b/third_party/git/prompt.h
diff --git a/protocol.c b/third_party/git/protocol.c
index 9741f057505d..9741f057505d 100644
--- a/protocol.c
+++ b/third_party/git/protocol.c
diff --git a/protocol.h b/third_party/git/protocol.h
index cef1a4a01c79..cef1a4a01c79 100644
--- a/protocol.h
+++ b/third_party/git/protocol.h
diff --git a/quote.c b/third_party/git/quote.c
index 7f2aa6faa43f..7f2aa6faa43f 100644
--- a/quote.c
+++ b/third_party/git/quote.c
diff --git a/quote.h b/third_party/git/quote.h
index fb08dc085cca..fb08dc085cca 100644
--- a/quote.h
+++ b/third_party/git/quote.h
diff --git a/range-diff.c b/third_party/git/range-diff.c
index ba1e9a4265a6..ba1e9a4265a6 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 08a50b6e98fc..08a50b6e98fc 100644
--- a/range-diff.h
+++ b/third_party/git/range-diff.h
diff --git a/reachable.c b/third_party/git/reachable.c
index 8f50235b28ed..8f50235b28ed 100644
--- a/reachable.c
+++ b/third_party/git/reachable.c
diff --git a/reachable.h b/third_party/git/reachable.h
index 5df932ad8f54..5df932ad8f54 100644
--- a/reachable.h
+++ b/third_party/git/reachable.h
diff --git a/read-cache.c b/third_party/git/read-cache.c
index 52ffa8a3139f..52ffa8a3139f 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 aa18ae82b724..aa18ae82b724 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 44dbb06311a8..44dbb06311a8 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 f27cfc8c3e35..f27cfc8c3e35 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 f1dcff4c6e23..f1dcff4c6e23 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 3a25b27d8f8d..3a25b27d8f8d 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 f26408f6cc1c..f26408f6cc1c 100644
--- a/reflog-walk.h
+++ b/third_party/git/reflog-walk.h
diff --git a/refs.c b/third_party/git/refs.c
index cd297ee4bdbe..cd297ee4bdbe 100644
--- a/refs.c
+++ b/third_party/git/refs.c
diff --git a/refs.h b/third_party/git/refs.h
index 730d05ad91a6..730d05ad91a6 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 d60767ab739f..d60767ab739f 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 629e00a122a7..629e00a122a7 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 c01c7f5901a6..c01c7f5901a6 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 a01a0aff9c77..a01a0aff9c77 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 b7052f72e2f4..b7052f72e2f4 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 3bfb89d2b343..3bfb89d2b343 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 f2d8c0123a77..f2d8c0123a77 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 9a9bf21934af..9a9bf21934af 100644
--- a/refspec.c
+++ b/third_party/git/refspec.c
diff --git a/refspec.h b/third_party/git/refspec.h
index 9b6e64a824e4..9b6e64a824e4 100644
--- a/refspec.h
+++ b/third_party/git/refspec.h
diff --git a/remote-curl.c b/third_party/git/remote-curl.c
index 051f26629d7b..051f26629d7b 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 3af708c5b671..3af708c5b671 100644
--- a/remote-testsvn.c
+++ b/third_party/git/remote-testsvn.c
diff --git a/remote.c b/third_party/git/remote.c
index e50f7602eda5..e50f7602eda5 100644
--- a/remote.c
+++ b/third_party/git/remote.c
diff --git a/remote.h b/third_party/git/remote.h
index 83e885672ba9..83e885672ba9 100644
--- a/remote.h
+++ b/third_party/git/remote.h
diff --git a/replace-object.c b/third_party/git/replace-object.c
index e295e8794310..e295e8794310 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 04ed7a85a240..04ed7a85a240 100644
--- a/replace-object.h
+++ b/third_party/git/replace-object.h
diff --git a/repository.c b/third_party/git/repository.c
index 682c239fe3ed..682c239fe3ed 100644
--- a/repository.c
+++ b/third_party/git/repository.c
diff --git a/repository.h b/third_party/git/repository.h
index 4fb6a5885f79..4fb6a5885f79 100644
--- a/repository.h
+++ b/third_party/git/repository.h
diff --git a/rerere.c b/third_party/git/rerere.c
index 17abb47321f1..17abb47321f1 100644
--- a/rerere.c
+++ b/third_party/git/rerere.c
diff --git a/rerere.h b/third_party/git/rerere.h
index c32d79c3bd81..c32d79c3bd81 100644
--- a/rerere.h
+++ b/third_party/git/rerere.h
diff --git a/resolve-undo.c b/third_party/git/resolve-undo.c
index 236320f179cb..236320f179cb 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 2b3f0f901e63..2b3f0f901e63 100644
--- a/resolve-undo.h
+++ b/third_party/git/resolve-undo.h
diff --git a/revision.c b/third_party/git/revision.c
index 07412297f024..07412297f024 100644
--- a/revision.c
+++ b/third_party/git/revision.c
diff --git a/revision.h b/third_party/git/revision.h
index 4134dc6029c4..4134dc6029c4 100644
--- a/revision.h
+++ b/third_party/git/revision.h
diff --git a/run-command.c b/third_party/git/run-command.c
index 3449db319b95..3449db319b95 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 f769e03f018f..f769e03f018f 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 6dc16c321163..6dc16c321163 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 e148fcd96099..e148fcd96099 100644
--- a/send-pack.h
+++ b/third_party/git/send-pack.h
diff --git a/sequencer.c b/third_party/git/sequencer.c
index 34ebf8ed94ad..34ebf8ed94ad 100644
--- a/sequencer.c
+++ b/third_party/git/sequencer.c
diff --git a/sequencer.h b/third_party/git/sequencer.h
index 6704acbb9c93..6704acbb9c93 100644
--- a/sequencer.h
+++ b/third_party/git/sequencer.h
diff --git a/serve.c b/third_party/git/serve.c
index 317256c1a493..317256c1a493 100644
--- a/serve.c
+++ b/third_party/git/serve.c
diff --git a/serve.h b/third_party/git/serve.h
index 42ddca7f8b4f..42ddca7f8b4f 100644
--- a/serve.h
+++ b/third_party/git/serve.h
diff --git a/server-info.c b/third_party/git/server-info.c
index 4d8199b1d916..4d8199b1d916 100644
--- a/server-info.c
+++ b/third_party/git/server-info.c
diff --git a/setup.c b/third_party/git/setup.c
index 8dcb4631f7d3..8dcb4631f7d3 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 e7430b9aa8ec..e7430b9aa8ec 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 d922e94e3fc5..d922e94e3fc5 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 55d016c4bf7b..55d016c4bf7b 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 487ea35d2d39..487ea35d2d39 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 796ab68da83c..796ab68da83c 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 5afcd011c6be..5afcd011c6be 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 2989e27b717a..2989e27b717a 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 da53f4054834..da53f4054834 100644
--- a/sha1dc/.gitattributes
+++ b/third_party/git/sha1dc/.gitattributes
diff --git a/sha1dc/LICENSE.txt b/third_party/git/sha1dc/LICENSE.txt
index 4a3e6a1b15a6..4a3e6a1b15a6 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 9d3cf81d4d71..9d3cf81d4d71 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 1e4e94be54a6..1e4e94be54a6 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 b3beff2afbae..b3beff2afbae 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 d7e17dc734d0..d7e17dc734d0 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 e0cc9d988c70..e0cc9d988c70 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 41e1c3fd3f78..41e1c3fd3f78 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 37850b4e52e0..37850b4e52e0 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 5099d6421d37..5099d6421d37 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 09bd8bb20062..09bd8bb20062 100644
--- a/sha256/gcrypt.h
+++ b/third_party/git/sha256/gcrypt.h
diff --git a/shallow.c b/third_party/git/shallow.c
index 5fa2b15d3705..5fa2b15d3705 100644
--- a/shallow.c
+++ b/third_party/git/shallow.c
diff --git a/shell.c b/third_party/git/shell.c
index 40084a30130e..40084a30130e 100644
--- a/shell.c
+++ b/third_party/git/shell.c
diff --git a/shortlog.h b/third_party/git/shortlog.h
index 2fa61c429462..2fa61c429462 100644
--- a/shortlog.h
+++ b/third_party/git/shortlog.h
diff --git a/sideband.c b/third_party/git/sideband.c
index ef851113c44e..ef851113c44e 100644
--- a/sideband.c
+++ b/third_party/git/sideband.c
diff --git a/sideband.h b/third_party/git/sideband.h
index 227740a58e58..227740a58e58 100644
--- a/sideband.h
+++ b/third_party/git/sideband.h
diff --git a/sigchain.c b/third_party/git/sigchain.c
index 022677b6abaf..022677b6abaf 100644
--- a/sigchain.c
+++ b/third_party/git/sigchain.c
diff --git a/sigchain.h b/third_party/git/sigchain.h
index 138b20f54b40..138b20f54b40 100644
--- a/sigchain.h
+++ b/third_party/git/sigchain.h
diff --git a/split-index.c b/third_party/git/split-index.c
index e6154e4ea955..e6154e4ea955 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 7a435ca2c970..7a435ca2c970 100644
--- a/split-index.h
+++ b/third_party/git/split-index.h
diff --git a/strbuf.c b/third_party/git/strbuf.c
index d30f91685888..d30f91685888 100644
--- a/strbuf.c
+++ b/third_party/git/strbuf.c
diff --git a/strbuf.h b/third_party/git/strbuf.h
index f62278a0be59..f62278a0be59 100644
--- a/strbuf.h
+++ b/third_party/git/strbuf.h
diff --git a/streaming.c b/third_party/git/streaming.c
index fcd63032192f..fcd63032192f 100644
--- a/streaming.c
+++ b/third_party/git/streaming.c
diff --git a/streaming.h b/third_party/git/streaming.h
index f465a3cd311e..f465a3cd311e 100644
--- a/streaming.h
+++ b/third_party/git/streaming.h
diff --git a/string-list.c b/third_party/git/string-list.c
index a917955fbd8d..a917955fbd8d 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 f964399949ce..f964399949ce 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 3f4af935557c..3f4af935557c 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 5c182fad9853..5c182fad9853 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 4264ee216f49..4264ee216f49 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 1b4e2da658dc..1b4e2da658dc 100644
--- a/submodule-config.h
+++ b/third_party/git/submodule-config.h
diff --git a/submodule.c b/third_party/git/submodule.c
index 0f199c51378d..0f199c51378d 100644
--- a/submodule.c
+++ b/third_party/git/submodule.c
diff --git a/submodule.h b/third_party/git/submodule.h
index 8072e6d6ddfd..8072e6d6ddfd 100644
--- a/submodule.h
+++ b/third_party/git/submodule.h
diff --git a/symlinks.c b/third_party/git/symlinks.c
index 69d458a24d53..69d458a24d53 100644
--- a/symlinks.c
+++ b/third_party/git/symlinks.c
diff --git a/t/.gitattributes b/third_party/git/t/.gitattributes
index df05434d32cc..df05434d32cc 100644
--- a/t/.gitattributes
+++ b/third_party/git/t/.gitattributes
diff --git a/t/.gitignore b/third_party/git/t/.gitignore
index 91cf5772fe56..91cf5772fe56 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 c92fee453f60..c92fee453f60 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 bfbd87845f77..bfbd87845f77 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 d7b49b8d546a..d7b49b8d546a 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 05795ab636d6..05795ab636d6 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 1da1cce156c4..1da1cce156c4 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 49e1438295c0..49e1438295c0 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 d4488e7162cf..d4488e7162cf 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 c83fd18861f3..c83fd18861f3 100644
--- a/t/Makefile
+++ b/third_party/git/t/Makefile
diff --git a/t/README b/third_party/git/t/README
index 60d5b77bccd9..60d5b77bccd9 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 7913e206ed6b..7913e206ed6b 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 d933af571474..d933af571474 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 70df40e34b7d..70df40e34b7d 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 09457d319661..09457d319661 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 16206960d8b0..16206960d8b0 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 c4a830d1c1d6..c4a830d1c1d6 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 92bbb777b82a..92bbb777b82a 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 3be939ed388c..3be939ed388c 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 f6dd14302b2b..f6dd14302b2b 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 fed7e89ae8ff..fed7e89ae8ff 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 d859151af1d9..d859151af1d9 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 55b0f42a534d..55b0f42a534d 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 3cc67b65d0c9..3cc67b65d0c9 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 41f121fbbf9c..41f121fbbf9c 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 5ef6ff7db5ea..5ef6ff7db5ea 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 2a910f9d6660..2a910f9d6660 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 72d482f76dd2..72d482f76dd2 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 184688718a9c..184688718a9c 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 508ca447fd6c..508ca447fd6c 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 ad4118e537e4..ad4118e537e4 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 3bbb002a4c74..3bbb002a4c74 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 3be939ed388c..3be939ed388c 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 113c0c466f17..113c0c466f17 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 9674b88cf252..9674b88cf252 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 571bbd85cdfc..571bbd85cdfc 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 ab2a026fbc2f..ab2a026fbc2f 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 eed774a9d643..eed774a9d643 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 8c0260d7f1d9..8c0260d7f1d9 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 a841d781f04f..a841d781f04f 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 b506d4622197..b506d4622197 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 0499fa418059..0499fa418059 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 84d8bdebc026..84d8bdebc026 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 2f038207e194..2f038207e194 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 bf78454f74c8..bf78454f74c8 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 4e6ab69b8867..4e6ab69b8867 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 c33cf56ee73a..c33cf56ee73a 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 7db76262bc2e..7db76262bc2e 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 f011e335e5f1..f011e335e5f1 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 b857ff546765..b857ff546765 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 e5fb752d2fc2..e5fb752d2fc2 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 899bc5de8bce..899bc5de8bce 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 32038a070c2a..32038a070c2a 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 a53edbcc8d89..a53edbcc8d89 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 534b065e38ba..534b065e38ba 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 ad4ce8afd9b5..ad4ce8afd9b5 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 03d3ceb22d89..03d3ceb22d89 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 daf22da16476..daf22da16476 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 5953c7bfbc2e..5953c7bfbc2e 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 9bd8e9a4c68c..9bd8e9a4c68c 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 2f3ebabdc286..2f3ebabdc286 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 d8566580839b..d8566580839b 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 fc9f250ac48e..fc9f250ac48e 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 8f26856e775b..8f26856e775b 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 088e622c3141..088e622c3141 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 93e8ba8e4d9a..93e8ba8e4d9a 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 59b6c8b850a1..59b6c8b850a1 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 300058341b6f..300058341b6f 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 170cb5999322..170cb5999322 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 287ab8970548..287ab8970548 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 cf18429d0397..cf18429d0397 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 c9598e915307..c9598e915307 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 c2a59ffc335c..c2a59ffc335c 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 8fd656c7b598..8fd656c7b598 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 0c9ef1cfc695..0c9ef1cfc695 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 f35404bf0f93..f35404bf0f93 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 15b68d437379..15b68d437379 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 0ff136ab3cf1..0ff136ab3cf1 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 c8165ad19ec5..c8165ad19ec5 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 998b05a47d30..998b05a47d30 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 237f22734963..237f22734963 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 ec9acb98253d..ec9acb98253d 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 98b3d881fda9..98b3d881fda9 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 4fd2d6e2b80b..4fd2d6e2b80b 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 211b901dbc42..211b901dbc42 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 e6af4de91672..e6af4de91672 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 1d79384606d2..1d79384606d2 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 d82c8ebbc006..d82c8ebbc006 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 74723e734043..74723e734043 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 f6b3ba4214a4..f6b3ba4214a4 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 51162821d7e1..51162821d7e1 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 37fa643c20a9..37fa643c20a9 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 c9913429e64b..c9913429e64b 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 277d8358dfd5..277d8358dfd5 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 13cff2c0a511..13cff2c0a511 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 f1df085bf03b..f1df085bf03b 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 38bfeebd881a..38bfeebd881a 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 2de880f7a5b0..2de880f7a5b0 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 6ff87c466498..6ff87c466498 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 548142c327a6..548142c327a6 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 006d2a8152dc..006d2a8152dc 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 2bad28af9241..2bad28af9241 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 aa22af48c2a6..aa22af48c2a6 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 214003d5b2f9..214003d5b2f9 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 92c4c2313e78..92c4c2313e78 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 585347ea487a..585347ea487a 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 e749a49c88e6..e749a49c88e6 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 659b6bfa81df..659b6bfa81df 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 f65e301f9ddc..f65e301f9ddc 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 6a3f88f5f5d4..6a3f88f5f5d4 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 2786f47088e9..2786f47088e9 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 63c689d6ee9d..63c689d6ee9d 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 cf0f2c7228e8..cf0f2c7228e8 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 c8a1cde7d2de..c8a1cde7d2de 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 12beee99ad2f..12beee99ad2f 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 99b8dc1e2d9c..99b8dc1e2d9c 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 9532f5bac976..9532f5bac976 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 432233c7f0e5..432233c7f0e5 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 0a31de66f354..0a31de66f354 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 aaf17b0ddf9e..aaf17b0ddf9e 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 fcd10968cc10..fcd10968cc10 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 37c452535f8b..37c452535f8b 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 b99a37080d93..b99a37080d93 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 078dd7e29d08..078dd7e29d08 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 b9fd427571e6..b9fd427571e6 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 c5cffaa4b73f..c5cffaa4b73f 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 229068894029..229068894029 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 0acf99931ee1..0acf99931ee1 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 8cb0d53840f3..8cb0d53840f3 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 af82db06ac59..af82db06ac59 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 5d543ad21f89..5d543ad21f89 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 282d53638446..282d53638446 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 f4028442e37e..f4028442e37e 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 a0272178b779..a0272178b779 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 7e79b555de80..7e79b555de80 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 831b586d0222..831b586d0222 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 799fc00aa15b..799fc00aa15b 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 10284cc56fa9..10284cc56fa9 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 f7f861844560..f7f861844560 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 625b2dbf8226..625b2dbf8226 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 2cc93bb69c52..2cc93bb69c52 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 393f1604ff95..393f1604ff95 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 aee35e5aef40..aee35e5aef40 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 ad5e69f9d3b0..ad5e69f9d3b0 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 d860c387c384..d860c387c384 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 84594885c703..84594885c703 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 0ac6a99d5f2a..0ac6a99d5f2a 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 d013bccddaeb..d013bccddaeb 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 44e4a6d143e2..44e4a6d143e2 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 2123dda85bf1..2123dda85bf1 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 e2692746dfdb..e2692746dfdb 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 bc97929bbc3a..bc97929bbc3a 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 92b69de63529..92b69de63529 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 7667c0803f12..7667c0803f12 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 ce7e89028c4a..ce7e89028c4a 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 f805bb39ae9e..f805bb39ae9e 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 197819c872ee..197819c872ee 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 8f4d67e64695..8f4d67e64695 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 2c103d1824cf..2c103d1824cf 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 b4b752b01aaf..b4b752b01aaf 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 8837717d36a7..8837717d36a7 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 a648bbd961c2..a648bbd961c2 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 49c78d3dba9d..49c78d3dba9d 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 31a4bbc716aa..31a4bbc716aa 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 72d42bd85622..72d42bd85622 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 903e9193f8c3..903e9193f8c3 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 4d22e42f8422..4d22e42f8422 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 97e8e580efeb..97e8e580efeb 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 3e0a2911d4f9..3e0a2911d4f9 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 2be955fafba6..2be955fafba6 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 937b831ea675..937b831ea675 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 9b2bcfb1b0e3..9b2bcfb1b0e3 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 8d1e408bb58f..8d1e408bb58f 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 2139b427ca1c..2139b427ca1c 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 fb8f8870801e..fb8f8870801e 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 547b9f88e123..547b9f88e123 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 5d4ae629e14e..5d4ae629e14e 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 8d28652b729b..8d28652b729b 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 a7fd87c0697c..a7fd87c0697c 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 94ffad0d31a3..94ffad0d31a3 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 918dfce332e1..918dfce332e1 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 b3e3c4f1cd95..b3e3c4f1cd95 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 0d985758c6dd..0d985758c6dd 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 5c1c86c193ab..5c1c86c193ab 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 fcef72892547..fcef72892547 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 82cc610b0ac0..82cc610b0ac0 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 e65d447fc4c4..e65d447fc4c4 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 a77b8e546926..a77b8e546926 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 99a34d648742..99a34d648742 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 6dab2579cbf9..6dab2579cbf9 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 c4d907a450a7..c4d907a450a7 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 3aa7a3ffd8b0..3aa7a3ffd8b0 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 cfd76bf987bd..cfd76bf987bd 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 83babe57d959..83babe57d959 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 168329adbc4e..168329adbc4e 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 b95f4856061d..b95f4856061d 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 7ea30e50068b..7ea30e50068b 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 1dd17fc03e12..1dd17fc03e12 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 b0ed4767e320..b0ed4767e320 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 e3809dcead18..e3809dcead18 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 27f843fc0006..27f843fc0006 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 ccdbfdf9743d..ccdbfdf9743d 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 a754970523ce..a754970523ce 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 982eb8e3a949..982eb8e3a949 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 8c47155a7c86..8c47155a7c86 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 c7b70e2d28ba..c7b70e2d28ba 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 66554d216122..66554d216122 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 a94d9955d012..a94d9955d012 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 3ebaf1552148..3ebaf1552148 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 d3865db286fc..d3865db286fc 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 c1a2717e0772..c1a2717e0772 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 002c21e52a67..002c21e52a67 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 3042a85666ce..3042a85666ce 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 cdd105a59452..cdd105a59452 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 62369eaaf0d9..62369eaaf0d9 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 1afc08fe7f19..1afc08fe7f19 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 0b0aa9858f5d..0b0aa9858f5d 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 78cc23fe2f32..78cc23fe2f32 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 09595264f09f..09595264f09f 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 6e924f5fa3f9..6e924f5fa3f9 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 dd18a9ce2b11..dd18a9ce2b11 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 ae1b84198bbc..ae1b84198bbc 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 c2b97d2487bb..c2b97d2487bb 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 d202aaed06fc..d202aaed06fc 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 88f47de282c1..88f47de282c1 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 7e00c9da47d7..7e00c9da47d7 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 683be6984f5a..683be6984f5a 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 7c26f4f33788..7c26f4f33788 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 392bcc0e51f8..392bcc0e51f8 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 2bc47ded4d11..2bc47ded4d11 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 060971265a9c..060971265a9c 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 a9b3e112d982..a9b3e112d982 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 377985194116..377985194116 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 83baedb8a492..83baedb8a492 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 6a3a42531b05..6a3a42531b05 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 47c3fd7581cc..47c3fd7581cc 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 d0e0e019ea36..d0e0e019ea36 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 b99dc23e328d..b99dc23e328d 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 68fed663479d..68fed663479d 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 3e04bd2ae1d6..3e04bd2ae1d6 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 b029586ccb2c..b029586ccb2c 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 7c1888a27e7f..7c1888a27e7f 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 def7ecdbc786..def7ecdbc786 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 9f4ade639f74..9f4ade639f74 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 8b09c5bf328b..8b09c5bf328b 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 61e41b82cffa..61e41b82cffa 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 b58a43ea4364..b58a43ea4364 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 72e3dc3e1947..72e3dc3e1947 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 fcfc992b5b02..fcfc992b5b02 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 28720e4e1041..28720e4e1041 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 c7b86104e12a..c7b86104e12a 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 9ca0818cbe4c..9ca0818cbe4c 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 26f82063267f..26f82063267f 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 0aa9908ea12d..0aa9908ea12d 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 71e63d8b509d..71e63d8b509d 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 e3137d638ee5..e3137d638ee5 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 4c214bd11c48..4c214bd11c48 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 d9fcc829a9e6..d9fcc829a9e6 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 1f600e2cae54..1f600e2cae54 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 1744cee5e996..1744cee5e996 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 3941ad252865..3941ad252865 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 5657c5a87b6e..5657c5a87b6e 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 5343ffd3f92c..5343ffd3f92c 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 e8ef7300ecb8..e8ef7300ecb8 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 419f31a8f7d4..419f31a8f7d4 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 ba9aaa145ccd..ba9aaa145ccd 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 a070e645d7fb..a070e645d7fb 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 291e9061f39d..291e9061f39d 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 31f8276ba82b..31f8276ba82b 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 c1ecf6aeac67..c1ecf6aeac67 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 3b0c336b38e4..3b0c336b38e4 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 fea87fb81b62..fea87fb81b62 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 854da0ae16f8..854da0ae16f8 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 e10f5f787fca..e10f5f787fca 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 470107248eb1..470107248eb1 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 7af3fbcc7b9e..7af3fbcc7b9e 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 f9bbb91f64e3..f9bbb91f64e3 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 4e9fa3cd6842..4e9fa3cd6842 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 e13363ade5cf..e13363ade5cf 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 c5203e232c8b..c5203e232c8b 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 959b6da44900..959b6da44900 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 1090e650edb7..1090e650edb7 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 24ce46a6ea15..24ce46a6ea15 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 0c24a0f9a377..0c24a0f9a377 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 cebc77fab0b2..cebc77fab0b2 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 5b927b76fe58..5b927b76fe58 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 192c94eccd13..192c94eccd13 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 10ac92d22507..10ac92d22507 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 0c6ff567a1d4..0c6ff567a1d4 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 2630e756dab7..2630e756dab7 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 c7b53e494ba4..c7b53e494ba4 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 015fac8b5d07..015fac8b5d07 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 8e215867b8c1..8e215867b8c1 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 c6ee9f66b11d..c6ee9f66b11d 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 5dda570b9a1e..5dda570b9a1e 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 91fa639c4a74..91fa639c4a74 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 92910e4e6c13..92910e4e6c13 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 7b111a56fdd3..7b111a56fdd3 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 ce92e6acad41..ce92e6acad41 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 ce9a4a5f324b..ce9a4a5f324b 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 58c0b7e9b6d9..58c0b7e9b6d9 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 a1998b558f96..a1998b558f96 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 f99529d83853..f99529d83853 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 ad4a50ecd8a8..ad4a50ecd8a8 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 519019c5ce6c..519019c5ce6c 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 b9965de6a5d7..b9965de6a5d7 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 f0a50f10096a..f0a50f10096a 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 43334b05b2de..43334b05b2de 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 7378c7bec247..7378c7bec247 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 220b198c97f9..220b198c97f9 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 1ccd92777928..1ccd92777928 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 e8283aac6dff..e8283aac6dff 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 fa7c10b61525..fa7c10b61525 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 79a0ba836f5b..79a0ba836f5b 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 8b44bec48b94..8b44bec48b94 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 8853d8afb923..8853d8afb923 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 584d45cf3602..584d45cf3602 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 36fba341ba01..36fba341ba01 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 022d607f4cf9..022d607f4cf9 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 90da1c7ddc41..90da1c7ddc41 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 a29d166e007b..a29d166e007b 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 2cbf7b959073..2cbf7b959073 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 0ce1f22eff66..0ce1f22eff66 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 8437e51eb545..8437e51eb545 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 f9fa16ad8363..f9fa16ad8363 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 ce7574edb1e7..ce7574edb1e7 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 c65d1a815ea3..c65d1a815ea3 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 2c3ad6e8c186..2c3ad6e8c186 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 351af7844ed9..351af7844ed9 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 ff5b9cc72966..ff5b9cc72966 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 6584bb563427..6584bb563427 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 82eaaea0f495..82eaaea0f495 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 ebd5fa5249ca..ebd5fa5249ca 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 d6b54e8c65a3..d6b54e8c65a3 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 f028fd141828..f028fd141828 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 5bd892f2f7a9..5bd892f2f7a9 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 013c5a7bc328..013c5a7bc328 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 1057a96b2498..1057a96b2498 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 9c05f5e1f510..9c05f5e1f510 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 b6111cd150fd..b6111cd150fd 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 c13578a635fb..c13578a635fb 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 83b09e131067..83b09e131067 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 43c4be1e5ef5..43c4be1e5ef5 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 64b340f22727..64b340f22727 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 cf9601684482..cf9601684482 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 59b3aa4bc402..59b3aa4bc402 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 b946f8768649..b946f8768649 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 ba71b159ba8c..ba71b159ba8c 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 57f0770df141..57f0770df141 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 91a6fafcb425..91a6fafcb425 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 2f5a25d50386..2f5a25d50386 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 55d22da32ccd..55d22da32ccd 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 c2df75e4953d..c2df75e4953d 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 301e071ff7d7..301e071ff7d7 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 dcb4dbba673e..dcb4dbba673e 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 8b7640b3ba8a..8b7640b3ba8a 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 bc89371f5343..bc89371f5343 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 40cc004326e2..40cc004326e2 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 ae66ba5babf3..ae66ba5babf3 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 428177c390db..428177c390db 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 2dc853d1be5f..2dc853d1be5f 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 ce4cff13bbce..ce4cff13bbce 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 0000e664e7b6..0000e664e7b6 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 335d3f3211aa..335d3f3211aa 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 d20b4d150d42..d20b4d150d42 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 21e139a313be..21e139a313be 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 37dc689d8c98..37dc689d8c98 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 d0a2727b850a..d0a2727b850a 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 0c37e7180d1c..0c37e7180d1c 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 6049d9170814..6049d9170814 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 f1f9aee9f5dc..f1f9aee9f5dc 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 1fbd94040818..1fbd94040818 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 a4ebb0b65fec..a4ebb0b65fec 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 98e4a8613ba8..98e4a8613ba8 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 5d955c3bff2c..5d955c3bff2c 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 970c5c36b9b5..970c5c36b9b5 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 331899ddc4bd..331899ddc4bd 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 d199d872fb19..d199d872fb19 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 9a848581180f..9a848581180f 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 1e44a17eead4..1e44a17eead4 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 e5cb8a252dd1..e5cb8a252dd1 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 82950c02825c..82950c02825c 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 985daf1def36..985daf1def36 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 3acd895afb7f..3acd895afb7f 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 c730600d8a78..c730600d8a78 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 feb1efd8ff99..feb1efd8ff99 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 bb2c7572a384..bb2c7572a384 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 dc9e402c5557..dc9e402c5557 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 c7878a60edfd..c7878a60edfd 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 b36e0528d07b..b36e0528d07b 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 01abee533ded..01abee533ded 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 3498d3d55e9e..3498d3d55e9e 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 a859abedf582..a859abedf582 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 492edffa9cfb..492edffa9cfb 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 3d51615e42d5..3d51615e42d5 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 4969edb31441..4969edb31441 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 4ee009da666f..4ee009da666f 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 fa3e4996418d..fa3e4996418d 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 4a9964e9dc4e..4a9964e9dc4e 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 553a3f601ba7..553a3f601ba7 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 d4d21d31a943..d4d21d31a943 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 6d47e2c725f7..6d47e2c725f7 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 9974457f5615..9974457f5615 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 e0a49a651fdd..e0a49a651fdd 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 c19fb500cb22..c19fb500cb22 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 87ec3ae71488..87ec3ae71488 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 788cc91e452c..788cc91e452c 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 3ec2971ee5be..3ec2971ee5be 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 42962ed7d46f..42962ed7d46f 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 4171f1e14103..4171f1e14103 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 12a556884427..12a556884427 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 5dc221ef382d..5dc221ef382d 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 f18616ad2be3..f18616ad2be3 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 70361c806e1b..70361c806e1b 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 ff163cf6750f..ff163cf6750f 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 a12afe93f329..a12afe93f329 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 9fa561047430..9fa561047430 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 57cbdfe9bce9..57cbdfe9bce9 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 fc9aad530e9f..fc9aad530e9f 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 eadb9434ae76..eadb9434ae76 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 f3c21520877e..f3c21520877e 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 2e47fe01cfaf..2e47fe01cfaf 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 0e8d56aa7631..0e8d56aa7631 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 e7ba8c505f57..e7ba8c505f57 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 8f86b5f4b298..8f86b5f4b298 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 ccfb14711353..ccfb14711353 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 37bdcedcc952..37bdcedcc952 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 47aeb0b1674c..47aeb0b1674c 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 655f278c5f87..655f278c5f87 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 822381dd9df6..822381dd9df6 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 b99d5192a96e..b99d5192a96e 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 b748db9946ef..b748db9946ef 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 c2ada7de3731..c2ada7de3731 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 fc3eb43b8909..fc3eb43b8909 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 fca3f8582457..fca3f8582457 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 fa0718c730c3..fa0718c730c3 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 76330cb5ab79..76330cb5ab79 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 309199bca272..309199bca272 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 21f4659a9d1c..21f4659a9d1c 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 f9efa29dfb8c..f9efa29dfb8c 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 2650df196670..2650df196670 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 98b2476e7c79..98b2476e7c79 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 2df3fdde8bf6..2df3fdde8bf6 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 6c32d42c8c68..6c32d42c8c68 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 22f2c730ae8d..22f2c730ae8d 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 0114f052280d..0114f052280d 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 7e2e7dd4ae58..7e2e7dd4ae58 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 a7f3d47aec25..a7f3d47aec25 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 99d858c6b755..99d858c6b755 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 2242cd098ec4..2242cd098ec4 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 f764b7e3f53e..f764b7e3f53e 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 a4eec0a3465b..a4eec0a3465b 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 9ee659098c45..9ee659098c45 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 5bbe8dcce401..5bbe8dcce401 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 2e07365bbb05..2e07365bbb05 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 c8de6d8a1902..c8de6d8a1902 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 e819ba741ec9..e819ba741ec9 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 b7d6d5d45adf..b7d6d5d45adf 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 bb6fb9b12cb7..bb6fb9b12cb7 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 939d18d7286c..939d18d7286c 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 286121d8decb..286121d8decb 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 0aefadacb053..0aefadacb053 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 1ec7cb57c7a8..1ec7cb57c7a8 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 8704b04e1b41..8704b04e1b41 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 d5ec333131f9..d5ec333131f9 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 9fd5a1f188aa..9fd5a1f188aa 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 209b4c7cd8c6..209b4c7cd8c6 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 e109c3fbfb5f..e109c3fbfb5f 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 318b5bce7ebe..318b5bce7ebe 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 64f047332b51..64f047332b51 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 963f3462b750..963f3462b750 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 580e158f9918..580e158f9918 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 124e73b8e601..124e73b8e601 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 ff641b348a1b..ff641b348a1b 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 3824756a02ec..3824756a02ec 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 b56180ee4ad3..b56180ee4ad3 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 d31459942812..d31459942812 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 3d9fae68c41c..3d9fae68c41c 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 c4b4a94324a2..c4b4a94324a2 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 b81eb5fd6ffa..b81eb5fd6ffa 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 f1f09abdd9b2..f1f09abdd9b2 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 44f378ce41d2..44f378ce41d2 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 891d4d7cb9f1..891d4d7cb9f1 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 18baf49a49c7..18baf49a49c7 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 12bf31022a87..12bf31022a87 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 1e16c6b8ea61..1e16c6b8ea61 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 14520913afca..14520913afca 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 411a70b0ce96..411a70b0ce96 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 0ea4fc46949d..0ea4fc46949d 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 6adf47869c46..6adf47869c46 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 71818b90f00d..71818b90f00d 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 698d9cc4f3d6..698d9cc4f3d6 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 4f1e16bb44e2..4f1e16bb44e2 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 ec548654ce1c..ec548654ce1c 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 7bb381496227..7bb381496227 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 9ea5fa4fd246..9ea5fa4fd246 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 3b7caca4212e..3b7caca4212e 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 04de03cad0a7..04de03cad0a7 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 704bbc65419c..704bbc65419c 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 7217c5e222ba..7217c5e222ba 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 704aee81ef56..704aee81ef56 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 1709e8c00b85..1709e8c00b85 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 54460beec469..54460beec469 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 61748088ebcb..61748088ebcb 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 1aa366a410e9..1aa366a410e9 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 d60588ec8f00..d60588ec8f00 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 14c2adf970d7..14c2adf970d7 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 2dea846e259d..2dea846e259d 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 37151a3adc39..37151a3adc39 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 823fdbda1f32..823fdbda1f32 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 80b23fd3269c..80b23fd3269c 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 a0b9438b2286..a0b9438b2286 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 a1ec501a872b..a1ec501a872b 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 1f5122b632fb..1f5122b632fb 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 461dd539ffd4..461dd539ffd4 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 860e63e444d2..860e63e444d2 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 b393e1e9fee8..b393e1e9fee8 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 910f21828434..910f21828434 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 d2bd7c17b011..d2bd7c17b011 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 3b340f1ece36..3b340f1ece36 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 2e29866993ce..2e29866993ce 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 fb45e7bf7bd6..fb45e7bf7bd6 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 21632a984e76..21632a984e76 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 b6833e9a5fea..b6833e9a5fea 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 72e04b5386a8..72e04b5386a8 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 22d218698e95..22d218698e95 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 ddf2f6485383..ddf2f6485383 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 e85cdc7037bc..e85cdc7037bc 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 4eff14dae532..4eff14dae532 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 49f548cdb93d..49f548cdb93d 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 b8f4d0346723..b8f4d0346723 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 7274dca40b1c..7274dca40b1c 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 a5868ea152f9..a5868ea152f9 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 696375079431..696375079431 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 fd8efe84fe8f..fd8efe84fe8f 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 a2bba04ba96c..a2bba04ba96c 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 d8640522a086..d8640522a086 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 f6993b7e14d9..f6993b7e14d9 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 76f6d306eaf3..76f6d306eaf3 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 7b6c4847ad6b..7b6c4847ad6b 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 f038f34b7c03..f038f34b7c03 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 d1c68af8c50e..d1c68af8c50e 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 8b635a196d5c..8b635a196d5c 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 e27f39d1e5b0..e27f39d1e5b0 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 a267b2d144df..a267b2d144df 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 5f911bb5290f..5f911bb5290f 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 127dd0082ff8..127dd0082ff8 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 9b9b4ca8d4f2..9b9b4ca8d4f2 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 b457333e1865..b457333e1865 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 1e5b3948dfc5..1e5b3948dfc5 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 793bcc7fe324..793bcc7fe324 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 84a587daf3af..84a587daf3af 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 bd78287841ee..bd78287841ee 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 5e39fcdb66c0..5e39fcdb66c0 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 66282a720ee8..66282a720ee8 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 c325167b9031..c325167b9031 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 69991a3168f3..69991a3168f3 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 6c676645d837..6c676645d837 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 3ef525a559d9..3ef525a559d9 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 8eb47942e2d7..8eb47942e2d7 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 b92ff9597728..b92ff9597728 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 ee31e1973829..ee31e1973829 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 63f4f8f121df..63f4f8f121df 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 74b533042f6d..74b533042f6d 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 7cbef0ee6f43..7cbef0ee6f43 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 2257f05a992a..2257f05a992a 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 546f2aac01b6..546f2aac01b6 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 923eb01f0ea4..923eb01f0ea4 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 38c21a6a7fa9..38c21a6a7fa9 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 5f5205cd022b..5f5205cd022b 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 f528008c363c..f528008c363c 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 b8e337893f3e..b8e337893f3e 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 9546b6f8a4e2..9546b6f8a4e2 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 29ca76f2fbea..29ca76f2fbea 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 d7219d6f8f18..d7219d6f8f18 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 10914bba7b37..10914bba7b37 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 54ce19e353d9..54ce19e353d9 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 8de36b7d1222..8de36b7d1222 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 c16486a9d41a..c16486a9d41a 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 3a6c21e8251b..3a6c21e8251b 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 df2accb6555d..df2accb6555d 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 6e562c80d12f..6e562c80d12f 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 f542d2929d23..f542d2929d23 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 03489aff14ea..03489aff14ea 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 b187b7f6c66b..b187b7f6c66b 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 b1ccd4102e09..b1ccd4102e09 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 3641fd84d686..3641fd84d686 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 281f8fad0c71..281f8fad0c71 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 5ae19b987d65..5ae19b987d65 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 6579c81216a9..6579c81216a9 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 a9054d2db116..a9054d2db116 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 78f8970e2be2..78f8970e2be2 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 9951e3677d69..9951e3677d69 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 cec33fa3f02b..cec33fa3f02b 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 db3c0a7b2cc5..db3c0a7b2cc5 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 a4ca42df2a4c..a4ca42df2a4c 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 d019867dd941..d019867dd941 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 12b2eee17ec0..12b2eee17ec0 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 40b91796b34a..40b91796b34a 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 e208dd56826e..e208dd56826e 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 5ecb4e14ae47..5ecb4e14ae47 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 fc177ab3f24c..fc177ab3f24c 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 bd905b1c5730..bd905b1c5730 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 7bb8b45e3eea..7bb8b45e3eea 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 cbdde4f400fe..cbdde4f400fe 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 cd79f1a0ff23..cd79f1a0ff23 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 817ed06f822e..817ed06f822e 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 3c5092c6993f..3c5092c6993f 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 08920ac658b0..08920ac658b0 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 94b76bfef159..94b76bfef159 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 d50970d57452..d50970d57452 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 3a85316d8a34..3a85316d8a34 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 2e08239a46a7..2e08239a46a7 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 fe3f6b7c7e79..fe3f6b7c7e79 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 a3203bd19bd7..a3203bd19bd7 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 06eb77e3861c..06eb77e3861c 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 d6451ff7cc40..d6451ff7cc40 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 680eab5f2796..680eab5f2796 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 9722d1b3a76a..9722d1b3a76a 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 ccdaafb3772e..ccdaafb3772e 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 58e5f74aeae8..58e5f74aeae8 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 d0411f64ec5d..d0411f64ec5d 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 94e32eabb1f8..94e32eabb1f8 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 c22983ac4ae0..c22983ac4ae0 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 8fdcfb4c0ad6..8fdcfb4c0ad6 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 9bc2c4fbad20..9bc2c4fbad20 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 1989e55cd03d..1989e55cd03d 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 3c9942faf4b1..3c9942faf4b1 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 b993aa7b893c..b993aa7b893c 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 14715bf7d08f..14715bf7d08f 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 e9b6e1c10211..e9b6e1c10211 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 5aa84b2a8662..5aa84b2a8662 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 d295e475ddc6..d295e475ddc6 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 ad69ffe647bb..ad69ffe647bb 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 3219c72fcbce..3219c72fcbce 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 0c5361688c54..0c5361688c54 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 c7b460faf690..c7b460faf690 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 eed435e175d4..eed435e175d4 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 ddf6b068abe2..ddf6b068abe2 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 9c7c8f63af83..9c7c8f63af83 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 0e5943c2c61d..0e5943c2c61d 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 25846b6af89a..25846b6af89a 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 e38f3d3bfb5e..e38f3d3bfb5e 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 b8e4aa253071..b8e4aa253071 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 81c3021541bc..81c3021541bc 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 e8dc12bfbf65..e8dc12bfbf65 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 89d59b15480f..89d59b15480f 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 e2d2bb26114a..e2d2bb26114a 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 b60bea039d99..b60bea039d99 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 e20ce883702a..e20ce883702a 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 b182875fb2fb..b182875fb2fb 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 c5a3aa5aa468..c5a3aa5aa468 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 0b689b773c67..0b689b773c67 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 1765d83ce461..1765d83ce461 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 b49fc5345730..b49fc5345730 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 c47c09423e2d..c47c09423e2d 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 fe9226f8a123..fe9226f8a123 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 a88e66f81774..a88e66f81774 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 ff16e83e7ca4..ff16e83e7ca4 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 b9bb858a039d..b9bb858a039d 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 e48e33f6787f..e48e33f6787f 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 fba4e34175e6..fba4e34175e6 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 5fb02c13bc51..5fb02c13bc51 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 b672e1ca63d2..b672e1ca63d2 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 99f91e7f0e32..99f91e7f0e32 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 f41ba4d36aa1..f41ba4d36aa1 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 d0d96aaa91ee..d0d96aaa91ee 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 6756f8de676a..6756f8de676a 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 6a47584777a6..6a47584777a6 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 a71b38a83337..a71b38a83337 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 e0f00977c820..e0f00977c820 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 3cb4ee7a9ada..3cb4ee7a9ada 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 2142c2b9adfa..2142c2b9adfa 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 3590dc79a65a..3590dc79a65a 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 b21d5dc6f391..b21d5dc6f391 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 be8d1ea1bd2d..be8d1ea1bd2d 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 5424e6d5669a..5424e6d5669a 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 c3641db31d05..c3641db31d05 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 c87a1258e3bc..c87a1258e3bc 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 a3e978040de3..a3e978040de3 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 b7741e2b8367..b7741e2b8367 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 b69f8f048afa..b69f8f048afa 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 8ffe04f2034c..8ffe04f2034c 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 c66c0dd5c69a..c66c0dd5c69a 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 5d514f55b938..5d514f55b938 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 5bb2fe2f280d..5bb2fe2f280d 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 c8adaf595863..c8adaf595863 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 50ec9cadd618..50ec9cadd618 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 547ca065a59c..547ca065a59c 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 52fedc179e50..52fedc179e50 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 1c3cde251b53..1c3cde251b53 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 4717bd8313ee..4717bd8313ee 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 02c4db7ec582..02c4db7ec582 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 c7677c5951c3..c7677c5951c3 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 5b3e34e2c0c6..5b3e34e2c0c6 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 d13f8a812801..d13f8a812801 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 caec5537de3f..caec5537de3f 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 d3a6762130cd..d3a6762130cd 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 244d964fc67d..244d964fc67d 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 bfc287a147d2..bfc287a147d2 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 568f6f584e63..568f6f584e63 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 5f0352f9f70c..5f0352f9f70c 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 2ae454d80737..2ae454d80737 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 a7d52fbeeaf1..a7d52fbeeaf1 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 2afe91f1167b..2afe91f1167b 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 d0f308ab2bb7..d0f308ab2bb7 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 a18f1472a9a4..a18f1472a9a4 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 ae425c467220..ae425c467220 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 d5207cadf448..d5207cadf448 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 0fc1e8cd71fe..0fc1e8cd71fe 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 dffc09dde9e0..dffc09dde9e0 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 55aa98012dec..55aa98012dec 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 019d85f7de6c..019d85f7de6c 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 b42c334439b7..b42c334439b7 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 e8f46159da1e..e8f46159da1e 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 d36f88098b0e..d36f88098b0e 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 9d93f2c23a8f..9d93f2c23a8f 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 4c6708d2d0d8..4c6708d2d0d8 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 5e3243897294..5e3243897294 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 c1599f2f5200..c1599f2f5200 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 c1fc6c87317f..c1fc6c87317f 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 c981a038147f..c981a038147f 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 a6c55fd4822a..a6c55fd4822a 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 978d2b411880..978d2b411880 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 7a0073f5296b..7a0073f5296b 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 9ca62a01ed2b..9ca62a01ed2b 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 3fc896d424f9..3fc896d424f9 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 bf1326dc3662..bf1326dc3662 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 a8f6ce5abd64..a8f6ce5abd64 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 4bdad4072ebf..4bdad4072ebf 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 26fbfeb177be..26fbfeb177be 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 2ac856119190..2ac856119190 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 bb80f013b37d..bb80f013b37d 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 41b7baf0a534..41b7baf0a534 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 0cf3a3efea83..0cf3a3efea83 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 8d1f1e372199..8d1f1e372199 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 50d8aee4f7f3..50d8aee4f7f3 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 8ae44d6c8365..8ae44d6c8365 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 0175bfb28166..0175bfb28166 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 32fed3d5764b..32fed3d5764b 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 c2cfd4e72927..c2cfd4e72927 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 b36ce5886e0e..b36ce5886e0e 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 55e500f2edbe..55e500f2edbe 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 e7f17d5aa0fd..e7f17d5aa0fd 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 65d2a80208da..65d2a80208da 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 3dcbe473a0d2..3dcbe473a0d2 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 221b46a7cc2c..221b46a7cc2c 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 95a474ef1d54..95a474ef1d54 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 974e99be820e..974e99be820e 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 8c89136c4d84..8c89136c4d84 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 a71492f9bf4e..a71492f9bf4e 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 9be712458f44..9be712458f44 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 81aba8da96c0..81aba8da96c0 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 4ea2ee453d5e..4ea2ee453d5e 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 4c4066ae48e2..4c4066ae48e2 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 fb08ce0e46d1..fb08ce0e46d1 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 530a073b19d7..530a073b19d7 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 c8b6af2f4381..c8b6af2f4381 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 1ac431ba9212..1ac431ba9212 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 b30c28588f9a..b30c28588f9a 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 30aae7817b95..30aae7817b95 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 db90e5152547..db90e5152547 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 9a6cc92ce7de..9a6cc92ce7de 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 d1d32bd34c33..d1d32bd34c33 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 ebf1f0661e07..ebf1f0661e07 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 a405cb613885..a405cb613885 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 f39da8482284..f39da8482284 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 0499321d0ebf..0499321d0ebf 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 f18d43209c0a..f18d43209c0a 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 cd3bcc2c7269..cd3bcc2c7269 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 ca7debf1d4c0..ca7debf1d4c0 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 6b087df3dcbd..6b087df3dcbd 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 9c48e5c2c99a..9c48e5c2c99a 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 95a7ca707045..95a7ca707045 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 9261d6d3a000..9261d6d3a000 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 283e01cca1ac..283e01cca1ac 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 9ee6bbef5573..9ee6bbef5573 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 ec4f115c250f..ec4f115c250f 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 49a69f37e161..49a69f37e161 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 11b61da3b75a..11b61da3b75a 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 3b98cd09ab5d..3b98cd09ab5d 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 548766509651..548766509651 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 1084d5990efa..1084d5990efa 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 d9750aa61a50..d9750aa61a50 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 ef15657ea8fe..ef15657ea8fe 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 01b051df7015..01b051df7015 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 08c7c7565ae2..08c7c7565ae2 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 6749980241cc..6749980241cc 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 1acd82715921..1acd82715921 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 4d4a9dbb9db5..4d4a9dbb9db5 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 3800b9967a5c..3800b9967a5c 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 b9c10aba225d..b9c10aba225d 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 521c59fd1513..521c59fd1513 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 a0de5fb800fe..a0de5fb800fe 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 0cdf5ba5bd43..0cdf5ba5bd43 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 7ec94df69734..7ec94df69734 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 153081e872c5..153081e872c5 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 7831577506a9..7831577506a9 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 5a30553d2918..5a30553d2918 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 c6d71fb42de6..c6d71fb42de6 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 84ed754b33b6..84ed754b33b6 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 7ccd25d9ed62..7ccd25d9ed62 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 a9e3c86b3c96..a9e3c86b3c96 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 6a0bdee336b0..6a0bdee336b0 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 32b5606c70f7..32b5606c70f7 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 e8fd59f884d9..e8fd59f884d9 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 f88ac318b796..f88ac318b796 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 5f3769c64fc3..5f3769c64fc3 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 6b3257d68038..6b3257d68038 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 e057dcefed6a..e057dcefed6a 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 8e9c9ac7c3fd..8e9c9ac7c3fd 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 553bedec9628..553bedec9628 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 ac3a77b5c41f..ac3a77b5c41f 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 5deda77feec7..5deda77feec7 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 298bc7a71b29..298bc7a71b29 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 84daedfb4e5e..84daedfb4e5e 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 897a9b13ff41..897a9b13ff41 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 3bb6c4670e26..3bb6c4670e26 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 ab2980f7f29f..ab2980f7f29f 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 5ea59a5de009..5ea59a5de009 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 c22d39b25670..c22d39b25670 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 a98cb8bdad0b..a98cb8bdad0b 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 e39f02462e27..e39f02462e27 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 a507d1f64525..a507d1f64525 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 330b3df1142a..330b3df1142a 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 5213e1249465..5213e1249465 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 7785b6303c7c..7785b6303c7c 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 69f571055291..69f571055291 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 35717c51c3b9..35717c51c3b9 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 86b49ad5d9e3..86b49ad5d9e3 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 03af1a6d9d7e..03af1a6d9d7e 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 65b8c82a6163..65b8c82a6163 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 cbe02155f113..cbe02155f113 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 09df3cd93b21..09df3cd93b21 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 76aff1c0d8ef..76aff1c0d8ef 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 ea397f09ed16..ea397f09ed16 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 c6135c75488f..c6135c75488f 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 e009826fcbe5..e009826fcbe5 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 db2f89090c1c..db2f89090c1c 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 9be65fd4440a..9be65fd4440a 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 6d1c3d949c78..6d1c3d949c78 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 8c9823765e66..8c9823765e66 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 6b44ce14933f..6b44ce14933f 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 35578f2bb91d..35578f2bb91d 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 671e951ee549..671e951ee549 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 9aa8e2b39b45..9aa8e2b39b45 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 204ba673cb58..204ba673cb58 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 32b6e9a4e762..32b6e9a4e762 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 4cb9f0e523d2..4cb9f0e523d2 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 eacc6694f785..eacc6694f785 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 bada0cbd32f7..bada0cbd32f7 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 113304dc5960..113304dc5960 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 912df91226f2..912df91226f2 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 a682d288b28b..a682d288b28b 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 df21bb044f27..df21bb044f27 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 d96fdd1e8e0f..d96fdd1e8e0f 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 a157774f9dc5..a157774f9dc5 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 ddcba9b2fc87..ddcba9b2fc87 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 95cd55bd7b9d..95cd55bd7b9d 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 37d1ea258702..37d1ea258702 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 7e8c026cefb0..7e8c026cefb0 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 23d5c8adf545..23d5c8adf545 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 e5d1dd2b3db9..e5d1dd2b3db9 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 dd5f4218a63a..dd5f4218a63a 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 9106d63e8794..9106d63e8794 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 ed10393bda2e..ed10393bda2e 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 fe500b7a4fbb..fe500b7a4fbb 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 b8ae0bb48f81..b8ae0bb48f81 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 b233dbd62167..b233dbd62167 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 d308da2ad2e2..d308da2ad2e2 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 87f0d0b031c1..87f0d0b031c1 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 447b49ab6d7b..447b49ab6d7b 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 46921e586c6f..46921e586c6f 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 8ca4aeae83fc..8ca4aeae83fc 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 37d1ea258702..37d1ea258702 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 7e8c026cefb0..7e8c026cefb0 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 23d5c8adf545..23d5c8adf545 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 72cf3e93a2aa..72cf3e93a2aa 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 70e05f075345..70e05f075345 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 dc204db486a7..dc204db486a7 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 e5d1dd2b3db9..e5d1dd2b3db9 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 dd5f4218a63a..dd5f4218a63a 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 9106d63e8794..9106d63e8794 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 2ce42309540c..2ce42309540c 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 8865e6bdddcb..8865e6bdddcb 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 077046c8322a..077046c8322a 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 a1deb6b6ade8..a1deb6b6ade8 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 e8b72ef5dcd5..e8b72ef5dcd5 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 f6610d37b8aa..f6610d37b8aa 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 040440860a70..040440860a70 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 4420a4919206..4420a4919206 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 cf6e06bc222a..cf6e06bc222a 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 8abb8a48b483..8abb8a48b483 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 68baf34f0ea1..68baf34f0ea1 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 438f77687548..438f77687548 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 16e1dd5674d0..16e1dd5674d0 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 7678f14e148e..7678f14e148e 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 30ed9a15952d..30ed9a15952d 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 604969bcde9b..604969bcde9b 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 65cab61a10bb..65cab61a10bb 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 2b2dfcb65c57..2b2dfcb65c57 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 0352bf81a90a..0352bf81a90a 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 98d9713d8b24..98d9713d8b24 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 f5ce3b29a2ac..f5ce3b29a2ac 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 d4afe125548b..d4afe125548b 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 53ac44b0f003..53ac44b0f003 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 3c728a3ebf9c..3c728a3ebf9c 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 619bf970983e..619bf970983e 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 bf33aedf4b22..bf33aedf4b22 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 2a2cf9135203..2a2cf9135203 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 647905e01fb9..647905e01fb9 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 36f8ed8a8187..36f8ed8a8187 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 ff7cfd884a44..ff7cfd884a44 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 7fec2cb9cd78..7fec2cb9cd78 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 87a8949500bb..87a8949500bb 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 a34121740a4a..a34121740a4a 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 fd3e86a74f3d..fd3e86a74f3d 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 4838a1df8b43..4838a1df8b43 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 a9f56f11db3e..a9f56f11db3e 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 e651f7147b97..e651f7147b97 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 a43016e870ff..a43016e870ff 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 73e767e1783d..73e767e1783d 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 efc68f8bf6de..efc68f8bf6de 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 28c053849aaf..28c053849aaf 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 0168946b6394..0168946b6394 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 fcae82fffa7f..fcae82fffa7f 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 741e0803c1ac..741e0803c1ac 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 43dd474a12e9..43dd474a12e9 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 dff36b77ec88..dff36b77ec88 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 c24ee175ef0e..c24ee175ef0e 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 49bca7b48d91..49bca7b48d91 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 9dcb69df5c36..9dcb69df5c36 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 2affd7a10099..2affd7a10099 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 1130c8019b4c..1130c8019b4c 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 bc69e26c524b..bc69e26c524b 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 3bdf317af8d9..3bdf317af8d9 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 b3f510f040ec..b3f510f040ec 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 5df6b5e64e0e..5df6b5e64e0e 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 90c8fb290175..90c8fb290175 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 744b8e51beab..744b8e51beab 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 540e64db8557..540e64db8557 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 90ab54f0f586..90ab54f0f586 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 d1e6459749fe..d1e6459749fe 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 f5c7d601fc95..f5c7d601fc95 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 912a552a7a67..912a552a7a67 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 90cdbaa5bb62..90cdbaa5bb62 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 1ec028b3d05d..1ec028b3d05d 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 4a56ab5cf416..4a56ab5cf416 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 b387df15d4fc..b387df15d4fc 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 5f6ddc105950..5f6ddc105950 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 1c343d459eb8..1c343d459eb8 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 a72729a71203..a72729a71203 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 1283164d9909..1283164d9909 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 07c6589e74fa..07c6589e74fa 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 55a55c3cc779..55a55c3cc779 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 5ca13e659490..5ca13e659490 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 55a55c3cc779..55a55c3cc779 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 875d57d567e2..875d57d567e2 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 e3443d004d02..e3443d004d02 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 1010a88f4727..1010a88f4727 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 36460a243ac1..36460a243ac1 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 b281c43e5b5f..b281c43e5b5f 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 f0a2e9277087..f0a2e9277087 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 2a440a5ce2ad..2a440a5ce2ad 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 61aff975b69f..61aff975b69f 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 c2e71ee344d0..c2e71ee344d0 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 a66d9fd3a137..a66d9fd3a137 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 5633c831de0b..5633c831de0b 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 10b1a41edf73..10b1a41edf73 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 c799c60fb9d4..c799c60fb9d4 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 f8d1ba6dc246..f8d1ba6dc246 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 fae305979a88..fae305979a88 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 1b420e3b5fc2..1b420e3b5fc2 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 32e3b0ee0b9d..32e3b0ee0b9d 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 3266e3940039..3266e3940039 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 72467a1e8ee2..72467a1e8ee2 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 ac72eeaf27a9..ac72eeaf27a9 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 fa5d4efb89dc..fa5d4efb89dc 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 ac58083fe224..ac58083fe224 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 1db5ff105014..1db5ff105014 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 bc52924112ba..bc52924112ba 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 cd2a475feb22..cd2a475feb22 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 1d411fc3cceb..1d411fc3cceb 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 8c6b06d536a0..8c6b06d536a0 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 d696c55a752a..d696c55a752a 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 4b085909b160..4b085909b160 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 09f58112e022..09f58112e022 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 87cc493ec8a0..87cc493ec8a0 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 56139080dc15..56139080dc15 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 04974247ec92..04974247ec92 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 26bd4427f808..26bd4427f808 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 9ffb9c2d7ecd..9ffb9c2d7ecd 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 c5ac6914f987..c5ac6914f987 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 1618a6dbc7c7..1618a6dbc7c7 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 f9ad183758c2..f9ad183758c2 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 66fa51591eb7..66fa51591eb7 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 ebadbc347fc4..ebadbc347fc4 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 872fcda6cb6d..872fcda6cb6d 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 b99e65c08639..b99e65c08639 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 f7de6f077a6e..f7de6f077a6e 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 65f2e4c3efb9..65f2e4c3efb9 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 a9a05838119c..a9a05838119c 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 497b62868d4a..497b62868d4a 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 66368effd5c0..66368effd5c0 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 4acb3f336ed3..4acb3f336ed3 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 984157f03b97..984157f03b97 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 ff51e9e78914..ff51e9e78914 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 9671de799949..9671de799949 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 ceb6a79fe0c8..ceb6a79fe0c8 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 972946c174c1..972946c174c1 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 6cc741a634b0..6cc741a634b0 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 5cdd76dfa726..5cdd76dfa726 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 f8a313bcb98c..f8a313bcb98c 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 b1361ce54693..b1361ce54693 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 fec1d6fa51fa..fec1d6fa51fa 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 c5ed3b17c4a1..c5ed3b17c4a1 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 0043930ca6ab..0043930ca6ab 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 6bc3fb97a754..6bc3fb97a754 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 3e58e65f57e5..3e58e65f57e5 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 cf5970a089fa..cf5970a089fa 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 c6861e19665b..c6861e19665b 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 866de78ca170..866de78ca170 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 a9a1212a218a..a9a1212a218a 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 bb67cb79309b..bb67cb79309b 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 07aaf0837093..07aaf0837093 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 68f7ededf91e..68f7ededf91e 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 acedcfa612e3..acedcfa612e3 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 9068a61bd982..9068a61bd982 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 c8e8cc1a8d64..c8e8cc1a8d64 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 3512056f2194..3512056f2194 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 4e6d9b294154..4e6d9b294154 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 998e3a867e46..998e3a867e46 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 db47d1a693c5..db47d1a693c5 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 0e84a10e936d..0e84a10e936d 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 bdbea8af35d3..bdbea8af35d3 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 baaa810de03e..baaa810de03e 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 cca3c9287b21..cca3c9287b21 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 f5f45ddd099e..f5f45ddd099e 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 4c3f264a633b..4c3f264a633b 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 a9bd40a6d043..a9bd40a6d043 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 3b636a63a3ef..3b636a63a3ef 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 45b5660a47d8..45b5660a47d8 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 3f7f750cc8d7..3f7f750cc8d7 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 9d8d3c72e7ef..9d8d3c72e7ef 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 4c68245acad3..4c68245acad3 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 8ea22d1bcbb8..8ea22d1bcbb8 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 55b7750ade1c..55b7750ade1c 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 d3a7ce6bbb2c..d3a7ce6bbb2c 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 c20209324c8e..c20209324c8e 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 918ada69eb96..918ada69eb96 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 0288c17ec60b..0288c17ec60b 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 f42a69faa2fd..f42a69faa2fd 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 ad29e65fcba6..ad29e65fcba6 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 60f040cab8ad..60f040cab8ad 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 4c8f3b8e1bdd..4c8f3b8e1bdd 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 5d06f5f45eac..5d06f5f45eac 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 7c519436ef3d..7c519436ef3d 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 1db7bd0f59b4..1db7bd0f59b4 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 91b405489892..91b405489892 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 bd25bb2f591f..bd25bb2f591f 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 c905e01bc25c..c905e01bc25c 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 76ad5b598cb8..76ad5b598cb8 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 d930b6eec4c4..d930b6eec4c4 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 d930b6eec4c4..d930b6eec4c4 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 052def8074da..052def8074da 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 a1f5bc49c879..a1f5bc49c879 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 a475768710b5..a475768710b5 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 39ce39bebed7..39ce39bebed7 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 8480bd9cc45b..8480bd9cc45b 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 6109aa0dcee7..6109aa0dcee7 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 1f7cd0694149..1f7cd0694149 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 f9f41e211e88..f9f41e211e88 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 03b952c90d2f..03b952c90d2f 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 7f90f58c03e6..7f90f58c03e6 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 dab96c89aa8a..dab96c89aa8a 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 e758e634a347..e758e634a347 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 b0c09dc96583..b0c09dc96583 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 1b874ae115d1..1b874ae115d1 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 feda94a0cccb..feda94a0cccb 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 2ac66009763f..2ac66009763f 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 608e5abba4c3..608e5abba4c3 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 0081b96f2a92..0081b96f2a92 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 e48cd6cbde98..e48cd6cbde98 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 0e69bfa55b8a..0e69bfa55b8a 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 da7bf29cbe30..da7bf29cbe30 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 373025bcf614..373025bcf614 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 a8859e9b8f6c..a8859e9b8f6c 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 06e567b11dfd..06e567b11dfd 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 06e567b11dfd..06e567b11dfd 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 6e1b73ec3afc..6e1b73ec3afc 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 fd3bdbfe2c0a..fd3bdbfe2c0a 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 0ba8194403f6..0ba8194403f6 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 6340310e9afb..6340310e9afb 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 b395adbdf2a4..b395adbdf2a4 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 3281a37d5183..3281a37d5183 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 bd0d8b025145..bd0d8b025145 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 5344bd248a18..5344bd248a18 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 d87cc7d9efde..d87cc7d9efde 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 37655a237cb7..37655a237cb7 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 63155e185585..63155e185585 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 5cbe9ec312bf..5cbe9ec312bf 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 d91173714991..d91173714991 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 e9aa97117ab4..e9aa97117ab4 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 bda6d7d7e9e8..bda6d7d7e9e8 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 106eddbd85b0..106eddbd85b0 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 065728c631cf..065728c631cf 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 271eb5a1fdfb..271eb5a1fdfb 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 caaf614eeece..caaf614eeece 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 da9e39e6cf49..da9e39e6cf49 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 1a76bb600558..1a76bb600558 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 9690dcad4fd5..9690dcad4fd5 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 c93f5142fa7d..c93f5142fa7d 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 494ec554b97a..494ec554b97a 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 71343d41f2ea..71343d41f2ea 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 72281779843f..72281779843f 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 c53a192dfeac..c53a192dfeac 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 06a3a3859a8a..06a3a3859a8a 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 5f3f84e508ff..5f3f84e508ff 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 e69de29bb2d1..e69de29bb2d1 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 c31d2eb5504b..c31d2eb5504b 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 4f082093fc81..4f082093fc81 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 f951538acc01..f951538acc01 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 49bb0fec8532..49bb0fec8532 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 bd0d1221aa34..bd0d1221aa34 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 616c3092a282..616c3092a282 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 46a46fc77283..46a46fc77283 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 8c052777e0d2..8c052777e0d2 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 49bb0fec8532..49bb0fec8532 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 e8a295138317..e8a295138317 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 2a66321c8032..2a66321c8032 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 1791241e46dc..1791241e46dc 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 da5a605a12e5..da5a605a12e5 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 ac1216ff7570..ac1216ff7570 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 ac1216ff7570..ac1216ff7570 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 bbe049e20eb0..bbe049e20eb0 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 08566b34b978..08566b34b978 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 ab9c8d090594..ab9c8d090594 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 0114f106c5f6..0114f106c5f6 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 c4d8d7720ee3..c4d8d7720ee3 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 38ccd0dcf2c9..38ccd0dcf2c9 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 f4857d45df30..f4857d45df30 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 d2bc89ffe9ee..d2bc89ffe9ee 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 d53e7491c70c..d53e7491c70c 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 30b17bd91349..30b17bd91349 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 b275a9a9b21c..b275a9a9b21c 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 e2546ec7332b..e2546ec7332b 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 1ac68101b135..1ac68101b135 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 6f8ba3b8e0e5..6f8ba3b8e0e5 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 dd94cd7b9f52..dd94cd7b9f52 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 b275a9a9b21c..b275a9a9b21c 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 71b23c0236bd..71b23c0236bd 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 a80ecb97ef9d..a80ecb97ef9d 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 9ffe1314891f..9ffe1314891f 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 a96c23009234..a96c23009234 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 4667f210074b..4667f210074b 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 1dc2bf7f7fa1..1dc2bf7f7fa1 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 376e26e9aeba..376e26e9aeba 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 e69de29bb2d1..e69de29bb2d1 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 62e5cd2ecd1e..62e5cd2ecd1e 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 259c6a46d26a..259c6a46d26a 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 e69de29bb2d1..e69de29bb2d1 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 be5115b1c159..be5115b1c159 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 0d9adada9643..0d9adada9643 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 1063f5117883..1063f5117883 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 2ee090085092..2ee090085092 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 56de83d7fcca..56de83d7fcca 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 b1e05d3862bf..b1e05d3862bf 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 d7d680f631b1..d7d680f631b1 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 16540d961f8e..16540d961f8e 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 3d40691787b8..3d40691787b8 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 02c97746d64f..02c97746d64f 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 02c97746d64f..02c97746d64f 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 02c97746d64f..02c97746d64f 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 196458e44e19..196458e44e19 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 ab7a38373bd8..ab7a38373bd8 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 02c97746d64f..02c97746d64f 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 e69de29bb2d1..e69de29bb2d1 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 e69de29bb2d1..e69de29bb2d1 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 65615c34af6e..65615c34af6e 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 436821c97aa5..436821c97aa5 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 0988713761d4..0988713761d4 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 36a0b681610d..36a0b681610d 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 36a0b681610d..36a0b681610d 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 000000000000..e69de29bb2d1
--- /dev/null
+++ b/third_party/git/t/t5100/patch0013
diff --git a/t/t5100/patch0014 b/third_party/git/t/t5100/patch0014
index 3f3825f9f297..3f3825f9f297 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 3f3825f9f297..3f3825f9f297 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 ad64848873fc..ad64848873fc 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 ad64848873fc..ad64848873fc 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 ad64848873fc..ad64848873fc 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 ad64848873fc..ad64848873fc 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 35cf84c9a102..35cf84c9a102 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 789df6d030ea..789df6d030ea 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 789df6d030ea..789df6d030ea 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 8c9d48c85285..8c9d48c85285 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 847e1c4d3eac..847e1c4d3eac 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 cab1bcebf99d..cab1bcebf99d 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 e2e627ae23cc..e2e627ae23cc 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 0a383b07e323..0a383b07e323 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 881be75d6fa5..881be75d6fa5 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 d0f789177c21..d0f789177c21 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 f67a90a9749f..f67a90a9749f 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 c27be3bf2485..c27be3bf2485 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 9dad474456fd..9dad474456fd 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 294f195a57bd..294f195a57bd 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 294f195a57bd..294f195a57bd 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 294f195a57bd..294f195a57bd 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 9dad474456fd..9dad474456fd 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 9dad474456fd..9dad474456fd 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 1fc224810da6..1fc224810da6 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 6d4d0e44742e..6d4d0e44742e 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 79ad5ae0e7af..79ad5ae0e7af 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 852dcd913f1e..852dcd913f1e 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 21a58eecb9b5..21a58eecb9b5 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 410a09b0dd75..410a09b0dd75 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 76f9798ab958..76f9798ab958 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 91d51b35f917..91d51b35f917 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 41e6dc4dcfc5..41e6dc4dcfc5 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 df60f18fb8ca..df60f18fb8ca 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 a5eca210b896..a5eca210b896 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 f4931c0c2a40..f4931c0c2a40 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 dacb440b2750..dacb440b2750 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 6845c1f3c3a3..6845c1f3c3a3 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 491556dad979..491556dad979 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 6640329ebf60..6640329ebf60 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 872a95df3383..872a95df3383 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 da9d59940d5a..da9d59940d5a 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 f1708d415e55..f1708d415e55 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 e525466de098..e525466de098 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 df970d75845e..df970d75845e 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 0f06c40eb13f..0f06c40eb13f 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 2d2f5d0229ce..2d2f5d0229ce 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 22cb9d664304..22cb9d664304 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 c72ca0439993..c72ca0439993 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 fea92a5777fd..fea92a5777fd 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 a75eab87d361..a75eab87d361 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 7124b5581a0e..7124b5581a0e 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 6b4d1ca3536a..6b4d1ca3536a 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 99f4ef4c19df..99f4ef4c19df 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 571d620aedba..571d620aedba 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 956d69f5b177..956d69f5b177 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 6eb2ffd6ecab..6eb2ffd6ecab 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 a39b3b5c78bc..a39b3b5c78bc 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 2762f420bc2c..2762f420bc2c 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 235fb7686ae0..235fb7686ae0 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 ff06f99649e4..ff06f99649e4 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 7344253bfbbc..7344253bfbbc 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 e8737df6f95c..e8737df6f95c 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 2a8c44966185..2a8c44966185 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 f00d0da8606d..f00d0da8606d 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 1c71c0ec770c..1c71c0ec770c 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 1bc57ac03f9d..1bc57ac03f9d 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 7a46cbdbe687..7a46cbdbe687 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 6041a4dd3278..6041a4dd3278 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 fdfe179b1188..fdfe179b1188 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 883b32efa024..883b32efa024 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 83d5558c0ef0..83d5558c0ef0 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 e6149295b187..e6149295b187 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 75cbfcc392c8..75cbfcc392c8 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 139f7106f781..139f7106f781 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 f541f30bc2f8..f541f30bc2f8 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 43e1d8d4d2a4..43e1d8d4d2a4 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 65d1e05bd62a..65d1e05bd62a 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 5426d4b5abb4..5426d4b5abb4 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 e55d8474efb6..e55d8474efb6 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 a1bc3d53a606..a1bc3d53a606 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 12ab08e8acb1..12ab08e8acb1 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 54427522dd5f..54427522dd5f 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 498a761aae8f..498a761aae8f 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 0857f134e10d..0857f134e10d 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 8cbd71893622..8cbd71893622 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 c98f67052638..c98f67052638 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 54a77420d5d0..54a77420d5d0 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 b4d1bb0b0ba1..b4d1bb0b0ba1 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 97c4b544b8c2..97c4b544b8c2 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 df705f74c7d6..df705f74c7d6 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 96890e5bd992..96890e5bd992 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 68fc927263ed..68fc927263ed 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 5ce764a06e42..5ce764a06e42 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 b1152b76dc2e..b1152b76dc2e 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 110577bb6792..110577bb6792 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 a29dd8baba04..a29dd8baba04 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 b19b0162e1f2..b19b0162e1f2 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 946d70ca0718..946d70ca0718 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 89f2596cb9d7..89f2596cb9d7 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 2ba4832160a3..2ba4832160a3 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 64994df7e256..64994df7e256 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 681a725adc98..681a725adc98 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 19daf0cb77e3..19daf0cb77e3 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 ab44bc551969..ab44bc551969 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 d018b3515f74..d018b3515f74 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 0d3d780dd0cc..0d3d780dd0cc 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 6f843044ede1..6f843044ede1 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 3546a837136d..3546a837136d 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 01e014e6a021..01e014e6a021 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 09bfcee00f9c..09bfcee00f9c 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 7e1a433a64f3..7e1a433a64f3 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 53571bb4ec64..53571bb4ec64 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 c7c8b6d7f47d..c7c8b6d7f47d 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 36076fba0cc7..36076fba0cc7 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 20ba5cb1725d..20ba5cb1725d 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 887ccfc41f57..887ccfc41f57 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 0f70f66c705d..0f70f66c705d 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 284bb1fb613c..284bb1fb613c 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 11eb5a6ef22d..11eb5a6ef22d 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 74115361ba00..74115361ba00 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 3f1be224b8b4..3f1be224b8b4 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 7726983818f8..7726983818f8 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 7b3750ce5c01..7b3750ce5c01 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 da30e3c62c26..da30e3c62c26 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 e4614314c54e..e4614314c54e 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 ed323c98713c..ed323c98713c 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 2372ed03c5c5..2372ed03c5c5 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 6318dd11b4c2..6318dd11b4c2 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 1d9afad7d841..1d9afad7d841 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 9b29d6720002..9b29d6720002 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 ab473a6e1f76..ab473a6e1f76 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 66d1aaddae6c..66d1aaddae6c 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 35deddbd2ca6..35deddbd2ca6 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 0672d1292f5f..0672d1292f5f 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 35ec5782c8a6..35ec5782c8a6 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 0fd737cf81fd..0fd737cf81fd 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 e48898665371..e48898665371 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 2eedd3bfa4a5..2eedd3bfa4a5 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 901ce21d333c..901ce21d333c 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 251c826aa9de..251c826aa9de 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 27c158e332f2..27c158e332f2 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 b3cfe6b98b24..b3cfe6b98b24 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 118befd1e483..118befd1e483 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 21917c1e5dba..21917c1e5dba 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 21917c1e5dba..21917c1e5dba 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 21917c1e5dba..21917c1e5dba 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 21917c1e5dba..21917c1e5dba 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 21917c1e5dba..21917c1e5dba 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 21917c1e5dba..21917c1e5dba 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 8a705a5df252..8a705a5df252 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 8a705a5df252..8a705a5df252 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 8a705a5df252..8a705a5df252 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 8a705a5df252..8a705a5df252 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 8a705a5df252..8a705a5df252 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 8a705a5df252..8a705a5df252 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 13e4ad2e4602..13e4ad2e4602 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 13e4ad2e4602..13e4ad2e4602 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 70962eaac152..70962eaac152 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 70962eaac152..70962eaac152 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 13e4ad2e4602..13e4ad2e4602 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 70962eaac152..70962eaac152 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 13e4ad2e4602..13e4ad2e4602 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 13e4ad2e4602..13e4ad2e4602 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 21917c1e5dba..21917c1e5dba 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 8a705a5df252..8a705a5df252 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 13e4ad2e4602..13e4ad2e4602 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 13e4ad2e4602..13e4ad2e4602 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 70962eaac152..70962eaac152 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 70962eaac152..70962eaac152 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 13e4ad2e4602..13e4ad2e4602 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 70962eaac152..70962eaac152 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 13e4ad2e4602..13e4ad2e4602 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 13e4ad2e4602..13e4ad2e4602 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 21917c1e5dba..21917c1e5dba 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 8a705a5df252..8a705a5df252 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 9bbbfd9fc533..9bbbfd9fc533 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 c81ca360ac4a..c81ca360ac4a 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 c05a661400c1..c05a661400c1 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 c2060bb870f3..c2060bb870f3 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 11fcd37700f3..11fcd37700f3 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 cf4cc32fd0eb..cf4cc32fd0eb 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 ccde8ba491e8..ccde8ba491e8 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 bcff460d0a2b..bcff460d0a2b 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 c0df81a014c3..c0df81a014c3 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 c278adaa5a25..c278adaa5a25 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 45815f737850..45815f737850 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 63205dfdf962..63205dfdf962 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 3b0cb9842293..3b0cb9842293 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 44309566f134..44309566f134 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 9871307fd48e..9871307fd48e 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 a1d3031d40dc..a1d3031d40dc 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 4ad059e6bedf..4ad059e6bedf 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 9c2798603b4d..9c2798603b4d 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 0b0eb1d0259f..0b0eb1d0259f 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 030331f1c51f..030331f1c51f 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 8ed58d27f243..8ed58d27f243 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 91f28c2f783d..91f28c2f783d 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 66f0b64d3927..66f0b64d3927 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 ecbf84d21c80..ecbf84d21c80 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 b4ad81f00635..b4ad81f00635 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 a094fd5e7133..a094fd5e7133 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 b86ddb60f2ea..b86ddb60f2ea 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 ddc1db722d43..ddc1db722d43 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 7079bcf9a056..7079bcf9a056 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 4357af152566..4357af152566 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 6d1d59c9b1af..6d1d59c9b1af 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 0b0e987fdb73..0b0e987fdb73 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 faaa51ccc562..faaa51ccc562 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 b811d89cfd6d..b811d89cfd6d 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 e38e54386795..e38e54386795 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 8a14be51a132..8a14be51a132 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 9fafcf194589..9fafcf194589 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 6eb0294978a0..6eb0294978a0 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 f0f425b2cf57..f0f425b2cf57 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 0943474af20d..0943474af20d 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 359fcfe32b66..359fcfe32b66 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 34487bbb8ce3..34487bbb8ce3 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 ac53d638695b..ac53d638695b 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 f916729a12b2..f916729a12b2 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 3e9876e19713..3e9876e19713 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 b3c8a92450bc..b3c8a92450bc 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 5129b0724f70..5129b0724f70 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 4a1a912e0329..4a1a912e0329 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 37d76808d4a7..37d76808d4a7 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 cbcceab9d56b..cbcceab9d56b 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 13b5e5eb9b9f..13b5e5eb9b9f 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 4894237ab805..4894237ab805 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 af23419ebfc1..af23419ebfc1 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 9e24ec88e67f..9e24ec88e67f 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 2a0fb15cf175..2a0fb15cf175 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 2c6bc07344cc..2c6bc07344cc 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 6e7a7be05227..6e7a7be05227 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 8b0d607df115..8b0d607df115 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 60c1ba951b7d..60c1ba951b7d 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 e36ac01661d1..e36ac01661d1 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 895f46bb9118..895f46bb9118 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 e4e6ea4d527f..e4e6ea4d527f 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 b4905b822c07..b4905b822c07 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 b91ef548f86b..b91ef548f86b 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 37fcce9c40c9..37fcce9c40c9 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 3353216f09e5..3353216f09e5 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 7c9511c593c1..7c9511c593c1 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 ffb961388590..ffb961388590 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 011b81d4fc27..011b81d4fc27 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 de4b6106ef4a..de4b6106ef4a 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 2d6c4a281edb..2d6c4a281edb 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 6b9f0b5dc79c..6b9f0b5dc79c 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 c6c2661878c0..c6c2661878c0 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 c1ef99b85c29..c1ef99b85c29 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 8ac6b2a1d0a2..8ac6b2a1d0a2 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 af8772fadaa0..af8772fadaa0 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 3f084ee30651..3f084ee30651 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 9d6f7dfa2cc3..9d6f7dfa2cc3 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 06f55a1b8a0b..06f55a1b8a0b 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 14e59c5b3e42..14e59c5b3e42 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 52a9e38d66f3..52a9e38d66f3 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 7504ba47511b..7504ba47511b 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 a66140803883..a66140803883 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 24d1836f417d..24d1836f417d 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 3e8c42ee0b93..3e8c42ee0b93 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 0b64822bf621..0b64822bf621 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 da113d975b16..da113d975b16 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 f0268372d25e..f0268372d25e 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 c4af9ca0a7ed..c4af9ca0a7ed 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 916d9692bc05..916d9692bc05 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 44c726ea397c..44c726ea397c 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 545b461e51d4..545b461e51d4 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 a10f0df02b0e..a10f0df02b0e 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 89458d370f5f..89458d370f5f 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 c9bedd29cba4..c9bedd29cba4 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 f7181d1d6a14..f7181d1d6a14 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 667b37564e3d..667b37564e3d 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 bb5aeac07f83..bb5aeac07f83 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 beadaf6cca05..beadaf6cca05 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 46b506b3b7b6..46b506b3b7b6 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 213deecab1e8..213deecab1e8 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 53cc9b2ffbdb..53cc9b2ffbdb 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 51ee887a7763..51ee887a7763 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 27c7de90ce64..27c7de90ce64 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 433c4de08f0c..433c4de08f0c 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 8f9b48a4937b..8f9b48a4937b 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 4e6c7cb77e7d..4e6c7cb77e7d 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 7763c1ba9808..7763c1ba9808 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 793f0c8bf38a..793f0c8bf38a 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 bdc42e9440cb..bdc42e9440cb 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 87741efad319..87741efad319 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 80777386dc69..80777386dc69 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 e8d65eefb521..e8d65eefb521 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 89871aa5b044..89871aa5b044 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 9324ea441621..9324ea441621 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 d23b948f27f1..d23b948f27f1 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 0aebc6c028e0..0aebc6c028e0 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 5e8d5fa50c9a..5e8d5fa50c9a 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 531850d834df..531850d834df 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 ad1922b999b1..ad1922b999b1 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 62b8a2e7bbd1..62b8a2e7bbd1 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 c5b57f40c3d1..c5b57f40c3d1 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 c966147d5d73..c966147d5d73 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 5e3779ebc931..5e3779ebc931 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 5d33577d2f79..5d33577d2f79 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 3a47623ed316..3a47623ed316 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 e7e64e085ddc..e7e64e085ddc 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 ddf34f0115b0..ddf34f0115b0 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 b2bb0a7f6181..b2bb0a7f6181 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 7683e4a1142a..7683e4a1142a 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 28611c978e6c..28611c978e6c 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 656ac7fe9dc1..656ac7fe9dc1 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 4244638285bb..4244638285bb 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 acd7f5ab80d9..acd7f5ab80d9 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 2b883d817403..2b883d817403 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 37760233a560..37760233a560 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 39fc3f6769be..39fc3f6769be 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 2462b19ddd35..2462b19ddd35 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 a290ffca0d68..a290ffca0d68 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 c67066840981..c67066840981 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 457cc167c774..457cc167c774 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 8a72b4c43a4f..8a72b4c43a4f 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 ab69aa176d14..ab69aa176d14 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 49cc65bb58dd..49cc65bb58dd 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 35408d53fd8a..35408d53fd8a 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 c0f04dc6b0e1..c0f04dc6b0e1 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 033871ee5f35..033871ee5f35 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 b24d85003606..b24d85003606 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 36b50d0b4c12..36b50d0b4c12 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 e23de7d0b5a4..e23de7d0b5a4 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 80eb13d94e2a..80eb13d94e2a 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 5fcf281dfbf8..5fcf281dfbf8 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 00e09a375c2e..00e09a375c2e 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 42d3db624686..42d3db624686 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 2d87c49b7539..2d87c49b7539 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 9ba9f24ad2fb..9ba9f24ad2fb 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 0335a9a158ab..0335a9a158ab 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 37525cae3af3..37525cae3af3 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 9d1abe50eff6..9d1abe50eff6 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 041e319e79aa..041e319e79aa 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 d5218743e963..d5218743e963 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 0c394cf995cb..0c394cf995cb 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 73709dbeee28..73709dbeee28 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 190ae149cf3c..190ae149cf3c 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 537787e598b4..537787e598b4 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 96e163f084f4..96e163f084f4 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 97be0d968dbc..97be0d968dbc 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 afe36a533c4b..afe36a533c4b 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 16faa0781373..16faa0781373 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 bd10a96727c5..bd10a96727c5 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 ecb85c3b8232..ecb85c3b8232 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 a82a07a04a85..a82a07a04a85 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 ce421ad5ac4b..ce421ad5ac4b 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 a1cb9ff858e4..a1cb9ff858e4 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 f011ad7eece8..f011ad7eece8 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 b696bae5f534..b696bae5f534 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 a2c45d1902ac..a2c45d1902ac 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 a07e8b86de20..a07e8b86de20 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 a208cb26e1df..a208cb26e1df 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 9bc841d085ee..9bc841d085ee 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 8e32f1900774..8e32f1900774 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 0726799e74e7..0726799e74e7 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 aa33978ed286..aa33978ed286 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 c973278300a5..c973278300a5 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 6b2aa917e118..6b2aa917e118 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 34ac28c056bb..34ac28c056bb 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 fc018e3638a8..fc018e3638a8 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 f1b492ebc46a..f1b492ebc46a 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 ad28e9388053..ad28e9388053 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 1cfa150768d7..1cfa150768d7 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 c8e7e9833176..c8e7e9833176 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 f2e7df59cf24..f2e7df59cf24 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 49a37efe9c1d..49a37efe9c1d 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 1cd2c1c1ea2d..1cd2c1c1ea2d 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 756af8c4d6fb..756af8c4d6fb 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 3f7f27188313..3f7f27188313 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 c4b370ea8533..c4b370ea8533 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 46a5cd4b7395..46a5cd4b7395 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 a72e65c8910f..a72e65c8910f 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 2fa3d86a108d..2fa3d86a108d 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 c4dccff13acf..c4dccff13acf 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 e1d856af6d8b..e1d856af6d8b 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 ccf07c61a4e9..ccf07c61a4e9 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 08db9fdd2e68..08db9fdd2e68 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 f1349af56edd..f1349af56edd 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 14c92e4c25c2..14c92e4c25c2 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 984889b39d3f..984889b39d3f 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 31b9c6a2c1d3..31b9c6a2c1d3 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 ba8bd1b51497..ba8bd1b51497 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 c514bdbb9422..c514bdbb9422 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 93bada596e25..93bada596e25 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 08629a6e7029..08629a6e7029 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 ed2653d46fe6..ed2653d46fe6 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 4e676cdce8d6..4e676cdce8d6 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 500ab2fe7228..500ab2fe7228 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 682b23a06818..682b23a06818 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 b5fdc048a54a..b5fdc048a54a 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 e01c285cbf8f..e01c285cbf8f 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 f19202b50989..f19202b50989 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 998a2103c744..998a2103c744 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 9f989be01b9f..9f989be01b9f 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 f2ce14e9071c..f2ce14e9071c 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 b2401cec3e3b..b2401cec3e3b 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 b22f631261f0..b22f631261f0 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 81a375fa0ff9..81a375fa0ff9 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 691bc94dc2c8..691bc94dc2c8 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 ed9cf5a6a934..ed9cf5a6a934 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 5514edcf68be..5514edcf68be 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 634fb7f23a04..634fb7f23a04 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 91790943c3df..91790943c3df 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 a62736dce09f..a62736dce09f 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 132608879ad3..132608879ad3 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 c6c44ec570da..c6c44ec570da 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 6abe441ae361..6abe441ae361 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 98948955ae50..98948955ae50 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 cd4f9607dc13..cd4f9607dc13 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 5d56c3854647..5d56c3854647 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 8e8c4d724640..8e8c4d724640 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 dd8ab7ede182..dd8ab7ede182 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 8e7e0a5865d7..8e7e0a5865d7 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 e90413204ee3..e90413204ee3 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 ad288ddc695f..ad288ddc695f 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 7c84a518aa39..7c84a518aa39 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 d99218a725c5..d99218a725c5 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 d1e9fcc781b9..d1e9fcc781b9 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 c1b8446f491d..c1b8446f491d 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 4e855bc21b45..4e855bc21b45 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 48261ba0805c..48261ba0805c 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 93b74867ac8f..93b74867ac8f 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 6bac9ed180e7..6bac9ed180e7 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 7d7b396c2370..7d7b396c2370 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 d1ebfd88c7a9..d1ebfd88c7a9 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 0c685d35986e..0c685d35986e 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 701e08a8e594..701e08a8e594 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 a11366b4cee4..a11366b4cee4 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 72176e42c1d1..72176e42c1d1 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 eea048e52ceb..eea048e52ceb 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 1c5fb1d1f8c9..1c5fb1d1f8c9 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 9c353ab22276..9c353ab22276 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 75da219ed1be..75da219ed1be 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 288f040c99f6..288f040c99f6 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 bbdefeaced4b..bbdefeaced4b 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 4d00dbea7659..4d00dbea7659 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 768351515549..768351515549 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 eacd49ade636..eacd49ade636 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 ae4b579d245c..ae4b579d245c 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 72596e38b25f..72596e38b25f 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 31de4b64dc06..31de4b64dc06 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 831125047b93..831125047b93 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 ed38f74de95c..ed38f74de95c 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 36dc31eb3913..36dc31eb3913 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 6e61882b6f59..6e61882b6f59 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 997f90b42b3e..997f90b42b3e 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 89983527b62f..89983527b62f 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 b1c7919c4afa..b1c7919c4afa 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 7e8894a4a706..7e8894a4a706 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 0b20b07e6898..0b20b07e6898 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 ab1ef28fd991..ab1ef28fd991 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 6fca08e5e35b..6fca08e5e35b 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 2c309a57d988..2c309a57d988 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 c26c4b092791..c26c4b092791 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 66cd51102c8b..66cd51102c8b 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 b28271345c63..b28271345c63 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 5e0ad1917736..5e0ad1917736 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 6ed5f74e259d..6ed5f74e259d 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 dbe8deac0d2f..dbe8deac0d2f 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 ceaa5bad105e..ceaa5bad105e 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 6990f6436420..6990f6436420 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 c1e7542a3713..c1e7542a3713 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 ad37d980c91d..ad37d980c91d 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 cc799c238de9..cc799c238de9 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 6c9307355137..6c9307355137 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 499fa9594faf..499fa9594faf 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 9861c719f8c5..9861c719f8c5 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 e8479cec7aba..e8479cec7aba 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 32317d6bca5f..32317d6bca5f 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 9b44a44bc1f9..9b44a44bc1f9 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 42422f791ea4..42422f791ea4 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 45773ee560da..45773ee560da 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 044f65e91660..044f65e91660 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 a159ff96b718..a159ff96b718 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 8201c3e808a9..8201c3e808a9 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 40b714df31a2..40b714df31a2 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 000cad37c63d..000cad37c63d 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 5f9127be9261..5f9127be9261 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 9e8fe38e7ef9..9e8fe38e7ef9 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 ead404589eb6..ead404589eb6 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 9f7231d5b7da..9f7231d5b7da 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 0d53fc901497..0d53fc901497 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 edec640e9780..edec640e9780 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 19da5d1ddc27..19da5d1ddc27 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 2e4789d061fe..2e4789d061fe 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 4e95f791db1f..4e95f791db1f 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 2c213ae65405..2c213ae65405 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 cb764bcadc72..cb764bcadc72 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 3bf4255aa3ed..3bf4255aa3ed 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 aeceffaf7b08..aeceffaf7b08 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 f894860867a1..f894860867a1 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 fff49c410085..fff49c410085 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 2f80b216fe35..2f80b216fe35 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 b51c0ccceb35..b51c0ccceb35 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 733d16e0b25e..733d16e0b25e 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 6b1ce0b2e8b6..6b1ce0b2e8b6 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 067b15bad250..067b15bad250 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 027b416720dd..027b416720dd 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 22d80b0be2b9..22d80b0be2b9 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 e8559046296c..e8559046296c 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 8e7f7d68b734..8e7f7d68b734 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 a30730502d85..a30730502d85 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 4594e1ae2f36..4594e1ae2f36 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 7600a35cd458..7600a35cd458 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 3bbf341f6a5b..3bbf341f6a5b 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 5f91c0d68b45..5f91c0d68b45 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 d292bf9f55cd..d292bf9f55cd 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 102639090c11..102639090c11 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 1bb676bedef9..1bb676bedef9 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 2242f14ebec6..2242f14ebec6 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 42f70dbec751..42f70dbec751 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 4f6c06ecb2bc..4f6c06ecb2bc 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 587c37dba34b..587c37dba34b 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 e1e138cb1a73..e1e138cb1a73 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 47cafcf528d8..47cafcf528d8 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 89f285d08296..89f285d08296 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 8cb2b5c69cfc..8cb2b5c69cfc 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 0ddfe7025d93..0ddfe7025d93 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 a0150f057d00..a0150f057d00 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 3dfabb67dbe5..3dfabb67dbe5 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 184336f34611..184336f34611 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 7a6e33ba3c50..7a6e33ba3c50 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 991d2aa1be63..991d2aa1be63 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 a875b4510270..a875b4510270 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 69e4815781c1..69e4815781c1 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 0ede3cfedb2a..0ede3cfedb2a 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 f113acaa6c2e..f113acaa6c2e 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 e61c3e723645..e61c3e723645 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 e38d9fa37b50..e38d9fa37b50 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 d6245cee0810..d6245cee0810 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 90346ff4e92a..90346ff4e92a 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 a4813c2b09ce..a4813c2b09ce 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 52f2e46a5b4d..52f2e46a5b4d 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 ba35fc06fcee..ba35fc06fcee 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 bdf6e849993b..bdf6e849993b 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 54b1f61a2a74..54b1f61a2a74 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 c5946cb0b8a9..c5946cb0b8a9 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 141b7fa35e74..141b7fa35e74 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 dadc70b7d570..dadc70b7d570 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 bb1c39cfcc96..bb1c39cfcc96 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 5045f02a5331..5045f02a5331 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 b4004e05c2a7..b4004e05c2a7 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 d06ad75b4482..d06ad75b4482 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 8b3f0c3dba3f..8b3f0c3dba3f 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 897dc509075a..897dc509075a 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 a5e5dca75341..a5e5dca75341 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 84787eee9ace..84787eee9ace 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 cf31ace66763..cf31ace66763 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 cc8d463e01ac..cc8d463e01ac 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 2a0ffed870dd..2a0ffed870dd 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 0796a438bc77..0796a438bc77 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 251fdd66c47b..251fdd66c47b 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 827d39f5bf28..827d39f5bf28 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 562b12e16ebc..562b12e16ebc 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 3bb9b3417379..3bb9b3417379 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 5f83072ea4eb..5f83072ea4eb 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 55e1b0ca5dff..55e1b0ca5dff 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 e5830aeb3706..e5830aeb3706 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 bbcfe447b98e..bbcfe447b98e 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 c5dd82b12d89..c5dd82b12d89 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 d1f3f1b34408..d1f3f1b34408 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 e1db323f545f..e1db323f545f 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 c231e0f26fe9..c231e0f26fe9 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 562b12e16ebc..562b12e16ebc 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 3bb9b3417379..3bb9b3417379 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 3b68382a3b48..3b68382a3b48 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 b7fdccdfdf82..b7fdccdfdf82 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 472b7b2bd953..472b7b2bd953 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 fe6efa45544a..fe6efa45544a 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 34c9789f2f1a..34c9789f2f1a 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 018f7f8ece6b..018f7f8ece6b 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 d13242cb09de..d13242cb09de 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 88e456743461..88e456743461 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 3e64b11eac5e..3e64b11eac5e 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 562b12e16ebc..562b12e16ebc 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 3bb9b3417379..3bb9b3417379 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 ba8fd5af23d3..ba8fd5af23d3 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 d26885518a25..d26885518a25 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 2ff4aa932df4..2ff4aa932df4 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 562b12e16ebc..562b12e16ebc 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 3bb9b3417379..3bb9b3417379 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 80658c3c8d5a..80658c3c8d5a 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 102c133112c7..102c133112c7 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 34cd01366f92..34cd01366f92 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 5856563068c7..5856563068c7 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 67ff2711f5f5..67ff2711f5f5 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 94edebe27269..94edebe27269 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 2913277013da..2913277013da 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 32364571063d..32364571063d 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 90ef647db7e6..90ef647db7e6 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 4e794a01bf55..4e794a01bf55 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 eaaae414a1ff..eaaae414a1ff 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 58a9b3b71e6d..58a9b3b71e6d 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 3cff1fce1b74..3cff1fce1b74 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 57b533dc6fba..57b533dc6fba 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 c1446f26aba5..c1446f26aba5 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 254a7c244698..254a7c244698 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 fd018c87a806..fd018c87a806 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 468767cbf4b9..468767cbf4b9 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 9779dc0d11f3..9779dc0d11f3 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 932841003cfc..932841003cfc 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 ec3d937c6a73..ec3d937c6a73 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 0db7ab99184a..0db7ab99184a 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 600ce1e0b0d7..600ce1e0b0d7 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 fa1bba1dd936..fa1bba1dd936 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 ef80f1690bcb..ef80f1690bcb 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 572d395498e3..572d395498e3 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 88b76dc4d6c2..88b76dc4d6c2 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 a28dbbdd566c..a28dbbdd566c 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 f049ff8229c6..f049ff8229c6 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 fd64afe064e5..fd64afe064e5 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 d3670bd7a24d..d3670bd7a24d 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 ca6c2942bdf2..ca6c2942bdf2 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 88cfb1fcd3f0..88cfb1fcd3f0 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 3fb6960c18fc..3fb6960c18fc 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 d743ca33ee6a..d743ca33ee6a 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 e9276c48f4a2..e9276c48f4a2 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 e22369ccdf5f..e22369ccdf5f 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 de7152f82713..de7152f82713 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 75512c340366..75512c340366 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 88bc733ad691..88bc733ad691 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 7b181d15cebb..7b181d15cebb 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 ac22ccbd3ee9..ac22ccbd3ee9 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 e0b3f28d3a96..e0b3f28d3a96 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 30b07e310f59..30b07e310f59 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 46bf61847984..46bf61847984 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 d4ae6676d159..d4ae6676d159 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 2ffc80f72105..2ffc80f72105 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 0a6724fcc45e..0a6724fcc45e 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 669ebaf68be0..669ebaf68be0 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 5db870edb9e6..5db870edb9e6 100644
--- a/tag.c
+++ b/third_party/git/tag.c
diff --git a/tag.h b/third_party/git/tag.h
index 03265fbfe294..03265fbfe294 100644
--- a/tag.h
+++ b/third_party/git/tag.h
diff --git a/tar.h b/third_party/git/tar.h
index 3467705e9b0e..3467705e9b0e 100644
--- a/tar.h
+++ b/third_party/git/tar.h
diff --git a/tempfile.c b/third_party/git/tempfile.c
index d43ad8c1912d..d43ad8c1912d 100644
--- a/tempfile.c
+++ b/third_party/git/tempfile.c
diff --git a/tempfile.h b/third_party/git/tempfile.h
index cddda0a33c3e..cddda0a33c3e 100644
--- a/tempfile.h
+++ b/third_party/git/tempfile.h
diff --git a/templates/.gitignore b/third_party/git/templates/.gitignore
index 6759ecbf98f8..6759ecbf98f8 100644
--- a/templates/.gitignore
+++ b/third_party/git/templates/.gitignore
diff --git a/templates/Makefile b/third_party/git/templates/Makefile
index d22a71a3999b..d22a71a3999b 100644
--- a/templates/Makefile
+++ b/third_party/git/templates/Makefile
diff --git a/templates/branches-- b/third_party/git/templates/branches--
index fae88709a636..fae88709a636 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 a5d7b84a6734..a5d7b84a6734 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 b58d1184a9d4..b58d1184a9d4 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 e673bb3980f3..e673bb3980f3 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 ec17ec1939b7..ec17ec1939b7 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 4142082bcb93..4142082bcb93 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 6a756416384c..6a756416384c 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 6187dbf4390f..6187dbf4390f 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 db5feab8a1ee..db5feab8a1ee 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 a1fd29ec1482..a1fd29ec1482 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 318afe3fd865..318afe3fd865 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 80ba94135cc3..80ba94135cc3 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 a5196d1be8fb..a5196d1be8fb 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 498b267a8c78..498b267a8c78 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 532984569132..532984569132 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 4961487ed914..4961487ed914 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 91c00567f4d6..91c00567f4d6 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 b1e45b4c75d2..b1e45b4c75d2 100644
--- a/tmp-objdir.h
+++ b/third_party/git/tmp-objdir.h
diff --git a/trace.c b/third_party/git/trace.c
index fa4a2e7120e4..fa4a2e7120e4 100644
--- a/trace.c
+++ b/third_party/git/trace.c
diff --git a/trace.h b/third_party/git/trace.h
index 9fa3e7a59407..9fa3e7a59407 100644
--- a/trace.h
+++ b/third_party/git/trace.h
diff --git a/trace2.c b/third_party/git/trace2.c
index c7b4f14d29a9..c7b4f14d29a9 100644
--- a/trace2.c
+++ b/third_party/git/trace2.c
diff --git a/trace2.h b/third_party/git/trace2.h
index 050bf3c8c19d..050bf3c8c19d 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 caa7f06948ab..caa7f06948ab 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 d9c98f64ddf2..d9c98f64ddf2 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 dd313204f517..dd313204f517 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 ab70b67a8e03..ab70b67a8e03 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 5dda0ca1cdb5..5dda0ca1cdb5 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 3adf3bac139b..3adf3bac139b 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 6948fd41086f..6948fd41086f 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 9bef3217081a..9bef3217081a 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 5958cfc424b5..5958cfc424b5 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 8dd82a7a56bb..8dd82a7a56bb 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 2498482d9ad8..2498482d9ad8 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 fa853d8f4211..fa853d8f4211 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 7b904692123e..7b904692123e 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 c2852d1bd2bd..c2852d1bd2bd 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 00b116d797c8..00b116d797c8 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 ea0cbbe13ee0..ea0cbbe13ee0 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 067c23755fb5..067c23755fb5 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 b1e327a928e2..b1e327a928e2 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 0c414f2fed2b..0c414f2fed2b 100644
--- a/trailer.c
+++ b/third_party/git/trailer.c
diff --git a/trailer.h b/third_party/git/trailer.h
index 203acf4ee1db..203acf4ee1db 100644
--- a/trailer.h
+++ b/third_party/git/trailer.h
diff --git a/transport-helper.c b/third_party/git/transport-helper.c
index 6b05a88faf59..6b05a88faf59 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 004bee5e368f..004bee5e368f 100644
--- a/transport-internal.h
+++ b/third_party/git/transport-internal.h
diff --git a/transport.c b/third_party/git/transport.c
index 778c60bf573a..778c60bf573a 100644
--- a/transport.c
+++ b/third_party/git/transport.c
diff --git a/transport.h b/third_party/git/transport.h
index 0b5f7806f625..0b5f7806f625 100644
--- a/transport.h
+++ b/third_party/git/transport.h
diff --git a/tree-diff.c b/third_party/git/tree-diff.c
index 33ded7f8b3e7..33ded7f8b3e7 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 c20b62f49e47..c20b62f49e47 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 2a5db29e8f19..2a5db29e8f19 100644
--- a/tree-walk.h
+++ b/third_party/git/tree-walk.h
diff --git a/tree.c b/third_party/git/tree.c
index 4720945e6a68..4720945e6a68 100644
--- a/tree.c
+++ b/third_party/git/tree.c
diff --git a/tree.h b/third_party/git/tree.h
index 93837450739c..93837450739c 100644
--- a/tree.h
+++ b/third_party/git/tree.h
diff --git a/unicode-width.h b/third_party/git/unicode-width.h
index c9d027625d1f..c9d027625d1f 100644
--- a/unicode-width.h
+++ b/third_party/git/unicode-width.h
diff --git a/unimplemented.sh b/third_party/git/unimplemented.sh
index fee21d24e8ab..fee21d24e8ab 100644
--- a/unimplemented.sh
+++ b/third_party/git/unimplemented.sh
diff --git a/unix-socket.c b/third_party/git/unix-socket.c
index 19ed48be9902..19ed48be9902 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 e271aeec5a07..e271aeec5a07 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 62276d4fef5f..62276d4fef5f 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 d344d7d29694..d344d7d29694 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 222cd3ad8960..222cd3ad8960 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 4bafe16a22c3..4bafe16a22c3 100644
--- a/upload-pack.h
+++ b/third_party/git/upload-pack.h
diff --git a/url.c b/third_party/git/url.c
index 1b8ef78ceab0..1b8ef78ceab0 100644
--- a/url.c
+++ b/third_party/git/url.c
diff --git a/url.h b/third_party/git/url.h
index 00b7d58c33e3..00b7d58c33e3 100644
--- a/url.h
+++ b/third_party/git/url.h
diff --git a/urlmatch.c b/third_party/git/urlmatch.c
index 3e42bd750485..3e42bd750485 100644
--- a/urlmatch.c
+++ b/third_party/git/urlmatch.c
diff --git a/urlmatch.h b/third_party/git/urlmatch.h
index eed5f292354c..eed5f292354c 100644
--- a/urlmatch.h
+++ b/third_party/git/urlmatch.h
diff --git a/usage.c b/third_party/git/usage.c
index 2fdb20086bd6..2fdb20086bd6 100644
--- a/usage.c
+++ b/third_party/git/usage.c
diff --git a/userdiff.c b/third_party/git/userdiff.c
index e74a6d402255..e74a6d402255 100644
--- a/userdiff.c
+++ b/third_party/git/userdiff.c
diff --git a/userdiff.h b/third_party/git/userdiff.h
index 203057e13e50..203057e13e50 100644
--- a/userdiff.h
+++ b/third_party/git/userdiff.h
diff --git a/utf8.c b/third_party/git/utf8.c
index 3b42fadffd7c..3b42fadffd7c 100644
--- a/utf8.c
+++ b/third_party/git/utf8.c
diff --git a/utf8.h b/third_party/git/utf8.h
index fcd5167bafb3..fcd5167bafb3 100644
--- a/utf8.h
+++ b/third_party/git/utf8.h
diff --git a/varint.c b/third_party/git/varint.c
index 409c4977a1e3..409c4977a1e3 100644
--- a/varint.c
+++ b/third_party/git/varint.c
diff --git a/varint.h b/third_party/git/varint.h
index f78bb0ca528d..f78bb0ca528d 100644
--- a/varint.h
+++ b/third_party/git/varint.h
diff --git a/vcs-svn/LICENSE b/third_party/git/vcs-svn/LICENSE
index eb91858b825b..eb91858b825b 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 b5b8913cb0f2..b5b8913cb0f2 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 9dcf9337c18b..9dcf9337c18b 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 e416caf8a4fc..e416caf8a4fc 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 e192aedea296..e192aedea296 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 8e139eb22df0..8e139eb22df0 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 06d273c9e8ce..06d273c9e8ce 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 a7fc0999cb63..a7fc0999cb63 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 75c753162ab3..75c753162ab3 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 625d950bb894..625d950bb894 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 08d136b8cc5c..08d136b8cc5c 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 26faed59684f..26faed59684f 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 41b718c29e1b..41b718c29e1b 100644
--- a/version.c
+++ b/third_party/git/version.c
diff --git a/version.h b/third_party/git/version.h
index 7c62e8057715..7c62e8057715 100644
--- a/version.h
+++ b/third_party/git/version.h
diff --git a/versioncmp.c b/third_party/git/versioncmp.c
index 069ee94a4d79..069ee94a4d79 100644
--- a/versioncmp.c
+++ b/third_party/git/versioncmp.c
diff --git a/walker.c b/third_party/git/walker.c
index 06cd2bd5691a..06cd2bd5691a 100644
--- a/walker.c
+++ b/third_party/git/walker.c
diff --git a/walker.h b/third_party/git/walker.h
index 6d8ae00e5b99..6d8ae00e5b99 100644
--- a/walker.h
+++ b/third_party/git/walker.h
diff --git a/wildmatch.c b/third_party/git/wildmatch.c
index 9e9e2a2f955d..9e9e2a2f955d 100644
--- a/wildmatch.c
+++ b/third_party/git/wildmatch.c
diff --git a/wildmatch.h b/third_party/git/wildmatch.h
index 599369629824..599369629824 100644
--- a/wildmatch.h
+++ b/third_party/git/wildmatch.h
diff --git a/worktree.c b/third_party/git/worktree.c
index 5b4793caa34e..5b4793caa34e 100644
--- a/worktree.c
+++ b/third_party/git/worktree.c
diff --git a/worktree.h b/third_party/git/worktree.h
index caecc7a281cc..caecc7a281cc 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 95851b85b6b7..95851b85b6b7 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 1e45ab7b9274..1e45ab7b9274 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 eab8c8d0b9aa..eab8c8d0b9aa 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 6e69877f2579..6e69877f2579 100644
--- a/ws.c
+++ b/third_party/git/ws.c
diff --git a/wt-status.c b/third_party/git/wt-status.c
index 9f6c65a58097..9f6c65a58097 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 77dad5b92048..77dad5b92048 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 8509f9ea223a..8509f9ea223a 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 ede4246bbd33..ede4246bbd33 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 032e3a9f41a2..032e3a9f41a2 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 1f1f4a3c7808..1f1f4a3c7808 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 8f1c7c8b0445..8f1c7c8b0445 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 30713ae9a98e..30713ae9a98e 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 1b9887e670d4..1b9887e670d4 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 c7b35a9667f3..c7b35a9667f3 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 a4285ac0eb28..a4285ac0eb28 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 2809a28ca960..2809a28ca960 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 1659edb45393..1659edb45393 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 3c5601b602a2..3c5601b602a2 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 abeb8fb84e6d..abeb8fb84e6d 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 947d9fc1bb8c..947d9fc1bb8c 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 8442bd436efe..8442bd436efe 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 cfa6e2220ffd..cfa6e2220ffd 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 fba7bae03c78..fba7bae03c78 100644
--- a/xdiff/xutils.h
+++ b/third_party/git/xdiff/xutils.h
diff --git a/zlib.c b/third_party/git/zlib.c
index d594cba3fc9d..d594cba3fc9d 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 000000000000..d3855291a9cc
--- /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 000000000000..72979ef80df3
--- /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 000000000000..2dfa1241e9c1
--- /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 000000000000..f1c54cd496eb
--- /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 000000000000..8d60209681d9
--- /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 000000000000..fe694fdbbece
--- /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 000000000000..04efc3144d9a
--- /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 000000000000..454b27312a3c
--- /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 000000000000..ed8dadc40cae
--- /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 000000000000..0d94f6cf6e22
--- /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 000000000000..45f68891519e
--- /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 000000000000..5dde56d5f3a7
--- /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 000000000000..e179618a72a3
--- /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 000000000000..4cab5e5dceba
--- /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 000000000000..11c9b0ea8b1b
--- /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 000000000000..400ba6922b58
--- /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 000000000000..f5e783b6d189
--- /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 000000000000..5655c08d822d
--- /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 000000000000..409b0d0b9e2e
--- /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 000000000000..6ccfc8a652ed
--- /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 000000000000..a4e7339a3f8a
--- /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 000000000000..50280296b84d
--- /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 000000000000..badc811c9fa8
--- /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 000000000000..4c0ee4fb6da2
--- /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 000000000000..4272ed7d675b
--- /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 000000000000..75d053f777cd
--- /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 000000000000..1299c2b541f6
--- /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 000000000000..cbde914a6ba8
--- /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 000000000000..2f58d5f1179b
--- /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 000000000000..c882a79ac518
--- /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 000000000000..dbe0554d6286
--- /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 000000000000..3d41a1f36def
--- /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 000000000000..ba367df9ad82
--- /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 000000000000..f1e458f4dc68
--- /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 000000000000..556dee0676c0
--- /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 000000000000..88fcae318b7b
--- /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 000000000000..44417d7d949c
--- /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 000000000000..1945d8a2e9c7
--- /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 000000000000..5bf9240104a5
--- /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 000000000000..56a7f7b92e0e
--- /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 000000000000..5fc65d3f5920
--- /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 000000000000..c0ff0d2e2030
--- /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 000000000000..8b2b6f0d3107
--- /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 000000000000..3d91f81209ef
--- /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 000000000000..1a63041be676
--- /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 000000000000..2da96d8266c7
--- /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 000000000000..7ef7b644f8dd
--- /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 000000000000..ddb764b0ae46
--- /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 000000000000..c9e0159ca242
--- /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 000000000000..eed5c7981e43
--- /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 000000000000..4fdf0667ff9f
--- /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 000000000000..465b74e4e1b9
--- /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 000000000000..7afa0fe9207a
--- /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 000000000000..c22e4c949bc1
--- /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 000000000000..db64f8378e40
--- /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 000000000000..2f7896d1d136
--- /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 000000000000..e69de29bb2d1
--- /dev/null
+++ b/tools/cheddar/.skip-subtree
diff --git a/tools/cheddar/Cargo.lock b/tools/cheddar/Cargo.lock
new file mode 100644
index 000000000000..227db64fefb6
--- /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 000000000000..fe936deb4c0f
--- /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 000000000000..706f3b62d552
--- /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 000000000000..ed4814be0a78
--- /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 000000000000..d0115d391c9d
--- /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 000000000000..b09756dea560
--- /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 000000000000..3500b1c9f489
--- /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 000000000000..0e314ae71966
--- /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 000000000000..533e7e6f34c9
--- /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 000000000000..09b5353dc44e
--- /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 000000000000..67595474fa86
--- /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 000000000000..7b666905f847
--- /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 000000000000..5c667333962e
--- /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 000000000000..e77af338951f
--- /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 000000000000..a157c7a5fa37
--- /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 000000000000..d923ab584c75
--- /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 000000000000..0b23c5a2d1bc
--- /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 000000000000..a7889ca915bc
--- /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 000000000000..eac109f985d0
--- /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 000000000000..98716dde6465
--- /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 000000000000..1167bcadd372
--- /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 000000000000..8d47f2f9a531
--- /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 000000000000..274dcdde3554
--- /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 000000000000..ce515928a279
--- /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 000000000000..624a74b5dbbc
--- /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 000000000000..f3aba10215bc
--- /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 000000000000..6b3d0a70b11d
--- /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 000000000000..962efab91ac7
--- /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 000000000000..67dbc0c7ab80
--- /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 000000000000..6074f96b7685
--- /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 000000000000..eecadff6ba17
--- /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 000000000000..ebb891a87458
--- /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 000000000000..0a53b5f2fbf4
--- /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 000000000000..60ccd0b5a003
--- /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 000000000000..913aa9a4081b
--- /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 000000000000..40129988393b
--- /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 000000000000..22ba058cddd4
--- /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 000000000000..e6e4ae3c2be0
--- /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 000000000000..2958dd3afcb0
--- /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 000000000000..661c33e01e73
--- /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 000000000000..58aeb7049ed1
--- /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 000000000000..b59cddec07a7
--- /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;
+}