4 Commits

27 changed files with 684 additions and 1066 deletions

View File

@ -8,7 +8,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-anope-devel key: 3-${{ runner.os }}-anope-devel
path: '~/.cache path: '~/.cache
@ -16,13 +16,13 @@ jobs:
${ github.workspace }/anope ${ github.workspace }/anope
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout Anope - name: Checkout Anope
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: anope path: anope
ref: 2.0.9 ref: 2.0.9
@ -37,7 +37,7 @@ jobs:
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-anope.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-anope.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -48,7 +48,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-bahamut-devel key: 3-${{ runner.os }}-bahamut-devel
path: '~/.cache path: '~/.cache
@ -56,13 +56,13 @@ jobs:
${ github.workspace }/Bahamut ${ github.workspace }/Bahamut
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout Bahamut - name: Checkout Bahamut
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: Bahamut path: Bahamut
ref: master ref: master
@ -86,7 +86,7 @@ jobs:
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-bahamut.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-bahamut.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-bahamut name: installed-bahamut
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -97,7 +97,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-hybrid-devel key: 3-${{ runner.os }}-hybrid-devel
path: '~/.cache path: '~/.cache
@ -105,13 +105,13 @@ jobs:
${ github.workspace }/ircd-hybrid ${ github.workspace }/ircd-hybrid
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout Hybrid - name: Checkout Hybrid
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: ircd-hybrid path: ircd-hybrid
ref: 8.2.x ref: 8.2.x
@ -125,7 +125,7 @@ jobs:
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-hybrid.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-hybrid.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-hybrid name: installed-hybrid
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -135,13 +135,13 @@ jobs:
steps: steps:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout InspIRCd - name: Checkout InspIRCd
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: inspircd path: inspircd
ref: master ref: master
@ -149,18 +149,14 @@ jobs:
- name: Build InspIRCd - name: Build InspIRCd
run: | run: |
cd $GITHUB_WORKSPACE/inspircd/ cd $GITHUB_WORKSPACE/inspircd/
patch src/inspircd.cpp < $GITHUB_WORKSPACE/patches/inspircd_mainloop.patch
# Insp3 <= 3.16.0 and Insp4 <= 4.0.0a21 don't support -DINSPIRCD_UNLIMITED_MAINLOOP
patch src/inspircd.cpp < $GITHUB_WORKSPACE/patches/inspircd_mainloop.patch || true
./configure --prefix=$HOME/.local/inspircd --development ./configure --prefix=$HOME/.local/inspircd --development
make -j 4
CXXFLAGS=-DINSPIRCD_UNLIMITED_MAINLOOP make -j 4
make install make install
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-inspircd.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-inspircd.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-inspircd name: installed-inspircd
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -171,7 +167,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-ngircd-devel key: 3-${{ runner.os }}-ngircd-devel
path: '~/.cache path: '~/.cache
@ -179,13 +175,13 @@ jobs:
${ github.workspace }/ngircd ${ github.workspace }/ngircd
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout ngircd - name: Checkout ngircd
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: ngircd path: ngircd
ref: master ref: master
@ -201,7 +197,7 @@ jobs:
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-ngircd.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-ngircd.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-ngircd name: installed-ngircd
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -212,7 +208,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-plexus4-devel key: 3-${{ runner.os }}-plexus4-devel
path: '~/.cache path: '~/.cache
@ -220,9 +216,9 @@ jobs:
${ github.workspace }/placeholder ${ github.workspace }/placeholder
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: clone - name: clone
@ -243,7 +239,7 @@ jobs:
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-plexus4.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-plexus4.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-plexus4 name: installed-plexus4
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -254,7 +250,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-solanum-devel key: 3-${{ runner.os }}-solanum-devel
path: '~/.cache path: '~/.cache
@ -262,13 +258,13 @@ jobs:
${ github.workspace }/solanum ${ github.workspace }/solanum
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout Solanum - name: Checkout Solanum
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: solanum path: solanum
ref: main ref: main
@ -283,7 +279,7 @@ jobs:
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-solanum.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-solanum.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-solanum name: installed-solanum
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -294,7 +290,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-unrealircd-devel key: 3-${{ runner.os }}-unrealircd-devel
path: '~/.cache path: '~/.cache
@ -302,13 +298,13 @@ jobs:
${ github.workspace }/unrealircd ${ github.workspace }/unrealircd
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout UnrealIRCd 6 - name: Checkout UnrealIRCd 6
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: unrealircd path: unrealircd
ref: unreal60_dev ref: unreal60_dev
@ -324,13 +320,12 @@ jobs:
CFLAGS="-O0 -march=x86-64" CXXFLAGS="$CFLAGS" ./Config -quick CFLAGS="-O0 -march=x86-64" CXXFLAGS="$CFLAGS" ./Config -quick
make -j 4 make -j 4
make install make install
~/.local/unrealircd/unrealircd module install third/react
# Prevent download of geoIP database on first startup # Prevent download of geoIP database on first startup
sed -i 's/loadmodule "geoip_classic";//' ~/.local/unrealircd/conf/modules.default.conf sed -i 's/loadmodule "geoip_classic";//' ~/.local/unrealircd/conf/modules.default.conf
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-unrealircd.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-unrealircd.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-unrealircd name: installed-unrealircd
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -341,7 +336,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-unrealircd-5-devel key: 3-${{ runner.os }}-unrealircd-5-devel
path: '~/.cache path: '~/.cache
@ -349,13 +344,13 @@ jobs:
${ github.workspace }/unrealircd ${ github.workspace }/unrealircd
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout UnrealIRCd 5 - name: Checkout UnrealIRCd 5
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: unrealircd path: unrealircd
ref: unreal52 ref: unreal52
@ -371,13 +366,12 @@ jobs:
CFLAGS="-O0 -march=x86-64" CXXFLAGS="$CFLAGS" ./Config -quick CFLAGS="-O0 -march=x86-64" CXXFLAGS="$CFLAGS" ./Config -quick
make -j 4 make -j 4
make install make install
~/.local/unrealircd/unrealircd module install third/react
# Prevent download of geoIP database on first startup # Prevent download of geoIP database on first startup
sed -i 's/loadmodule "geoip_classic";//' ~/.local/unrealircd/conf/modules.default.conf sed -i 's/loadmodule "geoip_classic";//' ~/.local/unrealircd/conf/modules.default.conf
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-unrealircd-5.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-unrealircd-5.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-unrealircd-5 name: installed-unrealircd-5
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -409,9 +403,9 @@ jobs:
- test-unrealircd-dlk - test-unrealircd-dlk
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Download Artifacts - name: Download Artifacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
path: artifacts path: artifacts
- name: Install dashboard dependencies - name: Install dashboard dependencies
@ -436,13 +430,13 @@ jobs:
- build-bahamut - build-bahamut
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-bahamut name: installed-bahamut
path: '~' path: '~'
@ -460,7 +454,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_bahamut_devel name: pytest-results_bahamut_devel
path: pytest.xml path: pytest.xml
@ -470,18 +464,18 @@ jobs:
- build-anope - build-anope
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-bahamut name: installed-bahamut
path: '~' path: '~'
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: '~' path: '~'
@ -499,7 +493,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_bahamut-anope_devel name: pytest-results_bahamut-anope_devel
path: pytest.xml path: pytest.xml
@ -508,13 +502,13 @@ jobs:
- build-bahamut - build-bahamut
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-bahamut name: installed-bahamut
path: '~' path: '~'
@ -532,7 +526,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_bahamut-atheme_devel name: pytest-results_bahamut-atheme_devel
path: pytest.xml path: pytest.xml
@ -540,13 +534,13 @@ jobs:
needs: [] needs: []
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout Ergo - name: Checkout Ergo
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: ergo path: ergo
ref: master ref: master
@ -572,7 +566,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_ergo_devel name: pytest-results_ergo_devel
path: pytest.xml path: pytest.xml
@ -582,18 +576,18 @@ jobs:
- build-anope - build-anope
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-hybrid name: installed-hybrid
path: '~' path: '~'
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: '~' path: '~'
@ -611,7 +605,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_hybrid_devel name: pytest-results_hybrid_devel
path: pytest.xml path: pytest.xml
@ -620,13 +614,13 @@ jobs:
- build-inspircd - build-inspircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-inspircd name: installed-inspircd
path: '~' path: '~'
@ -644,7 +638,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_inspircd_devel name: pytest-results_inspircd_devel
path: pytest.xml path: pytest.xml
@ -654,18 +648,18 @@ jobs:
- build-anope - build-anope
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-inspircd name: installed-inspircd
path: '~' path: '~'
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: '~' path: '~'
@ -683,7 +677,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_inspircd-anope_devel name: pytest-results_inspircd-anope_devel
path: pytest.xml path: pytest.xml
@ -691,13 +685,13 @@ jobs:
needs: [] needs: []
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout ircu2 - name: Checkout ircu2
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: ircu2 path: ircu2
ref: u2_10_12_branch ref: u2_10_12_branch
@ -722,7 +716,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_ircu2_devel name: pytest-results_ircu2_devel
path: pytest.xml path: pytest.xml
@ -730,9 +724,9 @@ jobs:
needs: [] needs: []
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Install dependencies - name: Install dependencies
@ -750,7 +744,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_limnoria_devel name: pytest-results_limnoria_devel
path: pytest.xml path: pytest.xml
@ -758,13 +752,13 @@ jobs:
needs: [] needs: []
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout nefarious - name: Checkout nefarious
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: nefarious path: nefarious
ref: master ref: master
@ -788,7 +782,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_nefarious_devel name: pytest-results_nefarious_devel
path: pytest.xml path: pytest.xml
@ -797,13 +791,13 @@ jobs:
- build-ngircd - build-ngircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-ngircd name: installed-ngircd
path: '~' path: '~'
@ -821,7 +815,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_ngircd_devel name: pytest-results_ngircd_devel
path: pytest.xml path: pytest.xml
@ -831,18 +825,18 @@ jobs:
- build-anope - build-anope
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-ngircd name: installed-ngircd
path: '~' path: '~'
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: '~' path: '~'
@ -860,7 +854,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_ngircd-anope_devel name: pytest-results_ngircd-anope_devel
path: pytest.xml path: pytest.xml
@ -869,13 +863,13 @@ jobs:
- build-ngircd - build-ngircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-ngircd name: installed-ngircd
path: '~' path: '~'
@ -893,7 +887,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_ngircd-atheme_devel name: pytest-results_ngircd-atheme_devel
path: pytest.xml path: pytest.xml
@ -903,18 +897,18 @@ jobs:
- build-anope - build-anope
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-plexus4 name: installed-plexus4
path: '~' path: '~'
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: '~' path: '~'
@ -932,7 +926,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_plexus4_devel name: pytest-results_plexus4_devel
path: pytest.xml path: pytest.xml
@ -941,13 +935,13 @@ jobs:
- build-solanum - build-solanum
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-solanum name: installed-solanum
path: '~' path: '~'
@ -965,7 +959,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_solanum_devel name: pytest-results_solanum_devel
path: pytest.xml path: pytest.xml
@ -973,9 +967,9 @@ jobs:
needs: [] needs: []
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Install dependencies - name: Install dependencies
@ -992,7 +986,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_sopel_devel name: pytest-results_sopel_devel
path: pytest.xml path: pytest.xml
@ -1001,13 +995,13 @@ jobs:
- build-unrealircd - build-unrealircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-unrealircd name: installed-unrealircd
path: '~' path: '~'
@ -1025,7 +1019,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_unrealircd_devel name: pytest-results_unrealircd_devel
path: pytest.xml path: pytest.xml
@ -1034,13 +1028,13 @@ jobs:
- build-unrealircd-5 - build-unrealircd-5
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-unrealircd-5 name: installed-unrealircd-5
path: '~' path: '~'
@ -1058,7 +1052,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_unrealircd-5_devel name: pytest-results_unrealircd-5_devel
path: pytest.xml path: pytest.xml
@ -1068,18 +1062,18 @@ jobs:
- build-anope - build-anope
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-unrealircd name: installed-unrealircd
path: '~' path: '~'
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: '~' path: '~'
@ -1097,7 +1091,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_unrealircd-anope_devel name: pytest-results_unrealircd-anope_devel
path: pytest.xml path: pytest.xml
@ -1106,13 +1100,13 @@ jobs:
- build-unrealircd - build-unrealircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-unrealircd name: installed-unrealircd
path: '~' path: '~'
@ -1130,7 +1124,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_unrealircd-atheme_devel name: pytest-results_unrealircd-atheme_devel
path: pytest.xml path: pytest.xml
@ -1139,20 +1133,20 @@ jobs:
- build-unrealircd - build-unrealircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-unrealircd name: installed-unrealircd
path: '~' path: '~'
- name: Unpack artefacts - name: Unpack artefacts
run: cd ~; find -name 'artefacts-*.tar.gz' -exec tar -xzf '{}' \; run: cd ~; find -name 'artefacts-*.tar.gz' -exec tar -xzf '{}' \;
- name: Checkout Dlk - name: Checkout Dlk
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: Dlk-Services path: Dlk-Services
ref: main ref: main
@ -1176,7 +1170,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_unrealircd-dlk_devel name: pytest-results_unrealircd-dlk_devel
path: pytest.xml path: pytest.xml

