<div dir="ltr">A package manager could be good work.<div>A year or so back I taught myself "Julia" and the package manager for that was very nice indeed.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 29 Jul 2019 at 03:55, Julian Fondren <<a href="mailto:jfondren@minimaltype.com">jfondren@minimaltype.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">Hello list,<br>
<br>
As noted, there's some prior prior work on a "something like CPAN<br>
or mpm or gems" for Mercury. I looked around for a bit and found:<br>
<br>
* Prior work<br>
<br>
** Mercury Anarchy Archive<br>
Last update: 2010-08<br>
URL: <a href="http://manarchive.sourceforge.net/" rel="noreferrer" target="_blank">http://manarchive.sourceforge.net/</a><br>
ANN: <br>
<a href="http://lists.mercurylang.org/archives/users/2007-February/004353.html" rel="noreferrer" target="_blank">http://lists.mercurylang.org/archives/users/2007-February/004353.html</a><br>
CLI tool: manarchive-config<br>
Package count: 6<br>
<br>
I thought there was no content at all here until started to write<br>
this very email, due to the SourceForge interface: you've gotta to<br>
click on 'Code', not 'Files'.<br>
<br>
The "Accessing Manarchive" instructions also no longer work, due to<br>
SourceForge changes.<br>
<br>
This is a shared filedump with a convenience tool and some<br>
expectations about the content. With so much free code hosting<br>
around, and with code being small enough that paid hosting will be<br>
very cheap, all I see is downsides from the 'anarchic' part of<br>
people being able to change my code without talking to me.<br>
<br>
** Mercury Package Manager<br>
Last update: 2015-08<br>
URL: <a href="https://github.com/sebgod/mpm" rel="noreferrer" target="_blank">https://github.com/sebgod/mpm</a><br>
ANN: (none?)<br>
CLI tool: mpm<br>
Package count: 0<br>
<br>
This is slightly bit-rotten as it refers to io.poly_type, but once<br>
that's fixed it compiles.<br>
<br>
Typing 'make' is enough for it to install its executable into<br>
$HOME/bin, which is a shocking deviation from civilized behavior.<br>
<br>
I only dug into it enough to see that "listing available packages"<br>
seems to be unimplemented behavior.<br>
<br>
** Mercury Project Manager<br>
Last update: 2019-05 (August: not actually bad for Mercury?)<br>
URL: <a href="https://bitbucket.org/charles_shuller/mpm/src/master/" rel="noreferrer" target="_blank">https://bitbucket.org/charles_shuller/mpm/src/master/</a><br>
ANN: <a href="http://lists.mercurylang.org/archives/users/2019-March/008470.html" rel="noreferrer" target="_blank">http://lists.mercurylang.org/archives/users/2019-March/008470.html</a><br>
CLI tool: mpm<br>
Package count: 0<br>
<br>
This is a build system with a JSON project definition and a<br>
dependency fetcher. So it's very appropriately named. You can't<br>
discover someone else's Mercury package with it, though.<br>
<br>
For build systems there's already mmc, mmake, and mmc --make, as<br>
well as (simple, easy) makefiles and (alien, sanity destroying)<br>
autoconf files.<br>
<br>
I don't like JSON either. The point's made that XML is worse, but<br>
what about Mercury's own term reading? Just imagine all the<br>
validation code you don't have to write.<br>
<br>
** Putting stuff on github and hoping people can find it through<br>
    the hundreds of mis-identified Matlab and machine learning(?)<br>
    files<br>
URL: <a href="https://github.com/search?q=language%3AMercury&type=Repositories" rel="noreferrer" target="_blank">https://github.com/search?q=language%3AMercury&type=Repositories</a><br>
ANN: if you post links to this list, people might find them<br>
      eventually<br>
CLI tool: none<br>
Package count: 20 or so (hidden among 300+ hits)<br>
<br>
This actually has a lot of advantages vs. the other work here. You<br>
get free hosting without losing control (in practice).<br>
Collaboration is easy and convenient. You don't need to use any<br>
additional tools or change your workflow.<br>
<br>
As a downside, there's not much you can expect for consistency, but<br>
lots of inconsistent packages would be a nice problem to have, vs.<br>
the current circumstance of very few packages.<br>
<br>
The major downside is that if you'd just deleted your package<br>
instead of uploading it to Github, it'd only be a little less<br>
discoverable. Discoverability is so bad on Github that projects<br>
like this exist, instead:<br>
<br>
<a href="https://github.com/ohenley/awesome-ada" rel="noreferrer" target="_blank">https://github.com/ohenley/awesome-ada</a> (announced on January of<br>
this year btw. This wouldn't be a bad thing to duplicate.)<br>
<br>
And more:<br>
<a href="https://github.com/sindresorhus/awesome#programming-languages" rel="noreferrer" target="_blank">https://github.com/sindresorhus/awesome#programming-languages</a><br>
<br>
** Adding stuff to the 'extras' directory<br>
Packages: 34<br>
<br>
Of all the "prior work" I think this is actually the best one that<br>
you can use right now. People that watch the Mercury github will<br>
see commits to it, and see when packages are added. It's easy to<br>
fork the Mercury repo and put your new extras in a branch that you<br>
can then submit back to the repo in a PR. People can see from the<br>
git log and from "main author" notices where the code came from.<br>
<br>
I think this option just needs some encouragement, like a "How to<br>
submit your package to extras/" mini-doc on<br>
<a href="https://mercurylang.org/documentation/documentation.html" rel="noreferrer" target="_blank">https://mercurylang.org/documentation/documentation.html</a><br>
<br>
* What's the point of this anyway?<br>
<br>
Without pointing any fingers, I think it's easy to cargo-cult the<br>
benefit of a package manager. And then, perhaps it's easy to get<br>
discouraged when the planes don't come even though you've built a<br>
perfectly good something-or-other. If the manarchive has existed<br>
for 12 years and there aren't even 12 packages on it, there must<br>
not be a point to making a package manager for Mercury.<br>
<br>
So I'll just answer the question. The point of a package manager is<br>
social alchemy: it is to turn the /lead interaction/ into the /gold<br>
interaction/.<br>
<br>
** The lead interaction<br>
<br>
- Alice discovers Mercury. "wow, what a cool language!"<br>
- Alice wants to do some pedestrian, normal thing with it. "I can't<br>
   start exim on my VPS for some nonsense reason to do with<br>
   libperl.so. Why don't I just write an SMTP server in Mercury<br>
   that's just good enough for my needs?"<br>
