diff options
author | Johannes Schindelin <johannes.schindelin@gmx.de> | 2016-01-06 13:09:43 (GMT) |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-01-07 21:52:55 (GMT) |
commit | 79d7582e32ca84eacf032298c8ae3d26816f48d0 (patch) | |
tree | 370b19ccf775725f0a2a28e21e7443b330dffe1a | |
parent | 833e48259e23aea76f3765d28d1b2200332301f7 (diff) | |
download | git-79d7582e32ca84eacf032298c8ae3d26816f48d0.zip git-79d7582e32ca84eacf032298c8ae3d26816f48d0.tar.gz git-79d7582e32ca84eacf032298c8ae3d26816f48d0.tar.bz2 |
commit: allow editing the commit message even in shared repos
It was pointed out by Yaroslav Halchenko that the file containing the
commit message is writable only by the owner, which means that we have
to rewrite it from scratch in a shared repository.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin/commit.c | 2 | ||||
-rw-r--r-- | git-compat-util.h | 1 | ||||
-rw-r--r-- | wrapper.c | 13 |
3 files changed, 15 insertions, 1 deletions
diff --git a/builtin/commit.c b/builtin/commit.c index f2a8b78..ce11a17 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -761,7 +761,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix, hook_arg2 = ""; } - s->fp = fopen(git_path(commit_editmsg), "w"); + s->fp = fopen_for_writing(git_path(commit_editmsg)); if (s->fp == NULL) die_errno(_("could not open '%s'"), git_path(commit_editmsg)); diff --git a/git-compat-util.h b/git-compat-util.h index 0feeae2..d98f3af 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -733,6 +733,7 @@ extern int xmkstemp_mode(char *template, int mode); extern int odb_mkstemp(char *template, size_t limit, const char *pattern); extern int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1); extern char *xgetcwd(void); +extern FILE *fopen_for_writing(const char *path); #define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), (alloc) * sizeof(*(x))) @@ -375,6 +375,19 @@ FILE *xfdopen(int fd, const char *mode) return stream; } +FILE *fopen_for_writing(const char *path) +{ + FILE *ret = fopen(path, "w"); + + if (!ret && errno == EPERM) { + if (!unlink(path)) + ret = fopen(path, "w"); + else + errno = EPERM; + } + return ret; +} + int xmkstemp(char *template) { int fd; |