Last updated 18 January 2017.

Command Line, or GUI?

The patch program is included with Mac OS X, but you need to use it from the command line via Terminal.app. See HowTo: Apply patches for details on how to use patch.

If you'd rather use a GUI solution, check out Apple's Xcode Tools. Note that you'll have to signup as a 'developer', but there's no charge to do so. This will install diff, cvs, and a whole suite of Apple and open-source development tools.

Applying the patch using Terminal

First, make a backup of the original .module file and save it outside of the module's directory.

Next, download a copy of the desired patch, saving it to the same directory as your original example.module.

Now, make sure that the module you're patching is the correct version for the downloaded patch. You can check this by peeking at the example.patch file with any plain-text editor, and looking at the revision number. It should look something vaguely like diff -u -r1.51 example.module. That's what the patch program is going to look for: version 1.51 of the example.module. If the version in the patch file is different from the original module's version number, errors will appear in Terminal and you'll sit there staring at the screen, intensely frustrated, before loping off to pour yourself a drink. Make sure to close the file without saving any changes.

Open your Mac's Terminal application, which can be found in the Applications > Utilities folder. You'll see an open window called a shell that reads something vaguely like this:

Last login: Thu Jan  4 13:59:50 on ttyp1
Welcome to Darwin!
Administrators-Computer:~ admin$

Using the 'cd' command, navigate to the module folder that contains both the example.module and the newly downloaded example.patch file.
(e.g. "cd ~/Users/Sites/drupal5/sites/all/modules/example_module/")
Hint: You can drag a folder or a file from any Finder window onto the Terminal window, and the pathname will be auto-filled for you. Just type "cd " (note the space), and then drag your desired folder/file onto the Terminal window. This method saves a *lot* of typing, and the possibility of misspelled folder names during this process.

Once you're in the correct folder, run this command using the exact name of the patch file:

$ patch < example.patch
(note: do not type the dollar sign. That is the command line prompt.)

And voila! If the patching was successful then you will see one or more lines such as "patching file example.extension" followed by a new $ prompt and a flashing cursor (which is Unix' way of being really, really excited that something worked.) The original module, example.module, is now patched and ready for action. Yep, it's just that easy! You can now close the Terminal window and go pour yourself a well-deserved drink.

If you are patching core then remember to patch from the drupal root directory and use the -p0 parameter to patch. This will stop patch from asking you which file you wish to patch:

$ patch -p0 < example.patch

If your patch is patching files that mention a & b directories in the patch, you can use the -p1 parameter to get rid of the a/b directories.

$ patch -p1 < example.patch

To fix code style issues in the patch, you can use tab2space like so:

tab2space -unix -t2 foo.patch | patch -p0

Additional Reading Material

Apple's User Manual on the patch command has some good info as well. http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/...

1. use --dry-run after the command to see what will happen without actually making any changes -- for instance,

patch < the_patch_file.patch --dry-run

2. use -b to always make a backup of the original file (the default behavior is to only make a backup if there was a problem). The backup will have the suffix ".orig".

3. You can always type "patch --help" to see more options, such as how to change the backup suffix.

Comments

espirates’s picture

It appears that this only patches files inside the parent directory but not in subdirectories is this correct ? How to set it up to patch other files in subfolders ?

msathesh’s picture

Its a good start to learn about the patches.. thanks..

Doneeo’s picture

Thank you, it was really helpful!

misterT’s picture

The link at the top of the page to "HowTo Apply patches" at http://drupal.org/node/60108 gives me an access denied page.

Balbo’s picture

+1

waltf’s picture

does anyone have a tutorial for patching with xcode?

thomas1977’s picture

Would like this as well.

zJoriz’s picture

Exactly what I was looking for.

sui_page’s picture

Why I am i getting invalid command when i type ' patch < example.patch' ?

PetarB’s picture

You do not type 'patch < example.patch' - you replace 'example.patch' with the filename of your new patch file.

fineartist99’s picture

When I do that I get a notification in terminal " No such file or directory"

Here's a complete copy/paste of my terminal window

Mikess-iMac-2:~ mikebaran$ /Users/mikebaran/Downloads/uc_option_image
-bash: /Users/mikebaran/Downloads/uc_option_image: is a directory
Mikess-iMac-2:~ mikebaran$ patch < uc_option_image_capitalization_tweak.patch
-bash: uc_option_image_capitalization_tweak.patch: No such file or directory
Mikess-iMac-2:~ mikebaran$

The patches name is "uc_option_image_capitalization_tweak.patch" so as you can see I've replaced the example.patch with my patches name. So it looks like

patch < uc_option_image_capitalization_tweak.patch

AND might I add, the "uc_option_image_capitalization_tweak.patch" patch file is located in the "uc_option_image" directory. Please let me know what I did wrong and how I can get this patch working, thanks.

submit.dk’s picture

Thank you, this was really helpfull

www.submit.dk/drupal