View File

@ -8,7 +8,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-anope-devel_release key: 3-${{ runner.os }}-anope-devel_release
path: '~/.cache path: '~/.cache
@ -16,13 +16,13 @@ jobs:
${ github.workspace }/anope ${ github.workspace }/anope
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout Anope - name: Checkout Anope
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: anope path: anope
ref: 2.0.9 ref: 2.0.9
@ -37,7 +37,7 @@ jobs:
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-anope.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-anope.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -47,13 +47,13 @@ jobs:
steps: steps:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout InspIRCd - name: Checkout InspIRCd
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: inspircd path: inspircd
ref: insp3 ref: insp3
@ -61,18 +61,14 @@ jobs:
- name: Build InspIRCd - name: Build InspIRCd
run: | run: |
cd $GITHUB_WORKSPACE/inspircd/ cd $GITHUB_WORKSPACE/inspircd/
patch src/inspircd.cpp < $GITHUB_WORKSPACE/patches/inspircd_mainloop.patch
# Insp3 <= 3.16.0 and Insp4 <= 4.0.0a21 don't support -DINSPIRCD_UNLIMITED_MAINLOOP
patch src/inspircd.cpp < $GITHUB_WORKSPACE/patches/inspircd_mainloop.patch || true
./configure --prefix=$HOME/.local/inspircd --development ./configure --prefix=$HOME/.local/inspircd --development
make -j 4
CXXFLAGS=-DINSPIRCD_UNLIMITED_MAINLOOP make -j 4
make install make install
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-inspircd.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-inspircd.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-inspircd name: installed-inspircd
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -86,9 +82,9 @@ jobs:
- test-inspircd-atheme - test-inspircd-atheme
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Download Artifacts - name: Download Artifacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
path: artifacts path: artifacts
- name: Install dashboard dependencies - name: Install dashboard dependencies
@ -113,13 +109,13 @@ jobs:
- build-inspircd - build-inspircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-inspircd name: installed-inspircd
path: '~' path: '~'
@ -137,7 +133,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_inspircd_devel_release name: pytest-results_inspircd_devel_release
path: pytest.xml path: pytest.xml
@ -147,18 +143,18 @@ jobs:
- build-anope - build-anope
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-inspircd name: installed-inspircd
path: '~' path: '~'
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: '~' path: '~'
@ -176,7 +172,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_inspircd-anope_devel_release name: pytest-results_inspircd-anope_devel_release
path: pytest.xml path: pytest.xml
@ -185,13 +181,13 @@ jobs:
- build-inspircd - build-inspircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-inspircd name: installed-inspircd
path: '~' path: '~'
@ -209,7 +205,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_inspircd-atheme_devel_release name: pytest-results_inspircd-atheme_devel_release
path: pytest.xml path: pytest.xml

View File

@ -8,7 +8,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-anope-stable key: 3-${{ runner.os }}-anope-stable
path: '~/.cache path: '~/.cache
@ -16,13 +16,13 @@ jobs:
${ github.workspace }/anope ${ github.workspace }/anope
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout Anope - name: Checkout Anope
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: anope path: anope
ref: 2.0.9 ref: 2.0.9
@ -37,7 +37,7 @@ jobs:
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-anope.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-anope.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -48,7 +48,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-bahamut-stable key: 3-${{ runner.os }}-bahamut-stable
path: '~/.cache path: '~/.cache
@ -56,13 +56,13 @@ jobs:
${ github.workspace }/Bahamut ${ github.workspace }/Bahamut
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout Bahamut - name: Checkout Bahamut
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: Bahamut path: Bahamut
ref: v2.2.1 ref: v2.2.1
@ -86,7 +86,7 @@ jobs:
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-bahamut.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-bahamut.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-bahamut name: installed-bahamut
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -97,7 +97,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-charybdis-stable key: 3-${{ runner.os }}-charybdis-stable
path: '~/.cache path: '~/.cache
@ -105,13 +105,13 @@ jobs:
${ github.workspace }/charybdis ${ github.workspace }/charybdis
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout Charybdis - name: Checkout Charybdis
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: charybdis path: charybdis
ref: charybdis-4.1.2 ref: charybdis-4.1.2
@ -126,7 +126,7 @@ jobs:
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-charybdis.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-charybdis.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-charybdis name: installed-charybdis
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -137,7 +137,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-hybrid-stable key: 3-${{ runner.os }}-hybrid-stable
path: '~/.cache path: '~/.cache
@ -145,13 +145,13 @@ jobs:
${ github.workspace }/ircd-hybrid ${ github.workspace }/ircd-hybrid
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout Hybrid - name: Checkout Hybrid
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: ircd-hybrid path: ircd-hybrid
ref: 8.2.39 ref: 8.2.39
@ -165,7 +165,7 @@ jobs:
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-hybrid.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-hybrid.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-hybrid name: installed-hybrid
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -175,32 +175,28 @@ jobs:
steps: steps:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout InspIRCd - name: Checkout InspIRCd
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: inspircd path: inspircd
ref: v3.15.0 ref: v3.12.0
repository: inspircd/inspircd repository: inspircd/inspircd
- name: Build InspIRCd - name: Build InspIRCd
run: | run: |
cd $GITHUB_WORKSPACE/inspircd/ cd $GITHUB_WORKSPACE/inspircd/
patch src/inspircd.cpp < $GITHUB_WORKSPACE/patches/inspircd_mainloop.patch
# Insp3 <= 3.16.0 and Insp4 <= 4.0.0a21 don't support -DINSPIRCD_UNLIMITED_MAINLOOP
patch src/inspircd.cpp < $GITHUB_WORKSPACE/patches/inspircd_mainloop.patch || true
./configure --prefix=$HOME/.local/inspircd --development ./configure --prefix=$HOME/.local/inspircd --development
make -j 4
CXXFLAGS=-DINSPIRCD_UNLIMITED_MAINLOOP make -j 4
make install make install
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-inspircd.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-inspircd.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-inspircd name: installed-inspircd
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -211,7 +207,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-ngircd-stable key: 3-${{ runner.os }}-ngircd-stable
path: '~/.cache path: '~/.cache
@ -219,13 +215,13 @@ jobs:
${ github.workspace }/ngircd ${ github.workspace }/ngircd
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout ngircd - name: Checkout ngircd
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: ngircd path: ngircd
ref: rel-26.1 ref: rel-26.1
@ -241,7 +237,7 @@ jobs:
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-ngircd.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-ngircd.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-ngircd name: installed-ngircd
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -252,7 +248,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-plexus4-stable key: 3-${{ runner.os }}-plexus4-stable
path: '~/.cache path: '~/.cache
@ -260,9 +256,9 @@ jobs:
${ github.workspace }/placeholder ${ github.workspace }/placeholder
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: clone - name: clone
@ -283,7 +279,7 @@ jobs:
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-plexus4.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-plexus4.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-plexus4 name: installed-plexus4
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -294,7 +290,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-solanum-stable key: 3-${{ runner.os }}-solanum-stable
path: '~/.cache path: '~/.cache
@ -302,13 +298,13 @@ jobs:
${ github.workspace }/solanum ${ github.workspace }/solanum
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout Solanum - name: Checkout Solanum
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: solanum path: solanum
ref: 492d560ee13e71dc35403fd676e58c2d5bdcf2a9 ref: 492d560ee13e71dc35403fd676e58c2d5bdcf2a9
@ -323,7 +319,7 @@ jobs:
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-solanum.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-solanum.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-solanum name: installed-solanum
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -334,7 +330,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-unrealircd-stable key: 3-${{ runner.os }}-unrealircd-stable
path: '~/.cache path: '~/.cache
@ -342,16 +338,16 @@ jobs:
${ github.workspace }/unrealircd ${ github.workspace }/unrealircd
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout UnrealIRCd 6 - name: Checkout UnrealIRCd 6
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: unrealircd path: unrealircd
ref: da3c1c654481a33035b9c703957e1c25d0158259 ref: cedd23ae9cdd5985ce16e9869cbdb808479c3fc4
repository: unrealircd/unrealircd repository: unrealircd/unrealircd
- name: Build UnrealIRCd 6 - name: Build UnrealIRCd 6
run: | run: |
@ -364,13 +360,12 @@ jobs:
CFLAGS="-O0 -march=x86-64" CXXFLAGS="$CFLAGS" ./Config -quick CFLAGS="-O0 -march=x86-64" CXXFLAGS="$CFLAGS" ./Config -quick
make -j 4 make -j 4
make install make install
~/.local/unrealircd/unrealircd module install third/react
# Prevent download of geoIP database on first startup # Prevent download of geoIP database on first startup
sed -i 's/loadmodule "geoip_classic";//' ~/.local/unrealircd/conf/modules.default.conf sed -i 's/loadmodule "geoip_classic";//' ~/.local/unrealircd/conf/modules.default.conf
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-unrealircd.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-unrealircd.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-unrealircd name: installed-unrealircd
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -381,7 +376,7 @@ jobs:
- name: Create directories - name: Create directories
run: cd ~/; mkdir -p .local/ go/ run: cd ~/; mkdir -p .local/ go/
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
key: 3-${{ runner.os }}-unrealircd-5-stable key: 3-${{ runner.os }}-unrealircd-5-stable
path: '~/.cache path: '~/.cache
@ -389,13 +384,13 @@ jobs:
${ github.workspace }/unrealircd ${ github.workspace }/unrealircd
' '
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout UnrealIRCd 5 - name: Checkout UnrealIRCd 5
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: unrealircd path: unrealircd
ref: 6604856973f713a494f83d38992d7d61ce6b9db4 ref: 6604856973f713a494f83d38992d7d61ce6b9db4
@ -411,13 +406,12 @@ jobs:
CFLAGS="-O0 -march=x86-64" CXXFLAGS="$CFLAGS" ./Config -quick CFLAGS="-O0 -march=x86-64" CXXFLAGS="$CFLAGS" ./Config -quick
make -j 4 make -j 4
make install make install
~/.local/unrealircd/unrealircd module install third/react
# Prevent download of geoIP database on first startup # Prevent download of geoIP database on first startup
sed -i 's/loadmodule "geoip_classic";//' ~/.local/unrealircd/conf/modules.default.conf sed -i 's/loadmodule "geoip_classic";//' ~/.local/unrealircd/conf/modules.default.conf
- name: Make artefact tarball - name: Make artefact tarball
run: cd ~; tar -czf artefacts-unrealircd-5.tar.gz .local/ go/ run: cd ~; tar -czf artefacts-unrealircd-5.tar.gz .local/ go/
- name: Upload build artefacts - name: Upload build artefacts
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: installed-unrealircd-5 name: installed-unrealircd-5
path: ~/artefacts-*.tar.gz path: ~/artefacts-*.tar.gz
@ -452,9 +446,9 @@ jobs:
- test-unrealircd-dlk - test-unrealircd-dlk
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Download Artifacts - name: Download Artifacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
path: artifacts path: artifacts
- name: Install dashboard dependencies - name: Install dashboard dependencies
@ -479,13 +473,13 @@ jobs:
- build-bahamut - build-bahamut
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-bahamut name: installed-bahamut
path: '~' path: '~'
@ -503,7 +497,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_bahamut_stable name: pytest-results_bahamut_stable
path: pytest.xml path: pytest.xml
@ -513,18 +507,18 @@ jobs:
- build-anope - build-anope
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-bahamut name: installed-bahamut
path: '~' path: '~'
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: '~' path: '~'
@ -542,7 +536,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_bahamut-anope_stable name: pytest-results_bahamut-anope_stable
path: pytest.xml path: pytest.xml
@ -551,13 +545,13 @@ jobs:
- build-bahamut - build-bahamut
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-bahamut name: installed-bahamut
path: '~' path: '~'
@ -575,7 +569,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_bahamut-atheme_stable name: pytest-results_bahamut-atheme_stable
path: pytest.xml path: pytest.xml
@ -584,13 +578,13 @@ jobs:
- build-charybdis - build-charybdis
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-charybdis name: installed-charybdis
path: '~' path: '~'
@ -608,7 +602,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_charybdis_stable name: pytest-results_charybdis_stable
path: pytest.xml path: pytest.xml
@ -616,13 +610,13 @@ jobs:
needs: [] needs: []
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout Ergo - name: Checkout Ergo
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: ergo path: ergo
ref: irctest_stable ref: irctest_stable
@ -648,7 +642,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_ergo_stable name: pytest-results_ergo_stable
path: pytest.xml path: pytest.xml
@ -658,18 +652,18 @@ jobs:
- build-anope - build-anope
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-hybrid name: installed-hybrid
path: '~' path: '~'
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: '~' path: '~'
@ -687,7 +681,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_hybrid_stable name: pytest-results_hybrid_stable
path: pytest.xml path: pytest.xml
@ -696,13 +690,13 @@ jobs:
- build-inspircd - build-inspircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-inspircd name: installed-inspircd
path: '~' path: '~'
@ -720,7 +714,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_inspircd_stable name: pytest-results_inspircd_stable
path: pytest.xml path: pytest.xml
@ -730,18 +724,18 @@ jobs:
- build-anope - build-anope
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-inspircd name: installed-inspircd
path: '~' path: '~'
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: '~' path: '~'
@ -759,7 +753,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_inspircd-anope_stable name: pytest-results_inspircd-anope_stable
path: pytest.xml path: pytest.xml
@ -768,13 +762,13 @@ jobs:
- build-inspircd - build-inspircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-inspircd name: installed-inspircd
path: '~' path: '~'
@ -792,7 +786,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_inspircd-atheme_stable name: pytest-results_inspircd-atheme_stable
path: pytest.xml path: pytest.xml
@ -800,13 +794,13 @@ jobs:
needs: [] needs: []
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout irc2 - name: Checkout irc2
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: irc2.11.2p3 path: irc2.11.2p3
ref: 59649f24c3a5c27bad5648b48774f27475bccfd3 ref: 59649f24c3a5c27bad5648b48774f27475bccfd3
@ -842,7 +836,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_irc2_stable name: pytest-results_irc2_stable
path: pytest.xml path: pytest.xml
@ -850,13 +844,13 @@ jobs:
needs: [] needs: []
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout ircu2 - name: Checkout ircu2
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: ircu2 path: ircu2
ref: u2.10.12.19 ref: u2.10.12.19
@ -881,7 +875,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_ircu2_stable name: pytest-results_ircu2_stable
path: pytest.xml path: pytest.xml
@ -889,9 +883,9 @@ jobs:
needs: [] needs: []
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Install dependencies - name: Install dependencies
@ -908,7 +902,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_limnoria_stable name: pytest-results_limnoria_stable
path: pytest.xml path: pytest.xml
@ -916,13 +910,13 @@ jobs:
needs: [] needs: []
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Checkout nefarious - name: Checkout nefarious
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: nefarious path: nefarious
ref: 985704168ecada12d9e53b46df6087ef9d9fb40b ref: 985704168ecada12d9e53b46df6087ef9d9fb40b
@ -946,7 +940,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_nefarious_stable name: pytest-results_nefarious_stable
path: pytest.xml path: pytest.xml
@ -955,13 +949,13 @@ jobs:
- build-ngircd - build-ngircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-ngircd name: installed-ngircd
path: '~' path: '~'
@ -979,7 +973,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_ngircd_stable name: pytest-results_ngircd_stable
path: pytest.xml path: pytest.xml
@ -989,18 +983,18 @@ jobs:
- build-anope - build-anope
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-ngircd name: installed-ngircd
path: '~' path: '~'
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: '~' path: '~'
@ -1018,7 +1012,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_ngircd-anope_stable name: pytest-results_ngircd-anope_stable
path: pytest.xml path: pytest.xml
@ -1027,13 +1021,13 @@ jobs:
- build-ngircd - build-ngircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-ngircd name: installed-ngircd
path: '~' path: '~'
@ -1051,7 +1045,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_ngircd-atheme_stable name: pytest-results_ngircd-atheme_stable
path: pytest.xml path: pytest.xml
@ -1061,18 +1055,18 @@ jobs:
- build-anope - build-anope
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-plexus4 name: installed-plexus4
path: '~' path: '~'
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: '~' path: '~'
@ -1090,7 +1084,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_plexus4_stable name: pytest-results_plexus4_stable
path: pytest.xml path: pytest.xml
@ -1099,13 +1093,13 @@ jobs:
- build-solanum - build-solanum
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-solanum name: installed-solanum
path: '~' path: '~'
@ -1123,7 +1117,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_solanum_stable name: pytest-results_solanum_stable
path: pytest.xml path: pytest.xml
@ -1131,9 +1125,9 @@ jobs:
needs: [] needs: []
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Install dependencies - name: Install dependencies
@ -1150,7 +1144,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_sopel_stable name: pytest-results_sopel_stable
path: pytest.xml path: pytest.xml
@ -1159,13 +1153,13 @@ jobs:
- build-unrealircd - build-unrealircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-unrealircd name: installed-unrealircd
path: '~' path: '~'
@ -1183,7 +1177,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_unrealircd_stable name: pytest-results_unrealircd_stable
path: pytest.xml path: pytest.xml
@ -1192,13 +1186,13 @@ jobs:
- build-unrealircd-5 - build-unrealircd-5
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-unrealircd-5 name: installed-unrealircd-5
path: '~' path: '~'
@ -1216,7 +1210,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_unrealircd-5_stable name: pytest-results_unrealircd-5_stable
path: pytest.xml path: pytest.xml
@ -1226,18 +1220,18 @@ jobs:
- build-anope - build-anope
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-unrealircd name: installed-unrealircd
path: '~' path: '~'
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-anope name: installed-anope
path: '~' path: '~'
@ -1255,7 +1249,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_unrealircd-anope_stable name: pytest-results_unrealircd-anope_stable
path: pytest.xml path: pytest.xml
@ -1264,13 +1258,13 @@ jobs:
- build-unrealircd - build-unrealircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-unrealircd name: installed-unrealircd
path: '~' path: '~'
@ -1288,7 +1282,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_unrealircd-atheme_stable name: pytest-results_unrealircd-atheme_stable
path: pytest.xml path: pytest.xml
@ -1297,20 +1291,20 @@ jobs:
- build-unrealircd - build-unrealircd
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python 3.7 - name: Set up Python 3.7
uses: actions/setup-python@v4 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.7
- name: Download build artefacts - name: Download build artefacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v2
with: with:
name: installed-unrealircd name: installed-unrealircd
path: '~' path: '~'
- name: Unpack artefacts - name: Unpack artefacts
run: cd ~; find -name 'artefacts-*.tar.gz' -exec tar -xzf '{}' \; run: cd ~; find -name 'artefacts-*.tar.gz' -exec tar -xzf '{}' \;
- name: Checkout Dlk - name: Checkout Dlk
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: Dlk-Services path: Dlk-Services
ref: effd18652fc1c847d1959089d9cca9ff9837a8c0 ref: effd18652fc1c847d1959089d9cca9ff9837a8c0
@ -1334,7 +1328,7 @@ jobs:
timeout-minutes: 30 timeout-minutes: 30
- if: always() - if: always()
name: Publish results name: Publish results
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v2
with: with:
name: pytest-results_unrealircd-dlk_stable name: pytest-results_unrealircd-dlk_stable
path: pytest.xml path: pytest.xml

View File

@ -110,11 +110,8 @@ cd /tmp/
git clone https://github.com/inspircd/inspircd.git git clone https://github.com/inspircd/inspircd.git
cd inspircd cd inspircd
# Optional, makes tests run considerably faster. Pick one depending on the InspIRCd version: # optional, makes tests run considerably faster
# on Insp3 <= 3.16.0 and Insp4 <= 4.0.0a21:
patch src/inspircd.cpp < ~/irctest/patches/inspircd_mainloop.patch patch src/inspircd.cpp < ~/irctest/patches/inspircd_mainloop.patch
# on Insp3 >= 3.17.0 and Insp4 >= 4.0.0a22:
export CXXFLAGS=-DINSPIRCD_UNLIMITED_MAINLOOP
./configure --prefix=$HOME/.local/ --development ./configure --prefix=$HOME/.local/ --development
make -j 4 make -j 4

View File

@ -1,7 +1,6 @@
from __future__ import annotations from __future__ import annotations
import dataclasses import dataclasses
import multiprocessing
import os import os
from pathlib import Path from pathlib import Path
import shutil import shutil
@ -10,18 +9,7 @@ import subprocess
import tempfile import tempfile
import textwrap import textwrap
import time import time
from typing import ( from typing import IO, Any, Callable, Dict, List, Optional, Set, Tuple, Type
IO,
Any,
Callable,
Dict,
List,
MutableMapping,
Optional,
Set,
Tuple,
Type,
)
import irctest import irctest
@ -70,43 +58,9 @@ class _BaseController:
supported_sasl_mechanisms: Set[str] supported_sasl_mechanisms: Set[str]
proc: Optional[subprocess.Popen] proc: Optional[subprocess.Popen]
_used_ports: Set[Tuple[str, int]]
"""``(hostname, port))`` used by this controller."""
# the following need to be shared between processes in case we are running in
# parallel (with pytest-xdist)
# The dicts are used as a set of (hostname, port), because _manager.set() doesn't
# exist.
_manager = multiprocessing.Manager()
_port_lock = _manager.Lock()
"""Lock for access to ``_all_used_ports`` and ``_available_ports``."""
_all_used_ports: MutableMapping[Tuple[str, int], None] = _manager.dict()
"""``(hostname, port)`` used by all controllers."""
_available_ports: MutableMapping[Tuple[str, int], None] = _manager.dict()
"""``(hostname, port)`` available to any controller."""
def __init__(self, test_config: TestCaseControllerConfig): def __init__(self, test_config: TestCaseControllerConfig):
self.test_config = test_config self.test_config = test_config
self.proc = None self.proc = None
self._used_ports = set()
def get_hostname_and_port(self) -> Tuple[str, int]:
with self._port_lock:
try:
# try to get a known available port
((hostname, port), _) = self._available_ports.popitem()
except KeyError:
# if there aren't any, iterate while we get a fresh one.
while True:
(hostname, port) = find_hostname_and_port()
if (hostname, port) not in self._all_used_ports:
# double-checking in self._used_ports to prevent collisions
# between controllers starting at the same time.
break
# Make this port unavailable to other processes
self._all_used_ports[(hostname, port)] = None
return (hostname, port)
def check_is_alive(self) -> None: def check_is_alive(self) -> None:
assert self.proc assert self.proc
@ -130,11 +84,6 @@ class _BaseController:
if self.proc: if self.proc:
self.kill_proc() self.kill_proc()
# move this controller's ports from _all_used_ports to _available_ports
for hostname, port in self._used_ports:
del self._all_used_ports[(hostname, port)]
self._available_ports[(hostname, port)] = None
class DirectoryBasedController(_BaseController): class DirectoryBasedController(_BaseController):
"""Helper for controllers whose software configuration is based on an """Helper for controllers whose software configuration is based on an
@ -253,6 +202,9 @@ class BaseServerController(_BaseController):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.faketime_enabled = False self.faketime_enabled = False
def get_hostname_and_port(self) -> Tuple[str, int]:
return find_hostname_and_port()
def run( def run(
self, self,
hostname: str, hostname: str,
@ -261,6 +213,8 @@ class BaseServerController(_BaseController):
password: Optional[str], password: Optional[str],
ssl: bool, ssl: bool,
run_services: bool, run_services: bool,
valid_metadata_keys: Optional[Set[str]],
invalid_metadata_keys: Optional[Set[str]],
faketime: Optional[str], faketime: Optional[str],
) -> None: ) -> None:
raise NotImplementedError() raise NotImplementedError()

View File

@ -529,6 +529,8 @@ class BaseServerTestCase(
password: Optional[str] = None password: Optional[str] = None
ssl = False ssl = False
valid_metadata_keys: Set[str] = set()
invalid_metadata_keys: Set[str] = set()
server_support: Optional[Dict[str, Optional[str]]] server_support: Optional[Dict[str, Optional[str]]]
run_services = False run_services = False
@ -548,6 +550,8 @@ class BaseServerTestCase(
self.hostname, self.hostname,
self.port, self.port,
password=self.password, password=self.password,
valid_metadata_keys=self.valid_metadata_keys,
invalid_metadata_keys=self.invalid_metadata_keys,
ssl=self.ssl, ssl=self.ssl,
run_services=self.run_services, run_services=self.run_services,
faketime=self.faketime, faketime=self.faketime,
@ -706,7 +710,7 @@ class BaseServerTestCase(
self.requestCapabilities(client, capabilities, skip_if_cap_nak) self.requestCapabilities(client, capabilities, skip_if_cap_nak)
if password is not None: if password is not None:
if "sasl" not in (capabilities or ()): if "sasl" not in (capabilities or ()):
raise ValueError("Used 'password' option without sasl capbility") raise ValueError("Used 'password' option without sasl capbilitiy")
self.authenticateClient(client, account or nick, password) self.authenticateClient(client, account or nick, password)
self.sendLine(client, "NICK {}".format(nick)) self.sendLine(client, "NICK {}".format(nick))

View File

@ -3,7 +3,12 @@ import shutil
import subprocess import subprocess
from typing import Optional, Set, Type from typing import Optional, Set, Type
from irctest.basecontrollers import BaseServerController, DirectoryBasedController from irctest.basecontrollers import (
BaseServerController,
DirectoryBasedController,
NotImplementedByController,
)
from irctest.irc_utils.junkdrawer import find_hostname_and_port
TEMPLATE_CONFIG = """ TEMPLATE_CONFIG = """
global {{ global {{
@ -107,14 +112,21 @@ class BahamutController(BaseServerController, DirectoryBasedController):
password: Optional[str], password: Optional[str],
ssl: bool, ssl: bool,
run_services: bool, run_services: bool,
valid_metadata_keys: Optional[Set[str]] = None,
invalid_metadata_keys: Optional[Set[str]] = None,
restricted_metadata_keys: Optional[Set[str]] = None,
faketime: Optional[str], faketime: Optional[str],
) -> None: ) -> None:
if valid_metadata_keys or invalid_metadata_keys:
raise NotImplementedByController(
"Defining valid and invalid METADATA keys."
)
assert self.proc is None assert self.proc is None
self.port = port self.port = port
self.hostname = hostname self.hostname = hostname
self.create_config() self.create_config()
(unused_hostname, unused_port) = self.get_hostname_and_port() (unused_hostname, unused_port) = find_hostname_and_port()
(services_hostname, services_port) = self.get_hostname_and_port() (services_hostname, services_port) = find_hostname_and_port()
password_field = "passwd {};".format(password) if password else "" password_field = "passwd {};".format(password) if password else ""

View File

@ -1,8 +1,13 @@
import shutil import shutil
import subprocess import subprocess
from typing import Optional from typing import Optional, Set
from irctest.basecontrollers import BaseServerController, DirectoryBasedController from irctest.basecontrollers import (
BaseServerController,
DirectoryBasedController,
NotImplementedByController,
)
from irctest.irc_utils.junkdrawer import find_hostname_and_port
TEMPLATE_SSL_CONFIG = """ TEMPLATE_SSL_CONFIG = """
ssl_private_key = "{key_path}"; ssl_private_key = "{key_path}";
@ -36,13 +41,19 @@ class BaseHybridController(BaseServerController, DirectoryBasedController):
password: Optional[str], password: Optional[str],
ssl: bool, ssl: bool,
run_services: bool, run_services: bool,
valid_metadata_keys: Optional[Set[str]] = None,
invalid_metadata_keys: Optional[Set[str]] = None,
faketime: Optional[str], faketime: Optional[str],
) -> None: ) -> None:
if valid_metadata_keys or invalid_metadata_keys:
raise NotImplementedByController(
"Defining valid and invalid METADATA keys."
)
assert self.proc is None assert self.proc is None
self.port = port self.port = port
self.hostname = hostname self.hostname = hostname
self.create_config() self.create_config()
(services_hostname, services_port) = self.get_hostname_and_port() (services_hostname, services_port) = find_hostname_and_port()
password_field = 'password = "{}";'.format(password) if password else "" password_field = 'password = "{}";'.format(password) if password else ""
if ssl: if ssl:
self.gen_ssl() self.gen_ssl()

View File

@ -3,9 +3,13 @@ import json
import os import os
import shutil import shutil
import subprocess import subprocess
from typing import Any, Dict, Optional, Type, Union from typing import Any, Dict, Optional, Set, Type, Union
from irctest.basecontrollers import BaseServerController, DirectoryBasedController from irctest.basecontrollers import (
BaseServerController,
DirectoryBasedController,
NotImplementedByController,
)
from irctest.cases import BaseServerTestCase from irctest.cases import BaseServerTestCase
BASE_CONFIG = { BASE_CONFIG = {
@ -77,9 +81,6 @@ BASE_CONFIG = {
"channel-length": 128, "channel-length": 128,
"client-length": 128, "client-length": 128,
"chathistory-maxmessages": 100, "chathistory-maxmessages": 100,
"retention": {
"allow-individual-delete": True,
},
"tagmsg-storage": { "tagmsg-storage": {
"default": False, "default": False,
"whitelist": ["+draft/persist", "+persist"], "whitelist": ["+draft/persist", "+persist"],
@ -129,7 +130,7 @@ def hash_password(password: Union[str, bytes]) -> str:
["ergo", "genpasswd"], stdin=subprocess.PIPE, stdout=subprocess.PIPE ["ergo", "genpasswd"], stdin=subprocess.PIPE, stdout=subprocess.PIPE
) )
out, _ = p.communicate(input_) out, _ = p.communicate(input_)
return out.decode("utf-8").strip() return out.decode("utf-8")
class ErgoController(BaseServerController, DirectoryBasedController): class ErgoController(BaseServerController, DirectoryBasedController):
@ -152,9 +153,17 @@ class ErgoController(BaseServerController, DirectoryBasedController):
password: Optional[str], password: Optional[str],
ssl: bool, ssl: bool,
run_services: bool, run_services: bool,
valid_metadata_keys: Optional[Set[str]] = None,
invalid_metadata_keys: Optional[Set[str]] = None,
restricted_metadata_keys: Optional[Set[str]] = None,
faketime: Optional[str], faketime: Optional[str],
config: Optional[Any] = None, config: Optional[Any] = None,
) -> None: ) -> None:
if valid_metadata_keys or invalid_metadata_keys:
raise NotImplementedByController(
"Defining valid and invalid METADATA keys."
)
self.create_config() self.create_config()
if config is None: if config is None:
config = copy.deepcopy(BASE_CONFIG) config = copy.deepcopy(BASE_CONFIG)

View File

@ -1,5 +1,5 @@
import os import os
from typing import Optional, Tuple, Type from typing import Optional, Set, Tuple, Type
from irctest.basecontrollers import BaseServerController from irctest.basecontrollers import BaseServerController
@ -39,6 +39,9 @@ class ExternalServerController(BaseServerController):
password: Optional[str], password: Optional[str],
ssl: bool, ssl: bool,
run_services: bool, run_services: bool,
valid_metadata_keys: Optional[Set[str]] = None,
invalid_metadata_keys: Optional[Set[str]] = None,
restricted_metadata_keys: Optional[Set[str]] = None,
faketime: Optional[str], faketime: Optional[str],
) -> None: ) -> None:
pass pass

View File

@ -1,9 +1,14 @@
import functools import functools
import shutil import shutil
import subprocess import subprocess
from typing import Optional, Type from typing import Optional, Set, Type
from irctest.basecontrollers import BaseServerController, DirectoryBasedController from irctest.basecontrollers import (
BaseServerController,
DirectoryBasedController,
NotImplementedByController,
)
from irctest.irc_utils.junkdrawer import find_hostname_and_port
TEMPLATE_CONFIG = """ TEMPLATE_CONFIG = """
# Clients: # Clients:
@ -120,13 +125,20 @@ class InspircdController(BaseServerController, DirectoryBasedController):
password: Optional[str], password: Optional[str],
ssl: bool, ssl: bool,
run_services: bool, run_services: bool,
valid_metadata_keys: Optional[Set[str]] = None,
invalid_metadata_keys: Optional[Set[str]] = None,
restricted_metadata_keys: Optional[Set[str]] = None,
faketime: Optional[str] = None, faketime: Optional[str] = None,
) -> None: ) -> None:
if valid_metadata_keys or invalid_metadata_keys:
raise NotImplementedByController(
"Defining valid and invalid METADATA keys."
)
assert self.proc is None assert self.proc is None
self.port = port self.port = port
self.hostname = hostname self.hostname = hostname
self.create_config() self.create_config()
(services_hostname, services_port) = self.get_hostname_and_port() (services_hostname, services_port) = find_hostname_and_port()
password_field = 'password="{}"'.format(password) if password else "" password_field = 'password="{}"'.format(password) if password else ""

View File

@ -1,6 +1,6 @@
import shutil import shutil
import subprocess import subprocess
from typing import Optional, Type from typing import Optional, Set, Type
from irctest.basecontrollers import ( from irctest.basecontrollers import (
BaseServerController, BaseServerController,
@ -49,8 +49,14 @@ class Irc2Controller(BaseServerController, DirectoryBasedController):
password: Optional[str], password: Optional[str],
ssl: bool, ssl: bool,
run_services: bool, run_services: bool,
valid_metadata_keys: Optional[Set[str]] = None,
invalid_metadata_keys: Optional[Set[str]] = None,
faketime: Optional[str], faketime: Optional[str],
) -> None: ) -> None:
if valid_metadata_keys or invalid_metadata_keys:
raise NotImplementedByController(
"Defining valid and invalid METADATA keys."
)
if ssl: if ssl:
raise NotImplementedByController("TLS") raise NotImplementedByController("TLS")
if run_services: if run_services:

View File

@ -1,6 +1,6 @@
import shutil import shutil
import subprocess import subprocess
from typing import Optional, Type from typing import Optional, Set, Type
from irctest.basecontrollers import ( from irctest.basecontrollers import (
BaseServerController, BaseServerController,
@ -68,8 +68,14 @@ class Ircu2Controller(BaseServerController, DirectoryBasedController):
password: Optional[str], password: Optional[str],
ssl: bool, ssl: bool,
run_services: bool, run_services: bool,
valid_metadata_keys: Optional[Set[str]] = None,
invalid_metadata_keys: Optional[Set[str]] = None,
faketime: Optional[str], faketime: Optional[str],
) -> None: ) -> None:
if valid_metadata_keys or invalid_metadata_keys:
raise NotImplementedByController(
"Defining valid and invalid METADATA keys."
)
if ssl: if ssl:
raise NotImplementedByController("TLS") raise NotImplementedByController("TLS")
if run_services: if run_services:

View File

