diff --git a/include/git2/tree.h b/include/git2/tree.h index 29aedacc6..9b61e7d91 100644 --- a/include/git2/tree.h +++ b/include/git2/tree.h @@ -271,7 +271,7 @@ GIT_EXTERN(const git_tree_entry *) git_treebuilder_get(git_treebuilder *bld, con * @param bld Tree builder * @param filename Filename of the entry * @param id SHA1 oid of the entry - * @param attributes Folder attributes of the entry. This parameter must + * @param filemode Folder attributes of the entry. This parameter must * be valued with one of the following entries: 0040000, 0100644, * 0100755, 0120000 or 0160000. * @return 0 or an error code @@ -281,7 +281,7 @@ GIT_EXTERN(int) git_treebuilder_insert( git_treebuilder *bld, const char *filename, const git_oid *id, - unsigned int attributes); + git_filemode_t filemode); /** * Remove an entry from the builder by its filename diff --git a/src/notes.c b/src/notes.c index 6f9e7779d..b592a2cd3 100644 --- a/src/notes.c +++ b/src/notes.c @@ -180,7 +180,7 @@ static int manipulate_note_in_tree_r( subtree_name[2] = '\0'; error = tree_write(out, repo, parent, git_tree_id(new), - subtree_name, 0040000); + subtree_name, GIT_FILEMODE_TREE); cleanup: @@ -252,7 +252,13 @@ static int insert_note_in_tree_enotfound_cb(git_tree **out, GIT_UNUSED(current_error); /* No existing fanout at this level, insert in place */ - return tree_write(out, repo, parent, note_oid, annotated_object_sha + fanout, 0100644); + return tree_write( + out, + repo, + parent, + note_oid, + annotated_object_sha + fanout, + GIT_FILEMODE_BLOB); } static int note_write(git_oid *out, diff --git a/src/tree.c b/src/tree.c index 0eee94735..315269d5d 100644 --- a/src/tree.c +++ b/src/tree.c @@ -14,14 +14,14 @@ #define DEFAULT_TREE_SIZE 16 #define MAX_FILEMODE_BYTES 6 -static bool valid_attributes(const int attributes) +static bool valid_filemode(const int filemode) { - return (attributes == 0040000 /* Directory */ - || attributes == 0100644 /* Non executable file */ - || attributes == 0100664 /* Non executable group writable file */ - || attributes == 0100755 /* Executable file */ - || attributes == 0120000 /* Symbolic link */ - || attributes == 0160000); /* Git link */ + return (filemode == GIT_FILEMODE_TREE + || filemode == GIT_FILEMODE_BLOB + || filemode == GIT_FILEMODE_BLOB_GROUP_WRITABLE + || filemode == GIT_FILEMODE_BLOB_EXECUTABLE + || filemode == GIT_FILEMODE_LINK + || filemode == GIT_FILEMODE_COMMIT); } static int valid_entry_name(const char *filename) @@ -308,8 +308,8 @@ static int tree_parse_buffer(git_tree *tree, const char *buffer, const char *buf int attr; if (git__strtol32(&attr, buffer, &buffer, 8) < 0 || - !buffer || !valid_attributes(attr)) - return tree_error("Failed to parse tree. Can't parse attributes"); + !buffer || !valid_filemode(attr)) + return tree_error("Failed to parse tree. Can't parse filemode"); if (*buffer++ != ' ') return tree_error("Failed to parse tree. Object is corrupted"); @@ -368,7 +368,7 @@ static int append_entry( git_treebuilder *bld, const char *filename, const git_oid *id, - unsigned int attributes) + git_filemode_t filemode) { git_tree_entry *entry; @@ -376,7 +376,7 @@ static int append_entry( GITERR_CHECK_ALLOC(entry); git_oid_cpy(&entry->oid, id); - entry->attr = attributes; + entry->attr = (uint16_t)filemode; if (git_vector_insert(&bld->entries, entry) < 0) return -1; @@ -517,17 +517,17 @@ static void sort_entries(git_treebuilder *bld) git_vector_sort(&bld->entries); } -GIT_INLINE(int) normalize_attributes(const int attributes) +GIT_INLINE(git_filemode_t) normalize_filemode(git_filemode_t filemode) { /* 100664 mode is an early design mistake. Tree entries may bear * this mode in some old git repositories, but it's now deprecated. * We silently normalize while inserting new entries in a tree * being built. */ - if (attributes == 0100664) - return 0100644; + if (filemode == GIT_FILEMODE_BLOB_GROUP_WRITABLE) + return GIT_FILEMODE_BLOB; - return attributes; + return filemode; } int git_treebuilder_create(git_treebuilder **builder_p, const git_tree *source) @@ -553,7 +553,7 @@ int git_treebuilder_create(git_treebuilder **builder_p, const git_tree *source) if (append_entry( bld, entry_src->filename, &entry_src->oid, - normalize_attributes(entry_src->attr)) < 0) + normalize_filemode((git_filemode_t)entry_src->attr)) < 0) goto on_error; } } @@ -571,17 +571,17 @@ int git_treebuilder_insert( git_treebuilder *bld, const char *filename, const git_oid *id, - unsigned int attributes) + git_filemode_t filemode) { git_tree_entry *entry; int pos; assert(bld && id && filename); - if (!valid_attributes(attributes)) - return tree_error("Failed to insert entry. Invalid attributes"); + if (!valid_filemode(filemode)) + return tree_error("Failed to insert entry. Invalid filemode"); - attributes = normalize_attributes(attributes); + filemode = normalize_filemode(filemode); if (!valid_entry_name(filename)) return tree_error("Failed to insert entry. Invalid name for a tree entry"); @@ -598,7 +598,7 @@ int git_treebuilder_insert( } git_oid_cpy(&entry->oid, id); - entry->attr = attributes; + entry->attr = filemode; if (pos < 0) { if (git_vector_insert(&bld->entries, entry) < 0) diff --git a/src/tree.h b/src/tree.h index c49309cbc..24b517ce3 100644 --- a/src/tree.h +++ b/src/tree.h @@ -47,5 +47,9 @@ int git_tree__parse(git_tree *tree, git_odb_object *obj); */ int git_tree__prefix_position(git_tree *tree, const char *prefix); +/** + * Obsolete mode kept for compatibility reasons + */ +#define GIT_FILEMODE_BLOB_GROUP_WRITABLE 0100664 #endif diff --git a/tests-clar/index/filemodes.c b/tests-clar/index/filemodes.c index 8bd35ddab..75c94e8e7 100644 --- a/tests-clar/index/filemodes.c +++ b/tests-clar/index/filemodes.c @@ -100,40 +100,40 @@ void test_index_filemodes__untrusted(void) /* 1 - add 0644 over existing 0644 -> expect 0644 */ replace_file_with_mode("exec_off", "filemodes/exec_off.0", 0644); - add_and_check_mode(index, "exec_off", 0100644); + add_and_check_mode(index, "exec_off", GIT_FILEMODE_BLOB); /* 2 - add 0644 over existing 0755 -> expect 0755 */ replace_file_with_mode("exec_on", "filemodes/exec_on.0", 0644); - add_and_check_mode(index, "exec_on", 0100755); + add_and_check_mode(index, "exec_on", GIT_FILEMODE_BLOB_EXECUTABLE); /* 3 - add 0755 over existing 0644 -> expect 0644 */ replace_file_with_mode("exec_off", "filemodes/exec_off.1", 0755); - add_and_check_mode(index, "exec_off", 0100644); + add_and_check_mode(index, "exec_off", GIT_FILEMODE_BLOB); /* 4 - add 0755 over existing 0755 -> expect 0755 */ replace_file_with_mode("exec_on", "filemodes/exec_on.1", 0755); - add_and_check_mode(index, "exec_on", 0100755); + add_and_check_mode(index, "exec_on", GIT_FILEMODE_BLOB_EXECUTABLE); /* 5 - append 0644 over existing 0644 -> expect 0644 */ replace_file_with_mode("exec_off", "filemodes/exec_off.2", 0644); - append_and_check_mode(index, "exec_off", 0100644); + append_and_check_mode(index, "exec_off", GIT_FILEMODE_BLOB); /* 6 - append 0644 over existing 0755 -> expect 0755 */ replace_file_with_mode("exec_on", "filemodes/exec_on.2", 0644); - append_and_check_mode(index, "exec_on", 0100755); + append_and_check_mode(index, "exec_on", GIT_FILEMODE_BLOB_EXECUTABLE); /* 7 - append 0755 over existing 0644 -> expect 0644 */ replace_file_with_mode("exec_off", "filemodes/exec_off.3", 0755); - append_and_check_mode(index, "exec_off", 0100644); + append_and_check_mode(index, "exec_off", GIT_FILEMODE_BLOB); /* 8 - append 0755 over existing 0755 -> expect 0755 */ replace_file_with_mode("exec_on", "filemodes/exec_on.3", 0755); - append_and_check_mode(index, "exec_on", 0100755); + append_and_check_mode(index, "exec_on", GIT_FILEMODE_BLOB_EXECUTABLE); /* 9 - add new 0644 -> expect 0644 */ cl_git_write2file("filemodes/new_off", "blah", O_WRONLY | O_CREAT | O_TRUNC, 0644); - add_and_check_mode(index, "new_off", 0100644); + add_and_check_mode(index, "new_off", GIT_FILEMODE_BLOB); /* this test won't give predictable results on a platform * that doesn't support filemodes correctly, so skip it. @@ -142,7 +142,7 @@ void test_index_filemodes__untrusted(void) /* 10 - add 0755 -> expect 0755 */ cl_git_write2file("filemodes/new_on", "blah", O_WRONLY | O_CREAT | O_TRUNC, 0755); - add_and_check_mode(index, "new_on", 0100755); + add_and_check_mode(index, "new_on", GIT_FILEMODE_BLOB_EXECUTABLE); } git_index_free(index); @@ -168,45 +168,45 @@ void test_index_filemodes__trusted(void) /* 1 - add 0644 over existing 0644 -> expect 0644 */ replace_file_with_mode("exec_off", "filemodes/exec_off.0", 0644); - add_and_check_mode(index, "exec_off", 0100644); + add_and_check_mode(index, "exec_off", GIT_FILEMODE_BLOB); /* 2 - add 0644 over existing 0755 -> expect 0644 */ replace_file_with_mode("exec_on", "filemodes/exec_on.0", 0644); - add_and_check_mode(index, "exec_on", 0100644); + add_and_check_mode(index, "exec_on", GIT_FILEMODE_BLOB); /* 3 - add 0755 over existing 0644 -> expect 0755 */ replace_file_with_mode("exec_off", "filemodes/exec_off.1", 0755); - add_and_check_mode(index, "exec_off", 0100755); + add_and_check_mode(index, "exec_off", GIT_FILEMODE_BLOB_EXECUTABLE); /* 4 - add 0755 over existing 0755 -> expect 0755 */ replace_file_with_mode("exec_on", "filemodes/exec_on.1", 0755); - add_and_check_mode(index, "exec_on", 0100755); + add_and_check_mode(index, "exec_on", GIT_FILEMODE_BLOB_EXECUTABLE); /* 5 - append 0644 over existing 0644 -> expect 0644 */ replace_file_with_mode("exec_off", "filemodes/exec_off.2", 0644); - append_and_check_mode(index, "exec_off", 0100644); + append_and_check_mode(index, "exec_off", GIT_FILEMODE_BLOB); /* 6 - append 0644 over existing 0755 -> expect 0644 */ replace_file_with_mode("exec_on", "filemodes/exec_on.2", 0644); - append_and_check_mode(index, "exec_on", 0100644); + append_and_check_mode(index, "exec_on", GIT_FILEMODE_BLOB); /* 7 - append 0755 over existing 0644 -> expect 0755 */ replace_file_with_mode("exec_off", "filemodes/exec_off.3", 0755); - append_and_check_mode(index, "exec_off", 0100755); + append_and_check_mode(index, "exec_off", GIT_FILEMODE_BLOB_EXECUTABLE); /* 8 - append 0755 over existing 0755 -> expect 0755 */ replace_file_with_mode("exec_on", "filemodes/exec_on.3", 0755); - append_and_check_mode(index, "exec_on", 0100755); + append_and_check_mode(index, "exec_on", GIT_FILEMODE_BLOB_EXECUTABLE); /* 9 - add new 0644 -> expect 0644 */ cl_git_write2file("filemodes/new_off", "blah", O_WRONLY | O_CREAT | O_TRUNC, 0644); - add_and_check_mode(index, "new_off", 0100644); + add_and_check_mode(index, "new_off", GIT_FILEMODE_BLOB); /* 10 - add 0755 -> expect 0755 */ cl_git_write2file("filemodes/new_on", "blah", O_WRONLY | O_CREAT | O_TRUNC, 0755); - add_and_check_mode(index, "new_on", 0100755); + add_and_check_mode(index, "new_on", GIT_FILEMODE_BLOB_EXECUTABLE); git_index_free(index); } diff --git a/tests-clar/object/tree/attributes.c b/tests-clar/object/tree/attributes.c index ed88e7486..cee72f1f7 100644 --- a/tests-clar/object/tree/attributes.c +++ b/tests-clar/object/tree/attributes.c @@ -4,9 +4,6 @@ static const char *blob_oid = "3d0970ec547fc41ef8a5882dde99c6adce65b021"; static const char *tree_oid = "1b05fdaa881ee45b48cbaa5e9b037d667a47745e"; -#define GROUP_WRITABLE_FILE 0100664 -#define REGULAR_FILE 0100644 - void test_object_tree_attributes__ensure_correctness_of_attributes_on_insertion(void) { git_treebuilder *builder; @@ -16,9 +13,9 @@ void test_object_tree_attributes__ensure_correctness_of_attributes_on_insertion( cl_git_pass(git_treebuilder_create(&builder, NULL)); - cl_git_fail(git_treebuilder_insert(NULL, builder, "one.txt", &oid, 0777777)); - cl_git_fail(git_treebuilder_insert(NULL, builder, "one.txt", &oid, 0100666)); - cl_git_fail(git_treebuilder_insert(NULL, builder, "one.txt", &oid, 0000001)); + cl_git_fail(git_treebuilder_insert(NULL, builder, "one.txt", &oid, (git_filemode_t)0777777)); + cl_git_fail(git_treebuilder_insert(NULL, builder, "one.txt", &oid, (git_filemode_t)0100666)); + cl_git_fail(git_treebuilder_insert(NULL, builder, "one.txt", &oid, (git_filemode_t)0000001)); git_treebuilder_free(builder); } @@ -37,7 +34,7 @@ void test_object_tree_attributes__group_writable_tree_entries_created_with_an_an entry = git_tree_entry_byname(tree, "old_mode.txt"); cl_assert_equal_i( - GROUP_WRITABLE_FILE, + GIT_FILEMODE_BLOB_GROUP_WRITABLE, git_tree_entry_attributes(entry)); git_tree_free(tree); @@ -63,10 +60,10 @@ void test_object_tree_attributes__normalize_attributes_when_inserting_in_a_new_t builder, "normalized.txt", &bid, - GROUP_WRITABLE_FILE)); + GIT_FILEMODE_BLOB_GROUP_WRITABLE)); cl_assert_equal_i( - REGULAR_FILE, + GIT_FILEMODE_BLOB, git_tree_entry_attributes(entry)); cl_git_pass(git_treebuilder_write(&tid, repo, builder)); @@ -76,7 +73,7 @@ void test_object_tree_attributes__normalize_attributes_when_inserting_in_a_new_t entry = git_tree_entry_byname(tree, "normalized.txt"); cl_assert_equal_i( - REGULAR_FILE, + GIT_FILEMODE_BLOB, git_tree_entry_attributes(entry)); git_tree_free(tree); @@ -100,7 +97,7 @@ void test_object_tree_attributes__normalize_attributes_when_creating_a_tree_from entry = git_treebuilder_get(builder, "old_mode.txt"); cl_assert_equal_i( - REGULAR_FILE, + GIT_FILEMODE_BLOB, git_tree_entry_attributes(entry)); cl_git_pass(git_treebuilder_write(&tid2, repo, builder)); @@ -110,7 +107,7 @@ void test_object_tree_attributes__normalize_attributes_when_creating_a_tree_from cl_git_pass(git_tree_lookup(&tree, repo, &tid2)); entry = git_tree_entry_byname(tree, "old_mode.txt"); cl_assert_equal_i( - REGULAR_FILE, + GIT_FILEMODE_BLOB, git_tree_entry_attributes(entry)); git_tree_free(tree); diff --git a/tests-clar/object/tree/write.c b/tests-clar/object/tree/write.c index 8b0f3417f..657bed289 100644 --- a/tests-clar/object/tree/write.c +++ b/tests-clar/object/tree/write.c @@ -35,11 +35,16 @@ void test_object_tree_write__from_memory(void) cl_git_pass(git_tree_lookup(&tree, g_repo, &id)); cl_git_pass(git_treebuilder_create(&builder, tree)); - cl_git_fail(git_treebuilder_insert(NULL, builder, "", &bid, 0100644)); - cl_git_fail(git_treebuilder_insert(NULL, builder, "/", &bid, 0100644)); - cl_git_fail(git_treebuilder_insert(NULL, builder, "folder/new.txt", &bid, 0100644)); + cl_git_fail(git_treebuilder_insert(NULL, builder, "", + &bid, GIT_FILEMODE_BLOB)); + cl_git_fail(git_treebuilder_insert(NULL, builder, "/", + &bid, GIT_FILEMODE_BLOB)); + cl_git_fail(git_treebuilder_insert(NULL, builder, "folder/new.txt", + &bid, GIT_FILEMODE_BLOB)); + + cl_git_pass(git_treebuilder_insert( + NULL, builder, "new.txt", &bid, GIT_FILEMODE_BLOB)); - cl_git_pass(git_treebuilder_insert(NULL,builder,"new.txt",&bid,0100644)); cl_git_pass(git_treebuilder_write(&rid, g_repo, builder)); cl_assert(git_oid_cmp(&rid, &id2) == 0); @@ -63,14 +68,16 @@ void test_object_tree_write__subtree(void) //create subtree cl_git_pass(git_treebuilder_create(&builder, NULL)); - cl_git_pass(git_treebuilder_insert(NULL,builder,"new.txt",&bid,0100644)); //-V536 + cl_git_pass(git_treebuilder_insert( + NULL, builder, "new.txt", &bid, GIT_FILEMODE_BLOB)); //-V536 cl_git_pass(git_treebuilder_write(&subtree_id, g_repo, builder)); git_treebuilder_free(builder); // create parent tree cl_git_pass(git_tree_lookup(&tree, g_repo, &id)); cl_git_pass(git_treebuilder_create(&builder, tree)); - cl_git_pass(git_treebuilder_insert(NULL,builder,"new",&subtree_id,040000)); //-V536 + cl_git_pass(git_treebuilder_insert( + NULL, builder, "new", &subtree_id, GIT_FILEMODE_TREE)); //-V536 cl_git_pass(git_treebuilder_write(&id_hiearar, g_repo, builder)); git_treebuilder_free(builder); git_tree_free(tree); @@ -96,23 +103,23 @@ void test_object_tree_write__sorted_subtrees(void) unsigned int attr; const char *filename; } entries[] = { - { 0100644, ".gitattributes" }, - { 0100644, ".gitignore" }, - { 0100644, ".htaccess" }, - { 0100644, "Capfile" }, - { 0100644, "Makefile"}, - { 0100644, "README"}, - { 0040000, "app"}, - { 0040000, "cake"}, - { 0040000, "config"}, - { 0100644, "c"}, - { 0100644, "git_test.txt"}, - { 0100644, "htaccess.htaccess"}, - { 0100644, "index.php"}, - { 0040000, "plugins"}, - { 0040000, "schemas"}, - { 0040000, "ssl-certs"}, - { 0040000, "vendors"} + { GIT_FILEMODE_BLOB, ".gitattributes" }, + { GIT_FILEMODE_BLOB, ".gitignore" }, + { GIT_FILEMODE_BLOB, ".htaccess" }, + { GIT_FILEMODE_BLOB, "Capfile" }, + { GIT_FILEMODE_BLOB, "Makefile"}, + { GIT_FILEMODE_BLOB, "README"}, + { GIT_FILEMODE_TREE, "app"}, + { GIT_FILEMODE_TREE, "cake"}, + { GIT_FILEMODE_TREE, "config"}, + { GIT_FILEMODE_BLOB, "c"}, + { GIT_FILEMODE_BLOB, "git_test.txt"}, + { GIT_FILEMODE_BLOB, "htaccess.htaccess"}, + { GIT_FILEMODE_BLOB, "index.php"}, + { GIT_FILEMODE_TREE, "plugins"}, + { GIT_FILEMODE_TREE, "schemas"}, + { GIT_FILEMODE_TREE, "ssl-certs"}, + { GIT_FILEMODE_TREE, "vendors"} }; git_oid blank_oid, tree_oid;