@@ -714,6 +714,14 @@ die_if_failed(enum status_code code, const char *msg)
714
714
die ("%s: %s" , msg , get_status_message (code ));
715
715
}
716
716
717
+ void
718
+ hangup_children (void )
719
+ {
720
+ if (signal (SIGHUP , SIG_IGN ) == SIG_ERR )
721
+ return ;
722
+ killpg (getpid (), SIGHUP );
723
+ }
724
+
717
725
int
718
726
main (int argc , const char * argv [])
719
727
{
@@ -722,6 +730,8 @@ main(int argc, const char *argv[])
722
730
enum request request = parse_options (argc , argv , pager_mode );
723
731
struct view * view ;
724
732
733
+ atexit (hangup_children );
734
+
725
735
if (signal (SIGPIPE , SIG_IGN ) == SIG_ERR )
726
736
die ("Failed to setup signal handler" );
727
737
@@ -768,6 +778,15 @@ main(int argc, const char *argv[])
768
778
run_prompt_command (NULL , script_command );
769
779
}
770
780
781
+ if (repo .git_dir [0 ]) {
782
+ const char * watcher_argv [] = { "sh" , "-c" , NULL , NULL };
783
+ char cmd [SIZEOF_STR ] = "" ;
784
+ int restart_interval = 300 ;
785
+ string_format (cmd , "(export TIG_PID=\"%d\"; export ENTR_RESTART_SEC=\"%d\"; test \"$TIG_PID\" -gt 0 || exit; which entr || exit; sleep 1; while true; do git ls-files \"$(git rev-parse --show-toplevel)\" | entr -d kill -WINCH \"$TIG_PID\" & export ENTR_PID=\"$!\"; (count=0; granularity=5; while [ \"$count\" -lt \"$ENTR_RESTART_SEC\" ]; do count=\"$((count + granularity))\"; sleep \"$granularity\"; kill -0 \"$TIG_PID\" && kill -0 \"$ENTR_PID\" || break; done; kill -INT \"$ENTR_PID\") & export RESTARTER_PID=\"$!\"; wait \"$ENTR_PID\"; kill -WINCH \"$TIG_PID\"; kill -HUP \"$RESTARTER_PID\"; sleep 1; kill -0 \"$TIG_PID\" || break; done) &" , getpid (), restart_interval );
786
+ watcher_argv [2 ] = cmd ;
787
+ io_run_bg (watcher_argv , repo .cdup );
788
+ }
789
+
771
790
while (view_driver (display [current_view ], request )) {
772
791
view = display [current_view ];
773
792
request = read_key_combo (view -> keymap );
0 commit comments