Skip to content

Commit

Permalink
Organise dexec sources better #23
Browse files Browse the repository at this point in the history
Create packages for 'cli' and 'docker' functions. These are still
heavily coupled to dexec, but it's a start.

Also bumped version to 1.0.2-snapshot.
  • Loading branch information
andystanton committed May 5, 2015
1 parent 26f8d29 commit 9873aef
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 55 deletions.
3 changes: 2 additions & 1 deletion .goxc.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"PackageVersion": "1.0.1",
"PackageVersion": "1.0.2",
"PrereleaseInfo": "snapshot",
"ConfigVersion": "0.9",
"TaskSettings": {
"bintray": {
Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).

## [Unreleased][unreleased]
### Changed
- Moved Docker and CLI related functionality to separate packages.

## [1.0.1] - 2015-04-20
### Added
Expand Down
12 changes: 6 additions & 6 deletions cli.go → cli/cli.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package main
package cli

import (
"fmt"
Expand Down Expand Up @@ -51,8 +51,8 @@ const (
// CLI defines a data structure that represents the application's name and
// a map of the various options to be used when starting the container.
type CLI struct {
filename string
options map[OptionType][]string
Filename string
Options map[OptionType][]string
}

// ArgToOption takes two candidate strings and returns a tuple consisting of
Expand Down Expand Up @@ -134,8 +134,8 @@ func ParseArgs(args []string) map[OptionType][]string {
// filename and map of option types to their values.
func ParseOsArgs(args []string) CLI {
return CLI{
filename: args[0],
options: ParseArgs(args[1:]),
Filename: args[0],
Options: ParseArgs(args[1:]),
}
}

Expand All @@ -161,5 +161,5 @@ func DisplayHelp(filename string) {

// DisplayVersion prints the version information for the program.
func DisplayVersion(filename string) {
fmt.Printf("%s 1.0.1\n", filename)
fmt.Printf("%s 1.0.2-snapshot\n", filename)
}
42 changes: 21 additions & 21 deletions cli_test.go → cli/cli_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package main
package cli

import (
"reflect"
Expand Down Expand Up @@ -137,8 +137,8 @@ func TestFilename(t *testing.T) {
}
for _, c := range cases {
got := ParseOsArgs(c.osArgs)
if got.filename != c.want {
t.Errorf("ParseOsArgs %q != %q", got.filename, c.want)
if got.Filename != c.want {
t.Errorf("ParseOsArgs %q != %q", got.Filename, c.want)
}
}
}
Expand All @@ -152,8 +152,8 @@ func TestTargetDir(t *testing.T) {
}
for _, c := range cases {
got := ParseOsArgs(c.osArgs)
if !reflect.DeepEqual(got.options[TargetDir], c.want) {
t.Errorf("ParseOsArgs %q != %q", got.options[TargetDir], c.want)
if !reflect.DeepEqual(got.Options[TargetDir], c.want) {
t.Errorf("ParseOsArgs %q != %q", got.Options[TargetDir], c.want)
}
}
}
Expand All @@ -170,8 +170,8 @@ func TestSources(t *testing.T) {
}
for _, c := range cases {
got := ParseOsArgs(c.osArgs)
if !reflect.DeepEqual(got.options[Source], c.want) {
t.Errorf("ParseOsArgs %q != %q", got.options[Source], c.want)
if !reflect.DeepEqual(got.Options[Source], c.want) {
t.Errorf("ParseOsArgs %q != %q", got.Options[Source], c.want)
}
}
}
Expand All @@ -188,8 +188,8 @@ func TestSpecifyImage(t *testing.T) {
}
for _, c := range cases {
got := ParseOsArgs(c.osArgs)
if !reflect.DeepEqual(got.options[SpecifyImage], c.want) {
t.Errorf("ParseOsArgs %q != %q", got.options[SpecifyImage], c.want)
if !reflect.DeepEqual(got.Options[SpecifyImage], c.want) {
t.Errorf("ParseOsArgs %q != %q", got.Options[SpecifyImage], c.want)
}
}
}
Expand All @@ -206,8 +206,8 @@ func TestIncludes(t *testing.T) {
}
for _, c := range cases {
got := ParseOsArgs(c.osArgs)
if !reflect.DeepEqual(got.options[Include], c.want) {
t.Errorf("ParseOsArgs %q != %q", got.options[Include], c.want)
if !reflect.DeepEqual(got.Options[Include], c.want) {
t.Errorf("ParseOsArgs %q != %q", got.Options[Include], c.want)
}
}
}
Expand All @@ -224,8 +224,8 @@ func TestArgs(t *testing.T) {
}
for _, c := range cases {
got := ParseOsArgs(c.osArgs)
if !reflect.DeepEqual(got.options[Arg], c.want) {
t.Errorf("ParseOsArgs %q != %q", got.options[Arg], c.want)
if !reflect.DeepEqual(got.Options[Arg], c.want) {
t.Errorf("ParseOsArgs %q != %q", got.Options[Arg], c.want)
}
}
}
Expand All @@ -242,8 +242,8 @@ func TestBuildArgs(t *testing.T) {
}
for _, c := range cases {
got := ParseOsArgs(c.osArgs)
if !reflect.DeepEqual(got.options[BuildArg], c.want) {
t.Errorf("ParseOsArgs %q != %q", got.options[BuildArg], c.want)
if !reflect.DeepEqual(got.Options[BuildArg], c.want) {
t.Errorf("ParseOsArgs %q != %q", got.Options[BuildArg], c.want)
}
}
}
Expand Down Expand Up @@ -299,12 +299,12 @@ func TestOrdering(t *testing.T) {
}
for _, c := range cases {
got := ParseOsArgs(c.osArgs)
if !reflect.DeepEqual(got.options[BuildArg], c.want[BuildArg]) {
t.Errorf("ParseOsArgs %q != %q", got.options[BuildArg], c.want[BuildArg])
} else if !reflect.DeepEqual(got.options[Arg], c.want[Arg]) {
t.Errorf("ParseOsArgs %q != %q", got.options[Arg], c.want[Arg])
} else if !reflect.DeepEqual(got.options[Source], c.want[Source]) {
t.Errorf("ParseOsArgs %q != %q", got.options[Source], c.want[Source])
if !reflect.DeepEqual(got.Options[BuildArg], c.want[BuildArg]) {
t.Errorf("ParseOsArgs %q != %q", got.Options[BuildArg], c.want[BuildArg])
} else if !reflect.DeepEqual(got.Options[Arg], c.want[Arg]) {
t.Errorf("ParseOsArgs %q != %q", got.Options[Arg], c.want[Arg])
} else if !reflect.DeepEqual(got.Options[Source], c.want[Source]) {
t.Errorf("ParseOsArgs %q != %q", got.Options[Source], c.want[Source])
}
}
}
53 changes: 28 additions & 25 deletions dexec.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ import (
"regexp"
"runtime"
"strings"

"github.com/docker-exec/dexec/cli"
"github.com/docker-exec/dexec/docker"
)

// ExtractFileExtension extracts the extension from a filename. This is defined
Expand Down Expand Up @@ -165,67 +168,67 @@ func RetrievePath(targetDirs []string) string {
// RunDexecContainer runs an anonymous Docker container with a Docker Exec
// image, mounting the specified sources and includes and passing the
// list of sources and arguments to the entrypoint.
func RunDexecContainer(dexecImage DexecImage, options map[OptionType][]string) {
func RunDexecContainer(dexecImage DexecImage, options map[cli.OptionType][]string) {
dockerImage := fmt.Sprintf(dexecImageTemplate, dexecImage.image, dexecImage.version)

volumeArgs := BuildVolumeArgs(RetrievePath(options[TargetDir]), append(options[Source], options[Include]...))
volumeArgs := BuildVolumeArgs(RetrievePath(options[cli.TargetDir]), append(options[Source], options[cli.Include]...))

var sourceBasenames []string
for _, source := range options[Source] {
for _, source := range options[cli.Source] {
basename, _ := ExtractBasenameAndPermission(source)
sourceBasenames = append(sourceBasenames, []string{basename}...)
}

entrypointArgs := JoinStringSlices(
entrypointArgs := docker.JoinStringSlices(
sourceBasenames,
AddPrefix(options[BuildArg], "-b"),
AddPrefix(options[Arg], "-a"),
docker.AddPrefix(options[cli.BuildArg], "-b"),
docker.AddPrefix(options[cli.Arg], "-a"),
)

if len(options[UpdateFlag]) > 0 {
DockerPull(dockerImage)
if len(options[cli.UpdateFlag]) > 0 {
docker.DockerPull(dockerImage)
}

RunAnonymousContainer(
docker.RunAnonymousContainer(
dockerImage,
volumeArgs,
entrypointArgs,
)
}

func validate(cli CLI) bool {
if !IsDockerPresent() {
func validate(cliParser cli.CLI) bool {
if !docker.IsDockerPresent() {
log.Fatal("Docker not found")
} else if !IsDockerRunning() {
} else if !docker.IsDockerRunning() {
log.Fatal("Docker not running")
}

valid := false
if len(cli.options[VersionFlag]) != 0 {
DisplayVersion(cli.filename)
} else if len(cli.options[Source]) == 0 ||
len(cli.options[HelpFlag]) != 0 ||
len(cli.options[TargetDir]) > 1 ||
len(cli.options[SpecifyImage]) > 1 {
DisplayHelp(cli.filename)
if len(cliParser.Options[cli.VersionFlag]) != 0 {
cli.DisplayVersion(cliParser.Filename)
} else if len(cliParser.Options[cli.Source]) == 0 ||
len(cliParser.Options[cli.HelpFlag]) != 0 ||
len(cliParser.Options[cli.TargetDir]) > 1 ||
len(cliParser.Options[cli.SpecifyImage]) > 1 {
cli.DisplayHelp(cliParser.Filename)
} else {
valid = true
}
return valid
}

func main() {
cli := ParseOsArgs(os.Args)
cliParser := cli.ParseOsArgs(os.Args)

if validate(cli) {
extension := ExtractFileExtension(cli.options[Source][0])
if validate(cliParser) {
extension := ExtractFileExtension(cliParser.Options[cli.Source][0])
image := LookupImageByExtension(extension)
if len(cli.options[SpecifyImage]) == 1 {
image = LookupImageByOverride(cli.options[SpecifyImage][0], extension)
if len(cliParser.Options[cli.SpecifyImage]) == 1 {
image = LookupImageByOverride(cliParser.Options[cli.SpecifyImage][0], extension)
}
RunDexecContainer(
image,
cli.options,
cliParser.Options,
)
}
}
2 changes: 1 addition & 1 deletion docker.go → docker/docker.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package main
package docker

import (
"os"
Expand Down
2 changes: 1 addition & 1 deletion docker_test.go → docker/docker_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package main
package docker

import (
"reflect"
Expand Down

0 comments on commit 9873aef

Please sign in to comment.