From: Christian Weisgerber Subject: Fix "tog diff obj1 obj2" To: gameoftrees@openbsd.org Date: Sun, 23 Feb 2020 00:12:37 +0100 tog.1 promises that you can do "tog diff obj1 obj2" in a work tree, but this isn't implemented correctly. fix "tog diff object1 object2" by actually extracting the repository path from the work tree diff 575cb0c1ffb9850755d9eb82aeb58456c162bf2b 28e8fe3acba2cedafee5e122442ff2a68f84bc45 blob - cedb43dd64ce5c18d0d3451f7b9f8d0e922264b2 blob + 1a25cb86d8ee8854fc60c819572513bd7d475850 --- tog/tog.c +++ tog/tog.c @@ -3475,9 +3475,10 @@ cmd_diff(int argc, char *argv[]) { const struct got_error *error = NULL; struct got_repository *repo = NULL; + struct got_worktree *worktree = NULL; struct got_reflist_head refs; struct got_object_id *id1 = NULL, *id2 = NULL; - char *repo_path = NULL; + char *repo_path = NULL, *cwd = NULL; char *id_str1 = NULL, *id_str2 = NULL; int ch; struct tog_view *view; @@ -3504,9 +3505,6 @@ cmd_diff(int argc, char *argv[]) if (argc == 0) { usage_diff(); /* TODO show local worktree changes */ } else if (argc == 2) { - repo_path = getcwd(NULL, 0); - if (repo_path == NULL) - return got_error_from_errno("getcwd"); id_str1 = argv[0]; id_str2 = argv[1]; } else if (argc == 3) { @@ -3518,12 +3516,32 @@ cmd_diff(int argc, char *argv[]) } else usage_diff(); - init_curses(); + cwd = getcwd(NULL, 0); + if (cwd == NULL) + return got_error_from_errno("getcwd"); + error = got_worktree_open(&worktree, cwd); + if (error && error->code != GOT_ERR_NOT_WORKTREE) + goto done; + + if (repo_path == NULL) { + if (worktree) + repo_path = + strdup(got_worktree_get_repo_path(worktree)); + else + repo_path = strdup(cwd); + } + if (repo_path == NULL) { + error = got_error_from_errno("strdup"); + goto done; + } + error = got_repo_open(&repo, repo_path, NULL); if (error) goto done; + init_curses(); + error = apply_unveil(got_repo_get_path(repo), NULL); if (error) goto done; @@ -3553,8 +3571,11 @@ cmd_diff(int argc, char *argv[]) error = view_loop(view); done: free(repo_path); + free(cwd); if (repo) got_repo_close(repo); + if (worktree) + got_worktree_close(worktree); got_ref_list_free(&refs); return error; } -- Christian "naddy" Weisgerber naddy@mips.inka.de