Skip to content

Commit

Permalink
difftool: add a skeleton for the upcoming builtin
Browse files Browse the repository at this point in the history
This adds a builtin difftool that still falls back to the legacy Perl
version, which has been renamed to `legacy-difftool`.

The idea is that the new, experimental, builtin difftool immediately hands
off to the legacy difftool for now, unless the config variable
difftool.useBuiltin is set to true.

This feature flag will be used in the upcoming Git for Windows v2.11.0
release, to allow early testers to opt-in to use the builtin difftool and
flesh out any bugs.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
dscho authored and gitster committed Jan 17, 2017
1 parent e2b2d6a commit be8a90e
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 1 deletion.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@
/git-init-db
/git-interpret-trailers
/git-instaweb
/git-legacy-difftool
/git-log
/git-ls-files
/git-ls-remote
Expand Down
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -527,7 +527,7 @@ SCRIPT_LIB += git-sh-setup
SCRIPT_LIB += git-sh-i18n

SCRIPT_PERL += git-add--interactive.perl
SCRIPT_PERL += git-difftool.perl
SCRIPT_PERL += git-legacy-difftool.perl
SCRIPT_PERL += git-archimport.perl
SCRIPT_PERL += git-cvsexportcommit.perl
SCRIPT_PERL += git-cvsimport.perl
Expand Down Expand Up @@ -888,6 +888,7 @@ BUILTIN_OBJS += builtin/diff-files.o
BUILTIN_OBJS += builtin/diff-index.o
BUILTIN_OBJS += builtin/diff-tree.o
BUILTIN_OBJS += builtin/diff.o
BUILTIN_OBJS += builtin/difftool.o
BUILTIN_OBJS += builtin/fast-export.o
BUILTIN_OBJS += builtin/fetch-pack.o
BUILTIN_OBJS += builtin/fetch.o
Expand Down
1 change: 1 addition & 0 deletions builtin.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ extern int cmd_diff_files(int argc, const char **argv, const char *prefix);
extern int cmd_diff_index(int argc, const char **argv, const char *prefix);
extern int cmd_diff(int argc, const char **argv, const char *prefix);
extern int cmd_diff_tree(int argc, const char **argv, const char *prefix);
extern int cmd_difftool(int argc, const char **argv, const char *prefix);
extern int cmd_fast_export(int argc, const char **argv, const char *prefix);
extern int cmd_fetch(int argc, const char **argv, const char *prefix);
extern int cmd_fetch_pack(int argc, const char **argv, const char *prefix);
Expand Down
63 changes: 63 additions & 0 deletions builtin/difftool.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*
* "git difftool" builtin command
*
* This is a wrapper around the GIT_EXTERNAL_DIFF-compatible
* git-difftool--helper script.
*
* This script exports GIT_EXTERNAL_DIFF and GIT_PAGER for use by git.
* The GIT_DIFF* variables are exported for use by git-difftool--helper.
*
* Any arguments that are unknown to this script are forwarded to 'git diff'.
*
* Copyright (C) 2016 Johannes Schindelin
*/
#include "builtin.h"
#include "run-command.h"
#include "exec_cmd.h"

/*
* NEEDSWORK: this function can go once the legacy-difftool Perl script is
* retired.
*
* We intentionally avoid reading the config directly here, to avoid messing up
* the GIT_* environment variables when we need to fall back to exec()ing the
* Perl script.
*/
static int use_builtin_difftool(void) {
struct child_process cp = CHILD_PROCESS_INIT;
struct strbuf out = STRBUF_INIT;
int ret;

argv_array_pushl(&cp.args,
"config", "--bool", "difftool.usebuiltin", NULL);
cp.git_cmd = 1;
if (capture_command(&cp, &out, 6))
return 0;
strbuf_trim(&out);
ret = !strcmp("true", out.buf);
strbuf_release(&out);
return ret;
}

int cmd_difftool(int argc, const char **argv, const char *prefix)
{
/*
* NEEDSWORK: Once the builtin difftool has been tested enough
* and git-legacy-difftool.perl is retired to contrib/, this preamble
* can be removed.
*/
if (!use_builtin_difftool()) {
const char *path = mkpath("%s/git-legacy-difftool",
git_exec_path());

if (sane_execvp(path, (char **)argv) < 0)
die_errno("could not exec %s", path);

return 0;
}
prefix = setup_git_directory();
trace_repo_setup(prefix);
setup_work_tree();

die("TODO");
}
File renamed without changes.
6 changes: 6 additions & 0 deletions git.c
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,12 @@ static struct cmd_struct commands[] = {
{ "diff-files", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE },
{ "diff-index", cmd_diff_index, RUN_SETUP },
{ "diff-tree", cmd_diff_tree, RUN_SETUP },
/*
* NEEDSWORK: Once the redirection to git-legacy-difftool.perl in
* builtin/difftool.c has been removed, this entry should be changed to
* RUN_SETUP | NEED_WORK_TREE
*/
{ "difftool", cmd_difftool },
{ "fast-export", cmd_fast_export, RUN_SETUP },
{ "fetch", cmd_fetch, RUN_SETUP },
{ "fetch-pack", cmd_fetch_pack, RUN_SETUP },
Expand Down
2 changes: 2 additions & 0 deletions t/t7800-difftool.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ prompt_given ()
test "$prompt" = "Launch 'test-tool' [Y/n]? branch"
}

# NEEDSWORK: lose all the PERL prereqs once legacy-difftool is retired.

# Create a file on master and change it on branch
test_expect_success PERL 'setup' '
echo master >file &&
Expand Down

0 comments on commit be8a90e

Please sign in to comment.