summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2016-12-06 14:15:48 -0800
committerJunio C Hamano <gitster@pobox.com>2016-12-06 14:19:44 -0800
commitd475af7f7c73cc9cecfa83fdf47a7ce0cf34931e (patch)
tree2d1331bd283e387801619ddf139188ef8248871b
parent454cb6bd52a4de614a3633e4f547af03d5c3b640 (diff)
downloadgit-jc/lockfile-silent-on-error.tar.gz
lockfile: LOCK_SILENT_ON_ERRORjc/lockfile-silent-on-error
Recent "libify merge machinery" stopped from passing die_on_error bit to hold_locked_index(), and lost an error message when there are competing update in progress with "git merge --ff-only $commit", for example. The command still exits with a non-zero status, but that is not of much help for an interactive user. The last thing the command says is "Updating $from..$to". We used to follow it with a big error message that makes it clear that "merge --ff-only" did not succeed. Introduce a new bit "LOCK_SILENT_ON_ERROR" that can be passed by callers that do want to silence the message (because they either make it a non-error by doing something else, or they show their own error message to explain the situation), and show the error message we used to give for everybody else, including the caller that was touched by the libification in question. I would not be surprised if some existing calls to hold_lock*() functions that pass die_on_error=0 need to be updated to pass LOCK_SILENT_ON_ERROR, and when this fix is taken alone, it may look like a regression, but we are better off starting louder and squelch the ones that we find safe to make silent than the other way around. Reported-by: Robbie Iannucci <iannucci@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--lockfile.c11
-rw-r--r--lockfile.h8
2 files changed, 16 insertions, 3 deletions
diff --git a/lockfile.c b/lockfile.c
index 9268cdf325..f7e8104449 100644
--- a/lockfile.c
+++ b/lockfile.c
@@ -174,8 +174,15 @@ int hold_lock_file_for_update_timeout(struct lock_file *lk, const char *path,
int flags, long timeout_ms)
{
int fd = lock_file_timeout(lk, path, flags, timeout_ms);
- if (fd < 0 && (flags & LOCK_DIE_ON_ERROR))
- unable_to_lock_die(path, errno);
+ if (fd < 0) {
+ if (flags & LOCK_DIE_ON_ERROR)
+ unable_to_lock_die(path, errno);
+ else if (!(flags & LOCK_SILENT_ON_ERROR)) {
+ struct strbuf buf = STRBUF_INIT;
+ unable_to_lock_message(path, errno, &buf);
+ error("%s", buf.buf);
+ }
+ }
return fd;
}
diff --git a/lockfile.h b/lockfile.h
index d26ad27b2b..98b4862254 100644
--- a/lockfile.h
+++ b/lockfile.h
@@ -129,9 +129,15 @@ struct lock_file {
/*
* If a lock is already taken for the file, `die()` with an error
* message. If this flag is not specified, trying to lock a file that
- * is already locked returns -1 to the caller.
+ * is already locked gives the same error message and returns -1 to
+ * the caller.
*/
#define LOCK_DIE_ON_ERROR 1
+/*
+ * ... or the function can be told to be totally silent and return
+ * -1 to the caller upon error with this flag
+ */
+#define LOCK_SILENT_ON_ERROR 2
/*
* Usually symbolic links in the destination path are resolved. This