github.com/demonoid81/moby@v0.0.0-20200517203328-62dd8e17c460/builder/dockerignore/dockerignore.go (about)

     1  package dockerignore // import "github.com/demonoid81/moby/builder/dockerignore"
     2  
     3  import (
     4  	"bufio"
     5  	"bytes"
     6  	"fmt"
     7  	"io"
     8  	"path/filepath"
     9  	"strings"
    10  )
    11  
    12  // ReadAll reads a .dockerignore file and returns the list of file patterns
    13  // to ignore. Note this will trim whitespace from each line as well
    14  // as use GO's "clean" func to get the shortest/cleanest path for each.
    15  func ReadAll(reader io.Reader) ([]string, error) {
    16  	if reader == nil {
    17  		return nil, nil
    18  	}
    19  
    20  	scanner := bufio.NewScanner(reader)
    21  	var excludes []string
    22  	currentLine := 0
    23  
    24  	utf8bom := []byte{0xEF, 0xBB, 0xBF}
    25  	for scanner.Scan() {
    26  		scannedBytes := scanner.Bytes()
    27  		// We trim UTF8 BOM
    28  		if currentLine == 0 {
    29  			scannedBytes = bytes.TrimPrefix(scannedBytes, utf8bom)
    30  		}
    31  		pattern := string(scannedBytes)
    32  		currentLine++
    33  		// Lines starting with # (comments) are ignored before processing
    34  		if strings.HasPrefix(pattern, "#") {
    35  			continue
    36  		}
    37  		pattern = strings.TrimSpace(pattern)
    38  		if pattern == "" {
    39  			continue
    40  		}
    41  		// normalize absolute paths to paths relative to the context
    42  		// (taking care of '!' prefix)
    43  		invert := pattern[0] == '!'
    44  		if invert {
    45  			pattern = strings.TrimSpace(pattern[1:])
    46  		}
    47  		if len(pattern) > 0 {
    48  			pattern = filepath.Clean(pattern)
    49  			pattern = filepath.ToSlash(pattern)
    50  			if len(pattern) > 1 && pattern[0] == '/' {
    51  				pattern = pattern[1:]
    52  			}
    53  		}
    54  		if invert {
    55  			pattern = "!" + pattern
    56  		}
    57  
    58  		excludes = append(excludes, pattern)
    59  	}
    60  	if err := scanner.Err(); err != nil {
    61  		return nil, fmt.Errorf("Error reading .dockerignore: %v", err)
    62  	}
    63  	return excludes, nil
    64  }