git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Michael Haggerty <mhagger@alum.mit.edu>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Jeff King <peff@peff.net>,
	David Turner <novalis@novalis.org>,
	Michael Haggerty <mhagger@alum.mit.edu>
Subject: [PATCH v3 11/23] log_ref_setup(): separate code for create vs non-create
Date: Sat, 31 Dec 2016 04:12:51 +0100	[thread overview]
Message-ID: <d9f96df1bb2d5b9a95388da04b770ea9f317c491.1483153436.git.mhagger@alum.mit.edu> (raw)
In-Reply-To: <cover.1483153436.git.mhagger@alum.mit.edu>

The behavior of this function (especially how it handles errors) is
quite different depending on whether we are willing to create the reflog
vs. whether we are only trying to open an existing reflog. So separate
the code paths.

This also simplifies the next steps.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 refs/files-backend.c | 58 ++++++++++++++++++++++++++++++++++------------------
 1 file changed, 38 insertions(+), 20 deletions(-)

diff --git a/refs/files-backend.c b/refs/files-backend.c
index fd8a751..47c7829 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -2718,45 +2718,63 @@ static int commit_ref(struct ref_lock *lock)
  */
 static int log_ref_setup(const char *refname, struct strbuf *logfile, struct strbuf *err, int force_create)
 {
-	int logfd, oflags = O_APPEND | O_WRONLY;
+	int logfd;
 
 	strbuf_git_path(logfile, "logs/%s", refname);
+
 	if (force_create || should_autocreate_reflog(refname)) {
 		if (safe_create_leading_directories(logfile->buf) < 0) {
 			strbuf_addf(err, "unable to create directory for '%s': "
 				    "%s", logfile->buf, strerror(errno));
 			return -1;
 		}
-		oflags |= O_CREAT;
-	}
-
-	logfd = open(logfile->buf, oflags, 0666);
-	if (logfd < 0) {
-		if (!(oflags & O_CREAT) && (errno == ENOENT || errno == EISDIR))
-			return 0;
+		logfd = open(logfile->buf, O_APPEND | O_WRONLY | O_CREAT, 0666);
+		if (logfd < 0) {
+			if (errno == EISDIR) {
+				/*
+				 * The directory that is in the way might be
+				 * empty. Try to remove it.
+				 */
+				if (remove_empty_directories(logfile)) {
+					strbuf_addf(err, "there are still logs under "
+						    "'%s'", logfile->buf);
+					return -1;
+				}
+				logfd = open(logfile->buf, O_APPEND | O_WRONLY | O_CREAT, 0666);
+			}
 
-		if (errno == EISDIR) {
-			if (remove_empty_directories(logfile)) {
-				strbuf_addf(err, "there are still logs under "
-					    "'%s'", logfile->buf);
+			if (logfd < 0) {
+				strbuf_addf(err, "unable to append to '%s': %s",
+					    logfile->buf, strerror(errno));
 				return -1;
 			}
-			logfd = open(logfile->buf, oflags, 0666);
 		}
-
+	} else {
+		logfd = open(logfile->buf, O_APPEND | O_WRONLY, 0666);
 		if (logfd < 0) {
-			strbuf_addf(err, "unable to append to '%s': %s",
-				    logfile->buf, strerror(errno));
-			return -1;
+			if (errno == ENOENT || errno == EISDIR) {
+				/*
+				 * The logfile doesn't already exist,
+				 * but that is not an error; it only
+				 * means that we won't write log
+				 * entries to it.
+				 */
+			} else {
+				strbuf_addf(err, "unable to append to '%s': %s",
+					    logfile->buf, strerror(errno));
+				return -1;
+			}
 		}
 	}
 
-	adjust_shared_perm(logfile->buf);
-	close(logfd);
+	if (logfd >= 0) {
+		adjust_shared_perm(logfile->buf);
+		close(logfd);
+	}
+
 	return 0;
 }
 
-
 static int files_create_reflog(struct ref_store *ref_store,
 			       const char *refname, int force_create,
 			       struct strbuf *err)
-- 
2.9.3


  parent reply	other threads:[~2016-12-31  3:13 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-31  3:12 [PATCH v3 00/23] Delete directories left empty after ref deletion Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 01/23] files_rename_ref(): tidy up whitespace Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 02/23] t5505: use "for-each-ref" to test for the non-existence of references Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 03/23] safe_create_leading_directories_const(): preserve errno Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 04/23] safe_create_leading_directories(): set errno on SCLD_EXISTS Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 05/23] raceproof_create_file(): new function Michael Haggerty
