Merge branch 'cw/ws-indent-with-tab'
authorJunio C Hamano <gitster@pobox.com>
Sun, 9 May 2010 05:35:35 +0000 (22:35 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sun, 9 May 2010 05:35:35 +0000 (22:35 -0700)
* cw/ws-indent-with-tab:
whitespace: tests for git-apply --whitespace=fix with tab-in-indent
whitespace: add tab-in-indent support for --whitespace=fix
whitespace: replumb ws_fix_copy to take a strbuf *dst instead of char *dst
whitespace: tests for git-diff --check with tab-in-indent error class
whitespace: add tab-in-indent error class
whitespace: we cannot "catch all errors known to git" anymore

1  2 
Documentation/config.txt
builtin/apply.c
cache.h
diff --combined Documentation/config.txt
index 8f86050b05f5643240cfd760492079dbbcb73c76,9bb8f3d8985eaefac983fa3a468650b1792c2dd4..6308026bf649612cc9d88ee6077b945d3a161d0b
@@@ -198,11 -198,11 +198,11 @@@ core.quotepath:
  
  core.autocrlf::
        If true, makes git convert `CRLF` at the end of lines in text files to
 -      `LF` when reading from the filesystem, and convert in reverse when
 -      writing to the filesystem.  The variable can be set to
 +      `LF` when reading from the work tree, and convert in reverse when
 +      writing to the work tree.  The variable can be set to
        'input', in which case the conversion happens only while
 -      reading from the filesystem but files are written out with
 -      `LF` at the end of lines.  A file is considered
 +      reading from the work tree but files are written out to the work
 +      tree with `LF` at the end of lines.  A file is considered
        "text" (i.e. be subjected to the autocrlf mechanism) based on
        the file's `crlf` attribute, or if `crlf` is unspecified,
        based on the file's contents.  See linkgit:gitattributes[5].
@@@ -481,6 -481,8 +481,8 @@@ core.whitespace:
    error (enabled by default).
  * `indent-with-non-tab` treats a line that is indented with 8 or more
    space characters as an error (not enabled by default).
+ * `tab-in-indent` treats a tab character in the initial indent part of
+   the line as an error (not enabled by default).
  * `blank-at-eof` treats blank lines added at the end of file as an error
    (enabled by default).
  * `trailing-space` is a short-hand to cover both `blank-at-eol` and
@@@ -914,7 -916,7 +916,7 @@@ format.signoff:
  gc.aggressiveWindow::
        The window size parameter used in the delta compression
        algorithm used by 'git gc --aggressive'.  This defaults
 -      to 10.
 +      to 250.
  
  gc.auto::
        When there are approximately more than this many loose
@@@ -1359,6 -1361,10 +1361,6 @@@ notes.rewrite.<command>:
        automatically copies your notes from the original to the
        rewritten commit.  Defaults to `true`, but see
        "notes.rewriteRef" below.
 -+
 -This setting can be overridden with the `GIT_NOTES_REWRITE_REF`
 -environment variable, which must be a colon separated list of refs or
 -globs.
  
  notes.rewriteMode::
        When copying notes during a rewrite (see the
@@@ -1378,10 -1384,6 +1380,10 @@@ notes.rewriteRef:
  +
  Does not have a default value; you must configure this variable to
  enable note rewriting.
 ++
 +This setting can be overridden with the `GIT_NOTES_REWRITE_REF`
 +environment variable, which must be a colon separated list of refs or
 +globs.
  
  pack.window::
        The size of the window used by linkgit:git-pack-objects[1] when no
diff --combined builtin/apply.c
index 660cf92538ce125a83d566f3ba2bb7f2c24f5671,db9cbdda085a3d472eba6510dddeb641548beb8b..d56cabf5e2a5fad1cf98d74c38b2623f7150033b
@@@ -1854,6 -1854,8 +1854,8 @@@ static int match_fragment(struct image 
  {
        int i;
        char *fixed_buf, *buf, *orig, *target;
+       struct strbuf fixed;
+       size_t fixed_len;
        int preimage_limit;
  
        if (preimage->nr + try_lno <= img->nr) {
                 * use the whitespace from the preimage.
                 */
                extra_chars = preimage_end - preimage_eof;
-               fixed_buf = xmalloc(imgoff + extra_chars);
-               memcpy(fixed_buf, img->buf + try, imgoff);
-               memcpy(fixed_buf + imgoff, preimage_eof, extra_chars);
-               imgoff += extra_chars;
+               strbuf_init(&fixed, imgoff + extra_chars);
+               strbuf_add(&fixed, img->buf + try, imgoff);
+               strbuf_add(&fixed, preimage_eof, extra_chars);
+               fixed_buf = strbuf_detach(&fixed, &fixed_len);
                update_pre_post_images(preimage, postimage,
-                               fixed_buf, imgoff, postlen);
+                               fixed_buf, fixed_len, postlen);
                return 1;
        }
  
         * but in this loop we will only handle the part of the
         * preimage that falls within the file.
         */
-       fixed_buf = xmalloc(preimage->len + 1);
-       buf = fixed_buf;
+       strbuf_init(&fixed, preimage->len + 1);
        orig = preimage->buf;
        target = img->buf + try;
        for (i = 0; i < preimage_limit; i++) {
-               size_t fixlen; /* length after fixing the preimage */
                size_t oldlen = preimage->line[i].len;
                size_t tgtlen = img->line[try_lno + i].len;
-               size_t tgtfixlen; /* length after fixing the target line */
-               char tgtfixbuf[1024], *tgtfix;
+               size_t fixstart = fixed.len;
+               struct strbuf tgtfix;
                int match;
  
                /* Try fixing the line in the preimage */
-               fixlen = ws_fix_copy(buf, orig, oldlen, ws_rule, NULL);
+               ws_fix_copy(&fixed, orig, oldlen, ws_rule, NULL);
  
                /* Try fixing the line in the target */
-               if (sizeof(tgtfixbuf) > tgtlen)
-                       tgtfix = tgtfixbuf;
-               else
-                       tgtfix = xmalloc(tgtlen);
-               tgtfixlen = ws_fix_copy(tgtfix, target, tgtlen, ws_rule, NULL);
+               strbuf_init(&tgtfix, tgtlen);
+               ws_fix_copy(&tgtfix, target, tgtlen, ws_rule, NULL);
  
                /*
                 * If they match, either the preimage was based on
                 * so we might as well take the fix together with their
                 * real change.
                 */
-               match = (tgtfixlen == fixlen && !memcmp(tgtfix, buf, fixlen));
+               match = (tgtfix.len == fixed.len - fixstart &&
+                        !memcmp(tgtfix.buf, fixed.buf + fixstart,
+                                            fixed.len - fixstart));
  
-               if (tgtfix != tgtfixbuf)
-                       free(tgtfix);
+               strbuf_release(&tgtfix);
                if (!match)
                        goto unmatch_exit;
  
                orig += oldlen;
-               buf += fixlen;
                target += tgtlen;
        }
  
         * false).
         */
        for ( ; i < preimage->nr; i++) {
-               size_t fixlen; /* length after fixing the preimage */
+               size_t fixstart = fixed.len; /* start of the fixed preimage */
                size_t oldlen = preimage->line[i].len;
                int j;
  
                /* Try fixing the line in the preimage */
-               fixlen = ws_fix_copy(buf, orig, oldlen, ws_rule, NULL);
+               ws_fix_copy(&fixed, orig, oldlen, ws_rule, NULL);
  
-               for (j = 0; j < fixlen; j++)
-                       if (!isspace(buf[j]))
+               for (j = fixstart; j < fixed.len; j++)
+                       if (!isspace(fixed.buf[j]))
                                goto unmatch_exit;
  
                orig += oldlen;
-               buf += fixlen;
        }
  
        /*
         * has whitespace breakages unfixed, and fixing them makes the
         * hunk match.  Update the context lines in the postimage.
         */
+       fixed_buf = strbuf_detach(&fixed, &fixed_len);
        update_pre_post_images(preimage, postimage,
-                              fixed_buf, buf - fixed_buf, 0);
+                              fixed_buf, fixed_len, 0);
        return 1;
  
   unmatch_exit:
-       free(fixed_buf);
+       strbuf_release(&fixed);
        return 0;
  }
  
