threads / patch / 63983

patch, 3 partsmeson: wire up gitk and git-gui

Subject: [PATCH 0/3] meson: wire up gitk and git-gui

## tl;dr

29 messages between Aug 19, 2025 and Feb 11, 2026. Diffs are folded; open one to read it.

replies: 28people: 6as markdown or json

Patrick Steinhardt· Aug 19, 2025, 08:18 UTC · lore
Hi,

I have upstreamed support for Meson into both gitk [1] and git-gui [2]. This small patch series wires up support in Git.

To the best of my knowledge this is the last missing piece for feature compatibility with our Makefile. As such, from my point of view, I think that we can stop treating the Meson build system as experimental and instead officially endorse it. Once merged I'll thus send another patch series that updates our documentation in various different places to also mention how to build Git with Meson.

Thanks!
Patrick

[1]: https://github.com/j6t/gitk/pull/8 [2]: https://github.com/j6t/git-gui/pull/9

---
Patrick Steinhardt (3):
      git-gui: move into "subprojects/"
      gitk: move into "subprojects/"
      meson: wire up gitk and git-gui
 Documentation/SubmittingPatches                       |   4 ++--
 Documentation/gitk.adoc                               |   2 +-
 Makefile                                              |  18 +++++++++---------
 meson.build                                           |  14 ++++++++++++++
 meson_options.txt                                     |   4 ++++
 subprojects/.gitignore                                |   2 ++
 {git-gui => subprojects/git-gui}/.gitattributes       |   0
 {git-gui => subprojects/git-gui}/.gitignore           |   0
 .../git-gui}/GIT-GUI-BUILD-OPTIONS.in                 |   0
 {git-gui => subprojects/git-gui}/GIT-VERSION-GEN      |   0
 {git-gui => subprojects/git-gui}/Makefile             |   0
 {git-gui => subprojects/git-gui}/README.md            |   0
 {git-gui => subprojects/git-gui}/generate-git-gui.sh  |   0
 {git-gui => subprojects/git-gui}/generate-script.sh   |   0
 {git-gui => subprojects/git-gui}/generate-tclindex.sh |   0
 {git-gui => subprojects/git-gui}/git-gui--askpass.sh  |   0
 {git-gui => subprojects/git-gui}/git-gui.sh           |   0
 {git-gui => subprojects/git-gui}/lib/about.tcl        |   0
 {git-gui => subprojects/git-gui}/lib/blame.tcl        |   0
 {git-gui => subprojects/git-gui}/lib/branch.tcl       |   0
 .../git-gui}/lib/branch_checkout.tcl                  |   0
 .../git-gui}/lib/branch_create.tcl                    |   0
 .../git-gui}/lib/branch_delete.tcl                    |   0
 .../git-gui}/lib/branch_rename.tcl                    |   0
 {git-gui => subprojects/git-gui}/lib/browser.tcl      |   0
 {git-gui => subprojects/git-gui}/lib/checkout_op.tcl  |   0
 {git-gui => subprojects/git-gui}/lib/choose_font.tcl  |   0
 .../git-gui}/lib/choose_repository.tcl                |   0
 {git-gui => subprojects/git-gui}/lib/choose_rev.tcl   |   0
 {git-gui => subprojects/git-gui}/lib/chord.tcl        |   0
 {git-gui => subprojects/git-gui}/lib/class.tcl        |   0
 {git-gui => subprojects/git-gui}/lib/commit.tcl       |   0
 {git-gui => subprojects/git-gui}/lib/console.tcl      |   0
 {git-gui => subprojects/git-gui}/lib/database.tcl     |   0
 {git-gui => subprojects/git-gui}/lib/date.tcl         |   0
 {git-gui => subprojects/git-gui}/lib/diff.tcl         |   0
 {git-gui => subprojects/git-gui}/lib/encoding.tcl     |   0
 {git-gui => subprojects/git-gui}/lib/error.tcl        |   0
 {git-gui => subprojects/git-gui}/lib/git-gui.ico      | Bin
 {git-gui => subprojects/git-gui}/lib/index.tcl        |   0
 {git-gui => subprojects/git-gui}/lib/line.tcl         |   0
 {git-gui => subprojects/git-gui}/lib/logo.tcl         |   0
 {git-gui => subprojects/git-gui}/lib/merge.tcl        |   0
 {git-gui => subprojects/git-gui}/lib/mergetool.tcl    |   0
 {git-gui => subprojects/git-gui}/lib/meson.build      |   0
 {git-gui => subprojects/git-gui}/lib/option.tcl       |   0
 {git-gui => subprojects/git-gui}/lib/remote.tcl       |   0
 {git-gui => subprojects/git-gui}/lib/remote_add.tcl   |   0
 .../git-gui}/lib/remote_branch_delete.tcl             |   0
 {git-gui => subprojects/git-gui}/lib/search.tcl       |   0
 {git-gui => subprojects/git-gui}/lib/shortcut.tcl     |   0
 {git-gui => subprojects/git-gui}/lib/spellcheck.tcl   |   0
 {git-gui => subprojects/git-gui}/lib/sshkey.tcl       |   0
 {git-gui => subprojects/git-gui}/lib/status_bar.tcl   |   0
 {git-gui => subprojects/git-gui}/lib/themed.tcl       |   0
 {git-gui => subprojects/git-gui}/lib/tools.tcl        |   0
 {git-gui => subprojects/git-gui}/lib/tools_dlg.tcl    |   0
 {git-gui => subprojects/git-gui}/lib/transport.tcl    |   0
 {git-gui => subprojects/git-gui}/lib/win32.tcl        |   0
 .../git-gui}/lib/win32_shortcut.js                    |   0
 {git-gui => subprojects/git-gui}/meson.build          |   0
 {git-gui => subprojects/git-gui}/po/.gitignore        |   0
 {git-gui => subprojects/git-gui}/po/README            |   0
 {git-gui => subprojects/git-gui}/po/bg.po             |   0
 {git-gui => subprojects/git-gui}/po/de.po             |   0
 {git-gui => subprojects/git-gui}/po/el.po             |   0
 {git-gui => subprojects/git-gui}/po/fr.po             |   0
 {git-gui => subprojects/git-gui}/po/glossary/Makefile |   0
 {git-gui => subprojects/git-gui}/po/glossary/bg.po    |   0
 {git-gui => subprojects/git-gui}/po/glossary/de.po    |   0
 {git-gui => subprojects/git-gui}/po/glossary/el.po    |   0
 {git-gui => subprojects/git-gui}/po/glossary/fr.po    |   0
 .../git-gui}/po/glossary/git-gui-glossary.pot         |   0
 .../git-gui}/po/glossary/git-gui-glossary.txt         |   0
 {git-gui => subprojects/git-gui}/po/glossary/it.po    |   0
 {git-gui => subprojects/git-gui}/po/glossary/pt_br.po |   0
 {git-gui => subprojects/git-gui}/po/glossary/pt_pt.po |   0
 .../git-gui}/po/glossary/txt-to-pot.sh                |   0
 {git-gui => subprojects/git-gui}/po/glossary/zh_cn.po |   0
 {git-gui => subprojects/git-gui}/po/hu.po             |   0
 {git-gui => subprojects/git-gui}/po/it.po             |   0
 {git-gui => subprojects/git-gui}/po/ja.po             |   0
 {git-gui => subprojects/git-gui}/po/meson.build       |   0
 {git-gui => subprojects/git-gui}/po/nb.po             |   0
 {git-gui => subprojects/git-gui}/po/po2msg.sh         |   0
 {git-gui => subprojects/git-gui}/po/pt_br.po          |   0
 {git-gui => subprojects/git-gui}/po/pt_pt.po          |   0
 {git-gui => subprojects/git-gui}/po/ru.po             |   0
 {git-gui => subprojects/git-gui}/po/sv.po             |   0
 {git-gui => subprojects/git-gui}/po/vi.po             |   0
 {git-gui => subprojects/git-gui}/po/zh_cn.po          |   0
 {git-gui => subprojects/git-gui}/windows/git-gui.sh   |   0
 {gitk-git => subprojects/gitk}/.gitignore             |   0
 {gitk-git => subprojects/gitk}/Makefile               |   0
 {gitk-git => subprojects/gitk}/generate-tcl.sh        |   0
 {gitk-git => subprojects/gitk}/gitk                   |   0
 {gitk-git => subprojects/gitk}/meson.build            |   0
 {gitk-git => subprojects/gitk}/po/.gitignore          |   0
 {gitk-git => subprojects/gitk}/po/bg.po               |   0
 {gitk-git => subprojects/gitk}/po/ca.po               |   0
 {gitk-git => subprojects/gitk}/po/de.po               |   0
 {gitk-git => subprojects/gitk}/po/es.po               |   0
 {gitk-git => subprojects/gitk}/po/fr.po               |   0
 {gitk-git => subprojects/gitk}/po/hu.po               |   0
 {gitk-git => subprojects/gitk}/po/it.po               |   0
 {gitk-git => subprojects/gitk}/po/ja.po               |   0
 {gitk-git => subprojects/gitk}/po/meson.build         |   0
 {gitk-git => subprojects/gitk}/po/po2msg.sh           |   0
 {gitk-git => subprojects/gitk}/po/pt_br.po            |   0
 {gitk-git => subprojects/gitk}/po/pt_pt.po            |   0
 {gitk-git => subprojects/gitk}/po/ru.po               |   0
 {gitk-git => subprojects/gitk}/po/sv.po               |   0
 {gitk-git => subprojects/gitk}/po/ta.po               |   0
 {gitk-git => subprojects/gitk}/po/vi.po               |   0
 {gitk-git => subprojects/gitk}/po/zh_cn.po            |   0
 115 files changed, 32 insertions(+), 12 deletions(-)

--- base-commit: c44beea485f0f2feaf460e2ac87fdd5608d63cf0 change-id: 20250703-b4-pks-meson-tcl-tk-bb75616c8048

Patrick Steinhardt· Aug 19, 2025, 08:18 UTC · re: Patrick Steinhardt · lore

[PATCH 1/3] git-gui: move into "subprojects/"

The "git-gui" project has recently gained support for being built with Meson, but it is not yet wired up in Git's own Meson build instructions. "git-gui" itself is wired up as a standalone project, which means that we can trivially make it available via `subproject("git-gui")`.

So far the theory. In practice thoguh the `subproject()` function comes with a couple of limitations. Most importantly, all subprojects need to be contained in the same directory, and that directory cannot be the top-level directory of the parent project. Right now we use the default subproject directory ("subprojects/") for a couple of fallbacks in case some important dependencies couldn't be found.

This means that we cannot just include the "git-gui" directory as a subproject as it lives in our root directory. There are three options:

  - We move "git-gui" into "subprojects/". It requires a bit of churn,
    but should otherwise not have any significant downsides.
  - We create a symlink pointing from "subprojects/git-gui" to the
    top-level directory. This may not work on Windows.
  - We can create a "git-gui.wrap" file that knows to pull a specific
    commit from upstream and build it. This would mean that Meson and
    Makefiles now have different sources of truth for which version of
    "git-gui" we build.

The first option feels like the most sensible solution. It creates churn and requires us to adapt the pull-request workflow a bit. But this should be a one-time cost.

