From: Junio C Hamano Date: Wed, 15 Feb 2006 01:56:02 +0000 (-0800) Subject: Merge branch 'master' X-Git-Tag: v1.3.0-rc1~54^2~73 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=becb6a658c43633850a2417935c108266056b765;hp=-c;p=git.git Merge branch 'master' * master: Merge branch 'kh/svn' git-svnimport: -r adds svn revision number to commit messages Merge branch 'jc/commit' commit: detect misspelled pathspec while making a partial commit. combine-diff: diff-files fix (#2) combine-diff: diff-files fix. Merge branch 'jc/rebase' Merge branch 'ra/email' --- becb6a658c43633850a2417935c108266056b765 diff --combined diff-files.c index 574294f3,0c3f8004..b1c05b32 --- a/diff-files.c +++ b/diff-files.c @@@ -150,6 -150,8 +150,8 @@@ int main(int argc, const char **argv nce->sha1, 20); combine.p.parent[stage-2].mode = DIFF_FILE_CANON_MODE(mode); + combine.p.parent[stage-2].status = + DIFF_STATUS_MODIFIED; } /* diff against the proper unmerged stage */ @@@ -191,7 -193,7 +193,7 @@@ show_file('-', ce); continue; } - changed = ce_match_stat(ce, &st); + changed = ce_match_stat(ce, &st, 0); if (!changed && !diff_options.find_copies_harder) continue; oldmode = ntohl(ce->ce_mode); diff --combined ls-files.c index 5539fd85,a716e5fa..52bbfdc8 --- a/ls-files.c +++ b/ls-files.c @@@ -20,12 -20,13 +20,14 @@@ static int show_unmerged = 0 static int show_modified = 0; static int show_killed = 0; static int show_other_directories = 0; +static int show_valid_bit = 0; static int line_terminator = '\n'; static int prefix_len = 0, prefix_offset = 0; static const char *prefix = NULL; static const char **pathspec = NULL; + static int error_unmatch = 0; + static char *ps_matched = NULL; static const char *tag_cached = ""; static const char *tag_unmerged = ""; @@@ -326,7 -327,8 +328,8 @@@ static int cmp_name(const void *p1, con * Match a pathspec against a filename. The first "len" characters * are the common prefix */ - static int match(const char **spec, const char *filename, int len) + static int match(const char **spec, char *ps_matched, + const char *filename, int len) { const char *m; @@@ -334,17 -336,24 +337,24 @@@ int matchlen = strlen(m + len); if (!matchlen) - return 1; + goto matched; if (!strncmp(m + len, filename + len, matchlen)) { if (m[len + matchlen - 1] == '/') - return 1; + goto matched; switch (filename[len + matchlen]) { case '/': case '\0': - return 1; + goto matched; } } if (!fnmatch(m + len, filename + len, 0)) - return 1; + goto matched; + if (ps_matched) + ps_matched++; + continue; + matched: + if (ps_matched) + *ps_matched = 1; + return 1; } return 0; } @@@ -357,7 -366,7 +367,7 @@@ static void show_dir_entry(const char * if (len >= ent->len) die("git-ls-files: internal error - directory entry not superset of prefix"); - if (pathspec && !match(pathspec, ent->name, len)) + if (pathspec && !match(pathspec, ps_matched, ent->name, len)) return; fputs(tag, stdout); @@@ -445,26 -454,9 +455,26 @@@ static void show_ce_entry(const char *t if (len >= ce_namelen(ce)) die("git-ls-files: internal error - cache entry not superset of prefix"); - if (pathspec && !match(pathspec, ce->name, len)) + if (pathspec && !match(pathspec, ps_matched, ce->name, len)) return; + if (tag && *tag && show_valid_bit && + (ce->ce_flags & htons(CE_VALID))) { + static char alttag[4]; + memcpy(alttag, tag, 3); + if (isalpha(tag[0])) + alttag[0] = tolower(tag[0]); + else if (tag[0] == '?') + alttag[0] = '!'; + else { + alttag[0] = 'v'; + alttag[1] = tag[0]; + alttag[2] = ' '; + alttag[3] = 0; + } + tag = alttag; + } + if (!show_stage) { fputs(tag, stdout); write_name_quoted("", 0, ce->name + offset, @@@ -541,7 -533,7 +551,7 @@@ static void show_files(void err = lstat(ce->name, &st); if (show_deleted && err) show_ce_entry(tag_removed, ce); - if (show_modified && ce_modified(ce, &st)) + if (show_modified && ce_modified(ce, &st, 0)) show_ce_entry(tag_modified, ce); } } @@@ -614,7 -606,7 +624,7 @@@ static void verify_pathspec(void } static const char ls_files_usage[] = - "git-ls-files [-z] [-t] (--[cached|deleted|others|stage|unmerged|killed|modified])* " + "git-ls-files [-z] [-t] [-v] (--[cached|deleted|others|stage|unmerged|killed|modified])* " "[ --ignored ] [--exclude=] [--exclude-from=] " "[ --exclude-per-directory= ] [--full-name] [--] []*"; @@@ -639,15 -631,13 +649,15 @@@ int main(int argc, const char **argv line_terminator = 0; continue; } - if (!strcmp(arg, "-t")) { + if (!strcmp(arg, "-t") || !strcmp(arg, "-v")) { tag_cached = "H "; tag_unmerged = "M "; tag_removed = "R "; tag_modified = "C "; tag_other = "? "; tag_killed = "K "; + if (arg[1] == 'v') + show_valid_bit = 1; continue; } if (!strcmp(arg, "-c") || !strcmp(arg, "--cached")) { @@@ -719,6 -709,10 +729,10 @@@ prefix_offset = 0; continue; } + if (!strcmp(arg, "--error-unmatch")) { + error_unmatch = 1; + continue; + } if (*arg == '-') usage(ls_files_usage); break; @@@ -730,6 -724,14 +744,14 @@@ if (pathspec) verify_pathspec(); + /* Treat unmatching pathspec elements as errors */ + if (pathspec && error_unmatch) { + int num; + for (num = 0; pathspec[num]; num++) + ; + ps_matched = xcalloc(1, num); + } + if (show_ignored && !exc_given) { fprintf(stderr, "%s: --ignored needs some exclude pattern\n", argv[0]); @@@ -745,5 -747,20 +767,20 @@@ if (prefix) prune_cache(); show_files(); + + if (ps_matched) { + /* We need to make sure all pathspec matched otherwise + * it is an error. + */ + int num, errors = 0; + for (num = 0; pathspec[num]; num++) { + if (ps_matched[num]) + continue; + error("pathspec '%s' did not match any.", + pathspec[num] + prefix_len); + } + return errors ? 1 : 0; + } + return 0; }