Merge branch 'ae/better-template-failure-report' into maint

* ae/better-template-failure-report:
  Improve error messages when temporary file creation fails
This commit is contained in:
Junio C Hamano 2011-03-20 22:09:39 -07:00
Родитель c3786c8472 6cf6bb3e47
Коммит a8e04ddf6e
4 изменённых файлов: 56 добавлений и 4 удалений

Просмотреть файл

@ -435,6 +435,7 @@ TEST_PROGRAMS_NEED_X += test-subprocess
TEST_PROGRAMS_NEED_X += test-svn-fe
TEST_PROGRAMS_NEED_X += test-treap
TEST_PROGRAMS_NEED_X += test-index-version
TEST_PROGRAMS_NEED_X += test-mktemp
TEST_PROGRAMS = $(patsubst %,%$X,$(TEST_PROGRAMS_NEED_X))

Просмотреть файл

@ -12,4 +12,17 @@ test_expect_success 'character classes (isspace, isalpha etc.)' '
test-ctype
'
test_expect_success 'mktemp to nonexistent directory prints filename' '
test_must_fail test-mktemp doesnotexist/testXXXXXX 2>err &&
grep "doesnotexist/test" err
'
test_expect_success POSIXPERM 'mktemp to unwritable directory prints filename' '
mkdir cannotwrite &&
chmod -w cannotwrite &&
test_when_finished "chmod +w cannotwrite" &&
test_must_fail test-mktemp cannotwrite/testXXXXXX 2>err &&
grep "cannotwrite/test" err
'
test_done

14
test-mktemp.c Normal file
Просмотреть файл

@ -0,0 +1,14 @@
/*
* test-mktemp.c: code to exercise the creation of temporary files
*/
#include "git-compat-util.h"
int main(int argc, char *argv[])
{
if (argc != 2)
usage("Expected 1 parameter defining the temporary file template");
xmkstemp(xstrdup(argv[1]));
return 0;
}

Просмотреть файл

@ -198,10 +198,22 @@ FILE *xfdopen(int fd, const char *mode)
int xmkstemp(char *template)
{
int fd;
char origtemplate[PATH_MAX];
strlcpy(origtemplate, template, sizeof(origtemplate));
fd = mkstemp(template);
if (fd < 0)
die_errno("Unable to create temporary file");
if (fd < 0) {
int saved_errno = errno;
const char *nonrelative_template;
if (!template[0])
template = origtemplate;
nonrelative_template = make_nonrelative_path(template);
errno = saved_errno;
die_errno("Unable to create temporary file '%s'",
nonrelative_template);
}
return fd;
}
@ -321,10 +333,22 @@ int gitmkstemps(char *pattern, int suffix_len)
int xmkstemp_mode(char *template, int mode)
{
int fd;
char origtemplate[PATH_MAX];
strlcpy(origtemplate, template, sizeof(origtemplate));
fd = git_mkstemp_mode(template, mode);
if (fd < 0)
die_errno("Unable to create temporary file");
if (fd < 0) {
int saved_errno = errno;
const char *nonrelative_template;
if (!template[0])
template = origtemplate;
nonrelative_template = make_nonrelative_path(template);
errno = saved_errno;
die_errno("Unable to create temporary file '%s'",
nonrelative_template);
}
return fd;
}