In theory we could also rename the "subprojects/" directory by passing the "subproject_dir" argument to our `project()` call. But the name feels quite fitting for our purpose, as well.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 Documentation/SubmittingPatches                             |   2 +-
 Makefile                                                    |  12 ++++++------
 subprojects/.gitignore                                      |   1 +
 {git-gui => subprojects/git-gui}/.gitattributes             |   0
 {git-gui => subprojects/git-gui}/.gitignore                 |   0
 {git-gui => subprojects/git-gui}/GIT-GUI-BUILD-OPTIONS.in   |   0
 {git-gui => subprojects/git-gui}/GIT-VERSION-GEN            |   0
 {git-gui => subprojects/git-gui}/Makefile                   |   0
 {git-gui => subprojects/git-gui}/README.md                  |   0
 {git-gui => subprojects/git-gui}/generate-git-gui.sh        |   0
 {git-gui => subprojects/git-gui}/generate-script.sh         |   0
 {git-gui => subprojects/git-gui}/generate-tclindex.sh       |   0
 {git-gui => subprojects/git-gui}/git-gui--askpass.sh        |   0
 {git-gui => subprojects/git-gui}/git-gui.sh                 |   0
 {git-gui => subprojects/git-gui}/lib/about.tcl              |   0
 {git-gui => subprojects/git-gui}/lib/blame.tcl              |   0
 {git-gui => subprojects/git-gui}/lib/branch.tcl             |   0
 {git-gui => subprojects/git-gui}/lib/branch_checkout.tcl    |   0
 {git-gui => subprojects/git-gui}/lib/branch_create.tcl      |   0
 {git-gui => subprojects/git-gui}/lib/branch_delete.tcl      |   0
 {git-gui => subprojects/git-gui}/lib/branch_rename.tcl      |   0
 {git-gui => subprojects/git-gui}/lib/browser.tcl            |   0
 {git-gui => subprojects/git-gui}/lib/checkout_op.tcl        |   0
 {git-gui => subprojects/git-gui}/lib/choose_font.tcl        |   0
 {git-gui => subprojects/git-gui}/lib/choose_repository.tcl  |   0
 {git-gui => subprojects/git-gui}/lib/choose_rev.tcl         |   0
 {git-gui => subprojects/git-gui}/lib/chord.tcl              |   0
 {git-gui => subprojects/git-gui}/lib/class.tcl              |   0
 {git-gui => subprojects/git-gui}/lib/commit.tcl             |   0
 {git-gui => subprojects/git-gui}/lib/console.tcl            |   0
 {git-gui => subprojects/git-gui}/lib/database.tcl           |   0
 {git-gui => subprojects/git-gui}/lib/date.tcl               |   0
 {git-gui => subprojects/git-gui}/lib/diff.tcl               |   0
 {git-gui => subprojects/git-gui}/lib/encoding.tcl           |   0
 {git-gui => subprojects/git-gui}/lib/error.tcl              |   0
 {git-gui => subprojects/git-gui}/lib/git-gui.ico            | Bin
 {git-gui => subprojects/git-gui}/lib/index.tcl              |   0
 {git-gui => subprojects/git-gui}/lib/line.tcl               |   0
 {git-gui => subprojects/git-gui}/lib/logo.tcl               |   0
 {git-gui => subprojects/git-gui}/lib/merge.tcl              |   0
 {git-gui => subprojects/git-gui}/lib/mergetool.tcl          |   0
 {git-gui => subprojects/git-gui}/lib/meson.build            |   0
 {git-gui => subprojects/git-gui}/lib/option.tcl             |   0
 {git-gui => subprojects/git-gui}/lib/remote.tcl             |   0
 {git-gui => subprojects/git-gui}/lib/remote_add.tcl         |   0
 .../git-gui}/lib/remote_branch_delete.tcl                   |   0
 {git-gui => subprojects/git-gui}/lib/search.tcl             |   0
 {git-gui => subprojects/git-gui}/lib/shortcut.tcl           |   0
 {git-gui => subprojects/git-gui}/lib/spellcheck.tcl         |   0
 {git-gui => subprojects/git-gui}/lib/sshkey.tcl             |   0
 {git-gui => subprojects/git-gui}/lib/status_bar.tcl         |   0
 {git-gui => subprojects/git-gui}/lib/themed.tcl             |   0
 {git-gui => subprojects/git-gui}/lib/tools.tcl              |   0
 {git-gui => subprojects/git-gui}/lib/tools_dlg.tcl          |   0
 {git-gui => subprojects/git-gui}/lib/transport.tcl          |   0
 {git-gui => subprojects/git-gui}/lib/win32.tcl              |   0
 {git-gui => subprojects/git-gui}/lib/win32_shortcut.js      |   0
 {git-gui => subprojects/git-gui}/meson.build                |   0
 {git-gui => subprojects/git-gui}/po/.gitignore              |   0
 {git-gui => subprojects/git-gui}/po/README                  |   0
 {git-gui => subprojects/git-gui}/po/bg.po                   |   0
 {git-gui => subprojects/git-gui}/po/de.po                   |   0
 {git-gui => subprojects/git-gui}/po/el.po                   |   0
 {git-gui => subprojects/git-gui}/po/fr.po                   |   0
 {git-gui => subprojects/git-gui}/po/glossary/Makefile       |   0
 {git-gui => subprojects/git-gui}/po/glossary/bg.po          |   0
 {git-gui => subprojects/git-gui}/po/glossary/de.po          |   0
 {git-gui => subprojects/git-gui}/po/glossary/el.po          |   0
 {git-gui => subprojects/git-gui}/po/glossary/fr.po          |   0
 .../git-gui}/po/glossary/git-gui-glossary.pot               |   0
 .../git-gui}/po/glossary/git-gui-glossary.txt               |   0
 {git-gui => subprojects/git-gui}/po/glossary/it.po          |   0
 {git-gui => subprojects/git-gui}/po/glossary/pt_br.po       |   0
 {git-gui => subprojects/git-gui}/po/glossary/pt_pt.po       |   0
 {git-gui => subprojects/git-gui}/po/glossary/txt-to-pot.sh  |   0
 {git-gui => subprojects/git-gui}/po/glossary/zh_cn.po       |   0
 {git-gui => subprojects/git-gui}/po/hu.po                   |   0
 {git-gui => subprojects/git-gui}/po/it.po                   |   0
 {git-gui => subprojects/git-gui}/po/ja.po                   |   0
 {git-gui => subprojects/git-gui}/po/meson.build             |   0
 {git-gui => subprojects/git-gui}/po/nb.po                   |   0
 {git-gui => subprojects/git-gui}/po/po2msg.sh               |   0
 {git-gui => subprojects/git-gui}/po/pt_br.po                |   0
 {git-gui => subprojects/git-gui}/po/pt_pt.po                |   0
 {git-gui => subprojects/git-gui}/po/ru.po                   |   0
 {git-gui => subprojects/git-gui}/po/sv.po                   |   0
 {git-gui => subprojects/git-gui}/po/vi.po                   |   0
 {git-gui => subprojects/git-gui}/po/zh_cn.po                |   0
 {git-gui => subprojects/git-gui}/windows/git-gui.sh         |   0
 89 files changed, 8 insertions(+), 7 deletions(-)
Show changes to 89 files +8 −7

Documentation/SubmittingPatches, Makefile, subprojects/.gitignore, git-gui/.gitattributes, git-gui/.gitignore, git-gui/GIT-GUI-BUILD-OPTIONS.in, git-gui/GIT-VERSION-GEN, git-gui/Makefile, git-gui/README.md, git-gui/generate-git-gui.sh, git-gui/generate-script.sh, git-gui/generate-tclindex.sh, git-gui/git-gui--askpass.sh, git-gui/git-gui.sh, git-gui/lib/about.tcl, git-gui/lib/blame.tcl, git-gui/lib/branch.tcl, git-gui/lib/branch_checkout.tcl, git-gui/lib/branch_create.tcl, git-gui/lib/branch_delete.tcl, git-gui/lib/branch_rename.tcl, git-gui/lib/browser.tcl, git-gui/lib/checkout_op.tcl, git-gui/lib/choose_font.tcl, git-gui/lib/choose_repository.tcl, git-gui/lib/choose_rev.tcl, git-gui/lib/chord.tcl, git-gui/lib/class.tcl, git-gui/lib/commit.tcl, git-gui/lib/console.tcl, git-gui/lib/database.tcl, git-gui/lib/date.tcl, git-gui/lib/diff.tcl, git-gui/lib/encoding.tcl, git-gui/lib/error.tcl, git-gui/lib/git-gui.ico, git-gui/lib/index.tcl, git-gui/lib/line.tcl, git-gui/lib/logo.tcl, git-gui/lib/merge.tcl, git-gui/lib/mergetool.tcl, git-gui/lib/meson.build, git-gui/lib/option.tcl, git-gui/lib/remote.tcl, git-gui/lib/remote_add.tcl, git-gui/lib/remote_branch_delete.tcl, git-gui/lib/search.tcl, git-gui/lib/shortcut.tcl, git-gui/lib/spellcheck.tcl, git-gui/lib/sshkey.tcl, git-gui/lib/status_bar.tcl, git-gui/lib/themed.tcl, git-gui/lib/tools.tcl, git-gui/lib/tools_dlg.tcl, git-gui/lib/transport.tcl, git-gui/lib/win32.tcl, git-gui/lib/win32_shortcut.js, git-gui/meson.build, git-gui/po/.gitignore, git-gui/po/README, git-gui/po/bg.po, git-gui/po/de.po, git-gui/po/el.po, git-gui/po/fr.po, git-gui/po/glossary/Makefile, git-gui/po/glossary/bg.po, git-gui/po/glossary/de.po, git-gui/po/glossary/el.po, git-gui/po/glossary/fr.po, git-gui/po/glossary/git-gui-glossary.pot, git-gui/po/glossary/git-gui-glossary.txt, git-gui/po/glossary/it.po, git-gui/po/glossary/pt_br.po, git-gui/po/glossary/pt_pt.po, git-gui/po/glossary/txt-to-pot.sh, git-gui/po/glossary/zh_cn.po, git-gui/po/hu.po, git-gui/po/it.po, git-gui/po/ja.po, git-gui/po/meson.build, git-gui/po/nb.po, git-gui/po/po2msg.sh, git-gui/po/pt_br.po, git-gui/po/pt_pt.po, git-gui/po/ru.po, git-gui/po/sv.po, git-gui/po/vi.po, git-gui/po/zh_cn.po, git-gui/windows/git-gui.sh

diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches
index 86ca7f6a78a..3aca70728c7 100644
--- a/Documentation/SubmittingPatches
+++ b/Documentation/SubmittingPatches
@@ -699,7 +699,7 @@ rebase when I receive your patches).
 Some parts of the system have dedicated maintainers with their own
 repositories.
 
-- `git-gui/` comes from the git-gui project, maintained by Johannes Sixt:
+- `subprojects/git-gui/` comes from the git-gui project, maintained by Johannes Sixt:
 
         https://github.com/j6t/git-gui
 
diff --git a/Makefile b/Makefile
index e11340c1ae7..834b79ca7ec 100644
--- a/Makefile
+++ b/Makefile
@@ -2457,7 +2457,7 @@ endif
 
 all::
 ifndef NO_TCLTK
-	$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
+	$(QUIET_SUBDIR0)subprojects/git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
 	$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
 endif
 	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
@@ -3569,7 +3569,7 @@ ifndef NO_PERL
 endif
 ifndef NO_TCLTK
 	$(MAKE) -C gitk-git install
-	$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
+	$(MAKE) -C subprojects/git-gui gitexecdir='$(gitexec_instdir_SQ)' install
 endif
 ifneq (,$X)
 	$(foreach p,$(patsubst %$X,%,$(filter %$X,$(ALL_COMMANDS_TO_INSTALL) $(OTHER_PROGRAMS))), test '$(DESTDIR_SQ)$(gitexec_instdir_SQ)/$p' -ef '$(DESTDIR_SQ)$(gitexec_instdir_SQ)/$p$X' || $(RM) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)/$p';)
@@ -3665,8 +3665,8 @@ GIT_ARCHIVE_EXTRA_FILES = \
 	--prefix=$(GIT_TARNAME)/ \
 	--add-file=configure \
 	--add-file=.dist-tmp-dir/version \
-	--prefix=$(GIT_TARNAME)/git-gui/ \
-	--add-file=.dist-tmp-dir/git-gui/version
+	--prefix=$(GIT_TARNAME)/subprojects/git-gui/ \
+	--add-file=.dist-tmp-dir/subprojects/git-gui/version
 ifdef DC_SHA1_SUBMODULE
 GIT_ARCHIVE_EXTRA_FILES += \
 	--prefix=$(GIT_TARNAME)/sha1collisiondetection/ \
@@ -3681,7 +3681,7 @@ dist: git-archive$(X) configure
 	@$(RM) -r .dist-tmp-dir
 	@mkdir .dist-tmp-dir
 	@echo $(GIT_VERSION) > .dist-tmp-dir/version
-	@$(MAKE) -C git-gui TARDIR=../.dist-tmp-dir/git-gui dist-version
+	@$(MAKE) -C subprojects/git-gui TARDIR=../.dist-tmp-dir/subprojects/git-gui dist-version
 	./git-archive --format=tar \
 		$(GIT_ARCHIVE_EXTRA_FILES) \
 		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
@@ -3787,7 +3787,7 @@ endif
 	$(MAKE) -C t/ clean
 ifndef NO_TCLTK
 	$(MAKE) -C gitk-git clean
