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

From:
Tracey Emery <tracey@traceyemery.net>
Subject:
got add recursion ignore ignores
To:
gameoftrees@openbsd.org
Date:
Thu, 5 Dec 2019 10:22:43 -0700

Download raw body.

Thread
Hello,

The diff below adds -I to disregard ignores. Adding flags to the
got_worktree struct seemed like the simplest approach. If there is a
better alternative, let me know what you think.

The add directory test should now cover all the possible scenarios
mentioned in your previous email.

The TODO file has been updated to remove got add -R.

Ok?

-- 

Tracey Emery

diff 22694bb8ff1cf412bbdfc251e2dce27baca160b6 /home/basepr1me/Documents/got/got
blob - 044aadf30b3ae798d851660a58e8dddd57a6b746
file + TODO
--- TODO
+++ TODO
@@ -11,7 +11,6 @@ lib:
 
 got:
 - 'histedit -c' prompts for log message even if there are no changes to commit
-- recursive addition: got add -R
 - recursive removal: got rm -R
 
 tog:
blob - 57af02b4edfdbb7d0e6764d05c516a435f823c56
file + got/got.1
--- got/got.1
+++ got/got.1
@@ -625,7 +625,7 @@ If a tag must be deleted, the
 command may be used to delete a tag's reference.
 This should only be done if the tag has not already been copied to
 another repository.
-.It Cm add Oo Fl R Oc Ar path ...
+.It Cm add Oo Fl R Oc Oo Fl I Oc Ar path ...
 Schedule unversioned files in a work tree for addition to the
 repository in the next commit.
 .Pp
@@ -640,6 +640,10 @@ If this option is not specified,
 will refuse to run if a specified
 .Ar path
 is a directory.
+.It Fl I
+With -R, add files even if they match a
+.Cm got status
+ignore pattern.
 .El
 .It Cm remove Ar file-path ...
 Remove versioned files from a work tree and schedule them for deletion
blob - 756eaa2ea3216dabe5aaf7080a2c652fdbfd0f74
file + got/got.c
--- got/got.c
+++ got/got.c
@@ -4168,12 +4168,15 @@ cmd_add(int argc, char *argv[])
 	char *cwd = NULL;
 	struct got_pathlist_head paths;
 	struct got_pathlist_entry *pe;
-	int ch, can_recurse = 0;
+	int ch, can_recurse = 0, no_ignores = 0;
 
 	TAILQ_INIT(&paths);
 
-	while ((ch = getopt(argc, argv, "R")) != -1) {
+	while ((ch = getopt(argc, argv, "IR")) != -1) {
 		switch (ch) {
+		case 'I':
+			no_ignores = 1;
+			break;
 		case 'R':
 			can_recurse = 1;
 			break;
@@ -4246,8 +4249,9 @@ cmd_add(int argc, char *argv[])
 			}
 		}
 	}
+
 	error = got_worktree_schedule_add(worktree, &paths, add_progress,
-	    NULL, repo);
+	    NULL, repo, no_ignores);
 done:
 	if (repo)
 		got_repo_close(repo);
blob - a18fc5a59d6c2c165d6f449c5accb262eb450485
file + include/got_worktree.h
--- include/got_worktree.h
+++ include/got_worktree.h
@@ -159,7 +159,7 @@ const struct got_error *got_worktree_resolve_path(char
 /* Schedule files at on-disk paths for addition in the next commit. */
 const struct got_error *got_worktree_schedule_add(struct got_worktree *,
     struct got_pathlist_head *, got_worktree_checkout_cb, void *,
-    struct got_repository *);
+    struct got_repository *, int);
 
 /*
  * Remove files from disk and schedule them to be deleted in the next commit.
blob - c45a95888b5015de44ca323f6dd4759e19eb36f4
file + lib/got_lib_worktree.h
--- lib/got_lib_worktree.h
+++ lib/got_lib_worktree.h
@@ -33,6 +33,8 @@ struct got_worktree {
 	 * shared lock must be upgraded to an exclusive lock.
 	 */
 	int lockfd;
