Repository files navigation

watcher

Build Status

watcher is a Go package for watching for files or directory changes (recursively or non recursively) without using filesystem events, which allows it to work cross platform consistently.

watcher watches for changes and notifies over channels either anytime an event or an error has occurred.

Events contain the os.FileInfo of the file or directory that the event is based on and the type of event and file or directory path.

Installation
Features
Example
Contributing
Watcher Command

Update

  • Added new file filter hooks (Including a built in regexp filtering hook) [Dec 12, 2018]
  • Event.Path for Rename and Move events is now returned in the format of fromPath -> toPath

Chmod event is not supported under windows.

Installation

go get -u github.com/radovskyb/watcher/...

Features

  • Customizable polling interval.
  • Filter Events.
  • Watch folders recursively or non-recursively.
  • Choose to ignore hidden files.
  • Choose to ignore specified files and folders.
  • Notifies the os.FileInfo of the file that the event is based on. e.g Name, ModTime, IsDir, etc.
  • Notifies the full path of the file that the event is based on or the old and new paths if the event was a Rename or Move event.
  • Limit amount of events that can be received per watching cycle.
  • List the files being watched.
  • Trigger custom events.

Todo

  • Write more tests.
  • Write benchmarks.

Example

package main
import (
"fmt""log""time""github.com/radovskyb/watcher"
)
funcmain() {
w:=watcher.New()
// SetMaxEvents to 1 to allow at most 1 event's to be received// on the Event channel per watching cycle.//// If SetMaxEvents is not set, the default is to send all events.w.SetMaxEvents(1)
// Only notify rename and move events.w.FilterOps(watcher.Rename, watcher.Move)
// Only files that match the regular expression during file listings// will be watched.r:=regexp.MustCompile("^abc$")
w.AddFilterHook(watcher.RegexFilterHook(r, false))
gofunc() {
for {
select {
caseevent:=<-w.Event: fmt.Println(event) // Print the event's info.caseerr:=<-w.Error:
log.Fatalln(err)
case<-w.Closed:
return
}
}
}()
// Watch this folder for changes.iferr:=w.Add("."); err!=nil {
log.Fatalln(err)
}
// Watch test_folder recursively for changes.iferr:=w.AddRecursive("../test_folder"); err!=nil {
log.Fatalln(err)
}
// Print a list of all of the files and folders currently// being watched and their paths.forpath, f:=rangew.WatchedFiles() {
fmt.Printf("%s: %s\n", path, f.Name())
}
fmt.Println()
// Trigger 2 events after watcher started.gofunc() {
w.Wait()
w.TriggerEvent(watcher.Create, nil)
w.TriggerEvent(watcher.Remove, nil)
}()
// Start the watching process - it'll check for changes every 100ms.iferr:=w.Start(time.Millisecond*100); err!=nil {
log.Fatalln(err)
}
}

Contributing

If you would ike to contribute, simply submit a pull request.

Command

watcher comes with a simple command which is installed when using the go get command from above.

Usage

Usage of watcher:
-cmd string
command to run when an event occurs
-dotfiles
watch dot files (default true)
-ignore string
comma separated list of paths to ignore
-interval string
watcher poll interval (default "100ms")
-keepalive
keep alive when a cmd returns code != 0
-list
list watched files on start
-pipe
pipe event's info to command's stdin
-recursive
watch folders recursively (default true)
-startcmd
run the command when watcher starts

All of the flags are optional and watcher can also be called by itself:

watcher

(watches the current directory recursively for changes and notifies any events that occur.)

A more elaborate example using the watcher command:

watcher -dotfiles=false -recursive=false -cmd="./myscript" main.go ../

In this example, watcher will ignore dot files and folders and won't watch any of the specified folders recursively. It will also run the script ./myscript anytime an event occurs while watching main.go or any files or folders in the previous directory (../).

Using the pipe and cmd flags together will send the event's info to the command's stdin when changes are detected.

First create a file called script.py with the following contents:

importsysforlineinsys.stdin:
print (line+" - python")

Next, start watcher with the pipe and cmd flags enabled:

watcher -cmd="python script.py" -pipe=true

Now when changes are detected, the event's info will be output from the running python script.

About

watcher is a Go package for watching for files or directory changes without using filesystem events.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

