Also add some code comments explaining how the fields in "struct
diff_tempfile" are used.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Michael Haggerty 2015-08-12 19:12:01 +02:00 коммит произвёл Junio C Hamano
Родитель 6e122b449b
Коммит 284098f13f
1 изменённых файлов: 23 добавлений и 23 удалений

46
diff.c
Просмотреть файл

@ -2,6 +2,7 @@
* Copyright (C) 2005 Junio C Hamano * Copyright (C) 2005 Junio C Hamano
*/ */
#include "cache.h" #include "cache.h"
#include "tempfile.h"
#include "quote.h" #include "quote.h"
#include "diff.h" #include "diff.h"
#include "diffcore.h" #include "diffcore.h"
@ -308,11 +309,26 @@ static const char *external_diff(void)
return external_diff_cmd; return external_diff_cmd;
} }
/*
* Keep track of files used for diffing. Sometimes such an entry
* refers to a temporary file, sometimes to an existing file, and
* sometimes to "/dev/null".
*/
static struct diff_tempfile { static struct diff_tempfile {
const char *name; /* filename external diff should read from */ /*
* filename external diff should read from, or NULL if this
* entry is currently not in use:
*/
const char *name;
char hex[41]; char hex[41];
char mode[10]; char mode[10];
char tmp_path[PATH_MAX];
/*
* If this diff_tempfile instance refers to a temporary file,
* this tempfile object is used to manage its lifetime.
*/
struct tempfile tempfile;
} diff_temp[2]; } diff_temp[2];
typedef unsigned long (*sane_truncate_fn)(char *line, unsigned long len); typedef unsigned long (*sane_truncate_fn)(char *line, unsigned long len);
@ -564,25 +580,16 @@ static struct diff_tempfile *claim_diff_tempfile(void) {
die("BUG: diff is failing to clean up its tempfiles"); die("BUG: diff is failing to clean up its tempfiles");
} }
static int remove_tempfile_installed;
static void remove_tempfile(void) static void remove_tempfile(void)
{ {
int i; int i;
for (i = 0; i < ARRAY_SIZE(diff_temp); i++) { for (i = 0; i < ARRAY_SIZE(diff_temp); i++) {
if (diff_temp[i].name == diff_temp[i].tmp_path) if (is_tempfile_active(&diff_temp[i].tempfile))
unlink_or_warn(diff_temp[i].name); delete_tempfile(&diff_temp[i].tempfile);
diff_temp[i].name = NULL; diff_temp[i].name = NULL;
} }
} }
static void remove_tempfile_on_signal(int signo)
{
remove_tempfile();
sigchain_pop(signo);
raise(signo);
}
static void print_line_count(FILE *file, int count) static void print_line_count(FILE *file, int count)
{ {
switch (count) { switch (count) {
@ -2817,8 +2824,7 @@ static void prep_temp_blob(const char *path, struct diff_tempfile *temp,
strbuf_addstr(&template, "XXXXXX_"); strbuf_addstr(&template, "XXXXXX_");
strbuf_addstr(&template, base); strbuf_addstr(&template, base);
fd = git_mkstemps(temp->tmp_path, PATH_MAX, template.buf, fd = mks_tempfile_ts(&temp->tempfile, template.buf, strlen(base) + 1);
strlen(base) + 1);
if (fd < 0) if (fd < 0)
die_errno("unable to create temp-file"); die_errno("unable to create temp-file");
if (convert_to_working_tree(path, if (convert_to_working_tree(path,
@ -2828,8 +2834,8 @@ static void prep_temp_blob(const char *path, struct diff_tempfile *temp,
} }
if (write_in_full(fd, blob, size) != size) if (write_in_full(fd, blob, size) != size)
die_errno("unable to write temp-file"); die_errno("unable to write temp-file");
close(fd); close_tempfile(&temp->tempfile);
temp->name = temp->tmp_path; temp->name = get_tempfile_path(&temp->tempfile);
strcpy(temp->hex, sha1_to_hex(sha1)); strcpy(temp->hex, sha1_to_hex(sha1));
temp->hex[40] = 0; temp->hex[40] = 0;
sprintf(temp->mode, "%06o", mode); sprintf(temp->mode, "%06o", mode);
@ -2854,12 +2860,6 @@ static struct diff_tempfile *prepare_temp_file(const char *name,
return temp; return temp;
} }
if (!remove_tempfile_installed) {
atexit(remove_tempfile);
sigchain_push_common(remove_tempfile_on_signal);
remove_tempfile_installed = 1;
}
if (!S_ISGITLINK(one->mode) && if (!S_ISGITLINK(one->mode) &&
(!one->sha1_valid || (!one->sha1_valid ||
reuse_worktree_file(name, one->sha1, 1))) { reuse_worktree_file(name, one->sha1, 1))) {