+	int flags;
+#define GOT_WORKTREE_NO_IGNORES 0x01
 };
 
 struct got_commitable {
blob - c56c307e7fad0d579e6eb3fa799150a8b8d31558
file + lib/worktree.c
--- lib/worktree.c
+++ lib/worktree.c
@@ -2670,11 +2670,13 @@ worktree_status(struct got_worktree *worktree, const c
 		arg.cancel_cb = cancel_cb;
 		arg.cancel_arg = cancel_arg;
 		TAILQ_INIT(&arg.ignores);
-		err = add_ignores(&arg.ignores, worktree->root_path, path,
-		    ".cvsignore");
-		if (err == NULL)
+		if (!(worktree->flags & GOT_WORKTREE_NO_IGNORES)) {
 			err = add_ignores(&arg.ignores, worktree->root_path,
-			    path, ".gitignore");
+			    path, ".cvsignore");
+			if (err == NULL)
+				err = add_ignores(&arg.ignores,
+				    worktree->root_path, path, ".gitignore");
+		}
 		if (err == NULL)
 			err = got_fileindex_diff_dir(fileindex, workdir,
 			    worktree->root_path, path, repo, &fdiff_cb, &arg);
@@ -2840,7 +2842,7 @@ const struct got_error *
 got_worktree_schedule_add(struct got_worktree *worktree,
     struct got_pathlist_head *paths,
     got_worktree_checkout_cb progress_cb, void *progress_arg,
-    struct got_repository *repo)
+    struct got_repository *repo, int no_ignores)
 {
 	struct got_fileindex *fileindex = NULL;
 	char *fileindex_path = NULL;
@@ -2861,6 +2863,9 @@ got_worktree_schedule_add(struct got_worktree *worktre
 	saa.progress_cb = progress_cb;
 	saa.progress_arg = progress_arg;
 	saa.repo = repo;
+
+	if (no_ignores)
+		worktree->flags |= GOT_WORKTREE_NO_IGNORES;
 
 	TAILQ_FOREACH(pe, paths, entry) {
 		char *ondisk_path;
blob - 9260016060fa594ef14a31a90e815737bb487ca1
file + regress/cmdline/add.sh
--- regress/cmdline/add.sh
+++ regress/cmdline/add.sh
@@ -187,11 +187,19 @@ function test_add_directory {
 		return 1
 	fi
 
-	(touch $testroot/wt/epsilon/zeta1 && touch $testroot/wt/epsilon/zeta2)
+	mkdir -p $testroot/wt/tree1
+	mkdir -p $testroot/wt/tree2
+	echo "tree1/**" > $testroot/wt/.gitignore
+	echo "tree2/**" >> $testroot/wt/.gitignore
+	echo -n > $testroot/wt/tree1/foo
+	echo -n > $testroot/wt/tree2/foo
+	echo -n > $testroot/wt/epsilon/zeta1
+	echo -n > $testroot/wt/epsilon/zeta2
 
 	(cd $testroot/wt && got add -R . > $testroot/stdout)
 
-	echo 'A  epsilon/zeta1' > $testroot/stdout.expected
+	echo 'A  .gitignore' > $testroot/stdout.expected
+	echo 'A  epsilon/zeta1' >> $testroot/stdout.expected
 	echo 'A  epsilon/zeta2' >> $testroot/stdout.expected
 
 	cmp -s $testroot/stdout.expected $testroot/stdout
@@ -202,13 +210,28 @@ function test_add_directory {
 		return 1
 	fi
 
-	echo "zeta" > $testroot/content.expected
-	cat $testroot/wt/epsilon/zeta > $testroot/content
+	(cd $testroot/wt && got add -RI tree1 > $testroot/stdout)
 
-	cmp -s $testroot/content.expected $testroot/content
+	echo 'A  tree1/foo' > $testroot/stdout.expected
+
+	cmp -s $testroot/stdout.expected $testroot/stdout
 	ret="$?"
 	if [ "$ret" != "0" ]; then
-		diff -u $testroot/content.expected $testroot/content
+		diff -u $testroot/stdout.expected $testroot/stdout
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	(cd $testroot/wt && got add tree2/foo > $testroot/stdout)
+
+	echo 'A  tree2/foo' > $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"
 }