watcher

Build Status

watcher is a Go package for watching for files or directory changes (recursively or non recursively) without using filesystem events, which allows it to work cross platform consistently.

watcher watches for changes and notifies over channels either anytime an event or an error has occurred.

Events contain the os.FileInfo of the file or directory that the event is based on and the type of event and file or directory path.

Installation
Features
Example
Contributing
Watcher Command

Update

  • Added new file filter hooks (Including a built in regexp filtering hook) [Dec 12, 2018]
  • Event.Path for Rename and Move events is now returned in the format of fromPath -> toPath

Chmod event is not supported under windows.

Installation

go get -u github.com/radovskyb/watcher/...

Features

  • Customizable polling interval.
  • Filter Events.
  • Watch folders recursively or non-recursively.
  • Choose to ignore hidden files.
  • Choose to ignore specified files and folders.
  • Notifies the os.FileInfo of the file that the event is based on. e.g Name, ModTime, IsDir, etc.
  • Notifies the full path of the file that the event is based on or the old and new paths if the event was a Rename or Move event.
  • Limit amount of events that can be received per watching cycle.
  • List the files being watched.
  • Trigger custom events.

Todo

  • Write more tests.
  • Write benchmarks.

Example

package main
import (
"fmt""log""time""github.com/radovskyb/watcher"
)
funcmain() {
w:=watcher.New()
// SetMaxEvents to 1 to allow at most 1 event's to be received// on the Event channel per watching cycle.//// If SetMaxEvents is not set, the default is to send all events.w.SetMaxEvents(1)
// Only notify rename and move events.w.FilterOps(watcher.Rename, watcher.Move)
// Only files that match the regular expression during file listings// will be watched.r:=regexp.MustCompile("^abc$")
w.AddFilterHook(watcher.RegexFilterHook(r, false))
gofunc() {
for {
select {
caseevent:=<-w.Event: fmt.Println(event) // Print the event's info.caseerr:=<-w.Error:
log.Fatalln(err)
case<-w.Closed:
return
}
}
}()
// Watch this folder for changes.iferr:=w.Add("."); err!=nil {
log.Fatalln(err)
}
// Watch test_folder recursively for changes.iferr:=w.AddRecursive("../test_folder"); err!=nil {
log.Fatalln(err)
}
// Print a list of all of the files and folders currently// being watched and their paths.forpath, f:=rangew.WatchedFiles() {
fmt.Printf("%s: %s\n", path, f.Name())
}
fmt.Println()
// Trigger 2 events after watcher started.gofunc() {
w.Wait()
w.TriggerEvent(watcher.Create, nil)
w.TriggerEvent(watcher.Remove, nil)
}()
// Start the watching process - it'll check for changes every 100ms.iferr:=w.Start(time.Millisecond*100); err!=nil {
log.Fatalln(err)
}
}

Contributing

If you would ike to contribute, simply submit a pull request.

Command

watcher comes with a simple command which is installed when using the go get command from above.

Usage

Usage of watcher:
-cmd string
command to run when an event occurs
-dotfiles
watch dot files (default true)
-ignore string
comma separated list of paths to ignore
-interval string
watcher poll interval (default "100ms")
-keepalive
keep alive when a cmd returns code != 0
-list
list watched files on start
-pipe
pipe event's info to command's stdin
-recursive
watch folders recursively (default true)
-startcmd
run the command when watcher starts

All of the flags are optional and watcher can also be called by itself:

watcher

(watches the current directory recursively for changes and notifies any events that occur.)

A more elaborate example using the watcher command:

watcher -dotfiles=false -recursive=false -cmd="./myscript" main.go ../

In this example, watcher will ignore dot files and folders and won't watch any of the specified folders recursively. It will also run the script ./myscript anytime an event occurs while watching main.go or any files or folders in the previous directory (../).

Using the pipe and cmd flags together will send the event's info to the command's stdin when changes are detected.

First create a file called script.py with the following contents:

importsysforlineinsys.stdin:
print (line+" - python")

Next, start watcher with the pipe and cmd flags enabled:

watcher -cmd="python script.py" -pipe=true

Now when changes are detected, the event's info will be output from the running python script.

About

watcher is a Go package for watching for files or directory changes without using filesystem events.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

