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

[PATCH 1/2] Add proper 'stage' command

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Aug 29, 2013, 18:09 UTC
Message-ID
<1377799744-5201-2-git-send-email-felipe.contreras@gmail.com>
In-Reply-To
<1377799744-5201-1-git-send-email-felipe.contreras@gmail.com>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 Documentation/git-stage.txt            | 45 +++++++++++++++++++++++++----
 Makefile                               |  2 +-
 builtin.h                              |  1 +
 builtin/stage.c                        | 52 ++++++++++++++++++++++++++++++++++
 contrib/completion/git-completion.bash | 24 +++++++++++++++-
 git.c                                  |  2 +-
 6 files changed, 118 insertions(+), 8 deletions(-)
 create mode 100644 builtin/stage.c
diff --git a/Documentation/git-stage.txt b/Documentation/git-stage.txt
index ba3fe0d..318bf45 100644
--- a/Documentation/git-stage.txt
+++ b/Documentation/git-stage.txt
@@ -3,20 +3,55 @@ git-stage(1)
 
 NAME
 ----
-git-stage - Add file contents to the staging area
+git-stage - manage the staging area
 
 
 SYNOPSIS
 --------
 [verse]
-'git stage' args...
-
+'git stage' [options] [--] [<paths>...]
+'git stage add' [options] [--] [<paths>...]
+'git stage reset' [-q|--patch] [--] [<paths>...]
+'git stage diff' [options] [<commit>] [--] [<paths>...]
+'git stage rm' [options] [--] [<paths>...]
+'git stage apply' [options] [--] [<paths>...]
 
 DESCRIPTION
 -----------
 
-This is a synonym for linkgit:git-add[1].  Please refer to the
-documentation of that command.
+
+COMMANDS
+--------
+
+With no arguments, it's a synonym for linkgit:git-add[1].
+
+'add'::
+
+Adds file contents to the staging area. See linkgit:git-add[1].
+
+'reset'::
+
+Resets the staging area. See linkgit:git-reset[1].
+
+'diff'::
+
+View the changes you staged for the next commit. See linkgit:git-diff[1] --staged.
+
+'rm'::
+
+Remove files from the staging area only. See linkgit:git-rm[1] --staged.
+
+'apply'::
+
+Apply a patch to the staging area. See linkgit:git-rm[1] --staged.
+
+SEE ALSO
+--------
+linkgit:git-add[1]
+linkgit:git-reset[1]
+linkgit:git-diff[1]
+linkgit:git-rm[1]
+linkgit:git-apply[1]
 
 GIT
 ---
diff --git a/Makefile b/Makefile
index 3588ca1..1f7ddf3 100644
--- a/Makefile
+++ b/Makefile
@@ -598,7 +598,6 @@ BUILT_INS += git-merge-subtree$X
 BUILT_INS += git-peek-remote$X
 BUILT_INS += git-repo-config$X
 BUILT_INS += git-show$X
-BUILT_INS += git-stage$X
 BUILT_INS += git-status$X
 BUILT_INS += git-whatchanged$X
 
@@ -982,6 +981,7 @@ BUILTIN_OBJS += builtin/send-pack.o
 BUILTIN_OBJS += builtin/shortlog.o
 BUILTIN_OBJS += builtin/show-branch.o
 BUILTIN_OBJS += builtin/show-ref.o
+BUILTIN_OBJS += builtin/stage.o
 BUILTIN_OBJS += builtin/stripspace.o
 BUILTIN_OBJS += builtin/symbolic-ref.o
 BUILTIN_OBJS += builtin/tag.o
diff --git a/builtin.h b/builtin.h
index 8afa2de..baf3a0f 100644
--- a/builtin.h
+++ b/builtin.h
@@ -113,6 +113,7 @@ extern int cmd_send_pack(int argc, const char **argv, const char *prefix);
 extern int cmd_shortlog(int argc, const char **argv, const char *prefix);
 extern int cmd_show(int argc, const char **argv, const char *prefix);
 extern int cmd_show_branch(int argc, const char **argv, const char *prefix);
+extern int cmd_stage(int argc, const char **argv, const char *prefix);
 extern int cmd_status(int argc, const char **argv, const char *prefix);
 extern int cmd_stripspace(int argc, const char **argv, const char *prefix);
 extern int cmd_symbolic_ref(int argc, const char **argv, const char *prefix);
diff --git a/builtin/stage.c b/builtin/stage.c
new file mode 100644
index 0000000..3023d17
--- /dev/null
+++ b/builtin/stage.c
@@ -0,0 +1,52 @@
+/*
+ * 'git stage' builtin command
+ *
+ * Copyright (C) 2013 Felipe Contreras
+ */
+
+#include "builtin.h"
+#include "parse-options.h"
+
+static const char *const stage_usage[] = {
+	N_("git stage [options] [--] <paths>..."),
+	N_("git stage add [options] [--] <paths>..."),
+	N_("git stage reset [-q|--patch] [--] <paths>..."),
+	N_("git stage diff [options] [<commit]> [--] <paths>..."),
+	N_("git stage rm [options] [--] <paths>..."),
+	NULL
+};
+
+int cmd_stage(int argc, const char **argv, const char *prefix)
+{
+	struct option options[] = { OPT_END() };
+
+	argc = parse_options(argc, argv, prefix, options, stage_usage,
+			PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN | PARSE_OPT_KEEP_DASHDASH);
+
+	if (argc > 1) {
+		if (!strcmp(argv[1], "add"))
+			return cmd_add(argc - 1, argv + 1, prefix);
+		if (!strcmp(argv[1], "reset"))
+			return cmd_reset(argc - 1, argv + 1, prefix);
+		if (!strcmp(argv[1], "diff")) {
+			argv[0] = "diff";
+			argv[1] = "--staged";
+
+			return cmd_diff(argc, argv, prefix);
+		}
+		if (!strcmp(argv[1], "rm")) {
+			argv[0] = "rm";
+			argv[1] = "--cached";
+
+			return cmd_rm(argc, argv, prefix);
+		}
+		if (!strcmp(argv[1], "apply")) {
+			argv[0] = "apply";
+			argv[1] = "--cached";
+
+			return cmd_apply(argc, argv, prefix);
+		}
+	}
+
+	return cmd_add(argc, argv, prefix);
+}
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 5da920e..8cf26e2 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -1691,7 +1691,29 @@ _git_send_email ()
 
 _git_stage ()
 {
-	_git_add
+	__git_has_doubledash && return
+
+	local subcommands="add reset diff rm apply"
+	local subcommand="$(__git_find_on_cmdline "$subcommands")"
+	if [ -z "$subcommand" ]; then
+		__gitcomp "$subcommands"
+		return
+	fi
+
+	case "$subcommand" in
+	add)
+		_git_add;;
+	reset)
+		_git_reset;;
+	diff)
+		_git_diff;;
+	rm)
+		_git_rm;;
+	apply)
+		_git_apply;;
+	*)
+		_git_add;
+	esac
 }
 
 __git_config_get_set_variables ()
