Custom HPSS request handlers?

John Arbash Meinel john at arbash-meinel.com
Wed Jan 21 17:07:14 GMT 2009


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Russ Brown wrote:
> Hi,
> 
> I'm wondering if it is possible to define a custom HPPS request in a
> plugin on the server, and make that request from a plugin at the client end.
> 
> The specific use case is that we have a number of repositories contain a
> number of branches, and want to to be able to find out which are
> candidates for removal. For the purposes of this utility, removable
> branches are defined as containing no revisions that are not already
> merged into the trunk branch in the same repository.
> 
> I have working code that does this already: the problem is that it is
> extremely slow. So, I'm thinking that if I could write something that
> would do the server-side trawling completely at the server side that
> just returned the results to the client, that would speed up the
> operation considerably.
> 
> So, is it possible to do this in a plugin, and if so, could someone
> point me at an example of this that I can work from?
> 
> Much appreciated,
> 

On the server side you would need to register the RPC in
 bzrlib.smart.request.request_handlers.register_lazy()

And then on the client side, I would assume you are adding a new command
object (registered via bzrlib.commands.register_command)

Which can then make the request. There is a helper class in
bzrlib.remote._RpcHelper, which provides a '_call()' function which
could be useful for you.

In general, I would imagine the client plugin would look roughly like:

from bzrlib import commands, errors

class cmd_xxx(commands.Command):
    """Run the xxx command on the remote machine."""

    takes_args = ['location']

    def run(self, location):
	from bzrlib import bzrdir, remote
        remote_bzrdir = bzrdir.BzrDir.open(location)
        if not isinstance(remote_bzrdir, remote.RemoteBzrDir):
	    raise errors.BzrCommandError('Not a remote location:'
		' %s' % (location,))
        response = remote_bzrdir._call_with_body_bytes("MyCustomRPC",
			arg1, foo='bar')
	response_tuple, response_handler = response
	if response_tuple[0] != 'ok':
	  # Request failed
	  return 1
	body = response_handler.read_body_bytes()
	# Parse the body bytes into whatever you need

commands.register_command(cmd_xxx)

John
=:->
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkl3VkIACgkQJdeBCYSNAAPL5ACfbW46/YLTM1lwmoUVP6tJEHGz
gkUAn3YlcX54iVKNIYRkXBBecUa7t1Rs
=HB0c
-----END PGP SIGNATURE-----



More information about the bazaar mailing list