Remove obsolete stuffs
This commit is contained in:
BIN
bin/git/mingw64/libexec/git-core/Atlassian.Bitbucket.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Atlassian.Bitbucket.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Base.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Base.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Controls.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Controls.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.DesignerSupport.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.DesignerSupport.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Dialogs.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Dialogs.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Markup.Xaml.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Markup.Xaml.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Markup.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Markup.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Metal.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Metal.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.MicroCom.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.MicroCom.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.OpenGL.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.OpenGL.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Remote.Protocol.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Remote.Protocol.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Skia.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Skia.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Themes.Fluent.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Themes.Fluent.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Vulkan.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Vulkan.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Win32.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.Win32.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Avalonia.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Avalonia.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/GitHub.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/GitHub.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/GitLab.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/GitLab.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/HarfBuzzSharp.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/HarfBuzzSharp.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/MicroCom.Runtime.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/MicroCom.Runtime.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Microsoft.AzureRepos.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Microsoft.AzureRepos.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/Microsoft.Identity.Client.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/Microsoft.Identity.Client.dll
Normal file
Binary file not shown.
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/SkiaSharp.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/SkiaSharp.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/System.Buffers.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/System.Buffers.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/System.CommandLine.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/System.CommandLine.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/System.Memory.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/System.Memory.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/System.Numerics.Vectors.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/System.Numerics.Vectors.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/System.Text.Encodings.Web.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/System.Text.Encodings.Web.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/System.Text.Json.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/System.Text.Json.dll
Normal file
Binary file not shown.
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/System.ValueTuple.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/System.ValueTuple.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/av_libglesv2.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/av_libglesv2.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/dlls-copied.exe
Normal file
BIN
bin/git/mingw64/libexec/git-core/dlls-copied.exe
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/edit.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/edit.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/gcmcore.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/gcmcore.dll
Normal file
Binary file not shown.
25
bin/git/mingw64/libexec/git-core/git-citool
Normal file
25
bin/git/mingw64/libexec/git-core/git-citool
Normal file
@@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
# Tcl ignores the next line -*- tcl -*- \
|
||||
exec wish "$0" -- "$@"
|
||||
|
||||
if { $argc >=2 && [lindex $argv 0] == "--working-dir" } {
|
||||
set workdir [lindex $argv 1]
|
||||
cd $workdir
|
||||
if {[lindex [file split $workdir] end] eq {.git}} {
|
||||
# Workaround for Explorer right click "Git GUI Here" on .git/
|
||||
cd ..
|
||||
}
|
||||
set argv [lrange $argv 2 end]
|
||||
incr argc -2
|
||||
}
|
||||
|
||||
set basedir [file dirname \
|
||||
[file dirname \
|
||||
[file dirname [info script]]]]
|
||||
set bindir [file join $basedir bin]
|
||||
set bindir "$bindir;[file join $basedir mingw bin]"
|
||||
regsub -all ";" $bindir "\\;" bindir
|
||||
set env(PATH) "$bindir;$env(PATH)"
|
||||
unset bindir
|
||||
|
||||
source [file join [file dirname [info script]] git-gui.tcl]
|
||||
BIN
bin/git/mingw64/libexec/git-core/git-credential-wincred.exe
Normal file
BIN
bin/git/mingw64/libexec/git-core/git-credential-wincred.exe
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/git-daemon.exe
Normal file
BIN
bin/git/mingw64/libexec/git-core/git-daemon.exe
Normal file
Binary file not shown.
129
bin/git/mingw64/libexec/git-core/git-difftool--helper
Normal file
129
bin/git/mingw64/libexec/git-core/git-difftool--helper
Normal file
@@ -0,0 +1,129 @@
|
||||
#!/bin/sh
|
||||
# git-difftool--helper is a GIT_EXTERNAL_DIFF-compatible diff tool launcher.
|
||||
# This script is typically launched by using the 'git difftool'
|
||||
# convenience command.
|
||||
#
|
||||
# Copyright (c) 2009, 2010 David Aguilar
|
||||
|
||||
TOOL_MODE=diff
|
||||
. git-mergetool--lib
|
||||
|
||||
# difftool.prompt controls the default prompt/no-prompt behavior
|
||||
# and is overridden with $GIT_DIFFTOOL*_PROMPT.
|
||||
should_prompt () {
|
||||
prompt_merge=$(git config --bool mergetool.prompt || echo true)
|
||||
prompt=$(git config --bool difftool.prompt || echo $prompt_merge)
|
||||
if test "$prompt" = true
|
||||
then
|
||||
test -z "$GIT_DIFFTOOL_NO_PROMPT"
|
||||
else
|
||||
test -n "$GIT_DIFFTOOL_PROMPT"
|
||||
fi
|
||||
}
|
||||
|
||||
# Indicates that --extcmd=... was specified
|
||||
use_ext_cmd () {
|
||||
test -n "$GIT_DIFFTOOL_EXTCMD"
|
||||
}
|
||||
|
||||
launch_merge_tool () {
|
||||
# Merged is the filename as it appears in the work tree
|
||||
# Local is the contents of a/filename
|
||||
# Remote is the contents of b/filename
|
||||
# Custom merge tool commands might use $BASE so we provide it
|
||||
MERGED="$1"
|
||||
LOCAL="$2"
|
||||
REMOTE="$3"
|
||||
BASE="$1"
|
||||
|
||||
# $LOCAL and $REMOTE are temporary files so prompt
|
||||
# the user with the real $MERGED name before launching $merge_tool.
|
||||
if should_prompt
|
||||
then
|
||||
printf "\nViewing (%s/%s): '%s'\n" "$GIT_DIFF_PATH_COUNTER" \
|
||||
"$GIT_DIFF_PATH_TOTAL" "$MERGED"
|
||||
if use_ext_cmd
|
||||
then
|
||||
printf "Launch '%s' [Y/n]? " \
|
||||
"$GIT_DIFFTOOL_EXTCMD"
|
||||
else
|
||||
printf "Launch '%s' [Y/n]? " "$merge_tool"
|
||||
fi
|
||||
read ans || return
|
||||
if test "$ans" = n
|
||||
then
|
||||
return
|
||||
fi
|
||||
fi
|
||||
|
||||
if use_ext_cmd
|
||||
then
|
||||
export BASE
|
||||
eval $GIT_DIFFTOOL_EXTCMD '"$LOCAL"' '"$REMOTE"'
|
||||
else
|
||||
initialize_merge_tool "$merge_tool"
|
||||
# ignore the error from the above --- run_merge_tool
|
||||
# will diagnose unusable tool by itself
|
||||
run_merge_tool "$merge_tool"
|
||||
fi
|
||||
}
|
||||
|
||||
if ! use_ext_cmd
|
||||
then
|
||||
if test -n "$GIT_DIFF_TOOL"
|
||||
then
|
||||
merge_tool="$GIT_DIFF_TOOL"
|
||||
else
|
||||
merge_tool="$(get_merge_tool)"
|
||||
subshell_exit_status=$?
|
||||
if test $subshell_exit_status -gt 1
|
||||
then
|
||||
exit $subshell_exit_status
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -n "$GIT_DIFFTOOL_DIRDIFF"
|
||||
then
|
||||
LOCAL="$1"
|
||||
REMOTE="$2"
|
||||
initialize_merge_tool "$merge_tool"
|
||||
# ignore the error from the above --- run_merge_tool
|
||||
# will diagnose unusable tool by itself
|
||||
run_merge_tool "$merge_tool" false
|
||||
|
||||
status=$?
|
||||
if test $status -ge 126
|
||||
then
|
||||
# Command not found (127), not executable (126) or
|
||||
# exited via a signal (>= 128).
|
||||
exit $status
|
||||
fi
|
||||
|
||||
if test "$GIT_DIFFTOOL_TRUST_EXIT_CODE" = true
|
||||
then
|
||||
exit $status
|
||||
fi
|
||||
else
|
||||
# Launch the merge tool on each path provided by 'git diff'
|
||||
while test $# -gt 6
|
||||
do
|
||||
launch_merge_tool "$1" "$2" "$5"
|
||||
status=$?
|
||||
if test $status -ge 126
|
||||
then
|
||||
# Command not found (127), not executable (126) or
|
||||
# exited via a signal (>= 128).
|
||||
exit $status
|
||||
fi
|
||||
|
||||
if test "$status" != 0 &&
|
||||
test "$GIT_DIFFTOOL_TRUST_EXIT_CODE" = true
|
||||
then
|
||||
exit $status
|
||||
fi
|
||||
shift 7
|
||||
done
|
||||
fi
|
||||
|
||||
exit 0
|
||||
664
bin/git/mingw64/libexec/git-core/git-filter-branch
Normal file
664
bin/git/mingw64/libexec/git-core/git-filter-branch
Normal file
@@ -0,0 +1,664 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Rewrite revision history
|
||||
# Copyright (c) Petr Baudis, 2006
|
||||
# Minimal changes to "port" it to core-git (c) Johannes Schindelin, 2007
|
||||
#
|
||||
# Lets you rewrite the revision history of the current branch, creating
|
||||
# a new branch. You can specify a number of filters to modify the commits,
|
||||
# files and trees.
|
||||
|
||||
# The following functions will also be available in the commit filter:
|
||||
|
||||
functions=$(cat << \EOF
|
||||
EMPTY_TREE=$(git hash-object -t tree /dev/null)
|
||||
|
||||
warn () {
|
||||
echo "$*" >&2
|
||||
}
|
||||
|
||||
map()
|
||||
{
|
||||
# if it was not rewritten, take the original
|
||||
if test -r "$workdir/../map/$1"
|
||||
then
|
||||
cat "$workdir/../map/$1"
|
||||
else
|
||||
echo "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
# if you run 'skip_commit "$@"' in a commit filter, it will print
|
||||
# the (mapped) parents, effectively skipping the commit.
|
||||
|
||||
skip_commit()
|
||||
{
|
||||
shift;
|
||||
while [ -n "$1" ];
|
||||
do
|
||||
shift;
|
||||
map "$1";
|
||||
shift;
|
||||
done;
|
||||
}
|
||||
|
||||
# if you run 'git_commit_non_empty_tree "$@"' in a commit filter,
|
||||
# it will skip commits that leave the tree untouched, commit the other.
|
||||
git_commit_non_empty_tree()
|
||||
{
|
||||
if test $# = 3 && test "$1" = $(git rev-parse "$3^{tree}"); then
|
||||
map "$3"
|
||||
elif test $# = 1 && test "$1" = $EMPTY_TREE; then
|
||||
:
|
||||
else
|
||||
git commit-tree "$@"
|
||||
fi
|
||||
}
|
||||
# override die(): this version puts in an extra line break, so that
|
||||
# the progress is still visible
|
||||
|
||||
die()
|
||||
{
|
||||
echo >&2
|
||||
echo "$*" >&2
|
||||
exit 1
|
||||
}
|
||||
EOF
|
||||
)
|
||||
|
||||
eval "$functions"
|
||||
|
||||
finish_ident() {
|
||||
# Ensure non-empty id name.
|
||||
echo "case \"\$GIT_$1_NAME\" in \"\") GIT_$1_NAME=\"\${GIT_$1_EMAIL%%@*}\" && export GIT_$1_NAME;; esac"
|
||||
# And make sure everything is exported.
|
||||
echo "export GIT_$1_NAME"
|
||||
echo "export GIT_$1_EMAIL"
|
||||
echo "export GIT_$1_DATE"
|
||||
}
|
||||
|
||||
set_ident () {
|
||||
parse_ident_from_commit author AUTHOR committer COMMITTER
|
||||
finish_ident AUTHOR
|
||||
finish_ident COMMITTER
|
||||
}
|
||||
|
||||
if test -z "$FILTER_BRANCH_SQUELCH_WARNING$GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS"
|
||||
then
|
||||
cat <<EOF
|
||||
WARNING: git-filter-branch has a glut of gotchas generating mangled history
|
||||
rewrites. Hit Ctrl-C before proceeding to abort, then use an
|
||||
alternative filtering tool such as 'git filter-repo'
|
||||
(https://github.com/newren/git-filter-repo/) instead. See the
|
||||
filter-branch manual page for more details; to squelch this warning,
|
||||
set FILTER_BRANCH_SQUELCH_WARNING=1.
|
||||
EOF
|
||||
sleep 10
|
||||
printf "Proceeding with filter-branch...\n\n"
|
||||
fi
|
||||
|
||||
USAGE="[--setup <command>] [--subdirectory-filter <directory>] [--env-filter <command>]
|
||||
[--tree-filter <command>] [--index-filter <command>]
|
||||
[--parent-filter <command>] [--msg-filter <command>]
|
||||
[--commit-filter <command>] [--tag-name-filter <command>]
|
||||
[--original <namespace>]
|
||||
[-d <directory>] [-f | --force] [--state-branch <branch>]
|
||||
[--] [<rev-list options>...]"
|
||||
|
||||
OPTIONS_SPEC=
|
||||
. git-sh-setup
|
||||
|
||||
if [ "$(is_bare_repository)" = false ]; then
|
||||
require_clean_work_tree 'rewrite branches'
|
||||
fi
|
||||
|
||||
tempdir=.git-rewrite
|
||||
filter_setup=
|
||||
filter_env=
|
||||
filter_tree=
|
||||
filter_index=
|
||||
filter_parent=
|
||||
filter_msg=cat
|
||||
filter_commit=
|
||||
filter_tag_name=
|
||||
filter_subdir=
|
||||
state_branch=
|
||||
orig_namespace=refs/original/
|
||||
force=
|
||||
prune_empty=
|
||||
remap_to_ancestor=
|
||||
while :
|
||||
do
|
||||
case "$1" in
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
--force|-f)
|
||||
shift
|
||||
force=t
|
||||
continue
|
||||
;;
|
||||
--remap-to-ancestor)
|
||||
# deprecated ($remap_to_ancestor is set now automatically)
|
||||
shift
|
||||
remap_to_ancestor=t
|
||||
continue
|
||||
;;
|
||||
--prune-empty)
|
||||
shift
|
||||
prune_empty=t
|
||||
continue
|
||||
;;
|
||||
-*)
|
||||
;;
|
||||
*)
|
||||
break;
|
||||
esac
|
||||
|
||||
# all switches take one argument
|
||||
ARG="$1"
|
||||
case "$#" in 1) usage ;; esac
|
||||
shift
|
||||
OPTARG="$1"
|
||||
shift
|
||||
|
||||
case "$ARG" in
|
||||
-d)
|
||||
tempdir="$OPTARG"
|
||||
;;
|
||||
--setup)
|
||||
filter_setup="$OPTARG"
|
||||
;;
|
||||
--subdirectory-filter)
|
||||
filter_subdir="$OPTARG"
|
||||
remap_to_ancestor=t
|
||||
;;
|
||||
--env-filter)
|
||||
filter_env="$OPTARG"
|
||||
;;
|
||||
--tree-filter)
|
||||
filter_tree="$OPTARG"
|
||||
;;
|
||||
--index-filter)
|
||||
filter_index="$OPTARG"
|
||||
;;
|
||||
--parent-filter)
|
||||
filter_parent="$OPTARG"
|
||||
;;
|
||||
--msg-filter)
|
||||
filter_msg="$OPTARG"
|
||||
;;
|
||||
--commit-filter)
|
||||
filter_commit="$functions; $OPTARG"
|
||||
;;
|
||||
--tag-name-filter)
|
||||
filter_tag_name="$OPTARG"
|
||||
;;
|
||||
--original)
|
||||
orig_namespace=$(expr "$OPTARG/" : '\(.*[^/]\)/*$')/
|
||||
;;
|
||||
--state-branch)
|
||||
state_branch="$OPTARG"
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
case "$prune_empty,$filter_commit" in
|
||||
,)
|
||||
filter_commit='git commit-tree "$@"';;
|
||||
t,)
|
||||
filter_commit="$functions;"' git_commit_non_empty_tree "$@"';;
|
||||
,*)
|
||||
;;
|
||||
*)
|
||||
die "Cannot set --prune-empty and --commit-filter at the same time"
|
||||
esac
|
||||
|
||||
case "$force" in
|
||||
t)
|
||||
rm -rf "$tempdir"
|
||||
;;
|
||||
'')
|
||||
test -d "$tempdir" &&
|
||||
die "$tempdir already exists, please remove it"
|
||||
esac
|
||||
orig_dir=$(pwd)
|
||||
mkdir -p "$tempdir/t" &&
|
||||
tempdir="$(cd "$tempdir"; pwd)" &&
|
||||
cd "$tempdir/t" &&
|
||||
workdir="$(pwd)" ||
|
||||
die ""
|
||||
|
||||
# Remove tempdir on exit
|
||||
trap 'cd "$orig_dir"; rm -rf "$tempdir"' 0
|
||||
|
||||
ORIG_GIT_DIR="$GIT_DIR"
|
||||
ORIG_GIT_WORK_TREE="$GIT_WORK_TREE"
|
||||
ORIG_GIT_INDEX_FILE="$GIT_INDEX_FILE"
|
||||
ORIG_GIT_AUTHOR_NAME="$GIT_AUTHOR_NAME"
|
||||
ORIG_GIT_AUTHOR_EMAIL="$GIT_AUTHOR_EMAIL"
|
||||
ORIG_GIT_AUTHOR_DATE="$GIT_AUTHOR_DATE"
|
||||
ORIG_GIT_COMMITTER_NAME="$GIT_COMMITTER_NAME"
|
||||
ORIG_GIT_COMMITTER_EMAIL="$GIT_COMMITTER_EMAIL"
|
||||
ORIG_GIT_COMMITTER_DATE="$GIT_COMMITTER_DATE"
|
||||
|
||||
GIT_WORK_TREE=.
|
||||
export GIT_DIR GIT_WORK_TREE
|
||||
|
||||
# Make sure refs/original is empty
|
||||
git for-each-ref > "$tempdir"/backup-refs || exit
|
||||
while read sha1 type name
|
||||
do
|
||||
case "$force,$name" in
|
||||
,$orig_namespace*)
|
||||
die "Cannot create a new backup.
|
||||
A previous backup already exists in $orig_namespace
|
||||
Force overwriting the backup with -f"
|
||||
;;
|
||||
t,$orig_namespace*)
|
||||
git update-ref -d "$name" $sha1
|
||||
;;
|
||||
esac
|
||||
done < "$tempdir"/backup-refs
|
||||
|
||||
# The refs should be updated if their heads were rewritten
|
||||
git rev-parse --no-flags --revs-only --symbolic-full-name \
|
||||
--default HEAD "$@" > "$tempdir"/raw-refs || exit
|
||||
while read ref
|
||||
do
|
||||
case "$ref" in ^?*) continue ;; esac
|
||||
|
||||
if git rev-parse --verify "$ref"^0 >/dev/null 2>&1
|
||||
then
|
||||
echo "$ref"
|
||||
else
|
||||
warn "WARNING: not rewriting '$ref' (not a committish)"
|
||||
fi
|
||||
done >"$tempdir"/heads <"$tempdir"/raw-refs
|
||||
|
||||
test -s "$tempdir"/heads ||
|
||||
die "You must specify a ref to rewrite."
|
||||
|
||||
GIT_INDEX_FILE="$(pwd)/../index"
|
||||
export GIT_INDEX_FILE
|
||||
|
||||
# map old->new commit ids for rewriting parents
|
||||
mkdir ../map || die "Could not create map/ directory"
|
||||
|
||||
if test -n "$state_branch"
|
||||
then
|
||||
state_commit=$(git rev-parse --no-flags --revs-only "$state_branch")
|
||||
if test -n "$state_commit"
|
||||
then
|
||||
echo "Populating map from $state_branch ($state_commit)" 1>&2
|
||||
perl -e'open(MAP, "-|", "git show $ARGV[0]:filter.map") or die;
|
||||
while (<MAP>) {
|
||||
m/(.*):(.*)/ or die;
|
||||
open F, ">../map/$1" or die;
|
||||
print F "$2" or die;
|
||||
close(F) or die;
|
||||
}
|
||||
close(MAP) or die;' "$state_commit" \
|
||||
|| die "Unable to load state from $state_branch:filter.map"
|
||||
else
|
||||
echo "Branch $state_branch does not exist. Will create" 1>&2
|
||||
fi
|
||||
fi
|
||||
|
||||
# we need "--" only if there are no path arguments in $@
|
||||
nonrevs=$(git rev-parse --no-revs "$@") || exit
|
||||
if test -z "$nonrevs"
|
||||
then
|
||||
dashdash=--
|
||||
else
|
||||
dashdash=
|
||||
remap_to_ancestor=t
|
||||
fi
|
||||
|
||||
git rev-parse --revs-only "$@" >../parse
|
||||
|
||||
case "$filter_subdir" in
|
||||
"")
|
||||
eval set -- "$(git rev-parse --sq --no-revs "$@")"
|
||||
;;
|
||||
*)
|
||||
eval set -- "$(git rev-parse --sq --no-revs "$@" $dashdash \
|
||||
"$filter_subdir")"
|
||||
;;
|
||||
esac
|
||||
|
||||
git rev-list --reverse --topo-order --default HEAD \
|
||||
--parents --simplify-merges --stdin "$@" <../parse >../revs ||
|
||||
die "Could not get the commits"
|
||||
commits=$(wc -l <../revs | tr -d " ")
|
||||
|
||||
test $commits -eq 0 && die_with_status 2 "Found nothing to rewrite"
|
||||
|
||||
# Rewrite the commits
|
||||
report_progress ()
|
||||
{
|
||||
if test -n "$progress" &&
|
||||
test $git_filter_branch__commit_count -gt $next_sample_at
|
||||
then
|
||||
count=$git_filter_branch__commit_count
|
||||
|
||||
now=$(date +%s)
|
||||
elapsed=$(($now - $start_timestamp))
|
||||
remaining=$(( ($commits - $count) * $elapsed / $count ))
|
||||
if test $elapsed -gt 0
|
||||
then
|
||||
next_sample_at=$(( ($elapsed + 1) * $count / $elapsed ))
|
||||
else
|
||||
next_sample_at=$(($next_sample_at + 1))
|
||||
fi
|
||||
progress=" ($elapsed seconds passed, remaining $remaining predicted)"
|
||||
fi
|
||||
printf "\rRewrite $commit ($count/$commits)$progress "
|
||||
}
|
||||
|
||||
git_filter_branch__commit_count=0
|
||||
|
||||
progress= start_timestamp=
|
||||
if date '+%s' 2>/dev/null | grep -q '^[0-9][0-9]*$'
|
||||
then
|
||||
next_sample_at=0
|
||||
progress="dummy to ensure this is not empty"
|
||||
start_timestamp=$(date '+%s')
|
||||
fi
|
||||
|
||||
if test -n "$filter_index" ||
|
||||
test -n "$filter_tree" ||
|
||||
test -n "$filter_subdir"
|
||||
then
|
||||
need_index=t
|
||||
else
|
||||
need_index=
|
||||
fi
|
||||
|
||||
eval "$filter_setup" < /dev/null ||
|
||||
die "filter setup failed: $filter_setup"
|
||||
|
||||
while read commit parents; do
|
||||
git_filter_branch__commit_count=$(($git_filter_branch__commit_count+1))
|
||||
|
||||
report_progress
|
||||
test -f "$workdir"/../map/$commit && continue
|
||||
|
||||
case "$filter_subdir" in
|
||||
"")
|
||||
if test -n "$need_index"
|
||||
then
|
||||
GIT_ALLOW_NULL_SHA1=1 git read-tree -i -m $commit
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
# The commit may not have the subdirectory at all
|
||||
err=$(GIT_ALLOW_NULL_SHA1=1 \
|
||||
git read-tree -i -m $commit:"$filter_subdir" 2>&1) || {
|
||||
if ! git rev-parse -q --verify $commit:"$filter_subdir"
|
||||
then
|
||||
rm -f "$GIT_INDEX_FILE"
|
||||
else
|
||||
echo >&2 "$err"
|
||||
false
|
||||
fi
|
||||
}
|
||||
esac || die "Could not initialize the index"
|
||||
|
||||
GIT_COMMIT=$commit
|
||||
export GIT_COMMIT
|
||||
git cat-file commit "$commit" >../commit ||
|
||||
die "Cannot read commit $commit"
|
||||
|
||||
eval "$(set_ident <../commit)" ||
|
||||
die "setting author/committer failed for commit $commit"
|
||||
eval "$filter_env" < /dev/null ||
|
||||
die "env filter failed: $filter_env"
|
||||
|
||||
if [ "$filter_tree" ]; then
|
||||
git checkout-index -f -u -a ||
|
||||
die "Could not checkout the index"
|
||||
# files that $commit removed are now still in the working tree;
|
||||
# remove them, else they would be added again
|
||||
git clean -d -q -f -x
|
||||
eval "$filter_tree" < /dev/null ||
|
||||
die "tree filter failed: $filter_tree"
|
||||
|
||||
(
|
||||
git diff-index -r --name-only --ignore-submodules $commit -- &&
|
||||
git ls-files --others
|
||||
) > "$tempdir"/tree-state || exit
|
||||
git update-index --add --replace --remove --stdin \
|
||||
< "$tempdir"/tree-state || exit
|
||||
fi
|
||||
|
||||
eval "$filter_index" < /dev/null ||
|
||||
die "index filter failed: $filter_index"
|
||||
|
||||
parentstr=
|
||||
for parent in $parents; do
|
||||
for reparent in $(map "$parent"); do
|
||||
case "$parentstr " in
|
||||
*" -p $reparent "*)
|
||||
;;
|
||||
*)
|
||||
parentstr="$parentstr -p $reparent"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
done
|
||||
if [ "$filter_parent" ]; then
|
||||
parentstr="$(echo "$parentstr" | eval "$filter_parent")" ||
|
||||
die "parent filter failed: $filter_parent"
|
||||
fi
|
||||
|
||||
{
|
||||
while IFS='' read -r header_line && test -n "$header_line"
|
||||
do
|
||||
# skip header lines...
|
||||
:;
|
||||
done
|
||||
# and output the actual commit message
|
||||
cat
|
||||
} <../commit |
|
||||
eval "$filter_msg" > ../message ||
|
||||
die "msg filter failed: $filter_msg"
|
||||
|
||||
if test -n "$need_index"
|
||||
then
|
||||
tree=$(git write-tree)
|
||||
else
|
||||
tree=$(git rev-parse "$commit^{tree}")
|
||||
fi
|
||||
workdir=$workdir /bin/sh -c "$filter_commit" "git commit-tree" \
|
||||
"$tree" $parentstr < ../message > ../map/$commit ||
|
||||
die "could not write rewritten commit"
|
||||
done <../revs
|
||||
|
||||
# If we are filtering for paths, as in the case of a subdirectory
|
||||
# filter, it is possible that a specified head is not in the set of
|
||||
# rewritten commits, because it was pruned by the revision walker.
|
||||
# Ancestor remapping fixes this by mapping these heads to the unique
|
||||
# nearest ancestor that survived the pruning.
|
||||
|
||||
if test "$remap_to_ancestor" = t
|
||||
then
|
||||
while read ref
|
||||
do
|
||||
sha1=$(git rev-parse "$ref"^0)
|
||||
test -f "$workdir"/../map/$sha1 && continue
|
||||
ancestor=$(git rev-list --simplify-merges -1 "$ref" "$@")
|
||||
test "$ancestor" && echo $(map $ancestor) >"$workdir"/../map/$sha1
|
||||
done < "$tempdir"/heads
|
||||
fi
|
||||
|
||||
# Finally update the refs
|
||||
|
||||
echo
|
||||
while read ref
|
||||
do
|
||||
# avoid rewriting a ref twice
|
||||
test -f "$orig_namespace$ref" && continue
|
||||
|
||||
sha1=$(git rev-parse "$ref"^0)
|
||||
rewritten=$(map $sha1)
|
||||
|
||||
test $sha1 = "$rewritten" &&
|
||||
warn "WARNING: Ref '$ref' is unchanged" &&
|
||||
continue
|
||||
|
||||
case "$rewritten" in
|
||||
'')
|
||||
echo "Ref '$ref' was deleted"
|
||||
git update-ref -m "filter-branch: delete" -d "$ref" $sha1 ||
|
||||
die "Could not delete $ref"
|
||||
;;
|
||||
*)
|
||||
echo "Ref '$ref' was rewritten"
|
||||
if ! git update-ref -m "filter-branch: rewrite" \
|
||||
"$ref" $rewritten $sha1 2>/dev/null; then
|
||||
if test $(git cat-file -t "$ref") = tag; then
|
||||
if test -z "$filter_tag_name"; then
|
||||
warn "WARNING: You said to rewrite tagged commits, but not the corresponding tag."
|
||||
warn "WARNING: Perhaps use '--tag-name-filter cat' to rewrite the tag."
|
||||
fi
|
||||
else
|
||||
die "Could not rewrite $ref"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
git update-ref -m "filter-branch: backup" "$orig_namespace$ref" $sha1 ||
|
||||
exit
|
||||
done < "$tempdir"/heads
|
||||
|
||||
# TODO: This should possibly go, with the semantics that all positive given
|
||||
# refs are updated, and their original heads stored in refs/original/
|
||||
# Filter tags
|
||||
|
||||
if [ "$filter_tag_name" ]; then
|
||||
git for-each-ref --format='%(objectname) %(objecttype) %(refname)' refs/tags |
|
||||
while read sha1 type ref; do
|
||||
ref="${ref#refs/tags/}"
|
||||
# XXX: Rewrite tagged trees as well?
|
||||
if [ "$type" != "commit" -a "$type" != "tag" ]; then
|
||||
continue;
|
||||
fi
|
||||
|
||||
if [ "$type" = "tag" ]; then
|
||||
# Dereference to a commit
|
||||
sha1t="$sha1"
|
||||
sha1="$(git rev-parse -q "$sha1"^{commit})" || continue
|
||||
fi
|
||||
|
||||
[ -f "../map/$sha1" ] || continue
|
||||
new_sha1="$(cat "../map/$sha1")"
|
||||
GIT_COMMIT="$sha1"
|
||||
export GIT_COMMIT
|
||||
new_ref="$(echo "$ref" | eval "$filter_tag_name")" ||
|
||||
die "tag name filter failed: $filter_tag_name"
|
||||
|
||||
echo "$ref -> $new_ref ($sha1 -> $new_sha1)"
|
||||
|
||||
if [ "$type" = "tag" ]; then
|
||||
new_sha1=$( ( printf 'object %s\ntype commit\ntag %s\n' \
|
||||
"$new_sha1" "$new_ref"
|
||||
git cat-file tag "$ref" |
|
||||
sed -n \
|
||||
-e '1,/^$/{
|
||||
/^object /d
|
||||
/^type /d
|
||||
/^tag /d
|
||||
}' \
|
||||
-e '/^-----BEGIN PGP SIGNATURE-----/q' \
|
||||
-e 'p' ) |
|
||||
git hash-object -t tag -w --stdin) ||
|
||||
die "Could not create new tag object for $ref"
|
||||
if git cat-file tag "$ref" | \
|
||||
grep '^-----BEGIN PGP SIGNATURE-----' >/dev/null 2>&1
|
||||
then
|
||||
warn "gpg signature stripped from tag object $sha1t"
|
||||
fi
|
||||
fi
|
||||
|
||||
git update-ref "refs/tags/$new_ref" "$new_sha1" ||
|
||||
die "Could not write tag $new_ref"
|
||||
done
|
||||
fi
|
||||
|
||||
unset GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE
|
||||
unset GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
|
||||
unset GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_COMMITTER_DATE
|
||||
test -z "$ORIG_GIT_DIR" || {
|
||||
GIT_DIR="$ORIG_GIT_DIR" && export GIT_DIR
|
||||
}
|
||||
test -z "$ORIG_GIT_WORK_TREE" || {
|
||||
GIT_WORK_TREE="$ORIG_GIT_WORK_TREE" &&
|
||||
export GIT_WORK_TREE
|
||||
}
|
||||
test -z "$ORIG_GIT_INDEX_FILE" || {
|
||||
GIT_INDEX_FILE="$ORIG_GIT_INDEX_FILE" &&
|
||||
export GIT_INDEX_FILE
|
||||
}
|
||||
test -z "$ORIG_GIT_AUTHOR_NAME" || {
|
||||
GIT_AUTHOR_NAME="$ORIG_GIT_AUTHOR_NAME" &&
|
||||
export GIT_AUTHOR_NAME
|
||||
}
|
||||
test -z "$ORIG_GIT_AUTHOR_EMAIL" || {
|
||||
GIT_AUTHOR_EMAIL="$ORIG_GIT_AUTHOR_EMAIL" &&
|
||||
export GIT_AUTHOR_EMAIL
|
||||
}
|
||||
test -z "$ORIG_GIT_AUTHOR_DATE" || {
|
||||
GIT_AUTHOR_DATE="$ORIG_GIT_AUTHOR_DATE" &&
|
||||
export GIT_AUTHOR_DATE
|
||||
}
|
||||
test -z "$ORIG_GIT_COMMITTER_NAME" || {
|
||||
GIT_COMMITTER_NAME="$ORIG_GIT_COMMITTER_NAME" &&
|
||||
export GIT_COMMITTER_NAME
|
||||
}
|
||||
test -z "$ORIG_GIT_COMMITTER_EMAIL" || {
|
||||
GIT_COMMITTER_EMAIL="$ORIG_GIT_COMMITTER_EMAIL" &&
|
||||
export GIT_COMMITTER_EMAIL
|
||||
}
|
||||
test -z "$ORIG_GIT_COMMITTER_DATE" || {
|
||||
GIT_COMMITTER_DATE="$ORIG_GIT_COMMITTER_DATE" &&
|
||||
export GIT_COMMITTER_DATE
|
||||
}
|
||||
|
||||
if test -n "$state_branch"
|
||||
then
|
||||
echo "Saving rewrite state to $state_branch" 1>&2
|
||||
state_blob=$(
|
||||
perl -e'opendir D, "../map" or die;
|
||||
open H, "|-", "git hash-object -w --stdin" or die;
|
||||
foreach (sort readdir(D)) {
|
||||
next if m/^\.\.?$/;
|
||||
open F, "<../map/$_" or die;
|
||||
chomp($f = <F>);
|
||||
print H "$_:$f\n" or die;
|
||||
}
|
||||
close(H) or die;' || die "Unable to save state")
|
||||
state_tree=$(printf '100644 blob %s\tfilter.map\n' "$state_blob" | git mktree)
|
||||
if test -n "$state_commit"
|
||||
then
|
||||
state_commit=$(echo "Sync" | git commit-tree "$state_tree" -p "$state_commit")
|
||||
else
|
||||
state_commit=$(echo "Sync" | git commit-tree "$state_tree" )
|
||||
fi
|
||||
git update-ref "$state_branch" "$state_commit"
|
||||
fi
|
||||
|
||||
cd "$orig_dir"
|
||||
rm -rf "$tempdir"
|
||||
|
||||
trap - 0
|
||||
|
||||
if [ "$(is_bare_repository)" = false ]; then
|
||||
git read-tree -u -m HEAD || exit
|
||||
fi
|
||||
|
||||
exit 0
|
||||
25
bin/git/mingw64/libexec/git-core/git-gui
Normal file
25
bin/git/mingw64/libexec/git-core/git-gui
Normal file
@@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
# Tcl ignores the next line -*- tcl -*- \
|
||||
exec wish "$0" -- "$@"
|
||||
|
||||
if { $argc >=2 && [lindex $argv 0] == "--working-dir" } {
|
||||
set workdir [lindex $argv 1]
|
||||
cd $workdir
|
||||
if {[lindex [file split $workdir] end] eq {.git}} {
|
||||
# Workaround for Explorer right click "Git GUI Here" on .git/
|
||||
cd ..
|
||||
}
|
||||
set argv [lrange $argv 2 end]
|
||||
incr argc -2
|
||||
}
|
||||
|
||||
set basedir [file dirname \
|
||||
[file dirname \
|
||||
[file dirname [info script]]]]
|
||||
set bindir [file join $basedir bin]
|
||||
set bindir "$bindir;[file join $basedir mingw bin]"
|
||||
regsub -all ";" $bindir "\\;" bindir
|
||||
set env(PATH) "$bindir;$env(PATH)"
|
||||
unset bindir
|
||||
|
||||
source [file join [file dirname [info script]] git-gui.tcl]
|
||||
84
bin/git/mingw64/libexec/git-core/git-gui--askpass
Normal file
84
bin/git/mingw64/libexec/git-core/git-gui--askpass
Normal file
@@ -0,0 +1,84 @@
|
||||
#!/bin/sh
|
||||
# Tcl ignores the next line -*- tcl -*- \
|
||||
exec wish "$0" -- "$@"
|
||||
|
||||
# This is a trivial implementation of an SSH_ASKPASS handler.
|
||||
# Git-gui uses this script if none are already configured.
|
||||
|
||||
package require Tk
|
||||
|
||||
set answer {}
|
||||
set yesno 0
|
||||
set rc 255
|
||||
|
||||
if {$argc < 1} {
|
||||
set prompt "Enter your OpenSSH passphrase:"
|
||||
} else {
|
||||
set prompt [join $argv " "]
|
||||
if {[regexp -nocase {\(yes\/no\)\?\s*$} $prompt]} {
|
||||
set yesno 1
|
||||
}
|
||||
}
|
||||
|
||||
message .m -text $prompt -justify center -aspect 4000
|
||||
pack .m -side top -fill x -padx 20 -pady 20 -expand 1
|
||||
|
||||
entry .e -textvariable answer -width 50
|
||||
pack .e -side top -fill x -padx 10 -pady 10
|
||||
|
||||
proc on_show_input_changed {args} {
|
||||
global show_input
|
||||
if {$show_input} {
|
||||
.e configure -show ""
|
||||
} else {
|
||||
.e configure -show "*"
|
||||
}
|
||||
}
|
||||
trace add variable show_input write "on_show_input_changed"
|
||||
|
||||
set show_input 0
|
||||
|
||||
if {!$yesno} {
|
||||
checkbutton .cb_show -text "Show input" -variable show_input
|
||||
pack .cb_show -side top -anchor nw
|
||||
}
|
||||
|
||||
frame .b
|
||||
button .b.ok -text OK -command finish
|
||||
button .b.cancel -text Cancel -command cancel
|
||||
|
||||
pack .b.ok -side left -expand 1
|
||||
pack .b.cancel -side right -expand 1
|
||||
pack .b -side bottom -fill x -padx 10 -pady 10
|
||||
|
||||
bind . <Visibility> {focus -force .e}
|
||||
bind . <Key-Return> [list .b.ok invoke]
|
||||
bind . <Key-Escape> [list .b.cancel invoke]
|
||||
bind . <Destroy> {set rc $rc}
|
||||
|
||||
proc cancel {} {
|
||||
set ::rc 255
|
||||
}
|
||||
|
||||
proc finish {} {
|
||||
if {$::yesno} {
|
||||
if {$::answer ne "yes" && $::answer ne "no"} {
|
||||
tk_messageBox -icon error -title "Error" -type ok \
|
||||
-message "Only 'yes' or 'no' input allowed."
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
# On Windows, force the encoding to UTF-8: it is what `git.exe` expects
|
||||
if {$::tcl_platform(platform) eq {windows}} {
|
||||
set ::answer [encoding convertto utf-8 $::answer]
|
||||
}
|
||||
|
||||
puts $::answer
|
||||
set ::rc 0
|
||||
}
|
||||
|
||||
wm title . "OpenSSH"
|
||||
tk::PlaceWindow .
|
||||
vwait rc
|
||||
exit $rc
|
||||
68
bin/git/mingw64/libexec/git-core/git-gui--askyesno
Normal file
68
bin/git/mingw64/libexec/git-core/git-gui--askyesno
Normal file
@@ -0,0 +1,68 @@
|
||||
#!/bin/sh
|
||||
# Tcl ignores the next line -*- tcl -*- \
|
||||
exec wish "$0" -- "$@"
|
||||
|
||||
# This is an implementation of a simple yes no dialog
|
||||
# which is injected into the git commandline by git gui
|
||||
# in case a yesno question needs to be answered.
|
||||
|
||||
set NS {}
|
||||
set use_ttk [package vsatisfies [package provide Tk] 8.5]
|
||||
if {$use_ttk} {
|
||||
set NS ttk
|
||||
}
|
||||
|
||||
set title "Question?"
|
||||
if {$argc < 1} {
|
||||
puts stderr "Usage: $argv0 <question>"
|
||||
exit 1
|
||||
} else {
|
||||
if {$argc > 2 && [lindex $argv 0] == "--title"} {
|
||||
set title [lindex $argv 1]
|
||||
set argv [lreplace $argv 0 1]
|
||||
}
|
||||
set prompt [join $argv " "]
|
||||
}
|
||||
|
||||
${NS}::frame .t
|
||||
${NS}::label .t.m -text $prompt -justify center -width 400px
|
||||
.t.m configure -wraplength 400px
|
||||
pack .t.m -side top -fill x -padx 20 -pady 20 -expand 1
|
||||
pack .t -side top -fill x -ipadx 20 -ipady 20 -expand 1
|
||||
|
||||
${NS}::frame .b
|
||||
${NS}::frame .b.left -width 200
|
||||
${NS}::button .b.yes -text Yes -command yes
|
||||
${NS}::button .b.no -text No -command no
|
||||
|
||||
|
||||
pack .b.left -side left -expand 1 -fill x
|
||||
pack .b.yes -side left -expand 1
|
||||
pack .b.no -side right -expand 1 -ipadx 5
|
||||
pack .b -side bottom -fill x -ipadx 20 -ipady 15
|
||||
|
||||
bind . <Key-Return> {exit 0}
|
||||
bind . <Key-Escape> {exit 1}
|
||||
|
||||
proc no {} {
|
||||
exit 1
|
||||
}
|
||||
|
||||
proc yes {} {
|
||||
exit 0
|
||||
}
|
||||
|
||||
if {$::tcl_platform(platform) eq {windows}} {
|
||||
set icopath [file dirname [file normalize $argv0]]
|
||||
if {[file tail $icopath] eq {git-core}} {
|
||||
set icopath [file dirname $icopath]
|
||||
}
|
||||
set icopath [file dirname $icopath]
|
||||
set icopath [file join $icopath share git git-for-windows.ico]
|
||||
if {[file exists $icopath]} {
|
||||
wm iconbitmap . -default $icopath
|
||||
}
|
||||
}
|
||||
|
||||
wm title . $title
|
||||
tk::PlaceWindow .
|
||||
4157
bin/git/mingw64/libexec/git-core/git-gui.tcl
Normal file
4157
bin/git/mingw64/libexec/git-core/git-gui.tcl
Normal file
File diff suppressed because it is too large
Load Diff
BIN
bin/git/mingw64/libexec/git-core/git-http-backend.exe
Normal file
BIN
bin/git/mingw64/libexec/git-core/git-http-backend.exe
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/git-http-fetch.exe
Normal file
BIN
bin/git/mingw64/libexec/git-core/git-http-fetch.exe
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/git-http-push.exe
Normal file
BIN
bin/git/mingw64/libexec/git-core/git-http-push.exe
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/git-imap-send.exe
Normal file
BIN
bin/git/mingw64/libexec/git-core/git-imap-send.exe
Normal file
Binary file not shown.
786
bin/git/mingw64/libexec/git-core/git-instaweb
Normal file
786
bin/git/mingw64/libexec/git-core/git-instaweb
Normal file
@@ -0,0 +1,786 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2006 Eric Wong
|
||||
#
|
||||
|
||||
PERL='/usr/bin/perl'
|
||||
OPTIONS_KEEPDASHDASH=
|
||||
OPTIONS_STUCKLONG=
|
||||
OPTIONS_SPEC="\
|
||||
git instaweb [options] (--start | --stop | --restart)
|
||||
--
|
||||
l,local only bind on 127.0.0.1
|
||||
p,port= the port to bind to
|
||||
d,httpd= the command to launch
|
||||
b,browser= the browser to launch
|
||||
m,module-path= the module path (only needed for apache2)
|
||||
Action
|
||||
stop stop the web server
|
||||
start start the web server
|
||||
restart restart the web server
|
||||
"
|
||||
|
||||
SUBDIRECTORY_OK=Yes
|
||||
. git-sh-setup
|
||||
|
||||
fqgitdir="$GIT_DIR"
|
||||
local="$(git config --bool --get instaweb.local)"
|
||||
httpd="$(git config --get instaweb.httpd)"
|
||||
root="$(git config --get instaweb.gitwebdir)"
|
||||
port=$(git config --get instaweb.port)
|
||||
module_path="$(git config --get instaweb.modulepath)"
|
||||
action="browse"
|
||||
|
||||
conf="$GIT_DIR/gitweb/httpd.conf"
|
||||
|
||||
# Defaults:
|
||||
|
||||
# if installed, it doesn't need further configuration (module_path)
|
||||
test -z "$httpd" && httpd='lighttpd -f'
|
||||
|
||||
# Default is /mingw64/share/gitweb
|
||||
test -z "$root" && root='/mingw64/share/gitweb'
|
||||
|
||||
# any untaken local port will do...
|
||||
test -z "$port" && port=1234
|
||||
|
||||
resolve_full_httpd () {
|
||||
case "$httpd" in
|
||||
*apache2*|*lighttpd*|*httpd*)
|
||||
# yes, *httpd* covers *lighttpd* above, but it is there for clarity
|
||||
# ensure that the apache2/lighttpd command ends with "-f"
|
||||
if ! echo "$httpd" | grep -- '-f *$' >/dev/null 2>&1
|
||||
then
|
||||
httpd="$httpd -f"
|
||||
fi
|
||||
;;
|
||||
*plackup*)
|
||||
# server is started by running via generated gitweb.psgi in $fqgitdir/gitweb
|
||||
full_httpd="$fqgitdir/gitweb/gitweb.psgi"
|
||||
httpd_only="${httpd%% *}" # cut on first space
|
||||
return
|
||||
;;
|
||||
*webrick*)
|
||||
# server is started by running via generated webrick.rb in
|
||||
# $fqgitdir/gitweb
|
||||
full_httpd="$fqgitdir/gitweb/webrick.rb"
|
||||
httpd_only="${httpd%% *}" # cut on first space
|
||||
return
|
||||
;;
|
||||
*python*)
|
||||
# server is started by running via generated gitweb.py in
|
||||
# $fqgitdir/gitweb
|
||||
full_httpd="$fqgitdir/gitweb/gitweb.py"
|
||||
httpd_only="${httpd%% *}" # cut on first space
|
||||
return
|
||||
;;
|
||||
esac
|
||||
|
||||
httpd_only="$(echo $httpd | cut -f1 -d' ')"
|
||||
if case "$httpd_only" in /*) : ;; *) which $httpd_only >/dev/null 2>&1;; esac
|
||||
then
|
||||
full_httpd=$httpd
|
||||
else
|
||||
# many httpds are installed in /usr/sbin or /usr/local/sbin
|
||||
# these days and those are not in most users $PATHs
|
||||
# in addition, we may have generated a server script
|
||||
# in $fqgitdir/gitweb.
|
||||
for i in /usr/local/sbin /usr/sbin "$root" "$fqgitdir/gitweb"
|
||||
do
|
||||
if test -x "$i/$httpd_only"
|
||||
then
|
||||
full_httpd=$i/$httpd
|
||||
return
|
||||
fi
|
||||
done
|
||||
|
||||
echo >&2 "$httpd_only not found. Install $httpd_only or use" \
|
||||
"--httpd to specify another httpd daemon."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
start_httpd () {
|
||||
if test -f "$fqgitdir/pid"; then
|
||||
echo "Instance already running. Restarting..."
|
||||
stop_httpd
|
||||
fi
|
||||
|
||||
# here $httpd should have a meaningful value
|
||||
resolve_full_httpd
|
||||
mkdir -p "$fqgitdir/gitweb/$httpd_only"
|
||||
conf="$fqgitdir/gitweb/$httpd_only.conf"
|
||||
|
||||
# generate correct config file if it doesn't exist
|
||||
test -f "$conf" || configure_httpd
|
||||
test -f "$fqgitdir/gitweb/gitweb_config.perl" || gitweb_conf
|
||||
|
||||
# don't quote $full_httpd, there can be arguments to it (-f)
|
||||
case "$httpd" in
|
||||
*mongoose*|*plackup*|*python*)
|
||||
#These servers don't have a daemon mode so we'll have to fork it
|
||||
$full_httpd "$conf" &
|
||||
#Save the pid before doing anything else (we'll print it later)
|
||||
pid=$!
|
||||
|
||||
if test $? != 0; then
|
||||
echo "Could not execute http daemon $httpd."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cat > "$fqgitdir/pid" <<EOF
|
||||
$pid
|
||||
EOF
|
||||
;;
|
||||
*)
|
||||
$full_httpd "$conf"
|
||||
if test $? != 0; then
|
||||
echo "Could not execute http daemon $httpd."
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
stop_httpd () {
|
||||
test -f "$fqgitdir/pid" && kill $(cat "$fqgitdir/pid")
|
||||
rm -f "$fqgitdir/pid"
|
||||
}
|
||||
|
||||
httpd_is_ready () {
|
||||
"$PERL" -MIO::Socket::INET -e "
|
||||
local \$| = 1; # turn on autoflush
|
||||
exit if (IO::Socket::INET->new('127.0.0.1:$port'));
|
||||
print 'Waiting for \'$httpd\' to start ..';
|
||||
do {
|
||||
print '.';
|
||||
sleep(1);
|
||||
} until (IO::Socket::INET->new('127.0.0.1:$port'));
|
||||
print qq! (done)\n!;
|
||||
"
|
||||
}
|
||||
|
||||
while test $# != 0
|
||||
do
|
||||
case "$1" in
|
||||
--stop|stop)
|
||||
action="stop"
|
||||
;;
|
||||
--start|start)
|
||||
action="start"
|
||||
;;
|
||||
--restart|restart)
|
||||
action="restart"
|
||||
;;
|
||||
-l|--local)
|
||||
local=true
|
||||
;;
|
||||
-d|--httpd)
|
||||
shift
|
||||
httpd="$1"
|
||||
;;
|
||||
-b|--browser)
|
||||
shift
|
||||
browser="$1"
|
||||
;;
|
||||
-p|--port)
|
||||
shift
|
||||
port="$1"
|
||||
;;
|
||||
-m|--module-path)
|
||||
shift
|
||||
module_path="$1"
|
||||
;;
|
||||
--)
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
mkdir -p "$GIT_DIR/gitweb/tmp"
|
||||
GIT_EXEC_PATH="$(git --exec-path)"
|
||||
GIT_DIR="$fqgitdir"
|
||||
GITWEB_CONFIG="$fqgitdir/gitweb/gitweb_config.perl"
|
||||
export GIT_EXEC_PATH GIT_DIR GITWEB_CONFIG
|
||||
|
||||
webrick_conf () {
|
||||
# webrick seems to have no way of passing arbitrary environment
|
||||
# variables to the underlying CGI executable, so we wrap the
|
||||
# actual gitweb.cgi using a shell script to force it
|
||||
wrapper="$fqgitdir/gitweb/$httpd/wrapper.sh"
|
||||
cat > "$wrapper" <<EOF
|
||||
#!/bin/sh
|
||||
# we use this shell script wrapper around the real gitweb.cgi since
|
||||
# there appears to be no other way to pass arbitrary environment variables
|
||||
# into the CGI process
|
||||
GIT_EXEC_PATH=$GIT_EXEC_PATH GIT_DIR=$GIT_DIR GITWEB_CONFIG=$GITWEB_CONFIG
|
||||
export GIT_EXEC_PATH GIT_DIR GITWEB_CONFIG
|
||||
exec $root/gitweb.cgi
|
||||
EOF
|
||||
chmod +x "$wrapper"
|
||||
|
||||
# This assumes _ruby_ is in the user's $PATH. that's _one_
|
||||
# portable way to run ruby, which could be installed anywhere, really.
|
||||
# generate a standalone server script in $fqgitdir/gitweb.
|
||||
cat >"$fqgitdir/gitweb/$httpd.rb" <<EOF
|
||||
#!/usr/bin/env ruby
|
||||
require 'webrick'
|
||||
require 'logger'
|
||||
options = {
|
||||
:Port => $port,
|
||||
:DocumentRoot => "$root",
|
||||
:Logger => Logger.new('$fqgitdir/gitweb/error.log'),
|
||||
:AccessLog => [
|
||||
[ Logger.new('$fqgitdir/gitweb/access.log'),
|
||||
WEBrick::AccessLog::COMBINED_LOG_FORMAT ]
|
||||
],
|
||||
:DirectoryIndex => ["gitweb.cgi"],
|
||||
:CGIInterpreter => "$wrapper",
|
||||
:StartCallback => lambda do
|
||||
File.open("$fqgitdir/pid", "w") { |f| f.puts Process.pid }
|
||||
end,
|
||||
:ServerType => WEBrick::Daemon,
|
||||
}
|
||||
options[:BindAddress] = '127.0.0.1' if "$local" == "true"
|
||||
server = WEBrick::HTTPServer.new(options)
|
||||
['INT', 'TERM'].each do |signal|
|
||||
trap(signal) {server.shutdown}
|
||||
end
|
||||
server.start
|
||||
EOF
|
||||
chmod +x "$fqgitdir/gitweb/$httpd.rb"
|
||||
# configuration is embedded in server script file, webrick.rb
|
||||
rm -f "$conf"
|
||||
}
|
||||
|
||||
lighttpd_conf () {
|
||||
cat > "$conf" <<EOF
|
||||
server.document-root = "$root"
|
||||
server.port = $port
|
||||
server.modules = ( "mod_setenv", "mod_cgi" )
|
||||
server.indexfiles = ( "gitweb.cgi" )
|
||||
server.pid-file = "$fqgitdir/pid"
|
||||
server.errorlog = "$fqgitdir/gitweb/$httpd_only/error.log"
|
||||
|
||||
# to enable, add "mod_access", "mod_accesslog" to server.modules
|
||||
# variable above and uncomment this
|
||||
#accesslog.filename = "$fqgitdir/gitweb/$httpd_only/access.log"
|
||||
|
||||
setenv.add-environment = ( "PATH" => env.PATH, "GITWEB_CONFIG" => env.GITWEB_CONFIG )
|
||||
|
||||
cgi.assign = ( ".cgi" => "" )
|
||||
|
||||
# mimetype mapping
|
||||
mimetype.assign = (
|
||||
".pdf" => "application/pdf",
|
||||
".sig" => "application/pgp-signature",
|
||||
".spl" => "application/futuresplash",
|
||||
".class" => "application/octet-stream",
|
||||
".ps" => "application/postscript",
|
||||
".torrent" => "application/x-bittorrent",
|
||||
".dvi" => "application/x-dvi",
|
||||
".gz" => "application/x-gzip",
|
||||
".pac" => "application/x-ns-proxy-autoconfig",
|
||||
".swf" => "application/x-shockwave-flash",
|
||||
".tar.gz" => "application/x-tgz",
|
||||
".tgz" => "application/x-tgz",
|
||||
".tar" => "application/x-tar",
|
||||
".zip" => "application/zip",
|
||||
".mp3" => "audio/mpeg",
|
||||
".m3u" => "audio/x-mpegurl",
|
||||
".wma" => "audio/x-ms-wma",
|
||||
".wax" => "audio/x-ms-wax",
|
||||
".ogg" => "application/ogg",
|
||||
".wav" => "audio/x-wav",
|
||||
".gif" => "image/gif",
|
||||
".jpg" => "image/jpeg",
|
||||
".jpeg" => "image/jpeg",
|
||||
".png" => "image/png",
|
||||
".xbm" => "image/x-xbitmap",
|
||||
".xpm" => "image/x-xpixmap",
|
||||
".xwd" => "image/x-xwindowdump",
|
||||
".css" => "text/css",
|
||||
".html" => "text/html",
|
||||
".htm" => "text/html",
|
||||
".js" => "text/javascript",
|
||||
".asc" => "text/plain",
|
||||
".c" => "text/plain",
|
||||
".cpp" => "text/plain",
|
||||
".log" => "text/plain",
|
||||
".conf" => "text/plain",
|
||||
".text" => "text/plain",
|
||||
".txt" => "text/plain",
|
||||
".dtd" => "text/xml",
|
||||
".xml" => "text/xml",
|
||||
".mpeg" => "video/mpeg",
|
||||
".mpg" => "video/mpeg",
|
||||
".mov" => "video/quicktime",
|
||||
".qt" => "video/quicktime",
|
||||
".avi" => "video/x-msvideo",
|
||||
".asf" => "video/x-ms-asf",
|
||||
".asx" => "video/x-ms-asf",
|
||||
".wmv" => "video/x-ms-wmv",
|
||||
".bz2" => "application/x-bzip",
|
||||
".tbz" => "application/x-bzip-compressed-tar",
|
||||
".tar.bz2" => "application/x-bzip-compressed-tar",
|
||||
"" => "text/plain"
|
||||
)
|
||||
EOF
|
||||
test x"$local" = xtrue && echo 'server.bind = "127.0.0.1"' >> "$conf"
|
||||
}
|
||||
|
||||
apache2_conf () {
|
||||
for candidate in \
|
||||
/etc/httpd \
|
||||
/usr/lib/apache2 \
|
||||
/usr/lib/httpd ;
|
||||
do
|
||||
if test -d "$candidate/modules"
|
||||
then
|
||||
module_path="$candidate/modules"
|
||||
break
|
||||
fi
|
||||
done
|
||||
bind=
|
||||
test x"$local" = xtrue && bind='127.0.0.1:'
|
||||
echo 'text/css css' > "$fqgitdir/mime.types"
|
||||
cat > "$conf" <<EOF
|
||||
ServerName "git-instaweb"
|
||||
ServerRoot "$root"
|
||||
DocumentRoot "$root"
|
||||
ErrorLog "$fqgitdir/gitweb/$httpd_only/error.log"
|
||||
CustomLog "$fqgitdir/gitweb/$httpd_only/access.log" combined
|
||||
PidFile "$fqgitdir/pid"
|
||||
Listen $bind$port
|
||||
EOF
|
||||
|
||||
for mod in mpm_event mpm_prefork mpm_worker
|
||||
do
|
||||
if test -e $module_path/mod_${mod}.so
|
||||
then
|
||||
echo "LoadModule ${mod}_module " \
|
||||
"$module_path/mod_${mod}.so" >> "$conf"
|
||||
# only one mpm module permitted
|
||||
break
|
||||
fi
|
||||
done
|
||||
for mod in mime dir env log_config authz_core unixd
|
||||
do
|
||||
if test -e $module_path/mod_${mod}.so
|
||||
then
|
||||
echo "LoadModule ${mod}_module " \
|
||||
"$module_path/mod_${mod}.so" >> "$conf"
|
||||
fi
|
||||
done
|
||||
cat >> "$conf" <<EOF
|
||||
TypesConfig "$fqgitdir/mime.types"
|
||||
DirectoryIndex gitweb.cgi
|
||||
EOF
|
||||
|
||||
if test -f "$module_path/mod_perl.so"
|
||||
then
|
||||
# favor mod_perl if available
|
||||
cat >> "$conf" <<EOF
|
||||
LoadModule perl_module $module_path/mod_perl.so
|
||||
PerlPassEnv GIT_DIR
|
||||
PerlPassEnv GIT_EXEC_PATH
|
||||
PerlPassEnv GITWEB_CONFIG
|
||||
<Location /gitweb.cgi>
|
||||
SetHandler perl-script
|
||||
PerlResponseHandler ModPerl::Registry
|
||||
PerlOptions +ParseHeaders
|
||||
Options +ExecCGI
|
||||
</Location>
|
||||
EOF
|
||||
else
|
||||
# plain-old CGI
|
||||
resolve_full_httpd
|
||||
list_mods=$(echo "$full_httpd" | sed 's/-f$/-l/')
|
||||
$list_mods | grep 'mod_cgi\.c' >/dev/null 2>&1 || \
|
||||
if test -f "$module_path/mod_cgi.so"
|
||||
then
|
||||
echo "LoadModule cgi_module $module_path/mod_cgi.so" >> "$conf"
|
||||
else
|
||||
$list_mods | grep 'mod_cgid\.c' >/dev/null 2>&1 || \
|
||||
if test -f "$module_path/mod_cgid.so"
|
||||
then
|
||||
echo "LoadModule cgid_module $module_path/mod_cgid.so" \
|
||||
>> "$conf"
|
||||
else
|
||||
echo "You have no CGI support!"
|
||||
exit 2
|
||||
fi
|
||||
echo "ScriptSock logs/gitweb.sock" >> "$conf"
|
||||
fi
|
||||
cat >> "$conf" <<EOF
|
||||
PassEnv GIT_DIR
|
||||
PassEnv GIT_EXEC_PATH
|
||||
PassEnv GITWEB_CONFIG
|
||||
AddHandler cgi-script .cgi
|
||||
<Location /gitweb.cgi>
|
||||
Options +ExecCGI
|
||||
</Location>
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
|
||||
mongoose_conf() {
|
||||
cat > "$conf" <<EOF
|
||||
# Mongoose web server configuration file.
|
||||
# Lines starting with '#' and empty lines are ignored.
|
||||
# For detailed description of every option, visit
|
||||
# https://code.google.com/p/mongoose/wiki/MongooseManual
|
||||
|
||||
root $root
|
||||
ports $port
|
||||
index_files gitweb.cgi
|
||||
#ssl_cert $fqgitdir/gitweb/ssl_cert.pem
|
||||
error_log $fqgitdir/gitweb/$httpd_only/error.log
|
||||
access_log $fqgitdir/gitweb/$httpd_only/access.log
|
||||
|
||||
#cgi setup
|
||||
cgi_env PATH=$PATH,GIT_DIR=$GIT_DIR,GIT_EXEC_PATH=$GIT_EXEC_PATH,GITWEB_CONFIG=$GITWEB_CONFIG
|
||||
cgi_interp $PERL
|
||||
cgi_ext cgi,pl
|
||||
|
||||
# mimetype mapping
|
||||
mime_types .gz=application/x-gzip,.tar.gz=application/x-tgz,.tgz=application/x-tgz,.tar=application/x-tar,.zip=application/zip,.gif=image/gif,.jpg=image/jpeg,.jpeg=image/jpeg,.png=image/png,.css=text/css,.html=text/html,.htm=text/html,.js=text/javascript,.c=text/plain,.cpp=text/plain,.log=text/plain,.conf=text/plain,.text=text/plain,.txt=text/plain,.dtd=text/xml,.bz2=application/x-bzip,.tbz=application/x-bzip-compressed-tar,.tar.bz2=application/x-bzip-compressed-tar
|
||||
EOF
|
||||
}
|
||||
|
||||
plackup_conf () {
|
||||
# generate a standalone 'plackup' server script in $fqgitdir/gitweb
|
||||
# with embedded configuration; it does not use "$conf" file
|
||||
cat > "$fqgitdir/gitweb/gitweb.psgi" <<EOF
|
||||
#!$PERL
|
||||
|
||||
# gitweb - simple web interface to track changes in git repositories
|
||||
# PSGI wrapper and server starter (see https://plackperl.org)
|
||||
|
||||
use strict;
|
||||
|
||||
use IO::Handle;
|
||||
use Plack::MIME;
|
||||
use Plack::Builder;
|
||||
use Plack::App::WrapCGI;
|
||||
use CGI::Emulate::PSGI 0.07; # minimum version required to work with gitweb
|
||||
|
||||
# mimetype mapping (from lighttpd_conf)
|
||||
Plack::MIME->add_type(
|
||||
".pdf" => "application/pdf",
|
||||
".sig" => "application/pgp-signature",
|
||||
".spl" => "application/futuresplash",
|
||||
".class" => "application/octet-stream",
|
||||
".ps" => "application/postscript",
|
||||
".torrent" => "application/x-bittorrent",
|
||||
".dvi" => "application/x-dvi",
|
||||
".gz" => "application/x-gzip",
|
||||
".pac" => "application/x-ns-proxy-autoconfig",
|
||||
".swf" => "application/x-shockwave-flash",
|
||||
".tar.gz" => "application/x-tgz",
|
||||
".tgz" => "application/x-tgz",
|
||||
".tar" => "application/x-tar",
|
||||
".zip" => "application/zip",
|
||||
".mp3" => "audio/mpeg",
|
||||
".m3u" => "audio/x-mpegurl",
|
||||
".wma" => "audio/x-ms-wma",
|
||||
".wax" => "audio/x-ms-wax",
|
||||
".ogg" => "application/ogg",
|
||||
".wav" => "audio/x-wav",
|
||||
".gif" => "image/gif",
|
||||
".jpg" => "image/jpeg",
|
||||
".jpeg" => "image/jpeg",
|
||||
".png" => "image/png",
|
||||
".xbm" => "image/x-xbitmap",
|
||||
".xpm" => "image/x-xpixmap",
|
||||
".xwd" => "image/x-xwindowdump",
|
||||
".css" => "text/css",
|
||||
".html" => "text/html",
|
||||
".htm" => "text/html",
|
||||
".js" => "text/javascript",
|
||||
".asc" => "text/plain",
|
||||
".c" => "text/plain",
|
||||
".cpp" => "text/plain",
|
||||
".log" => "text/plain",
|
||||
".conf" => "text/plain",
|
||||
".text" => "text/plain",
|
||||
".txt" => "text/plain",
|
||||
".dtd" => "text/xml",
|
||||
".xml" => "text/xml",
|
||||
".mpeg" => "video/mpeg",
|
||||
".mpg" => "video/mpeg",
|
||||
".mov" => "video/quicktime",
|
||||
".qt" => "video/quicktime",
|
||||
".avi" => "video/x-msvideo",
|
||||
".asf" => "video/x-ms-asf",
|
||||
".asx" => "video/x-ms-asf",
|
||||
".wmv" => "video/x-ms-wmv",
|
||||
".bz2" => "application/x-bzip",
|
||||
".tbz" => "application/x-bzip-compressed-tar",
|
||||
".tar.bz2" => "application/x-bzip-compressed-tar",
|
||||
"" => "text/plain"
|
||||
);
|
||||
|
||||
my \$app = builder {
|
||||
# to be able to override \$SIG{__WARN__} to log build time warnings
|
||||
use CGI::Carp; # it sets \$SIG{__WARN__} itself
|
||||
|
||||
my \$logdir = "$fqgitdir/gitweb/$httpd_only";
|
||||
open my \$access_log_fh, '>>', "\$logdir/access.log"
|
||||
or die "Couldn't open access log '\$logdir/access.log': \$!";
|
||||
open my \$error_log_fh, '>>', "\$logdir/error.log"
|
||||
or die "Couldn't open error log '\$logdir/error.log': \$!";
|
||||
|
||||
\$access_log_fh->autoflush(1);
|
||||
\$error_log_fh->autoflush(1);
|
||||
|
||||
# redirect build time warnings to error.log
|
||||
\$SIG{'__WARN__'} = sub {
|
||||
my \$msg = shift;
|
||||
# timestamp warning like in CGI::Carp::warn
|
||||
my \$stamp = CGI::Carp::stamp();
|
||||
\$msg =~ s/^/\$stamp/gm;
|
||||
print \$error_log_fh \$msg;
|
||||
};
|
||||
|
||||
# write errors to error.log, access to access.log
|
||||
enable 'AccessLog',
|
||||
format => "combined",
|
||||
logger => sub { print \$access_log_fh @_; };
|
||||
enable sub {
|
||||
my \$app = shift;
|
||||
sub {
|
||||
my \$env = shift;
|
||||
\$env->{'psgi.errors'} = \$error_log_fh;
|
||||
\$app->(\$env);
|
||||
}
|
||||
};
|
||||
# gitweb currently doesn't work with $SIG{CHLD} set to 'IGNORE',
|
||||
# because it uses 'close $fd or die...' on piped filehandle $fh
|
||||
# (which causes the parent process to wait for child to finish).
|
||||
enable_if { \$SIG{'CHLD'} eq 'IGNORE' } sub {
|
||||
my \$app = shift;
|
||||
sub {
|
||||
my \$env = shift;
|
||||
local \$SIG{'CHLD'} = 'DEFAULT';
|
||||
local \$SIG{'CLD'} = 'DEFAULT';
|
||||
\$app->(\$env);
|
||||
}
|
||||
};
|
||||
# serve static files, i.e. stylesheet, images, script
|
||||
enable 'Static',
|
||||
path => sub { m!\.(js|css|png)\$! && s!^/gitweb/!! },
|
||||
root => "$root/",
|
||||
encoding => 'utf-8'; # encoding for 'text/plain' files
|
||||
# convert CGI application to PSGI app
|
||||
Plack::App::WrapCGI->new(script => "$root/gitweb.cgi")->to_app;
|
||||
};
|
||||
|
||||
# make it runnable as standalone app,
|
||||
# like it would be run via 'plackup' utility
|
||||
if (caller) {
|
||||
return \$app;
|
||||
} else {
|
||||
require Plack::Runner;
|
||||
|
||||
my \$runner = Plack::Runner->new();
|
||||
\$runner->parse_options(qw(--env deployment --port $port),
|
||||
"$local" ? qw(--host 127.0.0.1) : ());
|
||||
\$runner->run(\$app);
|
||||
}
|
||||
__END__
|
||||
EOF
|
||||
|
||||
chmod a+x "$fqgitdir/gitweb/gitweb.psgi"
|
||||
# configuration is embedded in server script file, gitweb.psgi
|
||||
rm -f "$conf"
|
||||
}
|
||||
|
||||
python_conf() {
|
||||
# Python's builtin http.server and its CGI support is very limited.
|
||||
# CGI handler is capable of running CGI script only from inside a directory.
|
||||
# Trying to set cgi_directories=["/"] will add double slash to SCRIPT_NAME
|
||||
# and that in turn breaks gitweb's relative link generation.
|
||||
|
||||
# create a simple web root where $fqgitdir/gitweb/$httpd_only is our root
|
||||
mkdir -p "$fqgitdir/gitweb/$httpd_only/cgi-bin"
|
||||
# Python http.server follows the symlinks
|
||||
ln -sf "$root/gitweb.cgi" "$fqgitdir/gitweb/$httpd_only/cgi-bin/gitweb.cgi"
|
||||
ln -sf "$root/static" "$fqgitdir/gitweb/$httpd_only/"
|
||||
|
||||
# generate a standalone 'python http.server' script in $fqgitdir/gitweb
|
||||
# This assumes that python is in user's $PATH
|
||||
# This script is Python 2 and 3 compatible
|
||||
cat > "$fqgitdir/gitweb/gitweb.py" <<EOF
|
||||
#!/usr/bin/env python
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Open log file in line buffering mode
|
||||
accesslogfile = open("$fqgitdir/gitweb/access.log", 'a', buffering=1)
|
||||
errorlogfile = open("$fqgitdir/gitweb/error.log", 'a', buffering=1)
|
||||
|
||||
# and replace our stdout and stderr with log files
|
||||
# also do a lowlevel duplicate of the logfile file descriptors so that
|
||||
# our CGI child process writes any stderr warning also to the log file
|
||||
_orig_stdout_fd = sys.stdout.fileno()
|
||||
sys.stdout.close()
|
||||
os.dup2(accesslogfile.fileno(), _orig_stdout_fd)
|
||||
sys.stdout = accesslogfile
|
||||
|
||||
_orig_stderr_fd = sys.stderr.fileno()
|
||||
sys.stderr.close()
|
||||
os.dup2(errorlogfile.fileno(), _orig_stderr_fd)
|
||||
sys.stderr = errorlogfile
|
||||
|
||||
from functools import partial
|
||||
|
||||
if sys.version_info < (3, 0): # Python 2
|
||||
from CGIHTTPServer import CGIHTTPRequestHandler
|
||||
from BaseHTTPServer import HTTPServer as ServerClass
|
||||
else: # Python 3
|
||||
from http.server import CGIHTTPRequestHandler
|
||||
from http.server import HTTPServer as ServerClass
|
||||
|
||||
|
||||
# Those environment variables will be passed to the cgi script
|
||||
os.environ.update({
|
||||
"GIT_EXEC_PATH": "$GIT_EXEC_PATH",
|
||||
"GIT_DIR": "$GIT_DIR",
|
||||
"GITWEB_CONFIG": "$GITWEB_CONFIG"
|
||||
})
|
||||
|
||||
|
||||
class GitWebRequestHandler(CGIHTTPRequestHandler):
|
||||
|
||||
def log_message(self, format, *args):
|
||||
# Write access logs to stdout
|
||||
sys.stdout.write("%s - - [%s] %s\n" %
|
||||
(self.address_string(),
|
||||
self.log_date_time_string(),
|
||||
format%args))
|
||||
|
||||
def do_HEAD(self):
|
||||
self.redirect_path()
|
||||
CGIHTTPRequestHandler.do_HEAD(self)
|
||||
|
||||
def do_GET(self):
|
||||
if self.path == "/":
|
||||
self.send_response(303, "See Other")
|
||||
self.send_header("Location", "/cgi-bin/gitweb.cgi")
|
||||
self.end_headers()
|
||||
return
|
||||
self.redirect_path()
|
||||
CGIHTTPRequestHandler.do_GET(self)
|
||||
|
||||
def do_POST(self):
|
||||
self.redirect_path()
|
||||
CGIHTTPRequestHandler.do_POST(self)
|
||||
|
||||
# rewrite path of every request that is not gitweb.cgi to out of cgi-bin
|
||||
def redirect_path(self):
|
||||
if not self.path.startswith("/cgi-bin/gitweb.cgi"):
|
||||
self.path = self.path.replace("/cgi-bin/", "/")
|
||||
|
||||
# gitweb.cgi is the only thing that is ever going to be run here.
|
||||
# Ignore everything else
|
||||
def is_cgi(self):
|
||||
result = False
|
||||
if self.path.startswith('/cgi-bin/gitweb.cgi'):
|
||||
result = CGIHTTPRequestHandler.is_cgi(self)
|
||||
return result
|
||||
|
||||
|
||||
bind = "127.0.0.1"
|
||||
if "$local" == "true":
|
||||
bind = "0.0.0.0"
|
||||
|
||||
# Set our http root directory
|
||||
# This is a work around for a missing directory argument in older Python versions
|
||||
# as this was added to SimpleHTTPRequestHandler in Python 3.7
|
||||
os.chdir("$fqgitdir/gitweb/$httpd_only/")
|
||||
|
||||
GitWebRequestHandler.protocol_version = "HTTP/1.0"
|
||||
httpd = ServerClass((bind, $port), GitWebRequestHandler)
|
||||
|
||||
sa = httpd.socket.getsockname()
|
||||
print("Serving HTTP on", sa[0], "port", sa[1], "...")
|
||||
httpd.serve_forever()
|
||||
EOF
|
||||
|
||||
chmod a+x "$fqgitdir/gitweb/gitweb.py"
|
||||
}
|
||||
|
||||
gitweb_conf() {
|
||||
cat > "$fqgitdir/gitweb/gitweb_config.perl" <<EOF
|
||||
#!/usr/bin/perl
|
||||
our \$projectroot = "$(dirname "$fqgitdir")";
|
||||
our \$git_temp = "$fqgitdir/gitweb/tmp";
|
||||
our \$projects_list = \$projectroot;
|
||||
|
||||
\$feature{'remote_heads'}{'default'} = [1];
|
||||
EOF
|
||||
}
|
||||
|
||||
configure_httpd() {
|
||||
case "$httpd" in
|
||||
*lighttpd*)
|
||||
lighttpd_conf
|
||||
;;
|
||||
*apache2*|*httpd*)
|
||||
apache2_conf
|
||||
;;
|
||||
webrick)
|
||||
webrick_conf
|
||||
;;
|
||||
*mongoose*)
|
||||
mongoose_conf
|
||||
;;
|
||||
*plackup*)
|
||||
plackup_conf
|
||||
;;
|
||||
*python*)
|
||||
python_conf
|
||||
;;
|
||||
*)
|
||||
echo "Unknown httpd specified: $httpd"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
case "$action" in
|
||||
stop)
|
||||
stop_httpd
|
||||
exit 0
|
||||
;;
|
||||
start)
|
||||
start_httpd
|
||||
exit 0
|
||||
;;
|
||||
restart)
|
||||
stop_httpd
|
||||
start_httpd
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
gitweb_conf
|
||||
|
||||
resolve_full_httpd
|
||||
mkdir -p "$fqgitdir/gitweb/$httpd_only"
|
||||
conf="$fqgitdir/gitweb/$httpd_only.conf"
|
||||
|
||||
configure_httpd
|
||||
|
||||
start_httpd
|
||||
url=http://127.0.0.1:$port
|
||||
|
||||
if test -n "$browser"; then
|
||||
httpd_is_ready && git web--browse -b "$browser" $url || echo $url
|
||||
else
|
||||
httpd_is_ready && git web--browse -c "instaweb.browser" $url || echo $url
|
||||
fi
|
||||
112
bin/git/mingw64/libexec/git-core/git-merge-octopus
Normal file
112
bin/git/mingw64/libexec/git-core/git-merge-octopus
Normal file
@@ -0,0 +1,112 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2005 Junio C Hamano
|
||||
#
|
||||
# Resolve two or more trees.
|
||||
#
|
||||
|
||||
. git-sh-setup
|
||||
|
||||
LF='
|
||||
'
|
||||
|
||||
# The first parameters up to -- are merge bases; the rest are heads.
|
||||
bases= head= remotes= sep_seen=
|
||||
for arg
|
||||
do
|
||||
case ",$sep_seen,$head,$arg," in
|
||||
*,--,)
|
||||
sep_seen=yes
|
||||
;;
|
||||
,yes,,*)
|
||||
head=$arg
|
||||
;;
|
||||
,yes,*)
|
||||
remotes="$remotes$arg "
|
||||
;;
|
||||
*)
|
||||
bases="$bases$arg "
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Reject if this is not an octopus -- resolve should be used instead.
|
||||
case "$remotes" in
|
||||
?*' '?*)
|
||||
;;
|
||||
*)
|
||||
exit 2 ;;
|
||||
esac
|
||||
|
||||
# MRC is the current "merge reference commit"
|
||||
# MRT is the current "merge result tree"
|
||||
|
||||
if ! git diff-index --quiet --cached HEAD --
|
||||
then
|
||||
gettextln "Error: Your local changes to the following files would be overwritten by merge"
|
||||
git diff-index --cached --name-only HEAD -- | sed -e 's/^/ /'
|
||||
exit 2
|
||||
fi
|
||||
MRC=$(git rev-parse --verify -q $head)
|
||||
MRT=$(git write-tree)
|
||||
NON_FF_MERGE=0
|
||||
OCTOPUS_FAILURE=0
|
||||
for SHA1 in $remotes
|
||||
do
|
||||
case "$OCTOPUS_FAILURE" in
|
||||
1)
|
||||
# We allow only last one to have a hand-resolvable
|
||||
# conflicts. Last round failed and we still had
|
||||
# a head to merge.
|
||||
gettextln "Automated merge did not work."
|
||||
gettextln "Should not be doing an octopus."
|
||||
exit 2
|
||||
esac
|
||||
|
||||
eval pretty_name=\${GITHEAD_$SHA1:-$SHA1}
|
||||
if test "$SHA1" = "$pretty_name"
|
||||
then
|
||||
SHA1_UP="$(echo "$SHA1" | tr a-z A-Z)"
|
||||
eval pretty_name=\${GITHEAD_$SHA1_UP:-$pretty_name}
|
||||
fi
|
||||
common=$(git merge-base --all $SHA1 $MRC) ||
|
||||
die "$(eval_gettext "Unable to find common commit with \$pretty_name")"
|
||||
|
||||
case "$LF$common$LF" in
|
||||
*"$LF$SHA1$LF"*)
|
||||
eval_gettextln "Already up to date with \$pretty_name"
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
|
||||
if test "$common,$NON_FF_MERGE" = "$MRC,0"
|
||||
then
|
||||
# The first head being merged was a fast-forward.
|
||||
# Advance MRC to the head being merged, and use that
|
||||
# tree as the intermediate result of the merge.
|
||||
# We still need to count this as part of the parent set.
|
||||
|
||||
eval_gettextln "Fast-forwarding to: \$pretty_name"
|
||||
git read-tree -u -m $head $SHA1 || exit
|
||||
MRC=$SHA1 MRT=$(git write-tree)
|
||||
continue
|
||||
fi
|
||||
|
||||
NON_FF_MERGE=1
|
||||
|
||||
eval_gettextln "Trying simple merge with \$pretty_name"
|
||||
git read-tree -u -m --aggressive $common $MRT $SHA1 || exit 2
|
||||
next=$(git write-tree 2>/dev/null)
|
||||
if test $? -ne 0
|
||||
then
|
||||
gettextln "Simple merge did not work, trying automatic merge."
|
||||
git merge-index -o git-merge-one-file -a ||
|
||||
OCTOPUS_FAILURE=1
|
||||
next=$(git write-tree 2>/dev/null)
|
||||
fi
|
||||
|
||||
MRC="$MRC $SHA1"
|
||||
MRT=$next
|
||||
done
|
||||
|
||||
exit "$OCTOPUS_FAILURE"
|
||||
167
bin/git/mingw64/libexec/git-core/git-merge-one-file
Normal file
167
bin/git/mingw64/libexec/git-core/git-merge-one-file
Normal file
@@ -0,0 +1,167 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) Linus Torvalds, 2005
|
||||
#
|
||||
# This is the git per-file merge script, called with
|
||||
#
|
||||
# $1 - original file SHA1 (or empty)
|
||||
# $2 - file in branch1 SHA1 (or empty)
|
||||
# $3 - file in branch2 SHA1 (or empty)
|
||||
# $4 - pathname in repository
|
||||
# $5 - original file mode (or empty)
|
||||
# $6 - file in branch1 mode (or empty)
|
||||
# $7 - file in branch2 mode (or empty)
|
||||
#
|
||||
# Handle some trivial cases.. The _really_ trivial cases have
|
||||
# been handled already by git read-tree, but that one doesn't
|
||||
# do any merges that might change the tree layout.
|
||||
|
||||
USAGE='<orig blob> <our blob> <their blob> <path>'
|
||||
USAGE="$USAGE <orig mode> <our mode> <their mode>"
|
||||
LONG_USAGE="usage: git merge-one-file $USAGE
|
||||
|
||||
Blob ids and modes should be empty for missing files."
|
||||
|
||||
SUBDIRECTORY_OK=Yes
|
||||
. git-sh-setup
|
||||
cd_to_toplevel
|
||||
require_work_tree
|
||||
|
||||
if test $# != 7
|
||||
then
|
||||
echo "$LONG_USAGE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
case "${1:-.}${2:-.}${3:-.}" in
|
||||
#
|
||||
# Deleted in both or deleted in one and unchanged in the other
|
||||
#
|
||||
"$1.." | "$1.$1" | "$1$1.")
|
||||
if { test -z "$6" && test "$5" != "$7"; } ||
|
||||
{ test -z "$7" && test "$5" != "$6"; }
|
||||
then
|
||||
echo "ERROR: File $4 deleted on one branch but had its" >&2
|
||||
echo "ERROR: permissions changed on the other." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -n "$2"
|
||||
then
|
||||
echo "Removing $4"
|
||||
else
|
||||
# read-tree checked that index matches HEAD already,
|
||||
# so we know we do not have this path tracked.
|
||||
# there may be an unrelated working tree file here,
|
||||
# which we should just leave unmolested. Make sure
|
||||
# we do not have it in the index, though.
|
||||
exec git update-index --remove -- "$4"
|
||||
fi
|
||||
if test -f "$4"
|
||||
then
|
||||
rm -f -- "$4" &&
|
||||
rmdir -p "$(expr "z$4" : 'z\(.*\)/')" 2>/dev/null || :
|
||||
fi &&
|
||||
exec git update-index --remove -- "$4"
|
||||
;;
|
||||
|
||||
#
|
||||
# Added in one.
|
||||
#
|
||||
".$2.")
|
||||
# the other side did not add and we added so there is nothing
|
||||
# to be done, except making the path merged.
|
||||
exec git update-index --add --cacheinfo "$6" "$2" "$4"
|
||||
;;
|
||||
"..$3")
|
||||
echo "Adding $4"
|
||||
if test -f "$4"
|
||||
then
|
||||
echo "ERROR: untracked $4 is overwritten by the merge." >&2
|
||||
exit 1
|
||||
fi
|
||||
git update-index --add --cacheinfo "$7" "$3" "$4" &&
|
||||
exec git checkout-index -u -f -- "$4"
|
||||
;;
|
||||
|
||||
#
|
||||
# Added in both, identically (check for same permissions).
|
||||
#
|
||||
".$3$2")
|
||||
if test "$6" != "$7"
|
||||
then
|
||||
echo "ERROR: File $4 added identically in both branches," >&2
|
||||
echo "ERROR: but permissions conflict $6->$7." >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "Adding $4"
|
||||
git update-index --add --cacheinfo "$6" "$2" "$4" &&
|
||||
exec git checkout-index -u -f -- "$4"
|
||||
;;
|
||||
|
||||
#
|
||||
# Modified in both, but differently.
|
||||
#
|
||||
"$1$2$3" | ".$2$3")
|
||||
|
||||
case ",$6,$7," in
|
||||
*,120000,*)
|
||||
echo "ERROR: $4: Not merging symbolic link changes." >&2
|
||||
exit 1
|
||||
;;
|
||||
*,160000,*)
|
||||
echo "ERROR: $4: Not merging conflicting submodule changes." >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
src1=$(git unpack-file $2)
|
||||
src2=$(git unpack-file $3)
|
||||
case "$1" in
|
||||
'')
|
||||
echo "Added $4 in both, but differently."
|
||||
orig=$(git unpack-file $(git hash-object /dev/null))
|
||||
;;
|
||||
*)
|
||||
echo "Auto-merging $4"
|
||||
orig=$(git unpack-file $1)
|
||||
;;
|
||||
esac
|
||||
|
||||
git merge-file "$src1" "$orig" "$src2"
|
||||
ret=$?
|
||||
msg=
|
||||
if test $ret != 0 || test -z "$1"
|
||||
then
|
||||
msg='content conflict'
|
||||
ret=1
|
||||
fi
|
||||
|
||||
# Create the working tree file, using "our tree" version from the
|
||||
# index, and then store the result of the merge.
|
||||
git checkout-index -f --stage=2 -- "$4" && cat "$src1" >"$4" || exit 1
|
||||
rm -f -- "$orig" "$src1" "$src2"
|
||||
|
||||
if test "$6" != "$7"
|
||||
then
|
||||
if test -n "$msg"
|
||||
then
|
||||
msg="$msg, "
|
||||
fi
|
||||
msg="${msg}permissions conflict: $5->$6,$7"
|
||||
ret=1
|
||||
fi
|
||||
|
||||
if test $ret != 0
|
||||
then
|
||||
echo "ERROR: $msg in $4" >&2
|
||||
exit 1
|
||||
fi
|
||||
exec git update-index -- "$4"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "ERROR: $4: Not handling case $1 -> $2 -> $3" >&2
|
||||
;;
|
||||
esac
|
||||
exit 1
|
||||
64
bin/git/mingw64/libexec/git-core/git-merge-resolve
Normal file
64
bin/git/mingw64/libexec/git-core/git-merge-resolve
Normal file
@@ -0,0 +1,64 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2005 Linus Torvalds
|
||||
# Copyright (c) 2005 Junio C Hamano
|
||||
#
|
||||
# Resolve two trees, using enhanced multi-base read-tree.
|
||||
|
||||
. git-sh-setup
|
||||
|
||||
# Abort if index does not match HEAD
|
||||
if ! git diff-index --quiet --cached HEAD --
|
||||
then
|
||||
gettextln "Error: Your local changes to the following files would be overwritten by merge"
|
||||
git diff-index --cached --name-only HEAD -- | sed -e 's/^/ /'
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# The first parameters up to -- are merge bases; the rest are heads.
|
||||
bases= head= remotes= sep_seen=
|
||||
for arg
|
||||
do
|
||||
case ",$sep_seen,$head,$arg," in
|
||||
*,--,)
|
||||
sep_seen=yes
|
||||
;;
|
||||
,yes,,*)
|
||||
head=$arg
|
||||
;;
|
||||
,yes,*)
|
||||
remotes="$remotes$arg "
|
||||
;;
|
||||
*)
|
||||
bases="$bases$arg "
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Give up if we are given two or more remotes -- not handling octopus.
|
||||
case "$remotes" in
|
||||
?*' '?*)
|
||||
exit 2 ;;
|
||||
esac
|
||||
|
||||
# Give up if this is a baseless merge.
|
||||
if test '' = "$bases"
|
||||
then
|
||||
exit 2
|
||||
fi
|
||||
|
||||
git update-index -q --refresh
|
||||
git read-tree -u -m --aggressive $bases $head $remotes || exit 2
|
||||
echo "Trying simple merge."
|
||||
if result_tree=$(git write-tree 2>/dev/null)
|
||||
then
|
||||
exit 0
|
||||
else
|
||||
echo "Simple merge failed, trying Automatic merge."
|
||||
if git merge-index -o git-merge-one-file -a
|
||||
then
|
||||
exit 0
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
579
bin/git/mingw64/libexec/git-core/git-mergetool
Normal file
579
bin/git/mingw64/libexec/git-core/git-mergetool
Normal file
@@ -0,0 +1,579 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# This program resolves merge conflicts in git
|
||||
#
|
||||
# Copyright (c) 2006 Theodore Y. Ts'o
|
||||
# Copyright (c) 2009-2016 David Aguilar
|
||||
#
|
||||
# This file is licensed under the GPL v2, or a later version
|
||||
# at the discretion of Junio C Hamano.
|
||||
#
|
||||
|
||||
USAGE='[--tool=tool] [--tool-help] [-y|--no-prompt|--prompt] [-g|--gui|--no-gui] [-O<orderfile>] [file to merge] ...'
|
||||
SUBDIRECTORY_OK=Yes
|
||||
NONGIT_OK=Yes
|
||||
OPTIONS_SPEC=
|
||||
TOOL_MODE=merge
|
||||
. git-sh-setup
|
||||
. git-mergetool--lib
|
||||
|
||||
# Returns true if the mode reflects a symlink
|
||||
is_symlink () {
|
||||
test "$1" = 120000
|
||||
}
|
||||
|
||||
is_submodule () {
|
||||
test "$1" = 160000
|
||||
}
|
||||
|
||||
local_present () {
|
||||
test -n "$local_mode"
|
||||
}
|
||||
|
||||
remote_present () {
|
||||
test -n "$remote_mode"
|
||||
}
|
||||
|
||||
base_present () {
|
||||
test -n "$base_mode"
|
||||
}
|
||||
|
||||
mergetool_tmpdir_init () {
|
||||
if test "$(git config --bool mergetool.writeToTemp)" != true
|
||||
then
|
||||
MERGETOOL_TMPDIR=.
|
||||
return 0
|
||||
fi
|
||||
if MERGETOOL_TMPDIR=$(mktemp -d -t "git-mergetool-XXXXXX" 2>/dev/null)
|
||||
then
|
||||
return 0
|
||||
fi
|
||||
die "error: mktemp is needed when 'mergetool.writeToTemp' is true"
|
||||
}
|
||||
|
||||
cleanup_temp_files () {
|
||||
if test "$1" = --save-backup
|
||||
then
|
||||
rm -rf -- "$MERGED.orig"
|
||||
test -e "$BACKUP" && mv -- "$BACKUP" "$MERGED.orig"
|
||||
rm -f -- "$LOCAL" "$REMOTE" "$BASE"
|
||||
else
|
||||
rm -f -- "$LOCAL" "$REMOTE" "$BASE" "$BACKUP"
|
||||
fi
|
||||
if test "$MERGETOOL_TMPDIR" != "."
|
||||
then
|
||||
rmdir "$MERGETOOL_TMPDIR"
|
||||
fi
|
||||
}
|
||||
|
||||
describe_file () {
|
||||
mode="$1"
|
||||
branch="$2"
|
||||
file="$3"
|
||||
|
||||
printf " {%s}: " "$branch"
|
||||
if test -z "$mode"
|
||||
then
|
||||
echo "deleted"
|
||||
elif is_symlink "$mode"
|
||||
then
|
||||
echo "a symbolic link -> '$(cat "$file")'"
|
||||
elif is_submodule "$mode"
|
||||
then
|
||||
echo "submodule commit $file"
|
||||
elif base_present
|
||||
then
|
||||
echo "modified file"
|
||||
else
|
||||
echo "created file"
|
||||
fi
|
||||
}
|
||||
|
||||
resolve_symlink_merge () {
|
||||
while true
|
||||
do
|
||||
printf "Use (l)ocal or (r)emote, or (a)bort? "
|
||||
read ans || return 1
|
||||
case "$ans" in
|
||||
[lL]*)
|
||||
git checkout-index -f --stage=2 -- "$MERGED"
|
||||
git add -- "$MERGED"
|
||||
cleanup_temp_files --save-backup
|
||||
return 0
|
||||
;;
|
||||
[rR]*)
|
||||
git checkout-index -f --stage=3 -- "$MERGED"
|
||||
git add -- "$MERGED"
|
||||
cleanup_temp_files --save-backup
|
||||
return 0
|
||||
;;
|
||||
[aA]*)
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
resolve_deleted_merge () {
|
||||
while true
|
||||
do
|
||||
if base_present
|
||||
then
|
||||
printf "Use (m)odified or (d)eleted file, or (a)bort? "
|
||||
else
|
||||
printf "Use (c)reated or (d)eleted file, or (a)bort? "
|
||||
fi
|
||||
read ans || return 1
|
||||
case "$ans" in
|
||||
[mMcC]*)
|
||||
git add -- "$MERGED"
|
||||
if test "$merge_keep_backup" = "true"
|
||||
then
|
||||
cleanup_temp_files --save-backup
|
||||
else
|
||||
cleanup_temp_files
|
||||
fi
|
||||
return 0
|
||||
;;
|
||||
[dD]*)
|
||||
git rm -- "$MERGED" > /dev/null
|
||||
cleanup_temp_files
|
||||
return 0
|
||||
;;
|
||||
[aA]*)
|
||||
if test "$merge_keep_temporaries" = "false"
|
||||
then
|
||||
cleanup_temp_files
|
||||
fi
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
resolve_submodule_merge () {
|
||||
while true
|
||||
do
|
||||
printf "Use (l)ocal or (r)emote, or (a)bort? "
|
||||
read ans || return 1
|
||||
case "$ans" in
|
||||
[lL]*)
|
||||
if ! local_present
|
||||
then
|
||||
if test -n "$(git ls-tree HEAD -- "$MERGED")"
|
||||
then
|
||||
# Local isn't present, but it's a subdirectory
|
||||
git ls-tree --full-name -r HEAD -- "$MERGED" |
|
||||
git update-index --index-info || exit $?
|
||||
else
|
||||
test -e "$MERGED" && mv -- "$MERGED" "$BACKUP"
|
||||
git update-index --force-remove "$MERGED"
|
||||
cleanup_temp_files --save-backup
|
||||
fi
|
||||
elif is_submodule "$local_mode"
|
||||
then
|
||||
stage_submodule "$MERGED" "$local_sha1"
|
||||
else
|
||||
git checkout-index -f --stage=2 -- "$MERGED"
|
||||
git add -- "$MERGED"
|
||||
fi
|
||||
return 0
|
||||
;;
|
||||
[rR]*)
|
||||
if ! remote_present
|
||||
then
|
||||
if test -n "$(git ls-tree MERGE_HEAD -- "$MERGED")"
|
||||
then
|
||||
# Remote isn't present, but it's a subdirectory
|
||||
git ls-tree --full-name -r MERGE_HEAD -- "$MERGED" |
|
||||
git update-index --index-info || exit $?
|
||||
else
|
||||
test -e "$MERGED" && mv -- "$MERGED" "$BACKUP"
|
||||
git update-index --force-remove "$MERGED"
|
||||
fi
|
||||
elif is_submodule "$remote_mode"
|
||||
then
|
||||
! is_submodule "$local_mode" &&
|
||||
test -e "$MERGED" &&
|
||||
mv -- "$MERGED" "$BACKUP"
|
||||
stage_submodule "$MERGED" "$remote_sha1"
|
||||
else
|
||||
test -e "$MERGED" && mv -- "$MERGED" "$BACKUP"
|
||||
git checkout-index -f --stage=3 -- "$MERGED"
|
||||
git add -- "$MERGED"
|
||||
fi
|
||||
cleanup_temp_files --save-backup
|
||||
return 0
|
||||
;;
|
||||
[aA]*)
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
stage_submodule () {
|
||||
path="$1"
|
||||
submodule_sha1="$2"
|
||||
mkdir -p "$path" ||
|
||||
die "fatal: unable to create directory for module at $path"
|
||||
# Find $path relative to work tree
|
||||
work_tree_root=$(cd_to_toplevel && pwd)
|
||||
work_rel_path=$(cd "$path" &&
|
||||
GIT_WORK_TREE="${work_tree_root}" git rev-parse --show-prefix
|
||||
)
|
||||
test -n "$work_rel_path" ||
|
||||
die "fatal: unable to get path of module $path relative to work tree"
|
||||
git update-index --add --replace --cacheinfo 160000 "$submodule_sha1" "${work_rel_path%/}" || die
|
||||
}
|
||||
|
||||
checkout_staged_file () {
|
||||
tmpfile="$(git checkout-index --temp --stage="$1" "$2" 2>/dev/null)" &&
|
||||
tmpfile=${tmpfile%%' '*}
|
||||
|
||||
if test $? -eq 0 && test -n "$tmpfile"
|
||||
then
|
||||
mv -- "$(git rev-parse --show-cdup)$tmpfile" "$3"
|
||||
else
|
||||
>"$3"
|
||||
fi
|
||||
}
|
||||
|
||||
hide_resolved () {
|
||||
git merge-file --ours -q -p "$LOCAL" "$BASE" "$REMOTE" >"$LCONFL"
|
||||
git merge-file --theirs -q -p "$LOCAL" "$BASE" "$REMOTE" >"$RCONFL"
|
||||
mv -- "$LCONFL" "$LOCAL"
|
||||
mv -- "$RCONFL" "$REMOTE"
|
||||
}
|
||||
|
||||
merge_file () {
|
||||
MERGED="$1"
|
||||
|
||||
f=$(git ls-files -u -- "$MERGED")
|
||||
if test -z "$f"
|
||||
then
|
||||
if test ! -f "$MERGED"
|
||||
then
|
||||
echo "$MERGED: file not found"
|
||||
else
|
||||
echo "$MERGED: file does not need merging"
|
||||
fi
|
||||
return 1
|
||||
fi
|
||||
|
||||
# extract file extension from the last path component
|
||||
case "${MERGED##*/}" in
|
||||
*.*)
|
||||
ext=.${MERGED##*.}
|
||||
BASE=${MERGED%"$ext"}
|
||||
;;
|
||||
*)
|
||||
BASE=$MERGED
|
||||
ext=
|
||||
esac
|
||||
|
||||
initialize_merge_tool "$merge_tool" || return
|
||||
|
||||
mergetool_tmpdir_init
|
||||
|
||||
if test "$MERGETOOL_TMPDIR" != "."
|
||||
then
|
||||
# If we're using a temporary directory then write to the
|
||||
# top-level of that directory.
|
||||
BASE=${BASE##*/}
|
||||
fi
|
||||
|
||||
BACKUP="$MERGETOOL_TMPDIR/${BASE}_BACKUP_$$$ext"
|
||||
LOCAL="$MERGETOOL_TMPDIR/${BASE}_LOCAL_$$$ext"
|
||||
LCONFL="$MERGETOOL_TMPDIR/${BASE}_LOCAL_LCONFL_$$$ext"
|
||||
REMOTE="$MERGETOOL_TMPDIR/${BASE}_REMOTE_$$$ext"
|
||||
RCONFL="$MERGETOOL_TMPDIR/${BASE}_REMOTE_RCONFL_$$$ext"
|
||||
BASE="$MERGETOOL_TMPDIR/${BASE}_BASE_$$$ext"
|
||||
|
||||
base_mode= local_mode= remote_mode=
|
||||
|
||||
# here, $IFS is just a LF
|
||||
for line in $f
|
||||
do
|
||||
mode=${line%% *} # 1st word
|
||||
sha1=${line#"$mode "}
|
||||
sha1=${sha1%% *} # 2nd word
|
||||
case "${line#$mode $sha1 }" in # remainder
|
||||
'1 '*)
|
||||
base_mode=$mode
|
||||
;;
|
||||
'2 '*)
|
||||
local_mode=$mode local_sha1=$sha1
|
||||
;;
|
||||
'3 '*)
|
||||
remote_mode=$mode remote_sha1=$sha1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if is_submodule "$local_mode" || is_submodule "$remote_mode"
|
||||
then
|
||||
echo "Submodule merge conflict for '$MERGED':"
|
||||
describe_file "$local_mode" "local" "$local_sha1"
|
||||
describe_file "$remote_mode" "remote" "$remote_sha1"
|
||||
resolve_submodule_merge
|
||||
return
|
||||
fi
|
||||
|
||||
if test -f "$MERGED"
|
||||
then
|
||||
mv -- "$MERGED" "$BACKUP"
|
||||
cp -- "$BACKUP" "$MERGED"
|
||||
fi
|
||||
# Create a parent directory to handle delete/delete conflicts
|
||||
# where the base's directory no longer exists.
|
||||
mkdir -p "$(dirname "$MERGED")"
|
||||
|
||||
checkout_staged_file 1 "$MERGED" "$BASE"
|
||||
checkout_staged_file 2 "$MERGED" "$LOCAL"
|
||||
checkout_staged_file 3 "$MERGED" "$REMOTE"
|
||||
|
||||
# hideResolved preferences hierarchy.
|
||||
global_config="mergetool.hideResolved"
|
||||
tool_config="mergetool.${merge_tool}.hideResolved"
|
||||
|
||||
if enabled=$(git config --type=bool "$tool_config")
|
||||
then
|
||||
# The user has a specific preference for a specific tool and no
|
||||
# other preferences should override that.
|
||||
: ;
|
||||
elif enabled=$(git config --type=bool "$global_config")
|
||||
then
|
||||
# The user has a general preference for all tools.
|
||||
#
|
||||
# 'true' means the user likes the feature so we should use it
|
||||
# where possible but tool authors can still override.
|
||||
#
|
||||
# 'false' means the user doesn't like the feature so we should
|
||||
# not use it anywhere.
|
||||
if test "$enabled" = true && hide_resolved_enabled
|
||||
then
|
||||
enabled=true
|
||||
else
|
||||
enabled=false
|
||||
fi
|
||||
else
|
||||
# The user does not have a preference. Default to disabled.
|
||||
enabled=false
|
||||
fi
|
||||
|
||||
if test "$enabled" = true
|
||||
then
|
||||
hide_resolved
|
||||
fi
|
||||
|
||||
if test -z "$local_mode" || test -z "$remote_mode"
|
||||
then
|
||||
echo "Deleted merge conflict for '$MERGED':"
|
||||
describe_file "$local_mode" "local" "$LOCAL"
|
||||
describe_file "$remote_mode" "remote" "$REMOTE"
|
||||
resolve_deleted_merge
|
||||
status=$?
|
||||
rmdir -p "$(dirname "$MERGED")" 2>/dev/null
|
||||
return $status
|
||||
fi
|
||||
|
||||
if is_symlink "$local_mode" || is_symlink "$remote_mode"
|
||||
then
|
||||
echo "Symbolic link merge conflict for '$MERGED':"
|
||||
describe_file "$local_mode" "local" "$LOCAL"
|
||||
describe_file "$remote_mode" "remote" "$REMOTE"
|
||||
resolve_symlink_merge
|
||||
return
|
||||
fi
|
||||
|
||||
echo "Normal merge conflict for '$MERGED':"
|
||||
describe_file "$local_mode" "local" "$LOCAL"
|
||||
describe_file "$remote_mode" "remote" "$REMOTE"
|
||||
if test "$guessed_merge_tool" = true || test "$prompt" = true
|
||||
then
|
||||
printf "Hit return to start merge resolution tool (%s): " "$merge_tool"
|
||||
read ans || return 1
|
||||
fi
|
||||
|
||||
if base_present
|
||||
then
|
||||
present=true
|
||||
else
|
||||
present=false
|
||||
fi
|
||||
|
||||
if ! run_merge_tool "$merge_tool" "$present"
|
||||
then
|
||||
echo "merge of $MERGED failed" 1>&2
|
||||
mv -- "$BACKUP" "$MERGED"
|
||||
|
||||
if test "$merge_keep_temporaries" = "false"
|
||||
then
|
||||
cleanup_temp_files
|
||||
fi
|
||||
|
||||
return 1
|
||||
fi
|
||||
|
||||
if test "$merge_keep_backup" = "true"
|
||||
then
|
||||
mv -- "$BACKUP" "$MERGED.orig"
|
||||
else
|
||||
rm -- "$BACKUP"
|
||||
fi
|
||||
|
||||
git add -- "$MERGED"
|
||||
cleanup_temp_files
|
||||
return 0
|
||||
}
|
||||
|
||||
prompt_after_failed_merge () {
|
||||
while true
|
||||
do
|
||||
printf "Continue merging other unresolved paths [y/n]? "
|
||||
read ans || return 1
|
||||
case "$ans" in
|
||||
[yY]*)
|
||||
return 0
|
||||
;;
|
||||
[nN]*)
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
print_noop_and_exit () {
|
||||
echo "No files need merging"
|
||||
exit 0
|
||||
}
|
||||
|
||||
main () {
|
||||
prompt=$(git config --bool mergetool.prompt)
|
||||
GIT_MERGETOOL_GUI=
|
||||
guessed_merge_tool=false
|
||||
orderfile=
|
||||
|
||||
while test $# != 0
|
||||
do
|
||||
case "$1" in
|
||||
--tool-help=*)
|
||||
TOOL_MODE=${1#--tool-help=}
|
||||
show_tool_help
|
||||
;;
|
||||
--tool-help)
|
||||
show_tool_help
|
||||
;;
|
||||
-t|--tool*)
|
||||
case "$#,$1" in
|
||||
*,*=*)
|
||||
merge_tool=${1#*=}
|
||||
;;
|
||||
1,*)
|
||||
usage ;;
|
||||
*)
|
||||
merge_tool="$2"
|
||||
shift ;;
|
||||
esac
|
||||
;;
|
||||
--no-gui)
|
||||
GIT_MERGETOOL_GUI=false
|
||||
;;
|
||||
-g|--gui)
|
||||
GIT_MERGETOOL_GUI=true
|
||||
;;
|
||||
-y|--no-prompt)
|
||||
prompt=false
|
||||
;;
|
||||
--prompt)
|
||||
prompt=true
|
||||
;;
|
||||
-O*)
|
||||
orderfile="${1#-O}"
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
git_dir_init
|
||||
require_work_tree
|
||||
|
||||
if test -z "$merge_tool"
|
||||
then
|
||||
merge_tool=$(get_merge_tool)
|
||||
subshell_exit_status=$?
|
||||
if test $subshell_exit_status = 1
|
||||
then
|
||||
guessed_merge_tool=true
|
||||
elif test $subshell_exit_status -gt 1
|
||||
then
|
||||
exit $subshell_exit_status
|
||||
fi
|
||||
fi
|
||||
merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)"
|
||||
merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"
|
||||
|
||||
prefix=$(git rev-parse --show-prefix) || exit 1
|
||||
cd_to_toplevel
|
||||
|
||||
if test -n "$orderfile"
|
||||
then
|
||||
orderfile=$(
|
||||
git rev-parse --prefix "$prefix" -- "$orderfile" |
|
||||
sed -e 1d
|
||||
)
|
||||
fi
|
||||
|
||||
if test $# -eq 0 && test -e "$GIT_DIR/MERGE_RR"
|
||||
then
|
||||
set -- $(git rerere remaining)
|
||||
if test $# -eq 0
|
||||
then
|
||||
print_noop_and_exit
|
||||
fi
|
||||
elif test $# -ge 0
|
||||
then
|
||||
# rev-parse provides the -- needed for 'set'
|
||||
eval "set $(git rev-parse --sq --prefix "$prefix" -- "$@")"
|
||||
fi
|
||||
|
||||
files=$(git -c core.quotePath=false \
|
||||
diff --name-only --diff-filter=U \
|
||||
${orderfile:+"-O$orderfile"} -- "$@")
|
||||
|
||||
if test -z "$files"
|
||||
then
|
||||
print_noop_and_exit
|
||||
fi
|
||||
|
||||
printf "Merging:\n"
|
||||
printf "%s\n" "$files"
|
||||
|
||||
rc=0
|
||||
set -- $files
|
||||
while test $# -ne 0
|
||||
do
|
||||
printf "\n"
|
||||
if ! merge_file "$1"
|
||||
then
|
||||
rc=1
|
||||
test $# -ne 1 && prompt_after_failed_merge || exit 1
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
exit $rc
|
||||
}
|
||||
|
||||
main "$@"
|
||||
543
bin/git/mingw64/libexec/git-core/git-mergetool--lib
Normal file
543
bin/git/mingw64/libexec/git-core/git-mergetool--lib
Normal file
@@ -0,0 +1,543 @@
|
||||
# git-mergetool--lib is a shell library for common merge tool functions
|
||||
|
||||
: ${MERGE_TOOLS_DIR=$(git --exec-path)/mergetools}
|
||||
|
||||
IFS='
|
||||
'
|
||||
|
||||
mode_ok () {
|
||||
if diff_mode
|
||||
then
|
||||
can_diff
|
||||
elif merge_mode
|
||||
then
|
||||
can_merge
|
||||
else
|
||||
false
|
||||
fi
|
||||
}
|
||||
|
||||
is_available () {
|
||||
merge_tool_path=$(translate_merge_tool_path "$1") &&
|
||||
type "$merge_tool_path" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
list_config_tools () {
|
||||
section=$1
|
||||
line_prefix=${2:-}
|
||||
|
||||
git config --get-regexp $section'\..*\.cmd' |
|
||||
while read -r key value
|
||||
do
|
||||
toolname=${key#$section.}
|
||||
toolname=${toolname%.cmd}
|
||||
|
||||
printf "%s%s\n" "$line_prefix" "$toolname"
|
||||
done
|
||||
}
|
||||
|
||||
show_tool_names () {
|
||||
condition=${1:-true} per_line_prefix=${2:-} preamble=${3:-}
|
||||
not_found_msg=${4:-}
|
||||
extra_content=${5:-}
|
||||
|
||||
shown_any=
|
||||
( cd "$MERGE_TOOLS_DIR" && ls ) | {
|
||||
while read scriptname
|
||||
do
|
||||
setup_tool "$scriptname" 2>/dev/null
|
||||
# We need an actual line feed here
|
||||
variants="$variants
|
||||
$(list_tool_variants)"
|
||||
done
|
||||
variants="$(echo "$variants" | sort -u)"
|
||||
|
||||
for toolname in $variants
|
||||
do
|
||||
if setup_tool "$toolname" 2>/dev/null &&
|
||||
(eval "$condition" "$toolname")
|
||||
then
|
||||
if test -n "$preamble"
|
||||
then
|
||||
printf "%s\n" "$preamble"
|
||||
preamble=
|
||||
fi
|
||||
shown_any=yes
|
||||
printf "%s%-15s %s\n" "$per_line_prefix" "$toolname" $(diff_mode && diff_cmd_help "$toolname" || merge_cmd_help "$toolname")
|
||||
fi
|
||||
done
|
||||
|
||||
if test -n "$extra_content"
|
||||
then
|
||||
if test -n "$preamble"
|
||||
then
|
||||
# Note: no '\n' here since we don't want a
|
||||
# blank line if there is no initial content.
|
||||
printf "%s" "$preamble"
|
||||
preamble=
|
||||
fi
|
||||
shown_any=yes
|
||||
printf "\n%s\n" "$extra_content"
|
||||
fi
|
||||
|
||||
if test -n "$preamble" && test -n "$not_found_msg"
|
||||
then
|
||||
printf "%s\n" "$not_found_msg"
|
||||
fi
|
||||
|
||||
test -n "$shown_any"
|
||||
}
|
||||
}
|
||||
|
||||
diff_mode () {
|
||||
test "$TOOL_MODE" = diff
|
||||
}
|
||||
|
||||
merge_mode () {
|
||||
test "$TOOL_MODE" = merge
|
||||
}
|
||||
|
||||
get_gui_default () {
|
||||
if diff_mode
|
||||
then
|
||||
GUI_DEFAULT_KEY="difftool.guiDefault"
|
||||
else
|
||||
GUI_DEFAULT_KEY="mergetool.guiDefault"
|
||||
fi
|
||||
GUI_DEFAULT_CONFIG_LCASE=$(git config --default false --get "$GUI_DEFAULT_KEY" | tr 'A-Z' 'a-z')
|
||||
if test "$GUI_DEFAULT_CONFIG_LCASE" = "auto"
|
||||
then
|
||||
if test -n "$DISPLAY"
|
||||
then
|
||||
GUI_DEFAULT=true
|
||||
else
|
||||
GUI_DEFAULT=false
|
||||
fi
|
||||
else
|
||||
GUI_DEFAULT=$(git config --default false --bool --get "$GUI_DEFAULT_KEY")
|
||||
subshell_exit_status=$?
|
||||
if test $subshell_exit_status -ne 0
|
||||
then
|
||||
exit $subshell_exit_status
|
||||
fi
|
||||
fi
|
||||
echo $GUI_DEFAULT
|
||||
}
|
||||
|
||||
gui_mode () {
|
||||
if test -z "$GIT_MERGETOOL_GUI"
|
||||
then
|
||||
GIT_MERGETOOL_GUI=$(get_gui_default)
|
||||
if test $? -ne 0
|
||||
then
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
test "$GIT_MERGETOOL_GUI" = true
|
||||
}
|
||||
|
||||
translate_merge_tool_path () {
|
||||
echo "$1"
|
||||
}
|
||||
|
||||
check_unchanged () {
|
||||
if test "$MERGED" -nt "$BACKUP"
|
||||
then
|
||||
return 0
|
||||
else
|
||||
while true
|
||||
do
|
||||
echo "$MERGED seems unchanged."
|
||||
printf "Was the merge successful [y/n]? "
|
||||
read answer || return 1
|
||||
case "$answer" in
|
||||
y*|Y*) return 0 ;;
|
||||
n*|N*) return 1 ;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
valid_tool () {
|
||||
setup_tool "$1" && return 0
|
||||
cmd=$(get_merge_tool_cmd "$1")
|
||||
test -n "$cmd"
|
||||
}
|
||||
|
||||
setup_user_tool () {
|
||||
merge_tool_cmd=$(get_merge_tool_cmd "$tool")
|
||||
test -n "$merge_tool_cmd" || return 1
|
||||
|
||||
diff_cmd () {
|
||||
( eval $merge_tool_cmd )
|
||||
}
|
||||
|
||||
merge_cmd () {
|
||||
( eval $merge_tool_cmd )
|
||||
}
|
||||
|
||||
list_tool_variants () {
|
||||
echo "$tool"
|
||||
}
|
||||
}
|
||||
|
||||
setup_tool () {
|
||||
tool="$1"
|
||||
|
||||
# Fallback definitions, to be overridden by tools.
|
||||
can_merge () {
|
||||
return 0
|
||||
}
|
||||
|
||||
can_diff () {
|
||||
return 0
|
||||
}
|
||||
|
||||
diff_cmd () {
|
||||
return 1
|
||||
}
|
||||
|
||||
diff_cmd_help () {
|
||||
return 0
|
||||
}
|
||||
|
||||
merge_cmd () {
|
||||
return 1
|
||||
}
|
||||
|
||||
merge_cmd_help () {
|
||||
return 0
|
||||
}
|
||||
|
||||
hide_resolved_enabled () {
|
||||
return 0
|
||||
}
|
||||
|
||||
translate_merge_tool_path () {
|
||||
echo "$1"
|
||||
}
|
||||
|
||||
list_tool_variants () {
|
||||
echo "$tool"
|
||||
}
|
||||
|
||||
# Most tools' exit codes cannot be trusted, so By default we ignore
|
||||
# their exit code and check the merged file's modification time in
|
||||
# check_unchanged() to determine whether or not the merge was
|
||||
# successful. The return value from run_merge_cmd, by default, is
|
||||
# determined by check_unchanged().
|
||||
#
|
||||
# When a tool's exit code can be trusted then the return value from
|
||||
# run_merge_cmd is simply the tool's exit code, and check_unchanged()
|
||||
# is not called.
|
||||
#
|
||||
# The return value of exit_code_trustable() tells us whether or not we
|
||||
# can trust the tool's exit code.
|
||||
#
|
||||
# User-defined and built-in tools default to false.
|
||||
# Built-in tools advertise that their exit code is trustable by
|
||||
# redefining exit_code_trustable() to true.
|
||||
|
||||
exit_code_trustable () {
|
||||
false
|
||||
}
|
||||
|
||||
if test -f "$MERGE_TOOLS_DIR/$tool"
|
||||
then
|
||||
. "$MERGE_TOOLS_DIR/$tool"
|
||||
elif test -f "$MERGE_TOOLS_DIR/${tool%[0-9]}"
|
||||
then
|
||||
. "$MERGE_TOOLS_DIR/${tool%[0-9]}"
|
||||
else
|
||||
setup_user_tool
|
||||
return $?
|
||||
fi
|
||||
|
||||
# Now let the user override the default command for the tool. If
|
||||
# they have not done so then this will return 1 which we ignore.
|
||||
setup_user_tool
|
||||
|
||||
if ! list_tool_variants | grep -q "^$tool$"
|
||||
then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if merge_mode && ! can_merge
|
||||
then
|
||||
echo "error: '$tool' can not be used to resolve merges" >&2
|
||||
return 1
|
||||
elif diff_mode && ! can_diff
|
||||
then
|
||||
echo "error: '$tool' can only be used to resolve merges" >&2
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
get_merge_tool_cmd () {
|
||||
merge_tool="$1"
|
||||
if diff_mode
|
||||
then
|
||||
git config "difftool.$merge_tool.cmd" ||
|
||||
git config "mergetool.$merge_tool.cmd"
|
||||
else
|
||||
git config "mergetool.$merge_tool.cmd"
|
||||
fi
|
||||
}
|
||||
|
||||
trust_exit_code () {
|
||||
if git config --bool "mergetool.$1.trustExitCode"
|
||||
then
|
||||
:; # OK
|
||||
elif exit_code_trustable
|
||||
then
|
||||
echo true
|
||||
else
|
||||
echo false
|
||||
fi
|
||||
}
|
||||
|
||||
initialize_merge_tool () {
|
||||
# Bring tool-specific functions into scope
|
||||
setup_tool "$1" || return 1
|
||||
}
|
||||
|
||||
# Entry point for running tools
|
||||
run_merge_tool () {
|
||||
# If GIT_PREFIX is empty then we cannot use it in tools
|
||||
# that expect to be able to chdir() to its value.
|
||||
GIT_PREFIX=${GIT_PREFIX:-.}
|
||||
export GIT_PREFIX
|
||||
|
||||
merge_tool_path=$(get_merge_tool_path "$1") || exit
|
||||
base_present="$2"
|
||||
|
||||
if merge_mode
|
||||
then
|
||||
run_merge_cmd "$1"
|
||||
else
|
||||
run_diff_cmd "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
# Run a either a configured or built-in diff tool
|
||||
run_diff_cmd () {
|
||||
diff_cmd "$1"
|
||||
}
|
||||
|
||||
# Run a either a configured or built-in merge tool
|
||||
run_merge_cmd () {
|
||||
mergetool_trust_exit_code=$(trust_exit_code "$1")
|
||||
if test "$mergetool_trust_exit_code" = "true"
|
||||
then
|
||||
merge_cmd "$1"
|
||||
else
|
||||
touch "$BACKUP"
|
||||
merge_cmd "$1"
|
||||
check_unchanged
|
||||
fi
|
||||
}
|
||||
|
||||
list_merge_tool_candidates () {
|
||||
if merge_mode
|
||||
then
|
||||
tools="tortoisemerge"
|
||||
else
|
||||
tools="kompare"
|
||||
fi
|
||||
if test -n "$DISPLAY"
|
||||
then
|
||||
if test -n "$GNOME_DESKTOP_SESSION_ID"
|
||||
then
|
||||
tools="meld opendiff kdiff3 tkdiff xxdiff $tools"
|
||||
else
|
||||
tools="opendiff kdiff3 tkdiff xxdiff meld $tools"
|
||||
fi
|
||||
tools="$tools gvimdiff diffuse diffmerge ecmerge"
|
||||
tools="$tools p4merge araxis bc codecompare"
|
||||
tools="$tools smerge"
|
||||
fi
|
||||
case "${VISUAL:-$EDITOR}" in
|
||||
*nvim*)
|
||||
tools="$tools nvimdiff vimdiff emerge"
|
||||
;;
|
||||
*vim*)
|
||||
tools="$tools vimdiff nvimdiff emerge"
|
||||
;;
|
||||
*)
|
||||
tools="$tools emerge vimdiff nvimdiff"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
show_tool_help () {
|
||||
tool_opt="'git ${TOOL_MODE}tool --tool=<tool>'"
|
||||
|
||||
tab=' '
|
||||
LF='
|
||||
'
|
||||
any_shown=no
|
||||
|
||||
cmd_name=${TOOL_MODE}tool
|
||||
config_tools=$({
|
||||
diff_mode && list_config_tools difftool "$tab$tab"
|
||||
list_config_tools mergetool "$tab$tab"
|
||||
} | sort)
|
||||
extra_content=
|
||||
if test -n "$config_tools"
|
||||
then
|
||||
extra_content="${tab}user-defined:${LF}$config_tools"
|
||||
fi
|
||||
|
||||
show_tool_names 'mode_ok && is_available' "$tab$tab" \
|
||||
"$tool_opt may be set to one of the following:" \
|
||||
"No suitable tool for 'git $cmd_name --tool=<tool>' found." \
|
||||
"$extra_content" &&
|
||||
any_shown=yes
|
||||
|
||||
show_tool_names 'mode_ok && ! is_available' "$tab$tab" \
|
||||
"${LF}The following tools are valid, but not currently available:" &&
|
||||
any_shown=yes
|
||||
|
||||
if test "$any_shown" = yes
|
||||
then
|
||||
echo
|
||||
echo "Some of the tools listed above only work in a windowed"
|
||||
echo "environment. If run in a terminal-only session, they will fail."
|
||||
fi
|
||||
exit 0
|
||||
}
|
||||
|
||||
guess_merge_tool () {
|
||||
list_merge_tool_candidates
|
||||
cat >&2 <<-EOF
|
||||
|
||||
This message is displayed because '$TOOL_MODE.tool' is not configured.
|
||||
See 'git ${TOOL_MODE}tool --tool-help' or 'git help config' for more details.
|
||||
'git ${TOOL_MODE}tool' will now attempt to use one of the following tools:
|
||||
$tools
|
||||
EOF
|
||||
|
||||
# Loop over each candidate and stop when a valid merge tool is found.
|
||||
IFS=' '
|
||||
for tool in $tools
|
||||
do
|
||||
is_available "$tool" && echo "$tool" && return 0
|
||||
done
|
||||
|
||||
echo >&2 "No known ${TOOL_MODE} tool is available."
|
||||
return 1
|
||||
}
|
||||
|
||||
get_configured_merge_tool () {
|
||||
keys=
|
||||
if diff_mode
|
||||
then
|
||||
if gui_mode
|
||||
then
|
||||
keys="diff.guitool merge.guitool diff.tool merge.tool"
|
||||
else
|
||||
keys="diff.tool merge.tool"
|
||||
fi
|
||||
else
|
||||
if gui_mode
|
||||
then
|
||||
keys="merge.guitool merge.tool"
|
||||
else
|
||||
keys="merge.tool"
|
||||
fi
|
||||
fi
|
||||
|
||||
merge_tool=$(
|
||||
IFS=' '
|
||||
for key in $keys
|
||||
do
|
||||
selected=$(git config $key)
|
||||
if test -n "$selected"
|
||||
then
|
||||
echo "$selected"
|
||||
return
|
||||
fi
|
||||
done)
|
||||
|
||||
if test -n "$merge_tool" && ! valid_tool "$merge_tool"
|
||||
then
|
||||
echo >&2 "git config option $TOOL_MODE.${gui_prefix}tool set to unknown tool: $merge_tool"
|
||||
echo >&2 "Resetting to default..."
|
||||
return 1
|
||||
fi
|
||||
echo "$merge_tool"
|
||||
}
|
||||
|
||||
get_merge_tool_path () {
|
||||
# A merge tool has been set, so verify that it's valid.
|
||||
merge_tool="$1"
|
||||
if ! valid_tool "$merge_tool"
|
||||
then
|
||||
echo >&2 "Unknown merge tool $merge_tool"
|
||||
exit 1
|
||||
fi
|
||||
if diff_mode
|
||||
then
|
||||
merge_tool_path=$(git config difftool."$merge_tool".path ||
|
||||
git config mergetool."$merge_tool".path)
|
||||
else
|
||||
merge_tool_path=$(git config mergetool."$merge_tool".path)
|
||||
fi
|
||||
if test -z "$merge_tool_path"
|
||||
then
|
||||
merge_tool_path=$(translate_merge_tool_path "$merge_tool")
|
||||
fi
|
||||
if test -z "$(get_merge_tool_cmd "$merge_tool")" &&
|
||||
! type "$merge_tool_path" >/dev/null 2>&1
|
||||
then
|
||||
echo >&2 "The $TOOL_MODE tool $merge_tool is not available as"\
|
||||
"'$merge_tool_path'"
|
||||
exit 1
|
||||
fi
|
||||
echo "$merge_tool_path"
|
||||
}
|
||||
|
||||
get_merge_tool () {
|
||||
is_guessed=false
|
||||
# Check if a merge tool has been configured
|
||||
merge_tool=$(get_configured_merge_tool)
|
||||
subshell_exit_status=$?
|
||||
if test $subshell_exit_status -gt "1"
|
||||
then
|
||||
exit $subshell_exit_status
|
||||
fi
|
||||
# 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
|
||||
is_guessed=true
|
||||
fi
|
||||
echo "$merge_tool"
|
||||
test "$is_guessed" = false
|
||||
}
|
||||
|
||||
mergetool_find_win32_cmd () {
|
||||
executable=$1
|
||||
sub_directory=$2
|
||||
|
||||
# Use $executable if it exists in $PATH
|
||||
if type -p "$executable" >/dev/null 2>&1
|
||||
then
|
||||
printf '%s' "$executable"
|
||||
return
|
||||
fi
|
||||
|
||||
# Look for executable in the typical locations
|
||||
for directory in $(env | grep -Ei '^PROGRAM(FILES(\(X86\))?|W6432)=' |
|
||||
cut -d '=' -f 2- | sort -u)
|
||||
do
|
||||
if test -n "$directory" && test -x "$directory/$sub_directory/$executable"
|
||||
then
|
||||
printf '%s' "$directory/$sub_directory/$executable"
|
||||
return
|
||||
fi
|
||||
done
|
||||
|
||||
printf '%s' "$executable"
|
||||
}
|
||||
4628
bin/git/mingw64/libexec/git-core/git-p4
Normal file
4628
bin/git/mingw64/libexec/git-core/git-p4
Normal file
File diff suppressed because it is too large
Load Diff
155
bin/git/mingw64/libexec/git-core/git-quiltimport
Normal file
155
bin/git/mingw64/libexec/git-core/git-quiltimport
Normal file
@@ -0,0 +1,155 @@
|
||||
#!/bin/sh
|
||||
OPTIONS_KEEPDASHDASH=
|
||||
OPTIONS_STUCKLONG=
|
||||
OPTIONS_SPEC="\
|
||||
git quiltimport [options]
|
||||
--
|
||||
n,dry-run dry run
|
||||
author= author name and email address for patches without any
|
||||
patches= path to the quilt patches
|
||||
series= path to the quilt series file
|
||||
keep-non-patch Pass -b to git mailinfo
|
||||
"
|
||||
SUBDIRECTORY_ON=Yes
|
||||
. git-sh-setup
|
||||
|
||||
dry_run=""
|
||||
quilt_author=""
|
||||
while test $# != 0
|
||||
do
|
||||
case "$1" in
|
||||
--author)
|
||||
shift
|
||||
quilt_author="$1"
|
||||
;;
|
||||
-n|--dry-run)
|
||||
dry_run=1
|
||||
;;
|
||||
--patches)
|
||||
shift
|
||||
QUILT_PATCHES="$1"
|
||||
;;
|
||||
--series)
|
||||
shift
|
||||
QUILT_SERIES="$1"
|
||||
;;
|
||||
--keep-non-patch)
|
||||
MAILINFO_OPT="-b"
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# Quilt Author
|
||||
if [ -n "$quilt_author" ] ; then
|
||||
quilt_author_name=$(expr "z$quilt_author" : 'z\(.*[^ ]\) *<.*') &&
|
||||
quilt_author_email=$(expr "z$quilt_author" : '.*<\([^>]*\)') &&
|
||||
test '' != "$quilt_author_name" &&
|
||||
test '' != "$quilt_author_email" ||
|
||||
die "malformed --author parameter"
|
||||
fi
|
||||
|
||||
# Quilt patch directory
|
||||
: ${QUILT_PATCHES:=patches}
|
||||
if ! [ -d "$QUILT_PATCHES" ] ; then
|
||||
echo "The \"$QUILT_PATCHES\" directory does not exist."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Quilt series file
|
||||
: ${QUILT_SERIES:=$QUILT_PATCHES/series}
|
||||
if ! [ -e "$QUILT_SERIES" ] ; then
|
||||
echo "The \"$QUILT_SERIES\" file does not exist."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Temporary directories
|
||||
tmp_dir="$GIT_DIR"/rebase-apply
|
||||
tmp_msg="$tmp_dir/msg"
|
||||
tmp_patch="$tmp_dir/patch"
|
||||
tmp_info="$tmp_dir/info"
|
||||
|
||||
|
||||
# Find the initial commit
|
||||
commit=$(git rev-parse HEAD)
|
||||
|
||||
mkdir $tmp_dir || exit 2
|
||||
while read patch_name level garbage <&3
|
||||
do
|
||||
case "$patch_name" in ''|'#'*) continue;; esac
|
||||
case "$level" in
|
||||
-p*) ;;
|
||||
''|'#'*)
|
||||
level=;;
|
||||
*)
|
||||
echo "unable to parse patch level, ignoring it."
|
||||
level=;;
|
||||
esac
|
||||
case "$garbage" in
|
||||
''|'#'*);;
|
||||
*)
|
||||
echo "trailing garbage found in series file: $garbage"
|
||||
exit 1;;
|
||||
esac
|
||||
if ! [ -f "$QUILT_PATCHES/$patch_name" ] ; then
|
||||
echo "$patch_name doesn't exist. Skipping."
|
||||
continue
|
||||
fi
|
||||
echo $patch_name
|
||||
git mailinfo $MAILINFO_OPT "$tmp_msg" "$tmp_patch" \
|
||||
<"$QUILT_PATCHES/$patch_name" >"$tmp_info" || exit 3
|
||||
test -s "$tmp_patch" || {
|
||||
echo "Patch is empty. Was it split wrong?"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Parse the author information
|
||||
GIT_AUTHOR_NAME=$(sed -ne 's/Author: //p' "$tmp_info")
|
||||
GIT_AUTHOR_EMAIL=$(sed -ne 's/Email: //p' "$tmp_info")
|
||||
export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL
|
||||
while test -z "$GIT_AUTHOR_EMAIL" && test -z "$GIT_AUTHOR_NAME" ; do
|
||||
if [ -n "$quilt_author" ] ; then
|
||||
GIT_AUTHOR_NAME="$quilt_author_name";
|
||||
GIT_AUTHOR_EMAIL="$quilt_author_email";
|
||||
elif [ -n "$dry_run" ]; then
|
||||
echo "No author found in $patch_name" >&2;
|
||||
GIT_AUTHOR_NAME="dry-run-not-found";
|
||||
GIT_AUTHOR_EMAIL="dry-run-not-found";
|
||||
else
|
||||
echo "No author found in $patch_name" >&2;
|
||||
echo "---"
|
||||
cat $tmp_msg
|
||||
printf "Author: ";
|
||||
read patch_author
|
||||
|
||||
echo "$patch_author"
|
||||
|
||||
patch_author_name=$(expr "z$patch_author" : 'z\(.*[^ ]\) *<.*') &&
|
||||
patch_author_email=$(expr "z$patch_author" : '.*<\([^>]*\)') &&
|
||||
test '' != "$patch_author_name" &&
|
||||
test '' != "$patch_author_email" &&
|
||||
GIT_AUTHOR_NAME="$patch_author_name" &&
|
||||
GIT_AUTHOR_EMAIL="$patch_author_email"
|
||||
fi
|
||||
done
|
||||
GIT_AUTHOR_DATE=$(sed -ne 's/Date: //p' "$tmp_info")
|
||||
SUBJECT=$(sed -ne 's/Subject: //p' "$tmp_info")
|
||||
export GIT_AUTHOR_DATE SUBJECT
|
||||
if [ -z "$SUBJECT" ] ; then
|
||||
SUBJECT=$(echo $patch_name | sed -e 's/.patch$//')
|
||||
fi
|
||||
|
||||
if [ -z "$dry_run" ] ; then
|
||||
git apply --index -C1 ${level:+"$level"} "$tmp_patch" &&
|
||||
tree=$(git write-tree) &&
|
||||
commit=$( { echo "$SUBJECT"; echo; cat "$tmp_msg"; } | git commit-tree $tree -p $commit) &&
|
||||
git update-ref -m "quiltimport: $patch_name" HEAD $commit || exit 4
|
||||
fi
|
||||
done 3<"$QUILT_SERIES"
|
||||
rm -rf $tmp_dir || exit 5
|
||||
BIN
bin/git/mingw64/libexec/git-core/git-remote-ftp.exe
Normal file
BIN
bin/git/mingw64/libexec/git-core/git-remote-ftp.exe
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/git-remote-ftps.exe
Normal file
BIN
bin/git/mingw64/libexec/git-core/git-remote-ftps.exe
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/git-remote-http.exe
Normal file
BIN
bin/git/mingw64/libexec/git-core/git-remote-http.exe
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/git-remote-https.exe
Normal file
BIN
bin/git/mingw64/libexec/git-core/git-remote-https.exe
Normal file
Binary file not shown.
172
bin/git/mingw64/libexec/git-core/git-request-pull
Normal file
172
bin/git/mingw64/libexec/git-core/git-request-pull
Normal file
@@ -0,0 +1,172 @@
|
||||
#!/bin/sh
|
||||
# Copyright 2005, Ryan Anderson <ryan@michonline.com>
|
||||
#
|
||||
# This file is licensed under the GPL v2, or a later version
|
||||
# at the discretion of Linus Torvalds.
|
||||
|
||||
SUBDIRECTORY_OK='Yes'
|
||||
OPTIONS_KEEPDASHDASH=
|
||||
OPTIONS_STUCKLONG=
|
||||
OPTIONS_SPEC='git request-pull [options] start url [end]
|
||||
--
|
||||
p show patch text as well
|
||||
'
|
||||
|
||||
. git-sh-setup
|
||||
|
||||
GIT_PAGER=
|
||||
export GIT_PAGER
|
||||
|
||||
patch=
|
||||
while case "$#" in 0) break ;; esac
|
||||
do
|
||||
case "$1" in
|
||||
-p)
|
||||
patch=-p ;;
|
||||
--)
|
||||
shift; break ;;
|
||||
-*)
|
||||
usage ;;
|
||||
*)
|
||||
break ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
base=$1 url=$2 status=0
|
||||
|
||||
test -n "$base" && test -n "$url" || usage
|
||||
|
||||
baserev=$(git rev-parse --verify --quiet "$base"^0)
|
||||
if test -z "$baserev"
|
||||
then
|
||||
die "fatal: Not a valid revision: $base"
|
||||
fi
|
||||
|
||||
#
|
||||
# $3 must be a symbolic ref, a unique ref, or
|
||||
# a SHA object expression. It can also be of
|
||||
# the format 'local-name:remote-name'.
|
||||
#
|
||||
local=${3%:*}
|
||||
local=${local:-HEAD}
|
||||
remote=${3#*:}
|
||||
pretty_remote=${remote#refs/}
|
||||
pretty_remote=${pretty_remote#heads/}
|
||||
head=$(git symbolic-ref -q "$local")
|
||||
head=${head:-$(git show-ref --heads --tags "$local" | cut -d' ' -f2)}
|
||||
head=${head:-$(git rev-parse --quiet --verify "$local")}
|
||||
|
||||
# None of the above? Bad.
|
||||
test -z "$head" && die "fatal: Not a valid revision: $local"
|
||||
|
||||
# This also verifies that the resulting head is unique:
|
||||
# "git show-ref" could have shown multiple matching refs..
|
||||
headrev=$(git rev-parse --verify --quiet "$head"^0)
|
||||
test -z "$headrev" && die "fatal: Ambiguous revision: $local"
|
||||
|
||||
local_sha1=$(git rev-parse --verify --quiet "$head")
|
||||
|
||||
# Was it a branch with a description?
|
||||
branch_name=${head#refs/heads/}
|
||||
if test "z$branch_name" = "z$headref" ||
|
||||
! git config "branch.$branch_name.description" >/dev/null
|
||||
then
|
||||
branch_name=
|
||||
fi
|
||||
|
||||
merge_base=$(git merge-base $baserev $headrev) ||
|
||||
die "fatal: No commits in common between $base and $head"
|
||||
|
||||
# $head is the refname from the command line.
|
||||
# Find a ref with the same name as $head that exists at the remote
|
||||
# and points to the same commit as the local object.
|
||||
find_matching_ref='
|
||||
my ($head,$headrev) = (@ARGV);
|
||||
my $pattern = qr{/\Q$head\E$};
|
||||
my ($remote_sha1, $found);
|
||||
|
||||
while (<STDIN>) {
|
||||
chomp;
|
||||
my ($sha1, $ref, $deref) = /^(\S+)\s+([^^]+)(\S*)$/;
|
||||
|
||||
if ($sha1 eq $head) {
|
||||
$found = $remote_sha1 = $sha1;
|
||||
break;
|
||||
}
|
||||
|
||||
if ($ref eq $head || $ref =~ $pattern) {
|
||||
if ($deref eq "") {
|
||||
# Remember the matching object on the remote side
|
||||
$remote_sha1 = $sha1;
|
||||
}
|
||||
if ($sha1 eq $headrev) {
|
||||
$found = $ref;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($found) {
|
||||
$remote_sha1 = $headrev if ! defined $remote_sha1;
|
||||
print "$remote_sha1 $found\n";
|
||||
}
|
||||
'
|
||||
|
||||
set fnord $(git ls-remote "$url" | /usr/bin/perl -e "$find_matching_ref" "${remote:-HEAD}" "$headrev")
|
||||
remote_sha1=$2
|
||||
ref=$3
|
||||
|
||||
if test -z "$ref"
|
||||
then
|
||||
echo "warn: No match for commit $headrev found at $url" >&2
|
||||
echo "warn: Are you sure you pushed '${remote:-HEAD}' there?" >&2
|
||||
status=1
|
||||
elif test "$local_sha1" != "$remote_sha1"
|
||||
then
|
||||
echo "warn: $head found at $url but points to a different object" >&2
|
||||
echo "warn: Are you sure you pushed '${remote:-HEAD}' there?" >&2
|
||||
status=1
|
||||
fi
|
||||
|
||||
# Special case: turn "for_linus" to "tags/for_linus" when it is correct
|
||||
if test "$ref" = "refs/tags/$pretty_remote"
|
||||
then
|
||||
pretty_remote=tags/$pretty_remote
|
||||
fi
|
||||
|
||||
url=$(git ls-remote --get-url "$url")
|
||||
|
||||
git show -s --format='The following changes since commit %H:
|
||||
|
||||
%s (%ci)
|
||||
|
||||
are available in the Git repository at:
|
||||
' $merge_base &&
|
||||
echo " $url $pretty_remote" &&
|
||||
git show -s --format='
|
||||
for you to fetch changes up to %H:
|
||||
|
||||
%s (%ci)
|
||||
|
||||
----------------------------------------------------------------' $headrev &&
|
||||
|
||||
if test $(git cat-file -t "$head") = tag
|
||||
then
|
||||
git cat-file tag "$head" |
|
||||
sed -n -e '1,/^$/d' -e '/^-----BEGIN \(PGP\|SSH\|SIGNED\) /q' -e p
|
||||
echo
|
||||
echo "----------------------------------------------------------------"
|
||||
fi &&
|
||||
|
||||
if test -n "$branch_name"
|
||||
then
|
||||
echo "(from the branch description for $branch_name local branch)"
|
||||
echo
|
||||
git config "branch.$branch_name.description"
|
||||
echo "----------------------------------------------------------------"
|
||||
fi &&
|
||||
|
||||
git shortlog ^$baserev $headrev &&
|
||||
git diff -M --stat --summary $patch $merge_base..$headrev || status=1
|
||||
|
||||
exit $status
|
||||
2324
bin/git/mingw64/libexec/git-core/git-send-email
Normal file
2324
bin/git/mingw64/libexec/git-core/git-send-email
Normal file
File diff suppressed because it is too large
Load Diff
79
bin/git/mingw64/libexec/git-core/git-sh-i18n
Normal file
79
bin/git/mingw64/libexec/git-core/git-sh-i18n
Normal file
@@ -0,0 +1,79 @@
|
||||
# This shell library is Git's interface to gettext.sh. See po/README
|
||||
# for usage instructions.
|
||||
#
|
||||
# Copyright (c) 2010 Ævar Arnfjörð Bjarmason
|
||||
#
|
||||
|
||||
# Export the TEXTDOMAIN* data that we need for Git
|
||||
TEXTDOMAIN=git
|
||||
export TEXTDOMAIN
|
||||
if test -z "$GIT_TEXTDOMAINDIR"
|
||||
then
|
||||
TEXTDOMAINDIR="/mingw64/share/locale"
|
||||
else
|
||||
TEXTDOMAINDIR="$GIT_TEXTDOMAINDIR"
|
||||
fi
|
||||
export TEXTDOMAINDIR
|
||||
|
||||
# First decide what scheme to use...
|
||||
GIT_INTERNAL_GETTEXT_SH_SCHEME=fallthrough
|
||||
if test -n "fallthrough"
|
||||
then
|
||||
GIT_INTERNAL_GETTEXT_SH_SCHEME="fallthrough"
|
||||
elif test -n "$GIT_INTERNAL_GETTEXT_TEST_FALLBACKS"
|
||||
then
|
||||
: no probing necessary
|
||||
elif type gettext.sh >/dev/null 2>&1
|
||||
then
|
||||
# GNU libintl's gettext.sh
|
||||
GIT_INTERNAL_GETTEXT_SH_SCHEME=gnu
|
||||
elif test "$(gettext -h 2>&1)" = "-h"
|
||||
then
|
||||
# gettext binary exists but no gettext.sh. likely to be a gettext
|
||||
# binary on a Solaris or something that is not GNU libintl and
|
||||
# lack eval_gettext.
|
||||
GIT_INTERNAL_GETTEXT_SH_SCHEME=gettext_without_eval_gettext
|
||||
fi
|
||||
export GIT_INTERNAL_GETTEXT_SH_SCHEME
|
||||
|
||||
# ... and then follow that decision.
|
||||
case "$GIT_INTERNAL_GETTEXT_SH_SCHEME" in
|
||||
gnu)
|
||||
# Use libintl's gettext.sh, or fall back to English if we can't.
|
||||
. gettext.sh
|
||||
;;
|
||||
gettext_without_eval_gettext)
|
||||
# Solaris has a gettext(1) but no eval_gettext(1)
|
||||
eval_gettext () {
|
||||
gettext "$1" | (
|
||||
export PATH $(git sh-i18n--envsubst --variables "$1");
|
||||
git sh-i18n--envsubst "$1"
|
||||
)
|
||||
}
|
||||
|
||||
;;
|
||||
*)
|
||||
gettext () {
|
||||
printf "%s" "$1"
|
||||
}
|
||||
|
||||
eval_gettext () {
|
||||
printf "%s" "$1" | (
|
||||
export PATH $(git sh-i18n--envsubst --variables "$1");
|
||||
git sh-i18n--envsubst "$1"
|
||||
)
|
||||
}
|
||||
|
||||
;;
|
||||
esac
|
||||
|
||||
# Git-specific wrapper functions
|
||||
gettextln () {
|
||||
gettext "$1"
|
||||
echo
|
||||
}
|
||||
|
||||
eval_gettextln () {
|
||||
eval_gettext "$1"
|
||||
echo
|
||||
}
|
||||
BIN
bin/git/mingw64/libexec/git-core/git-sh-i18n--envsubst.exe
Normal file
BIN
bin/git/mingw64/libexec/git-core/git-sh-i18n--envsubst.exe
Normal file
Binary file not shown.
370
bin/git/mingw64/libexec/git-core/git-sh-setup
Normal file
370
bin/git/mingw64/libexec/git-core/git-sh-setup
Normal file
@@ -0,0 +1,370 @@
|
||||
# This shell scriplet is meant to be included by other shell scripts
|
||||
# to set up some variables pointing at the normal git directories and
|
||||
# a few helper shell functions.
|
||||
|
||||
# Having this variable in your environment would break scripts because
|
||||
# you would cause "cd" to be taken to unexpected places. If you
|
||||
# like CDPATH, define it for your interactive shell sessions without
|
||||
# exporting it.
|
||||
# But we protect ourselves from such a user mistake nevertheless.
|
||||
unset CDPATH
|
||||
|
||||
# Similarly for IFS, but some shells (e.g. FreeBSD 7.2) are buggy and
|
||||
# do not equate an unset IFS with IFS with the default, so here is
|
||||
# an explicit SP HT LF.
|
||||
IFS='
|
||||
'
|
||||
|
||||
git_broken_path_fix () {
|
||||
case ":$PATH:" in
|
||||
*:$1:*) : ok ;;
|
||||
*)
|
||||
PATH=$(
|
||||
SANE_TOOL_PATH="$1"
|
||||
IFS=: path= sep=
|
||||
set x $PATH
|
||||
shift
|
||||
for elem
|
||||
do
|
||||
case "$SANE_TOOL_PATH:$elem" in
|
||||
(?*:/bin | ?*:/usr/bin)
|
||||
path="$path$sep$SANE_TOOL_PATH"
|
||||
sep=:
|
||||
SANE_TOOL_PATH=
|
||||
esac
|
||||
path="$path$sep$elem"
|
||||
sep=:
|
||||
done
|
||||
echo "$path"
|
||||
)
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
|
||||
# Source git-sh-i18n for gettext support.
|
||||
. "$(git --exec-path)/git-sh-i18n"
|
||||
|
||||
die () {
|
||||
die_with_status 1 "$@"
|
||||
}
|
||||
|
||||
die_with_status () {
|
||||
status=$1
|
||||
shift
|
||||
printf >&2 '%s\n' "$*"
|
||||
exit "$status"
|
||||
}
|
||||
|
||||
if test -n "$OPTIONS_SPEC"; then
|
||||
usage() {
|
||||
"$0" -h
|
||||
exit 1
|
||||
}
|
||||
|
||||
parseopt_extra=
|
||||
[ -n "$OPTIONS_KEEPDASHDASH" ] &&
|
||||
parseopt_extra="--keep-dashdash"
|
||||
[ -n "$OPTIONS_STUCKLONG" ] &&
|
||||
parseopt_extra="$parseopt_extra --stuck-long"
|
||||
|
||||
eval "$(
|
||||
echo "$OPTIONS_SPEC" |
|
||||
git rev-parse --parseopt $parseopt_extra -- "$@" ||
|
||||
echo exit $?
|
||||
)"
|
||||
else
|
||||
dashless=$(basename -- "$0" | sed -e 's/-/ /')
|
||||
usage() {
|
||||
die "$(eval_gettext "usage: \$dashless \$USAGE")"
|
||||
}
|
||||
|
||||
if [ -z "$LONG_USAGE" ]
|
||||
then
|
||||
LONG_USAGE="$(eval_gettext "usage: \$dashless \$USAGE")"
|
||||
else
|
||||
LONG_USAGE="$(eval_gettext "usage: \$dashless \$USAGE
|
||||
|
||||
$LONG_USAGE")"
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
-h)
|
||||
echo "$LONG_USAGE"
|
||||
exit
|
||||
esac
|
||||
fi
|
||||
|
||||
# Set the name of the end-user facing command in the reflog when the
|
||||
# script may update refs. When GIT_REFLOG_ACTION is already set, this
|
||||
# will not overwrite it, so that a scripted Porcelain (e.g. "git
|
||||
# rebase") can set it to its own name (e.g. "rebase") and then call
|
||||
# another scripted Porcelain (e.g. "git am") and a call to this
|
||||
# function in the latter will keep the name of the end-user facing
|
||||
# program (e.g. "rebase") in GIT_REFLOG_ACTION, ensuring whatever it
|
||||
# does will be record as actions done as part of the end-user facing
|
||||
# operation (e.g. "rebase").
|
||||
#
|
||||
# NOTE NOTE NOTE: consequently, after assigning a specific message to
|
||||
# GIT_REFLOG_ACTION when calling a "git" command to record a custom
|
||||
# reflog message, do not leave that custom value in GIT_REFLOG_ACTION,
|
||||
# after you are done. Other callers of "git" commands that rely on
|
||||
# writing the default "program name" in reflog expect the variable to
|
||||
# contain the value set by this function.
|
||||
#
|
||||
# To use a custom reflog message, do either one of these three:
|
||||
#
|
||||
# (a) use a single-shot export form:
|
||||
# GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: preparing frotz" \
|
||||
# git command-that-updates-a-ref
|
||||
#
|
||||
# (b) save the original away and restore:
|
||||
# SAVED_ACTION=$GIT_REFLOG_ACTION
|
||||
# GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: preparing frotz"
|
||||
# git command-that-updates-a-ref
|
||||
# GIT_REFLOG_ACITON=$SAVED_ACTION
|
||||
#
|
||||
# (c) assign the variable in a subshell:
|
||||
# (
|
||||
# GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: preparing frotz"
|
||||
# git command-that-updates-a-ref
|
||||
# )
|
||||
set_reflog_action() {
|
||||
if [ -z "${GIT_REFLOG_ACTION:+set}" ]
|
||||
then
|
||||
GIT_REFLOG_ACTION="$*"
|
||||
export GIT_REFLOG_ACTION
|
||||
fi
|
||||
}
|
||||
|
||||
git_editor() {
|
||||
if test -z "${GIT_EDITOR:+set}"
|
||||
then
|
||||
GIT_EDITOR="$(git var GIT_EDITOR)" || return $?
|
||||
fi
|
||||
|
||||
eval "$GIT_EDITOR" '"$@"'
|
||||
}
|
||||
|
||||
git_pager() {
|
||||
if test -t 1
|
||||
then
|
||||
GIT_PAGER=$(git var GIT_PAGER)
|
||||
else
|
||||
GIT_PAGER=cat
|
||||
fi
|
||||
for vardef in LESS=FRX LV=-c
|
||||
do
|
||||
var=${vardef%%=*}
|
||||
eval ": \"\${$vardef}\" && export $var"
|
||||
done
|
||||
|
||||
eval "$GIT_PAGER" '"$@"'
|
||||
}
|
||||
|
||||
is_bare_repository () {
|
||||
git rev-parse --is-bare-repository
|
||||
}
|
||||
|
||||
cd_to_toplevel () {
|
||||
cdup=$(git rev-parse --show-toplevel) &&
|
||||
cd "$cdup" || {
|
||||
gettextln "Cannot chdir to \$cdup, the toplevel of the working tree" >&2
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
require_work_tree_exists () {
|
||||
if test "z$(git rev-parse --is-bare-repository)" != zfalse
|
||||
then
|
||||
program_name=$0
|
||||
die "$(eval_gettext "fatal: \$program_name cannot be used without a working tree.")"
|
||||
fi
|
||||
}
|
||||
|
||||
require_work_tree () {
|
||||
test "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = true || {
|
||||
program_name=$0
|
||||
die "$(eval_gettext "fatal: \$program_name cannot be used without a working tree.")"
|
||||
}
|
||||
}
|
||||
|
||||
require_clean_work_tree () {
|
||||
git rev-parse --verify HEAD >/dev/null || exit 1
|
||||
git update-index -q --ignore-submodules --refresh
|
||||
err=0
|
||||
|
||||
if ! git diff-files --quiet --ignore-submodules
|
||||
then
|
||||
action=$1
|
||||
case "$action" in
|
||||
"rewrite branches")
|
||||
gettextln "Cannot rewrite branches: You have unstaged changes." >&2
|
||||
;;
|
||||
*)
|
||||
eval_gettextln "Cannot \$action: You have unstaged changes." >&2
|
||||
;;
|
||||
esac
|
||||
err=1
|
||||
fi
|
||||
|
||||
if ! git diff-index --cached --quiet --ignore-submodules HEAD --
|
||||
then
|
||||
if test $err = 0
|
||||
then
|
||||
action=$1
|
||||
eval_gettextln "Cannot \$action: Your index contains uncommitted changes." >&2
|
||||
else
|
||||
gettextln "Additionally, your index contains uncommitted changes." >&2
|
||||
fi
|
||||
err=1
|
||||
fi
|
||||
|
||||
if test $err = 1
|
||||
then
|
||||
test -n "$2" && echo "$2" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Generate a sed script to parse identities from a commit.
|
||||
#
|
||||
# Reads the commit from stdin, which should be in raw format (e.g., from
|
||||
# cat-file or "--pretty=raw").
|
||||
#
|
||||
# The first argument specifies the ident line to parse (e.g., "author"), and
|
||||
# the second specifies the environment variable to put it in (e.g., "AUTHOR"
|
||||
# for "GIT_AUTHOR_*"). Multiple pairs can be given to parse author and
|
||||
# committer.
|
||||
pick_ident_script () {
|
||||
while test $# -gt 0
|
||||
do
|
||||
lid=$1; shift
|
||||
uid=$1; shift
|
||||
printf '%s' "
|
||||
/^$lid /{
|
||||
s/'/'\\\\''/g
|
||||
h
|
||||
s/^$lid "'\([^<]*\) <[^>]*> .*$/\1/'"
|
||||
s/.*/GIT_${uid}_NAME='&'/p
|
||||
|
||||
g
|
||||
s/^$lid "'[^<]* <\([^>]*\)> .*$/\1/'"
|
||||
s/.*/GIT_${uid}_EMAIL='&'/p
|
||||
|
||||
g
|
||||
s/^$lid "'[^<]* <[^>]*> \(.*\)$/@\1/'"
|
||||
s/.*/GIT_${uid}_DATE='&'/p
|
||||
}
|
||||
"
|
||||
done
|
||||
echo '/^$/q'
|
||||
}
|
||||
|
||||
# Create a pick-script as above and feed it to sed. Stdout is suitable for
|
||||
# feeding to eval.
|
||||
parse_ident_from_commit () {
|
||||
LANG=C LC_ALL=C sed -ne "$(pick_ident_script "$@")"
|
||||
}
|
||||
|
||||
# Parse the author from a commit given as an argument. Stdout is suitable for
|
||||
# feeding to eval to set the usual GIT_* ident variables.
|
||||
get_author_ident_from_commit () {
|
||||
encoding=$(git config i18n.commitencoding || echo UTF-8)
|
||||
git show -s --pretty=raw --encoding="$encoding" "$1" -- |
|
||||
parse_ident_from_commit author AUTHOR
|
||||
}
|
||||
|
||||
# Generate a virtual base file for a two-file merge. Uses git apply to
|
||||
# remove lines from $1 that are not in $2, leaving only common lines.
|
||||
create_virtual_base() {
|
||||
sz0=$(wc -c <"$1")
|
||||
diff -u -La/"$1" -Lb/"$1" "$1" "$2" | git apply --no-add
|
||||
sz1=$(wc -c <"$1")
|
||||
|
||||
# If we do not have enough common material, it is not
|
||||
# worth trying two-file merge using common subsections.
|
||||
expr $sz0 \< $sz1 \* 2 >/dev/null || : >"$1"
|
||||
}
|
||||
|
||||
|
||||
# Platform specific tweaks to work around some commands
|
||||
case $(uname -s) in
|
||||
*MINGW*)
|
||||
if test -x /usr/bin/sort
|
||||
then
|
||||
# Windows has its own (incompatible) sort; override
|
||||
sort () {
|
||||
/usr/bin/sort "$@"
|
||||
}
|
||||
fi
|
||||
if test -x /usr/bin/find
|
||||
then
|
||||
# Windows has its own (incompatible) find; override
|
||||
find () {
|
||||
/usr/bin/find "$@"
|
||||
}
|
||||
fi
|
||||
# On Windows, Git wants Windows paths. But /usr/bin/pwd spits out
|
||||
# Unix-style paths. At least in Bash, we have a builtin pwd that
|
||||
# understands the -W option to force "mixed" paths, i.e. with drive
|
||||
# prefix but still with forward slashes. Let's use that, if available.
|
||||
if type builtin >/dev/null 2>&1
|
||||
then
|
||||
pwd () {
|
||||
builtin pwd -W
|
||||
}
|
||||
fi
|
||||
is_absolute_path () {
|
||||
case "$1" in
|
||||
[/\\]* | [A-Za-z]:*)
|
||||
return 0 ;;
|
||||
esac
|
||||
return 1
|
||||
}
|
||||
;;
|
||||
*)
|
||||
is_absolute_path () {
|
||||
case "$1" in
|
||||
/*)
|
||||
return 0 ;;
|
||||
esac
|
||||
return 1
|
||||
}
|
||||
esac
|
||||
|
||||
# Make sure we are in a valid repository of a vintage we understand,
|
||||
# if we require to be in a git repository.
|
||||
git_dir_init () {
|
||||
GIT_DIR=$(git rev-parse --git-dir) || exit
|
||||
if [ -z "$SUBDIRECTORY_OK" ]
|
||||
then
|
||||
test -z "$(git rev-parse --show-cdup)" || {
|
||||
exit=$?
|
||||
gettextln "You need to run this command from the toplevel of the working tree." >&2
|
||||
exit $exit
|
||||
}
|
||||
fi
|
||||
test -n "$GIT_DIR" && GIT_DIR=$(cd "$GIT_DIR" && pwd) || {
|
||||
gettextln "Unable to determine absolute path of git directory" >&2
|
||||
exit 1
|
||||
}
|
||||
: "${GIT_OBJECT_DIRECTORY="$(git rev-parse --git-path objects)"}"
|
||||
}
|
||||
|
||||
if test -z "$NONGIT_OK"
|
||||
then
|
||||
git_dir_init
|
||||
fi
|
||||
|
||||
peel_committish () {
|
||||
case "$1" in
|
||||
:/*)
|
||||
peeltmp=$(git rev-parse --verify "$1") &&
|
||||
git rev-parse --verify "${peeltmp}^0"
|
||||
;;
|
||||
*)
|
||||
git rev-parse --verify "${1}^0"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
677
bin/git/mingw64/libexec/git-core/git-submodule
Normal file
677
bin/git/mingw64/libexec/git-core/git-submodule
Normal file
@@ -0,0 +1,677 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# git-submodule.sh: add, init, update or list git submodules
|
||||
#
|
||||
# Copyright (c) 2007 Lars Hjemli
|
||||
|
||||
dashless=$(basename "$0" | sed -e 's/-/ /')
|
||||
USAGE="[--quiet] [--cached]
|
||||
or: $dashless [--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>]
|
||||
or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...]
|
||||
or: $dashless [--quiet] init [--] [<path>...]
|
||||
or: $dashless [--quiet] deinit [-f|--force] (--all| [--] <path>...)
|
||||
or: $dashless [--quiet] update [--init [--filter=<filter-spec>]] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--[no-]recommend-shallow] [--reference <repository>] [--recursive] [--[no-]single-branch] [--] [<path>...]
|
||||
or: $dashless [--quiet] set-branch (--default|--branch <branch>) [--] <path>
|
||||
or: $dashless [--quiet] set-url [--] <path> <newurl>
|
||||
or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
|
||||
or: $dashless [--quiet] foreach [--recursive] <command>
|
||||
or: $dashless [--quiet] sync [--recursive] [--] [<path>...]
|
||||
or: $dashless [--quiet] absorbgitdirs [--] [<path>...]"
|
||||
OPTIONS_SPEC=
|
||||
SUBDIRECTORY_OK=Yes
|
||||
. git-sh-setup
|
||||
require_work_tree
|
||||
wt_prefix=$(git rev-parse --show-prefix)
|
||||
cd_to_toplevel
|
||||
|
||||
# Tell the rest of git that any URLs we get don't come
|
||||
# directly from the user, so it can apply policy as appropriate.
|
||||
GIT_PROTOCOL_FROM_USER=0
|
||||
export GIT_PROTOCOL_FROM_USER
|
||||
|
||||
command=
|
||||
quiet=
|
||||
branch=
|
||||
force=
|
||||
reference=
|
||||
cached=
|
||||
recursive=
|
||||
init=
|
||||
require_init=
|
||||
files=
|
||||
remote=
|
||||
nofetch=
|
||||
rebase=
|
||||
merge=
|
||||
checkout=
|
||||
custom_name=
|
||||
depth=
|
||||
progress=
|
||||
dissociate=
|
||||
single_branch=
|
||||
jobs=
|
||||
recommend_shallow=
|
||||
filter=
|
||||
|
||||
isnumber()
|
||||
{
|
||||
n=$(($1 + 0)) 2>/dev/null && test "$n" = "$1"
|
||||
}
|
||||
|
||||
#
|
||||
# Add a new submodule to the working tree, .gitmodules and the index
|
||||
#
|
||||
# $@ = repo path
|
||||
#
|
||||
# optional branch is stored in global branch variable
|
||||
#
|
||||
cmd_add()
|
||||
{
|
||||
# parse $args after "submodule ... add".
|
||||
reference_path=
|
||||
while test $# -ne 0
|
||||
do
|
||||
case "$1" in
|
||||
-b | --branch)
|
||||
case "$2" in '') usage ;; esac
|
||||
branch=$2
|
||||
shift
|
||||
;;
|
||||
-f | --force)
|
||||
force=$1
|
||||
;;
|
||||
-q|--quiet)
|
||||
quiet=1
|
||||
;;
|
||||
--progress)
|
||||
progress=1
|
||||
;;
|
||||
--reference)
|
||||
case "$2" in '') usage ;; esac
|
||||
reference_path=$2
|
||||
shift
|
||||
;;
|
||||
--reference=*)
|
||||
reference_path="${1#--reference=}"
|
||||
;;
|
||||
--ref-format)
|
||||
case "$2" in '') usage ;; esac
|
||||
ref_format="--ref-format=$2"
|
||||
shift
|
||||
;;
|
||||
--ref-format=*)
|
||||
ref_format="$1"
|
||||
;;
|
||||
--dissociate)
|
||||
dissociate=1
|
||||
;;
|
||||
--name)
|
||||
case "$2" in '') usage ;; esac
|
||||
custom_name=$2
|
||||
shift
|
||||
;;
|
||||
--depth)
|
||||
case "$2" in '') usage ;; esac
|
||||
depth="--depth=$2"
|
||||
shift
|
||||
;;
|
||||
--depth=*)
|
||||
depth=$1
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if test -z "$1"
|
||||
then
|
||||
usage
|
||||
fi
|
||||
|
||||
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper add \
|
||||
${quiet:+--quiet} \
|
||||
${force:+--force} \
|
||||
${progress:+"--progress"} \
|
||||
${branch:+--branch "$branch"} \
|
||||
${reference_path:+--reference "$reference_path"} \
|
||||
${ref_format:+"$ref_format"} \
|
||||
${dissociate:+--dissociate} \
|
||||
${custom_name:+--name "$custom_name"} \
|
||||
${depth:+"$depth"} \
|
||||
-- \
|
||||
"$@"
|
||||
}
|
||||
|
||||
#
|
||||
# Execute an arbitrary command sequence in each checked out
|
||||
# submodule
|
||||
#
|
||||
# $@ = command to execute
|
||||
#
|
||||
cmd_foreach()
|
||||
{
|
||||
# parse $args after "submodule ... foreach".
|
||||
while test $# -ne 0
|
||||
do
|
||||
case "$1" in
|
||||
-q|--quiet)
|
||||
quiet=1
|
||||
;;
|
||||
--recursive)
|
||||
recursive=1
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper foreach \
|
||||
${quiet:+--quiet} \
|
||||
${recursive:+--recursive} \
|
||||
-- \
|
||||
"$@"
|
||||
}
|
||||
|
||||
#
|
||||
# Register submodules in .git/config
|
||||
#
|
||||
# $@ = requested paths (default to all)
|
||||
#
|
||||
cmd_init()
|
||||
{
|
||||
# parse $args after "submodule ... init".
|
||||
while test $# -ne 0
|
||||
do
|
||||
case "$1" in
|
||||
-q|--quiet)
|
||||
quiet=1
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper init \
|
||||
${quiet:+--quiet} \
|
||||
-- \
|
||||
"$@"
|
||||
}
|
||||
|
||||
#
|
||||
# Unregister submodules from .git/config and remove their work tree
|
||||
#
|
||||
cmd_deinit()
|
||||
{
|
||||
# parse $args after "submodule ... deinit".
|
||||
deinit_all=
|
||||
while test $# -ne 0
|
||||
do
|
||||
case "$1" in
|
||||
-f|--force)
|
||||
force=$1
|
||||
;;
|
||||
-q|--quiet)
|
||||
quiet=1
|
||||
;;
|
||||
--all)
|
||||
deinit_all=t
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
|
||||
${quiet:+--quiet} \
|
||||
${force:+--force} \
|
||||
${deinit_all:+--all} \
|
||||
-- \
|
||||
"$@"
|
||||
}
|
||||
|
||||
#
|
||||
# Update each submodule path to correct revision, using clone and checkout as needed
|
||||
#
|
||||
# $@ = requested paths (default to all)
|
||||
#
|
||||
cmd_update()
|
||||
{
|
||||
# parse $args after "submodule ... update".
|
||||
while test $# -ne 0
|
||||
do
|
||||
case "$1" in
|
||||
-q|--quiet)
|
||||
quiet=1
|
||||
;;
|
||||
-v|--verbose)
|
||||
quiet=0
|
||||
;;
|
||||
--progress)
|
||||
progress=1
|
||||
;;
|
||||
-i|--init)
|
||||
init=1
|
||||
;;
|
||||
--require-init)
|
||||
require_init=1
|
||||
;;
|
||||
--remote)
|
||||
remote=1
|
||||
;;
|
||||
-N|--no-fetch)
|
||||
nofetch=1
|
||||
;;
|
||||
-f|--force)
|
||||
force=$1
|
||||
;;
|
||||
-r|--rebase)
|
||||
rebase=1
|
||||
;;
|
||||
--ref-format)
|
||||
case "$2" in '') usage ;; esac
|
||||
ref_format="--ref-format=$2"
|
||||
shift
|
||||
;;
|
||||
--ref-format=*)
|
||||
ref_format="$1"
|
||||
;;
|
||||
--reference)
|
||||
case "$2" in '') usage ;; esac
|
||||
reference="--reference=$2"
|
||||
shift
|
||||
;;
|
||||
--reference=*)
|
||||
reference="$1"
|
||||
;;
|
||||
--dissociate)
|
||||
dissociate=1
|
||||
;;
|
||||
-m|--merge)
|
||||
merge=1
|
||||
;;
|
||||
--recursive)
|
||||
recursive=1
|
||||
;;
|
||||
--checkout)
|
||||
checkout=1
|
||||
;;
|
||||
--recommend-shallow)
|
||||
recommend_shallow="--recommend-shallow"
|
||||
;;
|
||||
--no-recommend-shallow)
|
||||
recommend_shallow="--no-recommend-shallow"
|
||||
;;
|
||||
--depth)
|
||||
case "$2" in '') usage ;; esac
|
||||
depth="--depth=$2"
|
||||
shift
|
||||
;;
|
||||
--depth=*)
|
||||
depth=$1
|
||||
;;
|
||||
-j|--jobs)
|
||||
case "$2" in '') usage ;; esac
|
||||
jobs="--jobs=$2"
|
||||
shift
|
||||
;;
|
||||
--jobs=*)
|
||||
jobs=$1
|
||||
;;
|
||||
--single-branch)
|
||||
single_branch="--single-branch"
|
||||
;;
|
||||
--no-single-branch)
|
||||
single_branch="--no-single-branch"
|
||||
;;
|
||||
--filter)
|
||||
case "$2" in '') usage ;; esac
|
||||
filter="--filter=$2"
|
||||
shift
|
||||
;;
|
||||
--filter=*)
|
||||
filter="$1"
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper update \
|
||||
${quiet:+--quiet} \
|
||||
${force:+--force} \
|
||||
${progress:+"--progress"} \
|
||||
${remote:+--remote} \
|
||||
${recursive:+--recursive} \
|
||||
${init:+--init} \
|
||||
${nofetch:+--no-fetch} \
|
||||
${rebase:+--rebase} \
|
||||
${merge:+--merge} \
|
||||
${checkout:+--checkout} \
|
||||
${ref_format:+"$ref_format"} \
|
||||
${reference:+"$reference"} \
|
||||
${dissociate:+"--dissociate"} \
|
||||
${depth:+"$depth"} \
|
||||
${require_init:+--require-init} \
|
||||
${dissociate:+"--dissociate"} \
|
||||
$single_branch \
|
||||
$recommend_shallow \
|
||||
$jobs \
|
||||
$filter \
|
||||
-- \
|
||||
"$@"
|
||||
}
|
||||
|
||||
#
|
||||
# Configures a submodule's default branch
|
||||
#
|
||||
# $@ = requested path
|
||||
#
|
||||
cmd_set_branch() {
|
||||
default=
|
||||
branch=
|
||||
|
||||
while test $# -ne 0
|
||||
do
|
||||
case "$1" in
|
||||
-q|--quiet)
|
||||
# we don't do anything with this but we need to accept it
|
||||
;;
|
||||
-d|--default)
|
||||
default=1
|
||||
;;
|
||||
-b|--branch)
|
||||
case "$2" in '') usage ;; esac
|
||||
branch=$2
|
||||
shift
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper set-branch \
|
||||
${quiet:+--quiet} \
|
||||
${branch:+--branch "$branch"} \
|
||||
${default:+--default} \
|
||||
-- \
|
||||
"$@"
|
||||
}
|
||||
|
||||
#
|
||||
# Configures a submodule's remote url
|
||||
#
|
||||
# $@ = requested path, requested url
|
||||
#
|
||||
cmd_set_url() {
|
||||
while test $# -ne 0
|
||||
do
|
||||
case "$1" in
|
||||
-q|--quiet)
|
||||
quiet=1
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper set-url \
|
||||
${quiet:+--quiet} \
|
||||
-- \
|
||||
"$@"
|
||||
}
|
||||
|
||||
#
|
||||
# Show commit summary for submodules in index or working tree
|
||||
#
|
||||
# If '--cached' is given, show summary between index and given commit,
|
||||
# or between working tree and given commit
|
||||
#
|
||||
# $@ = [commit (default 'HEAD'),] requested paths (default all)
|
||||
#
|
||||
cmd_summary() {
|
||||
summary_limit=-1
|
||||
for_status=
|
||||
diff_cmd=diff-index
|
||||
|
||||
# parse $args after "submodule ... summary".
|
||||
while test $# -ne 0
|
||||
do
|
||||
case "$1" in
|
||||
--cached)
|
||||
cached=1
|
||||
;;
|
||||
--files)
|
||||
files="$1"
|
||||
;;
|
||||
--for-status)
|
||||
for_status="$1"
|
||||
;;
|
||||
-n|--summary-limit)
|
||||
summary_limit="$2"
|
||||
isnumber "$summary_limit" || usage
|
||||
shift
|
||||
;;
|
||||
--summary-limit=*)
|
||||
summary_limit="${1#--summary-limit=}"
|
||||
isnumber "$summary_limit" || usage
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper summary \
|
||||
${files:+--files} \
|
||||
${cached:+--cached} \
|
||||
${for_status:+--for-status} \
|
||||
${summary_limit:+-n $summary_limit} \
|
||||
-- \
|
||||
"$@"
|
||||
}
|
||||
#
|
||||
# List all submodules, prefixed with:
|
||||
# - submodule not initialized
|
||||
# + different revision checked out
|
||||
#
|
||||
# If --cached was specified the revision in the index will be printed
|
||||
# instead of the currently checked out revision.
|
||||
#
|
||||
# $@ = requested paths (default to all)
|
||||
#
|
||||
cmd_status()
|
||||
{
|
||||
# parse $args after "submodule ... status".
|
||||
while test $# -ne 0
|
||||
do
|
||||
case "$1" in
|
||||
-q|--quiet)
|
||||
quiet=1
|
||||
;;
|
||||
--cached)
|
||||
cached=1
|
||||
;;
|
||||
--recursive)
|
||||
recursive=1
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper status \
|
||||
${quiet:+--quiet} \
|
||||
${cached:+--cached} \
|
||||
${recursive:+--recursive} \
|
||||
-- \
|
||||
"$@"
|
||||
}
|
||||
|
||||
#
|
||||
# Sync remote urls for submodules
|
||||
# This makes the value for remote.$remote.url match the value
|
||||
# specified in .gitmodules.
|
||||
#
|
||||
cmd_sync()
|
||||
{
|
||||
while test $# -ne 0
|
||||
do
|
||||
case "$1" in
|
||||
-q|--quiet)
|
||||
quiet=1
|
||||
shift
|
||||
;;
|
||||
--recursive)
|
||||
recursive=1
|
||||
shift
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper sync \
|
||||
${quiet:+--quiet} \
|
||||
${recursive:+--recursive} \
|
||||
-- \
|
||||
"$@"
|
||||
}
|
||||
|
||||
cmd_absorbgitdirs()
|
||||
{
|
||||
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper absorbgitdirs "$@"
|
||||
}
|
||||
|
||||
# This loop parses the command line arguments to find the
|
||||
# subcommand name to dispatch. Parsing of the subcommand specific
|
||||
# options are primarily done by the subcommand implementations.
|
||||
# Subcommand specific options such as --branch and --cached are
|
||||
# parsed here as well, for backward compatibility.
|
||||
|
||||
while test $# != 0 && test -z "$command"
|
||||
do
|
||||
case "$1" in
|
||||
add | foreach | init | deinit | update | set-branch | set-url | status | summary | sync | absorbgitdirs)
|
||||
command=$1
|
||||
;;
|
||||
-q|--quiet)
|
||||
quiet=1
|
||||
;;
|
||||
--cached)
|
||||
cached=1
|
||||
;;
|
||||
--)
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# No command word defaults to "status"
|
||||
if test -z "$command"
|
||||
then
|
||||
if test $# = 0
|
||||
then
|
||||
command=status
|
||||
else
|
||||
usage
|
||||
fi
|
||||
fi
|
||||
|
||||
# "--cached" is accepted only by "status" and "summary"
|
||||
if test -n "$cached" && test "$command" != status && test "$command" != summary
|
||||
then
|
||||
usage
|
||||
fi
|
||||
|
||||
"cmd_$(echo $command | sed -e s/-/_/g)" "$@"
|
||||
1132
bin/git/mingw64/libexec/git-core/git-subtree
Normal file
1132
bin/git/mingw64/libexec/git-core/git-subtree
Normal file
File diff suppressed because it is too large
Load Diff
2293
bin/git/mingw64/libexec/git-core/git-svn
Normal file
2293
bin/git/mingw64/libexec/git-core/git-svn
Normal file
File diff suppressed because it is too large
Load Diff
8
bin/git/mingw64/libexec/git-core/git-update
Normal file
8
bin/git/mingw64/libexec/git-core/git-update
Normal file
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Placeholder for the deprecated `git update` command
|
||||
|
||||
echo 'Warning! `git update` has been deprecated;' >&2
|
||||
echo 'Please use `git update-git-for-windows` instead.' >&2
|
||||
|
||||
exec git update-git-for-windows "$@"
|
||||
196
bin/git/mingw64/libexec/git-core/git-web--browse
Normal file
196
bin/git/mingw64/libexec/git-core/git-web--browse
Normal file
@@ -0,0 +1,196 @@
|
||||
#!/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
|
||||
BIN
bin/git/mingw64/libexec/git-core/git.exe
Normal file
BIN
bin/git/mingw64/libexec/git-core/git.exe
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/headless-git.exe
Normal file
BIN
bin/git/mingw64/libexec/git-core/headless-git.exe
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libHarfBuzzSharp.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libHarfBuzzSharp.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libSkiaSharp.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libSkiaSharp.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libbrotlicommon.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libbrotlicommon.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libbrotlidec.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libbrotlidec.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libbrotlienc.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libbrotlienc.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libbz2-1.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libbz2-1.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libcares-2.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libcares-2.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libcrypto-3-x64.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libcrypto-3-x64.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libcurl-4.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libcurl-4.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libcurl-openssl-4.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libcurl-openssl-4.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libexpat-1.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libexpat-1.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libffi-8.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libffi-8.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libgcc_s_seh-1.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libgcc_s_seh-1.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libgmp-10.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libgmp-10.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libhogweed-6.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libhogweed-6.dll
Normal file
Binary file not shown.
BIN
bin/git/mingw64/libexec/git-core/libiconv-2.dll
Normal file
BIN
bin/git/mingw64/libexec/git-core/libiconv-2.dll
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user