diff options
author | Ori Bernstein <ori@eigenstate.org> | 2020-09-21 09:40:42 -0700 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2020-09-21 09:40:42 -0700 |
commit | 8fe1d622b5b46dee51db6581282ec1fba76782b1 (patch) | |
tree | d7dca8fed3bc7ecf6e4fe1cb8e83fb0463befb71 | |
parent | aa7c8cac1145d0cd6e9117deaa1f8c9f418bca17 (diff) |
diff: support unified diff via -u
The format produced by `diff -u` is inferior to that
produced by `diff -c`, but it's what ape/patch and
unix patch expect, so it's useful to generate it.
This patch adds `diff -u`.
-rw-r--r-- | sys/man/1/diff | 20 | ||||
-rw-r--r-- | sys/src/cmd/diff/diff.h | 1 | ||||
-rw-r--r-- | sys/src/cmd/diff/diffio.c | 34 | ||||
-rw-r--r-- | sys/src/cmd/diff/diffreg.c | 1 | ||||
-rw-r--r-- | sys/src/cmd/diff/main.c | 1 |
5 files changed, 46 insertions, 11 deletions
diff --git a/sys/man/1/diff b/sys/man/1/diff index 91d3d491a..771ccc83f 100644 --- a/sys/man/1/diff +++ b/sys/man/1/diff @@ -4,7 +4,7 @@ diff \- differential file comparator .SH SYNOPSIS .B diff [ -.B -abcefmnrw +.B -abcefmnruw ] .I file1 ... file2 .SH DESCRIPTION @@ -143,6 +143,24 @@ The .B -a flag displays the entire file as context. .PP +The +.B -u +option provides a unix-compatible unified diff. +This format is similar to that provided by +.BR -c . +However, the +.L + +and +.L - +prefixes are not separated from the rest of the line by spaces, +and the file header is in the following format: +.IP +.EX +--- filename.old ++++ filename.new +@@ -line,len +line,len @@ +.EE +.PP Except in rare circumstances, .I diff finds a smallest sufficient set of file diff --git a/sys/src/cmd/diff/diff.h b/sys/src/cmd/diff/diff.h index 76fe050df..34a5dc010 100644 --- a/sys/src/cmd/diff/diff.h +++ b/sys/src/cmd/diff/diff.h @@ -22,5 +22,6 @@ Biobuf *prepare(int, char *); void panic(int, char *, ...); void check(Biobuf *, Biobuf *); void change(int, int, int, int); +void fileheader(void); void flushchanges(void); diff --git a/sys/src/cmd/diff/diffio.c b/sys/src/cmd/diff/diffio.c index 640f2d2ba..d937b1fef 100644 --- a/sys/src/cmd/diff/diffio.c +++ b/sys/src/cmd/diff/diffio.c @@ -303,6 +303,7 @@ change(int a, int b, int c, int d) break; case 'c': case 'a': + case 'u': if(nchanges%1024 == 0) changes = erealloc(changes, (nchanges+1024)*sizeof(changes[0])); ch = &changes[nchanges++]; @@ -339,6 +340,15 @@ changeset(int i) } void +fileheader(void) +{ + if(mode != 'u') + return; + Bprint(&stdout, "--- %s\n", file1); + Bprint(&stdout, "+++ %s\n", file2); +} + +void flushchanges(void) { int a, b, c, d, at; @@ -368,20 +378,24 @@ flushchanges(void) d = len[1]; j = nchanges; } - Bprint(&stdout, "%s:", file1); - range(a, b, ","); - Bprint(&stdout, " - "); - Bprint(&stdout, "%s:", file2); - range(c, d, ","); - Bputc(&stdout, '\n'); + if(mode == 'u'){ + Bprint(&stdout, "@@ -%d,%d +%d,%d @@\n", a, b-a+1, c, d-c+1); + }else{ + Bprint(&stdout, "%s:", file1); + range(a, b, ","); + Bprint(&stdout, " - "); + Bprint(&stdout, "%s:", file2); + range(c, d, ","); + Bputc(&stdout, '\n'); + } at = a; for(; i<j; i++){ - fetch(ixold, at, changes[i].a-1, input[0], " "); - fetch(ixold, changes[i].a, changes[i].b, input[0], "- "); - fetch(ixnew, changes[i].c, changes[i].d, input[1], "+ "); + fetch(ixold, at, changes[i].a-1, input[0], mode == 'u' ? " " : " "); + fetch(ixold, changes[i].a, changes[i].b, input[0], mode == 'u' ? "-" : "- "); + fetch(ixnew, changes[i].c, changes[i].d, input[1], mode == 'u' ? "+" : "- "); at = changes[i].b+1; } - fetch(ixold, at, b, input[0], " "); + fetch(ixold, at, b, input[0], mode == 'u' ? " " : " "); } nchanges = 0; } diff --git a/sys/src/cmd/diff/diffreg.c b/sys/src/cmd/diff/diffreg.c index 7ef855994..6f6f144fc 100644 --- a/sys/src/cmd/diff/diffreg.c +++ b/sys/src/cmd/diff/diffreg.c @@ -285,6 +285,7 @@ output(void) m = len[0]; J[0] = 0; J[m+1] = len[1]+1; + fileheader(); if (mode != 'e') { for (i0 = 1; i0 <= m; i0 = i1+1) { while (i0 <= m && J[i0] == J[i0-1]+1) diff --git a/sys/src/cmd/diff/main.c b/sys/src/cmd/diff/main.c index 054f4c878..a25168cec 100644 --- a/sys/src/cmd/diff/main.c +++ b/sys/src/cmd/diff/main.c @@ -192,6 +192,7 @@ main(int argc, char *argv[]) case 'n': case 'c': case 'a': + case 'u': mode = *p; break; |