Merge master into aw/mirror-push
authorJunio C Hamano <gitster@pobox.com>
Sat, 10 Nov 2007 05:13:46 +0000 (21:13 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sat, 10 Nov 2007 05:13:46 +0000 (21:13 -0800)
1  2 
Makefile
builtin-fetch.c
cache.h
git.c
http-push.c
transport.c
diff --combined Makefile
index 470e54a60d182fa3d9f119d6257d9771cfb379a9,621270f6235306dcdd9c55ac371c90cb5b5effc3..4a5d2b91a9343f10e910599b395dbb5f292ac080
+++ b/Makefile
@@@ -98,6 -98,8 +98,8 @@@ all:
  # Define OLD_ICONV if your library has an old iconv(), where the second
  # (input buffer pointer) parameter is declared with type (const char **).
  #
+ # Define NO_DEFLATE_BOUND if your zlib does not have deflateBound.
+ #
  # Define NO_R_TO_GCC_LINKER if your gcc does not like "-R/path/lib"
  # that tells runtime paths to dynamic libraries;
  # "-Wl,-rpath=/path/lib" is used instead.
@@@ -210,6 -212,7 +212,6 @@@ BASIC_LDFLAGS 
  SCRIPT_SH = \
        git-bisect.sh git-checkout.sh \
        git-clean.sh git-clone.sh git-commit.sh \
 -      git-ls-remote.sh \
        git-merge-one-file.sh git-mergetool.sh git-parse-remote.sh \
        git-pull.sh git-rebase.sh git-rebase--interactive.sh \
        git-repack.sh git-request-pull.sh \
@@@ -238,7 -241,7 +240,7 @@@ PROGRAMS = 
        git-fast-import$X \
        git-daemon$X \
        git-merge-index$X git-mktag$X git-mktree$X git-patch-id$X \
 -      git-peek-remote$X git-receive-pack$X \
 +      git-receive-pack$X \
        git-send-pack$X git-shell$X \
        git-show-index$X \
        git-unpack-file$X \
@@@ -298,7 -301,7 +300,7 @@@ DIFF_OBJS = 
  LIB_OBJS = \
        blob.o commit.o connect.o csum-file.o cache-tree.o base85.o \
        date.o diff-delta.o entry.o exec_cmd.o ident.o \
-       interpolate.o hash.o \
+       pretty.o interpolate.o hash.o \
        lockfile.o \
        patch-ids.o \
        object.o pack-check.o pack-write.o patch-delta.o path.o pkt-line.o \
@@@ -344,7 -347,6 +346,7 @@@ BUILTIN_OBJS = 
        builtin-log.o \
        builtin-ls-files.o \
        builtin-ls-tree.o \
 +      builtin-ls-remote.o \
        builtin-mailinfo.o \
        builtin-mailsplit.o \
        builtin-merge-base.o \
        builtin-push.o \
        builtin-read-tree.o \
        builtin-reflog.o \
 +      builtin-send-pack.o \
        builtin-config.o \
        builtin-rerere.o \
        builtin-reset.o \
@@@ -662,6 -663,10 +664,10 @@@ ifdef OLD_ICON
        BASIC_CFLAGS += -DOLD_ICONV
  endif
  
+ ifdef NO_DEFLATE_BOUND
+       BASIC_CFLAGS += -DNO_DEFLATE_BOUND
+ endif
  ifdef PPC_SHA1
        SHA1_HEADER = "ppc/sha1.h"
        LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
@@@ -917,6 -922,7 +923,7 @@@ git-http-push$X: revision.o http.o http
  
  $(LIB_OBJS) $(BUILTIN_OBJS): $(LIB_H)
  $(patsubst git-%$X,%.o,$(PROGRAMS)): $(LIB_H) $(wildcard */*.h)
+ builtin-revert.o builtin-runstatus.o wt-status.o: wt-status.h
  
  $(LIB_FILE): $(LIB_OBJS)
        $(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIB_OBJS)
diff --combined builtin-fetch.c
index fa0af170ddeaa7e61c85787f7d283b0b67ab3a2f,5f5b59bfdb5056dfedf692215db2f9e4207f8580..6b1750d28bcc69ed5d8ac5b30b96dab29608fb28
@@@ -29,7 -29,7 +29,7 @@@ static void unlock_pack_on_signal(int s
  }
  
  static void add_merge_config(struct ref **head,
 -                         struct ref *remote_refs,
 +                         const struct ref *remote_refs,
                           struct branch *branch,
                           struct ref ***tail)
  {
@@@ -77,7 -77,7 +77,7 @@@ static struct ref *get_ref_map(struct t
        struct ref *ref_map = NULL;
        struct ref **tail = &ref_map;
  
 -      struct ref *remote_refs = transport_get_remote_refs(transport);
 +      const struct ref *remote_refs = transport_get_remote_refs(transport);
  
        if (ref_count || tags) {
                for (i = 0; i < ref_count; i++) {
        return ref_map;
  }
  
- static void show_new(enum object_type type, unsigned char *sha1_new)
- {
-       fprintf(stderr, "  %s: %s\n", typename(type),
-               find_unique_abbrev(sha1_new, DEFAULT_ABBREV));
- }
  static int s_update_ref(const char *action,
                        struct ref *ref,
                        int check_old)
        return 0;
  }
  
+ #define SUMMARY_WIDTH (2 * DEFAULT_ABBREV + 3)
  static int update_local_ref(struct ref *ref,
-                           const char *note,
-                           int verbose)
+                           const char *remote,
+                           int verbose,
+                           char *display)
  {
-       char oldh[41], newh[41];
        struct commit *current = NULL, *updated;
        enum object_type type;
        struct branch *current_branch = branch_get(NULL);
+       const char *pretty_ref = ref->name + (
+               !prefixcmp(ref->name, "refs/heads/") ? 11 :
+               !prefixcmp(ref->name, "refs/tags/") ? 10 :
+               !prefixcmp(ref->name, "refs/remotes/") ? 13 :
+               0);
  
+       *display = 0;
        type = sha1_object_info(ref->new_sha1, NULL);
        if (type < 0)
                die("object %s not found", sha1_to_hex(ref->new_sha1));
  
        if (!*ref->name) {
                /* Not storing */
-               if (verbose) {
-                       fprintf(stderr, "* fetched %s\n", note);
-                       show_new(type, ref->new_sha1);
-               }
+               if (verbose)
+                       sprintf(display, "* branch %s -> FETCH_HEAD", remote);
                return 0;
        }
  
        if (!hashcmp(ref->old_sha1, ref->new_sha1)) {
-               if (verbose) {
-                       fprintf(stderr, "* %s: same as %s\n",
-                               ref->name, note);
-                       show_new(type, ref->new_sha1);
-               }
+               if (verbose)
+                       sprintf(display, "= %-*s %s -> %s", SUMMARY_WIDTH,
+                               "[up to date]", remote, pretty_ref);
                return 0;
        }
  
                 * If this is the head, and it's not okay to update
                 * the head, and the old value of the head isn't empty...
                 */
-               fprintf(stderr,
-                       " * %s: Cannot fetch into the current branch.\n",
-                       ref->name);
+               sprintf(display, "! %-*s %s -> %s  (can't  fetch in current branch)",
+                       SUMMARY_WIDTH, "[rejected]", remote, pretty_ref);
                return 1;
        }
  
        if (!is_null_sha1(ref->old_sha1) &&
            !prefixcmp(ref->name, "refs/tags/")) {
-               fprintf(stderr, "* %s: updating with %s\n",
-                       ref->name, note);
-               show_new(type, ref->new_sha1);
+               sprintf(display, "- %-*s %s -> %s",
+                       SUMMARY_WIDTH, "[tag update]", remote, pretty_ref);
                return s_update_ref("updating tag", ref, 0);
        }
  
        current = lookup_commit_reference_gently(ref->old_sha1, 1);
        updated = lookup_commit_reference_gently(ref->new_sha1, 1);
        if (!current || !updated) {
-               char *msg;
-               if (!strncmp(ref->name, "refs/tags/", 10))
+               const char *msg;
+               const char *what;
+               if (!strncmp(ref->name, "refs/tags/", 10)) {
                        msg = "storing tag";
-               else
+                       what = "[new tag]";
+               }
+               else {
                        msg = "storing head";
-               fprintf(stderr, "* %s: storing %s\n",
-                       ref->name, note);
-               show_new(type, ref->new_sha1);
+                       what = "[new branch]";
+               }
+               sprintf(display, "* %-*s %s -> %s",
+                       SUMMARY_WIDTH, what, remote, pretty_ref);
                return s_update_ref(msg, ref, 0);
        }
  
