diff --git a/README.rst b/README.rst
index 7a37972..a4f08b2 100644
--- a/README.rst
+++ b/README.rst
@@ -270,6 +270,11 @@ put it directly into ``pip``.
 Version History
 ===============
 
+0.14.2
+  * When using ``--update-all`` and parsing requirements file it could be fooled
+    by comments that look like package specs (e.g ``# check out foo==1.0``)
+    See See https://github.com/peterbe/hashin/issues/103
+
 0.14.1
   * All HTTP GET work to fetch information about packages from PyPI is done in
     concurrent threads. Requires backport for Python 2.7.
diff --git a/hashin.py b/hashin.py
index 34f9b21..1eed22d 100755
--- a/hashin.py
+++ b/hashin.py
@@ -115,7 +115,7 @@ def run(specs, requirements_file, *args, **kwargs):
         previous_versions = {}
         with open(requirements_file) as f:
             for line in f:
-                if regex.search(line):
+                if regex.search(line) and not line.lstrip().startswith("#"):
                     req = Requirement(line.split("\\")[0])
                     # Deliberately strip the specifier (aka. the version)
                     version = req.specifier
diff --git a/setup.py b/setup.py
index f980d4c..6158a6e 100644
--- a/setup.py
+++ b/setup.py
@@ -14,7 +14,7 @@ except ImportError:
 
 setup(
     name="hashin",
-    version="0.14.1",
+    version="0.14.2",
     description="Edits your requirements.txt by hashing them in",
     long_description=open(path.join(_here, "README.rst")).read(),
     author="Peter Bengtsson",

Fails on pyup comments in requirements file
E.g. 
```
▶ hashin --dry-run -u -r requirements/default.txt
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/packaging/requirements.py", line 93, in __init__
    req = REQUIREMENT.parseString(requirement_string)
  File "/usr/local/lib/python3.6/site-packages/pyparsing.py", line 1632, in parseString
    raise exc
  File "/usr/local/lib/python3.6/site-packages/pyparsing.py", line 1622, in parseString
    loc, tokens = self._parse( instring, 0 )
  File "/usr/local/lib/python3.6/site-packages/pyparsing.py", line 1379, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/usr/local/lib/python3.6/site-packages/pyparsing.py", line 3395, in parseImpl
    loc, exprtokens = e._parse( instring, loc, doActions )
  File "/usr/local/lib/python3.6/site-packages/pyparsing.py", line 1379, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/usr/local/lib/python3.6/site-packages/pyparsing.py", line 3717, in parseImpl
    return self.expr._parse( instring, loc, doActions, callPreParse=False )
  File "/usr/local/lib/python3.6/site-packages/pyparsing.py", line 1379, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/usr/local/lib/python3.6/site-packages/pyparsing.py", line 3378, in parseImpl
    loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False )
  File "/usr/local/lib/python3.6/site-packages/pyparsing.py", line 1383, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/usr/local/lib/python3.6/site-packages/pyparsing.py", line 2689, in parseImpl
    raise ParseException(instring, loc, self.errmsg, self)
pyparsing.ParseException: Expected W:(abcd...) (at char 4), (line:1, col:5)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/bin/hashin", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.6/site-packages/hashin.py", line 736, in main
    interactive=args.interactive,
  File "/usr/local/lib/python3.6/site-packages/hashin.py", line 104, in run
    req = Requirement(line.split("\\")[0])
  File "/usr/local/lib/python3.6/site-packages/packaging/requirements.py", line 97, in __init__
    requirement_string[e.loc:e.loc + 8]))
packaging.requirements.InvalidRequirement: Invalid requirement, parse error at "'# pyup: '"
```

Not sure which it's failing one. [This one](https://github.com/mozilla/normandy/blob/d955673d0bbfdd2b385be40f775c7818aac2ba2a/requirements/default.txt#L34) or [this one](https://github.com/mozilla/normandy/blob/d955673d0bbfdd2b385be40f775c7818aac2ba2a/requirements/default.txt#L221) or both. Should be easy to reproduce. 
diff --git a/tests/test_cli.py b/tests/test_cli.py
index 0ce49c3..74a4569 100644
--- a/tests/test_cli.py
+++ b/tests/test_cli.py
@@ -1532,6 +1532,48 @@ def test_run_update_all(murlopen, tmpfile):
         assert lines[0] == "hashin==0.11 \\"
 
 
+def test_run_comments_with_package_spec_patterns(murlopen, tmpfile, capsys):
+    """Based on https://github.com/peterbe/hashin/issues/103
+    Essentially, the regex that looks for package specs in each line of the
+    requirements file might pick up lines that are actually comments.
+    """
+
+    def mocked_get(url, **options):
+        if url == "https://pypi.org/pypi/hashin/json":
+            return _Response(
+                {
+                    "info": {"version": "0.11", "name": "hashin"},
+                    "releases": {
+                        "0.11": [
+                            {
+                                "url": "https://pypi.org/packages/source/p/hashin/hashin-0.11.tar.gz",
+                                "digests": {"sha256": "bbbbb"},
+                            }
+                        ],
+                        "0.10": [
+                            {
+                                "url": "https://pypi.org/packages/source/p/hashin/hashin-0.10.tar.gz",
+                                "digests": {"sha256": "aaaaa"},
+                            }
+                        ],
+                    },
+                }
+            )
+
+    murlopen.side_effect = mocked_get
+
+    with tmpfile() as filename:
+        with open(filename, "w") as f:
+            f.write("# Hey, don't use hashin==1.2.3 \n")
+            f.write("hashin==0.11 \\\n")
+            f.write("    --hash=sha256:bbbbb\n")
+            f.write("\n")
+
+        retcode = hashin.run([], filename, "sha256")
+        # Since this is based a stupidity test, just be content that it works.
+        assert retcode == 0
+
+
 def test_run_dry(murlopen, tmpfile, capsys):
     """dry run should edit the requirements.txt file and print
     hashes and package name in the console

pip install -e .
parse_log_pytest
requirements.txt
pytest mock
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
certifi==2021.5.30
-e git+https://github.com/peterbe/hashin.git@a27c211bdab753f89530558397490a736cb73116#egg=hashin
importlib-metadata==4.8.3
iniconfig==1.1.1
mock==5.2.0
packaging==21.3
pip-api==0.0.26
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pytest==7.0.1
tomli==1.2.3
typing_extensions==4.1.1
zipp==3.6.0

name: hashin
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - mock==5.2.0
      - packaging==21.3
      - pip-api==0.0.26
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - zipp==3.6.0
prefix: /opt/conda/envs/hashin

tests/test_cli.py::test_run_comments_with_package_spec_patterns
tests/test_cli.py::test_get_latest_version_simple tests/test_cli.py::test_get_latest_version_only_pre_release tests/test_cli.py::test_get_latest_version_non_pre_release_leading_zeros tests/test_cli.py::test_get_hashes_error tests/test_cli.py::test_non_200_ok_download tests/test_cli.py::test_main_packageerrors_stderr tests/test_cli.py::test_packages_and_update_all tests/test_cli.py::test_no_packages_and_not_update_all tests/test_cli.py::test_interactive_not_update_all tests/test_cli.py::test_main_version tests/test_cli.py::test_amend_requirements_content_new tests/test_cli.py::test_amend_requirements_different_old_name tests/test_cli.py::test_amend_requirements_content_multiple_merge tests/test_cli.py::test_amend_requirements_content_replacement tests/test_cli.py::test_amend_requirements_content_actually_not_replacement tests/test_cli.py::test_amend_requirements_content_replacement_addition tests/test_cli.py::test_amend_requirements_content_replacement_single_to_multi tests/test_cli.py::test_amend_requirements_content_replacement_2 tests/test_cli.py::test_amend_requirements_content_replacement_amonst_others tests/test_cli.py::test_amend_requirements_content_replacement_amonst_others_2 tests/test_cli.py::test_amend_requirements_content_new_similar_name tests/test_cli.py::test_run tests/test_cli.py::test_run_atomic_not_write_with_error_on_last_package tests/test_cli.py::test_run_interactive tests/test_cli.py::test_run_interactive_quit_and_accept_all tests/test_cli.py::test_run_interactive_case_redirect tests/test_cli.py::test_run_without_specific_version tests/test_cli.py::test_run_contained_names tests/test_cli.py::test_run_case_insensitive tests/test_cli.py::test_run_update_all tests/test_cli.py::test_run_dry tests/test_cli.py::test_run_dry_multiple_packages tests/test_cli.py::test_run_pep_0496 tests/test_cli.py::test_filter_releases tests/test_cli.py::test_release_url_metadata_python tests/test_cli.py::test_expand_python_version tests/test_cli.py::test_get_package_hashes tests/test_cli.py::test_get_package_hashes_package_not_found tests/test_cli.py::test_get_package_hashes_unknown_algorithm tests/test_cli.py::test_get_package_hashes_without_version tests/test_cli.py::test_with_extras_syntax tests/test_cli.py::test_extras_syntax_edit tests/test_cli.py::test_add_extra_extras_syntax_edit tests/test_cli.py::test_change_extra_extras_syntax_edit tests/test_cli.py::test_remove_extra_extras_syntax_edit tests/test_cli.py::test_interactive_upgrade_request tests/test_cli.py::test_interactive_upgrade_request_repeat_question tests/test_cli.py::test_interactive_upgrade_request_help tests/test_cli.py::test_interactive_upgrade_request_force_yes
README.rst hashin.py setup.py
README.rst hashin.py setup.py