Merge branch 'master'
authorJunio C Hamano <junkio@cox.net>
Wed, 15 Feb 2006 01:56:02 +0000 (17:56 -0800)
committerJunio C Hamano <junkio@cox.net>
Wed, 15 Feb 2006 01:56:02 +0000 (17:56 -0800)
* 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'

1  2 
diff-files.c
ls-files.c

diff --combined 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 */
                        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
@@@ -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;
  
                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=<pattern>] [--exclude-from=<file>] "
        "[ --exclude-per-directory=<filename> ] [--full-name] [--] [<file>]*";
  
@@@ -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")) {
                        prefix_offset = 0;
                        continue;
                }
+               if (!strcmp(arg, "--error-unmatch")) {
+                       error_unmatch = 1;
+                       continue;
+               }
                if (*arg == '-')
                        usage(ls_files_usage);
                break;
        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]);
        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;
  }