Difference between revisions of "Patch and diff"
(New page: == References == * Good [http://www.linuxtutorialblog.com/post/introduction-using-diff-and-patch-tutorial reference tutorial on diff and patch]) |
Andypflueger (talk | contribs) m |
||
(7 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
+ | This is an "advanced" technique for install scripts to | ||
+ | |||
+ | * Reduce the size of install scripts | ||
+ | * Make them more forward compatible for the future | ||
+ | * Make them more robust | ||
+ | |||
+ | == The Idea == | ||
+ | |||
+ | The idea is simple: install by hand, make changes to make it work, then compare against the pristine sources, generating a patch that later does automatically what you did by hand | ||
+ | |||
+ | * Setup the app for installation as a webapp (say in html). Save a pristine copy as html.orign | ||
+ | * Make changes in html/ only | ||
+ | * Find out the diff of what you made: | ||
+ | diff -r -N -b -u html.orig html > app-patch.diff | ||
+ | * This then can go into the install script as follows: | ||
+ | patch -p0 -E << 'EOF' | ||
+ | .... contents of app-patch.diff here .... | ||
+ | 'EOF' | ||
+ | |||
+ | Note: If patching a single file above, after the 'patch -p0 -E' and before the '<< EOF', insert the filename of file to be patched. Otherwise, installer will attempt to prompt for File to patch and then skip immediately since its automated. | ||
+ | |||
+ | |||
+ | == Testing the patch ahead of time == | ||
+ | |||
+ | It is strongly encouraged that you test the patch before attempting trial-and-error runs in the install script, which can be time consuming and error prone. This is basically simulating the install script applying the patch. | ||
+ | |||
+ | To do this, do this: | ||
+ | |||
+ | mv html html.modified | ||
+ | cp -a html.orig html | ||
+ | mv html.orig html.pristine | ||
+ | |||
+ | (the last step is to prevent patch from accidentally patching html.orig) | ||
+ | |||
+ | then try your patch against html dir (which is now like the original): | ||
+ | |||
+ | patch -p0 -E < app-patch.diff | ||
+ | |||
+ | There is a --dry-run option for patch that lends itself useful for previewing the patch without it actually patching files. | ||
+ | |||
+ | Doing this '''will''' save you a lot of trial-and-error in the installer. | ||
+ | |||
+ | If you have an problems, remove html and then | ||
+ | |||
+ | cp -a html.pristine html | ||
+ | |||
+ | (or unpack the app again and rename it to make the root html/) | ||
== References == | == References == | ||
* Good [http://www.linuxtutorialblog.com/post/introduction-using-diff-and-patch-tutorial reference tutorial on diff and patch] | * Good [http://www.linuxtutorialblog.com/post/introduction-using-diff-and-patch-tutorial reference tutorial on diff and patch] | ||
+ | * [http://stephenjungels.com/jungels.net/articles/diff-patch-ten-minutes.html Ten minute guide to diff and patch] |
Latest revision as of 17:51, 12 September 2009
This is an "advanced" technique for install scripts to
- Reduce the size of install scripts
- Make them more forward compatible for the future
- Make them more robust
The Idea
The idea is simple: install by hand, make changes to make it work, then compare against the pristine sources, generating a patch that later does automatically what you did by hand
- Setup the app for installation as a webapp (say in html). Save a pristine copy as html.orign
- Make changes in html/ only
- Find out the diff of what you made:
diff -r -N -b -u html.orig html > app-patch.diff
- This then can go into the install script as follows:
patch -p0 -E << 'EOF' .... contents of app-patch.diff here .... 'EOF'
Note: If patching a single file above, after the 'patch -p0 -E' and before the '<< EOF', insert the filename of file to be patched. Otherwise, installer will attempt to prompt for File to patch and then skip immediately since its automated.
Testing the patch ahead of time
It is strongly encouraged that you test the patch before attempting trial-and-error runs in the install script, which can be time consuming and error prone. This is basically simulating the install script applying the patch.
To do this, do this:
mv html html.modified cp -a html.orig html mv html.orig html.pristine
(the last step is to prevent patch from accidentally patching html.orig)
then try your patch against html dir (which is now like the original):
patch -p0 -E < app-patch.diff
There is a --dry-run option for patch that lends itself useful for previewing the patch without it actually patching files.
Doing this will save you a lot of trial-and-error in the installer.
If you have an problems, remove html and then
cp -a html.pristine html
(or unpack the app again and rename it to make the root html/)