зеркало из https://github.com/microsoft/git.git
diff: use tempfile module
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:
Родитель
6e122b449b
Коммит
284098f13f
46
diff.c
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))) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче