get.porter.sh/porter@v1.3.0/pkg/pkgmgmt/install.go (about)

     1  package pkgmgmt
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"net/url"
     7  	"path"
     8  	"strings"
     9  )
    10  
    11  type InstallOptions struct {
    12  	PackageDownloadOptions
    13  
    14  	Name          string
    15  	URL           string
    16  	FeedURL       string
    17  	Version       string
    18  	parsedURL     *url.URL
    19  	parsedFeedURL *url.URL
    20  
    21  	PackageType string
    22  }
    23  
    24  // GetParsedURL returns a copy of of the parsed URL that is safe to modify.
    25  func (o *InstallOptions) GetParsedURL() url.URL {
    26  	if o.parsedURL == nil {
    27  		return url.URL{}
    28  	}
    29  
    30  	return *o.parsedURL
    31  }
    32  
    33  func (o *InstallOptions) GetParsedFeedURL() url.URL {
    34  	if o.parsedFeedURL == nil {
    35  		return o.defaultFeedURL()
    36  	}
    37  
    38  	return *o.parsedFeedURL
    39  }
    40  
    41  func (o *InstallOptions) defaultFeedURL() url.URL {
    42  	mirror := o.GetMirror()
    43  	mirror.Path = path.Join(mirror.Path, o.PackageType+"s", "atom.xml")
    44  	return mirror
    45  }
    46  
    47  func (o *InstallOptions) Validate(args []string) error {
    48  	if o.PackageType != "mixin" && o.PackageType != "plugin" {
    49  		return fmt.Errorf("invalid package type %q. Please report this as a bug to Porter!", o.PackageType)
    50  	}
    51  
    52  	err := o.validateName(args)
    53  	if err != nil {
    54  		return err
    55  	}
    56  
    57  	err = o.PackageDownloadOptions.Validate()
    58  	if err != nil {
    59  		return err
    60  	}
    61  
    62  	err = o.validateFeedURL()
    63  	if err != nil {
    64  		return err
    65  	}
    66  
    67  	err = o.validateURL()
    68  	if err != nil {
    69  		return err
    70  	}
    71  
    72  	o.defaultVersion()
    73  
    74  	return nil
    75  }
    76  
    77  func (o *InstallOptions) validateURL() error {
    78  	if o.URL == "" {
    79  		return nil
    80  	}
    81  
    82  	parsedURL, err := url.Parse(o.URL)
    83  	if err != nil {
    84  		return fmt.Errorf("invalid --url %s: %w", o.URL, err)
    85  	}
    86  
    87  	o.parsedURL = parsedURL
    88  	return nil
    89  }
    90  
    91  func (o *InstallOptions) validateFeedURL() error {
    92  	if o.URL == "" && o.FeedURL == "" {
    93  		feedURL := o.defaultFeedURL()
    94  		o.FeedURL = feedURL.String()
    95  	}
    96  
    97  	if o.FeedURL != "" {
    98  		parsedFeedURL, err := url.Parse(o.FeedURL)
    99  		if err != nil {
   100  			return fmt.Errorf("invalid --feed-url %s: %w", o.FeedURL, err)
   101  		}
   102  
   103  		o.parsedFeedURL = parsedFeedURL
   104  	}
   105  
   106  	return nil
   107  }
   108  
   109  func (o *InstallOptions) defaultVersion() {
   110  	if o.Version == "" {
   111  		o.Version = "latest"
   112  	}
   113  }
   114  
   115  // validateName grabs the name from the first positional argument.
   116  func (o *InstallOptions) validateName(args []string) error {
   117  	switch len(args) {
   118  	case 0:
   119  		return errors.New("no name was specified")
   120  	case 1:
   121  		o.Name = strings.ToLower(args[0])
   122  		return nil
   123  	default:
   124  		return fmt.Errorf("only one positional argument may be specified, the name, but multiple were received: %s", args)
   125  
   126  	}
   127  }