Checkout: use caller's flags for open()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
diff --git a/src/checkout.c b/src/checkout.c
index 32cb3c8..0520547 100644
--- a/src/checkout.c
+++ b/src/checkout.c
@@ -64,8 +64,14 @@ static int blob_contents_to_file(git_repository *repo, git_buf *fnbuf,
const git_oid *id, tree_walk_data *data)
{
int retcode = GIT_ERROR;
+ int fd = -1;
git_buf contents = GIT_BUF_INIT;
+ /* Deal with pre-existing files */
+ if (git_path_exists(git_buf_cstr(fnbuf)) &&
+ data->opts->existing_file_action == GIT_CHECKOUT_SKIP_EXISTING)
+ return 0;
+
/* Allow disabling of filters */
if (data->opts->disable_filters) {
git_blob *blob;
@@ -78,23 +84,17 @@ static int blob_contents_to_file(git_repository *repo, git_buf *fnbuf,
}
if (retcode < 0) goto bctf_cleanup;
- /* Deal with pre-existing files */
- if (git_path_exists(git_buf_cstr(fnbuf)) &&
- data->opts->existing_file_action == GIT_CHECKOUT_SKIP_EXISTING)
+ if ((retcode = git_futils_mkpath2file(git_buf_cstr(fnbuf), data->opts->dir_mode)) < 0)
goto bctf_cleanup;
- /* TODO: use p_open with flags */
- int fd = git_futils_creat_withpath(git_buf_cstr(fnbuf),
- data->opts->dir_mode,
- data->opts->file_mode);
- if (fd >= 0) {
- if (!p_write(fd, git_buf_cstr(&contents),
- git_buf_len(&contents)))
- retcode = 0;
- else
- retcode = GIT_ERROR;
- p_close(fd);
- }
+ fd = p_open(git_buf_cstr(fnbuf), data->opts->file_open_flags, data->opts->file_mode);
+ if (fd < 0) goto bctf_cleanup;
+
+ if (!p_write(fd, git_buf_cstr(&contents), git_buf_len(&contents)))
+ retcode = 0;
+ else
+ retcode = GIT_ERROR;
+ p_close(fd);
bctf_cleanup:
git_buf_free(&contents);