Patchwork wireproto: extract repo filtering to standalone function

login
register
mail settings
Submitter Gregory Szorc
Date July 15, 2016, 9:01 p.m.
Message ID <b0044e5fa986a7cb09fd.1468616494@ubuntu-vm-main>
Download mbox | patch
Permalink /patch/15896/
State Accepted
Headers show

Comments

Gregory Szorc - July 15, 2016, 9:01 p.m.
# HG changeset patch
# User Gregory Szorc <gregory.szorc@gmail.com>
# Date 1468615294 25200
#      Fri Jul 15 13:41:34 2016 -0700
# Node ID b0044e5fa986a7cb09fd32d44a3c7aac45086183
# Parent  9d02bed8477bec7f679d6aeb5b1dd8bcdb80f64d
wireproto: extract repo filtering to standalone function

As part of teaching Mozilla's replication extension to better handle
repositories with obsolescence data, I encountered a few scenarios
where I wanted built-in wire protocol commands from replication clients
to operate on unfiltered repositories so they could have access to
obsolete changesets.

While the undocumented "web.view" config option provides a mechanism
to choose what filter/view hgweb operates on, this doesn't apply
to wire protocol commands because wireproto.dispatch() is always
operating on the "served" repo.

This patch extracts the line for obtaining the repo that
wireproto commands operate on to its own function so extensions
can monkeypatch it to e.g. return an unfiltered repo.

I stopped short of exposing a config option because I view the use
case for changing this as a niche feature, best left to the domain
of extensions.
Augie Fackler - July 18, 2016, 11:59 a.m.
On Fri, Jul 15, 2016 at 02:01:34PM -0700, Gregory Szorc wrote:
> # HG changeset patch
> # User Gregory Szorc <gregory.szorc@gmail.com>
> # Date 1468615294 25200
> #      Fri Jul 15 13:41:34 2016 -0700
> # Node ID b0044e5fa986a7cb09fd32d44a3c7aac45086183
> # Parent  9d02bed8477bec7f679d6aeb5b1dd8bcdb80f64d
> wireproto: extract repo filtering to standalone function

Queued, thanks

>
> As part of teaching Mozilla's replication extension to better handle
> repositories with obsolescence data, I encountered a few scenarios
> where I wanted built-in wire protocol commands from replication clients
> to operate on unfiltered repositories so they could have access to
> obsolete changesets.
>
> While the undocumented "web.view" config option provides a mechanism
> to choose what filter/view hgweb operates on, this doesn't apply
> to wire protocol commands because wireproto.dispatch() is always
> operating on the "served" repo.
>
> This patch extracts the line for obtaining the repo that
> wireproto commands operate on to its own function so extensions
> can monkeypatch it to e.g. return an unfiltered repo.
>
> I stopped short of exposing a config option because I view the use
> case for changing this as a niche feature, best left to the domain
> of extensions.
>
> diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py
> --- a/mercurial/wireproto.py
> +++ b/mercurial/wireproto.py
> @@ -531,18 +531,27 @@ class ooberror(object):
>      """wireproto reply: failure of a batch of operation
>
>      Something failed during a batch call. The error message is stored in
>      `self.message`.
>      """
>      def __init__(self, message):
>          self.message = message
>
> +def getdispatchrepo(repo, proto, command):
> +    """Obtain the repo used for processing wire protocol commands.
> +
> +    The intent of this function is to serve as a monkeypatch point for
> +    extensions that need commands to operate on different repo views under
> +    specialized circumstances.
> +    """
> +    return repo.filtered('served')
> +
>  def dispatch(repo, proto, command):
> -    repo = repo.filtered("served")
> +    repo = getdispatchrepo(repo, proto, command)
>      func, spec = commands[command]
>      args = proto.getargs(spec)
>      return func(repo, proto, *args)
>
>  def options(cmd, keys, others):
>      opts = {}
>      for k in keys:
>          if k in others:
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Patch

diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py
--- a/mercurial/wireproto.py
+++ b/mercurial/wireproto.py
@@ -531,18 +531,27 @@  class ooberror(object):
     """wireproto reply: failure of a batch of operation
 
     Something failed during a batch call. The error message is stored in
     `self.message`.
     """
     def __init__(self, message):
         self.message = message
 
+def getdispatchrepo(repo, proto, command):
+    """Obtain the repo used for processing wire protocol commands.
+
+    The intent of this function is to serve as a monkeypatch point for
+    extensions that need commands to operate on different repo views under
+    specialized circumstances.
+    """
+    return repo.filtered('served')
+
 def dispatch(repo, proto, command):
-    repo = repo.filtered("served")
+    repo = getdispatchrepo(repo, proto, command)
     func, spec = commands[command]
     args = proto.getargs(spec)
     return func(repo, proto, *args)
 
 def options(cmd, keys, others):
     opts = {}
     for k in keys:
         if k in others: