<html> <head> <meta charset="utf-8" /> <meta name="generator" content="pandoc" /> <meta name="viewport" content="widthÞvice-width, initial-scale=1.0, user-scalable=yes" /> <title>-</title> <style type="text/css"> @charset "UTF-8";.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#24292e;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:16px;line-height:1.5;word-wrap:break-word;box-sizing:border-box;min-width:200px;max-width:980px;margin:0 auto;padding:45px}.markdown-body a{color:#0366d6;background-color:transparent;text-decoration:none;-webkit-text-decoration-skip:objects}.markdown-body a:active,.markdown-body a:hover{outline-width:0}.markdown-body a:hover{text-decoration:underline}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body strong{font-weight:600}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1{font-size:2em;margin:.67em 0;padding-bottom:.3em;border-bottom:1px solid #eaecef}.markdown-body h2{padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid #eaecef}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{font-size:.85em;color:#6a737d}.markdown-body img{border-style:none}.markdown-body svg:not(:root){overflow:hidden}.markdown-body hr{box-sizing:content-box;height:.25em;margin:24px 0;padding:0;overflow:hidden;background-color:#e1e4e8;border:0}.markdown-body hr::before{display:table;content:""}.markdown-body hr::after{display:table;clear:both;content:""}.markdown-body input{margin:0;overflow:visible;font:inherit;font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body [type=checkbox]{box-sizing:border-box;padding:0}.markdown-body *{box-sizing:border-box}.markdown-body blockquote{margin:0}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dd{margin-left:0}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body code{font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace}.markdown-body pre{font:12px SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;word-wrap:normal}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body blockquote{padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body table{display:block;width:100%;overflow:auto;border-spacing:0;border-collapse:collapse}.markdown-body table th{font-weight:600}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #dfe2e5}.markdown-body table tr{background-color:#fff;border-top:1px solid #c6cbd1}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body code{padding:.2em 0;margin:0;font-size:85%;background-color:rgba(27,31,35,.05);border-radius:3px}.markdown-body code::after,.markdown-body code::before{letter-spacing:-.2em;content:" "}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:3px}.markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body pre code::after,.markdown-body pre code::before{content:normal}.markdown-body .full-commit .btn-outline:not(:disabled):hover{color:#005cc5;border-color:#005cc5}.markdown-body kbd{box-shadow:inset 0 -1px 0 #959da5;display:inline-block;padding:3px 5px;font:11px/10px SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;color:#444d56;vertical-align:middle;background-color:#fcfcfc;border:1px solid #c6cbd1;border-bottom-color:#959da5;border-radius:3px;box-shadow:inset 0 -1px 0 #959da5}.markdown-body :checked+.radio-label{position:relative;z-index:1;border-color:#0366d6}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item+.task-list-item{margin-top:3px}.markdown-body .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}.markdown-body::before{display:table;content:""}.markdown-body::after{display:table;clear:both;content:""}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.Alert,.Error,.Note,.Success,.Warning{padding:11px;margin-bottom:24px;border-style:solid;border-width:1px;border-radius:4px}.Alert p,.Error p,.Note p,.Success p,.Warning p{margin-top:0}.Alert p:last-child,.Error p:last-child,.Note p:last-child,.Success p:last-child,.Warning p:last-child{margin-bottom:0}.Alert{color:#246;background-color:#e2eef9;border-color:#bac6d3}.Warning{color:#4c4a42;background-color:#fff9ea;border-color:#dfd8c2}.Error{color:#911;background-color:#fcdede;border-color:#d2b2b2}.Success{color:#22662c;background-color:#e2f9e5;border-color:#bad3be}.Note{color:#2f363d;background-color:#f6f8fa;border-color:#d5d8da}.Alert h1,.Alert h2,.Alert h3,.Alert h4,.Alert h5,.Alert h6{color:#246;margin-bottom:0}.Warning h1,.Warning h2,.Warning h3,.Warning h4,.Warning h5,.Warning h6{color:#4c4a42;margin-bottom:0}.Error h1,.Error h2,.Error h3,.Error h4,.Error h5,.Error h6{color:#911;margin-bottom:0}.Success h1,.Success h2,.Success h3,.Success h4,.Success h5,.Success h6{color:#22662c;margin-bottom:0}.Note h1,.Note h2,.Note h3,.Note h4,.Note h5,.Note h6{color:#2f363d;margin-bottom:0}.Alert h1:first-child,.Alert h2:first-child,.Alert h3:first-child,.Alert h4:first-child,.Alert h5:first-child,.Alert h6:first-child,.Error h1:first-child,.Error h2:first-child,.Error h3:first-child,.Error h4:first-child,.Error h5:first-child,.Error h6:first-child,.Note h1:first-child,.Note h2:first-child,.Note h3:first-child,.Note h4:first-child,.Note h5:first-child,.Note h6:first-child,.Success h1:first-child,.Success h2:first-child,.Success h3:first-child,.Success h4:first-child,.Success h5:first-child,.Success h6:first-child,.Warning h1:first-child,.Warning h2:first-child,.Warning h3:first-child,.Warning h4:first-child,.Warning h5:first-child,.Warning h6:first-child{margin-top:0}h1.title,p.subtitle{text-align:center}h1.title.followed-by-subtitle{margin-bottom:0}p.subtitle{font-size:1.5em;font-weight:600;line-height:1.25;margin-top:0;margin-bottom:16px;padding-bottom:.3em}div.line-block{white-space:pre-line} </style> <style type="text/css">code{white-space: pre;}</style> </head> <body> <article class="markdown-body"> <pre>[~] git clone https://git.khirnov.net/alot.git Cloning into 'alot'... fatal: unable to access 'https://git.khirnov.net/alot.git/': server certificate verification failed. CAfile: none CRLfile: none [~] git clone git://git.khirnov.net/alot.git Cloning into 'alot'... (times out)</pre>

