Revision a0ad53c18100226cb1a138cb9b3bc3615170be8f authored by Torsten Bögershausen on 13 August 2016, 21:29:27 UTC, committed by Junio C Hamano on 14 August 2016, 20:45:52 UTC
When a non-reversible CRLF conversion is done in "git add",
a warning is printed on stderr (or Git dies, depending on checksafe)

The function commit_chk_wrnNNO() in t0027 was written to test this,
but did the wrong thing: Instead of looking at the warning
from "git add", it looked at the warning from "git commit".

This is racy because "git commit" may not have to do CRLF conversion
at all if it can use the sha1 value from the index (which depends on
whether "add" and "commit" run in a single second).

Correct t0027 and replace the commit for each and every file with a commit
of all files in one go.
The function commit_chk_wrnNNO() should be renamed in a separate commit.

Now that t0027 does the right thing, it detects a bug in covert.c:
This sequence should generate the warning `LF will be replaced by CRLF`,
but does not:

$ git init
$ git config core.autocrlf false
$ printf "Line\r\n" >file
$ git add file
$ git commit -m "commit with CRLF"
$ git config core.autocrlf true
$ printf "Line\n" >file
$ git add file

"git add" calls crlf_to_git() in convert.c, which calls check_safe_crlf().
When has_cr_in_index(path) is true, crlf_to_git() returns too early and
check_safe_crlf() is not called at all.

Factor out the code which determines if "git checkout" converts LF->CRLF
into will_convert_lf_to_crlf().

Update the logic around check_safe_crlf() and "simulate" the possible
LF->CRLF conversion at "git checkout" with help of will_convert_lf_to_crlf().
Thanks to Jeff King <peff@peff.net> for analyzing t0027.

Reported-By: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Torsten Bögershausen <tboegi@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 1335d76
Raw File
git-web--browse.sh
#!/bin/sh
#
# This program launch a web browser on the html page
# describing a git command.
#
# Copyright (c) 2007 Christian Couder
# Copyright (c) 2006 Theodore Y. Ts'o
#
# This file is heavily stolen from git-mergetool.sh, by
# Theodore Y. Ts'o (thanks) that is:
#
# Copyright (c) 2006 Theodore Y. Ts'o
#
# This file is licensed under the GPL v2, or a later version
# at the discretion of Junio C Hamano or any other official
# git maintainer.
#

USAGE='[--browser=browser|--tool=browser] [--config=conf.var] url/file ...'

# This must be capable of running outside of git directory, so
# the vanilla git-sh-setup should not be used.
NONGIT_OK=Yes
. git-sh-setup

valid_custom_tool()
{
	browser_cmd="$(git config "browser.$1.cmd")"
	test -n "$browser_cmd"
}

valid_tool() {
	case "$1" in
	firefox | iceweasel | seamonkey | iceape | \
	chrome | google-chrome | chromium | chromium-browser | \
	konqueror | opera | w3m | elinks | links | lynx | dillo | open | \
	start | cygstart | xdg-open)
		;; # happy
	*)
		valid_custom_tool "$1" || return 1
		;;
	esac
}

init_browser_path() {
	browser_path=$(git config "browser.$1.path")
	if test -z "$browser_path" &&
	   test "$1" = chromium &&
	   type chromium-browser >/dev/null 2>&1
	then
		browser_path=chromium-browser
	fi
	: ${browser_path:="$1"}
}

while test $# != 0
do
	case "$1" in
	-b|--browser*|-t|--tool*)
		case "$#,$1" in
		*,*=*)
			browser=$(expr "z$1" : 'z-[^=]*=\(.*\)')
			;;
		1,*)
			usage ;;
		*)
			browser="$2"
			shift ;;
		esac
		;;
	-c|--config*)
		case "$#,$1" in
		*,*=*)
			conf=$(expr "z$1" : 'z-[^=]*=\(.*\)')
			;;
		1,*)
			usage ;;
		*)
			conf="$2"
			shift ;;
		esac
		;;
	--)
		break
		;;
	-*)
		usage
		;;
	*)
		break
		;;
	esac
	shift
done

test $# = 0 && usage

if test -z "$browser"
then
	for opt in "$conf" "web.browser"
	do
		test -z "$opt" && continue
		browser="$(git config $opt)"
		test -z "$browser" || break
	done
	if test -n "$browser" && ! valid_tool "$browser"; then
		echo >&2 "git config option $opt set to unknown browser: $browser"
		echo >&2 "Resetting to default..."
		unset browser
	fi
fi

if test -z "$browser" ; then
	if test -n "$DISPLAY"; then
		browser_candidates="firefox iceweasel google-chrome chrome chromium chromium-browser konqueror opera seamonkey iceape w3m elinks links lynx dillo xdg-open"
		if test "$KDE_FULL_SESSION" = "true"; then
			browser_candidates="konqueror $browser_candidates"
		fi
	else
		browser_candidates="w3m elinks links lynx"
	fi
	# SECURITYSESSIONID indicates an OS X GUI login session
	if test -n "$SECURITYSESSIONID" || test -n "$TERM_PROGRAM"
	then
		browser_candidates="open $browser_candidates"
	fi
	# /bin/start indicates MinGW
	if test -x /bin/start; then
		browser_candidates="start $browser_candidates"
	fi
	# /usr/bin/cygstart indicates Cygwin
	if test -x /usr/bin/cygstart; then
		browser_candidates="cygstart $browser_candidates"
	fi

	for i in $browser_candidates; do
		init_browser_path $i
		if type "$browser_path" > /dev/null 2>&1; then
			browser=$i
			break
		fi
	done
	test -z "$browser" && die "No known browser available."
else
	valid_tool "$browser" || die "Unknown browser '$browser'."

	init_browser_path "$browser"

	if test -z "$browser_cmd" && ! type "$browser_path" > /dev/null 2>&1; then
		die "The browser $browser is not available as '$browser_path'."
	fi
fi

case "$browser" in
firefox|iceweasel|seamonkey|iceape)
	# Check version because firefox < 2.0 does not support "-new-tab".
	vers=$(expr "$($browser_path -version)" : '.* \([0-9][0-9]*\)\..*')
	NEWTAB='-new-tab'
	test "$vers" -lt 2 && NEWTAB=''
	"$browser_path" $NEWTAB "$@" &
	;;
google-chrome|chrome|chromium|chromium-browser)
	# No need to specify newTab. It's default in chromium
	"$browser_path" "$@" &
	;;
konqueror)
	case "$(basename "$browser_path")" in
	konqueror)
		# It's simpler to use kfmclient to open a new tab in konqueror.
		browser_path="$(echo "$browser_path" | sed -e 's/konqueror$/kfmclient/')"
		type "$browser_path" > /dev/null 2>&1 || die "No '$browser_path' found."
		"$browser_path" newTab "$@" &
		;;
	kfmclient)
		"$browser_path" newTab "$@" &
		;;
	*)
		"$browser_path" "$@" &
		;;
	esac
	;;
w3m|elinks|links|lynx|open|cygstart|xdg-open)
	"$browser_path" "$@"
	;;
start)
	exec "$browser_path" '"web-browse"' "$@"
	;;
opera|dillo)
	"$browser_path" "$@" &
	;;
*)
	if test -n "$browser_cmd"; then
		( eval "$browser_cmd \"\$@\"" )
	fi
	;;
esac
back to top