From 16b15e1c29cc70190f716cd07c72a268e3176952 Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Thu, 10 Mar 2016 16:15:55 -0500 Subject: [PATCH] *: initial thoughts Signed-off-by: Vincent Batts --- cmd/gomtree/main.go | 39 +++++++++ mtree.go | 58 +++++++++++++ mtree_test.go | 41 +++++++++ testdata/source.mtree | 196 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 334 insertions(+) create mode 100644 cmd/gomtree/main.go create mode 100644 mtree.go create mode 100644 mtree_test.go create mode 100644 testdata/source.mtree diff --git a/cmd/gomtree/main.go b/cmd/gomtree/main.go new file mode 100644 index 0000000..3551bcc --- /dev/null +++ b/cmd/gomtree/main.go @@ -0,0 +1,39 @@ +package main + +import ( + "bufio" + "flag" + "fmt" + "log" + "os" + "strings" +) + +func main() { + flag.Parse() + _ = mtree.DirectoryHierarchy{} + for _, file := range flag.Args() { + func() { + fh, err := os.Open(file) + if err != nil { + log.Println(err) + return + } + defer fh.Close() + + s := bufio.NewScanner(fh) + for s.Scan() { + str := s.Text() + switch { + case strings.HasPrefix(str, "#"): + continue + default: + } + fmt.Printf("%q\n", str) + } + if err := s.Err(); err != nil { + log.Println("ERROR:", err) + } + }() + } +} diff --git a/mtree.go b/mtree.go new file mode 100644 index 0000000..686cd16 --- /dev/null +++ b/mtree.go @@ -0,0 +1,58 @@ +package mtree + +import "io" + +// Positioner responds with the newline delimited position +type Positioner interface { + Pos() int +} + +// DirectoryHierarchy is the mapped structure for an mtree directory hierarchy +// spec +type DirectoryHierarchy struct { + Comments []Comment + Entries []Entry +} + +// WriteTo simplifies the output of the resulting hierarchy spec +func (dh DirectoryHierarchy) WriteTo(w io.Writer) (n int64, err error) { + return 0, nil +} + +// Comment stores arbitrary metadata for the spec. Sometimes "user", "machine", +// "tree", and "date". But most of the time, it includes the relative path of +// the directory being stepped into. Or a "signature" like `#mtree v2.0`, +type Comment struct { + Position int + Str string + // TODO(vbatts) include a comment line parser +} + +// Pos returns the line of this comment +func (c Comment) Pos() int { + return c.Position +} + +// Entry is each component of content in the mtree spec file +type Entry struct { + Position int // order in the spec + Name string // file or directory name + Keywords []string // TODO(vbatts) maybe a keyword typed set of values? + str string // raw string. needed? + Type EntryType +} + +// Pos returns the line of this comment +func (e Entry) Pos() int { + return e.Position +} + +type EntryType int + +const ( + SpecialType int = iota // line that has `/` prefix issue a "special" command (currently only /set and /unset) + FileType // indented line + DirectoryType // ^ matched line, that is not /set + PathStepType // .. - keywords/options are ignored + FullType // if the first word on the line has a `/` after the first character, it interpretted as a file pathname with options +) diff --git a/mtree_test.go b/mtree_test.go new file mode 100644 index 0000000..b40a851 --- /dev/null +++ b/mtree_test.go @@ -0,0 +1,41 @@ +package mtree + +import ( + "bufio" + "fmt" + "log" + "os" + "strings" + "testing" +) + +var testFiles = []string{ + "testdata/source.mtree", +} + +func TestParser(t *testing.T) { + for _, file := range testFiles { + func() { + fh, err := os.Open(file) + if err != nil { + log.Println(err) + return + } + defer fh.Close() + + s := bufio.NewScanner(fh) + for s.Scan() { + str := s.Text() + switch { + case strings.HasPrefix(str, "#"): + continue + default: + } + fmt.Printf("%q\n", str) + } + if err := s.Err(); err != nil { + log.Println("ERROR:", err) + } + }() + } +} diff --git a/testdata/source.mtree b/testdata/source.mtree new file mode 100644 index 0000000..bae465a --- /dev/null +++ b/testdata/source.mtree @@ -0,0 +1,196 @@ +# user: vbatts +# machine: valse.usersys.redhat.com +# tree: /home/vbatts/src/vb/go-mtree +# date: Thu Mar 10 16:15:36 2016 + +# . +/set type=file uid=1000 gid=1000 mode=0664 nlink=1 flags=none +. type=dir mode=0775 nlink=5 size=4096 \ + time=1457644509.817998120 + .mtree.go.swp \ + mode=0644 size=12288 time=1457644483.833957552 \ + sha512digest=7efd38cc957b53e3d5abd25e9df9bde715a5e18dc18abfa8f0c0eaa9bca0fda32faad4972bd4d9b555270fa3b3b92e6a1e97ad1e3bfff14fc933284004f7e8d3 + .mtree_test.go.swp \ + mode=0644 size=12288 time=1457644509.813998114 \ + sha512digest=2aaeb1e5f03a563de86a4c1f722bde40312bbecbe4504d67fb441240c049e6ad11294ef834114a05e620a390ee9f42c1c77b43bf1a4f2d47f128226183968a33 + mtree.go size=1719 time=1457644447.020900074 \ + sha512digest=2dee9f50ba167cd90d4f6e8494d4735c6b064c279ea4d26ed2c47552a5c0b82b0bdcadb214e0ca919a1768ce0e321e8d1bb71eacb9c5b4bb5fd4342967055a04 + mtree.go~ size=1719 time=1457644447.012900062 \ + sha512digest=2dee9f50ba167cd90d4f6e8494d4735c6b064c279ea4d26ed2c47552a5c0b82b0bdcadb214e0ca919a1768ce0e321e8d1bb71eacb9c5b4bb5fd4342967055a04 + mtree_test.go \ + size=581 time=1457644509.817998120 \ + sha512digest=1b3ab2de2759df6e7d424d05ffd1d45101fd10ae86328abad1657e68044add69d83d6b3271225070f4f4154a7c0c995016077f8c7969890e068cd0a54b23f4b6 + mtree_test.go~ \ + size=581 time=1457644509.812998113 \ + sha512digest=1b3ab2de2759df6e7d424d05ffd1d45101fd10ae86328abad1657e68044add69d83d6b3271225070f4f4154a7c0c995016077f8c7969890e068cd0a54b23f4b6 + +# ./.git +/set type=file uid=1000 gid=1000 mode=0775 nlink=1 flags=none +.git type=dir nlink=7 size=4096 time=1457644470.212936285 + HEAD mode=0664 size=23 time=1454678171.602940889 \ + sha512digest=76b199f1bffdc6d21547895431b0f85f3857df400225cbd1ae55e7ded09786a8a44e1cb21f1feff4951cf57c893043a0be696dcb0e4f5758a4d6081a833eb6cf + config mode=0664 size=92 time=1454678171.607940896 \ + sha512digest=961231503987d2154696364e8e4d7b3aaf2d2abe5da55367b615a5d9e1bcda30824c30880bfdb8e9959444040d91cd3ec6fa225e8a36a93cfc182bf263d6e02a + description mode=0664 size=73 time=1454678171.602940889 \ + sha512digest=f7e152f75b124c3e1c5d12f00427729d9eec4e2c1bf70d7606440a6600d003367eb178331e75ab976a61496e79c2c822020849d28ffd170946397b934611b471 + index mode=0664 size=272 time=1457644470.212936285 \ + sha512digest=fcecb444e3748cccfc498a63939f489f6456f1cf9e0e8ace21b7cdf8eecfb0e0a3db9bf6d449db2608752e5c0dbae786b4facb46f359555871b7e48d80b9a765 + +# ./.git/branches +branches type=dir nlink=2 size=4096 time=1454678171.596940880 +# ./.git/branches +.. + + +# ./.git/hooks +hooks type=dir nlink=2 size=4096 time=1454678171.600940886 + applypatch-msg.sample \ + size=478 time=1454678171.597940882 \ + sha512digest=536cce804d84e25813993efdd240537b52d00ce9cdcecf1982f85096d56a521290104c825c00b370b2752201952a9616a3f4e28c5d27a5b4e4842101a2ff9bee + commit-msg.sample \ + size=896 time=1454678171.598940883 \ + sha512digest=d6bb7fa747f4625adf1877f546565cbe812ca7dd4168f7e9068e6732555d8737eba549546cf5946649e3f38de82d173aaf9c160a4c9f9445655258b4c5f955eb + post-update.sample \ + size=189 time=1454678171.598940883 \ + sha512digest=473ad124642571656276bf83b9ff63ab1804d3c23a5bdae52391c6f70a894849ac60c10c9d31deff3938922ce83b68b1e60c11592bbf7ea503f4acd39968cefa + pre-applypatch.sample \ + size=424 time=1454678171.598940883 \ + sha512digest=cb78aa7e9b9c146e5db65d86dd83f04e2b6942a06fab50c704a0fd900683f3b6ad1164e74afe2f267f6da91cdff0b9ab07713e12cefc6f8d741b5df194f4fda6 + pre-commit.sample \ + size=1642 time=1454678171.599940885 \ + sha512digest=4a7ac2ed2ffe50d2a997c3477b5855c3d19423c295a82f7d660be3418217a183b0ce25f94ae2e350f4d93eda3b75a4bd62cf27f0685d8a837919bcc9e7e0962a + pre-push.sample \ + size=1348 time=1454678171.599940885 \ + sha512digest=37cd20a090494acb16c2255fe93dadeb409f2553afddc409dad5b5e99c9f5612a28eba397c0f3ae771e17edbe0a6c2a3af311154285e6d9c43e4cc4f06ba5b8d + pre-rebase.sample \ + size=4951 time=1454678171.600940886 \ + sha512digest=de9bdf513f383b3215e467c025ca851a0f2661b91811bfd441486b678e4d45e450ce9185a7c3ac2988bd6154d4983b3e29427623117e73623f2af43cf4b746da + prepare-commit-msg.sample \ + size=1239 time=1454678171.600940886 \ + sha512digest=fbf15f12136a413dd590e57392e6122714d67456beed50d9ef285e40076a138a7d44291b5642fe5c518dc56c640436caf6225d1a966e06c042b30e6a7d08dcef + update.sample \ + size=3611 time=1454678171.601940888 \ + sha512digest=f8e20df0e6c970fa809d5c9494cb9d5e32894fe20f23f6730df84f5fa065e52c55cca98d0db1ed17df53c606629c787ae56b6af6faca527f62c817f8cb148c1a +# ./.git/hooks +.. + + +# ./.git/info +/set type=file uid=1000 gid=1000 mode=0664 nlink=1 flags=none +info type=dir mode=0775 nlink=2 size=4096 \ + time=1454678171.601940888 + exclude size=240 time=1454678171.601940888 \ + sha512digest=9828c6ecdf91bf117416e17f4ee9caee2e1e37b6fb00b9ff04035ace17a3089b9d0a25c6baa1046c0e1c62d3da88838e8fca74ea82973d6b975905fde58f3072 +# ./.git/info +.. + + +# ./.git/objects +/set type=file uid=1000 gid=1000 mode=0775 nlink=1 flags=none +objects type=dir nlink=7 size=4096 time=1457644470.212936285 + +# ./.git/objects/35 +/set type=file uid=1000 gid=1000 mode=0444 nlink=1 flags=none +35 type=dir mode=0775 nlink=2 size=4096 \ + time=1457644470.212936285 + 51bcca10021bb56f13dd57a84b97cdf7fda0cf \ + size=344 time=1457644470.212936285 \ + sha512digest=cc9cbb88b1c060f78a06d65decb59f2e4f7cafe25fc962d549b1826b91f2b27f22d13ec104acdea1dc30fa22c533fa88da9df2785a782dacbf93264741099043 +# ./.git/objects/35 +.. + + +# ./.git/objects/45 +45 type=dir mode=0775 nlink=2 size=4096 \ + time=1457644470.212936285 + 15ff8d078d5291b75e99cbaa3e6c5e83ffaa2e \ + size=363 time=1457644470.212936285 \ + sha512digest=b4cb2c25df4a6d5a158b4d945d1c1bd26a17b286c472bb9ad5b43624ee09c01b24c817875ac7611992f2b45eea0287cb0d8e4ae257ed054d1e33ae6f481728c8 +# ./.git/objects/45 +.. + + +# ./.git/objects/88 +88 type=dir mode=0775 nlink=2 size=4096 \ + time=1454678174.768945501 + 2ba9732d762797f0f338de29bf79a8c0b7a679 \ + size=30 time=1454678174.768945501 \ + sha512digest=cc95f98c49e284de74626cc5da73ff54388a65fd796f532ae070c09635784ae2dac04537e1d2b1c73fae7be8ad96c96fab3ddddd943a7abc7b3ee8741fe56de5 +# ./.git/objects/88 +.. + + +# ./.git/objects/info +info type=dir mode=0775 nlink=2 size=4096 \ + time=1454678171.609940899 +# ./.git/objects/info +.. + + +# ./.git/objects/pack +pack type=dir mode=0775 nlink=2 size=4096 \ + time=1454678171.609940899 +# ./.git/objects/pack +.. + +# ./.git/objects +.. + + +# ./.git/refs +/set type=file uid=1000 gid=1000 mode=0775 nlink=1 flags=none +refs type=dir nlink=4 size=4096 time=1454678171.595940879 + +# ./.git/refs/heads +heads type=dir nlink=2 size=4096 time=1454678171.595940879 +# ./.git/refs/heads +.. + + +# ./.git/refs/tags +tags type=dir nlink=2 size=4096 time=1454678171.595940879 +# ./.git/refs/tags +.. + +# ./.git/refs +.. + +# ./.git +.. + + +# ./cmd +cmd type=dir nlink=3 size=4096 time=1457644245.753596701 + +# ./cmd/gomtree +/set type=file uid=1000 gid=1000 mode=0664 nlink=1 flags=none +gomtree type=dir mode=0775 nlink=2 size=4096 \ + time=1457644313.182697118 + .main.go.swp \ + mode=0644 size=12288 time=1457644334.048728193 \ + sha512digest=ac1a05940c2033962a7ba6878a25aeeac84df3d41548b15c2b3ae283c8090012f3646821906b0edc4b716cf3a220536c862ea370ce235bffc7b7520f77df8903 + main.go size=552 time=1457644313.182697118 \ + sha512digest=519009a7756506e7aac81734b9701ac33aa0c22b1866abdc1fc1550e6c4e7164fa794d60f524116e7cfcdc9456f8637f504359749690f8199008263925350dad + main.go~ size=552 time=1457644313.171697102 \ + sha512digest=519009a7756506e7aac81734b9701ac33aa0c22b1866abdc1fc1550e6c4e7164fa794d60f524116e7cfcdc9456f8637f504359749690f8199008263925350dad +# ./cmd/gomtree +.. + +# ./cmd +.. + + +# ./testdata +testdata type=dir mode=0775 nlink=2 size=4096 \ + time=1457644536.529039825 + Downloads.mtree \ + size=31406 time=1457644391.210813319 \ + sha512digest=a31c61a8907078a82c1ad542ded518e10e862dcf9f561970a6174652d716c4e1ea745410c6a69d7382b13607e85426a190268955d4ecb657990c3fa456e39b46 + source.mtree \ + size=8192 time=1457644536.536039836 \ + sha512digest=9748642c0ef6784611d155030067ccc5cdad5d51b4dc61b103da08377bd75aa3132756dcdb81c850e6555de5e845f26e22996b8bf1f76d39e71128585fbe6d17 +# ./testdata +.. + +.. +