Merge branch 'ap/maint-apply-modefix' into maint
authorJunio C Hamano <gitster@pobox.com>
Tue, 13 Jan 2009 08:56:40 +0000 (00:56 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 13 Jan 2009 08:56:40 +0000 (00:56 -0800)
* ap/maint-apply-modefix:
builtin-apply: prevent non-explicit permission changes

builtin-apply.c
t/t4129-apply-samemode.sh [new file with mode: 0755]
index 07244b0736047d6cfe67db7f059f7755906579f0..a8f75ed3ed411d8cf7a3ec9dfefef7407c50f447 100644 (file)
@@ -630,7 +630,7 @@ static int gitdiff_index(const char *line, struct patch *patch)
        memcpy(patch->new_sha1_prefix, line, len);
        patch->new_sha1_prefix[len] = 0;
        if (*ptr == ' ')
-               patch->new_mode = patch->old_mode = strtoul(ptr+1, NULL, 8);
+               patch->old_mode = strtoul(ptr+1, NULL, 8);
        return 0;
 }
 
@@ -2447,6 +2447,8 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s
        if (st_mode != patch->old_mode)
                fprintf(stderr, "warning: %s has type %o, expected %o\n",
                        old_name, st_mode, patch->old_mode);
+       if (!patch->new_mode)
+               patch->new_mode = st_mode;
        return 0;
 
  is_new:
diff --git a/t/t4129-apply-samemode.sh b/t/t4129-apply-samemode.sh
new file mode 100755 (executable)
index 0000000..adfcbb5
--- /dev/null
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+test_description='applying patch with mode bits'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+       echo original >file &&
+       git add file &&
+       test_tick &&
+       git commit -m initial &&
+       git tag initial &&
+       echo modified >file &&
+       git diff --stat -p >patch-0.txt &&
+       chmod +x file &&
+       git diff --stat -p >patch-1.txt
+'
+
+test_expect_success 'same mode (no index)' '
+       git reset --hard &&
+       chmod +x file &&
+       git apply patch-0.txt &&
+       test -x file
+'
+
+test_expect_success 'same mode (with index)' '
+       git reset --hard &&
+       chmod +x file &&
+       git add file &&
+       git apply --index patch-0.txt &&
+       test -x file &&
+       git diff --exit-code
+'
+
+test_expect_success 'same mode (index only)' '
+       git reset --hard &&
+       chmod +x file &&
+       git add file &&
+       git apply --cached patch-0.txt &&
+       git ls-files -s file | grep "^100755"
+'
+
+test_expect_success 'mode update (no index)' '
+       git reset --hard &&
+       git apply patch-1.txt &&
+       test -x file
+'
+
+test_expect_success 'mode update (with index)' '
+       git reset --hard &&
+       git apply --index patch-1.txt &&
+       test -x file &&
+       git diff --exit-code
+'
+
+test_expect_success 'mode update (index only)' '
+       git reset --hard &&
+       git apply --cached patch-1.txt &&
+       git ls-files -s file | grep "^100755"
+'
+
+test_done