- Alice writes net.m, a TCP socket library that's good enough for<br>
   smtp.m<br>
- Alice writes smtp.m, an SMTP library suitable for a mail service<br>
   that can accept a low volume of email and then ask dovecot to<br>
   deliver it locally.<br>
- Alice writes tiny_recvmail.m<br>
- Alice runs the server and eventually runs out of problems with it<br>
- Alice throws the mature code on github and forgets about it<br>
<br>
(time passes)<br>
<br>
- Bob has a bunch of servers that run exim and, coincidentally,<br>
   has tons of spam.<br>
- Bob has the crazy idea of instrumentalizing exim to make it<br>
   easy to study and react to spam.<br>
   (this means writing lots of code in Perl.)<br>
- Bob discovers Mercury. "wow, I'd much rather work with spam in<br>
   this language!"<br>
- Bob looks for any prior smtp work in Mercury, and doesn't find<br>
   any<br>
- Bob can't justify starting from the very beginning, before he's<br>
   even sure that Mercury will help him.<br>
- Bob moves on to other things<br>
<br>
(more time passes)<br>
<br>
- Alice moves on to other things<br>
- the end<br>
<br>
** The gold interaction<br>
<br>
- Alice ... throws the mature code on github and adds it to a<br>
   package manger<br>
<br>
(time passes)<br>
<br>
- Bob ... looks for any prior smtp work in Mercury, and finds<br>
   tiny_recvmail.m<br>
- "this is great!", but for Bob's purposes it's also very lacking.<br>
   Bob creates a github issue listing what's lacking, and continues<br>
   to work with the server.<br>
<br>
- Alice gets an email about the issue and checks it out. "you want<br>
   extensive logging? My VPS doesn't have a lot of space but if it's<br>
   optional..."<br>
- Alice looks for any prior work in logging in Mercury, and finds<br>
   some<br>
- Alice adds logging to her project even though she has no personal<br>
   use for it<br>
<br>
- Bob meanwhile has added some analysis hooks, essentially<br>
   reinventing SpamAssassin as a module within the mail daemon.<br>
- Bob submits this as an addition to tiny_recvmail<br>
<br>
(this goes on for a while)<br>
<br>
- Alice occasionally get paid contracts to work on mega_mungemail.m<br>
- Bob solves the problem of spam, forever, albeit through the<br>
   roundabout method of accidentally creating a murderous AI that<br>
   decides that humanity is the problem<br>
- the end<br>
<br>
* So what does the alchemy really need, to work?<br>
<br>
Just one thing: discoverability. That "X looks for prior work and<br>
doesn't/does find it" is where the lead/gold outcome is decided.<br>
<br>
Although calling that "just one thing" is like saying that all you<br>
need to keep the rain off of you is a roof. Roofs don't just float<br>
in the air above your head. So there are some good things to have<br>
if you want people to actually discover anything:<br>
<br>
1. a server on the internet that holds the list of packages<br>
<br>
2. a website that you can use easily add a package to the list<br>
<br>
3. a cli tool, preferably one included in Mercury, that can search<br>
    through this list and grab packages from it<br>
<br>
And then, there's obviously a lot more you can do. Packages could<br>
have versions and versioned dependencies, you could have a safe<br>
build system that can't let a malicious package hack your servers,<br>
you could have standardization of package contents and continuous<br>
integration and test failure reports. But the necessary minimal<br>
core of a solution is a webserver, a CGI script, and a client tool<br>
that can make some web requests and maybe call "git clone" for you.<br>
<br>
<br>
So... I've got #1 and #2 done, and am working on #3 now. That'll<br>
probably be released in a week or two. I'm sending this out now as<br>
it's already quite a long email.<br>
<br>
<br>
Cheers,<br>
Julian<br>
_______________________________________________<br>
users mailing list<br>
<a href="mailto:users@lists.mercurylang.org" target="_blank">users@lists.mercurylang.org</a><br>
<a href="https://lists.mercurylang.org/listinfo/users" rel="noreferrer" target="_blank">https://lists.mercurylang.org/listinfo/users</a><br>
</blockquote></div>