From: Tracey Emery Subject: got add recursion ignore ignores To: gameoftrees@openbsd.org Date: Thu, 5 Dec 2019 10:22:43 -0700 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" }