diff options
author | Jakob Borg <jakob@kastelo.net> | 2022-12-21 22:02:44 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-21 22:02:44 +0100 |
commit | 09f4d865ae8fb47bc90d54b03cc2f2e01f70dc8d (patch) | |
tree | 688cb92922878bab572ee66bd58fdba48d578c5b /script | |
parent | ad0044fec863cfabce06e0335fa303a3eefa646f (diff) | |
download | syncthing-09f4d865ae8fb47bc90d54b03cc2f2e01f70dc8d.tar.gz syncthing-09f4d865ae8fb47bc90d54b03cc2f2e01f70dc8d.zip |
build: Handle co-authors (ref #3744) (#8708)
The authorship script didn't pick up people who were only ever
"co-authors" of a commit, such as when they wrote stuff which was later
included in a PR by someone else, or added code during code review.
This modified the script to look closer in the commit bodies for
"Co-authored-by:"-lines and adds those found to the set of authors.
Diffstat (limited to 'script')
-rw-r--r-- | script/authors.go | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/script/authors.go b/script/authors.go index f63d1924c..f8e84dd71 100644 --- a/script/authors.go +++ b/script/authors.go @@ -235,27 +235,63 @@ var excludeCommits = stringSetFromStrings([]string{ // allAuthors returns the set of authors in the git commit log, except those // in excluded commits. func allAuthors() map[string]string { - args := append([]string{"log", "--format=%H %ae %an"}) + // Format is hash, email, name, newline, body. The body is indented with + // one space, to differentiate from the hash lines. + args := append([]string{"log", "--format=%H %ae %an%n%w(,1,1)%b"}) cmd := exec.Command("git", args...) bs, err := cmd.Output() if err != nil { log.Fatal("git:", err) } + coAuthoredPrefix := "Co-authored-by: " names := make(map[string]string) + skipCommit := false for _, line := range bytes.Split(bs, []byte{'\n'}) { - fields := strings.SplitN(string(line), " ", 3) - if len(fields) != 3 { + if len(line) == 0 { continue } - hash, email, name := fields[0], fields[1], fields[2] - if excludeCommits.has(hash) { - continue - } + switch line[0] { + case ' ': + // Look for Co-authored-by: lines in the commit body. + if skipCommit { + continue + } + + line = line[1:] + if bytes.HasPrefix(line, []byte(coAuthoredPrefix)) { + // Co-authored-by: Name Name <email@example.com> + line = line[len(coAuthoredPrefix):] + if name, email, ok := strings.Cut(string(line), "<"); ok { + name = strings.TrimSpace(name) + email = strings.Trim(strings.TrimSpace(email), "<>") + if email == "@" { + // GitHub special for users who hide their email. + continue + } + if names[email] == "" { + names[email] = name + } + } + } - if names[email] == "" { - names[email] = name + default: // hash email name + fields := strings.SplitN(string(line), " ", 3) + if len(fields) != 3 { + continue + } + hash, email, name := fields[0], fields[1], fields[2] + + if excludeCommits.has(hash) { + skipCommit = true + continue + } + skipCommit = false + + if names[email] == "" { + names[email] = name + } } } |