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

From:
Stefan Sperling <stsp@stsp.name>
Subject:
ignore unversioned file during 'got rebase -a' etc.
To:
gameoftrees@openbsd.org
Date:
Tue, 5 Oct 2021 13:26:51 +0200

Download raw body.

Thread
While using 'got rebase -a' I've seen output with a very long
list of unversioned files:

  [...]
  ?  usr.sbin/ypserv/makedbm/obj
  ?  usr.sbin/ypserv/mkalias/obj
  ?  usr.sbin/ypserv/mknetid/obj
  ?  usr.sbin/ypserv/revnetgroup/obj
  ?  usr.sbin/ypserv/ypinit/obj
  ?  usr.sbin/ypserv/yppush/obj
  ?  usr.sbin/ypserv/ypserv/obj
  ?  usr.sbin/ypserv/ypxfr/obj
  ?  usr.sbin/ypset/obj
  ?  usr.sbin/zdump/obj
  ?  usr.sbin/zic/obj
  Rebase of refs/heads/40mhz aborted
  Files not merged because an unversioned file was found in the work tree: 1790

I could reproduce the issue by adding an unversioned file into the
work tree of relevant regression tests. This makes tests fail because
progress output now includes an unversioned file and the final line:
  Files not merged because an unversioned file was found in the work tree: 1

This is an undesirable side-effect of my recent changes to interrupt
merges when unversioned files are found. When aborting an operation
any unversioned files are irrelevant and should not be displayed.
The patch below implements this.

ok?

diff 90e6e6204014e47bc38fb5bcaf041cfdad190718 /home/stsp/src/got
blob - f3b944325b2e9e0dfa3fa707d7d370eeef408780
file + got/got.c
--- got/got.c
+++ got/got.c
@@ -8792,6 +8792,19 @@ done:
 }
 
 static const struct got_error *
+abort_progress(void *arg, unsigned char status, const char *path)
+{
+	/*
+	 * Unversioned files should not clutter progress output when
+	 * an operation is aborted.
+	 */
+	if (status == GOT_STATUS_UNVERSIONED)
+		return NULL;
+
+	return update_progress(arg, status, path);
+}
+
+static const struct got_error *
 cmd_rebase(int argc, char *argv[])
 {
 	const struct got_error *error = NULL;
@@ -8944,7 +8957,7 @@ cmd_rebase(int argc, char *argv[])
 		printf("Switching work tree to %s\n",
 		    got_ref_get_symref_target(new_base_branch));
 		error = got_worktree_rebase_abort(worktree, fileindex, repo,
-		    new_base_branch, update_progress, &upa);
+		    new_base_branch, abort_progress, &upa);
 		if (error)
 			goto done;
 		printf("Rebase of %s aborted\n", got_ref_get_name(branch));
@@ -9029,7 +9042,7 @@ cmd_rebase(int argc, char *argv[])
 	if (pid == NULL) {
 		if (!continue_rebase) {
 			error = got_worktree_rebase_abort(worktree, fileindex,
-			    repo, new_base_branch, update_progress, &upa);
+			    repo, new_base_branch, abort_progress, &upa);
 			if (error)
 				goto done;
 			printf("Rebase of %s aborted\n",
@@ -10217,7 +10230,7 @@ cmd_histedit(int argc, char *argv[])
 		printf("Switching work tree to %s\n",
 		    got_ref_get_symref_target(branch));
 		error = got_worktree_histedit_abort(worktree, fileindex, repo,
-		    branch, base_commit_id, update_progress, &upa);
+		    branch, base_commit_id, abort_progress, &upa);
 		if (error)
 			goto done;
 		printf("Histedit of %s aborted\n",
@@ -10332,7 +10345,7 @@ cmd_histedit(int argc, char *argv[])
 			if (error) {
 				got_worktree_histedit_abort(worktree, fileindex,
 				    repo, branch, base_commit_id,
-				    update_progress, &upa);
+				    abort_progress, &upa);
 				print_merge_progress_stats(&upa);
 				goto done;
 			}
@@ -10347,7 +10360,7 @@ cmd_histedit(int argc, char *argv[])
 			if (error) {
 				got_worktree_histedit_abort(worktree, fileindex,
 				    repo, branch, base_commit_id,
-				    update_progress, &upa);
+				    abort_progress, &upa);
 				print_merge_progress_stats(&upa);
 				goto done;
 			}
