summaryrefslogtreecommitdiff
path: root/git-gui
diff options
context:
space:
mode:
Diffstat (limited to 'git-gui')
-rw-r--r--git-gui/.gitattributes1
-rw-r--r--git-gui/.gitignore2
-rw-r--r--git-gui/GIT-GUI-BUILD-OPTIONS.in7
-rwxr-xr-xgit-gui/GIT-VERSION-GEN44
-rw-r--r--git-gui/Makefile115
-rwxr-xr-xgit-gui/generate-git-gui.sh29
-rwxr-xr-xgit-gui/generate-macos-app.sh30
-rwxr-xr-xgit-gui/generate-macos-wrapper.sh35
-rwxr-xr-xgit-gui/generate-tclindex.sh32
-rw-r--r--git-gui/lib/meson.build74
-rw-r--r--git-gui/meson.build148
-rw-r--r--git-gui/po/meson.build38
12 files changed, 453 insertions, 102 deletions
diff --git a/git-gui/.gitattributes b/git-gui/.gitattributes
index 118d56cfbd..889d58257f 100644
--- a/git-gui/.gitattributes
+++ b/git-gui/.gitattributes
@@ -4,3 +4,4 @@ git-gui.sh encoding=UTF-8
/po/*.po encoding=UTF-8
/GIT-VERSION-GEN eol=lf
Makefile whitespace=!indent,trail,space
+meson.build whitespace=space
diff --git a/git-gui/.gitignore b/git-gui/.gitignore
index 6483b21cbf..ff6e0be4b4 100644
--- a/git-gui/.gitignore
+++ b/git-gui/.gitignore
@@ -2,7 +2,7 @@
config.mak
Git Gui.app*
git-gui.tcl
+GIT-GUI-BUILD-OPTIONS
GIT-VERSION-FILE
-GIT-GUI-VARS
git-gui
lib/tclIndex
diff --git a/git-gui/GIT-GUI-BUILD-OPTIONS.in b/git-gui/GIT-GUI-BUILD-OPTIONS.in
new file mode 100644
index 0000000000..5fd885c2bf
--- /dev/null
+++ b/git-gui/GIT-GUI-BUILD-OPTIONS.in
@@ -0,0 +1,7 @@
+GITGUI_GITEXECDIR=@GITGUI_GITEXECDIR@
+GITGUI_LIBDIR=@GITGUI_LIBDIR@
+GITGUI_RELATIVE=@GITGUI_RELATIVE@
+SHELL_PATH=@SHELL_PATH@
+TCLTK_PATH=@TCLTK_PATH@
+TCL_PATH=@TCL_PATH@
+TKEXECUTABLE=@TKEXECUTABLE@
diff --git a/git-gui/GIT-VERSION-GEN b/git-gui/GIT-VERSION-GEN
index 92373d251a..c2767b4136 100755
--- a/git-gui/GIT-VERSION-GEN
+++ b/git-gui/GIT-VERSION-GEN
@@ -1,19 +1,33 @@
#!/bin/sh
-GVF=GIT-VERSION-FILE
DEF_VER=0.21.GITGUI
LF='
'
+if test "$#" -ne 2
+then
+ echo >&2 "usage: $0 <SOURCE_DIR> <OUTPUT>"
+ exit 1
+fi
+
+SOURCE_DIR="$1"
+OUTPUT="$2"
+
+# Protect us from reading Git version information outside of the Git directory
+# in case it is not a repository itself, but embedded in an unrelated
+# repository.
+GIT_CEILING_DIRECTORIES="$SOURCE_DIR/.."
+export GIT_CEILING_DIRECTORIES
+
tree_search ()
{
head=$1
tree=$2
- for p in $(git rev-list --parents --max-count=1 $head 2>/dev/null)
+ for p in $(git -C "$SOURCE_DIR" rev-list --parents --max-count=1 $head 2>/dev/null)
do
- test $tree = $(git rev-parse $p^{tree} 2>/dev/null) &&
- vn=$(git describe --abbrev=4 $p 2>/dev/null) &&
+ test $tree = $(git -C "$SOURCE_DIR" rev-parse $p^{tree} 2>/dev/null) &&
+ vn=$(git -C "$SOURCE_DIR" describe --abbrev=4 $p 2>/dev/null) &&
case "$vn" in
gitgui-[0-9]*) echo $vn; break;;
esac
@@ -34,14 +48,14 @@ tree_search ()
# If we are at the toplevel or the merge assumption fails
# try looking for a gitgui-* tag.
-if test -f version &&
- VN=$(cat version)
+if test -f "$SOURCE_DIR"/version &&
+ VN=$(cat "$SOURCE_DIR"/version)
then
: happy
-elif prefix="$(git rev-parse --show-prefix 2>/dev/null)"
+elif prefix="$(git -C "$SOURCE_DIR" rev-parse --show-prefix 2>/dev/null)"
test -n "$prefix" &&
- head=$(git rev-list --max-count=1 HEAD -- . 2>/dev/null) &&
- tree=$(git rev-parse --verify "HEAD:$prefix" 2>/dev/null) &&
+ head=$(git -C "$SOURCE_DIR" rev-list --max-count=1 HEAD -- . 2>/dev/null) &&
+ tree=$(git -C "$SOURCE_DIR" rev-parse --verify "HEAD:$prefix" 2>/dev/null) &&
VN=$(tree_search $head $tree)
case "$VN" in
gitgui-[0-9]*) : happy ;;
@@ -49,7 +63,7 @@ elif prefix="$(git rev-parse --show-prefix 2>/dev/null)"
esac
then
VN=$(echo "$VN" | sed -e 's/^gitgui-//;s/-/./g');
-elif VN=$(git describe --abbrev=4 HEAD 2>/dev/null) &&
+elif VN=$(git -C "$SOURCE_DIR" describe --abbrev=4 HEAD 2>/dev/null) &&
case "$VN" in
gitgui-[0-9]*) : happy ;;
*) (exit 1) ;;
@@ -60,7 +74,7 @@ else
VN="$DEF_VER"
fi
-dirty=$(sh -c 'git diff-index --name-only HEAD' 2>/dev/null) || dirty=
+dirty=$(git -C "$SOURCE_DIR" diff-index --name-only HEAD 2>/dev/null) || dirty=
case "$dirty" in
'')
;;
@@ -68,13 +82,13 @@ case "$dirty" in
VN="$VN-dirty" ;;
esac
-if test -r $GVF
+if test -r "$OUTPUT"
then
- VC=$(sed -e 's/^GITGUI_VERSION = //' <$GVF)
+ VC=$(sed -e 's/^GITGUI_VERSION=//' <"$OUTPUT")
else
VC=unset
fi
test "$VN" = "$VC" || {
- echo >&2 "GITGUI_VERSION = $VN"
- echo "GITGUI_VERSION = $VN" >$GVF
+ echo >&2 "GITGUI_VERSION=$VN"
+ echo "GITGUI_VERSION=$VN" >"$OUTPUT"
}
diff --git a/git-gui/Makefile b/git-gui/Makefile
index e3b4f324b6..8672dd2d6b 100644
--- a/git-gui/Makefile
+++ b/git-gui/Makefile
@@ -9,10 +9,7 @@ all::
#
GIT-VERSION-FILE: FORCE
- @$(SHELL_PATH) ./GIT-VERSION-GEN
-ifneq ($(MAKECMDGOALS),clean)
--include GIT-VERSION-FILE
-endif
+ @$(SHELL_PATH) ./GIT-VERSION-GEN . $@
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not')
@@ -76,7 +73,6 @@ ifndef V
QUIET_INDEX = $(QUIET)echo ' ' INDEX $(dir $@) &&
QUIET_MSGFMT0 = $(QUIET)printf ' MSGFMT %12s ' $@ && v=`
QUIET_MSGFMT1 = 2>&1` && echo "$$v" | sed -e 's/fuzzy translations/fuzzy/' | sed -e 's/ messages*//g'
- QUIET_2DEVNULL = 2>/dev/null
INSTALL_D0 = dir=
INSTALL_D1 = && echo ' ' DEST $$dir && $(INSTALL) -d -m 755 "$$dir"
@@ -114,7 +110,8 @@ ifeq ($(uname_S),Darwin)
TKFRAMEWORK = /System/Library/Frameworks/Tk.framework/Resources/Wish\ Shell.app
endif
endif
- TKEXECUTABLE = $(shell basename "$(TKFRAMEWORK)" .app)
+ TKEXECUTABLE = $(TKFRAMEWORK)/Contents/MacOS/$(shell basename "$(TKFRAMEWORK)" .app)
+ TKEXECUTABLE_SQ = $(subst ','\'',$(TKEXECUTABLE))
endif
ifeq ($(findstring $(firstword -$(MAKEFLAGS)),s),s)
@@ -128,21 +125,17 @@ gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
TCL_PATH_SQ = $(subst ','\'',$(TCL_PATH))
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
-TCLTK_PATH_SED = $(subst ','\'',$(subst \,\\,$(TCLTK_PATH)))
gg_libdir ?= $(sharedir)/git-gui/lib
libdir_SQ = $(subst ','\'',$(gg_libdir))
-libdir_SED = $(subst ','\'',$(subst \,\\,$(gg_libdir_sed_in)))
exedir = $(dir $(gitexecdir))share/git-gui/lib
-GITGUI_SCRIPT := $$0
GITGUI_RELATIVE :=
GITGUI_MACOSXAPP :=
ifeq ($(exedir),$(gg_libdir))
GITGUI_RELATIVE := 1
endif
-gg_libdir_sed_in := $(gg_libdir)
ifeq ($(uname_S),Darwin)
ifeq ($(shell test -d $(TKFRAMEWORK) && echo y),y)
GITGUI_MACOSXAPP := YesPlease
@@ -159,41 +152,15 @@ endif
ifdef GITGUI_MACOSXAPP
GITGUI_MAIN := git-gui.tcl
-git-gui: GIT-VERSION-FILE GIT-GUI-VARS
- $(QUIET_GEN)rm -f $@ $@+ && \
- echo '#!$(SHELL_PATH_SQ)' >$@+ && \
- echo 'if test "z$$*" = zversion ||' >>$@+ && \
- echo ' test "z$$*" = z--version' >>$@+ && \
- echo then >>$@+ && \
- echo ' 'echo \'git-gui version '$(GITGUI_VERSION)'\' >>$@+ && \
- echo else >>$@+ && \
- echo ' libdir="$${GIT_GUI_LIB_DIR:-$(libdir_SQ)}"' >>$@+ && \
- echo ' 'exec \"'$$libdir/Git Gui.app/Contents/MacOS/$(subst \,,$(TKEXECUTABLE))'\" \
- '"$$0" "$$@"' >>$@+ && \
- echo fi >>$@+ && \
- chmod +x $@+ && \
- mv $@+ $@
-
-Git\ Gui.app: GIT-VERSION-FILE GIT-GUI-VARS \
+git-gui: generate-macos-wrapper.sh GIT-VERSION-FILE GIT-GUI-BUILD-OPTIONS
+ $(QUIET_GEN)$(SHELL_PATH) generate-macos-wrapper.sh "$@" ./GIT-GUI-BUILD-OPTIONS ./GIT-VERSION-FILE
+
+Git\ Gui.app: GIT-VERSION-FILE GIT-GUI-BUILD-OPTIONS \
macosx/Info.plist \
macosx/git-gui.icns \
macosx/AppMain.tcl \
- $(TKFRAMEWORK)/Contents/MacOS/$(TKEXECUTABLE)
- $(QUIET_GEN)rm -rf '$@' '$@'+ && \
- mkdir -p '$@'+/Contents/MacOS && \
- mkdir -p '$@'+/Contents/Resources/Scripts && \
- cp '$(subst ','\'',$(subst \,,$(TKFRAMEWORK)/Contents/MacOS/$(TKEXECUTABLE)))' \
- '$@'+/Contents/MacOS && \
- cp macosx/git-gui.icns '$@'+/Contents/Resources && \
- sed -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \
- -e 's/@@GITGUI_TKEXECUTABLE@@/$(TKEXECUTABLE)/g' \
- macosx/Info.plist \
- >'$@'+/Contents/Info.plist && \
- sed -e 's|@@gitexecdir@@|$(gitexecdir_SQ)|' \
- -e 's|@@GITGUI_LIBDIR@@|$(libdir_SED)|' \
- macosx/AppMain.tcl \
- >'$@'+/Contents/Resources/Scripts/AppMain.tcl && \
- mv '$@'+ '$@'
+ $(TKEXECUTABLE)
+ $(QUIET_GEN)$(SHELL_PATH) generate-macos-app.sh . "$@" ./GIT-GUI-BUILD-OPTIONS ./GIT-VERSION-FILE
endif
ifdef GITGUI_WINDOWS_WRAPPER
@@ -203,18 +170,8 @@ git-gui: windows/git-gui.sh
cp $< $@
endif
-$(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-VARS
- $(QUIET_GEN)rm -f $@ $@+ && \
- sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
- -e 's|@@SHELL_PATH@@|$(SHELL_PATH_SQ)|' \
- -e '1,30s|^ argv0=$$0| argv0=$(GITGUI_SCRIPT)|' \
- -e '1,30s|^ exec wish | exec '\''$(TCLTK_PATH_SED)'\'' |' \
- -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \
- -e 's|@@GITGUI_RELATIVE@@|$(GITGUI_RELATIVE)|' \
- -e '$(GITGUI_RELATIVE)s|@@GITGUI_LIBDIR@@|$(libdir_SED)|' \
- git-gui.sh >$@+ && \
- chmod +x $@+ && \
- mv $@+ $@
+$(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-BUILD-OPTIONS
+ $(QUIET_GEN)$(SHELL_PATH) generate-git-gui.sh "$<" "$@" ./GIT-GUI-BUILD-OPTIONS ./GIT-VERSION-FILE
XGETTEXT ?= xgettext
ifdef NO_MSGFMT
@@ -239,35 +196,21 @@ update-po:: $(PO_TEMPLATE)
$(ALL_MSGFILES): %.msg : %.po
$(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1)
-lib/tclIndex: $(ALL_LIBFILES) GIT-GUI-VARS
- $(QUIET_INDEX)if echo \
- $(foreach p,$(PRELOAD_FILES),source $p\;) \
- auto_mkindex lib $(patsubst lib/%,%,$(sort $(ALL_LIBFILES))) \
- | $(TCL_PATH) $(QUIET_2DEVNULL); then : ok; \
- else \
- echo >&2 " * $(TCL_PATH) failed; using unoptimized loading"; \
- rm -f $@ ; \
- echo '# Autogenerated by git-gui Makefile' >$@ && \
- echo >>$@ && \
- $(foreach p,$(PRELOAD_FILES) $(sort $(ALL_LIBFILES)),echo '$(subst lib/,,$p)' >>$@ &&) \
- echo >>$@ ; \
- fi
-
-TRACK_VARS = \
- $(subst ','\'',SHELL_PATH='$(SHELL_PATH_SQ)') \
- $(subst ','\'',TCL_PATH='$(TCL_PATH_SQ)') \
- $(subst ','\'',TCLTK_PATH='$(TCLTK_PATH_SQ)') \
- $(subst ','\'',gitexecdir='$(gitexecdir_SQ)') \
- $(subst ','\'',gg_libdir='$(libdir_SQ)') \
- GITGUI_MACOSXAPP=$(GITGUI_MACOSXAPP) \
-#end TRACK_VARS
-
-GIT-GUI-VARS: FORCE
- @VARS='$(TRACK_VARS)'; \
- if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
- echo >&2 " * new locations or Tcl/Tk interpreter"; \
- echo >$@ "$$VARS"; \
- fi
+lib/tclIndex: $(ALL_LIBFILES) generate-tclindex.sh GIT-GUI-BUILD-OPTIONS
+ $(QUIET_INDEX)$(SHELL_PATH) generate-tclindex.sh . ./GIT-GUI-BUILD-OPTIONS $(ALL_LIBFILES)
+
+GIT-GUI-BUILD-OPTIONS: FORCE
+ @sed \
+ -e 's|@GITGUI_GITEXECDIR@|$(gitexecdir_SQ)|' \
+ -e 's|@GITGUI_LIBDIR@|$(libdir_SQ)|' \
+ -e 's|@GITGUI_RELATIVE@|$(GITGUI_RELATIVE)|' \
+ -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
+ -e 's|@TCLTK_PATH@|$(TCLTK_PATH_SQ)|' \
+ -e 's|@TCL_PATH@|$(TCL_PATH_SQ)|' \
+ -e 's|@TKEXECUTABLE@|$(TKEXECUTABLE_SQ)|' \
+ $@.in >$@+
+ @if grep -q '^[A-Z][A-Z_]*=@.*@$$' $@+; then echo "Unsubstituted build options in $@" >&2 && exit 1; fi
+ @if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
ifdef GITGUI_MACOSXAPP
all:: git-gui Git\ Gui.app
@@ -317,13 +260,13 @@ endif
$(QUIET)$(REMOVE_D0)'$(DESTDIR_SQ)$(libdir_SQ)' $(REMOVE_D1)
$(QUIET)$(REMOVE_D0)`dirname '$(DESTDIR_SQ)$(libdir_SQ)'` $(REMOVE_D1)
-dist-version:
+dist-version: GIT-VERSION-FILE
@mkdir -p $(TARDIR)
- @echo $(GITGUI_VERSION) > $(TARDIR)/version
+ @sed 's|^GITGUI_VERSION=||' <GIT-VERSION-FILE >$(TARDIR)/version
clean::
$(RM_RF) $(GITGUI_MAIN) lib/tclIndex po/*.msg $(PO_TEMPLATE)
- $(RM_RF) GIT-VERSION-FILE GIT-GUI-VARS
+ $(RM_RF) GIT-VERSION-FILE GIT-GUI-BUILD-OPTIONS
ifdef GITGUI_MACOSXAPP
$(RM_RF) 'Git Gui.app'* git-gui
endif
diff --git a/git-gui/generate-git-gui.sh b/git-gui/generate-git-gui.sh
new file mode 100755
index 0000000000..39dfafdc4a
--- /dev/null
+++ b/git-gui/generate-git-gui.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+set -e
+
+if test "$#" -ne 4
+then
+ echo >&2 "usage: $0 <INPUT> <OUTPUT> <BUILD_OPTIONS> <VERSION_FILE>"
+ exit 1
+fi
+
+INPUT="$1"
+OUTPUT="$2"
+BUILD_OPTIONS="$3"
+VERSION_FILE="$4"
+
+. "${BUILD_OPTIONS}"
+. "${VERSION_FILE}"
+
+rm -f "$OUTPUT" "$OUTPUT+"
+sed \
+ -e "1s|#!.*/sh|#!$SHELL_PATH|" \
+ -e "s|@@SHELL_PATH@@|$SHELL_PATH|" \
+ -e "1,30s|^ exec wish | exec '$TCLTK_PATH' |" \
+ -e "s|@@GITGUI_VERSION@@|$GITGUI_VERSION|g" \
+ -e "s|@@GITGUI_RELATIVE@@|$GITGUI_RELATIVE|" \
+ -e "${GITGUI_RELATIVE}s|@@GITGUI_LIBDIR@@|$GITGUI_LIBDIR|" \
+ "$INPUT" >"$OUTPUT"+
+chmod +x "$OUTPUT"+
+mv "$OUTPUT"+ "$OUTPUT"
diff --git a/git-gui/generate-macos-app.sh b/git-gui/generate-macos-app.sh
new file mode 100755
index 0000000000..71b9fa67a4
--- /dev/null
+++ b/git-gui/generate-macos-app.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+set -e
+
+SOURCE_DIR="$1"
+OUTPUT="$2"
+BUILD_OPTIONS="$3"
+VERSION_FILE="$4"
+
+. "$BUILD_OPTIONS"
+. "$VERSION_FILE"
+
+rm -rf "$OUTPUT" "$OUTPUT+"
+
+mkdir -p "$OUTPUT+/Contents/MacOS"
+mkdir -p "$OUTPUT+/Contents/Resources/Scripts"
+
+cp "$TKEXECUTABLE" "$OUTPUT+/Contents/MacOS"
+cp "$SOURCE_DIR/macosx/git-gui.icns" "$OUTPUT+/Contents/Resources"
+sed \
+ -e "s/@@GITGUI_VERSION@@/$GITGUI_VERSION/g" \
+ -e "s/@@GITGUI_TKEXECUTABLE@@/$(basename "$TKEXECUTABLE")/g" \
+ "$SOURCE_DIR/macosx/Info.plist" \
+ >"$OUTPUT+/Contents/Info.plist"
+sed \
+ -e "s|@@gitexecdir@@|$GITGUI_GITEXECDIR|" \
+ -e "s|@@GITGUI_LIBDIR@@|$GITGUI_LIBDIR|" \
+ "$SOURCE_DIR/macosx/AppMain.tcl" \
+ >"$OUTPUT+/Contents/Resources/Scripts/AppMain.tcl"
+mv "$OUTPUT+" "$OUTPUT"
diff --git a/git-gui/generate-macos-wrapper.sh b/git-gui/generate-macos-wrapper.sh
new file mode 100755
index 0000000000..0304937f41
--- /dev/null
+++ b/git-gui/generate-macos-wrapper.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+set -e
+
+if test "$#" -ne 3
+then
+ echo >&2 "usage: $0 <OUTPUT> <BUILD_OPTIONS> <VERSION_FILE>"
+ exit 1
+fi
+
+OUTPUT="$1"
+BUILD_OPTIONS="$2"
+VERSION_FILE="$3"
+
+. "$BUILD_OPTIONS"
+
+rm -f "$OUTPUT" "$OUTPUT+"
+
+(
+ echo "#!$SHELL_PATH"
+ cat "$BUILD_OPTIONS" "$VERSION_FILE"
+ cat <<-'EOF'
+ if test "z$*" = zversion ||
+ test "z$*" = z--version
+ then
+ echo "git-gui version $GITGUI_VERSION"
+ else
+ libdir="${GIT_GUI_LIB_DIR:-$GITGUI_LIBDIR}"
+ exec "$libdir/Git Gui.app/Contents/MacOS/$(basename "$TKEXECUTABLE")" "$0" "$@"
+ fi
+ EOF
+) >"$OUTPUT+"
+
+chmod +x "$OUTPUT+"
+mv "$OUTPUT+" "$OUTPUT"
diff --git a/git-gui/generate-tclindex.sh b/git-gui/generate-tclindex.sh
new file mode 100755
index 0000000000..36e3a0bd90
--- /dev/null
+++ b/git-gui/generate-tclindex.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+if test "$#" -lt 3
+then
+ echo >&2 "usage: $0 <BUILD_DIR> <BUILD_OPTIONS> <LIBFILE> [<LIBFILE>...]"
+ exit 1
+fi
+
+BUILD_DIR="$1"
+BUILD_OPTIONS="$2"
+shift 2
+LIBFILES="$(echo "$@" | sort | sed 's|lib/||g')"
+
+. "$BUILD_OPTIONS"
+
+cd "$BUILD_DIR"
+
+if {
+ echo "source lib/class.tcl;"
+ echo "auto_mkindex lib $LIBFILES"
+} | "$TCL_PATH"
+then
+ : ok
+else
+ echo >&2 " * $TCL_PATH failed; using unoptimized loading"
+ rm -f $@
+ echo '# Autogenerated by git-gui Makefile' >lib/tclIndex
+ echo >>lib/tclIndex
+ echo "class.tcl" >>lib/tclIndex
+ printf "%s\n" $LIBFILES >>lib/tclIndex
+ echo >>lib/tclIndex
+fi
diff --git a/git-gui/lib/meson.build b/git-gui/lib/meson.build
new file mode 100644
index 0000000000..4b9efab774
--- /dev/null
+++ b/git-gui/lib/meson.build
@@ -0,0 +1,74 @@
+libfiles = [
+ 'about.tcl',
+ 'blame.tcl',
+ 'branch_checkout.tcl',
+ 'branch_create.tcl',
+ 'branch_delete.tcl',
+ 'branch_rename.tcl',
+ 'branch.tcl',
+ 'browser.tcl',
+ 'checkout_op.tcl',
+ 'choose_font.tcl',
+ 'choose_repository.tcl',
+ 'choose_rev.tcl',
+ 'chord.tcl',
+ 'class.tcl',
+ 'commit.tcl',
+ 'console.tcl',
+ 'database.tcl',
+ 'date.tcl',
+ 'diff.tcl',
+ 'encoding.tcl',
+ 'error.tcl',
+ 'index.tcl',
+ 'line.tcl',
+ 'logo.tcl',
+ 'merge.tcl',
+ 'mergetool.tcl',
+ 'option.tcl',
+ 'remote_add.tcl',
+ 'remote_branch_delete.tcl',
+ 'remote.tcl',
+ 'search.tcl',
+ 'shortcut.tcl',
+ 'spellcheck.tcl',
+ 'sshkey.tcl',
+ 'status_bar.tcl',
+ 'themed.tcl',
+ 'tools_dlg.tcl',
+ 'tools.tcl',
+ 'transport.tcl',
+ 'win32.tcl',
+]
+
+nontcl_libfiles = [
+ 'git-gui.ico',
+ 'win32_shortcut.js',
+]
+
+foreach file : libfiles + nontcl_libfiles
+ configure_file(
+ input: file,
+ output: file,
+ copy: true,
+ install: true,
+ install_dir: get_option('datadir') / 'git-gui/lib',
+ )
+endforeach
+
+custom_target(
+ output: 'tclIndex',
+ command: [
+ shell,
+ meson.project_source_root() / 'generate-tclindex.sh',
+ meson.project_build_root(),
+ meson.project_build_root() / 'GIT-GUI-BUILD-OPTIONS',
+ libfiles,
+ ],
+ depend_files: [
+ libfiles,
+ build_options,
+ ],
+ install: true,
+ install_dir: get_option('datadir') / 'git-gui/lib',
+)
diff --git a/git-gui/meson.build b/git-gui/meson.build
new file mode 100644
index 0000000000..cdae85e4b9
--- /dev/null
+++ b/git-gui/meson.build
@@ -0,0 +1,148 @@
+project('git-gui',
+ meson_version: '>=0.61.0',
+)
+
+fs = import('fs')
+
+shell = find_program('sh')
+tclsh = find_program('tclsh')
+wish = find_program('wish')
+
+build_options_config = configuration_data()
+if target_machine.system() == 'windows'
+ build_options_config.set('GITGUI_RELATIVE', '1')
+else
+ build_options_config.set('GITGUI_RELATIVE', '')
+endif
+build_options_config.set_quoted('GITGUI_GITEXECDIR', get_option('prefix') / get_option('libexecdir') / 'git-core')
+build_options_config.set_quoted('GITGUI_LIBDIR', get_option('prefix') / get_option('datadir') / 'git-gui/lib')
+build_options_config.set_quoted('SHELL_PATH', fs.as_posix(shell.full_path()))
+build_options_config.set_quoted('TCLTK_PATH', fs.as_posix(wish.full_path()))
+build_options_config.set_quoted('TCL_PATH', fs.as_posix(tclsh.full_path()))
+if target_machine.system() == 'darwin'
+ tkexecutables = [
+ '/Library/Frameworks/Tk.framework/Resources/Wish.app/Contents/MacOS/Wish',
+ '/System/Library/Frameworks/Tk.framework/Resources/Wish.app/Contents/MacOS/Wish',
+ '/System/Library/Frameworks/Tk.framework/Resources/Wish Shell.app/Contents/MacOS/Wish Shell',
+ ]
+ tkexecutable = find_program(tkexecutables)
+ build_options_config.set_quoted('TKEXECUTABLE', tkexecutable.full_path())
+else
+ build_options_config.set('TKEXECUTABLE', '')
+endif
+
+build_options = configure_file(
+ input: 'GIT-GUI-BUILD-OPTIONS.in',
+ output: 'GIT-GUI-BUILD-OPTIONS',
+ configuration: build_options_config,
+)
+
+version_file = custom_target(
+ input: 'GIT-VERSION-GEN',
+ output: 'GIT-VERSION-FILE',
+ command: [
+ shell,
+ '@INPUT@',
+ meson.current_source_dir(),
+ '@OUTPUT@',
+ ],
+ build_always_stale: true,
+)
+
+configure_file(
+ input: 'git-gui--askpass',
+ output: 'git-gui--askpass',
+ copy: true,
+ install: true,
+ install_dir: get_option('libexecdir') / 'git-core',
+)
+
+gitgui_main = 'git-gui'
+gitgui_main_install_dir = get_option('libexecdir') / 'git-core'
+
+if target_machine.system() == 'windows'
+ gitgui_main = 'git-gui.tcl'
+
+ configure_file(
+ input: 'windows/git-gui.sh',
+ output: 'git-gui',
+ copy: true,
+ install: true,
+ install_dir: get_option('libexecdir') / 'git-core',
+ )
+elif target_machine.system() == 'darwin'
+ gitgui_main = 'git-gui.tcl'
+ gitgui_main_install_dir = get_option('datadir') / 'git-gui/lib'
+
+ custom_target(
+ output: 'git-gui',
+ command: [
+ shell,
+ meson.current_source_dir() / 'generate-macos-wrapper.sh',
+ '@OUTPUT@',
+ meson.current_build_dir() / 'GIT-GUI-BUILD-OPTIONS',
+ meson.current_build_dir() / 'GIT-VERSION-FILE',
+ ],
+ depends: [
+ version_file,
+ ],
+ depend_files: [
+ build_options,
+ ],
+ install: true,
+ install_dir: get_option('libexecdir') / 'git-core',
+ )
+
+ custom_target(
+ output: 'Git Gui.app',
+ command: [
+ shell,
+ meson.current_source_dir() / 'generate-macos-app.sh',
+ meson.current_source_dir(),
+ meson.current_build_dir() / 'Git Gui.app',
+ meson.current_build_dir() / 'GIT-GUI-BUILD-OPTIONS',
+ meson.current_build_dir() / 'GIT-VERSION-FILE',
+ ],
+ depends: [
+ version_file,
+ ],
+ depend_files: [
+ build_options,
+ 'macosx/AppMain.tcl',
+ 'macosx/Info.plist',
+ 'macosx/git-gui.icns',
+ ],
+ build_by_default: true,
+ install: true,
+ install_dir: get_option('datadir') / 'git-gui/lib',
+ )
+endif
+
+custom_target(
+ input: 'git-gui.sh',
+ output: gitgui_main,
+ command: [
+ shell,
+ meson.current_source_dir() / 'generate-git-gui.sh',
+ '@INPUT@',
+ '@OUTPUT@',
+ meson.current_build_dir() / 'GIT-GUI-BUILD-OPTIONS',
+ meson.current_build_dir() / 'GIT-VERSION-FILE',
+ ],
+ depends: [
+ version_file,
+ ],
+ depend_files: [
+ build_options,
+ ],
+ install: true,
+ install_dir: gitgui_main_install_dir,
+)
+
+install_symlink('git-citool',
+ install_dir: get_option('libexecdir') / 'git-core',
+ pointing_to: 'git-gui',
+)
+
+subdir('lib')
+subdir('po')
diff --git a/git-gui/po/meson.build b/git-gui/po/meson.build
new file mode 100644
index 0000000000..00cae74338
--- /dev/null
+++ b/git-gui/po/meson.build
@@ -0,0 +1,38 @@
+languages = [
+ 'bg',
+ 'de',
+ 'el',
+ 'fr',
+ 'hu',
+ 'it',
+ 'ja',
+ 'nb',
+ 'pt_br',
+ 'pt_pt',
+ 'ru',
+ 'sv',
+ 'vi',
+ 'zh_cn',
+]
+
+msgfmt = find_program('msgfmt', required: false)
+if not msgfmt.found()
+ subdir_done()
+endif
+
+foreach language : languages
+ custom_target(
+ input: language + '.po',
+ output: language + '.msg',
+ command: [
+ msgfmt,
+ '--statistics',
+ '--tcl',
+ '--locale=' + language,
+ '-d', meson.current_build_dir(),
+ '@INPUT@',
+ ],
+ install: true,
+ install_dir: get_option('datadir') / 'git-gui/lib/msgs',
+ )
+endforeach