github.com/SAP/cloud-mta-build-tool@v1.2.27/internal/artifacts/meta.go (about)

     1  package artifacts
     2  
     3  import (
     4  	"fmt"
     5  	"gopkg.in/yaml.v2"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	"github.com/pkg/errors"
    11  
    12  	"github.com/SAP/cloud-mta-build-tool/internal/archive"
    13  	"github.com/SAP/cloud-mta-build-tool/internal/logs"
    14  	"github.com/SAP/cloud-mta-build-tool/internal/platform"
    15  	"github.com/SAP/cloud-mta/mta"
    16  )
    17  
    18  // ExecuteGenMeta - generates metadata
    19  func ExecuteGenMeta(source, target, desc string, extensions []string, platform string, wdGetter func() (string, error)) error {
    20  	logs.Logger.Info("generating the metadata...")
    21  	loc, err := dir.Location(source, target, desc, extensions, wdGetter)
    22  	if err != nil {
    23  		return errors.Wrap(err, "failed to generate metadata when initializing the location")
    24  	}
    25  	return executeGenMetaByLocation(loc, loc, platform, true, true)
    26  }
    27  
    28  func executeGenMetaByLocation(loc *dir.Loc, targetArtifacts dir.ITargetArtifacts, platform string, createMetaInf bool, validatePaths bool) error {
    29  	// validate platform
    30  	platform, err := validatePlatform(platform)
    31  	if err != nil {
    32  		return err
    33  	}
    34  
    35  	err = dir.CreateDirIfNotExist(targetArtifacts.GetMetaPath())
    36  	if err != nil {
    37  		return err
    38  	}
    39  
    40  	err = generateMeta(loc, targetArtifacts, loc.IsDeploymentDescriptor(), platform, createMetaInf, validatePaths)
    41  	return err
    42  }
    43  
    44  // generateMeta - generate metadata artifacts
    45  func generateMeta(loc *dir.Loc, targetArtifacts dir.ITargetArtifacts, deploymentDescriptor bool, platform string, createMetaInf bool, validatePaths bool) error {
    46  
    47  	// parse MTA file
    48  	m, err := loc.ParseFile()
    49  	if err != nil {
    50  		return errors.Wrapf(err, genMetaMsg)
    51  	}
    52  
    53  	// Generate meta info dir with required content
    54  	err = genMetaInfo(loc, targetArtifacts, loc, deploymentDescriptor, platform, m, createMetaInf, validatePaths)
    55  	return err
    56  }
    57  
    58  // genMetaInfo generates a MANIFEST.MF file and updates the build artifacts paths for deployment purposes.
    59  func genMetaInfo(source dir.IModule, ep dir.ITargetArtifacts, targetPathGetter dir.ITargetPath, deploymentDesc bool,
    60  	platform string, mtaStr *mta.MTA, createMetaInf bool, validatePaths bool) (rerr error) {
    61  
    62  	if createMetaInf {
    63  		// Set the MANIFEST.MF file
    64  		err := setManifestDesc(source, ep, targetPathGetter, deploymentDesc, mtaStr.Modules, mtaStr.Resources, platform)
    65  		if err != nil {
    66  			return errors.Wrap(err, genMetaPopulatingMsg)
    67  		}
    68  	}
    69  
    70  	err := genMtad(mtaStr, ep, targetPathGetter, deploymentDesc, platform, validatePaths, nil, yaml.Marshal)
    71  	if err != nil {
    72  		return errors.Wrap(err, genMetaMTADMsg)
    73  	}
    74  
    75  	return nil
    76  }
    77  
    78  // ConvertTypes - convert types to appropriate target platform types
    79  func ConvertTypes(mtaStr mta.MTA, platformName string) error {
    80  	// Load platform configuration file
    81  	platformCfg, err := platform.Unmarshal(platform.PlatformConfig)
    82  	if err == nil {
    83  		// Modify MTAD object according to platform types
    84  		platform.ConvertTypes(mtaStr, platformCfg, platformName)
    85  	}
    86  	return err
    87  }
    88  
    89  // ExecuteMerge merges mta.yaml and MTA extension descriptors and writes the result to a file with the given name
    90  func ExecuteMerge(source, target string, extensions []string, name string, wdGetter func() (string, error)) error {
    91  	logs.Logger.Info(mergeInfoMsg)
    92  
    93  	if name == "" {
    94  		return fmt.Errorf(mergeNameRequiredMsg)
    95  	}
    96  	loc, err := dir.Location(source, target, dir.Dev, extensions, wdGetter)
    97  	if err != nil {
    98  		return err
    99  	}
   100  	m, err := loc.ParseFile()
   101  	if err != nil {
   102  		return err
   103  	}
   104  	merged, err := yaml.Marshal(m)
   105  	if err != nil {
   106  		return err
   107  	}
   108  	mtaPath := filepath.Join(target, name)
   109  	// Check the file doesn't already exist
   110  	if _, err = os.Stat(mtaPath); err == nil {
   111  		return fmt.Errorf(mergeFailedOnFileCreationMsg, mtaPath)
   112  	}
   113  	err = dir.CreateDirIfNotExist(filepath.Clean(target))
   114  	if err != nil {
   115  		return err
   116  	}
   117  	// Write the mta file to the selected folder
   118  	err = ioutil.WriteFile(mtaPath, merged, os.ModePerm)
   119  	return err
   120  }