Quoting Patrick Totzke (2021-05-16 19:23:58)

Quoting Anton Khirnov (2021-05-16 18:47:24)

Quoting Patrick Totzke (2021-05-16 17:41:49) > Hi everyone, > > All this sounds very exciting and I’d be very happy to see these features in > (mainline) alot! > > I agree that some of alot’s underlying code is ready for refactoring > and urwid in particular has been a big drag on quickly implementing things. > Also, I’d be interested in hearing your thoughts on deprecating some “unworthy” > features in order to reduce the maintenance effort!

That is largely a matter of perspective and personal preference. E.g. among the things gone in my tree are: - removing messages - I dropped that because I considered that code potentially dangerous, had no use for it myself, and just didn’t want to tiptoe around it; someone actually using RemoveCommand in their workflow would have a different opinion

Yep, same here. I never used that.

https://xkcd.com/1172/ is very much in effect

This could have been easily introduced as a separate type of buffer to keep both variants without breaking things.

Why did I not submit all this as PRs to upstream alot? The main reasons were my lack of time and disagreement with the upstream about project status. From what I can tell, alot maintainers consider the project to be mature, so they prioritize stability and small incremental changes. From my perspective, alot is lacking some critical features – some implemented in my fork already, some planned – which makes it borderline-unusable for me. As implementing those features required large-scale architectural changes and my free time was quite limited, I prioritized quickly implementing the things I cared about over progressing in small incremental stable easily-reviewable steps.

I have a similar impression about the project status. I’m curious: What are the architectural changes that you made?

Yes, the speed at which alot progresses is borderline problematic. This is of course down to the small number of core contributors and the fact that for all of us life goes on an priorities change.

One problem is that the project attracts many users interested in pushing what I’d call “hotfixes” to address missing features: Often people would present a (nicely working) proof-of concept that is not well documented, tested, and doesn’t adhere to common code conventions, only not to follow up on their promises to “clean things up”, for all too understandable reasons. Still, I believe that just merging everything will quickly kill the project as a) this leads to code that is very difficult and time-consuming to maintain and b) broken features are very damaging to user’s perception of the software, much more so than missing ones.

