Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove HasWiki method and use IsWikiRepositoryExist #33912

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion models/repo/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,10 @@ func RelativePath(ownerName, repoName string) string {
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
func (repo *Repository) RelativePath() string {
return RelativePath(repo.OwnerName, repo.Name)
Expand All @@ -232,7 +236,7 @@ func (sr StorageRepo) RelativePath() string {
}

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
Expand Down
10 changes: 0 additions & 10 deletions models/repo/wiki.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"strings"

user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/util"
)

Expand Down Expand Up @@ -86,12 +85,3 @@ func WikiPath(userName, repoName string) string {
func (repo *Repository) WikiPath() string {
return WikiPath(repo.OwnerName, repo.Name)
}

// HasWiki returns true if repository has wiki.
func (repo *Repository) HasWiki() bool {
isDir, err := util.IsDir(repo.WikiPath())
if err != nil {
log.Error("Unable to check if %s is a directory: %v", repo.WikiPath(), err)
}
return isDir
}
10 changes: 8 additions & 2 deletions models/repo/wiki_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (

repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest"
"code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/setting"

"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -39,7 +40,12 @@ func TestRepository_WikiPath(t *testing.T) {
func TestRepository_HasWiki(t *testing.T) {
unittest.PrepareTestEnv(t)
repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
assert.True(t, repo1.HasWiki())
exist, err := gitrepo.IsRepositoryExist(t.Context(), repo1.WikiStorageRepo())
assert.NoError(t, err)
assert.True(t, exist)

repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
assert.False(t, repo2.HasWiki())
exist, err = gitrepo.IsRepositoryExist(t.Context(), repo2.WikiStorageRepo())
assert.NoError(t, err)
assert.False(t, exist)
}
35 changes: 30 additions & 5 deletions routers/web/repo/wiki.go
Original file line number Diff line number Diff line change
Expand Up @@ -557,7 +557,12 @@ func Wiki(ctx *context.Context) {
return
}

if !ctx.Repo.Repository.HasWiki() {
hasWiki, err := gitrepo.IsRepositoryExist(ctx, ctx.Repo.Repository.WikiStorageRepo())
if err != nil {
ctx.ServerError("IsWikiRepositoryExist", err)
return
}
if !hasWiki {
ctx.Data["Title"] = ctx.Tr("repo.wiki")
ctx.HTML(http.StatusOK, tplWikiStart)
return
Expand Down Expand Up @@ -598,7 +603,12 @@ func Wiki(ctx *context.Context) {
func WikiRevision(ctx *context.Context) {
ctx.Data["CanWriteWiki"] = ctx.Repo.CanWrite(unit.TypeWiki) && !ctx.Repo.Repository.IsArchived

if !ctx.Repo.Repository.HasWiki() {
hasWiki, err := gitrepo.IsRepositoryExist(ctx, ctx.Repo.Repository.WikiStorageRepo())
if err != nil {
ctx.ServerError("IsWikiRepositoryExist", err)
return
}
if !hasWiki {
ctx.Data["Title"] = ctx.Tr("repo.wiki")
ctx.HTML(http.StatusOK, tplWikiStart)
return
Expand Down Expand Up @@ -634,7 +644,12 @@ func WikiRevision(ctx *context.Context) {

// WikiPages render wiki pages list page
func WikiPages(ctx *context.Context) {
if !ctx.Repo.Repository.HasWiki() {
hasWiki, err := gitrepo.IsRepositoryExist(ctx, ctx.Repo.Repository.WikiStorageRepo())
if err != nil {
ctx.ServerError("IsWikiRepositoryExist", err)
return
}
if !hasWiki {
ctx.Redirect(ctx.Repo.RepoLink + "/wiki")
return
}
Expand Down Expand Up @@ -753,7 +768,12 @@ func WikiRaw(ctx *context.Context) {
func NewWiki(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("repo.wiki.new_page")

if !ctx.Repo.Repository.HasWiki() {
hasWiki, err := gitrepo.IsRepositoryExist(ctx, ctx.Repo.Repository.WikiStorageRepo())
if err != nil {
ctx.ServerError("IsWikiRepositoryExist", err)
return
}
if !hasWiki {
ctx.Data["title"] = "Home"
}
if ctx.FormString("title") != "" {
Expand Down Expand Up @@ -806,7 +826,12 @@ func NewWikiPost(ctx *context.Context) {
func EditWiki(ctx *context.Context) {
ctx.Data["PageIsWikiEdit"] = true

if !ctx.Repo.Repository.HasWiki() {
hasWiki, err := gitrepo.IsRepositoryExist(ctx, ctx.Repo.Repository.WikiStorageRepo())
if err != nil {
ctx.ServerError("IsWikiRepositoryExist", err)
return
}
if !hasWiki {
ctx.Redirect(ctx.Repo.RepoLink + "/wiki")
return
}
Expand Down
4 changes: 3 additions & 1 deletion routers/web/repo/wiki_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,9 @@ func TestDefaultWikiBranch(t *testing.T) {

// repo with no wiki
repoWithNoWiki := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
assert.False(t, repoWithNoWiki.HasWiki())
exist, err := gitrepo.IsRepositoryExist(db.DefaultContext, repoWithNoWiki.WikiStorageRepo())
assert.NoError(t, err)
assert.False(t, exist)
assert.NoError(t, wiki_service.ChangeDefaultWikiBranch(db.DefaultContext, repoWithNoWiki, "main"))

// repo with wiki
Expand Down
4 changes: 3 additions & 1 deletion services/migrations/gitea_uploader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ func TestGiteaUploadRepo(t *testing.T) {
assert.NoError(t, err)

repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, Name: repoName})
assert.True(t, repo.HasWiki())
exist, err := gitrepo.IsRepositoryExist(ctx, repo)
assert.NoError(t, err)
assert.True(t, exist)
assert.EqualValues(t, repo_model.RepositoryReady, repo.Status)

milestones, err := db.Find[issues_model.Milestone](db.DefaultContext, issues_model.FindMilestoneOptions{
Expand Down
16 changes: 12 additions & 4 deletions services/mirror/mirror_pull.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,11 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error
return err
}

if m.Repo.HasWiki() {
hasWiki, err := gitrepo.IsRepositoryExist(ctx, m.Repo.WikiStorageRepo())
if err != nil {
return err
}
if hasWiki {
wikiPath := m.Repo.WikiPath()
wikiRemotePath := repo_module.WikiRemoteURL(ctx, addr)
// Remove old remote of wiki
Expand Down Expand Up @@ -339,17 +343,21 @@ func runSync(ctx context.Context, m *repo_model.Mirror) ([]*mirrorSyncResult, bo
endpoint := lfs.DetermineEndpoint(remoteURL.String(), m.LFSEndpoint)
lfsClient := lfs.NewClient(endpoint, nil)
if err = repo_module.StoreMissingLfsObjectsInRepository(ctx, m.Repo, gitRepo, lfsClient); err != nil {
log.Error("SyncMirrors [repo: %-v]: failed to synchronize LFS objects for repository: %v", m.Repo, err)
log.Error("SyncMirrors [repo: %-v]: failed to synchronize LFS objects for repository: %v", m.Repo.FullName(), err)
}
}
gitRepo.Close()

log.Trace("SyncMirrors [repo: %-v]: updating size of repository", m.Repo)
if err := repo_module.UpdateRepoSize(ctx, m.Repo); err != nil {
log.Error("SyncMirrors [repo: %-v]: failed to update size for mirror repository: %v", m.Repo, err)
log.Error("SyncMirrors [repo: %-v]: failed to update size for mirror repository: %v", m.Repo.FullName(), err)
}

if m.Repo.HasWiki() {
hasWiki, err := gitrepo.IsRepositoryExist(ctx, m.Repo.WikiStorageRepo())
if err != nil {
log.Error("SyncMirrors [repo: %-v]: failed to check if wiki repository exists: %v", m.Repo.FullName(), err)
}
if hasWiki {
log.Trace("SyncMirrors [repo: %-v Wiki]: running git remote update...", m.Repo)
stderrBuilder.Reset()
stdoutBuilder.Reset()
Expand Down
18 changes: 15 additions & 3 deletions services/mirror/mirror_push.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,11 @@ func AddPushMirrorRemote(ctx context.Context, m *repo_model.PushMirror, addr str
return err
}

if m.Repo.HasWiki() {
hasWiki, err := gitrepo.IsRepositoryExist(ctx, m.Repo.WikiStorageRepo())
if err != nil {
return err
}
if hasWiki {
wikiRemoteURL := repository.WikiRemoteURL(ctx, addr)
if len(wikiRemoteURL) > 0 {
if err := addRemoteAndConfig(wikiRemoteURL, m.Repo.WikiPath()); err != nil {
Expand All @@ -68,7 +72,11 @@ func RemovePushMirrorRemote(ctx context.Context, m *repo_model.PushMirror) error
return err
}

if m.Repo.HasWiki() {
hasWiki, err := gitrepo.IsRepositoryExist(ctx, m.Repo.WikiStorageRepo())
if err != nil {
return err
}
if hasWiki {
if _, _, err := cmd.RunStdString(ctx, &git.RunOpts{Dir: m.Repo.WikiPath()}); err != nil {
// The wiki remote may not exist
log.Warn("Wiki Remote[%d] could not be removed: %v", m.ID, err)
Expand Down Expand Up @@ -183,7 +191,11 @@ func runPushSync(ctx context.Context, m *repo_model.PushMirror) error {
return err
}

if m.Repo.HasWiki() {
hasWiki, err := gitrepo.IsRepositoryExist(ctx, m.Repo.WikiStorageRepo())
if err != nil {
return err
}
if hasWiki {
_, err := git.GetRemoteAddress(ctx, m.Repo.WikiPath(), m.RemoteName)
if err == nil {
err := performPush(m.Repo, true)
Expand Down
10 changes: 7 additions & 3 deletions services/repository/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -298,9 +298,13 @@ func DeleteRepositoryDirectly(ctx context.Context, doer *user_model.User, repoID
}
}

// Remove wiki files
if repo.HasWiki() {
system_model.RemoveAllWithNotice(ctx, "Delete repository wiki", repo.WikiPath())
// Remove wiki files if it exists.
if err := gitrepo.DeleteRepository(ctx, repo.WikiStorageRepo()); err != nil {
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
if err = system_model.CreateNotice(db.DefaultContext, system_model.NoticeRepository, desc); err != nil {
log.Error("CreateRepositoryNotice: %v", err)
}
}

// Remove archives
Expand Down
10 changes: 7 additions & 3 deletions services/repository/hooks.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,15 @@ func SyncRepositoryHooks(ctx context.Context) error {
}

if err := gitrepo.CreateDelegateHooks(ctx, repo); err != nil {
return fmt.Errorf("SyncRepositoryHook: %w", err)
return fmt.Errorf("CreateDelegateHooks: %w", err)
}
if repo.HasWiki() {
exist, err := gitrepo.IsRepositoryExist(ctx, repo.WikiStorageRepo())
if err != nil {
return fmt.Errorf("IsRepositoryExist: %w", err)
}
if exist {
if err := gitrepo.CreateDelegateHooks(ctx, repo.WikiStorageRepo()); err != nil {
return fmt.Errorf("SyncRepositoryHook: %w", err)
return fmt.Errorf("CreateDelegateHooks: %w", err)
}
}
return nil
Expand Down
11 changes: 8 additions & 3 deletions services/repository/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -268,18 +268,23 @@ func CleanUpMigrateInfo(ctx context.Context, repo *repo_model.Repository) (*repo
if err := gitrepo.CreateDelegateHooks(ctx, repo); err != nil {
return repo, fmt.Errorf("createDelegateHooks: %w", err)
}
if repo.HasWiki() {

hasWiki, err := gitrepo.IsRepositoryExist(ctx, repo.WikiStorageRepo())
if err != nil {
return repo, fmt.Errorf("IsWikiRepositoryExist: %w", err)
}
if hasWiki {
if err := gitrepo.CreateDelegateHooks(ctx, repo.WikiStorageRepo()); err != nil {
return repo, fmt.Errorf("createDelegateHooks.(wiki): %w", err)
}
}

_, _, err := git.NewCommand("remote", "rm", "origin").RunStdString(ctx, &git.RunOpts{Dir: repo.RepoPath()})
_, _, err = git.NewCommand("remote", "rm", "origin").RunStdString(ctx, &git.RunOpts{Dir: repo.RepoPath()})
if err != nil && !git.IsRemoteNotExistError(err) {
return repo, fmt.Errorf("CleanUpMigrateInfo: %w", err)
}

if repo.HasWiki() {
if hasWiki {
if err := cleanUpMigrateGitConfig(ctx, repo.WikiPath()); err != nil {
return repo, fmt.Errorf("cleanUpMigrateGitConfig (wiki): %w", err)
}
Expand Down
8 changes: 4 additions & 4 deletions services/repository/transfer.go
Original file line number Diff line number Diff line change
Expand Up @@ -341,14 +341,14 @@ func changeRepositoryName(ctx context.Context, repo *repo_model.Repository, newR
return fmt.Errorf("rename repository directory: %w", err)
}

wikiPath := repo.WikiPath()
isExist, err := util.IsExist(wikiPath)
isExist, err := gitrepo.IsRepositoryExist(ctx, repo.WikiStorageRepo())
if err != nil {
log.Error("Unable to check if %s exists. Error: %v", wikiPath, err)
log.Error("Unable to check if the wiki of %s exists. Error: %v", repo.FullName(), err)
return err
}
if isExist {
if err = util.Rename(wikiPath, repo_model.WikiPath(repo.Owner.Name, 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)
}
}
Expand Down
17 changes: 14 additions & 3 deletions services/wiki/wiki.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ func getWikiWorkingLockKey(repoID int64) string {
// InitWiki initializes a wiki for repository,
// it does nothing when repository already has wiki.
func InitWiki(ctx context.Context, repo *repo_model.Repository) error {
if repo.HasWiki() {
if exist, err := gitrepo.IsRepositoryExist(ctx, repo.WikiStorageRepo()); err != nil {
return err
} else if exist {
return nil
}

Expand Down Expand Up @@ -363,7 +365,14 @@ func DeleteWiki(ctx context.Context, repo *repo_model.Repository) error {
return err
}

system_model.RemoveAllWithNotice(ctx, "Delete repository wiki", repo.WikiPath())
if err := gitrepo.DeleteRepository(ctx, repo.WikiStorageRepo()); err != nil {
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
if err = system_model.CreateNotice(db.DefaultContext, system_model.NoticeRepository, desc); err != nil {
log.Error("CreateRepositoryNotice: %v", err)
}
}

return nil
}

Expand All @@ -377,7 +386,9 @@ func ChangeDefaultWikiBranch(ctx context.Context, repo *repo_model.Repository, n
return fmt.Errorf("unable to update database: %w", err)
}

if !repo.HasWiki() {
if exist, err := gitrepo.IsRepositoryExist(ctx, repo.WikiStorageRepo()); err != nil {
return err
} else if !exist {
return nil
}

Expand Down
4 changes: 3 additions & 1 deletion services/wiki/wiki_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,9 @@ func TestRepository_InitWiki(t *testing.T) {
// repo2 does not already have a wiki
repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
assert.NoError(t, InitWiki(git.DefaultContext, repo2))
assert.True(t, repo2.HasWiki())
exist, err := gitrepo.IsRepositoryExist(git.DefaultContext, repo2.WikiStorageRepo())
assert.NoError(t, err)
assert.True(t, exist)
}

func TestRepository_AddWikiPage(t *testing.T) {
Expand Down