27 Commits

Author SHA1 Message Date
e024b881a5 Merge branch 'upstream'
All checks were successful
Docker Image CI / build (push) Successful in 1m3s
Github-Actions / build (push) Successful in -36s
2025-09-15 14:51:37 -05:00
Jelle van der Waa
fb9b330535 Drop shells.com as sponsor 2025-09-15 21:47:23 +02:00
Ben Mezger
6bc1b49071 Fix Django schema deprecation 2025-09-03 10:54:09 +02:00
Ben Mezger
0cf24055d5 Update deprecated format_html 2025-09-03 10:54:09 +02:00
52e9a1ae0e Merge branch 'upstream', tag release_2025-08-03
All checks were successful
Github-Actions / build (push) Successful in -44s
Docker Image CI / build (push) Successful in 2m17s
2025-08-03 17:05:23 -05:00
b386d89d6c prep for mirror pages go-live
All checks were successful
Docker Image CI / build (push) Successful in -14s
Github-Actions / build (push) Successful in -31s
2025-08-01 01:06:11 -05:00
Sven-Hendrik Haase
59229f280b Add link to new Dev Blog in Development section
All checks were successful
Github-Actions / build (push) Successful in 3m5s
2025-07-24 16:14:44 +02:00
Jelle van der Waa
4c57725862 treewide: port away from deprecated datetime.utcnow() 2025-07-22 18:32:21 +02:00
Jelle van der Waa
8ded12a7cf Update Django to 5.1.10 2025-07-22 18:32:21 +02:00
Daniel M. Capella
0180242d2a todolists: include last_modified in template
Closes https://github.com/archlinux/archweb/issues/551
2025-07-13 10:21:59 +02:00
Daniel M. Capella
bf29716008 signoffs: remove superfluous conditional
The page is only accessible if you're logged in.
2025-07-13 10:21:59 +02:00
9e36ad4e38 Merge branch 'upstream'
All checks were successful
Github-Actions / build (push) Successful in -44s
Docker Image CI / build (push) Successful in 3m9s
2025-06-23 10:14:50 -05:00
Daniel M. Capella
2027adaaba signoffs: add "Only Mine" filter
Implements https://github.com/archlinux/archweb/issues/550
2025-06-21 12:11:44 +02:00
dependabot[bot]
05abc7f386 build(deps): bump requests from 2.32.3 to 2.32.4
Bumps [requests](https://github.com/psf/requests) from 2.32.3 to 2.32.4.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.32.3...v2.32.4)

---
updated-dependencies:
- dependency-name: requests
  dependency-version: 2.32.4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-10 14:15:11 +02:00
nl6720
c1d70301c9 templates/public/download.html: remove gpg keyserver-options
The public key is retrieved via WKD in the previous command, so there is
no reason to contact any keyservers.
2025-06-01 09:42:51 +02:00
Levente Polyak
323002ffe1 donate: remove PIA as the active sponsorship has stopped 2025-05-26 09:26:40 +02:00
Levente Polyak
a49a2cadc5 donate: remove UptimeRobot as they stopped sponsoring us 2025-05-26 09:26:40 +02:00
Marcus B Spencer
a733efa173 Fix typo on "Multilib Differences to Main Packages" page
"x864_" is a typo of "x86_64".

https://archlinux.org/packages/differences
2025-05-19 09:10:07 +02:00
Jelle van der Waa
ce776a6297 Update to latest django LTS release 2025-05-12 20:18:11 +02:00
Kristian Klausen
7126b7b006 public: Remove Vagrant images
We are no longer releasing Vagrant images[1].

[1] 3f7b895725
2025-05-12 20:02:37 +02:00
Jelle van der Waa
ba4eb27ae3 Drop UnixStickers from support 2025-05-12 20:01:19 +02:00
Wiktor Kwapisiewicz
375713717a Add social field to user's profiles 2025-05-12 20:00:40 +02:00
93e59ab09b Merge branch 'upstream'
All checks were successful
Github-Actions / build (push) Successful in -46s
Docker Image CI / build (push) Successful in 2m29s
2025-05-09 08:39:34 -05:00
Luca Weiss
5e33be47a7 bump django to 5.0.14
All checks were successful
Github-Actions / build (push) Successful in 2m33s
2025-04-17 10:05:42 +02:00
Robin Candau
4473a9cdba Add the automated install / run method for the WSL image to the Download page 2025-04-15 10:18:56 +02:00
Robin Candau
24b21bffed Point to the wiki page in the WSL images download section
More informative than the GitLab repo's README
2025-04-12 15:23:40 +02:00
Robin Candau
7f5d7e9082 Add WSL images to the download page
https://geo.mirror.pkgbuild.com/wsl/latest
https://gitlab.archlinux.org/archlinux/archlinux-wsl/
2025-04-12 15:14:54 +02:00
26 changed files with 109 additions and 78 deletions

View File

@@ -0,0 +1,16 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('devel', '0010_merge_20230312_1527'),
]
operations = [
migrations.AddField(
model_name='userprofile',
name='social',
field=models.CharField(blank=True, max_length=200, null=True),
),
]

