- 
                Notifications
    You must be signed in to change notification settings 
- Fork 1.5k
Fix reading long files #549
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
| At the moment we are not accepting contributions to the repository. Feedback for GitHub Copilot for Xcode can be given in the Copilot community discussions. | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR aims to fix an issue with reading long files by implementing asynchronous data accumulation during command execution. The change modifies the SystemUtils.swift file to handle potentially large output streams more effectively.
- Introduces asynchronous data reading using a readability handler to accumulate output incrementally
- Combines the accumulated data with any remaining data from the pipe before returning
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
| guard data.isEmpty else { // End of file | ||
| return accumulatedOutput.append(data) | ||
| } | ||
|  | ||
| handle.readabilityHandler = nil // Stop observing | 
    
      
    
      Copilot
AI
    
    
    
      Oct 2, 2025 
    
  
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The guard condition logic is inverted. When data.isEmpty is true, it indicates end of file, but the else block executes when data is NOT empty. This should be guard !data.isEmpty else { handle.readabilityHandler = nil; return } to properly handle the end-of-file condition.
| guard data.isEmpty else { // End of file | |
| return accumulatedOutput.append(data) | |
| } | |
| handle.readabilityHandler = nil // Stop observing | |
| guard !data.isEmpty else { // End of file | |
| handle.readabilityHandler = nil // Stop observing | |
| return | |
| } | |
| accumulatedOutput.append(data) | 
| pipe.fileHandleForReading.readabilityHandler = { handle in | ||
| let data = handle.availableData | ||
| guard data.isEmpty else { // End of file | ||
| return accumulatedOutput.append(data) | 
    
      
    
      Copilot
AI
    
    
    
      Oct 2, 2025 
    
  
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The append method returns Void, but this is being used in a return statement. This line should just be accumulatedOutput.append(data) without the return keyword.
| return accumulatedOutput.append(data) | |
| accumulatedOutput.append(data) | |
| return | 
| var accumulatedOutput = Data() | ||
| pipe.fileHandleForReading.readabilityHandler = { handle in | ||
| let data = handle.availableData | ||
| guard data.isEmpty else { // End of file | ||
| return accumulatedOutput.append(data) | ||
| } | ||
|  | ||
| handle.readabilityHandler = nil // Stop observing | ||
| } | 
    
      
    
      Copilot
AI
    
    
    
      Oct 2, 2025 
    
  
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The accumulatedOutput variable is accessed from both the main thread and the readability handler callback without synchronization. This creates a potential race condition. Consider using a concurrent queue with barriers or other synchronization mechanism to ensure thread-safe access.
At the moment we are not accepting contributions to the repository.
I see. Just check it by yourselves.