github.com/ijc/docker-app@v0.6.1-0.20181012090447-c7ca8bc483fb/internal/packager/split.go (about)

     1  package packager
     2  
     3  import (
     4  	"io"
     5  	"io/ioutil"
     6  	"os"
     7  	"path/filepath"
     8  
     9  	"github.com/docker/app/internal"
    10  	"github.com/docker/app/types"
    11  	"github.com/pkg/errors"
    12  )
    13  
    14  // Split converts an app package to the split version
    15  func Split(app *types.App, outputDir string) error {
    16  	if len(app.Composes()) > 1 {
    17  		return errors.New("split: multiple compose files is not supported")
    18  	}
    19  	if len(app.SettingsRaw()) > 1 {
    20  		return errors.New("split: multiple setting files is not supported")
    21  	}
    22  	err := os.MkdirAll(outputDir, 0755)
    23  	if err != nil {
    24  		return err
    25  	}
    26  	for file, data := range map[string][]byte{
    27  		internal.MetadataFileName: app.MetadataRaw(),
    28  		internal.ComposeFileName:  app.Composes()[0],
    29  		internal.SettingsFileName: app.SettingsRaw()[0],
    30  	} {
    31  		if err := ioutil.WriteFile(filepath.Join(outputDir, file), data, 0644); err != nil {
    32  			return err
    33  		}
    34  	}
    35  	return nil
    36  }
    37  
    38  // Merge converts an app-package to the single-file merged version
    39  func Merge(app *types.App, target io.Writer) error {
    40  	if len(app.Composes()) > 1 {
    41  		return errors.New("merge: multiple compose files is not supported")
    42  	}
    43  	if len(app.SettingsRaw()) > 1 {
    44  		return errors.New("merge: multiple setting files is not supported")
    45  	}
    46  	for _, data := range [][]byte{
    47  		app.MetadataRaw(),
    48  		[]byte(types.SingleFileSeparator),
    49  		app.Composes()[0],
    50  		[]byte(types.SingleFileSeparator),
    51  		app.SettingsRaw()[0],
    52  	} {
    53  		if _, err := target.Write(data); err != nil {
    54  			return err
    55  		}
    56  	}
    57  	return nil
    58  }