View File

@@ -40,6 +40,9 @@ class UserProfile(models.Model):
website = models.URLField(max_length=200, null=True, blank=True) website = models.URLField(max_length=200, null=True, blank=True)
website_rss = models.URLField(max_length=200, null=True, blank=True, website_rss = models.URLField(max_length=200, null=True, blank=True,
help_text='RSS Feed of your website for planet.archlinux.org') help_text='RSS Feed of your website for planet.archlinux.org')
social = models.URLField(max_length=200, null=True, blank=True,
verbose_name="Social account URL",
help_text="Mastodon or Fediverse account URL")
yob = models.IntegerField("Year of birth", null=True, blank=True, yob = models.IntegerField("Year of birth", null=True, blank=True,
validators=[MinValueValidator(1950), MaxValueValidator(2500)]) validators=[MinValueValidator(1950), MaxValueValidator(2500)])
country = CountryField(blank=True) country = CountryField(blank=True)

View File

@@ -2,6 +2,7 @@ version: '2'
# Run the following once: # Run the following once:
# docker compose run --rm archweb_web python manage.py migrate # docker compose run --rm archweb_web python manage.py migrate
# docker compose run --rm archweb_web python manage.py loaddata mirrors/fixtures/mirrorprotocols.json
# docker compose run --rm archweb_web python manage.py loaddata main/fixtures/arches.json # docker compose run --rm archweb_web python manage.py loaddata main/fixtures/arches.json
# docker compose run --rm archweb_web python manage.py loaddata main/fixtures/repos.json # docker compose run --rm archweb_web python manage.py loaddata main/fixtures/repos.json
# docker compose run --rm archweb_web python manage.py createsuperuser --username=admin --email=admin@artixweb.local # docker compose run --rm archweb_web python manage.py createsuperuser --username=admin --email=admin@artixweb.local
@@ -11,6 +12,8 @@ version: '2'
# docker compose run --rm archweb_web python manage.py pgp_import ./config/keyring # docker compose run --rm archweb_web python manage.py pgp_import ./config/keyring
## go to /admin/devel/developerkey/ and set the owner (and parent) for the ownerless key ## go to /admin/devel/developerkey/ and set the owner (and parent) for the ownerless key
## go to /admin/sites/site/1/change/ and set the domain ## go to /admin/sites/site/1/change/ and set the domain
## clone the mirrors repo
# docker compose run --rm archweb_web python manage.py loaddata /mirrors/mirrors.fixture.json
services: services:

View File

@@ -9,24 +9,24 @@ register = template.Library()
@register.simple_tag @register.simple_tag
def jquery(): def jquery():
version = '3.6.0' version = '3.6.0'
filename = 'jquery-%s.min.js' % version filename = f'jquery-{version}.min.js'
link = staticfiles_storage.url(filename) link = staticfiles_storage.url(filename)
return mark_safe('<script type="text/javascript" src="%s"></script>' % link) return mark_safe(f'<script type="text/javascript" src="{link}"></script>')
@register.simple_tag @register.simple_tag
def jquery_tablesorter(): def jquery_tablesorter():
version = '2.31.0' version = '2.31.0'
filename = 'jquery.tablesorter-%s.min.js' % version filename = f'jquery.tablesorter-{version}.min.js'
link = staticfiles_storage.url(filename) link = staticfiles_storage.url(filename)
return format_html('<script type="text/javascript" src="%s"></script>' % link) return format_html('<script type="text/javascript" src="{link}"></script>', link=link)
@register.simple_tag @register.simple_tag
def d3js(): def d3js():
version = '3.5.0' version = '3.5.0'
filename = 'd3-%s.min.js' % version filename = f'd3-{version}.min.js'
link = staticfiles_storage.url(filename) link = staticfiles_storage.url(filename)
return format_html('<script type="text/javascript" src="%s"></script>' % link) return format_html('<script type="text/javascript" src="{link}"></script>', link=link)
# vim: set ts=4 sw=4 et: # vim: set ts=4 sw=4 et:

View File

@@ -8,8 +8,11 @@ register = template.Library()
def country_flag(country): def country_flag(country):
if not country: if not country:
return '' return ''
return format_html('<span class="fam-flag fam-flag-%s" title="%s"></span> ' % ( return format_html(
str(country.code).lower(), str(country.name))) '<span class="fam-flag fam-flag-{country_code}" title="{country_name}"></span> ',
country_code=str(country.code).lower(),
country_name=str(country.name),
)
# vim: set ts=4 sw=4 et: # vim: set ts=4 sw=4 et:

View File

@@ -56,8 +56,10 @@ def pgp_key_link(key_id, link_text=None):
key_id) key_id)
if link_text is None: if link_text is None:
link_text = '0x%s' % key_id[-8:] link_text = '0x%s' % key_id[-8:]
values = (url, format_key(key_id), link_text) return format_html('<a href="{url}" title="PGP key search for {key}">{content}</a>',
return format_html('<a href="%s" title="PGP key search for %s">%s</a>' % values) url=url,
key=format_key(key_id),
content=link_text)
@register.simple_tag @register.simple_tag

View File

@@ -25,5 +25,14 @@
"default": false, "default": false,
"protocol": "https" "protocol": "https"
} }
},
{
"pk": 9,
"model": "mirrors.mirrorprotocol",
"fields": {
"is_download": false,
"default": false,
"protocol": "ftp"
}
} }
] ]

View File

@@ -33,7 +33,7 @@ server {
try_files "" @proxy; try_files "" @proxy;
} }
location ~ ^/(packages|groups|opensearch|feeds) { location ~ ^/(packages|groups|opensearch|feeds|mirrors|mirrorlist) {
try_files "" @proxy; try_files "" @proxy;
} }
@@ -65,4 +65,4 @@ server {
} }
error_page 500 501 502 503 504 /500.html; error_page 500 501 502 503 504 /500.html;
} }

View File

@@ -43,8 +43,8 @@ def pkg_details_link(pkg, link_title=None, honor_flagged=False):
link_content = link_title link_content = link_title
if honor_flagged and pkg.flag_date: if honor_flagged and pkg.flag_date:
link_content = '<span class="flagged">%s</span>' % link_title link_content = '<span class="flagged">%s</span>' % link_title
link = '<a href="%s" title="View package details for %s">%s</a>' link = '<a href="{link}" title="View package details for {pkgname}">{content}</a>'
return format_html(link % (pkg.get_absolute_url(), pkg.pkgname, link_content)) return format_html(link, link=pkg.get_absolute_url(), pkgname=pkg.pkgname, content=link_content)
# vim: set ts=4 sw=4 et: # vim: set ts=4 sw=4 et:

View File

