How I found a bug in 2000 files

on Dragoș Străinu's blog

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:


(git status --porcelain | awk '{print $2}') | 
while read -r line
    git add $line
    git commit -m "Add file $line" --no-verify

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.