@ -33,10 +33,10 @@ extensions:
- mammon.ext.ircv3.sasl - mammon.ext.ircv3.sasl
- mammon.ext.misc.nopost - mammon.ext.misc.nopost
metadata: metadata:
restricted_keys: [] restricted_keys:
{restricted_keys}
whitelist: whitelist:
- display-name {authorized_keys}
- avatar
monitor: monitor:
limit: 20 limit: 20
motd: motd:
@ -89,6 +89,9 @@ class MammonController(BaseServerController, DirectoryBasedController):
password: Optional[str], password: Optional[str],
ssl: bool, ssl: bool,
run_services: bool, run_services: bool,
valid_metadata_keys: Optional[Set[str]] = None,
invalid_metadata_keys: Optional[Set[str]] = None,
restricted_metadata_keys: Optional[Set[str]] = None,
faketime: Optional[str], faketime: Optional[str],
) -> None: ) -> None:
if password is not None: if password is not None:
@ -104,6 +107,8 @@ class MammonController(BaseServerController, DirectoryBasedController):
directory=self.directory, directory=self.directory,
hostname=hostname, hostname=hostname,
port=port, port=port,
authorized_keys=make_list(valid_metadata_keys or set()),
restricted_keys=make_list(restricted_metadata_keys or set()),
) )
) )
# with self.open_file('server.yml', 'r') as fd: # with self.open_file('server.yml', 'r') as fd:

View File

@ -2,7 +2,12 @@ import shutil
import subprocess import subprocess
from typing import Optional, Set, Type from typing import Optional, Set, Type
from irctest.basecontrollers import BaseServerController, DirectoryBasedController from irctest.basecontrollers import (
BaseServerController,
DirectoryBasedController,
NotImplementedByController,
)
from irctest.irc_utils.junkdrawer import find_hostname_and_port
TEMPLATE_CONFIG = """ TEMPLATE_CONFIG = """
[Global] [Global]
@ -48,13 +53,20 @@ class NgircdController(BaseServerController, DirectoryBasedController):
password: Optional[str], password: Optional[str],
ssl: bool, ssl: bool,
run_services: bool, run_services: bool,
valid_metadata_keys: Optional[Set[str]] = None,
invalid_metadata_keys: Optional[Set[str]] = None,
restricted_metadata_keys: Optional[Set[str]] = None,
faketime: Optional[str], faketime: Optional[str],
) -> None: ) -> None:
if valid_metadata_keys or invalid_metadata_keys:
raise NotImplementedByController(
"Defining valid and invalid METADATA keys."
)
assert self.proc is None assert self.proc is None
self.port = port self.port = port
self.hostname = hostname self.hostname = hostname
self.create_config() self.create_config()
(unused_hostname, unused_port) = self.get_hostname_and_port() (unused_hostname, unused_port) = find_hostname_and_port()
password_field = "Password = {}".format(password) if password else "" password_field = "Password = {}".format(password) if password else ""

View File

@ -1,6 +1,6 @@
import shutil import shutil
import subprocess import subprocess
from typing import Optional, Type from typing import Optional, Set, Type
from irctest.basecontrollers import ( from irctest.basecontrollers import (
BaseServerController, BaseServerController,
@ -67,8 +67,14 @@ class SnircdController(BaseServerController, DirectoryBasedController):
password: Optional[str], password: Optional[str],
ssl: bool, ssl: bool,
run_services: bool, run_services: bool,
valid_metadata_keys: Optional[Set[str]] = None,
invalid_metadata_keys: Optional[Set[str]] = None,
faketime: Optional[str], faketime: Optional[str],
) -> None: ) -> None:
if valid_metadata_keys or invalid_metadata_keys:
raise NotImplementedByController(
"Defining valid and invalid METADATA keys."
)
if ssl: if ssl:
raise NotImplementedByController("TLS") raise NotImplementedByController("TLS")
if run_services: if run_services:

View File

