github.com/c3pm-labs/c3pm@v0.3.0/ctpm/build.go (about)

     1  package ctpm
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/Masterminds/semver/v3"
     6  	"github.com/c3pm-labs/c3pm/adapter"
     7  	"github.com/c3pm-labs/c3pm/adapter_interface"
     8  	"github.com/c3pm-labs/c3pm/config"
     9  	"github.com/c3pm-labs/c3pm/config/manifest"
    10  	"github.com/c3pm-labs/c3pm/dependencies"
    11  )
    12  
    13  type DependencyBuilder struct {
    14  	Done manifest.Dependencies
    15  }
    16  
    17  func (d DependencyBuilder) FetchDeps(request dependencies.PackageRequest) (dependencies.Dependencies, error) {
    18  	if _, ok := d.Done[request.Name]; ok {
    19  		return dependencies.Dependencies{}, nil
    20  	}
    21  	libPath := config.LibCachePath(request.Name, request.Version)
    22  	pc, err := config.Load(libPath)
    23  	if err != nil {
    24  		return nil, fmt.Errorf("failed to read c3pm.yml: %w", err)
    25  	}
    26  	ret := make(dependencies.Dependencies)
    27  	for k, v := range pc.Manifest.Dependencies {
    28  		ret[k] = v
    29  	}
    30  	return ret, nil
    31  }
    32  
    33  func (d DependencyBuilder) PreAct(_ dependencies.PackageRequest) error { return nil }
    34  func (d DependencyBuilder) PostAct(request dependencies.PackageRequest) error {
    35  	fmt.Printf("Building %s:%s\n", request.Name, request.Version)
    36  
    37  	libPath := config.LibCachePath(request.Name, request.Version)
    38  	pc, err := config.Load(libPath)
    39  	if err != nil {
    40  		return fmt.Errorf("failed to read c3pm.yml: %w", err)
    41  	}
    42  	getter := adapter.AdapterGetterImp{}
    43  	var adp adapter_interface.Adapter
    44  	adp, err = getter.FromPC(pc.Manifest.Build.Adapter)
    45  	if err != nil {
    46  		return err
    47  	}
    48  	err = adp.Build(pc)
    49  	if err != nil {
    50  		return fmt.Errorf("error building: %w", err)
    51  	}
    52  	d.Done[fmt.Sprintf(request.Name)] = request.Version
    53  	return nil
    54  }
    55  
    56  func getAllDependencies(pc *config.ProjectConfig) error {
    57  	allDeps := make(manifest.Dependencies)
    58  	allDeps[pc.Manifest.Name] = pc.Manifest.Version.String()
    59  	for name, version := range pc.Manifest.Dependencies {
    60  		_, err := dependencies.Install(dependencies.PackageRequest{Name: name, Version: version}, DependencyBuilder{Done: allDeps})
    61  		if err != nil {
    62  			return err
    63  		}
    64  	}
    65  	delete(allDeps, pc.Manifest.Name)
    66  	pc.Manifest.Dependencies = allDeps
    67  	return nil
    68  }
    69  
    70  func Build(pc *config.ProjectConfig) error {
    71  	getter := adapter.AdapterGetterImp{}
    72  	adp, err := getter.FromPC(pc.Manifest.Build.Adapter)
    73  	if err != nil {
    74  		return err
    75  	}
    76  	err = getAllDependencies(pc)
    77  	if err != nil {
    78  		return err
    79  	}
    80  	return adp.Build(pc)
    81  }
    82  
    83  func addAllDependencies(pc *config.ProjectConfig) error {
    84  	for dep, version := range pc.Manifest.Dependencies {
    85  		semverVersion, err := semver.NewVersion(version)
    86  		if err != nil {
    87  			return fmt.Errorf("error getting dependencies: %w", err)
    88  		}
    89  		if err := Install(dep, semverVersion.String()); err != nil {
    90  			return fmt.Errorf("error adding %s: %w", dep, err)
    91  		}
    92  	}
    93  	return nil
    94  }
    95  
    96  func AddDependenciesAndBuild(pc *config.ProjectConfig) error {
    97  	err := addAllDependencies(pc)
    98  	if err != nil {
    99  		return fmt.Errorf("error installing dependencies: %w", err)
   100  	}
   101  	err = Build(pc)
   102  	if err != nil {
   103  		return fmt.Errorf("build failed: %w", err)
   104  	}
   105  	return nil
   106  }