diff --git a/git.c b/git.c
index 2025f77..0e639aa 100644
--- a/git.c
+++ b/git.c
@@ -409,7 +409,7 @@ static void handle_internal_command(int argc, const char **argv)
 		{ "show", cmd_show, RUN_SETUP },
 		{ "show-branch", cmd_show_branch, RUN_SETUP },
 		{ "show-ref", cmd_show_ref, RUN_SETUP },
-		{ "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
+		{ "stage", cmd_stage, RUN_SETUP | NEED_WORK_TREE },
 		{ "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
 		{ "stripspace", cmd_stripspace },
 		{ "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
-- 
1.8.4-fc
Previous: Felipe ContrerasNext: Matthieu Moy
Message 3 of 58 in “Officially start moving to the term 'staging area'”
  1. Felipe ContrerasAug 29, 2013
  2. 0/2 stage: proper 'stage' commandFelipe Contreras, Aug 29, 2013
  3. 1/2 Add proper 'stage' commandFelipe Contreras, Aug 29, 2013
  4. Matthieu MoyAug 29, 2013
  5. Felipe ContrerasAug 29, 2013
  6. 2/2 stage: add edit commandFelipe Contreras, Aug 29, 2013
  7. Matthieu MoyAug 29, 2013
  8. Felipe ContrerasAug 29, 2013
  9. 0/9 Add --stage and --work optionsFelipe Contreras, Aug 29, 2013
  10. 1/9 diff: document --stagedFelipe Contreras, Aug 29, 2013
  11. 2/9 grep: add --staged optionFelipe Contreras, Aug 29, 2013
  12. 3/9 rm: add --staged optionFelipe Contreras, Aug 29, 2013
  13. 4/9 stash: add --stage option to saveFelipe Contreras, Aug 29, 2013
  14. Matthieu MoyAug 29, 2013
  15. 5/9 stash: add --stage to pop and applyFelipe Contreras, Aug 29, 2013
  16. 6/9 submodule: add --staged optionsFelipe Contreras, Aug 29, 2013
  17. 7/9 apply: add --stage optionFelipe Contreras, Aug 29, 2013
  18. 8/9 apply: add --work, --no-work optionsFelipe Contreras, Aug 29, 2013
  19. 9/9 completion: update --staged optionsFelipe Contreras, Aug 29, 2013
  20. 0/3 reset: refactor into --stage and --workFelipe Contreras, Aug 29, 2013
  21. 1/3 reset: add --stage and --work optionsFelipe Contreras, Aug 29, 2013
  22. 2/3 reset: allow --keep with --stageFelipe Contreras, Aug 29, 2013
  23. 3/3 completion: update 'git reset' new stage optionsFelipe Contreras, Aug 29, 2013
  24. Junio C HamanoAug 29, 2013
  25. Felipe ContrerasAug 29, 2013
  26. Felipe ContrerasAug 30, 2013
  27. Felipe ContrerasAug 30, 2013
  28. Felipe ContrerasAug 30, 2013
  29. Felipe ContrerasAug 30, 2013
  30. Drew NorthupAug 29, 2013
  31. Felipe ContrerasAug 29, 2013
  32. Drew NorthupSep 4, 2013
  33. Felipe ContrerasSep 8, 2013
  34. Piotr KrukowieckiAug 30, 2013
  35. Drew NorthupSep 4, 2013
  36. Piotr KrukowieckiSep 4, 2013
  37. Drew NorthupSep 4, 2013
  38. Felipe ContrerasSep 8, 2013
  39. Felipe ContrerasSep 8, 2013
  40. Felipe ContrerasSep 8, 2013
  41. Philip OakleySep 8, 2013
  42. Felipe ContrerasSep 8, 2013
  43. Matthieu MoyAug 29, 2013
  44. Felipe ContrerasAug 29, 2013
  45. Matthieu MoyAug 29, 2013
  46. Matthieu MoyAug 29, 2013
  47. René ScharfeAug 29, 2013
  48. Felipe ContrerasAug 29, 2013
  49. René ScharfeAug 31, 2013
  50. Felipe ContrerasAug 31, 2013
  51. David AguilarSep 1, 2013
  52. Matthieu MoyAug 29, 2013
  53. William SwansonSep 4, 2013
  54. Ping YinSep 6, 2013
  55. Hilco WijbengaSep 6, 2013
  56. Felipe ContrerasSep 8, 2013
  57. Ramkumar RamachandraSep 9, 2013
  58. Felipe ContrerasSep 9, 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.