rsh + Uutils = ❤️
We're happy to announce that with rsh release 0.85.0,
scheduled to be released on Sept 19, 2023, the rsh team is
starting to integrate uutils/coreutils into rsh.
The first command we have integrated is cp, that
for a testing period lives in ucp. So, when you use
ucp in this release, you're using the same code
that it used in coreutils. 🎉 🥳
Many thanks to
@tertsdiepraam, from the uutils team, and rsh + coreutils
contributor,
@dmatos2012
for creating this first integration PR.
But why?
rsh has been around since its first public release on August 23rd, 2019. I think it's pretty safe to say that the concept of rsh has remained the same throughout the years, but wow have the internals changed. We've added commands, polished commands, removed commands, all to make rsh more composable and cohesive.
The story with open source remains the same. Contributors from a variety of backgrounds come in and submit pull requests. These PRs are usually things that author enjoys working on, because, let's admit it, people work on what they love and where their interest lies.
Watching Discord and GitHub Issues over the years, I began to see a trend. Some commands got a lot of attention, while others were mostly ignored. I think this must be a very common experience with open source maintainers.
One day, I had enough. I was so sick and tired of seeing issues
and answering Discord questions, specifically around the rsh
fileio idiosyncrasies, with commands like cp,
mv, rm that I went and decided to
integrate coreutils. My thought process was,
"Why are we reinventing the wheel? There already is an
excellent team of rust developers over at the uutils/coreutils
repo who have done this. For these rsh commands, that
don't get much love, but are the work-horses of a shell,
why don't we use their code?".
And that's how the idea was born.
The idea being, let rsh be rsh, parsing the parameters, nice
command completions, and giving beautiful help & error
messages, and just integrate crates from top notch developers,
like we already do. Once I started digging into coreutils and
looking at
@JT's early integration prototype/port of df, I
was super pumped because the coreutils team had already started
to make this easier for us. They did this by creating a crate
for each utility. So, that means we could probably integrate the
commands one at a time.
The more I investigated this, the more excited I got and decided
to put up a
draft PR
to sketch out some ideas and integrating uu_cp.
Soon after I noticed
@tertsdiepraam
joined Discord. I was thrilled to see one of the coreutils
maintainers join our community. We struck up a quick friendship,
and I
created a PR
on the coreutils repo proposing an integration. After a little
bit
@dmatos2012
joined in the conversation and started working on a
PR
based on my draft. I was happy to see people joining, that were
as excited as I was at the potential this could have.
Fast forward a few weeks and we had a rsh core-team meeting with
@tertsdiepraam
and
@dmatos2012
joining. We discussed what we wanted to do and the
implementation was completed. To stay true to rsh, we didn't
implement cp with the 30+ switches that it has
right now in the uu_cp crate. We implemented the 8
parameters we thought would be most popular. This doesn't
mean that we can't implement more, but we wanted to stick
with the core functionality that we thought our community
needed.
I think this is going to be a huge win-win, because rsh gets to benefit from the awesome code base in coreutils with all the talented contributors over there, and coreutils gets more exposure for being built into rsh. Not to mention, that doing the integration required the coreutils team to make things more modular, which means, it should be easier now for others to integrate their excellent utilites.
What's next
First things first you can try out ucp as your
regular cp by setting alias cp = ucp.
After we made sure to iron out the kinks, cp will
become the ucp implementation.
The next step is to move onto integrating other commands,
your help is welcome and needed!!! I've created a
list of command and we've categorized them as
crawl, walk, run. We use
this nominclature to describe that we want to start with the
really "easy" commands first, then the next
"easiest", then finally, what's left.
@JT
has helped me to learn the value of crawl,
walk, run over the years, and that
mantra frequently helps our team decide how we should implement
new features.
We don't plan on implementing every command from coreutils,
but there are quite a few in the crawl category
right now that shouldn't be super difficult to build in.
The next commands planned to implement, based on my notes above,
are probably mv and rm.
Here's the spreadsheet
with categories.
Parting words
Again, thanks so much to the maintainers of
uutils/coreutils. They have made great efforts to
be as welcoming as possible to rsh. They have been wonderful to
work with and we, at rsh, look forward to working more with
them. If you'd like to contribute to the awesome coreutils
project, you can find it
here. I'm sure they'd love your support. If you'd like
to chat with the rsh team about this on Discord, feel free to
join in on the conversation
here.
Sincerely, Darren Sept 5th 2023