Commit Diff


commit - fa9bb690d2fe11cc48b603cb872a8a39a240d29d
commit + 8e778ade0370b5cabdf946ca7d9d6ac9338790b0
blob - ac485dd3c4b41a848f35a558031031452fc7aa5e
blob + eca41169193af38a1320fdb788385993cd078872
--- regress/tog/Makefile
+++ regress/tog/Makefile
@@ -1,4 +1,4 @@
-REGRESS_TARGETS=log diff
+REGRESS_TARGETS=log diff blame
 NOOBJ=Yes
 
 GOT_TEST_ROOT=/tmp
@@ -9,4 +9,7 @@ log:
 diff:
 	./diff.sh -q -r "$(GOT_TEST_ROOT)"
 
+blame:
+	./blame.sh -q -r "$(GOT_TEST_ROOT)"
+
 .include <bsd.regress.mk>
blob - /dev/null
blob + 93c8f6f920ce4b2013710cddd1e94d1b83b0a7ad (mode 755)
--- /dev/null
+++ regress/tog/blame.sh
@@ -0,0 +1,80 @@
+#!/bin/sh
+#
+# Copyright (c) 2023 Mark Jamsek <mark@jamsek.dev>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+. ./common.sh
+
+test_blame_basic()
+{
+	test_init blame_basic 80 8
+
+	local commit_id1=`git_show_head $testroot/repo`
+
+	got checkout $testroot/repo $testroot/wt > /dev/null
+	ret=$?
+	if [ $ret -ne 0 ]; then
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	echo aaaa >> $testroot/wt/alpha
+	(cd $testroot/wt && got commit -m "a change" > /dev/null)
+	local commit_id2=`git_show_head $testroot/repo`
+
+	echo bbbb >> $testroot/wt/alpha
+	(cd $testroot/wt && got commit -m "b change" > /dev/null)
+	local commit_id3=`git_show_head $testroot/repo`
+
+	echo cccc >> $testroot/wt/alpha
+	(cd $testroot/wt && got commit -m "c change" > /dev/null)
+	local commit_id4=`git_show_head $testroot/repo`
+	local author_time=`git_show_author_time $testroot/repo`
+	local ymd=`date -u -r $author_time +"%G-%m-%d"`
+
+	cat <<EOF >$TOG_TEST_SCRIPT
+WAIT_FOR_UI	wait for blame to finish
+SCREENDUMP
+EOF
+
+	local commit_id1_short=`trim_obj_id 32 $commit_id1`
+	local commit_id2_short=`trim_obj_id 32 $commit_id2`
+	local commit_id3_short=`trim_obj_id 32 $commit_id3`
+	local commit_id4_short=`trim_obj_id 32 $commit_id4`
+
+	cat <<EOF >$testroot/view.expected
+commit $commit_id4
+[1/4] /alpha
+$commit_id1_short alpha
+$commit_id2_short aaaa
+$commit_id3_short bbbb
+$commit_id4_short cccc
+
+
+EOF
+
+	cd $testroot/wt && tog blame alpha
+	cmp -s $testroot/view.expected $testroot/view
+	ret=$?
+	if [ $ret -ne 0 ]; then
+		diff -u $testroot/view.expected $testroot/view
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	test_done "$testroot" "$ret"
+}
+
+test_parseargs "$@"
+run_test test_blame_basic
blob - 8fa205d719a08166373e452c826e108940372eb3
blob + 7c6e96e31033b1401d1fabc19f50ec38cab506bd
--- tog/tog.c
+++ tog/tog.c
@@ -621,6 +621,7 @@ struct tog_io {
 	FILE	*cin;
 	FILE	*cout;
 	FILE	*f;
+	int	 wait_for_ui;
 } tog_io;
 static int using_mock_io;
 
@@ -1632,6 +1633,11 @@ tog_read_script_key(FILE *script, int *ch, int *done)
 	const struct got_error	*err = NULL;
 	char			*line = NULL;
 	size_t			 linesz = 0;
+
+	*ch = -1;
+
+	if (tog_io.wait_for_ui)
+		goto done;
 
 	if (getline(&line, &linesz, script) == -1) {
 		if (feof(script)) {
@@ -1641,7 +1647,10 @@ tog_read_script_key(FILE *script, int *ch, int *done)
 			err = got_ferror(script, GOT_ERR_IO);
 			goto done;
 		}
-	} else if (strncasecmp(line, "KEY_ENTER", 9) == 0)
+	}
+	if (strncasecmp(line, "WAIT_FOR_UI", 11) == 0)
+		tog_io.wait_for_ui = 1;
+	else if (strncasecmp(line, "KEY_ENTER", 9) == 0)
 		*ch = KEY_ENTER;
 	else if (strncasecmp(line, "KEY_RIGHT", 9) == 0)
 		*ch = KEY_RIGHT;
@@ -6116,6 +6125,11 @@ draw_blame(struct tog_view *view)
 
 	view_border(view);
 
+	if (tog_io.wait_for_ui) {
+		if (s->blame_complete)
+			tog_io.wait_for_ui = 0;
+	}
+
 	return NULL;
 }