Skip to content

Commit 8cf1821

Browse files
authored
[gen-readme] Allow custom templates (#1794)
## Summary This adds: Flag that saves default template ``` devbox generate readme [path] --save-template ``` Flag that uses custom template ``` devbox generate readme [path] --template <custom-template> ``` It also: * defaults readme [path] to `README.md` * defaults template [path] to `readme.tmpl` * If there is `readme.tmpl` in root, then `devbox generate readme` will use it automatically. * Fixed missing env vars from default template ## How was it tested? ``` devbox generate readme --save-template # generate template vi readme.tmpl # modified template devbox generate readme devbox.md # tested creating new readme ```
1 parent dcfe461 commit 8cf1821

File tree

4 files changed

+71
-10
lines changed

4 files changed

+71
-10
lines changed

devbox.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ Scripts are custom commands that can be run using this project's environment. Th
3636
* [tidy](#devbox-run-tidy)
3737
* [update-examples](#devbox-run-update-examples)
3838

39+
## Environment
40+
41+
```sh
42+
GOENV="off"
43+
PATH="$PATH:$PWD/dist"
44+
```
45+
3946
## Shell Init Hook
4047
The Shell Init Hook is a script that runs whenever the devbox environment is instantiated. It runs
4148
on `devbox shell` and on `devbox run`.

internal/boxcli/generate.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ type generateCmdFlags struct {
2222
rootUser bool
2323
}
2424

25+
type GenerateReadmeCmdFlags struct {
26+
generateCmdFlags
27+
saveTemplate bool
28+
template string
29+
}
30+
2531
func generateCmd() *cobra.Command {
2632
flags := &generateCmdFlags{}
2733

@@ -140,11 +146,12 @@ func sshConfigCmd() *cobra.Command {
140146
}
141147

142148
func genReadmeCmd() *cobra.Command {
143-
flags := &generateCmdFlags{}
149+
flags := &GenerateReadmeCmdFlags{}
150+
144151
command := &cobra.Command{
145152
Use: "readme [filename]",
146153
Short: "Generate markdown readme file for this project",
147-
Args: cobra.ExactArgs(1),
154+
Args: cobra.MaximumNArgs(1),
148155
RunE: func(cmd *cobra.Command, args []string) error {
149156
box, err := devbox.Open(&devopt.Opts{
150157
Dir: flags.config.path,
@@ -154,10 +161,22 @@ func genReadmeCmd() *cobra.Command {
154161
if err != nil {
155162
return errors.WithStack(err)
156163
}
157-
return docgen.GenerateReadme(box, args[0])
164+
outPath := ""
165+
if len(args) > 0 {
166+
outPath = args[0]
167+
}
168+
if flags.saveTemplate {
169+
return docgen.SaveDefaultReadmeTemplate(outPath)
170+
}
171+
return docgen.GenerateReadme(box, outPath, flags.template)
158172
},
159173
}
160174
flags.config.register(command)
175+
command.Flags().BoolVar(
176+
&flags.saveTemplate, "save-template", false, "Save default template for the README file")
177+
command.Flags().StringVarP(
178+
&flags.template, "template", "t", "", "Path to a custom template for the README file")
179+
161180
return command
162181
}
163182

internal/devbox/docgen/docgen.go

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,51 @@ import (
66
"text/template"
77

88
"go.jetpack.io/devbox/internal/devbox"
9+
"go.jetpack.io/devbox/internal/fileutil"
910
)
1011

1112
//go:embed readme.tmpl
12-
var readmeTemplate string
13+
var defaultReadmeTemplate string
1314

14-
func GenerateReadme(devbox *devbox.Devbox, path string) error {
15-
t, err := template.New("readme").Parse(readmeTemplate)
15+
const (
16+
defaultName = "README.md"
17+
defaultTemplateName = "readme.tmpl"
18+
)
19+
20+
func GenerateReadme(
21+
devbox *devbox.Devbox,
22+
outputPath, templatePath string,
23+
) error {
24+
readmeTemplate := defaultReadmeTemplate
25+
if templatePath != "" {
26+
readmeTemplateBytes, err := os.ReadFile(templatePath)
27+
if err != nil {
28+
return err
29+
}
30+
readmeTemplate = string(readmeTemplateBytes)
31+
} else if fileutil.Exists(defaultTemplateName) {
32+
readmeTemplateBytes, err := os.ReadFile(defaultTemplateName)
33+
if err != nil {
34+
return err
35+
}
36+
readmeTemplate = string(readmeTemplateBytes)
37+
}
38+
39+
tmpl, err := template.New("readme").Parse(readmeTemplate)
1640
if err != nil {
1741
return err
1842
}
1943

20-
f, err := os.Create(path)
44+
if outputPath == "" {
45+
outputPath = defaultName
46+
}
47+
48+
f, err := os.Create(outputPath)
2149
if err != nil {
2250
return err
2351
}
2452

25-
return t.Execute(f, map[string]any{
53+
return tmpl.Execute(f, map[string]any{
2654
"Name": devbox.Config().Name,
2755
"Description": devbox.Config().Description,
2856
"Scripts": devbox.Config().Scripts(),
@@ -31,3 +59,10 @@ func GenerateReadme(devbox *devbox.Devbox, path string) error {
3159
"Packages": devbox.ConfigPackages(),
3260
})
3361
}
62+
63+
func SaveDefaultReadmeTemplate(outputPath string) error {
64+
if outputPath == "" {
65+
outputPath = defaultTemplateName
66+
}
67+
return os.WriteFile(outputPath, []byte(defaultReadmeTemplate), 0o644)
68+
}

internal/devbox/docgen/readme.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ Scripts are custom commands that can be run using this project's environment. Th
3333
{{- end }}
3434
{{ end }}
3535

36-
{{- if .Env }}
36+
{{- if .EnvVars }}
3737
## Environment
3838

3939
```sh
40-
{{- range $key, $value := .Env }}
40+
{{- range $key, $value := .EnvVars }}
4141
{{ $key }}="{{ $value }}"
4242
{{- end }}
4343
```

0 commit comments

Comments
 (0)