Skip to content

Commit

Permalink
stash: convert branch to builtin
Browse files Browse the repository at this point in the history
Add stash branch to the helper and delete the apply_to_branch
function from the shell script.

Checkout does not currently provide a function for checking out
a branch as cmd_checkout does a large amount of sanity checks
first that we require here.

Signed-off-by: Joel Teichroeb <joel@teichroeb.net>
Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
klusark authored and gitster committed Mar 7, 2019
1 parent 4e2dd39 commit 577c199
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 15 deletions.
46 changes: 46 additions & 0 deletions builtin/stash--helper.c
Expand Up @@ -14,6 +14,7 @@
static const char * const git_stash_helper_usage[] = {
N_("git stash--helper drop [-q|--quiet] [<stash>]"),
N_("git stash--helper apply [--index] [-q|--quiet] [<stash>]"),
N_("git stash--helper branch <branchname> [<stash>]"),
N_("git stash--helper clear"),
NULL
};
Expand All @@ -28,6 +29,11 @@ static const char * const git_stash_helper_apply_usage[] = {
NULL
};

static const char * const git_stash_helper_branch_usage[] = {
N_("git stash--helper branch <branchname> [<stash>]"),
NULL
};

static const char * const git_stash_helper_clear_usage[] = {
N_("git stash--helper clear"),
NULL
Expand Down Expand Up @@ -536,6 +542,44 @@ static int drop_stash(int argc, const char **argv, const char *prefix)
return ret;
}

static int branch_stash(int argc, const char **argv, const char *prefix)
{
int ret;
const char *branch = NULL;
struct stash_info info;
struct child_process cp = CHILD_PROCESS_INIT;
struct option options[] = {
OPT_END()
};

argc = parse_options(argc, argv, prefix, options,
git_stash_helper_branch_usage, 0);

if (!argc) {
fprintf_ln(stderr, _("No branch name specified"));
return -1;
}

branch = argv[0];

if (get_stash_info(&info, argc - 1, argv + 1))
return -1;

cp.git_cmd = 1;
argv_array_pushl(&cp.args, "checkout", "-b", NULL);
argv_array_push(&cp.args, branch);
argv_array_push(&cp.args, oid_to_hex(&info.b_commit));
ret = run_command(&cp);
if (!ret)
ret = do_apply_stash(prefix, &info, 1, 0);
if (!ret && info.is_stash_ref)
ret = do_drop_stash(prefix, &info, 0);

free_stash_info(&info);

return ret;
}

int cmd_stash__helper(int argc, const char **argv, const char *prefix)
{
pid_t pid = getpid();
Expand All @@ -562,6 +606,8 @@ int cmd_stash__helper(int argc, const char **argv, const char *prefix)
return !!clear_stash(argc, argv, prefix);
else if (!strcmp(argv[0], "drop"))
return !!drop_stash(argc, argv, prefix);
else if (!strcmp(argv[0], "branch"))
return !!branch_stash(argc, argv, prefix);

usage_msg_opt(xstrfmt(_("unknown subcommand: %s"), argv[0]),
git_stash_helper_usage, options);
Expand Down
17 changes: 2 additions & 15 deletions git-stash.sh
Expand Up @@ -615,20 +615,6 @@ drop_stash () {
clear_stash
}

apply_to_branch () {
test -n "$1" || die "$(gettext "No branch name specified")"
branch=$1
shift 1

set -- --index "$@"
assert_stash_like "$@"

git checkout -b $branch $REV^ &&
apply_stash "$@" && {
test -z "$IS_STASH_REF" || drop_stash "$@"
}
}

test "$1" = "-p" && set "push" "$@"

PARSE_CACHE='--not-parsed'
Expand Down Expand Up @@ -690,7 +676,8 @@ pop)
;;
branch)
shift
apply_to_branch "$@"
cd "$START_DIR"
git stash--helper branch "$@"
;;
*)
case $# in
Expand Down

0 comments on commit 577c199

Please sign in to comment.