git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: pclouds@gmail.com
Cc: Johannes.Schindelin@gmx.de, git@vger.kernel.org,
	gitster@pobox.com, jacob.keller@gmail.com, newren@gmail.com,
	rybak.a.v@gmail.com, sunshine@sunshineco.com
Subject: [PATCH v3 02/16] restore: take tree-ish from --source option instead
Date: Thu, 25 Apr 2019 16:45:46 +0700	[thread overview]
Message-ID: <20190425094600.15673-3-pclouds@gmail.com> (raw)
In-Reply-To: <20190425094600.15673-1-pclouds@gmail.com>

This is another departure from 'git checkout' syntax, which uses -- to
separate ref and pathspec. The observation is restore (or "git
checkout -- <pathspec>") is most often used to restore some files from
the index. If this is correct, we can simplify it by taking away the
ref, so that we can write

    git restore some-file

without worrying about some-file being a ref and whether we need to do

    git restore -- some-file

for safety. If the source of the restore comes from a tree, it will be
in the form of an option with value, e.g.

    git restore --source=this-tree some-file

This is of course longer to type than using "--". But hopefully it
will not be used as often, and it is clearly easier to understand.

dwim_new_local_branch is no longer set (or unset) in cmd_restore_files()
because it's irrelevant because we don't really care about dwim-ing.
With accept_ref being unset, dwim can't happen.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 builtin/checkout.c | 42 ++++++++++++++++++++++++++++++++++--------
 1 file changed, 34 insertions(+), 8 deletions(-)

diff --git a/builtin/checkout.c b/builtin/checkout.c
index 98dc2ded38..5aba345712 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -39,7 +39,7 @@ static const char * const switch_branch_usage[] = {
 };
 
 static const char * const restore_usage[] = {
-	N_("git restore [<options>] [<branch>] -- <file>..."),
+	N_("git restore [<options>] [--source=<branch>] <file>..."),
 	NULL,
 };
 
@@ -59,6 +59,7 @@ struct checkout_opts {
 	int overlay_mode;
 	int dwim_new_local_branch;
 	int discard_changes;
+	int accept_ref;
 	int accept_pathspec;
 	int switch_branch_doing_nothing_is_ok;
 	int only_merge_on_switching_branches;
@@ -76,6 +77,7 @@ struct checkout_opts {
 	int branch_exists;
 	const char *prefix;
 	struct pathspec pathspec;
+	const char *from_treeish;
 	struct tree *source_tree;
 };
 
@@ -1410,6 +1412,7 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
 {
 	struct branch_info new_branch_info;
 	int dwim_remotes_matched = 0;
+	int parseopt_flags = 0;
 
 	memset(&new_branch_info, 0, sizeof(new_branch_info));
 	opts->overwrite_ignore = 1;
@@ -1421,8 +1424,13 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
 
 	opts->track = BRANCH_TRACK_UNSPECIFIED;
 
-	argc = parse_options(argc, argv, prefix, options, usagestr,
-			     PARSE_OPT_KEEP_DASHDASH);
+	if (!opts->accept_pathspec && !opts->accept_ref)
+		BUG("make up your mind, you need to take _something_");
+	if (opts->accept_pathspec && opts->accept_ref)
+		parseopt_flags = PARSE_OPT_KEEP_DASHDASH;
+
+	argc = parse_options(argc, argv, prefix, options,
+			     usagestr, parseopt_flags);
 
 	if (opts->show_progress < 0) {
 		if (opts->quiet)
@@ -1481,7 +1489,7 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
 	 * including "last branch" syntax and DWIM-ery for names of
 	 * remote branches, erroring out for invalid or ambiguous cases.
 	 */
-	if (argc) {
+	if (argc && opts->accept_ref) {
 		struct object_id rev;
 		int dwim_ok =
 			!opts->patch_mode &&
@@ -1493,6 +1501,18 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
 					     &dwim_remotes_matched);
 		argv += n;
 		argc -= n;
+	} else if (!opts->accept_ref && opts->from_treeish) {
+		struct object_id rev;
+
+		if (get_oid_mb(opts->from_treeish, &rev))
+			die(_("could not resolve %s"), opts->from_treeish);
+
+		setup_new_branch_info_and_source_tree(&new_branch_info,
+						      opts, &rev,
+						      opts->from_treeish);
+
+		if (!opts->source_tree)
+			die(_("reference is not a tree: %s"), opts->from_treeish);
 	}
 
 	if (argc) {
@@ -1576,6 +1596,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
 	opts.dwim_new_local_branch = 1;
 	opts.switch_branch_doing_nothing_is_ok = 1;
 	opts.only_merge_on_switching_branches = 0;
+	opts.accept_ref = 1;
 	opts.accept_pathspec = 1;
 	opts.implicit_detach = 1;
 	opts.can_switch_when_in_progress = 1;
@@ -1611,6 +1632,7 @@ int cmd_switch(int argc, const char **argv, const char *prefix)
 
 	memset(&opts, 0, sizeof(opts));
 	opts.dwim_new_local_branch = 1;
+	opts.accept_ref = 1;
 	opts.accept_pathspec = 0;
 	opts.switch_branch_doing_nothing_is_ok = 0;
 	opts.only_merge_on_switching_branches = 1;
@@ -1631,15 +1653,19 @@ int cmd_switch(int argc, const char **argv, const char *prefix)
 int cmd_restore(int argc, const char **argv, const char *prefix)
 {
 	struct checkout_opts opts;
-	struct option *options = NULL;
+	struct option *options;
+	struct option restore_options[] = {
+		OPT_STRING('s', "source", &opts.from_treeish, "<tree-ish>",
+			   N_("where the checkout from")),
+		OPT_END()
+	};
 	int ret;
 
 	memset(&opts, 0, sizeof(opts));
-	opts.dwim_new_local_branch = 1;
-	opts.switch_branch_doing_nothing_is_ok = 0;
+	opts.accept_ref = 0;
 	opts.accept_pathspec = 1;
 
-	options = parse_options_dup(options);
+	options = parse_options_dup(restore_options);
 	options = add_common_options(&opts, options);
 	options = add_checkout_path_options(&opts, options);
 
-- 
2.21.0.854.ge34a79f761


  parent reply	other threads:[~2019-04-25  9:46 UTC|newest]

Thread overview: 97+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-08 10:16 [PATCH v1 00/11] And new command "restore" Nguyễn Thái Ngọc Duy
2019-03-08 10:16 ` [PATCH v1 01/11] checkout: split part of it to new command 'restore' Nguyễn Thái Ngọc Duy
2019-03-08 18:01   ` Elijah Newren
2019-03-09 12:16     ` Duy Nguyen
2019-03-09 18:27       ` Elijah Newren
2019-04-09 12:18         ` Duy Nguyen
2019-03-25  9:53     ` Duy Nguyen
2019-03-25 15:51       ` Elijah Newren
2019-03-13  9:17   ` Johannes Schindelin
2019-03-08 10:16 ` [PATCH v1 02/11] restore: take tree-ish from --source option instead Nguyễn Thái Ngọc Duy
2019-03-09 18:13   ` Elijah Newren
2019-03-10  7:58   ` Eric Sunshine
2019-03-08 10:16 ` [PATCH v1 03/11] restore: make pathspec mandatory Nguyễn Thái Ngọc Duy
2019-03-09 18:35   ` Elijah Newren
2019-03-08 10:16 ` [PATCH v1 04/11] restore: disable overlay mode by default Nguyễn Thái Ngọc Duy
2019-03-09 18:37   ` Elijah Newren
2019-03-08 10:16 ` [PATCH v1 05/11] checkout: factor out worktree checkout code Nguyễn Thái Ngọc Duy
2019-03-08 10:16 ` [PATCH v1 06/11] restore: add --worktree and --index Nguyễn Thái Ngọc Duy
2019-03-09 18:52   ` Elijah Newren
2019-03-10 20:03     ` Eric Sunshine
2019-03-13 10:02     ` Duy Nguyen
2019-03-13 22:42     ` Junio C Hamano
2019-03-08 10:16 ` [PATCH v1 07/11] restore: default to --source=HEAD when only --index is specified Nguyễn Thái Ngọc Duy
2019-03-09 18:58   ` Elijah Newren
2019-03-08 10:16 ` [PATCH v1 08/11] restore: support --patch Nguyễn Thái Ngọc Duy
2019-03-09 19:02   ` Elijah Newren
2019-03-08 10:16 ` [PATCH v1 09/11] t: add tests for restore Nguyễn Thái Ngọc Duy
2019-03-09 16:53   ` Andrei Rybak
2019-03-13  9:13   ` Johannes Schindelin
2019-03-13  9:20     ` Duy Nguyen
2019-03-13 22:17       ` Johannes Schindelin
2019-03-14  4:57         ` Duy Nguyen
2019-03-14  5:45   ` Junio C Hamano
2019-03-14  5:55     ` Junio C Hamano
2019-03-08 10:16 ` [PATCH v1 10/11] completion: support restore Nguyễn Thái Ngọc Duy
2019-03-09 19:16   ` Elijah Newren
2019-03-11 15:22     ` Duy Nguyen
2019-03-11 15:39       ` Duy Nguyen
2019-03-11 18:28         ` Elijah Newren
2019-03-08 10:16 ` [PATCH v1 11/11] doc: promote "git restore" Nguyễn Thái Ngọc Duy
2019-03-09 19:37   ` Elijah Newren
2019-03-11 14:11     ` Randall S. Becker
2019-03-11 14:36       ` Duy Nguyen
2019-03-13  4:58         ` Junio C Hamano
2019-04-11 10:55           ` Duy Nguyen
2019-03-10 11:19 ` [PATCH v1 00/11] And new command "restore" Duy Nguyen
2019-03-10 22:45   ` Jacob Keller
2019-03-11 16:01   ` Elijah Newren
2019-03-13 22:58   ` Junio C Hamano
2019-03-14  3:49     ` Duy Nguyen
2019-04-11 13:12 ` [PATCH v2 00/16] Add new command 'restore' Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 01/16] checkout: split part of it to " Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 02/16] restore: take tree-ish from --source option instead Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 03/16] restore: make pathspec mandatory Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 04/16] restore: disable overlay mode by default Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 05/16] checkout: factor out worktree checkout code Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 06/16] restore: add --worktree and --staged Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 07/16] restore: reject invalid combinations with --staged Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 08/16] restore: default to --source=HEAD when only --staged is specified Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 09/16] restore: replace --force with --ignore-unmerged Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 10/16] restore: support --patch Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 11/16] t: add tests for restore Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 12/16] completion: support restore Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 13/16] user-manual.txt: prefer 'merge --abort' over 'reset --hard' Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 14/16] doc: promote "git restore" Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 15/16] rm: add --staged as alias for --cached Nguyễn Thái Ngọc Duy
2019-04-11 13:12   ` [PATCH v2 16/16] help: move git-diff and git-reset to different groups Nguyễn Thái Ngọc Duy
2019-04-12  5:14   ` [PATCH v2 00/16] Add new command 'restore' Junio C Hamano
2019-04-13 10:39     ` Duy Nguyen
2019-04-17 10:04   ` Duy Nguyen
2019-04-18  0:38     ` Junio C Hamano
2019-04-18  9:40       ` Duy Nguyen
2019-04-18 10:03       ` Johannes Schindelin
2019-04-18 10:20         ` Duy Nguyen
2019-04-25  9:45   ` [PATCH v3 " Nguyễn Thái Ngọc Duy
2019-04-25  9:45     ` [PATCH v3 01/16] checkout: split part of it to " Nguyễn Thái Ngọc Duy
2019-04-25  9:45     ` Nguyễn Thái Ngọc Duy [this message]
2019-04-25  9:45     ` [PATCH v3 03/16] restore: make pathspec mandatory Nguyễn Thái Ngọc Duy
2019-04-25  9:45     ` [PATCH v3 04/16] restore: disable overlay mode by default Nguyễn Thái Ngọc Duy
2019-04-25  9:45     ` [PATCH v3 05/16] checkout: factor out worktree checkout code Nguyễn Thái Ngọc Duy
2019-04-25  9:45     ` [PATCH v3 06/16] restore: add --worktree and --staged Nguyễn Thái Ngọc Duy
2019-04-25  9:45     ` [PATCH v3 07/16] restore: reject invalid combinations with --staged Nguyễn Thái Ngọc Duy
2019-04-25  9:45     ` [PATCH v3 08/16] restore: default to --source=HEAD when only --staged is specified Nguyễn Thái Ngọc Duy
2019-04-25  9:45     ` [PATCH v3 09/16] restore: replace --force with --ignore-unmerged Nguyễn Thái Ngọc Duy
2019-04-25  9:45     ` [PATCH v3 10/16] restore: support --patch Nguyễn Thái Ngọc Duy
2019-04-25  9:45     ` [PATCH v3 11/16] t: add tests for restore Nguyễn Thái Ngọc Duy
2019-06-13 15:19       ` SZEDER Gábor
2019-04-25  9:45     ` [PATCH v3 12/16] completion: support restore Nguyễn Thái Ngọc Duy
2019-04-25  9:45     ` [PATCH v3 13/16] user-manual.txt: prefer 'merge --abort' over 'reset --hard' Nguyễn Thái Ngọc Duy
2019-04-25  9:45     ` [PATCH v3 14/16] doc: promote "git restore" Nguyễn Thái Ngọc Duy
2019-04-25  9:45     ` [PATCH v3 15/16] help: move git-diff and git-reset to different groups Nguyễn Thái Ngọc Duy
2019-04-25  9:46     ` [PATCH v3 16/16] Declare both git-switch and git-restore experimental Nguyễn Thái Ngọc Duy
2019-05-07  2:21     ` [PATCH v3 00/16] Add new command 'restore' Emily Shaffer
2019-05-07  4:57       ` Junio C Hamano
2019-05-07 10:36       ` Duy Nguyen
2019-05-07 18:31         ` Emily Shaffer
2019-05-08 10:20           ` Duy Nguyen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190425094600.15673-3-pclouds@gmail.com \
    --to=pclouds@gmail.com \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jacob.keller@gmail.com \
    --cc=newren@gmail.com \
    --cc=rybak.a.v@gmail.com \
    --cc=sunshine@sunshineco.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).