Allow helpers to report in "list" command that the ref is unchanged
authorDaniel Barkalow <barkalow@iabervon.org>
Wed, 18 Nov 2009 01:42:30 +0000 (02:42 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 18 Nov 2009 05:45:44 +0000 (21:45 -0800)
Helpers may use a line like "? name unchanged" to specify that there
is nothing new at that name, without any git-specific code to
determine the correct response.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-remote-helpers.txt
transport-helper.c

index d6c5268..f4b6a5a 100644 (file)
@@ -84,7 +84,9 @@ CAPABILITIES
 REF LIST ATTRIBUTES
 -------------------
 
 REF LIST ATTRIBUTES
 -------------------
 
-None are defined yet, but the caller must accept any which are supplied.
+'unchanged'::
+       This ref is unchanged since the last import or fetch, although
+       the helper cannot necessarily determine what value that produced.
 
 Documentation
 -------------
 
 Documentation
 -------------
index 628a5ca..c87530e 100644 (file)
@@ -206,6 +206,22 @@ static int fetch(struct transport *transport,
        return -1;
 }
 
        return -1;
 }
 
+static int has_attribute(const char *attrs, const char *attr) {
+       int len;
+       if (!attrs)
+               return 0;
+
+       len = strlen(attr);
+       for (;;) {
+               const char *space = strchrnul(attrs, ' ');
+               if (len == space - attrs && !strncmp(attrs, attr, len))
+                       return 1;
+               if (!*space)
+                       return 0;
+               attrs = space + 1;
+       }
+}
+
 static struct ref *get_refs_list(struct transport *transport, int for_push)
 {
        struct child_process *helper;
 static struct ref *get_refs_list(struct transport *transport, int for_push)
 {
        struct child_process *helper;
@@ -240,6 +256,12 @@ static struct ref *get_refs_list(struct transport *transport, int for_push)
                        (*tail)->symref = xstrdup(buf.buf + 1);
                else if (buf.buf[0] != '?')
                        get_sha1_hex(buf.buf, (*tail)->old_sha1);
                        (*tail)->symref = xstrdup(buf.buf + 1);
                else if (buf.buf[0] != '?')
                        get_sha1_hex(buf.buf, (*tail)->old_sha1);
+               if (eon) {
+                       if (has_attribute(eon + 1, "unchanged")) {
+                               (*tail)->status |= REF_STATUS_UPTODATE;
+                               read_ref((*tail)->name, (*tail)->old_sha1);
+                       }
+               }
                tail = &((*tail)->next);
        }
        strbuf_release(&buf);
                tail = &((*tail)->next);
        }
        strbuf_release(&buf);