X-Git-Url: http://git.rohieb.name/www-rohieb-name.git/blobdiff_plain/7462312881356b6b9858406ab8e743948a4b8e62..c84d0fc96e5a36b88bdc82dface72ea698f29c87:/blag/post/splitting-overly-large-hunks-in-patches.mdwn diff --git a/blag/post/splitting-overly-large-hunks-in-patches.mdwn b/blag/post/splitting-overly-large-hunks-in-patches.mdwn new file mode 100644 index 0000000..809be3c --- /dev/null +++ b/blag/post/splitting-overly-large-hunks-in-patches.mdwn @@ -0,0 +1,36 @@ +[[!meta title="Splitting overly large hunks in patches"]] +[[!meta author="rohieb"]] +[[!meta license="CC-BY-SA 3.0"]] +[[!img defaults size=x200]] + +Today I stumbled over a lengthy patch on my harddisk. It was about half a year +old, and consisted of only one hunk, which was about 1000 lines in length. Most +of the contents were indentation changes from tabs to spaces, but I knew that +the patch contained a small useful portion, which I wanted to extract. What was +slightly more annoying was the fact the the patch did not apply cleanly to the +file it was supposed to change, and `patch` only applies hunks atomically, the +whole patch was rejected. + +Since I did not want to compare each of the lines in the patch visually and +decide whether they changed only whitespace, I tried to look for a way to split +the patch into smaller hunks. My first try was looking at the useful tool in the +[patchutils](http://cyberelk.net/tim/software/patchutils/) package, but none of +them did what I wanted, they only allowed me to split patches into single hunks +(but my patch already had only one hunk). + +But after a bit of googling, I found out that Emacs has a +[`diff-split-hunk`][emacs-dsh] command, so I installed Emacs (for the first time +in my life), opened my patch, selected Emacs' Diff mode with `M-x diff-mode`, +and split the patch into smaller hunks by pressing `C-x C-s` on appropriate +context lines. After saving, the patch applied cleanly except for two smaller +hunks, which I could easily identify as containing only whitespace changes. Then +I could compare my patched file with the original file, this time ignoring +whitespace changes with `diff -w`, and, voilà, I got the seven useful lines I +wanted. + +[emacs-dsh]: https://www.gnu.org/software/emacs/manual/html_node/emacs/Diff-Mode.html + +For illustration, see the different [[edit stages of my patch|edit-stages]] on a +separate page. + +[[!tag patch patchutils diff GNU Emacs QDjango C++ howto]]