hgext/fsmonitor/pywatchman/capabilities.py
changeset 28432 2377c4ac4eec
child 30659 16f4b341288d
equal deleted inserted replaced
28431:a7e3b72cf756 28432:2377c4ac4eec
       
     1 # Copyright 2015 Facebook, Inc.
       
     2 # All rights reserved.
       
     3 #
       
     4 # Redistribution and use in source and binary forms, with or without
       
     5 # modification, are permitted provided that the following conditions are met:
       
     6 #
       
     7 #  * Redistributions of source code must retain the above copyright notice,
       
     8 #    this list of conditions and the following disclaimer.
       
     9 #
       
    10 #  * Redistributions in binary form must reproduce the above copyright notice,
       
    11 #    this list of conditions and the following disclaimer in the documentation
       
    12 #    and/or other materials provided with the distribution.
       
    13 #
       
    14 #  * Neither the name Facebook nor the names of its contributors may be used to
       
    15 #    endorse or promote products derived from this software without specific
       
    16 #    prior written permission.
       
    17 #
       
    18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
       
    19 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    20 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
       
    21 # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
       
    22 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
       
    23 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
       
    24 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
       
    25 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
       
    26 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
    27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    28 
       
    29 import re
       
    30 
       
    31 def parse_version(vstr):
       
    32     res = 0
       
    33     for n in vstr.split('.'):
       
    34         res = res * 1000
       
    35         res = res + int(n)
       
    36     return res
       
    37 
       
    38 cap_versions = {
       
    39     "cmd-watch-del-all": "3.1.1",
       
    40     "cmd-watch-project": "3.1",
       
    41     "relative_root": "3.3",
       
    42     "term-dirname": "3.1",
       
    43     "term-idirname": "3.1",
       
    44     "wildmatch": "3.7",
       
    45 }
       
    46 
       
    47 def check(version, name):
       
    48     if name in cap_versions:
       
    49         return version >= parse_version(cap_versions[name])
       
    50     return False
       
    51 
       
    52 def synthesize(vers, opts):
       
    53     """ Synthesize a capability enabled version response
       
    54         This is a very limited emulation for relatively recent feature sets
       
    55     """
       
    56     parsed_version = parse_version(vers['version'])
       
    57     vers['capabilities'] = {}
       
    58     for name in opts['optional']:
       
    59         vers['capabilities'][name] = check(parsed_version, name)
       
    60     failed = False
       
    61     for name in opts['required']:
       
    62         have = check(parsed_version, name)
       
    63         vers['capabilities'][name] = have
       
    64         if not have:
       
    65             vers['error'] = 'client required capability `' + name + \
       
    66                             '` is not supported by this server'
       
    67     return vers
       
    68 
       
    69 # no-check-code -- this is a 3rd party library