---

I ended up rewriting most of the comment.  The new version removes
inter-rule dependencies (e.g., rule 5 overrides rule 3) which I think
makes it more readable.

This patch applies on top of the latest patch series regarding
pushing tags.  If will include this in a re-roll of that series if
these changes are deemed a good idea.

Also, I hand-edited the patch so that the changes were not interleaved
to make it much easier to read.  Can this be done automatically?
Something like a minimum # of matching lines required between
differences?

Chris

 remote.c | 32 +++++++++++++++++---------------
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/remote.c b/remote.c
index ee0c1e5..3fb1068 100644
--- a/remote.c
+++ b/remote.c
@@ -1319,27 +1319,29 @@ void set_ref_status_for_push(struct ref *remote_refs, 
int send_mirror,
                        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 the destination is under refs/tags/ you are
-                *     not allowed to overwrite it; tags are expected
-                *     to be static once created
-                *
-                * (3) if you do not have the old thing, you are not allowed
-                *     to overwrite it; you would not know what you are losing
-                *     otherwise.
-                *
-                * (4) if old is a commit and new is a descendant of old
-                *     (implying new is commit-ish), it is OK.
-                *
-                * (5) regardless of all of the above, removing :B is
-                *     always allowed.
+               /*
+                * The below logic determines whether an individual
+                * refspec A:B can be pushed.  The push will succeed
+                * if any of the following are true:
+                *
+                * (1) the remote reference B does not exist
+                *
+                * (2) the remote reference B is being removed (i.e.
+                *     pushing :B where no source is specified)
+                *
+                * (3) the update meets all fast-forwarding criteria:
+                *
+                *     (a) the destination is not under refs/tags/
+                *     (b) the old is a commit
+                *     (c) the new is a descendant of the old
+                *
+                *     NOTE: We must actually have the old object in
+                *     order to overwrite it in the remote reference,
+                *     and that the new object must be commit-ish.
+                *     These are implied by (b) and (c) respectively.
+                *
+                * (4) it is forced using the +A:B notation, or by
+                *     passing the --force argument
                 */
 
                ref->not_forwardable = !is_forwardable(ref);
-- 
1.8.0.209.gf3828dc

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to