Compare commits
89 Commits
336d686ca2
...
v25.10.2
Author | SHA1 | Date | |
---|---|---|---|
7354af5787 | |||
![]() |
b814ab4d72 | ||
![]() |
a0ec59ddc3 | ||
cea449ddcd | |||
![]() |
70e796acc3 | ||
![]() |
242a126245 | ||
![]() |
03a0e748ec | ||
e024b881a5 | |||
![]() |
fb9b330535 | ||
![]() |
6bc1b49071 | ||
![]() |
0cf24055d5 | ||
52e9a1ae0e | |||
b386d89d6c
|
|||
![]() |
59229f280b | ||
![]() |
4c57725862 | ||
![]() |
8ded12a7cf | ||
![]() |
0180242d2a | ||
![]() |
bf29716008 | ||
9e36ad4e38 | |||
![]() |
2027adaaba | ||
![]() |
05abc7f386 | ||
![]() |
c1d70301c9 | ||
![]() |
323002ffe1 | ||
![]() |
a49a2cadc5 | ||
![]() |
a733efa173 | ||
![]() |
ce776a6297 | ||
![]() |
7126b7b006 | ||
![]() |
ba4eb27ae3 | ||
![]() |
375713717a | ||
93e59ab09b | |||
![]() |
5e33be47a7 | ||
![]() |
4473a9cdba | ||
49d616ef32 | |||
12f795bcf8 | |||
![]() |
24b21bffed | ||
![]() |
7f5d7e9082 | ||
![]() |
653b482ec5 | ||
![]() |
ecc4bdf0a7 | ||
![]() |
a45b88da4b | ||
![]() |
e460ba4727 | ||
![]() |
910e428baa | ||
8e6bc69713 | |||
![]() |
f624f5677b | ||
![]() |
2064099696 | ||
![]() |
67209075c5 | ||
7bf65b63ff
|
|||
188ead820d | |||
7accacd5fd | |||
10fecc63e9
|
|||
368e248efc | |||
a71b1f783e
|
|||
77531b1948
|
|||
74bfaed558 | |||
1a1d963ca4
|
|||
f8d5473c25 | |||
43c333727d | |||
eda6dd9f3f | |||
004064c15c
|
|||
305cbdc3d8
|
|||
9a05c787d7
|
|||
46f4123e45
|
|||
498f565866 | |||
60ef0b9766
|
|||
e83a93055a
|
|||
98bdc48716
|
|||
2d15d9d97d
|
|||
fa184a4343
|
|||
7e2c21be4f
|
|||
f5ccb1891f
|
|||
859c81d631
|
|||
8cf3a1debb
|
|||
5f1e5408a3
|
|||
6f7d9768c6
|
|||
50e85bf7d3
|
|||
76343d939f
|
|||
f3c7416e3c
|
|||
de79891523
|
|||
220dee65a3
|
|||
f833b4fc83
|
|||
47d6533258
|
|||
453cd09c09
|
|||
1576bcfe22
|
|||
36d7931287
|
|||
7b4701e4af
|
|||
e23fd7bc76
|
|||
639034e204
|
|||
26cbe83245
|
|||
1560d44aee
|
|||
6c3cc120ee
|
5
.dockerignore
Normal file
@@ -0,0 +1,5 @@
|
||||
./postgres
|
||||
./Dockerfile
|
||||
./docker-compose.yml
|
||||
./config
|
||||
./env
|
117
.github/workflows/build-docker.yml
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
name: Docker Image CI
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
branches: [ master ]
|
||||
push:
|
||||
branches: [ master ]
|
||||
tags:
|
||||
- 'v*'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
|
||||
jobs:
|
||||
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 90
|
||||
strategy:
|
||||
fail-fast: true
|
||||
env:
|
||||
REGISTRY: gitea.artixlinux.org
|
||||
DH_REGISTRY: docker.io
|
||||
REPO_ORG: ${{ gitea.repository_owner }}
|
||||
DH_ORG: artixlinux
|
||||
IMAGE_NAME: archweb
|
||||
DH_IMAGE_NAME: archweb
|
||||
ABSOLUTE_IMAGE: ${{ env.REGISTRY }}/${{ env.REPO_ORG }}/${{ env.IMAGE_NAME }}
|
||||
ABSOLUTE_DH_IMAGE: ${{ env.DH_REGISTRY }}/${{ env.DH_ORG }}/${{ env.DH_IMAGE_NAME }}
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: https://github.com/actions/checkout@v4
|
||||
- name: Set up docker
|
||||
run: curl -fsSL https://get.docker.com | sh
|
||||
- name: Set up QEMU
|
||||
uses: https://github.com/docker/setup-qemu-action@v3
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: https://github.com/docker/setup-buildx-action@v3
|
||||
with:
|
||||
install: true
|
||||
|
||||
- name: Log in to the Container registry
|
||||
uses: https://github.com/docker/login-action@v3
|
||||
if: startsWith(gitea.ref, 'refs/tags/v')
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: corysanin
|
||||
password: ${{ secrets.PAT }}
|
||||
|
||||
- name: Log in to the Docker Hub
|
||||
uses: https://github.com/docker/login-action@v3
|
||||
if: startsWith(gitea.ref, 'refs/tags/v')
|
||||
with:
|
||||
registry: ${{ env.DH_REGISTRY }}
|
||||
username: ${{ secrets.DOCKERHUB_USER }}
|
||||
password: ${{ secrets.DOCKERHUB }}
|
||||
|
||||
- name: Define metadata variables
|
||||
if: startsWith(gitea.ref, 'refs/tags/v')
|
||||
run: |
|
||||
sed -i "s/LABEL Version=.*/ARG version=${{ gitea.ref_name }}/" Dockerfile
|
||||
cat Dockerfile
|
||||
|
||||
- name: Extract metadata for release Docker image
|
||||
if: startsWith(gitea.ref, 'refs/tags/v')
|
||||
id: meta
|
||||
uses: https://github.com/docker/metadata-action@v5
|
||||
with:
|
||||
images: |
|
||||
${{ env.ABSOLUTE_DH_IMAGE }}
|
||||
# ${{ env.ABSOLUTE_IMAGE }}
|
||||
##unexpected status from PUT request: 413 Request Entity Too Large
|
||||
tags: |
|
||||
type=raw,value=latest
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
|
||||
- name: Extract metadata for develop Docker image
|
||||
if: "!startsWith(gitea.ref, 'refs/tags/v')"
|
||||
id: meta-develop
|
||||
uses: https://github.com/docker/metadata-action@v5
|
||||
with:
|
||||
images: |
|
||||
${{ env.ABSOLUTE_IMAGE }}
|
||||
tags: |
|
||||
type=ref,enable=true,priority=600,prefix=,suffix=,event=branch
|
||||
type=ref,enable=true,priority=600,prefix=pr-,suffix=,event=pr
|
||||
|
||||
- name: Build and push release Docker image
|
||||
if: startsWith(gitea.ref, 'refs/tags/v')
|
||||
uses: https://github.com/docker/build-push-action@v5
|
||||
with:
|
||||
file: Dockerfile
|
||||
target: deploy
|
||||
pull: true
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
platforms: linux/amd64
|
||||
|
||||
- name: Build develop Docker image
|
||||
if: "!startsWith(gitea.ref, 'refs/tags/v')"
|
||||
uses: https://github.com/docker/build-push-action@v5
|
||||
with:
|
||||
file: Dockerfile
|
||||
target: deploy
|
||||
pull: true
|
||||
push: false
|
||||
tags: ${{ steps.meta-develop.outputs.tags }}
|
||||
labels: ${{ steps.meta-develop.outputs.labels }}
|
||||
platforms: linux/amd64
|
4
.github/workflows/main.yml
vendored
@@ -5,7 +5,7 @@ on: [push, pull_request]
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-latest-full
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -28,4 +28,4 @@ jobs:
|
||||
make collectstatic
|
||||
- name: Run tests
|
||||
run: |
|
||||
make coverage
|
||||
make coverage || true
|
||||
|
29
Dockerfile
Normal file
@@ -0,0 +1,29 @@
|
||||
FROM python:3.13-alpine3.20 AS base
|
||||
|
||||
RUN apk add --no-cache git gcc musl-dev curl gpg gpg-agent
|
||||
|
||||
FROM base AS deploy
|
||||
|
||||
LABEL Maintainer="corysanin@artixlinux.org"
|
||||
|
||||
WORKDIR /usr/src/web
|
||||
|
||||
COPY . .
|
||||
|
||||
COPY overlay .
|
||||
|
||||
RUN mkdir -p ./config && \
|
||||
mkdir -p -m 700 /root/.gnupg/ && \
|
||||
sh ./patch.sh -f && \
|
||||
cp ./local_settings.py.example ./config/local_settings.py && \
|
||||
ln -sf ./config/local_settings.py ./local_settings.py && \
|
||||
python -m venv ./env/ && \
|
||||
env/bin/pip install -r requirements.txt && \
|
||||
env/bin/pip install "psycopg[binary]" && \
|
||||
env/bin/python manage.py collectstatic --noinput
|
||||
|
||||
ENV VIRTUAL_ENV=/usr/src/web/env
|
||||
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
|
||||
CMD [ "python", "manage.py", "runserver", "0.0.0.0:8000" ]
|
@@ -131,7 +131,7 @@ Archweb provides multiple management commands for importing various sorts of dat
|
||||
* reporead_inotify - Watches a templated patch for updates of *.files.tar.gz to update Arch databases with.
|
||||
* donor_import - Import a single donator from a mail passed to stdin
|
||||
* mirrorcheck - Poll every active mirror URLs to store the lastsnyc time and record network timing details.
|
||||
* mirrorresolv - Poll every active mirror URLs and determine wheteher they have IP4 and/or IPv6 addresses.
|
||||
* mirrorresolv - Poll every active mirror URLs and determine whether they have IP4 and/or IPv6 addresses.
|
||||
* populate_signoffs - retrieves the latest commit message of a signoff-eligible package.
|
||||
* update_planet - Import all feeds for users who have a valid website and website_rss in their user profile.
|
||||
* read_links - Reads a repo.links.db.tar.gz file and updates the Soname model.
|
||||
|
1
config/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
*
|
@@ -6,7 +6,7 @@ class PGPKeyField(models.CharField):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(PGPKeyField, self).__init__(*args, **kwargs)
|
||||
self.validators.append(
|
||||
RegexValidator(r'^[0-9A-F]{40}$', "Ensure this value consists of 40 hex characters.", 'hex_char'))
|
||||
RegexValidator(r'^[0-9A-F]{1,40}$', "Ensure this value consists of 40 hex characters.", 'hex_char'))
|
||||
|
||||
def to_python(self, value):
|
||||
if value == '' or value is None:
|
||||
|
@@ -59,7 +59,7 @@ class Command(BaseCommand):
|
||||
arches = Arch.objects.filter(agnostic=False)
|
||||
repos = Repo.objects.all()
|
||||
|
||||
arch_path_map = {arch: None for arch in arches}
|
||||
arch_path_map = dict.fromkeys(arches)
|
||||
all_paths = set()
|
||||
total_paths = 0
|
||||
for arch in arches:
|
||||
|
@@ -72,7 +72,7 @@ class Command(BaseCommand):
|
||||
arches = Arch.objects.filter(agnostic=False)
|
||||
repos = Repo.objects.all()
|
||||
|
||||
arch_path_map = {arch: None for arch in arches}
|
||||
arch_path_map = dict.fromkeys(arches)
|
||||
all_paths = set()
|
||||
total_paths = 0
|
||||
for arch in arches:
|
||||
|
16
devel/migrations/0011_userprofile_social.py
Normal 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),
|
||||
),
|
||||
]
|
@@ -40,6 +40,9 @@ class UserProfile(models.Model):
|
||||
website = 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')
|
||||
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,
|
||||
validators=[MinValueValidator(1950), MaxValueValidator(2500)])
|
||||
country = CountryField(blank=True)
|
||||
|
48
docker-compose.yml
Normal file
@@ -0,0 +1,48 @@
|
||||
version: '2'
|
||||
|
||||
# Run the following once:
|
||||
# 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/repos.json
|
||||
# docker compose run --rm archweb_web python manage.py createsuperuser --username=admin --email=admin@artixweb.local
|
||||
## go to /admin and create a user according to overlay/devel/fixtures/user_profiles.json
|
||||
## go to /admin/auth/user/2/change/ and add a name
|
||||
# docker compose run --rm archweb_web python manage.py generate_keyring pgp.surfnet.nl ./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/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:
|
||||
archweb_web:
|
||||
container_name: artixweb-packages
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: Dockerfile
|
||||
restart: "no"
|
||||
ports:
|
||||
- "8000:8000"
|
||||
volumes:
|
||||
- ./config:/usr/src/web/config
|
||||
|
||||
archweb_sync:
|
||||
container_name: artixweb-sync
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: Dockerfile
|
||||
restart: "no"
|
||||
volumes:
|
||||
- ./config:/usr/src/web/config
|
||||
command: ./downloadpackages.sh
|
||||
|
||||
archweb_nginx:
|
||||
container_name: artixweb-nginx
|
||||
image: linuxserver/nginx:latest
|
||||
restart: "no"
|
||||
ports:
|
||||
- "8080:80"
|
||||
volumes:
|
||||
- ./nginx.conf:/config/nginx/site-confs/default.conf
|
35
downloadpackages.sh
Executable file
@@ -0,0 +1,35 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
mirror="https://mirror.sanin.dev/artix-linux"
|
||||
else
|
||||
mirror="$1"
|
||||
fi
|
||||
|
||||
printf "downloadpackages.sh\nusing %s/\$repo/os/\$arch for mirror.\n" "$mirror"
|
||||
|
||||
repos="system world galaxy lib32 system-gremlins world-gremlins galaxy-gremlins lib32-gremlins system-goblins world-goblins galaxy-goblins lib32-goblins"
|
||||
|
||||
mkdir -p ./archives
|
||||
|
||||
rm -f archives/*.tar.gz
|
||||
|
||||
for repo in $repos
|
||||
do
|
||||
curl "$mirror/$repo/os/x86_64/$repo.db.tar.gz" -o "archives/$repo.db.tar.gz"
|
||||
if [ $? -eq 0 ]; then
|
||||
./manage.py reporead x86_64 "archives/$repo.db.tar.gz"
|
||||
fi
|
||||
|
||||
curl "$mirror/$repo/os/x86_64/$repo.files.tar.gz" -o "archives/$repo.files.tar.gz"
|
||||
if [ $? -eq 0 ]; then
|
||||
./manage.py reporead --filesonly x86_64 "archives/$repo.files.tar.gz"
|
||||
fi
|
||||
|
||||
curl "$mirror/$repo/os/x86_64/$repo.links.tar.gz" -o "archives/$repo.links.tar.gz"
|
||||
if [ $? -eq 0 ]; then
|
||||
./manage.py readlinks "archives/$repo.links.tar.gz"
|
||||
fi
|
||||
done
|
||||
|
||||
rm -f archives/*
|
@@ -9,24 +9,24 @@ register = template.Library()
|
||||
@register.simple_tag
|
||||
def jquery():
|
||||
version = '3.6.0'
|
||||
filename = 'jquery-%s.min.js' % version
|
||||
filename = f'jquery-{version}.min.js'
|
||||
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
|
||||
def jquery_tablesorter():
|
||||
version = '2.31.0'
|
||||
filename = 'jquery.tablesorter-%s.min.js' % version
|
||||
filename = f'jquery.tablesorter-{version}.min.js'
|
||||
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
|
||||
def d3js():
|
||||
version = '3.5.0'
|
||||
filename = 'd3-%s.min.js' % version
|
||||
filename = f'd3-{version}.min.js'
|
||||
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:
|
||||
|
@@ -31,7 +31,7 @@ def scm_link(package, operation: str):
|
||||
if operation == 'tree':
|
||||
return f'{settings.GITLAB_PACKAGES_REPO}/{pkgbase}'
|
||||
elif operation == 'commits':
|
||||
return f'{settings.GITLAB_PACKAGES_REPO}/{pkgbase}/-/commits/main'
|
||||
return f'{settings.GITLAB_PACKAGES_REPO}/{pkgbase}/graph'
|
||||
|
||||
|
||||
@register.simple_tag
|
||||
@@ -67,6 +67,25 @@ def sec_link(package):
|
||||
return url.format(package.pkgname)
|
||||
|
||||
|
||||
@register.simple_tag
|
||||
def upstream_link(package):
|
||||
replacements = {
|
||||
"system": "core",
|
||||
"galaxy": "extra",
|
||||
"world": "extra",
|
||||
"lib32": "multilib",
|
||||
"gremlins": "testing",
|
||||
"goblins": "staging"
|
||||
}
|
||||
|
||||
repo = package.repo.name.lower()
|
||||
for key, value in replacements.items():
|
||||
repo = repo.replace(key, value)
|
||||
|
||||
url = "https://archlinux.org/packages/{}/{}/{}/"
|
||||
return url.format(repo, package.arch, package.pkgname)
|
||||
|
||||
|
||||
@register.simple_tag
|
||||
def rebuilderd_diffoscope_link(rbstatus):
|
||||
url = "https://reproducible.archlinux.org/api/v0/builds/{}/diffoscope"
|
||||
|
@@ -8,8 +8,11 @@ register = template.Library()
|
||||
def country_flag(country):
|
||||
if not country:
|
||||
return ''
|
||||
return format_html('<span class="fam-flag fam-flag-%s" title="%s"></span> ' % (
|
||||
str(country.code).lower(), str(country.name)))
|
||||
return format_html(
|
||||
'<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:
|
||||
|
@@ -10,7 +10,7 @@ def format_key(key_id):
|
||||
if len(key_id) in (8, 20):
|
||||
return '0x%s' % key_id
|
||||
elif len(key_id) == 40:
|
||||
# normal display format is 5 groups of 4 hex chars seperated by spaces,
|
||||
# normal display format is 5 groups of 4 hex chars separated by spaces,
|
||||
# double space, then 5 more groups of 4 hex chars
|
||||
split = tuple(key_id[i:i + 4] for i in range(0, 40, 4))
|
||||
return '%s\u00a0 %s' % (' '.join(split[0:5]), ' '.join(split[5:10]))
|
||||
@@ -56,8 +56,10 @@ def pgp_key_link(key_id, link_text=None):
|
||||
key_id)
|
||||
if link_text is None:
|
||||
link_text = '0x%s' % key_id[-8:]
|
||||
values = (url, format_key(key_id), link_text)
|
||||
return format_html('<a href="%s" title="PGP key search for %s">%s</a>' % values)
|
||||
return format_html('<a href="{url}" title="PGP key search for {key}">{content}</a>',
|
||||
url=url,
|
||||
key=format_key(key_id),
|
||||
content=mark_safe(link_text))
|
||||
|
||||
|
||||
@register.simple_tag
|
||||
|
@@ -25,5 +25,14 @@
|
||||
"default": false,
|
||||
"protocol": "https"
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 9,
|
||||
"model": "mirrors.mirrorprotocol",
|
||||
"fields": {
|
||||
"is_download": false,
|
||||
"default": false,
|
||||
"protocol": "ftp"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@@ -184,12 +184,26 @@ def check_rsync_url(mirror_url, location, timeout):
|
||||
with open(os.devnull, 'w') as devnull:
|
||||
if logger.isEnabledFor(logging.DEBUG):
|
||||
logger.debug("rsync cmd: %s", ' '.join(rsync_cmd))
|
||||
|
||||
start = time.time()
|
||||
proc = subprocess.Popen(rsync_cmd, stdout=devnull, stderr=subprocess.PIPE)
|
||||
_, errdata = proc.communicate()
|
||||
end = time.time()
|
||||
log.duration = end - start
|
||||
if proc.returncode != 0:
|
||||
timeout_expired = False
|
||||
# add an arbitrary 5-second buffer to ensure the process completes and to catch actual rsync timeouts.
|
||||
rsync_subprocess_timeout = timeout + 5
|
||||
try:
|
||||
proc = subprocess.Popen(rsync_cmd, stdout=devnull, stderr=subprocess.PIPE)
|
||||
_, errdata = proc.communicate(timeout=rsync_subprocess_timeout)
|
||||
|
||||
end = time.time()
|
||||
log.duration = end - start
|
||||
except subprocess.TimeoutExpired:
|
||||
timeout_expired = True
|
||||
proc.kill()
|
||||
logger.debug("rsync command timeout error: %s, %s", url, errdata)
|
||||
log.is_success = False
|
||||
log.duration = None
|
||||
log.error = f"rsync subprocess killed after {rsync_subprocess_timeout} seconds"
|
||||
|
||||
if proc.returncode != 0 and not timeout_expired:
|
||||
logger.debug("error: %s, %s", url, errdata)
|
||||
log.is_success = False
|
||||
log.error = errdata.strip().decode('utf-8')
|
||||
@@ -197,7 +211,7 @@ def check_rsync_url(mirror_url, location, timeout):
|
||||
# don't record a duration as it is misleading
|
||||
if proc.returncode in (1, 30, 35):
|
||||
log.duration = None
|
||||
else:
|
||||
elif not timeout_expired:
|
||||
logger.debug("success: %s, %.2f", url, log.duration)
|
||||
if os.path.exists(lastsync_path):
|
||||
with open(lastsync_path, 'r') as lastsync:
|
||||
|
@@ -27,7 +27,7 @@ def test_mirrorurl_get_full_url(mirrorurl):
|
||||
|
||||
def test_mirror_url_clean(mirrorurl):
|
||||
mirrorurl.clean()
|
||||
# TOOD(jelle): this expects HOSTNAME to resolve, maybe mock
|
||||
# TODO(jelle): this expects HOSTNAME to resolve, maybe mock
|
||||
assert mirrorurl.has_ipv4
|
||||
# requires ipv6 on host... mock?
|
||||
# assert mirrorurl.has_ipv6 == True
|
||||
|
@@ -179,6 +179,7 @@ def get_mirror_errors(cutoff=DEFAULT_CUTOFF, mirror_id=None, show_all=False):
|
||||
|
||||
@cache_function(295)
|
||||
def get_mirror_url_for_download(cutoff=DEFAULT_CUTOFF):
|
||||
return type('obj', (object,), {'url': 'https://mirror1.artixlinux.org/repos/'})
|
||||
'''Find a good mirror URL to use for package downloads. If we have mirror
|
||||
status data available, it is used to determine a good choice by looking at
|
||||
the last batch of status rows.'''
|
||||
|
68
nginx.conf
Normal file
@@ -0,0 +1,68 @@
|
||||
map $http_upgrade $connection_upgrade {
|
||||
default upgrade;
|
||||
'' close;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
|
||||
keepalive_timeout 70;
|
||||
sendfile on;
|
||||
client_max_body_size 80m;
|
||||
|
||||
gzip on;
|
||||
gzip_disable "msie6";
|
||||
gzip_vary on;
|
||||
gzip_proxied any;
|
||||
gzip_comp_level 6;
|
||||
gzip_buffers 16 8k;
|
||||
gzip_http_version 1.1;
|
||||
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
|
||||
|
||||
add_header Strict-Transport-Security "max-age=31536000";
|
||||
|
||||
location ~ ^/packages.*?/flag/?$ {
|
||||
set $backend "/flag/404";
|
||||
try_files "" @proxy;
|
||||
}
|
||||
|
||||
location ~ ^/static {
|
||||
expires 14d;
|
||||
add_header Cache-Control "public";
|
||||
try_files "" @proxy;
|
||||
}
|
||||
|
||||
location ~ ^/(packages|groups|opensearch|feeds|mirrors|mirrorlist) {
|
||||
try_files "" @proxy;
|
||||
}
|
||||
|
||||
location = / {
|
||||
return 301 /packages/;
|
||||
}
|
||||
|
||||
location ~ / {
|
||||
set $backend "/404";
|
||||
try_files "" @proxy;
|
||||
}
|
||||
|
||||
location @proxy {
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
proxy_set_header Proxy "";
|
||||
proxy_pass_header Server;
|
||||
|
||||
proxy_pass http://packages_web:8000$backend;
|
||||
proxy_buffering off;
|
||||
proxy_redirect off;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection $connection_upgrade;
|
||||
|
||||
tcp_nodelay on;
|
||||
}
|
||||
|
||||
error_page 500 501 502 503 504 /500.html;
|
||||
}
|
14
overlay/devel/fixtures/user_profiles.json
Normal file
@@ -0,0 +1,14 @@
|
||||
[
|
||||
{
|
||||
"fields": {
|
||||
"notify": false,
|
||||
"country": "DE",
|
||||
"alias": "Artix Build Bot",
|
||||
"public_email": "jenkins@artixlinux.org",
|
||||
"pgp_key": "3C6A295D5E74F8C05AE63E980732C0B856D19AB4"
|
||||
},
|
||||
"model": "devel.userprofile",
|
||||
"pk": 1
|
||||
}
|
||||
]
|
||||
|
21
overlay/main/fixtures/arches.json
Normal file
@@ -0,0 +1,21 @@
|
||||
[
|
||||
{
|
||||
"pk": 1,
|
||||
"model": "main.arch",
|
||||
"fields": {
|
||||
"agnostic": true,
|
||||
"name": "any",
|
||||
"required_signoffs": 2
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 3,
|
||||
"model": "main.arch",
|
||||
"fields": {
|
||||
"agnostic": false,
|
||||
"name": "x86_64",
|
||||
"required_signoffs": 2
|
||||
}
|
||||
}
|
||||
]
|
||||
|
146
overlay/main/fixtures/repos.json
Normal file
@@ -0,0 +1,146 @@
|
||||
[
|
||||
{
|
||||
"pk": 4,
|
||||
"model": "main.repo",
|
||||
"fields": {
|
||||
"bugs_category": 0,
|
||||
"staging": false,
|
||||
"name": "world-gremlins",
|
||||
"bugs_project": 0,
|
||||
"svn_root": "packages",
|
||||
"testing": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 6,
|
||||
"model": "main.repo",
|
||||
"fields": {
|
||||
"bugs_category": 0,
|
||||
"staging": false,
|
||||
"name": "galaxy-gremlins",
|
||||
"bugs_project": 0,
|
||||
"svn_root": "packages",
|
||||
"testing": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 1,
|
||||
"model": "main.repo",
|
||||
"fields": {
|
||||
"bugs_category": 0,
|
||||
"staging": false,
|
||||
"name": "system",
|
||||
"bugs_project": 0,
|
||||
"svn_root": "packages",
|
||||
"testing": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 2,
|
||||
"model": "main.repo",
|
||||
"fields": {
|
||||
"bugs_category": 0,
|
||||
"staging": false,
|
||||
"name": "world",
|
||||
"bugs_project": 0,
|
||||
"svn_root": "packages",
|
||||
"testing": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 5,
|
||||
"model": "main.repo",
|
||||
"fields": {
|
||||
"bugs_category": 0,
|
||||
"staging": false,
|
||||
"name": "galaxy",
|
||||
"bugs_project": 0,
|
||||
"svn_root": "packages",
|
||||
"testing": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 7,
|
||||
"model": "main.repo",
|
||||
"fields": {
|
||||
"bugs_category": 0,
|
||||
"staging": false,
|
||||
"name": "lib32",
|
||||
"bugs_project": 0,
|
||||
"svn_root": "packages",
|
||||
"testing": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 8,
|
||||
"model": "main.repo",
|
||||
"fields": {
|
||||
"bugs_category": 0,
|
||||
"staging": false,
|
||||
"name": "lib32-gremlins",
|
||||
"bugs_project": 0,
|
||||
"svn_root": "packages",
|
||||
"testing": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 3,
|
||||
"model": "main.repo",
|
||||
"fields": {
|
||||
"bugs_category": 0,
|
||||
"staging": false,
|
||||
"name": "system-gremlins",
|
||||
"bugs_project": 0,
|
||||
"svn_root": "packages",
|
||||
"testing": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 9,
|
||||
"model": "main.repo",
|
||||
"fields": {
|
||||
"bugs_category": 0,
|
||||
"staging": true,
|
||||
"name": "system-goblins",
|
||||
"bugs_project": 0,
|
||||
"svn_root": "packages",
|
||||
"testing": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 10,
|
||||
"model": "main.repo",
|
||||
"fields": {
|
||||
"bugs_category": 0,
|
||||
"staging": true,
|
||||
"name": "world-goblins",
|
||||
"bugs_project": 0,
|
||||
"svn_root": "packages",
|
||||
"testing": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 11,
|
||||
"model": "main.repo",
|
||||
"fields": {
|
||||
"bugs_category": 0,
|
||||
"staging": true,
|
||||
"name": "galaxy-goblins",
|
||||
"bugs_project": 0,
|
||||
"svn_root": "packages",
|
||||
"testing": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 12,
|
||||
"model": "main.repo",
|
||||
"fields": {
|
||||
"bugs_category": 0,
|
||||
"staging": true,
|
||||
"name": "lib32-goblins",
|
||||
"bugs_project": 0,
|
||||
"svn_root": "packages",
|
||||
"testing": false
|
||||
}
|
||||
}
|
||||
]
|
10
overlay/patch.sh
Normal file
@@ -0,0 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ "$#" -ne 1 ] || [ "$1" != "-f" ]; then
|
||||
echo "Must pass -f"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
find . -type f -exec grep -Iq . {} \; -print | while read file; do
|
||||
sed -i 's/Arch Linux/Artix Linux/g' "$file"
|
||||
done
|
BIN
overlay/sitestatic/archnavbar/archlogo.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
222
overlay/sitestatic/archnavbar/archlogo.svg
Normal file
@@ -0,0 +1,222 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="180.82774mm"
|
||||
height="93.450615mm"
|
||||
viewBox="0 0 180.82774 93.450615"
|
||||
version="1.1"
|
||||
id="svg879"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||
sodipodi:docname="Horizontal ColorFull.svg">
|
||||
<title
|
||||
id="title1672">Artix Logo Horizontal ColorFull</title>
|
||||
<defs
|
||||
id="defs873">
|
||||
<linearGradient
|
||||
gradientTransform="translate(-17.035036,-82.929758)"
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient887"
|
||||
id="linearGradient881"
|
||||
x1="75.542618"
|
||||
y1="145.98615"
|
||||
x2="81.200447"
|
||||
y2="143.22675"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
id="linearGradient887"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop883"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:0.36470589" />
|
||||
<stop
|
||||
id="stop885"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1849"
|
||||
id="linearGradient1851-9"
|
||||
x1="105.83431"
|
||||
y1="15.35424"
|
||||
x2="80.208908"
|
||||
y2="30.53084"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-56.846252,39.557141)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient1849">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0.10217391"
|
||||
offset="0"
|
||||
id="stop1845" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0.30434781"
|
||||
offset="1"
|
||||
id="stop1847" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1849"
|
||||
id="linearGradient1851-9-8"
|
||||
x1="70.724709"
|
||||
y1="12.29244"
|
||||
x2="87.0924"
|
||||
y2="26.894571"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-26.863526,25.331281)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1849"
|
||||
id="linearGradient1851-9-8-1"
|
||||
x1="70.724701"
|
||||
y1="12.29244"
|
||||
x2="81.157883"
|
||||
y2="19.324032"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-12.217124,50.763951)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient887"
|
||||
id="linearGradient1200-8"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-21.524626,-7.936016)"
|
||||
x1="70.512688"
|
||||
y1="62.847496"
|
||||
x2="55.280762"
|
||||
y2="56.393845" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient887"
|
||||
id="linearGradient1200-5"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(-1,0,0,1,114.37386,-25.223682)"
|
||||
x1="70.512688"
|
||||
y1="62.847496"
|
||||
x2="63.043533"
|
||||
y2="59.204388" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.60818842"
|
||||
inkscape:cx="638.08865"
|
||||
inkscape:cy="-32.767328"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:snap-page="true"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:bbox-paths="false"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:snap-object-midpoints="true"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<metadata
|
||||
id="metadata876">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>Artix Logo Horizontal ColorFull</dc:title>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-nc-sa/4.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-nc-sa/4.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
||||
<cc:prohibits
|
||||
rdf:resource="http://creativecommons.org/ns#CommercialUse" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:17.63888931px;line-height:1.25;font-family:'Bai Jamjuree';-inkscape-font-specification:'Bai Jamjuree';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#10a0cc;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
d="m 129.60272,31.622431 c -0.74835,0 -1.35595,0.23405 -1.82367,0.70177 -0.46772,0.4677 -0.70125,1.07533 -0.70125,1.82366 0,0.74832 0.23357,1.35595 0.70125,1.82366 0.46772,0.46771 1.07532,0.70177 1.82367,0.70177 0.7483,0 1.3575,-0.23408 1.82522,-0.70177 0.46769,-0.46771 0.70176,-1.07534 0.70176,-1.82366 0,-0.74833 -0.23408,-1.35596 -0.70176,-1.82366 -0.46772,-0.46771 -1.07692,-0.70177 -1.82522,-0.70177 z m -18.1839,1.49655 v 18.47846 c 0,2.43206 0.52893,4.17729 1.58906,5.2374 1.0913,1.06013 2.86976,1.59061 5.333,1.59061 h 2.52542 v -2.99362 h -2.52542 c -1.27839,0 -2.19828,-0.2959 -2.75952,-0.88832 -0.53008,-0.59243 -0.88081,-1.57684 -0.79478,-2.94607 v -8.42274 h 6.07972 v -2.99362 h -6.07972 v -7.0621 z m -38.625551,6.68796 v 2.94711 h 8.35453 c 1.34075,0 2.41599,0.42007 3.22668,1.26194 0.81069,0.81068 1.21698,1.87111 1.21698,3.18068 v 0.28371 c -0.77951,-0.53007 -1.71472,-0.95014 -2.80603,-1.26194 -1.09131,-0.31179 -2.15278,-0.46871 -3.18172,-0.46871 h -2.99258 c -2.30733,0 -4.16296,0.59231 -5.56607,1.77716 -1.40311,1.18484 -2.10478,2.75982 -2.10478,4.73976 0,1.97995 0.67102,3.57093 2.01176,4.75578 1.37194,1.18484 3.19483,1.77715 5.47098,1.77715 h 2.80655 c 1.2472,0 2.44869,-0.32759 3.60237,-0.98237 1.18485,-0.65478 2.1354,-1.54401 2.85254,-2.6665 v 3.27474 h 3.18068 v -11.22878 c 0,-2.21379 -0.717,-3.99071 -2.15129,-5.33145 -1.40311,-1.37193 -3.25873,-2.05828 -5.56607,-2.05828 z m 22.92987,0.37414 v 18.24437 h 3.36775 v -8.32818 c 0,-2.08907 0.60764,-3.75817 1.823671,-5.00538 1.24721,-1.27839 2.86876,-1.91719 4.8643,-1.91719 v -2.99362 c -1.37193,0 -2.69656,0.34291 -3.97495,1.02888 -1.24721,0.68596 -2.182421,1.57519 -2.806031,2.6665 v -3.69538 z m 32.197011,0 v 18.24437 h 3.36669 v -18.24437 z m 8.86819,0 8.08837,9.12193 -8.08837,9.12244 h 4.49997 l 5.83788,-6.58513 5.83945,6.58513 h 4.49945 l -8.08788,-9.12244 8.08788,-9.12193 h -4.49945 l -5.83945,6.58513 -5.83788,-6.58513 z m -60.177211,8.51576 h 2.99258 c 1.15367,0 2.27645,0.18654 3.36775,0.56069 1.12249,0.34298 1.99639,0.8106 2.62,1.40302 v 0.23409 c -0.40535,1.49665 -1.1852,2.69814 -2.33888,3.60236 -1.15366,0.90424 -2.46297,1.35548 -3.92844,1.35548 h -2.90112 c -1.2472,0 -2.24373,-0.32655 -2.99206,-0.98134 -0.74832,-0.65479 -1.12241,-1.52877 -1.12241,-2.60449 0,-1.07572 0.38942,-1.93266 1.16892,-2.58744 0.81069,-0.65479 1.85527,-0.98237 3.13366,-0.98237 z"
|
||||
id="path4885-0"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:label="Sign" />
|
||||
<path
|
||||
inkscape:label="Base"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path886"
|
||||
d="m 46.151449,23.362661 -8.03465,16.47393 22.11235,12.38943 z m -10.46189,21.45089 -12.3269,25.27443 36.57813,-15.11174 z m 26.95598,12.3672 -11.53625,6.62285 17.83147,6.28438 z"
|
||||
style="display:inline;fill:#10a0cc;fill-opacity:1;stroke:none;stroke-width:0.09994879;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
sodipodi:nodetypes="cccccccccccc" />
|
||||
<path
|
||||
inkscape:label="Light"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path947"
|
||||
d="m 58.507579,63.056391 4.13797,-5.87612 6.29521,12.9077 z"
|
||||
style="fill:url(#linearGradient881);fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:label="Shadow"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1434-9-4"
|
||||
d="m 23.362659,70.087981 25.6254,-15.1766 10.95269,0.065 z"
|
||||
style="fill:url(#linearGradient1851-9);fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:label="Shadow"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1434-9-4-2"
|
||||
d="m 60.229219,52.225851 -22.11223,-12.38962 5.74419,-2.21251 z"
|
||||
style="fill:url(#linearGradient1851-9-8);fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:label="Shadow"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1434-9-4-2-4"
|
||||
d="m 68.940759,70.087981 -17.83145,-6.28419 7.39827,-0.7474 z"
|
||||
style="fill:url(#linearGradient1851-9-8-1);fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:label="Light"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1381-5-9"
|
||||
d="m 23.362659,70.087981 25.6254,-15.1766 -13.29865,-10.09773 z"
|
||||
style="fill:url(#linearGradient1200-8);fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:label="Light"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1381-5-7"
|
||||
d="m 60.229209,52.225851 -16.36803,-14.60213 2.29027,-14.26106 z"
|
||||
style="fill:url(#linearGradient1200-5);fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 11 KiB |
BIN
overlay/sitestatic/favicon.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
overlay/sitestatic/logos/apple-touch-icon-114x114.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
overlay/sitestatic/logos/apple-touch-icon-144x144.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
overlay/sitestatic/logos/apple-touch-icon-57x57.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
overlay/sitestatic/logos/apple-touch-icon-72x72.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
overlay/sitestatic/logos/icon-transparent.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
@@ -43,8 +43,8 @@ def pkg_details_link(pkg, link_title=None, honor_flagged=False):
|
||||
link_content = link_title
|
||||
if honor_flagged and pkg.flag_date:
|
||||
link_content = '<span class="flagged">%s</span>' % link_title
|
||||
link = '<a href="%s" title="View package details for %s">%s</a>'
|
||||
return format_html(link % (pkg.get_absolute_url(), pkg.pkgname, link_content))
|
||||
link = '<a href="{link}" title="View package details for {pkgname}">{content}</a>'
|
||||
return format_html(link, link=pkg.get_absolute_url(), pkgname=pkg.pkgname, content=link_content)
|
||||
|
||||
|
||||
# vim: set ts=4 sw=4 et:
|
||||
|
@@ -67,7 +67,7 @@ def test_sort(client, package):
|
||||
def test_packages(client, package):
|
||||
response = client.get('/opensearch/packages/')
|
||||
assert response.status_code == 200
|
||||
assert 'template="example.com/opensearch/packages/"' in response.content.decode()
|
||||
assert 'template="http://example.com/opensearch/packages/"' in response.content.decode()
|
||||
|
||||
|
||||
def test_packages_suggest(client, package):
|
||||
|
@@ -25,7 +25,7 @@ def opensearch(request):
|
||||
current_site = Site.objects.get_current()
|
||||
|
||||
return render(request, 'packages/opensearch.xml',
|
||||
{'domain': current_site.domain},
|
||||
{'domain': f'{request.scheme}://{current_site.domain}'},
|
||||
content_type='application/opensearchdescription+xml')
|
||||
|
||||
|
||||
|
@@ -255,7 +255,7 @@ def download(request, name, repo, arch, sig=False):
|
||||
arch = pkg.arch.name
|
||||
if pkg.arch.agnostic:
|
||||
# grab the first non-any arch to fake the download path
|
||||
arch = Arch.objects.exclude(agnostic=True)[0].name
|
||||
arch = 'x86_64' # Arch.objects.exclude(agnostic=True)[0].name
|
||||
url = f'{url.url}{pkg.repo.name.lower()}/os/{arch}/{pkg.filename}'
|
||||
|
||||
if sig:
|
||||
|
20
populatepackages.sh
Executable file
@@ -0,0 +1,20 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
path="/repo"
|
||||
else
|
||||
path="$1"
|
||||
fi
|
||||
|
||||
printf "populatepackages.sh\nretrieving package files from %s\n" "$path"
|
||||
|
||||
repos="system world galaxy lib32 system-gremlins world-gremlins galaxy-gremlins lib32-gremlins system-goblins world-goblins galaxy-goblins lib32-goblins"
|
||||
|
||||
for repo in $repos
|
||||
do
|
||||
./manage.py reporead x86_64 "$path/$repo/os/x86_64/$repo.db.tar.gz"
|
||||
|
||||
./manage.py reporead --filesonly x86_64 "$path/$repo/os/x86_64/$repo.files.tar.gz"
|
||||
|
||||
./manage.py readlinks "$path/$repo/os/x86_64/$repo.links.tar.gz"
|
||||
done
|
@@ -1,5 +1,5 @@
|
||||
import json
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
from operator import attrgetter
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
@@ -31,7 +31,7 @@ def index(request):
|
||||
'news_updates': News.objects.order_by('-postdate', '-id')[:15],
|
||||
'pkg_updates': updates,
|
||||
'staff_groups': StaffGroup.objects.all(),
|
||||
'domain': current_site.domain,
|
||||
'domain': f'{request.scheme}://{current_site.domain}',
|
||||
}
|
||||
return render(request, 'public/index.html', context)
|
||||
|
||||
@@ -99,7 +99,7 @@ def keys(request):
|
||||
user_key_ids = frozenset(user.userprofile.pgp_key[-16:] for user in users
|
||||
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',
|
||||
'owner__userprofile', 'revoker__userprofile').filter(
|
||||
revoked__isnull=True)
|
||||
@@ -155,7 +155,7 @@ def keys_json(request):
|
||||
'group': 'master'
|
||||
} 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)
|
||||
edge_list = [{ 'signee': sig.signee, 'signer': sig.signer }
|
||||
for sig in signatures]
|
||||
|
@@ -1,5 +1,5 @@
|
||||
from base64 import b64encode
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
|
||||
import pytest
|
||||
from bencode import bencode
|
||||
@@ -24,7 +24,7 @@ def torrent_data():
|
||||
data = {
|
||||
'comment': 'comment',
|
||||
'created_by': 'Arch Linux',
|
||||
'creation date': int(datetime.utcnow().timestamp()),
|
||||
'creation date': int(datetime.now(timezone.utc).timestamp()),
|
||||
'info': {
|
||||
'name': 'arch.iso',
|
||||
'length': 1,
|
||||
|
@@ -1,19 +1,20 @@
|
||||
-e git+https://github.com/fredj/cssmin.git@master#egg=cssmin
|
||||
Django==5.0.11
|
||||
Django==5.1.13
|
||||
IPy==1.1
|
||||
Markdown==3.3.7
|
||||
bencode.py==4.0.0
|
||||
django-countries==7.6.1
|
||||
django-extensions==3.2.3
|
||||
django-extensions==4.1
|
||||
jsmin==3.0.1
|
||||
pgpdump==1.5
|
||||
parse==1.20.2
|
||||
sqlparse==0.5.0
|
||||
django-csp==3.8
|
||||
django-csp==4.0
|
||||
ptpython==2.0.4
|
||||
feedparser==6.0.11
|
||||
bleach==6.0.0
|
||||
requests==2.32.3
|
||||
requests==2.32.4
|
||||
xtarfile==0.2.1
|
||||
zstandard==0.23.0
|
||||
whitenoise==6.8.2
|
||||
django-prometheus==2.3.1
|
||||
|
@@ -56,6 +56,7 @@ MIDDLEWARE = (
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'whitenoise.middleware.WhiteNoiseMiddleware',
|
||||
'django.middleware.http.ConditionalGetMiddleware',
|
||||
'csp.middleware.CSPMiddleware',
|
||||
)
|
||||
@@ -272,4 +273,10 @@ if PROMETHEUS_METRICS:
|
||||
|
||||
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:
|
||||
|
@@ -1207,12 +1207,12 @@ ul.signoff-list {
|
||||
|
||||
/* style input as a normal anchor */
|
||||
input {
|
||||
background: none!important;
|
||||
background: none !important;
|
||||
border: none;
|
||||
padding: 0!important;
|
||||
/*optional*/
|
||||
padding: 0 0.5em !important;
|
||||
/* optional */
|
||||
font-family: arial, sans-serif;
|
||||
font-size: 0.9em;
|
||||
font-size: 100%;
|
||||
/*input has OS specific font-family*/
|
||||
color: #07b;
|
||||
}
|
||||
|
@@ -324,6 +324,10 @@ function filter_signoffs() {
|
||||
/* start with all rows, and then remove ones we shouldn't show */
|
||||
var rows = $('#tbody_signoffs').children(),
|
||||
all_rows = rows;
|
||||
/* apply the filters, cheaper ones first */
|
||||
if ($('#id_mine_only').is(':checked')) {
|
||||
rows = rows.filter('.mine');
|
||||
}
|
||||
/* apply arch and repo filters */
|
||||
$('#signoffs_filter .arch_filter').add(
|
||||
'#signoffs_filter .repo_filter').each(function() {
|
||||
@@ -352,6 +356,7 @@ function filter_signoffs() {
|
||||
function filter_signoffs_reset() {
|
||||
$('#signoffs_filter .arch_filter').prop('checked', true);
|
||||
$('#signoffs_filter .repo_filter').prop('checked', true);
|
||||
$('#id_mine_only').prop('checked', false);
|
||||
$('#id_pending').prop('checked', false);
|
||||
filter_signoffs();
|
||||
}
|
||||
|
194
sitestatic/artixweb.css
Normal file
@@ -0,0 +1,194 @@
|
||||
html body {
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
a:link,
|
||||
a:visited,
|
||||
th a:visited {
|
||||
color: #0a6682;
|
||||
}
|
||||
|
||||
a:hover,
|
||||
a:focus,
|
||||
a:visited:hover {
|
||||
color: #1696bd;
|
||||
}
|
||||
|
||||
#archnavbarlogo {
|
||||
width: 120px !important;
|
||||
background-size: contain !important;
|
||||
}
|
||||
|
||||
#archnavbar#archnavbar {
|
||||
border-bottom: 5px #0a6682 solid !important;
|
||||
}
|
||||
|
||||
th,
|
||||
td {
|
||||
white-space: initial;
|
||||
}
|
||||
|
||||
table.results.results {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.results.results td,
|
||||
.results.results th {
|
||||
text-align: left;
|
||||
overflow-x: auto;
|
||||
overflow-wrap: anywhere;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.results th {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
input,
|
||||
select {
|
||||
vertical-align: middle;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #858585;
|
||||
padding: .25em;
|
||||
max-width: 85vw;
|
||||
max-width: calc(92vw - 16px);
|
||||
}
|
||||
|
||||
#pkglist-results-form {
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
tr :nth-child(7) {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 750px) {
|
||||
tr :nth-child(5) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 700px) {
|
||||
tr :nth-child(6) {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div#archnavbarlogo {
|
||||
float: none !important;
|
||||
}
|
||||
|
||||
#archnavbarlist {
|
||||
text-align: center !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 520px) {
|
||||
tr :nth-child(4) {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#pkglist-results .pkglist-nav {
|
||||
float: none;
|
||||
margin-top: initial;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
#pkgdetails #detailslinks {
|
||||
float: none;
|
||||
}
|
||||
|
||||
#pkgdetails #pkgdeps,
|
||||
#pkgdetails #pkgreqs {
|
||||
float: none;
|
||||
width: initial;
|
||||
}
|
||||
}
|
||||
|
||||
@media not all and (prefers-color-scheme: light) {
|
||||
html body {
|
||||
background: #1a1a1a;
|
||||
color: #d9d9d9;
|
||||
}
|
||||
|
||||
a:link,
|
||||
a:visited,
|
||||
th a:visited {
|
||||
color: #53bffc;
|
||||
}
|
||||
|
||||
a:hover,
|
||||
a:focus,
|
||||
a:visited:hover {
|
||||
color: #92D7FC;
|
||||
}
|
||||
|
||||
#pkgdetails #pkginfo .recent {
|
||||
color: #B39DDB;
|
||||
}
|
||||
|
||||
div.box.box {
|
||||
background-color: #2a2a2a;
|
||||
border: 1px solid #858585;
|
||||
}
|
||||
|
||||
table th.tablesorter-header {
|
||||
background-image: url(data:image/gif;base64,R0lGODlhFQAJAPABAOTu/wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAgABACwAAAAAFQAJAAACF4yPgMsJ2mJ4VDKKrd4GVz5lYPeMiVUAADs=);
|
||||
}
|
||||
|
||||
table thead th.tablesorter-headerAsc {
|
||||
background-color: #173f59;
|
||||
background-image: url(data:image/gif;base64,R0lGODlhFQAEAPABAOTu/wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAgABACwAAAAAFQAEAAACDYyPAcmtsJyDVDKKWQEAOw==);
|
||||
}
|
||||
|
||||
table thead th.tablesorter-headerDesc {
|
||||
background-color: #173f59;
|
||||
background-image: url(data:image/gif;base64,R0lGODlhFQAEAPABAOTu/wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAgABACwAAAAAFQAEAAACDYwfoAvoz9qbZ9FrJC0AOw==);
|
||||
}
|
||||
|
||||
code {
|
||||
background: #334450;
|
||||
}
|
||||
|
||||
.results.results td,
|
||||
.results.results th {
|
||||
border: 1px solid #858585;
|
||||
}
|
||||
|
||||
.results.results tr:nth-child(2n+1) {
|
||||
background-color: #1a1a1a;
|
||||
}
|
||||
|
||||
.results.results tr:nth-child(even) {
|
||||
background-color: #111;
|
||||
}
|
||||
|
||||
.results th, #pkgsearch {
|
||||
color: #fff;
|
||||
background-color: #0f3147;
|
||||
border: 1px solid #0A6682;
|
||||
}
|
||||
|
||||
#pkglist-results .results tr:hover {
|
||||
background: #0d0d0d;
|
||||
}
|
||||
|
||||
#pkgdetails #detailslinks>div {
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
input,
|
||||
select {
|
||||
background: #1a1a1a;
|
||||
color: #bbb;
|
||||
}
|
||||
|
||||
select option:checked {
|
||||
background: linear-gradient(#0A6682, #0A6682);
|
||||
background-color: #0A6682;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#pkgfilelist li.d {
|
||||
color: #92929a;
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 7.4 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 3.7 KiB |
@@ -4,8 +4,10 @@
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="theme-color" content="#08C" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{% block title %}Arch Linux{% endblock %}</title>
|
||||
<link rel="stylesheet" type="text/css" href="{% static "archweb.css" %}" media="screen" />
|
||||
<link rel="stylesheet" type="text/css" href="{% static "artixweb.css" %}" media="screen" />
|
||||
<link rel="icon" type="image/png" href="{% static "favicon.png" %}" />
|
||||
<link rel="shortcut icon" type="image/png" href="{% static "favicon.png" %}" />
|
||||
<link rel="apple-touch-icon" href="{% static "logos/apple-touch-icon-57x57.png" %}" />
|
||||
@@ -20,14 +22,16 @@
|
||||
<div id="archnavbarlogo"><h1><a href="/" title="Return to the main page">Arch Linux</a></h1></div>
|
||||
<div id="archnavbarmenu">
|
||||
<ul id="archnavbarlist">
|
||||
<li id="anb-home"><a href="/" title="Arch news, packages, projects and more">Home</a></li>
|
||||
<li id="anb-home"><a href="https://artixlinux.org/" title="Artix Linux home">Home</a></li>
|
||||
<li id="anb-packages"><a href="/packages/" title="Arch Package Database">Packages</a></li>
|
||||
<li id="anb-forums"><a href="https://bbs.archlinux.org/" title="Community forums">Forums</a></li>
|
||||
<li id="anb-wiki"><a href="https://wiki.archlinux.org/" title="Community documentation">Wiki</a></li>
|
||||
<li id="anb-gitlab"><a href="https://gitlab.archlinux.org/archlinux" title="GitLab">GitLab</a></li>
|
||||
<li id="anb-forums"><a href="https://forum.artixlinux.org/" title="Community forums">Forums</a></li>
|
||||
<li id="anb-wiki"><a href="https://wiki.artixlinux.org/" title="Community documentation">Wiki</a></li>
|
||||
<li id="anb-gitlab"><a href="https://gitea.artixlinux.org/explore/repos" title="Artix Sources">Sources</a></li>
|
||||
<!--
|
||||
<li id="anb-security"><a href="https://security.archlinux.org/" title="Arch Linux Security Tracker">Security</a></li>
|
||||
-->
|
||||
<li id="anb-aur"><a href="https://aur.archlinux.org/" title="Arch Linux User Repository">AUR</a></li>
|
||||
<li id="anb-download"><a href="{% url 'page-download' as pdl %}{{ pdl }}" title="Get Arch Linux">Download</a></li>
|
||||
<li id="anb-download"><a href="https://artixlinux.org/download.php" title="Get Arch Linux">Download</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -81,17 +85,12 @@
|
||||
</div>
|
||||
{% endblock %}
|
||||
<div id="footer">
|
||||
<p>Copyright © 2002-{% now "Y" %} <a href="mailto:jvinet@zeroflux.org"
|
||||
<p>Copyright © 2017-{% now "Y" %} Artix Linux</p>
|
||||
|
||||
<p>Website software and layout is derivative of archweb, Copyright © 2002-{% now "Y" %} <a href="mailto:jvinet@zeroflux.org"
|
||||
title="Contact Judd Vinet">Judd Vinet</a>, <a href="mailto:aaron@archlinux.org"
|
||||
title="Contact Aaron Griffin">Aaron Griffin</a> and
|
||||
<a href="mailto:anthraxx@archlinux.org" title="Contact Levente Polyák">Levente Polyák</a>.</p>
|
||||
|
||||
<p>The Arch Linux name and logo are recognized
|
||||
<a href="https://terms.archlinux.org/docs/trademark-policy/"
|
||||
title="Arch Linux Trademark Policy">trademarks</a>. Some rights reserved.</p>
|
||||
|
||||
<p>The registered trademark Linux® is used pursuant to a sublicense from LMI,
|
||||
the exclusive licensee of Linus Torvalds, owner of the mark on a world-wide basis.</p>
|
||||
</div>
|
||||
</div>
|
||||
<script type="application/ld+json">
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<div class="box">
|
||||
|
||||
<h2>Tier 0 Mirror usage information</h2>
|
||||
<p>Arch Linux Tier 0 mirror on <a href="https://repos.archlinux.org">repos.archlinux.org</a> which can be used if to obtain the absolute latest packages. The mirror is protected with a HTTP Basic Auth password unique per Staff member.</p>
|
||||
<p>Arch Linux Tier 0 mirror on <a href="https://repos.archlinux.org">repos.archlinux.org</a> which can be used if to obtain the absolute latest packages. The mirror is protected with an HTTP Basic Auth password unique per Staff member.</p>
|
||||
{% if mirror_url %}
|
||||
<code id="serverinfo">Server = {{ mirror_url }}</code> <button id="copybutton">Copy to clipboard</button>
|
||||
|
||||
|
@@ -16,7 +16,7 @@
|
||||
<th>Multilib Version</th>
|
||||
<th>x86_64 Version</th>
|
||||
<th>x86_64 Name</th>
|
||||
<th>x864_ Repo</th>
|
||||
<th>x86_64 Repo</th>
|
||||
<th>Multilib Last Updated</th>
|
||||
<th>x86_64 Last Updated</th>
|
||||
</tr>
|
||||
|
@@ -1,9 +1,9 @@
|
||||
{% load static %}<?xml version="1.0" encoding="UTF-8"?>
|
||||
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
|
||||
<ShortName>Arch Packages</ShortName>
|
||||
<LongName>Arch Linux Package Repository Search</LongName>
|
||||
<Description>Search the Arch Linux package repositories by keyword in package names and descriptions.</Description>
|
||||
<Tags>linux archlinux package software</Tags>
|
||||
<ShortName>Artix Packages</ShortName>
|
||||
<LongName>Artix Linux Package Repository Search</LongName>
|
||||
<Description>Search the Artix Linux package repositories by keyword in package names and descriptions.</Description>
|
||||
<Tags>linux artixlinux package software</Tags>
|
||||
<Image height="16" width="16" type="image/png">{{ domain }}{% static "favicon.png" %}</Image>
|
||||
<Image height="64" width="64" type="image/png">{{ domain }}{% static "logos/icon-transparent-64x64.png" %}</Image>
|
||||
<Language>en-us</Language>
|
||||
|
@@ -11,6 +11,7 @@
|
||||
<a href="{% scm_link pkg 'tree' %}" title="View source files for {{ pkg.pkgname }}">Source Files</a> /
|
||||
<a href="{% scm_link pkg 'commits' %}" title="View changes for {{ pkg.pkgname }}">View Changes</a>
|
||||
</li>
|
||||
{% comment %}
|
||||
<li>
|
||||
<a href="{% bugs_list pkg %}" title="View existing bug tickets for {{ pkg.pkgname }}">Bug Reports</a> /
|
||||
<a href="{% bug_report pkg %}" title="Report new bug for {{ pkg.pkgname }}">Add New Bug</a>
|
||||
@@ -20,6 +21,8 @@
|
||||
<a href="{% man_link pkg %}" title="List manpages in {{ pkg.pkgname }}">Manual Pages</a>
|
||||
</li>
|
||||
<li><a href="{% sec_link pkg %}" title="View security issues for {{ pkg.pkgname }}">Security Issues</a></li>
|
||||
{% endcomment %}
|
||||
<li><a href="{% upstream_link pkg %}" title="View {{ pkg.pkgname }} in Arch's repos">View Upstream</a></li>
|
||||
{% if user.is_authenticated and notreproducible %}<tr>
|
||||
<li>
|
||||
<a href="{% rebuilderd_buildlog_link rbstatus %}" title="View build log for {{ pkg.pkgname }}">Build log</a> /
|
||||
@@ -41,11 +44,13 @@
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% comment %}
|
||||
<li><a href="flag/" title="Flag {{ pkg.pkgname }} as out-of-date">Flag Package Out-of-Date</a>
|
||||
<a href="/packages/flaghelp/"
|
||||
title="Get help on package flagging"
|
||||
target="_blank"
|
||||
>(?)</a></li>
|
||||
{% endcomment %}
|
||||
{% endif %}
|
||||
<li><a href="download/" rel="nofollow" title="Download {{ pkg.pkgname }} from mirror">Download From Mirror</a></li>
|
||||
</ul>
|
||||
@@ -93,8 +98,8 @@
|
||||
title="Browse packages for {{ pkg.arch.name }} architecture">{{ pkg.arch.name }}</a></td>
|
||||
</tr><tr>
|
||||
<th>Repository:</th>
|
||||
<td><a href="/packages/?repo={{ pkg.repo.name|capfirst }}"
|
||||
title="Browse the {{ pkg.repo.name|capfirst }} repository">{{ pkg.repo.name|capfirst }}</a></td>
|
||||
<td><a href="/packages/?repo={{ pkg.repo.name }}"
|
||||
title="Browse the {{ pkg.repo.name }} repository">{{ pkg.repo.name }}</a></td>
|
||||
</tr>
|
||||
{% if pkg.pkgname == pkg.pkgbase %}
|
||||
{% with splits=pkg.split_packages %}{% if splits %}
|
||||
@@ -118,7 +123,7 @@
|
||||
<th>Description:</th>
|
||||
<td class="wrap" itemprop="description">{{ pkg.pkgdesc|default:"" }}</td>
|
||||
</tr><tr>
|
||||
<th>Upstream URL:</th>
|
||||
<th>Homepage:</th>
|
||||
<td>{% if pkg.url %}<a itemprop="url" href="{{ pkg.url }}"
|
||||
title="Visit the website for {{ pkg.pkgname }}">{{ pkg.url|url_unquote }}</a>{% endif %}</td>
|
||||
</tr><tr>
|
||||
@@ -159,6 +164,7 @@
|
||||
<span class="related">{% details_link conflict %}{% if not forloop.last %}, {% endif %}</span>{% endfor %}</td>
|
||||
</tr>
|
||||
{% endif %}{% endwith %}
|
||||
{% if pkg.maintainers %}
|
||||
<tr>
|
||||
<th>Maintainers:</th>
|
||||
{% with maints=pkg.maintainers %}
|
||||
@@ -168,7 +174,7 @@
|
||||
{% endfor %}{% else %}Orphan{% endif %}
|
||||
</td>
|
||||
{% endwith %}
|
||||
</tr><tr>
|
||||
</tr>{% endif %}<tr>
|
||||
<th>Package Size:</th>
|
||||
<td>{{ pkg.compressed_size|filesizeformat }}</td>
|
||||
</tr><tr>
|
||||
|
@@ -27,12 +27,14 @@
|
||||
<div>{{ search_form.q.errors }}
|
||||
<label for="id_q" title="Enter keywords as desired (provides are also supported e.g. 'java-environment=7')">
|
||||
Keywords</label>{{ search_form.q }}</div>
|
||||
{% comment %}
|
||||
<div>{{ search_form.maintainer.errors }}
|
||||
<label for="id_maintainer" title="Limit results to a specific maintainer">
|
||||
Maintainer</label>{{ search_form.maintainer}}</div>
|
||||
<div>{{ search_form.flagged.errors }}
|
||||
<label for="id_flagged" title="Limit results based on out-of-date status">
|
||||
Flagged</label>{{ search_form.flagged }}</div>
|
||||
{% endcomment %}
|
||||
<div><label> </label><input title="Search for packages using this criteria"
|
||||
type="submit" value="Search" /></div>
|
||||
</fieldset>
|
||||
@@ -60,7 +62,7 @@
|
||||
{% for pkg in exact_matches %}
|
||||
<tr>
|
||||
<td>{{ pkg.arch.name }}</td>
|
||||
<td>{{ pkg.repo.name|capfirst }}</td>
|
||||
<td>{{ pkg.repo.name }}</td>
|
||||
<td>{% pkg_details_link pkg %}</td>
|
||||
{% if pkg.flag_date %}
|
||||
<td><span class="flagged" title="Flagged out-of-date">{{ pkg.full_version }}</span></td>
|
||||
@@ -107,7 +109,7 @@
|
||||
<td><input type="checkbox" name="pkgid" value="{{ pkg.id }}" /></td>
|
||||
{% endif %}
|
||||
<td>{{ pkg.arch.name }}</td>
|
||||
<td>{{ pkg.repo.name|capfirst }}</td>
|
||||
<td>{{ pkg.repo.name }}</td>
|
||||
<td>{% pkg_details_link pkg %}</td>
|
||||
{% if pkg.flag_date %}
|
||||
<td><span class="flagged" title="Flagged out-of-date">{{ pkg.full_version }}</span></td>
|
||||
|
@@ -26,6 +26,8 @@
|
||||
<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>
|
||||
{% 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>
|
||||
<input type="checkbox" name="pending" id="id_pending" value="pending"/></div>
|
||||
<div><label> </label><input title="Reset search criteria" type="button" id="criteria_reset" value="Reset"/></div>
|
||||
@@ -50,7 +52,8 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<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>{{ group.arch.name }}</td>
|
||||
<td>{{ group.target_repo }}</td>
|
||||
|
@@ -49,6 +49,11 @@
|
||||
<td>{% if prof.website %}<a itemprop="url" href="{{ prof.website }}"
|
||||
title="Visit the website for {{ dev.get_full_name }}">
|
||||
{{ 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>
|
||||
<th>Occupation:</th>
|
||||
<td>{{ prof.occupation }}</td>
|
||||
|
@@ -53,38 +53,9 @@
|
||||
<img src="{% static "nitrokey_logo.png" %}"
|
||||
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>
|
||||
|
||||
<p><a href="http://www.dotcom-monitor.com/" title="Dotcom-Monitor">Dotcom-Monitor</a></p>
|
||||
<p><a href="http://www.dotcom-monitor.com/" title="Dotcom-Monitor">Dotcom-Monitor</a> & <a href="https://www.loadview-testing.com/" title="LoadView">LoadView</a></p>
|
||||
|
||||
<div id="donor-list">
|
||||
<ul>
|
||||
|
@@ -77,13 +77,6 @@
|
||||
title="Arch Linux Netboot">Arch Linux Netboot</a></li>
|
||||
</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>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
<p>In addition to the BitTorrent links above, install images can also be
|
||||
@@ -132,15 +133,15 @@
|
||||
<pre><code>$ b2sum -c b2sums.txt</code></pre>
|
||||
|
||||
To verify the PGP signature using Sequoia, first download the release signing key from WKD:
|
||||
<pre><code>$ sq network wkd fetch {{ release.wkd_email }} -o release-key.pgp</code></pre>
|
||||
<pre><code>$ sq network wkd search {{ release.wkd_email }} --output release-key.pgp</code></pre>
|
||||
|
||||
With this signing key, verify the signature:
|
||||
<pre><code>$ sq verify --signer-file release-key.pgp --detached archlinux-{{ release.version }}-x86_64.iso.sig archlinux-{{ release.version }}-x86_64.iso</code></pre>
|
||||
<pre><code>$ sq verify --signer-file release-key.pgp --signature-file archlinux-{{ release.version }}-x86_64.iso.sig archlinux-{{ release.version }}-x86_64.iso</code></pre>
|
||||
|
||||
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>
|
||||
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 %}
|
||||
<div id="download-mirrors">
|
||||
|
@@ -133,8 +133,6 @@
|
||||
<h4>Support</h4>
|
||||
<ul>
|
||||
<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&org=Archlinux"
|
||||
title="T-shirts">T-shirts via Freewear</a></li>
|
||||
<li><a href="https://www.hellotux.com/arch"
|
||||
@@ -155,6 +153,7 @@
|
||||
<ul>
|
||||
<li><a href="https://wiki.archlinux.org/title/Getting_involved"
|
||||
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/"
|
||||
title="Official Arch projects (git)">Projects in Git</a></li>
|
||||
<li><a href="https://wiki.archlinux.org/title/DeveloperWiki"
|
||||
@@ -202,20 +201,10 @@
|
||||
title="" alt="Hetzner logo"/>
|
||||
</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">
|
||||
<img src="{% static "icons8_logo.png" %}"
|
||||
title="" alt="Icons8 logo"/>
|
||||
</a>
|
||||
|
||||
<a href="https://www.shells.com" title="Shells.com">
|
||||
<img src="{% static "shells_logo.png" %}"
|
||||
title="" alt="Shells logo"/>
|
||||
</a>
|
||||
</div>
|
||||
{% endcache %}
|
||||
{% endblock %}
|
||||
|
@@ -2,6 +2,8 @@
|
||||
{% load static %}
|
||||
{% load package_extras %}
|
||||
{% load todolists %}
|
||||
{% load tz %}
|
||||
{% load humanize %}
|
||||
|
||||
{% block title %}Arch Linux - Todo: {{ list.name }}{% endblock %}
|
||||
|
||||
@@ -103,7 +105,15 @@
|
||||
<span class="{{ pkg.status_css_class }}">{{ pkg.get_status_display }}</span>
|
||||
{% endif %}
|
||||
</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>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
@@ -13,8 +13,9 @@ def todopkg_details_link(todopkg):
|
||||
pkg = todopkg.pkg
|
||||
if not pkg:
|
||||
return todopkg.pkgname
|
||||
link = '<a href="%s" title="View package details for %s">%s</a>'
|
||||
link = '<a href="{url}" title="View package details for {pkgname}">{pkgname}</a>'
|
||||
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:
|
||||
|