github.com/goreleaser/goreleaser@v1.25.1/internal/extrafiles/extra_files.go (about)

     1  package extrafiles
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  
     8  	"github.com/caarlos0/log"
     9  	"github.com/goreleaser/fileglob"
    10  	"github.com/goreleaser/goreleaser/internal/tmpl"
    11  	"github.com/goreleaser/goreleaser/pkg/config"
    12  	"github.com/goreleaser/goreleaser/pkg/context"
    13  )
    14  
    15  // Find resolves extra files globs et al into a map of names/paths or an error.
    16  func Find(ctx *context.Context, files []config.ExtraFile) (map[string]string, error) {
    17  	t := tmpl.New(ctx)
    18  	result := map[string]string{}
    19  	for _, extra := range files {
    20  		glob, err := t.Apply(extra.Glob)
    21  		if err != nil {
    22  			return result, fmt.Errorf("failed to apply template to glob %q: %w", extra.Glob, err)
    23  		}
    24  		if glob == "" {
    25  			log.Warn("ignoring empty glob")
    26  			continue
    27  		}
    28  		files, err := fileglob.Glob(glob)
    29  		if err != nil {
    30  			return result, fmt.Errorf("globbing failed for pattern %s: %w", extra.Glob, err)
    31  		}
    32  		if len(files) > 1 && extra.NameTemplate != "" {
    33  			return result, fmt.Errorf("failed to add extra_file: %q -> %q: glob matches multiple files", extra.Glob, extra.NameTemplate)
    34  		}
    35  		for _, file := range files {
    36  			info, err := os.Stat(file)
    37  			if err == nil && info.IsDir() {
    38  				log.Debugf("ignoring directory %s", file)
    39  				continue
    40  			}
    41  			n, err := t.Apply(extra.NameTemplate)
    42  			if err != nil {
    43  				return result, fmt.Errorf("failed to apply template to name %q: %w", extra.NameTemplate, err)
    44  			}
    45  			name := filepath.Base(file)
    46  			if n != "" {
    47  				name = n
    48  			}
    49  			if old, ok := result[name]; ok {
    50  				log.Warnf("overriding %s with %s for name %s", old, file, name)
    51  			}
    52  			result[name] = file
    53  		}
    54  	}
    55  	return result, nil
    56  }