@@@ -2244,7 -2241,8 +2241,8 @@@ static int apply_one_fragment(struct im
        int match_beginning, match_end;
        const char *patch = frag->patch;
        int size = frag->size;
-       char *old, *new, *oldlines, *newlines;
+       char *old, *oldlines;
+       struct strbuf newlines;
        int new_blank_lines_at_end = 0;
        unsigned long leading, trailing;
        int pos, applied_pos;
        memset(&preimage, 0, sizeof(preimage));
        memset(&postimage, 0, sizeof(postimage));
        oldlines = xmalloc(size);
-       newlines = xmalloc(size);
+       strbuf_init(&newlines, size);
  
        old = oldlines;
-       new = newlines;
        while (size > 0) {
                char first;
                int len = linelen(patch, size);
-               int plen, added;
+               int plen;
                int added_blank_line = 0;
                int is_blank_context = 0;
+               size_t start;
  
                if (!len)
                        break;
                                /* ... followed by '\No newline'; nothing */
                                break;
                        *old++ = '\n';
-                       *new++ = '\n';
+                       strbuf_addch(&newlines, '\n');
                        add_line_info(&preimage, "\n", 1, LINE_COMMON);
                        add_line_info(&postimage, "\n", 1, LINE_COMMON);
                        is_blank_context = 1;
                        if (first == '+' && no_add)
                                break;
  
+                       start = newlines.len;
                        if (first != '+' ||
                            !whitespace_error ||
                            ws_error_action != correct_ws_error) {
-                               memcpy(new, patch + 1, plen);
-                               added = plen;
+                               strbuf_add(&newlines, patch + 1, plen);
                        }
                        else {
-                               added = ws_fix_copy(new, patch + 1, plen, ws_rule, &applied_after_fixing_ws);
+                               ws_fix_copy(&newlines, patch + 1, plen, ws_rule, &applied_after_fixing_ws);
                        }
-                       add_line_info(&postimage, new, added,
+                       add_line_info(&postimage, newlines.buf + start, newlines.len - start,
                                      (first == '+' ? 0 : LINE_COMMON));
-                       new += added;
                        if (first == '+' &&
                            (ws_rule & WS_BLANK_AT_EOF) &&
                            ws_blank_line(patch + 1, plen, ws_rule))
        }
        if (inaccurate_eof &&
            old > oldlines && old[-1] == '\n' &&
-           new > newlines && new[-1] == '\n') {
+           newlines.len > 0 && newlines.buf[newlines.len - 1] == '\n') {
                old--;
-               new--;
+               strbuf_setlen(&newlines, newlines.len - 1);
        }
  
        leading = frag->leading;
        pos = frag->newpos ? (frag->newpos - 1) : 0;
        preimage.buf = oldlines;
        preimage.len = old - oldlines;
-       postimage.buf = newlines;
-       postimage.len = new - newlines;
+       postimage.buf = newlines.buf;
+       postimage.len = newlines.len;
        preimage.line = preimage.line_allocated;
        postimage.line = postimage.line_allocated;
  
        }
  
        free(oldlines);
-       free(newlines);
+       strbuf_release(&newlines);
        free(preimage.line_allocated);
        free(postimage.line_allocated);
  
@@@ -2824,8 -2821,11 +2821,8 @@@ static int check_preimage(struct patch 
                if (stat_ret < 0) {
                        struct checkout costate;
                        /* checkout */
 +                      memset(&costate, 0, sizeof(costate));
                        costate.base_dir = "";
 -                      costate.base_dir_len = 0;
 -                      costate.force = 0;
 -                      costate.quiet = 0;
 -                      costate.not_new = 0;
                        costate.refresh_cache = 1;
                        if (checkout_entry(*ce, &costate, NULL) ||
                            lstat(old_name, st))
@@@ -3141,7 -3141,11 +3138,7 @@@ static void remove_file(struct patch *p
                        die("unable to remove %s from index", patch->old_name);
        }
        if (!cached) {
 -              if (S_ISGITLINK(patch->old_mode)) {
 -                      if (rmdir(patch->old_name))
 -                              warning("unable to remove submodule %s",
 -                                      patch->old_name);
 -              } else if (!unlink_or_warn(patch->old_name) && rmdir_empty) {
 +              if (!remove_or_warn(patch->old_mode, patch->old_name) && rmdir_empty) {
                        remove_path(patch->old_name);
                }
        }
diff --combined cache.h
index bfc4d82f6c4205e11de6d855459d1afa02bf5cbf,3b7f3b06df231b7d8ccdc1ae7d071b8d428ec560..9d97df9db980995f01d8b32f427edc6a1ff6f9c1
+++ b/cache.h
@@@ -701,7 -701,7 +701,7 @@@ static inline void *read_sha1_file(cons
        return read_sha1_file_repl(sha1, type, size, NULL);
  }
  extern int hash_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *sha1);
 -extern int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *return_sha1);
 +extern int write_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *return_sha1);
  extern int pretend_sha1_file(void *, unsigned long, enum object_type, unsigned char *);
  extern int force_object_loose(const unsigned char *sha1, time_t mtime);
  
@@@ -718,8 -718,6 +718,8 @@@ extern int has_loose_object_nonlocal(co
  
  extern int has_pack_index(const unsigned char *sha1);
  
 +extern void assert_sha1_type(const unsigned char *sha1, enum object_type expect);
 +
  extern const signed char hexval_table[256];
  static inline unsigned int hexval(unsigned char c)
  {
@@@ -1042,6 -1040,7 +1042,7 @@@ void shift_tree_by(const unsigned char 
  #define WS_INDENT_WITH_NON_TAB        04
  #define WS_CR_AT_EOL           010
  #define WS_BLANK_AT_EOF        020
+ #define WS_TAB_IN_INDENT       040
  #define WS_TRAILING_SPACE      (WS_BLANK_AT_EOL|WS_BLANK_AT_EOF)
  #define WS_DEFAULT_RULE (WS_TRAILING_SPACE|WS_SPACE_BEFORE_TAB)
  extern unsigned whitespace_rule_cfg;
@@@ -1050,7 -1049,7 +1051,7 @@@ extern unsigned parse_whitespace_rule(c
  extern unsigned ws_check(const char *line, int len, unsigned ws_rule);
  extern void ws_check_emit(const char *line, int len, unsigned ws_rule, FILE *stream, const char *set, const char *reset, const char *ws);
  extern char *whitespace_error_string(unsigned ws);
- extern int ws_fix_copy(char *, const char *, int, unsigned, int *);
+ extern void ws_fix_copy(struct strbuf *, const char *, int, unsigned, int *);
  extern int ws_blank_line(const char *line, int len, unsigned ws_rule);
  
  /* ls-files */