diff --git a/cli/build.go b/cli/build.go index 8f1ed6b..bccbecb 100644 --- a/cli/build.go +++ b/cli/build.go @@ -18,7 +18,7 @@ func getBuildCommand() *cobra.Command { if err != nil { return fmt.Errorf("%+v", err) } - def, err := service_definition.GetServiceDefinition(pathProvided) + def, err := service_definition.NewDefinitionFetcher().GetDefinition(pathProvided) if err != nil { return fmt.Errorf("Failed to read service definition from file: %+v", err) diff --git a/cli/start_service.go b/cli/start_service.go index 29736a8..4bd12a8 100644 --- a/cli/start_service.go +++ b/cli/start_service.go @@ -49,7 +49,7 @@ func getStartCommand() *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { ctx := cmd.Context() flags := ctx.Value("flags").(ParsedFlags) - def, err := service_definition.GetServiceDefinition(flags.definitionPath) + def, err := service_definition.NewDefinitionFetcher().GetDefinition(flags.definitionPath) if err != nil { return fmt.Errorf("Failed to read service definition: %+v", err) diff --git a/service_definition/fetcher.go b/service_definition/fetcher.go index d7de849..87c6bd2 100644 --- a/service_definition/fetcher.go +++ b/service_definition/fetcher.go @@ -7,26 +7,58 @@ import ( "strings" ) +type GitClient interface { + Clone(path string, destination string) (string, error) +} + +type Git struct{} + +func (g Git) Clone(path string, destination string) (string, error) { + cloneCmd := exec.Command("git", "clone", path, destination) + + if err := cloneCmd.Run(); err != nil { + return "", err + } + + return path, nil +} + +type DefinitionFetcher struct { + Git GitClient +} + +func NewDefinitionFetcher() DefinitionFetcher { + return DefinitionFetcher{ + Git: Git{}, + } +} + +func (f DefinitionFetcher) GetDefinition(path string) (ServiceDefinition, error) { + if strings.HasPrefix(path, "git+") { + return f.getDefinitionFromGit(path) + } + + return f.getDefinitionFromFile(path) +} + // Clones the target git repository and uses it as a basis to extract // a service definition. -func getDefinitionFromGit(path string) (ServiceDefinition, error) { +func (f DefinitionFetcher) getDefinitionFromGit(path string) (ServiceDefinition, error) { dir, err := os.MkdirTemp("/tmp", "spud-service-") if err != nil { return ServiceDefinition{}, err } - cloneCmd := exec.Command("git", "clone", strings.TrimPrefix(path, "git+"), dir) - - if err := cloneCmd.Run(); err != nil { + if _, err := f.Git.Clone(strings.TrimPrefix(path, "git+"), dir); err != nil { return ServiceDefinition{}, err } - return getDefinitionFromFile(dir + "/service.yml") + return f.getDefinitionFromFile(dir + "/service.yml") } // Extracts a service definition from the given filepath. -func getDefinitionFromFile(path string) (ServiceDefinition, error) { +func (f DefinitionFetcher) getDefinitionFromFile(path string) (ServiceDefinition, error) { var definition ServiceDefinition defData, err := os.ReadFile(path) diff --git a/service_definition/main.go b/service_definition/main.go index 7b57423..929720b 100644 --- a/service_definition/main.go +++ b/service_definition/main.go @@ -1,9 +1,5 @@ package service_definition -import ( - "strings" -) - type BuildImage struct { Path string `yaml:"path"` TagPrefix string `yaml:"tag"` @@ -47,11 +43,3 @@ type ServiceDefinition struct { Containers []ContainerDefinition `yaml:"containers"` Ports []PortMapping `yaml:"ports"` } - -func GetServiceDefinition(path string) (ServiceDefinition, error) { - if strings.HasPrefix(path, "git+") { - return getDefinitionFromGit(path) - } - - return getDefinitionFromFile(path) -} diff --git a/service_definition/service_definition_test.go b/service_definition/service_definition_test.go index a63b02a..5cebc88 100644 --- a/service_definition/service_definition_test.go +++ b/service_definition/service_definition_test.go @@ -5,7 +5,7 @@ import ( ) func TestGetServiceDefinitionFromFileDoesNotExist(t *testing.T) { - _, err := GetServiceDefinition(t.TempDir() + "/not-a-file.yml") + _, err := NewDefinitionFetcher().GetDefinition(t.TempDir() + "/not-a-file.yml") if err == nil { t.Errorf("Expected error, got nil.")