mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-04 06:24:11 +01:00 
			
		
		
		
	Backport #34703 by @lunny Fix #34688 This PR will store the `publisher_id` of `release`(tag) table as pusher's id. It could be a real userID or a system user id. If the user is deleted, ghost will be replaced. This PR will also correct the wrong user `Ghost` in the feeds and wrong committer on tag list page if pushing a tag from an actions. Now the behavior is the same as Github. Some codes are deleted because it tries to get commit author as pusher which is not right. Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
		
							parent
							
								
									6f5f0be9e3
								
							
						
					
					
						commit
						4c2441ba5d
					
				@ -191,7 +191,7 @@ func (a *Action) LoadActUser(ctx context.Context) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var err error
 | 
						var err error
 | 
				
			||||||
	a.ActUser, err = user_model.GetUserByID(ctx, a.ActUserID)
 | 
						a.ActUser, err = user_model.GetPossibleUserByID(ctx, a.ActUserID)
 | 
				
			||||||
	if err == nil {
 | 
						if err == nil {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	} else if user_model.IsErrUserNotExist(err) {
 | 
						} else if user_model.IsErrUserNotExist(err) {
 | 
				
			||||||
 | 
				
			|||||||
@ -103,7 +103,7 @@ func getReleaseInfos(ctx *context.Context, opts *repo_model.FindReleasesOptions)
 | 
				
			|||||||
	releaseInfos := make([]*ReleaseInfo, 0, len(releases))
 | 
						releaseInfos := make([]*ReleaseInfo, 0, len(releases))
 | 
				
			||||||
	for _, r := range releases {
 | 
						for _, r := range releases {
 | 
				
			||||||
		if r.Publisher, ok = cacheUsers[r.PublisherID]; !ok {
 | 
							if r.Publisher, ok = cacheUsers[r.PublisherID]; !ok {
 | 
				
			||||||
			r.Publisher, err = user_model.GetUserByID(ctx, r.PublisherID)
 | 
								r.Publisher, err = user_model.GetPossibleUserByID(ctx, r.PublisherID)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				if user_model.IsErrUserNotExist(err) {
 | 
									if user_model.IsErrUserNotExist(err) {
 | 
				
			||||||
					r.Publisher = user_model.NewGhostUser()
 | 
										r.Publisher = user_model.NewGhostUser()
 | 
				
			||||||
 | 
				
			|||||||
@ -232,7 +232,7 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(addTags)+len(delTags) > 0 {
 | 
						if len(addTags)+len(delTags) > 0 {
 | 
				
			||||||
		if err := PushUpdateAddDeleteTags(ctx, repo, gitRepo, addTags, delTags); err != nil {
 | 
							if err := PushUpdateAddDeleteTags(ctx, repo, gitRepo, pusher, addTags, delTags); err != nil {
 | 
				
			||||||
			return fmt.Errorf("PushUpdateAddDeleteTags: %w", err)
 | 
								return fmt.Errorf("PushUpdateAddDeleteTags: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -342,17 +342,17 @@ func pushDeleteBranch(ctx context.Context, repo *repo_model.Repository, pusher *
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// PushUpdateAddDeleteTags updates a number of added and delete tags
 | 
					// PushUpdateAddDeleteTags updates a number of added and delete tags
 | 
				
			||||||
func PushUpdateAddDeleteTags(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, addTags, delTags []string) error {
 | 
					func PushUpdateAddDeleteTags(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, pusher *user_model.User, addTags, delTags []string) error {
 | 
				
			||||||
	return db.WithTx(ctx, func(ctx context.Context) error {
 | 
						return db.WithTx(ctx, func(ctx context.Context) error {
 | 
				
			||||||
		if err := repo_model.PushUpdateDeleteTags(ctx, repo, delTags); err != nil {
 | 
							if err := repo_model.PushUpdateDeleteTags(ctx, repo, delTags); err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return pushUpdateAddTags(ctx, repo, gitRepo, addTags)
 | 
							return pushUpdateAddTags(ctx, repo, gitRepo, pusher, addTags)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// pushUpdateAddTags updates a number of add tags
 | 
					// pushUpdateAddTags updates a number of add tags
 | 
				
			||||||
func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, tags []string) error {
 | 
					func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, pusher *user_model.User, tags []string) error {
 | 
				
			||||||
	if len(tags) == 0 {
 | 
						if len(tags) == 0 {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -378,8 +378,6 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	newReleases := make([]*repo_model.Release, 0, len(lowerTags)-len(relMap))
 | 
						newReleases := make([]*repo_model.Release, 0, len(lowerTags)-len(relMap))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	emailToUser := make(map[string]*user_model.User)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for i, lowerTag := range lowerTags {
 | 
						for i, lowerTag := range lowerTags {
 | 
				
			||||||
		tag, err := gitRepo.GetTag(tags[i])
 | 
							tag, err := gitRepo.GetTag(tags[i])
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
@ -397,21 +395,9 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo
 | 
				
			|||||||
		if sig == nil {
 | 
							if sig == nil {
 | 
				
			||||||
			sig = commit.Committer
 | 
								sig = commit.Committer
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		var author *user_model.User
 | 
					 | 
				
			||||||
		createdAt := time.Unix(1, 0)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							createdAt := time.Unix(1, 0)
 | 
				
			||||||
		if sig != nil {
 | 
							if sig != nil {
 | 
				
			||||||
			var ok bool
 | 
					 | 
				
			||||||
			author, ok = emailToUser[sig.Email]
 | 
					 | 
				
			||||||
			if !ok {
 | 
					 | 
				
			||||||
				author, err = user_model.GetUserByEmail(ctx, sig.Email)
 | 
					 | 
				
			||||||
				if err != nil && !user_model.IsErrUserNotExist(err) {
 | 
					 | 
				
			||||||
					return fmt.Errorf("GetUserByEmail: %w", err)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if author != nil {
 | 
					 | 
				
			||||||
					emailToUser[sig.Email] = author
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			createdAt = sig.When
 | 
								createdAt = sig.When
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -435,11 +421,9 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo
 | 
				
			|||||||
				IsDraft:      false,
 | 
									IsDraft:      false,
 | 
				
			||||||
				IsPrerelease: false,
 | 
									IsPrerelease: false,
 | 
				
			||||||
				IsTag:        true,
 | 
									IsTag:        true,
 | 
				
			||||||
 | 
									PublisherID:  pusher.ID,
 | 
				
			||||||
				CreatedUnix:  timeutil.TimeStamp(createdAt.Unix()),
 | 
									CreatedUnix:  timeutil.TimeStamp(createdAt.Unix()),
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if author != nil {
 | 
					 | 
				
			||||||
				rel.PublisherID = author.ID
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			newReleases = append(newReleases, rel)
 | 
								newReleases = append(newReleases, rel)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
@ -448,12 +432,10 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo
 | 
				
			|||||||
			if rel.IsTag {
 | 
								if rel.IsTag {
 | 
				
			||||||
				rel.Title = parts[0]
 | 
									rel.Title = parts[0]
 | 
				
			||||||
				rel.Note = note
 | 
									rel.Note = note
 | 
				
			||||||
				if author != nil {
 | 
					 | 
				
			||||||
					rel.PublisherID = author.ID
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				rel.IsDraft = false
 | 
									rel.IsDraft = false
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								rel.PublisherID = pusher.ID
 | 
				
			||||||
			if err = repo_model.UpdateRelease(ctx, rel); err != nil {
 | 
								if err = repo_model.UpdateRelease(ctx, rel); err != nil {
 | 
				
			||||||
				return fmt.Errorf("Update: %w", err)
 | 
									return fmt.Errorf("Update: %w", err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
				
			|||||||
@ -50,7 +50,11 @@
 | 
				
			|||||||
								{{svg (MigrationIcon $release.Repo.GetOriginalURLHostname) 20 "tw-mr-1"}}{{$release.OriginalAuthor}}
 | 
													{{svg (MigrationIcon $release.Repo.GetOriginalURLHostname) 20 "tw-mr-1"}}{{$release.OriginalAuthor}}
 | 
				
			||||||
							{{else if $release.Publisher}}
 | 
												{{else if $release.Publisher}}
 | 
				
			||||||
								{{ctx.AvatarUtils.Avatar $release.Publisher 20 "tw-mr-1"}}
 | 
													{{ctx.AvatarUtils.Avatar $release.Publisher 20 "tw-mr-1"}}
 | 
				
			||||||
								<a href="{{$release.Publisher.HomeLink}}">{{$release.Publisher.GetDisplayName}}</a>
 | 
													{{if gt $release.PublisherID 0}}
 | 
				
			||||||
 | 
														<a href="{{$release.Publisher.HomeLink}}">{{$release.Publisher.GetDisplayName}}</a>
 | 
				
			||||||
 | 
													{{else}}
 | 
				
			||||||
 | 
														{{$release.Publisher.GetDisplayName}}
 | 
				
			||||||
 | 
													{{end}}
 | 
				
			||||||
							{{else}}
 | 
												{{else}}
 | 
				
			||||||
								Ghost
 | 
													Ghost
 | 
				
			||||||
							{{end}}
 | 
												{{end}}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user