git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Beller <sbeller@google.com>
To: gitster@pobox.com
Cc: git@vger.kernel.org, pclouds@gmail.com, sunshine@sunshineco.com,
	mhagger@alum.mit.edu, ronniesahlberg@gmail.com,
	jrnieder@gmail.com, Stefan Beller <sbeller@google.com>
Subject: [PATCHv12 01/10] receive-pack.c: shorten the execute_commands loop over all commands
Date: Wed,  7 Jan 2015 19:23:15 -0800	[thread overview]
Message-ID: <1420687404-13997-2-git-send-email-sbeller@google.com> (raw)
In-Reply-To: <1420687404-13997-1-git-send-email-sbeller@google.com>

Make the main "execute_commands" loop in receive-pack easier to read
by splitting out some steps into helper functions. The new helper
'should_process_cmd' checks if a ref update is unnecessary, whether
due to an error having occurred or for another reason. The helper
'warn_if_skipped_connectivity_check' warns if we have forgotten to
run a connectivity check on a ref which is shallow for the client
which would be a bug.

This will help us to duplicate less code in a later patch when we make
a second copy of the "execute_commands" loop.

No functional change intended.

Signed-off-by: Stefan Beller <sbeller@google.com>
---

Notes:
    v12:
    * no changes
    v11:
    * rename assure_connectivity_checked to warn_if_skipped_connectivity_check
    
    >> This is why I choose the word assure.
    >If this patch depends on the next one, would it make sense to put them
    >in the opposite order?
    
    With the next patch applied which dies if the assumption doesn't hold,
    assure/assume sounds to me as if it describes the siuation well.
    
    > My personal preference would be to refactor the preceding code to make
    > the check unnecessary.
    
    The way I understand it, the shallow case is spread out all over the place
    not by choise but because it doesn't work better. So the original author
    (Duy) was wise enough to put checks in place because knowing it is fragile
    and may break in the future?
    This series doesn't intend to refactor the shallow case.
    
    So I picked up warn_if_skipped_connectivity_check as I'm ok with that.
    
    v10:
    * rename check_shallow_bugs to assure_connectivity_checked.
    * reword commit message.
    
    v9:
    * simplified should_process_cmd to be a one liner
    * check_shallow_bugs doesn't check of shallow_update being set, rather
      the function is just called if that option is set.
    
    v8: no change
    
    v7:
     new in v7 as in v7 I'd split up the previous
     [PATCH 4/7] receive-pack.c: receive-pack.c: use a single ref_transaction for atomic pushes
     as suggested by Eric.
    
     This is pretty much
    > patch 1: Factor out code into helper functions which will be needed by
    > the upcoming atomic and non-atomic worker functions. Example helpers:
    > 'cmd->error_string' and cmd->skip_update' check; and the
    > 'si->shallow_ref[cmd->index]' check and handling.

 builtin/receive-pack.c | 43 +++++++++++++++++++++++++++----------------
 1 file changed, 27 insertions(+), 16 deletions(-)

diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index 32fc540..2ebaf66 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -1042,11 +1042,34 @@ static void reject_updates_to_hidden(struct command *commands)
 	}
 }
 
+static int should_process_cmd(struct command *cmd)
+{
+	return !cmd->error_string && !cmd->skip_update;
+}
+
+static void warn_if_skipped_connectivity_check(struct command *commands,
+					       struct shallow_info *si)
+{
+	struct command *cmd;
+	int checked_connectivity = 1;
+
+	for (cmd = commands; cmd; cmd = cmd->next) {
+		if (should_process_cmd(cmd) && si->shallow_ref[cmd->index]) {
+			error("BUG: connectivity check has not been run on ref %s",
+			      cmd->ref_name);
+			checked_connectivity = 0;
+		}
+	}
+	if (!checked_connectivity)
+		error("BUG: run 'git fsck' for safety.\n"
+		      "If there are errors, try to remove "
+		      "the reported refs above");
+}
+
 static void execute_commands(struct command *commands,
 			     const char *unpacker_error,
 			     struct shallow_info *si)
 {
-	int checked_connectivity;
 	struct command *cmd;
 	unsigned char sha1[20];
 	struct iterate_data data;
@@ -1077,27 +1100,15 @@ static void execute_commands(struct command *commands,
 	free(head_name_to_free);
 	head_name = head_name_to_free = resolve_refdup("HEAD", 0, sha1, NULL);
 
-	checked_connectivity = 1;
 	for (cmd = commands; cmd; cmd = cmd->next) {
-		if (cmd->error_string)
-			continue;
-
-		if (cmd->skip_update)
+		if (!should_process_cmd(cmd))
 			continue;
 
 		cmd->error_string = update(cmd, si);
-		if (shallow_update && !cmd->error_string &&
-		    si->shallow_ref[cmd->index]) {
-			error("BUG: connectivity check has not been run on ref %s",
-			      cmd->ref_name);
-			checked_connectivity = 0;
-		}
 	}
 
-	if (shallow_update && !checked_connectivity)
-		error("BUG: run 'git fsck' for safety.\n"
-		      "If there are errors, try to remove "
-		      "the reported refs above");
+	if (shallow_update)
+		warn_if_skipped_connectivity_check(commands, si);
 }
 
 static struct command **queue_command(struct command **tail,
-- 
2.2.1.62.g3f15098

  reply	other threads:[~2015-01-08  3:24 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-08  3:23 [PATCHv12 00/10] atomic pushes Stefan Beller
2015-01-08  3:23 ` Stefan Beller [this message]
2015-01-08  3:23 ` [PATCHv12 02/10] receive-pack.c: die instead of error in case of possible future bug Stefan Beller
2015-01-08  3:23 ` [PATCHv12 03/10] receive-pack.c: move iterating over all commands outside execute_commands Stefan Beller
2015-01-08  3:23 ` [PATCHv12 04/10] receive-pack.c: move transaction handling in a central place Stefan Beller
2015-01-08  3:23 ` [PATCHv12 05/10] receive-pack.c: add execute_commands_atomic function Stefan Beller
2015-01-08  3:23 ` [PATCHv12 06/10] receive-pack.c: negotiate atomic push support Stefan Beller
2015-01-08 23:51   ` Junio C Hamano
2015-01-12 23:29   ` Eric Sunshine
2015-01-12 23:43     ` Stefan Beller
2015-01-13  0:08     ` Junio C Hamano
2015-01-08  3:23 ` [PATCHv12 07/10] send-pack: rename ref_update_to_be_sent to check_to_send_update Stefan Beller
2015-01-08  3:23 ` [PATCHv12 08/10] send-pack.c: add --atomic command line argument Stefan Beller
2015-01-12 21:57   ` Junio C Hamano
2015-01-08  3:23 ` [PATCHv12 09/10] push.c: add an --atomic argument Stefan Beller
2015-01-08  3:23 ` [PATCHv12 10/10] t5543-atomic-push.sh: add basic tests for atomic pushes Stefan Beller
2015-01-12 23:40   ` Eric Sunshine

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=1420687404-13997-2-git-send-email-sbeller@google.com \
    --to=sbeller@google.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jrnieder@gmail.com \
    --cc=mhagger@alum.mit.edu \
    --cc=pclouds@gmail.com \
    --cc=ronniesahlberg@gmail.com \
    --cc=sunshine@sunshineco.com \
    /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).