git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH resend 1/3] refactor ref status logic for pushing

From
Tay Ray Chuan <rctay89@gmail.com>
Date
Dec 4, 2009, 06:56 UTC
Message-ID
<20091204145643.296ec414.rctay89@gmail.com>
In-Reply-To
<20091204145437.1a9910db.rctay89@gmail.com>
Move the logic to a new function in remote.[ch],
 set_ref_status_for_push().
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
---
 builtin-send-pack.c |   39 +++------------------------------------
 remote.c            |   42 ++++++++++++++++++++++++++++++++++++++++++
 remote.h            |    1 +
 3 files changed, 46 insertions(+), 36 deletions(-)
diff --git a/builtin-send-pack.c b/builtin-send-pack.c
index 8fffdbf..8c98624 100644
--- a/builtin-send-pack.c
+++ b/builtin-send-pack.c
@@ -412,44 +412,11 @@ int send_pack(struct send_pack_args *args,
 		else if (!args->send_mirror)
 			continue;

-		ref->deletion = is_null_sha1(ref->new_sha1);
-		if (ref->deletion && !allow_deleting_refs) {
-			ref->status = REF_STATUS_REJECT_NODELETE;
-			continue;
-		}
-		if (!ref->deletion &&
-		    !hashcmp(ref->old_sha1, ref->new_sha1)) {
-			ref->status = REF_STATUS_UPTODATE;
+		if (set_ref_status_for_push(ref, args->force_update))
 			continue;
-		}

-		/* This part determines what can overwrite what.
-		 * The rules are:
-		 *
-		 * (0) you can always use --force or +A:B notation to
-		 *     selectively force individual ref pairs.
-		 *
-		 * (1) if the old thing does not exist, it is OK.
-		 *
-		 * (2) if you do not have the old thing, you are not allowed
-		 *     to overwrite it; you would not know what you are losing
-		 *     otherwise.
-		 *
-		 * (3) if both new and old are commit-ish, and new is a
-		 *     descendant of old, it is OK.
-		 *
-		 * (4) regardless of all of the above, removing :B is
-		 *     always allowed.
-		 */
-
-		ref->nonfastforward =
-		    !ref->deletion &&
-		    !is_null_sha1(ref->old_sha1) &&
-		    (!has_sha1_file(ref->old_sha1)
-		      || !ref_newer(ref->new_sha1, ref->old_sha1));
-
-		if (ref->nonfastforward && !ref->force && !args->force_update) {
-			ref->status = REF_STATUS_REJECT_NONFASTFORWARD;
+		if (ref->deletion && !allow_deleting_refs) {
+			ref->status = REF_STATUS_REJECT_NODELETE;
 			continue;
 		}

diff --git a/remote.c b/remote.c
index e3afecd..188869a 100644
--- a/remote.c
+++ b/remote.c
@@ -1247,6 +1247,48 @@ int match_refs(struct ref *src, struct ref **dst,
 	return 0;
 }

+int set_ref_status_for_push(struct ref *ref, int force_update)
+{
+	ref->deletion = is_null_sha1(ref->new_sha1);
+	if (!ref->deletion &&
+		!hashcmp(ref->old_sha1, ref->new_sha1)) {
+		ref->status = REF_STATUS_UPTODATE;
+		return 1;
+	}
+
+	/* This part determines what can overwrite what.
+	 * The rules are:
+	 *
+	 * (0) you can always use --force or +A:B notation to
+	 *     selectively force individual ref pairs.
+	 *
+	 * (1) if the old thing does not exist, it is OK.
+	 *
+	 * (2) if you do not have the old thing, you are not allowed
+	 *     to overwrite it; you would not know what you are losing
+	 *     otherwise.
+	 *
+	 * (3) if both new and old are commit-ish, and new is a
+	 *     descendant of old, it is OK.
+	 *
+	 * (4) regardless of all of the above, removing :B is
+	 *     always allowed.
+	 */
+
+	ref->nonfastforward =
+		!ref->deletion &&
+		!is_null_sha1(ref->old_sha1) &&
+		(!has_sha1_file(ref->old_sha1)
+		  || !ref_newer(ref->new_sha1, ref->old_sha1));
+
+	if (ref->nonfastforward && !ref->force && !force_update) {
+		ref->status = REF_STATUS_REJECT_NONFASTFORWARD;
+		return 1;
+	}
+
+	return 0;
+}
+
 struct branch *branch_get(const char *name)
 {
 	struct branch *ret;
diff --git a/remote.h b/remote.h
index 8b7ecf9..0f45553 100644
--- a/remote.h
+++ b/remote.h
@@ -98,6 +98,7 @@ char *apply_refspecs(struct refspec *refspecs, int nr_refspec,

 int match_refs(struct ref *src, struct ref **dst,
 	       int nr_refspec, const char **refspec, int all);
+int set_ref_status_for_push(struct ref *ref, int force_update);

 /*
  * Given a list of the remote refs and the specification of things to
--
1.6.6.rc1.286.gbc15a
Previous: Tay Ray ChuanNext: Tay Ray Chuan
Message 2 of 12 in “transport: catch non-fast-forwards”
  1. 0/3 transport: catch non-fast-forwardsTay Ray Chuan, Dec 4, 2009
  2. 1/3 refactor ref status logic for pushingTay Ray Chuan, Dec 4, 2009
  3. 2/3 transport-helper.c::push_refs(): know more about refs before pushingTay Ray Chuan, Dec 4, 2009
  4. 3/3 transport.c::transport_push(): make ref status affect return valueTay Ray Chuan, Dec 4, 2009
  5. Jeff KingDec 4, 2009
  6. 0/6 transport: catch non-fast forwardsTay Ray Chuan, Jan 8, 2010
  7. 1/6 t5541-http-push.sh: add tests for non-fast-forward pushesTay Ray Chuan, Jan 8, 2010
  8. 2/6 t5541-http-push.sh: add test for unmatched, non-fast-forwarded refsTay Ray Chuan, Jan 8, 2010
  9. 3/6 refactor ref status logic for pushingTay Ray Chuan, Jan 8, 2010
  10. 4/6 transport.c::transport_push(): make ref status affect return valueTay Ray Chuan, Jan 8, 2010
  11. 5/6 transport-helper.c::push_refs(): ignore helper-reported status if ref is not to be pushedTay Ray Chuan, Jan 8, 2010
  12. 6/6 transport-helper.c::push_refs(): emit "no refs" error messageTay Ray Chuan, Jan 8, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.