example_changes.go 2.2 KB

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