-	$(MAKE) -C git-gui clean
+	$(MAKE) -C subprojects/git-gui clean
 endif
 	$(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS
 	$(RM) GIT-USER-AGENT GIT-PREFIX
diff --git a/subprojects/.gitignore b/subprojects/.gitignore
index 63ea916ef5f..96388dbdd22 100644
--- a/subprojects/.gitignore
+++ b/subprojects/.gitignore
@@ -1 +1,2 @@
 /*/
+!/git-gui/
diff --git a/git-gui/.gitattributes b/subprojects/git-gui/.gitattributes
similarity index 100%
rename from git-gui/.gitattributes
rename to subprojects/git-gui/.gitattributes
diff --git a/git-gui/.gitignore b/subprojects/git-gui/.gitignore
similarity index 100%
rename from git-gui/.gitignore
rename to subprojects/git-gui/.gitignore
diff --git a/git-gui/GIT-GUI-BUILD-OPTIONS.in b/subprojects/git-gui/GIT-GUI-BUILD-OPTIONS.in
similarity index 100%
rename from git-gui/GIT-GUI-BUILD-OPTIONS.in
rename to subprojects/git-gui/GIT-GUI-BUILD-OPTIONS.in
diff --git a/git-gui/GIT-VERSION-GEN b/subprojects/git-gui/GIT-VERSION-GEN
similarity index 100%
rename from git-gui/GIT-VERSION-GEN
rename to subprojects/git-gui/GIT-VERSION-GEN
diff --git a/git-gui/Makefile b/subprojects/git-gui/Makefile
similarity index 100%
rename from git-gui/Makefile
rename to subprojects/git-gui/Makefile
diff --git a/git-gui/README.md b/subprojects/git-gui/README.md
similarity index 100%
rename from git-gui/README.md
rename to subprojects/git-gui/README.md
diff --git a/git-gui/generate-git-gui.sh b/subprojects/git-gui/generate-git-gui.sh
similarity index 100%
rename from git-gui/generate-git-gui.sh
rename to subprojects/git-gui/generate-git-gui.sh
diff --git a/git-gui/generate-script.sh b/subprojects/git-gui/generate-script.sh
similarity index 100%
rename from git-gui/generate-script.sh
rename to subprojects/git-gui/generate-script.sh
diff --git a/git-gui/generate-tclindex.sh b/subprojects/git-gui/generate-tclindex.sh
similarity index 100%
rename from git-gui/generate-tclindex.sh
rename to subprojects/git-gui/generate-tclindex.sh
diff --git a/git-gui/git-gui--askpass.sh b/subprojects/git-gui/git-gui--askpass.sh
similarity index 100%
rename from git-gui/git-gui--askpass.sh
rename to subprojects/git-gui/git-gui--askpass.sh
diff --git a/git-gui/git-gui.sh b/subprojects/git-gui/git-gui.sh
similarity index 100%
rename from git-gui/git-gui.sh
rename to subprojects/git-gui/git-gui.sh
diff --git a/git-gui/lib/about.tcl b/subprojects/git-gui/lib/about.tcl
similarity index 100%
rename from git-gui/lib/about.tcl
rename to subprojects/git-gui/lib/about.tcl
diff --git a/git-gui/lib/blame.tcl b/subprojects/git-gui/lib/blame.tcl
similarity index 100%
rename from git-gui/lib/blame.tcl
rename to subprojects/git-gui/lib/blame.tcl
diff --git a/git-gui/lib/branch.tcl b/subprojects/git-gui/lib/branch.tcl
similarity index 100%
rename from git-gui/lib/branch.tcl
rename to subprojects/git-gui/lib/branch.tcl
diff --git a/git-gui/lib/branch_checkout.tcl b/subprojects/git-gui/lib/branch_checkout.tcl
similarity index 100%
rename from git-gui/lib/branch_checkout.tcl
rename to subprojects/git-gui/lib/branch_checkout.tcl
diff --git a/git-gui/lib/branch_create.tcl b/subprojects/git-gui/lib/branch_create.tcl
similarity index 100%
rename from git-gui/lib/branch_create.tcl
rename to subprojects/git-gui/lib/branch_create.tcl
diff --git a/git-gui/lib/branch_delete.tcl b/subprojects/git-gui/lib/branch_delete.tcl
similarity index 100%
rename from git-gui/lib/branch_delete.tcl
rename to subprojects/git-gui/lib/branch_delete.tcl
diff --git a/git-gui/lib/branch_rename.tcl b/subprojects/git-gui/lib/branch_rename.tcl
similarity index 100%
rename from git-gui/lib/branch_rename.tcl
rename to subprojects/git-gui/lib/branch_rename.tcl
diff --git a/git-gui/lib/browser.tcl b/subprojects/git-gui/lib/browser.tcl
similarity index 100%
rename from git-gui/lib/browser.tcl
rename to subprojects/git-gui/lib/browser.tcl
diff --git a/git-gui/lib/checkout_op.tcl b/subprojects/git-gui/lib/checkout_op.tcl
similarity index 100%
rename from git-gui/lib/checkout_op.tcl
rename to subprojects/git-gui/lib/checkout_op.tcl
diff --git a/git-gui/lib/choose_font.tcl b/subprojects/git-gui/lib/choose_font.tcl
similarity index 100%
rename from git-gui/lib/choose_font.tcl
rename to subprojects/git-gui/lib/choose_font.tcl
diff --git a/git-gui/lib/choose_repository.tcl b/subprojects/git-gui/lib/choose_repository.tcl
similarity index 100%
rename from git-gui/lib/choose_repository.tcl
rename to subprojects/git-gui/lib/choose_repository.tcl
diff --git a/git-gui/lib/choose_rev.tcl b/subprojects/git-gui/lib/choose_rev.tcl
similarity index 100%
rename from git-gui/lib/choose_rev.tcl
rename to subprojects/git-gui/lib/choose_rev.tcl
diff --git a/git-gui/lib/chord.tcl b/subprojects/git-gui/lib/chord.tcl
similarity index 100%
rename from git-gui/lib/chord.tcl
rename to subprojects/git-gui/lib/chord.tcl
diff --git a/git-gui/lib/class.tcl b/subprojects/git-gui/lib/class.tcl
similarity index 100%
rename from git-gui/lib/class.tcl
rename to subprojects/git-gui/lib/class.tcl
diff --git a/git-gui/lib/commit.tcl b/subprojects/git-gui/lib/commit.tcl
similarity index 100%
rename from git-gui/lib/commit.tcl
rename to subprojects/git-gui/lib/commit.tcl
diff --git a/git-gui/lib/console.tcl b/subprojects/git-gui/lib/console.tcl
similarity index 100%
rename from git-gui/lib/console.tcl
rename to subprojects/git-gui/lib/console.tcl
diff --git a/git-gui/lib/database.tcl b/subprojects/git-gui/lib/database.tcl
similarity index 100%
rename from git-gui/lib/database.tcl
rename to subprojects/git-gui/lib/database.tcl
diff --git a/git-gui/lib/date.tcl b/subprojects/git-gui/lib/date.tcl
similarity index 100%
rename from git-gui/lib/date.tcl
rename to subprojects/git-gui/lib/date.tcl
diff --git a/git-gui/lib/diff.tcl b/subprojects/git-gui/lib/diff.tcl
similarity index 100%
rename from git-gui/lib/diff.tcl
rename to subprojects/git-gui/lib/diff.tcl
diff --git a/git-gui/lib/encoding.tcl b/subprojects/git-gui/lib/encoding.tcl
similarity index 100%
rename from git-gui/lib/encoding.tcl
rename to subprojects/git-gui/lib/encoding.tcl
diff --git a/git-gui/lib/error.tcl b/subprojects/git-gui/lib/error.tcl
similarity index 100%
rename from git-gui/lib/error.tcl
rename to subprojects/git-gui/lib/error.tcl
diff --git a/git-gui/lib/git-gui.ico b/subprojects/git-gui/lib/git-gui.ico
similarity index 100%
rename from git-gui/lib/git-gui.ico
rename to subprojects/git-gui/lib/git-gui.ico
diff --git a/git-gui/lib/index.tcl b/subprojects/git-gui/lib/index.tcl
similarity index 100%
rename from git-gui/lib/index.tcl
rename to subprojects/git-gui/lib/index.tcl
diff --git a/git-gui/lib/line.tcl b/subprojects/git-gui/lib/line.tcl
similarity index 100%
rename from git-gui/lib/line.tcl
rename to subprojects/git-gui/lib/line.tcl
diff --git a/git-gui/lib/logo.tcl b/subprojects/git-gui/lib/logo.tcl
similarity index 100%
rename from git-gui/lib/logo.tcl
rename to subprojects/git-gui/lib/logo.tcl
diff --git a/git-gui/lib/merge.tcl b/subprojects/git-gui/lib/merge.tcl
similarity index 100%
rename from git-gui/lib/merge.tcl
rename to subprojects/git-gui/lib/merge.tcl
diff --git a/git-gui/lib/mergetool.tcl b/subprojects/git-gui/lib/mergetool.tcl
similarity index 100%
rename from git-gui/lib/mergetool.tcl
rename to subprojects/git-gui/lib/mergetool.tcl
diff --git a/git-gui/lib/meson.build b/subprojects/git-gui/lib/meson.build
similarity index 100%
rename from git-gui/lib/meson.build
rename to subprojects/git-gui/lib/meson.build
diff --git a/git-gui/lib/option.tcl b/subprojects/git-gui/lib/option.tcl
similarity index 100%
rename from git-gui/lib/option.tcl
rename to subprojects/git-gui/lib/option.tcl
diff --git a/git-gui/lib/remote.tcl b/subprojects/git-gui/lib/remote.tcl
similarity index 100%
rename from git-gui/lib/remote.tcl
rename to subprojects/git-gui/lib/remote.tcl
diff --git a/git-gui/lib/remote_add.tcl b/subprojects/git-gui/lib/remote_add.tcl
similarity index 100%
rename from git-gui/lib/remote_add.tcl
rename to subprojects/git-gui/lib/remote_add.tcl
diff --git a/git-gui/lib/remote_branch_delete.tcl b/subprojects/git-gui/lib/remote_branch_delete.tcl
similarity index 100%
rename from git-gui/lib/remote_branch_delete.tcl
rename to subprojects/git-gui/lib/remote_branch_delete.tcl
diff --git a/git-gui/lib/search.tcl b/subprojects/git-gui/lib/search.tcl
similarity index 100%
rename from git-gui/lib/search.tcl
rename to subprojects/git-gui/lib/search.tcl
diff --git a/git-gui/lib/shortcut.tcl b/subprojects/git-gui/lib/shortcut.tcl
similarity index 100%
rename from git-gui/lib/shortcut.tcl
rename to subprojects/git-gui/lib/shortcut.tcl
diff --git a/git-gui/lib/spellcheck.tcl b/subprojects/git-gui/lib/spellcheck.tcl
similarity index 100%
rename from git-gui/lib/spellcheck.tcl
rename to subprojects/git-gui/lib/spellcheck.tcl
diff --git a/git-gui/lib/sshkey.tcl b/subprojects/git-gui/lib/sshkey.tcl
similarity index 100%
rename from git-gui/lib/sshkey.tcl
rename to subprojects/git-gui/lib/sshkey.tcl
diff --git a/git-gui/lib/status_bar.tcl b/subprojects/git-gui/lib/status_bar.tcl
similarity index 100%
rename from git-gui/lib/status_bar.tcl
rename to subprojects/git-gui/lib/status_bar.tcl
diff --git a/git-gui/lib/themed.tcl b/subprojects/git-gui/lib/themed.tcl
similarity index 100%
rename from git-gui/lib/themed.tcl
rename to subprojects/git-gui/lib/themed.tcl
diff --git a/git-gui/lib/tools.tcl b/subprojects/git-gui/lib/tools.tcl
similarity index 100%
rename from git-gui/lib/tools.tcl
rename to subprojects/git-gui/lib/tools.tcl
diff --git a/git-gui/lib/tools_dlg.tcl b/subprojects/git-gui/lib/tools_dlg.tcl
similarity index 100%
rename from git-gui/lib/tools_dlg.tcl
rename to subprojects/git-gui/lib/tools_dlg.tcl
diff --git a/git-gui/lib/transport.tcl b/subprojects/git-gui/lib/transport.tcl
similarity index 100%
rename from git-gui/lib/transport.tcl
rename to subprojects/git-gui/lib/transport.tcl
diff --git a/git-gui/lib/win32.tcl b/subprojects/git-gui/lib/win32.tcl
similarity index 100%
rename from git-gui/lib/win32.tcl
rename to subprojects/git-gui/lib/win32.tcl
diff --git a/git-gui/lib/win32_shortcut.js b/subprojects/git-gui/lib/win32_shortcut.js
similarity index 100%
rename from git-gui/lib/win32_shortcut.js
rename to subprojects/git-gui/lib/win32_shortcut.js
diff --git a/git-gui/meson.build b/subprojects/git-gui/meson.build
similarity index 100%
rename from git-gui/meson.build
rename to subprojects/git-gui/meson.build
diff --git a/git-gui/po/.gitignore b/subprojects/git-gui/po/.gitignore
similarity index 100%
rename from git-gui/po/.gitignore
rename to subprojects/git-gui/po/.gitignore
diff --git a/git-gui/po/README b/subprojects/git-gui/po/README
similarity index 100%
rename from git-gui/po/README
rename to subprojects/git-gui/po/README
diff --git a/git-gui/po/bg.po b/subprojects/git-gui/po/bg.po
similarity index 100%
rename from git-gui/po/bg.po
rename to subprojects/git-gui/po/bg.po
diff --git a/git-gui/po/de.po b/subprojects/git-gui/po/de.po
similarity index 100%
rename from git-gui/po/de.po
rename to subprojects/git-gui/po/de.po
diff --git a/git-gui/po/el.po b/subprojects/git-gui/po/el.po
similarity index 100%
rename from git-gui/po/el.po
rename to subprojects/git-gui/po/el.po
diff --git a/git-gui/po/fr.po b/subprojects/git-gui/po/fr.po
similarity index 100%
rename from git-gui/po/fr.po
rename to subprojects/git-gui/po/fr.po
diff --git a/git-gui/po/glossary/Makefile b/subprojects/git-gui/po/glossary/Makefile
similarity index 100%
rename from git-gui/po/glossary/Makefile
rename to subprojects/git-gui/po/glossary/Makefile
diff --git a/git-gui/po/glossary/bg.po b/subprojects/git-gui/po/glossary/bg.po
similarity index 100%
rename from git-gui/po/glossary/bg.po
rename to subprojects/git-gui/po/glossary/bg.po
diff --git a/git-gui/po/glossary/de.po b/subprojects/git-gui/po/glossary/de.po
similarity index 100%
rename from git-gui/po/glossary/de.po
rename to subprojects/git-gui/po/glossary/de.po
diff --git a/git-gui/po/glossary/el.po b/subprojects/git-gui/po/glossary/el.po
similarity index 100%
rename from git-gui/po/glossary/el.po
rename to subprojects/git-gui/po/glossary/el.po
diff --git a/git-gui/po/glossary/fr.po b/subprojects/git-gui/po/glossary/fr.po
similarity index 100%
rename from git-gui/po/glossary/fr.po
rename to subprojects/git-gui/po/glossary/fr.po
diff --git a/git-gui/po/glossary/git-gui-glossary.pot b/subprojects/git-gui/po/glossary/git-gui-glossary.pot
similarity index 100%
rename from git-gui/po/glossary/git-gui-glossary.pot
rename to subprojects/git-gui/po/glossary/git-gui-glossary.pot
diff --git a/git-gui/po/glossary/git-gui-glossary.txt b/subprojects/git-gui/po/glossary/git-gui-glossary.txt
similarity index 100%
rename from git-gui/po/glossary/git-gui-glossary.txt
rename to subprojects/git-gui/po/glossary/git-gui-glossary.txt
diff --git a/git-gui/po/glossary/it.po b/subprojects/git-gui/po/glossary/it.po
similarity index 100%
rename from git-gui/po/glossary/it.po
rename to subprojects/git-gui/po/glossary/it.po
diff --git a/git-gui/po/glossary/pt_br.po b/subprojects/git-gui/po/glossary/pt_br.po
similarity index 100%
rename from git-gui/po/glossary/pt_br.po
rename to subprojects/git-gui/po/glossary/pt_br.po
diff --git a/git-gui/po/glossary/pt_pt.po b/subprojects/git-gui/po/glossary/pt_pt.po
similarity index 100%
rename from git-gui/po/glossary/pt_pt.po
rename to subprojects/git-gui/po/glossary/pt_pt.po
diff --git a/git-gui/po/glossary/txt-to-pot.sh b/subprojects/git-gui/po/glossary/txt-to-pot.sh
similarity index 100%
rename from git-gui/po/glossary/txt-to-pot.sh
rename to subprojects/git-gui/po/glossary/txt-to-pot.sh
diff --git a/git-gui/po/glossary/zh_cn.po b/subprojects/git-gui/po/glossary/zh_cn.po
similarity index 100%
rename from git-gui/po/glossary/zh_cn.po
rename to subprojects/git-gui/po/glossary/zh_cn.po
diff --git a/git-gui/po/hu.po b/subprojects/git-gui/po/hu.po
similarity index 100%
rename from git-gui/po/hu.po
rename to subprojects/git-gui/po/hu.po
diff --git a/git-gui/po/it.po b/subprojects/git-gui/po/it.po
similarity index 100%
rename from git-gui/po/it.po
rename to subprojects/git-gui/po/it.po
diff --git a/git-gui/po/ja.po b/subprojects/git-gui/po/ja.po
similarity index 100%
rename from git-gui/po/ja.po
rename to subprojects/git-gui/po/ja.po
diff --git a/git-gui/po/meson.build b/subprojects/git-gui/po/meson.build
similarity index 100%
rename from git-gui/po/meson.build
rename to subprojects/git-gui/po/meson.build
diff --git a/git-gui/po/nb.po b/subprojects/git-gui/po/nb.po
similarity index 100%
rename from git-gui/po/nb.po
rename to subprojects/git-gui/po/nb.po
diff --git a/git-gui/po/po2msg.sh b/subprojects/git-gui/po/po2msg.sh
similarity index 100%
rename from git-gui/po/po2msg.sh
rename to subprojects/git-gui/po/po2msg.sh
diff --git a/git-gui/po/pt_br.po b/subprojects/git-gui/po/pt_br.po
similarity index 100%
rename from git-gui/po/pt_br.po
rename to subprojects/git-gui/po/pt_br.po
diff --git a/git-gui/po/pt_pt.po b/subprojects/git-gui/po/pt_pt.po
similarity index 100%
rename from git-gui/po/pt_pt.po
rename to subprojects/git-gui/po/pt_pt.po
diff --git a/git-gui/po/ru.po b/subprojects/git-gui/po/ru.po
similarity index 100%
rename from git-gui/po/ru.po
rename to subprojects/git-gui/po/ru.po
diff --git a/git-gui/po/sv.po b/subprojects/git-gui/po/sv.po
similarity index 100%
rename from git-gui/po/sv.po
rename to subprojects/git-gui/po/sv.po
diff --git a/git-gui/po/vi.po b/subprojects/git-gui/po/vi.po
similarity index 100%
rename from git-gui/po/vi.po
rename to subprojects/git-gui/po/vi.po
diff --git a/git-gui/po/zh_cn.po b/subprojects/git-gui/po/zh_cn.po
similarity index 100%
rename from git-gui/po/zh_cn.po
rename to subprojects/git-gui/po/zh_cn.po
diff --git a/git-gui/windows/git-gui.sh b/subprojects/git-gui/windows/git-gui.sh
similarity index 100%
rename from git-gui/windows/git-gui.sh
rename to subprojects/git-gui/windows/git-gui.sh
-- 
2.51.0.261.g7ce5a0a67e.dirty
Karthik Nayak· Aug 19, 2025, 09:36 UTC · re: Patrick Steinhardt · lore

Re: [PATCH 1/3] git-gui: move into "subprojects/"

Patrick Steinhardt <ps@pks.im> writes:
Show 6 quoted lines
> The "git-gui" project has recently gained support for being built with
> Meson, but it is not yet wired up in Git's own Meson build instructions.
> "git-gui" itself is wired up as a standalone project, which means that
> we can trivially make it available via `subproject("git-gui")`.
>
> So far the theory. In practice thoguh the `subproject()` function comes
s/thoguh/though
Show 28 quoted lines
> with a couple of limitations. Most importantly, all subprojects need to
> be contained in the same directory, and that directory cannot be the
> top-level directory of the parent project. Right now we use the default
> subproject directory ("subprojects/") for a couple of fallbacks in case
> some important dependencies couldn't be found.
>
> This means that we cannot just include the "git-gui" directory as a
> subproject as it lives in our root directory. There are three options:
>
>   - We move "git-gui" into "subprojects/". It requires a bit of churn,
>     but should otherwise not have any significant downsides.
>
>   - We create a symlink pointing from "subprojects/git-gui" to the
>     top-level directory. This may not work on Windows.
>
>   - We can create a "git-gui.wrap" file that knows to pull a specific
>     commit from upstream and build it. This would mean that Meson and
>     Makefiles now have different sources of truth for which version of
>     "git-gui" we build.
>
> The first option feels like the most sensible solution. It creates churn
> and requires us to adapt the pull-request workflow a bit. But this
> should be a one-time cost.
>
> In theory we could also rename the "subprojects/" directory by passing
> the "subproject_dir" argument to our `project()` call. But the name
> feels quite fitting for our purpose, as well.
>

Okay makes sense. The most significant changes are in the top three files and make sense.

[snip]
Patrick Steinhardt· Aug 19, 2025, 08:18 UTC · re: Patrick Steinhardt · lore

[PATCH 2/3] gitk: move into "subprojects/"

Move the "gitk-git" project into "subprojects/" with the same reasoning as in the preceding commit.

While at it, lose the "-git" suffix. There isn't any (obvious?) reason why that suffix exists as the project is called "gitk", not "gitk-git".

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 Documentation/SubmittingPatches                | 2 +-
 Documentation/gitk.adoc                        | 2 +-
 Makefile                                       | 6 +++---
 subprojects/.gitignore                         | 1 +
 {gitk-git => subprojects/gitk}/.gitignore      | 0
 {gitk-git => subprojects/gitk}/Makefile        | 0
 {gitk-git => subprojects/gitk}/generate-tcl.sh | 0
 {gitk-git => subprojects/gitk}/gitk            | 0
 {gitk-git => subprojects/gitk}/meson.build     | 0
 {gitk-git => subprojects/gitk}/po/.gitignore   | 0
 {gitk-git => subprojects/gitk}/po/bg.po        | 0
 {gitk-git => subprojects/gitk}/po/ca.po        | 0
 {gitk-git => subprojects/gitk}/po/de.po        | 0
 {gitk-git => subprojects/gitk}/po/es.po        | 0
 {gitk-git => subprojects/gitk}/po/fr.po        | 0
 {gitk-git => subprojects/gitk}/po/hu.po        | 0
 {gitk-git => subprojects/gitk}/po/it.po        | 0
 {gitk-git => subprojects/gitk}/po/ja.po        | 0
 {gitk-git => subprojects/gitk}/po/meson.build  | 0
 {gitk-git => subprojects/gitk}/po/po2msg.sh    | 0
 {gitk-git => subprojects/gitk}/po/pt_br.po     | 0
 {gitk-git => subprojects/gitk}/po/pt_pt.po     | 0
 {gitk-git => subprojects/gitk}/po/ru.po        | 0
 {gitk-git => subprojects/gitk}/po/sv.po        | 0
 {gitk-git => subprojects/gitk}/po/ta.po        | 0
 {gitk-git => subprojects/gitk}/po/vi.po        | 0
 {gitk-git => subprojects/gitk}/po/zh_cn.po     | 0
 27 files changed, 6 insertions(+), 5 deletions(-)
Show changes to 27 files +6 −5

Documentation/SubmittingPatches, Documentation/gitk.adoc, Makefile, subprojects/.gitignore, gitk-git/.gitignore, gitk-git/Makefile, gitk-git/generate-tcl.sh, gitk-git/gitk, gitk-git/meson.build, gitk-git/po/.gitignore, gitk-git/po/bg.po, gitk-git/po/ca.po, gitk-git/po/de.po, gitk-git/po/es.po, gitk-git/po/fr.po, gitk-git/po/hu.po, gitk-git/po/it.po, gitk-git/po/ja.po, gitk-git/po/meson.build, gitk-git/po/po2msg.sh, gitk-git/po/pt_br.po, gitk-git/po/pt_pt.po, gitk-git/po/ru.po, gitk-git/po/sv.po, gitk-git/po/ta.po, gitk-git/po/vi.po, gitk-git/po/zh_cn.po

diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches
index 3aca70728c7..7492db36d0a 100644
--- a/Documentation/SubmittingPatches
+++ b/Documentation/SubmittingPatches
@@ -705,7 +705,7 @@ repositories.
 
    Contibutions should go via the git mailing list.
 
-- `gitk-git/` comes from the gitk project, maintained by Johannes Sixt:
+- `subprojects/gitk/` comes from the gitk project, maintained by Johannes Sixt:
 
 	https://github.com/j6t/gitk
 
diff --git a/Documentation/gitk.adoc b/Documentation/gitk.adoc
index 58ce40ddb11..284266711f1 100644
--- a/Documentation/gitk.adoc
+++ b/Documentation/gitk.adoc
@@ -170,7 +170,7 @@ tcl/tk.
 versions are distributed as part of the Git suite for the convenience
 of end users.
 
-gitk-git/ comes from Paul Mackerras's gitk project:
+subprojects/gitk/ comes from Paul Mackerras's gitk project:
 
 	git://ozlabs.org/~paulus/gitk
 
diff --git a/Makefile b/Makefile
index 834b79ca7ec..861b0b98594 100644
--- a/Makefile
+++ b/Makefile
@@ -2458,7 +2458,7 @@ endif
 all::
 ifndef NO_TCLTK
 	$(QUIET_SUBDIR0)subprojects/git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
-	$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
+	$(QUIET_SUBDIR0)subprojects/gitk $(QUIET_SUBDIR1) all
 endif
 	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
 
@@ -3568,7 +3568,7 @@ ifndef NO_PERL
 	(cd '$(DESTDIR_SQ)$(perllibdir_SQ)' && umask 022 && $(TAR) xof -)
 endif
 ifndef NO_TCLTK
-	$(MAKE) -C gitk-git install
+	$(MAKE) -C subprojects/gitk install
 	$(MAKE) -C subprojects/git-gui gitexecdir='$(gitexec_instdir_SQ)' install
 endif
 ifneq (,$X)
@@ -3786,7 +3786,7 @@ endif
 	$(MAKE) -C templates/ clean
 	$(MAKE) -C t/ clean
 ifndef NO_TCLTK
-	$(MAKE) -C gitk-git clean
+	$(MAKE) -C subprojects/gitk clean
 	$(MAKE) -C subprojects/git-gui clean
 endif
 	$(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS
diff --git a/subprojects/.gitignore b/subprojects/.gitignore
index 96388dbdd22..fd66efe7100 100644
--- a/subprojects/.gitignore
+++ b/subprojects/.gitignore
@@ -1,2 +1,3 @@
 /*/
 !/git-gui/
+!/gitk/
diff --git a/gitk-git/.gitignore b/subprojects/gitk/.gitignore
similarity index 100%
rename from gitk-git/.gitignore
rename to subprojects/gitk/.gitignore
diff --git a/gitk-git/Makefile b/subprojects/gitk/Makefile
similarity index 100%
rename from gitk-git/Makefile
rename to subprojects/gitk/Makefile
diff --git a/gitk-git/generate-tcl.sh b/subprojects/gitk/generate-tcl.sh
similarity index 100%
rename from gitk-git/generate-tcl.sh
rename to subprojects/gitk/generate-tcl.sh
diff --git a/gitk-git/gitk b/subprojects/gitk/gitk
similarity index 100%
rename from gitk-git/gitk
rename to subprojects/gitk/gitk
diff --git a/gitk-git/meson.build b/subprojects/gitk/meson.build
similarity index 100%
rename from gitk-git/meson.build
rename to subprojects/gitk/meson.build
diff --git a/gitk-git/po/.gitignore b/subprojects/gitk/po/.gitignore
similarity index 100%
rename from gitk-git/po/.gitignore
rename to subprojects/gitk/po/.gitignore
diff --git a/gitk-git/po/bg.po b/subprojects/gitk/po/bg.po
similarity index 100%
rename from gitk-git/po/bg.po
rename to subprojects/gitk/po/bg.po
diff --git a/gitk-git/po/ca.po b/subprojects/gitk/po/ca.po
similarity index 100%
rename from gitk-git/po/ca.po
rename to subprojects/gitk/po/ca.po
diff --git a/gitk-git/po/de.po b/subprojects/gitk/po/de.po
similarity index 100%
rename from gitk-git/po/de.po
rename to subprojects/gitk/po/de.po
diff --git a/gitk-git/po/es.po b/subprojects/gitk/po/es.po
similarity index 100%
rename from gitk-git/po/es.po
rename to subprojects/gitk/po/es.po
diff --git a/gitk-git/po/fr.po b/subprojects/gitk/po/fr.po
similarity index 100%
rename from gitk-git/po/fr.po
rename to subprojects/gitk/po/fr.po
diff --git a/gitk-git/po/hu.po b/subprojects/gitk/po/hu.po
similarity index 100%
rename from gitk-git/po/hu.po
rename to subprojects/gitk/po/hu.po
diff --git a/gitk-git/po/it.po b/subprojects/gitk/po/it.po
similarity index 100%
rename from gitk-git/po/it.po
rename to subprojects/gitk/po/it.po
diff --git a/gitk-git/po/ja.po b/subprojects/gitk/po/ja.po
similarity index 100%
rename from gitk-git/po/ja.po
rename to subprojects/gitk/po/ja.po
diff --git a/gitk-git/po/meson.build b/subprojects/gitk/po/meson.build
similarity index 100%
rename from gitk-git/po/meson.build
rename to subprojects/gitk/po/meson.build
diff --git a/gitk-git/po/po2msg.sh b/subprojects/gitk/po/po2msg.sh
similarity index 100%
rename from gitk-git/po/po2msg.sh
rename to subprojects/gitk/po/po2msg.sh
diff --git a/gitk-git/po/pt_br.po b/subprojects/gitk/po/pt_br.po
similarity index 100%
rename from gitk-git/po/pt_br.po
rename to subprojects/gitk/po/pt_br.po
diff --git a/gitk-git/po/pt_pt.po b/subprojects/gitk/po/pt_pt.po
similarity index 100%
rename from gitk-git/po/pt_pt.po
rename to subprojects/gitk/po/pt_pt.po
diff --git a/gitk-git/po/ru.po b/subprojects/gitk/po/ru.po
similarity index 100%
rename from gitk-git/po/ru.po
rename to subprojects/gitk/po/ru.po
diff --git a/gitk-git/po/sv.po b/subprojects/gitk/po/sv.po
similarity index 100%
rename from gitk-git/po/sv.po
rename to subprojects/gitk/po/sv.po
diff --git a/gitk-git/po/ta.po b/subprojects/gitk/po/ta.po
similarity index 100%
rename from gitk-git/po/ta.po
rename to subprojects/gitk/po/ta.po
diff --git a/gitk-git/po/vi.po b/subprojects/gitk/po/vi.po
similarity index 100%
rename from gitk-git/po/vi.po
rename to subprojects/gitk/po/vi.po
diff --git a/gitk-git/po/zh_cn.po b/subprojects/gitk/po/zh_cn.po
similarity index 100%
rename from gitk-git/po/zh_cn.po
rename to subprojects/gitk/po/zh_cn.po
-- 
2.51.0.261.g7ce5a0a67e.dirty
Johannes Sixt· Aug 20, 2025, 05:49 UTC · re: Patrick Steinhardt · lore

[PATCH] doc/gitk: update reference to the external project

Gitk is now maintained by Johannes Sixt and the repository can be cloned from a new URL. b59358100c20 (Update the official repo of gitk, 2024-12-24) could have updated this instance in the manual, too, but the opportunity was missed. Update it now.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
Am 19.08.25 um 10:18 schrieb Patrick Steinhardt:
> +++ b/Documentation/SubmittingPatches
> -- `gitk-git/` comes from the gitk project, maintained by Johannes Sixt:
> +- `subprojects/gitk/` comes from the gitk project, maintained by Johannes Sixt:
>  
>  	https://github.com/j6t/gitk
> +++ b/Documentation/gitk.adoc
> -gitk-git/ comes from Paul Mackerras's gitk project:
> +subprojects/gitk/ comes from Paul Mackerras's gitk project:
>  
>  	git://ozlabs.org/~paulus/gitk
Let's fix this outdated reference!
 Documentation/gitk.adoc | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
Show changes to Documentation/gitk.adoc +2 −2
diff --git a/Documentation/gitk.adoc b/Documentation/gitk.adoc
index 58ce40ddb1..33a5648ab8 100644
--- a/Documentation/gitk.adoc
+++ b/Documentation/gitk.adoc
@@ -170,9 +170,9 @@ tcl/tk.
 versions are distributed as part of the Git suite for the convenience
 of end users.
 
-gitk-git/ comes from Paul Mackerras's gitk project:
+`gitk-git/` comes from Johannes Sixt's gitk project:
 
-	git://ozlabs.org/~paulus/gitk
+	https://github.com/j6t/gitk
 
 SEE ALSO
 --------
-- 
2.51.0.205.g9a02ae2892
Johannes Sixt· Aug 20, 2025, 06:16 UTC · re: Johannes Sixt · lore

[PATCH v2] doc/gitk: update reference to the external project

Gitk is now maintained by Johannes Sixt and the repository can be cloned from a new URL. b59358100c20 (Update the official repo of gitk, 2024-12-24) could have updated this instance in the manual, too, but the opportunity was missed. Update it now. Do give credit to Paul Mackerras as the inventor of the program.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
 I just noticed that I would have removed the last user-visible
 mention of Paul. Don't do that.
 Documentation/gitk.adoc | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
Show changes to Documentation/gitk.adoc +4 −4
diff --git a/Documentation/gitk.adoc b/Documentation/gitk.adoc
index 58ce40ddb1..5b34dcd077 100644
--- a/Documentation/gitk.adoc
+++ b/Documentation/gitk.adoc
@@ -163,16 +163,16 @@ used by default. If '$XDG_CONFIG_HOME' is not set it defaults to
 
 History
 -------
-Gitk was the first graphical repository browser. It's written in
-tcl/tk.
+Gitk was the first graphical repository browser, written by
+Paul Mackerras in Tcl/Tk.
 
 'gitk' is actually maintained as an independent project, but stable
 versions are distributed as part of the Git suite for the convenience
 of end users.
 
-gitk-git/ comes from Paul Mackerras's gitk project:
+`gitk-git/` comes from Johannes Sixt's gitk project:
 
-	git://ozlabs.org/~paulus/gitk
+	https://github.com/j6t/gitk
 
 SEE ALSO
 --------
-- 
2.51.0.205.g9a02ae2892

1:  5a2ed392c1 ! 1:  48668308f7 doc/gitk: update reference to the external project
    @@ Commit message
         Gitk is now maintained by Johannes Sixt and the repository can be
         cloned from a new URL. b59358100c20 (Update the official repo of
         gitk, 2024-12-24) could have updated this instance in the manual,
    -    too, but the opportunity was missed. Update it now.
    +    too, but the opportunity was missed. Update it now. Do give credit
    +    to Paul Mackerras as the inventor of the program.
     
         Signed-off-by: Johannes Sixt <j6t@kdbg.org>
     
      ## Documentation/gitk.adoc ##
    -@@ Documentation/gitk.adoc: tcl/tk.
    +@@ Documentation/gitk.adoc: used by default. If '$XDG_CONFIG_HOME' is not set it defaults to
    + 
    + History
    + -------
    +-Gitk was the first graphical repository browser. It's written in
    +-tcl/tk.
    ++Gitk was the first graphical repository browser, written by
    ++Paul Mackerras in Tcl/Tk.
    + 
    + 'gitk' is actually maintained as an independent project, but stable
      versions are distributed as part of the Git suite for the convenience
      of end users.
      
Junio C Hamano· Aug 20, 2025, 15:34 UTC · re: Johannes Sixt · lore

Re: [PATCH v2] doc/gitk: update reference to the external project

Johannes Sixt <j6t@kdbg.org> writes:
Show 8 quoted lines
> Gitk is now maintained by Johannes Sixt and the repository can be
> cloned from a new URL. b59358100c20 (Update the official repo of
> gitk, 2024-12-24) could have updated this instance in the manual,
> too, but the opportunity was missed. Update it now. Do give credit
> to Paul Mackerras as the inventor of the program.
>
> Signed-off-by: Johannes Sixt <j6t@kdbg.org>
> ---

Thanks for the update. This is long overdue. I forgot that this manual page was carried in my tree.

Show 31 quoted lines
>  I just noticed that I would have removed the last user-visible
>  mention of Paul. Don't do that.
>
>  Documentation/gitk.adoc | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/Documentation/gitk.adoc b/Documentation/gitk.adoc
> index 58ce40ddb1..5b34dcd077 100644
> --- a/Documentation/gitk.adoc
> +++ b/Documentation/gitk.adoc
> @@ -163,16 +163,16 @@ used by default. If '$XDG_CONFIG_HOME' is not set it defaults to
>  
>  History
>  -------
> -Gitk was the first graphical repository browser. It's written in
> -tcl/tk.
> +Gitk was the first graphical repository browser, written by
> +Paul Mackerras in Tcl/Tk.
>  
>  'gitk' is actually maintained as an independent project, but stable
>  versions are distributed as part of the Git suite for the convenience
>  of end users.
>  
> -gitk-git/ comes from Paul Mackerras's gitk project:
> +`gitk-git/` comes from Johannes Sixt's gitk project:
>  
> -	git://ozlabs.org/~paulus/gitk
> +	https://github.com/j6t/gitk
>  
>  SEE ALSO
>  --------
Patrick Steinhardt· Aug 19, 2025, 08:18 UTC · re: Patrick Steinhardt · lore

[PATCH 3/3] meson: wire up gitk and git-gui

Wire up both gitk and git-gui in Meson as subprojects. These two programs should be the last missing pieces for feature compatibility with our Makefile.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build       | 14 ++++++++++++++
 meson_options.txt |  4 ++++
 2 files changed, 18 insertions(+)
Show changes to 2 files +18 −0

meson.build, meson_options.txt

diff --git a/meson.build b/meson.build
index 5dd299b496..edf7b69a00 100644
--- a/meson.build
+++ b/meson.build
@@ -239,7 +239,9 @@ git = find_program('git', dirs: program_path, native: true, required: false)
 sed = find_program('sed', dirs: program_path, native: true)
 shell = find_program('sh', dirs: program_path, native: true)
 tar = find_program('tar', dirs: program_path, native: true)
+tclsh = find_program('tclsh', required: get_option('git_gui'), native: false)
 time = find_program('time', dirs: program_path, required: get_option('benchmarks'))
+wish = find_program('wish', required: get_option('git_gui').enabled() or get_option('gitk').enabled(), native: false)
 
 # Detect the target shell that is used by Git at runtime. Note that we prefer
 # "/bin/sh" over a PATH-based lookup, which provides a working shell on most
@@ -2207,6 +2209,16 @@ configure_file(
   configuration: build_options_config,
 )
 
+gitk_option = get_option('gitk').disable_auto_if(not wish.found())
+if gitk_option.allowed()
+  subproject('gitk')
+endif
+
+git_gui_option = get_option('git_gui').disable_auto_if(not tclsh.found() or not wish.found())
+if git_gui_option.allowed()
+  subproject('git-gui')
+endif
+
 # Development environments can be used via `meson devenv -C <builddir>`. This
 # allows you to execute test scripts directly with the built Git version and
 # puts the built version of Git in your PATH.
@@ -2233,6 +2245,8 @@ summary({
   'curl': curl,
   'expat': expat,
   'gettext': intl,
+  'gitk': gitk_option.allowed(),
+  'git-gui': git_gui_option.allowed(),
   'gitweb': gitweb_option.allowed(),
   'iconv': iconv,
   'pcre2': pcre2,
diff --git a/meson_options.txt b/meson_options.txt
index 1668f260a1..8fa330771b 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -41,6 +41,10 @@ option('expat', type: 'feature', value: 'enabled',
   description: 'Build helpers used to push to remotes with the HTTP transport.')
 option('gettext', type: 'feature', value: 'auto',
   description: 'Build translation files.')
+option('gitk', type: 'feature', value: 'auto',
+  description: 'Build the Gitk graphical repository browser. Requires Tcl/Tk.')
+option('git_gui', type: 'feature', value: 'auto',
+  description: 'Build the git-gui graphical user interface for Git. Requires Tcl/Tk.')
 option('gitweb', type: 'feature', value: 'auto',
   description: 'Build Git web interface. Requires Perl.')
 option('iconv', type: 'feature', value: 'auto',
-- 
2.51.0.261.g7ce5a0a67e.dirty
Karthik Nayak· Aug 19, 2025, 09:40 UTC · re: Patrick Steinhardt · lore

Re: [PATCH 3/3] meson: wire up gitk and git-gui

Patrick Steinhardt <ps@pks.im> writes:
Show 29 quoted lines
> Wire up both gitk and git-gui in Meson as subprojects. These two
> programs should be the last missing pieces for feature compatibility
> with our Makefile.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  meson.build       | 14 ++++++++++++++
>  meson_options.txt |  4 ++++
>  2 files changed, 18 insertions(+)
>
> diff --git a/meson.build b/meson.build
> index 5dd299b496..edf7b69a00 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -239,7 +239,9 @@ git = find_program('git', dirs: program_path, native: true, required: false)
>  sed = find_program('sed', dirs: program_path, native: true)
>  shell = find_program('sh', dirs: program_path, native: true)
>  tar = find_program('tar', dirs: program_path, native: true)
> +tclsh = find_program('tclsh', required: get_option('git_gui'), native: false)
>  time = find_program('time', dirs: program_path, required: get_option('benchmarks'))
> +wish = find_program('wish', required: get_option('git_gui').enabled() or get_option('gitk').enabled(), native: false)
>
>  # Detect the target shell that is used by Git at runtime. Note that we prefer
>  # "/bin/sh" over a PATH-based lookup, which provides a working shell on most
> @@ -2207,6 +2209,16 @@ configure_file(
>    configuration: build_options_config,
>  )
>
> +gitk_option = get_option('gitk').disable_auto_if(not wish.found())

Since 'wish' is defined as required above when 'gitk' is enabled, would it even come here if there is no 'wish'?

Show 39 quoted lines
> +if gitk_option.allowed()
> +  subproject('gitk')
> +endif
> +
> +git_gui_option = get_option('git_gui').disable_auto_if(not tclsh.found() or not wish.found())
> +if git_gui_option.allowed()
> +  subproject('git-gui')
> +endif
> +
>  # Development environments can be used via `meson devenv -C <builddir>`. This
>  # allows you to execute test scripts directly with the built Git version and
>  # puts the built version of Git in your PATH.
> @@ -2233,6 +2245,8 @@ summary({
>    'curl': curl,
>    'expat': expat,
>    'gettext': intl,
> +  'gitk': gitk_option.allowed(),
> +  'git-gui': git_gui_option.allowed(),
>    'gitweb': gitweb_option.allowed(),
>    'iconv': iconv,
>    'pcre2': pcre2,
> diff --git a/meson_options.txt b/meson_options.txt
> index 1668f260a1..8fa330771b 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -41,6 +41,10 @@ option('expat', type: 'feature', value: 'enabled',
>    description: 'Build helpers used to push to remotes with the HTTP transport.')
>  option('gettext', type: 'feature', value: 'auto',
>    description: 'Build translation files.')
> +option('gitk', type: 'feature', value: 'auto',
> +  description: 'Build the Gitk graphical repository browser. Requires Tcl/Tk.')
> +option('git_gui', type: 'feature', value: 'auto',
> +  description: 'Build the git-gui graphical user interface for Git. Requires Tcl/Tk.')
>  option('gitweb', type: 'feature', value: 'auto',
>    description: 'Build Git web interface. Requires Perl.')
>  option('iconv', type: 'feature', value: 'auto',
>
> --
> 2.51.0.261.g7ce5a0a67e.dirty
The rest look good.

Thanks, Karthik

Patrick Steinhardt· Aug 24, 2025, 17:25 UTC · re: Karthik Nayak · lore

Re: [PATCH 3/3] meson: wire up gitk and git-gui

On Tue, Aug 19, 2025 at 02:40:55AM -0700, Karthik Nayak wrote:
Show 13 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
> > diff --git a/meson.build b/meson.build
> > index 5dd299b496..edf7b69a00 100644
> > --- a/meson.build
> > +++ b/meson.build
> > @@ -2207,6 +2209,16 @@ configure_file(
> >    configuration: build_options_config,
> >  )
> >
> > +gitk_option = get_option('gitk').disable_auto_if(not wish.found())
> 
> Since 'wish' is defined as required above when 'gitk' is enabled, would
> it even come here if there is no 'wish'?

Yeah, it can happen. We're checking for `enabled()`, not `allowed()`. This means that we only require "wish" in case the user has explicitly asked us to enable gitk or git-gui. Otherwise, if the user has "auto" configured for these we may end up finding one, but not both of these commands. So we do have to auto-disable the feature in that case.

Patrick
Junio C Hamano· Aug 19, 2025, 15:49 UTC · re: Patrick Steinhardt · lore

Re: [PATCH 0/3] meson: wire up gitk and git-gui

Patrick Steinhardt <ps@pks.im> writes:
Show 11 quoted lines
> Hi,
>
> I have upstreamed support for Meson into both gitk [1] and git-gui [2].
> This small patch series wires up support in Git.
>
> To the best of my knowledge this is the last missing piece for feature
> compatibility with our Makefile. As such, from my point of view, I think
> that we can stop treating the Meson build system as experimental and
> instead officially endorse it. Once merged I'll thus send another patch
> series that updates our documentation in various different places to
> also mention how to build Git with Meson.
Good.

With such a documentation, it would help folks to verify (and make extra fixup if needed) to see how well feature parity is achieved and peel that experimental label.

Having said that, I somehow feel that ...
>  {git-gui => subprojects/git-gui}/.gitattributes       |   0
> ...
>  {gitk-git => subprojects/gitk}/.gitignore             |   0

... a move like this is bending the source to match the limitation of the tool, making the people who use (write, read, and build from) the source to pay for the price, which is backwards. The tool, be it Meson or Make or CMake, should be serving the project, not the other way around. In our current build system, we don't have to have borrowed code (from gitk, git-gui, sha1dc, or xdiff) inside a specific subdirectory.

But I may change my mind while reading the real patches, not the diffstat.

Thanks.
Patrick Steinhardt· Aug 24, 2025, 17:25 UTC · re: Junio C Hamano · lore

Re: [PATCH 0/3] meson: wire up gitk and git-gui

On Tue, Aug 19, 2025 at 08:49:35AM -0700, Junio C Hamano wrote:
Show 17 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
> Having said that, I somehow feel that ...
> 
> >  {git-gui => subprojects/git-gui}/.gitattributes       |   0
> > ...
> >  {gitk-git => subprojects/gitk}/.gitignore             |   0
> 
> ... a move like this is bending the source to match the limitation
> of the tool, making the people who use (write, read, and build from)
> the source to pay for the price, which is backwards.  The tool, be
> it Meson or Make or CMake, should be serving the project, not the
> other way around.  In our current build system, we don't have to
> have borrowed code (from gitk, git-gui, sha1dc, or xdiff) inside a
> specific subdirectory.
> 
> But I may change my mind while reading the real patches, not the
> diffstat.

I'm not much of a fan of these changes either, and agree that this is a limitation of the tool. I think it isn't _too_ bad, but I would've preferred to not require this step.

If this is proving to be a blocker we can also change upstream to not be a separate project. That'd have the downside that it cannot be used standalone, but the upside that we can just put these directories wherever we want and then include them via `subdir()`.

I think taking the pain once though and renaming is preferred so that both gitk and git-gui can also be used with Meson standalone.

Patrick
Junio C Hamano· Aug 26, 2025, 00:40 UTC · re: Patrick Steinhardt · lore

Re: [PATCH 0/3] meson: wire up gitk and git-gui

Patrick Steinhardt <ps@pks.im> writes:
> If this is proving to be a blocker we can also change upstream to not be
> a separate project.
What do "upstream" refer to in this sentence?  Meson?

If you are talking about "gitk" and/or "git-gui", then such an alternative version of these patches would not change the picture an iota, wrt "the limitation of the tool should not force the sources that might consider using the tool to pay the price---which might be proving to be a blocker", no?

Not that I am saying it _is_ a blocker. But the above sounds like making things worse for no gain, so I must be misunderstanding what you meant X-<.

So, ... confused.
Patrick Steinhardt· Sep 2, 2025, 13:00 UTC · re: Junio C Hamano · lore

Re: [PATCH 0/3] meson: wire up gitk and git-gui

On Mon, Aug 25, 2025 at 05:40:17PM -0700, Junio C Hamano wrote:
Show 12 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
> 
> > If this is proving to be a blocker we can also change upstream to not be
> > a separate project.
> 
> What do "upstream" refer to in this sentence?  Meson?
> 
> If you are talking about "gitk" and/or "git-gui", then such an
> alternative version of these patches would not change the picture an
> iota, wrt "the limitation of the tool should not force the sources
> that might consider using the tool to pay the price---which might be
> proving to be a blocker", no?
gitk/git-gui in this case.
Show 5 quoted lines
> Not that I am saying it _is_ a blocker.  But the above sounds like
> making things worse for no gain, so I must be misunderstanding what
> you meant X-<.
> 
> So, ... confused.

So, to hopefully alleviate the confusion, there's two ways to include a certain directory into Meson:

  - `subdir()` includes directories at arbitrary locations. The
    directory is treated as part of the project that calls `subdir()`.
    This is mostly done to segregate the project into multiple different
    components to keep things more maintainable.
  - `subproject()` includes directories in a specific location. The
    difference is that these are treated as separate projects, so there
    is a certain boundary between the top-level project and its
    subproject. Things done in the subproject won't taint anything in
    the superproject.

Right now I'm using `subproject()`, which has the effect that both gitk and git-gui can be compiled standalone with Meson, but also as part of the Git project. It does have the limitation though that the project must be in a specific directory.

What I was trying to say is that we could convert the build instructions of gitk and git-gui to not be standalone projects anymore. This would mean that we can include the subdirectory from any arbitrary location, but they cannot be built standalone without Git anymore.

Using `subproject()` is a much better fit for our specific use case, even though we have to move things around. I'm not particularly fond of this limitation, but I haven't found a better way to achieve this until now.

So yes, it's a limitation we get from Meson. But it's easy to work around this limitation by moving the projects into the "subprojects", which is a one-time cost, only. I've said for a long time anyway that I think our top-level directory could use some cleanup to make things a bit more discoverable for new contributors, e.g. by move all the code files into a "lib/" folder. So that's probably part of why I don't see this refactoring as a huge downside, even if it is working around a limitation.

Patrick
Ramsay Jones· Aug 19, 2025, 22:25 UTC · re: Patrick Steinhardt · lore

Re: [PATCH 0/3] meson: wire up gitk and git-gui

On 19/08/2025 09:18, Patrick Steinhardt wrote:
> Hi,
> 
> I have upstreamed support for Meson into both gitk [1] and git-gui [2].
> This small patch series wires up support in Git.

Just a quick FYI, but I think git-gui needs some changes equivalent to commit 586919c3b2 ("meson: fix installation when -Dlibexexdir is set", 2025-07-16).

[I don't understand the difference between subdir() and subproject(), so I'm not quite sure how to proceed, but I guess git-gui is a separate project root and 'options' will be passed as-is with a new context?]

gitk doesn't install anything in the libexecdir, so should not need a similar change.

Show 6 quoted lines
> To the best of my knowledge this is the last missing piece for feature
> compatibility with our Makefile. As such, from my point of view, I think
> that we can stop treating the Meson build system as experimental and
> instead officially endorse it. Once merged I'll thus send another patch
> series that updates our documentation in various different places to
> also mention how to build Git with Meson.

Hmm, that seems a little soon to me. ;) I still have quite a few 'misc build updates (part #3)' patches to send to the list (yes, I have been a bit tardy; sorry about that).

Also, let's not forget the 'quoting nightmare' [0], which has still not been addressed.

ATB, Ramsay Jones

[0] https://public-inbox.org/git/a5795bfa-cc02-4c9a-b7d2-4924a94cd0db@ramsayjones.plus.com/
Patrick Steinhardt· Aug 24, 2025, 17:25 UTC · re: Ramsay Jones · lore

Re: [PATCH 0/3] meson: wire up gitk and git-gui

On Tue, Aug 19, 2025 at 11:25:02PM +0100, Ramsay Jones wrote:
Show 11 quoted lines
> 
> 
> On 19/08/2025 09:18, Patrick Steinhardt wrote:
> > Hi,
> > 
> > I have upstreamed support for Meson into both gitk [1] and git-gui [2].
> > This small patch series wires up support in Git.
> 
> Just a quick FYI, but I think git-gui needs some changes equivalent to
> commit 586919c3b2 ("meson: fix installation when -Dlibexexdir is set",
> 2025-07-16).
Ah, thanks for the hint. Will eventually fix it upstream.
> [I don't understand the difference between subdir() and subproject(), so
> I'm not quite sure how to proceed, but I guess git-gui is a separate
> project root and 'options' will be passed as-is with a new context?]

Yup. This is done so that both gitk and git-gui can also be installed standalone.

Show 13 quoted lines
> gitk doesn't install anything in the libexecdir, so should not need a
> similar change.
> 
> > To the best of my knowledge this is the last missing piece for feature
> > compatibility with our Makefile. As such, from my point of view, I think
> > that we can stop treating the Meson build system as experimental and
> > instead officially endorse it. Once merged I'll thus send another patch
> > series that updates our documentation in various different places to
> > also mention how to build Git with Meson.
> 
> Hmm, that seems a little soon to me. ;) I still have quite a few 'misc build
> updates (part #3)' patches to send to the list (yes, I have been a bit tardy;
> sorry about that).
Looking forward to them : 
> Also, let's not forget the 'quoting nightmare' [0], which has still not been
> addressed.

Fair, that one is still outstanding. But I guess with "feature compatibility" I was rather referring to actually user-facing things that Meson cannot do yet. I guess overall it will still take a bit of time for smaller follow-up fixes to land. But in most cases I think that Meson can be used without issues now.

Patrick
Patrick Steinhardt· Feb 4, 2026, 08:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2] meson: wire up gitk and git-gui

Wire up both gitk and git-gui in Meson as subprojects. These two programs should be the last missing pieces for feature compatibility with our Makefile for distributors.

Note that Meson expects subprojects to live in the "subprojects/" directory. Create symlinks to fulfill this requirement.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
Hi,

I have upstreamed support for Meson into both gitk [1] and git-gui [2]. This small patch series wires up support in Git.

Changes in v2:
  - Use symlinks instead of moving both gitk and git-gui into the
    "subprojects/" directory.
  - Rebased on v2.53.0, as it's been a while since v1 :)
  - Link to v1: https://lore.kernel.org/r/20250819-b4-pks-meson-tcl-tk-v1-0-6bcaff0bc0a0@pks.im
Thanks!
Patrick
[1]: https://github.com/j6t/gitk/pull/8
[2]: https://github.com/j6t/git-gui/pull/9
---
 meson.build         | 14 ++++++++++++++
 meson_options.txt   |  4 ++++
 subprojects/git-gui |  1 +
 subprojects/gitk    |  1 +
 4 files changed, 20 insertions(+)
Show changes to 4 files +20 −0

meson.build, meson_options.txt, subprojects/git-gui, subprojects/gitk

diff --git a/meson.build b/meson.build
index dd52efd1c8..e96953afec 100644
--- a/meson.build
+++ b/meson.build
@@ -239,7 +239,9 @@ git = find_program('git', dirs: program_path, native: true, required: false)
 sed = find_program('sed', dirs: program_path, native: true)
 shell = find_program('sh', dirs: program_path, native: true)
 tar = find_program('tar', dirs: program_path, native: true)
+tclsh = find_program('tclsh', required: get_option('git_gui'), native: false)
 time = find_program('time', dirs: program_path, required: get_option('benchmarks'))
+wish = find_program('wish', required: get_option('git_gui').enabled() or get_option('gitk').enabled(), native: false)
 
 # Detect the target shell that is used by Git at runtime. Note that we prefer
 # "/bin/sh" over a PATH-based lookup, which provides a working shell on most
@@ -2250,6 +2252,16 @@ configure_file(
   configuration: build_options_config,
 )
 
+gitk_option = get_option('gitk').disable_auto_if(not wish.found())
+if gitk_option.allowed()
+  subproject('gitk')
+endif
+
+git_gui_option = get_option('git_gui').disable_auto_if(not tclsh.found() or not wish.found())
+if git_gui_option.allowed()
+  subproject('git-gui')
+endif
+
 # Development environments can be used via `meson devenv -C <builddir>`. This
 # allows you to execute test scripts directly with the built Git version and
 # puts the built version of Git in your PATH.
@@ -2276,6 +2288,8 @@ summary({
   'curl': curl,
   'expat': expat,
   'gettext': intl,
+  'gitk': gitk_option.allowed(),
+  'git-gui': git_gui_option.allowed(),
   'gitweb': gitweb_option.allowed(),
   'iconv': iconv,
   'pcre2': pcre2,
diff --git a/meson_options.txt b/meson_options.txt
index e0be260ae1..659cbb218f 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -43,6 +43,10 @@ option('expat', type: 'feature', value: 'enabled',
   description: 'Build helpers used to push to remotes with the HTTP transport.')
 option('gettext', type: 'feature', value: 'auto',
   description: 'Build translation files.')
+option('gitk', type: 'feature', value: 'auto',
+  description: 'Build the Gitk graphical repository browser. Requires Tcl/Tk.')
+option('git_gui', type: 'feature', value: 'auto',
+  description: 'Build the git-gui graphical user interface for Git. Requires Tcl/Tk.')
 option('gitweb', type: 'feature', value: 'auto',
   description: 'Build Git web interface. Requires Perl.')
 option('iconv', type: 'feature', value: 'auto',
diff --git a/subprojects/git-gui b/subprojects/git-gui
new file mode 120000
index 0000000000..c6d917088b
--- /dev/null
+++ b/subprojects/git-gui
@@ -0,0 +1 @@
+../git-gui
\ No newline at end of file
diff --git a/subprojects/gitk b/subprojects/gitk
new file mode 120000
index 0000000000..b66ad18ae5
--- /dev/null
+++ b/subprojects/gitk
@@ -0,0 +1 @@
+../gitk-git
\ No newline at end of file

---
base-commit: 67ad42147a7acc2af6074753ebd03d904476118f
change-id: 20250703-b4-pks-meson-tcl-tk-bb75616c8048
Karthik Nayak· Feb 4, 2026, 10:00 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2] meson: wire up gitk and git-gui

Patrick Steinhardt <ps@pks.im> writes:
Show 23 quoted lines
> Wire up both gitk and git-gui in Meson as subprojects. These two
> programs should be the last missing pieces for feature compatibility
> with our Makefile for distributors.
>
> Note that Meson expects subprojects to live in the "subprojects/"
> directory. Create symlinks to fulfill this requirement.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> Hi,
>
> I have upstreamed support for Meson into both gitk [1] and git-gui [2].
> This small patch series wires up support in Git.
>
> Changes in v2:
>   - Use symlinks instead of moving both gitk and git-gui into the
>     "subprojects/" directory.
>   - Rebased on v2.53.0, as it's been a while since v1 :)
>   - Link to v1: https://lore.kernel.org/r/20250819-b4-pks-meson-tcl-tk-v1-0-6bcaff0bc0a0@pks.im
>
> Thanks!
>
> Patrick

So in the previous version, we moved these projects into 'subprojects/', but we now use symlinks instead. Do you know if there is perhaps an issue in Meson to support configurable subproject paths? If so, we could eventually drop the symlink.

Show 38 quoted lines
>
> [1]: https://github.com/j6t/gitk/pull/8
> [2]: https://github.com/j6t/git-gui/pull/9
> ---
>  meson.build         | 14 ++++++++++++++
>  meson_options.txt   |  4 ++++
>  subprojects/git-gui |  1 +
>  subprojects/gitk    |  1 +
>  4 files changed, 20 insertions(+)
>
> diff --git a/meson.build b/meson.build
> index dd52efd1c8..e96953afec 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -239,7 +239,9 @@ git = find_program('git', dirs: program_path, native: true, required: false)
>  sed = find_program('sed', dirs: program_path, native: true)
>  shell = find_program('sh', dirs: program_path, native: true)
>  tar = find_program('tar', dirs: program_path, native: true)
> +tclsh = find_program('tclsh', required: get_option('git_gui'), native: false)
>  time = find_program('time', dirs: program_path, required: get_option('benchmarks'))
> +wish = find_program('wish', required: get_option('git_gui').enabled() or get_option('gitk').enabled(), native: false)
>
>  # Detect the target shell that is used by Git at runtime. Note that we prefer
>  # "/bin/sh" over a PATH-based lookup, which provides a working shell on most
> @@ -2250,6 +2252,16 @@ configure_file(
>    configuration: build_options_config,
>  )
>
> +gitk_option = get_option('gitk').disable_auto_if(not wish.found())
> +if gitk_option.allowed()
> +  subproject('gitk')
> +endif
> +
> +git_gui_option = get_option('git_gui').disable_auto_if(not tclsh.found() or not wish.found())
> +if git_gui_option.allowed()
> +  subproject('git-gui')
> +endif
> +

So gitk requires 'wish' to exist, whereas 'git_gui' also requires 'tclsh'. Looks good.

[snip]
Patrick Steinhardt· Feb 4, 2026, 11:56 UTC · re: Karthik Nayak · lore

Re: [PATCH v2] meson: wire up gitk and git-gui

On Wed, Feb 04, 2026 at 05:00:11AM -0500, Karthik Nayak wrote:
Show 31 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
> 
> > Wire up both gitk and git-gui in Meson as subprojects. These two
> > programs should be the last missing pieces for feature compatibility
> > with our Makefile for distributors.
> >
> > Note that Meson expects subprojects to live in the "subprojects/"
> > directory. Create symlinks to fulfill this requirement.
> >
> > Signed-off-by: Patrick Steinhardt <ps@pks.im>
> > ---
> > Hi,
> >
> > I have upstreamed support for Meson into both gitk [1] and git-gui [2].
> > This small patch series wires up support in Git.
> >
> > Changes in v2:
> >   - Use symlinks instead of moving both gitk and git-gui into the
> >     "subprojects/" directory.
> >   - Rebased on v2.53.0, as it's been a while since v1 :)
> >   - Link to v1: https://lore.kernel.org/r/20250819-b4-pks-meson-tcl-tk-v1-0-6bcaff0bc0a0@pks.im
> >
> > Thanks!
> >
> > Patrick
> 
> 
> So in the previous version, we moved these projects into 'subprojects/',
> but we now use symlinks instead. Do you know if there is perhaps an
> issue in Meson to support configurable subproject paths? If so, we could
> eventually drop the symlink.

There already is such support: you can configure subprojects to live in an arbitrary location by setting the `subproject_dir` parameter in the `project()` call. But there are some restrictions in place here:

  - It cannot be an absolute path.
  - It must not start with a dot.
  - It must not contain "../".

So that means it's not possible to specify the top-level directory, and that seems to be a concious decision.

Patrick
Junio C Hamano· Feb 4, 2026, 17:53 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2] meson: wire up gitk and git-gui

Patrick Steinhardt <ps@pks.im> writes:
Show 17 quoted lines
> Wire up both gitk and git-gui in Meson as subprojects. These two
> programs should be the last missing pieces for feature compatibility
> with our Makefile for distributors.
>
> Note that Meson expects subprojects to live in the "subprojects/"
> directory. Create symlinks to fulfill this requirement.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> Hi,
>
> I have upstreamed support for Meson into both gitk [1] and git-gui [2].
> This small patch series wires up support in Git.
>
> Changes in v2:
>   - Use symlinks instead of moving both gitk and git-gui into the
>     "subprojects/" directory.

Just being curious (as I cannot offer an alternative if the answer turns out to be "oops, no"), but is Windows, which has been symlink challenged for quite some time, happy with this?

Show 16 quoted lines
> diff --git a/subprojects/git-gui b/subprojects/git-gui
> new file mode 120000
> index 0000000000..c6d917088b
> --- /dev/null
> +++ b/subprojects/git-gui
> @@ -0,0 +1 @@
> +../git-gui
> \ No newline at end of file
> diff --git a/subprojects/gitk b/subprojects/gitk
> new file mode 120000
> index 0000000000..b66ad18ae5
> --- /dev/null
> +++ b/subprojects/gitk
> @@ -0,0 +1 @@
> +../gitk-git
> \ No newline at end of file

Completely unrelated, but I think there needs a way to decorate a .gitattributes pattern specify symlinks (and non-symlinks), just like "foo/" makes the pattern match only to a directory and not file "foo", so that whitespace=incomplete-lines does not kick in for them. Alternatively, make symbolic links excempt from whitespace=incomplete-lines rule altogether.

Patrick Steinhardt· Feb 5, 2026, 06:58 UTC · re: Junio C Hamano · lore

Re: [PATCH v2] meson: wire up gitk and git-gui

On Wed, Feb 04, 2026 at 09:53:10AM -0800, Junio C Hamano wrote:
Show 23 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
> 
> > Wire up both gitk and git-gui in Meson as subprojects. These two
> > programs should be the last missing pieces for feature compatibility
> > with our Makefile for distributors.
> >
> > Note that Meson expects subprojects to live in the "subprojects/"
> > directory. Create symlinks to fulfill this requirement.
> >
> > Signed-off-by: Patrick Steinhardt <ps@pks.im>
> > ---
> > Hi,
> >
> > I have upstreamed support for Meson into both gitk [1] and git-gui [2].
> > This small patch series wires up support in Git.
> >
> > Changes in v2:
> >   - Use symlinks instead of moving both gitk and git-gui into the
> >     "subprojects/" directory.
> 
> Just being curious (as I cannot offer an alternative if the answer
> turns out to be "oops, no"), but is Windows, which has been symlink
> challenged for quite some time, happy with this?

I think the answer is "it depends". Modern Windows does have native symlink support enabled in case Developer Mode is turned on to the best of my knowledge, but not by default. Solutions like Cygwin or MSYS2 know to emulate symlink support -- in the case of Cygwin they look and behave like symlinks for most of the part, in MSYS2 they use a deep copy.

So I expect that it should work in those cases, but I have not tested on Windows.

Patrick
Jeff King· Feb 5, 2026, 09:37 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2] meson: wire up gitk and git-gui

On Wed, Feb 04, 2026 at 09:38:11AM +0100, Patrick Steinhardt wrote:
Show 6 quoted lines
> Wire up both gitk and git-gui in Meson as subprojects. These two
> programs should be the last missing pieces for feature compatibility
> with our Makefile for distributors.
> 
> Note that Meson expects subprojects to live in the "subprojects/"
> directory. Create symlinks to fulfill this requirement.
The GitHub Actions win+Meson job fails for 'jch' with:
  Project name: gitk
  Project version: undefined
  Program sh found: YES (C:\Program Files\Git\bin\sh.EXE)
  Program wish found: YES (C:\Program Files\Git\mingw64\bin\wish.EXE)
  Program chmod found: YES (C:\Program Files\Git\usr\bin\chmod.EXE)
  Program mv found: YES (C:\Program Files\Git\usr\bin\mv.EXE)
  Program sed found: YES (C:\Program Files\Git\usr\bin\sed.EXE)
  Program msgfmt found: NO
  subprojects\gitk\meson.build:28:3: ERROR: Program 'msgfmt' not found or not executable
I didn't investigate, but presumably it is related to this topic.
-Peff
Patrick Steinhardt· Feb 5, 2026, 11:55 UTC · re: Jeff King · lore

Re: [PATCH v2] meson: wire up gitk and git-gui

On Thu, Feb 05, 2026 at 04:37:48AM -0500, Jeff King wrote:
Show 23 quoted lines
> On Wed, Feb 04, 2026 at 09:38:11AM +0100, Patrick Steinhardt wrote:
> 
> > Wire up both gitk and git-gui in Meson as subprojects. These two
> > programs should be the last missing pieces for feature compatibility
> > with our Makefile for distributors.
> > 
> > Note that Meson expects subprojects to live in the "subprojects/"
> > directory. Create symlinks to fulfill this requirement.
> 
> The GitHub Actions win+Meson job fails for 'jch' with:
> 
>   Project name: gitk
>   Project version: undefined
>   Program sh found: YES (C:\Program Files\Git\bin\sh.EXE)
>   Program wish found: YES (C:\Program Files\Git\mingw64\bin\wish.EXE)
>   Program chmod found: YES (C:\Program Files\Git\usr\bin\chmod.EXE)
>   Program mv found: YES (C:\Program Files\Git\usr\bin\mv.EXE)
>   Program sed found: YES (C:\Program Files\Git\usr\bin\sed.EXE)
>   Program msgfmt found: NO
> 
>   subprojects\gitk\meson.build:28:3: ERROR: Program 'msgfmt' not found or not executable
> 
> I didn't investigate, but presumably it is related to this topic.

Oh, indeed. It seems like the logic to handle a missing msgfmt executable already exists, but that I forgot to mark the executable as optional itself. So we need the below patch to fix this.

The nice thing is that this verifies that things actually work with the symlink on Windows :)

I've created https://github.com/j6t/gitk/pull/37 to fix the issue, thanks!

Patrick
Show changes to gitk-git/meson.build +1 −1
diff --git a/gitk-git/meson.build b/gitk-git/meson.build
index ca3c0cec58..aecc068d30 100644
--- a/gitk-git/meson.build
+++ b/gitk-git/meson.build
@@ -25,6 +25,6 @@ custom_target(
   install_dir: get_option('bindir'),
 )
 
-if find_program('msgfmt').found()
+if find_program('msgfmt', required: false).found()
   subdir('po')
 endif
Patrick Steinhardt· Feb 6, 2026, 15:39 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2] meson: wire up gitk and git-gui

On Thu, Feb 05, 2026 at 12:55:04PM +0100, Patrick Steinhardt wrote:
Show 34 quoted lines
> On Thu, Feb 05, 2026 at 04:37:48AM -0500, Jeff King wrote:
> > On Wed, Feb 04, 2026 at 09:38:11AM +0100, Patrick Steinhardt wrote:
> > 
> > > Wire up both gitk and git-gui in Meson as subprojects. These two
> > > programs should be the last missing pieces for feature compatibility
> > > with our Makefile for distributors.
> > > 
> > > Note that Meson expects subprojects to live in the "subprojects/"
> > > directory. Create symlinks to fulfill this requirement.
> > 
> > The GitHub Actions win+Meson job fails for 'jch' with:
> > 
> >   Project name: gitk
> >   Project version: undefined
> >   Program sh found: YES (C:\Program Files\Git\bin\sh.EXE)
> >   Program wish found: YES (C:\Program Files\Git\mingw64\bin\wish.EXE)
> >   Program chmod found: YES (C:\Program Files\Git\usr\bin\chmod.EXE)
> >   Program mv found: YES (C:\Program Files\Git\usr\bin\mv.EXE)
> >   Program sed found: YES (C:\Program Files\Git\usr\bin\sed.EXE)
> >   Program msgfmt found: NO
> > 
> >   subprojects\gitk\meson.build:28:3: ERROR: Program 'msgfmt' not found or not executable
> > 
> > I didn't investigate, but presumably it is related to this topic.
> 
> Oh, indeed. It seems like the logic to handle a missing msgfmt
> executable already exists, but that I forgot to mark the executable as
> optional itself. So we need the below patch to fix this.
> 
> The nice thing is that this verifies that things actually work with the
> symlink on Windows :)
> 
> I've created https://github.com/j6t/gitk/pull/37 to fix the issue,
> thanks!

The fix has been merged upstream. I've created [1] to verify that the CI now succeeds.

Junio, I'm not really sure how to proceed here, as I cannot send the subtree merge via mail to the best of my knowledge. Shall I instead send a new version that just includes the upstream commit, or will you handle the update?

Thanks!
Patrick
[1]: https://github.com/git/git/pull/2190
Junio C Hamano· Feb 6, 2026, 22:23 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2] meson: wire up gitk and git-gui

