Comments (13)
notify
is a platform agnostic file watcher crate.
from dura.
I'm using a shell implementation of this feature using fswatch (cross-platform file monitor) and dura capture
.
Note: this replaces the need for dura serve &
as fswatch will be the daemon instead
Fish shell implementation
set repos (cat ~/.config/dura/config.json | jq -rc '.repos | keys | join("§")' 2>/dev/null)
set pollingSeconds 10
fswatch -e .git -0 -l $pollingSeconds -r (string split '§' -- $repos) | while read -l -z path
cd $path 2>/dev/null || cd (dirname $path) && cd (git rev-parse --show-toplevel) && dura capture
end
Bash/Zsh shell implementation
repos=$(cat ~/.config/dura/config.json | jq -rc $'.repos | keys | map("\'\(.)\'") | join(" ")' 2>/dev/null)
pollingSeconds=10
eval "fswatch -e .git -0 -l $pollingSeconds -r $repos" | while read -r -d '' path
do
cd $path 2>/dev/null || cd $(dirname $path) && cd $(git rev-parse --show-toplevel) && dura capture
done
How it works?
- Get the
repos
list from the duraconfig.json
file (this means you can stilldura watch
repos as usual) - Join the list of repo paths using a rarely used character
§
- Watch for changes in all repos:
fswatch -r
-e .git
: excluding changes to the.git
folder-0
: outputs changed paths delimited by theNUL
character (or\0
)-l $pollingSeconds
: just like a debounce function, callsdura capture
x seconds after the last event occured on a file to avoid too many commits when doing lots of consecutive changes
cd
into the changed repo and calldura capture
from dura.
Yes, script files would be better. That way you could have a command like dura install --fish
to copy the scripts and make them run at startup or something like that
from dura.
Oh wow the notify
crate is perfect. Any idea how many files it can efficiently watch? I could see it getting up into the tens of thousands pretty easily.
from dura.
The default inotify limit (amount of watched directories I think) on linux seems to be 8192. This limit is shared among all program (including your editor). You can increase it by writing to /proc/sys/fs/inotify/max_user_watches
as root, but each watched directory uses 1080 bytes of kernel memory, so there is a hard limit on how much directories you can watch depending on how much ram you have.
An alternative would be to implement a language server using the lsp protocol that only captures which files are changed according to the editor. This would also allow saving each individual keystroke even when the user doesn't explicitly save. In addition the editor extension could then be responsible for ensuring the daemon is running.
from dura.
Remarkably overkill solution, but for jauntywunderkind/git-auto-commit, I use facebook/watchman. It's extremely well tuned, and let's me add filters.
You can either just exec watchman command line (which runs either runs standalone or via by spawning a server- ideal if there's a lot of different watchers!), or you can talk to a server via it's socket interface (socket with json or bser encoding). There's also watchman_client to facilitate using that socket interface.
from dura.
I'd rather not add external dependencies, if possible. I don't mind crates.
Another idea — the "tens of thousands" is naive. You could probably narrow it down to ~100 files with 95% confidence. Some ideas for heuristics:
- A bash/zsh prompt function could inform which directories to look at (e.g. only look in repos that have been navigated to in last 24 hours). It could work, but it only works for terminal users (a la #3)
- A scanner thread that looks at timestamps. If it sees a changed file, it watches all files in that repo. Maintain it LRU style. The scanner thread could be a lot less infrequent — even 20 minutes could be okay.
from dura.
Another heuristic would be to inotify-watch files that are currently open (as determined through /proc/$pid/fd
), as well as directories that are the working directory of a currently running process (as given by /proc/$pid/cwd
IIRC). That, plus a regular (every few minutes) scan. That full scan could be done slowly in the background instead of in batches to avoid causing load spikes.
from dura.
@neinseg I like that, but how long do files stay open? Does Vim or VSCode actually hold the file open? Seems like "opened files" is too ephemeral to work well, but I don't know. If you could watch all file descriptors under /proc/*/fd
, then this would be an amazing solution. That or process an event log.
from dura.
@alin23 can you send a PR to update the README? this is amazing and i don't want to lose it in the issues
from dura.
thinking about this... @alin23 maybe we should start adding script files into the core repo for stuff like this.
from dura.
I love it! Let's do it
from dura.
from dura.
Related Issues (20)
- Update: Upgrade clap to V3.1.6 & replace deprecated code in main.rs HOT 2
- Dura doesn't create any branches on github codespaces HOT 2
- brew install dura HOT 4
- Couldnt you just git commit more often? HOT 4
- Error: UnbornBranch HOT 6
- Update clap
- Data Corruption: Don't allow dura to run as root
- Ubuntu install instructions HOT 2
- Don’t create unnecessary branches
- Chronological git log HOT 2
- feature request: remove old dura branches periodically HOT 1
- support install linux and macOS with brew HOT 15
- `dura checkout` command HOT 6
- Tests broken HOT 3
- Binaries built by Github are not working HOT 6
- Prevent pushin dura branches to remote HOT 4
- stabilize config loading HOT 2
- Dura fails to capture anything if a worktree is present as a subdir of the working directory HOT 4
- Make dura branch names more informative HOT 3
- Feature Request: `dura status` command HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from dura.