From 2c5c458dd70a0651b137d1af62fb50de5af4e9af Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 24 Jul 2019 15:13:26 +0800 Subject: [PATCH] Move models.PushUpdate to repofiles.PushUpdate (#7485) * move models.PushUpdate to repofiles.PushUpdate * remove duplicated code to load repo --- models/release.go | 6 +- models/update.go | 119 ++---------------------------------- modules/repofiles/update.go | 89 ++++++++++++++++++++++++++- 3 files changed, 94 insertions(+), 120 deletions(-) diff --git a/models/release.go b/models/release.go index f8e8c17e7..ecb9d1e44 100644 --- a/models/release.go +++ b/models/release.go @@ -495,8 +495,8 @@ func SyncReleasesWithTags(repo *Repository, gitRepo *git.Repository) error { return fmt.Errorf("GetTagCommitID: %v", err) } if git.IsErrNotExist(err) || commitID != rel.Sha1 { - if err := pushUpdateDeleteTag(repo, rel.TagName); err != nil { - return fmt.Errorf("pushUpdateDeleteTag: %v", err) + if err := PushUpdateDeleteTag(repo, rel.TagName); err != nil { + return fmt.Errorf("PushUpdateDeleteTag: %v", err) } } else { existingRelTags[strings.ToLower(rel.TagName)] = struct{}{} @@ -509,7 +509,7 @@ func SyncReleasesWithTags(repo *Repository, gitRepo *git.Repository) error { } for _, tagName := range tags { if _, ok := existingRelTags[strings.ToLower(tagName)]; !ok { - if err := pushUpdateAddTag(repo, gitRepo, tagName); err != nil { + if err := PushUpdateAddTag(repo, gitRepo, tagName); err != nil { return fmt.Errorf("pushUpdateAddTag: %v", err) } } diff --git a/models/update.go b/models/update.go index 411f7d5be..a19df70b3 100644 --- a/models/update.go +++ b/models/update.go @@ -10,9 +10,7 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/cache" "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/util" ) @@ -64,26 +62,8 @@ type PushUpdateOptions struct { NewCommitID string } -// PushUpdate must be called for any push actions in order to -// generates necessary push action history feeds. -func PushUpdate(branch string, opt PushUpdateOptions) error { - repo, err := pushUpdate(opt) - if err != nil { - return err - } - - pusher, err := GetUserByID(opt.PusherID) - if err != nil { - return err - } - - log.Trace("TriggerTask '%s/%s' by %s", repo.Name, branch, pusher.Name) - - go AddTestPullRequestTask(pusher, repo.ID, branch, true) - return nil -} - -func pushUpdateDeleteTag(repo *Repository, tagName string) error { +// PushUpdateDeleteTag must be called for any push actions to delete tag +func PushUpdateDeleteTag(repo *Repository, tagName string) error { rel, err := GetRelease(repo.ID, tagName) if err != nil { if IsErrReleaseNotExist(err) { @@ -107,7 +87,8 @@ func pushUpdateDeleteTag(repo *Repository, tagName string) error { return nil } -func pushUpdateAddTag(repo *Repository, gitRepo *git.Repository, tagName string) error { +// PushUpdateAddTag must be called for any push actions to add tag +func PushUpdateAddTag(repo *Repository, gitRepo *git.Repository, tagName string) error { rel, err := GetRelease(repo.ID, tagName) if err != nil && !IsErrReleaseNotExist(err) { return fmt.Errorf("GetRelease: %v", err) @@ -182,95 +163,3 @@ func pushUpdateAddTag(repo *Repository, gitRepo *git.Repository, tagName string) } return nil } - -func pushUpdate(opts PushUpdateOptions) (repo *Repository, err error) { - isNewRef := opts.OldCommitID == git.EmptySHA - isDelRef := opts.NewCommitID == git.EmptySHA - if isNewRef && isDelRef { - return nil, fmt.Errorf("Old and new revisions are both %s", git.EmptySHA) - } - - repoPath := RepoPath(opts.RepoUserName, opts.RepoName) - - _, err = git.NewCommand("update-server-info").RunInDir(repoPath) - if err != nil { - return nil, fmt.Errorf("Failed to call 'git update-server-info': %v", err) - } - - owner, err := GetUserByName(opts.RepoUserName) - if err != nil { - return nil, fmt.Errorf("GetUserByName: %v", err) - } - - repo, err = GetRepositoryByName(owner.ID, opts.RepoName) - if err != nil { - return nil, fmt.Errorf("GetRepositoryByName: %v", err) - } - - gitRepo, err := git.OpenRepository(repoPath) - if err != nil { - return nil, fmt.Errorf("OpenRepository: %v", err) - } - - if err = repo.UpdateSize(); err != nil { - log.Error("Failed to update size for repository: %v", err) - } - - var commits = &PushCommits{} - if strings.HasPrefix(opts.RefFullName, git.TagPrefix) { - // If is tag reference - tagName := opts.RefFullName[len(git.TagPrefix):] - if isDelRef { - err = pushUpdateDeleteTag(repo, tagName) - if err != nil { - return nil, fmt.Errorf("pushUpdateDeleteTag: %v", err) - } - } else { - // Clear cache for tag commit count - cache.Remove(repo.GetCommitsCountCacheKey(tagName, true)) - err = pushUpdateAddTag(repo, gitRepo, tagName) - if err != nil { - return nil, fmt.Errorf("pushUpdateAddTag: %v", err) - } - } - } else if !isDelRef { - // If is branch reference - - // Clear cache for branch commit count - cache.Remove(repo.GetCommitsCountCacheKey(opts.RefFullName[len(git.BranchPrefix):], true)) - - newCommit, err := gitRepo.GetCommit(opts.NewCommitID) - if err != nil { - return nil, fmt.Errorf("gitRepo.GetCommit: %v", err) - } - - // Push new branch. - var l *list.List - if isNewRef { - l, err = newCommit.CommitsBeforeLimit(10) - if err != nil { - return nil, fmt.Errorf("newCommit.CommitsBeforeLimit: %v", err) - } - } else { - l, err = newCommit.CommitsBeforeUntil(opts.OldCommitID) - if err != nil { - return nil, fmt.Errorf("newCommit.CommitsBeforeUntil: %v", err) - } - } - - commits = ListToPushCommits(l) - } - - if err := CommitRepoAction(CommitRepoActionOptions{ - PusherName: opts.PusherName, - RepoOwnerID: owner.ID, - RepoName: repo.Name, - RefFullName: opts.RefFullName, - OldCommitID: opts.OldCommitID, - NewCommitID: opts.NewCommitID, - Commits: commits, - }); err != nil { - return nil, fmt.Errorf("CommitRepoAction: %v", err) - } - return repo, nil -} diff --git a/modules/repofiles/update.go b/modules/repofiles/update.go index 38f2f22c9..118970487 100644 --- a/modules/repofiles/update.go +++ b/modules/repofiles/update.go @@ -6,6 +6,7 @@ package repofiles import ( "bytes" + "container/list" "fmt" "path" "strings" @@ -15,6 +16,7 @@ import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/cache" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/lfs" "code.gitea.io/gitea/modules/log" @@ -428,11 +430,94 @@ func CreateOrUpdateRepoFile(repo *models.Repository, doer *models.User, opts *Up // PushUpdate must be called for any push actions in order to // generates necessary push action history feeds and other operations func PushUpdate(repo *models.Repository, branch string, opts models.PushUpdateOptions) error { - err := models.PushUpdate(branch, opts) + isNewRef := opts.OldCommitID == git.EmptySHA + isDelRef := opts.NewCommitID == git.EmptySHA + if isNewRef && isDelRef { + return fmt.Errorf("Old and new revisions are both %s", git.EmptySHA) + } + + repoPath := models.RepoPath(opts.RepoUserName, opts.RepoName) + + _, err := git.NewCommand("update-server-info").RunInDir(repoPath) if err != nil { - return fmt.Errorf("PushUpdate: %v", err) + return fmt.Errorf("Failed to call 'git update-server-info': %v", err) } + gitRepo, err := git.OpenRepository(repoPath) + if err != nil { + return fmt.Errorf("OpenRepository: %v", err) + } + + if err = repo.UpdateSize(); err != nil { + log.Error("Failed to update size for repository: %v", err) + } + + var commits = &models.PushCommits{} + if strings.HasPrefix(opts.RefFullName, git.TagPrefix) { + // If is tag reference + tagName := opts.RefFullName[len(git.TagPrefix):] + if isDelRef { + err = models.PushUpdateDeleteTag(repo, tagName) + if err != nil { + return fmt.Errorf("PushUpdateDeleteTag: %v", err) + } + } else { + // Clear cache for tag commit count + cache.Remove(repo.GetCommitsCountCacheKey(tagName, true)) + err = models.PushUpdateAddTag(repo, gitRepo, tagName) + if err != nil { + return fmt.Errorf("PushUpdateAddTag: %v", err) + } + } + } else if !isDelRef { + // If is branch reference + + // Clear cache for branch commit count + cache.Remove(repo.GetCommitsCountCacheKey(opts.RefFullName[len(git.BranchPrefix):], true)) + + newCommit, err := gitRepo.GetCommit(opts.NewCommitID) + if err != nil { + return fmt.Errorf("gitRepo.GetCommit: %v", err) + } + + // Push new branch. + var l *list.List + if isNewRef { + l, err = newCommit.CommitsBeforeLimit(10) + if err != nil { + return fmt.Errorf("newCommit.CommitsBeforeLimit: %v", err) + } + } else { + l, err = newCommit.CommitsBeforeUntil(opts.OldCommitID) + if err != nil { + return fmt.Errorf("newCommit.CommitsBeforeUntil: %v", err) + } + } + + commits = models.ListToPushCommits(l) + } + + if err := models.CommitRepoAction(models.CommitRepoActionOptions{ + PusherName: opts.PusherName, + RepoOwnerID: repo.OwnerID, + RepoName: repo.Name, + RefFullName: opts.RefFullName, + OldCommitID: opts.OldCommitID, + NewCommitID: opts.NewCommitID, + Commits: commits, + }); err != nil { + return fmt.Errorf("CommitRepoAction: %v", err) + } + + pusher, err := models.GetUserByID(opts.PusherID) + if err != nil { + return err + } + + log.Trace("TriggerTask '%s/%s' by %s", repo.Name, branch, pusher.Name) + + go models.AddTestPullRequestTask(pusher, repo.ID, branch, true) + if opts.RefFullName == git.BranchPrefix+repo.DefaultBranch { models.UpdateRepoIndexer(repo) }