[PATCH 1/2] stash--helper: implement "git stash--helper"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Matthias Aßhauer <mha1993@xxxxxxx>

This patch implements a new "git stash--helper" builtin plumbing
command that will be used to migrate "git-stash.sh" to C.

We start by implementing only the "--non-patch" option that will
handle the core part of the non-patch stashing.

Signed-off-by: Matthias Aßhauer <mha1993@xxxxxxx>
---
 Makefile                |  2 ++
 builtin.h               |  1 +
 builtin/stash--helper.c | 13 ++++++++++
 git.c                   |  1 +
 stash.c                 | 65 +++++++++++++++++++++++++++++++++++++++++++++++++
 stash.h                 | 11 +++++++++
 6 files changed, 93 insertions(+)
 create mode 100644 builtin/stash--helper.c
 create mode 100644 stash.c
 create mode 100644 stash.h

diff --git a/Makefile b/Makefile
index fc2f1ab..88c07ea 100644
--- a/Makefile
+++ b/Makefile
@@ -792,6 +792,7 @@ LIB_OBJS += shallow.o
 LIB_OBJS += sideband.o
 LIB_OBJS += sigchain.o
 LIB_OBJS += split-index.o
+LIB_OBJS += stash.o
 LIB_OBJS += strbuf.o
 LIB_OBJS += streaming.o
 LIB_OBJS += string-list.o
@@ -913,6 +914,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/stash--helper.o
 BUILTIN_OBJS += builtin/stripspace.o
 BUILTIN_OBJS += builtin/submodule--helper.o
 BUILTIN_OBJS += builtin/symbolic-ref.o
diff --git a/builtin.h b/builtin.h
index 6b95006..f1c8b39 100644
--- a/builtin.h
+++ b/builtin.h
@@ -118,6 +118,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_stash__helper(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_submodule__helper(int argc, const char **argv, const char *prefix);
diff --git a/builtin/stash--helper.c b/builtin/stash--helper.c
new file mode 100644
index 0000000..542e782
--- /dev/null
+++ b/builtin/stash--helper.c
@@ -0,0 +1,13 @@
+#include "../stash.h"
+#include <string.h>
+
+static const char builtin_stash__helper_usage[] = {
+	"Usage: git stash--helper --non-patch <tmp_indexfile> <i_tree>"
+};
+
+int cmd_stash__helper(int argc, const char **argv, const char *prefix)
+{
+	if (argc == 4 && !strcmp("--non-patch", argv[1]))
+		return stash_non_patch(argv[2], argv[3], prefix);
+	usage(builtin_stash__helper_usage);
+}
diff --git a/git.c b/git.c
index da278c3..9829ee8 100644
--- a/git.c
+++ b/git.c
@@ -470,6 +470,7 @@ static struct cmd_struct commands[] = {
 	{ "show-branch", cmd_show_branch, RUN_SETUP },
 	{ "show-ref", cmd_show_ref, RUN_SETUP },
 	{ "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
+	{ "stash--helper", cmd_stash__helper, RUN_SETUP | NEED_WORK_TREE },
 	{ "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
 	{ "stripspace", cmd_stripspace },
 	{ "submodule--helper", cmd_submodule__helper, RUN_SETUP },
diff --git a/stash.c b/stash.c
new file mode 100644
index 0000000..c3d6e67
--- /dev/null
+++ b/stash.c
@@ -0,0 +1,65 @@
+#include "stash.h"
+#include "strbuf.h"
+
+static int prepare_update_index_argv(struct argv_array *args,
+	struct strbuf *buf)
+{
+	struct strbuf **bufs, **b;
+
+	bufs = strbuf_split(buf, '\0');
+	for (b = bufs; *b; b++)
+		argv_array_pushf(args, "%s", (*b)->buf);
+	argv_array_push(args, "--");
+	strbuf_list_free(bufs);
+
+	return 0;
+}
+
+int stash_non_patch(const char *tmp_indexfile, const char *i_tree,
+	const char *prefix)
+{
+	int result;
+	struct child_process read_tree = CHILD_PROCESS_INIT;
+	struct child_process diff = CHILD_PROCESS_INIT;
+	struct child_process update_index = CHILD_PROCESS_INIT;
+	struct child_process write_tree = CHILD_PROCESS_INIT;
+	struct strbuf buf = STRBUF_INIT;
+
+	argv_array_push(&read_tree.args, "read-tree");
+	argv_array_pushf(&read_tree.args, "--index-output=%s", tmp_indexfile);
+	argv_array_pushl(&read_tree.args, "-m", i_tree, NULL);
+
+	argv_array_pushl(&diff.args, "diff", "--name-only", "-z", "HEAD", "--",
+		NULL);
+
+	argv_array_pushl(&update_index.args, "update-index", "--add",
+		"--remove", NULL);
+
+	argv_array_push(&write_tree.args, "write-tree");
+
+	read_tree.env =
+		diff.env =
+		update_index.env =
+		write_tree.env = prefix;
+
+	read_tree.use_shell =
+		diff.use_shell =
+		update_index.use_shell =
+		write_tree.use_shell = 1;
+
+	read_tree.git_cmd =
+		diff.git_cmd =
+		update_index.git_cmd =
+		write_tree.git_cmd = 1;
+
+	result = run_command(&read_tree) ||
+		setenv("GIT_INDEX_FILE", tmp_indexfile, 1) ||
+		capture_command(&diff, &buf, 0) ||
+		prepare_update_index_argv(&update_index.args, &buf) ||
+		run_command(&update_index) ||
+		run_command(&write_tree) ||
+		remove(tmp_indexfile);
+
+	strbuf_release(&buf);
+	return result;
+}
diff --git a/stash.h b/stash.h
new file mode 100644
index 0000000..0880456
--- /dev/null
+++ b/stash.h
@@ -0,0 +1,11 @@
+#ifndef STASH_H
+#define STASH_H
+
+#include "git-compat-util.h"
+#include "gettext.h"
+#include "run-command.h"
+
+extern int stash_non_patch(const char *tmp_indexfile, const char *i_tree,
+	const char *prefix);
+
+#endif /* STASH_H */

--
https://github.com/git/git/pull/191
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]