How I found a bug in 2000 files
Dragoș Străinu
Posted on May 15, 2022
I was adding a new eslint plugin that will sort imports in js/ts files.
After adding eslint-plugin-simple-import-sort,
I run eslint --fix
and found about 2000 files changed.
As there was only reorder of imports I thought that there should not be any issues.
I was surprised when I found a very strange
TypeError: Cannot read properties of undefined
Reverting the import order did not help to fix the issue.
And now I started thinking about how I can find the issue without going through all 2000 files.
Then an idea came. As all changes are independent,
I could do a commit for every file change and then run a git bisect
and find the file that causes the problem.
So I created a bash script that will get all file names from git status
and create a commit with the file name:
Let's see how:
git status --porcelain # prints git status in a format that can be parsed
# M utils/index.ts
# M components/Button.tsx
# ...
Then we pipe this result to awk
and print only the file name:
git status --porcelain | awk '{print $2}'
# utils/index.ts
# components/Button.tsx
# ...
read each line (filename), and do a commit with --no-verify
to not trigger pre-commit check:
#!/bin/bash
(git status --porcelain | awk '{print $2}') |
while read -r line
do
git add $line
git commit -m "Add file $line" --no-verify
done
After running this script I had about 2000 commits where I could run git bisect
and find the issue.
git bisect
reduced the number of checks from 2000 (theoretically) to just 11.
I found the file that caused the issue, and it was completely unrelated to the file where the error was thrown.
So I just eslint ignored the sorting rule in that file (till later investigation).
Then I did a soft reset to undo all 2000 commits and pushed a single commit that successfully adds the new eslint plugin and rules to the project.
Posted on May 15, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
August 26, 2024