Patrick Steinhardt <ps@pks.im> writes:
Show 7 quoted lines
> The fix has been merged upstream. I've created [1] to verify that the CI
> now succeeds.
>
> Junio, I'm not really sure how to proceed here, as I cannot send the
> subtree merge via mail to the best of my knowledge. Shall I instead send
> a new version that just includes the upstream commit, or will you handle
> the update?

Whenever j6t says his tree is ready, I'll pull from him to get the update. This "wire up" patch does not need any changes, right? If so, things will start working when I pull from j6t.

Thanks.
Patrick Steinhardt· Feb 9, 2026, 08:32 UTC · re: Junio C Hamano · lore

Re: [PATCH v2] meson: wire up gitk and git-gui

On Fri, Feb 06, 2026 at 02:23:09PM -0800, Junio C Hamano wrote:
Show 13 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
> 
> > The fix has been merged upstream. I've created [1] to verify that the CI
> > now succeeds.
> >
> > Junio, I'm not really sure how to proceed here, as I cannot send the
> > subtree merge via mail to the best of my knowledge. Shall I instead send
> > a new version that just includes the upstream commit, or will you handle
> > the update?
> 
> Whenever j6t says his tree is ready, I'll pull from him to get the
> update.  This "wire up" patch does not need any changes, right?  If
> so, things will start working when I pull from j6t.
Yeah, exactly. Thanks!
Patrick
Junio C Hamano· Feb 11, 2026, 21:05 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2] meson: wire up gitk and git-gui

