func exportChanges(rootfs string, diff []byte) (archive.Archive, error) { var changes []archive.Change scanner := bufio.NewScanner(bytes.NewReader(diff)) for scanner.Scan() { line := scanner.Text() dType := strings.SplitN(line, "\t", 2)[0] path := "/" + strings.SplitN(line, "\t", 2)[1] // important to consider the / for ExportChanges change := archive.Change{Path: path} switch dType { case DIFF_MODIFIED: change.Kind = archive.ChangeModify case DIFF_ADDED: change.Kind = archive.ChangeAdd case DIFF_DELETED: change.Kind = archive.ChangeDelete } changes = append(changes, change) if err := scanner.Err(); err != nil { return nil, err } } if len(changes) == 0 { return nil, ErrNoChange } return archive.ExportChanges(rootfs, changes) }
func changeManyFiles(drv graphdriver.Driver, layer string, count int, seed int64) ([]archive.Change, error) { root, err := drv.Get(layer, "") if err != nil { return nil, err } defer drv.Put(layer) changes := []archive.Change{} for i := 0; i < count; i += 100 { archiveRoot := fmt.Sprintf("/directory-%d", i) if err := os.MkdirAll(path.Join(root, archiveRoot), 0755); err != nil { return nil, err } for j := 0; i+j < count && j < 100; j++ { if j == 0 { changes = append(changes, archive.Change{ Path: archiveRoot, Kind: archive.ChangeModify, }) } var change archive.Change switch j % 3 { // Update file case 0: change.Path = path.Join(archiveRoot, fmt.Sprintf("file-%d", i+j)) change.Kind = archive.ChangeModify if err := ioutil.WriteFile(path.Join(root, change.Path), randomContent(64, seed+int64(i+j)), 0755); err != nil { return nil, err } // Add file case 1: change.Path = path.Join(archiveRoot, fmt.Sprintf("file-%d-%d", seed, i+j)) change.Kind = archive.ChangeAdd if err := ioutil.WriteFile(path.Join(root, change.Path), randomContent(64, seed+int64(i+j)), 0755); err != nil { return nil, err } // Remove file case 2: change.Path = path.Join(archiveRoot, fmt.Sprintf("file-%d", i+j)) change.Kind = archive.ChangeDelete if err := os.Remove(path.Join(root, change.Path)); err != nil { return nil, err } } changes = append(changes, change) } } return changes, nil }