Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 426102f

Browse files
committed
Corral name manipulation to utils package
Add app name validation function Signed-off-by: Joffrey F <[email protected]>
1 parent 3ef5583 commit 426102f

File tree

5 files changed

+75
-9
lines changed

5 files changed

+75
-9
lines changed

packager/extract.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func Extract(appname string) (string, func(), error) {
1414
s, err := os.Stat(appname)
1515
if err != nil {
1616
// try appending our extension
17-
appname = appname + ".docker-app"
17+
appname = utils.DirNameFromAppName(appname)
1818
s, err = os.Stat(appname)
1919
}
2020
if err != nil {

packager/init.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ import (
1616
// Init is the entrypoint initialization function.
1717
// It generates a new application package based on the provided parameters.
1818
func Init(name string, composeFiles []string) error {
19-
dirName := appDirName(name)
19+
if err := utils.ValidateAppName(name); err != nil {
20+
return err
21+
}
22+
dirName := utils.DirnameFromAppName(name)
2023
if err := os.Mkdir(dirName, 0755); err != nil {
2124
return err
2225
}
@@ -50,7 +53,7 @@ Examples of possible values: java, mysql, redis, ruby, postgres, rabbitmq...`)
5053
return err
5154
}
5255

53-
dirName := appDirName(name)
56+
dirName := utils.DirnameFromAppName(name)
5457
if err := utils.CreateFileWithData(path.Join(dirName, "services.yml"), composeData); err != nil {
5558
return err
5659
}
@@ -60,7 +63,7 @@ Examples of possible values: java, mysql, redis, ruby, postgres, rabbitmq...`)
6063
func initFromComposeFiles(name string, composeFiles []string) error {
6164
log.Println("init from compose")
6265

63-
dirName := appDirName(name)
66+
dirName := utils.DirnameFromAppName(name)
6467
composeConfig, err := mergeComposeConfig(composeFiles)
6568
if err != nil {
6669
return err
@@ -98,10 +101,6 @@ func composeFileFromScratch(services []string) ([]byte, error) {
98101
return yaml.Marshal(fileStruct)
99102
}
100103

101-
func appDirName(name string) string {
102-
return fmt.Sprintf("%s.docker-app", name)
103-
}
104-
105104
func writeMetadataFile(name, dirName string) error {
106105
data, err := yaml.Marshal(newMetadata(name))
107106
if err != nil {

packager/registry.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package packager
22

33
import (
4+
"github.com/docker/lunchbox/utils"
5+
46
"archive/tar"
57
"fmt"
68
"io"
@@ -13,7 +15,7 @@ import (
1315
)
1416

1517
func appName(appname string) string {
16-
return strings.TrimSuffix(path.Base(appname), ".docker-app")
18+
return utils.AppNameFromDir(appname)
1719
}
1820

1921
// Save saves an app to docker

utils/names.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package utils
2+
3+
import (
4+
"fmt"
5+
"path"
6+
"regexp"
7+
"strings"
8+
)
9+
10+
var appNameRe, _ = regexp.Compile("^[a-zA-Z][a-zA-Z0-9_-]+$")
11+
12+
// AppNameFromDir takes a path to an app directory and returns
13+
// the application's name
14+
func AppNameFromDir(dirName string) string {
15+
return strings.TrimSuffix(path.Base(dirName), ".docker-app")
16+
}
17+
18+
// DirNameFromAppName takes an application name and returns the
19+
// corresponding directory name
20+
func DirNameFromAppName(appName string) string {
21+
return fmt.Sprintf("%s.docker-app", appName)
22+
}
23+
24+
// ValidateAppName takes an app name and returns an error if it doesn't
25+
// match the expected format
26+
func ValidateAppName(appName string) error {
27+
if appNameRe.MatchString(appName) {
28+
return nil
29+
}
30+
return fmt.Errorf(
31+
"invalid app name: %s ; app names must match the following regexp: %q",
32+
appName,
33+
appNameRe.String(),
34+
)
35+
}

utils/names_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package utils
2+
3+
import (
4+
"fmt"
5+
"github.com/gotestyourself/gotestyourself/assert"
6+
"testing"
7+
)
8+
9+
func TestValidateAppName(t *testing.T) {
10+
validNames := []string{
11+
"app", "app1", "my-app", "their_app", "app_01_02_-",
12+
"LunchBox", "aPP01", "APP365",
13+
}
14+
15+
invalidNames := []string{
16+
"_app", "-app", "01_app", "$$$$$", "app$", "/my/app",
17+
"(u|\\|[|-||30><", "Our Fortress Is Burning", "d\nx",
18+
"my_\"app\"",
19+
}
20+
21+
for _, name := range validNames {
22+
err := ValidateAppName(name)
23+
assert.NilError(t, err)
24+
}
25+
26+
for _, name := range invalidNames {
27+
err := ValidateAppName(name)
28+
assert.ErrorContains(t, err, fmt.Sprintf("invalid app name: %s", name))
29+
}
30+
}

0 commit comments

Comments
 (0)