knotserver: set default git committer user via config #529

merged
opened by boltless.me targeting master from boltless.me/core: push-skprtmnmwuqn

Introducing KNOT_GIT_USER_NAME and KNOT_GIT_USER_EMAIL environment variables.

This will prevent silently inheritting global gitconfig's user

Signed-off-by: Seongmin Lee boltlessengineer@proton.me

Changed files
+39 -19
knotserver
+7
knotserver/config/config.go
··· 27 27 Dev bool `env:"DEV, default=false"` 28 28 } 29 29 30 + type Git struct { 31 + // user name & email used as committer 32 + UserName string `env:"USER_NAME, default=Tangled"` 33 + UserEmail string `env:"USER_EMAIL, default=noreply@tangled.sh"` 34 + } 35 + 30 36 func (s Server) Did() syntax.DID { 31 37 return syntax.DID(fmt.Sprintf("did:web:%s", s.Hostname)) 32 38 } ··· 34 40 type Config struct { 35 41 Repo Repo `env:",prefix=KNOT_REPO_"` 36 42 Server Server `env:",prefix=KNOT_SERVER_"` 43 + Git Git `env:",prefix=KNOT_GIT_"` 37 44 AppViewEndpoint string `env:"APPVIEW_ENDPOINT, default=https://tangled.sh"` 38 45 } 39 46
+4
knotserver/git/git.go
··· 109 109 } 110 110 g.h = *hash 111 111 } 112 + _, err = g.runGitCmd("config", "user.name", "<name>", "user.email", "<email>") 113 + if err != nil { 114 + return nil, err 115 + } 112 116 return &g, nil 113 117 } 114 118
+22 -15
knotserver/git/merge.go
··· 86 86 87 87 // MergeOptions specifies the configuration for a merge operation 88 88 type MergeOptions struct { 89 - CommitMessage string 90 - CommitBody string 91 - AuthorName string 92 - AuthorEmail string 93 - FormatPatch bool 89 + CommitMessage string 90 + CommitBody string 91 + AuthorName string 92 + AuthorEmail string 93 + CommitterName string 94 + CommitterEmail string 95 + FormatPatch bool 94 96 } 95 97 96 98 func (e ErrMerge) Error() string { ··· 165 167 var stderr bytes.Buffer 166 168 var cmd *exec.Cmd 167 169 168 - exec.Command("git", "-C", tmpDir, "config", "advice.mergeConflict", "false").Run() 170 + // configure default git user before merge 171 + exec.Command( 172 + "git", 173 + "-C", 174 + tmpDir, 175 + "config", 176 + "user.name", 177 + opts.CommitterName, 178 + "user.email", 179 + opts.CommitterEmail, 180 + "advice.mergeConflict", 181 + "false", 182 + ).Run() 169 183 170 184 // if patch is a format-patch, apply using 'git am' 171 185 if opts.FormatPatch { ··· 189 203 authorName := opts.AuthorName 190 204 authorEmail := opts.AuthorEmail 191 205 192 - if authorEmail == "" { 193 - authorEmail = "noreply@tangled.sh" 194 - } 195 - 196 - if authorName == "" { 197 - authorName = "Tangled" 198 - } 199 - 200 - if authorName != "" { 206 + if authorName != "" && authorEmail != "" { 201 207 commitArgs = append(commitArgs, "--author", fmt.Sprintf("%s <%s>", authorName, authorEmail)) 202 208 } 209 + // else, will default to knot's global user.name & user.email configured via `KNOT_GIT_USER_*` env variables 203 210 204 211 commitArgs = append(commitArgs, "-m", opts.CommitMessage) 205 212
+6 -4
knotserver/routes.go
··· 986 986 } 987 987 988 988 mo := git.MergeOptions{ 989 - AuthorName: data.AuthorName, 990 - AuthorEmail: data.AuthorEmail, 991 - CommitBody: data.CommitBody, 992 - CommitMessage: data.CommitMessage, 989 + AuthorName: data.AuthorName, 990 + AuthorEmail: data.AuthorEmail, 991 + CommitterName: h.c.Git.UserName, 992 + CommitterEmail: h.c.Git.UserEmail, 993 + CommitBody: data.CommitBody, 994 + CommitMessage: data.CommitMessage, 993 995 FormatPatch: patchutil.IsFormatPatch(patch), 994 996 } 995 997