textutil::patch - Application of uni-diff patches to directory trees


package require Tcl 8.2

package require textutil::patch ?0.1?

::textutil::patch::apply basedirectory striplevel patch reportcmd

{*}reportcmd apply filename

{*}reportcmd fail filename hunk expected seen

{*}reportcmd fail-already filename hunk ______________________________________________________________________________


This package provides a single command which applies a patch in unified format [] to a directory tree.
basedirectory striplevel patch reportcmd

Applies the patch (text of the path, not file) to the files in the basedirectory using the specified striplevel. The result of the command is the empty string.

The striplevel argument is equivalent to option -p of the patch command.

Errors are thrown when the patch does not parse, and nothing is done to the files in basedirectory.

All activities during the application of the patch, including the inability to apply a hunk are reported through the command prefix reportcmd instead. Files with problems are left unchanged. Note however that this does not prevent changes to files with no problems, before and after the problematic file(s).

The command prefix is called in 3 possible forms:
{*}reportcmd apply

The caller begins operation on file fname, applying all hunks collected for said file.

{*}reportcmd fail filename hunk expected seen

Application of hunk number hunk of file filename has failed. The command expected to find the text expected, and saw seen instead.

{*}reportcmd fail-already filename hunk

Application of hunk number hunk of file filename has failed. The command believes that this hunk has already been applied to the file.


This document, and the package it describes, will undoubtedly contain bugs and other problems. Please report such in the category textutil of the Tcllib Trackers []. Please also report any ideas for enhancements you may have for either package and/or documentation.

When proposing code changes, please provide unified diffs, i.e the output of diff -u.

Note further that attachments are strongly preferred over inlined patches. Attachments can be made by going to the Edit form of the ticket immediately after its creation, and then using the left-most button in the secondary navigation bar.


diff -ruN, diff, unified format, fossil, git, patch, unified format diff


Text processing