fetch: get the remote branches to merge from the branch properties

If in branch "foo" and this in config:

[branch "foo"]
      merge=bar

"git fetch": fetch from the default repository and program the "bar"
             branch to be merged with pull.

Signed-off-by: Santi Béjar <sbejar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Santi Béjar 2006-09-23 22:53:04 +02:00 committed by Junio C Hamano
parent 7be1d62c6f
commit 5372806a84
2 changed files with 33 additions and 8 deletions

View File

@ -122,6 +122,10 @@ apply.whitespace::
branch.<name>.remote:: branch.<name>.remote::
When in branch <name>, it tells `git fetch` which remote to fetch. When in branch <name>, it tells `git fetch` which remote to fetch.
branch.<name>.merge::
When in branch <name>, it tells `git fetch` the default remote branch
to be merged.
pager.color:: pager.color::
A boolean to enable/disable colored output when the pager is in A boolean to enable/disable colored output when the pager is in
use (default is true). use (default is true).

View File

@ -92,9 +92,22 @@ get_remote_default_refs_for_push () {
# Subroutine to canonicalize remote:local notation. # Subroutine to canonicalize remote:local notation.
canon_refs_list_for_fetch () { canon_refs_list_for_fetch () {
# Leave only the first one alone; add prefix . to the rest # If called from get_remote_default_refs_for_fetch
# leave the branches in branch.${curr_branch}.merge alone,
# or the first one otherwise; add prefix . to the rest
# to prevent the secondary branches to be merged by default. # to prevent the secondary branches to be merged by default.
dot_prefix= merge_branches=
if test "$1" = "-d"
then
shift ; remote="$1" ; shift
if test "$remote" = "$(get_default_remote)"
then
curr_branch=$(git-symbolic-ref HEAD | \
sed -e 's|^refs/heads/||')
merge_branches=$(git-repo-config \
--get-all "branch.${curr_branch}.merge")
fi
fi
for ref for ref
do do
force= force=
@ -107,6 +120,18 @@ canon_refs_list_for_fetch () {
expr "z$ref" : 'z.*:' >/dev/null || ref="${ref}:" expr "z$ref" : 'z.*:' >/dev/null || ref="${ref}:"
remote=$(expr "z$ref" : 'z\([^:]*\):') remote=$(expr "z$ref" : 'z\([^:]*\):')
local=$(expr "z$ref" : 'z[^:]*:\(.*\)') local=$(expr "z$ref" : 'z[^:]*:\(.*\)')
dot_prefix=.
if test -z "$merge_branches"
then
merge_branches=$remote
dot_prefix=
else
for merge_branch in $merge_branches
do
[ "$remote" = "$merge_branch" ] &&
dot_prefix= && break
done
fi
case "$remote" in case "$remote" in
'') remote=HEAD ;; '') remote=HEAD ;;
refs/heads/* | refs/tags/* | refs/remotes/*) ;; refs/heads/* | refs/tags/* | refs/remotes/*) ;;
@ -126,7 +151,6 @@ canon_refs_list_for_fetch () {
die "* refusing to create funny ref '$local_ref_name' locally" die "* refusing to create funny ref '$local_ref_name' locally"
fi fi
echo "${dot_prefix}${force}${remote}:${local}" echo "${dot_prefix}${force}${remote}:${local}"
dot_prefix=.
done done
} }
@ -137,7 +161,7 @@ get_remote_default_refs_for_fetch () {
'' | config-partial | branches-partial) '' | config-partial | branches-partial)
echo "HEAD:" ;; echo "HEAD:" ;;
config) config)
canon_refs_list_for_fetch \ canon_refs_list_for_fetch -d "$1" \
$(git-repo-config --get-all "remote.$1.fetch") ;; $(git-repo-config --get-all "remote.$1.fetch") ;;
branches) branches)
remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1") remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1")
@ -145,10 +169,7 @@ get_remote_default_refs_for_fetch () {
echo "refs/heads/${remote_branch}:refs/heads/$1" echo "refs/heads/${remote_branch}:refs/heads/$1"
;; ;;
remotes) remotes)
# This prefixes the second and later default refspecs canon_refs_list_for_fetch -d "$1" $(sed -ne '/^Pull: */{
# with a '.', to signal git-fetch to mark them
# not-for-merge.
canon_refs_list_for_fetch $(sed -ne '/^Pull: */{
s///p s///p
}' "$GIT_DIR/remotes/$1") }' "$GIT_DIR/remotes/$1")
;; ;;