@ -5,15 +5,19 @@ from pathlib import Path
import shutil import shutil
import subprocess import subprocess
import textwrap import textwrap
from typing import Callable, ContextManager, Iterator, Optional, Type from typing import Callable, ContextManager, Iterator, Optional, Set, Type
from irctest.basecontrollers import BaseServerController, DirectoryBasedController from irctest.basecontrollers import (
BaseServerController,
DirectoryBasedController,
NotImplementedByController,
)
from irctest.irc_utils.junkdrawer import find_hostname_and_port
TEMPLATE_CONFIG = """ TEMPLATE_CONFIG = """
include "modules.default.conf"; include "modules.default.conf";
include "operclass.default.conf"; include "operclass.default.conf";
{extras} {extras}
loadmodule "third/redact";
include "help/help.conf"; include "help/help.conf";
me {{ me {{
@ -97,12 +101,7 @@ set {{
}} }}
modes-on-join "+H 100:1d"; // Enables CHATHISTORY modes-on-join "+H 100:1d"; // Enables CHATHISTORY
redacters {{ {set_extras}
op;
sender;
}}
{set_v6only}
}} }}
@ -125,24 +124,6 @@ oper "operuser" {{
}} }}
""" """
SET_V6ONLY = """
// Remove RPL_WHOISSPECIAL used to advertise security groups
whois-details {
security-groups { everyone none; self none; oper none; }
}
plaintext-policy {
server warn; // https://www.unrealircd.org/docs/FAQ#server-requires-tls
oper warn; // https://www.unrealircd.org/docs/FAQ#oper-requires-tls
}
anti-flood {
everyone {
connect-flood 255:10;
}
}
"""
def _filelock(path: Path) -> Callable[[], ContextManager]: def _filelock(path: Path) -> Callable[[], ContextManager]:
"""Alternative to :cls:`multiprocessing.Lock` that works with pytest-xdist""" """Alternative to :cls:`multiprocessing.Lock` that works with pytest-xdist"""
@ -205,8 +186,15 @@ class UnrealircdController(BaseServerController, DirectoryBasedController):
password: Optional[str], password: Optional[str],
ssl: bool, ssl: bool,
run_services: bool, run_services: bool,
valid_metadata_keys: Optional[Set[str]] = None,
invalid_metadata_keys: Optional[Set[str]] = None,
restricted_metadata_keys: Optional[Set[str]] = None,
faketime: Optional[str], faketime: Optional[str],
) -> None: ) -> None:
if valid_metadata_keys or invalid_metadata_keys:
raise NotImplementedByController(
"Defining valid and invalid METADATA keys."
)
assert self.proc is None assert self.proc is None
self.port = port self.port = port
self.hostname = hostname self.hostname = hostname
@ -219,18 +207,29 @@ class UnrealircdController(BaseServerController, DirectoryBasedController):
loadmodule "cloak_md5"; loadmodule "cloak_md5";
""" """
) )
set_v6only = SET_V6ONLY set_extras = textwrap.indent(
textwrap.dedent(
"""
// Remove RPL_WHOISSPECIAL used to advertise security groups
whois-details {
security-groups { everyone none; self none; oper none; }
}
"""
),
" ",
)
else: else:
extras = "" extras = ""
set_v6only = "" set_extras = ""
with self.open_file("empty.txt") as fd: with self.open_file("empty.txt") as fd:
fd.write("\n") fd.write("\n")
password_field = 'password "{}";'.format(password) if password else "" password_field = 'password "{}";'.format(password) if password else ""
(services_hostname, services_port) = self.get_hostname_and_port() with _STARTSTOP_LOCK():
(unused_hostname, unused_port) = self.get_hostname_and_port() (services_hostname, services_port) = find_hostname_and_port()
(unused_hostname, unused_port) = find_hostname_and_port()
self.gen_ssl() self.gen_ssl()
if ssl: if ssl:
@ -255,8 +254,8 @@ class UnrealircdController(BaseServerController, DirectoryBasedController):
key_path=self.key_path, key_path=self.key_path,
pem_path=self.pem_path, pem_path=self.pem_path,
empty_file=self.directory / "empty.txt", empty_file=self.directory / "empty.txt",
set_v6only=set_v6only,
extras=extras, extras=extras,
set_extras=set_extras,
) )
) )
@ -266,7 +265,6 @@ class UnrealircdController(BaseServerController, DirectoryBasedController):
else: else:
faketime_cmd = [] faketime_cmd = []
with _STARTSTOP_LOCK():
self.proc = subprocess.Popen( self.proc = subprocess.Popen(
[ [
*faketime_cmd, *faketime_cmd,

View File

@ -1,38 +0,0 @@
"""
Channel "no external messages" mode (`RFC 1459
<https://datatracker.ietf.org/doc/html/rfc1459#section-4.2.3.1>`__,
`Modern <https://modern.ircdocs.horse/#no-external-messages-mode>`__)
"""
from irctest import cases
from irctest.numerics import ERR_CANNOTSENDTOCHAN
class NoExternalMessagesTestCase(cases.BaseServerTestCase):
@cases.mark_specifications("RFC1459", "Modern")
def testNoExternalMessagesMode(self):
# test the +n channel mode
self.connectClient("chanop", name="chanop")
self.joinChannel("chanop", "#chan")
self.sendLine("chanop", "MODE #chan +n")
self.getMessages("chanop")
self.connectClient("baz", name="baz")
# this message should be suppressed completely by +n
self.sendLine("baz", "PRIVMSG #chan :hi from baz")
replies = self.getMessages("baz")
reply_cmds = {reply.command for reply in replies}
self.assertIn(ERR_CANNOTSENDTOCHAN, reply_cmds)
self.assertEqual(self.getMessages("chanop"), [])
# set the channel to -n: baz should be able to send now
self.sendLine("chanop", "MODE #chan -n")
replies = self.getMessages("chanop")
modeLines = [line for line in replies if line.command == "MODE"]
self.assertMessageMatch(modeLines[0], command="MODE", params=["#chan", "-n"])
self.sendLine("baz", "PRIVMSG #chan :hi again from baz")
self.getMessages("baz")
relays = self.getMessages("chanop")
self.assertMessageMatch(
relays[0], command="PRIVMSG", params=["#chan", "hi again from baz"]
)

View File

@ -238,6 +238,135 @@ class ListTestCase(_BasedListTestCase):
self.sendLine(3, "LIST <100") self.sendLine(3, "LIST <100")
self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2"}) self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2"})
@cases.mark_specifications("Modern")
def testListTwoChannels(self):
"""
"Parameters: [<channel>{,<channel>}] [<elistcond>{,<elistcond>}]"
-- https://modern.ircdocs.horse/#list-message
"""
self.connectClient("foo")
if "TARGMAX" in self.server_support:
for item in (self.server_support["TARGMAX"]).split(","):
(command, max_) = item.split(":", 1)
if command == "LIST" and int(max_ or "1000") < 2:
raise runner.OptionalExtensionNotSupported("TARGMAX=LIST >= 2")
self.sendLine(1, "JOIN #chan1")
self.getMessages(1)
self.sendLine(1, "JOIN #chan2")
self.getMessages(1)
self.sendLine(1, "JOIN #chan3")
self.getMessages(1)
self.connectClient("bar")
self.sendLine(2, "JOIN #chan2")
self.getMessages(2)
self.connectClient("baz")
self.sendLine(3, "LIST")
self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2", "#chan3"})
self.sendLine(3, "LIST #chan1,#chan2")
self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2"})
@cases.mark_isupport("ELIST")
def testListTwoMasks(self):
self.connectClient("foo")
if "M" not in self.server_support.get("ELIST", ""):
raise runner.OptionalExtensionNotSupported("ELIST=M")
if "TARGMAX" in self.server_support:
for item in (self.server_support["TARGMAX"]).split(","):
(command, max_) = item.split(":", 1)
if command == "LIST" and int(max_ or "1000") < 2:
raise runner.OptionalExtensionNotSupported("TARGMAX=LIST >= 2")
self.sendLine(1, "JOIN #chan1")
self.getMessages(1)
self.sendLine(1, "JOIN #chan2")
self.getMessages(1)
self.sendLine(1, "JOIN #chan3")
self.getMessages(1)
self.connectClient("bar")
self.sendLine(2, "JOIN #chan2")
self.getMessages(2)
self.connectClient("baz")
self.sendLine(3, "LIST")
self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2", "#chan3"})
self.sendLine(3, "LIST *an1,*an2")
self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2"})
@cases.mark_isupport("ELIST")
@cases.mark_specifications("Modern")
def testListTwoParams(self):
"""
"Parameters: [<channel>{,<channel>}] [<elistcond>{,<elistcond>}]"
-- https://modern.ircdocs.horse/#list-message
"""
self.connectClient("foo")
if "U" not in self.server_support.get("ELIST", ""):
raise runner.OptionalExtensionNotSupported("ELIST=U")
self.sendLine(1, "JOIN #chan1")
self.getMessages(1)
self.sendLine(1, "JOIN #chan2")
self.getMessages(1)
self.connectClient("bar")
self.sendLine(2, "JOIN #chan2")
self.getMessages(2)
self.connectClient("baz")
self.sendLine(3, "LIST #chan1 >0")
self.assertEqual(self._parseChanList(3), {"#chan1"})
self.sendLine(3, "LIST #chan1 <1")
self.assertEqual(self._parseChanList(3), set())
@cases.mark_isupport("ELIST")
@cases.mark_specifications("Modern")
def testListTwoParamsTwoChannels(self):
"""
"Parameters: [<channel>{,<channel>}] [<elistcond>{,<elistcond>}]"
-- https://modern.ircdocs.horse/#list-message
"""
self.connectClient("foo")
if "U" not in self.server_support.get("ELIST", ""):
raise runner.OptionalExtensionNotSupported("ELIST=U")
if "TARGMAX" in self.server_support:
for item in (self.server_support["TARGMAX"]).split(","):
(command, max_) = item.split(":", 1)
if command == "LIST" and int(max_ or "1000") < 2:
raise runner.OptionalExtensionNotSupported("TARGMAX=LIST >= 2")
self.sendLine(1, "JOIN #chan1")
self.getMessages(1)
self.sendLine(1, "JOIN #chan2")
self.getMessages(1)
self.connectClient("bar")
self.sendLine(2, "JOIN #chan2")
self.getMessages(2)
self.connectClient("baz")
self.sendLine(3, "LIST #chan1,#chan2 >0")
self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2"})
self.sendLine(3, "LIST #chan1,#chan2 <1")
self.assertEqual(self._parseChanList(3), set())
class FaketimeListTestCase(_BasedListTestCase): class FaketimeListTestCase(_BasedListTestCase):
faketime = "+1y x30" # for every wall clock second, 1 minute passed for the server faketime = "+1y x30" # for every wall clock second, 1 minute passed for the server

View File

@ -100,13 +100,8 @@ class NoticeTestCase(cases.BaseServerTestCase):
class TagsTestCase(cases.BaseServerTestCase): class TagsTestCase(cases.BaseServerTestCase):
@cases.mark_capabilities("message-tags") @cases.mark_capabilities("message-tags")
@cases.xfailIf( @cases.xfailIfSoftware(
lambda self: bool( ["UnrealIRCd"], "https://bugs.unrealircd.org/view.php?id=5947"
self.controller.software_name == "UnrealIRCd"
and self.controller.software_version == 5
),
"UnrealIRCd <6.0.7 dropped messages with excessively large tags: "
"https://bugs.unrealircd.org/view.php?id=5947",
) )
def testLineTooLong(self): def testLineTooLong(self):
self.connectClient("bar", capabilities=["message-tags"], skip_if_cap_nak=True) self.connectClient("bar", capabilities=["message-tags"], skip_if_cap_nak=True)

View File

@ -6,8 +6,8 @@ from irctest import cases
class MetadataTestCase(cases.BaseServerTestCase): class MetadataTestCase(cases.BaseServerTestCase):
valid_metadata_keys = {"display-name", "avatar"} valid_metadata_keys = {"valid_key1", "valid_key2"}
invalid_metadata_keys = {"indisplay-name", "inavatar"} invalid_metadata_keys = {"invalid_key1", "invalid_key2"}
@cases.mark_specifications("IRCv3", deprecated=True) @cases.mark_specifications("IRCv3", deprecated=True)
def testInIsupport(self): def testInIsupport(self):
@ -36,7 +36,7 @@ class MetadataTestCase(cases.BaseServerTestCase):
def testGetOneUnsetValid(self): def testGetOneUnsetValid(self):
"""<http://ircv3.net/specs/core/metadata-3.2.html#metadata-get>""" """<http://ircv3.net/specs/core/metadata-3.2.html#metadata-get>"""
self.connectClient("foo") self.connectClient("foo")
self.sendLine(1, "METADATA * GET display-name") self.sendLine(1, "METADATA * GET valid_key1")
m = self.getMessage(1) m = self.getMessage(1)
self.assertMessageMatch( self.assertMessageMatch(
m, m,
@ -52,7 +52,7 @@ class MetadataTestCase(cases.BaseServerTestCase):
-- <http://ircv3.net/specs/core/metadata-3.2.html#metadata-get> -- <http://ircv3.net/specs/core/metadata-3.2.html#metadata-get>
""" """
self.connectClient("foo") self.connectClient("foo")
self.sendLine(1, "METADATA * GET display-name avatar") self.sendLine(1, "METADATA * GET valid_key1 valid_key2")
m = self.getMessage(1) m = self.getMessage(1)
self.assertMessageMatch( self.assertMessageMatch(
m, m,
@ -62,10 +62,10 @@ class MetadataTestCase(cases.BaseServerTestCase):
) )
self.assertEqual( self.assertEqual(
m.params[1], m.params[1],
"display-name", "valid_key1",
m, m,
fail_msg="Response to “METADATA * GET display-name avatar" fail_msg="Response to “METADATA * GET valid_key1 valid_key2"
"did not respond to display-name first: {msg}", "did not respond to valid_key1 first: {msg}",
) )
m = self.getMessage(1) m = self.getMessage(1)
self.assertMessageMatch( self.assertMessageMatch(
@ -76,10 +76,10 @@ class MetadataTestCase(cases.BaseServerTestCase):
) )
self.assertEqual( self.assertEqual(
m.params[1], m.params[1],
"avatar", "valid_key2",
m, m,
fail_msg="Response to “METADATA * GET display-name avatar" fail_msg="Response to “METADATA * GET valid_key1 valid_key2"
"did not respond to avatar as second response: {msg}", "did not respond to valid_key2 as second response: {msg}",
) )
@cases.mark_specifications("IRCv3", deprecated=True) @cases.mark_specifications("IRCv3", deprecated=True)
@ -135,7 +135,7 @@ class MetadataTestCase(cases.BaseServerTestCase):
) )
self.assertEqual( self.assertEqual(
m.params[1], m.params[1],
"display-name", "valid_key1",
m, m,
fail_msg="Second param of 761 after setting “{expects}” to " fail_msg="Second param of 761 after setting “{expects}” to "
"{}” is not “{expects}”: {msg}.", "{}” is not “{expects}”: {msg}.",
@ -190,7 +190,7 @@ class MetadataTestCase(cases.BaseServerTestCase):
def testSetGetValid(self): def testSetGetValid(self):
"""<http://ircv3.net/specs/core/metadata-3.2.html>""" """<http://ircv3.net/specs/core/metadata-3.2.html>"""
self.connectClient("foo") self.connectClient("foo")
self.assertSetGetValue("*", "display-name", "myvalue") self.assertSetGetValue("*", "valid_key1", "myvalue")
@cases.mark_specifications("IRCv3", deprecated=True) @cases.mark_specifications("IRCv3", deprecated=True)
def testSetGetZeroCharInValue(self): def testSetGetZeroCharInValue(self):
@ -198,7 +198,7 @@ class MetadataTestCase(cases.BaseServerTestCase):
-- <http://ircv3.net/specs/core/metadata-3.2.html#metadata-restrictions> -- <http://ircv3.net/specs/core/metadata-3.2.html#metadata-restrictions>
""" """
self.connectClient("foo") self.connectClient("foo")
self.assertSetGetValue("*", "display-name", "zero->\0<-zero", "zero->\\0<-zero") self.assertSetGetValue("*", "valid_key1", "zero->\0<-zero", "zero->\\0<-zero")
@cases.mark_specifications("IRCv3", deprecated=True) @cases.mark_specifications("IRCv3", deprecated=True)
def testSetGetHeartInValue(self): def testSetGetHeartInValue(self):
@ -209,7 +209,7 @@ class MetadataTestCase(cases.BaseServerTestCase):
self.connectClient("foo") self.connectClient("foo")
self.assertSetGetValue( self.assertSetGetValue(
"*", "*",
"display-name", "valid_key1",
"->{}<-".format(heart), "->{}<-".format(heart),
"zero->{}<-zero".format(heart.encode()), "zero->{}<-zero".format(heart.encode()),
) )
@ -223,7 +223,7 @@ class MetadataTestCase(cases.BaseServerTestCase):
# Sending directly because it is not valid UTF-8 so Python would # Sending directly because it is not valid UTF-8 so Python would
# not like it # not like it
self.clients[1].conn.sendall( self.clients[1].conn.sendall(
b"METADATA * SET display-name " b":invalid UTF-8 ->\xc3<-\r\n" b"METADATA * SET valid_key1 " b":invalid UTF-8 ->\xc3<-\r\n"
) )
commands = {m.command for m in self.getMessages(1)} commands = {m.command for m in self.getMessages(1)}
self.assertNotIn( self.assertNotIn(
@ -233,7 +233,7 @@ class MetadataTestCase(cases.BaseServerTestCase):
"UTF-8 was answered with 761 (RPL_KEYVALUE)", "UTF-8 was answered with 761 (RPL_KEYVALUE)",
) )
self.clients[1].conn.sendall( self.clients[1].conn.sendall(
b"METADATA * SET display-name " b":invalid UTF-8: \xc3\r\n" b"METADATA * SET valid_key1 " b":invalid UTF-8: \xc3\r\n"
) )
commands = {m.command for m in self.getMessages(1)} commands = {m.command for m in self.getMessages(1)}
self.assertNotIn( self.assertNotIn(

View File

@ -1,502 +0,0 @@
"""
`IRCv3 draft message redaction <https://github.com/progval/ircv3-specifications/blob/redaction/extensions/message-redaction.md>`_
"""
import uuid
import pytest
from irctest import cases
from irctest.patma import ANYDICT, ANYSTR, StrRe
CAPABILITIES = [
"message-tags",
"echo-message",
"batch",
"server-time",
"labeled-response",
"draft/message-redaction",
]
@cases.mark_specifications("IRCv3")
@cases.mark_capabilities(*CAPABILITIES)
class ChannelRedactTestCase(cases.BaseServerTestCase):
def _setupRedactTest(self, redacteeId, redacteeNick, chathistory=False):
capabilities = list(CAPABILITIES)
if chathistory:
capabilities.extend(["batch", "draft/chathistory"])
self.connectClient("chanop", capabilities=capabilities, skip_if_cap_nak=True)
self.sendLine(1, "JOIN #chan")
self.connectClient("user", capabilities=capabilities, skip_if_cap_nak=True)
self.sendLine(2, "JOIN #chan")
self.getMessages(2) # synchronize
self.getMessages(1)
self.sendLine(redacteeId, "@label=1234 PRIVMSG #chan :hello there")
echo = self.getMessage(redacteeId)
self.assertMessageMatch(
echo,
tags={"label": "1234", "msgid": StrRe("[^ ]+"), **ANYDICT},
prefix=StrRe(redacteeNick + "!.*"),
command="PRIVMSG",
params=["#chan", "hello there"],
)
msgid = echo.tags["msgid"]
self.assertMessageMatch(
self.getMessage(3 - redacteeId),
tags={"msgid": msgid, **ANYDICT},
prefix=StrRe(redacteeNick + "!.*"),
command="PRIVMSG",
params=["#chan", "hello there"],
)
return msgid
def testRelayOpSelfRedact(self):
"""Channel op writes a message and redacts it themselves."""
msgid = self._setupRedactTest(redacteeId=1, redacteeNick="chanop")
self.sendLine(1, f"REDACT #chan {msgid} :oops")
self.assertMessageMatch(
self.getMessage(1),
prefix=StrRe("chanop!.*"),
command="REDACT",
params=["#chan", msgid, "oops"],
)
self.assertMessageMatch(
self.getMessage(2),
prefix=StrRe("chanop!.*"),
command="REDACT",
params=["#chan", msgid, "oops"],
)
def testRelayOpRedact(self):
"""User writes a message and channel op redacts it."""
msgid = self._setupRedactTest(
redacteeId=2,
redacteeNick="user",
)
self.sendLine(1, f"REDACT #chan {msgid} :spam")
self.assertMessageMatch(
self.getMessage(1),
prefix=StrRe("chanop!.*"),
command="REDACT",
params=["#chan", msgid, "spam"],
)
self.assertMessageMatch(
self.getMessage(2),
prefix=StrRe("chanop!.*"),
command="REDACT",
params=["#chan", msgid, "spam"],
)
def testRelayUserSelfRedact(self):
"""User writes a message and redacts it themselves.
Servers may either accept or reject this."""
msgid = self._setupRedactTest(redacteeId=2, redacteeNick="user")
self.sendLine(2, f"REDACT #chan {msgid} :oops")
msg = self.getMessage(2)
if msg.command == "REDACT":
self.assertMessageMatch(
msg,
prefix=StrRe("user!.*"),
command="REDACT",
params=["#chan", msgid, "oops"],
)
self.assertMessageMatch(
self.getMessage(1),
prefix=StrRe("user!.*"),
command="REDACT",
params=["#chan", msgid, "oops"],
)
else:
self.assertMessageMatch(
msg,
command="FAIL",
params=["REDACT", "REDACT_FORBIDDEN", "#chan", msgid, ANYSTR],
)
self.assertEqual(self.getMessages(1), [])
def testRejectRedactOtherUser(self):
"""Channel op writes a message and a user attempts to redact it."""
msgid = self._setupRedactTest(redacteeId=1, redacteeNick="chanop")
self.sendLine(2, f"REDACT #chan {msgid} :oops")
self.assertMessageMatch(
self.getMessage(2),
command="FAIL",
params=["REDACT", "REDACT_FORBIDDEN", "#chan", msgid, ANYSTR],
)
self.assertEqual(self.getMessages(1), [])
@pytest.mark.parametrize(
"chathistory_requester",
[
pytest.param(1, id="chathistory-to-chanop"),
pytest.param(2, id="chathistory-to-user"),
],
)
def testOpSelfRedactChathistory(self, chathistory_requester):
"""Channel op writes a message and redacts it themselves; both the op
and a regular user check the chathistory afterward.
https://github.com/progval/ircv3-specifications/blob/redaction/extensions/message-redaction.md#chat-history
"""
msgid = self._setupRedactTest(
redacteeId=1, redacteeNick="chanop", chathistory=True
)
self.sendLine(1, f"REDACT #chan {msgid} :oops")
self.assertMessageMatch(
self.getMessage(1),
prefix=StrRe("chanop!.*"),
command="REDACT",
params=["#chan", msgid, "oops"],
)
self.getMessages(1)
self.getMessages(2)
self.sendLine(chathistory_requester, "CHATHISTORY LATEST #chan * 10")
(start_msg, *msgs, end_msg) = self.getMessages(chathistory_requester)
self.assertMessageMatch(
start_msg,
command="BATCH",
params=[StrRe(r"\+.+"), "chathistory", "#chan"],
)
batch_tag = start_msg.params[0][1:]
# remove Ergo's event-playback fallback
msgs = [msg for msg in msgs if not msg.prefix.startswith("HistServ!")]
self.assertMessageMatch(end_msg, command="BATCH", params=["-" + batch_tag])
if len(msgs) == 0:
pass # Server removed the message entirely
elif len(msgs) == 1:
# Server replaced with the REDACT
self.assertMessageMatch(
msgs[0],
prefix=StrRe("sender!.*"),
command="REDACT",
params=["#chan", msgid, "oops"],
)
elif len(msgs) == 2:
# Server appended the REDACT
self.assertMessageMatch(
msgs[0],
tags={"msgid": msgid, **ANYDICT},
command="PRIVMSG",
params=["#chan", msgid, "hello there"],
)
self.assertMessageMatch(
msgs[1],
prefix=StrRe("sender!.*"),
command="REDACT",
params=["#chan", msgid, "oops"],
)
else:
self.assertTrue(False, fail_msg=f"Unexpectedly many messages: {msgs}")
def testOpRedactNonExistant(self):
"""Channel op writes a message and redacts a random non-existant id."""
self._setupRedactTest(redacteeId=1, redacteeNick="chanop")
nonexistent_msgid = str(uuid.uuid4())
self.sendLine(1, f"REDACT #chan {nonexistent_msgid} :oops")
self.assertMessageMatch(
self.getMessage(1),
command="FAIL",
params=["REDACT", "UNKNOWN_MSGID", "#chan", nonexistent_msgid, ANYSTR],
)
self.assertEqual(self.getMessages(2), [])
def testOpRedactWrongChan(self):
"""Channel op writes a message and redacts it, but uses the wrong channel
as target."""
msgid = self._setupRedactTest(redacteeId=1, redacteeNick="chanop")
self.sendLine(1, "JOIN #otherChan")
self.getMessages(1)
self.sendLine(1, f"REDACT #otherChan {msgid} :oops")
msg = self.getMessage(1)
self.assertMessageMatch(
msg,
command="FAIL",
)
if msg.params[1] == "UNKNOWN_MSGID":
self.assertMessageMatch(
msg,
command="FAIL",
params=["REDACT", "UNKNOWN_MSGID", "#otherChan", msgid, ANYSTR],
)
else:
self.assertMessageMatch(
msg,
command="FAIL",
params=["REDACT", "REDACT_FORBIDDEN", "#otherChan", ANYSTR],
)
self.assertEqual(self.getMessages(2), [])
@cases.mark_specifications("IRCv3")
@cases.mark_capabilities(*CAPABILITIES)
@cases.mark_services
@pytest.mark.private_chathistory
class PmRedactTestCase(cases.BaseServerTestCase):
"""Tests REDACT command in private messages between authenticated accounts"""
def _setupRedactTest(self, chathistory=False):
capabilities = [*CAPABILITIES, "sasl"]
if chathistory:
capabilities.extend(["batch", "draft/chathistory"])
self.controller.registerUser(self, "sender", "senderpass")
self.controller.registerUser(self, "recipient", "recipientpass")
self.connectClient(
"sender",
password="senderpass",
capabilities=capabilities,
skip_if_cap_nak=True,
)
self.connectClient(
"recipient",
password="recipientpass",
capabilities=capabilities,
skip_if_cap_nak=True,
)
self.getMessages(2) # synchronize
self.getMessages(1)
self.sendLine(1, "@label=1234 PRIVMSG recipient :hello there")
echo = self.getMessage(1)
self.assertMessageMatch(
echo,
tags={"label": "1234", "msgid": StrRe("[^ ]+"), **ANYDICT},
prefix=StrRe("sender!.*"),
command="PRIVMSG",
params=["recipient", "hello there"],
)
msgid = echo.tags["msgid"]
self.assertMessageMatch(
self.getMessage(2),
tags={"msgid": msgid, **ANYDICT},
prefix=StrRe("sender!.*"),
command="PRIVMSG",
params=["recipient", "hello there"],
)
return msgid
def testRelaySenderRedact(self):
"""Someone writes a message in private and redacts it themselves."""
msgid = self._setupRedactTest()
self.sendLine(1, f"REDACT recipient {msgid} :oops")
self.assertMessageMatch(
self.getMessage(1),
prefix=StrRe("sender!.*"),
command="REDACT",
params=["recipient", msgid, "oops"],
)
self.assertMessageMatch(
self.getMessage(2),
prefix=StrRe("sender!.*"),
command="REDACT",
params=["recipient", msgid, "oops"],
)
def testRelayRecipientRedact(self):
"""Someone writes a message in private and their recipient redacts it.
Servers may either accept or reject this."""
msgid = self._setupRedactTest()
self.sendLine(2, f"REDACT sender {msgid} :oops")
msg = self.getMessage(2)
if msg.command == "REDACT":
self.assertMessageMatch(
msg,
prefix=StrRe("recipient!.*"),
command="REDACT",
params=["sender", msgid, "oops"],
)
self.assertMessageMatch(
self.getMessage(1),
prefix=StrRe("user!.*"),
command="REDACT",
params=["sender", msgid, "oops"],
)
else:
self.assertMessageMatch(
msg,
command="FAIL",
params=[
"REDACT",
StrRe("(REDACT_FORBIDDEN|UNKNOWN_MSGID)"),
"sender",
msgid,
ANYSTR,
],
)
self.assertEqual(self.getMessages(1), [])
@pytest.mark.parametrize("nick", ["sender", "recipient"])
def testRejectRedactOtherUser(self, nick):
"""Someone writes a message in private to someone else and an unrelated person
attempts to redact it."""
msgid = self._setupRedactTest()
self.controller.registerUser(self, "censor", "censorpass")
self.connectClient(
"censor",
password="censorpass",
capabilities=[*CAPABILITIES, "sasl"],
skip_if_cap_nak=True,
)
self.getMessages(3) # synchronize
self.sendLine(3, f"REDACT {nick} {msgid} :oops")
self.assertMessageMatch(
self.getMessage(3),
command="FAIL",
params=[
"REDACT",
StrRe("(REDACT_FORBIDDEN|UNKNOWN_MSGID)"),
nick,
msgid,
ANYSTR,
],
)
self.assertEqual(self.getMessages(1), [])
self.assertEqual(self.getMessages(2), [])
@pytest.mark.parametrize(
"chathistory_requester",
[
pytest.param(1, id="chathistory-to-sender"),
pytest.param(2, id="chathistory-to-recipient"),
],
)
@pytest.mark.private_chathistory
def testSenderRedactChathistory(self, chathistory_requester):
"""Channel op writes a message and redacts it themselves; both the op
and a regular user check the chathistory afterward.
https://github.com/progval/ircv3-specifications/blob/redaction/extensions/message-redaction.md#chat-history
"""
msgid = self._setupRedactTest(chathistory=True)
self.sendLine(1, f"REDACT recipient {msgid} :oops")
self.assertMessageMatch(
self.getMessage(1),
prefix=StrRe("sender!.*"),
command="REDACT",
params=["recipient", msgid, "oops"],
)
self.getMessages(1)
self.getMessages(2)
if chathistory_requester == 1:
others_nick = "recipient"
else:
others_nick = "sender"
self.sendLine(chathistory_requester, f"CHATHISTORY LATEST {others_nick} * 10")
(start_msg, *msgs, end_msg) = self.getMessages(chathistory_requester)
self.assertMessageMatch(
start_msg,
command="BATCH",
params=[StrRe(r"\+.+"), "chathistory", others_nick],
)
batch_tag = start_msg.params[0][1:]
# remove Ergo's event-playback fallback
msgs = [msg for msg in msgs if not msg.prefix.startswith("HistServ!")]
self.assertMessageMatch(end_msg, command="BATCH", params=["-" + batch_tag])
if len(msgs) == 0:
pass # Server removed the message entirely
elif len(msgs) == 1:
# Server replaced with the REDACT
self.assertMessageMatch(
msgs[0],
prefix=StrRe("sender!.*"),
command="REDACT",
params=["recipient", msgid, "oops"],
)
elif len(msgs) == 2:
# Server appended the REDACT
self.assertMessageMatch(
msgs[0],
tags={"msgid": msgid, **ANYDICT},
command="PRIVMSG",
params=["recipient", msgid, "hello there"],
)
self.assertMessageMatch(
msgs[1],
prefix=StrRe("sender!.*"),
command="REDACT",
params=["recipient", msgid, "oops"],
)
else:
self.assertTrue(False, fail_msg=f"Unexpectedly many messages: {msgs}")
def testRedactNonExistant(self):
"""Someone writes a message in private to someone else and redacts a random
non-existant id."""
self._setupRedactTest()
nonexistent_msgid = str(uuid.uuid4())
self.sendLine(1, f"REDACT recipient {nonexistent_msgid} :oops")
self.assertMessageMatch(
self.getMessage(1),
command="FAIL",
params=["REDACT", "UNKNOWN_MSGID", "recipient", nonexistent_msgid, ANYSTR],
)
self.assertEqual(self.getMessages(2), [])
def testOpRedactWrongChan(self):
"""Channel op writes a message and redacts it, but uses the wrong channel
as target."""
msgid = self._setupRedactTest()
self.sendLine(1, "JOIN #otherChan")
self.getMessages(1)
self.sendLine(1, f"REDACT #otherChan {msgid} :oops")
self.assertMessageMatch(
self.getMessage(1),
command="FAIL",
params=["REDACT", "UNKNOWN_MSGID", "#otherChan", msgid, ANYSTR],
)
self.assertEqual(self.getMessages(2), [])

View File

@ -201,6 +201,10 @@ class WhowasTestCase(cases.BaseServerTestCase):
) )
@cases.mark_specifications("RFC1459", "RFC2812", "Modern") @cases.mark_specifications("RFC1459", "RFC2812", "Modern")
@cases.xfailIfSoftware(
["InspIRCd"],
"Feature not released yet: https://github.com/inspircd/inspircd/pull/1967",
)
def testWhowasMultiple(self): def testWhowasMultiple(self):
""" """
"The history is searched backward, returning the most recent entry first." "The history is searched backward, returning the most recent entry first."
@ -211,6 +215,10 @@ class WhowasTestCase(cases.BaseServerTestCase):
self._testWhowasMultiple(second_result=True, whowas_command="WHOWAS nick2") self._testWhowasMultiple(second_result=True, whowas_command="WHOWAS nick2")
@cases.mark_specifications("RFC1459", "RFC2812", "Modern") @cases.mark_specifications("RFC1459", "RFC2812", "Modern")
@cases.xfailIfSoftware(
["InspIRCd"],
"Feature not released yet: https://github.com/inspircd/inspircd/pull/1968",
)
def testWhowasCount1(self): def testWhowasCount1(self):
""" """
"If there are multiple entries, up to <count> replies will be returned" "If there are multiple entries, up to <count> replies will be returned"
@ -221,6 +229,10 @@ class WhowasTestCase(cases.BaseServerTestCase):
self._testWhowasMultiple(second_result=False, whowas_command="WHOWAS nick2 1") self._testWhowasMultiple(second_result=False, whowas_command="WHOWAS nick2 1")
@cases.mark_specifications("RFC1459", "RFC2812", "Modern") @cases.mark_specifications("RFC1459", "RFC2812", "Modern")
@cases.xfailIfSoftware(
["InspIRCd"],
"Feature not released yet: https://github.com/inspircd/inspircd/pull/1968",
)
def testWhowasCount2(self): def testWhowasCount2(self):
""" """
"If there are multiple entries, up to <count> replies will be returned" "If there are multiple entries, up to <count> replies will be returned"
@ -231,6 +243,10 @@ class WhowasTestCase(cases.BaseServerTestCase):
self._testWhowasMultiple(second_result=True, whowas_command="WHOWAS nick2 2") self._testWhowasMultiple(second_result=True, whowas_command="WHOWAS nick2 2")
@cases.mark_specifications("RFC1459", "RFC2812", "Modern") @cases.mark_specifications("RFC1459", "RFC2812", "Modern")
@cases.xfailIfSoftware(
["InspIRCd"],
"Feature not released yet: https://github.com/inspircd/inspircd/pull/1968",
)
def testWhowasCountNegative(self): def testWhowasCountNegative(self):
""" """
"If a non-positive number is passed as being <count>, then a full search "If a non-positive number is passed as being <count>, then a full search
@ -248,6 +264,10 @@ class WhowasTestCase(cases.BaseServerTestCase):
@cases.xfailIfSoftware( @cases.xfailIfSoftware(
["ircu2"], "Fix not released yet: https://github.com/UndernetIRC/ircu2/pull/19" ["ircu2"], "Fix not released yet: https://github.com/UndernetIRC/ircu2/pull/19"
) )
@cases.xfailIfSoftware(
["InspIRCd"],
"Feature not released yet: https://github.com/inspircd/inspircd/pull/1967",
)
def testWhowasCountZero(self): def testWhowasCountZero(self):
""" """
"If a non-positive number is passed as being <count>, then a full search "If a non-positive number is passed as being <count>, then a full search

View File

@ -35,7 +35,6 @@ class Capabilities(enum.Enum):
EXTENDED_JOIN = "extended-join" EXTENDED_JOIN = "extended-join"
EXTENDED_MONITOR = "extended-monitor" EXTENDED_MONITOR = "extended-monitor"
LABELED_RESPONSE = "labeled-response" LABELED_RESPONSE = "labeled-response"
MESSAGE_REDACTION = "draft/message-redaction"
MESSAGE_TAGS = "message-tags" MESSAGE_TAGS = "message-tags"
MULTILINE = "draft/multiline" MULTILINE = "draft/multiline"
MULTI_PREFIX = "multi-prefix" MULTI_PREFIX = "multi-prefix"
@ -53,6 +52,7 @@ class Capabilities(enum.Enum):
@enum.unique @enum.unique
class IsupportTokens(enum.Enum): class IsupportTokens(enum.Enum):
ACCOUNTEXTBAN = "ACCOUNTEXTBAN"
BOT = "BOT" BOT = "BOT"
ELIST = "ELIST" ELIST = "ELIST"
INVEX = "INVEX" INVEX = "INVEX"

View File

@ -65,7 +65,7 @@ def get_install_steps(*, software_config, software_id, version_flavor):
install_steps = [ install_steps = [
{ {
"name": f"Checkout {name}", "name": f"Checkout {name}",
"uses": "actions/checkout@v3", "uses": "actions/checkout@v2",
"with": { "with": {
"repository": software_config["repository"], "repository": software_config["repository"],
"ref": ref, "ref": ref,
@ -94,7 +94,7 @@ def get_build_job(*, software_config, software_id, version_flavor):
cache = [ cache = [
{ {
"name": "Cache dependencies", "name": "Cache dependencies",
"uses": "actions/cache@v3", "uses": "actions/cache@v2",
"with": { "with": {
"path": f"~/.cache\n${{ github.workspace }}/{path}\n", "path": f"~/.cache\n${{ github.workspace }}/{path}\n",
"key": "3-${{ runner.os }}-" "key": "3-${{ runner.os }}-"
@ -123,10 +123,10 @@ def get_build_job(*, software_config, software_id, version_flavor):
"run": "cd ~/; mkdir -p .local/ go/", "run": "cd ~/; mkdir -p .local/ go/",
}, },
*cache, *cache,
{"uses": "actions/checkout@v3"}, {"uses": "actions/checkout@v2"},
{ {
"name": "Set up Python 3.7", "name": "Set up Python 3.7",
"uses": "actions/setup-python@v4", "uses": "actions/setup-python@v2",
"with": {"python-version": 3.7}, "with": {"python-version": 3.7},
}, },
*install_steps, *install_steps,
@ -159,7 +159,7 @@ def get_test_job(*, config, test_config, test_id, version_flavor, jobs):
downloads.append( downloads.append(
{ {
"name": "Download build artefacts", "name": "Download build artefacts",
"uses": "actions/download-artifact@v3", "uses": "actions/download-artifact@v2",
"with": {"name": f"installed-{software_id}", "path": "~"}, "with": {"name": f"installed-{software_id}", "path": "~"},
} }
) )
@ -194,10 +194,10 @@ def get_test_job(*, config, test_config, test_id, version_flavor, jobs):
"runs-on": "ubuntu-20.04", "runs-on": "ubuntu-20.04",
"needs": needs, "needs": needs,
"steps": [ "steps": [
{"uses": "actions/checkout@v3"}, {"uses": "actions/checkout@v2"},
{ {
"name": "Set up Python 3.7", "name": "Set up Python 3.7",
"uses": "actions/setup-python@v4", "uses": "actions/setup-python@v2",
"with": {"python-version": 3.7}, "with": {"python-version": 3.7},
}, },
*downloads, *downloads,
@ -231,7 +231,7 @@ def get_test_job(*, config, test_config, test_id, version_flavor, jobs):
{ {
"name": "Publish results", "name": "Publish results",
"if": "always()", "if": "always()",
"uses": "actions/upload-artifact@v3", "uses": "actions/upload-artifact@v2",
"with": { "with": {
"name": f"pytest-results_{test_id}_{version_flavor.value}", "name": f"pytest-results_{test_id}_{version_flavor.value}",
"path": "pytest.xml", "path": "pytest.xml",
@ -250,7 +250,7 @@ def upload_steps(software_id):
}, },
{ {
"name": "Upload build artefacts", "name": "Upload build artefacts",
"uses": "actions/upload-artifact@v3", "uses": "actions/upload-artifact@v2",
"with": { "with": {
"name": f"installed-{software_id}", "name": f"installed-{software_id}",
"path": "~/artefacts-*.tar.gz", "path": "~/artefacts-*.tar.gz",
@ -311,10 +311,10 @@ def generate_workflow(config: dict, version_flavor: VersionFlavor):
# this job then # this job then
"if": "success() || failure()", "if": "success() || failure()",
"steps": [ "steps": [
{"uses": "actions/checkout@v3"}, {"uses": "actions/checkout@v2"},
{ {
"name": "Download Artifacts", "name": "Download Artifacts",
"uses": "actions/download-artifact@v3", "uses": "actions/download-artifact@v2",
"with": {"path": "artifacts"}, "with": {"path": "artifacts"},
}, },
{ {

View File

@ -26,7 +26,6 @@ markers =
extended-join extended-join
extended-monitor extended-monitor
labeled-response labeled-response
draft/message-redaction
message-tags message-tags
draft/multiline draft/multiline
multi-prefix multi-prefix
@ -35,6 +34,7 @@ markers =
sts sts
# isupport tokens # isupport tokens
ACCOUNTEXTBAN
BOT BOT
ELIST ELIST
INVEX INVEX

View File

@ -143,7 +143,7 @@ software:
name: InspIRCd name: InspIRCd
repository: inspircd/inspircd repository: inspircd/inspircd
refs: &inspircd_refs refs: &inspircd_refs
stable: v3.15.0 stable: v3.12.0
release: null release: null
devel: master devel: master
devel_release: insp3 devel_release: insp3
@ -153,13 +153,9 @@ software:
separate_build_job: true separate_build_job: true
build_script: &inspircd_build_script | build_script: &inspircd_build_script |
cd $GITHUB_WORKSPACE/inspircd/ cd $GITHUB_WORKSPACE/inspircd/
patch src/inspircd.cpp < $GITHUB_WORKSPACE/patches/inspircd_mainloop.patch
# Insp3 <= 3.16.0 and Insp4 <= 4.0.0a21 don't support -DINSPIRCD_UNLIMITED_MAINLOOP
patch src/inspircd.cpp < $GITHUB_WORKSPACE/patches/inspircd_mainloop.patch || true
./configure --prefix=$HOME/.local/inspircd --development ./configure --prefix=$HOME/.local/inspircd --development
make -j 4
CXXFLAGS=-DINSPIRCD_UNLIMITED_MAINLOOP make -j 4
make install make install
irc2: irc2:
name: irc2 name: irc2
@ -272,8 +268,8 @@ software:
name: UnrealIRCd 6 name: UnrealIRCd 6
repository: unrealircd/unrealircd repository: unrealircd/unrealircd
refs: refs:
stable: da3c1c654481a33035b9c703957e1c25d0158259 # 6.0.7 stable: cedd23ae9cdd5985ce16e9869cbdb808479c3fc4 # 6.0.3
release: da3c1c654481a33035b9c703957e1c25d0158259 # 6.0.7 release: cedd23ae9cdd5985ce16e9869cbdb808479c3fc4 # 6.0.3
devel: unreal60_dev devel: unreal60_dev
devel_release: null devel_release: null
path: unrealircd path: unrealircd
@ -289,7 +285,6 @@ software:
CFLAGS="-O0 -march=x86-64" CXXFLAGS="$CFLAGS" ./Config -quick CFLAGS="-O0 -march=x86-64" CXXFLAGS="$CFLAGS" ./Config -quick
make -j 4 make -j 4
make install make install
~/.local/unrealircd/unrealircd module install third/react
# Prevent download of geoIP database on first startup # Prevent download of geoIP database on first startup
sed -i 's/loadmodule "geoip_classic";//' ~/.local/unrealircd/conf/modules.default.conf sed -i 's/loadmodule "geoip_classic";//' ~/.local/unrealircd/conf/modules.default.conf