Skip to content

Commit

Permalink
git-instaweb: Wait for server to start before running web browser
Browse files Browse the repository at this point in the history
Add generic httpd_is_ready subroutine, which busy-waits for web server to
be started, by checking if $port is opened on localhost.  This is used to
avoid situation where web browser is started before web server is ready to
accept connection, and fails.

It uses IO::Socket::INET module, which is core Perl module since v5.6.0.

Alternate solution, possible for those web servers that can run arbitrary
code hooks after they bind the listen socket (after they start accepting
connections), would be to use some kind of blocking mechanism: FIFO or
lockfile, see
  http://thread.gmane.org/gmane.comp.version-control.git/147337/focus=147566

This can be always added later, as a web server specific branch in
httpd_is_ready function.

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Acked-by: Petr Baudis <pasky@suse.cz>
Acked-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jakub Narebski authored and Junio C Hamano committed Jun 2, 2010
1 parent d112762 commit d94775e
Showing 1 changed file with 15 additions and 2 deletions.
17 changes: 15 additions & 2 deletions git-instaweb.sh
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,19 @@ stop_httpd () {
rm -f "$fqgitdir/pid"
}

httpd_is_ready () {
"$PERL" -MIO::Socket::INET -e "
local \$| = 1; # turn on autoflush
exit if (IO::Socket::INET->new('127.0.0.1:$port'));
print 'Waiting for \'$httpd\' to start ..';
do {
print '.';
sleep(1);
} until (IO::Socket::INET->new('127.0.0.1:$port'));
print qq! (done)\n!;
"
}

while test $# != 0
do
case "$1" in
Expand Down Expand Up @@ -414,7 +427,7 @@ start_httpd
url=http://127.0.0.1:$port

if test -n "$browser"; then
git web--browse -b "$browser" $url || echo $url
httpd_is_ready && git web--browse -b "$browser" $url || echo $url
else
git web--browse -c "instaweb.browser" $url || echo $url
httpd_is_ready && git web--browse -c "instaweb.browser" $url || echo $url
fi

0 comments on commit d94775e

Please sign in to comment.