X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=checkout-index.c;h=53dd8cba6f0c56125545acd46f1091366949f89b;hb=5e6f85f6c1d988d125dfcba16bb43a9a65f9eab3;hp=596d320fb67983a7f899f184024dde26caec956e;hpb=a65a686f4967ecba0759289d0e918f652980e8a2;p=git.git diff --git a/checkout-index.c b/checkout-index.c index 596d320f..53dd8cba 100644 --- a/checkout-index.c +++ b/checkout-index.c @@ -34,6 +34,10 @@ */ #include "cache.h" +static const char *prefix; +static int prefix_length; +static int checkout_stage; /* default to checkout stage0 */ + static struct checkout state = { .base_dir = "", .base_dir_len = 0, @@ -45,38 +49,63 @@ static struct checkout state = { static int checkout_file(const char *name) { - int pos = cache_name_pos(name, strlen(name)); - if (pos < 0) { - if (!state.quiet) { - pos = -pos - 1; - fprintf(stderr, - "git-checkout-index: %s is %s.\n", - name, - (pos < active_nr && - !strcmp(active_cache[pos]->name, name)) ? - "unmerged" : "not in the cache"); - } - return -1; + int namelen = strlen(name); + int pos = cache_name_pos(name, namelen); + int has_same_name = 0; + + if (pos < 0) + pos = -pos - 1; + + while (pos < active_nr) { + struct cache_entry *ce = active_cache[pos]; + if (ce_namelen(ce) != namelen || + memcmp(ce->name, name, namelen)) + break; + has_same_name = 1; + if (checkout_stage == ce_stage(ce)) + return checkout_entry(ce, &state); + pos++; + } + + if (!state.quiet) { + fprintf(stderr, "git-checkout-index: %s ", name); + if (!has_same_name) + fprintf(stderr, "is not in the cache"); + else if (checkout_stage) + fprintf(stderr, "does not exist at stage %d", + checkout_stage); + else + fprintf(stderr, "is unmerged"); + fputc('\n', stderr); } - return checkout_entry(active_cache[pos], &state); + return -1; } static int checkout_all(void) { - int i; + int i, errs = 0; for (i = 0; i < active_nr ; i++) { struct cache_entry *ce = active_cache[i]; - if (ce_stage(ce)) + if (ce_stage(ce) != checkout_stage) + continue; + if (prefix && *prefix && + (ce_namelen(ce) <= prefix_length || + memcmp(prefix, ce->name, prefix_length))) continue; if (checkout_entry(ce, &state) < 0) - return -1; + errs++; } + if (errs) + /* we have already done our error reporting. + * exit with the same code as die(). + */ + exit(128); return 0; } static const char checkout_cache_usage[] = -"git-checkout-index [-u] [-q] [-a] [-f] [-n] [--prefix=] [--] ..."; +"git-checkout-index [-u] [-q] [-a] [-f] [-n] [--stage=[123]] [--prefix=] [--] ..."; static struct cache_file cache_file; @@ -86,6 +115,9 @@ int main(int argc, char **argv) int newfd = -1; int all = 0; + prefix = setup_git_directory(); + prefix_length = prefix ? strlen(prefix) : 0; + if (read_cache() < 0) { die("invalid cache"); } @@ -123,11 +155,19 @@ int main(int argc, char **argv) die("cannot open index.lock file."); continue; } - if (!memcmp(arg, "--prefix=", 9)) { + if (!strncmp(arg, "--prefix=", 9)) { state.base_dir = arg+9; state.base_dir_len = strlen(state.base_dir); continue; } + if (!strncmp(arg, "--stage=", 8)) { + int ch = arg[8]; + if ('1' <= ch && ch <= '3') + checkout_stage = arg[8] - '0'; + else + die("stage should be between 1 and 3"); + continue; + } if (arg[0] == '-') usage(checkout_cache_usage); break; @@ -150,7 +190,7 @@ int main(int argc, char **argv) if (all) die("git-checkout-index: don't mix '--all' and explicit filenames"); - checkout_file(arg); + checkout_file(prefix_path(prefix, prefix_length, arg)); } if (all)