<div dir="auto"><div>I think it is good remember that (as far as I know) everyone submitting PRs and everyone reviewing them isn't paid and does so in their spare time; therefore is no obligation for anyone to review anything on any particular timescale. One thing that hasn't been discussed is how to increase the reviewing capacity of the community, which I guess would involve working out how to attract and retain more regular contributors.</div><div dir="auto"><br></div><div dir="auto">re. the proposed changes, I'm +1 modulo objective criteria being agreed upon. Personally I agree with Nelle's list, with the addition "has 100% code coverage".</div><div dir="auto"><br></div><div dir="auto">David</div><div dir="auto"><br></div><div dir="auto"><br><br><div class="gmail_quote" dir="auto"><div dir="ltr">On Tue, 15 Jan 2019, 23:46 Nelle Varoquaux <<a href="mailto:nelle.varoquaux@gmail.com">nelle.varoquaux@gmail.com</a> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>For the way GitHub sorts pull requests, it is indeed a problem, but there's a way to sort by "most recently updated." I sometimes use it to make sure that I review recently updated pull request that don't appear on the first page.</div><div><br></div></div><div>It seems to me that this "uncontroversial but uninteresting" rule is currently not based on objective criteria. I'm personally not in favor of removing two core contributors approval 
for anything that modifies the API.  We have had too many close calls on
 PR almost merged that had backward incompatible changes: I realize that some core developers believe that we are not 
moving fast enough, on a project with hundreds of thousands of users, 
changes to the API should not be considered lightly. <br></div><div><br></div><div>Here's an attempt at better defining an "uncontroversial but uninteresting" rule based on objective criteria:</div><div>- Has not been commented on by more than one core developer;<br></div><div>- Doesn't change the <b>public</b> API;</div><div>- Doesn't add or remove a functionality;</div><div>- Doesn't add or remove a dependency;<br></div><div>- Is fully tested;</div><div>- All parameters are fully documented;</div><div>- Doesn't fix a release-critical bug;<br></div><div>- Is less than XX lines of code. (Long PR are harder to review, and thus the likelihood of one core dev not noticing a problem is higher). Threshold needs to be defined.<br></div><div dir="ltr"><br><div><div dir="ltr">To be honest, it also doesn't help that some 
people have 50+ pull requests open (Antony? :p). It also doesn't help that some PR 
contain the same code (13117, 13128) and are being hold off until the 
other one is merged (also, why is 13117 being hold off for a PR that has
 been opened afterwards?). IMO, if a PR can be merged, it should be merged. But we shouldn't make too many exceptions to the two core contributors rules. It's easier to have two core contributor review a pull request, than to try to fix API issues on code that has been merged and released. Having two pairs of eyes on a PR is also a good way to avoid having a bus factor of 1 on some areas of the library.<br></div><div><br></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, 15 Jan 2019 at 15:19, Thomas Caswell <<a href="mailto:tcaswell@gmail.com" target="_blank" rel="noreferrer">tcaswell@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">I think a distinction between "no one cares" and "no one has bandwidth" needs to be made.<div><br></div><div>If you look at the 'pulse' page, we merging 100+ PRs a month (<a href="https://github.com/matplotlib/matplotlib/pulse/monthly" target="_blank" rel="noreferrer">https://github.com/matplotlib/matplotlib/pulse/monthly</a>) so reviews are happening, the issue is just that some are falling through the cracks.</div><div><br></div><div>Tom</div></div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Jan 15, 2019 at 4:45 PM Antony Lee <<a href="mailto:antony.lee@institutoptique.fr" target="_blank" rel="noreferrer">antony.lee@institutoptique.fr</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Eric,<div>Neither the ttc font, nor the pdf/ps common code PRs actually touch any "complex" point regarding fonts or pdf/ps.  I have described the ttc font in my previous message; the pdf/ps PR is really just, look, these two classes share 80 lines worth of code that's literally copy-pasted, let's just put that in a common parent class and inherit from it.</div><div>Conversely, one font-related PR for which I actually have low hopes of getting properly reviewed (except on an "sure, I trust you" basis) is <a href="https://github.com/matplotlib/matplotlib/pull/12928" target="_blank" rel="noreferrer">https://github.com/matplotlib/matplotlib/pull/12928</a>, which actually touches a rather complex point about font encodings (some of which I had to clarify on the FreeType mailing list).  (If anyone wants to have a look at it, though... :p)</div><div>Antony</div></div></div><br><div class="gmail_quote"><div dir="ltr" class="m_3901295563710045304gmail-m_8784059746141603411gmail-m_-150229076235639764gmail_attr">On Tue, Jan 15, 2019 at 10:36 PM Eric Firing <<a href="mailto:efiring@hawaii.edu" target="_blank" rel="noreferrer">efiring@hawaii.edu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Antony,<br>