I am not accusing you of anything here, Anton. I just wish to point out potential long term difficulties and clarify that I tried to err on the side of cautiousness to keep alot afloat in a usable state for most (potential) users.

You would be very correct to accuse me of taking various shortcuts. I would not call my changes “hotfixes”, as I tried to keep continuous future improvements in mind

I understand. The question is just how long do you plan to stick around to add improvements and provide support? If your answer is: “not at all, I’m only sharing my code here”, then don’t be surprised if your efforts die the same death and quickly disappear as so many other notmuch projects before. If you are fine with that: great. But I suppose you wouldn’t have shared your code here unless you’d want people to join in and use it (for longer than a day).

(and in fact see many of my changes as cleanup and simplification).

I’m more than happy to push some of them.

But I did make an explicit decision to prioritise rapidly adding new functionality, at the cost of potential regressions and loss of some features I did not need.

And again, this is a matter of perspective. If alot does what you want it to do then of course you will value stability and consistency. But if the lack of certain features makes it barely usable, then it makes sense to be more radical.

Yes, I agree. There are many features that I’m personally missing but either don’t yet know how to implement, or already have thought about them and can see how much extra work it’d be. I welcome disruption. However, it’d be constructive to introduce changes one at a time, discuss, then implement them with all bells and whistles (read: document).

At this point my tree has over 200 new commits and some ~4k changed lines, so it’s looking increasingly unlikely that I’ll ever find the free time and motivation to upstream it – especially given alot’s glacial pace of development recently. If people are interested in using this, I’ll probably fork it “properly” under a new name.

Any comments or questions are very much welcome. I can also be reached on IRC as elenril.

Have you tried raising these concerns with upstream before your fork? Have you tried gathering a team around an idea and starting something new together?

Frankly, upstream is borderline small already, and the way you started your fork probably will not attract a team of people who want to make that new fork their (common) own or are looking for a stronger team.

I share Michael’s concerns about further splintering the small group of developers and believe that this would be to the detriment of both projects.

It’s no secret that I am ready to give the helm to others. I have been maintaining this project for a while now, mainly for personal usage and as a fun distraction. I have tried to squeeze in time to review pull requests when possible and am grateful for the many code contributions over the years, most notably the big steps towards pgp/mime, python3 and notmuch2, all of which I’d have never found the time to implement myself.

It has so far been a successful, albeit slow, strategy to try and coordinate efforts and I would very much like to see this going on, but without sacrificing the quality of the code or the relative mature user experience.

And here is precisely the crux of the problem. My changes are pretty drastic and 1) there WILL be bugs 2) someone WILL find them to degrade their user experience. You cannot always satisfy everyone.

I am actually fine with breaking things. But it has to be justified and changes need to at least be documented somewhere. Users will adjust or move on. But it is difficult to “re-sort” code once it becomes inconsistent or unpredictable in my opinion.

Combined with the fact that I also have a lot on my plate and don’t see myself reshaping my tree into nicely packaged atomic changes with a ribbon on top (at least not any time soon).

That’s too bad. Even small PR’s would be welcome.

To be clear: I still do not consider alot “mature” in the sense that I’d oppose radical refactoring. This is reflected in its version number :)

If you can find the time for it, maybe try to look at the individual changes in my tree. Try it out, see what makes sense to you, what doesn’t, etc. I would be happy to see it all merged into alot, just don’t see how it can practically be done through the normal channels.

Look, if you can’t be bothered to go via “the normal channels”, then it’s unlikely that anyone wants to spend the time to dig though your code to find (upstream) usable nuggets. If someone does, and re-packages into a PR then cool. I don’t see myself spending much time on that I’m afraid.

E.g. one thing I expect to be contentious is the removal of urwidtrees use. I understand you are its author, so it may be unpleasant to hear, but I found it to be a major obstacle to implementing quote folding.

No: I authored urwidtrees out of necessity. Urwid simply did not have a widget for trees at the time and I wanted to replicate the sup/gmail type of buffer. It is not particularly great code and I’d be happy to see it go.

Best wishes,
P

</article> </body> </html>