static void assert_content_in_index( git_strarray *pathspecs, bool should_exist, git_strarray *expected_shas) { size_t i, pos; int error; for (i = 0; i < pathspecs->count; i++) { error = git_index_find(&pos, _index, pathspecs->strings[i]); if (should_exist) { const git_index_entry *entry; cl_assert(error != GIT_ENOTFOUND); entry = git_index_get_byindex(_index, pos); cl_assert(entry != NULL); if (!expected_shas) continue; cl_git_pass(git_oid_streq(&entry->oid, expected_shas->strings[i])); } else cl_assert_equal_i(should_exist, error != GIT_ENOTFOUND); } }
PyObject * Index_getitem(Index *self, PyObject *value) { long idx; char *path; const git_index_entry *index_entry; /* Case 1: integer */ if (PyLong_Check(value)) { idx = PyLong_AsLong(value); if (idx == -1 && PyErr_Occurred()) return NULL; if (idx < 0) { PyErr_SetObject(PyExc_ValueError, value); return NULL; } index_entry = git_index_get_byindex(self->index, (size_t)idx); /* Case 2: byte or text string */ } else { path = py_path_to_c_str(value); if (!path) return NULL; index_entry = git_index_get_bypath(self->index, path, 0); free(path); } if (!index_entry) { PyErr_SetObject(PyExc_KeyError, value); return NULL; } return wrap_index_entry(index_entry, self); }
void test_index_rename__single_file(void) { git_repository *repo; git_index *index; size_t position; git_oid expected; const git_index_entry *entry; p_mkdir("rename", 0700); cl_git_pass(git_repository_init(&repo, "./rename", 0)); cl_git_pass(git_repository_index(&index, repo)); cl_assert(git_index_entrycount(index) == 0); cl_git_mkfile("./rename/lame.name.txt", "new_file\n"); /* This should add a new blob to the object database in 'd4/fa8600b4f37d7516bef4816ae2c64dbf029e3a' */ cl_git_pass(git_index_add_bypath(index, "lame.name.txt")); cl_assert(git_index_entrycount(index) == 1); cl_git_pass(git_oid_fromstr(&expected, "d4fa8600b4f37d7516bef4816ae2c64dbf029e3a")); cl_assert(!git_index_find(&position, index, "lame.name.txt")); entry = git_index_get_byindex(index, position); cl_assert_equal_oid(&expected, &entry->id); /* This removes the entry from the index, but not from the object database */ cl_git_pass(git_index_remove(index, "lame.name.txt", 0)); cl_assert(git_index_entrycount(index) == 0); p_rename("./rename/lame.name.txt", "./rename/fancy.name.txt"); cl_git_pass(git_index_add_bypath(index, "fancy.name.txt")); cl_assert(git_index_entrycount(index) == 1); cl_assert(!git_index_find(&position, index, "fancy.name.txt")); entry = git_index_get_byindex(index, position); cl_assert_equal_oid(&expected, &entry->id); git_index_free(index); git_repository_free(repo); cl_fixture_cleanup("rename"); }
static bool try_create_file_with_nsec_timestamp(const char *path) { struct stat st; int try; /* retry a few times to avoid nanos *actually* equal 0 race condition */ for (try = 0; try < 3; try++) { cl_git_mkfile(path, "This is hopefully a file with nanoseconds!"); cl_must_pass(p_stat(path, &st)); if (st.st_ctime_nsec && st.st_mtime_nsec) return true; } return false; } /* try to determine if the underlying filesystem supports a resolution * higher than a single second. (i'm looking at you, hfs+) */ static bool should_expect_nsecs(void) { git_buf nsec_path = GIT_BUF_INIT; bool expect; git_buf_joinpath(&nsec_path, clar_sandbox_path(), "nsec_test"); expect = try_create_file_with_nsec_timestamp(nsec_path.ptr); p_unlink(nsec_path.ptr); git_buf_clear(&nsec_path); return expect; } static bool has_nsecs(void) { const git_index_entry *entry; size_t i; bool has_nsecs = false; for (i = 0; i < git_index_entrycount(repo_index); i++) { entry = git_index_get_byindex(repo_index, i); if (entry->ctime.nanoseconds || entry->mtime.nanoseconds) { has_nsecs = true; break; } } return has_nsecs; } void test_index_nsec__has_nanos(void) { cl_assert_equal_b(true, has_nsecs()); }
static void add_entry_and_check_mode_( git_index *index, bool from_file, git_filemode_t mode, const char *file, int line) { size_t pos; const git_index_entry* entry; git_index_entry new_entry; /* If old_filename exists, we copy that to the new file, and test * git_index_add(), otherwise create a new entry testing git_index_add_frombuffer */ if (from_file) { clar__assert(!git_index_find(&pos, index, "exec_off"), file, line, "Cannot find original index entry", NULL, 1); entry = git_index_get_byindex(index, pos); memcpy(&new_entry, entry, sizeof(new_entry)); } else memset(&new_entry, 0x0, sizeof(git_index_entry)); new_entry.path = "filemodes/explicit_test"; new_entry.mode = mode; if (from_file) { clar__assert(!git_index_add(index, &new_entry), file, line, "Cannot add index entry", NULL, 1); } else { const char *content = "hey there\n"; clar__assert(!git_index_add_frombuffer(index, &new_entry, content, strlen(content)), file, line, "Cannot add index entry from buffer", NULL, 1); } clar__assert(!git_index_find(&pos, index, "filemodes/explicit_test"), file, line, "Cannot find new index entry", NULL, 1); entry = git_index_get_byindex(index, pos); clar__assert_equal(file, line, "Expected mode does not match index", 1, "%07o", (unsigned int)entry->mode, (unsigned int)mode); }
int CGitIndexList::ReadIndex(CString dgitdir) { this->clear(); m_critRepoSec.Lock(); if (repository.Open(dgitdir)) { m_critRepoSec.Unlock(); return -1; } // add config files CAutoConfig config(true); CString projectConfig = dgitdir + _T("config"); CString globalConfig = g_Git.GetGitGlobalConfig(); CString globalXDGConfig = g_Git.GetGitGlobalXDGConfig(); CString systemConfig(CRegString(REG_SYSTEM_GITCONFIGPATH, _T(""), FALSE)); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(projectConfig), GIT_CONFIG_LEVEL_LOCAL, FALSE); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(globalConfig), GIT_CONFIG_LEVEL_GLOBAL, FALSE); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(globalXDGConfig), GIT_CONFIG_LEVEL_XDG, FALSE); if (!systemConfig.IsEmpty()) git_config_add_file_ondisk(config, CGit::GetGitPathStringA(systemConfig), GIT_CONFIG_LEVEL_SYSTEM, FALSE); git_repository_set_config(repository, config); CAutoIndex index; // load index in order to enumerate files if (git_repository_index(index.GetPointer(), repository)) { repository.Free(); m_critRepoSec.Unlock(); return -1; } size_t ecount = git_index_entrycount(index); resize(ecount); for (size_t i = 0; i < ecount; ++i) { const git_index_entry *e = git_index_get_byindex(index, i); this->at(i).m_FileName.Empty(); this->at(i).m_FileName = CUnicodeUtils::GetUnicode(e->path); this->at(i).m_FileName.MakeLower(); this->at(i).m_ModifyTime = e->mtime.seconds; this->at(i).m_Flags = e->flags | e->flags_extended; this->at(i).m_IndexHash = e->id.id; this->at(i).m_Size = e->file_size; } g_Git.GetFileModifyTime(dgitdir + _T("index"), &this->m_LastModifyTime); std::sort(this->begin(), this->end(), SortIndex); m_critRepoSec.Unlock(); return 0; }
int cmd_ls_files(git_repository *repo, int argc, char **argv) { int i; int rc = EXIT_FAILURE; int show_cached = 1; int err = 0; char *file = NULL; char buf[GIT_OID_HEXSZ+1]; git_index *idx = NULL; for (i=1;i<argc;i++) { if (strcmp(argv[i], "--stage") == 0 || strcmp(argv[i], "-s") == 0) show_cached = 0; else if (strcmp(argv[i], "--cached") == 0 || strcmp(argv[i], "-c") == 0) show_cached = 1; else if (argv[i][0] == '-') { fprintf(stderr,"Unknown option %s!\n",argv[i]); goto out; } else { file = argv[i]; } } if (!file) file = "*"; if ((err = git_repository_index(&idx, repo)) != GIT_OK) goto out; const char *prefix = ""; size_t prefix_len = strlen(prefix); for (unsigned i = 0; i < git_index_entrycount(idx); i++) { const git_index_entry *gie = git_index_get_byindex(idx, i); if (prefixcmp(gie->path, prefix)) continue; if (pathspeccmp(gie->path,file)) continue; if (!show_cached) printf("%06o %s %i\t", gie->mode, git_oid_tostr(buf, GIT_OID_HEXSZ+1, &gie->id), git_index_entry_stage(gie)); write_name_quoted(gie->path + prefix_len, stdout, '\n'); } rc = EXIT_SUCCESS; out: if (err) libgit_error(); if (idx) git_index_free(idx); return rc; }
void test_index_tests__add_frombuffer(void) { git_index *index; git_repository *repo; git_index_entry entry; const git_index_entry *returned_entry; git_oid id1; git_blob *blob; const char *content = "hey there\n"; cl_set_cleanup(&cleanup_myrepo, NULL); /* Intialize a new repository */ cl_git_pass(git_repository_init(&repo, "./myrepo", 0)); /* Ensure we're the only guy in the room */ cl_git_pass(git_repository_index(&index, repo)); cl_assert(git_index_entrycount(index) == 0); /* Store the expected hash of the file/blob * This has been generated by executing the following * $ echo "hey there" | git hash-object --stdin */ cl_git_pass(git_oid_fromstr(&id1, "a8233120f6ad708f843d861ce2b7228ec4e3dec6")); /* Add the new file to the index */ memset(&entry, 0x0, sizeof(git_index_entry)); entry.mode = GIT_FILEMODE_BLOB; entry.path = "test.txt"; cl_git_pass(git_index_add_frombuffer(index, &entry, content, strlen(content))); /* Wow... it worked! */ cl_assert(git_index_entrycount(index) == 1); returned_entry = git_index_get_byindex(index, 0); /* And the built-in hashing mechanism worked as expected */ cl_assert_equal_oid(&id1, &returned_entry->id); /* And mode is the one asked */ cl_assert_equal_i(GIT_FILEMODE_BLOB, returned_entry->mode); /* Test access by path instead of index */ cl_assert((returned_entry = git_index_get_bypath(index, "test.txt", 0)) != NULL); cl_assert_equal_oid(&id1, &returned_entry->id); /* Test the blob is in the repository */ cl_git_pass(git_blob_lookup(&blob, repo, &id1)); cl_assert_equal_s( content, git_blob_rawcontent(blob)); git_blob_free(blob); git_index_free(index); git_repository_free(repo); }
PyObject * IndexIter_iternext(IndexIter *self) { const git_index_entry *index_entry; index_entry = git_index_get_byindex(self->owner->index, self->i); if (!index_entry) return NULL; self->i += 1; return wrap_index_entry(index_entry, self->owner); }
static void assert_proper_normalization(git_index *index, const char *filename, const char *expected_sha) { size_t index_pos; const git_index_entry *entry; add_to_workdir(filename, CONTENT); cl_git_pass(git_index_add_bypath(index, filename)); cl_assert(!git_index_find(&index_pos, index, filename)); entry = git_index_get_byindex(index, index_pos); cl_assert_equal_i(0, git_oid_streq(&entry->oid, expected_sha)); }
int main (int argc, char** argv) { git_repository *repo; git_index *index; unsigned int i, ecount; char *dir = "."; char out[41]; out[40] = '\0'; if (argc > 1) dir = argv[1]; if (argc > 2) { fprintf(stderr, "usage: showindex [<repo-dir>]\n"); return 1; } if (git_repository_open_ext(&repo, dir, 0, NULL) < 0) { fprintf(stderr, "could not open repository: %s\n", dir); return 1; } git_repository_index(&index, repo); git_index_read(index); ecount = git_index_entrycount(index); if (!ecount) printf("Empty index\n"); for (i = 0; i < ecount; ++i) { const git_index_entry *e = git_index_get_byindex(index, i); git_oid_fmt(out, &e->oid); printf("File Path: %s\n", e->path); printf(" Stage: %d\n", git_index_entry_stage(e)); printf(" Blob SHA: %s\n", out); printf("File Size: %d\n", (int)e->file_size); printf(" Device: %d\n", (int)e->dev); printf(" Inode: %d\n", (int)e->ino); printf(" UID: %d\n", (int)e->uid); printf(" GID: %d\n", (int)e->gid); printf(" ctime: %d\n", (int)e->ctime.seconds); printf(" mtime: %d\n", (int)e->mtime.seconds); printf("\n"); } git_index_free(index); git_repository_free(repo); return 0; }
void test_index_conflicts__remove(void) { const git_index_entry *entry; size_t i; cl_assert(git_index_entrycount(repo_index) == 8); cl_git_pass(git_index_conflict_remove(repo_index, "conflicts-one.txt")); cl_assert(git_index_entrycount(repo_index) == 5); for (i = 0; i < git_index_entrycount(repo_index); i++) { cl_assert(entry = git_index_get_byindex(repo_index, i)); cl_assert(strcmp(entry->path, "conflicts-one.txt") != 0); } cl_git_pass(git_index_conflict_remove(repo_index, "conflicts-two.txt")); cl_assert(git_index_entrycount(repo_index) == 2); for (i = 0; i < git_index_entrycount(repo_index); i++) { cl_assert(entry = git_index_get_byindex(repo_index, i)); cl_assert(strcmp(entry->path, "conflicts-two.txt") != 0); } }
static void assert_proper_normalization(git_index *index, const char *filename, const char *expected_sha) { int index_pos; git_index_entry *entry; add_to_workdir(filename, CONTENT); cl_git_pass(git_index_add_from_workdir(index, filename)); index_pos = git_index_find(index, filename); cl_assert(index_pos >= 0); entry = git_index_get_byindex(index, index_pos); cl_assert_equal_i(0, git_oid_streq(&entry->oid, expected_sha)); }
static size_t merge_trivial_conflict_entrycount(void) { const git_index_entry *entry; size_t count = 0; size_t i; for (i = 0; i < git_index_entrycount(repo_index); i++) { cl_assert(entry = git_index_get_byindex(repo_index, i)); if (git_index_entry_stage(entry) > 0) count++; } return count; }
void test_index_read_index__maintains_stat_cache(void) { git_index *new_index; git_oid index_id; git_index_entry new_entry; const git_index_entry *e; git_tree *tree; size_t i; cl_assert_equal_i(4, git_index_entrycount(_index)); /* write-tree */ cl_git_pass(git_index_write_tree(&index_id, _index)); /* read-tree, then read index */ git_tree_lookup(&tree, _repo, &index_id); cl_git_pass(git_index_new(&new_index)); cl_git_pass(git_index_read_tree(new_index, tree)); git_tree_free(tree); /* add a new entry that will not have stat data */ memset(&new_entry, 0, sizeof(git_index_entry)); new_entry.path = "Hello"; git_oid_fromstr(&new_entry.id, "0123456789012345678901234567890123456789"); new_entry.file_size = 1234; new_entry.mode = 0100644; cl_git_pass(git_index_add(new_index, &new_entry)); cl_assert_equal_i(5, git_index_entrycount(new_index)); cl_git_pass(git_index_read_index(_index, new_index)); git_index_free(new_index); cl_assert_equal_i(5, git_index_entrycount(_index)); for (i = 0; i < git_index_entrycount(_index); i++) { e = git_index_get_byindex(_index, i); if (strcmp(e->path, "Hello") == 0) { cl_assert_equal_i(0, e->ctime.seconds); cl_assert_equal_i(0, e->mtime.seconds); } else { cl_assert(0 != e->ctime.seconds); cl_assert(0 != e->mtime.seconds); } } }
void test_index_filemodes__read(void) { git_index *index; unsigned int i; static bool expected[6] = { 0, 1, 0, 1, 0, 1 }; cl_git_pass(git_repository_index(&index, g_repo)); cl_assert_equal_i(6, (int)git_index_entrycount(index)); for (i = 0; i < 6; ++i) { const git_index_entry *entry = git_index_get_byindex(index, i); cl_assert(entry != NULL); cl_assert(((entry->mode & 0100) ? 1 : 0) == expected[i]); } git_index_free(index); }
void test_index_tests__add(void) { git_index *index; git_filebuf file = GIT_FILEBUF_INIT; git_repository *repo; const git_index_entry *entry; git_oid id1; cl_set_cleanup(&cleanup_myrepo, NULL); /* Intialize a new repository */ cl_git_pass(git_repository_init(&repo, "./myrepo", 0)); /* Ensure we're the only guy in the room */ cl_git_pass(git_repository_index(&index, repo)); cl_assert(git_index_entrycount(index) == 0); /* Create a new file in the working directory */ cl_git_pass(git_futils_mkpath2file("myrepo/test.txt", 0777)); cl_git_pass(git_filebuf_open(&file, "myrepo/test.txt", 0, 0666)); cl_git_pass(git_filebuf_write(&file, "hey there\n", 10)); cl_git_pass(git_filebuf_commit(&file)); /* Store the expected hash of the file/blob * This has been generated by executing the following * $ echo "hey there" | git hash-object --stdin */ cl_git_pass(git_oid_fromstr(&id1, "a8233120f6ad708f843d861ce2b7228ec4e3dec6")); /* Add the new file to the index */ cl_git_pass(git_index_add_bypath(index, "test.txt")); /* Wow... it worked! */ cl_assert(git_index_entrycount(index) == 1); entry = git_index_get_byindex(index, 0); /* And the built-in hashing mechanism worked as expected */ cl_assert_equal_oid(&id1, &entry->id); /* Test access by path instead of index */ cl_assert((entry = git_index_get_bypath(index, "test.txt", 0)) != NULL); cl_assert_equal_oid(&id1, &entry->id); git_index_free(index); git_repository_free(repo); }
static void add_and_check_mode_( git_index *index, const char *filename, unsigned int expect_mode, const char *file, int line) { size_t pos; const git_index_entry *entry; cl_git_pass(git_index_add_bypath(index, filename)); clar__assert(!git_index_find(&pos, index, filename), file, line, "Cannot find index entry", NULL, 1); entry = git_index_get_byindex(index, pos); clar__assert_equal(file, line, "Expected mode does not match index", 1, "%07o", (unsigned int)entry->mode, (unsigned int)expect_mode); }
void test_index_conflicts__moved_to_reuc_on_remove(void) { const git_index_entry *entry; size_t i; cl_assert(git_index_entrycount(repo_index) == 8); cl_git_pass(p_unlink("./mergedrepo/conflicts-one.txt")); cl_git_pass(git_index_remove_bypath(repo_index, "conflicts-one.txt")); cl_assert(git_index_entrycount(repo_index) == 5); for (i = 0; i < git_index_entrycount(repo_index); i++) { cl_assert(entry = git_index_get_byindex(repo_index, i)); cl_assert(strcmp(entry->path, "conflicts-one.txt") != 0); } }
PyObject * Index_getitem(Index *self, PyObject *value) { int idx; git_index_entry *index_entry; idx = Index_get_position(self, value); if (idx == -1) return NULL; index_entry = git_index_get_byindex(self->index, idx); if (!index_entry) { PyErr_SetObject(PyExc_KeyError, value); return NULL; } return wrap_index_entry(index_entry, self); }
static int attr_file_oid_from_index( git_oid *oid, git_repository *repo, const char *path) { int error; git_index *idx; size_t pos; const git_index_entry *entry; if ((error = git_repository_index__weakptr(&idx, repo)) < 0 || (error = git_index__find_pos(&pos, idx, path, 0, 0)) < 0) return error; if (!(entry = git_index_get_byindex(idx, pos))) return GIT_ENOTFOUND; *oid = entry->id; return 0; }
int CTGitPathList::FillBasedOnIndexFlags(unsigned short flag, CTGitPathList* list /*nullptr*/) { Clear(); CTGitPath path; CAutoRepository repository(g_Git.GetGitRepository()); if (!repository) return -1; CAutoIndex index; if (git_repository_index(index.GetPointer(), repository)) return -1; int count; if (list == nullptr) count = 1; else count = list->GetCount(); for (int j = 0; j < count; ++j) { for (size_t i = 0, ecount = git_index_entrycount(index); i < ecount; ++i) { const git_index_entry *e = git_index_get_byindex(index, i); if (!e || !((e->flags | e->flags_extended) & flag) || !e->path) continue; CString one = CUnicodeUtils::GetUnicode(e->path); if (!(!list || (*list)[j].GetWinPathString().IsEmpty() || one == (*list)[j].GetGitPathString() || (PathIsDirectory(g_Git.CombinePath((*list)[j].GetWinPathString())) && one.Find((*list)[j].GetGitPathString() + _T("/")) == 0))) continue; //SetFromGit will clear all status path.SetFromGit(one); if ((e->flags | e->flags_extended) & GIT_IDXENTRY_SKIP_WORKTREE) path.m_Action = CTGitPath::LOGACTIONS_SKIPWORKTREE; else if ((e->flags | e->flags_extended) & GIT_IDXENTRY_VALID) path.m_Action = CTGitPath::LOGACTIONS_ASSUMEVALID; AddPath(path); } } RemoveDuplicates(); return 0; }
/* * call-seq: * index.each { |entry| } -> nil * index.each -> Enumerator * * Passes each entry of the index to the given block. * * If no block is given, an enumerator is returned instead. */ static VALUE rb_git_index_each(VALUE self) { git_index *index; unsigned int i, count; Data_Get_Struct(self, git_index, index); if (!rb_block_given_p()) return rb_funcall(self, rb_intern("to_enum"), 0); count = (unsigned int)git_index_entrycount(index); for (i = 0; i < count; ++i) { const git_index_entry *entry = git_index_get_byindex(index, i); if (entry) rb_yield(rb_git_indexentry_fromC(entry)); } return Qnil; }
ERL_NIF_TERM geef_index_nth(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { size_t nth; geef_index *index; const git_index_entry *entry; if (!enif_get_resource(env, argv[0], geef_index_type, (void **) &index)) return enif_make_badarg(env); if (!enif_get_ulong(env, argv[1], &nth)) return enif_make_badarg(env); entry = git_index_get_byindex(index->index, nth); if (entry == NULL) return geef_error(env); return entry_to_term(env, entry); }
void test_index_conflicts__remove_all_conflicts(void) { size_t i; const git_index_entry *entry; cl_assert(git_index_entrycount(repo_index) == 8); cl_assert_equal_i(true, git_index_has_conflicts(repo_index)); git_index_conflict_cleanup(repo_index); cl_assert_equal_i(false, git_index_has_conflicts(repo_index)); cl_assert(git_index_entrycount(repo_index) == 2); for (i = 0; i < git_index_entrycount(repo_index); i++) { cl_assert(entry = git_index_get_byindex(repo_index, i)); cl_assert(git_index_entry_stage(entry) == 0); } }
void test_index_conflicts__moved_to_reuc_on_add(void) { const git_index_entry *entry; size_t i; cl_assert(git_index_entrycount(repo_index) == 8); cl_git_mkfile("./mergedrepo/conflicts-one.txt", "new-file\n"); cl_git_pass(git_index_add_bypath(repo_index, "conflicts-one.txt")); cl_assert(git_index_entrycount(repo_index) == 6); for (i = 0; i < git_index_entrycount(repo_index); i++) { cl_assert(entry = git_index_get_byindex(repo_index, i)); if (strcmp(entry->path, "conflicts-one.txt") == 0) cl_assert(git_index_entry_stage(entry) == 0); } }
/** * ggit_index_entries_get_by_index: * @entries: a #GgitIndexEntries. * @idx: the index of the entry. * * Get a #GgitIndexEntry by index. Note that the returned #GgitIndexEntry is * _only_ valid as long as: * * 1) The associated index has been closed * 2) The entry has not been removed (see ggit_index_remove()) * 3) The index has not been refreshed (see ggit_index_read()) * * Changes to the #GgitIndexEntry will be reflected in the index once written * back to disk using ggit_index_write(). * * Returns: (transfer full): a #GgitIndexEntry or %NULL if out of bounds. * **/ GgitIndexEntry * ggit_index_entries_get_by_index (GgitIndexEntries *entries, gsize idx) { git_index *gidx; const git_index_entry *entry; g_return_val_if_fail (entries != NULL, NULL); gidx = _ggit_index_get_index (entries->owner); entry = git_index_get_byindex (gidx, idx); if (entry) { return ggit_index_entry_wrap ((git_index_entry *)entry, FALSE); } else { return NULL; } }
int merge_test_index(git_index *index, const struct merge_index_entry expected[], size_t expected_len) { size_t i; const git_index_entry *index_entry; /* dump_index_entries(&index->entries); */ if (git_index_entrycount(index) != expected_len) return 0; for (i = 0; i < expected_len; i++) { if ((index_entry = git_index_get_byindex(index, i)) == NULL) return 0; if (!index_entry_eq_merge_index_entry(&expected[i], index_entry)) return 0; } return 1; }
/* * call-seq: * index[path[, stage = 0]] -> entry or nil * index[position] -> entry or nil * index.get(path[, stage = 0]) -> entry or nil * index.get(position) -> entry or nil * * Return a specific entry in the index. * * The first two forms returns entries based on their +path+ in the index and an optional +stage+, * while the last two forms return entries based on their position in the index. */ static VALUE rb_git_index_get(int argc, VALUE *argv, VALUE self) { git_index *index; const git_index_entry *entry = NULL; VALUE rb_entry, rb_stage; Data_Get_Struct(self, git_index, index); rb_scan_args(argc, argv, "11", &rb_entry, &rb_stage); if (TYPE(rb_entry) == T_STRING) { int stage = 0; if (!NIL_P(rb_stage)) { Check_Type(rb_stage, T_FIXNUM); stage = FIX2INT(rb_stage); } entry = git_index_get_bypath(index, StringValueCStr(rb_entry), stage); } else if (TYPE(rb_entry) == T_FIXNUM) { if (argc > 1) { rb_raise(rb_eArgError, "Too many arguments when trying to lookup entry by index"); } entry = git_index_get_byindex(index, FIX2INT(rb_entry)); } else { rb_raise(rb_eArgError, "Invalid type for `entry`: expected String or Fixnum"); } return entry ? rb_git_indexentry_fromC(entry) : Qnil; }
int CGitIndexList::ReadIndex(CString dgitdir) { this->clear(); CAutoLocker lock(m_critRepoSec); if (repository.Open(dgitdir)) return -1; // add config files CAutoConfig config(true); CString projectConfig = dgitdir + _T("config"); CString globalConfig = g_Git.GetGitGlobalConfig(); CString globalXDGConfig = g_Git.GetGitGlobalXDGConfig(); CString systemConfig(CRegString(REG_SYSTEM_GITCONFIGPATH, _T(""), FALSE)); CString programDataConfig(GetProgramDataGitConfig()); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(projectConfig), GIT_CONFIG_LEVEL_LOCAL, FALSE); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(globalConfig), GIT_CONFIG_LEVEL_GLOBAL, FALSE); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(globalXDGConfig), GIT_CONFIG_LEVEL_XDG, FALSE); if (!systemConfig.IsEmpty()) git_config_add_file_ondisk(config, CGit::GetGitPathStringA(systemConfig), GIT_CONFIG_LEVEL_SYSTEM, FALSE); if (!programDataConfig.IsEmpty()) git_config_add_file_ondisk(config, CGit::GetGitPathStringA(programDataConfig), GIT_CONFIG_LEVEL_PROGRAMDATA, FALSE); git_repository_set_config(repository, config); CAutoIndex index; // load index in order to enumerate files if (git_repository_index(index.GetPointer(), repository)) { repository.Free(); return -1; } m_bHasConflicts = FALSE; size_t ecount = git_index_entrycount(index); try { resize(ecount); } catch (const std::bad_alloc& ex) { repository.Free(); CTraceToOutputDebugString::Instance()(__FUNCTION__ ": Could not resize index-vector: %s\n", ex.what()); return -1; } for (size_t i = 0; i < ecount; ++i) { const git_index_entry *e = git_index_get_byindex(index, i); this->at(i).m_FileName = CUnicodeUtils::GetUnicode(e->path); this->at(i).m_FileName.MakeLower(); this->at(i).m_ModifyTime = e->mtime.seconds; this->at(i).m_Flags = e->flags; this->at(i).m_FlagsExtended = e->flags_extended; this->at(i).m_IndexHash = e->id.id; this->at(i).m_Size = e->file_size; m_bHasConflicts |= GIT_IDXENTRY_STAGE(e); } CGit::GetFileModifyTime(dgitdir + _T("index"), &this->m_LastModifyTime); std::sort(this->begin(), this->end(), SortIndex); return 0; }