diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2019-02-16 20:41:20 -0500 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2019-02-16 20:41:20 -0500 |
commit | 97c4b4053ab187a75a1a79854df2941522cdab09 (patch) | |
tree | f57c1ee4d8430ed86884bd7b8924cef7c66db349 /fi-filefilter | |
parent | 2495e17b6c2d4323b0c989b8ef27248f29eb9548 (diff) |
better type checking
Diffstat (limited to 'fi-filefilter')
-rw-r--r-- | fi-filefilter/main.go | 225 |
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 } |