Re: let git-diff allow patch to delete empty files?
- From
- Sam Liddicott <sam@liddicott.com>
- Date
- Nov 5, 2008, 13:07 UTC
- Message-ID
- <4911B297.2070800@liddicott.com>
- In-Reply-To
- <49118FEE.30408@liddicott.com>
* Sam Liddicott wrote, On 05/11/08 12:22:
Show 19 quoted lines
> In some cases "patch" cannot apply diff's generated using git-diff, I've > had a "git diff" output look like this when an empty file was removed as > the only change: > > .. > However this equivalent pair works by making the file non-empty and then > deleting it. > > diff -Nru 1/here 2/here > --- 1/here 2008-11-05 09:43:55.000000000 +0000 > +++ 2/here 2008-11-05 09:43:58.000000000 +0000 > @@ -0,0 +1 @@ > + > diff -Nru 1/here 2/here > --- 1/here 2008-11-05 09:37:23.000000000 +0000 > +++ 2/here 1970-01-01 01:00:00.000000000 +0100 > @@ -1 +0,0 @@ > - >
The same problem occurs with new empty files.
Attached is an awk filter which will expand out these git notes into the 2-part unified diff's. It would be nicer if git did it natively. Sam
#! /usr/bin/awk -f
function do_empty() {
if (diff!="" && deleted!="" && indx!="") {
printf("Make patch give the file 1 line\n");
printf("--- %s\n",diff);
printf("+++ %s\n",diff);
printf("@@ -0,0 +1 @@\n+\n");
printf("Make patch delete the 1 line file\n");
printf("--- %s\t\n",diff);
printf("+++ /dev/null\t1970-01-01 01:00:00.000000000\n");
printf("@@ -1 +0,0 @@\n-\n");
}
if (diff!="" && created!="" && indx!="") {
printf("Make patch create the file with 1 line\n");
printf("--- %s\n",diff);
printf("+++ %s\n",diff);
printf("@@ -0,0 +1 @@\n+\n");
printf("Make patch create delete the line but keep the file\n");
printf("--- %s\n",diff);
printf("+++ %s\n",diff);
printf("@@ -1 +0,0 @@\n-\n");
}
no_empty();
}function no_empty() {
diff="";
deleted="";
created="";
indx="";
}{
if (in_hunk > 0) in_hunk--;
}/^diff --git / {
do_empty();
if (! in_hunk) diff=$3;
}/^deleted file mode / {
if (! in_hunk && diff!="") deleted=$0;
}/^new file mode / {
if (! in_hunk && diff!="") created=$0;
}/^index / {
if (! in_hunk && diff!="") indx=$0;
}/^--- / {
no_empty();
}/^@@ / {
# read the hunk size
p=index($2,",");
if (p==0) c1=1;
else c1=strtonum(substr($2, p+1));p=index($3,","); if (p==0) in_hunk=1; else in_hunk=strtonum(substr($2, p+1));
if (c1 > in_hunk) in_hunk=c1; }
{
print;
}END {
do_empty();
}