mirror of https://github.com/coder/coder.git
feat(cli): make the dotfiles repository directory configurable (#10377)
This commit is contained in:
parent
d8592bf09a
commit
6b2aee4133
|
@ -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
|
||||||
|
|
|
@ -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" {
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
| | |
|
| | |
|
||||||
|
|
Loading…
Reference in New Issue