hgext/inotify/common.py
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Sat, 05 Oct 2013 01:02:22 +0900
changeset 19932 e3a5922e18c3
parent 10263 25e572394f5c
permissions -rw-r--r--
demandimport: support "absolute_import" for external libraries (issue4029) Before this patch, demandimport of Mercurial may fail to load external libraries using "from __future__ import absolute_import": for example, importing "foo" in "bar.baz" module will load "bar.foo" if it exists, even though "absolute_import" is enabled in "bar.baz" module. So, extensions for Mercurial can't use such external libraries. This patch saves "level" of import request for on-demand module loading in the future: default value of level is -1, and level is 0 when "absolute_import" is enabled. "level" value is passed to built-in import function in "_demandmod._load()" and it should load target module correctly. This patch changes only one "_demandmod" construction case other than cases below: - construction in "_demandmod._load()" this code path should be used only in relative sub-module loading case - constructions other than patched one in"_demandimport()" these code paths shouldn't be used in "level != -1" case

# server.py - inotify common protocol code
#
# Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com>
# Copyright 2007, 2008 Brendan Cully <brendan@kublai.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.

import cStringIO, socket, struct

"""
  Protocol between inotify clients and server:

  Client sending query:
  1) send protocol version number
  2) send query type (string, 4 letters long)
  3) send query parameters:
     - For STAT, N+1 \0-separated strings:
        1) N different names that need checking
        2) 1 string containing all the status types to match
     - No parameter needed for DBUG

  Server sending query answer:
  1) send protocol version number
  2) send query type
  3) send struct.pack'ed headers describing the length of the content:
      e.g. for STAT, receive 9 integers describing the length of the
      9 \0-separated string lists to be read:
       * one file list for each lmar!?ic status type
       * one list containing the directories visited during lookup

"""

version = 3

resphdrfmts = {
    'STAT': '>lllllllll', # status requests
    'DBUG': '>l'          # debugging queries
}
resphdrsizes = dict((k, struct.calcsize(v))
                    for k, v in resphdrfmts.iteritems())

def recvcs(sock):
    cs = cStringIO.StringIO()
    s = True
    try:
        while s:
            s = sock.recv(65536)
            cs.write(s)
    finally:
        sock.shutdown(socket.SHUT_RD)
    cs.seek(0)
    return cs