commit 6f86da294d3b81aba4c403d76e423598958c2100 from: Kyle Ackerman via: Stefan Sperling date: Thu Nov 21 11:15:11 2024 UTC remove got_pathlist_append() Remove got_pathlist_append(). This leaves got_pathlist_insert() to add items to a pathlist, making it very easy to swap got_pathlist from a TAILQ to a RB_TREE. Patch by Kyle Ackerman commit - 799728f7aeb4842a6458eccfc51df84e5cbc40d0 commit + 6f86da294d3b81aba4c403d76e423598958c2100 blob - 7864138db9fadd684f9cc01f99ab36941f60e2fd blob + f32badb418f5f48bf31962de1a6ac52d4c04c400 --- cvg/cvg.c +++ cvg/cvg.c @@ -1546,7 +1546,7 @@ cmd_clone(int argc, char *argv[]) fetch_all_branches = 1; break; case 'b': - error = got_pathlist_append(&wanted_branches, + error = got_pathlist_insert(NULL, &wanted_branches, optarg, NULL); if (error) return error; @@ -1562,7 +1562,7 @@ cmd_clone(int argc, char *argv[]) verbosity = -1; break; case 'R': - error = got_pathlist_append(&wanted_refs, + error = got_pathlist_insert(NULL, &wanted_refs, optarg, NULL); if (error) return error; @@ -2376,7 +2376,7 @@ cmd_checkout(int argc, char *argv[]) goto done; } - error = got_pathlist_append(&paths, "", NULL); + error = got_pathlist_insert(NULL, &paths, "", NULL); if (error) goto done; cpa.worktree_path = worktree_path; @@ -2573,7 +2573,7 @@ get_worktree_paths_from_argv(struct got_pathlist_head path = strdup(""); if (path == NULL) return got_error_from_errno("strdup"); - return got_pathlist_append(paths, path, NULL); + return got_pathlist_insert(NULL, paths, path, NULL); } for (i = 0; i < argc; i++) { blob - 8a69602e91a117f6b3b1826abfe7737979fbf616 blob + f890b946e6565aa7acf7271c37921844fa902230 --- got/got.c +++ got/got.c @@ -1642,7 +1642,7 @@ cmd_clone(int argc, char *argv[]) fetch_all_branches = 1; break; case 'b': - error = got_pathlist_append(&wanted_branches, + error = got_pathlist_insert(NULL, &wanted_branches, optarg, NULL); if (error) return error; @@ -1658,7 +1658,7 @@ cmd_clone(int argc, char *argv[]) verbosity = -1; break; case 'R': - error = got_pathlist_append(&wanted_refs, + error = got_pathlist_insert(NULL, &wanted_refs, optarg, NULL); if (error) return error; @@ -2397,7 +2397,7 @@ cmd_fetch(int argc, char *argv[]) fetch_all_branches = 1; break; case 'b': - error = got_pathlist_append(&wanted_branches, + error = got_pathlist_insert(NULL, &wanted_branches, optarg, NULL); if (error) return error; @@ -2413,7 +2413,7 @@ cmd_fetch(int argc, char *argv[]) verbosity = -1; break; case 'R': - error = got_pathlist_append(&wanted_refs, + error = got_pathlist_insert(NULL, &wanted_refs, optarg, NULL); if (error) return error; @@ -2573,7 +2573,7 @@ cmd_fetch(int argc, char *argv[]) if (!fetch_all_branches) fetch_all_branches = remote->fetch_all_branches; for (i = 0; i < remote->nfetch_branches; i++) { - error = got_pathlist_append(&wanted_branches, + error = got_pathlist_insert(NULL, &wanted_branches, remote->fetch_branches[i], NULL); if (error) goto done; @@ -2581,7 +2581,7 @@ cmd_fetch(int argc, char *argv[]) } if (TAILQ_EMPTY(&wanted_refs)) { for (i = 0; i < remote->nfetch_refs; i++) { - error = got_pathlist_append(&wanted_refs, + error = got_pathlist_insert(NULL, &wanted_refs, remote->fetch_refs[i], NULL); if (error) goto done; @@ -3297,7 +3297,7 @@ cmd_checkout(int argc, char *argv[]) goto done; } - error = got_pathlist_append(&paths, "", NULL); + error = got_pathlist_insert(NULL, &paths, "", NULL); if (error) goto done; cpa.worktree_path = worktree_path; @@ -3539,7 +3539,7 @@ get_worktree_paths_from_argv(struct got_pathlist_head path = strdup(""); if (path == NULL) return got_error_from_errno("strdup"); - return got_pathlist_append(paths, path, NULL); + return got_pathlist_insert(NULL, paths, path, NULL); } for (i = 0; i < argc; i++) { @@ -9905,13 +9905,13 @@ cmd_send(int argc, char *argv[]) send_all_branches = 1; break; case 'b': - error = got_pathlist_append(&branches, optarg, NULL); + error = got_pathlist_insert(NULL, &branches, optarg, NULL); if (error) return error; nbranches++; break; case 'd': - error = got_pathlist_append(&delete_args, optarg, NULL); + error = got_pathlist_insert(NULL, &delete_args, optarg, NULL); if (error) return error; break; @@ -9932,7 +9932,7 @@ cmd_send(int argc, char *argv[]) send_all_tags = 1; break; case 't': - error = got_pathlist_append(&tags, optarg, NULL); + error = got_pathlist_insert(NULL, &tags, optarg, NULL); if (error) return error; break; @@ -10090,7 +10090,7 @@ cmd_send(int argc, char *argv[]) goto done; TAILQ_FOREACH(re, &all_branches, entry) { const char *branchname = got_ref_get_name(re->ref); - error = got_pathlist_append(&branches, + error = got_pathlist_insert(NULL, &branches, branchname, NULL); if (error) goto done; @@ -10098,7 +10098,7 @@ cmd_send(int argc, char *argv[]) } } else if (nbranches == 0) { for (i = 0; i < remote->nsend_branches; i++) { - error = got_pathlist_append(&branches, + error = got_pathlist_insert(NULL, &branches, remote->send_branches[i], NULL); if (error) goto done; @@ -10112,7 +10112,7 @@ cmd_send(int argc, char *argv[]) goto done; TAILQ_FOREACH(re, &all_tags, entry) { const char *tagname = got_ref_get_name(re->ref); - error = got_pathlist_append(&tags, + error = got_pathlist_insert(NULL, &tags, tagname, NULL); if (error) goto done; @@ -10164,7 +10164,7 @@ cmd_send(int argc, char *argv[]) goto done; } else ref = head_ref; - error = got_pathlist_append(&branches, got_ref_get_name(ref), + error = got_pathlist_insert(NULL, &branches, got_ref_get_name(ref), NULL); if (error) goto done; @@ -11747,7 +11747,7 @@ cmd_rebase(int argc, char *argv[]) if (error) goto done; TAILQ_INIT(&paths); - error = got_pathlist_append(&paths, "", NULL); + error = got_pathlist_insert(NULL, &paths, "", NULL); if (error) goto done; error = got_worktree_checkout_files(worktree, @@ -13210,7 +13210,7 @@ cmd_histedit(int argc, char *argv[]) int have_changes = 0; TAILQ_INIT(&paths); - error = got_pathlist_append(&paths, "", NULL); + error = got_pathlist_insert(NULL, &paths, "", NULL); if (error) goto done; error = got_worktree_status(worktree, &paths, @@ -13769,7 +13769,7 @@ cmd_merge(int argc, char *argv[]) if (error) goto done; TAILQ_INIT(&paths); - error = got_pathlist_append(&paths, "", NULL); + error = got_pathlist_insert(NULL, &paths, "", NULL); if (error) goto done; error = got_worktree_checkout_files(worktree, blob - 6678a9dd097384ee9c7b2545f4a1e9211a83054d blob + b4498d7b27edc861c011a977cef6c8b66603f09d --- gotadmin/gotadmin.c +++ gotadmin/gotadmin.c @@ -758,7 +758,7 @@ cmd_pack(int argc, char *argv[]) break; case 'x': got_path_strip_trailing_slashes(optarg); - error = got_pathlist_append(&exclude_args, + error = got_pathlist_insert(NULL, &exclude_args, optarg, NULL); if (error) return error; @@ -1458,7 +1458,7 @@ cmd_dump(int argc, char *argv[]) got_path_strip_trailing_slashes(repo_path); break; case 'x': - error = got_pathlist_append(&exclude_args, + error = got_pathlist_insert(NULL, &exclude_args, optarg, NULL); if (error) return error; @@ -1733,7 +1733,7 @@ cmd_load(int argc, char *argv[]) got_path_strip_trailing_slashes(refname); if (!got_ref_name_is_valid(refname)) errx(1, "invalid reference name %s", refname); - error = got_pathlist_append(&include_args, refname, NULL); + error = got_pathlist_insert(NULL, &include_args, refname, NULL); if (error) goto done; } blob - b2bcaa2b7774cab98d41dad2df3c7777d72b0d4b blob + 1100e919033e225f9500e38d04dc8c9304369742 --- include/got_path.h +++ include/got_path.h @@ -85,15 +85,6 @@ TAILQ_HEAD(got_pathlist_head, got_pathlist_entry); const struct got_error *got_pathlist_insert(struct got_pathlist_entry **, struct got_pathlist_head *, const char *, void *); -/* - * Append a path to the list of paths. - * The caller should already have initialized the list head. This list stores - * the pointer to the path as-is, i.e. the path is not copied internally and - * must remain available until the list is freed with got_pathlist_free(). - */ -const struct got_error *got_pathlist_append(struct got_pathlist_head *, - const char *, void *); - /* Flags passed to got_pathlist_free() to control which pointers are freed. */ #define GOT_PATHLIST_FREE_NONE 0 /* pathlist entry only */ #define GOT_PATHLIST_FREE_PATH (1 << 0) /* entry and path pointer */ blob - 1958bf239d21b4b220fed7b8cb12e942ed4b8c24 blob + 927f39266460c90e8f4c6574b83b64526a9bc468 --- lib/diff.c +++ lib/diff.c @@ -114,10 +114,11 @@ get_diffstat(struct got_diffstat_cb_arg *ds, const cha ds->del += change->rm; ++ds->nfiles; - err = got_pathlist_append(ds->paths, path, change); - if (err) { + err = got_pathlist_insert(&pe, ds->paths, path, change); + if (err || pe == NULL) { free(change); - return err; + if (err) + return err; } pe = TAILQ_LAST(ds->paths, got_pathlist_head); @@ -890,6 +891,7 @@ got_diff_tree_collect_changed_paths(void *arg, struct { const struct got_error *err = NULL; struct got_pathlist_head *paths = arg; + struct got_pathlist_entry *new; struct got_diff_changed_path *change = NULL; char *path = NULL; @@ -915,9 +917,9 @@ got_diff_tree_collect_changed_paths(void *arg, struct change->status = GOT_STATUS_MODE_CHANGE; } - err = got_pathlist_append(paths, path, change); + err = got_pathlist_insert(&new, paths, path, change); done: - if (err) { + if (err || new == NULL) { free(path); free(change); } blob - 4d56359502a5b5c1e7fc70c62f2355e4e13e7960 blob + 1fbe141ad4fdf719e9063bc6be0a064606e32eeb --- lib/fetch.c +++ lib/fetch.c @@ -125,7 +125,7 @@ got_fetch_pack(struct got_object_id **pack_hash, struc char *packpath = NULL, *idxpath = NULL, *id_str = NULL; const char *repo_path = NULL; struct got_pathlist_head have_refs; - struct got_pathlist_entry *pe; + struct got_pathlist_entry *pe, *new; struct got_reflist_head my_refs; struct got_reflist_entry *re; off_t packfile_size = 0; @@ -184,9 +184,14 @@ got_fetch_pack(struct got_object_id **pack_hash, struc err = got_error_from_errno("strdup"); goto done; } - err = got_pathlist_append(&have_refs, refname, id); + err = got_pathlist_insert(&new, &have_refs, refname, id); if (err) goto done; + if (new == NULL){ + free(&refname); + free(id); + } + } if (list_refs_only) { blob - ca1719dd8649b956e27783774efab623fdba7ed8 blob + 7bf09a8a6503e2cf488f090ab7a98b0a0762ae04 --- lib/gitproto.c +++ lib/gitproto.c @@ -259,6 +259,7 @@ add_symref(struct got_pathlist_head *symrefs, char *ca { const struct got_error *err = NULL; char *colon, *name = NULL, *target = NULL; + struct got_pathlist_entry *new; /* Need at least "A:B" */ if (strlen(capa) < 3) @@ -280,7 +281,9 @@ add_symref(struct got_pathlist_head *symrefs, char *ca } /* We can't validate the ref itself here. The main process will. */ - err = got_pathlist_append(symrefs, name, target); + err = got_pathlist_insert(&new, symrefs, name, target); + if (err == NULL && new == NULL) + err = got_error(GOT_ERR_REF_DUP_ENTRY); done: if (err) { free(name); @@ -308,7 +311,7 @@ got_gitproto_match_capabilities(char **common_capabili if (equalsign != NULL && symrefs != NULL && strncmp(capa, "symref", equalsign - capa) == 0) { err = add_symref(symrefs, equalsign + 1); - if (err) + if (err && err->code != GOT_ERR_REF_DUP_ENTRY) break; continue; } blob - be080572089318fc90fd9461180ce5d13c92521e blob + d9b43df9dfbb89553d6f95931f5ef24cb8e2d9cf --- lib/load.c +++ lib/load.c @@ -333,6 +333,7 @@ got_repo_load(FILE *in, struct got_pathlist_head *refs for (;;) { struct got_object_id *id; char *dup; + struct got_pathlist_entry *new; linelen = getline(&line, &linesize, in); if (linelen == -1) { @@ -376,11 +377,12 @@ got_repo_load(FILE *in, struct got_pathlist_head *refs goto done; } - err = got_pathlist_append(refs_found, dup, id); - if (err) { + err = got_pathlist_insert(&new, refs_found, dup, id); + if (err || new == NULL) { free(id); free(dup); - goto done; + if (err) + goto done; } } blob - c91ca76066d628e1d12b7c66d86c8829e1b938be blob + 8242bbe0f1553766e05f3b6750c7a283387e0907 --- lib/path.c +++ lib/path.c @@ -252,22 +252,6 @@ got_pathlist_insert(struct got_pathlist_entry **insert TAILQ_INSERT_HEAD(pathlist, new, entry); if (inserted) *inserted = new; - return NULL; -} - -const struct got_error * -got_pathlist_append(struct got_pathlist_head *pathlist, - const char *path, void *data) -{ - struct got_pathlist_entry *new; - - new = malloc(sizeof(*new)); - if (new == NULL) - return got_error_from_errno("malloc"); - new->path = path; - new->path_len = strlen(path); - new->data = data; - TAILQ_INSERT_TAIL(pathlist, new, entry); return NULL; } blob - 25f3858f09dbd0bc936d97fc851892955ecf6623 blob + ba76f7fe713a805f77718060b1d7ab0e18377246 --- lib/privsep.c +++ lib/privsep.c @@ -718,6 +718,7 @@ got_privsep_recv_fetch_progress(int *done, struct got_ size_t datalen; struct got_imsg_fetch_symrefs *isymrefs = NULL; size_t n, remain; + struct got_pathlist_entry *new; off_t off; int i; @@ -780,11 +781,12 @@ got_privsep_recv_fetch_progress(int *done, struct got_ } off += s->target_len; remain -= s->target_len; - err = got_pathlist_append(symrefs, name, target); - if (err) { + err = got_pathlist_insert(&new, symrefs, name, target); + if (err || new == NULL) { free(name); free(target); - goto done; + if (err->code != GOT_ERR_REF_DUP_ENTRY) + goto done; } } break; blob - 99f0df084a62eddfcd9809402c5834ffea4040f3 blob + e3ccf0e40499cc4a59881e8b6acb10735537f667 --- lib/repository.c +++ lib/repository.c @@ -1477,7 +1477,7 @@ got_repo_list_packidx(struct got_pathlist_head *packid break; } - err = got_pathlist_append(packidx_paths, path_packidx, NULL); + err = got_pathlist_insert(NULL, packidx_paths, path_packidx, NULL); if (err) break; } blob - 407601bbacc042b33ad5cb1d87afa5beeb6f6a9d blob + 474f10b7b33e56c98f899f81d1428e5bae6a73db --- lib/worktree.c +++ lib/worktree.c @@ -4070,7 +4070,7 @@ find_missing_children(void *arg, struct got_fileindex_ } if (got_path_is_child(ie->path, a->parent_path, a->parent_len)) - err = got_pathlist_append(a->children, ie->path, NULL); + err = got_pathlist_insert(NULL, a->children, ie->path, NULL); return err; } @@ -7759,7 +7759,7 @@ get_paths_added_between_commits(struct got_pathlist_he abspath = NULL; } - err = got_pathlist_append(added_paths, wt_path, NULL); + err = got_pathlist_insert(NULL, added_paths, wt_path, NULL); if (err) goto done; wt_path = NULL; blob - da97321077d9a4c57c2b10105cd568a1bc9c944e blob + ff9e14244e355ede244af59ba841dcc1f03dd8fd --- lib/worktree_cvg.c +++ lib/worktree_cvg.c @@ -1104,7 +1104,7 @@ find_missing_children(void *arg, struct got_fileindex_ } if (got_path_is_child(ie->path, a->parent_path, a->parent_len)) - err = got_pathlist_append(a->children, ie->path, NULL); + err = got_pathlist_insert(NULL, a->children, ie->path, NULL); return err; } @@ -3067,7 +3067,7 @@ got_worktree_cvg_commit(struct got_object_id **new_com goto done; } - err = got_pathlist_append(&commit_reflist, commit_refname, + err = got_pathlist_insert(&pe, &commit_reflist, commit_refname, head_refname); if (err) goto done; blob - 6ec79e85a76b5ba40ce146e249e75e24f79d7df9 blob + 7a03f43fd34cc5b92ead9494b1c592a98b9b4c0b --- libexec/got-fetch-pack/got-fetch-pack.c +++ libexec/got-fetch-pack/got-fetch-pack.c @@ -865,6 +865,7 @@ main(int argc, char **argv) struct got_imsg_fetch_wanted_branch wbranch; struct got_imsg_fetch_wanted_ref wref; size_t datalen, i; + struct got_pathlist_entry *new; char *remote_head = NULL, *worktree_branch = NULL; #if 0 static int attached; @@ -973,11 +974,12 @@ main(int argc, char **argv) goto done; } memcpy(id, &href.id, sizeof(*id)); - err = got_pathlist_append(&have_refs, refname, id); - if (err) { + err = got_pathlist_insert(&new, &have_refs, refname, id); + if (err || new == NULL) { free(refname); free(id); - goto done; + if (err) + goto done; } imsg_free(&imsg); @@ -1015,10 +1017,11 @@ main(int argc, char **argv) goto done; } - err = got_pathlist_append(&wanted_branches, refname, NULL); - if (err) { + err = got_pathlist_insert(&new, &wanted_branches, refname, NULL); + if (err || new == NULL) { free(refname); - goto done; + if (err) + goto done; } imsg_free(&imsg); @@ -1055,7 +1058,7 @@ main(int argc, char **argv) goto done; } - err = got_pathlist_append(&wanted_refs, refname, NULL); + err = got_pathlist_insert(NULL, &wanted_refs, refname, NULL); if (err) { free(refname); goto done; blob - 2a2c22971801db07832f237f3969bc2e90a0c745 blob + 766bbf50e670a6b1b65024ee61042ffb95cc792b --- libexec/got-send-pack/got-send-pack.c +++ libexec/got-send-pack/got-send-pack.c @@ -422,10 +422,15 @@ send_pack(int fd, struct got_pathlist_head *refs, if (err) goto done; - err = got_pathlist_append(&their_refs, refname, id); - if (err) - goto done; + err = got_pathlist_insert(&pe, &their_refs, refname, id); + if (err || pe == NULL) { + free(refname); + free(id); + if (err) + goto done; + } + if (chattygot) fprintf(stderr, "%s: remote has %s %s\n", getprogname(), refname, id_str); @@ -658,6 +663,7 @@ main(int argc, char **argv) for (i = 0; i < send_req.nrefs; i++) { struct got_object_id *id; char *refname; + struct got_pathlist_entry *new; if ((err = got_privsep_recv_imsg(&imsg, &ibuf, 0)) != 0) { if (err->code == GOT_ERR_PRIVSEP_PIPE) @@ -707,13 +713,14 @@ main(int argc, char **argv) } memcpy(id, &href.id, sizeof(*id)); if (href.delete) - err = got_pathlist_append(&delete_refs, refname, id); + err = got_pathlist_insert(&new, &delete_refs, refname, id); else - err = got_pathlist_append(&refs, refname, id); - if (err) { + err = got_pathlist_insert(&new, &refs, refname, id); + if (err || new == NULL ) { free(refname); free(id); - goto done; + if (err) + goto done; } imsg_free(&imsg); blob - 1c4930ff5c3ba4b4981d6378462f6c9d4d4c92da blob + 2d847c25d775f95fe1aae56d8b6124dc1fd6d468 --- regress/cmdline/clone.sh +++ regress/cmdline/clone.sh @@ -727,7 +727,7 @@ test_clone_multiple_branches() { got ref -l -r $testroot/repo-clone > $testroot/stdout - echo "HEAD: refs/heads/foo" > $testroot/stdout.expected + echo "HEAD: refs/heads/bar" > $testroot/stdout.expected echo "refs/heads/bar: $commit_id" >> $testroot/stdout.expected echo "refs/heads/foo: $commit_id" >> $testroot/stdout.expected echo "refs/remotes/origin/bar: $commit_id" \ @@ -748,7 +748,7 @@ remote "origin" { server 127.0.0.1 protocol ssh repository "$testroot/repo" - branch { "foo" "bar" } + branch { "bar" "foo" } } EOF cmp -s $testroot/repo-clone/got.conf $testroot/got.conf.expected @@ -768,8 +768,8 @@ EOF [remote "origin"] url = ssh://127.0.0.1$testroot/repo - fetch = refs/heads/foo:refs/remotes/origin/foo fetch = refs/heads/bar:refs/remotes/origin/bar + fetch = refs/heads/foo:refs/remotes/origin/foo fetch = refs/tags/*:refs/tags/* EOF cmp -s $testroot/repo-clone/config $testroot/config.expected blob - 59243b5c07792da8486b3128282d07cd79ae5bbe blob + 79d34d5be8de2f8a77dd949ec12828120cf67461 --- regress/cmdline/diff.sh +++ regress/cmdline/diff.sh @@ -1941,8 +1941,8 @@ date: $d changed epsilon into file - D epsilon/zeta A epsilon + D epsilon/zeta EOF