Merge branch 'lt/apply'
authorJunio C Hamano <junkio@cox.net>
Mon, 29 May 2006 06:00:50 +0000 (23:00 -0700)
committerJunio C Hamano <junkio@cox.net>
Mon, 29 May 2006 06:00:50 +0000 (23:00 -0700)
* lt/apply:
  apply: force matching at the beginning.
  Add a test-case for git-apply trying to add an ending line
  apply: treat EOF as proper context.

1  2 
builtin-apply.c

diff --combined builtin-apply.c
@@@ -8,7 -8,6 +8,7 @@@
   */
  #include <fnmatch.h>
  #include "cache.h"
 +#include "cache-tree.h"
  #include "quote.h"
  #include "blob.h"
  #include "delta.h"
@@@ -1335,6 -1334,7 +1335,7 @@@ static int apply_line(char *output, con
  
  static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
  {
+       int match_beginning, match_end;
        char *buf = desc->buffer;
        const char *patch = frag->patch;
        int offset, size = frag->size;
        newlines = new;
        leading = frag->leading;
        trailing = frag->trailing;
+       /*
+        * If we don't have any leading/trailing data in the patch,
+        * we want it to match at the beginning/end of the file.
+        */
+       match_beginning = !leading && (frag->oldpos == 1);
+       match_end = !trailing;
        lines = 0;
        pos = frag->newpos;
        for (;;) {
                offset = find_offset(buf, desc->size, oldlines, oldsize, pos, &lines);
+               if (match_end && offset + oldsize != desc->size)
+                       offset = -1;
+               if (match_beginning && offset)
+                       offset = -1;
                if (offset >= 0) {
                        int diff = newsize - oldsize;
                        unsigned long size = desc->size + diff;
                /* Am I at my context limits? */
                if ((leading <= p_context) && (trailing <= p_context))
                        break;
+               if (match_beginning || match_end) {
+                       match_beginning = match_end = 0;
+                       continue;
+               }
                /* Reduce the number of context lines
                 * Reduce both leading and trailing if they are equal
                 * otherwise just reduce the larger context.
@@@ -1919,7 -1935,6 +1936,7 @@@ static void remove_file(struct patch *p
        if (write_index) {
                if (remove_file_from_cache(patch->old_name) < 0)
                        die("unable to remove %s from index", patch->old_name);
 +              cache_tree_invalidate_path(active_cache_tree, patch->old_name);
        }
        if (!cached)
                unlink(patch->old_name);
@@@ -2021,9 -2036,8 +2038,9 @@@ static void create_file(struct patch *p
  
        if (!mode)
                mode = S_IFREG | 0644;
 -      create_one_file(path, mode, buf, size); 
 +      create_one_file(path, mode, buf, size);
        add_index_file(path, mode, buf, size);
 +      cache_tree_invalidate_path(active_cache_tree, path);
  }
  
  static void write_out_one_result(struct patch *patch)