-
Notifications
You must be signed in to change notification settings - Fork 0
/
process.go
53 lines (44 loc) · 1.39 KB
/
process.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package main
import (
"context"
"fmt"
"os"
"path/filepath"
)
// process performs the given set of file rename actions and returns the
// results.
//
// If progress is non-nil, records of actions taken will be sent on the
// channel as they occur.
//
// If any error is returned, the set of completed records will be returned with it.
func process(ctx context.Context, root string, actions []Action, progress chan<- Record) (results []Record, err error) {
for i, action := range actions {
if err := ctx.Err(); err != nil {
return results, err
}
// Combine the relative action paths with the root. Use filepath.Join
// here, because the paths need to make sense to the local file
// system.
from := filepath.Join(root, action.OldPath)
to := filepath.Join(root, action.NewPath)
// Let the user know what we're doing
fmt.Printf("Performing action %d: %s → %s\n", i, from, to)
// Perform the action and print an error if it failed
err := os.Rename(from, to)
// Marshal the result as a record
record := Record{OldPath: from, NewPath: to}
// Record and print an error if the action failed
if err != nil {
record.Error = err.Error()
fmt.Printf(" FAILED: %v\n", err)
}
// Send the record to the progress channel for logging
if progress != nil {
progress <- record
}
// Apppend the record to the result set
results = append(results, record)
}
return results, nil
}