summaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
Diffstat (limited to 'models')
-rw-r--r--models/access.go3
-rw-r--r--models/repo_collaboration.go16
-rw-r--r--models/repo_transfer.go9
3 files changed, 23 insertions, 5 deletions
diff --git a/models/access.go b/models/access.go
index 560234aae8..7bbc04bd45 100644
--- a/models/access.go
+++ b/models/access.go
@@ -230,6 +230,9 @@ func (repo *Repository) refreshCollaboratorAccesses(e db.Engine, accessMap map[i
return fmt.Errorf("getCollaborations: %v", err)
}
for _, c := range collaborators {
+ if c.User.IsGhost() {
+ continue
+ }
updateUserAccess(accessMap, c.User, c.Collaboration.Mode)
}
return nil
diff --git a/models/repo_collaboration.go b/models/repo_collaboration.go
index 08360c102d..bc9d0100ef 100644
--- a/models/repo_collaboration.go
+++ b/models/repo_collaboration.go
@@ -9,6 +9,7 @@ import (
"fmt"
"code.gitea.io/gitea/models/db"
+ "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/timeutil"
"xorm.io/builder"
@@ -88,16 +89,21 @@ func (repo *Repository) getCollaborators(e db.Engine, listOptions db.ListOptions
return nil, fmt.Errorf("getCollaborations: %v", err)
}
- collaborators := make([]*Collaborator, len(collaborations))
- for i, c := range collaborations {
+ collaborators := make([]*Collaborator, 0, len(collaborations))
+ for _, c := range collaborations {
user, err := getUserByID(e, c.UserID)
if err != nil {
- return nil, err
+ if IsErrUserNotExist(err) {
+ log.Warn("Inconsistent DB: User: %d is listed as collaborator of %-v but does not exist", c.UserID, repo)
+ user = NewGhostUser()
+ } else {
+ return nil, err
+ }
}
- collaborators[i] = &Collaborator{
+ collaborators = append(collaborators, &Collaborator{
User: user,
Collaboration: c,
- }
+ })
}
return collaborators, nil
}
diff --git a/models/repo_transfer.go b/models/repo_transfer.go
index fe50c1cc04..082c3d19dc 100644
--- a/models/repo_transfer.go
+++ b/models/repo_transfer.go
@@ -274,6 +274,14 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) (err e
// Dummy object.
collaboration := &Collaboration{RepoID: repo.ID}
for _, c := range collaborators {
+ if c.IsGhost() {
+ collaboration.ID = c.Collaboration.ID
+ if _, err := sess.Delete(collaboration); err != nil {
+ return fmt.Errorf("remove collaborator '%d': %v", c.ID, err)
+ }
+ collaboration.ID = 0
+ }
+
if c.ID != newOwner.ID {
isMember, err := isOrganizationMember(sess, newOwner.ID, c.ID)
if err != nil {
@@ -286,6 +294,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) (err e
if _, err := sess.Delete(collaboration); err != nil {
return fmt.Errorf("remove collaborator '%d': %v", c.ID, err)
}
+ collaboration.UserID = 0
}
// Remove old team-repository relations.