[PATCH v6 7/8] push: clarify rejection of update to non-commit-ish
- From
Chris Rorvick <chris@rorvick.com>
- Date
- Nov 30, 2012, 01:41 UTC
- Message-ID
- <1354239700-3325-8-git-send-email-chris@rorvick.com>
- In-Reply-To
- <1354239700-3325-1-git-send-email-chris@rorvick.com>
Pushes must already (by default) update to a commit-ish due to the fast- forward check in set_ref_status_for_push(). But rejecting for not being a fast-forward suggests the situation can be resolved with a merge. Flag these updates (i.e., to a blob or a tree) as not forwardable so the user is presented with more appropriate advice.
While updating *from* a tag object is potentially destructive, updating *to* a tag is not. Additionally, a push to the refs/tags/ hierarchy is already excluded from fast-forwarding, and refs/heads/ is protected from anything but commit objects by a check in write_ref_sha1(). Thus someone fast-forwarding to a tag is probably not doing so by accident. Since updating to a tag is benign and unlikely to cause confusion, allow it in case someone finds the behavior useful.
Signed-off-by: Chris Rorvick <chris@rorvick.com> --- remote.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/remote.c b/remote.c index f5bc4e7..ee0c1e5 100644 --- a/remote.c +++ b/remote.c @@ -1291,6 +1291,11 @@ static inline int is_forwardable(struct ref* ref) if (!o || o->type != OBJ_COMMIT) return 0; + /* new object must be commit-ish */ + o = deref_tag(parse_object(ref->new_sha1), NULL, 0); + if (!o || o->type != OBJ_COMMIT) + return 0; + return 1; }
-- 1.8.0.158.g0c4328c