From db62807215cbe26b83a354954b7433aa5d90c149 Mon Sep 17 00:00:00 2001 From: Russell Belfer Date: Fri, 11 May 2012 12:16:19 -0700 Subject: [PATCH] Fixed leaks and added tests --- src/repository.c | 31 ++++++++++++++----------------- tests-clar/repo/init.c | 24 ++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/repository.c b/src/repository.c index 9031c5956..c5eed531b 100644 --- a/src/repository.c +++ b/src/repository.c @@ -713,31 +713,28 @@ static int repo_write_template( const char *git_dir, const char *file, mode_t mode, const char *content) { git_buf path = GIT_BUF_INIT; - int fd; + int fd, error = 0; if (git_buf_joinpath(&path, git_dir, file) < 0) return -1; fd = p_open(git_buf_cstr(&path), O_WRONLY | O_CREAT | O_EXCL, mode); - if (fd < 0) { - git_buf_free(&path); - if (errno == EEXIST) - return 0; - goto fail; + + if (fd >= 0) { + error = p_write(fd, content, strlen(content)); + + p_close(fd); } + else if (errno != EEXIST) + error = fd; - if (p_write(fd, content, strlen(content)) < 0) - goto fail; - - p_close(fd); - - return 0; - -fail: git_buf_free(&path); - giterr_set(GITERR_OS, - "Failed to initialize repository with template '%s'", file); - return -1; + + if (error) + giterr_set(GITERR_OS, + "Failed to initialize repository with template '%s'", file); + + return error; } static int repo_init_structure(const char *git_dir, int is_bare) diff --git a/tests-clar/repo/init.c b/tests-clar/repo/init.c index a12a2c2fb..7f16b5b7c 100644 --- a/tests-clar/repo/init.c +++ b/tests-clar/repo/init.c @@ -141,3 +141,27 @@ void test_repo_init__reinit_too_recent_bare_repo(void) cl_fixture_cleanup("reinit.git"); } + +void test_repo_init__additional_templates(void) +{ + git_buf path = GIT_BUF_INIT; + + cl_set_cleanup(&cleanup_repository, "tester"); + + ensure_repository_init("tester", 0, "tester/.git/", "tester/"); + + cl_git_pass( + git_buf_joinpath(&path, git_repository_path(_repo), "description")); + cl_assert(git_path_isfile(git_buf_cstr(&path))); + + cl_git_pass( + git_buf_joinpath(&path, git_repository_path(_repo), "info/exclude")); + cl_assert(git_path_isfile(git_buf_cstr(&path))); + + cl_git_pass( + git_buf_joinpath(&path, git_repository_path(_repo), "hooks")); + cl_assert(git_path_isdir(git_buf_cstr(&path))); + /* won't confirm specific contents of hooks dir since it may vary */ + + git_buf_free(&path); +}