<br>
Your examples illustrate that the problem is often that we don't have <br>
enough people who understand some areas, like fonts and pdf/ps file <br>
formats, to get 2 thorough and knowledgeable reviews in a reasonable time.<br>
<br>
I'm fine with your proposed rule.  It should help at least a little bit.<br>
<br>
Eric<br>
<br>
<br>
On 2019/01/15 9:11 AM, Antony Lee wrote:<br>
> I'm obviously more aware of my own PRs, so here are a few I'd have put <br>
> up for single-review-merge (note that it's quite possible that they'd <br>
> have attracted more attention and gotten merged faster under that <br>
> system; that's also the goal...).  Obviously other devs may think about <br>
> other PRs that could have benefitted from the same process.<br>
> <br>
> - <a href="https://github.com/matplotlib/matplotlib/pull/9787" rel="noreferrer noreferrer" target="_blank">https://github.com/matplotlib/matplotlib/pull/9787</a> adds support for <br>
> the ttc font format (requested since 2014) for png/svg output (that's <br>
> provided basically for free by FreeType) but not for pdf/ps (that would <br>
> require more difficult changes).  The entire PR comes down to:<br>
>    * adding "ttc" as an extension that should be treated like "ttf"/"otf",<br>
>    * adding error handling to pdf/ps to signal these formats are not <br>
> supported there,<br>
>    * tests.<br>
>    The PR sat open for 10 months before a first positive review (because <br>
> no one cares about fonts, I guess) and took another 3 months to attract <br>
> a second positive review.<br>
> <br>
> - <a href="https://github.com/matplotlib/matplotlib/pull/12472" rel="noreferrer noreferrer" target="_blank">https://github.com/matplotlib/matplotlib/pull/12472</a> does a fairly <br>
> trivial fix to fontList.json to make it reusable for Matplotlibs <br>
> installed in different venvs, got a positive review in one day and <br>
> waited another 2.5 months for a second positive review.<br>
> <br>
> - <a href="https://github.com/matplotlib/matplotlib/pull/9867" rel="noreferrer noreferrer" target="_blank">https://github.com/matplotlib/matplotlib/pull/9867</a> deduplicates <br>
> completely duplicated code between the pdf and ps backends, mostly for <br>
> maintainability's sake; it took 7.5 months (and 5 rebases due to <br>
> conflicts) to get a first positive review and another 6 (and around as <br>
> many rebases) to get a second one.<br>
> <br>
> -----<br>
> <br>
> As for the specifics (as I see it):<br>
> - Someone opens a PR, it gets a positive review, no negative review, and <br>
> no activity occurs for two weeks (significant activity -- excluding <br>
> trivial chat on the thread).<br>
> - Sponsor (first reviewer, or author if a committer) *pings* all devs by <br>
> mentioning @matplotlib/developers on the PR thread with the intent to <br>
> single-review-merge, and labels the PR accordingly.<br>
> - The PR can still be reviewed/merged/rejected by the normal review <br>
> process.  However, if no one explicitly opposes the merge within two <br>
> weeks, anyone can merge it at that point (including by self-merge).<br>
> <br>
> I would not exclude all API changes from the process.  For example, <br>
> <a href="https://github.com/matplotlib/matplotlib/pull/13173/commits/e90d264f3e5a263ef57243a2af86b46ab74ccc16" rel="noreferrer noreferrer" target="_blank">https://github.com/matplotlib/matplotlib/pull/13173/commits/e90d264f3e5a263ef57243a2af86b46ab74ccc16</a> <br>
> deprecates (and prepares for deletion) two parameters to imshow() that <br>
> have had no effect since 2006.  Let's pretend for a second this commit <br>
> was a single independent PR (and not an example to showcase the <br>
> parameter-deprecating decorator...); if it started being forgotten I <br>
> would have proposed it for single-review-merge (again, note that if <br>
> you're worried about the change, you don't need to reject the PR; you <br>
> can just say, I think this API change needs to be approved by a second <br>
> reviewer and that'll block the single-review-merge just as well).<br>
> <br>
> Antony<br>
> <br>
> On Tue, Jan 15, 2019 at 7:46 PM Nelle Varoquaux <br>
> <<a href="mailto:nelle.varoquaux@gmail.com" target="_blank" rel="noreferrer">nelle.varoquaux@gmail.com</a> <mailto:<a href="mailto:nelle.varoquaux@gmail.com" target="_blank" rel="noreferrer">nelle.varoquaux@gmail.com</a>>> wrote:<br>
> <br>
>     The proposed scheme by Paul doesn't seem reasonable to me. Core<br>
>     contributor A or committers needs to actively reach out to other<br>
>     core contributors: labeling is not enough IMO.<br>
> <br>
> <br>
>     On Tue, 15 Jan 2019 at 10:37, Jody Klymak <<a href="mailto:jklymak@uvic.ca" target="_blank" rel="noreferrer">jklymak@uvic.ca</a><br>
>     <mailto:<a href="mailto:jklymak@uvic.ca" target="_blank" rel="noreferrer">jklymak@uvic.ca</a>>> wrote:<br>
> <br>
> <br>
> <br>
>>         On 15 Jan 2019, at 10:20, Paul Hobson <<a href="mailto:pmhobson@gmail.com" target="_blank" rel="noreferrer">pmhobson@gmail.com</a><br>
>>         <mailto:<a href="mailto:pmhobson@gmail.com" target="_blank" rel="noreferrer">pmhobson@gmail.com</a>>> wrote:<br>
>><br>
>>         I think this would be a good policy as well. Can I get some<br>
>>         clarification on the flow? The way I understand it:<br>
>><br>
>>         1) Someone (committer, contributor, or first-timer) opens a<br>
>>         simple PR<br>
>>         2) Committer A reviews it, adds a "single-review-merge" label,<br>
>>         then digitally walks away<br>
>>         3) No less than two weeks later, Committer B sees the PR,<br>
>>         notices the label, opens it up, and merges without reviewing.<br>
> <br>
>         If there is a Committer B, I think they should at least look at<br>
>         the PR to make sure it doesn’t have any hidden API changes, or<br>
>         introduce anything hostile.<br>
> <br>
>         The point here is that getting the third person to look at a PR<br>
>         is proving quite difficult, and if the rest of the folks with<br>
>         the commit bit haven’t looked at a PR for a month, even after<br>
>         being warned, then silence indicates consent.<br>
> <br>
>         Note that only folks with the commit bit can label PRs, so<br>
>         anyone flagging a PR like this is implicitly trusted to not be<br>
>         wreaking havoc, and not doing this for major changes.  Since we<br>
>         all curate our own PRs, I rather expect that the PR contributor<br>
>         will often be the person who adds the flag.  Whether we want to<br>
>         allow a self-merge at that point is up for debate, but if not,<br>
>         then folks need to get in the habit of looking at old flagged<br>
>         PRs and merging them.<br>
> <br>
>         I think a huge problem we have is the LIFO default sort of the<br>
>         github PR queue, and that any PR not on the first page might as<br>
>         well be closed for all the attention it will get without<br>
>         constant nagging.<br>
> <br>
>         Cheers,   Jody<br>
> <br>
>>         Does that capture a successful "single-review-merge" lifecycle?<br>
>>         -paul<br>
>><br>
>>         On Tue, Jan 15, 2019 at 9:57 AM Nelle Varoquaux<br>
>>         <<a href="mailto:nelle.varoquaux@gmail.com" target="_blank" rel="noreferrer">nelle.varoquaux@gmail.com</a> <mailto:<a href="mailto:nelle.varoquaux@gmail.com" target="_blank" rel="noreferrer">nelle.varoquaux@gmail.com</a>>><br>
>>         wrote:<br>
>><br>
>>             Hello,<br>
>><br>
>>             Overall, I think this is a good idea, but I would like<br>
>>             specifics on what "uncontroversial but uninteresting" PR<br>
>>             mean. IMO, that should exclude any PR with API changes.<br>
>><br>
>>             Cheers,<br>
>>             N<br>
>><br>
>>             On Tue, 15 Jan 2019 at 06:00, Antony Lee<br>
>>             <<a href="mailto:anntzer.lee@gmail.com" target="_blank" rel="noreferrer">anntzer.lee@gmail.com</a> <mailto:<a href="mailto:anntzer.lee@gmail.com" target="_blank" rel="noreferrer">anntzer.lee@gmail.com</a>>> wrote:<br>
>><br>
>>                 Hi all,<br>
>><br>
>>                 During the weekly dev call, I proposed to amend the PR<br>
>>                 merge rules, following an initial comment on Github<br>
>>                 [<a href="https://github.com/matplotlib/matplotlib/pull/13173#issuecomment-453921220" rel="noreferrer noreferrer" target="_blank">https://github.com/matplotlib/matplotlib/pull/13173#issuecomment-453921220</a>]. <br>
>>                 There was general agreement among the devs present<br>
>>                 (Tom, Hannah, Jody, and myself), so I'm putting it<br>
>>                 here for discussion.  The objective of this change is<br>
>>                 to prevent "uncontroversial but uninteresting" PRs<br>
>>                 from falling into oblivion, and try to decrease the<br>
>>                 size of the open PR stack.<br>
>><br>
>>                 The current rule is that a PR needs positive reviews<br>
>>                 (from two committers, and excluding the author if a<br>
>>                 committer) to be merged, except that doc-only PRs<br>
>>                 (docstrings, rst) only needs a single positive review.<br>
>><br>
>>                 I am proposing that, if a (non-doc) PR already has one<br>
>>                 positive review, but no activity on that PR has<br>
>>                 occurred for two weeks (exact time interval up to<br>
>>                 bikeshedding) [Jody suggests: and the PR has 100% code<br>
>>                 coverage], then a committer (either the first<br>
>>                 reviewer, or the author if a committer) can suggest<br>
>>                 that it be merged on the basis of that single review. <br>
>>                 To do so, the "sponsor" should ping all developers<br>
>>                 (@matplotlib/developers) on that issue indicating that<br>
>>                 intent, and add a "single-review-merge" label on the<br>
>>                 PR (so that these PRs can easily be found). <br>
>>                 Committers are encouraged to review the PR to accept<br>
>>                 and merge it or reject it or request changes on it;<br>
>>                 but they can also just indicate that they consider the<br>
>>                 PR sufficiently complex that a proper second review is<br>
>>                 needed before merging, or request an extension, etc. <br>
>>                 To do so they should still leave a "reject" review,<br>
>>                 even if just saying "objecting to single-review<br>
>>                 merged; anyone can dismiss after a second review". <br>
>>                 However, if within another two weeks, no committer<br>
>>                 voiced any objection (explicitly, i.e. by rejecting),<br>
>>                 then the PR can indeed be merged on the basis of that<br>
>>                 single review.<br>
>><br>
>>                 To avoid overwhelming the system, any committer can<br>
>>                 only "sponsor" a single PR at a time.<br>
>><br>
>>                 Thoughts?<br>
>><br>
>>                 Antony<br>
>>                 _______________________________________________<br>
>>                 Matplotlib-devel mailing list<br>
>>                 <a href="mailto:Matplotlib-devel@python.org" target="_blank" rel="noreferrer">Matplotlib-devel@python.org</a><br>
>>                 <mailto:<a href="mailto:Matplotlib-devel@python.org" target="_blank" rel="noreferrer">Matplotlib-devel@python.org</a>><br>
>>                 <a href="https://mail.python.org/mailman/listinfo/matplotlib-devel" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/matplotlib-devel</a><br>
>><br>
>>             _______________________________________________<br>
>>             Matplotlib-devel mailing list<br>
>>             <a href="mailto:Matplotlib-devel@python.org" target="_blank" rel="noreferrer">Matplotlib-devel@python.org</a><br>
>>             <mailto:<a href="mailto:Matplotlib-devel@python.org" target="_blank" rel="noreferrer">Matplotlib-devel@python.org</a>><br>
>>             <a href="https://mail.python.org/mailman/listinfo/matplotlib-devel" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/matplotlib-devel</a><br>
>><br>
>>         _______________________________________________<br>
>>         Matplotlib-devel mailing list<br>
>>         <a href="mailto:Matplotlib-devel@python.org" target="_blank" rel="noreferrer">Matplotlib-devel@python.org</a> <mailto:<a href="mailto:Matplotlib-devel@python.org" target="_blank" rel="noreferrer">Matplotlib-devel@python.org</a>><br>
>>         <a href="https://mail.python.org/mailman/listinfo/matplotlib-devel" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/matplotlib-devel</a><br>
> <br>
>         --<br>
>         Jody Klymak<br>
>         <a href="http://web.uvic.ca/~jklymak/" rel="noreferrer noreferrer" target="_blank">http://web.uvic.ca/~jklymak/</a><br>
> <br>
> <br>
> <br>
> <br>
> <br>
>     _______________________________________________<br>
>     Matplotlib-devel mailing list<br>
>     <a href="mailto:Matplotlib-devel@python.org" target="_blank" rel="noreferrer">Matplotlib-devel@python.org</a> <mailto:<a href="mailto:Matplotlib-devel@python.org" target="_blank" rel="noreferrer">Matplotlib-devel@python.org</a>><br>
>     <a href="https://mail.python.org/mailman/listinfo/matplotlib-devel" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/matplotlib-devel</a><br>
> <br>
> <br>
> _______________________________________________<br>
> Matplotlib-devel mailing list<br>
> <a href="mailto:Matplotlib-devel@python.org" target="_blank" rel="noreferrer">Matplotlib-devel@python.org</a><br>
> <a href="https://mail.python.org/mailman/listinfo/matplotlib-devel" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/matplotlib-devel</a><br>
> <br>
<br>
_______________________________________________<br>
Matplotlib-devel mailing list<br>
<a href="mailto:Matplotlib-devel@python.org" target="_blank" rel="noreferrer">Matplotlib-devel@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/matplotlib-devel" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/matplotlib-devel</a><br>
</blockquote></div>
_______________________________________________<br>
Matplotlib-devel mailing list<br>
<a href="mailto:Matplotlib-devel@python.org" target="_blank" rel="noreferrer">Matplotlib-devel@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/matplotlib-devel" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/matplotlib-devel</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="m_3901295563710045304gmail-m_8784059746141603411gmail_signature">Thomas Caswell<br><a href="mailto:tcaswell@gmail.com" target="_blank" rel="noreferrer">tcaswell@gmail.com</a></div>
_______________________________________________<br>
Matplotlib-devel mailing list<br>
<a href="mailto:Matplotlib-devel@python.org" target="_blank" rel="noreferrer">Matplotlib-devel@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/matplotlib-devel" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/matplotlib-devel</a><br>
</blockquote></div>
_______________________________________________<br>
Matplotlib-devel mailing list<br>
<a href="mailto:Matplotlib-devel@python.org" target="_blank" rel="noreferrer">Matplotlib-devel@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/matplotlib-devel" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/matplotlib-devel</a><br>
</blockquote></div></div></div>