* move models.PushUpdate to repofiles.PushUpdate * remove duplicated code to load repotags/v1.11.0-dev
| @@ -495,8 +495,8 @@ func SyncReleasesWithTags(repo *Repository, gitRepo *git.Repository) error { | |||||
| return fmt.Errorf("GetTagCommitID: %v", err) | return fmt.Errorf("GetTagCommitID: %v", err) | ||||
| } | } | ||||
| if git.IsErrNotExist(err) || commitID != rel.Sha1 { | 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 { | } else { | ||||
| existingRelTags[strings.ToLower(rel.TagName)] = struct{}{} | existingRelTags[strings.ToLower(rel.TagName)] = struct{}{} | ||||
| @@ -509,7 +509,7 @@ func SyncReleasesWithTags(repo *Repository, gitRepo *git.Repository) error { | |||||
| } | } | ||||
| for _, tagName := range tags { | for _, tagName := range tags { | ||||
| if _, ok := existingRelTags[strings.ToLower(tagName)]; !ok { | 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) | return fmt.Errorf("pushUpdateAddTag: %v", err) | ||||
| } | } | ||||
| } | } | ||||
| @@ -10,9 +10,7 @@ import ( | |||||
| "strings" | "strings" | ||||
| "time" | "time" | ||||
| "code.gitea.io/gitea/modules/cache" | |||||
| "code.gitea.io/gitea/modules/git" | "code.gitea.io/gitea/modules/git" | ||||
| "code.gitea.io/gitea/modules/log" | |||||
| "code.gitea.io/gitea/modules/util" | "code.gitea.io/gitea/modules/util" | ||||
| ) | ) | ||||
| @@ -64,26 +62,8 @@ type PushUpdateOptions struct { | |||||
| NewCommitID string | 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) | rel, err := GetRelease(repo.ID, tagName) | ||||
| if err != nil { | if err != nil { | ||||
| if IsErrReleaseNotExist(err) { | if IsErrReleaseNotExist(err) { | ||||
| @@ -107,7 +87,8 @@ func pushUpdateDeleteTag(repo *Repository, tagName string) error { | |||||
| return nil | 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) | rel, err := GetRelease(repo.ID, tagName) | ||||
| if err != nil && !IsErrReleaseNotExist(err) { | if err != nil && !IsErrReleaseNotExist(err) { | ||||
| return fmt.Errorf("GetRelease: %v", err) | return fmt.Errorf("GetRelease: %v", err) | ||||
| @@ -182,95 +163,3 @@ func pushUpdateAddTag(repo *Repository, gitRepo *git.Repository, tagName string) | |||||
| } | } | ||||
| return nil | 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 | |||||
| } | |||||
| @@ -6,6 +6,7 @@ package repofiles | |||||
| import ( | import ( | ||||
| "bytes" | "bytes" | ||||
| "container/list" | |||||
| "fmt" | "fmt" | ||||
| "path" | "path" | ||||
| "strings" | "strings" | ||||
| @@ -15,6 +16,7 @@ import ( | |||||
| "code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
| "code.gitea.io/gitea/modules/base" | "code.gitea.io/gitea/modules/base" | ||||
| "code.gitea.io/gitea/modules/cache" | |||||
| "code.gitea.io/gitea/modules/git" | "code.gitea.io/gitea/modules/git" | ||||
| "code.gitea.io/gitea/modules/lfs" | "code.gitea.io/gitea/modules/lfs" | ||||
| "code.gitea.io/gitea/modules/log" | "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 | // PushUpdate must be called for any push actions in order to | ||||
| // generates necessary push action history feeds and other operations | // generates necessary push action history feeds and other operations | ||||
| func PushUpdate(repo *models.Repository, branch string, opts models.PushUpdateOptions) error { | 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 { | 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 { | if opts.RefFullName == git.BranchPrefix+repo.DefaultBranch { | ||||
| models.UpdateRepoIndexer(repo) | models.UpdateRepoIndexer(repo) | ||||
| } | } | ||||