aboutsummaryrefslogtreecommitdiff
path: root/script
diff options
context:
space:
mode:
authorJakob Borg <jakob@kastelo.net>2022-12-21 22:02:44 +0100
committerGitHub <noreply@github.com>2022-12-21 22:02:44 +0100
commit09f4d865ae8fb47bc90d54b03cc2f2e01f70dc8d (patch)
tree688cb92922878bab572ee66bd58fdba48d578c5b /script
parentad0044fec863cfabce06e0335fa303a3eefa646f (diff)
downloadsyncthing-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.go54
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
+ }
}
}