github.com/moby/docker@v26.1.3+incompatible/pkg/archive/example_changes.go (about) 1 //go:build ignore 2 3 // Simple tool to create an archive stream from an old and new directory 4 // 5 // By default it will stream the comparison of two temporary directories with junk files 6 package main 7 8 import ( 9 "flag" 10 "fmt" 11 "io" 12 "os" 13 "path" 14 15 "github.com/containerd/log" 16 "github.com/docker/docker/pkg/archive" 17 ) 18 19 var ( 20 flDebug = flag.Bool("D", false, "debugging output") 21 flNewDir = flag.String("newdir", "", "") 22 flOldDir = flag.String("olddir", "", "") 23 log = log.G(ctx).New() 24 ) 25 26 func main() { 27 flag.Usage = func() { 28 fmt.Println("Produce a tar from comparing two directory paths. By default a demo tar is created of around 200 files (including hardlinks)") 29 fmt.Printf("%s [OPTIONS]\n", os.Args[0]) 30 flag.PrintDefaults() 31 } 32 flag.Parse() 33 log.Out = os.Stderr 34 if (len(os.Getenv("DEBUG")) > 0) || *flDebug { 35 log.G(ctx).SetLevel(logrus.DebugLevel) 36 } 37 var newDir, oldDir string 38 39 if len(*flNewDir) == 0 { 40 var err error 41 newDir, err = os.MkdirTemp("", "docker-test-newDir") 42 if err != nil { 43 log.Fatal(err) 44 } 45 defer os.RemoveAll(newDir) 46 if _, err := prepareUntarSourceDirectory(100, newDir, true); err != nil { 47 log.Fatal(err) 48 } 49 } else { 50 newDir = *flNewDir 51 } 52 53 if len(*flOldDir) == 0 { 54 oldDir, err := os.MkdirTemp("", "docker-test-oldDir") 55 if err != nil { 56 log.Fatal(err) 57 } 58 defer os.RemoveAll(oldDir) 59 } else { 60 oldDir = *flOldDir 61 } 62 63 changes, err := archive.ChangesDirs(newDir, oldDir) 64 if err != nil { 65 log.Fatal(err) 66 } 67 68 a, err := archive.ExportChanges(newDir, changes) 69 if err != nil { 70 log.Fatal(err) 71 } 72 defer a.Close() 73 74 i, err := io.Copy(os.Stdout, a) 75 if err != nil && err != io.EOF { 76 log.Fatal(err) 77 } 78 fmt.Fprintf(os.Stderr, "wrote archive of %d bytes", i) 79 } 80 81 func prepareUntarSourceDirectory(numberOfFiles int, targetPath string, makeLinks bool) (int, error) { 82 fileData := []byte("fooo") 83 for n := 0; n < numberOfFiles; n++ { 84 fileName := fmt.Sprintf("file-%d", n) 85 if err := os.WriteFile(path.Join(targetPath, fileName), fileData, 0o700); err != nil { 86 return 0, err 87 } 88 if makeLinks { 89 if err := os.Link(path.Join(targetPath, fileName), path.Join(targetPath, fileName+"-link")); err != nil { 90 return 0, err 91 } 92 } 93 } 94 totalSize := numberOfFiles * len(fileData) 95 return totalSize, nil 96 }