diff options
author | Martin Polden <mpolden@mpolden.no> | 2018-07-26 16:10:51 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2018-07-26 16:10:51 +0200 |
commit | 4b103333a1f95063b5a470ed15e2be40674de158 (patch) | |
tree | 281b7b28e4fe175dd6701f4545e626f110dfb99c | |
parent | 21f9c7082d9ac377363ad92894c22df3602873a0 (diff) |
Rename package unpacker -> rar
-rw-r--r-- | cmd/unp/main.go | 4 | ||||
-rw-r--r-- | rar/rar.go (renamed from unpacker/unpacker.go) | 82 | ||||
-rw-r--r-- | rar/rar_test.go (renamed from unpacker/unpacker_test.go) | 46 | ||||
-rw-r--r-- | rar/testdata/test.r00 (renamed from unpacker/testdata/test.r00) | bin | 1024 -> 1024 bytes | |||
-rw-r--r-- | rar/testdata/test.r01 (renamed from unpacker/testdata/test.r01) | bin | 459 -> 459 bytes | |||
-rw-r--r-- | rar/testdata/test.rar (renamed from unpacker/testdata/test.rar) | bin | 1024 -> 1024 bytes | |||
-rw-r--r-- | rar/testdata/test.sfv (renamed from unpacker/testdata/test.sfv) | 0 | ||||
-rw-r--r-- | unpacker/cmd.go | 35 | ||||
-rw-r--r-- | unpacker/cmd_test.go | 46 |
9 files changed, 99 insertions, 114 deletions
diff --git a/cmd/unp/main.go b/cmd/unp/main.go index dc21e20..0a94bce 100644 --- a/cmd/unp/main.go +++ b/cmd/unp/main.go @@ -7,7 +7,7 @@ import ( flags "github.com/jessevdk/go-flags" - "github.com/mpolden/unp/unpacker" + "github.com/mpolden/unp/rar" "github.com/mpolden/unp/watcher" ) @@ -37,6 +37,6 @@ func main() { } log := log.New(os.Stderr, "unp: ", 0) - w := watcher.New(cfg, unpacker.OnFile, log) + w := watcher.New(cfg, rar.Unpack, log) w.Start() } diff --git a/unpacker/unpacker.go b/rar/rar.go index c7e7099..00531bb 100644 --- a/unpacker/unpacker.go +++ b/rar/rar.go @@ -1,11 +1,14 @@ -package unpacker +package rar import ( "bytes" "io" "os" + "os/exec" "path/filepath" "regexp" + "strings" + "text/template" "github.com/mpolden/sfv" "github.com/nwaples/rardecode" @@ -14,13 +17,37 @@ import ( var rarPartRE = regexp.MustCompile(`\.part0*(\d+)\.rar$`) -type unpacker struct { - SFV *sfv.SFV - Dir string +type archive struct { Name string + Dir string + Base string +} + +type unpacker struct { + sfv *sfv.SFV + dir string + name string } -func New(dir string) (*unpacker, error) { +func newCmd(tmpl string, a archive) (*exec.Cmd, error) { + t, err := template.New("cmd").Parse(tmpl) + if err != nil { + return nil, err + } + var b bytes.Buffer + if err := t.Execute(&b, a); err != nil { + return nil, err + } + argv := strings.Split(b.String(), " ") + if len(argv) == 0 { + return nil, errors.New("template compiled to empty command") + } + cmd := exec.Command(argv[0], argv[1:]...) + cmd.Dir = a.Dir + return cmd, nil +} + +func newUnpacker(dir string) (*unpacker, error) { sfv, err := sfv.Find(dir) if err != nil { return nil, err @@ -30,9 +57,9 @@ func New(dir string) (*unpacker, error) { return nil, err } return &unpacker{ - SFV: sfv, - Dir: dir, - Name: rar, + sfv: sfv, + dir: dir, + name: rar, }, nil } @@ -75,7 +102,7 @@ func (u *unpacker) unpack(name string) error { if err != nil { return err } - name := filepath.Join(u.Dir, header.Name) + name := filepath.Join(u.dir, header.Name) // If entry is a directory, create it and set correct ctime if header.IsDir { if err := os.MkdirAll(name, 0755); err != nil { @@ -120,32 +147,32 @@ func (u *unpacker) unpack(name string) error { } func (u *unpacker) remove() error { - for _, c := range u.SFV.Checksums { + for _, c := range u.sfv.Checksums { if err := os.Remove(c.Path); err != nil { return err } } - return os.Remove(u.SFV.Path) + return os.Remove(u.sfv.Path) } func (u *unpacker) fileCount() (int, int) { exists := 0 - for _, c := range u.SFV.Checksums { + for _, c := range u.sfv.Checksums { if c.IsExist() { exists++ } } - return exists, len(u.SFV.Checksums) + return exists, len(u.sfv.Checksums) } func (u *unpacker) verify() error { - for _, c := range u.SFV.Checksums { + for _, c := range u.sfv.Checksums { ok, err := c.Verify() if err != nil { return err } if !ok { - return errors.Errorf("%s: failed checksum: %s", u.SFV.Path, c.Filename) + return errors.Errorf("%s: failed checksum: %s", u.sfv.Path, c.Filename) } } return nil @@ -153,17 +180,17 @@ func (u *unpacker) verify() error { func (u *unpacker) Run(removeRARs bool) error { if exists, total := u.fileCount(); exists != total { - return errors.Errorf("%s is incomplete: %d/%d files", u.Dir, exists, total) + return errors.Errorf("%s is incomplete: %d/%d files", u.dir, exists, total) } if err := u.verify(); err != nil { - return errors.Wrapf(err, "verification of %s failed", u.Dir) + return errors.Wrapf(err, "verification of %s failed", u.dir) } - if err := u.unpack(u.Name); err != nil { - return errors.Wrapf(err, "unpacking %s failed", u.Dir) + if err := u.unpack(u.name); err != nil { + return errors.Wrapf(err, "unpacking %s failed", u.dir) } if removeRARs { if err := u.remove(); err != nil { - return errors.Wrapf(err, "cleaning up %s failed", u.Dir) + return errors.Wrapf(err, "cleaning up %s failed", u.dir) } } return nil @@ -173,12 +200,11 @@ func postProcess(u *unpacker, command string) error { if command == "" { return nil } - values := cmdValues{ - Name: u.Name, - Base: filepath.Base(u.Dir), - Dir: u.Dir, - } - cmd, err := newCmd(command, values) + cmd, err := newCmd(command, archive{ + Name: u.name, + Base: filepath.Base(u.dir), + Dir: u.dir, + }) if err != nil { return err } @@ -190,8 +216,8 @@ func postProcess(u *unpacker, command string) error { return nil } -func OnFile(name, postCommand string, remove bool) error { - u, err := New(filepath.Dir(name)) +func Unpack(name, postCommand string, remove bool) error { + u, err := newUnpacker(filepath.Dir(name)) if err != nil { return errors.Wrap(err, "failed to initialize unpacker") } diff --git a/unpacker/unpacker_test.go b/rar/rar_test.go index 3f0e3ee..82ec024 100644 --- a/unpacker/unpacker_test.go +++ b/rar/rar_test.go @@ -1,14 +1,54 @@ -package unpacker +package rar import ( "os" "path/filepath" + "strings" "testing" "time" "github.com/mpolden/sfv" ) +func TestNewCmd(t *testing.T) { + tmpl := "tar -xf {{.Name}} {{.Base}} {{.Dir}}" + values := archive{ + Name: "/foo/bar/baz.rar", + Base: "baz.rar", + Dir: "/foo/bar", + } + + cmd, err := newCmd(tmpl, values) + if err != nil { + t.Fatal(err) + } + if cmd.Dir != values.Dir { + t.Fatalf("Expected %s, got %s", values.Dir, cmd.Dir) + } + if !strings.Contains(cmd.Path, string(os.PathSeparator)) { + t.Fatalf("Expected %s to contain a path separator", cmd.Path) + } + if cmd.Args[0] != "tar" { + t.Fatalf("Expected 'tar', got '%s'", cmd.Args[0]) + } + if cmd.Args[1] != "-xf" { + t.Fatalf("Expected '-xf', got '%s'", cmd.Args[1]) + } + if cmd.Args[2] != values.Name { + t.Fatalf("Expected '%s', got '%s'", values.Name, cmd.Args[2]) + } + if cmd.Args[3] != values.Base { + t.Fatalf("Expected '%s', got '%s'", values.Base, cmd.Args[3]) + } + if cmd.Args[4] != values.Dir { + t.Fatalf("Expected '%s', got '%s'", values.Base, cmd.Args[4]) + } + + if _, err := newCmd("tar -xf {{.Bar}}", values); err == nil { + t.Fatal("Expected error") + } +} + func TestFindFirstRAR(t *testing.T) { var tests = []struct { sfv *sfv.SFV @@ -49,7 +89,7 @@ func TestFindFirstRAR(t *testing.T) { } } -func TestUnpacking(t *testing.T) { +func TestUnpack(t *testing.T) { wd, err := os.Getwd() if err != nil { t.Fatal(err) @@ -75,7 +115,7 @@ func TestUnpacking(t *testing.T) { }() // Trigger unpacking by passing in a file contained in testdata - if err := OnFile(tests[0].file, "", false); err != nil { + if err := Unpack(tests[0].file, "", false); err != nil { t.Fatal(err) } diff --git a/unpacker/testdata/test.r00 b/rar/testdata/test.r00 Binary files differindex 273a85c..273a85c 100644 --- a/unpacker/testdata/test.r00 +++ b/rar/testdata/test.r00 diff --git a/unpacker/testdata/test.r01 b/rar/testdata/test.r01 Binary files differindex 09a35c2..09a35c2 100644 --- a/unpacker/testdata/test.r01 +++ b/rar/testdata/test.r01 diff --git a/unpacker/testdata/test.rar b/rar/testdata/test.rar Binary files differindex fd65209..fd65209 100644 --- a/unpacker/testdata/test.rar +++ b/rar/testdata/test.rar diff --git a/unpacker/testdata/test.sfv b/rar/testdata/test.sfv index 99a853b..99a853b 100644 --- a/unpacker/testdata/test.sfv +++ b/rar/testdata/test.sfv diff --git a/unpacker/cmd.go b/unpacker/cmd.go deleted file mode 100644 index 122cce1..0000000 --- a/unpacker/cmd.go +++ /dev/null @@ -1,35 +0,0 @@ -package unpacker - -import ( - "bytes" - - "github.com/pkg/errors" - - "os/exec" - "strings" - "text/template" -) - -type cmdValues struct { - Name string - Dir string - Base string -} - -func newCmd(tmpl string, v cmdValues) (*exec.Cmd, error) { - t, err := template.New("cmd").Parse(tmpl) - if err != nil { - return nil, err - } - var b bytes.Buffer - if err := t.Execute(&b, v); err != nil { - return nil, err - } - argv := strings.Split(b.String(), " ") - if len(argv) == 0 { - return nil, errors.New("template compiled to empty command") - } - cmd := exec.Command(argv[0], argv[1:]...) - cmd.Dir = v.Dir - return cmd, nil -} diff --git a/unpacker/cmd_test.go b/unpacker/cmd_test.go deleted file mode 100644 index 6eb65da..0000000 --- a/unpacker/cmd_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package unpacker - -import ( - "os" - "strings" - "testing" -) - -func TestNewCmd(t *testing.T) { - tmpl := "tar -xf {{.Name}} {{.Base}} {{.Dir}}" - values := cmdValues{ - Name: "/foo/bar/baz.rar", - Base: "baz.rar", - Dir: "/foo/bar", - } - - cmd, err := newCmd(tmpl, values) - if err != nil { - t.Fatal(err) - } - if cmd.Dir != values.Dir { - t.Fatalf("Expected %s, got %s", values.Dir, cmd.Dir) - } - if !strings.Contains(cmd.Path, string(os.PathSeparator)) { - t.Fatalf("Expected %s to contain a path separator", cmd.Path) - } - if cmd.Args[0] != "tar" { - t.Fatalf("Expected 'tar', got '%s'", cmd.Args[0]) - } - if cmd.Args[1] != "-xf" { - t.Fatalf("Expected '-xf', got '%s'", cmd.Args[1]) - } - if cmd.Args[2] != values.Name { - t.Fatalf("Expected '%s', got '%s'", values.Name, cmd.Args[2]) - } - if cmd.Args[3] != values.Base { - t.Fatalf("Expected '%s', got '%s'", values.Base, cmd.Args[3]) - } - if cmd.Args[4] != values.Dir { - t.Fatalf("Expected '%s', got '%s'", values.Base, cmd.Args[4]) - } - - if _, err := newCmd("tar -xf {{.Bar}}", values); err == nil { - t.Fatal("Expected error") - } -} |