Commit f8ec916 ("Allow helpers to report in "list" command that the ref
is unchanged", 2009-11-17) allowed a remote helper to report that a ref
is unchanged even if it did not know the contents of a ref. However,
that commit also made Git wrongly assume that such a remote ref always
has the contents of the local ref of the same name.

(Git also cannot assume that the remote ref has the value of the current
destination local ref, or any other ref, since the previous import/fetch
could have been made using a different refspec.)

Drop that assumption.

Signed-off-by: Jonathan Tan <jonathanta...@google.com>
---

Here is a patch that would remove the assumption (if it is indeed
wrong).

 Documentation/gitremote-helpers.txt |  3 +++
 transport-helper.c                  | 43 -------------------------------------
 2 files changed, 3 insertions(+), 43 deletions(-)

diff --git a/Documentation/gitremote-helpers.txt 
b/Documentation/gitremote-helpers.txt
index 9e8681f..c862339 100644
--- a/Documentation/gitremote-helpers.txt
+++ b/Documentation/gitremote-helpers.txt
@@ -393,6 +393,9 @@ attributes are defined.
 'unchanged'::
        This ref is unchanged since the last import or fetch, although
        the helper cannot necessarily determine what value that produced.
+       Git may import or fetch this ref anyway, because it does not
+       keep a record of the last values corresponding to the refs of a
+       specific remote.
 
 OPTIONS
 -------
diff --git a/transport-helper.c b/transport-helper.c
index 91aed35..6ab8e2f 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -392,9 +392,6 @@ static int fetch_with_fetch(struct transport *transport,
 
        for (i = 0; i < nr_heads; i++) {
                const struct ref *posn = to_fetch[i];
-               if (posn->status & REF_STATUS_UPTODATE)
-                       continue;
-
                strbuf_addf(&buf, "fetch %s %s\n",
                            oid_to_hex(&posn->old_oid),
                            posn->symref ? posn->symref : posn->name);
@@ -492,9 +489,6 @@ static int fetch_with_import(struct transport *transport,
 
        for (i = 0; i < nr_heads; i++) {
                posn = to_fetch[i];
-               if (posn->status & REF_STATUS_UPTODATE)
-                       continue;
-
                strbuf_addf(&buf, "import %s\n",
                            posn->symref ? posn->symref : posn->name);
                sendline(data, &buf);
@@ -531,8 +525,6 @@ static int fetch_with_import(struct transport *transport,
        for (i = 0; i < nr_heads; i++) {
                char *private, *name;
                posn = to_fetch[i];
-               if (posn->status & REF_STATUS_UPTODATE)
-                       continue;
                name = posn->symref ? posn->symref : posn->name;
                if (data->refspecs)
                        private = apply_refspecs(data->refspecs, 
data->refspec_nr, name);
@@ -649,21 +641,12 @@ static int fetch(struct transport *transport,
                 int nr_heads, struct ref **to_fetch)
 {
        struct helper_data *data = transport->data;
-       int i, count;
 
        if (process_connect(transport, 0)) {
                do_take_over(transport);
                return transport->fetch(transport, nr_heads, to_fetch);
        }
 
-       count = 0;
-       for (i = 0; i < nr_heads; i++)
-               if (!(to_fetch[i]->status & REF_STATUS_UPTODATE))
-                       count++;
-
-       if (!count)
-               return 0;
-
        if (data->check_connectivity &&
            data->transport_options.check_self_contained_and_connected)
                set_helper_option(transport, "check-connectivity", "true");
@@ -1009,23 +992,6 @@ static int push_refs(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 helper_data *data = transport->data;
@@ -1067,15 +1033,6 @@ static struct ref *get_refs_list(struct transport 
*transport, int for_push)
                        (*tail)->symref = xstrdup(buf.buf + 1);
                else if (buf.buf[0] != '?')
                        get_oid_hex(buf.buf, &(*tail)->old_oid);
-               if (eon) {
-                       if (has_attribute(eon + 1, "unchanged")) {
-                               (*tail)->status |= REF_STATUS_UPTODATE;
-                               if (read_ref((*tail)->name,
-                                            (*tail)->old_oid.hash) < 0)
-                                       die(_("Could not read ref %s"),
-                                           (*tail)->name);
-                       }
-               }
                tail = &((*tail)->next);
        }
        if (debug)
-- 
2.8.0.rc3.226.g39d4020

Reply via email to