fix(repo): preserve transfer recipient collaboration (#39042)

Remove temporary recipient access after a transfer ends while preserving
existing collaboration.

---------

Co-authored-by: silverwind <me@silverwind.io>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
bircni
2026-08-22 21:43:42 +02:00
committed by GitHub
parent 9251eeb66b
commit e6af4c341c
7 changed files with 138 additions and 27 deletions
+14 -13
View File
@@ -67,31 +67,31 @@ func AddOrUpdateCollaborator(ctx context.Context, repo *repo_model.Repository, u
}
// DeleteCollaboration removes collaboration relation between the user and repository.
func DeleteCollaboration(ctx context.Context, repo *repo_model.Repository, collaborator *user_model.User) (err error) {
collaboration := &repo_model.Collaboration{
RepoID: repo.ID,
UserID: collaborator.ID,
}
func DeleteCollaboration(ctx context.Context, repo *repo_model.Repository, collaborator *user_model.User) error {
return deleteCollaboration(ctx, repo, collaborator, &repo_model.Collaboration{RepoID: repo.ID, UserID: collaborator.ID})
}
func deleteCollaborationByMode(ctx context.Context, repo *repo_model.Repository, collaborator *user_model.User, mode perm.AccessMode) error {
return deleteCollaboration(ctx, repo, collaborator, &repo_model.Collaboration{
RepoID: repo.ID, UserID: collaborator.ID, Mode: mode,
})
}
func deleteCollaboration(ctx context.Context, repo *repo_model.Repository, collaborator *user_model.User, collaboration *repo_model.Collaboration) (err error) {
return db.WithTx(ctx, func(ctx context.Context) error {
if has, err := db.GetEngine(ctx).Delete(collaboration); err != nil {
if deleted, err := db.GetEngine(ctx).Delete(collaboration); err != nil {
return err
} else if has == 0 {
} else if deleted == 0 {
return nil
}
if err := repo.LoadOwner(ctx); err != nil {
return err
}
if err = access_model.RecalculateAccesses(ctx, repo); err != nil {
return err
}
if err = repo_model.WatchRepoAuto(ctx, collaborator, repo, false); err != nil {
return err
}
if err = ReconsiderWatches(ctx, repo, collaborator); err != nil {
return err
}
@@ -115,7 +115,8 @@ func ReconsiderRepoIssuesAssignee(ctx context.Context, repo *repo_model.Reposito
}
func ReconsiderWatches(ctx context.Context, repo *repo_model.Repository, user *user_model.User) error {
if has, err := access_model.HasAnyUnitAccess(ctx, user.ID, repo); err != nil || has {
permission, err := access_model.GetIndividualUserRepoPermission(ctx, repo, user)
if err != nil || permission.HasAnyUnitAccessOrPublicAccess() {
return err
}
if err := repo_model.WatchRepoAuto(ctx, user, repo, false); err != nil {