static int store_refs(transport_local *t) { unsigned int i; git_strarray ref_names = {0}; git_transport *transport = (git_transport *) t; assert(t); if (git_reference_list(&ref_names, t->repo, GIT_REF_LISTALL) < 0 || git_vector_init(&transport->refs, (unsigned int)ref_names.count, NULL) < 0) goto on_error; /* Sort the references first */ git__tsort((void **)ref_names.strings, ref_names.count, &git__strcmp_cb); /* Add HEAD */ if (add_ref(t, GIT_HEAD_FILE) < 0) goto on_error; for (i = 0; i < ref_names.count; ++i) { if (add_ref(t, ref_names.strings[i]) < 0) goto on_error; } git_strarray_free(&ref_names); return 0; on_error: git_vector_free(&transport->refs); git_strarray_free(&ref_names); return -1; }
void git_vector_sort(git_vector *v) { assert(v); if (v->sorted || v->_cmp == NULL) return; git__tsort(v->contents, v->length, v->_cmp); v->sorted = 1; }
static int local_ls(git_transport *transport, git_headarray *array) { int error; unsigned int i; git_repository *repo; git_vector *vec; git_strarray refs; transport_local *t = (transport_local *) transport; assert(transport && transport->connected); repo = t->repo; error = git_reference_listall(&refs, repo, GIT_REF_LISTALL); if (error < GIT_SUCCESS) return git__rethrow(error, "Failed to list remote heads"); vec = git__malloc(sizeof(git_vector)); if (vec == NULL) { error = GIT_ENOMEM; goto out; } error = git_vector_init(vec, refs.count, NULL); if (error < GIT_SUCCESS) return error; /* Sort the references first */ git__tsort((void **)refs.strings, refs.count, &git__strcmp_cb); /* Add HEAD */ error = add_ref(GIT_HEAD_FILE, repo, vec); if (error < GIT_SUCCESS) goto out; for (i = 0; i < refs.count; ++i) { error = add_ref(refs.strings[i], repo, vec); if (error < GIT_SUCCESS) goto out; } array->len = vec->length; array->heads = (git_remote_head **)vec->contents; t->refs = vec; out: git_strarray_free(&refs); return error; }
/* The filesystem iterator is a workdir iterator without any special * workdir handling capabilities (ignores, submodules, etc). */ void test_iterator_workdir__filesystem(void) { git_iterator *i; git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT; static const char *expect_base[] = { "DIR01/Sub02/file", "DIR01/sub00/file", "current_file", "dir00/Sub02/file", "dir00/file", "dir00/sub00/file", "modified_file", "new_file", NULL, }; static const char *expect_trees[] = { "DIR01/", "DIR01/SUB03/", "DIR01/Sub02/", "DIR01/Sub02/file", "DIR01/sUB01/", "DIR01/sub00/", "DIR01/sub00/file", "current_file", "dir00/", "dir00/SUB03/", "dir00/Sub02/", "dir00/Sub02/file", "dir00/file", "dir00/sUB01/", "dir00/sub00/", "dir00/sub00/file", "modified_file", "new_file", NULL, }; static const char *expect_noauto[] = { "DIR01/", "current_file", "dir00/", "modified_file", "new_file", NULL, }; g_repo = cl_git_sandbox_init("status"); build_workdir_tree("status/subdir", 2, 4); cl_git_pass(git_iterator_for_filesystem(&i, "status/subdir", NULL)); expect_iterator_items(i, 8, expect_base, 8, expect_base); git_iterator_free(i); i_opts.flags = GIT_ITERATOR_INCLUDE_TREES; cl_git_pass(git_iterator_for_filesystem(&i, "status/subdir", &i_opts)); expect_iterator_items(i, 18, expect_trees, 18, expect_trees); git_iterator_free(i); i_opts.flags = GIT_ITERATOR_DONT_AUTOEXPAND; cl_git_pass(git_iterator_for_filesystem(&i, "status/subdir", &i_opts)); expect_iterator_items(i, 5, expect_noauto, 18, expect_trees); git_iterator_free(i); git__tsort((void **)expect_base, 8, (git__tsort_cmp)git__strcasecmp); git__tsort((void **)expect_trees, 18, (git__tsort_cmp)git__strcasecmp); git__tsort((void **)expect_noauto, 5, (git__tsort_cmp)git__strcasecmp); i_opts.flags = GIT_ITERATOR_IGNORE_CASE; cl_git_pass(git_iterator_for_filesystem(&i, "status/subdir", &i_opts)); expect_iterator_items(i, 8, expect_base, 8, expect_base); git_iterator_free(i); i_opts.flags = GIT_ITERATOR_IGNORE_CASE | GIT_ITERATOR_INCLUDE_TREES; cl_git_pass(git_iterator_for_filesystem(&i, "status/subdir", &i_opts)); expect_iterator_items(i, 18, expect_trees, 18, expect_trees); git_iterator_free(i); i_opts.flags = GIT_ITERATOR_IGNORE_CASE | GIT_ITERATOR_DONT_AUTOEXPAND; cl_git_pass(git_iterator_for_filesystem(&i, "status/subdir", &i_opts)); expect_iterator_items(i, 5, expect_noauto, 18, expect_trees); git_iterator_free(i); }