Migrate github.com/docker/docker/builder/dockerignore to BuildKit repository
Strategy taken: # install filter-repo (https://github.com/newren/git-filter-repo/blob/main/INSTALL.md) brew install git-filter-repo cd ~/projects # create a temporary clone of docker git clone https://github.com/docker/docker.git docker_TEMP cd docker_TEMP # remove the origin remote (just for safety) git remote remove origin # create branch to work with git checkout -b migrate_dockerignore # remove all code, except for builder/dockerignore, and rewrite the files to frontend/dockerfile/dockerignore. git filter-repo --force --path builder/dockerignore --path-rename builder/dockerignore:frontend/dockerfile/dockerignore # check the results tree . └── frontend └── dockerfile └── dockerignore ├── dockerignore.go └── dockerignore_test.go 3 directories, 2 files # go to the target github.com/moby/sys repository cd ~/projects/buildkit # create a branch to work with git checkout -b integrate_dockerignore # add the temporary repository as an upstream and make sure it's up-to-date git remote add docker_TEMP ~/projects/docker_TEMP git fetch docker_TEMP # merge the upstream code git merge --allow-unrelated-histories --signoff -S docker_TEMP/migrate_dockerignore Signed-off-by: Sebastiaan van Stijn <github@gone.nl>v0.8
commit
a9580f569a
|
@ -0,0 +1,64 @@
|
|||
package dockerignore // import "github.com/docker/docker/builder/dockerignore"
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// ReadAll reads a .dockerignore file and returns the list of file patterns
|
||||
// to ignore. Note this will trim whitespace from each line as well
|
||||
// as use GO's "clean" func to get the shortest/cleanest path for each.
|
||||
func ReadAll(reader io.Reader) ([]string, error) {
|
||||
if reader == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
scanner := bufio.NewScanner(reader)
|
||||
var excludes []string
|
||||
currentLine := 0
|
||||
|
||||
utf8bom := []byte{0xEF, 0xBB, 0xBF}
|
||||
for scanner.Scan() {
|
||||
scannedBytes := scanner.Bytes()
|
||||
// We trim UTF8 BOM
|
||||
if currentLine == 0 {
|
||||
scannedBytes = bytes.TrimPrefix(scannedBytes, utf8bom)
|
||||
}
|
||||
pattern := string(scannedBytes)
|
||||
currentLine++
|
||||
// Lines starting with # (comments) are ignored before processing
|
||||
if strings.HasPrefix(pattern, "#") {
|
||||
continue
|
||||
}
|
||||
pattern = strings.TrimSpace(pattern)
|
||||
if pattern == "" {
|
||||
continue
|
||||
}
|
||||
// normalize absolute paths to paths relative to the context
|
||||
// (taking care of '!' prefix)
|
||||
invert := pattern[0] == '!'
|
||||
if invert {
|
||||
pattern = strings.TrimSpace(pattern[1:])
|
||||
}
|
||||
if len(pattern) > 0 {
|
||||
pattern = filepath.Clean(pattern)
|
||||
pattern = filepath.ToSlash(pattern)
|
||||
if len(pattern) > 1 && pattern[0] == '/' {
|
||||
pattern = pattern[1:]
|
||||
}
|
||||
}
|
||||
if invert {
|
||||
pattern = "!" + pattern
|
||||
}
|
||||
|
||||
excludes = append(excludes, pattern)
|
||||
}
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, fmt.Errorf("Error reading .dockerignore: %v", err)
|
||||
}
|
||||
return excludes, nil
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
package dockerignore // import "github.com/docker/docker/builder/dockerignore"
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestReadAll(t *testing.T) {
|
||||
tmpDir, err := ioutil.TempDir("", "dockerignore-test")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
di, err := ReadAll(nil)
|
||||
if err != nil {
|
||||
t.Fatalf("Expected not to have error, got %v", err)
|
||||
}
|
||||
|
||||
if diLen := len(di); diLen != 0 {
|
||||
t.Fatalf("Expected to have zero dockerignore entry, got %d", diLen)
|
||||
}
|
||||
|
||||
diName := filepath.Join(tmpDir, ".dockerignore")
|
||||
content := fmt.Sprintf("test1\n/test2\n/a/file/here\n\nlastfile\n# this is a comment\n! /inverted/abs/path\n!\n! \n")
|
||||
err = ioutil.WriteFile(diName, []byte(content), 0777)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
diFd, err := os.Open(diName)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer diFd.Close()
|
||||
|
||||
di, err = ReadAll(diFd)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if len(di) != 7 {
|
||||
t.Fatalf("Expected 7 entries, got %v", len(di))
|
||||
}
|
||||
if di[0] != "test1" {
|
||||
t.Fatal("First element is not test1")
|
||||
}
|
||||
if di[1] != "test2" { // according to https://docs.docker.com/engine/reference/builder/#dockerignore-file, /foo/bar should be treated as foo/bar
|
||||
t.Fatal("Second element is not test2")
|
||||
}
|
||||
if di[2] != "a/file/here" { // according to https://docs.docker.com/engine/reference/builder/#dockerignore-file, /foo/bar should be treated as foo/bar
|
||||
t.Fatal("Third element is not a/file/here")
|
||||
}
|
||||
if di[3] != "lastfile" {
|
||||
t.Fatal("Fourth element is not lastfile")
|
||||
}
|
||||
if di[4] != "!inverted/abs/path" {
|
||||
t.Fatal("Fifth element is not !inverted/abs/path")
|
||||
}
|
||||
if di[5] != "!" {
|
||||
t.Fatalf("Sixth element is not !, but %s", di[5])
|
||||
}
|
||||
if di[6] != "!" {
|
||||
t.Fatalf("Seventh element is not !, but %s", di[6])
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue