github / github/CopilotForXcode
`replace_string_in_file` reports success but doesn't persist changes
- Linguagem predominante
- Swift
- Estrelas
- 6.3k
- Forks
- 2k
- Merge médio
- 2min
- PRs com merge (30d)
- 2
Descrição
## Summary
The `replace_string_in_file` editing tool consistently reports successful edits but fails to write changes to disk, requiring escalation to `insert_edit_into_file`. This silent failure wastes significant time and breaks trust in the tool.
## Core Problem
**What happens:**
1. Tool reports: "✅ The following files were successfully edited"
2. File on disk remains unchanged (verified via `grep`, `sed`)
3. Compilation errors persist for missing code
4. No error message or warning given
**Scale:** 15-20 failed operations across multiple files in a single session
## Reproduction Steps
### Attempt 1: Basic Replace
```swift
// Trying to add property to struct
OLD: public var existingProperty: Type
NEW: public var existingProperty: Type
public var newProperty: NewType // ← Should be added
```
**Result:** Tool reports success, property not added
### Attempt 2: More Context
Added 5+ lines of surrounding context for uniqueness
**Result:** Same false success, no file modification
### Attempt 3: Smaller Edits
Broke into multiple atomic `replace_string_in_file` calls
**Result:** All reported success, none persisted
### Attempt 4: Different Tool (Workaround)
Switched to `insert_edit_into_file` with full code block
**Result:** ✅ **SUCCESS** - File actually modified
## Examples of Silent Failures
### Example 1: Adding Property
```swift
// Attempting to add to line 21:
public var radius: Double
public var newConfig: Config // ← Not added despite success report
public var model: ModelType
```
Verified via: `grep "newConfig" File.swift` (no results)
### Example 2: Renaming Class
```swift
OLD: public class OldName {
NEW: public class NewName {
```
Verified via: `grep "class NewName"` (empty - still OldName)
### Example 3: Updating Parameters
Changed type in 4 method signatures
All 4 reported success, none actually changed
Verified via: `grep "OldType"` (still 4 occurrences)
## File Context
**Common factors:**
- Xcode workspace (`.xcworkspace`)
- Swift files (`.swift`)
- Some had extended attributes (`@` flag)
- Files actively loaded in Xcode
- 100-30,000 lines
- Complex Swift (generics, protocols, async/await)
## Impact
- **Time lost:** 60-80 minutes debugging
- **Trust:** Tool reliability undermined
- **Workflow:** Required terminal verification for every edit
- **Escalation:** Eventually abandoned `replace_string_in_file` entirely
## Expected vs Actual Behavior
| Expected | Actual |
|----------|--------|
| File modified on disk | File unchanged |
| Compilation reflects changes | Compilation errors persist |
| Subsequent reads show new content | Old content remains |
| OR: Error reported if write fails | False success reported |
## Successful Workaround
```bash
# 1. Detect failure with terminal:
grep "expected_symbol" file.swift # (no output)
sed -n 'line,linep' file.swift # Shows old code
# 2. Use insert_edit_into_file instead:
# - Provide complete code block
# - Use // ...existing code... comments
# - Tool writes successfully
# 3. Verify after edit:
grep "expected_symbol" file.swift # Now found
```
## Potential Causes
1. **File caching** - Editor cache not flushed
2. **Xcode locks** - Files locked by IDE
3. **Extended attributes** - `@` flag preventing writes
4. **Path resolution** - Writing to wrong location
5. **Silent match failure** - Can't find string, reports success anyway
## Recommended Fixes
1. **Verify writes** - Read file back after write to confirm
2. **Report actual errors** - Show permission/lock failures
3. **Flush buffers** - Explicitly sync to disk before success
4. **Detect locks** - Check if Xcode has file locked
5. **Auto-fallback** - Suggest `insert_edit_into_file` on failure
## Evidence
```bash
# Tool says success:
✅ The following files were successfully edited: /path/to/File.swift
# Reality check:
$ grep "newProperty" File.swift
# (no output - property was NOT added)
$ sed -n '19,23p' File.swift
public var oldProperty: Type
public var anotherOld: Type
# (missing newProperty that should be between them)
```
## Reproducibility
- **Frequency:** 100% for affected files
- **Pattern:** Consistent across multiple file types/sizes
- **Workaround:** `insert_edit_into_file` always worked
## Key Observation
**The fact that `insert_edit_into_file` works reliably suggests this is a `replace_string_in_file`-specific issue**, not a general file writing problem.
---
**Priority:** High - Core functionality broken
**Request:** Investigate silent failures in Xcode workspace context with Swift files
Guia de contribuição
Avaliação
Esta issue ainda não foi avaliada.