Skip to content

Commit 2a56547

Browse files
Tagger can be empty, as can Commit and Author - tolerate this (#15835)
Unfortunately some old repositories can have tags with empty Tagger, Commit or Author. Go-Git variants will always have empty values for these whereas the native git variant leaves them at nil. The simplest solution is just to always have these set to empty Signatures. v156 migration also makes the incorrect assumption that these cannot be empty. Therefore add some handling to this and add logging and adjust broken logging elsewhere in this migration. Signed-off-by: Andrew Thornton <[email protected]> Co-authored-by: techknowlogick <[email protected]>
1 parent 3d7d750 commit 2a56547

File tree

3 files changed

+29
-8
lines changed

3 files changed

+29
-8
lines changed

models/migrations/v156.go

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
8888
repo = new(Repository)
8989
has, err := sess.ID(release.RepoID).Get(repo)
9090
if err != nil {
91-
log.Error("Error whilst loading repository[%d] for release[%d] with tag name %s", release.RepoID, release.ID, release.TagName)
91+
log.Error("Error whilst loading repository[%d] for release[%d] with tag name %s. Error: %v", release.RepoID, release.ID, release.TagName, err)
9292
return err
9393
} else if !has {
9494
log.Warn("Release[%d] is orphaned and refers to non-existing repository %d", release.ID, release.RepoID)
@@ -105,32 +105,50 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
105105
}
106106

107107
if _, err := sess.ID(release.RepoID).Get(repo); err != nil {
108-
log.Error("Error whilst loading repository[%d] for release[%d] with tag name %s", release.RepoID, release.ID, release.TagName)
108+
log.Error("Error whilst loading repository[%d] for release[%d] with tag name %s. Error: %v", release.RepoID, release.ID, release.TagName, err)
109109
return err
110110
}
111111
}
112112
gitRepo, err = git.OpenRepository(repoPath(repo.OwnerName, repo.Name))
113113
if err != nil {
114-
log.Error("Error whilst opening git repo for %-v", repo)
114+
log.Error("Error whilst opening git repo for [%d]%s/%s. Error: %v", repo.ID, repo.OwnerName, repo.Name, err)
115115
return err
116116
}
117117
}
118118

119119
commit, err := gitRepo.GetTagCommit(release.TagName)
120120
if err != nil {
121121
if git.IsErrNotExist(err) {
122-
log.Warn("Unable to find commit %s for Tag: %s in %-v. Cannot update publisher ID.", err.(git.ErrNotExist).ID, release.TagName, repo)
122+
log.Warn("Unable to find commit %s for Tag: %s in [%d]%s/%s. Cannot update publisher ID.", err.(git.ErrNotExist).ID, release.TagName, repo.ID, repo.OwnerName, repo.Name)
123123
continue
124124
}
125-
log.Error("Error whilst getting commit for Tag: %s in %-v.", release.TagName, repo)
125+
log.Error("Error whilst getting commit for Tag: %s in [%d]%s/%s. Error: %v", release.TagName, repo.ID, repo.OwnerName, repo.Name, err)
126126
return fmt.Errorf("GetTagCommit: %v", err)
127127
}
128128

129+
if commit.Author.Email == "" {
130+
log.Warn("Tag: %s in Repo[%d]%s/%s does not have a tagger.", release.TagName, repo.ID, repo.OwnerName, repo.Name)
131+
commit, err = gitRepo.GetCommit(commit.ID.String())
132+
if err != nil {
133+
if git.IsErrNotExist(err) {
134+
log.Warn("Unable to find commit %s for Tag: %s in [%d]%s/%s. Cannot update publisher ID.", err.(git.ErrNotExist).ID, release.TagName, repo.ID, repo.OwnerName, repo.Name)
135+
continue
136+
}
137+
log.Error("Error whilst getting commit for Tag: %s in [%d]%s/%s. Error: %v", release.TagName, repo.ID, repo.OwnerName, repo.Name, err)
138+
return fmt.Errorf("GetCommit: %v", err)
139+
}
140+
}
141+
142+
if commit.Author.Email == "" {
143+
log.Warn("Tag: %s in Repo[%d]%s/%s does not have a Tagger and its underlying commit does not have an Author either!", release.TagName, repo.ID, repo.OwnerName, repo.Name)
144+
continue
145+
}
146+
129147
if user == nil || !strings.EqualFold(user.Email, commit.Author.Email) {
130148
user = new(User)
131149
_, err = sess.Where("email=?", commit.Author.Email).Get(user)
132150
if err != nil {
133-
log.Error("Error whilst getting commit author by email: %s for Tag: %s in %-v.", commit.Author.Email, release.TagName, repo)
151+
log.Error("Error whilst getting commit author by email: %s for Tag: %s in [%d]%s/%s. Error: %v", commit.Author.Email, release.TagName, repo.ID, repo.OwnerName, repo.Name, err)
134152
return err
135153
}
136154

@@ -143,7 +161,7 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
143161

144162
release.PublisherID = user.ID
145163
if _, err := sess.ID(release.ID).Cols("publisher_id").Update(release); err != nil {
146-
log.Error("Error whilst updating publisher[%d] for release[%d] with tag name %s", release.PublisherID, release.ID, release.TagName)
164+
log.Error("Error whilst updating publisher[%d] for release[%d] with tag name %s. Error: %v", release.PublisherID, release.ID, release.TagName, err)
147165
return err
148166
}
149167
}

modules/git/commit_reader.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ import (
1717
// If used as part of a cat-file --batch stream you need to limit the reader to the correct size
1818
func CommitFromReader(gitRepo *Repository, sha SHA1, reader io.Reader) (*Commit, error) {
1919
commit := &Commit{
20-
ID: sha,
20+
ID: sha,
21+
Author: &Signature{},
22+
Committer: &Signature{},
2123
}
2224

2325
payloadSB := new(strings.Builder)

modules/git/tag.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ func (tag *Tag) Commit() (*Commit, error) {
3535
// \n\n separate headers from message
3636
func parseTagData(data []byte) (*Tag, error) {
3737
tag := new(Tag)
38+
tag.Tagger = &Signature{}
3839
// we now have the contents of the commit object. Let's investigate...
3940
nextline := 0
4041
l:

0 commit comments

Comments
 (0)