Hi Is this correct to send possible gitk patches here? or should I send them to Paul Mackerras somehow? Anyway I just wanted that gitk automatically updates while I'm working in my terminal Are you interrested? as described in "SubmittingPatches" this patch is based on git://ozlabs.org/~paulus/gitk 22a713c72df8b6799c59287c50cee44c4a6db51e The code should be robust to just don't autoupdate if https://sourceforge.net/projects/tcl-inotify/ is not installed Open points for now: - release watches for deleted directories seems to cause problems in tcl-inotify (so I don't) I'm not sure how often that happens in ".git/" - I only call "updatecommits" and I don't know if there is a usecase where I should be calling "reloadcommits" Regards Florian Schüller
From 785ed6bc1b4a3b9019d3503b066afb2a025a2bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Sch=C3=BCller?= <florian.schueller@xxxxxxxxx> Date: Thu, 9 Jun 2016 22:54:43 +0200 Subject: [PATCH] first support for inotify --- gitk | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/gitk b/gitk index 805a1c7..6e2ead2 100755 --- a/gitk +++ b/gitk @@ -8,6 +8,12 @@ exec wish "$0" -- "$@" # either version 2, or (at your option) any later version. package require Tk +try { + package require inotify + set we_have_inotify true +} on error {em} { + set we_have_inotify false +} proc hasworktree {} { return [expr {[exec git rev-parse --is-bare-repository] == "false" && @@ -12363,6 +12369,59 @@ if {$i >= [llength $argv] && $revtreeargs ne {}} { } } +proc inotify_handler { fd } { + set events [inotify_watch read] + set watch_info [inotify_watch info] + set update_view false + + foreach {event} $events { + set current_watchid [dict get $event watchid] + set flags [dict get $event flags] + set event_filename [dict get $event filename] + + foreach {path watchid watch_flags} $watch_info { + if {$watchid eq $current_watchid} { + set watch_path $path + } + } + + set full_filename [file join $watch_path $event_filename] + +# remove does not seem to work +# if {$flags eq "s"} { +# puts "Remove watch $full_filename" +# set wd [inotify_watch remove $full_filename] +# } + + if {$flags eq "nD"} { + set wd [inotify_watch add $full_filename "nwds"] + } + if {![string match *.lock $event_filename]} { + set update_view true + } + } + + #reloadcommits or updatecommits - depending on file and operation? + if {$update_view} { + updatecommits + } +} + +proc watch_recursive { dir } { + inotify_watch add $dir "nwaCmMds" + + foreach i [glob -nocomplain -dir $dir *] { + if {[file type $i] eq {directory}} { + watch_recursive $i + } + } +} + +if { $we_have_inotify } { + set fd [inotify create "inotify_watch" "::inotify_handler"] + watch_recursive $gitdir +} + set nullid "0000000000000000000000000000000000000000" set nullid2 "0000000000000000000000000000000000000001" set nullfile "/dev/null" -- 2.7.4