This patch makes it possible to drag files and directories from a graphical browser and drop them onto a shell and feed them to common git operations without editing away the path to the root of the work tree. Signed-off-by: Robin Rosenberg <robin.rosenberg@xxxxxxxxxx> --- setup.c | 19 +++++++++++++++++ t/t3904-abspatharg.sh | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 0 deletions(-) create mode 100755 t/t3904-abspatharg.sh diff --git a/setup.c b/setup.c index f512ea0..ffc30bf 100644 --- a/setup.c +++ b/setup.c @@ -7,6 +7,25 @@ static int inside_work_tree = -1; const char *prefix_path(const char *prefix, int len, const char *path) { const char *orig = path; + const char *work_tree = get_git_work_tree(); + if (is_absolute_path(path) && work_tree) { + int n = strlen(work_tree); + if (!strncmp(path, work_tree, n) && (path[n] == '/' || !path[n])) { + if (path[n]) + path += n + 1; + else + path += n; + + if (prefix && !strncmp(path, prefix, len - 1)) { + if (path[len - 1] == '/') + path += len; + else + if (!path[len - 1]) + path += len - 1; + } + } + } + for (;;) { char c; if (*path != '.') diff --git a/t/t3904-abspatharg.sh b/t/t3904-abspatharg.sh new file mode 100755 index 0000000..cd4a52e --- /dev/null +++ b/t/t3904-abspatharg.sh @@ -0,0 +1,55 @@ +#!/bin/sh +# +# Copyright (C) 2007 Robin Rosenberg +# + +test_description='Test absolute filename arguments to various git +commands. Absolute arguments pointing to a location within the git +work tree should behave the same as relative arguments. ' + +. ./test-lib.sh + +test_expect_success 'add files using absolute path names' ' +echo a >afile && +echo b >bfile && +git-add afile && +git-add "$(pwd)/bfile" && +test "afile bfile" = "$(echo $(git ls-files))" +mkdir x && +cd x && +echo c >cfile && +echo d >dfile && +git-add cfile && +git-add "$(pwd)" && +cd .. && +test "afile bfile x/cfile x/dfile" = "$(echo $(git ls-files))" && +git ls-files x >f1 && +git ls-files "$(pwd)/x" >f2 && +diff f1 f2 +' + +test_expect_success 'commit using absolute path names' ' +git commit -m "foo" && +echo aa >>bfile && +git commit -m "bb" "$(pwd)/bfile" +' + +test_expect_success 'log using absolute path names' ' +git log afile >f1.txt && +git log "$(pwd)/afile" >f2.txt && +diff f1.txt f2.txt +' + +test_expect_success 'blame using absolute path names' ' +git blame afile >f1.txt && +git blame "$(pwd)/afile" >f2.txt && +diff f1.txt f2.txt +' + +test_expect_success 'diff using absolute path names' ' +git diff HEAD^ -- "$(pwd)/afile" >f1.txt && +git diff HEAD^ -- afile >f2.txt && +diff f1.txt f2.txt +' + +test_done -- 1.5.3.5.1.gb2df9 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html