watcher

Build Status

watcher is a Go package for watching for files or directory changes (recursively or non recursively) without using filesystem events, which allows it to work cross platform consistently.

watcher watches for changes and notifies over channels either anytime an event or an error has occurred.

Events contain the os.FileInfo of the file or directory that the event is based on and the type of event and file or directory path.

Installation
Features
Example
Contributing
Watcher Command

Update

  • Added new file filter hooks (Including a built in regexp filtering hook) [Dec 12, 2018]
  • Event.Path for Rename and Move events is now returned in the format of fromPath -> toPath

Chmod event is not supported under windows.

Installation

go get -u github.com/radovskyb/watcher/...

Features

  • Customizable polling interval.
  • Filter Events.
  • Watch folders recursively or non-recursively.
  • Choose to ignore hidden files.
  • Choose to ignore specified files and folders.
  • Notifies the os.FileInfo of the file that the event is based on. e.g Name, ModTime, IsDir, etc.
  • Notifies the full path of the file that the event is based on or the old and new paths if the event was a Rename or Move event.
  • Limit amount of events that can be received per watching cycle.
  • List the files being watched.
  • Trigger custom events.

Todo

  • Write more tests.
  • Write benchmarks.

Example

package main
import (
"fmt""log""time""github.com/radovskyb/watcher"
)
funcmain() {
w:=watcher.New()
// SetMaxEvents to 1 to allow at most 1 event's to be received// on the Event channel per watching cycle.//// If SetMaxEvents is not set, the default is to send all events.w.SetMaxEvents(1)
// Only notify rename and move events.w.FilterOps(watcher.Rename, watcher.Move)
// Only files that match the regular expression during file listings// will be watched.r:=regexp.MustCompile("^abc$")
w.AddFilterHook(watcher.RegexFilterHook(r, false))
gofunc() {
for {
select {
caseevent:=<-w.Event: fmt.Println(event) // Print the event's info.caseerr:=<-w.Error:
log.Fatalln(err)
case<-w.Closed:
return
}
}
}()
// Watch this folder for changes.iferr:=w.Add("."); err!=nil {
log.Fatalln(err)
}
// Watch test_folder recursively for changes.iferr:=w.AddRecursive("../test_folder"); err!=nil {
log.Fatalln(err)
}
// Print a list of all of the files and folders currently// being watched and their paths.forpath, f:=rangew.WatchedFiles() {
fmt.Printf("%s: %s\n", path, f.Name())
}
fmt.Println()
// Trigger 2 events after watcher started.gofunc() {
w.Wait()
w.TriggerEvent(watcher.Create, nil)
w.TriggerEvent(watcher.Remove, nil)
}()
// Start the watching process - it'll check for changes every 100ms.iferr:=w.Start(time.Millisecond*100); err!=nil {
log.Fatalln(err)
}
}

Contributing

If you would ike to contribute, simply submit a pull request.

Command

watcher comes with a simple command which is installed when using the go get command from above.

Usage

Usage of watcher:
-cmd string
command to run when an event occurs
-dotfiles
watch dot files (default true)
-ignore string
comma separated list of paths to ignore
-interval string
watcher poll interval (default "100ms")
-keepalive
keep alive when a cmd returns code != 0
-list
list watched files on start
-pipe
pipe event's info to command's stdin
-recursive
watch folders recursively (default true)
-startcmd
run the command when watcher starts

All of the flags are optional and watcher can also be called by itself:

watcher

(watches the current directory recursively for changes and notifies any events that occur.)

A more elaborate example using the watcher command:

watcher -dotfiles=false -recursive=false -cmd="./myscript" main.go ../

In this example, watcher will ignore dot files and folders and won't watch any of the specified folders recursively. It will also run the script ./myscript anytime an event occurs while watching main.go or any files or folders in the previous directory (../).

Using the pipe and cmd flags together will send the event's info to the command's stdin when changes are detected.

First create a file called script.py with the following contents:

importsysforlineinsys.stdin:
print (line+" - python")

Next, start watcher with the pipe and cmd flags enabled:

watcher -cmd="python script.py" -pipe=true

Now when changes are detected, the event's info will be output from the running python script.

About

watcher is a Go package for watching for files or directory changes without using filesystem events.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

