Re: [PATCH] checkout: implement "-" shortcut name for last branch

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

 



Johannes Schindelin wrote:
> - AFAICT your version could never be convinced to resurrect deleted 
>   branches, without resorting to reflogs anyway.

Speaking of resurrection, there are other possible sources that a
branch tip could be gleaned from.  How about the script below?  The
advantage is that it can even be used to recover Junio's topic
branches by looking at the merges in 'pu'.

(I'll answer the rest later.)

--- 8< ---
#!/bin/sh

. git-sh-setup

USAGE="<branch>"

test "$#" = 1 || usage

branch="$1"
candidates=

search_reflog () {
	next=
	git reflog show HEAD |
	while read sha ref msg; do
		if test -n "$next"; then
			next=
			echo ${sha%...}
		fi
		if echo "$msg" | grep -q "^checkout: moving from $branch "; then
			next=t
		fi
		if echo "$msg" | grep -q "^merge $branch:"; then
			git rev-list --parents -1 ${sha%...} \
				| cut -d' ' -f3
		fi
	done
}

search_merges () {
	git rev-list --pretty=tformat:"%h %p:%s" --all |
	grep "Merge branch.*'$branch'.*into" |
	while read sha rest; do
		parents="$(echo "$rest" | cut -d: -f1)"
		case "$parents" in
		    *' '*' '*)
			warn "$branch took part in octopus merge $sha"
			warn "check manually!"
			;;
		    *' '*)
			echo "$parents" | cut -d' ' -f2
			;;
		esac
	done
}

search_merge_targets () {
	git rev-list --pretty=tformat:"%h %s" --all |
	grep "Merge branch '[^']*' into $branch$" |
	cut -d' ' -f1
}

candidates="$(search_reflog | sort -u)"
if test -z "$candidates"; then
	echo "** Searching merges... **"
	candidates="$( (search_merges;search_merge_targets) | sort -u)"
fi

echo "** Candidates **"
for cmt in $candidates; do
	git --no-pager log --pretty=oneline --abbrev-commit -1 $cmt
done

newest=$(git rev-list -1 $candidates)

if ! git rev-parse --verify --quiet $branch >/dev/null; then
	printf "** Restoring $branch to "
	git --no-pager log -1 --pretty=tformat:"%h %s" $newest
	git branch $branch $newest
else
	printf "Most recent among them: "
	git --no-pager log -1 --pretty=tformat:"%h %s" $newest
	echo "** $branch already exists, doing nothing"
fi

Attachment: signature.asc
Description: This is a digitally signed message part.


[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]

  Powered by Linux