-
Notifications
You must be signed in to change notification settings - Fork 148
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
Don't limit the output from exec #596
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sergiou87
reviewed
Oct 22, 2024
Comment on lines
+151
to
+156
const cwd = process.cwd() | ||
const result = await git(['-h'], cwd, { maxBuffer: 1 }).catch(e => e) | ||
|
||
// NOTE: if we change the default buffer size in git-process | ||
// this test may no longer fail as expected - see https://git.io/v1dq3 | ||
const output = crypto.randomBytes(10 * 1024 * 1024).toString('hex') | ||
const file = path.join(testRepoPath, 'new-file.md') | ||
fs.writeFileSync(file, output) | ||
|
||
// TODO: convert this to assert the error was thrown | ||
|
||
let throws = false | ||
try { | ||
await exec( | ||
[ | ||
'diff', | ||
'--no-index', | ||
'--patch-with-raw', | ||
'-z', | ||
'--', | ||
'/dev/null', | ||
'new-file.md', | ||
], | ||
testRepoPath | ||
) | ||
} catch { | ||
throws = true | ||
} | ||
assert.equal(throws, true) | ||
assert.ok(result instanceof ExecError) | ||
assert.ok(result.cause instanceof RangeError) | ||
assert.equal(result.code, 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER') |
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.
😗👌
sergiou87
approved these changes
Oct 22, 2024
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.
Nice catch!!
Merged
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The default behavior of Node's execFile is to kill the executing process if its output (on either stdout or stderr) exceeds 1Mb. Dugite's documented behavior is to kill the executing process if its output exceeds 10Mb. This, however, isn't technically what's happening today. An examination of the code shows us that only if the caller omits options when calling exec does the maxBuffer get set to 10Mb. If the caller does provide options maxBuffer will be set to Node's default (1Mb).
This changes the default setting of maxBuffer to Infinity, i.e. no limits. Capping the output makes sense in scenarios where memory is constrained or where the caller only cares about parts of the output (in Desktop we use this to only load the first few hundred kilobytes of a file when doing syntax highlighting, anything beyond that we're not gonna highlight).
The normal scenario for Desktop, however, is that we care about all of the output from Git and as long as the system is able to provide us the memory to capture it we want to capture it.