static int write_back(git_object *object) { int error; git_oid new_id; assert(object); assert(object->source.open); assert(object->modified); object->source.raw.len = object->source.written_bytes; if ((error = git_odb_write(&new_id, object->repo->db, &object->source.raw)) < GIT_SUCCESS) return error; if (object->in_memory) { int idx = git_vector_search(&object->repo->memory_objects, object); git_vector_remove(&object->repo->memory_objects, idx); } else { git_hashtable_remove(object->repo->objects, &object->id); } git_oid_cpy(&object->id, &new_id); git_hashtable_insert(object->repo->objects, &object->id, object); object->source.write_ptr = NULL; object->source.written_bytes = 0; object->modified = 0; object->in_memory = 0; git_object__source_close(object); return GIT_SUCCESS; }
git_vector_foreach(contents, i, ps) { /* skip if before start_stat or after end_stat */ cmp_len = min(start_len, ps->path_len); if (cmp_len && strncomp(ps->path, start_stat, cmp_len) < 0) continue; cmp_len = min(end_len, ps->path_len); if (cmp_len && strncomp(ps->path, end_stat, cmp_len) > 0) continue; git_buf_truncate(&full, prefix_len); if ((error = git_buf_joinpath(&full, full.ptr, ps->path)) < 0 || (error = git_path_lstat(full.ptr, &ps->st)) < 0) { if (error == GIT_ENOTFOUND) { giterr_clear(); error = 0; git_vector_remove(contents, i--); continue; } break; } if (S_ISDIR(ps->st.st_mode)) { ps->path[ps->path_len++] = '/'; ps->path[ps->path_len] = '\0'; } }
/* * Free all the windows in a sequence, typically because we're done * with the file */ void git_mwindow_free_all(git_mwindow_file *mwf) { unsigned int i; /* * Remove these windows from the global list */ for (i = 0; i < ctl.windowfiles.length; ++i){ if (git_vector_get(&ctl.windowfiles, i) == mwf) { git_vector_remove(&ctl.windowfiles, i); break; } } if (ctl.windowfiles.length == 0) { git_vector_free(&ctl.windowfiles); ctl.windowfiles.contents = NULL; } while (mwf->windows) { git_mwindow *w = mwf->windows; assert(w->inuse_cnt == 0); ctl.mapped -= w->window_map.len; ctl.open_windows--; git_futils_mmap_free(&w->window_map); mwf->windows = w->next; free(w); } }
/* don't read past array bounds on remove() */ void test_core_vector__1(void) { git_vector x; /* make initial capacity exact for our insertions. */ git_vector_init(&x, 3, NULL); git_vector_insert(&x, (void*) 0xabc); git_vector_insert(&x, (void*) 0xdef); git_vector_insert(&x, (void*) 0x123); git_vector_remove(&x, 0); /* used to read past array bounds. */ git_vector_free(&x); }
git_vector_foreach(contents, i, ps) { /* skip if before start_stat or after end_stat */ cmp_len = min(start_len, ps->path_len); if (cmp_len && strncomp(ps->path, start_stat, cmp_len) < 0) continue; cmp_len = min(end_len, ps->path_len); if (cmp_len && strncomp(ps->path, end_stat, cmp_len) > 0) continue; git_buf_truncate(&full, prefix_len); if ((error = git_buf_joinpath(&full, full.ptr, ps->path)) < 0 || (error = git_path_lstat(full.ptr, &ps->st)) < 0) { if (error == GIT_ENOTFOUND) { /* file was removed between readdir and lstat */ char *entry_path = git_vector_get(contents, i); git_vector_remove(contents, i--); git__free(entry_path); } else { /* Treat the file as unreadable if we get any other error */ memset(&ps->st, 0, sizeof(ps->st)); ps->st.st_mode = GIT_FILEMODE_UNREADABLE; } giterr_clear(); error = 0; continue; } if (S_ISDIR(ps->st.st_mode)) { ps->path[ps->path_len++] = '/'; ps->path[ps->path_len] = '\0'; } else if (!S_ISREG(ps->st.st_mode) && !S_ISLNK(ps->st.st_mode)) { char *entry_path = git_vector_get(contents, i); git_vector_remove(contents, i--); git__free(entry_path); } }
int git_reflog_drop(git_reflog *reflog, size_t idx, int rewrite_previous_entry) { size_t entrycount; git_reflog_entry *entry, *previous; entrycount = git_reflog_entrycount(reflog); entry = (git_reflog_entry *)git_reflog_entry_byindex(reflog, idx); if (entry == NULL) { giterr_set(GITERR_REFERENCE, "No reflog entry at index "PRIuZ, idx); return GIT_ENOTFOUND; } git_reflog_entry__free(entry); if (git_vector_remove( &reflog->entries, reflog_inverse_index(idx, entrycount)) < 0) return -1; if (!rewrite_previous_entry) return 0; /* No need to rewrite anything when removing the most recent entry */ if (idx == 0) return 0; /* Have the latest entry just been dropped? */ if (entrycount == 1) return 0; entry = (git_reflog_entry *)git_reflog_entry_byindex(reflog, idx - 1); /* If the oldest entry has just been removed... */ if (idx == entrycount - 1) { /* ...clear the oid_old member of the "new" oldest entry */ if (git_oid_fromstr(&entry->oid_old, GIT_OID_HEX_ZERO) < 0) return -1; return 0; } previous = (git_reflog_entry *)git_reflog_entry_byindex(reflog, idx); git_oid_cpy(&entry->oid_old, &previous->oid_cur); return 0; }
int git_tree_remove_entry_byindex(git_tree *tree, int idx) { git_tree_entry *remove_ptr; assert(tree); remove_ptr = git_vector_get(&tree->entries, (unsigned int)idx); if (remove_ptr == NULL) return GIT_ENOTFOUND; free(remove_ptr->filename); free(remove_ptr); tree->object.modified = 1; return git_vector_remove(&tree->entries, (unsigned int)idx); }
static int store_refs(transport_http *t) { http_parser_settings settings; char buffer[1024]; gitno_buffer buf; git_pkt *pkt; int ret; http_parser_init(&t->parser, HTTP_RESPONSE); t->parser.data = t; memset(&settings, 0x0, sizeof(http_parser_settings)); settings.on_header_field = on_header_field; settings.on_header_value = on_header_value; settings.on_headers_complete = on_headers_complete; settings.on_body = on_body_store_refs; settings.on_message_complete = on_message_complete; gitno_buffer_setup((git_transport *)t, &buf, buffer, sizeof(buffer)); while(1) { size_t parsed; if ((ret = gitno_recv(&buf)) < 0) return -1; parsed = http_parser_execute(&t->parser, &settings, buf.data, buf.offset); /* Both should happen at the same time */ if (parsed != buf.offset || t->error < 0) return t->error; gitno_consume_n(&buf, parsed); if (ret == 0 || t->transfer_finished) return 0; } pkt = git_vector_get(&t->refs, 0); if (pkt == NULL || pkt->type != GIT_PKT_COMMENT) { giterr_set(GITERR_NET, "Invalid HTTP response"); return t->error = -1; } else { git_vector_remove(&t->refs, 0); } return 0; }
void git_object_close(git_object *object) { if (object == NULL) return; if (--object->refcount <= 0) { if (object->repo != NULL) { if (object->in_memory) { int idx = git_vector_search(&object->repo->memory_objects, object); git_vector_remove(&object->repo->memory_objects, idx); } else { git_hashtable_remove(object->repo->objects, &object->id); } } git_object__free(object); } }
int git_index_remove(git_index *index, int position) { git_vector_sort(&index->entries); return git_vector_remove(&index->entries, (unsigned int)position); }