Skip to content

Commit

Permalink
Handle Windows line endings (#62)
Browse files Browse the repository at this point in the history
  • Loading branch information
mrubens authored Dec 11, 2024
1 parent 6e1f683 commit ba8bed9
Show file tree
Hide file tree
Showing 7 changed files with 35 additions and 11 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Roo Cline Changelog

## [2.1.18]

- Diff editing bugfix to handle Windows line endings

## [2.1.17]

- Switch to search/replace diffs in experimental diff editing mode
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ A fork of Cline, an autonomous coding agent, with some added experimental config
- Unit test coverage (written almost entirely by Roo Cline!)
- Support for playing sound effects
- Support for OpenRouter compression
- Support for editing through diffs (very experimental)
- Support for gemini-exp-1206
- Support for copying prompts from the history screen
- Support for editing through diffs / handling truncated full-file edits

Here's an example of Roo-Cline autonomously creating a snake game with "Always approve write operations" and "Always approve browser actions" turned on:

Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"displayName": "Roo Cline",
"description": "A fork of Cline, an autonomous coding agent, with some added experimental configuration and automation features.",
"publisher": "RooVeterinaryInc",
"version": "2.1.17",
"version": "2.1.18",
"icon": "assets/icons/rocket.png",
"galleryBanner": {
"color": "#617A91",
Expand Down
17 changes: 17 additions & 0 deletions src/core/diff/strategies/__tests__/search-replace.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,23 @@ function test() {
expect(result).toBe("\tfunction test() {\n\t\t// First comment\n\t\t// Second comment\n\t\treturn true;\n\t}")
})

it('should handle Windows-style CRLF line endings', () => {
const originalContent = "function test() {\r\n return true;\r\n}\r\n"
const diffContent = `test.ts
<<<<<<< SEARCH
function test() {
return true;
}
=======
function test() {
return false;
}
>>>>>>> REPLACE`

const result = strategy.applyDiff(originalContent, diffContent)
expect(result).toBe("function test() {\r\n return false;\r\n}\r\n")
})

it('should return false if search content does not match', () => {
const originalContent = `function hello() {
console.log("hello")
Expand Down
15 changes: 9 additions & 6 deletions src/core/diff/strategies/search-replace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,13 @@ Your search/replace content here

const [_, searchContent, replaceContent] = match;

// Split content into lines
const searchLines = searchContent.trim().split('\n');
const replaceLines = replaceContent.trim().split('\n');
const originalLines = originalContent.split('\n');
// Detect line ending from original content
const lineEnding = originalContent.includes('\r\n') ? '\r\n' : '\n';

// Split content into lines, handling both \n and \r\n
const searchLines = searchContent.trim().split(/\r?\n/);
const replaceLines = replaceContent.trim().split(/\r?\n/);
const originalLines = originalContent.split(/\r?\n/);

// Find the search content in the original
let matchIndex = -1;
Expand Down Expand Up @@ -166,6 +169,6 @@ Your search/replace content here
const beforeMatch = originalLines.slice(0, matchIndex);
const afterMatch = originalLines.slice(matchIndex + searchLines.length);

return [...beforeMatch, ...indentedReplace, ...afterMatch].join('\n');
return [...beforeMatch, ...indentedReplace, ...afterMatch].join(lineEnding);
}
}
}
2 changes: 1 addition & 1 deletion webview-ui/src/components/settings/SettingsView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {

<div style={{ marginBottom: 5 }}>
<VSCodeCheckbox checked={diffEnabled} onChange={(e: any) => setDiffEnabled(e.target.checked)}>
<span style={{ fontWeight: "500" }}>Enable editing through diffs (very experimental!)</span>
<span style={{ fontWeight: "500" }}>Enable editing through diffs</span>
</VSCodeCheckbox>
<p
style={{
Expand Down

0 comments on commit ba8bed9

Please sign in to comment.