static int tree_write( git_tree **out, git_repository *repo, git_tree *source_tree, const git_oid *object_oid, const char *treeentry_name, unsigned int attributes) { int error; git_treebuilder *tb = NULL; const git_tree_entry *entry; git_oid tree_oid; if ((error = git_treebuilder_create(&tb, source_tree)) < 0) goto cleanup; if (object_oid) { if ((error = git_treebuilder_insert( &entry, tb, treeentry_name, object_oid, attributes)) < 0) goto cleanup; } else { if ((error = git_treebuilder_remove(tb, treeentry_name)) < 0) goto cleanup; } if ((error = git_treebuilder_write(&tree_oid, repo, tb)) < 0) goto cleanup; error = git_tree_lookup(out, repo, &tree_oid); cleanup: git_treebuilder_free(tb); return error; }
int luagi_tree_builder_remove( lua_State *L ) { git_treebuilder** builder = checktreebuilder( L ); const char* filename = luaL_checkstring( L, 2 ); int ret = git_treebuilder_remove( *builder, filename ); lua_pushinteger( L, ret ); return 1; }
static VALUE rb_git_treebuilder_remove(VALUE self, VALUE path) { git_treebuilder *builder; int error; Data_Get_Struct(self, git_treebuilder, builder); Check_Type(path, T_STRING); error = git_treebuilder_remove(builder, StringValueCStr(path)); if (error == GIT_ENOTFOUND) return Qfalse; rugged_exception_check(error); return Qtrue; }
PyObject * TreeBuilder_remove(TreeBuilder *self, PyObject *py_filename) { char *filename = py_path_to_c_str(py_filename); int err = 0; if (filename == NULL) return NULL; err = git_treebuilder_remove(self->bld, filename); free(filename); if (err < 0) return Error_set(err); Py_RETURN_NONE; }
void test_object_tree_write__removing_and_re_adding_in_treebuilder(void) { git_treebuilder *builder; int i, aardvark_i, apple_i, apple_after_i, apple_extra_i, last_i; git_oid entry_oid, tree_oid; git_tree *tree; cl_git_pass(git_oid_fromstr(&entry_oid, blob_oid)); cl_git_pass(git_treebuilder_new(&builder, g_repo, NULL)); cl_assert_equal_i(0, (int)git_treebuilder_entrycount(builder)); for (i = 0; _entries[i].filename; ++i) cl_git_pass(git_treebuilder_insert(NULL, builder, _entries[i].filename, &entry_oid, _entries[i].attr)); cl_assert_equal_i(6, (int)git_treebuilder_entrycount(builder)); cl_git_pass(git_treebuilder_remove(builder, "apple")); cl_assert_equal_i(5, (int)git_treebuilder_entrycount(builder)); cl_git_pass(git_treebuilder_remove(builder, "apple_after")); cl_assert_equal_i(4, (int)git_treebuilder_entrycount(builder)); cl_git_pass(git_treebuilder_insert( NULL, builder, "before_last", &entry_oid, GIT_FILEMODE_BLOB)); cl_assert_equal_i(5, (int)git_treebuilder_entrycount(builder)); /* reinsert apple_after */ cl_git_pass(git_treebuilder_insert( NULL, builder, "apple_after", &entry_oid, GIT_FILEMODE_BLOB)); cl_assert_equal_i(6, (int)git_treebuilder_entrycount(builder)); cl_git_pass(git_treebuilder_remove(builder, "last")); cl_assert_equal_i(5, (int)git_treebuilder_entrycount(builder)); /* reinsert last */ cl_git_pass(git_treebuilder_insert( NULL, builder, "last", &entry_oid, GIT_FILEMODE_BLOB)); cl_assert_equal_i(6, (int)git_treebuilder_entrycount(builder)); cl_git_pass(git_treebuilder_insert( NULL, builder, "apple_extra", &entry_oid, GIT_FILEMODE_BLOB)); cl_assert_equal_i(7, (int)git_treebuilder_entrycount(builder)); cl_git_pass(git_treebuilder_write(&tree_oid, builder)); git_treebuilder_free(builder); cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_oid)); cl_assert_equal_i(7, (int)git_tree_entrycount(tree)); cl_assert(git_tree_entry_byname(tree, ".first") != NULL); cl_assert(git_tree_entry_byname(tree, "apple") == NULL); cl_assert(git_tree_entry_byname(tree, "apple_after") != NULL); cl_assert(git_tree_entry_byname(tree, "apple_extra") != NULL); cl_assert(git_tree_entry_byname(tree, "last") != NULL); aardvark_i = apple_i = apple_after_i = apple_extra_i = last_i = -1; for (i = 0; i < 7; ++i) { const git_tree_entry *entry = git_tree_entry_byindex(tree, i); if (!strcmp(entry->filename, "aardvark")) aardvark_i = i; else if (!strcmp(entry->filename, "apple")) apple_i = i; else if (!strcmp(entry->filename, "apple_after")) apple_after_i = i; else if (!strcmp(entry->filename, "apple_extra")) apple_extra_i = i; else if (!strcmp(entry->filename, "last")) last_i = i; } cl_assert_equal_i(-1, apple_i); cl_assert_equal_i(6, last_i); cl_assert(aardvark_i < apple_after_i); cl_assert(apple_after_i < apple_extra_i); git_tree_free(tree); }
void test_core_merge__demo_create_merge_commit(void) { AGBError * error; agb_error_new(&error); // Here we're going to try to use the merge iterator to create a merge commit that contains the right information. // Note - this version does not recurse into directories. (subtrees) git_treebuilder * builder; git_treebuilder_create(&builder, base_tree); AGBMergeIterator * it = agb_merge__create_iterator(head_tree, branch_tree, base_tree, agb_merge_iterator_options_NONE); for( ; agb_merge_iterator_is_valid(it) ; agb_merge_iterator_next(it) ) { AGBMergeEntry * entry = agb_merge_entry_from_iterator(it); int hasLocalChanged = !agb_git_oid_equal( agb_merge_entry_id(entry,AGB_MERGE_BASE), agb_merge_entry_id(entry,AGB_MERGE_LOCAL) ); int hasRemoteChanged = !agb_git_oid_equal( agb_merge_entry_id(entry,AGB_MERGE_BASE), agb_merge_entry_id(entry,AGB_MERGE_REMOTE) ); printf("-- %s %d %d\n", agb_merge_entry_name(entry), hasLocalChanged, hasRemoteChanged); if( !hasLocalChanged && !hasRemoteChanged) { continue; } if( hasLocalChanged && !hasRemoteChanged) { //We want the head version. if(agb_merge_entry_id(entry,AGB_MERGE_LOCAL) == NULL) { //TODO: Check error message. printf("REMOVING %s from tree\n", agb_merge_entry_name(entry) ); git_treebuilder_remove(builder, agb_merge_entry_name(entry) ); continue; } //TODO: Check for error printf("ADDING OR UPDATING %s to tree\n", agb_merge_entry_name(entry) ); int ok = git_treebuilder_insert(NULL, builder, agb_merge_entry_name(entry), agb_merge_entry_id(entry,AGB_MERGE_LOCAL), agb_merge_entry_filemode(entry,AGB_MERGE_LOCAL) ); if(ok!=0) { printf("Error duting add/update of tree builder: %s\n", giterr_last()->message); abort(); } continue; } if( !hasLocalChanged && hasRemoteChanged) { //We want the head version. if(agb_merge_entry_id(entry,AGB_MERGE_REMOTE) == NULL) { //TODO: Check error message. printf("REMOVING %s from tree\n", agb_merge_entry_name(entry) ); git_treebuilder_remove(builder, agb_merge_entry_name(entry) ); continue; } //TODO: Check for error printf("ADDING OR UPDATING %s to tree\n", agb_merge_entry_name(entry) ); int ok = git_treebuilder_insert(NULL, builder, agb_merge_entry_name(entry), agb_merge_entry_id(entry,AGB_MERGE_REMOTE), agb_merge_entry_filemode(entry,AGB_MERGE_REMOTE) ); if(ok!=0) { printf("Error duting add/update of tree builder: %s\n", giterr_last()->message); abort(); } continue; } printf("CONFLICT %s in tree\n", agb_merge_entry_name(entry) ); //TODO: CONFLICT - Handle it! } // Our tree builder should now be full... // Lets write it out to a tree // //TODO: Check for errors git_oid new_tree_oid = {}; git_treebuilder_write(&new_tree_oid, repo, builder); char hexid[GIT_OID_HEXSZ+1]; printf("Tree SHA is %s\n", git_oid_tostr(hexid,GIT_OID_HEXSZ+1, &new_tree_oid)); git_tree * new_tree = NULL; git_tree_lookup(&new_tree, repo, &new_tree_oid); // Now we need to create the commit. const git_commit** parents = (const git_commit**)malloc(sizeof(git_commit*)*2); parents[0] = head_commit; parents[1] = branch_commit; git_signature * author_signature = NULL; // Time since epoch // TODO: Get these correctly - // Could use git_signature_now instead... { git_time_t author_time = time(NULL); int timezone_offset = 0; int ok; if((ok=git_signature_new(&author_signature,"Someone","*****@*****.**", author_time, timezone_offset))!=0) { agb__error_translate(error,"git_signature_new failed",ok); goto cleanup_error; } } git_oid commit_id; int ok = git_commit_create( &commit_id, repo, NULL, author_signature, author_signature, "UTF-8", "An exciting commit", new_tree, 2, //Two parents parents ); if(ok!=0) { agb__error_translate(error,"git_commit_create failed",ok); goto cleanup_error; } // Then update the refs. //TODO: Do we need to release this ref? git_reference * ref; ok = git_reference_create_matching( &ref, repo, "refs/heads/branch_c", &commit_id, 1, NULL, author_signature, "merged by libagb"); if(ok!=0) { agb__error_translate(error,"git_reference_create failed",ok); goto cleanup_error; } git_signature_free(author_signature); // Now check we got the expected files cl_assert_equal_c('A', test_core_merge__compare_with_parents_merge_base("branch_c", "created_in_a.txt")); cl_assert_equal_c('A', test_core_merge__compare_with_parents_merge_base("branch_c", "created_in_b.txt")); return; cleanup_error: printf("ERROR: %s\n",error->message); if(author_signature) { git_signature_free(author_signature); } cl_fail(error->message); }