summaryrefslogtreecommitdiff
path: root/transport-helper.c
diff options
context:
space:
mode:
authorDaniel Barkalow <barkalow@iabervon.org>2009-11-18 02:42:30 +0100
committerJunio C Hamano <gitster@pobox.com>2009-11-17 21:45:44 -0800
commitf8ec916731ef8d81eefc5db61e3405dade65d821 (patch)
tree2298510d036081519415a0e51e0e26465af8565c /transport-helper.c
parentb962dbdc806510a4572a5574245d825a414231ab (diff)
downloadgit-f8ec916731ef8d81eefc5db61e3405dade65d821.tar.gz
Allow helpers to report in "list" command that the ref is unchanged
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>
Diffstat (limited to 'transport-helper.c')
-rw-r--r--transport-helper.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/transport-helper.c b/transport-helper.c
index 628a5ca210..c87530e87d 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -206,6 +206,22 @@ static int fetch(struct transport *transport,
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;
@@ -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);
+ 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);