mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Refactor: Move PushUpdateOptions (#13363)
Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com>
This commit is contained in:
		| @@ -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) | ||||
| 	if err != nil { | ||||
| 		log.Error("json.Marshal: %v", err) | ||||
| @@ -289,7 +289,7 @@ func (a *actionNotifier) NotifySyncPushCommits(pusher *models.User, repo *models | ||||
| 		RepoID:    repo.ID, | ||||
| 		Repo:      repo, | ||||
| 		IsPrivate: repo.IsPrivate, | ||||
| 		RefName:   refName, | ||||
| 		RefName:   opts.RefFullName, | ||||
| 		Content:   string(data), | ||||
| 	}); err != nil { | ||||
| 		log.Error("notifyWatchers: %v", err) | ||||
|   | ||||
| @@ -48,11 +48,11 @@ type Notifier interface { | ||||
| 	NotifyUpdateRelease(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) | ||||
| 	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) | ||||
| 	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 | ||||
| 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 | ||||
| @@ -148,7 +148,7 @@ func (*NullNotifier) NotifyTransferRepository(doer *models.User, repo *models.Re | ||||
| } | ||||
|  | ||||
| // 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 | ||||
|   | ||||
| @@ -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) { | ||||
| 	if setting.Indexer.RepoIndexerEnabled && refName == git.BranchPrefix+repo.DefaultBranch { | ||||
| func (r *indexerNotifier) NotifyPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { | ||||
| 	if setting.Indexer.RepoIndexerEnabled && opts.RefFullName == git.BranchPrefix+repo.DefaultBranch { | ||||
| 		code_indexer.UpdateRepoIndexer(repo) | ||||
| 	} | ||||
| 	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) { | ||||
| 	if setting.Indexer.RepoIndexerEnabled && refName == git.BranchPrefix+repo.DefaultBranch { | ||||
| func (r *indexerNotifier) NotifySyncPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { | ||||
| 	if setting.Indexer.RepoIndexerEnabled && opts.RefFullName == git.BranchPrefix+repo.DefaultBranch { | ||||
| 		code_indexer.UpdateRepoIndexer(repo) | ||||
| 	} | ||||
| 	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 | ||||
| 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 { | ||||
| 		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 | ||||
| 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 { | ||||
| 		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) | ||||
| 	apiCommits, err := commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL()) | ||||
| 	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{ | ||||
| 		Ref:        refName, | ||||
| 		Before:     oldCommitID, | ||||
| 		After:      newCommitID, | ||||
| 		Ref:        opts.RefFullName, | ||||
| 		Before:     opts.OldCommitID, | ||||
| 		After:      opts.NewCommitID, | ||||
| 		CompareURL: setting.AppURL + commits.CompareURL, | ||||
| 		Commits:    apiCommits, | ||||
| 		Repo:       repo.APIFormat(models.AccessModeOwner), | ||||
| @@ -776,7 +776,7 @@ func (m *webhookNotifier) NotifyDeleteRelease(doer *models.User, rel *models.Rel | ||||
| 	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) | ||||
| 	apiCommits, err := commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL()) | ||||
| 	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{ | ||||
| 		Ref:        refName, | ||||
| 		Before:     oldCommitID, | ||||
| 		After:      newCommitID, | ||||
| 		Ref:        opts.RefFullName, | ||||
| 		Before:     opts.OldCommitID, | ||||
| 		After:      opts.NewCommitID, | ||||
| 		CompareURL: setting.AppURL + commits.CompareURL, | ||||
| 		Commits:    apiCommits, | ||||
| 		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 | ||||
| 	if err := repo_service.PushUpdate( | ||||
| 		&repo_service.PushUpdateOptions{ | ||||
| 		&repo_module.PushUpdateOptions{ | ||||
| 			RefFullName:  git.BranchPrefix + ctx.Repo.BranchName, | ||||
| 			OldCommitID:  c.ID.String(), | ||||
| 			NewCommitID:  git.EmptySHA, | ||||
|   | ||||
| @@ -18,6 +18,7 @@ import ( | ||||
| 	"code.gitea.io/gitea/modules/git" | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| 	"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/util" | ||||
| 	pull_service "code.gitea.io/gitea/services/pull" | ||||
| @@ -375,7 +376,7 @@ func HookPostReceive(ctx *macaron.Context, opts private.HookOptions) { | ||||
| 	repoName := ctx.Params(":repo") | ||||
|  | ||||
| 	var repo *models.Repository | ||||
| 	updates := make([]*repo_service.PushUpdateOptions, 0, len(opts.OldCommitIDs)) | ||||
| 	updates := make([]*repo_module.PushUpdateOptions, 0, len(opts.OldCommitIDs)) | ||||
| 	wasEmpty := false | ||||
|  | ||||
| 	for i := range opts.OldCommitIDs { | ||||
| @@ -402,7 +403,7 @@ func HookPostReceive(ctx *macaron.Context, opts private.HookOptions) { | ||||
| 				wasEmpty = repo.IsEmpty | ||||
| 			} | ||||
|  | ||||
| 			option := repo_service.PushUpdateOptions{ | ||||
| 			option := repo_module.PushUpdateOptions{ | ||||
| 				RefFullName:  refFullName, | ||||
| 				OldCommitID:  opts.OldCommitIDs[i], | ||||
| 				NewCommitID:  opts.NewCommitIDs[i], | ||||
|   | ||||
| @@ -120,7 +120,7 @@ func RestoreBranchPost(ctx *context.Context) { | ||||
|  | ||||
| 	// Don't return error below this | ||||
| 	if err := repo_service.PushUpdate( | ||||
| 		&repo_service.PushUpdateOptions{ | ||||
| 		&repo_module.PushUpdateOptions{ | ||||
| 			RefFullName:  git.BranchPrefix + deletedBranch.Name, | ||||
| 			OldCommitID:  git.EmptySHA, | ||||
| 			NewCommitID:  deletedBranch.Commit, | ||||
| @@ -157,7 +157,7 @@ func deleteBranch(ctx *context.Context, branchName string) error { | ||||
|  | ||||
| 	// Don't return error below this | ||||
| 	if err := repo_service.PushUpdate( | ||||
| 		&repo_service.PushUpdateOptions{ | ||||
| 		&repo_module.PushUpdateOptions{ | ||||
| 			RefFullName:  git.BranchPrefix + branchName, | ||||
| 			OldCommitID:  commit.ID.String(), | ||||
| 			NewCommitID:  git.EmptySHA, | ||||
|   | ||||
| @@ -22,6 +22,7 @@ import ( | ||||
| 	"code.gitea.io/gitea/modules/git" | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| 	"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/structs" | ||||
| 	"code.gitea.io/gitea/modules/upload" | ||||
| @@ -1185,7 +1186,7 @@ func CleanUpPullRequest(ctx *context.Context) { | ||||
| 	} | ||||
|  | ||||
| 	if err := repo_service.PushUpdate( | ||||
| 		&repo_service.PushUpdateOptions{ | ||||
| 		&repo_module.PushUpdateOptions{ | ||||
| 			RefFullName:  git.BranchPrefix + pr.HeadBranch, | ||||
| 			OldCommitID:  branchCommitID, | ||||
| 			NewCommitID:  git.EmptySHA, | ||||
|   | ||||
| @@ -472,7 +472,11 @@ func syncMirror(repoID string) { | ||||
|  | ||||
| 		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) | ||||
|  | ||||
|   | ||||
| @@ -43,8 +43,12 @@ func createTag(gitRepo *git.Repository, rel *models.Release) error { | ||||
| 				return err | ||||
| 			} | ||||
| 			notification.NotifyPushCommits( | ||||
| 				rel.Publisher, rel.Repo, git.TagPrefix+rel.TagName, | ||||
| 				git.EmptySHA, commit.ID.String(), repository.NewPushCommits()) | ||||
| 				rel.Publisher, rel.Repo, | ||||
| 				&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) | ||||
| 			rel.CreatedUnix = timeutil.TimeStampNow() | ||||
| 		} | ||||
|   | ||||
| @@ -8,7 +8,6 @@ import ( | ||||
| 	"container/list" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| @@ -24,114 +23,13 @@ import ( | ||||
| 	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 | ||||
| var pushQueue queue.Queue | ||||
|  | ||||
| // handle passed PR IDs and test the PRs | ||||
| func handle(data ...queue.Data) { | ||||
| 	for _, datum := range data { | ||||
| 		opts := datum.([]*PushUpdateOptions) | ||||
| 		opts := datum.([]*repo_module.PushUpdateOptions) | ||||
| 		if err := pushUpdates(opts); err != nil { | ||||
| 			log.Error("pushUpdate failed: %v", err) | ||||
| 		} | ||||
| @@ -139,7 +37,7 @@ func handle(data ...queue.Data) { | ||||
| } | ||||
|  | ||||
| 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 { | ||||
| 		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 | ||||
| func PushUpdate(opts *PushUpdateOptions) error { | ||||
| 	return PushUpdates([]*PushUpdateOptions{opts}) | ||||
| func PushUpdate(opts *repo_module.PushUpdateOptions) error { | ||||
| 	return PushUpdates([]*repo_module.PushUpdateOptions{opts}) | ||||
| } | ||||
|  | ||||
| // PushUpdates adds a push update to push queue | ||||
| func PushUpdates(opts []*PushUpdateOptions) error { | ||||
| func PushUpdates(opts []*repo_module.PushUpdateOptions) error { | ||||
| 	if len(opts) == 0 { | ||||
| 		return nil | ||||
| 	} | ||||
| @@ -169,7 +67,7 @@ func PushUpdates(opts []*PushUpdateOptions) error { | ||||
| } | ||||
|  | ||||
| // 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 { | ||||
| 		return nil | ||||
| 	} | ||||
| @@ -238,7 +136,7 @@ func pushUpdates(optsList []*PushUpdateOptions) error { | ||||
| 						return fmt.Errorf("newCommit.CommitsBeforeUntil: %v", err) | ||||
| 					} | ||||
|  | ||||
| 					isForce, err := isForcePush(repo.RepoPath(), opts) | ||||
| 					isForce, err := repo_module.IsForcePush(opts) | ||||
| 					if err != nil { | ||||
| 						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. | ||||
| type commitRepoActionOptions struct { | ||||
| 	PushUpdateOptions | ||||
| 	repo_module.PushUpdateOptions | ||||
|  | ||||
| 	Pusher      *models.User | ||||
| 	RepoOwnerID int64 | ||||
| @@ -395,7 +293,7 @@ func commitRepoAction(repo *models.Repository, gitRepo *git.Repository, optsList | ||||
| 		} | ||||
|  | ||||
| 		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, | ||||
| 			repositoryID: 16, | ||||
| 			commitRepoActionOptions: commitRepoActionOptions{ | ||||
| 				PushUpdateOptions: PushUpdateOptions{ | ||||
| 				PushUpdateOptions: repo_module.PushUpdateOptions{ | ||||
| 					RefFullName: "refName", | ||||
| 					OldCommitID: "oldCommitID", | ||||
| 					NewCommitID: "newCommitID", | ||||
| @@ -68,7 +68,7 @@ func TestCommitRepoAction(t *testing.T) { | ||||
| 			userID:       2, | ||||
| 			repositoryID: 1, | ||||
| 			commitRepoActionOptions: commitRepoActionOptions{ | ||||
| 				PushUpdateOptions: PushUpdateOptions{ | ||||
| 				PushUpdateOptions: repo_module.PushUpdateOptions{ | ||||
| 					RefFullName: git.TagPrefix + "v1.1", | ||||
| 					OldCommitID: git.EmptySHA, | ||||
| 					NewCommitID: "newCommitID", | ||||
| @@ -84,7 +84,7 @@ func TestCommitRepoAction(t *testing.T) { | ||||
| 			userID:       2, | ||||
| 			repositoryID: 1, | ||||
| 			commitRepoActionOptions: commitRepoActionOptions{ | ||||
| 				PushUpdateOptions: PushUpdateOptions{ | ||||
| 				PushUpdateOptions: repo_module.PushUpdateOptions{ | ||||
| 					RefFullName: git.TagPrefix + "v1.1", | ||||
| 					OldCommitID: "oldCommitID", | ||||
| 					NewCommitID: git.EmptySHA, | ||||
| @@ -100,7 +100,7 @@ func TestCommitRepoAction(t *testing.T) { | ||||
| 			userID:       2, | ||||
| 			repositoryID: 1, | ||||
| 			commitRepoActionOptions: commitRepoActionOptions{ | ||||
| 				PushUpdateOptions: PushUpdateOptions{ | ||||
| 				PushUpdateOptions: repo_module.PushUpdateOptions{ | ||||
| 					RefFullName: git.BranchPrefix + "feature/1", | ||||
| 					OldCommitID: "oldCommitID", | ||||
| 					NewCommitID: git.EmptySHA, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user