Automatically configure user.name and user.email in .gitconfig#2981
Automatically configure user.name and user.email in .gitconfig#2981
Conversation
| t.Run("GitAutoconfig", func(t *testing.T) { | ||
| t.Parallel() | ||
| configPath := filepath.Join(os.TempDir(), "gitconfig") | ||
|
|
||
| initialContent := "[user]\nemail = [email protected]\n" | ||
| err := os.WriteFile(configPath, []byte(initialContent), 0600) | ||
| require.NoError(t, err) | ||
|
|
||
| setupAgent(t, agent.Metadata{ | ||
| OwnerUsername: "Kermit the Frog", | ||
| OwnerEmail: "[email protected]", | ||
| GitConfigPath: configPath, | ||
| }, 0) | ||
|
|
||
| gotContent := readFileContents(t, configPath) | ||
| require.Contains(t, gotContent, "name = Kermit the Frog") | ||
| require.Contains(t, gotContent, "email = [email protected]") | ||
| }) |
| if configPath == "" { | ||
| return nil | ||
| } | ||
| if strings.HasPrefix(configPath, "~/") { |
There was a problem hiding this comment.
It's admittedly a bit janky, but it does work, because we're passing the literal string ~/.gitconfig from the agent regardless of OS.
I guess it would be a bit cleaner (though more verbose) to turn configPath into an object that directly indicates whether it's absolute or relative to the home dir.
johnstcn
left a comment
There was a problem hiding this comment.
I just have a few questions about the path handling on Windows.
LGTM otherwise 👍
|
|
||
| var errNoGitAvailable = xerrors.New("Git does not seem to be installed") | ||
|
|
||
| func setupGitconfig(ctx context.Context, configPath string, params map[string]string) error { |
There was a problem hiding this comment.
I'm not convinced we should be touching anything in the user's home directory like this. I'd be in favor of removing these variables and exposing owner_email as a variable in the Terraform. These variables are easy to templatize anyways, and I think this could have unexpected consequences.
There was a problem hiding this comment.
That's a fair point. So are you suggesting putting something like this into the Terraform startup script?
git config --global user.name ${data.coder_workspace.me.owner}
git config --global user.email ${data.coder_workspace.me.owner_email}
One of the goals discussed in #2665 was to make this continue to work "automatically", but if it's handled by a short, easy-to-paste snippet that we put in our example templates, that's probably just as good.
There was a problem hiding this comment.
I agree with @kylecarbs that we probably shouldn't touch this file. For instance, this would break the use-case where a user stores their git config in $XDG_CONFIG_HOME/git/config (usually ~/.config/git/config) since ~/.gitconfig takes precedence, the user might not realize why their config is being ignored. It would be possible to detect the presence of ~/.config/git/config, but $XDG_CONFIG_HOME/git/config requires evaluation of the users dotfiles (e.g. launching a login shell and outputting the value).
Regarding adding git config --global user.name ${data.coder_workspace.me.owner} to the TF startup script, that could also suffer the same problem. If done like this, ideally it would be done in a step where the users environment is respected.
It's unfortunate the env variables can't be used as fallback, they have the benefit of being outside the users configuration.
There was a problem hiding this comment.
Would be nice if we had the startup scripts/tasks in the terraform file that run after the agent starts. The git setup could be a configurable task rather than special thing we always run.
There was a problem hiding this comment.
I think it'd be nice if we could specify task order, and checking out dotfiles would be part of this task order. Every task would run in the users full shell environment (e.g. login shell), then exit.
For instance:
bash -l 'checkout dotfiles; ./dotfiles/setup'zsh -l 'git config --global user.name ...'- ...
The bash -l part would be inferred from e.g. /etc/passwd (or some more robust method), this is because the users dotfiles might change the default shell between executions. So dotfiles are checked out as bash, but git config is run as zsh.
There was a problem hiding this comment.
@mafredri I'm proposing a template author adds their own environment variables:
resource "coder_agent" "testing" {
env {
GIT_AUTHOR_NAME = "${data.coder_workspace.me.owner_name}"
GIT_AUTHOR_EMAIL = "${data.coder_workspace.me.owner_email}"
}
}This can just be a note in our docs for guidance.
|
Closing because we decided to go with the approach in #3034 instead. |
This PR removes the existing functionality in the agent that was setting
GIT_*environment variables, and instead automatically configures theuser.nameanduser.emailglobal config settings so that users can customize the values.Making this testable required a bit more complexity than one might have expected. For one thing, we want to modify the actual
~/.gitconfigfile when running a real agent but not when running tests, so I added aGitConfigPathfield to the agent metadata object. For another, the test case covers modification of an existing Git config file, soagent.Newnow returns an interface that allows detecting when the agent has initialized itself, andagent_test.setupAgentwaits for that condition.Fixes #2665, obsoletes #2980