Creating And Using Unix Patch Files

$ cd ~/bin/src/patchdemo
$ cp -R foo-1.0/ foo-1.1
$ vi foo-1.1/*
$ ls -lR
.:
total 52
drwxr-x--- 2 wpollock wpollock  4096 2008-04-22 03:21 foo-0.99
drwxr-x--- 2 wpollock wpollock  4096 2008-04-23 03:20 foo-1.0
drwxr-x--- 2 wpollock wpollock  4096 2008-04-23 04:56 foo-1.1

./foo-0.99:
total 16
-rw-r----- 1 wpollock wpollock 692 2008-04-22 03:20 foo.c
-rw-r----- 1 wpollock wpollock   5 2008-04-22 03:21 patchlevel.h

./foo-1.0:
total 16
-rw-r----- 1 wpollock wpollock 692 2008-04-23 02:52 foo.c
-rw-r----- 1 wpollock wpollock   4 2008-04-23 03:20 patchlevel.h

./foo-1.1:
total 16
-rw-r----- 1 wpollock wpollock 759 2008-04-23 04:51 foo.c
-rw-r----- 1 wpollock wpollock   4 2008-04-23 04:57 patchlevel.h

$ LC_ALL=POSIX TZ=UTC0 diff -Naur foo-1.0/ foo-1.1/ > foo-1.1.patch

$ vi foo-1.1.patch   # Moved patchlevel.h diff to top, added junk
$ cat foo-1.1.patch  # Added lines shown as highlighted
Demo patch file to update foo.c from version 1.0 to version 1.1
Written 4/2008 by Wayne Pollock, Tampa Florida USA

Prereq: 1.0
diff -Naur foo-1.0/patchlevel.h foo-1.1/patchlevel.h
--- foo-1.0/patchlevel.h        2008-04-23 07:20:22.000000000 +0000
+++ foo-1.1/patchlevel.h        2008-04-23 08:57:14.000000000 +0000
@@ -1 +1 @@
-1.0
+1.1

diff -Naur foo-1.0/foo.c foo-1.1/foo.c
--- foo-1.0/foo.c       2008-04-23 06:52:59.000000000 +0000
+++ foo-1.1/foo.c       2008-04-23 08:51:47.000000000 +0000
@@ -1,3 +1,5 @@
+/* This version fixes the lorum ipsum bug. */
+
 #define _POSIX_SOURCE 1

 #include <sys/types.h>
@@ -5,19 +7,19 @@
 #include <string.h>
 #include <stdio.h>

-int main ( void )
-{
+int main ( void ) {
    regex_t pbuf;
    char data[4096];
    char* s;

-fprintf(stderr, "start\n");
-   strcpy( data, "line one doesn't match\nfoooob\nbaaar\n\n" );
+fprintf(stderr, "Start:\n");
+   strcpy( data, "line one doesn't match\nfoob\nbaar\n\n" );
    s = strtok( data, "\n" );

 fprintf(stderr, "debug: before regcomp, s=%s\n", s );
    regcomp( &pbuf, "fo+", REG_EXTENDED | REG_NOSUB );
-fprintf(stderr, "devug: before while, s=%s\n", s );
+fprintf(stderr, "debug: before while, s=%s\n", s );
+
    while ( s != NULL )
    {
       fprintf(stderr, "debug: s=%s\n", s );
@@ -26,6 +28,7 @@
       s = strtok( NULL, "\n" );
    }

+   /* lorum ipsum */
    regfree( &pbuf );
    return 0;
 }

$ cd foo-1.0
$ LC_ALL=POSIX patch -Zp1 --dry-run <../foo-1.1.patch
patching file patchlevel.h
patching file foo.c
$ LC_ALL=POSIX patch --verbose -Zp1 --dry-run <../foo-1.1.patch
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|Demo patch file to update foo from version 1.0 to version 1.1
|Written 4/2008 by Wayne Pollock, Tampa Florida USA
|
|Prereq: 1.0
|diff -Naur foo-1.0/patchlevel.h foo-1.1/patchlevel.h
|--- foo-1.0/patchlevel.h       2008-04-23 03:20:22.000000000 -0400
|+++ foo-1.1/patchlevel.h       2008-04-23 04:57:14.000000000 -0400
--------------------------
Good.  This file appears to be the 1.0 version.
Patching file patchlevel.h using Plan A...
Hunk #1 succeeded at 1.
Hmm...  The next patch looks like a unified diff to me...
The text leading up to this was:
--------------------------
|
|diff -Naur foo-1.0/foo.c foo-1.1/foo.c
|--- foo-1.0/foo.c      2008-04-23 02:52:59.000000000 -0400
|+++ foo-1.1/foo.c      2008-04-23 04:51:47.000000000 -0400
--------------------------
Patching file foo.c using Plan A...
Hunk #1 succeeded at 1.
Hunk #2 succeeded at 7.
Hunk #3 succeeded at 28.
done
$ cd ../foo-0.99
$ LC_ALL=POSIX patch -Zp1 --dry-run <../foo-1.1.patch
This file doesn't appear to be the 1.0 version -- patch anyway? [n] n
patch: **** aborted
$ LC_ALL=POSIX patch --verbose -Zp1 --dry-run <../foo-1.1.patch
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|Demo patch file to update foo from version 1.0 to version 1.1
|Written 4/2008 by Wayne Pollock, Tampa Florida USA
|
|Prereq: 1.0
|diff -Naur foo-1.0/patchlevel.h foo-1.1/patchlevel.h
|--- foo-1.0/patchlevel.h	2008-04-23 03:20:22.000000000 -0400
|+++ foo-1.1/patchlevel.h	2008-04-23 04:57:14.000000000 -0400
--------------------------
This file doesn't appear to be the 1.0 version -- patch anyway? [n] y
Patching file patchlevel.h using Plan A...
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED -- saving rejects to file patchlevel.h.rej
Hmm...  The next patch looks like a unified diff to me...
The text leading up to this was:
--------------------------
|
|diff -Naur foo-1.0/foo.c foo-1.1/foo.c
|--- foo-1.0/foo.c	2008-04-23 02:52:59.000000000 -0400
|+++ foo-1.1/foo.c	2008-04-23 04:51:47.000000000 -0400
--------------------------
Patching file foo.c using Plan A...
Hunk #1 succeeded at 1.
Hunk #2 succeeded at 7.
Hunk #3 succeeded at 28.
done
$ cat patchlevel.h
0.99