aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2018-07-26 16:10:51 +0200
committerMartin Polden <mpolden@mpolden.no>2018-07-26 16:10:51 +0200
commit4b103333a1f95063b5a470ed15e2be40674de158 (patch)
tree281b7b28e4fe175dd6701f4545e626f110dfb99c
parent21f9c7082d9ac377363ad92894c22df3602873a0 (diff)
Rename package unpacker -> rar
-rw-r--r--cmd/unp/main.go4
-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)bin1024 -> 1024 bytes
-rw-r--r--rar/testdata/test.r01 (renamed from unpacker/testdata/test.r01)bin459 -> 459 bytes
-rw-r--r--rar/testdata/test.rar (renamed from unpacker/testdata/test.rar)bin1024 -> 1024 bytes
-rw-r--r--rar/testdata/test.sfv (renamed from unpacker/testdata/test.sfv)0
-rw-r--r--unpacker/cmd.go35
-rw-r--r--unpacker/cmd_test.go46
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
index 273a85c..273a85c 100644
--- a/unpacker/testdata/test.r00
+++ b/rar/testdata/test.r00
Binary files differ
diff --git a/unpacker/testdata/test.r01 b/rar/testdata/test.r01
index 09a35c2..09a35c2 100644
--- a/unpacker/testdata/test.r01
+++ b/rar/testdata/test.r01
Binary files differ
diff --git a/unpacker/testdata/test.rar b/rar/testdata/test.rar
index fd65209..fd65209 100644
--- a/unpacker/testdata/test.rar
+++ b/rar/testdata/test.rar
Binary files differ
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")
- }
-}