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