Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix EVR regex to not match email addresses with - in them #445

Merged
merged 1 commit into from
Jan 8, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 43 additions & 23 deletions specfile/changelog.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,23 @@ class ChangelogEntry:
content: List of lines forming the content of the entry.
"""

_EVR_RE = re.compile(
r"""
^.*
\d{4} # year
\s+ # whitespace
.+ # author
\s+ # preceding whitespace
((?P<sb>\[)|(?P<rb>\())? # optional opening bracket
(?P<evr>\S+?) # EVR
(?(sb)\]|(?(rb)\))) # matching closing bracket
:? # optional colon
\s* # optional following whitespace
$
""",
re.VERBOSE,
)

def __init__(
self,
header: str,
Expand Down Expand Up @@ -83,25 +100,24 @@ def __repr__(self) -> str:
return f"ChangelogEntry({self.header!r}, {self.content!r}, {self._following_lines!r})"

@property
def evr(self) -> Optional[str]:
def evr(self) -> Optional[EVR]:
"""EVR (epoch, version, release) of the entry."""
m = re.match(
r"""
^.*
\s+ # preceding whitespace
((?P<sb>\[)|(?P<rb>\())? # optional opening bracket
(?P<evr>(\d+:)?\S+-\S+?) # EVR
(?(sb)\]|(?(rb)\))) # matching closing bracket
:? # optional colon
\s* # optional following whitespace
$
""",
self.header,
re.VERBOSE,
)
m = self._EVR_RE.match(self.header)

if not m:
return None
return m.group("evr")

evr_s = m.group("evr")
try:
evr = EVR.from_string(evr_s)
except SpecfileException:
return None

# looks like an email
if evr_s.startswith("<") and evr_s.endswith(">"):
return None

nforro marked this conversation as resolved.
Show resolved Hide resolved
return evr

@property
def extended_timestamp(self) -> bool:
Expand Down Expand Up @@ -263,7 +279,9 @@ def copy(self) -> "Changelog":
return copy.copy(self)

def filter(
self, since: Optional[str] = None, until: Optional[str] = None
self,
since: Optional[Union[str, EVR]] = None,
until: Optional[Union[str, EVR]] = None,
) -> "Changelog":
"""
Filters changelog entries with EVR between since and until.
Expand All @@ -278,9 +296,11 @@ def filter(
Filtered changelog.
"""

def parse_evr(s):
def parse_evr(str_or_evr: Union[str, EVR]) -> EVR:
if isinstance(str_or_evr, EVR):
return str_or_evr
try:
return EVR.from_string(s)
return EVR.from_string(str_or_evr)
except SpecfileException:
return EVR(version="0")

Expand All @@ -290,8 +310,8 @@ def parse_evr(s):
start_index = next(
(
i
for i, e in enumerate(self.data)
if parse_evr(e.evr) >= parse_evr(since)
for i, entry in enumerate(self.data)
if entry.evr >= parse_evr(since)
),
len(self.data) + 1,
)
Expand All @@ -301,8 +321,8 @@ def parse_evr(s):
end_index = next(
(
i + 1
for i, e in reversed(list(enumerate(self.data)))
if parse_evr(e.evr) <= parse_evr(until)
for i, entry in reversed(list(enumerate(self.data)))
if entry.evr <= parse_evr(until)
),
0,
)
Expand Down
35 changes: 25 additions & 10 deletions tests/unit/test_changelog.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,44 +3,57 @@

import copy
import datetime
from typing import Optional

import pytest

from specfile.changelog import Changelog, ChangelogEntry
from specfile.sections import Section
from specfile.utils import EVR


@pytest.mark.parametrize(
"header, evr",
[
("* Thu Jan 04 2007 Michael Schwendt <[email protected]>", None),
("* Thu Jan 04 2007 Michael Schwendt <[email protected]>", None),
(
"* Fri Jul 26 2024 Miroslav Suchý <[email protected]> - ss981107-67",
EVR(version="ss981107", release="67"),
),
(
"* Mon Jul 13 2020 Tom Stellard <[email protected]> 4.0-0.4.pre2",
"4.0-0.4.pre2",
EVR(version="4.0", release="0.4.pre2"),
),
(
"* Fri Jul 20 2018 Gwyn Ciesla <[email protected]> - 0.52-6",
EVR(version="0.52", release="6"),
),
("* Fri Jul 20 2018 Gwyn Ciesla <[email protected]> - 0.52-6", "0.52-6"),
(
"* Mon Feb 23 2009 Fedora Release Engineering <[email protected]> "
"- 1.23-3.20081106gitbe42b4",
"1.23-3.20081106gitbe42b4",
EVR(version="1.23", release="3.20081106gitbe42b4"),
),
(
"* Thu Feb 04 2016 Marcin Zajaczkowski <mszpak ATT wp DOTT pl> - 1:0.9.10-6",
"1:0.9.10-6",
EVR(epoch=1, version="0.9.10", release="6"),
),
(
"* Mon Jan 03 2022 Fedora Kernel Team <[email protected]> [5.16-0.rc8.55]",
"5.16-0.rc8.55",
EVR(version="5.16", release="0.rc8.55"),
),
(
"* Wed Jan 23 2002 Karsten Hopp <[email protected]> (4.6-1)",
EVR(version="4.6", release="1"),
),
("* Wed Jan 23 2002 Karsten Hopp <[email protected]> (4.6-1)", "4.6-1"),
(
"* Thu Apr 9 2015 Jeffrey C. Ollie <[email protected]> - 13.3.2-1:",
"13.3.2-1",
EVR(version="13.3.2", release="1"),
),
],
)
def test_entry_evr(header, evr):
assert ChangelogEntry(header, [""]).evr == evr
def test_entry_evr(header, evr: Optional[EVR]):
assert evr == ChangelogEntry(header, [""]).evr


@pytest.mark.parametrize(
Expand Down Expand Up @@ -133,7 +146,9 @@ def test_filter(since, until, evrs):
),
]
)
assert [e.evr for e in changelog.filter(since=since, until=until)] == evrs
assert [e.evr for e in changelog.filter(since=since, until=until)] == [
EVR.from_string(evr) for evr in evrs
]


def test_parse():
Expand Down
Loading