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>
maint
Daniel Barkalow 2009-11-18 02:42:30 +01:00 committed by Junio C Hamano
parent b962dbdc80
commit f8ec916731
2 changed files with 25 additions and 1 deletions

View File

@ -84,7 +84,9 @@ CAPABILITIES
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
-------------

View File

@ -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);