From 4b3bfd7e89cd1527d500ac44c2564d398a6b681e Mon Sep 17 00:00:00 2001
From: Gusted <williamzijl7@hotmail.com>
Date: Thu, 6 Jan 2022 05:38:38 +0000
Subject: [PATCH] Enable partial clone by default (#18195)

- Enable partial clones(which are by default disabled from git) by
default, unless configured otherwise.
- Resolves #18190
---
 custom/conf/app.example.ini                   |  4 ++-
 .../doc/advanced/clone-filter.en-us.md        | 31 ++-----------------
 .../doc/advanced/config-cheat-sheet.en-us.md  |  2 ++
 modules/git/git.go                            |  5 +++
 modules/setting/git.go                        |  2 ++
 5 files changed, 14 insertions(+), 30 deletions(-)

diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini
index 17343aaea1..a58e52cb41 100644
--- a/custom/conf/app.example.ini
+++ b/custom/conf/app.example.ini
@@ -592,6 +592,8 @@ PATH =
 ;LARGE_OBJECT_THRESHOLD = 1048576
 ;; Set to true to forcibly set core.protectNTFS=false
 ;DISABLE_CORE_PROTECT_NTFS=false
+;; Disable the usage of using partial clones for git.
+;DISABLE_PARTIAL_CLONE = false
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -790,7 +792,7 @@ PATH =
 ;PREFERRED_LICENSES = Apache License 2.0,MIT License
 ;;
 ;; Disable the ability to interact with repositories using the HTTP protocol
-;;DISABLE_HTTP_GIT = false
+;DISABLE_HTTP_GIT = false
 ;;
 ;; Value for Access-Control-Allow-Origin header, default is not to present
 ;; WARNING: This may be harmful to your website if you do not give it a right value.
diff --git a/docs/content/doc/advanced/clone-filter.en-us.md b/docs/content/doc/advanced/clone-filter.en-us.md
index 1e6ea020d9..ba2fdf104c 100644
--- a/docs/content/doc/advanced/clone-filter.en-us.md
+++ b/docs/content/doc/advanced/clone-filter.en-us.md
@@ -27,36 +27,9 @@ on the client is at least the same as on the server (or later). Login to
 Gitea server as admin and head to Site Administration -> Configuration to
 see Git version of the server.
 
-By default, clone filters are disabled, which cause the server to ignore
-`--filter` option.
+By default, clone filters are enabled, unless `DISABLE_PARTIAL_CLONE` under
+`[git]` is set to `true`.
 
-To enable clone filters on per-repo basis, edit the repo's `config` on
-repository location. Consult `ROOT` option on `repository` section of
-Gitea configuration (`app.ini`) for the exact location. For example, to
-enable clone filters for `some-repo`, edit
-`/var/gitea/data/gitea-repositories/some-user/some-repo.git/config` and add:
-
-```ini
-[uploadpack]
-	allowfilter = true
-```
-
-To enable clone filters globally, add that config above to `~/.gitconfig`
-of user that run Gitea (for example `git`).
-
-Alternatively, you can use `git config` to set the option.
-
-To enable for a specific repo:
-
-```bash
-cd /var/gitea/data/gitea-repositories/some-user/some-repo.git
-git config --local uploadpack.allowfilter true
-```
-To enable globally, login as user that run Gitea and:
-
-```bash
-git config --global uploadpack.allowfilter true
-```
 
 See [GitHub blog post: Get up to speed with partial clone](https://github.blog/2020-12-21-get-up-to-speed-with-partial-clone-and-shallow-clone/)
 for common use cases of clone filters (blobless and treeless clones), and
diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md
index 247ea935ee..dfafa84175 100644
--- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md
+++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md
@@ -933,6 +933,8 @@ NB: You must have `DISABLE_ROUTER_LOG` set to `false` for this option to take ef
 - `VERBOSE_PUSH_DELAY`: **5s**: Only print verbose information if push takes longer than this delay.
 - `LARGE_OBJECT_THRESHOLD`: **1048576**: (Go-Git only), don't cache objects greater than this in memory. (Set to 0 to disable.)
 - `DISABLE_CORE_PROTECT_NTFS`: **false** Set to true to forcibly set `core.protectNTFS` to false.
+- `DISABLE_PARTIAL_CLONE`: **false** Disable the usage of using partial clones for git.
+
 ## Git - Timeout settings (`git.timeout`)
 - `DEFAUlT`: **360**: Git operations default timeout seconds.
 - `MIGRATE`: **600**: Migrate external repositories timeout seconds.
diff --git a/modules/git/git.go b/modules/git/git.go
index e6c34979e8..cca5ce6714 100644
--- a/modules/git/git.go
+++ b/modules/git/git.go
@@ -146,6 +146,11 @@ func Init(ctx context.Context) error {
 		GlobalCommandArgs = append(GlobalCommandArgs, "-c", "protocol.version=2")
 	}
 
+	// By default partial clones are disabled, enable them from git v2.22
+	if !setting.Git.DisablePartialClone && CheckGitVersionAtLeast("2.22") == nil {
+		GlobalCommandArgs = append(GlobalCommandArgs, "-c", "uploadpack.allowfilter=true")
+	}
+
 	// Save current git version on init to gitVersion otherwise it would require an RWMutex
 	if err := LoadGitVersion(); err != nil {
 		return err
diff --git a/modules/setting/git.go b/modules/setting/git.go
index aaa65ed81c..4cf7e722e7 100644
--- a/modules/setting/git.go
+++ b/modules/setting/git.go
@@ -27,6 +27,7 @@ var (
 		PullRequestPushMessage    bool
 		LargeObjectThreshold      int64
 		DisableCoreProtectNTFS    bool
+		DisablePartialClone       bool
 		Timeout                   struct {
 			Default int
 			Migrate int
@@ -48,6 +49,7 @@ var (
 		EnableAutoGitWireProtocol: true,
 		PullRequestPushMessage:    true,
 		LargeObjectThreshold:      1024 * 1024,
+		DisablePartialClone:       false,
 		Timeout: struct {
 			Default int
 			Migrate int