Skip to content

Commit b99ce0e

Browse files
committed
feat: display src file location next to the version for each derivation
1 parent bf64ce1 commit b99ce0e

File tree

3 files changed

+48
-13
lines changed

3 files changed

+48
-13
lines changed

src/website/shared/listeners/cache_suggestions.py

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22
import re
3+
import urllib.parse
34
from itertools import chain
45
from typing import Any
56

@@ -179,6 +180,24 @@ def is_version_affected(version_statuses: list[str]) -> Version.Status:
179180
return result
180181

181182

183+
def get_src_position(derivation: NixDerivation) -> str | None:
184+
"""
185+
Get the GitHub URL pointing to the exact source file used for the evaluation of this derivation.
186+
E.g. https://github.com/NixOS/nixpkgs/blob/0e8be3827d0298743ba71b91eea652d43d7dc03d/pkgs/by-name/he/hello/package.nix#L47
187+
"""
188+
if derivation.metadata and derivation.metadata.position:
189+
rev = urllib.parse.quote(derivation.parent_evaluation.commit_sha1)
190+
# position is something like `/tmp/tmpfh7ff2xs/pkgs/development/python-modules/qemu/default.nix:67`
191+
position_match = re.match(
192+
r"/tmp/[^/]+/(.+):(\d+)", derivation.metadata.position
193+
)
194+
if position_match:
195+
path = urllib.parse.quote(position_match.group(1))
196+
linenumber = urllib.parse.quote(position_match.group(2))
197+
return f"https://github.com/NixOS/nixpkgs/blob/{rev}/{path}#L{linenumber}"
198+
return None
199+
200+
182201
def channel_structure(
183202
version_constraints: list[Version], derivations: list[NixDerivation]
184203
) -> dict:
@@ -211,21 +230,26 @@ def channel_structure(
211230
"major_version": None,
212231
"status": None,
213232
"uniform_versions": None,
233+
"src_position": None,
214234
"sub_branches": dict(),
215235
}
216-
if not branch_name == major_channel:
236+
if branch_name == major_channel:
237+
packages[attribute]["versions"][major_channel]["major_version"] = (
238+
version
239+
)
240+
packages[attribute]["versions"][major_channel]["src_position"] = (
241+
get_src_position(derivation)
242+
)
243+
else:
217244
packages[attribute]["versions"][major_channel]["sub_branches"][
218245
branch_name
219246
] = {
220247
"version": version,
221248
"status": is_version_affected(
222249
[v.is_affected(version) for v in version_constraints]
223250
),
251+
"src_position": get_src_position(derivation),
224252
}
225-
else:
226-
packages[attribute]["versions"][major_channel]["major_version"] = (
227-
version
228-
)
229253
for package_name in packages:
230254
for mc in packages[package_name]["versions"].keys():
231255
uniform_versions = True

src/website/webview/static/style.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,12 @@ article .nixpkgs-packages {
764764
min-width: 5em;
765765
display: inline-block;
766766
text-align: end;
767+
text-decoration: none;
768+
color: black;
769+
}
770+
771+
.nixpkgs-package .version:hover {
772+
text-decoration: underline;
767773
}
768774

769775
.nixpkgs-package .version.affected {

src/website/webview/templates/components/nixpkgs_package.html

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,31 @@ <h3><span class="pkgs">pkgs.</span>{{ attribute_name }}</h3>
77
{{ pdata.description }}
88
</div>
99
<ul class="channel-list">
10-
{% for major_channel, val in pdata.versions %}
10+
{% for major_channel, major_version in pdata.versions %}
1111
<li>
12-
<details {% if val.uniform_versions %}open{% endif %}>
12+
<details {% if major_version.uniform_versions %}open{% endif %}>
1313
<summary>
1414
<span class="branch-major">
1515
<span class="branch-name">{{ major_channel }}</span>
16-
<span class="version {{ val.status }}">
17-
{% if val.major_version %}
18-
{{ val.major_version }}
16+
<a class="version {{ major_version.status }}" target="_blank" href="{{ major_version.src_position }}">
17+
{% if major_version.major_version %}
18+
{{ major_version.major_version }}
1919
{% else %}
2020
???
2121
{% endif %}
22-
</span>
22+
</a>
2323
</span>
2424
</summary>
2525
<ul class="channel-list">
26-
{% for branch_name, vdata in val.sub_branches %}
26+
{% for branch_name, minor_version in major_version.sub_branches %}
2727
<li class="branch-minor">
2828
<span class="branch-name">{{ branch_name }}</span>
29-
<span class="version {{ vdata.status }}">{{ vdata.version }}</span>
29+
<a
30+
class="version {{ minor_version.status }}"
31+
target="_blank"
32+
href="{{ minor_version.src_position }}">
33+
{{ minor_version.version }}
34+
</a>
3035
</li>
3136
{% endfor %}
3237
</ul>

0 commit comments

Comments
 (0)