DEV Community

Cover image for How I found a bug in 2000 files
Dragoș Străinu
Dragoș Străinu

Posted on • Originally published at strdr4605.com on

4 1

How I found a bug in 2000 files

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
Enter fullscreen mode Exit fullscreen mode

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
# ...
Enter fullscreen mode Exit fullscreen mode

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
# ...
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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.

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (1)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay