Commit Diff


commit - 47a907487536e9a5f9fd52ef0293d26747262179
commit + 3d42b2660156bfd71df40d11a996d7bf233ed2a4
blob - 488cd9f35722bed936af6e7d9e2c6aa77ea2a3d8
blob + 79b118613c6a18ad07b44c2dc907e5894b63b712
--- got/got.c
+++ got/got.c
@@ -9147,12 +9147,41 @@ cmd_rebase(int argc, char *argv[])
 				goto done;
 			error = NULL;
 		} else {
-			static char msg[128];
-			snprintf(msg, sizeof(msg),
-			    "%s is already based on %s",
+			struct got_pathlist_head paths;
+			printf("%s is already based on %s\n",
 			    got_ref_get_name(branch),
 			    got_worktree_get_head_ref_name(worktree));
-			error = got_error_msg(GOT_ERR_SAME_BRANCH, msg);
+			error = switch_head_ref(branch, branch_head_commit_id,
+			    worktree, repo);
+			if (error)
+				goto done;
+			error = got_worktree_set_base_commit_id(worktree, repo,
+			    branch_head_commit_id);
+			if (error)
+				goto done;
+			TAILQ_INIT(&paths);
+			error = got_pathlist_append(&paths, "", NULL);
+			if (error)
+				goto done;
+			error = got_worktree_checkout_files(worktree,
+			    &paths, repo, update_progress, &upa,
+			    check_cancelled, NULL);
+			got_pathlist_free(&paths);
+			if (error)
+				goto done;
+			if (upa.did_something) {
+				char *id_str;
+				error = got_object_id_str(&id_str,
+				    branch_head_commit_id);
+				if (error)
+					goto done;
+				printf("Updated to %s: %s\n",
+				    got_worktree_get_head_ref_name(worktree),
+				    id_str);
+				free(id_str);
+			} else
+				printf("Already up-to-date\n");
+			print_update_progress_stats(&upa);
 			goto done;
 		}
 		error = got_worktree_rebase_prepare(&new_base_branch,
blob - b17666eaf0ae899543adfa66236bdfd3eb49e92d
blob + c629d068ddf4ae78f0a2184ea064823c4c1926de
--- regress/cmdline/rebase.sh
+++ regress/cmdline/rebase.sh
@@ -243,11 +243,18 @@ test_rebase_ancestry_check() {
 	(cd $testroot/repo && git checkout -q -b newbranch)
 	echo "modified delta on branch" > $testroot/repo/gamma/delta
 	git_commit $testroot/repo -m "committing to delta on newbranch"
+	local newbranch_id=`git_show_head $testroot/repo`
 
 	(cd $testroot/wt && got rebase newbranch > $testroot/stdout \
 		2> $testroot/stderr)
 
-	echo -n > $testroot/stdout.expected
+	echo "refs/heads/newbranch is already based on refs/heads/master" \
+		> $testroot/stdout.expected
+	echo "Switching work tree from refs/heads/master to refs/heads/newbranch" \
+		>> $testroot/stdout.expected
+	echo "U  gamma/delta" >> $testroot/stdout.expected
+	echo "Updated to refs/heads/newbranch: ${newbranch_id}" \
+		>> $testroot/stdout.expected
 	cmp -s $testroot/stdout.expected $testroot/stdout
 	ret="$?"
 	if [ "$ret" != "0" ]; then
@@ -256,8 +263,7 @@ test_rebase_ancestry_check() {
 		return 1
 	fi
 
-	echo "got: refs/heads/newbranch is already based on refs/heads/master" \
-		> $testroot/stderr.expected
+	echo -n > $testroot/stderr.expected
 	cmp -s $testroot/stderr.expected $testroot/stderr
 	ret="$?"
 	if [ "$ret" != "0" ]; then