2016-12-31  6:11   ` Jeff King
2016-12-31  7:42     ` Michael Haggerty
2017-01-01  2:07       ` Junio C Hamano
2016-12-31  3:12 ` [PATCH v3 06/23] lock_ref_sha1_basic(): inline constant Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 07/23] lock_ref_sha1_basic(): use raceproof_create_file() Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 08/23] rename_tmp_log(): " Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 09/23] rename_tmp_log(): improve error reporting Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 10/23] log_ref_write(): inline function Michael Haggerty
2017-01-01  2:09   ` Junio C Hamano
2017-01-01  8:41     ` Michael Haggerty
2016-12-31  3:12 ` Michael Haggerty [this message]
2016-12-31  6:26   ` [PATCH v3 11/23] log_ref_setup(): separate code for create vs non-create Jeff King
2016-12-31  7:52     ` Michael Haggerty
2017-01-01  3:28   ` Junio C Hamano
2017-01-01  8:45     ` Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 12/23] log_ref_setup(): improve robustness against races Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 13/23] log_ref_setup(): pass the open file descriptor back to the caller Michael Haggerty
2016-12-31  6:32   ` Jeff King
2016-12-31  7:58     ` Michael Haggerty
2016-12-31 17:58       ` Jeff King
2017-01-01 10:36         ` Junio C Hamano
2016-12-31  3:12 ` [PATCH v3 14/23] log_ref_write_1(): don't depend on logfile argument Michael Haggerty
2016-12-31  6:35   ` Jeff King
2016-12-31  8:01     ` Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 15/23] log_ref_setup(): manage the name of the reflog file internally Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 16/23] log_ref_write_1(): inline function Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 17/23] delete_ref_loose(): derive loose reference path from lock Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 18/23] delete_ref_loose(): inline function Michael Haggerty
2016-12-31  3:12 ` [PATCH v3 19/23] try_remove_empty_parents(): rename parameter "name" -> "refname" Michael Haggerty
2016-12-31  3:13 ` [PATCH v3 20/23] try_remove_empty_parents(): don't trash argument contents Michael Haggerty
2016-12-31  6:40   ` Jeff King
2017-01-02 16:27     ` Michael Haggerty
2017-01-02 17:10       ` Jeff King
2016-12-31  3:13 ` [PATCH v3 21/23] try_remove_empty_parents(): don't accommodate consecutive slashes Michael Haggerty
2017-01-01  2:30   ` Junio C Hamano
2017-01-01  5:59     ` Jeff King
2017-01-02 18:06       ` Michael Haggerty
2017-01-02 18:26         ` Jeff King
2016-12-31  3:13 ` [PATCH v3 22/23] try_remove_empty_parents(): teach to remove parents of reflogs, too Michael Haggerty
2016-12-31  3:13 ` [PATCH v3 23/23] files_transaction_commit(): clean up empty directories Michael Haggerty
2016-12-31  6:47 ` [PATCH v3 00/23] Delete directories left empty after ref deletion Jeff King
2017-01-01  2:32   ` Junio C Hamano
2017-01-01  9:24     ` Jacob Keller
2017-01-01  9:26       ` Jacob Keller
2017-01-01 12:43       ` Philip Oakley
2017-01-01 20:36         ` Jacob Keller
2017-01-02  4:19           ` Jeff King
2017-01-02 18:14             ` Michael Haggerty
2017-01-02 18:54               ` Jacob Keller

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

  List information: http://vger.kernel.org/majordomo-info.html

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

  git send-email \
    --in-reply-to=d9f96df1bb2d5b9a95388da04b770ea9f317c491.1483153436.git.mhagger@alum.mit.edu \
    --to=mhagger@alum.mit.edu \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=novalis@novalis.org \
    --cc=peff@peff.net \
    /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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).