The git subtree command is currently implemented as a shell script and it lives inside contrib/subtree/. There was previously an attempt to move it out of contrib/, but there was the concern of adding yet another scripted command (with all the problems that brings with it).
Using the OPT_SUBCOMMAND infrastructure, this project is about reimplementing the individual subcommands one by one.
In contrast to earlier projects that converted shell scripts to pure C versions, we want to be mindful to avoid too-literal translations. For example, instead of using the --grep= argument of the revision walking machinery, we will want to implement a precise search through the commit messages via strstr() and avoid spawning a new process. And instead of near-duplicating the logic of find_latest_squash and find_existing_splits, there are probably better ways to do this in C, ways that avoid code duplication.
However, just like previous conversions, this project could start by renaming git-subtree.sh to git-subtree--helper.sh while moving it to the top-level, moving the test script to t/ and implementing a builtin/subtree.c that simply shells out to the helper. That way, subcommands can be converted incrementally (and even independently).
The
git subtreecommand is currently implemented as a shell script and it lives insidecontrib/subtree/. There was previously an attempt to move it out ofcontrib/, but there was the concern of adding yet another scripted command (with all the problems that brings with it).Using the
OPT_SUBCOMMANDinfrastructure, this project is about reimplementing the individual subcommands one by one.In contrast to earlier projects that converted shell scripts to pure C versions, we want to be mindful to avoid too-literal translations. For example, instead of using the
--grep=argument of the revision walking machinery, we will want to implement a precise search through the commit messages viastrstr()and avoid spawning a new process. And instead of near-duplicating the logic offind_latest_squashandfind_existing_splits, there are probably better ways to do this in C, ways that avoid code duplication.However, just like previous conversions, this project could start by renaming
git-subtree.shtogit-subtree--helper.shwhile moving it to the top-level, moving the test script tot/and implementing abuiltin/subtree.cthat simply shells out to the helper. That way, subcommands can be converted incrementally (and even independently).