Re: [PATCHv2 2/2] pull: support rebased upstream + fetch + pull --rebase

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Thu, 16 Jul 2009, Santi Béjar wrote:

> 2009/7/16 Johannes Schindelin <Johannes.Schindelin@xxxxxx>:
>
> > On Thu, 16 Jul 2009, Santi Béjar wrote:
> >
> >> Use the fork commit of the current branch (where
> >> the tip of upstream branch used to be) as the upstream parameter of
> >> "git rebase". Compute it walking the reflog to find the first commit
> >> which is an ancestor of the current branch.
> >
> > I finally understand what this patch is about.  Thanks.
> 
> Thanks, it was hard (at least for me) to provide a short and good
> commit message.

It is the thing I found quite hard when I started contributing to Git, and 
it is still not exactly easy for me.

> >> diff --git a/git-pull.sh b/git-pull.sh
> >> index 4b78a0c..31d3945 100755
> >> --- a/git-pull.sh
> >> +++ b/git-pull.sh
> >> @@ -125,9 +125,14 @@ test true = "$rebase" && {
> >>       die "refusing to pull with rebase: your working tree is not up-to-date"
> >>
> >>       . git-parse-remote &&
> >> -     reflist="$(get_remote_merge_branch "$@" 2>/dev/null)" &&
> >> -     oldremoteref="$(git rev-parse -q --verify \
> >> -             "$reflist")"
> >> +     remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" &&
> >> +     num=0 &&
> >> +     while oldremoteref="$(git rev-parse -q --verify "$remoteref@{$num}")"
> >> +     do
> >
> > How about
> >
> >        oldremoteref="$(git rev-list --boundary HEAD --not \
> >                        $(git rev-list -g $remoteref | sed 's/$/^@/') |
> >                sed -e '/^[^-]/d' -e q)"
> >
> > Explanation: the "git rev-list -g $remoteref" lists the previous commits
> > the remote ref pointed to, and the ^@ appended to them means all their
> > parents.  Now, the outer rev-list says to take everything in HEAD but
> > _not_ in those parents, showing the boundary commits.  The "sed" call
> > lists the first such boundary commit (which must, by construction, be one
> > of the commits shown by the first rev-list).
> 
> It almost works, thanks. In fact this is how I represent it in my
> head, but I couldn't find a working command (hint, hint, the
> --boundaries trick). Based on yours here it is the one I am using
> right now:
> 
> 	oldremoteref="$(git rev-list --boundary HEAD --not \
> 		$(git rev-list -g $remoteref 2>/dev/null) |
> 		sed -e '/^[^-]/d' -e 's/^-//;q' )"
> 
> i.e. without the ^@ as you want the commits in the reflog as boundary
> commits, and also remove the - in front of the commit.

Thanks for fixing it.  I should have mentioned that I did not test it (and 
usually stuff I do not test has blatant bugs in it, such as was the case 
here).

> Your version performs equally than mine for the normal case but much 
> better if it has to walk many reflog entries. Also mine has the problem, 
> at least currently, that it does not give up as "git rev-parse -q 
> --verify $branch@{n}" does not return an error when n is too large:
> 
>   $ git rev-parse -q --verify origin/next@{18} ; echo $?
> warning: Log for 'origin/next' only has 17 entries.
> 37eb784cfce07ba0048d64e352c5137454396d87
> 0
> 
> even with "-q --verify"!
> 
> So, I'll take yours and will send an updated patch (saying that is is
> based on a command by you). With your Signed-off-by?

Maybe an ACK instead?

Thanks,
Dscho

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]