summaryrefslogtreecommitdiff
path: root/fi-filefilter
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2019-02-16 20:41:20 -0500
committerLuke Shumaker <lukeshu@lukeshu.com>2019-02-16 20:41:20 -0500
commit97c4b4053ab187a75a1a79854df2941522cdab09 (patch)
treef57c1ee4d8430ed86884bd7b8924cef7c66db349 /fi-filefilter
parent2495e17b6c2d4323b0c989b8ef27248f29eb9548 (diff)
better type checking
Diffstat (limited to 'fi-filefilter')
-rw-r--r--fi-filefilter/main.go225
1 files changed, 101 insertions, 124 deletions
diff --git a/fi-filefilter/main.go b/fi-filefilter/main.go
index ae992ba..6731c1e 100644
--- a/fi-filefilter/main.go
+++ b/fi-filefilter/main.go
@@ -26,6 +26,8 @@ import (
"git.lukeshu.com/go/libfastimport"
"github.com/pkg/errors"
+
+ "git.parabola.nu/~lukeshu/fastimport-go-utils/fiutil"
)
func usage(w io.Writer) {
@@ -48,138 +50,113 @@ func main() {
frontend := libfastimport.NewFrontend(os.Stdin, os.Stdin, nil)
backend := libfastimport.NewBackend(os.Stdout, os.Stdout, nil)
- if err := filefilter(backend, frontend, re); err != nil {
+ filter := &FileFilter{
+ backend: backend,
+ re: re,
+ beg: time.Now(),
+ }
+
+ if err := fiutil.RunHandler(frontend, filter); err != nil {
fmt.Fprintf(os.Stderr, "%s: error: %v\n", os.Args[0], err)
os.Exit(1)
}
}
-func filefilter(backend *libfastimport.Backend, frontend *libfastimport.Frontend, re *regexp.Regexp) error {
- commits := 0
- filesIn := 0
- filesOut := 0
- beg := time.Now()
- status := func() {
- fmt.Fprintf(os.Stderr,
- "%d commits (%d => %d files) (%.2f commit/s)\r",
- commits, filesIn, filesOut,
- float64(commits)/time.Since(beg).Seconds())
+type FileFilter struct {
+ backend *libfastimport.Backend
+ re *regexp.Regexp
+
+ // statistics
+ commits int
+ filesIn int
+ filesOut int
+ beg time.Time
+}
+
+// file commands ///////////////////////////////////////////////////////////////
+func (h *FileFilter) FileModify(cmd libfastimport.FileModify) error {
+ h.filesIn++
+ if !h.re.MatchString(string(cmd.Path)) {
+ return nil
}
+ h.filesOut++
+ return h.backend.Do(cmd)
+}
+func (h *FileFilter) FileModifyInline(cmd libfastimport.FileModifyInline) error {
+ h.filesIn++
+ if !h.re.MatchString(string(cmd.Path)) {
+ return nil
+ }
+ h.filesOut++
+ return h.backend.Do(cmd)
+}
+func (h *FileFilter) FileDelete(cmd libfastimport.FileDelete) error {
+ h.filesIn++
+ if !h.re.MatchString(string(cmd.Path)) {
+ return nil
+ }
+ h.filesOut++
+ return h.backend.Do(cmd)
+}
+func (h *FileFilter) FileDeleteAll(cmd libfastimport.FileDeleteAll) error {
+ return h.backend.Do(cmd)
+}
+func (h *FileFilter) FileCopy(cmd libfastimport.FileCopy) error {
+ return errors.New("unexpected \"filecopy\" command: this filter requires --full-tree")
+}
+func (h *FileFilter) FileRename(cmd libfastimport.FileRename) error {
+ return errors.New("unexpected \"filerename\" command: this filter requires --full-tree")
+}
- for {
- cmd, err := frontend.ReadCmd()
- if err != nil {
- if err == io.EOF {
- break
- }
- return err
- }
+// statistics //////////////////////////////////////////////////////////////////
+func (h *FileFilter) CmdCommitEnd(cmd libfastimport.CmdCommitEnd) error {
+ h.commits++
+ fmt.Fprintf(os.Stderr,
+ "%d commits (%d => %d files) (%.2f commit/s)\r",
+ h.commits, h.filesIn, h.filesOut,
+ float64(h.commits)/time.Since(h.beg).Seconds())
+ return nil
+}
+
+// note commands ///////////////////////////////////////////////////////////////
+func (h *FileFilter) NoteModify(cmd libfastimport.NoteModify) error {
+ return h.backend.Do(cmd)
+}
+func (h *FileFilter) NoteModifyInline(cmd libfastimport.NoteModifyInline) error {
+ return h.backend.Do(cmd)
+}
+
+// other commands //////////////////////////////////////////////////////////////
+func (h *FileFilter) CmdBlob(cmd libfastimport.CmdBlob) error { return h.backend.Do(cmd) }
+func (h *FileFilter) CmdCheckpoint(cmd libfastimport.CmdCheckpoint) error { return h.backend.Do(cmd) }
+func (h *FileFilter) CmdComment(cmd libfastimport.CmdComment) error { return h.backend.Do(cmd) }
+func (h *FileFilter) CmdCommit(cmd libfastimport.CmdCommit) error { return h.backend.Do(cmd) }
+func (h *FileFilter) CmdDone(cmd libfastimport.CmdDone) error { return h.backend.Do(cmd) }
+func (h *FileFilter) CmdOption(cmd libfastimport.CmdOption) error { return h.backend.Do(cmd) }
+func (h *FileFilter) CmdProgress(cmd libfastimport.CmdProgress) error { return h.backend.Do(cmd) }
+func (h *FileFilter) CmdReset(cmd libfastimport.CmdReset) error { return h.backend.Do(cmd) }
+func (h *FileFilter) CmdTag(cmd libfastimport.CmdTag) error { return h.backend.Do(cmd) }
+
+func (h *FileFilter) CmdCatBlob(cmd libfastimport.CmdCatBlob) (sha1 string, data string, err error) {
+ return h.backend.CatBlob(cmd)
+}
+func (h *FileFilter) CmdGetMark(cmd libfastimport.CmdGetMark) (sha1 string, err error) {
+ return h.backend.GetMark(cmd)
+}
+func (h *FileFilter) CmdLs(cmd libfastimport.CmdLs) (mode libfastimport.Mode, dataref string, path libfastimport.Path, err error) {
+ return h.backend.Ls(cmd)
+}
- switch cmdt := cmd.(type) {
-
- // commit //////////////////////////////////////////////
- case libfastimport.CmdCommit:
- if err := backend.Do(cmd); err != nil {
- return err
- }
- case libfastimport.CmdCommitEnd:
- commits++
- status()
-
- // file commands ///////////////////////////////////////
- case libfastimport.FileModify:
- filesIn++
- if re.MatchString(string(cmdt.Path)) {
- filesOut++
- if err := backend.Do(cmd); err != nil {
- return err
- }
- }
- case libfastimport.FileModifyInline:
- filesIn++
- if re.MatchString(string(cmdt.Path)) {
- filesOut++
- if err := backend.Do(cmd); err != nil {
- return err
- }
- }
- case libfastimport.FileDelete:
- filesIn++
- if re.MatchString(string(cmdt.Path)) {
- filesOut++
- if err := backend.Do(cmd); err != nil {
- return err
- }
- }
- case libfastimport.FileDeleteAll:
- if err := backend.Do(cmd); err != nil {
- return err
- }
- case libfastimport.FileCopy:
- return errors.New("unexpected \"filecopy\" command: this filter requires --full-tree")
- case libfastimport.FileRename:
- return errors.New("unexpected \"filerename\" command: this filter requires --full-tree")
-
- // note commands ///////////////////////////////////////
- case libfastimport.NoteModify, libfastimport.NoteModifyInline:
- if err := backend.Do(cmd); err != nil {
- return err
- }
-
- // regular commands ////////////////////////////////////
- case libfastimport.CmdBlob, libfastimport.CmdCheckpoint, libfastimport.CmdComment, libfastimport.CmdDone, libfastimport.CmdProgress, libfastimport.CmdReset, libfastimport.CmdTag:
- if err := backend.Do(cmd); err != nil {
- return err
- }
-
- // special commands ////////////////////////////////////
- case libfastimport.CmdOption:
- if err := backend.Do(cmd); err != nil {
- return err
- }
- case libfastimport.CmdFeature:
- switch cmdt.Feature {
- case "date-format":
- if cmdt.Argument != "raw" {
- return errors.Errorf("date-format=%q: only supports the %q format", cmdt.Argument, "raw")
- }
- if err := backend.Do(cmd); err != nil {
- return err
- }
- case "export-marks", "relative-marks", "no-relative-marks", "force", "import-marks", "import-marks-if-exists", "get-mark", "cat-blob", "ls", "notes", "done":
- if err := backend.Do(cmd); err != nil {
- return err
- }
- default:
- return errors.Errorf("unknown feature %q", cmdt.Feature)
- }
- case libfastimport.CmdCatBlob:
- sha1, data, err := backend.CatBlob(cmdt)
- if err != nil {
- return err
- }
- if err := frontend.RespondCatBlob(sha1, data); err != nil {
- return err
- }
- case libfastimport.CmdGetMark:
- sha1, err := backend.GetMark(cmdt)
- if err != nil {
- return err
- }
- if err := frontend.RespondGetMark(sha1); err != nil {
- return err
- }
- case libfastimport.CmdLs:
- mode, dataref, path, err := backend.Ls(cmdt)
- if err != nil {
- return err
- }
- if err := frontend.RespondLs(mode, dataref, path); err != nil {
- return err
- }
- default:
- return errors.Errorf("unexpected command: %[1]T(%#[1]v)", cmd)
+func (h *FileFilter) CmdFeature(cmd libfastimport.CmdFeature) error {
+ switch cmd.Feature {
+ case "date-format":
+ if cmd.Argument != "raw" {
+ return errors.Errorf("date-format=%q: only supports the %q format", cmd.Argument, "raw")
}
+ return h.backend.Do(cmd)
+ case "export-marks", "relative-marks", "no-relative-marks", "force", "import-marks", "import-marks-if-exists", "get-mark", "cat-blob", "ls", "notes", "done":
+ return h.backend.Do(cmd)
+ default:
+ return errors.Errorf("unknown feature %q", cmd.Feature)
}
- return nil
}