From: Paolo Bonzini <paolo.bonzini@lu.unisi.ch>
To: git@vger.kernel.org
Subject: [PATCH, 2nd version] git-fetch, git-branch: Support local --track via a special remote `.'
Date: Mon, 12 Mar 2007 18:14:44 +0100 [thread overview]
Message-ID: <45F58A84.2000503@lu.unisi.ch> (raw)
This patch adds support for a dummy remote `.' to avoid having to declare
a fake remote like
[remote "local"]
url = .
fetch = refs/heads/*:refs/heads/*
Such a builtin remote simplifies the operation of "git-fetch", which
will populate FETCH_HEAD but will not pretend that two repositories are
in use, will not create a thin pack, and will not perform any useless
remapping of names. The speed improvement is around 20%, and it should
improve more if "git-fetch" is converted to a builtin.
To this end, git-parse-remote is grown with a new kind of remote, `builtin'.
In git-fetch.sh, we treat the builtin remote specially in that it needs no
pack/store operations. In fact, doing git-fetch on a builtin remote will
simply populate FETCH_HEAD appropriately.
The patch also improves of the --track/--no-track support, extending
it so that branch.<name>.remote items referring `.' can be created.
Signed-off-by: Paolo Bonzini <bonzini@gnu.org>
---
Documentation/config.txt | 4 ++++
builtin-branch.c | 39 +++++++++++++++++++++++++--------------
git-fetch.sh | 9 +++++++--
git-parse-remote.sh | 22 +++++++++++++++++++++-
t/t3200-branch.sh | 6 ++++++
t/t5520-pull.sh | 13 +++++++++++++
6 files changed, 76 insertions(+), 17 deletions(-)
I hope this is what you meant in your reply to my message.
I removed completely the configuration variable since it made
no sense to me, either.
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 5408dd6..28899d9 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -272,6 +272,10 @@ branch.<name>.merge::
`git fetch`) to lookup the default branch for merging. Without
this option, `git pull` defaults to merge the first refspec fetched.
Specify multiple values to get an octopus merge.
+ If you wish to setup `git pull` so that it merges into <name> from
+ another branch in the local repository, you can point
+ branch.<name>.merge to the desired branch, and use the special setting
+ `.` (a period) for branch.<name>.remote.
color.branch::
A boolean to enable/disable color in the output of
diff --git a/builtin-branch.c b/builtin-branch.c
index 42b1ff1..14c4219 100644
--- a/builtin-branch.c
+++ b/builtin-branch.c
@@ -372,9 +372,26 @@ static int get_remote_config(const char *key, const char *value)
return 0;
}
-static void set_branch_defaults(const char *name, const char *real_ref)
+static void set_branch_merge(const char *name, const char *config_remote,
+ const char *config_repo)
{
char key[1024];
+ if (sizeof(key) <=
+ snprintf(key, sizeof(key), "branch.%s.remote", name))
+ die("what a long branch name you have!");
+ git_config_set(key, config_remote);
+
+ /*
+ * We do not have to check if we have enough space for
+ * the 'merge' key, since it's shorter than the
+ * previous 'remote' key, which we already checked.
+ */
+ snprintf(key, sizeof(key), "branch.%s.merge", name);
+ git_config_set(key, config_repo);
+}
+
+static void set_branch_defaults(const char *name, const char *real_ref)
+{
const char *slash = strrchr(real_ref, '/');
if (!slash)
@@ -384,21 +401,15 @@ static void set_branch_defaults(const char *name, const char *real_ref)
start_len = strlen(real_ref);
base_len = slash - real_ref;
git_config(get_remote_config);
+ if (!config_repo && !config_remote &&
+ !prefixcmp(real_ref, "refs/heads/")) {
+ set_branch_merge(name, ".", real_ref);
+ printf("Branch %s set up to track local branch %s.\n",
+ name, real_ref);
+ }
if (config_repo && config_remote) {
- if (sizeof(key) <=
- snprintf(key, sizeof(key), "branch.%s.remote", name))
- die("what a long branch name you have!");
- git_config_set(key, config_remote);
-
- /*
- * We do not have to check if we have enough space for
- * the 'merge' key, since it's shorter than the
- * previous 'remote' key, which we already checked.
- */
- snprintf(key, sizeof(key), "branch.%s.merge", name);
- git_config_set(key, config_repo);
-
+ set_branch_merge(name, config_remote, config_repo);
printf("Branch %s set up to track remote branch %s.\n",
name, real_ref);
}
diff --git a/git-fetch.sh b/git-fetch.sh
index b9d7a75..e2a6878 100755
--- a/git-fetch.sh
+++ b/git-fetch.sh
@@ -164,6 +164,12 @@ then
fi
fetch_native () {
+ if test "$(get_data_source $remote_nick)" = builtin; then
+ for name in $(get_remote_fetch_branches "$remote_nick"); do
+ append_fetch_head $(git-rev-parse "$name") . "$name" "$name" || exit
+ done
+ return
+ fi
eval=$(echo "$1" | git-fetch--tool parse-reflist "-")
eval "$eval"
@@ -353,8 +359,7 @@ case ",$#,$remote_nick," in
curr_branch=$(git-symbolic-ref -q HEAD | sed -e 's|^refs/heads/||')
merge_branches=$(git-config \
--get-all "branch.${curr_branch}.merge" | sort -u)
- fetch_branches=$(get_remote_default_refs_for_fetch -n $remote_nick |
- sed -e 's/:.*$//g' -e 's/^+//' | sort -u)
+ fetch_branches=$(get_remote_fetch_branches $remote_nick)
test -n "$merge_branches" && test -n "$fetch_branches" &&
merge_branches=$(printf '%s\n%s' "$merge_branches" "$fetch_branches" |
sort | uniq -d)
diff --git a/git-parse-remote.sh b/git-parse-remote.sh
index 99e7184..bc7533a 100755
--- a/git-parse-remote.sh
+++ b/git-parse-remote.sh
@@ -9,6 +9,9 @@ get_data_source () {
*/*)
echo ''
;;
+ .)
+ echo builtin
+ ;;
*)
if test "$(git-config --get "remote.$1.url")"
then
@@ -31,6 +34,9 @@ get_remote_url () {
'')
echo "$1"
;;
+ builtin)
+ echo "$1"
+ ;;
config)
git-config --get "remote.$1.url"
;;
@@ -57,7 +63,7 @@ get_default_remote () {
get_remote_default_refs_for_push () {
data_source=$(get_data_source "$1")
case "$data_source" in
- '' | branches)
+ '' | branches | builtin)
;; # no default push mapping, just send matching refs.
config)
git-config --get-all "remote.$1.push" ;;
@@ -128,6 +134,8 @@ get_remote_default_refs_for_fetch () {
case "$data_source" in
'')
set explicit "HEAD:" ;;
+ builtin)
+ set glob ;;
config)
set $(expand_refs_wildcard "$1" \
$(git-config --get-all "remote.$1.fetch")) ;;
@@ -154,6 +162,18 @@ get_remote_default_refs_for_fetch () {
fi
}
+# Returns list of sources
+get_remote_fetch_branches () {
+ data_source=$(get_data_source "$1")
+ case "$data_source" in
+ builtin)
+ git-show-ref --heads | sed -n 's,.*[ ]refs/,refs/,p' ;;
+ *)
+ get_remote_default_refs_for_fetch -n "$1" | \
+ sed -e 's/:.*$//g' -e 's/^+//' | sort -u ;;
+ esac
+}
+
get_remote_refs_for_push () {
case "$#" in
0) die "internal error: get-remote-refs-for-push." ;;
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index 75c000a..9558bdb 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -145,9 +145,15 @@ test_expect_success 'test overriding tracking setup via --no-track' \
git-config remote.local.fetch refs/heads/*:refs/remotes/local/* &&
(git-show-ref -q refs/remotes/local/master || git-fetch local) &&
git-branch --no-track my2 local/master &&
+ git-config branch.autosetupmerge false &&
! test $(git-config branch.my2.remote) = local &&
! test $(git-config branch.my2.merge) = refs/heads/master'
+test_expect_success 'test local tracking setup' \
+ 'git branch --track my6 s &&
+ test $(git-config branch.my6.remote) = . &&
+ test $(git-config branch.my6.merge) = refs/heads/s'
+
# Keep this test last, as it changes the current branch
cat >expect <<EOF
0000000000000000000000000000000000000000 $HEAD $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000 branch: Created from master
diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh
index 7eb3783..c424e5b 100755
--- a/t/t5520-pull.sh
+++ b/t/t5520-pull.sh
@@ -29,5 +29,18 @@ test_expect_success 'checking the results' '
diff file cloned/file
'
+test_expect_success 'test . as a remote' '
+
+ git branch copy master &&
+ git config branch.copy.remote . &&
+ git config branch.copy.merge refs/heads/master &&
+ echo updated >file &&
+ git commit -a -m updated &&
+ git checkout copy &&
+ test `cat file` = file &&
+ git pull &&
+ test `cat file` = updated
+'
+
test_done
next reply other threads:[~2007-03-12 17:14 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-03-12 17:14 Paolo Bonzini [this message]
2007-03-13 9:29 ` [PATCH, 2nd version] git-fetch, git-branch: Support local --track via a special remote `.' Junio C Hamano
2007-03-13 12:29 ` [PATCH, fixed " Paolo Bonzini
2007-03-13 16:24 ` Santi Béjar
2007-03-14 11:20 ` Junio C Hamano
2007-03-14 12:52 ` [PATCH, respin] " Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=45F58A84.2000503@lu.unisi.ch \
--to=paolo.bonzini@lu.unisi.ch \
--cc=bonzini@gnu.org \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.