-       strcpy(oldh, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV));
-       strcpy(newh, find_unique_abbrev(ref->new_sha1, DEFAULT_ABBREV));
        if (in_merge_bases(current, &updated, 1)) {
-               fprintf(stderr, "* %s: fast forward to %s\n",
-                       ref->name, note);
-               fprintf(stderr, "  old..new: %s..%s\n", oldh, newh);
+               char quickref[83];
+               strcpy(quickref, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV));
+               strcat(quickref, "..");
+               strcat(quickref, find_unique_abbrev(ref->new_sha1, DEFAULT_ABBREV));
+               sprintf(display, "  %-*s %s -> %s  (fast forward)",
+                       SUMMARY_WIDTH, quickref, remote, pretty_ref);
                return s_update_ref("fast forward", ref, 1);
-       }
-       if (!force && !ref->force) {
-               fprintf(stderr,
-                       "* %s: not updating to non-fast forward %s\n",
-                       ref->name, note);
-               fprintf(stderr,
-                       "  old...new: %s...%s\n", oldh, newh);
+       } else if (force || ref->force) {
+               char quickref[84];
+               strcpy(quickref, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV));
+               strcat(quickref, "...");
+               strcat(quickref, find_unique_abbrev(ref->new_sha1, DEFAULT_ABBREV));
+               sprintf(display, "+ %-*s %s -> %s  (forced update)",
+                       SUMMARY_WIDTH, quickref, remote, pretty_ref);
+               return s_update_ref("forced-update", ref, 1);
+       } else {
+               sprintf(display, "! %-*s %s -> %s  (non fast forward)",
+                       SUMMARY_WIDTH, "[rejected]", remote, pretty_ref);
                return 1;
        }
