"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Stefan Sperling <stsp@stsp.name>
Subject:
Re: tog: worktree vs. -r repo
To:
Christian Weisgerber <naddy@mips.inka.de>
Cc:
gameoftrees@openbsd.org
Date:
Thu, 17 Dec 2020 23:51:27 +0100

Download raw body.

Thread
On Thu, Dec 17, 2020 at 11:21:19PM +0100, Christian Weisgerber wrote:
> When tog is started in a work tree associated with repository A,
> with the command option -r pointing to a different repository B,
> then tog will fetch some data from A and try to apply it in the
> context of B.
> 
> $ cd got                # work tree associated with got.git
> $ tog log -r ~/src.git  # OpenBSD src repository
> tog: reference refs/heads/main not found
> 
> tog log, blame, tree all fail in the same way.
> The corresponding got commands do not.

Thanks! This fixes it for me:

diff a46ac2cbc24e20b46540307ad7cfa4fca47c566a f2ad1d487ff0ad8471b8946dcb07196036121f90
blob - 334d9a659f385c9de036c79d21a1a527807feeb6
blob + d4a6773bbcbe53cf05658170c71476a035aaccf8
--- tog/tog.c
+++ tog/tog.c
@@ -2673,7 +2673,7 @@ cmd_log(int argc, char *argv[])
 	char *start_commit = NULL, *label = NULL;
 	struct got_reference *ref = NULL;
 	const char *head_ref_name = NULL;
-	int ch, log_branches = 0;
+	int ch, log_branches = 0, rflag = 0;
 	struct tog_view *view;
 
 	while ((ch = getopt(argc, argv, "bc:r:")) != -1) {
@@ -2689,6 +2689,7 @@ cmd_log(int argc, char *argv[])
 			if (repo_path == NULL)
 				return got_error_from_errno2("realpath",
 				    optarg);
+			rflag = 1;
 			break;
 		default:
 			usage_log();
@@ -2727,7 +2728,7 @@ cmd_log(int argc, char *argv[])
 		goto done;
 
 	error = get_in_repo_path_from_argv0(&in_repo_path, argc, argv,
-	    repo, worktree);
+	    repo, rflag ? NULL : worktree);
 	if (error)
 		goto done;
 
@@ -2740,8 +2741,9 @@ cmd_log(int argc, char *argv[])
 
 	if (start_commit == NULL) {
 		error = got_repo_match_object_id(&start_id, &label,
-		    worktree ? got_worktree_get_head_ref_name(worktree) :
-		    GOT_REF_HEAD, GOT_OBJ_TYPE_COMMIT, 1, repo);
+		    (!rflag && worktree) ?
+		    got_worktree_get_head_ref_name(worktree) : GOT_REF_HEAD,
+		    GOT_OBJ_TYPE_COMMIT, 1, repo);
 		if (error)
 			goto done;
 		head_ref_name = label;
@@ -4653,7 +4655,7 @@ cmd_blame(int argc, char *argv[])
 	char *link_target = NULL;
 	struct got_object_id *commit_id = NULL;
 	char *commit_id_str = NULL;
-	int ch;
+	int ch, rflag = 0;;
 	struct tog_view *view;
 
 	while ((ch = getopt(argc, argv, "c:r:")) != -1) {
@@ -4666,6 +4668,7 @@ cmd_blame(int argc, char *argv[])
 			if (repo_path == NULL)
 				return got_error_from_errno2("realpath",
 				    optarg);
+			rflag = 1;
 			break;
 		default:
 			usage_blame();
@@ -4704,7 +4707,7 @@ cmd_blame(int argc, char *argv[])
 		goto done;
 
 	error = get_in_repo_path_from_argv0(&in_repo_path, argc, argv, repo,
-	    worktree);
+	    rflag ? NULL : worktree);
 	if (error)
 		goto done;
 
@@ -4716,7 +4719,7 @@ cmd_blame(int argc, char *argv[])
 
 	if (commit_id_str == NULL) {
 		struct got_reference *head_ref;
-		error = got_ref_open(&head_ref, repo, worktree ?
+		error = got_ref_open(&head_ref, repo, (!rflag && worktree) ?
 		    got_worktree_get_head_ref_name(worktree) : GOT_REF_HEAD, 0);
 		if (error != NULL)
 			goto done;
@@ -5465,7 +5468,7 @@ cmd_tree(int argc, char *argv[])
 	struct got_tree_object *tree = NULL;
 	struct got_reference *ref = NULL;
 	const char *head_ref_name = NULL;
-	int ch;
+	int ch, rflag = 0;
 	struct tog_view *view;
 
 	while ((ch = getopt(argc, argv, "c:r:")) != -1) {
@@ -5478,6 +5481,7 @@ cmd_tree(int argc, char *argv[])
 			if (repo_path == NULL)
 				return got_error_from_errno2("realpath",
 				    optarg);
+			rflag = 1;
 			break;
 		default:
 			usage_tree();
@@ -5516,7 +5520,7 @@ cmd_tree(int argc, char *argv[])
 		goto done;
 
 	error = get_in_repo_path_from_argv0(&in_repo_path, argc, argv,
-	    repo, worktree);
+	    repo, rflag ? NULL : worktree);
 	if (error)
 		goto done;
 
@@ -5528,8 +5532,9 @@ cmd_tree(int argc, char *argv[])
 
 	if (commit_id_arg == NULL) {
 		error = got_repo_match_object_id(&commit_id, &label,
-		    worktree ? got_worktree_get_head_ref_name(worktree) :
-		    GOT_REF_HEAD, GOT_OBJ_TYPE_COMMIT, 1, repo);
+		    (!rflag && worktree) ?
+		    got_worktree_get_head_ref_name(worktree) : GOT_REF_HEAD,
+		    GOT_OBJ_TYPE_COMMIT, 1, repo);
 		if (error)
 			goto done;
 		head_ref_name = label;