@@ -10359,7 +10372,7 @@ cmd_histedit(int argc, char *argv[])
 		if (error) {
 			got_worktree_histedit_abort(worktree, fileindex,
 			    repo, branch, base_commit_id,
-			    update_progress, &upa);
+			    abort_progress, &upa);
 			print_merge_progress_stats(&upa);
 			goto done;
 		}
@@ -10785,7 +10798,7 @@ cmd_merge(int argc, char *argv[])
 		if (error)
 			goto done;
 		error = got_worktree_merge_abort(worktree, fileindex, repo,
-		    update_progress, &upa);
+		    abort_progress, &upa);
 		if (error)
 			goto done;
 		printf("Merge of %s aborted\n", branch_name);
@@ -10870,7 +10883,7 @@ cmd_merge(int argc, char *argv[])
 		print_merge_progress_stats(&upa);
 		if (!upa.did_something) {
 			error = got_worktree_merge_abort(worktree, fileindex,
-			    repo, update_progress, &upa);
+			    repo, abort_progress, &upa);
 			if (error)
 				goto done;
 			printf("Already up-to-date\n");
blob - 65ef292945ab5a14c0c1674cbd8aec70fc5e9418
file + regress/cmdline/histedit.sh
--- regress/cmdline/histedit.sh
+++ regress/cmdline/histedit.sh
@@ -833,6 +833,9 @@ test_histedit_abort() {
 		return 1
 	fi
 
+	# unrelated unversioned file in work tree
+	touch $testroot/wt/unversioned-file
+
 	echo "edit $old_commit1" > $testroot/histedit-script
 	echo "mesg committing changes" >> $testroot/histedit-script
 	echo "pick $old_commit2" >> $testroot/histedit-script
@@ -904,6 +907,7 @@ test_histedit_abort() {
 	(cd $testroot/wt && got status > $testroot/stdout)
 
 	echo "?  epsilon/new" > $testroot/stdout.expected
+	echo "?  unversioned-file" >> $testroot/stdout.expected
 	cmp -s $testroot/stdout.expected $testroot/stdout
 	ret="$?"
 	if [ "$ret" != "0" ]; then
blob - be7e58787cda7e3de992a5142542bebcf76ab385
file + regress/cmdline/merge.sh
--- regress/cmdline/merge.sh
+++ regress/cmdline/merge.sh
@@ -622,6 +622,9 @@ test_merge_abort() {
 		return 1
 	fi
 
+	# unrelated unversioned file in work tree
+	touch $testroot/wt/unversioned-file
+
 	# create a conflicting commit
 	(cd $testroot/repo && git checkout -q master)
 	echo "modified alpha on master" > $testroot/repo/alpha
@@ -677,6 +680,7 @@ test_merge_abort() {
 	echo "A  epsilon/new" >> $testroot/stdout.expected
 	echo "M  gamma/delta" >> $testroot/stdout.expected
 	echo "A  symlink" >> $testroot/stdout.expected
+	echo "?  unversioned-file" >> $testroot/stdout.expected
 	cmp -s $testroot/stdout.expected $testroot/stdout
 	ret="$?"
 	if [ "$ret" != "0" ]; then
@@ -753,7 +757,7 @@ test_merge_abort() {
 
 	(cd $testroot/wt && got status > $testroot/stdout)
 
-	echo -n "" > $testroot/stdout.expected
+	echo "?  unversioned-file" > $testroot/stdout.expected
 	cmp -s $testroot/stdout.expected $testroot/stdout
 	ret="$?"
 	if [ "$ret" != "0" ]; then
blob - 8ca3370f2ac372e3923bb4199f6774b6159e3ec5
file + regress/cmdline/rebase.sh
--- regress/cmdline/rebase.sh
+++ regress/cmdline/rebase.sh
@@ -424,6 +424,9 @@ test_rebase_abort() {
 		return 1
 	fi
 
+	# unrelated unversioned file in work tree
+	touch $testroot/wt/unversioned-file
+
 	(cd $testroot/wt && got rebase newbranch > $testroot/stdout \
 		2> $testroot/stderr)
 
@@ -471,6 +474,7 @@ test_rebase_abort() {
 	(cd $testroot/wt && got status > $testroot/stdout)
 
 	echo "C  alpha" > $testroot/stdout.expected
+	echo "?  unversioned-file" >> $testroot/stdout.expected
 	cmp -s $testroot/stdout.expected $testroot/stdout
 	ret="$?"
 	if [ "$ret" != "0" ]; then