Subject: Porcelain support for daggy-fixes?

From: Mikko Rantalainen <[email-masked]>
Date: Thu, 10 Jun 2010 16:55:10 +0300

Introduction: http://monotone.ca/wiki/DaggyFixes/

I understand that this can already be done with git. The method is

1) store the current HEAD somewhere
2) figure out the proper parent for the bug fix
3) checkout the parent
4) implement the fix
5) commit the fix
6) checkout HEAD
7) merge with the commit from step 5

Is there some way to do this more automatically? The way I think this
should be done:

1) fix a bug that you just found (let's imagine for a second that you
just happened to know how to fix the bug without knowing the history of bug)
2) git commit (the bugfix is now the tip of the HEAD)
3) git daggy-fix

And you're done.

Here the magical "daggy-fix" would do the following:

"Remove" the change HEAD^..HEAD from the current branch, try to
recursively apply the patch to ancestors of HEAD and locate oldest
parent that the patch can be automatically applied to without a
conflict. Let's call this parent BUG (best guess for the original commit
that introduced the bug). Commit the patch as a new child of BUG and
then merge with HEAD^ (from the moment daggy-fix was executed). Checkout
the new HEAD to replace the original HEAD.

In short, replace the current tip of the current branch with the merge
of last commit rebased as the bugfix for historical commit and HEAD^.

Logical syntax for this command could be

git daggy-fix fix-commit-id bug-commit-id

where
fix-commit-id is the commit that should be relocated and re-merged
bug-commit-id is the commit that introduced the bug (no need for
automatic detection of the parent)

both commit id's are optional.

Does this sound reasonable or is there already some better way?

-- 
Mikko