-       fprintf(stderr,
-               "* %s: forcing update to non-fast forward %s\n",
-               ref->name, note);
-       fprintf(stderr, "  old...new: %s...%s\n", oldh, newh);
-       return s_update_ref("forced-update", ref, 1);
  }
  
  static void store_updated_refs(const char *url, struct ref *ref_map)
  {
        FILE *fp;
        struct commit *commit;
-       int url_len, i, note_len;
+       int url_len, i, note_len, shown_url = 0;
        char note[1024];
        const char *what, *kind;
        struct ref *rm;
                        rm->merge ? "" : "not-for-merge",
                        note);
  
-               if (ref)
-                       update_local_ref(ref, note, verbose);
+               if (ref) {
+                       update_local_ref(ref, what, verbose, note);
+                       if (*note) {
+                               if (!shown_url) {
+                                       fprintf(stderr, "From %.*s\n",
+                                                       url_len, url);
+                                       shown_url = 1;
+                               }
+                               fprintf(stderr, " %s\n", note);
+                       }
+               }
        }
        fclose(fp);
  }
@@@ -345,12 -354,12 +354,12 @@@ static struct ref *find_non_local_tags(
        struct path_list new_refs = { NULL, 0, 0, 1 };
        char *ref_name;
        int ref_name_len;
 -      unsigned char *ref_sha1;
 -      struct ref *tag_ref;
 +      const unsigned char *ref_sha1;
 +      const struct ref *tag_ref;
        struct ref *rm = NULL;
        struct ref *ref_map = NULL;
        struct ref **tail = &ref_map;
 -      struct ref *ref;
 +      const struct ref *ref;
  
        for_each_ref(add_existing, &existing_refs);
        for (ref = transport_get_remote_refs(transport); ref; ref = ref->next) {
                if (!path_list_has_path(&existing_refs, ref_name) &&
                    !path_list_has_path(&new_refs, ref_name) &&
                    lookup_object(ref->old_sha1)) {
-                       fprintf(stderr, "Auto-following %s\n",
-                               ref_name);
                        path_list_insert(ref_name, &new_refs);
  
                        rm = alloc_ref(strlen(ref_name) + 1);
@@@ -517,7 -523,7 +523,7 @@@ int cmd_fetch(int argc, const char **ar
                        depth = argv[i];
                        continue;
                }
-               if (!strcmp(arg, "--quiet")) {
+               if (!strcmp(arg, "--quiet") || !strcmp(arg, "-q")) {
                        quiet = 1;
                        continue;
                }
diff --combined cache.h
index 119566bf6f55215036cc8450f0ad5a8e680be6be,f0a25c7ffcd47d663f2d41cd29dbabc57c2cab93..e5ea637c2941550624ac49a12a7ea64e44b3c2d3
+++ b/cache.h
@@@ -7,7 -7,7 +7,7 @@@
  #include SHA1_HEADER
  #include <zlib.h>
  
- #if ZLIB_VERNUM < 0x1200
+ #if defined(NO_DEFLATE_BOUND) || ZLIB_VERNUM < 0x1200
  #define deflateBound(c,s)  ((s) + (((s) + 7) >> 3) + (((s) + 63) >> 6) + 11)
  #endif
  
@@@ -222,6 -222,7 +222,7 @@@ extern const char *get_git_work_tree(vo
  #define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
  
  extern const char **get_pathspec(const char *prefix, const char **pathspec);
+ extern void setup_work_tree(void);
  extern const char *setup_git_directory_gently(int *);
  extern const char *setup_git_directory(void);
  extern const char *prefix_path(const char *prefix, int len, const char *path);
@@@ -503,7 -504,7 +504,7 @@@ struct ref 
  #define REF_TAGS      (1u << 2)
  
  #define CONNECT_VERBOSE       (1u << 0)
 -extern struct child_process *git_connect(int fd[2], char *url, const char *prog, int flags);
 +extern struct child_process *git_connect(int fd[2], const char *url, const char *prog, int flags);
  extern int finish_connect(struct child_process *conn);
  extern int path_match(const char *path, int nr, char **match);
  extern int get_ack(int fd, unsigned char *result_sha1);
diff --combined git.c
index b173f227f0f61f05b2ca1bffd07a1948dc66de16,4a250f7e8b84f2334c84daaf93baa0fe1f0ca344..6c5f9af13af5a59606008efe29291d53b3c0cdc0
--- 1/git.c
--- 2/git.c
+++ b/git.c
@@@ -249,14 -249,9 +249,9 @@@ static int run_command(struct cmd_struc
                prefix = setup_git_directory();
        if (p->option & USE_PAGER)
                setup_pager();
-       if (p->option & NEED_WORK_TREE) {
-               const char *work_tree = get_git_work_tree();
-               const char *git_dir = get_git_dir();
-               if (!is_absolute_path(git_dir))
-                       set_git_dir(make_absolute_path(git_dir));
-               if (!work_tree || chdir(work_tree))
-                       die("%s must be run in a work tree", p->cmd);
-       }
+       if (p->option & NEED_WORK_TREE)
+               setup_work_tree();
        trace_argv_printf(argv, argc, "trace: built-in: git");
  
        status = p->fn(argc, argv, prefix);
@@@ -326,7 -321,6 +321,7 @@@ static void handle_internal_command(in
                { "log", cmd_log, RUN_SETUP | USE_PAGER },
                { "ls-files", cmd_ls_files, RUN_SETUP },
                { "ls-tree", cmd_ls_tree, RUN_SETUP },
 +              { "ls-remote", cmd_ls_remote },
                { "mailinfo", cmd_mailinfo },
                { "mailsplit", cmd_mailsplit },
                { "merge-base", cmd_merge_base, RUN_SETUP },
                { "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE },
                { "name-rev", cmd_name_rev, RUN_SETUP },
                { "pack-objects", cmd_pack_objects, RUN_SETUP },
 +              { "peek-remote", cmd_ls_remote },
                { "pickaxe", cmd_blame, RUN_SETUP },
                { "prune", cmd_prune, RUN_SETUP },
                { "prune-packed", cmd_prune_packed, RUN_SETUP },
                { "rev-list", cmd_rev_list, RUN_SETUP },
                { "rev-parse", cmd_rev_parse, RUN_SETUP },
                { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },
-               { "rm", cmd_rm, RUN_SETUP | NEED_WORK_TREE },
+               { "rm", cmd_rm, RUN_SETUP },
                { "runstatus", cmd_runstatus, RUN_SETUP | NEED_WORK_TREE },
 +              { "send-pack", cmd_send_pack, RUN_SETUP },
                { "shortlog", cmd_shortlog, RUN_SETUP | USE_PAGER },
                { "show-branch", cmd_show_branch, RUN_SETUP },
                { "show", cmd_show, RUN_SETUP | USE_PAGER },
diff --combined http-push.c
index f461bb32481ca5a6e8b119ede9c517876cc4e699,9314621a11030e66eeba7f0da6b88a813e1ba759..99328f5909d4db247fa2453df9ac14cde0c61c9a
@@@ -2241,7 -2241,11 +2241,11 @@@ static int delete_remote_branch(char *p
  
                /* Remote branch must be an ancestor of remote HEAD */
                if (!verify_merge_base(head_sha1, remote_ref->old_sha1)) {
-                       return error("The branch '%s' is not a strict subset of your current HEAD.\nIf you are sure you want to delete it, run:\n\t'git http-push -D %s %s'", remote_ref->name, remote->url, pattern);
+                       return error("The branch '%s' is not an ancestor "
+                                    "of your current HEAD.\n"
+                                    "If you are sure you want to delete it,"
+                                    " run:\n\t'git http-push -D %s %s'",
+                                    remote_ref->name, remote->url, pattern);
                }
        }
  
@@@ -2389,7 -2393,7 +2393,7 @@@ int main(int argc, char **argv
        if (!remote_tail)
                remote_tail = &remote_refs;
        if (match_refs(local_refs, remote_refs, &remote_tail,
 -                     nr_refspec, refspec, push_all))
 +                     nr_refspec, (const char **) refspec, push_all))
                return -1;
        if (!remote_refs) {
                fprintf(stderr, "No refs in common and none specified; doing nothing.\n");
                        if (!has_sha1_file(ref->old_sha1) ||
                            !ref_newer(ref->peer_ref->new_sha1,
                                       ref->old_sha1)) {
-                               /* We do not have the remote ref, or
+                               /*
+                                * We do not have the remote ref, or
                                 * we know that the remote ref is not
                                 * an ancestor of what we are trying to
                                 * push.  Either way this can be losing
                                 * commits at the remote end and likely
                                 * we were not up to date to begin with.
                                 */
-                               error("remote '%s' is not a strict "
-                                     "subset of local ref '%s'. "
-                                     "maybe you are not up-to-date and "
+                               error("remote '%s' is not an ancestor of\n"
+                                     "local '%s'.\n"
+                                     "Maybe you are not up-to-date and "
                                      "need to pull first?",
                                      ref->name,
                                      ref->peer_ref->name);
diff --combined transport.c
index f4577b7fc6cc95260045403e075597e54dfce526,fa5cfbb09d18d4546725e947933b22bb32c3ec2c..83677fca4058e94dbe253c472588393064ed5250
@@@ -6,7 -6,6 +6,7 @@@
  #endif
  #include "pkt-line.h"
  #include "fetch-pack.h"
 +#include "send-pack.h"
  #include "walker.h"
  #include "bundle.h"
  #include "dir.h"
@@@ -142,7 -141,7 +142,7 @@@ static void insert_packed_refs(const ch
        }
  }
  
 -static struct ref *get_refs_via_rsync(const struct transport *transport)
 +static struct ref *get_refs_via_rsync(struct transport *transport)
  {
        struct strbuf buf = STRBUF_INIT, temp_dir = STRBUF_INIT;
        struct ref dummy, *tail = &dummy;
@@@ -381,7 -380,8 +381,8 @@@ static int disconnect_walker(struct tra
  }
  
  #ifndef NO_CURL
- static int curl_transport_push(struct transport *transport, int refspec_nr, const char **refspec, int flags) {
+ static int curl_transport_push(struct transport *transport, int refspec_nr, const char **refspec, int flags)
+ {
        const char **argv;
        int argc;
        int err;
@@@ -428,7 -428,7 +429,7 @@@ static int missing__target(int code, in
  
  #define missing_target(a) missing__target((a)->http_code, (a)->curl_result)
  
 -static struct ref *get_refs_via_curl(const struct transport *transport)
 +static struct ref *get_refs_via_curl(struct transport *transport)
  {
        struct buffer buffer;
        char *data, *start, *mid;
@@@ -525,7 -525,7 +526,7 @@@ struct bundle_transport_data 
        struct bundle_header header;
  };
  
 -static struct ref *get_refs_from_bundle(const struct transport *transport)
 +static struct ref *get_refs_from_bundle(struct transport *transport)
  {
        struct bundle_transport_data *data = transport->data;
        struct ref *result = NULL;
@@@ -597,7 -597,7 +598,7 @@@ static int set_git_option(struct transp
        return 1;
  }
  
 -static struct ref *get_refs_via_connect(const struct transport *transport)
 +static struct ref *get_refs_via_connect(struct transport *transport)
  {
        struct git_transport_data *data = transport->data;
        struct ref *refs;
@@@ -647,18 -647,51 +648,19 @@@ static int fetch_refs_via_pack(struct t
        return 0;
  }
  
- static int git_transport_push(struct transport *transport, int refspec_nr, const char **refspec, int flags) {
+ static int git_transport_push(struct transport *transport, int refspec_nr, const char **refspec, int flags)
+ {
        struct git_transport_data *data = transport->data;
 -      const char **argv;
 -      char *rem;
 -      int argc;
 -      int err;
 +      struct send_pack_args args;
  
 -      argv = xmalloc((refspec_nr + 11) * sizeof(char *));
 -      argv[0] = "send-pack";
 -      argc = 1;
 -      if (flags & TRANSPORT_PUSH_ALL)
 -              argv[argc++] = "--all";
 -      if (flags & TRANSPORT_PUSH_FORCE)
 -              argv[argc++] = "--force";
 -      if (flags & TRANSPORT_PUSH_DRY_RUN)
 -              argv[argc++] = "--dry-run";
 -      if (data->receivepack) {
 -              char *rp = xmalloc(strlen(data->receivepack) + 16);
 -              sprintf(rp, "--receive-pack=%s", data->receivepack);
 -              argv[argc++] = rp;
 -      }
 -      if (data->thin)
 -              argv[argc++] = "--thin";
 -      rem = xmalloc(strlen(transport->remote->name) + 10);
 -      sprintf(rem, "--remote=%s", transport->remote->name);
 -      argv[argc++] = rem;
 -      argv[argc++] = transport->url;
 -      while (refspec_nr--)
 -              argv[argc++] = *refspec++;
 -      argv[argc] = NULL;
 -      err = run_command_v_opt(argv, RUN_GIT_CMD);
 -      switch (err) {
 -      case -ERR_RUN_COMMAND_FORK:
 -              error("unable to fork for %s", argv[0]);
 -      case -ERR_RUN_COMMAND_EXEC:
 -              error("unable to exec %s", argv[0]);
 -              break;
 -      case -ERR_RUN_COMMAND_WAITPID:
 -      case -ERR_RUN_COMMAND_WAITPID_WRONG_PID:
 -      case -ERR_RUN_COMMAND_WAITPID_SIGNAL:
 -      case -ERR_RUN_COMMAND_WAITPID_NOEXIT:
 -              error("%s died with strange error", argv[0]);
 -      }
 -      return !!err;
 +      args.receivepack = data->receivepack;
 +      args.send_all = !!(flags & TRANSPORT_PUSH_ALL);
 +      args.force_update = !!(flags & TRANSPORT_PUSH_FORCE);
 +      args.use_thin_pack = data->thin;
 +      args.verbose = transport->verbose;
 +      args.dry_run = !!(flags & TRANSPORT_PUSH_DRY_RUN);
 +
 +      return send_pack(&args, transport->url, transport->remote, refspec_nr, refspec);
  }
  
  static int disconnect_git(struct transport *transport)
@@@ -750,7 -783,7 +752,7 @@@ int transport_push(struct transport *tr
        return transport->push(transport, refspec_nr, refspec, flags);
  }
  
 -struct ref *transport_get_remote_refs(struct transport *transport)
 +const struct ref *transport_get_remote_refs(struct transport *transport)
  {
        if (!transport->remote_refs)
                transport->remote_refs = transport->get_refs_list(transport);