]> git.proxmox.com Git - libgit2.git/commitdiff
Preserve tree filemode in index during checkout
authorEdward Thomson <ethomson@microsoft.com>
Wed, 22 Jan 2014 18:24:32 +0000 (13:24 -0500)
committerEdward Thomson <ethomson@microsoft.com>
Wed, 22 Jan 2014 18:26:30 +0000 (13:26 -0500)
Don't try to determine whether the system supports file modes
when putting the tree data in the index during checkout.  The tree's
mode is canonical and did not come from stat(2) in the first place.

src/checkout.c
tests/checkout/tree.c
tests/resources/testrepo/.gitted/objects/1d/d0968be3ff95fcaecb6fa4245662db9fdc4568 [new file with mode: 0644]
tests/resources/testrepo/.gitted/objects/af/e4393b2b2a965f06acf2ca9658eaa01e0cd6b6 [new file with mode: 0644]
tests/resources/testrepo/.gitted/objects/ce/054d4c5e3c83522aed8bc061987b46b7ede3be [new file with mode: 0644]

index cfb0e72ab462455348c4fea107e5cee4baeb4f7d..962929075d5d3c12c7132d5836a4bf7522a6e0b8 100644 (file)
@@ -1217,8 +1217,7 @@ static int checkout_update_index(
 
        memset(&entry, 0, sizeof(entry));
        entry.path = (char *)file->path; /* cast to prevent warning */
-       git_index_entry__init_from_stat(
-               &entry, st, !(git_index_caps(data->index) & GIT_INDEXCAP_NO_FILEMODE));
+       git_index_entry__init_from_stat(&entry, st, true);
        git_oid_cpy(&entry.oid, &file->oid);
 
        return git_index_add(data->index, &entry);
index f0699fdb7573a4be96b0f0c1dbd0f9853cccc5ef..047c9ed98c15e4a3201ff6833393107b0e5b3697 100644 (file)
@@ -925,3 +925,26 @@ void test_checkout_tree__fails_when_conflicts_exist_in_index(void)
 
        git_object_free(obj);
 }
+
+void test_checkout_tree__filemode_preserved_in_index(void)
+{
+       git_oid executable_oid;
+       git_commit *commit;
+       git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
+       git_index *index;
+       const git_index_entry *entry;
+
+       cl_git_pass(git_repository_index(&index, g_repo));
+
+       cl_git_pass(git_oid_fromstr(&executable_oid, "afe4393b2b2a965f06acf2ca9658eaa01e0cd6b6"));
+       cl_git_pass(git_commit_lookup(&commit, g_repo, &executable_oid));
+
+       opts.checkout_strategy = GIT_CHECKOUT_FORCE;
+
+       cl_git_pass(git_checkout_tree(g_repo, (const git_object *)commit, &opts));
+       cl_assert(entry = git_index_get_bypath(index, "executable.txt", 0));
+       cl_assert_equal_i(0100755, entry->mode);
+
+       git_commit_free(commit);
+       git_index_free(index);
+}
diff --git a/tests/resources/testrepo/.gitted/objects/1d/d0968be3ff95fcaecb6fa4245662db9fdc4568 b/tests/resources/testrepo/.gitted/objects/1d/d0968be3ff95fcaecb6fa4245662db9fdc4568
new file mode 100644 (file)
index 0000000..97c6b2c
Binary files /dev/null and b/tests/resources/testrepo/.gitted/objects/1d/d0968be3ff95fcaecb6fa4245662db9fdc4568 differ
diff --git a/tests/resources/testrepo/.gitted/objects/af/e4393b2b2a965f06acf2ca9658eaa01e0cd6b6 b/tests/resources/testrepo/.gitted/objects/af/e4393b2b2a965f06acf2ca9658eaa01e0cd6b6
new file mode 100644 (file)
index 0000000..6948f1b
Binary files /dev/null and b/tests/resources/testrepo/.gitted/objects/af/e4393b2b2a965f06acf2ca9658eaa01e0cd6b6 differ
diff --git a/tests/resources/testrepo/.gitted/objects/ce/054d4c5e3c83522aed8bc061987b46b7ede3be b/tests/resources/testrepo/.gitted/objects/ce/054d4c5e3c83522aed8bc061987b46b7ede3be
new file mode 100644 (file)
index 0000000..4910e4c
Binary files /dev/null and b/tests/resources/testrepo/.gitted/objects/ce/054d4c5e3c83522aed8bc061987b46b7ede3be differ