Patrick Steinhardt <ps@pks.im> writes:
Show 7 quoted lines
> On Thu, Feb 05, 2026 at 12:55:04PM +0100, Patrick Steinhardt wrote:
>
>> I've created https://github.com/j6t/gitk/pull/37 to fix the issue,
>> thanks!
>
> The fix has been merged upstream. I've created [1] to verify that the CI
> now succeeds.
Hannes, I see that in your tree
  https://github.com/j6t/gitk/commit/ddae547e3775638c238c11f30120f1e7e763fba8 

has Patrick's fix. Is it a good time for me to pull from you, or do you want/need to finish any housekeeping tasks like tagging before I do?

This will hopefully help us unblock one of in-flight topics.
Thanks.
Johannes Sixt· Feb 11, 2026, 22:41 UTC · re: Junio C Hamano · lore

Re: [PATCH v2] meson: wire up gitk and git-gui

Am 11.02.26 um 22:05 schrieb Junio C Hamano:
Show 14 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
>> On Thu, Feb 05, 2026 at 12:55:04PM +0100, Patrick Steinhardt wrote:
>> The fix has been merged upstream. I've created [1] to verify that the CI
>> now succeeds.
> 
> Hannes, I see that in your tree
> 
>   https://github.com/j6t/gitk/commit/ddae547e3775638c238c11f30120f1e7e763fba8 
> 
> has Patrick's fix.  Is it a good time for me to pull from you, or do
> you want/need to finish any housekeeping tasks like tagging before I
> do?
> 
> This will hopefully help us unblock one of in-flight topics.
Please feel free to pull this commit (it's today's master).

