From: Tay Ray Chuan <rctay89@gmail.com>
To: git@vger.kernel.org
Cc: "Shawn O. Pearce" <spearce@spearce.org>,
"Daniel Barkalow" <barkalow@iabervon.org>,
"Sverre Rabbelier" <srabbelier@gmail.com>,
"Clemens Buchacher" <drizzd@aon.at>, "Jeff King" <peff@peff.net>,
"Junio C Hamano" <gitster@pobox.com>
Subject: [PATCH resend 1/3] refactor ref status logic for pushing
Date: Fri, 4 Dec 2009 14:56:43 +0800 [thread overview]
Message-ID: <20091204145643.296ec414.rctay89@gmail.com> (raw)
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
next prev parent reply other threads:[~2009-12-04 6:56 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-12-04 6:54 [PATCH resend 0/3] transport: catch non-fast-forwards Tay Ray Chuan
2009-12-04 6:56 ` Tay Ray Chuan [this message]
2009-12-04 6:57 ` [PATCH resend 2/3] transport-helper.c::push_refs(): know more about refs before pushing Tay Ray Chuan
2009-12-04 6:58 ` [PATCH resend 3/3] transport.c::transport_push(): make ref status affect return value Tay Ray Chuan
2009-12-04 10:20 ` Jeff King
[not found] ` <20091204125042.c64f347d.rctay89@gmail.com>
2009-12-04 4:54 ` [PATCH 1/3] refactor ref status logic for pushing Tay Ray Chuan
[not found] ` <20091204144822.a61355d2.rctay89@gmail.com>
2009-12-04 7:05 ` [PATCH resend 0/3] transport: catch non-fast-forwards Daniel Barkalow
2009-12-08 14:34 ` [PATCH v2 " Tay Ray Chuan
2009-12-08 14:35 ` [PATCH v2 1/3] refactor ref status logic for pushing Tay Ray Chuan
2009-12-08 17:17 ` Daniel Barkalow
2009-12-09 3:40 ` Tay Ray Chuan
2009-12-09 7:13 ` Daniel Barkalow
2009-12-08 14:36 ` [PATCH v2 2/3] transport.c::transport_push(): make ref status affect return value Tay Ray Chuan
2009-12-08 14:37 ` [PATCH v2 3/3] transport-helper.c::push_refs(): emit "no refs" error message Tay Ray Chuan
2009-12-24 7:40 ` [PATCH v3 0/6] transport: catch non-fast forwards Tay Ray Chuan
2009-12-24 7:40 ` [PATCH v3 1/6] t5541-http-push.sh: add tests for non-fast-forward pushes Tay Ray Chuan
2009-12-24 7:41 ` [PATCH v3 2/6] t5541-http-push.sh: add test for unmatched, non-fast-forwarded refs Tay Ray Chuan
2009-12-24 7:42 ` [PATCH v3 3/6] refactor ref status logic for pushing Tay Ray Chuan
2009-12-24 7:43 ` [PATCH v3 4/6] transport.c::transport_push(): make ref status affect return value Tay Ray Chuan
2009-12-24 7:44 ` [PATCH v3 5/6] transport-helper.c::push_refs(): ignore helper-reported status if ref is not to be pushed Tay Ray Chuan
2009-12-24 7:45 ` [PATCH v3 6/6] transport-helper.c::push_refs(): emit "no refs" error message Tay Ray Chuan
2010-01-05 6:32 ` [PATCH v3 5/6] transport-helper.c::push_refs(): ignore helper-reported status if ref is not to be pushed Jeff King
2010-01-05 10:01 ` Tay Ray Chuan
2010-01-06 12:04 ` Jeff King
2010-01-06 21:41 ` Tay Ray Chuan
2010-01-08 1:04 ` Tay Ray Chuan
2010-01-05 6:35 ` [PATCH v3 2/6] t5541-http-push.sh: add test for unmatched, non-fast-forwarded refs Jeff King
2010-01-05 10:01 ` Tay Ray Chuan
2010-01-06 12:05 ` Jeff King
2010-01-06 1:04 ` Junio C Hamano
2010-01-06 2:12 ` Tay Ray Chuan
2010-01-08 2:12 ` [PATCH v4 0/6] transport: catch non-fast forwards Tay Ray Chuan
2010-01-08 2:12 ` [PATCH v4 1/6] t5541-http-push.sh: add tests for non-fast-forward pushes Tay Ray Chuan
2010-01-08 2:12 ` [PATCH v4 2/6] t5541-http-push.sh: add test for unmatched, non-fast-forwarded refs Tay Ray Chuan
2010-01-08 2:12 ` [PATCH v4 3/6] refactor ref status logic for pushing Tay Ray Chuan
2010-01-08 2:12 ` [PATCH v4 4/6] transport.c::transport_push(): make ref status affect return value Tay Ray Chuan
2010-01-08 2:12 ` [PATCH v4 5/6] transport-helper.c::push_refs(): ignore helper-reported status if ref is not to be pushed Tay Ray Chuan
2010-01-08 2:12 ` [PATCH v4 6/6] transport-helper.c::push_refs(): emit "no refs" error message Tay Ray Chuan
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=20091204145643.296ec414.rctay89@gmail.com \
--to=rctay89@gmail.com \
--cc=barkalow@iabervon.org \
--cc=drizzd@aon.at \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
--cc=spearce@spearce.org \
--cc=srabbelier@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.