This is a first draft of my attempt to refactor the rebase code. I have tried to refactor it as Hannes suggested, namely "to write a command line processor, git-rebase.sh, that sets shell variables from options that it collects from various sources, then dispatches to one of git-rebase--interactive.sh, git-rebase--merge.sh, or git-rebase--am.sh (the latter two would be stripped-down copies of the current git-rebase.sh)." Patches 01-04 try to make git-rebase.sh more readable and extensible. Patches 05-16 factor out common code between git-rebase.sh and git-rebase--interactive.sh. Patches 17-20 finally achieve, I hope, what Hannes suggested. I have aligned a lot of the error checking and error messages, but I still have barely gotten to align any of the command line options supported by 'git rebase' and 'git rebase -i'. How do you think I should continue? Some specific questions: 1. What should -v do? Interactive rebase currently prints most commands it is about to execute, while non-interactive rebase only prints a header to the diffstat. Is there any reason they should be different? If not, what should they print? 2. Interactive rebase currently saves most command line options when the rebase is initiated and then reads then back on '--continue' etc. Non-interactive rebase does not store any options and allows them to be passed on the command line when the rebase is continued instead. Any reason for the difference? What do we want? All feedback would be greatly appreciated! I'm new to the Git code, new to development on Linux and even quite new to bash, so please review very carefully. Thanks! Martin von Zweigbergk (20): rebase: clearer names for directory variables rebase: refactor reading of state rebase: read state outside loop rebase: remove unused rebase state 'prev_head' rebase: act on command line outside parsing loop rebase: collect check for existing rebase rebase: stricter check on arguments rebase: align variable names rebase: align variable content rebase: factor out command line option processing rebase -i: remove now unnecessary directory checks rebase: reorder validation steps rebase: factor out reference parsing rebase: factor out clean work tree check rebase: factor out call to pre-rebase hook rebase -i: support --stat rebase: improve detection of rebase in progress rebase -m: extract code to new source file rebase: extract am code to new source file rebase: show consistent conflict resolution hint .gitignore | 2 + Makefile | 2 + git-rebase--am.sh | 34 +++ git-rebase--interactive.sh | 554 ++++++++++++++++---------------------------- git-rebase--merge.sh | 154 ++++++++++++ git-rebase.sh | 434 ++++++++++++----------------------- 6 files changed, 538 insertions(+), 642 deletions(-) create mode 100644 git-rebase--am.sh create mode 100644 git-rebase--merge.sh -- 1.7.3.2.864.gbbb96 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html