I was pondering whether I want to include more topics in the next pull request, but I didn't find the time to make up my mind. So, let's take the fast route for now.

-- Hannes
Junio C Hamano· Feb 11, 2026, 22:56 UTC · re: Johannes Sixt · lore

Re: [PATCH v2] meson: wire up gitk and git-gui

Johannes Sixt <j6t@kdbg.org> writes:
Show 22 quoted lines
> Am 11.02.26 um 22:05 schrieb Junio C Hamano:
>> Patrick Steinhardt <ps@pks.im> writes:
>>> On Thu, Feb 05, 2026 at 12:55:04PM +0100, Patrick Steinhardt wrote:
>>> The fix has been merged upstream. I've created [1] to verify that the CI
>>> now succeeds.
>> 
>> Hannes, I see that in your tree
>> 
>>   https://github.com/j6t/gitk/commit/ddae547e3775638c238c11f30120f1e7e763fba8 
>> 
>> has Patrick's fix.  Is it a good time for me to pull from you, or do
>> you want/need to finish any housekeeping tasks like tagging before I
>> do?
>> 
>> This will hopefully help us unblock one of in-flight topics.
> Please feel free to pull this commit (it's today's master).
>
> I was pondering whether I want to include more topics in the next pull
> request, but I didn't find the time to make up my mind. So, let's take
> the fast route for now.
>
> -- Hannes
Thanks!

← back to recent threads