Sync with 2.6.1
authorJunio C Hamano <gitster@pobox.com>
Mon, 5 Oct 2015 19:46:27 +0000 (12:46 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 5 Oct 2015 20:20:08 +0000 (13:20 -0700)
1  2 
builtin/blame.c
builtin/rerere.c
connect.c
git-submodule.sh
diff --combined builtin/blame.c
index 01ea7707875e167a666aedfa412c3bf24d728675,245d253d041021429265eb81fb008e528613af34..203a981cd083a0ea971c7315f60f04e721d1e468
@@@ -974,7 -974,10 +974,10 @@@ static void pass_blame_to_parent(struc
        fill_origin_blob(&sb->revs->diffopt, target, &file_o);
        num_get_patch++;
  
-       diff_hunks(&file_p, &file_o, 0, blame_chunk_cb, &d);
+       if (diff_hunks(&file_p, &file_o, 0, blame_chunk_cb, &d))
+               die("unable to generate diff (%s -> %s)",
+                   sha1_to_hex(parent->commit->object.sha1),
+                   sha1_to_hex(target->commit->object.sha1));
        /* The rest are the same as the parent */
        blame_chunk(&d.dstq, &d.srcq, INT_MAX, d.offset, INT_MAX, parent);
        *d.dstq = NULL;
@@@ -1120,7 -1123,9 +1123,9 @@@ static void find_copy_in_blob(struct sc
         * file_p partially may match that image.
         */
        memset(split, 0, sizeof(struct blame_entry [3]));
-       diff_hunks(file_p, &file_o, 1, handle_split_cb, &d);
+       if (diff_hunks(file_p, &file_o, 1, handle_split_cb, &d))
+               die("unable to generate diff (%s)",
+                   sha1_to_hex(parent->commit->object.sha1));
        /* remainder, if any, all match the preimage */
        handle_split(sb, ent, d.tlno, d.plno, ent->num_lines, parent, split);
  }
@@@ -1366,15 -1371,8 +1371,15 @@@ static void pass_whole_blame(struct sco
   */
  static struct commit_list *first_scapegoat(struct rev_info *revs, struct commit *commit)
  {
 -      if (!reverse)
 +      if (!reverse) {
 +              if (revs->first_parent_only &&
 +                  commit->parents &&
 +                  commit->parents->next) {
 +                      free_commit_list(commit->parents->next);
 +                      commit->parents->next = NULL;
 +              }
                return commit->parents;
 +      }
        return lookup_decoration(&revs->children, &commit->object);
  }
  
@@@ -2607,6 -2605,7 +2612,6 @@@ parse_done
                   fewer display columns. */
                blame_date_width = utf8_strwidth(_("4 years, 11 months ago")) + 1; /* add the null */
                break;
 -      case DATE_LOCAL:
        case DATE_NORMAL:
                blame_date_width = sizeof("Thu Oct 19 16:00:04 2006 -0700");
                break;
        }
        else if (contents_from)
                die("--contents and --children do not blend well.");
 +      else if (revs.first_parent_only)
 +              die("combining --first-parent and --reverse is not supported");
        else {
                final_commit_name = prepare_initial(&sb);
                sb.commits.compare = compare_commits_by_reverse_commit_date;
diff --combined builtin/rerere.c
index 8c6cb6cdc633db0a967feed1457c4aac60176088,88e1359ebcaad338d96dd942a5f88f54d6cce271..1bf72423bf72d7b7d224c14808b0652d78305d63
@@@ -29,9 -29,10 +29,10 @@@ static int diff_two(const char *file1, 
        xdemitconf_t xecfg;
        xdemitcb_t ecb;
        mmfile_t minus, plus;
+       int ret;
  
        if (read_mmfile(&minus, file1) || read_mmfile(&plus, file2))
-               return 1;
+               return -1;
  
        printf("--- a/%s\n+++ b/%s\n", label1, label2);
        fflush(stdout);
        memset(&xecfg, 0, sizeof(xecfg));
        xecfg.ctxlen = 3;
        ecb.outf = outf;
-       xdi_diff(&minus, &plus, &xpp, &xecfg, &ecb);
+       ret = xdi_diff(&minus, &plus, &xpp, &xecfg, &ecb);
  
        free(minus.ptr);
        free(plus.ptr);
-       return 0;
+       return ret;
  }
  
  int cmd_rerere(int argc, const char **argv, const char *prefix)
                        return 0;
                for (i = 0; i < merge_rr.nr; i++) {
                        const char *path = merge_rr.items[i].string;
 -                      const char *name = (const char *)merge_rr.items[i].util;
 -                      if (diff_two(rerere_path(name, "preimage"), path, path, path))
 -                              die("unable to generate diff for %s", name);
 +                      const struct rerere_id *id = merge_rr.items[i].util;
-                       diff_two(rerere_path(id, "preimage"), path, path, path);
++                      if (diff_two(rerere_path(id, "preimage"), path, path, path))
++                              die("unable to generate diff for %s", rerere_path(id, NULL));
                }
        } else
                usage_with_options(rerere_usage, options);
diff --combined connect.c
index acd39d70c8781d837bce45317d6b9641a522f85f,27a706f76621621a25b7e58188e5d1da9b9a2ccd..ced4961398d397e0e21661ce7105be293c3585c2
+++ b/connect.c
@@@ -9,6 -9,7 +9,7 @@@
  #include "url.h"
  #include "string-list.h"
  #include "sha1-array.h"
+ #include "transport.h"
  
  static char *server_capabilities;
  static const char *parse_feature_value(const char *, const char *, int *);
@@@ -694,6 -695,8 +695,8 @@@ struct child_process *git_connect(int f
                else
                        target_host = xstrdup(hostandport);
  
+               transport_check_allowed("git");
                /* These underlying connection commands die() if they
                 * cannot connect.
                 */
                strbuf_addch(&cmd, ' ');
                sq_quote_buf(&cmd, path);
  
 +              /* remove repo-local variables from the environment */
 +              conn->env = local_repo_env;
 +              conn->use_shell = 1;
                conn->in = conn->out = -1;
                if (protocol == PROTO_SSH) {
                        const char *ssh;
 -                      int putty, tortoiseplink = 0;
 +                      int putty = 0, tortoiseplink = 0;
                        char *ssh_host = hostandport;
                        const char *port = NULL;
+                       transport_check_allowed("ssh");
                        get_host_and_port(&ssh_host, &port);
  
                        if (!port)
                        }
  
                        ssh = getenv("GIT_SSH_COMMAND");
 -                      if (ssh) {
 -                              conn->use_shell = 1;
 -                              putty = 0;
 -                      } else {
 +                      if (!ssh) {
                                const char *base;
                                char *ssh_dup;
  
 +                              /*
 +                               * GIT_SSH is the no-shell version of
 +                               * GIT_SSH_COMMAND (and must remain so for
 +                               * historical compatibility).
 +                               */
 +                              conn->use_shell = 0;
 +
                                ssh = getenv("GIT_SSH");
                                if (!ssh)
                                        ssh = "ssh";
  
                                tortoiseplink = !strcasecmp(base, "tortoiseplink") ||
                                        !strcasecmp(base, "tortoiseplink.exe");
 -                              putty = !strcasecmp(base, "plink") ||
 -                                      !strcasecmp(base, "plink.exe") || tortoiseplink;
 +                              putty = tortoiseplink ||
 +                                      !strcasecmp(base, "plink") ||
 +                                      !strcasecmp(base, "plink.exe");
  
                                free(ssh_dup);
                        }
                                argv_array_push(&conn->args, port);
                        }
                        argv_array_push(&conn->args, ssh_host);
 -                      /* remove repo-local variables from the environment */
 -                      conn->env = local_repo_env;
 -                      conn->use_shell = 1;
+               } else {
+                       transport_check_allowed("file");
                }
                argv_array_push(&conn->args, cmd.buf);
  
diff --combined git-submodule.sh
index 1ac321cfaa52664336665d38311142d31c2bfef4,82e35582cd8e741280229f377b4f61d7d985bc6a..9bc5c5f94d1d7b24dffae649cca371299540aa46
@@@ -22,6 -22,15 +22,15 @@@ require_work_tre
  wt_prefix=$(git rev-parse --show-prefix)
  cd_to_toplevel
  
+ # Restrict ourselves to a vanilla subset of protocols; the URLs
+ # we get are under control of a remote repository, and we do not
+ # want them kicking off arbitrary git-remote-* programs.
+ #
+ # If the user has already specified a set of allowed protocols,
+ # we assume they know what they're doing and use that instead.
+ : ${GIT_ALLOW_PROTOCOL=file:git:http:https:ssh}
+ export GIT_ALLOW_PROTOCOL
  command=
  branch=
  force=
@@@ -145,6 -154,48 +154,6 @@@ relative_path (
        echo "$result$target"
  }
  
 -#
 -# Get submodule info for registered submodules
 -# $@ = path to limit submodule list
 -#
 -module_list()
 -{
 -      eval "set $(git rev-parse --sq --prefix "$wt_prefix" -- "$@")"
 -      (
 -              git ls-files -z --error-unmatch --stage -- "$@" ||
 -              echo "unmatched pathspec exists"
 -      ) |
 -      @@PERL@@ -e '
 -      my %unmerged = ();
 -      my ($null_sha1) = ("0" x 40);
 -      my @out = ();
 -      my $unmatched = 0;
 -      $/ = "\0";
 -      while (<STDIN>) {
 -              if (/^unmatched pathspec/) {
 -                      $unmatched = 1;
 -                      next;
 -              }
 -              chomp;
 -              my ($mode, $sha1, $stage, $path) =
 -                      /^([0-7]+) ([0-9a-f]{40}) ([0-3])\t(.*)$/;
 -              next unless $mode eq "160000";
 -              if ($stage ne "0") {
 -                      if (!$unmerged{$path}++) {
 -                              push @out, "$mode $null_sha1 U\t$path\n";
 -                      }
 -                      next;
 -              }
 -              push @out, "$_\n";
 -      }
 -      if ($unmatched) {
 -              print "#unmatched\n";
 -      } else {
 -              print for (@out);
 -      }
 -      '
 -}
 -
  die_if_unmatched ()
  {
        if test "$1" = "#unmatched"
@@@ -178,6 -229,98 +187,6 @@@ get_submodule_config () 
        printf '%s' "${value:-$default}"
  }
  
 -
 -#
 -# Map submodule path to submodule name
 -#
 -# $1 = path
 -#
 -module_name()
 -{
 -      # Do we have "submodule.<something>.path = $1" defined in .gitmodules file?
 -      sm_path="$1"
 -      re=$(printf '%s\n' "$1" | sed -e 's/[].[^$\\*]/\\&/g')
 -      name=$( git config -f .gitmodules --get-regexp '^submodule\..*\.path$' |
 -              sed -n -e 's|^submodule\.\(.*\)\.path '"$re"'$|\1|p' )
 -      test -z "$name" &&
 -      die "$(eval_gettext "No submodule mapping found in .gitmodules for path '\$sm_path'")"
 -      printf '%s\n' "$name"
 -}
 -
 -#
 -# Clone a submodule
 -#
 -# $1 = submodule path
 -# $2 = submodule name
 -# $3 = URL to clone
 -# $4 = reference repository to reuse (empty for independent)
 -# $5 = depth argument for shallow clones (empty for deep)
 -#
 -# Prior to calling, cmd_update checks that a possibly existing
 -# path is not a git repository.
 -# Likewise, cmd_add checks that path does not exist at all,
 -# since it is the location of a new submodule.
 -#
 -module_clone()
 -{
 -      sm_path=$1
 -      name=$2
 -      url=$3
 -      reference="$4"
 -      depth="$5"
 -      quiet=
 -      if test -n "$GIT_QUIET"
 -      then
 -              quiet=-q
 -      fi
 -
 -      gitdir=
 -      gitdir_base=
 -      base_name=$(dirname "$name")
 -
 -      gitdir=$(git rev-parse --git-dir)
 -      gitdir_base="$gitdir/modules/$base_name"
 -      gitdir="$gitdir/modules/$name"
 -
 -      if test -d "$gitdir"
 -      then
 -              mkdir -p "$sm_path"
 -              rm -f "$gitdir/index"
 -      else
 -              mkdir -p "$gitdir_base"
 -              (
 -                      clear_local_git_env
 -                      git clone $quiet ${depth:+"$depth"} -n ${reference:+"$reference"} \
 -                              --separate-git-dir "$gitdir" "$url" "$sm_path"
 -              ) ||
 -              die "$(eval_gettext "Clone of '\$url' into submodule path '\$sm_path' failed")"
 -      fi
 -
 -      # We already are at the root of the work tree but cd_to_toplevel will
 -      # resolve any symlinks that might be present in $PWD
 -      a=$(cd_to_toplevel && cd "$gitdir" && pwd)/
 -      b=$(cd_to_toplevel && cd "$sm_path" && pwd)/
 -      # Remove all common leading directories after a sanity check
 -      if test "${a#$b}" != "$a" || test "${b#$a}" != "$b"; then
 -              die "$(eval_gettext "Gitdir '\$a' is part of the submodule path '\$b' or vice versa")"
 -      fi
 -      while test "${a%%/*}" = "${b%%/*}"
 -      do
 -              a=${a#*/}
 -              b=${b#*/}
 -      done
 -      # Now chop off the trailing '/'s that were added in the beginning
 -      a=${a%/}
 -      b=${b%/}
 -
 -      # Turn each leading "*/" component into "../"
 -      rel=$(printf '%s\n' "$b" | sed -e 's|[^/][^/]*|..|g')
 -      printf '%s\n' "gitdir: $rel/$a" >"$sm_path/.git"
 -
 -      rel=$(printf '%s\n' "$a" | sed -e 's|[^/][^/]*|..|g')
 -      (clear_local_git_env; cd "$sm_path" && GIT_WORK_TREE=. git config core.worktree "$rel/$b")
 -}
 -
  isnumber()
  {
        n=$(($1 + 0)) 2>/dev/null && test "$n" = "$1"
@@@ -338,7 -481,7 +347,7 @@@ Use -f if you really want to add it." >
                                echo "$(eval_gettext "Reactivating local git directory for submodule '\$sm_name'.")"
                        fi
                fi
 -              module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" "$depth" || exit
 +              git submodule--helper clone ${GIT_QUIET:+--quiet} --prefix "$wt_prefix" --path "$sm_path" --name "$sm_name" --url "$realrepo" "$reference" "$depth" || exit
                (
                        clear_local_git_env
                        cd "$sm_path" &&
@@@ -398,7 -541,7 +407,7 @@@ cmd_foreach(
        # command in the subshell (and a recursive call to this function)
        exec 3<&0
  
 -      module_list |
 +      git submodule--helper list --prefix "$wt_prefix"|
        while read mode sha1 stage sm_path
        do
                die_if_unmatched "$mode"
                then
                        displaypath=$(relative_path "$sm_path")
                        say "$(eval_gettext "Entering '\$prefix\$displaypath'")"
 -                      name=$(module_name "$sm_path")
 +                      name=$(git submodule--helper name "$sm_path")
                        (
                                prefix="$prefix$sm_path/"
                                clear_local_git_env
@@@ -458,11 -601,11 +467,11 @@@ cmd_init(
                shift
        done
  
 -      module_list "$@" |
 +      git submodule--helper list --prefix "$wt_prefix" "$@" |
        while read mode sha1 stage sm_path
        do
                die_if_unmatched "$mode"
 -              name=$(module_name "$sm_path") || exit
 +              name=$(git submodule--helper name "$sm_path") || exit
  
                displaypath=$(relative_path "$sm_path")
  
@@@ -540,11 -683,11 +549,11 @@@ cmd_deinit(
                die "$(eval_gettext "Use '.' if you really want to deinitialize all submodules")"
        fi
  
 -      module_list "$@" |
 +      git submodule--helper list --prefix "$wt_prefix" "$@" |
        while read mode sha1 stage sm_path
        do
                die_if_unmatched "$mode"
 -              name=$(module_name "$sm_path") || exit
 +              name=$(git submodule--helper name "$sm_path") || exit
  
                displaypath=$(relative_path "$sm_path")
  
@@@ -656,7 -799,7 +665,7 @@@ cmd_update(
        fi
  
        cloned_modules=
 -      module_list "$@" | {
 +      git submodule--helper list --prefix "$wt_prefix" "$@" | {
        err=
        while read mode sha1 stage sm_path
        do
                        echo >&2 "Skipping unmerged submodule $prefix$sm_path"
                        continue
                fi
 -              name=$(module_name "$sm_path") || exit
 +              name=$(git submodule--helper name "$sm_path") || exit
                url=$(git config submodule."$name".url)
                branch=$(get_submodule_config "$name" branch master)
                if ! test -z "$update"
@@@ -700,7 -843,7 +709,7 @@@ Maybe you want to use 'update --init'?"
  
                if ! test -d "$sm_path"/.git && ! test -f "$sm_path"/.git
                then
 -                      module_clone "$sm_path" "$name" "$url" "$reference" "$depth" || exit
 +                      git submodule--helper clone ${GIT_QUIET:+--quiet} --prefix "$prefix" --path "$sm_path" --name "$name" --url "$url" "$reference" "$depth" || exit
                        cloned_modules="$cloned_modules;$name"
                        subsha1=
                else
@@@ -930,7 -1073,7 +939,7 @@@ cmd_summary() 
                        # Respect the ignore setting for --for-status.
                        if test -n "$for_status"
                        then
 -                              name=$(module_name "$sm_path")
 +                              name=$(git submodule--helper name "$sm_path")
                                ignore_config=$(get_submodule_config "$name" ignore none)
                                test $status != A && test $ignore_config = all && continue
                        fi
@@@ -1088,11 -1231,11 +1097,11 @@@ cmd_status(
                shift
        done
  
 -      module_list "$@" |
 +      git submodule--helper list --prefix "$wt_prefix" "$@" |
        while read mode sha1 stage sm_path
        do
                die_if_unmatched "$mode"
 -              name=$(module_name "$sm_path") || exit
 +              name=$(git submodule--helper name "$sm_path") || exit
                url=$(git config submodule."$name".url)
                displaypath=$(relative_path "$prefix$sm_path")
                if test "$stage" = U
@@@ -1165,11 -1308,11 +1174,11 @@@ cmd_sync(
                esac
        done
        cd_to_toplevel
 -      module_list "$@" |
 +      git submodule--helper list --prefix "$wt_prefix" "$@" |
        while read mode sha1 stage sm_path
        do
                die_if_unmatched "$mode"
 -              name=$(module_name "$sm_path")
 +              name=$(git submodule--helper name "$sm_path")
                url=$(git config -f .gitmodules --get submodule."$name".url)
  
                # Possibly a url relative to parent