Merge branch 'jc/clone'
authorJunio C Hamano <junkio@cox.net>
Wed, 20 Dec 2006 21:56:14 +0000 (13:56 -0800)
committerJunio C Hamano <junkio@cox.net>
Wed, 20 Dec 2006 21:56:14 +0000 (13:56 -0800)
* jc/clone:
Move "no merge candidate" warning into git-pull
Use preprocessor constants for environment variable names.
Do not create $GIT_DIR/remotes/ directory anymore.
Introduce GIT_TEMPLATE_DIR
Revert "fix testsuite: make sure they use templates freshly built from the source"
fix testsuite: make sure they use templates freshly built from the source
git-clone: lose the traditional 'no-separate-remote' layout
git-clone: lose the artificial "first" fetch refspec
git-pull: refuse default merge without branch.*.merge
git-clone: use wildcard specification for tracking branches

13 files changed:
Documentation/git-clone.txt
builtin-init-db.c
builtin-repo-config.c
cache.h
config.c
exec_cmd.c
git-clone.sh
git-parse-remote.sh
git-pull.sh
merge-recursive.c
t/t5510-fetch.sh
t/test-lib.sh
templates/remotes-- [deleted file]
index bfddb21fee0a73641dbbbb7efb1863f162851653..874934a33243106544181ffeae2fee8b03ff5e8d 100644 (file)
@@ -11,8 +11,7 @@ SYNOPSIS
 [verse]
 'git-clone' [--template=<template_directory>] [-l [-s]] [-q] [-n] [--bare]
          [-o <name>] [-u <upload-pack>] [--reference <repository>]
-         [--use-separate-remote | --no-separate-remote] <repository>
-         [<directory>]
+         <repository> [<directory>]
 
 DESCRIPTION
 -----------
@@ -99,18 +98,6 @@ OPTIONS
        if unset the templates are taken from the installation
        defined default, typically `/usr/share/git-core/templates`.
 
