0
0
mirror of https://github.com/go-gitea/gitea.git synced 2025-07-19 08:30:49 +02:00
This commit is contained in:
Lunny Xiao 2025-03-19 12:00:50 -07:00
parent 38a445575e
commit 565a62b769
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
11 changed files with 27 additions and 68 deletions

View File

@ -219,6 +219,10 @@ func RelativePath(ownerName, repoName string) string {
return strings.ToLower(ownerName) + "/" + strings.ToLower(repoName) + ".git" return strings.ToLower(ownerName) + "/" + strings.ToLower(repoName) + ".git"
} }
func RelativeWikiPath(ownerName, repoName string) string {
return strings.ToLower(ownerName) + "/" + strings.ToLower(repoName) + ".wiki.git"
}
// RelativePath should be an unix style path like username/reponame.git // RelativePath should be an unix style path like username/reponame.git
func (repo *Repository) RelativePath() string { func (repo *Repository) RelativePath() string {
return RelativePath(repo.OwnerName, repo.Name) return RelativePath(repo.OwnerName, repo.Name)
@ -232,7 +236,7 @@ func (sr StorageRepo) RelativePath() string {
} }
func (repo *Repository) WikiStorageRepo() StorageRepo { func (repo *Repository) WikiStorageRepo() StorageRepo {
return StorageRepo(strings.ToLower(repo.OwnerName) + "/" + strings.ToLower(repo.Name) + ".wiki.git") return StorageRepo(RelativeWikiPath(repo.OwnerName, repo.Name))
} }
// SanitizedOriginalURL returns a sanitized OriginalURL // SanitizedOriginalURL returns a sanitized OriginalURL

View File

@ -40,12 +40,12 @@ func TestRepository_WikiPath(t *testing.T) {
func TestRepository_HasWiki(t *testing.T) { func TestRepository_HasWiki(t *testing.T) {
unittest.PrepareTestEnv(t) unittest.PrepareTestEnv(t)
repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
exist, err := gitrepo.IsWikiRepositoryExist(t.Context(), repo1) exist, err := gitrepo.IsRepositoryExist(t.Context(), repo1.WikiStorageRepo())
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, exist) assert.True(t, exist)
repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
exist, err = gitrepo.IsWikiRepositoryExist(t.Context(), repo2) exist, err = gitrepo.IsRepositoryExist(t.Context(), repo2.WikiStorageRepo())
assert.NoError(t, err) assert.NoError(t, err)
assert.False(t, exist) assert.False(t, exist)
} }

View File

@ -1,46 +0,0 @@
// Copyright 2025 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package gitrepo
import (
"context"
"fmt"
"path/filepath"
"strings"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
)
func absWikiPath(owner, name string) string {
return filepath.Join(setting.RepoRootPath, strings.ToLower(owner), strings.ToLower(name)+".wiki.git")
}
func wikiPath(repo Repository) string {
return absWikiPath(repo.GetOwnerName(), repo.GetName())
}
func OpenWikiRepository(ctx context.Context, repo Repository) (*git.Repository, error) {
return git.OpenRepository(ctx, wikiPath(repo))
}
// IsWikiRepositoryExist returns true if the repository directory exists in the disk
func IsWikiRepositoryExist(ctx context.Context, repo Repository) (bool, error) {
return util.IsDir(wikiPath(repo))
}
// RenameRepository renames a repository's name on disk
func RenameWikiRepository(ctx context.Context, repo Repository, newName string) error {
newRepoPath := absWikiPath(repo.GetOwnerName(), newName)
if err := util.Rename(wikiPath(repo), newRepoPath); err != nil {
return fmt.Errorf("rename repository directory: %w", err)
}
return nil
}
// DeleteWikiRepository deletes the repository directory from the disk
func DeleteWikiRepository(ctx context.Context, repo Repository) error {
return util.RemoveAll(wikiPath(repo))
}

View File

@ -557,7 +557,7 @@ func Wiki(ctx *context.Context) {
return return
} }
hasWiki, err := gitrepo.IsWikiRepositoryExist(ctx, ctx.Repo.Repository) hasWiki, err := gitrepo.IsRepositoryExist(ctx, ctx.Repo.Repository.WikiStorageRepo())
if err != nil { if err != nil {
ctx.ServerError("IsWikiRepositoryExist", err) ctx.ServerError("IsWikiRepositoryExist", err)
return return
@ -603,7 +603,7 @@ func Wiki(ctx *context.Context) {
func WikiRevision(ctx *context.Context) { func WikiRevision(ctx *context.Context) {
ctx.Data["CanWriteWiki"] = ctx.Repo.CanWrite(unit.TypeWiki) && !ctx.Repo.Repository.IsArchived ctx.Data["CanWriteWiki"] = ctx.Repo.CanWrite(unit.TypeWiki) && !ctx.Repo.Repository.IsArchived
hasWiki, err := gitrepo.IsWikiRepositoryExist(ctx, ctx.Repo.Repository) hasWiki, err := gitrepo.IsRepositoryExist(ctx, ctx.Repo.Repository.WikiStorageRepo())
if err != nil { if err != nil {
ctx.ServerError("IsWikiRepositoryExist", err) ctx.ServerError("IsWikiRepositoryExist", err)
return return
@ -644,7 +644,7 @@ func WikiRevision(ctx *context.Context) {
// WikiPages render wiki pages list page // WikiPages render wiki pages list page
func WikiPages(ctx *context.Context) { func WikiPages(ctx *context.Context) {
hasWiki, err := gitrepo.IsWikiRepositoryExist(ctx, ctx.Repo.Repository) hasWiki, err := gitrepo.IsRepositoryExist(ctx, ctx.Repo.Repository.WikiStorageRepo())
if err != nil { if err != nil {
ctx.ServerError("IsWikiRepositoryExist", err) ctx.ServerError("IsWikiRepositoryExist", err)
return return
@ -768,7 +768,7 @@ func WikiRaw(ctx *context.Context) {
func NewWiki(ctx *context.Context) { func NewWiki(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("repo.wiki.new_page") ctx.Data["Title"] = ctx.Tr("repo.wiki.new_page")
hasWiki, err := gitrepo.IsWikiRepositoryExist(ctx, ctx.Repo.Repository) hasWiki, err := gitrepo.IsRepositoryExist(ctx, ctx.Repo.Repository.WikiStorageRepo())
if err != nil { if err != nil {
ctx.ServerError("IsWikiRepositoryExist", err) ctx.ServerError("IsWikiRepositoryExist", err)
return return
@ -826,7 +826,7 @@ func NewWikiPost(ctx *context.Context) {
func EditWiki(ctx *context.Context) { func EditWiki(ctx *context.Context) {
ctx.Data["PageIsWikiEdit"] = true ctx.Data["PageIsWikiEdit"] = true
hasWiki, err := gitrepo.IsWikiRepositoryExist(ctx, ctx.Repo.Repository) hasWiki, err := gitrepo.IsRepositoryExist(ctx, ctx.Repo.Repository.WikiStorageRepo())
if err != nil { if err != nil {
ctx.ServerError("IsWikiRepositoryExist", err) ctx.ServerError("IsWikiRepositoryExist", err)
return return

View File

@ -241,7 +241,7 @@ func TestDefaultWikiBranch(t *testing.T) {
// repo with no wiki // repo with no wiki
repoWithNoWiki := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) repoWithNoWiki := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
exist, err := gitrepo.IsWikiRepositoryExist(db.DefaultContext, repoWithNoWiki) exist, err := gitrepo.IsRepositoryExist(db.DefaultContext, repoWithNoWiki.WikiStorageRepo())
assert.NoError(t, err) assert.NoError(t, err)
assert.False(t, exist) assert.False(t, exist)
assert.NoError(t, wiki_service.ChangeDefaultWikiBranch(db.DefaultContext, repoWithNoWiki, "main")) assert.NoError(t, wiki_service.ChangeDefaultWikiBranch(db.DefaultContext, repoWithNoWiki, "main"))

View File

@ -52,7 +52,7 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error
return err return err
} }
hasWiki, err := gitrepo.IsWikiRepositoryExist(ctx, m.Repo) hasWiki, err := gitrepo.IsRepositoryExist(ctx, m.Repo.WikiStorageRepo())
if err != nil { if err != nil {
return err return err
} }
@ -353,7 +353,7 @@ func runSync(ctx context.Context, m *repo_model.Mirror) ([]*mirrorSyncResult, bo
log.Error("SyncMirrors [repo: %-v]: failed to update size for mirror repository: %v", m.Repo.FullName(), err) log.Error("SyncMirrors [repo: %-v]: failed to update size for mirror repository: %v", m.Repo.FullName(), err)
} }
hasWiki, err := gitrepo.IsWikiRepositoryExist(ctx, m.Repo) hasWiki, err := gitrepo.IsRepositoryExist(ctx, m.Repo.WikiStorageRepo())
if err != nil { if err != nil {
log.Error("SyncMirrors [repo: %-v]: failed to check if wiki repository exists: %v", m.Repo.FullName(), err) log.Error("SyncMirrors [repo: %-v]: failed to check if wiki repository exists: %v", m.Repo.FullName(), err)
} }

View File

@ -47,7 +47,7 @@ func AddPushMirrorRemote(ctx context.Context, m *repo_model.PushMirror, addr str
return err return err
} }
hasWiki, err := gitrepo.IsWikiRepositoryExist(ctx, m.Repo) hasWiki, err := gitrepo.IsRepositoryExist(ctx, m.Repo.WikiStorageRepo())
if err != nil { if err != nil {
return err return err
} }
@ -72,7 +72,7 @@ func RemovePushMirrorRemote(ctx context.Context, m *repo_model.PushMirror) error
return err return err
} }
hasWiki, err := gitrepo.IsWikiRepositoryExist(ctx, m.Repo) hasWiki, err := gitrepo.IsRepositoryExist(ctx, m.Repo.WikiStorageRepo())
if err != nil { if err != nil {
return err return err
} }
@ -191,7 +191,7 @@ func runPushSync(ctx context.Context, m *repo_model.PushMirror) error {
return err return err
} }
hasWiki, err := gitrepo.IsWikiRepositoryExist(ctx, m.Repo) hasWiki, err := gitrepo.IsRepositoryExist(ctx, m.Repo.WikiStorageRepo())
if err != nil { if err != nil {
return err return err
} }

View File

@ -298,8 +298,8 @@ func DeleteRepositoryDirectly(ctx context.Context, doer *user_model.User, repoID
} }
} }
// Remove wiki files // Remove wiki files if it exists.
if err := gitrepo.DeleteWikiRepository(ctx, repo); err != nil { if err := gitrepo.DeleteRepository(ctx, repo.WikiStorageRepo()); err != nil {
desc := fmt.Sprintf("Delete wiki repository files [%s]: %v", repo.FullName(), err) desc := fmt.Sprintf("Delete wiki repository files [%s]: %v", repo.FullName(), err)
// Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled // Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled
if err = system_model.CreateNotice(db.DefaultContext, system_model.NoticeRepository, desc); err != nil { if err = system_model.CreateNotice(db.DefaultContext, system_model.NoticeRepository, desc); err != nil {

View File

@ -341,13 +341,14 @@ func changeRepositoryName(ctx context.Context, repo *repo_model.Repository, newR
return fmt.Errorf("rename repository directory: %w", err) return fmt.Errorf("rename repository directory: %w", err)
} }
isExist, err := gitrepo.IsWikiRepositoryExist(ctx, repo) isExist, err := gitrepo.IsRepositoryExist(ctx, repo.WikiStorageRepo())
if err != nil { if err != nil {
log.Error("Unable to check if the wiki of %s exists. Error: %v", repo.FullName(), err) log.Error("Unable to check if the wiki of %s exists. Error: %v", repo.FullName(), err)
return err return err
} }
if isExist { if isExist {
if err = gitrepo.RenameWikiRepository(ctx, repo, newRepoName); err != nil { if err = gitrepo.RenameRepository(ctx, repo.WikiStorageRepo(), repo_model.StorageRepo(
repo_model.RelativeWikiPath(repo.OwnerName, newRepoName))); err != nil {
return fmt.Errorf("rename repository wiki: %w", err) return fmt.Errorf("rename repository wiki: %w", err)
} }
} }

View File

@ -35,7 +35,7 @@ func getWikiWorkingLockKey(repoID int64) string {
// InitWiki initializes a wiki for repository, // InitWiki initializes a wiki for repository,
// it does nothing when repository already has wiki. // it does nothing when repository already has wiki.
func InitWiki(ctx context.Context, repo *repo_model.Repository) error { func InitWiki(ctx context.Context, repo *repo_model.Repository) error {
if exist, err := gitrepo.IsWikiRepositoryExist(ctx, repo); err != nil { if exist, err := gitrepo.IsRepositoryExist(ctx, repo.WikiStorageRepo()); err != nil {
return err return err
} else if exist { } else if exist {
return nil return nil
@ -365,7 +365,7 @@ func DeleteWiki(ctx context.Context, repo *repo_model.Repository) error {
return err return err
} }
if err := gitrepo.DeleteWikiRepository(ctx, repo); err != nil { if err := gitrepo.DeleteRepository(ctx, repo.WikiStorageRepo()); err != nil {
desc := fmt.Sprintf("Delete wiki repository files [%s]: %v", repo.FullName(), err) desc := fmt.Sprintf("Delete wiki repository files [%s]: %v", repo.FullName(), err)
// Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled // Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled
if err = system_model.CreateNotice(db.DefaultContext, system_model.NoticeRepository, desc); err != nil { if err = system_model.CreateNotice(db.DefaultContext, system_model.NoticeRepository, desc); err != nil {
@ -386,7 +386,7 @@ func ChangeDefaultWikiBranch(ctx context.Context, repo *repo_model.Repository, n
return fmt.Errorf("unable to update database: %w", err) return fmt.Errorf("unable to update database: %w", err)
} }
if exist, err := gitrepo.IsWikiRepositoryExist(ctx, repo); err != nil { if exist, err := gitrepo.IsRepositoryExist(ctx, repo.WikiStorageRepo()); err != nil {
return err return err
} else if !exist { } else if !exist {
return nil return nil

View File

@ -149,7 +149,7 @@ func TestRepository_InitWiki(t *testing.T) {
// repo2 does not already have a wiki // repo2 does not already have a wiki
repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
assert.NoError(t, InitWiki(git.DefaultContext, repo2)) assert.NoError(t, InitWiki(git.DefaultContext, repo2))
exist, err := gitrepo.IsWikiRepositoryExist(git.DefaultContext, repo2) exist, err := gitrepo.IsRepositoryExist(git.DefaultContext, repo2.WikiStorageRepo())
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, exist) assert.True(t, exist)
} }