diffutils: patch and Tradition

 
 10.13 GNU 'patch' and Traditional 'patch'
 =========================================
 
 The current version of GNU 'patch' normally follows the POSIX standard.
 ⇒patch and POSIX, for the few exceptions to this general rule.
 
    Unfortunately, POSIX redefined the behavior of 'patch' in several
 important ways.  You should be aware of the following differences if you
 must interoperate with traditional 'patch', or with GNU 'patch' version
 2.1 and earlier.
 
    * In traditional 'patch', the '-p' option's operand was optional, and
      a bare '-p' was equivalent to '-p0'.  The '-p' option now requires
      an operand, and '-p 0' is now equivalent to '-p0'.  For maximum
      compatibility, use options like '-p0' and '-p1'.
 
      Also, traditional 'patch' simply counted slashes when stripping
      path prefixes; 'patch' now counts pathname components.  That is, a
      sequence of one or more adjacent slashes now counts as a single
      slash.  For maximum portability, avoid sending patches containing
      '//' in file names.
 
    * In traditional 'patch', backups were enabled by default.  This
      behavior is now enabled with the '--backup' ('-b') option.
 
      Conversely, in POSIX 'patch', backups are never made, even when
      there is a mismatch.  In GNU 'patch', this behavior is enabled with
      the '--no-backup-if-mismatch' option, or by conforming to POSIX.
 
      The '-b SUFFIX' option of traditional 'patch' is equivalent to the
      '-b -z SUFFIX' options of GNU 'patch'.
 
    * Traditional 'patch' used a complicated (and incompletely
      documented) method to intuit the name of the file to be patched
      from the patch header.  This method did not conform to POSIX, and
      had a few gotchas.  Now 'patch' uses a different, equally
      complicated (but better documented) method that is optionally
      POSIX-conforming; we hope it has fewer gotchas.  The two methods
      are compatible if the file names in the context diff header and the
      'Index:' line are all identical after prefix-stripping.  Your patch
      is normally compatible if each header's file names all contain the
      same number of slashes.
 
    * When traditional 'patch' asked the user a question, it sent the
      question to standard error and looked for an answer from the first
      file in the following list that was a terminal: standard error,
      standard output, '/dev/tty', and standard input.  Now 'patch' sends
      questions to standard output and gets answers from '/dev/tty'.
      Defaults for some answers have been changed so that 'patch' never
      goes into an infinite loop when using default answers.
 
    * Traditional 'patch' exited with a status value that counted the
      number of bad hunks, or with status 1 if there was real trouble.
      Now 'patch' exits with status 1 if some hunks failed, or with 2 if
      there was real trouble.
 
    * Limit yourself to the following options when sending instructions
      meant to be executed by anyone running GNU 'patch', traditional
      'patch', or a 'patch' that conforms to POSIX. Spaces are
      significant in the following list, and operands are required.
 
           -c
           -d DIR
           -D DEFINE
           -e
           -l
           -n
           -N
           -o OUTFILE
           -pNUM
           -R
           -r REJECTFILE