¿La autodetección de Git está escrita o está dentro de algún ejecutable de Git?

Esta pregunta se basa en el comentario de VonC en el hilo .

¿La autodetección de Git para difftool o mergetool está escrita o está dentro de algún ejecutable de Git?

Está escrito en git-mergetool. Encontré esto en la línea 344 de mi copy.

if test -z "$merge_tool"; then merge_tool=`git config merge.tool` if test -n "$merge_tool" && ! valid_tool "$merge_tool"; then echo >&2 "git config option merge.tool set to unknown tool: $merge_tool" echo >&2 "Resetting to default..." unset merge_tool fi fi if test -z "$merge_tool" ; then if test -n "$DISPLAY"; then merge_tool_candidates="kdiff3 tkdiff xxdiff meld gvimdiff" if test -n "$GNOME_DESKTOP_SESSION_ID" ; then merge_tool_candidates="meld $merge_tool_candidates" fi if test "$KDE_FULL_SESSION" = "true"; then merge_tool_candidates="kdiff3 $merge_tool_candidates" fi fi if echo "${VISUAL:-$EDITOR}" | grep 'emacs' > /dev/null 2>&1; then merge_tool_candidates="$merge_tool_candidates emerge" fi (snip) 

Como se menciona en la página de manual de git mergetool ,

 --tool=<tool> 

Use el progtwig de resolución de fusión especificado por.
Las herramientas de combinación válidas son: kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse, tortoisemerge, opendiff y araxis.

Ahora, ¿de dónde viene esa list?

En realidad, esas herramientas (y sus opciones personalizadas) se usan en el script:

 <Git>/libexec/git-core/git-mergetool--lib 

y utilizado por el script git-mergetool, que hace la selección basada en el command git config merge.tool .

Pero hay un poco de 'auto-selección' basada en la function valid_tool () en git-mergetool-lib:

 valid_tool () 

Utiliza get_merge_tool_cmd () que se basa en mergetool.<aMergeToolName>.cmd .
Si esa configuration permanece en uno de los files de configuration de git … esa herramienta será seleccionada.


Correcto …, Jakub Narębski acaba de señalar la sección derecha en la secuencia de commands git-mergetool--lib :

 get_merge_tool () { # Check if a merge tool has been configunetworking merge_tool=$(get_configunetworking_merge_tool) # Try to guess an appropriate merge tool if no tool has been set. if test -z "$merge_tool"; then merge_tool="$(guess_merge_tool)" || exit fi echo "$merge_tool" } 

Esa function acertadamente llamada guess_merge_tool() (¡creo que debería poder encontrarla! …) hace entre otras cosas, lo siguiente, lo que podría explicar que detecte opendiff:

 # Loop over each candidate and stop when a valid merge tool is found. for i in $tools do merge_tool_path="$(translate_merge_tool_path "$i")" if type "$merge_tool_path" > /dev/null 2>&1; then echo "$i" return 0 fi done