@@ -1,5 +1,5 @@
import json import json
from datetime import datetime from datetime import datetime, timezone
from operator import attrgetter from operator import attrgetter
from django.contrib.auth.models import User from django.contrib.auth.models import User
@@ -99,7 +99,7 @@ def keys(request):
user_key_ids = frozenset(user.userprofile.pgp_key[-16:] for user in users user_key_ids = frozenset(user.userprofile.pgp_key[-16:] for user in users
if user.userprofile.pgp_key) if user.userprofile.pgp_key)
not_expired = Q(expires__gt=datetime.utcnow()) | Q(expires__isnull=True) not_expired = Q(expires__gt=datetime.now(timezone.utc)) | Q(expires__isnull=True)
master_keys = MasterKey.objects.select_related('owner', 'revoker', master_keys = MasterKey.objects.select_related('owner', 'revoker',
'owner__userprofile', 'revoker__userprofile').filter( 'owner__userprofile', 'revoker__userprofile').filter(
revoked__isnull=True) revoked__isnull=True)
@@ -155,7 +155,7 @@ def keys_json(request):
'group': 'master' 'group': 'master'
} for key in master_keys) } for key in master_keys)
not_expired = Q(expires__gt=datetime.utcnow()) | Q(expires__isnull=True) not_expired = Q(expires__gt=datetime.now(timezone.utc)) | Q(expires__isnull=True)
signatures = PGPSignature.objects.filter(not_expired, revoked__isnull=True) signatures = PGPSignature.objects.filter(not_expired, revoked__isnull=True)
edge_list = [{ 'signee': sig.signee, 'signer': sig.signer } edge_list = [{ 'signee': sig.signee, 'signer': sig.signer }
for sig in signatures] for sig in signatures]

View File

