commit bb64b79860632effc06224a66e840f56e41f6ac6 from: Stefan Sperling date: Wed Mar 18 16:11:26 2020 UTC have got_fetch() require an open got_repository to be passed in commit - 09838ffc9388f0cdbc316deb5eaae54ec4841207 commit + bb64b79860632effc06224a66e840f56e41f6ac6 blob - 2aa285a3281b14706191512d7f095677ed3fa2ef blob + b5bed4ad76b6c5e4ce90833eb8d31dbc4e39147c --- got/got.c +++ got/got.c @@ -974,6 +974,9 @@ cmd_clone(int argc, char *argv[]) const struct got_error *err = NULL; const char *uri, *branch_filter, *dirname; char *proto, *host, *port, *repo_name, *server_path; + char *default_destdir = NULL; + const char *repo_path; + struct got_repository *repo = NULL; int ch; while ((ch = getopt(argc, argv, "b:")) != -1) { @@ -1001,14 +1004,38 @@ cmd_clone(int argc, char *argv[]) if (err) goto done; - err = got_fetch(proto, host, port, server_path, repo_name, - branch_filter, dirname); + if (dirname == NULL) { + if (asprintf(&default_destdir, "%s.git", repo_name) == -1) { + err = got_error_from_errno("asprintf"); + goto done; + } + repo_path = default_destdir; + } else + repo_path = dirname; + + err = got_path_mkdir(repo_path); + if (err) + goto done; + + err = got_repo_init(repo_path); + if (err != NULL) + goto done; + + err = got_repo_open(&repo, repo_path, NULL); + if (err) + goto done; + + err = got_fetch(proto, host, port, server_path, repo_name, + branch_filter, repo); done: + if (repo) + got_repo_close(repo); free(proto); free(host); free(port); free(server_path); free(repo_name); + free(default_destdir); return err; } blob - 3af0abb9fe9bfa5b38d3eecfa6328ee6cbe3f661 blob + 76bf04d5f314663647550667aff141ee3b18cde1 --- include/got_fetch.h +++ include/got_fetch.h @@ -22,4 +22,4 @@ const struct got_error *got_fetch_parse_uri(char **, c char **, char **, const char *); const struct got_error *got_fetch(const char *, const char *, const char *, const char *, const char *, const char *, - const char *); + struct got_repository *); blob - ff271353f0679b85ebb06d45b1dbcbf0ef2500be blob + 4b57d0579703a7ad6c7c7179a89bd26fb80877a7 --- lib/fetch.c +++ lib/fetch.c @@ -281,7 +281,7 @@ done: const struct got_error* got_fetch(const char *proto, const char *host, const char *port, const char *server_path, const char *repo_name, - const char *branch_filter, const char *destdir) + const char *branch_filter, struct got_repository *repo) { int imsg_fetchfds[2], imsg_idxfds[2], fetchfd = -1; int packfd = -1, npackfd = -1, idxfd = -1, nidxfd = -1; @@ -290,26 +290,17 @@ got_fetch(const char *proto, const char *host, const c const struct got_error *err; struct imsgbuf ibuf; pid_t pid; - char *tmppackpath = NULL, *tmpidxpath = NULL, *default_destdir = NULL; + char *tmppackpath = NULL, *tmpidxpath = NULL; char *packpath = NULL, *idxpath = NULL, *id_str = NULL; - const char *repo_path; + const char *repo_path = got_repo_get_path(repo); struct got_pathlist_head symrefs; struct got_pathlist_entry *pe; - struct got_repository *repo = NULL; char *path; TAILQ_INIT(&symrefs); fetchfd = -1; - if (destdir == NULL) { - if (asprintf(&default_destdir, "%s.git", repo_name) == -1) - return got_error_from_errno("asprintf"); - repo_path = default_destdir; - } else - repo_path = destdir; - err = got_repo_init(repo_path); - if (err != NULL) - goto done; + if (asprintf(&path, "%s/objects/path", repo_path) == -1) { err = got_error_from_errno("asprintf"); goto done; @@ -388,10 +379,6 @@ got_fetch(const char *proto, const char *host, const c goto done; } - err = got_repo_open(&repo, repo_path, NULL); - if (err) - goto done; - while (!done) { struct got_object_id *id; char *refname; @@ -536,13 +523,10 @@ done: err = got_error_from_errno("close"); if (idxfd != -1 && close(idxfd) == -1 && err == NULL) err = got_error_from_errno("close"); - if (repo) - got_repo_close(repo); free(tmppackpath); free(tmpidxpath); free(idxpath); free(packpath); - free(default_destdir); free(packhash); TAILQ_FOREACH(pe, &symrefs, entry) { free((void *)pe->path);