From c9e4ccda71c3f81b8b927275c76e5437528447ba Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Sat, 19 May 2018 19:25:20 -0400 Subject: [PATCH] Fix #763: Handle GIT_PREFIX by setting GIT_WORK_TREE and changing directory --- NEWS.adoc | 1 + src/tig.c | 25 ++++++++++++++++++ test/main/git-alias-test | 56 ++++++++++++++++++++++++++++++++++++++++ test/tools/libtest.sh | 2 +- 4 files changed, 83 insertions(+), 1 deletion(-) create mode 100755 test/main/git-alias-test diff --git a/NEWS.adoc b/NEWS.adoc index 66b9aeef9..deb0681fb 100644 --- a/NEWS.adoc +++ b/NEWS.adoc @@ -11,6 +11,7 @@ Improvements: - Build against netbsd-curses. (GH #789) - Change the blame view to render more like `git blame`. (GH #812) - Improve worktree and submodule support. (GH #459, #781, #783) + - Support running Tig via a Git alias. (GH #763) Bug fixes: diff --git a/src/tig.c b/src/tig.c index 92718100e..aeefee390 100644 --- a/src/tig.c +++ b/src/tig.c @@ -738,6 +738,30 @@ die_if_failed(enum status_code code, const char *msg) die("%s: %s", msg, get_status_message(code)); } +static inline enum status_code +handle_git_prefix(void) +{ + const char *prefix = getenv("GIT_PREFIX"); + char cwd[4096]; + + if (!prefix || !*prefix) + return SUCCESS; + + /* + * GIT_PREFIX is set when tig is invoked as a git alias. + * Tig expects to run from the subdirectory so clear the prefix + * and set GIT_WORK_TREE accordinglyt. + */ + if (!getcwd(cwd, sizeof(cwd))) + return error("Failed to read CWD"); + if (setenv("GIT_WORK_TREE", cwd, 1)) + return error("Failed to set GIT_WORK_TREE"); + if (setenv("GIT_PREFIX", "", 1)) + return error("Failed to clear GIT_PREFIX"); + + return chdir(prefix) ? error("Failed to change directory to %s", prefix) : SUCCESS; +} + int main(int argc, const char *argv[]) { @@ -761,6 +785,7 @@ main(int argc, const char *argv[]) codeset = nl_langinfo(CODESET); } + die_if_failed(handle_git_prefix(), "Failed to handle GIT_PREFIX"); die_if_failed(load_repo_info(), "Failed to load repo info."); die_if_failed(load_options(), "Failed to load user config."); die_if_failed(load_git_config(), "Failed to load repo config."); diff --git a/test/main/git-alias-test b/test/main/git-alias-test new file mode 100755 index 000000000..ac909fc5f --- /dev/null +++ b/test/main/git-alias-test @@ -0,0 +1,56 @@ +#!/bin/sh + +. libtest.sh +. libgit.sh + +export LINES=5 + +benchmarks_git="$output_dir/benchmarks.git" +benchmarks_dir="$output_dir/$work_dir" + +tigrc <> "$output_dir/alias-vars" +EOF + +test_setup_work_dir() +{ + mkdir -p "$output_dir/base" + cd "$output_dir/base" + create_repo_from_tgz "$base_dir/files/scala-js-benchmarks.tgz" + git branch work-branch ee912870202200a0b9cf4fd86ba57243212d341e + git worktree add "$output_dir/$work_dir" work-branch + git config --global alias.tig !tig + git config --global alias.alias-vars !alias-vars +} + +test_exec_work_dir test_setup_work_dir + +runner=git + +work_dir="$work_dir/deltablue" +test_tig -- src/main/scala +in_work_dir git alias-vars + +assert_equals 'alias-vars' <