t5533: test "push --force-with-lease"
[gitweb.git] / remote.h
index a850059804099687bebcdefae8682f84622b3164..6c42554cc2c03f637d9bebdb1b462b1c4601dec9 100644 (file)
--- a/remote.h
+++ b/remote.h
@@ -1,6 +1,8 @@
 #ifndef REMOTE_H
 #define REMOTE_H
 
+#include "parse-options.h"
+
 enum {
        REMOTE_CONFIG,
        REMOTE_REMOTES,
@@ -75,10 +77,13 @@ struct ref {
        struct ref *next;
        unsigned char old_sha1[20];
        unsigned char new_sha1[20];
+       unsigned char old_sha1_expect[20]; /* used by expect-old */
        char *symref;
        unsigned int
                force:1,
                forced_update:1,
+               expect_old_sha1:1,
+               expect_old_no_trackback:1,
                deletion:1,
                matched:1;
 
@@ -102,6 +107,7 @@ struct ref {
                REF_STATUS_REJECT_NODELETE,
                REF_STATUS_REJECT_FETCH_FIRST,
                REF_STATUS_REJECT_NEEDS_FORCE,
+               REF_STATUS_REJECT_STALE,
                REF_STATUS_UPTODATE,
                REF_STATUS_REMOTE_REJECT,
                REF_STATUS_EXPECTING_REPORT
@@ -226,4 +232,27 @@ struct ref *guess_remote_head(const struct ref *head,
 /* Return refs which no longer exist on remote */
 struct ref *get_stale_heads(struct refspec *refs, int ref_count, struct ref *fetch_map);
 
+/*
+ * Compare-and-swap
+ */
+#define CAS_OPT_NAME "force-with-lease"
+
+struct push_cas_option {
+       unsigned use_tracking_for_rest:1;
+       struct push_cas {
+               unsigned char expect[20];
+               unsigned use_tracking:1;
+               char *refname;
+       } *entry;
+       int nr;
+       int alloc;
+};
+
+extern int parseopt_push_cas_option(const struct option *, const char *arg, int unset);
+extern int parse_push_cas_option(struct push_cas_option *, const char *arg, int unset);
+extern void clear_cas_option(struct push_cas_option *);
+
+extern int is_empty_cas(const struct push_cas_option *);
+void apply_push_cas(struct push_cas_option *, struct remote *, struct ref *);
+
 #endif