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.

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read full post →

Top comments (1)

Image of Datadog

Learn how to monitor AWS container environments at scale

In this eBook, Datadog and AWS share insights into the changing state of containers in the cloud and explore why orchestration technologies are an essential part of managing ever-changing containerized workloads.

Download the eBook