git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Samuel Lucas Vaz de Mello <samuellucas@datacom.ind.br>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
	"Shawn O. Pearce" <spearce@spearce.org>
Subject: [PATCH] Preserve file permissions on git-reflog expire
Date: Wed, 15 Oct 2008 14:34:58 -0300	[thread overview]
Message-ID: <48F629C2.70203@datacom.ind.br> (raw)

Preserve file permissions on git-reflog expire to avoid problems with shared repositories and git-gc.

Signed-off-by: Samuel Lucas Vaz de Mello <samuellucas@datacom.ind.br>

---

This small patch fixes a bug with shared repositories and git-reflog expire.
If you have a shared repository created with git-init --shared, several users can push to it.
Once you run git-gc (which calls git-reflog expire) on the shared repository, the reflogs files are recreated with umask permissions, which defaults to 644 (with no group write). Since then, users receive the following error when trying to push:

samuel@erdinger:~/myrepo$ git push 
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Unpacking objects: 100% (3/3), done.
Writing objects: 100% (3/3), 295 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
error: Unable to append to logs/refs/heads/master: Permission denied 
To /remote/myrepo/
! [remote rejected] master -> master (failed to write)
error: failed to push some refs to '/remote/myrepo/' 

This patch avoid this error preserving the permissions on reflog files.

 builtin-reflog.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/builtin-reflog.c b/builtin-reflog.c
index 6b3667e..92a0d53 100644
--- a/builtin-reflog.c
+++ b/builtin-reflog.c
@@ -265,6 +265,7 @@ static int expire_reflog(const char *ref, const unsigned char *sha1, int unused,
 	struct cmd_reflog_expire_cb *cmd = cb_data;
 	struct expire_reflog_cb cb;
 	struct ref_lock *lock;
+	struct stat filestat;
 	char *log_file, *newlog_path = NULL;
 	int status = 0;
 
@@ -303,6 +304,10 @@ static int expire_reflog(const char *ref, const unsigned char *sha1, int unused,
 			status |= error("Couldn't write %s",
 				lock->lk->filename);
 			unlink(newlog_path);
+		} else if (stat(log_file, &filestat)){
+			status |= error("unable to read permissions of %s", log_file);
+		} else if (chmod(newlog_path, filestat.st_mode)){
+			status |= error("cannot set permissions of %s", newlog_path);
 		} else if (rename(newlog_path, log_file)) {
 			status |= error("cannot rename %s to %s",
 					newlog_path, log_file);
-- 
1.6.0.2.532.g84ed4c.dirty

             reply	other threads:[~2008-10-15 17:36 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-10-15 17:34 Samuel Lucas Vaz de Mello [this message]
2008-10-15 17:54 ` [PATCH] Preserve file permissions on git-reflog expire Junio C Hamano
2008-10-16 12:34   ` Johannes Schindelin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48F629C2.70203@datacom.ind.br \
    --to=samuellucas@datacom.ind.br \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=spearce@spearce.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).