mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 03:18:24 +00:00 
			
		
		
		
	Support repo code search without setting up an indexer (#29998)
By using git's ability, end users (especially small instance users) do not need to enable the indexer, they could also benefit from the code searching feature. Fix #29996   --------- Co-authored-by: silverwind <me@silverwind.io>
This commit is contained in:
		| @@ -70,13 +70,27 @@ func writeStrings(buf *bytes.Buffer, strs ...string) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func HighlightSearchResultCode(filename string, lineNums []int, code string) []ResultLine { | ||||
| 	// we should highlight the whole code block first, otherwise it doesn't work well with multiple line highlighting | ||||
| 	hl, _ := highlight.Code(filename, "", code) | ||||
| 	highlightedLines := strings.Split(string(hl), "\n") | ||||
|  | ||||
| 	// The lineNums outputted by highlight.Code might not match the original lineNums, because "highlight" removes the last `\n` | ||||
| 	lines := make([]ResultLine, min(len(highlightedLines), len(lineNums))) | ||||
| 	for i := 0; i < len(lines); i++ { | ||||
| 		lines[i].Num = lineNums[i] | ||||
| 		lines[i].FormattedContent = template.HTML(highlightedLines[i]) | ||||
| 	} | ||||
| 	return lines | ||||
| } | ||||
|  | ||||
| func searchResult(result *internal.SearchResult, startIndex, endIndex int) (*Result, error) { | ||||
| 	startLineNum := 1 + strings.Count(result.Content[:startIndex], "\n") | ||||
|  | ||||
| 	var formattedLinesBuffer bytes.Buffer | ||||
|  | ||||
| 	contentLines := strings.SplitAfter(result.Content[startIndex:endIndex], "\n") | ||||
| 	lines := make([]ResultLine, 0, len(contentLines)) | ||||
| 	lineNums := make([]int, 0, len(contentLines)) | ||||
| 	index := startIndex | ||||
| 	for i, line := range contentLines { | ||||
| 		var err error | ||||
| @@ -91,29 +105,16 @@ func searchResult(result *internal.SearchResult, startIndex, endIndex int) (*Res | ||||
| 				line[closeActiveIndex:], | ||||
| 			) | ||||
| 		} else { | ||||
| 			err = writeStrings(&formattedLinesBuffer, | ||||
| 				line, | ||||
| 			) | ||||
| 			err = writeStrings(&formattedLinesBuffer, line) | ||||
| 		} | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  | ||||
| 		lines = append(lines, ResultLine{Num: startLineNum + i}) | ||||
| 		lineNums = append(lineNums, startLineNum+i) | ||||
| 		index += len(line) | ||||
| 	} | ||||
|  | ||||
| 	// we should highlight the whole code block first, otherwise it doesn't work well with multiple line highlighting | ||||
| 	hl, _ := highlight.Code(result.Filename, "", formattedLinesBuffer.String()) | ||||
| 	highlightedLines := strings.Split(string(hl), "\n") | ||||
|  | ||||
| 	// The lines outputted by highlight.Code might not match the original lines, because "highlight" removes the last `\n` | ||||
| 	lines = lines[:min(len(highlightedLines), len(lines))] | ||||
| 	highlightedLines = highlightedLines[:len(lines)] | ||||
| 	for i := 0; i < len(lines); i++ { | ||||
| 		lines[i].FormattedContent = template.HTML(highlightedLines[i]) | ||||
| 	} | ||||
|  | ||||
| 	return &Result{ | ||||
| 		RepoID:      result.RepoID, | ||||
| 		Filename:    result.Filename, | ||||
| @@ -121,7 +122,7 @@ func searchResult(result *internal.SearchResult, startIndex, endIndex int) (*Res | ||||
| 		UpdatedUnix: result.UpdatedUnix, | ||||
| 		Language:    result.Language, | ||||
| 		Color:       result.Color, | ||||
| 		Lines:       lines, | ||||
| 		Lines:       HighlightSearchResultCode(result.Filename, lineNums, formattedLinesBuffer.String()), | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user