watcher

Build Status

watcher is a Go package for watching for files or directory changes (recursively or non recursively) without using filesystem events, which allows it to work cross platform consistently.

watcher watches for changes and notifies over channels either anytime an event or an error has occurred.

Events contain the os.FileInfo of the file or directory that the event is based on and the type of event and file or directory path.

Installation
Features
Example
Contributing
Watcher Command

Update

  • Added new file filter hooks (Including a built in regexp filtering hook) [Dec 12, 2018]
  • Event.Path for Rename and Move events is now returned in the format of fromPath -> toPath

Chmod event is not supported under windows.

Installation

go get -u github.com/radovskyb/watcher/...

Features

  • Customizable polling interval.
  • Filter Events.
  • Watch folders recursively or non-recursively.
  • Choose to ignore hidden files.
  • Choose to ignore specified files and folders.
  • Notifies the os.FileInfo of the file that the event is based on. e.g Name, ModTime, IsDir, etc.
  • Notifies the full path of the file that the event is based on or the old and new paths if the event was a Rename or Move event.
  • Limit amount of events that can be received per watching cycle.
  • List the files being watched.
  • Trigger custom events.

Todo

  • Write more tests.
  • Write benchmarks.

Example

package main
import (
"fmt""log""time""github.com/radovskyb/watcher"
)
funcmain() {
w:=watcher.New()
// SetMaxEvents to 1 to allow at most 1 event's to be received// on the Event channel per watching cycle.//// If SetMaxEvents is not set, the default is to send all events.w.SetMaxEvents(1)
// Only notify rename and move events.w.FilterOps(watcher.Rename, watcher.Move)
// Only files that match the regular expression during file listings// will be watched.r:=regexp.MustCompile("^abc$")
w.AddFilterHook(watcher.RegexFilterHook(r, false))
gofunc() {
for {
select {
caseevent:=<-w.Event: fmt.Println(event) // Print the event's info.caseerr:=<-w.Error:
log.Fatalln(err)
case<-w.Closed:
return
}
}
}()
// Watch this folder for changes.iferr:=w.Add("."); err!=nil {
log.Fatalln(err)
}
// Watch test_folder recursively for changes.iferr:=w.AddRecursive("../test_folder"); err!=nil {
log.Fatalln(err)
}
// Print a list of all of the files and folders currently// being watched and their paths.forpath, f:=rangew.WatchedFiles() {
fmt.Printf("%s: %s\n", path, f.Name())
}
fmt.Println()
// Trigger 2 events after watcher started.gofunc() {
w.Wait()
w.TriggerEvent(watcher.Create, nil)
w.TriggerEvent(watcher.Remove, nil)
}()
// Start the watching process - it'll check for changes every 100ms.iferr:=w.Start(time.Millisecond*100); err!=nil {
log.Fatalln(err)
}
}

Contributing

If you would ike to contribute, simply submit a pull request.

Command

watcher comes with a simple command which is installed when using the go get command from above.

Usage

Usage of watcher:
-cmd string
command to run when an event occurs
-dotfiles
watch dot files (default true)
-ignore string
comma separated list of paths to ignore
-interval string
watcher poll interval (default "100ms")
-keepalive
keep alive when a cmd returns code != 0
-list
list watched files on start
-pipe
pipe event's info to command's stdin
-recursive
watch folders recursively (default true)
-startcmd
run the command when watcher starts

All of the flags are optional and watcher can also be called by itself:

watcher

(watches the current directory recursively for changes and notifies any events that occur.)

A more elaborate example using the watcher command:

watcher -dotfiles=false -recursive=false -cmd="./myscript" main.go ../

In this example, watcher will ignore dot files and folders and won't watch any of the specified folders recursively. It will also run the script ./myscript anytime an event occurs while watching main.go or any files or folders in the previous directory (../).

Using the pipe and cmd flags together will send the event's info to the command's stdin when changes are detected.

First create a file called script.py with the following contents:

importsysforlineinsys.stdin:
print (line+" - python")

Next, start watcher with the pipe and cmd flags enabled:

watcher -cmd="python script.py" -pipe=true

Now when changes are detected, the event's info will be output from the running python script.

About

watcher is a Go package for watching for files or directory changes without using filesystem events.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

