Refactor: Move PushUpdateOptions (#13363)
Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									dd12384f22
								
							
						
					
					
						commit
						4df2ed29f2
					
				
					 15 changed files with 169 additions and 146 deletions
				
			
		|  | @ -275,7 +275,7 @@ func (*actionNotifier) NotifyMergePullRequest(pr *models.PullRequest, doer *mode | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (a *actionNotifier) NotifySyncPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) { | func (a *actionNotifier) NotifySyncPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { | ||||||
| 	data, err := json.Marshal(commits) | 	data, err := json.Marshal(commits) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Error("json.Marshal: %v", err) | 		log.Error("json.Marshal: %v", err) | ||||||
|  | @ -289,7 +289,7 @@ func (a *actionNotifier) NotifySyncPushCommits(pusher *models.User, repo *models | ||||||
| 		RepoID:    repo.ID, | 		RepoID:    repo.ID, | ||||||
| 		Repo:      repo, | 		Repo:      repo, | ||||||
| 		IsPrivate: repo.IsPrivate, | 		IsPrivate: repo.IsPrivate, | ||||||
| 		RefName:   refName, | 		RefName:   opts.RefFullName, | ||||||
| 		Content:   string(data), | 		Content:   string(data), | ||||||
| 	}); err != nil { | 	}); err != nil { | ||||||
| 		log.Error("notifyWatchers: %v", err) | 		log.Error("notifyWatchers: %v", err) | ||||||
|  |  | ||||||
|  | @ -48,11 +48,11 @@ type Notifier interface { | ||||||
| 	NotifyUpdateRelease(doer *models.User, rel *models.Release) | 	NotifyUpdateRelease(doer *models.User, rel *models.Release) | ||||||
| 	NotifyDeleteRelease(doer *models.User, rel *models.Release) | 	NotifyDeleteRelease(doer *models.User, rel *models.Release) | ||||||
| 
 | 
 | ||||||
| 	NotifyPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) | 	NotifyPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) | ||||||
| 	NotifyCreateRef(doer *models.User, repo *models.Repository, refType, refFullName string) | 	NotifyCreateRef(doer *models.User, repo *models.Repository, refType, refFullName string) | ||||||
| 	NotifyDeleteRef(doer *models.User, repo *models.Repository, refType, refFullName string) | 	NotifyDeleteRef(doer *models.User, repo *models.Repository, refType, refFullName string) | ||||||
| 
 | 
 | ||||||
| 	NotifySyncPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) | 	NotifySyncPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) | ||||||
| 	NotifySyncCreateRef(doer *models.User, repo *models.Repository, refType, refFullName string) | 	NotifySyncCreateRef(doer *models.User, repo *models.Repository, refType, refFullName string) | ||||||
| 	NotifySyncDeleteRef(doer *models.User, repo *models.Repository, refType, refFullName string) | 	NotifySyncDeleteRef(doer *models.User, repo *models.Repository, refType, refFullName string) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -128,7 +128,7 @@ func (*NullNotifier) NotifyMigrateRepository(doer *models.User, u *models.User, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NotifyPushCommits notifies commits pushed to notifiers
 | // NotifyPushCommits notifies commits pushed to notifiers
 | ||||||
| func (*NullNotifier) NotifyPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) { | func (*NullNotifier) NotifyPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NotifyCreateRef notifies branch or tag creation to notifiers
 | // NotifyCreateRef notifies branch or tag creation to notifiers
 | ||||||
|  | @ -148,7 +148,7 @@ func (*NullNotifier) NotifyTransferRepository(doer *models.User, repo *models.Re | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NotifySyncPushCommits places a place holder function
 | // NotifySyncPushCommits places a place holder function
 | ||||||
| func (*NullNotifier) NotifySyncPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) { | func (*NullNotifier) NotifySyncPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NotifySyncCreateRef places a place holder function
 | // NotifySyncCreateRef places a place holder function
 | ||||||
|  |  | ||||||
|  | @ -123,8 +123,8 @@ func (r *indexerNotifier) NotifyMigrateRepository(doer *models.User, u *models.U | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *indexerNotifier) NotifyPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) { | func (r *indexerNotifier) NotifyPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { | ||||||
| 	if setting.Indexer.RepoIndexerEnabled && refName == git.BranchPrefix+repo.DefaultBranch { | 	if setting.Indexer.RepoIndexerEnabled && opts.RefFullName == git.BranchPrefix+repo.DefaultBranch { | ||||||
| 		code_indexer.UpdateRepoIndexer(repo) | 		code_indexer.UpdateRepoIndexer(repo) | ||||||
| 	} | 	} | ||||||
| 	if err := stats_indexer.UpdateRepoIndexer(repo); err != nil { | 	if err := stats_indexer.UpdateRepoIndexer(repo); err != nil { | ||||||
|  | @ -132,8 +132,8 @@ func (r *indexerNotifier) NotifyPushCommits(pusher *models.User, repo *models.Re | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *indexerNotifier) NotifySyncPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) { | func (r *indexerNotifier) NotifySyncPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { | ||||||
| 	if setting.Indexer.RepoIndexerEnabled && refName == git.BranchPrefix+repo.DefaultBranch { | 	if setting.Indexer.RepoIndexerEnabled && opts.RefFullName == git.BranchPrefix+repo.DefaultBranch { | ||||||
| 		code_indexer.UpdateRepoIndexer(repo) | 		code_indexer.UpdateRepoIndexer(repo) | ||||||
| 	} | 	} | ||||||
| 	if err := stats_indexer.UpdateRepoIndexer(repo); err != nil { | 	if err := stats_indexer.UpdateRepoIndexer(repo); err != nil { | ||||||
|  |  | ||||||
|  | @ -236,9 +236,9 @@ func NotifyRenameRepository(doer *models.User, repo *models.Repository, oldName | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NotifyPushCommits notifies commits pushed to notifiers
 | // NotifyPushCommits notifies commits pushed to notifiers
 | ||||||
| func NotifyPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) { | func NotifyPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { | ||||||
| 	for _, notifier := range notifiers { | 	for _, notifier := range notifiers { | ||||||
| 		notifier.NotifyPushCommits(pusher, repo, refName, oldCommitID, newCommitID, commits) | 		notifier.NotifyPushCommits(pusher, repo, opts, commits) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -257,9 +257,9 @@ func NotifyDeleteRef(pusher *models.User, repo *models.Repository, refType, refF | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NotifySyncPushCommits notifies commits pushed to notifiers
 | // NotifySyncPushCommits notifies commits pushed to notifiers
 | ||||||
| func NotifySyncPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) { | func NotifySyncPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { | ||||||
| 	for _, notifier := range notifiers { | 	for _, notifier := range notifiers { | ||||||
| 		notifier.NotifySyncPushCommits(pusher, repo, refName, oldCommitID, newCommitID, commits) | 		notifier.NotifySyncPushCommits(pusher, repo, opts, commits) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -548,7 +548,7 @@ func (m *webhookNotifier) NotifyIssueChangeMilestone(doer *models.User, issue *m | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *webhookNotifier) NotifyPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) { | func (m *webhookNotifier) NotifyPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { | ||||||
| 	apiPusher := convert.ToUser(pusher, false, false) | 	apiPusher := convert.ToUser(pusher, false, false) | ||||||
| 	apiCommits, err := commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL()) | 	apiCommits, err := commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL()) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -557,9 +557,9 @@ func (m *webhookNotifier) NotifyPushCommits(pusher *models.User, repo *models.Re | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := webhook_module.PrepareWebhooks(repo, models.HookEventPush, &api.PushPayload{ | 	if err := webhook_module.PrepareWebhooks(repo, models.HookEventPush, &api.PushPayload{ | ||||||
| 		Ref:        refName, | 		Ref:        opts.RefFullName, | ||||||
| 		Before:     oldCommitID, | 		Before:     opts.OldCommitID, | ||||||
| 		After:      newCommitID, | 		After:      opts.NewCommitID, | ||||||
| 		CompareURL: setting.AppURL + commits.CompareURL, | 		CompareURL: setting.AppURL + commits.CompareURL, | ||||||
| 		Commits:    apiCommits, | 		Commits:    apiCommits, | ||||||
| 		Repo:       repo.APIFormat(models.AccessModeOwner), | 		Repo:       repo.APIFormat(models.AccessModeOwner), | ||||||
|  | @ -776,7 +776,7 @@ func (m *webhookNotifier) NotifyDeleteRelease(doer *models.User, rel *models.Rel | ||||||
| 	sendReleaseHook(doer, rel, api.HookReleaseDeleted) | 	sendReleaseHook(doer, rel, api.HookReleaseDeleted) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *webhookNotifier) NotifySyncPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) { | func (m *webhookNotifier) NotifySyncPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { | ||||||
| 	apiPusher := convert.ToUser(pusher, false, false) | 	apiPusher := convert.ToUser(pusher, false, false) | ||||||
| 	apiCommits, err := commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL()) | 	apiCommits, err := commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL()) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -785,9 +785,9 @@ func (m *webhookNotifier) NotifySyncPushCommits(pusher *models.User, repo *model | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := webhook_module.PrepareWebhooks(repo, models.HookEventPush, &api.PushPayload{ | 	if err := webhook_module.PrepareWebhooks(repo, models.HookEventPush, &api.PushPayload{ | ||||||
| 		Ref:        refName, | 		Ref:        opts.RefFullName, | ||||||
| 		Before:     oldCommitID, | 		Before:     opts.OldCommitID, | ||||||
| 		After:      newCommitID, | 		After:      opts.NewCommitID, | ||||||
| 		CompareURL: setting.AppURL + commits.CompareURL, | 		CompareURL: setting.AppURL + commits.CompareURL, | ||||||
| 		Commits:    apiCommits, | 		Commits:    apiCommits, | ||||||
| 		Repo:       repo.APIFormat(models.AccessModeOwner), | 		Repo:       repo.APIFormat(models.AccessModeOwner), | ||||||
|  |  | ||||||
							
								
								
									
										115
									
								
								modules/repository/push.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								modules/repository/push.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,115 @@ | ||||||
|  | // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a MIT-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | package repository | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"path/filepath" | ||||||
|  | 	"strings" | ||||||
|  | 
 | ||||||
|  | 	"code.gitea.io/gitea/modules/git" | ||||||
|  | 	"code.gitea.io/gitea/modules/setting" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // PushUpdateOptions defines the push update options
 | ||||||
|  | type PushUpdateOptions struct { | ||||||
|  | 	PusherID     int64 | ||||||
|  | 	PusherName   string | ||||||
|  | 	RepoUserName string | ||||||
|  | 	RepoName     string | ||||||
|  | 	RefFullName  string // branch, tag or other name to push
 | ||||||
|  | 	OldCommitID  string | ||||||
|  | 	NewCommitID  string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsNewRef return true if it's a first-time push to a branch, tag or etc.
 | ||||||
|  | func (opts PushUpdateOptions) IsNewRef() bool { | ||||||
|  | 	return opts.OldCommitID == git.EmptySHA | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsDelRef return true if it's a deletion to a branch or tag
 | ||||||
|  | func (opts PushUpdateOptions) IsDelRef() bool { | ||||||
|  | 	return opts.NewCommitID == git.EmptySHA | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsUpdateRef return true if it's an update operation
 | ||||||
|  | func (opts PushUpdateOptions) IsUpdateRef() bool { | ||||||
|  | 	return !opts.IsNewRef() && !opts.IsDelRef() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsTag return true if it's an operation to a tag
 | ||||||
|  | func (opts PushUpdateOptions) IsTag() bool { | ||||||
|  | 	return strings.HasPrefix(opts.RefFullName, git.TagPrefix) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsNewTag return true if it's a creation to a tag
 | ||||||
|  | func (opts PushUpdateOptions) IsNewTag() bool { | ||||||
|  | 	return opts.IsTag() && opts.IsNewRef() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsDelTag return true if it's a deletion to a tag
 | ||||||
|  | func (opts PushUpdateOptions) IsDelTag() bool { | ||||||
|  | 	return opts.IsTag() && opts.IsDelRef() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsBranch return true if it's a push to branch
 | ||||||
|  | func (opts PushUpdateOptions) IsBranch() bool { | ||||||
|  | 	return strings.HasPrefix(opts.RefFullName, git.BranchPrefix) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsNewBranch return true if it's the first-time push to a branch
 | ||||||
|  | func (opts PushUpdateOptions) IsNewBranch() bool { | ||||||
|  | 	return opts.IsBranch() && opts.IsNewRef() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsUpdateBranch return true if it's not the first push to a branch
 | ||||||
|  | func (opts PushUpdateOptions) IsUpdateBranch() bool { | ||||||
|  | 	return opts.IsBranch() && opts.IsUpdateRef() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsDelBranch return true if it's a deletion to a branch
 | ||||||
|  | func (opts PushUpdateOptions) IsDelBranch() bool { | ||||||
|  | 	return opts.IsBranch() && opts.IsDelRef() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // TagName returns simple tag name if it's an operation to a tag
 | ||||||
|  | func (opts PushUpdateOptions) TagName() string { | ||||||
|  | 	return opts.RefFullName[len(git.TagPrefix):] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // BranchName returns simple branch name if it's an operation to branch
 | ||||||
|  | func (opts PushUpdateOptions) BranchName() string { | ||||||
|  | 	return opts.RefFullName[len(git.BranchPrefix):] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // RefName returns simple name for ref
 | ||||||
|  | func (opts PushUpdateOptions) RefName() string { | ||||||
|  | 	if strings.HasPrefix(opts.RefFullName, git.TagPrefix) { | ||||||
|  | 		return opts.RefFullName[len(git.TagPrefix):] | ||||||
|  | 	} else if strings.HasPrefix(opts.RefFullName, git.BranchPrefix) { | ||||||
|  | 		return opts.RefFullName[len(git.BranchPrefix):] | ||||||
|  | 	} | ||||||
|  | 	return "" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // RepoFullName returns repo full name
 | ||||||
|  | func (opts PushUpdateOptions) RepoFullName() string { | ||||||
|  | 	return opts.RepoUserName + "/" + opts.RepoName | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsForcePush detect if a push is a force push
 | ||||||
|  | func IsForcePush(opts *PushUpdateOptions) (bool, error) { | ||||||
|  | 	if !opts.IsUpdateBranch() { | ||||||
|  | 		return false, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	output, err := git.NewCommand("rev-list", "--max-count=1", opts.OldCommitID, "^"+opts.NewCommitID). | ||||||
|  | 		RunInDir(filepath.Join(setting.RepoRootPath, opts.RepoUserName, opts.RepoName)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, err | ||||||
|  | 	} else if len(output) > 0 { | ||||||
|  | 		return true, nil | ||||||
|  | 	} | ||||||
|  | 	return false, nil | ||||||
|  | } | ||||||
|  | @ -162,7 +162,7 @@ func DeleteBranch(ctx *context.APIContext) { | ||||||
| 
 | 
 | ||||||
| 	// Don't return error below this
 | 	// Don't return error below this
 | ||||||
| 	if err := repo_service.PushUpdate( | 	if err := repo_service.PushUpdate( | ||||||
| 		&repo_service.PushUpdateOptions{ | 		&repo_module.PushUpdateOptions{ | ||||||
| 			RefFullName:  git.BranchPrefix + ctx.Repo.BranchName, | 			RefFullName:  git.BranchPrefix + ctx.Repo.BranchName, | ||||||
| 			OldCommitID:  c.ID.String(), | 			OldCommitID:  c.ID.String(), | ||||||
| 			NewCommitID:  git.EmptySHA, | 			NewCommitID:  git.EmptySHA, | ||||||
|  |  | ||||||
|  | @ -18,6 +18,7 @@ import ( | ||||||
| 	"code.gitea.io/gitea/modules/git" | 	"code.gitea.io/gitea/modules/git" | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/private" | 	"code.gitea.io/gitea/modules/private" | ||||||
|  | 	repo_module "code.gitea.io/gitea/modules/repository" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
| 	pull_service "code.gitea.io/gitea/services/pull" | 	pull_service "code.gitea.io/gitea/services/pull" | ||||||
|  | @ -375,7 +376,7 @@ func HookPostReceive(ctx *macaron.Context, opts private.HookOptions) { | ||||||
| 	repoName := ctx.Params(":repo") | 	repoName := ctx.Params(":repo") | ||||||
| 
 | 
 | ||||||
| 	var repo *models.Repository | 	var repo *models.Repository | ||||||
| 	updates := make([]*repo_service.PushUpdateOptions, 0, len(opts.OldCommitIDs)) | 	updates := make([]*repo_module.PushUpdateOptions, 0, len(opts.OldCommitIDs)) | ||||||
| 	wasEmpty := false | 	wasEmpty := false | ||||||
| 
 | 
 | ||||||
| 	for i := range opts.OldCommitIDs { | 	for i := range opts.OldCommitIDs { | ||||||
|  | @ -402,7 +403,7 @@ func HookPostReceive(ctx *macaron.Context, opts private.HookOptions) { | ||||||
| 				wasEmpty = repo.IsEmpty | 				wasEmpty = repo.IsEmpty | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			option := repo_service.PushUpdateOptions{ | 			option := repo_module.PushUpdateOptions{ | ||||||
| 				RefFullName:  refFullName, | 				RefFullName:  refFullName, | ||||||
| 				OldCommitID:  opts.OldCommitIDs[i], | 				OldCommitID:  opts.OldCommitIDs[i], | ||||||
| 				NewCommitID:  opts.NewCommitIDs[i], | 				NewCommitID:  opts.NewCommitIDs[i], | ||||||
|  |  | ||||||
|  | @ -120,7 +120,7 @@ func RestoreBranchPost(ctx *context.Context) { | ||||||
| 
 | 
 | ||||||
| 	// Don't return error below this
 | 	// Don't return error below this
 | ||||||
| 	if err := repo_service.PushUpdate( | 	if err := repo_service.PushUpdate( | ||||||
| 		&repo_service.PushUpdateOptions{ | 		&repo_module.PushUpdateOptions{ | ||||||
| 			RefFullName:  git.BranchPrefix + deletedBranch.Name, | 			RefFullName:  git.BranchPrefix + deletedBranch.Name, | ||||||
| 			OldCommitID:  git.EmptySHA, | 			OldCommitID:  git.EmptySHA, | ||||||
| 			NewCommitID:  deletedBranch.Commit, | 			NewCommitID:  deletedBranch.Commit, | ||||||
|  | @ -157,7 +157,7 @@ func deleteBranch(ctx *context.Context, branchName string) error { | ||||||
| 
 | 
 | ||||||
| 	// Don't return error below this
 | 	// Don't return error below this
 | ||||||
| 	if err := repo_service.PushUpdate( | 	if err := repo_service.PushUpdate( | ||||||
| 		&repo_service.PushUpdateOptions{ | 		&repo_module.PushUpdateOptions{ | ||||||
| 			RefFullName:  git.BranchPrefix + branchName, | 			RefFullName:  git.BranchPrefix + branchName, | ||||||
| 			OldCommitID:  commit.ID.String(), | 			OldCommitID:  commit.ID.String(), | ||||||
| 			NewCommitID:  git.EmptySHA, | 			NewCommitID:  git.EmptySHA, | ||||||
|  |  | ||||||
|  | @ -22,6 +22,7 @@ import ( | ||||||
| 	"code.gitea.io/gitea/modules/git" | 	"code.gitea.io/gitea/modules/git" | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/notification" | 	"code.gitea.io/gitea/modules/notification" | ||||||
|  | 	repo_module "code.gitea.io/gitea/modules/repository" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	"code.gitea.io/gitea/modules/structs" | 	"code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/upload" | 	"code.gitea.io/gitea/modules/upload" | ||||||
|  | @ -1185,7 +1186,7 @@ func CleanUpPullRequest(ctx *context.Context) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := repo_service.PushUpdate( | 	if err := repo_service.PushUpdate( | ||||||
| 		&repo_service.PushUpdateOptions{ | 		&repo_module.PushUpdateOptions{ | ||||||
| 			RefFullName:  git.BranchPrefix + pr.HeadBranch, | 			RefFullName:  git.BranchPrefix + pr.HeadBranch, | ||||||
| 			OldCommitID:  branchCommitID, | 			OldCommitID:  branchCommitID, | ||||||
| 			NewCommitID:  git.EmptySHA, | 			NewCommitID:  git.EmptySHA, | ||||||
|  |  | ||||||
|  | @ -472,7 +472,11 @@ func syncMirror(repoID string) { | ||||||
| 
 | 
 | ||||||
| 		theCommits.CompareURL = m.Repo.ComposeCompareURL(oldCommitID, newCommitID) | 		theCommits.CompareURL = m.Repo.ComposeCompareURL(oldCommitID, newCommitID) | ||||||
| 
 | 
 | ||||||
| 		notification.NotifySyncPushCommits(m.Repo.MustOwner(), m.Repo, result.refName, oldCommitID, newCommitID, theCommits) | 		notification.NotifySyncPushCommits(m.Repo.MustOwner(), m.Repo, &repo_module.PushUpdateOptions{ | ||||||
|  | 			RefFullName: result.refName, | ||||||
|  | 			OldCommitID: oldCommitID, | ||||||
|  | 			NewCommitID: newCommitID, | ||||||
|  | 		}, theCommits) | ||||||
| 	} | 	} | ||||||
| 	log.Trace("SyncMirrors [repo: %-v]: done notifying updated branches/tags - now updating last commit time", m.Repo) | 	log.Trace("SyncMirrors [repo: %-v]: done notifying updated branches/tags - now updating last commit time", m.Repo) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -43,8 +43,12 @@ func createTag(gitRepo *git.Repository, rel *models.Release) error { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
| 			notification.NotifyPushCommits( | 			notification.NotifyPushCommits( | ||||||
| 				rel.Publisher, rel.Repo, git.TagPrefix+rel.TagName, | 				rel.Publisher, rel.Repo, | ||||||
| 				git.EmptySHA, commit.ID.String(), repository.NewPushCommits()) | 				&repository.PushUpdateOptions{ | ||||||
|  | 					RefFullName: git.TagPrefix + rel.TagName, | ||||||
|  | 					OldCommitID: git.EmptySHA, | ||||||
|  | 					NewCommitID: commit.ID.String(), | ||||||
|  | 				}, repository.NewPushCommits()) | ||||||
| 			notification.NotifyCreateRef(rel.Publisher, rel.Repo, "tag", git.TagPrefix+rel.TagName) | 			notification.NotifyCreateRef(rel.Publisher, rel.Repo, "tag", git.TagPrefix+rel.TagName) | ||||||
| 			rel.CreatedUnix = timeutil.TimeStampNow() | 			rel.CreatedUnix = timeutil.TimeStampNow() | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -8,7 +8,6 @@ import ( | ||||||
| 	"container/list" | 	"container/list" | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"strings" |  | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"code.gitea.io/gitea/models" | 	"code.gitea.io/gitea/models" | ||||||
|  | @ -24,114 +23,13 @@ import ( | ||||||
| 	pull_service "code.gitea.io/gitea/services/pull" | 	pull_service "code.gitea.io/gitea/services/pull" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // PushUpdateOptions defines the push update options
 |  | ||||||
| type PushUpdateOptions struct { |  | ||||||
| 	PusherID     int64 |  | ||||||
| 	PusherName   string |  | ||||||
| 	RepoUserName string |  | ||||||
| 	RepoName     string |  | ||||||
| 	RefFullName  string // branch, tag or other name to push
 |  | ||||||
| 	OldCommitID  string |  | ||||||
| 	NewCommitID  string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsNewRef return true if it's a first-time push to a branch, tag or etc.
 |  | ||||||
| func (opts PushUpdateOptions) IsNewRef() bool { |  | ||||||
| 	return opts.OldCommitID == git.EmptySHA |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsDelRef return true if it's a deletion to a branch or tag
 |  | ||||||
| func (opts PushUpdateOptions) IsDelRef() bool { |  | ||||||
| 	return opts.NewCommitID == git.EmptySHA |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsUpdateRef return true if it's an update operation
 |  | ||||||
| func (opts PushUpdateOptions) IsUpdateRef() bool { |  | ||||||
| 	return !opts.IsNewRef() && !opts.IsDelRef() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsTag return true if it's an operation to a tag
 |  | ||||||
| func (opts PushUpdateOptions) IsTag() bool { |  | ||||||
| 	return strings.HasPrefix(opts.RefFullName, git.TagPrefix) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsNewTag return true if it's a creation to a tag
 |  | ||||||
| func (opts PushUpdateOptions) IsNewTag() bool { |  | ||||||
| 	return opts.IsTag() && opts.IsNewRef() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsDelTag return true if it's a deletion to a tag
 |  | ||||||
| func (opts PushUpdateOptions) IsDelTag() bool { |  | ||||||
| 	return opts.IsTag() && opts.IsDelRef() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsBranch return true if it's a push to branch
 |  | ||||||
| func (opts PushUpdateOptions) IsBranch() bool { |  | ||||||
| 	return strings.HasPrefix(opts.RefFullName, git.BranchPrefix) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsNewBranch return true if it's the first-time push to a branch
 |  | ||||||
| func (opts PushUpdateOptions) IsNewBranch() bool { |  | ||||||
| 	return opts.IsBranch() && opts.IsNewRef() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsUpdateBranch return true if it's not the first push to a branch
 |  | ||||||
| func (opts PushUpdateOptions) IsUpdateBranch() bool { |  | ||||||
| 	return opts.IsBranch() && opts.IsUpdateRef() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsDelBranch return true if it's a deletion to a branch
 |  | ||||||
| func (opts PushUpdateOptions) IsDelBranch() bool { |  | ||||||
| 	return opts.IsBranch() && opts.IsDelRef() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // TagName returns simple tag name if it's an operation to a tag
 |  | ||||||
| func (opts PushUpdateOptions) TagName() string { |  | ||||||
| 	return opts.RefFullName[len(git.TagPrefix):] |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // BranchName returns simple branch name if it's an operation to branch
 |  | ||||||
| func (opts PushUpdateOptions) BranchName() string { |  | ||||||
| 	return opts.RefFullName[len(git.BranchPrefix):] |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // RefName returns simple name for ref
 |  | ||||||
| func (opts PushUpdateOptions) RefName() string { |  | ||||||
| 	if strings.HasPrefix(opts.RefFullName, git.TagPrefix) { |  | ||||||
| 		return opts.RefFullName[len(git.TagPrefix):] |  | ||||||
| 	} else if strings.HasPrefix(opts.RefFullName, git.BranchPrefix) { |  | ||||||
| 		return opts.RefFullName[len(git.BranchPrefix):] |  | ||||||
| 	} |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // RepoFullName returns repo full name
 |  | ||||||
| func (opts PushUpdateOptions) RepoFullName() string { |  | ||||||
| 	return opts.RepoUserName + "/" + opts.RepoName |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // isForcePush detect if a push is a force push
 |  | ||||||
| func isForcePush(repoPath string, opts *PushUpdateOptions) (bool, error) { |  | ||||||
| 	if !opts.IsUpdateBranch() { |  | ||||||
| 		return false, nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	output, err := git.NewCommand("rev-list", "--max-count=1", opts.OldCommitID, "^"+opts.NewCommitID).RunInDir(repoPath) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return false, err |  | ||||||
| 	} else if len(output) > 0 { |  | ||||||
| 		return true, nil |  | ||||||
| 	} |  | ||||||
| 	return false, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // pushQueue represents a queue to handle update pull request tests
 | // pushQueue represents a queue to handle update pull request tests
 | ||||||
| var pushQueue queue.Queue | var pushQueue queue.Queue | ||||||
| 
 | 
 | ||||||
| // handle passed PR IDs and test the PRs
 | // handle passed PR IDs and test the PRs
 | ||||||
| func handle(data ...queue.Data) { | func handle(data ...queue.Data) { | ||||||
| 	for _, datum := range data { | 	for _, datum := range data { | ||||||
| 		opts := datum.([]*PushUpdateOptions) | 		opts := datum.([]*repo_module.PushUpdateOptions) | ||||||
| 		if err := pushUpdates(opts); err != nil { | 		if err := pushUpdates(opts); err != nil { | ||||||
| 			log.Error("pushUpdate failed: %v", err) | 			log.Error("pushUpdate failed: %v", err) | ||||||
| 		} | 		} | ||||||
|  | @ -139,7 +37,7 @@ func handle(data ...queue.Data) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func initPushQueue() error { | func initPushQueue() error { | ||||||
| 	pushQueue = queue.CreateQueue("push_update", handle, []*PushUpdateOptions{}).(queue.Queue) | 	pushQueue = queue.CreateQueue("push_update", handle, []*repo_module.PushUpdateOptions{}).(queue.Queue) | ||||||
| 	if pushQueue == nil { | 	if pushQueue == nil { | ||||||
| 		return fmt.Errorf("Unable to create push_update Queue") | 		return fmt.Errorf("Unable to create push_update Queue") | ||||||
| 	} | 	} | ||||||
|  | @ -149,12 +47,12 @@ func initPushQueue() error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // PushUpdate is an alias of PushUpdates for single push update options
 | // PushUpdate is an alias of PushUpdates for single push update options
 | ||||||
| func PushUpdate(opts *PushUpdateOptions) error { | func PushUpdate(opts *repo_module.PushUpdateOptions) error { | ||||||
| 	return PushUpdates([]*PushUpdateOptions{opts}) | 	return PushUpdates([]*repo_module.PushUpdateOptions{opts}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // PushUpdates adds a push update to push queue
 | // PushUpdates adds a push update to push queue
 | ||||||
| func PushUpdates(opts []*PushUpdateOptions) error { | func PushUpdates(opts []*repo_module.PushUpdateOptions) error { | ||||||
| 	if len(opts) == 0 { | 	if len(opts) == 0 { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  | @ -169,7 +67,7 @@ func PushUpdates(opts []*PushUpdateOptions) error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // pushUpdates generates push action history feeds for push updating multiple refs
 | // pushUpdates generates push action history feeds for push updating multiple refs
 | ||||||
| func pushUpdates(optsList []*PushUpdateOptions) error { | func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { | ||||||
| 	if len(optsList) == 0 { | 	if len(optsList) == 0 { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  | @ -238,7 +136,7 @@ func pushUpdates(optsList []*PushUpdateOptions) error { | ||||||
| 						return fmt.Errorf("newCommit.CommitsBeforeUntil: %v", err) | 						return fmt.Errorf("newCommit.CommitsBeforeUntil: %v", err) | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 					isForce, err := isForcePush(repo.RepoPath(), opts) | 					isForce, err := repo_module.IsForcePush(opts) | ||||||
| 					if err != nil { | 					if err != nil { | ||||||
| 						log.Error("isForcePush %s/%s failed: %v", repo.ID, branch, err) | 						log.Error("isForcePush %s/%s failed: %v", repo.ID, branch, err) | ||||||
| 					} | 					} | ||||||
|  | @ -293,7 +191,7 @@ func pushUpdates(optsList []*PushUpdateOptions) error { | ||||||
| 
 | 
 | ||||||
| // commitRepoActionOptions represent options of a new commit action.
 | // commitRepoActionOptions represent options of a new commit action.
 | ||||||
| type commitRepoActionOptions struct { | type commitRepoActionOptions struct { | ||||||
| 	PushUpdateOptions | 	repo_module.PushUpdateOptions | ||||||
| 
 | 
 | ||||||
| 	Pusher      *models.User | 	Pusher      *models.User | ||||||
| 	RepoOwnerID int64 | 	RepoOwnerID int64 | ||||||
|  | @ -395,7 +293,7 @@ func commitRepoAction(repo *models.Repository, gitRepo *git.Repository, optsList | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if isHookEventPush { | 		if isHookEventPush { | ||||||
| 			notification.NotifyPushCommits(opts.Pusher, repo, opts.RefFullName, opts.OldCommitID, opts.NewCommitID, opts.Commits) | 			notification.NotifyPushCommits(opts.Pusher, repo, &opts.PushUpdateOptions, opts.Commits) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -32,7 +32,7 @@ func TestCommitRepoAction(t *testing.T) { | ||||||
| 			userID:       2, | 			userID:       2, | ||||||
| 			repositoryID: 16, | 			repositoryID: 16, | ||||||
| 			commitRepoActionOptions: commitRepoActionOptions{ | 			commitRepoActionOptions: commitRepoActionOptions{ | ||||||
| 				PushUpdateOptions: PushUpdateOptions{ | 				PushUpdateOptions: repo_module.PushUpdateOptions{ | ||||||
| 					RefFullName: "refName", | 					RefFullName: "refName", | ||||||
| 					OldCommitID: "oldCommitID", | 					OldCommitID: "oldCommitID", | ||||||
| 					NewCommitID: "newCommitID", | 					NewCommitID: "newCommitID", | ||||||
|  | @ -68,7 +68,7 @@ func TestCommitRepoAction(t *testing.T) { | ||||||
| 			userID:       2, | 			userID:       2, | ||||||
| 			repositoryID: 1, | 			repositoryID: 1, | ||||||
| 			commitRepoActionOptions: commitRepoActionOptions{ | 			commitRepoActionOptions: commitRepoActionOptions{ | ||||||
| 				PushUpdateOptions: PushUpdateOptions{ | 				PushUpdateOptions: repo_module.PushUpdateOptions{ | ||||||
| 					RefFullName: git.TagPrefix + "v1.1", | 					RefFullName: git.TagPrefix + "v1.1", | ||||||
| 					OldCommitID: git.EmptySHA, | 					OldCommitID: git.EmptySHA, | ||||||
| 					NewCommitID: "newCommitID", | 					NewCommitID: "newCommitID", | ||||||
|  | @ -84,7 +84,7 @@ func TestCommitRepoAction(t *testing.T) { | ||||||
| 			userID:       2, | 			userID:       2, | ||||||
| 			repositoryID: 1, | 			repositoryID: 1, | ||||||
| 			commitRepoActionOptions: commitRepoActionOptions{ | 			commitRepoActionOptions: commitRepoActionOptions{ | ||||||
| 				PushUpdateOptions: PushUpdateOptions{ | 				PushUpdateOptions: repo_module.PushUpdateOptions{ | ||||||
| 					RefFullName: git.TagPrefix + "v1.1", | 					RefFullName: git.TagPrefix + "v1.1", | ||||||
| 					OldCommitID: "oldCommitID", | 					OldCommitID: "oldCommitID", | ||||||
| 					NewCommitID: git.EmptySHA, | 					NewCommitID: git.EmptySHA, | ||||||
|  | @ -100,7 +100,7 @@ func TestCommitRepoAction(t *testing.T) { | ||||||
| 			userID:       2, | 			userID:       2, | ||||||
| 			repositoryID: 1, | 			repositoryID: 1, | ||||||
| 			commitRepoActionOptions: commitRepoActionOptions{ | 			commitRepoActionOptions: commitRepoActionOptions{ | ||||||
| 				PushUpdateOptions: PushUpdateOptions{ | 				PushUpdateOptions: repo_module.PushUpdateOptions{ | ||||||
| 					RefFullName: git.BranchPrefix + "feature/1", | 					RefFullName: git.BranchPrefix + "feature/1", | ||||||
| 					OldCommitID: "oldCommitID", | 					OldCommitID: "oldCommitID", | ||||||
| 					NewCommitID: git.EmptySHA, | 					NewCommitID: git.EmptySHA, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue