example_changes.go 2.2 KB

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