Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: refactor CopyTemplateFiles to support different file system #78

Merged
merged 1 commit into from
Jun 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ require (
github.com/pkg/errors v0.9.1
github.com/pterm/pterm v0.12.42-0.20220427210824-6bb8c6e6cc77
github.com/sergi/go-diff v1.2.0
github.com/spf13/afero v1.2.2
github.com/spf13/cobra v1.1.1
github.com/stretchr/objx v0.3.0 // indirect
github.com/stretchr/testify v1.7.1
Expand Down
1 change: 1 addition & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -779,6 +779,7 @@ github.com/sourcegraph/jsonrpc2 v0.1.0 h1:ohJHjZ+PcaLxDUjqk2NC3tIGsVa5bXThe1ZheS
github.com/sourcegraph/jsonrpc2 v0.1.0/go.mod h1:ZafdZgk/axhT1cvZAPOhw+95nz2I/Ra5qMlU4gTRwIo=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
Expand Down
5 changes: 1 addition & 4 deletions pkg/kusionctl/cmd/init/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,6 @@ func (o *InitOptions) Complete(args []string) error {
if len(args) > 0 {
// user-specified link
o.TemplateNameOrURL = args[0]
} else {
// official link
o.TemplateNameOrURL = scaffold.KusionTemplateGitRepository
}
} else { // use offline templates, internal templates or user-specified local dir
if len(args) > 0 {
Expand Down Expand Up @@ -194,7 +191,7 @@ func (o *InitOptions) Run() error {
desDir := filepath.Join(cwd, o.ProjectName)

// Actually copy the files.
if err = scaffold.CopyTemplateFiles(template.Dir, desDir, o.Force, &tc); err != nil {
if err = scaffold.RenderLocalTemplate(template.Dir, desDir, o.Force, &tc); err != nil {
if os.IsNotExist(err) {
return fmt.Errorf("template '%s' not found: %w", template.Name, err)
}
Expand Down
70 changes: 66 additions & 4 deletions pkg/scaffold/internal_templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,24 @@ import (
"io/fs"
"os"
"path/filepath"

"github.com/spf13/afero"
)

//go:embed internal
var localTemplates embed.FS
var (
//go:embed internal
internalTemplates embed.FS

internalDir = "internal"
)

// GenInternalTemplates save localTemplates(FS) to internal-templates(target directory)
func GenInternalTemplates() error {
baseTemplateDir, err := GetTemplateDir(BaseTemplateDir)
if err != nil {
return err
}
return fs.WalkDir(localTemplates, ".", func(path string, d fs.DirEntry, err error) error {
return fs.WalkDir(internalTemplates, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
Expand All @@ -27,7 +33,7 @@ func GenInternalTemplates() error {
return err
}
} else {
bytes, err := localTemplates.ReadFile(path)
bytes, err := internalTemplates.ReadFile(path)
if err != nil {
return err
}
Expand All @@ -40,3 +46,59 @@ func GenInternalTemplates() error {
return nil
})
}

// Export internal templates which is embed in binary
func GetInternalTemplates() embed.FS {
return internalTemplates
}

// Transfer embed.FS into afero.Fs
func Transfer(srcFS embed.FS) (afero.Fs, error) {
destFS := afero.NewMemMapFs()
return destFS, fs.WalkDir(srcFS, internalDir, func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.IsDir() {
if err = destFS.MkdirAll(path, DefaultDirectoryPermission); err != nil {
return err
}
} else {
// Read source file content
content, err := fs.ReadFile(internalTemplates, path)
if err != nil {
return err
}
// Create or Update
writer, err := destFS.OpenFile(path, CreateOrUpdate, DefaultFilePermission)
if err != nil {
return err
}
defer func() {
if closeErr := writer.Close(); err == nil && closeErr != nil {
err = closeErr
}
}()
// Write into FS
if _, err := writer.Write(content); err != nil {
return err
}
}
return nil
})
}

// InternalTemplateNameToPath return a map of template name to path
func InternalTemplateNameToPath() map[string]string {
schemaToPath := make(map[string]string)
dirs, err := fs.ReadDir(internalTemplates, internalDir)
if err != nil {
return schemaToPath
}
for _, dir := range dirs {
if dir.IsDir() {
schemaToPath[dir.Name()] = filepath.Join(internalDir, dir.Name())
}
}
return schemaToPath
}
38 changes: 38 additions & 0 deletions pkg/scaffold/internal_templates_test.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package scaffold

import (
"io/fs"
"io/ioutil"
"path/filepath"
"testing"

"github.com/spf13/afero"
"github.com/stretchr/testify/assert"
)

Expand Down Expand Up @@ -58,3 +60,39 @@ func TestGenInternalTemplates(t *testing.T) {
err = checkFiles(srcDir, targetDir)
assert.Nil(t, err)
}

func TestInternalSchemas(t *testing.T) {
schemas := InternalTemplateNameToPath()
path, ok := schemas[templateName]
assert.True(t, ok)
assert.Equal(t, path, filepath.Join(templateDir, templateName))
}

func Test_readIntoFS(t *testing.T) {
local := afero.NewMemMapFs()
err := ReadTemplate(internalDir, local)
assert.Nil(t, err)

got := []string{}
err = afero.Walk(local, filepath.Join(templateDir, templateName), func(path string, info fs.FileInfo, err error) error {
got = append(got, path)
return nil
})
assert.Nil(t, err)

want := []string{
"internal/deployment-single-stack",
"internal/deployment-single-stack/README.md",
"internal/deployment-single-stack/base",
"internal/deployment-single-stack/base/base.k",
"internal/deployment-single-stack/kusion.yaml",
"internal/deployment-single-stack/project.yaml",
"internal/deployment-single-stack/stack",
"internal/deployment-single-stack/stack/ci-test",
"internal/deployment-single-stack/stack/ci-test/settings.yaml",
"internal/deployment-single-stack/stack/kcl.yaml",
"internal/deployment-single-stack/stack/main.k",
"internal/deployment-single-stack/stack/stack.yaml",
}
assert.Equal(t, want, got)
}
Loading