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

From:
Tracey Emery <tracey@traceyemery.net>
Subject:
got rm trim dirs
To:
gameoftrees@openbsd.org
Date:
Tue, 3 Mar 2020 16:42:56 -0700

Download raw body.

Thread
Hello,

Does it make sense to trim directories during a 'got rm -R .'
opperation? I'm constantly forgetting to remove empty directories
afterwards.

Ok?

-- 

Tracey Emery

diff ee85c5e898e10f72841c918d9f453a6526ef7e2e /home/basepr1me/src/got
blob - 0e0bef70fa58ed856ec28833fae027d8744acaae
file + lib/worktree.c
--- lib/worktree.c
+++ lib/worktree.c
@@ -3039,6 +3039,16 @@ schedule_for_deletion(void *arg, unsigned char status,
 			err = got_error_from_errno2("unlink", ondisk_path);
 			goto done;
 		}
+		char *parent = dirname(ondisk_path);
+		while (parent && strcmp(parent, a->worktree->root_path) != 0) {
+			if (rmdir(parent) == -1) {
+				if (errno != ENOTEMPTY)
+					err = got_error_from_errno2("rmdir",
+					    parent);
+				break;
+			}
+			parent = dirname(parent);
+		}
 	}
 
 	got_fileindex_entry_mark_deleted_from_disk(ie);
blob - 9ea8be8b1e091a6c1974b3a81b2f05a550bcd266
file + regress/cmdline/rm.sh
--- regress/cmdline/rm.sh
+++ regress/cmdline/rm.sh
@@ -239,6 +239,18 @@ function test_rm_directory {
 		return 1
 	fi
 
+	(cd $testroot/wt && ls -l > $testroot/stdout)
+
+	echo -n '' > $testroot/stdout.expected
+
+	cmp -s $testroot/stdout.expected $testroot/stdout
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		diff -u $testroot/stdout.expected $testroot/stdout
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
 	test_done "$testroot" "$ret"
 }