You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
777 B
43 lines
777 B
package main |
|
|
|
import ( |
|
"errors" |
|
"os/exec" |
|
"regexp" |
|
"strings" |
|
) |
|
|
|
var ( |
|
keyRE = regexp.MustCompile(`^\s+([^\s]+)`) |
|
authorRE = regexp.MustCompile(`uid[^]]+]\s([^\s]+)\s<([^>]+)`) |
|
) |
|
|
|
func gpgKeys() ([]Identity, error) { |
|
cmd := exec.Command("gpg", "-k") |
|
out, err := cmd.Output() |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
lines := strings.Split(string(out), "\n") |
|
if len(lines) < 2 { |
|
return nil, errors.New("no GPG keys found") |
|
} |
|
lines = lines[2:] |
|
|
|
idents := make([]Identity, 0) |
|
for idx := 0; idx < len(lines); idx += 5 { |
|
if len(lines) < idx+4 { |
|
break |
|
} |
|
|
|
author := authorRE.FindStringSubmatch(lines[idx+2]) |
|
idents = append(idents, Identity{ |
|
Name: author[1], |
|
Email: author[2], |
|
Key: keyRE.FindString(lines[idx+1]), |
|
}) |
|
} |
|
|
|
return idents, nil |
|
}
|
|
|