git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3] Add core.mode configuration

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Oct 12, 2013, 07:04 UTC
Message-ID
<1381561485-20252-1-git-send-email-felipe.contreras@gmail.com>

So that we can specify general modes of operation, specifically, add the 'next' mode, which makes Git pre v2.0 behave as Git v2.0.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 builtin/add.c      | 13 ++++++++----
 cache.h            |  6 ++++++
 config.c           | 13 ++++++++++++
 environment.c      |  1 +
 t/t2205-add-new.sh | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 89 insertions(+), 4 deletions(-)
 create mode 100755 t/t2205-add-new.sh
diff --git a/builtin/add.c b/builtin/add.c
index 8266a9c..95a396d 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -483,14 +483,16 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 	 */
 	memset(&update_data, 0, sizeof(update_data));
 	if (!take_worktree_changes && addremove_explicit < 0)
-		update_data.warn_add_would_remove = 1;
+		if (git_mode == MODE_CURRENT)
+			update_data.warn_add_would_remove = 1;
 
 	if (!take_worktree_changes && addremove_explicit < 0 && argc)
 		/*
 		 * Turn "git add pathspec..." to "git add -A pathspec..."
 		 * in Git 2.0 but not yet
 		 */
-		; /* addremove = 1; */
+		if (git_mode != MODE_CURRENT)
+			addremove = 1;
 
 	if (!show_only && ignore_missing)
 		die(_("Option --ignore-missing can only be used together with --dry-run"));
@@ -503,10 +505,13 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 		short_option_with_implicit_dot = "-u";
 	}
 	if (option_with_implicit_dot && !argc) {
-		static const char *here[2] = { ".", NULL };
+		static const char *here[2] = { ":/", NULL };
 		argc = 1;
 		argv = here;
-		implicit_dot = 1;
+		if (git_mode == MODE_CURRENT) {
+			here[0] = ".";
+			implicit_dot = 1;
+		}
 	}
 
 	add_new_files = !take_worktree_changes && !refresh_only;
diff --git a/cache.h b/cache.h
index 85b544f..f28240f 100644
--- a/cache.h
+++ b/cache.h
@@ -627,9 +627,15 @@ enum push_default_type {
 	PUSH_DEFAULT_UNSPECIFIED
 };
 
+enum git_mode {
+	MODE_CURRENT = 0,
+	MODE_NEXT
+};
+
 extern enum branch_track git_branch_track;
 extern enum rebase_setup_type autorebase;
 extern enum push_default_type push_default;
+extern enum git_mode git_mode;
 
 enum object_creation_mode {
 	OBJECT_CREATION_USES_HARDLINKS = 0,
diff --git a/config.c b/config.c
index e13a7b6..f0e0370 100644
--- a/config.c
+++ b/config.c
@@ -831,6 +831,19 @@ static int git_default_core_config(const char *var, const char *value)
 		return 0;
 	}
 
+	if (!strcmp(var, "core.mode")) {
+		if (!value)
+			return config_error_nonbool(var);
+		else if (!strcmp(value, "current"))
+			git_mode = MODE_CURRENT;
+		else if (!strcmp(value, "next")) {
+			git_mode = MODE_NEXT;
+			push_default = PUSH_DEFAULT_SIMPLE;
+		} else
+			die("wrong mode '%s'", value);
+		return 0;
+	}
+
 	/* Add other config variables here and to Documentation/config.txt. */
 	return 0;
 }
diff --git a/environment.c b/environment.c
index 5398c36..751e14d 100644
--- a/environment.c
+++ b/environment.c
@@ -62,6 +62,7 @@ int merge_log_config = -1;
 int precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */
 struct startup_info *startup_info;
 unsigned long pack_size_limit_cfg;
+enum git_mode git_mode = MODE_CURRENT;
 
 /*
  * The character that begins a commented line in user-editable file
diff --git a/t/t2205-add-new.sh b/t/t2205-add-new.sh
new file mode 100755
index 0000000..763664b
--- /dev/null
+++ b/t/t2205-add-new.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+test_description='git add v2.0 behavior'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+	mkdir dir1 &&
+	echo one > dir1/content &&
+	echo one > dir1/to-remove &&
+	git add . &&
+	git commit -m one
+'
+
+test_expect_success 'update in dir throws warning' '
+	test_when_finished "git reset --hard" &&
+	echo two > dir1/content &&
+	mkdir -p dir2 &&
+	(
+	cd dir2 &&
+	git add -u 2> err &&
+	cat err &&
+	grep "will change in Git 2.0" err
+	)
+'
+
+test_expect_success 'update in dir updates everything' '
+	test_when_finished "git reset --hard" &&
+	test_config core.mode next &&
+	echo two > dir1/content &&
+	mkdir -p dir2 &&
+	(
+	cd dir2 &&
+	git add -u 2> err &&
+	cat err &&
+	! grep "will change in Git 2.0" err
+	) &&
+	test "$(git ls-files -m)" = ""
+'
+
+test_expect_success 'default to ignore removal' '
+	test_when_finished "git reset --hard" &&
+	rm dir1/to-remove &&
+	git add dir1 2> err &&
+	cat err &&
+	grep "will change in Git 2.0" err &&
+	test "$(git ls-files -c)" != "dir1/content"
+'
+
+test_expect_success 'default adds removals' '
+	test_when_finished "git reset --hard" &&
+	test_config core.mode next &&
+	rm dir1/to-remove &&
+	git add dir1 2> err &&
+	cat err &&
+	! grep "will change in Git 2.0" err &&
+	test "$(git ls-files -c)" = "dir1/content"
+'
+
+test_done
-- 
1.8.4-fc
Next: Krzysztof Mazur
Message 1 of 25 in “Add core.mode configuration”
  1. Add core.mode configurationFelipe Contreras, Oct 12, 2013
  2. Krzysztof MazurOct 14, 2013
  3. Felipe ContrerasOct 14, 2013
  4. Krzysztof MazurOct 15, 2013
  5. Felipe ContrerasOct 15, 2013
  6. Krzysztof MazurOct 15, 2013
  7. Felipe ContrerasOct 15, 2013
  8. Krzysztof MazurOct 15, 2013
  9. John SzakmeisterOct 15, 2013
  10. Felipe ContrerasOct 16, 2013
  11. Krzysztof MazurOct 16, 2013
  12. Felipe ContrerasOct 16, 2013
  13. John SzakmeisterOct 16, 2013
  14. John SzakmeisterOct 16, 2013
  15. Felipe ContrerasOct 16, 2013
  16. Felipe ContrerasOct 16, 2013
  17. Philip OakleyOct 16, 2013
  18. Jonathan NiederOct 16, 2013
  19. Philip OakleyOct 17, 2013
  20. Felipe ContrerasOct 17, 2013
  21. Felipe ContrerasOct 15, 2013
  22. Krzysztof MazurOct 15, 2013
  23. Felipe ContrerasOct 16, 2013
  24. Krzysztof MazurOct 16, 2013
  25. Felipe ContrerasOct 16, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.