gitweb: Set default destination directory for installing gitweb in Makefile
[gitweb.git] / remote.c
index e3afecdb1069a244493e906b5e16a96dc47535d3..0f073e0b5f9f08510af3a9e0ab5aed106475b30f 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -443,6 +443,8 @@ static int handle_config(const char *key, const char *value, void *cb)
        } else if (!strcmp(subkey, ".tagopt")) {
                if (!strcmp(value, "--no-tags"))
                        remote->fetch_tags = -1;
+               else if (!strcmp(value, "--tags"))
+                       remote->fetch_tags = 2;
        } else if (!strcmp(subkey, ".proxy")) {
                return git_config_string((const char **)&remote->http_proxy,
                                         key, value);
@@ -1247,6 +1249,56 @@ int match_refs(struct ref *src, struct ref **dst,
        return 0;
 }
 
+void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
+       int force_update)
+{
+       struct ref *ref;
+
+       for (ref = remote_refs; ref; ref = ref->next) {
+               if (ref->peer_ref)
+                       hashcpy(ref->new_sha1, ref->peer_ref->new_sha1);
+               else if (!send_mirror)
+                       continue;
+
+               ref->deletion = is_null_sha1(ref->new_sha1);
+               if (!ref->deletion &&
+                       !hashcmp(ref->old_sha1, ref->new_sha1)) {
+                       ref->status = REF_STATUS_UPTODATE;
+                       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 && !force_update) {
+                       ref->status = REF_STATUS_REJECT_NONFASTFORWARD;
+                       continue;
+               }
+       }
+}
+
 struct branch *branch_get(const char *name)
 {
        struct branch *ret;