func execSend(path string, parent string, diff io.Writer) (retErr error) { defer func() { protolog.Debug(&Send{path, parent, errorToString(retErr)}) }() if parent == "" { return executil.RunStdout(diff, "btrfs", "send", path) } return executil.RunStdout(diff, "btrfs", "send", "-p", parent, path) }
func execSubvolumeFindNew(commit string, fromCommit string, out io.Writer) (retErr error) { defer func() { protolog.Debug(&SubvolumeFindNew{commit, fromCommit, errorToString(retErr)}) }() if fromCommit == "" { return executil.RunStdout(out, "btrfs", "subvolume", "find-new", commit, "0") } transid, err := execTransID(fromCommit) if err != nil { return err } return executil.RunStdout(out, "btrfs", "subvolume", "find-new", commit, transid) }
func execTransID(path string) (result string, retErr error) { defer func() { protolog.Debug(&TransID{path, result, errorToString(retErr)}) }() // "9223372036854775810" == 2 ** 63 we use a very big number there so that // we get the transid of the from path. According to the internet this is // the nicest way to get it from btrfs. var buffer bytes.Buffer if err := executil.RunStdout(&buffer, "btrfs", "subvolume", "find-new", path, "9223372036854775808"); err != nil { return "", err } scanner := bufio.NewScanner(&buffer) for scanner.Scan() { // scanner.Text() looks like this: // transid marker was 907 // 0 1 2 3 tokens := strings.Split(scanner.Text(), " ") if len(tokens) != 4 { return "", fmt.Errorf("pachyderm: failed to parse find-new output") } return tokens[3], nil } if scanner.Err() != nil { return "", scanner.Err() } return "", fmt.Errorf("pachyderm: empty output from find-new") }
func execSubvolumeList(path string, fromCommit string, ascending bool, out io.Writer) (retErr error) { defer func() { protolog.Debug(&SubvolumeList{path, fromCommit, ascending, errorToString(retErr)}) }() var sort string if ascending { sort = "+ogen" } else { sort = "-ogen" } if fromCommit == "" { return executil.RunStdout(out, "btrfs", "subvolume", "list", "-a", "--sort", sort, path) } transid, err := execTransID(fromCommit) if err != nil { return err } return executil.RunStdout(out, "btrfs", "subvolume", "list", "-aC", "+"+transid, "--sort", sort, path) }