git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: let git-diff allow patch to delete empty files?

From
SLSam 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();
}
Previous: Sam LiddicottNext: Nanako Shiraishi
Message 2 of 4 in “let git-diff allow patch to delete empty files?”
  1. Sam LiddicottNov 5, 2008
  2. Sam LiddicottNov 5, 2008
  3. Nanako ShiraishiNov 5, 2008
  4. Sam LiddicottNov 6, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.