This example code is to detect if two glob-patterns have intersections.
Here we say that if two glob patterns intersect when they can match at least one path. We do not aim to tell you that path.
This is not like what filepath.Match
does.
While filepath.Match
tests glob against path, we glob-intersection tests glob against glob.
- Single path component only
- Only
*
is supported **
is not supported?
is not supported[]
is not supported\
is not supported
Below is an example of trying to detect if ab*d
and a*cd
can match some path.
| ab*d| | a*cd| initial
| b*d| | *cd| advance both: a ↔ a
| b*d| | cd| expand right: * → ∅
| *d| | cd| expand right: * → b
| d| | cd| expand left: * → ∅
| d| | d| expand left: * → c
| | | | advance both: d ↔ d
| | | | intersected
Each line is an action with the states of the rune stack after that action done. The first line is the initial states. And at the last line, both stack go empty, we know those glob-patterns are intersected.
- regex - Algorithm to find out whether the matches for two Glob patterns (or Regular Expressions) intersect - Stack Overflow
- Pathgather/glob-intersection: Find the intersection of two glob patterns
$ go test -run ^TestIntersection$ github.com/movsb/glob-intersection
----------------------------------------------------------------------
| ab| | a| initial
| b| | | advance both: a ↔ a
| ab| | a| not intersected
----------------------------------------------------------------------
| *| | *.log| initial
| | | *.log| expand left: * → ∅
| | | .log| expand right: * → ∅
| | | .log| expand left: * → *
| | | log| expand left: * → *.
| | | og| expand left: * → *.l
| | | g| expand left: * → *.lo
| | | | expand left: * → *.log
| *| | *.log| intersected
----------------------------------------------------------------------
| *| | abc| initial
| | | abc| expand left: * → ∅
| | | bc| expand left: * → a
| | | c| expand left: * → ab
| | | | expand left: * → abc
| *| | abc| intersected
----------------------------------------------------------------------
| *.log| | a.log| initial
| .log| | a.log| expand left: * → ∅
| .log| | .log| expand left: * → a
| log| | log| advance both: . ↔ .
| og| | og| advance both: l ↔ l
| g| | g| advance both: o ↔ o
| | | | advance both: g ↔ g
| *.log| | a.log| intersected
----------------------------------------------------------------------
| *-live-*| | -live-| initial
| -live-*| | -live-| expand left: * → ∅
| live-*| | live-| advance both: - ↔ -
| ive-*| | ive-| advance both: l ↔ l
| ve-*| | ve-| advance both: i ↔ i
| e-*| | e-| advance both: v ↔ v
| -*| | -| advance both: e ↔ e
| *| | | advance both: - ↔ -
| | | | expand left: * → ∅
| *-live-*| | -live-| intersected
----------------------------------------------------------------------
| *-live-*| | a-live-| initial
| -live-*| | a-live-| expand left: * → ∅
| -live-*| | -live-| expand left: * → a
| live-*| | live-| advance both: - ↔ -
| ive-*| | ive-| advance both: l ↔ l
| ve-*| | ve-| advance both: i ↔ i
| e-*| | e-| advance both: v ↔ v
| -*| | -| advance both: e ↔ e
| *| | | advance both: - ↔ -
| | | | expand left: * → ∅
| *-live-*| | a-live-| intersected
----------------------------------------------------------------------
| *-live-*| | -live-b| initial
| -live-*| | -live-b| expand left: * → ∅
| live-*| | live-b| advance both: - ↔ -
| ive-*| | ive-b| advance both: l ↔ l
| ve-*| | ve-b| advance both: i ↔ i
| e-*| | e-b| advance both: v ↔ v
| -*| | -b| advance both: e ↔ e
| *| | b| advance both: - ↔ -
| | | b| expand left: * → ∅
| | | | expand left: * → b
| *-live-*| | -live-b| intersected
----------------------------------------------------------------------
| *-live-*| | a-live-b| initial
| -live-*| | a-live-b| expand left: * → ∅
| -live-*| | -live-b| expand left: * → a
| live-*| | live-b| advance both: - ↔ -
| ive-*| | ive-b| advance both: l ↔ l
| ve-*| | ve-b| advance both: i ↔ i
| e-*| | e-b| advance both: v ↔ v
| -*| | -b| advance both: e ↔ e
| *| | b| advance both: - ↔ -
| | | b| expand left: * → ∅
| | | | expand left: * → b
| *-live-*| | a-live-b| intersected
----------------------------------------------------------------------
| ab*d| | a*cd| initial
| b*d| | *cd| advance both: a ↔ a
| b*d| | cd| expand right: * → ∅
| *d| | cd| expand right: * → b
| d| | cd| expand left: * → ∅
| d| | d| expand left: * → c
| | | | advance both: d ↔ d
| ab*d| | a*cd| intersected
----------------------------------------------------------------------
| abc*def| | abc.def| initial
| bc*def| | bc.def| advance both: a ↔ a
| c*def| | c.def| advance both: b ↔ b
| *def| | .def| advance both: c ↔ c
| def| | .def| expand left: * → ∅
| def| | def| expand left: * → .
| ef| | ef| advance both: d ↔ d
| f| | f| advance both: e ↔ e
| | | | advance both: f ↔ f
| abc*def| | abc.def| intersected
----------------------------------------------------------------------
| abcd*g| | a*defg| initial
| bcd*g| | *defg| advance both: a ↔ a
| bcd*g| | defg| expand right: * → ∅
| cd*g| | defg| expand right: * → b
| d*g| | defg| expand right: * → bc
| *g| | efg| advance both: d ↔ d
| g| | efg| expand left: * → ∅
| g| | fg| expand left: * → e
| g| | g| expand left: * → ef
| | | | advance both: g ↔ g
| abcd*g| | a*defg| intersected
----------------------------------------------------------------------
| *bc| | ab*| initial
| bc| | ab*| expand left: * → ∅
| bc| | b*| expand left: * → a
| c| | *| advance both: b ↔ b
| c| | | expand right: * → ∅
| | | | expand right: * → c
| *bc| | ab*| intersected
----------------------------------------------------------------------
| *| | **| initial
| | | **| expand left: * → ∅
| | | *| expand right: * → ∅
| | | | expand right: * → ∅
| *| | **| intersected
----------------------------------------------------------------------
| a*b*c*d| | **| initial
| a*b*c*d| | *| expand right: * → ∅
| a*b*c*d| | | expand right: * → ∅
| *b*c*d| | | expand right: * → a
| b*c*d| | | expand left: * → ∅
| b*c*d| | | expand right: * → a*
| *c*d| | | expand right: * → a*b
| c*d| | | expand left: * → ∅
| c*d| | | expand right: * → a*b*
| *d| | | expand right: * → a*b*c
| d| | | expand left: * → ∅
| d| | | expand right: * → a*b*c*
| | | | expand right: * → a*b*c*d
| a*b*c*d| | **| intersected
----------------------------------------------------------------------
| a*b*c*d| | *********| initial
| a*b*c*d| | ********| expand right: * → ∅
| a*b*c*d| | *******| expand right: * → ∅
| a*b*c*d| | ******| expand right: * → ∅
| a*b*c*d| | *****| expand right: * → ∅
| a*b*c*d| | ****| expand right: * → ∅
| a*b*c*d| | ***| expand right: * → ∅
| a*b*c*d| | **| expand right: * → ∅
| a*b*c*d| | *| expand right: * → ∅
| a*b*c*d| | | expand right: * → ∅
| *b*c*d| | | expand right: * → a
| b*c*d| | | expand left: * → ∅
| b*c*d| | | expand right: * → a*
| *c*d| | | expand right: * → a*b
| c*d| | | expand left: * → ∅
| c*d| | | expand right: * → a*b*
| *d| | | expand right: * → a*b*c
| d| | | expand left: * → ∅
| d| | | expand right: * → a*b*c*
| | | | expand right: * → a*b*c*d
| a*b*c*d| | *********| intersected
--- PASS: TestIntersection (0.00s)
PASS
ok github.com/movsb/glob-intersection 0.660s