| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- #
- # Watches a directory and runs an update program whenever something
- # changes. This is race-free, and if the directory changes while the
- # update is running, it will be done again.
- #
- # NOTE: the update should not modify the directory. If it does, the
- # the result will be endless and constant updating.
- #
- process watcher {
- # Blocker object used to trigger an update.
- blocker() blk;
- # State: updating - if updater script is running
- # updating_dirty - if something changed while
- # script was running
- var("false") updating;
- var("false") updating_dirty;
- # Start update process.
- spawn("updater", {});
- # Wait for directory event.
- # CHANGE THIS
- sys.watch_directory("/home/ambro") watcher;
- # Print event details (e.g. "added somefile").
- println(watcher.filename, " ", watcher.event_type);
- # If updating is in progress, mark dirty.
- If (updating) {
- updating_dirty->set("true");
- };
- # Request update. This makes use() proceed forward.
- blk->up();
- # Wait for next event (execution moves up).
- watcher->nextevent();
- }
- template updater {
- # Wait for update request.
- _caller.blk->use();
- # Wait some time.
- sleep("1000", "0");
- # We're about to start update script - set updating
- # variable and mark as non dirty.
- _caller.updating_dirty->set("false");
- _caller.updating->set("true");
- println("Update started");
- # CHANGE THIS
- sleep("3000", "0");
- #runonce({"/bin/echo", "Updater speaking"}, {"keep_stdout", "keep_stderr"});
- println("Update finished");
- # No longer running update script.
- _caller.updating->set("false");
- # If something changed while script was running, restart
- # update; else wait for next update request.
- If (_caller.updating_dirty) {
- _caller.blk->downup();
- } else {
- _caller.blk->down();
- };
- }
|