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
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: