feat(cli): make the dotfiles repository directory configurable (#10377)

This commit is contained in:
Josh Vawdrey 2023-10-24 20:00:04 +11:00 committed by GitHub
parent d8592bf09a
commit 6b2aee4133
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 88 additions and 5 deletions

View File

@ -22,6 +22,7 @@ import (
func (r *RootCmd) dotfiles() *clibase.Cmd { func (r *RootCmd) dotfiles() *clibase.Cmd {
var symlinkDir string var symlinkDir string
var gitbranch string var gitbranch string
var dotfilesRepoDir string
cmd := &clibase.Cmd{ cmd := &clibase.Cmd{
Use: "dotfiles <git_repo_url>", Use: "dotfiles <git_repo_url>",
@ -35,11 +36,10 @@ func (r *RootCmd) dotfiles() *clibase.Cmd {
), ),
Handler: func(inv *clibase.Invocation) error { Handler: func(inv *clibase.Invocation) error {
var ( var (
dotfilesRepoDir = "dotfiles" gitRepo = inv.Args[0]
gitRepo = inv.Args[0] cfg = r.createConfig()
cfg = r.createConfig() cfgDir = string(cfg)
cfgDir = string(cfg) dotfilesDir = filepath.Join(cfgDir, dotfilesRepoDir)
dotfilesDir = filepath.Join(cfgDir, dotfilesRepoDir)
// This follows the same pattern outlined by others in the market: // This follows the same pattern outlined by others in the market:
// https://github.com/coder/coder/pull/1696#issue-1245742312 // https://github.com/coder/coder/pull/1696#issue-1245742312
installScriptSet = []string{ installScriptSet = []string{
@ -290,6 +290,13 @@ func (r *RootCmd) dotfiles() *clibase.Cmd {
"If empty, will default to cloning the default branch or using the existing branch in the cloned repo on disk.", "If empty, will default to cloning the default branch or using the existing branch in the cloned repo on disk.",
Value: clibase.StringOf(&gitbranch), Value: clibase.StringOf(&gitbranch),
}, },
{
Flag: "repo-dir",
Default: "dotfiles",
Env: "CODER_DOTFILES_REPO_DIR",
Description: "Specifies the directory for the dotfiles repository, relative to global config directory.",
Value: clibase.StringOf(&dotfilesRepoDir),
},
cliui.SkipPromptOption(), cliui.SkipPromptOption(),
} }
return cmd return cmd

View File

@ -50,6 +50,68 @@ func TestDotfiles(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, string(b), "wow") require.Equal(t, string(b), "wow")
}) })
t.Run("SwitchRepoDir", func(t *testing.T) {
t.Parallel()
_, root := clitest.New(t)
testRepo := testGitRepo(t, root)
// nolint:gosec
err := os.WriteFile(filepath.Join(testRepo, ".bashrc"), []byte("wow"), 0o750)
require.NoError(t, err)
c := exec.Command("git", "add", ".bashrc")
c.Dir = testRepo
err = c.Run()
require.NoError(t, err)
c = exec.Command("git", "commit", "-m", `"add .bashrc"`)
c.Dir = testRepo
out, err := c.CombinedOutput()
require.NoError(t, err, string(out))
inv, _ := clitest.New(t, "dotfiles", "--global-config", string(root), "--symlink-dir", string(root), "--repo-dir", "testrepo", "-y", testRepo)
err = inv.Run()
require.NoError(t, err)
b, err := os.ReadFile(filepath.Join(string(root), ".bashrc"))
require.NoError(t, err)
require.Equal(t, string(b), "wow")
stat, staterr := os.Stat(filepath.Join(string(root), "testrepo"))
require.NoError(t, staterr)
require.True(t, stat.IsDir())
})
t.Run("SwitchRepoDirRelative", func(t *testing.T) {
t.Parallel()
_, root := clitest.New(t)
testRepo := testGitRepo(t, root)
// nolint:gosec
err := os.WriteFile(filepath.Join(testRepo, ".bashrc"), []byte("wow"), 0o750)
require.NoError(t, err)
c := exec.Command("git", "add", ".bashrc")
c.Dir = testRepo
err = c.Run()
require.NoError(t, err)
c = exec.Command("git", "commit", "-m", `"add .bashrc"`)
c.Dir = testRepo
out, err := c.CombinedOutput()
require.NoError(t, err, string(out))
inv, _ := clitest.New(t, "dotfiles", "--global-config", string(root), "--symlink-dir", string(root), "--repo-dir", "./relrepo", "-y", testRepo)
err = inv.Run()
require.NoError(t, err)
b, err := os.ReadFile(filepath.Join(string(root), ".bashrc"))
require.NoError(t, err)
require.Equal(t, string(b), "wow")
stat, staterr := os.Stat(filepath.Join(string(root), "relrepo"))
require.NoError(t, staterr)
require.True(t, stat.IsDir())
})
t.Run("InstallScript", func(t *testing.T) { t.Run("InstallScript", func(t *testing.T) {
t.Parallel() t.Parallel()
if runtime.GOOS == "windows" { if runtime.GOOS == "windows" {

View File

@ -15,6 +15,10 @@ OPTIONS:
default branch or using the existing branch in the cloned repo on default branch or using the existing branch in the cloned repo on
disk. disk.
--repo-dir string, $CODER_DOTFILES_REPO_DIR (default: dotfiles)
Specifies the directory for the dotfiles repository, relative to
global config directory.
--symlink-dir string, $CODER_SYMLINK_DIR --symlink-dir string, $CODER_SYMLINK_DIR
Specifies the directory for the dotfiles symlink destinations. If Specifies the directory for the dotfiles symlink destinations. If
empty, will use $HOME. empty, will use $HOME.

10
docs/cli/dotfiles.md generated
View File

@ -28,6 +28,16 @@ coder dotfiles [flags] <git_repo_url>
Specifies which branch to clone. If empty, will default to cloning the default branch or using the existing branch in the cloned repo on disk. Specifies which branch to clone. If empty, will default to cloning the default branch or using the existing branch in the cloned repo on disk.
### --repo-dir
| | |
| ----------- | ------------------------------------- |
| Type | <code>string</code> |
| Environment | <code>$CODER_DOTFILES_REPO_DIR</code> |
| Default | <code>dotfiles</code> |
Specifies the directory for the dotfiles repository, relative to global config directory.
### --symlink-dir ### --symlink-dir
| | | | | |