From: "Santi Béjar" <sbejar@gmail.com>
To: Git Mailing List <git@vger.kernel.org>
Subject: [PATCH/RFC] git-fetch: Only fetch in fetch
Date: Thu, 25 Jan 2007 01:43:42 +0100 [thread overview]
Message-ID: <87veiwszpd.fsf@gmail.com> (raw)
---
Hi *,
I've tried to separate the fetch and merge logic. At the same time it
has removed 40 lines of code to the git-*.sh.
What do you think?
Santi
P.D.: I supose it is too late for v1.5.0.
git-fetch.sh | 41 +++++++-------------------
git-parse-remote.sh | 71 ++++++----------------------------------------
git-pull.sh | 40 +++++++++++++++++++++++--
t/t5510-fetch.sh | 6 ++--
t/t6200-fmt-merge-msg.sh | 23 ++++++++++-----
5 files changed, 74 insertions(+), 107 deletions(-)
diff --git a/git-fetch.sh b/git-fetch.sh
index 87b940b..564d633 100755
--- a/git-fetch.sh
+++ b/git-fetch.sh
@@ -74,9 +74,9 @@ do
shift
done
+origin=$(get_default_remote)
case "$#" in
0)
- origin=$(get_default_remote)
test -n "$(get_remote_url ${origin})" ||
die "Where do you want to fetch from today?"
set x $origin ; shift ;;
@@ -88,6 +88,12 @@ refs=
rref=
rsync_slurped_objects=
+cat > $GIT_DIR/FETCH_REMOTE <<EOF
+remote: $remote_nick
+url: $remote
+default: $origin
+refspec: $@
+EOF
if test "" = "$append"
then
: >"$GIT_DIR/FETCH_HEAD"
@@ -103,10 +109,6 @@ append_fetch_head () {
remote_name_="$3"
remote_nick_="$4"
local_name_="$5"
- case "$6" in
- t) not_for_merge_='not-for-merge' ;;
- '') not_for_merge_= ;;
- esac
# remote-nick is the URL given on the command line (or a shorthand)
# remote-name is the $GIT_DIR relative refs/ path we computed
@@ -137,10 +139,8 @@ append_fetch_head () {
if git-cat-file commit "$head_" >/dev/null 2>&1
then
headc_=$(git-rev-parse --verify "$head_^0") || exit
- echo "$headc_ $not_for_merge_ $note_" >>"$GIT_DIR/FETCH_HEAD"
- else
- echo "$head_ not-for-merge $note_" >>"$GIT_DIR/FETCH_HEAD"
fi
+ echo "$headc_ $remote_name $note_" >>"$GIT_DIR/FETCH_HEAD"
update_local_ref "$local_name_" "$head_" "$note_"
}
@@ -283,13 +283,6 @@ fetch_main () {
# These are relative path from $GIT_DIR, typically starting at refs/
# but may be HEAD
- if expr "z$ref" : 'z\.' >/dev/null
- then
- not_for_merge=t
- ref=$(expr "z$ref" : 'z\.\(.*\)')
- else
- not_for_merge=
- fi
if expr "z$ref" : 'z+' >/dev/null
then
single_force=t
@@ -370,7 +363,7 @@ fetch_main () {
esac
append_fetch_head "$head" "$remote" \
- "$remote_name" "$remote_nick" "$local_name" "$not_for_merge" || exit
+ "$remote_name" "$remote_nick" "$local_name" || exit
done
@@ -413,28 +406,16 @@ fetch_main () {
case "$ref" in
+$remote_name:*)
single_force=t
- not_for_merge=
- found="$ref"
- break ;;
- .+$remote_name:*)
- single_force=t
- not_for_merge=t
- found="$ref"
- break ;;
- .$remote_name:*)
- not_for_merge=t
found="$ref"
break ;;
$remote_name:*)
- not_for_merge=
found="$ref"
break ;;
esac
done
local_name=$(expr "z$found" : 'z[^:]*:\(.*\)')
append_fetch_head "$sha1" "$remote" \
- "$remote_name" "$remote_nick" "$local_name" \
- "$not_for_merge" || exit
+ "$remote_name" "$remote_nick" "$local_name" || exit
done
)
) || exit ;;
@@ -458,7 +439,7 @@ case "$no_tags$tags" in
do
git-cat-file -t "$sha1" >/dev/null 2>&1 || continue
echo >&2 "Auto-following $name"
- echo ".${name}:${name}"
+ echo "${name}:${name}"
done)
esac
case "$taglist" in
diff --git a/git-parse-remote.sh b/git-parse-remote.sh
index 4fc6020..3352964 100755
--- a/git-parse-remote.sh
+++ b/git-parse-remote.sh
@@ -70,16 +70,11 @@ get_remote_default_refs_for_push () {
esac
}
-# Called from canon_refs_list_for_fetch -d "$remote", which
-# is called from get_remote_default_refs_for_fetch to grok
+# Called from get_remote_default_refs_for_fetch to grok
# refspecs that are retrieved from the configuration, but not
# from get_remote_refs_for_fetch when it deals with refspecs
# supplied on the command line. $ls_remote_result has the list
# of refs available at remote.
-#
-# The first token returned is either "explicit" or "glob"; this
-# is to help prevent randomly "globbed" ref from being chosen as
-# a merge candidate
expand_refs_wildcard () {
first_one=yes
for ref
@@ -87,21 +82,10 @@ expand_refs_wildcard () {
lref=${ref#'+'}
# a non glob pattern is given back as-is.
expr "z$lref" : 'zrefs/.*/\*:refs/.*/\*$' >/dev/null || {
- if test -n "$first_one"
- then
- echo "explicit"
- first_one=
- fi
echo "$ref"
continue
}
- # glob
- if test -n "$first_one"
- then
- echo "glob"
- first_one=
- fi
from=`expr "z$lref" : 'z\(refs/.*/\)\*:refs/.*/\*$'`
to=`expr "z$lref" : 'zrefs/.*/\*:\(refs/.*/\)\*$'`
local_force=
@@ -123,30 +107,6 @@ expand_refs_wildcard () {
# Subroutine to canonicalize remote:local notation.
canon_refs_list_for_fetch () {
- # 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.
- merge_branches=
- curr_branch=
- if test "$1" = "-d"
- then
- shift ; remote="$1" ; shift
- set $(expand_refs_wildcard "$@")
- is_explicit="$1"
- shift
- if test "$remote" = "$(get_default_remote)"
- then
- curr_branch=$(git-symbolic-ref -q HEAD | \
- sed -e 's|^refs/heads/||')
- merge_branches=$(git-repo-config \
- --get-all "branch.${curr_branch}.merge")
- fi
- if test -z "$merge_branches" && test $is_explicit != explicit
- then
- merge_branches=..this.will.never.match.any.ref..
- fi
- fi
for ref
do
force=
@@ -159,22 +119,6 @@ canon_refs_list_for_fetch () {
expr "z$ref" : 'z.*:' >/dev/null || ref="${ref}:"
remote=$(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
- if test "$remote" = "$merge_branch" ||
- test "$local" = "$merge_branch"
- then
- dot_prefix=
- break
- fi
- done
- fi
case "$remote" in
'') remote=HEAD ;;
refs/heads/* | refs/tags/* | refs/remotes/*) ;;
@@ -193,7 +137,7 @@ canon_refs_list_for_fetch () {
git-check-ref-format "$local_ref_name" ||
die "* refusing to create funny ref '$local_ref_name' locally"
fi
- echo "${dot_prefix}${force}${remote}:${local}"
+ echo "${force}${remote}:${local}"
done
}
@@ -204,17 +148,20 @@ get_remote_default_refs_for_fetch () {
'')
echo "HEAD:" ;;
config)
- canon_refs_list_for_fetch -d "$1" \
- $(git-repo-config --get-all "remote.$1.fetch") ;;
+ set $(expand_refs_wildcard \
+ $(git-repo-config --get-all "remote.$1.fetch"))
+ canon_refs_list_for_fetch "$@"
+ ;;
branches)
remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1")
case "$remote_branch" in '') remote_branch=master ;; esac
echo "refs/heads/${remote_branch}:refs/heads/$1"
;;
remotes)
- canon_refs_list_for_fetch -d "$1" $(sed -ne '/^Pull: */{
+ set $(expand_refs_wildcard $(sed -ne '/^Pull: */{
s///p
- }' "$GIT_DIR/remotes/$1")
+ }' "$GIT_DIR/remotes/$1"))
+ canon_refs_list_for_fetch "$@"
;;
*)
die "internal error: get-remote-default-ref-for-push $1" ;;
diff --git a/git-pull.sh b/git-pull.sh
index a3665d7..cc1295a 100755
--- a/git-pull.sh
+++ b/git-pull.sh
@@ -77,9 +77,41 @@ to recover.'
fi
-merge_head=$(sed -e '/ not-for-merge /d' \
- -e 's/ .*//' "$GIT_DIR"/FETCH_HEAD | \
- tr '\012' ' ')
+remote=$(grep "^remote: " $GIT_DIR/FETCH_REMOTE)
+remote=${remote#remote: }
+url=$(grep "^url: " $GIT_DIR/FETCH_REMOTE)
+url=${url#url: }
+default=$(grep "^default: " $GIT_DIR/FETCH_REMOTE)
+default=${default#default: }
+refspec=$(grep "^refspec: " $GIT_DIR/FETCH_REMOTE)
+refspec=${refspec#refspec: $remote}
+
+merge_head=
+merge_branches=
+if test ",$remote,$refspec," == ",$default,," ; then
+ curr_branch=$(git-symbolic-ref -q HEAD | sed -e 's|^refs/heads/||')
+ merge_branches=$(git-repo-config \
+ --get-all "branch.${curr_branch}.merge")
+elif test -n "$refspec" ; then
+ merge_branches=$(for ref in $refspec ; do
+ expr "z$ref" : 'z.*:' >/dev/null || ref="${ref}:"
+ echo " $(expr "z$ref" : 'z\([^:]*\):')"; done)
+elif test "$remote" == "$url" ; then
+ merge_branches=HEAD
+fi
+
+for branch in $merge_branches
+do
+ case "$branch" in
+ HEAD | refs/heads/* | refs/tags/* | refs/remotes/*) ;;
+ heads/* | tags/* | remotes/* ) branch="refs/$branch" ;;
+ *) branch="refs/heads/$branch" ;;
+ esac
+ grep " $branch " "$GIT_DIR"/FETCH_HEAD | \
+ sed -e 's@ '"$branch"' @ @'
+done > "$GIT_DIR"/FETCH_MERGE
+
+merge_head=$(sed -e 's/ .*//' "$GIT_DIR"/FETCH_MERGE | tr '\012' ' ')
case "$merge_head" in
'')
@@ -115,6 +147,6 @@ then
exit
fi
-merge_name=$(git-fmt-merge-msg <"$GIT_DIR/FETCH_HEAD") || exit
+merge_name=$(git-fmt-merge-msg <"$GIT_DIR/FETCH_MERGE") || exit
exec git-merge $no_summary $no_commit $squash $strategy_args \
"$merge_name" HEAD $merge_head
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index 3ce9446..2e196de 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -50,7 +50,7 @@ test_expect_success "fetch test" '
test "z$mine" = "z$his"
'
-test_expect_success "fetch test for-merge" '
+test_expect_success "fetch test FETCH_HEAD" '
cd "$D" &&
cd three &&
git fetch &&
@@ -59,8 +59,8 @@ test_expect_success "fetch test for-merge" '
master_in_two=`cd ../two && git rev-parse master` &&
one_in_two=`cd ../two && git rev-parse one` &&
{
- echo "$master_in_two not-for-merge"
- echo "$one_in_two "
+ echo "$master_in_two refs/heads/master"
+ echo "$one_in_two refs/heads/one"
} >expected &&
cut -f -2 .git/FETCH_HEAD >actual &&
diff expected actual'
diff --git a/t/t6200-fmt-merge-msg.sh b/t/t6200-fmt-merge-msg.sh
index 63e49f3..7776823 100755
--- a/t/t6200-fmt-merge-msg.sh
+++ b/t/t6200-fmt-merge-msg.sh
@@ -77,8 +77,9 @@ test_expect_success 'merge-msg test #1' '
git checkout master &&
git fetch . left &&
-
- git fmt-merge-msg <.git/FETCH_HEAD >actual &&
+ sed -e "s/ .* / /" \
+ .git/FETCH_HEAD >.git/FETCH_MERGE &&
+ git fmt-merge-msg <.git/FETCH_MERGE >actual &&
diff -u actual expected
'
@@ -90,8 +91,9 @@ test_expect_success 'merge-msg test #2' '
git checkout master &&
git fetch ../trash left &&
-
- git fmt-merge-msg <.git/FETCH_HEAD >actual &&
+ sed -e "s/ .* / /" \
+ .git/FETCH_HEAD >.git/FETCH_MERGE &&
+ git fmt-merge-msg <.git/FETCH_MERGE >actual &&
diff -u actual expected
'
@@ -113,8 +115,9 @@ test_expect_success 'merge-msg test #3' '
git checkout master &&
setdate &&
git fetch . left &&
-
- git fmt-merge-msg <.git/FETCH_HEAD >actual &&
+ sed -e "s/ .* / /" \
+ .git/FETCH_HEAD >.git/FETCH_MERGE &&
+ git fmt-merge-msg <.git/FETCH_MERGE >actual &&
diff -u actual expected
'
@@ -143,8 +146,10 @@ test_expect_success 'merge-msg test #4' '
git checkout master &&
setdate &&
git fetch . left right &&
+ sed -e "s/ .* / /" \
+ .git/FETCH_HEAD >.git/FETCH_MERGE &&
- git fmt-merge-msg <.git/FETCH_HEAD >actual &&
+ git fmt-merge-msg <.git/FETCH_MERGE >actual &&
diff -u actual expected
'
@@ -155,8 +160,10 @@ test_expect_success 'merge-msg test #5' '
git checkout master &&
setdate &&
git fetch . left right &&
+ sed -e "s/ .* / /" \
+ .git/FETCH_HEAD >.git/FETCH_MERGE &&
- git fmt-merge-msg <.git/FETCH_HEAD >actual &&
+ git fmt-merge-msg <.git/FETCH_MERGE >actual &&
diff -u actual expected
'
--
1.5.0.rc2.g7dd4c-dirty
next reply other threads:[~2007-01-25 0:44 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-01-25 0:43 Santi Béjar [this message]
2007-01-25 0:52 ` [PATCH/RFC] git-fetch: Only fetch in fetch Santi Béjar
2007-01-25 1:13 ` Junio C Hamano
[not found] ` <8aa486160701242344y465ff541i6d4d4b46a96bda64@mail.gmail.com>
2007-01-25 9:37 ` Santi Béjar
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=87veiwszpd.fsf@gmail.com \
--to=sbejar@gmail.com \
--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.