From 44588b1e5d116fb84bcc02b5062e43e3fb13090c Mon Sep 17 00:00:00 2001 From: JerrySentry Date: Fri, 6 Dec 2024 16:05:28 -0500 Subject: [PATCH 1/8] Bundle Analysis: Display comparison for file paths on PR comments --- .../notify/messages/comment.py | 56 ++++++- .../bundle_analysis_notify/bundle_comment.md | 3 +- .../bundle_route_table.md | 10 ++ .../tests/test_bundle_analysis.py | 146 +++++++++++++++++- 4 files changed, 206 insertions(+), 9 deletions(-) create mode 100644 services/bundle_analysis/notify/messages/templates/bundle_analysis_notify/bundle_route_table.md diff --git a/services/bundle_analysis/notify/messages/comment.py b/services/bundle_analysis/notify/messages/comment.py index b759edaea..968089afe 100644 --- a/services/bundle_analysis/notify/messages/comment.py +++ b/services/bundle_analysis/notify/messages/comment.py @@ -4,7 +4,7 @@ import sentry_sdk from asgiref.sync import async_to_sync from django.template import loader -from shared.bundle_analysis import BundleAnalysisComparison, BundleChange +from shared.bundle_analysis import BundleAnalysisComparison, BundleChange, RouteChange from shared.torngit.exceptions import TorngitClientError from shared.validation.types import BundleThreshold @@ -34,6 +34,14 @@ class BundleRow(TypedDict): is_change_outside_threshold: bool +class BundleRouteRow(TypedDict): + route_name: str + change_size_readable: str + percentage_change_readable: str + change_icon: str + route_size: str + + class BundleCommentTemplateContext(TypedDict): pull_url: str total_size_delta: int @@ -42,6 +50,7 @@ class BundleCommentTemplateContext(TypedDict): status_level: Literal["INFO"] | Literal["WARNING"] | Literal["ERROR"] warning_threshold_readable: str bundle_rows: list[BundleRow] + bundle_route_data: dict[str, list[BundleRouteRow]] has_cached_bundles: bool @@ -70,6 +79,9 @@ def build_default_message( bundle_rows = self._create_bundle_rows( context.bundle_analysis_comparison, warning_threshold ) + bundle_route_data = self._create_bundle_route_data( + context.bundle_analysis_comparison + ) if warning_threshold.type == "absolute": warning_threshold_readable = bytes_readable(warning_threshold.threshold) else: @@ -77,6 +89,7 @@ def build_default_message( context = BundleCommentTemplateContext( has_cached=any(row["is_cached"] for row in bundle_rows), bundle_rows=bundle_rows, + bundle_route_data=bundle_route_data, pull_url=get_bundle_analysis_pull_url(pull=context.pull.database_pull), total_size_delta=total_size_delta, status_level=context.commit_status_level.name, @@ -159,7 +172,7 @@ def _create_bundle_rows( change_size = bundle_change.size_delta if change_size == 0: - # Don't include bundles that were not changes in the table + # Don't include bundles that were not changed in the table continue icon = "" if change_size > 0: @@ -184,3 +197,42 @@ def _create_bundle_rows( ) return bundle_rows + + def _create_bundle_route_data( + self, + comparison: BundleAnalysisComparison, + ) -> dict[str, list[BundleRouteRow]]: + """ + Translate BundleRouteComparison dict data into a template compatible dict data + """ + bundle_route_data = {} + changes_dict = comparison.bundle_routes_changes() + + for bundle_name, route_changes in changes_dict.items(): + rows = [] + for route_change in route_changes: + change_size, icon = route_change.size_delta, "" + size = "(removed)" if route_change.change_type == RouteChange.ChangeType.REMOVED else bytes_readable(route_change.size_head) + + if change_size == 0: + # Don't include bundles that were not changes in the table + continue + elif change_size > 0: + icon = ":arrow_up:" + elif change_size < 0: + icon = ":arrow_down:" + + rows.append( + BundleRouteRow( + route_name=route_change.route_name, + change_size_readable=bytes_readable(change_size), + percentage_change_readable=f"{route_change.percentage_delta}%", + change_icon=icon, + route_size=size, + ) + ) + + # Only include bundles that have routes + if rows: + bundle_route_data[bundle_name] = rows + return bundle_route_data diff --git a/services/bundle_analysis/notify/messages/templates/bundle_analysis_notify/bundle_comment.md b/services/bundle_analysis/notify/messages/templates/bundle_analysis_notify/bundle_comment.md index c2349ea5e..33d3076ca 100644 --- a/services/bundle_analysis/notify/messages/templates/bundle_analysis_notify/bundle_comment.md +++ b/services/bundle_analysis/notify/messages/templates/bundle_analysis_notify/bundle_comment.md @@ -7,4 +7,5 @@ Bundle size has no change :white_check_mark: {% if bundle_rows %}{% include "bundle_analysis_notify/bundle_table.md" %}{% if has_cached %} ℹ️ *Bundle size includes cached data from a previous commit -{%endif%}{% endif %} \ No newline at end of file +{%endif%}{% endif %} +{% if bundle_route_data %}{% include "bundle_analysis_notify/bundle_route_table.md" %}{% endif %} \ No newline at end of file diff --git a/services/bundle_analysis/notify/messages/templates/bundle_analysis_notify/bundle_route_table.md b/services/bundle_analysis/notify/messages/templates/bundle_analysis_notify/bundle_route_table.md new file mode 100644 index 000000000..b68e746de --- /dev/null +++ b/services/bundle_analysis/notify/messages/templates/bundle_analysis_notify/bundle_route_table.md @@ -0,0 +1,10 @@ +{% for bundle_name, routes in bundle_route_data.items %} +
+ View changes by path for bundle: {{ bundle_name }} + +| File path | Size | Change | +| --------- | ---- | ------ |{% for bundle_route_row in routes %} +| {{bundle_route_row.route_name}} | {{bundle_route_row.route_size}} | {{bundle_route_row.change_size_readable}} ({{bundle_route_row.percentage_change_readable}}) {{bundle_route_row.change_icon}}{{bundle_route_row.}} |{% endfor %} + +
+{% endfor %} diff --git a/services/bundle_analysis/tests/test_bundle_analysis.py b/services/bundle_analysis/tests/test_bundle_analysis.py index 73c6a2816..1798f8734 100644 --- a/services/bundle_analysis/tests/test_bundle_analysis.py +++ b/services/bundle_analysis/tests/test_bundle_analysis.py @@ -2,7 +2,7 @@ from unittest.mock import PropertyMock import pytest -from shared.bundle_analysis.comparison import BundleChange +from shared.bundle_analysis.comparison import BundleChange, RouteChange from shared.bundle_analysis.models import AssetType from shared.bundle_analysis.storage import get_bucket_name from shared.config import PATCH_CENTRIC_DEFAULT_CONFIG @@ -58,7 +58,7 @@ def hook_mock_pull(mocker, mock_pull): @pytest.mark.parametrize( - "bundle_changes, percent_change, user_config, expected_message", + "bundle_changes, bundle_routes_changes, percent_change, user_config, expected_message", [ pytest.param( [ @@ -81,6 +81,7 @@ def hook_mock_pull(mocker, mock_pull): percentage_delta=-1.23, ), ], + {}, 5.56, { **PATCH_CENTRIC_DEFAULT_CONFIG, @@ -98,7 +99,8 @@ def hook_mock_pull(mocker, mock_pull): | ----------- | ---- | ------ | | added-bundle | 123.46kB | 12.35kB (5.56%) :arrow_up::warning: | | changed-bundle | 123.46kB | 3.46kB (0.35%) :arrow_up: | - | removed-bundle | (removed) | 1.23kB (-1.23%) :arrow_down: |"""), + | removed-bundle | (removed) | 1.23kB (-1.23%) :arrow_down: | + """), id="comment_increase_size_warning", ), pytest.param( @@ -122,6 +124,7 @@ def hook_mock_pull(mocker, mock_pull): percentage_delta=-100.0, ), ], + {}, 5.56, { **PATCH_CENTRIC_DEFAULT_CONFIG, @@ -139,7 +142,8 @@ def hook_mock_pull(mocker, mock_pull): | ----------- | ---- | ------ | | added-bundle | 123.46kB | 12.35kB (5.56%) :arrow_up::x: | | changed-bundle | 123.46kB | 3.46kB (2.56%) :arrow_up: | - | removed-bundle | (removed) | 1.23kB (-100.0%) :arrow_down: |"""), + | removed-bundle | (removed) | 1.23kB (-100.0%) :arrow_down: | + """), id="comment_increase_size_error", ), pytest.param( @@ -163,6 +167,7 @@ def hook_mock_pull(mocker, mock_pull): percentage_delta=2.56, ), ], + {}, 3.46, { **PATCH_CENTRIC_DEFAULT_CONFIG, @@ -187,7 +192,8 @@ def hook_mock_pull(mocker, mock_pull): ℹ️ *Bundle size includes cached data from a previous commit - """), + + """), id="comment_increase_size_cached_values", ), pytest.param( @@ -199,6 +205,7 @@ def hook_mock_pull(mocker, mock_pull): percentage_delta=-2.56, ), ], + {}, -0.52, { **PATCH_CENTRIC_DEFAULT_CONFIG, @@ -218,7 +225,8 @@ def hook_mock_pull(mocker, mock_pull): | ----------- | ---- | ------ | | test-bundle | 123.46kB | 3.46kB (-2.56%) :arrow_down: | - """), + + """), id="comment_decrease_size", ), pytest.param( @@ -230,6 +238,7 @@ def hook_mock_pull(mocker, mock_pull): percentage_delta=0.0, ), ], + {}, 0, { **PATCH_CENTRIC_DEFAULT_CONFIG, @@ -243,13 +252,134 @@ def hook_mock_pull(mocker, mock_pull): Bundle size has no change :white_check_mark: + """), id="comment_no_change", ), + pytest.param( + [ + BundleChange( + bundle_name="added-bundle", + change_type=BundleChange.ChangeType.ADDED, + size_delta=12345, + percentage_delta=5.56, + ), + BundleChange( + bundle_name="changed-bundle", + change_type=BundleChange.ChangeType.CHANGED, + size_delta=3456, + percentage_delta=0.35, + ), + BundleChange( + bundle_name="removed-bundle", + change_type=BundleChange.ChangeType.REMOVED, + size_delta=-1234, + percentage_delta=-1.23, + ), + ], + { + "BundleA": [ + RouteChange( + route_name="/users", + change_type=RouteChange.ChangeType.ADDED, + size_delta=1000, + size_base=0, + size_head=1000, + percentage_delta=100, + ), + RouteChange( + route_name="/faq", + change_type=RouteChange.ChangeType.REMOVED, + size_delta=-5000, + size_base=5000, + size_head=0, + percentage_delta=-100.0, + ), + RouteChange( + route_name="/careers", + change_type=RouteChange.ChangeType.CHANGED, + size_delta=10000, + size_base=20000, + size_head=30000, + percentage_delta=50.0, + ), + ], + "BundleB": [ + RouteChange( + route_name="/users", + change_type=RouteChange.ChangeType.ADDED, + size_delta=1000, + size_base=0, + size_head=1000, + percentage_delta=100, + ), + RouteChange( + route_name="/faq", + change_type=RouteChange.ChangeType.REMOVED, + size_delta=-5000, + size_base=5000, + size_head=0, + percentage_delta=-100.0, + ), + RouteChange( + route_name="/about-us", + change_type=RouteChange.ChangeType.CHANGED, + size_delta=10000, + size_base=20000, + size_head=30000, + percentage_delta=50.0, + ), + ], + }, + 5.56, + { + **PATCH_CENTRIC_DEFAULT_CONFIG, + "bundle_analysis": { + "status": "informational", + "warning_threshold": ["percentage", 5.0], + }, + }, + dedent("""\ + ## [Bundle](URL) Report + + Changes will increase total bundle size by 14.57kB (5.56%) :arrow_up::warning:, exceeding the [configured](https://docs.codecov.com/docs/javascript-bundle-analysis#main-features) threshold of 5%. + + | Bundle name | Size | Change | + | ----------- | ---- | ------ | + | added-bundle | 123.46kB | 12.35kB (5.56%) :arrow_up::warning: | + | changed-bundle | 123.46kB | 3.46kB (0.35%) :arrow_up: | + | removed-bundle | (removed) | 1.23kB (-1.23%) :arrow_down: | + +
+ View changes by path for bundle: BundleA + + | File path | Size | Change | + | --------- | ---- | ------ | + | /users | 1.0kB | 1.0kB (100%) :arrow_up: | + | /faq | (removed) | 5.0kB (-100.0%) :arrow_down: | + | /careers | 30.0kB | 10.0kB (50.0%) :arrow_up: | + +
+ +
+ View changes by path for bundle: BundleB + + | File path | Size | Change | + | --------- | ---- | ------ | + | /users | 1.0kB | 1.0kB (100%) :arrow_up: | + | /faq | (removed) | 5.0kB (-100.0%) :arrow_down: | + | /about-us | 30.0kB | 10.0kB (50.0%) :arrow_up: | + +
+ + """), + id="comparison_by_file_path", + ), ], ) def test_bundle_analysis_notify( bundle_changes: list[BundleChange], + bundle_routes_changes: dict[str, list[RouteChange]], percent_change: float, user_config: dict, expected_message: str, @@ -302,6 +432,10 @@ def test_bundle_analysis_notify( "shared.bundle_analysis.comparison.BundleAnalysisComparison.bundle_changes", return_value=bundle_changes, ) + mocker.patch( + "shared.bundle_analysis.comparison.BundleAnalysisComparison.bundle_routes_changes", + return_value=bundle_routes_changes, + ) mock_percentage = mocker.patch( "shared.bundle_analysis.comparison.BundleAnalysisComparison.percentage_delta", new_callable=PropertyMock, From ac1ae0a042d2a52fa90e17d35ae9ab42590462ac Mon Sep 17 00:00:00 2001 From: JerrySentry Date: Fri, 6 Dec 2024 17:24:06 -0500 Subject: [PATCH 2/8] update shared --- requirements.in | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.in b/requirements.in index 1ac8da5a2..80e1232d5 100644 --- a/requirements.in +++ b/requirements.in @@ -1,5 +1,5 @@ https://github.com/codecov/test-results-parser/archive/c840502d1b4dd7d05b2efc2c1328affaf2acd27c.tar.gz#egg=test-results-parser -https://github.com/codecov/shared/archive/8c5de3fadd3c987304043c6cfd64864f372d674f.tar.gz#egg=shared +https://github.com/codecov/shared/archive/0af6ba6385c84446beaf7f9917bf69ff1564c262.tar.gz#egg=shared https://github.com/codecov/timestring/archive/d37ceacc5954dff3b5bd2f887936a98a668dda42.tar.gz#egg=timestring asgiref>=3.7.2 analytics-python==1.3.0b1 diff --git a/requirements.txt b/requirements.txt index 2140731ad..7c90566b0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -328,7 +328,7 @@ sentry-sdk==2.13.0 # shared setuptools==75.6.0 # via nodeenv -shared @ https://github.com/codecov/shared/archive/8c5de3fadd3c987304043c6cfd64864f372d674f.tar.gz#egg=shared +shared @ https://github.com/codecov/shared/archive/0af6ba6385c84446beaf7f9917bf69ff1564c262.tar.gz#egg=shared # via -r requirements.in six==1.16.0 # via From 60be2806ac093f86b7fb855b4485161f7060b176 Mon Sep 17 00:00:00 2001 From: JerrySentry Date: Fri, 6 Dec 2024 17:27:14 -0500 Subject: [PATCH 3/8] linter --- services/bundle_analysis/notify/messages/comment.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/bundle_analysis/notify/messages/comment.py b/services/bundle_analysis/notify/messages/comment.py index 968089afe..e6a5cdd15 100644 --- a/services/bundle_analysis/notify/messages/comment.py +++ b/services/bundle_analysis/notify/messages/comment.py @@ -212,7 +212,11 @@ def _create_bundle_route_data( rows = [] for route_change in route_changes: change_size, icon = route_change.size_delta, "" - size = "(removed)" if route_change.change_type == RouteChange.ChangeType.REMOVED else bytes_readable(route_change.size_head) + size = ( + "(removed)" + if route_change.change_type == RouteChange.ChangeType.REMOVED + else bytes_readable(route_change.size_head) + ) if change_size == 0: # Don't include bundles that were not changes in the table From 800e91cae4f73fa1c7f08f75a6915b602c60bcac Mon Sep 17 00:00:00 2001 From: JerrySentry Date: Fri, 6 Dec 2024 17:38:20 -0500 Subject: [PATCH 4/8] fix a test --- services/bundle_analysis/notify/messages/tests/test_comment.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/bundle_analysis/notify/messages/tests/test_comment.py b/services/bundle_analysis/notify/messages/tests/test_comment.py index f9014b0f0..f98dbcd95 100644 --- a/services/bundle_analysis/notify/messages/tests/test_comment.py +++ b/services/bundle_analysis/notify/messages/tests/test_comment.py @@ -66,7 +66,8 @@ def test_build_message_from_samples(self, dbsession, mocker, mock_storage): | @codecov/bundler-plugin-core-cjs | 43.32kB | 611 bytes (1.43%) :arrow_up: | | @codecov/example-next-app-server-cjs | (removed) | 342.32kB (-100.0%) :arrow_down: | - """).format( + + """).format( pullid=enriched_pull.database_pull.pullid, owner=head_commit.repository.owner.username, repo=head_commit.repository.name, From ed09cda91a4751d5a4b59193672ad55125d9649c Mon Sep 17 00:00:00 2001 From: JerrySentry Date: Fri, 6 Dec 2024 17:44:16 -0500 Subject: [PATCH 5/8] add a test for no change --- services/bundle_analysis/tests/test_bundle_analysis.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/services/bundle_analysis/tests/test_bundle_analysis.py b/services/bundle_analysis/tests/test_bundle_analysis.py index 1798f8734..577ceffb2 100644 --- a/services/bundle_analysis/tests/test_bundle_analysis.py +++ b/services/bundle_analysis/tests/test_bundle_analysis.py @@ -303,6 +303,14 @@ def hook_mock_pull(mocker, mock_pull): size_head=30000, percentage_delta=50.0, ), + RouteChange( + route_name="/no-change", + change_type=RouteChange.ChangeType.CHANGED, + size_delta=0, + size_base=999999, + size_head=999999, + percentage_delta=0, + ), ], "BundleB": [ RouteChange( From 44f01def1567113fa8c0966e3a4d35b372aeaa49 Mon Sep 17 00:00:00 2001 From: JerrySentry Date: Tue, 10 Dec 2024 11:22:33 -0500 Subject: [PATCH 6/8] update for design --- .../notify/messages/comment.py | 29 +++++++++++-------- .../tests/test_bundle_analysis.py | 12 ++++---- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/services/bundle_analysis/notify/messages/comment.py b/services/bundle_analysis/notify/messages/comment.py index e6a5cdd15..6c384663c 100644 --- a/services/bundle_analysis/notify/messages/comment.py +++ b/services/bundle_analysis/notify/messages/comment.py @@ -4,7 +4,7 @@ import sentry_sdk from asgiref.sync import async_to_sync from django.template import loader -from shared.bundle_analysis import BundleAnalysisComparison, BundleChange, RouteChange +from shared.bundle_analysis import BundleAnalysisComparison, BundleChange from shared.torngit.exceptions import TorngitClientError from shared.validation.types import BundleThreshold @@ -211,24 +211,29 @@ def _create_bundle_route_data( for bundle_name, route_changes in changes_dict.items(): rows = [] for route_change in route_changes: - change_size, icon = route_change.size_delta, "" - size = ( - "(removed)" - if route_change.change_type == RouteChange.ChangeType.REMOVED - else bytes_readable(route_change.size_head) + change_size, size = ( + route_change.size_delta, + bytes_readable(route_change.size_head), ) if change_size == 0: - # Don't include bundles that were not changes in the table continue - elif change_size > 0: - icon = ":arrow_up:" - elif change_size < 0: - icon = ":arrow_down:" + + if route_change.percentage_delta == 100: + icon = ":rocket:" + bundle_display_name = f"**{route_change.route_name}** _(New)_" + elif route_change.percentage_delta == -100: + icon = ":wastebasket:" + bundle_display_name = ( + f"~~**{route_change.route_name}**~~ _(Deleted)_" + ) + else: + icon = "" + bundle_display_name = route_change.route_name rows.append( BundleRouteRow( - route_name=route_change.route_name, + route_name=bundle_display_name, change_size_readable=bytes_readable(change_size), percentage_change_readable=f"{route_change.percentage_delta}%", change_icon=icon, diff --git a/services/bundle_analysis/tests/test_bundle_analysis.py b/services/bundle_analysis/tests/test_bundle_analysis.py index 577ceffb2..f5481bdd8 100644 --- a/services/bundle_analysis/tests/test_bundle_analysis.py +++ b/services/bundle_analysis/tests/test_bundle_analysis.py @@ -363,9 +363,9 @@ def hook_mock_pull(mocker, mock_pull): | File path | Size | Change | | --------- | ---- | ------ | - | /users | 1.0kB | 1.0kB (100%) :arrow_up: | - | /faq | (removed) | 5.0kB (-100.0%) :arrow_down: | - | /careers | 30.0kB | 10.0kB (50.0%) :arrow_up: | + | **/users** _(New)_ | 1.0kB | 1.0kB (100%) :rocket: | + | ~~**/faq**~~ _(Deleted)_ | 0 bytes | 5.0kB (-100.0%) :wastebasket: | + | /careers | 30.0kB | 10.0kB (50.0%) | @@ -374,9 +374,9 @@ def hook_mock_pull(mocker, mock_pull): | File path | Size | Change | | --------- | ---- | ------ | - | /users | 1.0kB | 1.0kB (100%) :arrow_up: | - | /faq | (removed) | 5.0kB (-100.0%) :arrow_down: | - | /about-us | 30.0kB | 10.0kB (50.0%) :arrow_up: | + | **/users** _(New)_ | 1.0kB | 1.0kB (100%) :rocket: | + | ~~**/faq**~~ _(Deleted)_ | 0 bytes | 5.0kB (-100.0%) :wastebasket: | + | /about-us | 30.0kB | 10.0kB (50.0%) | From ebc82d301ad3eb416359ede1b0425c22780cba6f Mon Sep 17 00:00:00 2001 From: Jerry Feng Date: Wed, 11 Dec 2024 15:58:31 -0500 Subject: [PATCH 7/8] update shared commit --- requirements.in | 2 +- requirements.txt | 2 +- worker | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) create mode 120000 worker diff --git a/requirements.in b/requirements.in index 80e1232d5..a73b14ec5 100644 --- a/requirements.in +++ b/requirements.in @@ -1,5 +1,5 @@ https://github.com/codecov/test-results-parser/archive/c840502d1b4dd7d05b2efc2c1328affaf2acd27c.tar.gz#egg=test-results-parser -https://github.com/codecov/shared/archive/0af6ba6385c84446beaf7f9917bf69ff1564c262.tar.gz#egg=shared +https://github.com/codecov/shared/archive/22622868034aa8dbaad88901ba7156e3ae6b9539.tar.gz#egg=shared https://github.com/codecov/timestring/archive/d37ceacc5954dff3b5bd2f887936a98a668dda42.tar.gz#egg=timestring asgiref>=3.7.2 analytics-python==1.3.0b1 diff --git a/requirements.txt b/requirements.txt index 7c90566b0..ee6d586de 100644 --- a/requirements.txt +++ b/requirements.txt @@ -328,7 +328,7 @@ sentry-sdk==2.13.0 # shared setuptools==75.6.0 # via nodeenv -shared @ https://github.com/codecov/shared/archive/0af6ba6385c84446beaf7f9917bf69ff1564c262.tar.gz#egg=shared +shared @ https://github.com/codecov/shared/archive/22622868034aa8dbaad88901ba7156e3ae6b9539.tar.gz#egg=shared # via -r requirements.in six==1.16.0 # via diff --git a/worker b/worker new file mode 120000 index 000000000..330de7388 --- /dev/null +++ b/worker @@ -0,0 +1 @@ +/Users/jerryfeng/dev/codecov/worker \ No newline at end of file From c622488243bfe157ace421deaea3befb0c77e014 Mon Sep 17 00:00:00 2001 From: Jerry Feng Date: Tue, 17 Dec 2024 10:35:13 -0500 Subject: [PATCH 8/8] merge conflict --- worker | 1 - 1 file changed, 1 deletion(-) delete mode 120000 worker diff --git a/worker b/worker deleted file mode 120000 index 330de7388..000000000 --- a/worker +++ /dev/null @@ -1 +0,0 @@ -/Users/jerryfeng/dev/codecov/worker \ No newline at end of file