浏览代码

Fix skipping long lines

Vadim Markovtsev 8 年之前
父节点
当前提交
f8788eda3f
共有 1 个文件被更改,包括 16 次插入6 次删除
  1. 16 6
      analyser.go

+ 16 - 6
analyser.go

@@ -40,13 +40,21 @@ func loc(file *object.Blob) (int, error) {
 		panic(err)
 	}
 	defer checkClose(reader)
-	scanner := bufio.NewScanner(reader)
+	var scanner *bufio.Scanner
+	buffer := make([]byte, bufio.MaxScanTokenSize)
 	counter := 0
-	for scanner.Scan() {
-		if !utf8.Valid(scanner.Bytes()) {
+	for scanner == nil || scanner.Err() == bufio.ErrTooLong {
+		if scanner != nil && !utf8.Valid(scanner.Bytes()) {
 			return -1, errors.New("binary")
 		}
-		counter++
+		scanner = bufio.NewScanner(reader)
+		scanner.Buffer(buffer, 0)
+		for scanner.Scan() {
+			if !utf8.Valid(scanner.Bytes()) {
+				return -1, errors.New("binary")
+			}
+			counter++
+		}
 	}
 	return counter, nil
 }
@@ -163,8 +171,10 @@ func (analyser *Analyser) handleModification(
 	dmp := diffmatchpatch.New()
 	src, dst, _ := dmp.DiffLinesToRunes(str_from, str_to)
 	if file.Len() != len(src) {
-		panic(fmt.Sprintf("%s: internal integrity error src %d != %d",
-			change.To.Name, len(src), file.Len()))
+		fmt.Fprintf(os.Stderr, "====TREE====\n%s", file.Dump())
+		panic(fmt.Sprintf("%s: internal integrity error src %d != %d %s -> %s",
+			change.To.Name, len(src), file.Len(),
+			change.From.TreeEntry.Hash.String(), change.To.TreeEntry.Hash.String()))
 	}
 	diffs := dmp.DiffMainRunes(src, dst, false)
 	// we do not call RunesToDiffLines so the number of lines equals