From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ronnie Sahlberg Subject: [PATCH v12 06/41] refs.c: add an err argument to repack_without_refs Date: Thu, 29 May 2014 09:07:43 -0700 Message-ID: <1401379676-9307-2-git-send-email-sahlberg@google.com> References: <1401379676-9307-1-git-send-email-sahlberg@google.com> Cc: jrnieder@gmail.com, Ronnie Sahlberg To: git@vger.kernel.org X-From: git-owner@vger.kernel.org Thu May 29 18:08:51 2014 Return-path: Envelope-to: gcvg-git-2@plane.gmane.org Received: from vger.kernel.org ([209.132.180.67]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Wq2ss-00079r-N1 for gcvg-git-2@plane.gmane.org; Thu, 29 May 2014 18:08:51 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757560AbaE2QIZ (ORCPT ); Thu, 29 May 2014 12:08:25 -0400 Received: from mail-vc0-f201.google.com ([209.85.220.201]:35067 "EHLO mail-vc0-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757470AbaE2QIA (ORCPT ); Thu, 29 May 2014 12:08:00 -0400 Received: by mail-vc0-f201.google.com with SMTP id ij19so113633vcb.0 for ; Thu, 29 May 2014 09:07:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=4TwadNPyQtK0R3dlLX0rMoi/mWgqy5K92uOhiigDWXY=; b=OXErVjPRWYZIdeFbUgxBrl8NXVB6HGg4yuGOBUkuYdF83CxW1SGfPfUcQwE+5Fwld0 NHzwiKYX9WH1uC4sHy7q5AJ6ELOH0DQ99qGbXBRK4dbGA57mW2cSelgM5mfyWg47GuF4 yPIMhPTE2vLOru5mXsFYD9VBzdwK8bl37LNy9iEli/MtTaJAQFspfvs8EpQG5aCu6Be4 wNs1BldxSng/V9OcBiWWtaR1ckecmWQ7SbZgGst6WCxd2yL+z6xV6BZImjNqV7I6yZm6 XWAMYGhqEmsYlBzwSE5jEOG5xzAj4bjKgfGndoXn3rRwZ6rTIUpxAV2i8lVc/RRbw+Pc JZTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=4TwadNPyQtK0R3dlLX0rMoi/mWgqy5K92uOhiigDWXY=; b=JlnvOW399sfYUNRx9S62QlhTzJAIP9CrKJUvpBfS629Wxjy+WogWLFJp3ACBfom1Bk Dl2l4F3Tk1S2jMVwFIVbwNvIEsVnqBCmkB4+/GUW7WACxkjCkY984DAHh3yjvQXJ6Zn2 EjfW+IUzrJMFjEac0ZzH2akcJbniZJJI8bm2bjWDdTpdRZc2whVOZbopzzQJPaJmH89c rkLhnoUrzQMYiWagNvY9LkGBb53HmAOFhG3nOHa0GOo3/L/p3ogPmFcDHiBtR7Dl2CLI SH4fPVz5cDCazwRz2W6ujGSKMMLrvW7lIsR6YQp/pBfmzvHVkWBsS0kCh6N/WJm860pF z6MA== X-Gm-Message-State: ALoCoQnmAJUvTwoNy0aQ9D8O6lQ44jgs+54MZbwpWTiOX5fpBMY8pfx85Yx81B2lDpJPDAgJoi2l X-Received: by 10.58.132.177 with SMTP id ov17mr3354196veb.25.1401379679410; Thu, 29 May 2014 09:07:59 -0700 (PDT) Received: from corp2gmr1-1.hot.corp.google.com (corp2gmr1-1.hot.corp.google.com [172.24.189.92]) by gmr-mx.google.com with ESMTPS id k43si81557yhq.3.2014.05.29.09.07.59 for (version=TLSv1.1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 29 May 2014 09:07:59 -0700 (PDT) Received: from sahlberg1.mtv.corp.google.com (sahlberg1.mtv.corp.google.com [172.27.69.52]) by corp2gmr1-1.hot.corp.google.com (Postfix) with ESMTP id 2F02531C3F9; Thu, 29 May 2014 09:07:59 -0700 (PDT) Received: by sahlberg1.mtv.corp.google.com (Postfix, from userid 177442) id D0A1EE1167; Thu, 29 May 2014 09:07:58 -0700 (PDT) X-Mailer: git-send-email 2.0.0.rc3.474.g3833130 In-Reply-To: <1401379676-9307-1-git-send-email-sahlberg@google.com> Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Archived-At: Update repack_without_refs to take an err argument and update it if there is a failure. Pass the err variable from ref_transaction_commit to this function so that callers can print a meaningful error message if _commit fails due to a problem in repack_without_refs. Add a new function unable_to_lock_message that takes a strbuf argument and fills in the reason for the failure. In commit_packed_refs, make sure that we propagate any errno that commit_lock_file might have set back to our caller. Signed-off-by: Ronnie Sahlberg --- cache.h | 2 ++ lockfile.c | 21 ++++++++++++--------- refs.c | 25 +++++++++++++++++++------ 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/cache.h b/cache.h index 8c6cdc2..5858da8 100644 --- a/cache.h +++ b/cache.h @@ -559,6 +559,8 @@ struct lock_file { #define LOCK_DIE_ON_ERROR 1 #define LOCK_NODEREF 2 extern int unable_to_lock_error(const char *path, int err); +extern void unable_to_lock_message(const char *path, int err, + struct strbuf *buf); extern NORETURN void unable_to_lock_index_die(const char *path, int err); extern int hold_lock_file_for_update(struct lock_file *, const char *path, int); extern int hold_lock_file_for_append(struct lock_file *, const char *path, int); diff --git a/lockfile.c b/lockfile.c index 8fbcb6a..92e0397 100644 --- a/lockfile.c +++ b/lockfile.c @@ -157,33 +157,36 @@ static int lock_file(struct lock_file *lk, const char *path, int flags) return lk->fd; } -static char *unable_to_lock_message(const char *path, int err) +void unable_to_lock_message(const char *path, int err, struct strbuf *buf) { - struct strbuf buf = STRBUF_INIT; if (err == EEXIST) { - strbuf_addf(&buf, "Unable to create '%s.lock': %s.\n\n" + strbuf_addf(buf, "Unable to create '%s.lock': %s.\n\n" "If no other git process is currently running, this probably means a\n" "git process crashed in this repository earlier. Make sure no other git\n" "process is running and remove the file manually to continue.", absolute_path(path), strerror(err)); } else - strbuf_addf(&buf, "Unable to create '%s.lock': %s", + strbuf_addf(buf, "Unable to create '%s.lock': %s", absolute_path(path), strerror(err)); - return strbuf_detach(&buf, NULL); } int unable_to_lock_error(const char *path, int err) { - char *msg = unable_to_lock_message(path, err); - error("%s", msg); - free(msg); + struct strbuf buf = STRBUF_INIT; + + unable_to_lock_message(path, err, &buf); + error("%s", buf.buf); + strbuf_release(&buf); return -1; } NORETURN void unable_to_lock_index_die(const char *path, int err) { - die("%s", unable_to_lock_message(path, err)); + struct strbuf buf = STRBUF_INIT; + + unable_to_lock_message(path, err, &buf); + die("%s", buf.buf); } int hold_lock_file_for_update(struct lock_file *lk, const char *path, int flags) diff --git a/refs.c b/refs.c index 25c3a93..6e28841 100644 --- a/refs.c +++ b/refs.c @@ -2208,6 +2208,7 @@ int commit_packed_refs(void) struct packed_ref_cache *packed_ref_cache = get_packed_ref_cache(&ref_cache); int error = 0; + int save_errno = 0; if (!packed_ref_cache->lock) die("internal error: packed-refs not locked"); @@ -2217,10 +2218,13 @@ int commit_packed_refs(void) do_for_each_entry_in_dir(get_packed_ref_dir(packed_ref_cache), 0, write_packed_entry_fn, &packed_ref_cache->lock->fd); - if (commit_lock_file(packed_ref_cache->lock)) + if (commit_lock_file(packed_ref_cache->lock)) { + save_errno = errno; error = -1; + } packed_ref_cache->lock = NULL; release_packed_ref_cache(packed_ref_cache); + errno = save_errno; return error; } @@ -2427,12 +2431,12 @@ static int curate_packed_ref_fn(struct ref_entry *entry, void *cb_data) return 0; } -static int repack_without_refs(const char **refnames, int n) +static int repack_without_refs(const char **refnames, int n, struct strbuf *err) { struct ref_dir *packed; struct string_list refs_to_delete = STRING_LIST_INIT_DUP; struct string_list_item *ref_to_delete; - int i, removed = 0; + int i, ret, removed = 0; /* Look for a packed ref */ for (i = 0; i < n; i++) @@ -2444,6 +2448,11 @@ static int repack_without_refs(const char **refnames, int n) return 0; /* no refname exists in packed refs */ if (lock_packed_refs(0)) { + if (err) { + unable_to_lock_message(git_path("packed-refs"), errno, + err); + return -1; + } unable_to_lock_error(git_path("packed-refs"), errno); return error("cannot delete '%s' from packed refs", refnames[i]); } @@ -2470,12 +2479,16 @@ static int repack_without_refs(const char **refnames, int n) } /* Write what remains */ - return commit_packed_refs(); + ret = commit_packed_refs(); + if (ret && err) + strbuf_addf(err, "unable to overwrite old ref-pack file: %s", + strerror(errno)); + return ret; } static int repack_without_ref(const char *refname) { - return repack_without_refs(&refname, 1); + return repack_without_refs(&refname, 1, NULL); } static int delete_ref_loose(struct ref_lock *lock, int flag) @@ -3481,7 +3494,7 @@ int ref_transaction_commit(struct ref_transaction *transaction, } } - ret |= repack_without_refs(delnames, delnum); + ret |= repack_without_refs(delnames, delnum, err); for (i = 0; i < delnum; i++) unlink_or_warn(git_path("logs/%s", delnames[i])); clear_loose_ref_cache(&ref_cache); -- 2.0.0.rc3.474.g3833130