watcher

Build Status

watcher is a Go package for watching for files or directory changes (recursively or non recursively) without using filesystem events, which allows it to work cross platform consistently.

watcher watches for changes and notifies over channels either anytime an event or an error has occurred.

Events contain the os.FileInfo of the file or directory that the event is based on and the type of event and file or directory path.

Installation
Features
Example
Contributing
Watcher Command

Update

  • Added new file filter hooks (Including a built in regexp filtering hook) [Dec 12, 2018]
  • Event.Path for Rename and Move events is now returned in the format of fromPath -> toPath

Chmod event is not supported under windows.

Installation

go get -u github.com/radovskyb/watcher/...

Features

  • Customizable polling interval.
  • Filter Events.
  • Watch folders recursively or non-recursively.
  • Choose to ignore hidden files.
  • Choose to ignore specified files and folders.
  • Notifies the os.FileInfo of the file that the event is based on. e.g Name, ModTime, IsDir, etc.
  • Notifies the full path of the file that the event is based on or the old and new paths if the event was a Rename or Move event.
  • Limit amount of events that can be received per watching cycle.
  • List the files being watched.
  • Trigger custom events.

Todo

  • Write more tests.
  • Write benchmarks.

Example

package main
import (
"fmt""log""time""github.com/radovskyb/watcher"
)
funcmain() {
w:=watcher.New()
// SetMaxEvents to 1 to allow at most 1 event's to be received// on the Event channel per watching cycle.//// If SetMaxEvents is not set, the default is to send all events.w.SetMaxEvents(1)
// Only notify rename and move events.w.FilterOps(watcher.Rename, watcher.Move)
// Only files that match the regular expression during file listings// will be watched.r:=regexp.MustCompile("^abc$")
w.AddFilterHook(watcher.RegexFilterHook(r, false))
gofunc() {
for {
select {
caseevent:=<-w.Event: fmt.Println(event) // Print the event's info.caseerr:=<-w.Error:
log.Fatalln(err)
case<-w.Closed:
return
}
}
}()
// Watch this folder for changes.iferr:=w.Add("."); err!=nil {
log.Fatalln(err)
}
// Watch test_folder recursively for changes.iferr:=w.AddRecursive("../test_folder"); err!=nil {
log.Fatalln(err)
}
// Print a list of all of the files and folders currently// being watched and their paths.forpath, f:=rangew.WatchedFiles() {
fmt.Printf("%s: %s\n", path, f.Name())
}
fmt.Println()
// Trigger 2 events after watcher started.gofunc() {
w.Wait()
w.TriggerEvent(watcher.Create, nil)
w.TriggerEvent(watcher.Remove, nil)
}()
// Start the watching process - it'll check for changes every 100ms.iferr:=w.Start(time.Millisecond*100); err!=nil {
log.Fatalln(err)
}
}

Contributing

If you would ike to contribute, simply submit a pull request.

Command

watcher comes with a simple command which is installed when using the go get command from above.

Usage

Usage of watcher:
-cmd string
command to run when an event occurs
-dotfiles
watch dot files (default true)
-ignore string
comma separated list of paths to ignore
-interval string
watcher poll interval (default "100ms")
-keepalive
keep alive when a cmd returns code != 0
-list
list watched files on start
-pipe
pipe event's info to command's stdin
-recursive
watch folders recursively (default true)
-startcmd
run the command when watcher starts

All of the flags are optional and watcher can also be called by itself:

watcher

(watches the current directory recursively for changes and notifies any events that occur.)

A more elaborate example using the watcher command:

watcher -dotfiles=false -recursive=false -cmd="./myscript" main.go ../

In this example, watcher will ignore dot files and folders and won't watch any of the specified folders recursively. It will also run the script ./myscript anytime an event occurs while watching main.go or any files or folders in the previous directory (../).

Using the pipe and cmd flags together will send the event's info to the command's stdin when changes are detected.

First create a file called script.py with the following contents:

importsysforlineinsys.stdin:
print (line+" - python")

Next, start watcher with the pipe and cmd flags enabled:

watcher -cmd="python script.py" -pipe=true

Now when changes are detected, the event's info will be output from the running python script.

About

watcher is a Go package for watching for files or directory changes without using filesystem events.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

