[PATCH 2 of 4] schemas: add wireproto implementations of schema passing

Durham Goode durham at fb.com
Wed Aug 7 11:49:16 CDT 2013


On 8/7/13 6:24 AM, "Augie Fackler" <raf at durin42.com> wrote:

>On Tue, Aug 06, 2013 at 05:28:27PM -0700, Durham Goode wrote:
>> # HG changeset patch
>> # User Durham Goode <durham at fb.com>
>> # Date 1375827497 25200
>> #      Tue Aug 06 15:18:17 2013 -0700
>> # Node ID ef29e2e8de0198d5041f60e9cbfc7b5a29fea93d
>> # Parent  f6fca02b697a67bec6e6ca2c9a48d7c7d7f1d077
>> schemas: add wireproto implementations of schema passing
>
>Why this instead of some pushkey love? This feels like a very good fit
>for pushkey and a 3rd-party extension as a way to test the idea.

I didn't use pushkey because you never actually push schemas back to the
server.  But now that I look at the pushkey code more closely I see
there's precedence for that already (listing namespaces).  I'll switch to
that.

>
>>
>> This adds the wire protocol logic for requesting and transmitting
>> schema data. It is transmitted as a series of lines:
>> "%s %s\n" % (schema name, url)
>>
>> '*' is used as the args for the api in case we want to change the
>>signature
>> later.
>>
>> diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py
>> --- a/mercurial/wireproto.py
>> +++ b/mercurial/wireproto.py
>> @@ -293,6 +293,19 @@
>>          f = self._callstream("getbundle", **opts)
>>          return changegroupmod.unbundle10(self._decompress(f), 'UN')
>>
>> +    @batchable
>> +    def schemas(self):
>> +        f = future()
>> +        yield {}, f
>> +        d = f.value
>> +        lines = d.splitlines()
>> +        schemas = {}
>> +        for line in lines:
>> +            key, value = line.split(' ', 1)
>> +            schemas[key] = value
>> +
>> +        yield schemas
>> +
>>      def unbundle(self, cg, heads, source):
>>          '''Send cg (a readable file-like object representing the
>>          changegroup to push, typically a chunkbuffer object) to the
>> @@ -525,6 +538,13 @@
>>                       encoding.tolocal(old), new)
>>      return '%s\n' % int(r)
>>
>> +def schemas(repo, proto, others):
>> +    schemas = repo.schemas
>> +    serialized = ""
>> +    for k, v in schemas.iteritems():
>> +        serialized += "%s %s\n" % (k, v)
>> +    return serialized
>> +
>>  def _allowstream(ui):
>>      return ui.configbool('server', 'uncompressed', True,
>>untrusted=True)
>>
>> @@ -660,6 +680,7 @@
>>      'listkeys': (listkeys, 'namespace'),
>>      'lookup': (lookup, 'key'),
>>      'pushkey': (pushkey, 'namespace key old new'),
>> +    'schemas' : (schemas, '*'),
>>      'stream_out': (stream, ''),
>>      'unbundle': (unbundle, 'heads'),
>>  }
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at selenic.com
>> http://selenic.com/mailman/listinfo/mercurial-devel
>




More information about the Mercurial-devel mailing list