This thread is clearly mostly not about the feature branch question, but sure...let's summarize the case for picocli (rather than airline-2, jcommander, and commons-cli) in a fresh, specifically titled thread. Then we can continue any library-agnostic discussion here if necessary.
On Mon, Jul 8, 2024 at 3:40 PM Brad <bscho...@gmail.com> wrote: > Many of the utilities in the tools directory (BulkLoader, SSTableExpoert, > etc) already use apache.commons.cli. > > On Mon, Jul 8, 2024 at 4:28 PM Dinesh Joshi <djo...@apache.org> wrote: > >> I agree about picking libraries on their merit but a major factor for any >> open source project should consider today is the possibility of >> unfavorable/hostile licensing changes. >> >> On Mon, Jul 8, 2024 at 1:15 PM Jon Haddad <j...@jonhaddad.com> wrote: >> >>> Without getting into the pros and cons of both libraries, I have to >>> point out there's something unsettling about making decisions about >>> libraries we used based on arbitrary rules an employer has put into place >>> on its employees. The project isn't governed by Apple, it's governed by >>> individual contributors to open source. >>> >>> We need to pick libraries based on their merits. Apple's draconian >>> rules should not prevent us from using the best option available. >>> >>> Jon >>> >>> >>> On Mon, Jul 8, 2024 at 12:57 PM Dinesh Joshi <djo...@apache.org> wrote: >>> >>>> I agree, having a DISCUSS thread with a specific subject line is less >>>> likely to be overlooked. >>>> >>>> One thing I'd like to note here is PicoCLI and Airline 2 are >>>> independent projects that are ALv2 licensed. A subset of the Cassandra >>>> contributors may have difficulty contributing to such projects due to >>>> preexisting policies that their employers may have in place. >>>> >>>> I am concerned about hostile licensing changes in the future which will >>>> necessitate another migration for us. That said, is there a specific reason >>>> to not consider Apache Commons CLI[1]? >>>> >>>> Dinesh >>>> >>>> [1] https://commons.apache.org/proper/commons-cli/ >>>> >>>> On Mon, Jul 8, 2024 at 10:22 AM David Capwell <dcapw...@apple.com> >>>> wrote: >>>> >>>>> I don't think that a separate thread would add extra visibility >>>>> >>>>> >>>>> Disagree. This thread is about adding a feature branch, so many could >>>>> ignore if they don’t care. The fact you are switching the library (and >>>>> which one) is something we have to hunt for. By having a new DISCUSS >>>>> thread it makes it clear which library you wish to add, and people can >>>>> sign >>>>> off if they care or not. >>>>> >>>>> I wouldn’t create this thread until you settle on which one you wish >>>>> to move forward with. >>>>> >>>>> Is adding the PicoCLI library as a project dependency getting any >>>>> objections >>>>> from the Community? >>>>> >>>>> >>>>> Thats the point of the new DISCUSS thread. By being very clear you >>>>> wish to add PicoCLI people can either validate we are allowed to, or raise >>>>> any objections. I have not really seen any pushback so far outside of 1 >>>>> case that wasn’t legally allowed to be used. >>>>> >>>>> Take a look at previous threads about adding different libraries. >>>>> >>>>> On Jul 8, 2024, at 7:58 AM, Caleb Rackliffe <calebrackli...@gmail.com> >>>>> wrote: >>>>> >>>>> +1 on picocli >>>>> >>>>> RE the feature branch, I would just maintain the feature branch in >>>>> your own fork to break out whatever "reviewable units" of code you want. >>>>> When all the incremental review is done (I have no problem going back and >>>>> forth), squash everything together, do whatever additional testing you >>>>> need, and commit. >>>>> >>>>> On Fri, Jul 5, 2024 at 10:40 AM Maxim Muzafarov <mmu...@apache.org> >>>>> wrote: >>>>> >>>>>> > Once you are happy with your chosen library, we need a DISCUSS >>>>>> thread to add this new library (current protocol). >>>>>> >>>>>> Thanks, David. This is a good point, do we need a separate DISCUSS >>>>>> thread or can we just use this one? I'm in favour of keeping the >>>>>> discussion in one place, especially when topics are closely related. I >>>>>> don't think that a separate thread would add extra visibility, but if >>>>>> that is the way the community has adopted - no problem at all, I'll >>>>>> repost. >>>>>> >>>>>> >>>>>> The reasons for replacing the Airlift/Airline [1] with the PicoCli [2] >>>>>> are as follows (in order of priority): >>>>>> >>>>>> 1. The library is under the Apache-2.0 License >>>>>> https://github.com/remkop/picocli?tab=Apache-2.0-1-ov-file#readme >>>>>> >>>>>> 2. The project is active and well-maintained (last release on 8 May >>>>>> 2024) >>>>>> https://github.com/remkop/picocli/releases >>>>>> >>>>>> 3. The library has ZERO dependencies, in some of the cases a single >>>>>> file can just be dropped into the sources (it's even pointed out in >>>>>> the documentation) >>>>>> https://picocli.info/#_add_as_source >>>>>> >>>>>> 4. Compared to the Airlift library, the PicoCLI uses the same markup >>>>>> design concepts, so we don't have to rewrite our command or make >>>>>> complex changes, which in turn minimizes the migration. >>>>>> >>>>>> >>>>>> Is adding the PicoCLI library as a project dependency getting any >>>>>> objections from the Community? Please, share your thoughts. >>>>>> >>>>>> There are a few other alternatives (commons-cli, airline2, jcommander) >>>>>> but they are not as well known and/or not as elegantly suited to our >>>>>> needs based on what we have now. >>>>>> >>>>>> >>>>>> [1] https://github.com/airlift/airline >>>>>> [2] https://github.com/remkop/picocli >>>>>> >>>>>> >>>>>> On Wed, 3 Jul 2024 at 22:27, David Capwell <dcapw...@apple.com> >>>>>> wrote: >>>>>> > >>>>>> > I don't personally think there is a strong need for a feature >>>>>> branch. If it makes it easy for you, please go ahead with a feature >>>>>> branch. >>>>>> > >>>>>> > >>>>>> > Agree, I don’t see the reason for a feature branch… feature branch >>>>>> just means the branch lives in apache domain rather than your own fork. >>>>>> You won’t be able to merge until you are done and you will need to keep >>>>>> rebasing over and over again. Even if multiple people are working on this >>>>>> you can work in your fork just fine (assuming you grant permissions). >>>>>> > >>>>>> > Another issue is that feature branches require the same level of >>>>>> commit process as every other main branch, where as personal branches >>>>>> don’t. This actually will slow you down as each commit now must be a >>>>>> JIRA, >>>>>> you go through review of each, must show a success CI, etc. >>>>>> > >>>>>> > Now, if you wish to split this into multiple steps that is fine, >>>>>> but the list of places is basically node tool (kinda has to go in at >>>>>> once) >>>>>> and small CLIs. If you wish to migrate the small ones in isolation >>>>>> first, >>>>>> I am cool with that merging to w/e branch the logic is targeting, but you >>>>>> won’t be able to break up node tool without breaking everything… but if >>>>>> you >>>>>> did this in your own fork then no one cares. >>>>>> > >>>>>> > I won’t block a feature branch, but just don’t see a clear “why” >>>>>> and only see cons. >>>>>> > >>>>>> > We are changing the command markup library, so there are two extra >>>>>> > things to be checked: >>>>>> > - We parse CLI arguments in the same way (as the parser is different >>>>>> > in a new library); >>>>>> > - The command help output is the same so that the user won't see >>>>>> any difference; >>>>>> > >>>>>> > >>>>>> > Personally I would POC a limited node tool change with JVM dtest as >>>>>> we require passing the output to the test (the prototypes you listed >>>>>> doesn’t include JVM Dtest integration). If one library makes this more >>>>>> annoying, then do we care about fancy new features we don’t use when it >>>>>> makes the features we do use harder? If you start with the smaller tools >>>>>> first then spend a ton of time migrating node tool then find JVM dtest is >>>>>> broken, then you will spend so much more time fixing this, I would >>>>>> strongly >>>>>> recommend doing some throw away POC to make sure w/e way you go won’t >>>>>> break >>>>>> JVM Dtest’s node tool support. >>>>>> > >>>>>> > Once you are fine with your selected library, we will need a >>>>>> DISCUSS thread to add that new library (current protocol). This mostly >>>>>> just makes the pick more visible, and normally we only check simple >>>>>> things >>>>>> like “are we legally allowed to use” and “is this project dead?”. >>>>>> > >>>>>> > >>>>>> > On Jul 3, 2024, at 6:06 AM, Maxim Muzafarov <mmu...@apache.org> >>>>>> wrote: >>>>>> > >>>>>> > Thank you all for your comments, >>>>>> > >>>>>> > I want to stress, that these changes won't affect the input/output >>>>>> > formatting of commands, ensuring everything is the same. >>>>>> > >>>>>> > We are changing the command markup library, so there are two extra >>>>>> > things to be checked: >>>>>> > - We parse CLI arguments in the same way (as the parser is different >>>>>> > in a new library); >>>>>> > - The command help output is the same so that the user won't see >>>>>> any difference; >>>>>> > >>>>>> > Additional tests cover both cases. >>>>>> > >>>>>> > On Mon, 1 Jul 2024 at 20:08, Dinesh Joshi <djo...@apache.org> >>>>>> wrote: >>>>>> > >>>>>> > >>>>>> > I don't personally think there is a strong need for a feature >>>>>> branch. If it makes it easy for you, please go ahead with a feature >>>>>> branch. >>>>>> > >>>>>> > One thing I had raised in the past was the desire to have a flag >>>>>> that would generate machine readable output for nodetool commands. If >>>>>> this >>>>>> can be done with a minor incremental effort, it would definitely reduce >>>>>> the >>>>>> burden on operators / integrations that rely on the nodetool output. As I >>>>>> have earlier indicated in the past, relying on human readable output for >>>>>> CLI tools like nodetool is fragile and providing a JSON output as an >>>>>> alternative is a great first step in eliminating that dependency. I'm >>>>>> just >>>>>> curious about the level of effort. If it is too much or too invasive, we >>>>>> can consider producing JSON output for inclusion in the next major >>>>>> release. >>>>>> > >>>>>> > On Fri, Jun 28, 2024 at 6:47 AM Maxim Muzafarov <mmu...@apache.org> >>>>>> wrote: >>>>>> > >>>>>> > >>>>>> > Hello everyone, >>>>>> > >>>>>> > >>>>>> > The nodetool relies on the airlift/airline library to mark up the >>>>>> CLI >>>>>> > commands used to manage Cassandra, which are part of our public API. >>>>>> > This library is no longer maintained, so we need to update it >>>>>> anyway, >>>>>> > and the good news is that we already have several good alternatives: >>>>>> > airline-2 [3] or picocli [2]. >>>>>> > >>>>>> > In this message, I'm mainly talking about CASSANDRA-17445 [4], which >>>>>> > refers to the problem and is a prerequisite for a larger CEP-38 CQL >>>>>> > Management API [5]. It doesn't make sense to use annotations from >>>>>> the >>>>>> > deprecated library to build a new API, so this is another reason to >>>>>> > update the library as soon as possible and do some inherently small >>>>>> > code refactoring required for the CEP-38. >>>>>> > >>>>>> > In addition to being widely used and well supported, the Picocli >>>>>> > library offers the following advantages for us: >>>>>> > - We can detach the jmx-specific parameters from the commands so >>>>>> that >>>>>> > they can be reused in other APIs (e.g. without host, port) while >>>>>> > remaining backwards compatible; >>>>>> > - We can set up nodetool's autocompletion after the migration with >>>>>> > minimal effort; >>>>>> > - There is a good Picocli ecosystem of tools that we can use to >>>>>> > simplify our codebase, e.g. generate man pages tool to make our CLIs >>>>>> > more Unix friendly [7]; >>>>>> > >>>>>> > >>>>>> > = Prototype = >>>>>> > >>>>>> > I have a working prototype [8] that shows what the result will look >>>>>> > like. The prototype includes: >>>>>> > - Tests between the execution of commands via the nodetool and >>>>>> nodtoolv2; >>>>>> > - 5 out of 164 nodetool commands have been moved so far, to show the >>>>>> > refactoring we need to do to the command's body; >>>>>> > - The command help output under for the nodetoolv2 is the same as it >>>>>> > is currently for the nodetool and this is the default, however a >>>>>> > "cassandra.cli.picocli.layout" is added to switch to the Picocli >>>>>> > defaults; >>>>>> > - You can also see that the colour scheme is applied by the Picocli >>>>>> > out of the box, and this is how it looks [9]; >>>>>> > - The nodetoolv2 is called first when the shell is triggered, and if >>>>>> > the nodetoolv2 doesn't contain the command it needs yet, it falls >>>>>> back >>>>>> > to the nodetool and the old argument parser; >>>>>> > >>>>>> > >>>>>> > Since the number of commands is quite large (164), I'd like to >>>>>> create >>>>>> > a feature branch and move all the commands one at a time, while >>>>>> > keeping the output backwards by applying additional tests at the >>>>>> same >>>>>> > time and checking that the CI is always green. I think the "feature >>>>>> > branch" approach will be less stressful for us since it focuses on >>>>>> > requiring a review of only tedious changes to the feature branch, >>>>>> > rather than reviewing the 15k line patch. >>>>>> > >>>>>> > >>>>>> > Anyway, I am open to any suggestions and advice based on your >>>>>> > experience and best practices for this case. Looking forward to your >>>>>> > thoughts and suggestions. >>>>>> > >>>>>> > >>>>>> > >>>>>> > [1] https://github.com/airlift/airline >>>>>> > [2] https://picocli.info/ >>>>>> > [3] https://github.com/rvesse/airline >>>>>> > [4] https://issues.apache.org/jira/browse/CASSANDRA-17445 >>>>>> > [5] >>>>>> https://cwiki.apache.org/confluence/display/CASSANDRA/CEP-38%3A+CQL+Management+API >>>>>> > [6] >>>>>> https://github.com/apache/cassandra/pull/2497/files#diff-acdd5f29d28df5c02f4bfc933528f084508b4923112e312e68a4aff7df973bce >>>>>> > [7] https://picocli.info/man/gen-manpage.html >>>>>> > [8] https://github.com/apache/cassandra/pull/2497/files >>>>>> > [9] >>>>>> https://github.com/apache/cassandra/assets/3415046/57b14ae0-ff59-43d2-b542-10d3218ae075 >>>>>> > >>>>>> > >>>>>> >>>>> >>>>>