##// END OF EJS Templates
inotify: workaround ENAMETOOLONG by using symlinks...
Benoit Boissinot -
r6997:9c4e488f default
parent child Browse files
Show More
@@ -58,7 +58,7 b' def reposetup(ui, repo):'
58 58 list_clean, list_unknown)
59 59 if result is not None:
60 60 return result
61 except socket.error, err:
61 except (OSError, socket.error), err:
62 62 if err[0] == errno.ECONNREFUSED:
63 63 ui.warn(_('(found dead inotify server socket; '
64 64 'removing it)\n'))
@@ -9,7 +9,7 b''
9 9 from mercurial.i18n import gettext as _
10 10 from mercurial import osutil, ui, util
11 11 import common
12 import errno, os, select, socket, stat, struct, sys, time
12 import errno, os, select, socket, stat, struct, sys, tempfile, time
13 13
14 14 try:
15 15 import linux as inotify
@@ -556,13 +556,31 b' class Server(object):'
556 556 self.timeout = timeout
557 557 self.sock = socket.socket(socket.AF_UNIX)
558 558 self.sockpath = self.repo.join('inotify.sock')
559 self.realsockpath = None
559 560 try:
560 561 self.sock.bind(self.sockpath)
561 562 except socket.error, err:
562 563 if err[0] == errno.EADDRINUSE:
563 raise AlreadyStartedException(_('could not start server: %s') \
564 raise AlreadyStartedException(_('could not start server: %s')
564 565 % err[1])
565 raise
566 if err[0] == "AF_UNIX path too long":
567 tempdir = tempfile.mkdtemp(prefix="hg-inotify-")
568 self.realsockpath = os.path.join(tempdir, "inotify.sock")
569 try:
570 self.sock.bind(self.realsockpath)
571 os.symlink(self.realsockpath, self.sockpath)
572 except (OSError, socket.error), inst:
573 try:
574 os.unlink(self.realsockpath)
575 except:
576 pass
577 os.rmdir(tempdir)
578 if inst.errno == errno.EEXIST:
579 raise AlreadyStartedException(_('could not start server: %s')
580 % inst.strerror)
581 raise
582 else:
583 raise
566 584 self.sock.listen(5)
567 585 self.fileno = self.sock.fileno
568 586
@@ -635,6 +653,9 b' class Server(object):'
635 653 self.sock.close()
636 654 try:
637 655 os.unlink(self.sockpath)
656 if self.realsockpath:
657 os.unlink(self.realsockpath)
658 os.rmdir(os.path.dirname(self.realsockpath))
638 659 except OSError, err:
639 660 if err.errno != errno.ENOENT:
640 661 raise
@@ -9,7 +9,16 b' p="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
9 9 hg init $p
10 10 cd $p
11 11
12 echo % fail
13 ln -sf doesnotexist .hg/inotify.sock
14 hg st
15 hg inserve
16 rm .hg/inotify.sock
17
12 18 echo % inserve
13 hg inserve
19 hg inserve -d --pid-file=hg.pid
20 cat hg.pid >> "$DAEMON_PIDS"
14 21 echo % status
15 22 hg status
23
24 kill `cat hg.pid`
@@ -1,5 +1,9 b''
1 % fail
2 failed to contact inotify server: AF_UNIX path too long
3 deactivating inotify
4 abort: could not start server: File exists
1 5 % inserve
2 abort: AF_UNIX path too long
3 6 % status
4 7 failed to contact inotify server: AF_UNIX path too long
5 8 deactivating inotify
9 ? hg.pid
General Comments 0
You need to be logged in to leave comments. Login now