---use-separate-remote::
-       Save remotes heads under `$GIT_DIR/refs/remotes/origin/` instead
-       of `$GIT_DIR/refs/heads/`.  Only the local master branch is
-       saved in the latter. This is the default.
-
---no-separate-remote::
-       Save remotes heads in the same namespace as the local
-       heads, `$GIT_DIR/refs/heads/'.  In regular repositories,
-       this is a legacy setup git-clone created by default in
-       older Git versions, and will be removed before the next
-       major release.
-
 <repository>::
        The (possibly remote) repository to clone from.  It can
        be any URL git-fetch supports.
index 1d7d15e8d53a7a2817ceff6f5c5e056747688c9e..01f366ad0bf5860aaf9123ef5d5653c612871a9f 100644 (file)
@@ -124,8 +124,11 @@ static void copy_templates(const char *git_dir, int len, const char *template_di
        int template_len;
        DIR *dir;
 
-       if (!template_dir)
-               template_dir = DEFAULT_GIT_TEMPLATE_DIR;
+       if (!template_dir) {
+               template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT);
+               if (!template_dir)
+                       template_dir = DEFAULT_GIT_TEMPLATE_DIR;
+       }
        strcpy(template_path, template_dir);
        template_len = strlen(template_path);
        if (template_path[template_len-1] != '/') {
index a7ab4cee58fcd316497d10a766602e9fbd577998..90633119d4ae873ed30889e93dbb4307af0ae0d1 100644 (file)
@@ -66,10 +66,10 @@ static int get_value(const char* key_, const char* regex_)
        char *global = NULL, *repo_config = NULL;
        const char *local;
 
-       local = getenv("GIT_CONFIG");
+       local = getenv(CONFIG_ENVIRONMENT);
        if (!local) {
                const char *home = getenv("HOME");
-               local = getenv("GIT_CONFIG_LOCAL");
+               local = getenv(CONFIG_LOCAL_ENVIRONMENT);
                if (!local)
                        local = repo_config = xstrdup(git_path("config"));
                if (home)
diff --git a/cache.h b/cache.h
index 8ad5920d2be9593ad7810e3ccefa1c8b9f4e0750..4943056c19ffb72a7cfb994daaa788ec1b01d60b 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -122,6 +122,10 @@ extern int cache_errno;
 #define DB_ENVIRONMENT "GIT_OBJECT_DIRECTORY"
 #define INDEX_ENVIRONMENT "GIT_INDEX_FILE"
 #define GRAFT_ENVIRONMENT "GIT_GRAFT_FILE"
+#define TEMPLATE_DIR_ENVIRONMENT "GIT_TEMPLATE_DIR"
+#define CONFIG_ENVIRONMENT "GIT_CONFIG"
+#define CONFIG_LOCAL_ENVIRONMENT "GIT_CONFIG_LOCAL"
+#define EXEC_PATH_ENVIRONMENT "GIT_EXEC_PATH"
 
 extern int is_bare_git_dir(const char *dir);
 extern const char *get_git_dir(void);
index e86b2328abe11a7e1c299e65086a0dbcca721a6c..1662a4626e569b07d96c622b357928216a24538c 100644 (file)
--- a/config.c
+++ b/config.c
@@ -349,10 +349,10 @@ int git_config(config_fn_t fn)
         * $GIT_CONFIG_LOCAL will make it process it in addition to the
         * global config file, the same way it would the per-repository
         * config file otherwise. */
-       filename = getenv("GIT_CONFIG");
+       filename = getenv(CONFIG_ENVIRONMENT);
        if (!filename) {
                home = getenv("HOME");
-               filename = getenv("GIT_CONFIG_LOCAL");
+               filename = getenv(CONFIG_LOCAL_ENVIRONMENT);
                if (!filename)
                        filename = repo_config = xstrdup(git_path("config"));
        }
@@ -543,9 +543,9 @@ int git_config_set_multivar(const char* key, const char* value,
        char* lock_file;
        const char* last_dot = strrchr(key, '.');
 
-       config_filename = getenv("GIT_CONFIG");
+       config_filename = getenv(CONFIG_ENVIRONMENT);
        if (!config_filename) {
-               config_filename = getenv("GIT_CONFIG_LOCAL");
+               config_filename = getenv(CONFIG_LOCAL_ENVIRONMENT);
                if (!config_filename)
                        config_filename  = git_path("config");
        }
@@ -753,9 +753,9 @@ int git_config_rename_section(const char *old_name, const char *new_name)
        int out_fd;
        char buf[1024];
 
-       config_filename = getenv("GIT_CONFIG");
+       config_filename = getenv(CONFIG_ENVIRONMENT);
        if (!config_filename) {
-               config_filename = getenv("GIT_CONFIG_LOCAL");
+               config_filename = getenv(CONFIG_LOCAL_ENVIRONMENT);
                if (!config_filename)
                        config_filename  = git_path("config");
        }
index 5d6a1247b4a1955dffae2b52da064a6eb489d83b..3996bce33fe11b8f0bae120fabd40a74c66de342 100644 (file)
@@ -21,7 +21,7 @@ const char *git_exec_path(void)
        if (current_exec_path)
                return current_exec_path;
 
-       env = getenv("GIT_EXEC_PATH");
+       env = getenv(EXEC_PATH_ENVIRONMENT);
        if (env && *env) {
                return env;
        }
@@ -35,7 +35,7 @@ int execv_git_cmd(const char **argv)
        char git_command[PATH_MAX + 1];
        int i;
        const char *paths[] = { current_exec_path,
-                               getenv("GIT_EXEC_PATH"),
+                               getenv(EXEC_PATH_ENVIRONMENT),
                                builtin_exec_path };
 
        for (i = 0; i < ARRAY_SIZE(paths); ++i) {
index 1f5d07a057ed04dd9ffc7eb705d0c752d250bf72..490f3e48db02d01cb480047c011aa7b670c431bc 100755 (executable)
@@ -14,7 +14,7 @@ die() {
 }
 
 usage() {
-       die "Usage: $0 [--template=<template_directory>] [--no-separate-remote] [--reference <reference-repo>] [--bare] [-l [-s]] [-q] [-u <upload-pack>] [--origin <name>] [-n] <repo> [<dir>]"
+       die "Usage: $0 [--template=<template_directory>] [--reference <reference-repo>] [--bare] [-l [-s]] [-q] [-u <upload-pack>] [--origin <name>] [-n] <repo> [<dir>]"
 }
 
 get_repo_base() {
@@ -137,11 +137,9 @@ while
        *,--template=*)
          template="$1" ;;
        *,-q|*,--quiet) quiet=-q ;;
-       *,--use-separate-remote)
-               # default
-               use_separate_remote=t ;;
+       *,--use-separate-remote) ;;
        *,--no-separate-remote)
-               use_separate_remote= ;;
+               die "clones are always made with separate-remote layout" ;;
        1,--reference) usage ;;
        *,--reference)
                shift; reference="$1" ;;
@@ -327,12 +325,8 @@ cd "$D" || exit
 
 if test -z "$bare" && test -f "$GIT_DIR/REMOTE_HEAD"
 then
-       # Figure out which remote branch HEAD points at.
-       case "$use_separate_remote" in
-       '')     remote_top=refs/heads ;;
-       *)      remote_top="refs/remotes/$origin" ;;
-       esac
-
+       # a non-bare repository is always in separate-remote layout
+       remote_top="refs/remotes/$origin"
        head_sha1=`cat "$GIT_DIR/REMOTE_HEAD"`
        case "$head_sha1" in
        'ref: refs/'*)
@@ -366,41 +360,26 @@ then
                )
        )
 
-       # Write out remotes/$origin file, and update our "$head_points_at".
+       # Write out remote.$origin config, and update our "$head_points_at".
        case "$head_points_at" in
        ?*)
-               mkdir -p "$GIT_DIR/remotes" &&
+               # Local default branch
                git-symbolic-ref HEAD "refs/heads/$head_points_at" &&
-               case "$use_separate_remote" in
-               t)      origin_track="$remote_top/$head_points_at"
-                       git-update-ref HEAD "$head_sha1" ;;
-               *)      origin_track="$remote_top/$origin"
-                       git-update-ref "refs/heads/$origin" "$head_sha1" ;;
-               esac &&
+
+               # Tracking branch for the primary branch at the remote.
+               origin_track="$remote_top/$head_points_at" &&
+               git-update-ref HEAD "$head_sha1" &&
+
+               # Upstream URL
                git-repo-config remote."$origin".url "$repo" &&
+
+               # Set up the mappings to track the remote branches.
                git-repo-config remote."$origin".fetch \
-                       "refs/heads/$head_points_at:$origin_track" &&
-               (cd "$GIT_DIR/$remote_top" && find . -type f -print) |
-               while read dotslref
-               do
-                       name=`expr "$dotslref" : './\(.*\)'`
-                       if test "z$head_points_at" = "z$name"
-                       then
-                               continue
-                       fi
-                       if test "$use_separate_remote" = '' &&
-                          test "z$origin" = "z$name"
-                       then
-                               continue
-                       fi
-                       git-repo-config remote."$origin".fetch "refs/heads/${name}:$remote_top/${name}" '^$'
-               done &&
-               case "$use_separate_remote" in
-               t)
-                       rm -f "refs/remotes/$origin/HEAD"
-                       git-symbolic-ref "refs/remotes/$origin/HEAD" \
-                               "refs/remotes/$origin/$head_points_at"
-               esac &&
+                       "refs/heads/*:$remote_top/*" '^$' &&
+               rm -f "refs/remotes/$origin/HEAD"
+               git-symbolic-ref "refs/remotes/$origin/HEAD" \
+                       "refs/remotes/$origin/$head_points_at" &&
+
                git-repo-config branch."$head_points_at".remote "$origin" &&
                git-repo-config branch."$head_points_at".merge "refs/heads/$head_points_at"
        esac
index bc881cc5f9d932c40f10bf0448aafa3263724c35..ea7511e8a0f18a3402146ce8acc1c051fc92475f 100755 (executable)
@@ -132,7 +132,6 @@ canon_refs_list_for_fetch () {
        # or the first one otherwise; add prefix . to the rest
        # to prevent the secondary branches to be merged by default.
        merge_branches=
-       found_mergeref=
        curr_branch=
        if test "$1" = "-d"
        then
@@ -142,7 +141,8 @@ canon_refs_list_for_fetch () {
                        curr_branch=$(git-symbolic-ref HEAD | \
                            sed -e 's|^refs/heads/||')
                        merge_branches=$(git-repo-config \
-                           --get-all "branch.${curr_branch}.merge")
+                           --get-all "branch.${curr_branch}.merge") ||
+                       merge_branches=.this.would.never.match.any.ref.
                fi
                set x $(expand_refs_wildcard "$@")
                shift
@@ -171,10 +171,6 @@ canon_refs_list_for_fetch () {
                            dot_prefix= && break
                        done
                fi
-               if test -z $dot_prefix
-               then
-                       found_mergeref=true
-               fi
                case "$remote" in
                '') remote=HEAD ;;
                refs/heads/* | refs/tags/* | refs/remotes/*) ;;
@@ -195,11 +191,6 @@ canon_refs_list_for_fetch () {
                fi
                echo "${dot_prefix}${force}${remote}:${local}"
        done
-       if test -z "$found_mergeref" -a "$curr_branch"
-       then
-               echo >&2 "Warning: No merge candidate found because value of config option
-         \"branch.${curr_branch}.merge\" does not match any remote branch fetched."
-       fi
 }
 
 # Returns list of src: (no store), or src:dst (store)
index e23beb685d15447ac114c58d1795ed15bef88c9d..1703091bbb988e22f39b2c8d4c70ec7340a2f109 100755 (executable)
@@ -76,6 +76,10 @@ merge_head=$(sed -e '/       not-for-merge   /d' \
 
 case "$merge_head" in
 '')
+       curr_branch=$(git-symbolic-ref HEAD | \
+               sed -e 's|^refs/heads/||')
+       echo >&2 "Warning: No merge candidate found because value of config option
+         \"branch.${curr_branch}.merge\" does not match any remote branch fetched."
        echo >&2 "No changes."
        exit 0
        ;;
index 1de273ea1e4f309b542c8ebfce706ba422e1cd74..ae7ae4cd2a9ce392945ad8ed27e4289c27ee24bd 100644 (file)
@@ -1272,7 +1272,7 @@ int main(int argc, char *argv[])
        struct commit *result, *h1, *h2;
 
        git_config(git_default_config); /* core.filemode */
-       original_index_file = getenv("GIT_INDEX_FILE");
+       original_index_file = getenv(INDEX_ENVIRONMENT);
 
        if (!original_index_file)
                original_index_file = xstrdup(git_path("index"));
index a11ab0ad41a006f9f20d8ec6172d34e6c7f92d41..90eeeba2a31949a84daeb34b1996eaa4818321e6 100755 (executable)
@@ -23,15 +23,14 @@ test_expect_success "clone and setup child repos" '
        git clone . two &&
        cd two &&
        git repo-config branch.master.remote one &&
-       {
-               echo "URL: ../one/.git/"
-               echo "Pull: refs/heads/master:refs/heads/one"
-       } >.git/remotes/one
+       git repo-config remote.one.url ../one/.git/ &&
+       git repo-config remote.one.fetch refs/heads/master:refs/heads/one &&
        cd .. &&
        git clone . three &&
        cd three &&
        git repo-config branch.master.remote two &&
        git repo-config branch.master.merge refs/heads/one &&
+       mkdir -p .git/remotes &&
        {
                echo "URL: ../two/.git/"
                echo "Pull: refs/heads/master:refs/heads/two"
index ac7be769b4d4f04908a64592a5c3ad8c43c27e60..f0f9cd6be01681c90d1914eaa8a40144e2280adf 100755 (executable)
@@ -208,8 +208,9 @@ test_done () {
 # t/ subdirectory and are run in trash subdirectory.
 PATH=$(pwd)/..:$PATH
 GIT_EXEC_PATH=$(pwd)/..
+GIT_TEMPLATE_DIR=$(pwd)/../templates/blt
 HOME=$(pwd)/trash
-export PATH GIT_EXEC_PATH HOME
+export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR HOME
 
 GITPERLLIB=$(pwd)/../perl/blib/lib:$(pwd)/../perl/blib/arch/auto/Git
 export GITPERLLIB
diff --git a/templates/remotes-- b/templates/remotes--
deleted file mode 100644 (file)
index fae8870..0000000
+++ /dev/null
@@ -1 +0,0 @@
-: this is just to ensure the directory exists.