checkout: convert to use parse_pathspec

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Nguyễn Thái Ngọc Duy 2013-07-14 15:35:41 +07:00 committed by Junio C Hamano
parent 01a10b0af9
commit 817b345aeb
1 changed files with 21 additions and 13 deletions

View File

@ -46,7 +46,7 @@ struct checkout_opts {


int branch_exists; int branch_exists;
const char *prefix; const char *prefix;
const char **pathspec; struct pathspec pathspec;
struct tree *source_tree; struct tree *source_tree;
}; };


@ -257,20 +257,18 @@ static int checkout_paths(const struct checkout_opts *opts,


if (opts->patch_mode) if (opts->patch_mode)
return run_add_interactive(revision, "--patch=checkout", return run_add_interactive(revision, "--patch=checkout",
opts->pathspec); opts->pathspec.raw);


lock_file = xcalloc(1, sizeof(struct lock_file)); lock_file = xcalloc(1, sizeof(struct lock_file));


newfd = hold_locked_index(lock_file, 1); newfd = hold_locked_index(lock_file, 1);
if (read_cache_preload(opts->pathspec) < 0) if (read_cache_preload(opts->pathspec.raw) < 0)
return error(_("corrupt index file")); return error(_("corrupt index file"));


if (opts->source_tree) if (opts->source_tree)
read_tree_some(opts->source_tree, opts->pathspec); read_tree_some(opts->source_tree, opts->pathspec.raw);


for (pos = 0; opts->pathspec[pos]; pos++) ps_matched = xcalloc(1, opts->pathspec.nr);
;
ps_matched = xcalloc(1, pos);


/* /*
* Make sure all pathspecs participated in locating the paths * Make sure all pathspecs participated in locating the paths
@ -304,12 +302,12 @@ static int checkout_paths(const struct checkout_opts *opts,
* match_pathspec() for _all_ entries when * match_pathspec() for _all_ entries when
* opts->source_tree != NULL. * opts->source_tree != NULL.
*/ */
if (match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), if (match_pathspec_depth(&opts->pathspec, ce->name, ce_namelen(ce),
0, ps_matched)) 0, ps_matched))
ce->ce_flags |= CE_MATCHED; ce->ce_flags |= CE_MATCHED;
} }


if (report_path_error(ps_matched, opts->pathspec, opts->prefix)) { if (report_path_error(ps_matched, opts->pathspec.raw, opts->prefix)) {
free(ps_matched); free(ps_matched);
return 1; return 1;
} }
@ -1002,7 +1000,7 @@ static int switch_unborn_to_new_branch(const struct checkout_opts *opts)
static int checkout_branch(struct checkout_opts *opts, static int checkout_branch(struct checkout_opts *opts,
struct branch_info *new) struct branch_info *new)
{ {
if (opts->pathspec) if (opts->pathspec.nr)
die(_("paths cannot be used with switching branches")); die(_("paths cannot be used with switching branches"));


if (opts->patch_mode) if (opts->patch_mode)
@ -1154,9 +1152,19 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
} }


if (argc) { if (argc) {
opts.pathspec = get_pathspec(prefix, argv); /*
* In patch mode (opts.patch_mode != 0), we pass the
* pathspec to an external program, git-add--interactive.
* Do not accept any kind of magic that that program
* cannot handle. Magic mask is pretty safe to be
* lifted for new magic when opts.patch_mode == 0.
*/
parse_pathspec(&opts.pathspec,
opts.patch_mode == 0 ? 0 :
(PATHSPEC_ALL_MAGIC & ~PATHSPEC_FROMTOP),
0, prefix, argv);


if (!opts.pathspec) if (!opts.pathspec.nr)
die(_("invalid path specification")); die(_("invalid path specification"));


/* /*
@ -1188,7 +1196,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
strbuf_release(&buf); strbuf_release(&buf);
} }


if (opts.patch_mode || opts.pathspec) if (opts.patch_mode || opts.pathspec.nr)
return checkout_paths(&opts, new.name); return checkout_paths(&opts, new.name);
else else
return checkout_branch(&opts, &new); return checkout_branch(&opts, &new);