watcher

Build Status

watcher is a Go package for watching for files or directory changes (recursively or non recursively) without using filesystem events, which allows it to work cross platform consistently.

watcher watches for changes and notifies over channels either anytime an event or an error has occurred.

Events contain the os.FileInfo of the file or directory that the event is based on and the type of event and file or directory path.

Installation
Features
Example
Contributing
Watcher Command

Update

  • Added new file filter hooks (Including a built in regexp filtering hook) [Dec 12, 2018]
  • Event.Path for Rename and Move events is now returned in the format of fromPath -> toPath

Chmod event is not supported under windows.

Installation

go get -u github.com/radovskyb/watcher/...

Features

  • Customizable polling interval.
  • Filter Events.
  • Watch folders recursively or non-recursively.
  • Choose to ignore hidden files.
  • Choose to ignore specified files and folders.
  • Notifies the os.FileInfo of the file that the event is based on. e.g Name, ModTime, IsDir, etc.
  • Notifies the full path of the file that the event is based on or the old and new paths if the event was a Rename or Move event.
  • Limit amount of events that can be received per watching cycle.
  • List the files being watched.
  • Trigger custom events.

Todo

  • Write more tests.
  • Write benchmarks.

Example

package main
import (
"fmt""log""time""github.com/radovskyb/watcher"
)
funcmain() {
w:=watcher.New()
// SetMaxEvents to 1 to allow at most 1 event's to be received// on the Event channel per watching cycle.//// If SetMaxEvents is not set, the default is to send all events.w.SetMaxEvents(1)
// Only notify rename and move events.w.FilterOps(watcher.Rename, watcher.Move)
// Only files that match the regular expression during file listings// will be watched.r:=regexp.MustCompile("^abc$")
w.AddFilterHook(watcher.RegexFilterHook(r, false))
gofunc() {
for {
select {
caseevent:=<-w.Event: fmt.Println(event) // Print the event's info.caseerr:=<-w.Error:
log.Fatalln(err)
case<-w.Closed:
return
}
}
}()
// Watch this folder for changes.iferr:=w.Add("."); err!=nil {
log.Fatalln(err)
}
// Watch test_folder recursively for changes.iferr:=w.AddRecursive("../test_folder"); err!=nil {
log.Fatalln(err)
}
// Print a list of all of the files and folders currently// being watched and their paths.forpath, f:=rangew.WatchedFiles() {
fmt.Printf("%s: %s\n", path, f.Name())
}
fmt.Println()
// Trigger 2 events after watcher started.gofunc() {
w.Wait()
w.TriggerEvent(watcher.Create, nil)
w.TriggerEvent(watcher.Remove, nil)
}()
// Start the watching process - it'll check for changes every 100ms.iferr:=w.Start(time.Millisecond*100); err!=nil {
log.Fatalln(err)
}
}

Contributing

If you would ike to contribute, simply submit a pull request.

Command

watcher comes with a simple command which is installed when using the go get command from above.

Usage

Usage of watcher:
-cmd string
command to run when an event occurs
-dotfiles
watch dot files (default true)
-ignore string
comma separated list of paths to ignore
-interval string
watcher poll interval (default "100ms")
-keepalive
keep alive when a cmd returns code != 0
-list
list watched files on start
-pipe
pipe event's info to command's stdin
-recursive
watch folders recursively (default true)
-startcmd
run the command when watcher starts

All of the flags are optional and watcher can also be called by itself:

watcher

(watches the current directory recursively for changes and notifies any events that occur.)

A more elaborate example using the watcher command:

watcher -dotfiles=false -recursive=false -cmd="./myscript" main.go ../

In this example, watcher will ignore dot files and folders and won't watch any of the specified folders recursively. It will also run the script ./myscript anytime an event occurs while watching main.go or any files or folders in the previous directory (../).

Using the pipe and cmd flags together will send the event's info to the command's stdin when changes are detected.

First create a file called script.py with the following contents:

importsysforlineinsys.stdin:
print (line+" - python")

Next, start watcher with the pipe and cmd flags enabled:

watcher -cmd="python script.py" -pipe=true

Now when changes are detected, the event's info will be output from the running python script.

About

watcher is a Go package for watching for files or directory changes without using filesystem events.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