@@ -1,5 +1,5 @@
from base64 import b64encode from base64 import b64encode
from datetime import datetime from datetime import datetime, timezone
import pytest import pytest
from bencode import bencode from bencode import bencode
@@ -24,7 +24,7 @@ def torrent_data():
data = { data = {
'comment': 'comment', 'comment': 'comment',
'created_by': 'Arch Linux', 'created_by': 'Arch Linux',
'creation date': int(datetime.utcnow().timestamp()), 'creation date': int(datetime.now(timezone.utc).timestamp()),
'info': { 'info': {
'name': 'arch.iso', 'name': 'arch.iso',
'length': 1, 'length': 1,

View File

@@ -1,19 +1,19 @@
-e git+https://github.com/fredj/cssmin.git@master#egg=cssmin -e git+https://github.com/fredj/cssmin.git@master#egg=cssmin
Django==5.0.13 Django==5.1.10
IPy==1.1 IPy==1.1
Markdown==3.3.7 Markdown==3.3.7
bencode.py==4.0.0 bencode.py==4.0.0
django-countries==7.6.1 django-countries==7.6.1
django-extensions==3.2.3 django-extensions==4.1
jsmin==3.0.1 jsmin==3.0.1
pgpdump==1.5 pgpdump==1.5
parse==1.20.2 parse==1.20.2
sqlparse==0.5.0 sqlparse==0.5.0
django-csp==3.8 django-csp==4.0
ptpython==2.0.4 ptpython==2.0.4
feedparser==6.0.11 feedparser==6.0.11
bleach==6.0.0 bleach==6.0.0
requests==2.32.3 requests==2.32.4
xtarfile==0.2.1 xtarfile==0.2.1
zstandard==0.23.0 zstandard==0.23.0
whitenoise==6.8.2 whitenoise==6.8.2

View File

@@ -273,4 +273,10 @@ if PROMETHEUS_METRICS:
INSTALLED_APPS = [*list(INSTALLED_APPS), 'django_prometheus'] INSTALLED_APPS = [*list(INSTALLED_APPS), 'django_prometheus']
# Assume all URLField will be HTTPS if not specified.
# NOTE: this can be removed once we bump Django to 6.x
# where `https` becomes the default.
FORMS_URLFIELD_ASSUME_HTTPS = True
# vim: set ts=4 sw=4 et: # vim: set ts=4 sw=4 et:

View File

@@ -324,6 +324,10 @@ function filter_signoffs() {
/* start with all rows, and then remove ones we shouldn't show */ /* start with all rows, and then remove ones we shouldn't show */
var rows = $('#tbody_signoffs').children(), var rows = $('#tbody_signoffs').children(),
all_rows = rows; all_rows = rows;
/* apply the filters, cheaper ones first */
if ($('#id_mine_only').is(':checked')) {
rows = rows.filter('.mine');
}
/* apply arch and repo filters */ /* apply arch and repo filters */
$('#signoffs_filter .arch_filter').add( $('#signoffs_filter .arch_filter').add(
'#signoffs_filter .repo_filter').each(function() { '#signoffs_filter .repo_filter').each(function() {
@@ -352,6 +356,7 @@ function filter_signoffs() {
function filter_signoffs_reset() { function filter_signoffs_reset() {
$('#signoffs_filter .arch_filter').prop('checked', true); $('#signoffs_filter .arch_filter').prop('checked', true);
$('#signoffs_filter .repo_filter').prop('checked', true); $('#signoffs_filter .repo_filter').prop('checked', true);
$('#id_mine_only').prop('checked', false);
$('#id_pending').prop('checked', false); $('#id_pending').prop('checked', false);
filter_signoffs(); filter_signoffs();
} }

View File

@@ -145,6 +145,10 @@ tr :nth-child(7) {
background-image: url(data:image/gif;base64,R0lGODlhFQAEAPABAOTu/wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAgABACwAAAAAFQAEAAACDYwfoAvoz9qbZ9FrJC0AOw==); background-image: url(data:image/gif;base64,R0lGODlhFQAEAPABAOTu/wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAgABACwAAAAAFQAEAAACDYwfoAvoz9qbZ9FrJC0AOw==);
} }
code {
background: #334450;
}
.results.results td, .results.results td,
.results.results th { .results.results th {
border: 1px solid #858585; border: 1px solid #858585;
@@ -158,7 +162,7 @@ tr :nth-child(7) {
background-color: #111; background-color: #111;
} }
.results th { .results th, #pkgsearch {
color: #fff; color: #fff;
background-color: #0f3147; background-color: #0f3147;
border: 1px solid #0A6682; border: 1px solid #0A6682;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -16,7 +16,7 @@
<th>Multilib Version</th> <th>Multilib Version</th>
<th>x86_64 Version</th> <th>x86_64 Version</th>
<th>x86_64 Name</th> <th>x86_64 Name</th>
<th>x864_ Repo</th> <th>x86_64 Repo</th>
<th>Multilib Last Updated</th> <th>Multilib Last Updated</th>
<th>x86_64 Last Updated</th> <th>x86_64 Last Updated</th>
</tr> </tr>

View File

@@ -26,6 +26,8 @@
<div><label for="id_repo_{{ repo_name|lower }}" title="Target Repository {{ repo_name }}">[{{ repo_name|lower }}]</label> <div><label for="id_repo_{{ repo_name|lower }}" title="Target Repository {{ repo_name }}">[{{ repo_name|lower }}]</label>
<input type="checkbox" name="repo_{{ repo_name|lower }}" id="id_repo_{{ repo_name|lower }}" class="repo_filter" value="{{ repo_name|lower }}" checked="checked"/></div> <input type="checkbox" name="repo_{{ repo_name|lower }}" id="id_repo_{{ repo_name|lower }}" class="repo_filter" value="{{ repo_name|lower }}" checked="checked"/></div>
{% endfor %} {% endfor %}
<div><label for="id_mine_only" title="Show only packages packaged by me">Only Mine</label>
<input type="checkbox" name="mine_only" id="id_mine_only" value="mine_only"/></div>
<div><label for="id_pending" title="Packages with not enough signoffs">Only Pending Approval</label> <div><label for="id_pending" title="Packages with not enough signoffs">Only Pending Approval</label>
<input type="checkbox" name="pending" id="id_pending" value="pending"/></div> <input type="checkbox" name="pending" id="id_pending" value="pending"/></div>
<div><label>&nbsp;</label><input title="Reset search criteria" type="button" id="criteria_reset" value="Reset"/></div> <div><label>&nbsp;</label><input title="Reset search criteria" type="button" id="criteria_reset" value="Reset"/></div>
@@ -50,7 +52,8 @@
</tr> </tr>
</thead> </thead>
<tbody id="tbody_signoffs"> <tbody id="tbody_signoffs">
{% for group in signoff_groups %}<tr class="{{ group.arch.name }} {{ group.target_repo|lower }}"> {% for group in signoff_groups %}
<tr class="{% if user == group.packager %} mine{% endif %} {{ group.arch.name }} {{ group.target_repo|lower }}">
<td>{% pkg_details_link group.package %} {{ group.version }}</td> <td>{% pkg_details_link group.package %} {{ group.version }}</td>
<td>{{ group.arch.name }}</td> <td>{{ group.arch.name }}</td>
<td>{{ group.target_repo }}</td> <td>{{ group.target_repo }}</td>

View File

@@ -49,6 +49,11 @@
<td>{% if prof.website %}<a itemprop="url" href="{{ prof.website }}" <td>{% if prof.website %}<a itemprop="url" href="{{ prof.website }}"
title="Visit the website for {{ dev.get_full_name }}"> title="Visit the website for {{ dev.get_full_name }}">
{{ prof.website }}</a>{% endif %}</td> {{ prof.website }}</a>{% endif %}</td>
</tr><tr>
<th>Social:</th>
<td>{% if prof.social %}<a itemprop="url" href="{{ prof.social }}"
title="Visit social account for {{ dev.get_full_name }}" rel="me">
{{ prof.social }}</a>{% endif %}</td>
</tr><tr> </tr><tr>
<th>Occupation:</th> <th>Occupation:</th>
<td>{{ prof.occupation }}</td> <td>{{ prof.occupation }}</td>

View File

@@ -53,35 +53,6 @@
<img src="{% static "nitrokey_logo.png" %}" <img src="{% static "nitrokey_logo.png" %}"
class="sponsor-btn-nitrokey" title="" alt="Nitrokey logo"/></a> class="sponsor-btn-nitrokey" title="" alt="Nitrokey logo"/></a>
<p>We would also like to thank <a href="https://www.privateinternetaccess.com/"
title="Private Internet Access">Private Internet Access</a> for sponsoring
dedicated servers across the globe. Private Internet Access is the leading
VPN Service provider specializing in secure, encrypted VPN tunnels which
create several layers of privacy and security providing users safety on the
internet.</p>
<a href="https://www.privateinternetaccess.com/" title="Private Internet Access">
<img src="{% static "pia_logo.png" %}"
class="sponsor-btn-pia" title="" alt="Private Internet Access logo"/></a>
<p>We would also like to thank <a href="https://www.shells.com/"
title="Shells">Shells.com</a> for their monetary donation.
Shells provides you with a 1-click, powerful virtual desktop environment,
driven by a cloud computer, without leaving your browser! It's your
personal workspace in the cloud.</p>
<a href="https://www.shells.com/" title="Shells">
<img src="{% static "shells_logo.png" %}"
title="" alt="Shells logo"/></a>
<p>We would also like to thank <a href="https://uptimerobot.com/"
title="UptimeRobot">UptimeRobot</a> for providing their monitoring service to us.
UptimeRobot is a leading uptime monitoring service.</p>
<a href="https://uptimerobot.com/" title="UptimeRobot">
<img src="{% static "uptimerobot_logo.png" %}"
title="" alt="UptimeRobot logo"/></a>
<h3>Past donors</h3> <h3>Past donors</h3>
<p><a href="http://www.dotcom-monitor.com/" title="Dotcom-Monitor">Dotcom-Monitor</a> &amp; <a href="https://www.loadview-testing.com/" title="LoadView">LoadView</a></p> <p><a href="http://www.dotcom-monitor.com/" title="Dotcom-Monitor">Dotcom-Monitor</a> &amp; <a href="https://www.loadview-testing.com/" title="LoadView">LoadView</a></p>

View File

@@ -77,13 +77,6 @@
title="Arch Linux Netboot">Arch Linux Netboot</a></li> title="Arch Linux Netboot">Arch Linux Netboot</a></li>
</ul> </ul>
<h3>Vagrant images</h3>
<p>Vagrant images for libvirt and virtualbox are available on the <a href="https://app.vagrantup.com/archlinux/boxes/archlinux">Vagrant Cloud</a>. You can bootstrap the image with the following commands:</p>
<code>vagrant init archlinux/archlinux</code>
<br/>
<code>vagrant up</code>
<h3>Docker image</h3> <h3>Docker image</h3>
<p>The official Docker image is available on <a href="https://hub.docker.com/_/archlinux/">Docker Hub</a>. You can run the image with the following command:</p> <p>The official Docker image is available on <a href="https://hub.docker.com/_/archlinux/">Docker Hub</a>. You can run the image with the following command:</p>
@@ -93,6 +86,14 @@
<p>Official virtual machine images are available for download on our <a href="https://gitlab.archlinux.org/archlinux/arch-boxes/-/packages">GitLab instance</a>, more information is available in the <a href="https://gitlab.archlinux.org/archlinux/arch-boxes/">README</a>.</p> <p>Official virtual machine images are available for download on our <a href="https://gitlab.archlinux.org/archlinux/arch-boxes/-/packages">GitLab instance</a>, more information is available in the <a href="https://gitlab.archlinux.org/archlinux/arch-boxes/">README</a>.</p>
<h3>WSL images</h3>
<p>The official WSL image can be installed with the following command (in a PowerShell prompt from a Windows system with WSL 2 installed):</p>
<code>wsl --install archlinux</code>
<p>It is also available for download on <a href="https://geo.mirror.pkgbuild.com/wsl/latest">mirrors</a>.</p>
<p>More information available in the <a href="https://wiki.archlinux.org/title/Install_Arch_Linux_on_WSL">Wiki</a>.</p>
<h3 id="http-downloads">HTTP Direct Downloads</h3> <h3 id="http-downloads">HTTP Direct Downloads</h3>
<p>In addition to the BitTorrent links above, install images can also be <p>In addition to the BitTorrent links above, install images can also be
@@ -140,7 +141,7 @@
Alternatively, using GnuPG, download the signing key from WKD: Alternatively, using GnuPG, download the signing key from WKD:
<pre><code>$ gpg --auto-key-locate clear,wkd -v --locate-external-key {{ release.wkd_email }}</code></pre> <pre><code>$ gpg --auto-key-locate clear,wkd -v --locate-external-key {{ release.wkd_email }}</code></pre>
Verify the signature: Verify the signature:
<pre><code>$ gpg --keyserver-options auto-key-retrieve --verify archlinux-{{ release.version }}-x86_64.iso.sig archlinux-{{ release.version }}-x86_64.iso</code></pre> <pre><code>$ gpg --verify archlinux-{{ release.version }}-x86_64.iso.sig archlinux-{{ release.version }}-x86_64.iso</code></pre>
{% cache 600 download-mirrors %} {% cache 600 download-mirrors %}
<div id="download-mirrors"> <div id="download-mirrors">

View File

@@ -133,8 +133,6 @@
<h4>Support</h4> <h4>Support</h4>
<ul> <ul>
<li><a href="{% url 'page-donate' %}" title="Help support Arch Linux">Donate</a></li> <li><a href="{% url 'page-donate' %}" title="Help support Arch Linux">Donate</a></li>
<li><a href="https://www.unixstickers.com/tag/archlinux" title="Arch
Linux stickers, t-shirts, hoodies, mugs, posters and pins">Products via Unixstickers</a></li>
<li><a href="https://www.freewear.org/?page=list_items&amp;org=Archlinux" <li><a href="https://www.freewear.org/?page=list_items&amp;org=Archlinux"
title="T-shirts">T-shirts via Freewear</a></li> title="T-shirts">T-shirts via Freewear</a></li>
<li><a href="https://www.hellotux.com/arch" <li><a href="https://www.hellotux.com/arch"
@@ -155,6 +153,7 @@
<ul> <ul>
<li><a href="https://wiki.archlinux.org/title/Getting_involved" <li><a href="https://wiki.archlinux.org/title/Getting_involved"
title="Getting involved">Getting involved</a></li> title="Getting involved">Getting involved</a></li>
<li><a href="https://devblog.archlinux.page" title="Dev Blog">Dev Blog</a></li>
<li><a href="https://gitlab.archlinux.org/archlinux/" <li><a href="https://gitlab.archlinux.org/archlinux/"
title="Official Arch projects (git)">Projects in Git</a></li> title="Official Arch projects (git)">Projects in Git</a></li>
<li><a href="https://wiki.archlinux.org/title/DeveloperWiki" <li><a href="https://wiki.archlinux.org/title/DeveloperWiki"
@@ -202,20 +201,10 @@
title="" alt="Hetzner logo"/> title="" alt="Hetzner logo"/>
</a> </a>
<a href="https://www.privateinternetaccess.com/" title="Private Internet Access">
<img src="{% static "pia_logo.png" %}"
title="" alt="Private Internet Access logo"/>
</a>
<a href="https://icons8.com/" title="Icons8"> <a href="https://icons8.com/" title="Icons8">
<img src="{% static "icons8_logo.png" %}" <img src="{% static "icons8_logo.png" %}"
title="" alt="Icons8 logo"/> title="" alt="Icons8 logo"/>
</a> </a>
<a href="https://www.shells.com" title="Shells.com">
<img src="{% static "shells_logo.png" %}"
title="" alt="Shells logo"/>
</a>
</div> </div>
{% endcache %} {% endcache %}
{% endblock %} {% endblock %}

View File

@@ -2,6 +2,8 @@
{% load static %} {% load static %}
{% load package_extras %} {% load package_extras %}
{% load todolists %} {% load todolists %}
{% load tz %}
{% load humanize %}
{% block title %}Arch Linux - Todo: {{ list.name }}{% endblock %} {% block title %}Arch Linux - Todo: {{ list.name }}{% endblock %}
@@ -103,7 +105,15 @@
<span class="{{ pkg.status_css_class }}">{{ pkg.get_status_display }}</span> <span class="{{ pkg.status_css_class }}">{{ pkg.get_status_display }}</span>
{% endif %} {% endif %}
</td> </td>
<td>{{ pkg.user|default:"" }}</td> <td>
{% if pkg.user %}
{% if user.is_authenticated %}
{{ pkg.user }} <span title="{{ pkg.last_modified|timezone:user.userprofile.time_zone|date:"Y-m-d H:i T" }}">({{ pkg.last_modified|naturaltime }})</span>
{% else %}
{{ pkg.user }} <span title="{{ pkg.last_modified|date:"Y-m-d H:i T" }}">({{ pkg.last_modified|naturaltime }})</span>
{% endif %}
{% endif %}
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>

View File

@@ -13,8 +13,9 @@ def todopkg_details_link(todopkg):
pkg = todopkg.pkg pkg = todopkg.pkg
if not pkg: if not pkg:
return todopkg.pkgname return todopkg.pkgname
link = '<a href="%s" title="View package details for %s">%s</a>' link = '<a href={url}s" title="View package details for {pkgname}">{pkgname}</a>'
url = pkg_absolute_url(todopkg.repo, todopkg.arch, pkg.pkgname) url = pkg_absolute_url(todopkg.repo, todopkg.arch, pkg.pkgname)
return format_html(link % (url, pkg.pkgname, pkg.pkgname)) return format_html(link, url=url, pkgname=pkg.pkgname)
# vim: set ts=4 sw=4 et: # vim: set ts=4 sw=4 et: