From efa3f4e2b2a53d659715d3ec500cbd6821e70dff Mon Sep 17 00:00:00 2001 From: Gabor Pihaj Date: Sat, 30 May 2026 14:02:03 +0200 Subject: [PATCH] feat: prevent default git templates to be created (#12335) Prevent examples hooks, description file, and other files from the default template to be created during git init. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/12335 Reviewed-by: Otto --- modules/git/repo.go | 2 ++ modules/git/repo_test.go | 47 ++++++++++++++++++++++++++++++++++++++++ release-notes/12335.md | 1 + 3 files changed, 50 insertions(+) create mode 100644 release-notes/12335.md diff --git a/modules/git/repo.go b/modules/git/repo.go index 8f9b95f1f2..47d65dcf69 100644 --- a/modules/git/repo.go +++ b/modules/git/repo.go @@ -72,6 +72,8 @@ func InitRepository(ctx context.Context, repoPath string, bare bool, objectForma } cmd := NewCommand(ctx, "init") + // Set template to an empty string so that example hooks, and other info files are not created + cmd.AddArguments("--template", "") if !IsValidObjectFormat(objectFormatName) { return fmt.Errorf("invalid object format: %s", objectFormatName) diff --git a/modules/git/repo_test.go b/modules/git/repo_test.go index 8cdb63c3b2..a755666fbf 100644 --- a/modules/git/repo_test.go +++ b/modules/git/repo_test.go @@ -117,3 +117,50 @@ func TestCloneCredentials(t *testing.T) { _, err = os.Stat(credentialsFile) require.ErrorIs(t, err, fs.ErrNotExist) } + +func TestInitRepositoryWithNoTemplates(t *testing.T) { + tests := []struct { + name string // description of this test case + // Named input parameters for target function. + bare bool + objectFormatName string + }{ + { + name: "Bare sha1 repo", + bare: true, + objectFormatName: Sha1ObjectFormat.Name(), + }, + { + name: "Non-bare sha1 repo", + bare: false, + objectFormatName: Sha1ObjectFormat.Name(), + }, + { + name: "Bare sha256 repo", + bare: true, + objectFormatName: Sha256ObjectFormat.Name(), + }, + { + name: "Non-bare sha256 repo", + bare: false, + objectFormatName: Sha256ObjectFormat.Name(), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + repoPath := t.TempDir() + + err := InitRepository(t.Context(), repoPath, tt.bare, tt.objectFormatName) + require.NoError(t, err, "couldn't init repository") + + _, err = os.Stat(repoPath + "/hooks") + require.ErrorIs(t, err, os.ErrNotExist, "hooks directory shouldn't exist") + + _, err = os.Stat(repoPath + "/description") + require.ErrorIs(t, err, os.ErrNotExist, "description file shouldn't exist") + + _, err = os.Stat(repoPath + "/info") + require.ErrorIs(t, err, os.ErrNotExist, "info directory shouldn't exist") + }) + } +} diff --git a/release-notes/12335.md b/release-notes/12335.md new file mode 100644 index 0000000000..1c45739a6e --- /dev/null +++ b/release-notes/12335.md @@ -0,0 +1 @@ +feat: prevent default git templates to be created when initialising a new repository. Migration guide is available in [Admin docs](https://forgejo.org/docs/latest/admin/upgrade/#when-upgrading-from--known-problematic-versions-or-upgrade-paths).