watcher

Build Status

watcher is a Go package for watching for files or directory changes (recursively or non recursively) without using filesystem events, which allows it to work cross platform consistently.

watcher watches for changes and notifies over channels either anytime an event or an error has occurred.

Events contain the os.FileInfo of the file or directory that the event is based on and the type of event and file or directory path.

Installation
Features
Example
Contributing
Watcher Command

Update

  • Added new file filter hooks (Including a built in regexp filtering hook) [Dec 12, 2018]
  • Event.Path for Rename and Move events is now returned in the format of fromPath -> toPath

Chmod event is not supported under windows.

Installation

go get -u github.com/radovskyb/watcher/...

Features

  • Customizable polling interval.
  • Filter Events.
  • Watch folders recursively or non-recursively.
  • Choose to ignore hidden files.
  • Choose to ignore specified files and folders.
  • Notifies the os.FileInfo of the file that the event is based on. e.g Name, ModTime, IsDir, etc.
  • Notifies the full path of the file that the event is based on or the old and new paths if the event was a Rename or Move event.
  • Limit amount of events that can be received per watching cycle.
  • List the files being watched.
  • Trigger custom events.

Todo

  • Write more tests.
  • Write benchmarks.

Example

package main
import (
"fmt""log""time""github.com/radovskyb/watcher"
)
funcmain() {
w:=watcher.New()
// SetMaxEvents to 1 to allow at most 1 event's to be received// on the Event channel per watching cycle.//// If SetMaxEvents is not set, the default is to send all events.w.SetMaxEvents(1)
// Only notify rename and move events.w.FilterOps(watcher.Rename, watcher.Move)
// Only files that match the regular expression during file listings// will be watched.r:=regexp.MustCompile("^abc$")
w.AddFilterHook(watcher.RegexFilterHook(r, false))
gofunc() {
for {
select {
caseevent:=<-w.Event: fmt.Println(event) // Print the event's info.caseerr:=<-w.Error:
log.Fatalln(err)
case<-w.Closed:
return
}
}
}()
// Watch this folder for changes.iferr:=w.Add("."); err!=nil {
log.Fatalln(err)
}
// Watch test_folder recursively for changes.iferr:=w.AddRecursive("../test_folder"); err!=nil {
log.Fatalln(err)
}
// Print a list of all of the files and folders currently// being watched and their paths.forpath, f:=rangew.WatchedFiles() {
fmt.Printf("%s: %s\n", path, f.Name())
}
fmt.Println()
// Trigger 2 events after watcher started.gofunc() {
w.Wait()
w.TriggerEvent(watcher.Create, nil)
w.TriggerEvent(watcher.Remove, nil)
}()
// Start the watching process - it'll check for changes every 100ms.iferr:=w.Start(time.Millisecond*100); err!=nil {
log.Fatalln(err)
}
}

Contributing

If you would ike to contribute, simply submit a pull request.

Command

watcher comes with a simple command which is installed when using the go get command from above.

Usage

Usage of watcher:
-cmd string
command to run when an event occurs
-dotfiles
watch dot files (default true)
-ignore string
comma separated list of paths to ignore
-interval string
watcher poll interval (default "100ms")
-keepalive
keep alive when a cmd returns code != 0
-list
list watched files on start
-pipe
pipe event's info to command's stdin
-recursive
watch folders recursively (default true)
-startcmd
run the command when watcher starts

All of the flags are optional and watcher can also be called by itself:

watcher

(watches the current directory recursively for changes and notifies any events that occur.)

A more elaborate example using the watcher command:

watcher -dotfiles=false -recursive=false -cmd="./myscript" main.go ../

In this example, watcher will ignore dot files and folders and won't watch any of the specified folders recursively. It will also run the script ./myscript anytime an event occurs while watching main.go or any files or folders in the previous directory (../).

Using the pipe and cmd flags together will send the event's info to the command's stdin when changes are detected.

First create a file called script.py with the following contents:

importsysforlineinsys.stdin:
print (line+" - python")

Next, start watcher with the pipe and cmd flags enabled:

watcher -cmd="python script.py" -pipe=true

Now when changes are detected, the event's info will be output from the running python script.

About

watcher is a Go package for watching for files or directory changes without using filesystem events.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

watcher

Build Status

watcher is a Go package for watching for files or directory changes (recursively or non recursively) without using filesystem events, which allows it to work cross platform consistently.

watcher watches for changes and notifies over channels either anytime an event or an error has occurred.

Events contain the os.FileInfo of the file or directory that the event is based on and the type of event and file or directory path.

Installation
Features
Example
Contributing
Watcher Command

Update

  • Added new file filter hooks (Including a built in regexp filtering hook) [Dec 12, 2018]
  • Event.Path for Rename and Move events is now returned in the format of fromPath -> toPath

Chmod event is not supported under windows.

Installation

go get -u github.com/radovskyb/watcher/...

Features

  • Customizable polling interval.
  • Filter Events.
  • Watch folders recursively or non-recursively.
  • Choose to ignore hidden files.
  • Choose to ignore specified files and folders.
  • Notifies the os.FileInfo of the file that the event is based on. e.g Name, ModTime, IsDir, etc.
  • Notifies the full path of the file that the event is based on or the old and new paths if the event was a Rename or Move event.
  • Limit amount of events that can be received per watching cycle.
  • List the files being watched.
  • Trigger custom events.

Todo

  • Write more tests.
  • Write benchmarks.

Example

package main
import (
"fmt""log""time""github.com/radovskyb/watcher"
)
funcmain() {
w:=watcher.New()
// SetMaxEvents to 1 to allow at most 1 event's to be received// on the Event channel per watching cycle.//// If SetMaxEvents is not set, the default is to send all events.w.SetMaxEvents(1)
// Only notify rename and move events.w.FilterOps(watcher.Rename, watcher.Move)
// Only files that match the regular expression during file listings// will be watched.r:=regexp.MustCompile("^abc$")
w.AddFilterHook(watcher.RegexFilterHook(r, false))
gofunc() {
for {
select {
caseevent:=<-w.Event: fmt.Println(event) // Print the event's info.caseerr:=<-w.Error:
log.Fatalln(err)
case<-w.Closed:
return
}
}
}()
// Watch this folder for changes.iferr:=w.Add("."); err!=nil {
log.Fatalln(err)
}
// Watch test_folder recursively for changes.iferr:=w.AddRecursive("../test_folder"); err!=nil {
log.Fatalln(err)
}
// Print a list of all of the files and folders currently// being watched and their paths.forpath, f:=rangew.WatchedFiles() {
fmt.Printf("%s: %s\n", path, f.Name())
}
fmt.Println()
// Trigger 2 events after watcher started.gofunc() {
w.Wait()
w.TriggerEvent(watcher.Create, nil)
w.TriggerEvent(watcher.Remove, nil)
}()
// Start the watching process - it'll check for changes every 100ms.iferr:=w.Start(time.Millisecond*100); err!=nil {
log.Fatalln(err)
}
}

Contributing

If you would ike to contribute, simply submit a pull request.

Command

watcher comes with a simple command which is installed when using the go get command from above.

Usage

Usage of watcher:
-cmd string
command to run when an event occurs
-dotfiles
watch dot files (default true)
-ignore string
comma separated list of paths to ignore
-interval string
watcher poll interval (default "100ms")
-keepalive
keep alive when a cmd returns code != 0
-list
list watched files on start
-pipe
pipe event's info to command's stdin
-recursive
watch folders recursively (default true)
-startcmd
run the command when watcher starts

All of the flags are optional and watcher can also be called by itself:

watcher

(watches the current directory recursively for changes and notifies any events that occur.)

A more elaborate example using the watcher command:

watcher -dotfiles=false -recursive=false -cmd="./myscript" main.go ../

In this example, watcher will ignore dot files and folders and won't watch any of the specified folders recursively. It will also run the script ./myscript anytime an event occurs while watching main.go or any files or folders in the previous directory (../).

Using the pipe and cmd flags together will send the event's info to the command's stdin when changes are detected.

First create a file called script.py with the following contents:

importsysforlineinsys.stdin:
print (line+" - python")

Next, start watcher with the pipe and cmd flags enabled:

watcher -cmd="python script.py" -pipe=true

Now when changes are detected, the event's info will be output from the running python script.

About

watcher is a Go package for watching for files or directory changes without using filesystem events.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages