diff --git a/.github/csc.json b/.forgejo/csc.json similarity index 100% rename from .github/csc.json rename to .forgejo/csc.json diff --git a/.github/labeler.yml b/.forgejo/labeler.yml similarity index 90% rename from .github/labeler.yml rename to .forgejo/labeler.yml index b80dbb1fb..3fe991a18 100644 --- a/.github/labeler.yml +++ b/.forgejo/labeler.yml @@ -36,7 +36,7 @@ kernel: infra: - changed-files: - - any-glob-to-any-file: ['.github/**', 'distribution/**', 'Directory.Packages.props', 'src/Ryujinx.BuildValidationTasks/**'] + - any-glob-to-any-file: ['.forgejo/**', 'distribution/**', 'Directory.Packages.props', 'src/Ryujinx.BuildValidationTasks/**'] documentation: - changed-files: diff --git a/.github/reviewers.yml b/.forgejo/reviewers.yml similarity index 100% rename from .github/reviewers.yml rename to .forgejo/reviewers.yml diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml new file mode 100644 index 000000000..3a23f2ae8 --- /dev/null +++ b/.forgejo/workflows/build.yml @@ -0,0 +1,197 @@ +name: Build PR + +on: + pull_request: + branches: [ master ] + paths: + - '**' + - '!.forgejo/**' + - '!*.yml' + - '!*.config' + - '!*.md' + - '.forgejo/workflows/*.yml' + +env: + POWERSHELL_TELEMETRY_OPTOUT: 1 + DOTNET_CLI_TELEMETRY_OPTOUT: 1 + RELEASE: 0 + +jobs: + build: + name: ${{ matrix.platform.name }} (${{ matrix.configuration }}) + runs-on: docker + container: + image: ghcr.io/catthehacker/ubuntu:act-latest + timeout-minutes: 45 + strategy: + matrix: + configuration: [Release] + platform: + - { name: win-x64, zip_os_name: win_x64 } + #- { name: win-arm64, zip_os_name: win_arm64 } + - { name: linux-x64, zip_os_name: linux_x64 } + - { name: linux-arm64, zip_os_name: linux_arm64 } + #- { name: osx-x64, zip_os_name: osx_x64 } + + fail-fast: false + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-dotnet@v4 + with: + global-json-file: global.json + + - name: Install GLI + uses: actions/setup-gli@v1 + with: + token: ${{ secrets.SETUP_GLI_TOKEN }} + + - name: Overwrite csc problem matcher + run: echo "::add-matcher::.forgejo/csc.json" + + - name: Get version info + id: version_info + run: | + echo "result=$(gli get-next-version -c Stable -R)" >> $FORGEJO_OUTPUT + echo "git_short_hash=$(git rev-parse --short "${{ forgejo.sha }}")" >> $FORGEJO_OUTPUT + shell: bash + + - name: Change config filename + run: sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/PRConfig\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs + shell: bash + if: forgejo.event_name == 'pull_request' + + - name: 'Cache: ~/.nuget/packages' + uses: actions/cache@v5 + with: + path: | + ~/.nuget/packages + key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} + + - name: Build + run: dotnet build -c "${{ matrix.configuration }}" -p:Version="${{ steps.version_info.outputs.result }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:ExtraDefineConstants=DISABLE_UPDATER + + - name: Test + uses: actions/unstable-commands@v1 + with: + commands: dotnet test --no-build -c "${{ matrix.configuration }}" + timeout-minutes: 10 + retry-codes: 139 + if: matrix.platform.name != 'linux-arm64' + + - name: Publish Ryujinx + run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ steps.version_info.outputs.result }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained + if: forgejo.event_name == 'pull_request' + + - name: Set executable bit + run: | + chmod +x ./publish/Ryujinx ./publish/Ryujinx.sh + if: forgejo.event_name == 'pull_request' && contains(matrix.platform.name, 'linux') + + - name: Build AppImage + if: forgejo.event_name == 'pull_request' && contains(matrix.platform.name, 'linux') + run: | + PLATFORM_NAME="${{ matrix.platform.name }}" + + sudo apt update && sudo apt install -y zsync desktop-file-utils appstream libfuse2t64 + + mkdir -p tools + export PATH="$PATH:$(readlink -f tools)" + + # Setup appimagetool + wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" + chmod +x tools/appimagetool + chmod +x distribution/linux/appimage/build-appimage.sh + + # Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name) + if [ "$PLATFORM_NAME" = "linux-x64" ]; then + ARCH_NAME=x64 + export ARCH=x86_64 + elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then + ARCH_NAME=arm64 + export ARCH=aarch64 + else + echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME"" + exit 1 + fi + + BUILDDIR=publish OUTDIR=publish_appimage distribution/linux/appimage/build-appimage.sh + shell: bash + + - name: Upload Ryujinx artifact + uses: actions/upload-artifact@v4 + with: + name: ryujinx-${{ matrix.configuration }}-${{ steps.version_info.outputs.result }}+${{ steps.version_info.outputs.git_short_hash }}-${{ matrix.platform.zip_os_name }} + path: publish + if: forgejo.event_name == 'pull_request' + + - name: Upload Ryujinx (AppImage) artifact + uses: actions/upload-artifact@v4 + if: forgejo.event_name == 'pull_request' && contains(matrix.platform.name, 'linux') + with: + name: ryujinx-${{ matrix.configuration }}-${{ steps.version_info.outputs.result }}+${{ steps.version_info.outputs.git_short_hash }}-${{ matrix.platform.zip_os_name }}-AppImage + path: publish_appimage + + build_macos: + name: macOS Universal (${{ matrix.configuration }}) + runs-on: ubuntu-latest + timeout-minutes: 45 + strategy: + matrix: + configuration: [ Release ] + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-dotnet@v4 + with: + global-json-file: global.json + + - name: Setup LLVM 17 + run: | + wget https://apt.llvm.org/llvm.sh + chmod +x llvm.sh + sudo ./llvm.sh 17 + + - name: Install GLI + uses: actions/setup-gli@v1 + with: + token: ${{ secrets.SETUP_GLI_TOKEN }} + + - name: Install rcodesign + run: | + gli ghr -R indygreg/apple-platform-rs -p apple-codesign-*-x86_64-unknown-linux-musl.tar.gz -O apple-codesign.tar.gz + tar -xzvf apple-codesign.tar.gz --wildcards '*/rcodesign' --strip-components=1 + rm apple-codesign.tar.gz + sudo mv rcodesign /usr/bin/rcodesign + + - name: Get version info + id: version_info + run: | + echo "result=$(gli get-next-version -c Stable -R)" >> $FORGEJO_OUTPUT + echo "git_short_hash=$(git rev-parse --short "${{ forgejo.sha }}")" >> $FORGEJO_OUTPUT + shell: bash + + - name: Change config filename + run: sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/PRConfig\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs + shell: bash + if: forgejo.event_name == 'pull_request' + + - name: 'Cache: ~/.nuget/packages' + uses: actions/cache@v5 + with: + path: | + ~/.nuget/packages + key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} + + - name: Publish macOS Ryujinx + run: | + bash distribution/macos/create_macos_pr_build_ava.sh . publish_tmp publish ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.result }}" "${{ steps.version_info.outputs.git_short_hash }}" "${{ matrix.configuration }}" "-p:ExtraDefineConstants=DISABLE_UPDATER" + shell: bash + + - name: Upload Ryujinx artifact + uses: actions/upload-artifact@v4 + with: + name: ryujinx-${{ matrix.configuration }}-${{ steps.version_info.outputs.result }}+${{ steps.version_info.outputs.git_short_hash }}-macos_universal + path: "publish/*.tar.gz" + if: forgejo.event_name == 'pull_request' diff --git a/.github/workflows/canary.yml b/.forgejo/workflows/canary.yml similarity index 59% rename from .github/workflows/canary.yml rename to .forgejo/workflows/canary.yml index 18e00b6d2..cd8f3aa1d 100644 --- a/.github/workflows/canary.yml +++ b/.forgejo/workflows/canary.yml @@ -6,7 +6,7 @@ on: push: branches: [ master ] paths-ignore: - - '.github/**' + - '.forgejo/**' - 'docs/**' - 'assets/**' - '*.yml' @@ -25,44 +25,41 @@ env: jobs: release: name: Release for ${{ matrix.platform.name }} - runs-on: ${{ matrix.platform.os }} + runs-on: docker + container: + image: ${{ matrix.platform.os }} strategy: matrix: platform: - - { name: win-x64, os: ubuntu-latest, zip_os_name: win_x64 } - #- { name: win-arm64, os: ubuntu-latest, zip_os_name: win_arm64 } - - { name: linux-x64, os: ubuntu-latest, zip_os_name: linux_x64 } - - { name: linux-arm64, os: ubuntu-latest, zip_os_name: linux_arm64 } + - { name: win-x64, os: ghcr.io/catthehacker/ubuntu:act-latest, zip_os_name: win_x64 } + #- { name: win-arm64, os: ghcr.io/catthehacker/ubuntu:act-latest, zip_os_name: win_arm64 } + - { name: linux-x64, os: ghcr.io/catthehacker/ubuntu:act-latest, zip_os_name: linux_x64 } + - { name: linux-arm64, os: ghcr.io/catthehacker/ubuntu:act-latest, zip_os_name: linux_arm64 } steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - - uses: actions/setup-dotnet@v4 + - uses: actions/setup-dotnet@v5 with: global-json-file: global.json - name: Overwrite csc problem matcher - run: echo "::add-matcher::.github/csc.json" + run: echo "::add-matcher::.forgejo/csc.json" + + - name: Install GLI + uses: actions/setup-gli@v1 + with: + token: ${{ secrets.SETUP_GLI_TOKEN }} - name: Install 7zip run: | - sudo apt install -y 7zip - - - name: Install gli - run: | - mkdir -p $HOME/.bin - gh release download -R GreemDev/GLI -O gli -p 'gli-linux-x64' - chmod +x gli - mv gli $HOME/.bin/ - echo "$HOME/.bin" >> $GITHUB_PATH - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + sudo apt update && sudo apt install -y 7zip - name: Get version info id: version_info run: | - echo "build_version=$(gli get-next-version -c Canary -R)" >> $GITHUB_OUTPUT - echo "prev_build_version=$(gli get-current-version -c Canary -R)" >> $GITHUB_OUTPUT - echo "git_short_hash=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT + echo "build_version=$(gli get-next-version -c Canary -R)" >> $FORGEJO_OUTPUT + echo "prev_build_version=$(gli get-current-version -c Canary -R)" >> $FORGEJO_OUTPUT + echo "git_short_hash=$(git rev-parse --short "${{ forgejo.sha }}")" >> $FORGEJO_OUTPUT shell: bash - name: Configure for release @@ -88,11 +85,7 @@ jobs: rm libarmeilleure-jitsupport.dylib 7z a ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish popd - - gli upload-generic-package -T ${{ secrets.GITLAB_TOKEN }} -P ryubing/canary -n Ryubing-Canary -v ${{ steps.version_info.outputs.build_version }} -r 5 -p release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip shell: bash - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Packing Linux builds if: contains(matrix.platform.name, 'linux') @@ -102,8 +95,6 @@ jobs: chmod +x Ryujinx.sh Ryujinx tar -czvf ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish popd - - gli upload-generic-package -T ${{ secrets.GITLAB_TOKEN }} -P ryubing/canary -n Ryubing-Canary -v ${{ steps.version_info.outputs.build_version }} -r 5 -p release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz shell: bash - name: Build AppImage (Linux) @@ -112,7 +103,7 @@ jobs: BUILD_VERSION="${{ steps.version_info.outputs.build_version }}" PLATFORM_NAME="${{ matrix.platform.name }}" - sudo apt install -y zsync desktop-file-utils appstream + sudo apt update && sudo apt install -y zsync desktop-file-utils appstream libfuse2t64 mkdir -p tools export PATH="$PATH:$(readlink -f tools)" @@ -139,17 +130,27 @@ jobs: pushd publish_appimage mv Ryujinx.AppImage ../release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage popd - - gli upload-generic-package -T ${{ secrets.GITLAB_TOKEN }} -P ryubing/canary -n Ryubing-Canary -v ${{ steps.version_info.outputs.build_version }} -r 5 -p release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage shell: bash + - name: Create release + uses: actions/create-release@v1 + with: + name: "Canary ${{ steps.version_info.outputs.build_version }}" + repository: "Ryubing/Canary" + token: ${{ secrets.RELEASER_TOKEN }} + tag_name: ${{ steps.version_info.outputs.build_version }} + files: |- + release_output/** + macos_release: name: Release MacOS universal - runs-on: ubuntu-24.04 + runs-on: docker + container: + image: ghcr.io/catthehacker/ubuntu:act-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - - uses: actions/setup-dotnet@v4 + - uses: actions/setup-dotnet@v5 with: global-json-file: global.json @@ -159,33 +160,24 @@ jobs: chmod +x llvm.sh sudo ./llvm.sh 17 - - name: Install gli - run: | - mkdir -p $HOME/.bin - gh release download -R GreemDev/GLI -O gli -p 'gli-linux-x64' - chmod +x gli - mv gli $HOME/.bin/ - echo "$HOME/.bin" >> $GITHUB_PATH - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Install GLI + uses: actions/setup-gli@v1 + with: + token: ${{ secrets.SETUP_GLI_TOKEN }} - name: Install rcodesign run: | - mkdir -p $HOME/.bin - gh release download -R indygreg/apple-platform-rs -O apple-codesign.tar.gz -p 'apple-codesign-*-x86_64-unknown-linux-musl.tar.gz' + gli ghr -R indygreg/apple-platform-rs -p apple-codesign-*-x86_64-unknown-linux-musl.tar.gz -O apple-codesign.tar.gz tar -xzvf apple-codesign.tar.gz --wildcards '*/rcodesign' --strip-components=1 rm apple-codesign.tar.gz - mv rcodesign $HOME/.bin/ - echo "$HOME/.bin" >> $GITHUB_PATH - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + mv rcodesign /usr/bin/rcodesign - name: Get version info id: version_info run: | - echo "build_version=$(gli get-next-version -c Canary -R)" >> $GITHUB_OUTPUT - echo "prev_build_version=$(gli get-current-version -c Canary -R)" >> $GITHUB_OUTPUT - echo "git_short_hash=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT + echo "build_version=$(gli get-next-version -c Canary -R)" >> $FORGEJO_OUTPUT + echo "prev_build_version=$(gli get-current-version -c Canary -R)" >> $FORGEJO_OUTPUT + echo "git_short_hash=$(git rev-parse --short "${{ forgejo.sha }}")" >> $FORGEJO_OUTPUT shell: bash - name: Configure for release @@ -201,46 +193,52 @@ jobs: - name: Publish macOS Ryujinx run: | ./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish_ava ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 1 - gli upload-generic-package -T ${{ secrets.GITLAB_TOKEN }} -P ryubing/canary -n Ryubing-Canary -v ${{ steps.version_info.outputs.build_version }} -r 5 -p publish_ava/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz - create_gitlab_release: - name: Create GitLab Release - runs-on: ubuntu-24.04 + - name: Create release + uses: actions/create-release@v1 + with: + name: "Canary ${{ steps.version_info.outputs.build_version }}" + repository: "Ryubing/Canary" + token: ${{ secrets.RELEASER_TOKEN }} + tag_name: ${{ steps.version_info.outputs.build_version }} + files: |- + publish_ava/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz + + post_ci: + name: Post CI Steps + runs-on: docker + container: + image: ghcr.io/catthehacker/ubuntu:act-latest needs: - macos_release - release steps: - uses: actions/checkout@v4 - - name: Install gli - run: | - mkdir -p $HOME/.bin - gh release download -R GreemDev/GLI -O gli -p 'gli-linux-x64' - chmod +x gli - mv gli $HOME/.bin/ - echo "$HOME/.bin" >> $GITHUB_PATH - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Install GLI + uses: actions/setup-gli@v1 + with: + token: ${{ secrets.SETUP_GLI_TOKEN }} - name: Get version info id: version_info run: | - echo "build_version=$(gli get-next-version -c Canary -R)" >> $GITHUB_OUTPUT - echo "prev_build_version=$(gli get-current-version -c Canary -R)" >> $GITHUB_OUTPUT - echo "git_short_hash=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT + echo "build_version=$(gli get-next-version -c Canary -R)" >> $FORGEJO_OUTPUT + echo "prev_build_version=$(gli get-current-version -c Canary -R)" >> $FORGEJO_OUTPUT + echo "git_short_hash=$(git rev-parse --short "${{ forgejo.sha }}")" >> $FORGEJO_OUTPUT shell: bash - name: Create tag run: | - gli create-tag -T ${{ secrets.GITLAB_TOKEN }} -P ryubing/ryujinx -n Canary-${{ steps.version_info.outputs.build_version }} -r ${{ steps.version_info.outputs.git_short_hash }} - - - name: Create release - run: | - gli create-release-from-generic-package-files -T ${{ secrets.GITLAB_TOKEN }} -P ryubing/canary -n Ryubing-Canary -v ${{ steps.version_info.outputs.build_version }} -r main -t "Canary ${{ steps.version_info.outputs.build_version }}" -b "**Full Changelog:** [${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}](https://git.ryujinx.app/ryubing/ryujinx/-/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }})" + gli create-tag -T ${{ secrets.RELEASER_TOKEN }} -P projects/Ryubing -n Canary-${{ steps.version_info.outputs.build_version }} -r ${{ steps.version_info.outputs.git_short_hash }} + - name: Link to actual source archives for Canary + run: | + gli canary-release -T ${{ secrets.RELEASER_TOKEN }} -P Ryubing/Canary -r ${{ steps.version_info.outputs.build_version }} + - name: Send notification webhook run: | - gli send-update-message -T ${{ secrets.GITLAB_TOKEN }} -P ryubing/canary -t ${{ steps.version_info.outputs.build_version }} -c FF4500 -w ${{ secrets.CANARY_DISCORD_WEBHOOK }} -i https://avatars.githubusercontent.com/u/192939710?s=200&v=4 + gli send-update-message -T ${{ secrets.RELEASER_TOKEN }} -P Ryubing/Canary -t ${{ steps.version_info.outputs.build_version }} -c FF4500 -w ${{ secrets.CANARY_DISCORD_WEBHOOK }} -i https://avatars.githubusercontent.com/u/192939710?s=200&v=4 - name: Notify update server of new builds run: | @@ -248,4 +246,4 @@ jobs: - name: Advance to the next version run: | - gli increment-version -T ${{ secrets.UPDATE_SERVER_ADMIN_TOKEN }} -c Canary + gli increment-version -T ${{ secrets.UPDATE_SERVER_ADMIN_TOKEN }} -c Canary \ No newline at end of file diff --git a/.github/workflows/pr_triage.yml b/.forgejo/workflows/pr_triage.yml similarity index 83% rename from .github/workflows/pr_triage.yml rename to .forgejo/workflows/pr_triage.yml index 2c4936159..954615d68 100644 --- a/.github/workflows/pr_triage.yml +++ b/.forgejo/workflows/pr_triage.yml @@ -5,10 +5,6 @@ on: jobs: triage: - permissions: - contents: read - pull-requests: write - runs-on: ubuntu-latest steps: @@ -18,11 +14,12 @@ jobs: with: # Ensure we pin the source origin as pull_request_target run under forks. fetch-depth: 0 - repository: GreemDev/Ryujinx + repository: projects/Ryubing ref: master - name: Update labels based on changes uses: actions/labeler@v5 with: + configuration-path: .forgejo/labeler.yml sync-labels: true dot: true diff --git a/.github/workflows/release.yml b/.forgejo/workflows/release.yml similarity index 61% rename from .github/workflows/release.yml rename to .forgejo/workflows/release.yml index 3c1b6f2de..ed9171f3d 100644 --- a/.github/workflows/release.yml +++ b/.forgejo/workflows/release.yml @@ -19,18 +19,20 @@ env: jobs: release: name: Release for ${{ matrix.platform.name }} - runs-on: ${{ matrix.platform.os }} + runs-on: docker + container: + image: ${{ matrix.platform.os }} strategy: matrix: platform: - - { name: win-x64, os: ubuntu-latest, zip_os_name: win_x64 } - #- { name: win-arm64, os: ubuntu-latest, zip_os_name: win_arm64 } - - { name: linux-x64, os: ubuntu-latest, zip_os_name: linux_x64 } - - { name: linux-arm64, os: ubuntu-latest, zip_os_name: linux_arm64 } + - { name: win-x64, os: ghcr.io/catthehacker/ubuntu:act-latest, zip_os_name: win_x64 } + #- { name: win-arm64, os: ghcr.io/catthehacker/ubuntu:act-latest, zip_os_name: win_arm64 } + - { name: linux-x64, os: ghcr.io/catthehacker/ubuntu:act-latest, zip_os_name: linux_x64 } + - { name: linux-arm64, os: ghcr.io/catthehacker/ubuntu:act-latest, zip_os_name: linux_arm64 } steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - - uses: actions/setup-dotnet@v4 + - uses: actions/setup-dotnet@v5 with: global-json-file: global.json @@ -41,26 +43,21 @@ jobs: run: | sudo apt install -y 7zip - - name: Install gli - run: | - mkdir -p $HOME/.bin - gh release download -R GreemDev/GLI -O gli -p 'gli-linux-x64' - chmod +x gli - mv gli $HOME/.bin/ - echo "$HOME/.bin" >> $GITHUB_PATH - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Install GLI + uses: actions/setup-gli@v1 + with: + token: ${{ secrets.SETUP_GLI_TOKEN }} - name: Get version info id: version_info run: | if [ '${{ inputs.is_bugfix_release }}' == 'false' ]; then - echo "build_version=$(gli get-next-version -m -c Stable -R)" >> $GITHUB_OUTPUT + echo "build_version=$(gli get-next-version -m -c Stable -R)" >> $FORGEJO_OUTPUT else - echo "build_version=$(gli get-next-version -c Stable -R)" >> $GITHUB_OUTPUT + echo "build_version=$(gli get-next-version -c Stable -R)" >> $FORGEJO_OUTPUT fi - echo "prev_build_version=$(gli get-current-version -c Stable -R)" >> $GITHUB_OUTPUT - echo "git_short_hash=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT + echo "prev_build_version=$(gli get-current-version -c Stable -R)" >> $FORGEJO_OUTPUT + echo "git_short_hash=$(git rev-parse --short "${{ forgejo.sha }}")" >> $FORGEJO_OUTPUT shell: bash - name: Configure for release @@ -85,11 +82,7 @@ jobs: rm libarmeilleure-jitsupport.dylib 7z a ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish popd - - gli upload-generic-package -T ${{ secrets.GITLAB_TOKEN }} -P ryubing/ryujinx -n Ryubing -v ${{ steps.version_info.outputs.build_version }} -r 5 -p release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip shell: bash - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Packing Linux builds if: contains(matrix.platform.name, 'linux') @@ -99,11 +92,7 @@ jobs: chmod +x Ryujinx.sh Ryujinx tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish popd - - gli upload-generic-package -T ${{ secrets.GITLAB_TOKEN }} -P ryubing/ryujinx -n Ryubing -v ${{ steps.version_info.outputs.build_version }} -r 5 -p release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz shell: bash - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Build AppImage (Linux) if: contains(matrix.platform.name, 'linux') @@ -138,17 +127,27 @@ jobs: pushd publish_appimage mv Ryujinx.AppImage ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage popd - - gli upload-generic-package -T ${{ secrets.GITLAB_TOKEN }} -P ryubing/ryujinx -n Ryubing -v ${{ steps.version_info.outputs.build_version }} -r 5 -p release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage shell: bash + - name: Create release + uses: actions/create-release@v1 + with: + name: "${{ steps.version_info.outputs.build_version }}" + repository: "projects/Ryubing" + token: ${{ secrets.RELEASER_TOKEN }} + tag_name: ${{ steps.version_info.outputs.build_version }} + files: |- + release_output/** + macos_release: name: Release MacOS universal - runs-on: ubuntu-24.04 + runs-on: docker + container: + image: ghcr.io/catthehacker/ubuntu:act-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - - uses: actions/setup-dotnet@v4 + - uses: actions/setup-dotnet@v5 with: global-json-file: global.json @@ -158,37 +157,28 @@ jobs: chmod +x llvm.sh sudo ./llvm.sh 17 - - name: Install gli - run: | - mkdir -p $HOME/.bin - gh release download -R GreemDev/GLI -O gli -p 'gli-linux-x64' - chmod +x gli - mv gli $HOME/.bin/ - echo "$HOME/.bin" >> $GITHUB_PATH - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Install GLI + uses: actions/setup-gli@v1 + with: + token: ${{ secrets.SETUP_GLI_TOKEN }} - name: Install rcodesign run: | - mkdir -p $HOME/.bin - gh release download -R indygreg/apple-platform-rs -O apple-codesign.tar.gz -p 'apple-codesign-*-x86_64-unknown-linux-musl.tar.gz' + gli ghr -R indygreg/apple-platform-rs -p apple-codesign-*-x86_64-unknown-linux-musl.tar.gz -O apple-codesign.tar.gz tar -xzvf apple-codesign.tar.gz --wildcards '*/rcodesign' --strip-components=1 rm apple-codesign.tar.gz - mv rcodesign $HOME/.bin/ - echo "$HOME/.bin" >> $GITHUB_PATH - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + mv rcodesign /usr/bin/rcodesign - name: Get version info id: version_info run: | if [ '${{ inputs.is_bugfix_release }}' == 'false' ]; then - echo "build_version=$(gli get-next-version -m -c Stable -R)" >> $GITHUB_OUTPUT + echo "build_version=$(gli get-next-version -m -c Stable -R)" >> $FORGEJO_OUTPUT else - echo "build_version=$(gli get-next-version -c Stable -R)" >> $GITHUB_OUTPUT + echo "build_version=$(gli get-next-version -c Stable -R)" >> $FORGEJO_OUTPUT fi - echo "prev_build_version=$(gli get-current-version -c Stable -R)" >> $GITHUB_OUTPUT - echo "git_short_hash=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT + echo "prev_build_version=$(gli get-current-version -c Stable -R)" >> $FORGEJO_OUTPUT + echo "git_short_hash=$(git rev-parse --short "${{ forgejo.sha }}")" >> $FORGEJO_OUTPUT shell: bash - name: Configure for release @@ -201,10 +191,18 @@ jobs: - name: Publish macOS Ryujinx run: | - ./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0 - - gli upload-generic-package -T ${{ secrets.GITLAB_TOKEN }} -P ryubing/ryujinx -n Ryubing -v ${{ steps.version_info.outputs.build_version }} -r 5 -p publish/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz - + bash distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0 + + - name: Create release + uses: actions/create-release@v1 + with: + name: "${{ steps.version_info.outputs.build_version }}" + repository: "projects/Ryubing" + token: ${{ secrets.RELEASER_TOKEN }} + tag_name: ${{ steps.version_info.outputs.build_version }} + files: |- + publish_ava/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz + create_gitlab_release: name: Create GitLab Release runs-on: ubuntu-24.04 @@ -214,36 +212,26 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Install gli - run: | - mkdir -p $HOME/.bin - gh release download -R GreemDev/GLI -O gli -p 'gli-linux-x64' - chmod +x gli - mv gli $HOME/.bin/ - echo "$HOME/.bin" >> $GITHUB_PATH - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Install GLI + uses: actions/setup-gli@v1 + with: + token: ${{ secrets.SETUP_GLI_TOKEN }} - name: Get version info id: version_info run: | if [ '${{ inputs.is_bugfix_release }}' == 'false' ]; then - echo "build_version=$(gli get-next-version -m -c Stable -R)" >> $GITHUB_OUTPUT + echo "build_version=$(gli get-next-version -m -c Stable -R)" >> $FORGEJO_OUTPUT else - echo "build_version=$(gli get-next-version -c Stable -R)" >> $GITHUB_OUTPUT + echo "build_version=$(gli get-next-version -c Stable -R)" >> $FORGEJO_OUTPUT fi - echo "prev_build_version=$(gli get-current-version -c Stable -R)" >> $GITHUB_OUTPUT - echo "git_short_hash=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT - echo "commit_message=$(git log -1 --pretty=%B)" >> $GITHUB_OUTPUT + echo "prev_build_version=$(gli get-current-version -c Stable -R)" >> $FORGEJO_OUTPUT + echo "git_short_hash=$(git rev-parse --short "${{ forgejo.sha }}")" >> $FORGEJO_OUTPUT shell: bash - - name: Create release - run: | - gli create-release-from-generic-package-files -T ${{ secrets.GITLAB_TOKEN }} -P ryubing/ryujinx -n Ryubing -v ${{ steps.version_info.outputs.build_version }} -r ${{ steps.version_info.outputs.git_short_hash }} -t "${{ steps.version_info.outputs.build_version }}" -b "msd:${{ steps.version_info.outputs.build_version }}" - - name: Send notification webhook run: | - gli send-update-message -T ${{ secrets.GITLAB_TOKEN }} -P ryubing/ryujinx -t ${{ steps.version_info.outputs.build_version }} -c 32cd32 -w ${{ secrets.STABLE_DISCORD_WEBHOOK }} -i https://avatars.githubusercontent.com/u/192939710?s=200&v=4 + gli send-update-message -T ${{ secrets.RELEASER_TOKEN }} -P projects/Ryubing -t ${{ steps.version_info.outputs.build_version }} -c 32cd32 -w ${{ secrets.STABLE_DISCORD_WEBHOOK }} -i https://avatars.githubusercontent.com/u/192939710?s=200&v=4 - name: Notify update server of new builds run: | diff --git a/.github/workflows/nightly_pr_comment.yml b/.forgejo/workflows/unused/nightly_pr_comment.yml similarity index 100% rename from .github/workflows/nightly_pr_comment.yml rename to .forgejo/workflows/unused/nightly_pr_comment.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml deleted file mode 100644 index 45f233dff..000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ /dev/null @@ -1,86 +0,0 @@ -name: Bug Report -description: File a bug report -title: "[Bug]" -labels: bug -body: - - type: textarea - id: issue - attributes: - label: Description of the issue - description: What's the issue you encountered? - validations: - required: true - - type: textarea - id: repro - attributes: - label: Reproduction steps - description: How can the issue be reproduced? - placeholder: Describe each step as precisely as possible - validations: - required: true - - type: textarea - id: log - attributes: - label: Log file - description: "A log file will help our developers to better diagnose and fix the issue. UPLOAD THE FILE. DO NOT COPY AND PASTE THE FILE'S CONTENT." - placeholder: Logs files can be found under "Logs" folder in Ryujinx program folder. They can also be accessed by opening Ryujinx, then going to File > Open Logs Folder. You can drag and drop the log on to the text area (do not copy paste). - validations: - required: true - - type: input - id: os - attributes: - label: OS - placeholder: "e.g. Windows 10" - validations: - required: true - - type: input - id: ryujinx-version - attributes: - label: Ryujinx version - placeholder: "e.g. 1.0.470" - validations: - required: true - - type: input - id: game-version - attributes: - label: Game version - placeholder: "e.g. 1.1.1" - validations: - required: false - - type: input - id: cpu - attributes: - label: CPU - placeholder: "e.g. i7-6700" - validations: - required: false - - type: input - id: gpu - attributes: - label: GPU - placeholder: "e.g. NVIDIA RTX 2070" - validations: - required: false - - type: input - id: ram - attributes: - label: RAM - placeholder: "e.g. 16GB" - validations: - required: false - - type: textarea - id: mods - attributes: - label: List of applied mods - placeholder: You can list applied mods here. - validations: - required: false - - type: textarea - id: additional-context - attributes: - label: Additional context? - description: | - - Additional info about your environment: - - Any other information relevant to your issue. - validations: - required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index abad80a3e..000000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,5 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: Ryujinx Discord - url: https://discord.gg/N2FmfVc - about: This is for development related issues. For support and technical issues, please come to our Discord server. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml deleted file mode 100644 index 399aa039c..000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Feature Request -description: Suggest a new feature for Ryujinx. -title: "[Feature Request]" -labels: enhancement -body: - - type: textarea - id: overview - attributes: - label: Overview - description: Include the basic, high-level concepts for this feature here. - validations: - required: true - - type: textarea - id: details - attributes: - label: Smaller details - description: These may include specific methods of implementation etc. - validations: - required: true - - type: textarea - id: request - attributes: - label: Nature of request - validations: - required: true - - type: textarea - id: feature - attributes: - label: Why would this feature be useful? - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/missing_cpu_instruction.yml b/.github/ISSUE_TEMPLATE/missing_cpu_instruction.yml deleted file mode 100644 index d815ddfd9..000000000 --- a/.github/ISSUE_TEMPLATE/missing_cpu_instruction.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Missing CPU Instruction -description: CPU Instruction is missing in Ryujinx. -title: "[CPU]" -labels: [cpu, not-implemented] -body: - - type: textarea - id: instruction - attributes: - label: CPU instruction - description: What CPU instruction is missing? - validations: - required: true - - type: textarea - id: name - attributes: - label: Instruction name - description: Include the name from [armconverter.com](https://armconverter.com/?disasm) or [shell-storm.org](http://shell-storm.org/online/Online-Assembler-and-Disassembler/?arch=arm64&endianness=big&dis_with_raw=True&dis_with_ins=True) in the above code block - validations: - required: true - - type: textarea - id: required - attributes: - label: Required by - description: Add links to the [compatibility list page(s)](https://github.com/Ryujinx/Ryujinx-Games-List/issues) of the game(s) that require this instruction. - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/missing_service_call.yml b/.github/ISSUE_TEMPLATE/missing_service_call.yml deleted file mode 100644 index 80aae533b..000000000 --- a/.github/ISSUE_TEMPLATE/missing_service_call.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Missing Service Call -description: Service call is missing in Ryujinx. -labels: not-implemented -body: - - type: textarea - id: instruction - attributes: - label: Service call - description: What service call is missing? - validations: - required: true - - type: textarea - id: name - attributes: - label: Service description - description: Include the description/explanation from [Switchbrew](https://switchbrew.org/w/index.php?title=Services_API) and/or [SwIPC](https://reswitched.github.io/SwIPC/) in the above code block - validations: - required: true - - type: textarea - id: required - attributes: - label: Required by - description: Add links to the [compatibility list page(s)](https://github.com/Ryujinx/Ryujinx-Games-List/issues) of the game(s) that require this service. - validations: - required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/missing_shader_instruction.yml b/.github/ISSUE_TEMPLATE/missing_shader_instruction.yml deleted file mode 100644 index df37859a5..000000000 --- a/.github/ISSUE_TEMPLATE/missing_shader_instruction.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Missing Shader Instruction -description: Shader Instruction is missing in Ryujinx. -title: "[GPU]" -labels: [gpu, not-implemented] -body: - - type: textarea - id: instruction - attributes: - label: Shader instruction - description: What shader instruction is missing? - validations: - required: true - - type: textarea - id: required - attributes: - label: Required by - description: Add links to the [compatibility list page(s)](https://github.com/Ryujinx/Ryujinx-Games-List/issues) of the game(s) that require this instruction. - validations: - required: true diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index a70dcc6f8..000000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,168 +0,0 @@ -name: Build job - -on: - workflow_call: - -env: - POWERSHELL_TELEMETRY_OPTOUT: 1 - DOTNET_CLI_TELEMETRY_OPTOUT: 1 - RYUJINX_BASE_VERSION: "1.2.0" - RELEASE: 0 - -jobs: - build: - name: ${{ matrix.platform.name }} (${{ matrix.configuration }}) - runs-on: ${{ matrix.platform.os }} - timeout-minutes: 45 - strategy: - matrix: - configuration: [Debug, Release] - platform: - - { name: win-x64, os: windows-latest, zip_os_name: win_x64 } - - { name: win-arm64, os: windows-latest, zip_os_name: win_arm64 } - - { name: linux-x64, os: ubuntu-latest, zip_os_name: linux_x64 } - - { name: linux-arm64, os: ubuntu-latest, zip_os_name: linux_arm64 } - - { name: osx-x64, os: macos-13, zip_os_name: osx_x64 } - - fail-fast: false - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-dotnet@v4 - with: - global-json-file: global.json - - - name: Overwrite csc problem matcher - run: echo "::add-matcher::.github/csc.json" - - - name: Get git short hash - id: git_short_hash - run: echo "result=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT - shell: bash - - - name: Change config filename - run: sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/PRConfig\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs - shell: bash - if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13' - - - name: Change config filename for macOS - run: sed -r -i '' 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/PRConfig\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs - shell: bash - if: github.event_name == 'pull_request' && matrix.platform.os == 'macos-13' - - - name: Build - run: dotnet build -c "${{ matrix.configuration }}" -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER - - - name: Test - uses: TSRBerry/unstable-commands@v1 - with: - commands: dotnet test --no-build -c "${{ matrix.configuration }}" - timeout-minutes: 10 - retry-codes: 139 - if: matrix.platform.name != 'linux-arm64' - - - name: Publish Ryujinx - run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained - if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13' - - - name: Set executable bit - run: | - chmod +x ./publish/Ryujinx ./publish/Ryujinx.sh - if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest' - - - name: Build AppImage - if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest' - run: | - PLATFORM_NAME="${{ matrix.platform.name }}" - - sudo apt install -y zsync desktop-file-utils appstream - - mkdir -p tools - export PATH="$PATH:$(readlink -f tools)" - - # Setup appimagetool - wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" - chmod +x tools/appimagetool - chmod +x distribution/linux/appimage/build-appimage.sh - - # Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name) - if [ "$PLATFORM_NAME" = "linux-x64" ]; then - ARCH_NAME=x64 - export ARCH=x86_64 - elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then - ARCH_NAME=arm64 - export ARCH=aarch64 - else - echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME"" - exit 1 - fi - - export UFLAG="gh-releases-zsync|${{ github.repository_owner }}|${{ github.event.repository.name }}|latest|*-$ARCH_NAME.AppImage.zsync" - BUILDDIR=publish OUTDIR=publish_appimage distribution/linux/appimage/build-appimage.sh - shell: bash - - - name: Upload Ryujinx artifact - uses: actions/upload-artifact@v4 - with: - name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }} - path: publish - if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13' - - - name: Upload Ryujinx (AppImage) artifact - uses: actions/upload-artifact@v4 - if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest' - with: - name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}-AppImage - path: publish_appimage - - build_macos: - name: macOS Universal (${{ matrix.configuration }}) - runs-on: ubuntu-latest - timeout-minutes: 45 - strategy: - matrix: - configuration: [ Debug, Release ] - - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-dotnet@v4 - with: - global-json-file: global.json - - - name: Setup LLVM 17 - run: | - wget https://apt.llvm.org/llvm.sh - chmod +x llvm.sh - sudo ./llvm.sh 17 - - - name: Install rcodesign - run: | - mkdir -p $HOME/.bin - gh release download -R indygreg/apple-platform-rs -O apple-codesign.tar.gz -p 'apple-codesign-*-x86_64-unknown-linux-musl.tar.gz' - tar -xzvf apple-codesign.tar.gz --wildcards '*/rcodesign' --strip-components=1 - rm apple-codesign.tar.gz - mv rcodesign $HOME/.bin/ - echo "$HOME/.bin" >> $GITHUB_PATH - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Get git short hash - id: git_short_hash - run: echo "result=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT - - - name: Change config filename - run: sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/PRConfig\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs - shell: bash - if: github.event_name == 'pull_request' - - - name: Publish macOS Ryujinx - run: | - ./distribution/macos/create_macos_build_ava.sh . publish_tmp publish ./distribution/macos/entitlements.xml "${{ env.RYUJINX_BASE_VERSION }}" "${{ steps.git_short_hash.outputs.result }}" "${{ matrix.configuration }}" "-p:ExtraDefineConstants=DISABLE_UPDATER" - - - name: Upload Ryujinx artifact - uses: actions/upload-artifact@v4 - with: - name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal - path: "publish/*.tar.gz" - if: github.event_name == 'pull_request' diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml deleted file mode 100644 index 43c5f227a..000000000 --- a/.github/workflows/checks.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Build PR - -on: - pull_request: - branches: [ master ] - paths: - - '**' - - '!.github/**' - - '!*.yml' - - '!*.config' - - '!*.md' - - '.github/workflows/*.yml' - -permissions: - pull-requests: write - checks: write - -concurrency: - group: pr-checks-${{ github.event.number }} - cancel-in-progress: true - -jobs: - pr_build: - uses: ./.github/workflows/build.yml - secrets: inherit diff --git a/README.md b/README.md index 7a785055f..3ec3176ff 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,8 @@ # Ryujinx -[![Latest release](https://img.shields.io/gitlab/v/release/ryubing%2Fryujinx?gitlab_url=https%3A%2F%2Fgit.ryujinx.app&label=stable&color=32cd32)](https://update.ryujinx.app/latest/stable) -[![Latest canary release](https://img.shields.io/gitlab/v/release/ryubing%2Fcanary?gitlab_url=https%3A%2F%2Fgit.ryujinx.app&label=canary&color=FF4500)](https://update.ryujinx.app/latest/canary) +[![Latest release](https://git.ryujinx.app/projects/Ryubing/badges/release.svg?label=stable&color=32cd32)](https://update.ryujinx.app/latest/stable) +[![Latest canary release](https://git.ryujinx.app/Ryubing/Canary/badges/release.svg?label=canary&color=FF4500)](https://update.ryujinx.app/latest/canary)
Discord @@ -21,7 +21,7 @@ Ryujinx is an open-source Nintendo Switch emulator, originally created by gdkchan, written in C#. This emulator aims at providing excellent accuracy and performance, a user-friendly interface and consistent builds. It was written from scratch and development on the project began in September 2017. - Ryujinx is available on a self-managed GitLab instance under the MIT license. + Ryujinx is available on a self-managed modified Forgejo instance under the MIT license.

@@ -31,11 +31,11 @@
This is not a Ryujinx revival project. This is not a Phoenix project.
- Guides and documentation can be found on the Wiki tab. + Guides and documentation can be found on the Wiki tab.

- Ryujinx example + Ryujinx example

## Usage @@ -49,17 +49,17 @@ Stable builds are made every so often, based on the `master` branch, that then g These stable builds exist so that the end user can get a more **enjoyable and stable experience**. They are released every month or so, to ensure consistent updates, while not being an annoying amount of individual updates to download over the course of that month. -You can find the stable releases [here](https://git.ryujinx.app/ryubing/ryujinx/-/releases). +You can find the stable releases [here](https://git.ryujinx.app/projects/Ryubing/releases). Canary builds are compiled automatically for each commit on the `master` branch. While we strive to ensure optimal stability and performance prior to pushing an update, these builds **may be unstable or completely broken**. These canary builds are only recommended for experienced users. -You can find the canary releases [here](https://git.ryujinx.app/ryubing/canary/-/releases). +You can find the canary releases [here](https://git.ryujinx.app/Ryubing/Canary/releases). ## Documentation -If you are planning to contribute or just want to learn more about this project please read through our [documentation](docs/README.md). +If you are planning to contribute or just want to learn more about this project please read through our [documentation](https://git.ryujinx.app/projects/Ryubing/src/branch/master/docs/README.md). ## Features @@ -105,13 +105,13 @@ If you are planning to contribute or just want to learn more about this project ## License -This software is licensed under the terms of the [MIT license](LICENSE.txt). +This software is licensed under the terms of the [MIT license](https://git.ryujinx.app/projects/Ryubing/src/branch/master/LICENSE.txt). This project makes use of code authored by the libvpx project, licensed under BSD and the ffmpeg project, licensed under LGPLv3. -See [LICENSE.txt](LICENSE.txt) and [THIRDPARTY.md](distribution/legal/THIRDPARTY.md) for more details. +See [LICENSE.txt](https://git.ryujinx.app/projects/Ryubing/src/branch/master/LICENSE.txt) and [THIRDPARTY.md](https://git.ryujinx.app/projects/Ryubing/src/branch/master/distribution/legal/THIRDPARTY.md) for more details. ## Credits -- [LibHac](https://git.ryujinx.app/ryubing/libhac) is used for our file-system. +- [LibHac](https://git.ryujinx.app/projects/LibHac) is used for our file-system. - [AmiiboAPI](https://www.amiiboapi.com) is used in our Amiibo emulation. - [ldn_mitm](https://github.com/spacemeowx2/ldn_mitm) is used for one of our available multiplayer modes. -- [ShellLink](https://github.com/securifybv/ShellLink) is used for Windows shortcut generation. \ No newline at end of file +- [ShellLink](https://github.com/securifybv/ShellLink) is used for Windows shortcut generation. diff --git a/distribution/linux/appimage/build-appimage.sh b/distribution/linux/appimage/build-appimage.sh index 3ae65db30..b6eb394d8 100755 --- a/distribution/linux/appimage/build-appimage.sh +++ b/distribution/linux/appimage/build-appimage.sh @@ -22,5 +22,5 @@ chmod +x AppDir/AppRun AppDir/usr/bin/Ryujinx* mkdir -p "$OUTDIR" -appimagetool -n --comp zstd --mksquashfs-opt -Xcompression-level --mksquashfs-opt 21 \ - AppDir "$OUTDIR"/Ryujinx.AppImage +appimagetool --appimage-extract-and-run -n --comp zstd --mksquashfs-opt -Xcompression-level --mksquashfs-opt 21 \ + AppDir "$OUTDIR"/Ryujinx.AppImage \ No newline at end of file diff --git a/distribution/macos/create_macos_pr_build_ava.sh b/distribution/macos/create_macos_pr_build_ava.sh new file mode 100644 index 000000000..206f2eec9 --- /dev/null +++ b/distribution/macos/create_macos_pr_build_ava.sh @@ -0,0 +1,120 @@ +#!/bin/bash + +set -e + +if [ "$#" -lt 8 ]; then + echo "usage " + exit 1 +fi + +mkdir -p "$1" +mkdir -p "$2" +mkdir -p "$3" + +BASE_DIR=$(readlink -f "$1") +TEMP_DIRECTORY=$(readlink -f "$2") +OUTPUT_DIRECTORY=$(readlink -f "$3") +ENTITLEMENTS_FILE_PATH=$(readlink -f "$4") +VERSION=$5 +SOURCE_REVISION_ID=$6 +CONFIGURATION=$7 + +if [[ "$(uname)" == "Darwin" ]]; then + echo "Clearing xattr on all dot undercsore files" + find "$BASE_DIR" -type f -name "._*" -exec sh -c ' + for f; do + dir=$(dirname "$f") + base=$(basename "$f") + orig="$dir/${base#._}" + [ -f "$orig" ] && xattr -c "$orig" || true + done + ' sh {} + +fi + +RELEASE_TAR_FILE_NAME=ryujinx-$CONFIGURATION-$VERSION+$SOURCE_REVISION_ID-macos_universal.app.tar + +ARM64_APP_BUNDLE="$TEMP_DIRECTORY/output_arm64/Ryujinx.app" +X64_APP_BUNDLE="$TEMP_DIRECTORY/output_x64/Ryujinx.app" +UNIVERSAL_APP_BUNDLE="$OUTPUT_DIRECTORY/Ryujinx.app" +EXECUTABLE_SUB_PATH=Contents/MacOS/Ryujinx + +rm -rf "$TEMP_DIRECTORY" +mkdir -p "$TEMP_DIRECTORY" + +DOTNET_COMMON_ARGS=(-p:DebugType=embedded -p:Version="$VERSION" -p:SourceRevisionId="$SOURCE_REVISION_ID" --self-contained true $EXTRA_ARGS) + +dotnet restore +dotnet build -c "$CONFIGURATION" src/Ryujinx +dotnet publish -c "$CONFIGURATION" -r osx-arm64 -o "$TEMP_DIRECTORY/publish_arm64" "${DOTNET_COMMON_ARGS[@]}" src/Ryujinx +dotnet publish -c "$CONFIGURATION" -r osx-x64 -o "$TEMP_DIRECTORY/publish_x64" "${DOTNET_COMMON_ARGS[@]}" src/Ryujinx + +# Get rid of the support library for ARMeilleure for x64 (that's only for arm64) +rm -rf "$TEMP_DIRECTORY/publish_x64/libarmeilleure-jitsupport.dylib" + +# Get rid of libsoundio from arm64 builds as we don't have a arm64 variant +# TODO: remove this once done +rm -rf "$TEMP_DIRECTORY/publish_arm64/libsoundio.dylib" + +pushd "$BASE_DIR/distribution/macos" +./create_app_bundle.sh "$TEMP_DIRECTORY/publish_x64" "$TEMP_DIRECTORY/output_x64" "$ENTITLEMENTS_FILE_PATH" +./create_app_bundle.sh "$TEMP_DIRECTORY/publish_arm64" "$TEMP_DIRECTORY/output_arm64" "$ENTITLEMENTS_FILE_PATH" +popd + +rm -rf "$UNIVERSAL_APP_BUNDLE" +mkdir -p "$OUTPUT_DIRECTORY" + +# Let's copy one of the two different app bundle and remove the executable +cp -R "$ARM64_APP_BUNDLE" "$UNIVERSAL_APP_BUNDLE" +rm "$UNIVERSAL_APP_BUNDLE/$EXECUTABLE_SUB_PATH" + +# Make its libraries universal +python3 "$BASE_DIR/distribution/macos/construct_universal_dylib.py" "$ARM64_APP_BUNDLE" "$X64_APP_BUNDLE" "$UNIVERSAL_APP_BUNDLE" "**/*.dylib" + +if ! [ -x "$(command -v lipo)" ]; +then + if ! [ -x "$(command -v llvm-lipo-17)" ]; + then + LIPO=llvm-lipo + else + LIPO=llvm-lipo-17 + fi +else + LIPO=lipo +fi + +# Make the executable universal +$LIPO "$ARM64_APP_BUNDLE/$EXECUTABLE_SUB_PATH" "$X64_APP_BUNDLE/$EXECUTABLE_SUB_PATH" -output "$UNIVERSAL_APP_BUNDLE/$EXECUTABLE_SUB_PATH" -create + +# Patch up the Info.plist to have appropriate version +sed -r -i.bck "s/\%\%RYUJINX_BUILD_VERSION\%\%/$VERSION/g;" "$UNIVERSAL_APP_BUNDLE/Contents/Info.plist" +sed -r -i.bck "s/\%\%RYUJINX_BUILD_GIT_HASH\%\%/$SOURCE_REVISION_ID/g;" "$UNIVERSAL_APP_BUNDLE/Contents/Info.plist" +rm "$UNIVERSAL_APP_BUNDLE/Contents/Info.plist.bck" + +# Now sign it +if ! [ -x "$(command -v codesign)" ]; +then + if ! [ -x "$(command -v rcodesign)" ]; + then + echo "Cannot find rcodesign on your system, please install rcodesign." + exit 1 + fi + + # NOTE: Currently require https://github.com/indygreg/apple-platform-rs/pull/44 to work on other OSes. + # cargo install --git "https://github.com/marysaka/apple-platform-rs" --branch "fix/adhoc-app-bundle" apple-codesign --bin "rcodesign" + echo "Using rcodesign for ad-hoc signing" + rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$UNIVERSAL_APP_BUNDLE" +else + echo "Using codesign for ad-hoc signing" + codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f -s - "$UNIVERSAL_APP_BUNDLE" +fi + +echo "Creating archive" +pushd "$OUTPUT_DIRECTORY" +tar --exclude "Ryujinx.app/Contents/MacOS/Ryujinx" -cvf "$RELEASE_TAR_FILE_NAME" Ryujinx.app 1> /dev/null +python3 "$BASE_DIR/distribution/misc/add_tar_exec.py" "$RELEASE_TAR_FILE_NAME" "Ryujinx.app/Contents/MacOS/Ryujinx" "Ryujinx.app/Contents/MacOS/Ryujinx" +gzip -9 < "$RELEASE_TAR_FILE_NAME" > "$RELEASE_TAR_FILE_NAME.gz" +rm "$RELEASE_TAR_FILE_NAME" + +popd + +echo "Done" diff --git a/nuget.config b/nuget.config index c8d71a836..6ed8f8d89 100644 --- a/nuget.config +++ b/nuget.config @@ -5,8 +5,7 @@ - - + @@ -14,10 +13,6 @@ - - - - diff --git a/src/Ryujinx.HLE/HOS/Horizon.cs b/src/Ryujinx.HLE/HOS/Horizon.cs index 38d504bbf..bcce72d1a 100644 --- a/src/Ryujinx.HLE/HOS/Horizon.cs +++ b/src/Ryujinx.HLE/HOS/Horizon.cs @@ -246,21 +246,21 @@ namespace Ryujinx.HLE.HOS public void InitializeServices() { SmRegistry = new SmRegistry(); - SmServer = new ServerBase(KernelContext, "SmServer", () => new IUserInterface(KernelContext, SmRegistry)); + SmServer = new ServerBase(KernelContext, "Sm", () => new IUserInterface(KernelContext, SmRegistry)); // Wait until SM server thread is done with initialization, // only then doing connections to SM is safe. SmServer.InitDone.WaitOne(); - BsdServer = new ServerBase(KernelContext, "BsdServer"); - FsServer = new ServerBase(KernelContext, "FsServer"); - HidServer = new ServerBase(KernelContext, "HidServer"); - NvDrvServer = new ServerBase(KernelContext, "NvservicesServer"); - TimeServer = new ServerBase(KernelContext, "TimeServer"); - ViServer = new ServerBase(KernelContext, "ViServerU"); - ViServerM = new ServerBase(KernelContext, "ViServerM"); - ViServerS = new ServerBase(KernelContext, "ViServerS"); - LdnServer = new ServerBase(KernelContext, "LdnServer"); + BsdServer = new ServerBase(KernelContext, "Bsd"); + FsServer = new ServerBase(KernelContext, "Fs"); + HidServer = new ServerBase(KernelContext, "Hid"); + NvDrvServer = new ServerBase(KernelContext, "Nv"); + TimeServer = new ServerBase(KernelContext, "Time"); + ViServer = new ServerBase(KernelContext, "Vi:u"); + ViServerM = new ServerBase(KernelContext, "Vi:m"); + ViServerS = new ServerBase(KernelContext, "Vi:s"); + LdnServer = new ServerBase(KernelContext, "Ldn"); StartNewServices(); } @@ -286,7 +286,7 @@ namespace Ryujinx.HLE.HOS ProcessCreationFlags.Is64Bit | ProcessCreationFlags.PoolPartitionSystem; - ProcessCreationInfo creationInfo = new("Service", 1, 0, 0x8000000, 1, Flags, 0, 0); + ProcessCreationInfo creationInfo = new(service.Name, 1, 0, 0x8000000, 1, Flags, 0, 0); uint[] defaultCapabilities = [ diff --git a/src/Ryujinx.HLE/HOS/Services/ServerBase.cs b/src/Ryujinx.HLE/HOS/Services/ServerBase.cs index a54dc637e..0eb36865b 100644 --- a/src/Ryujinx.HLE/HOS/Services/ServerBase.cs +++ b/src/Ryujinx.HLE/HOS/Services/ServerBase.cs @@ -79,9 +79,15 @@ namespace Ryujinx.HLE.HOS.Services ProcessCreationFlags.Is64Bit | ProcessCreationFlags.PoolPartitionSystem; - ProcessCreationInfo creationInfo = new("Service", 1, 0, 0x8000000, 1, Flags, 0, 0); + ProcessCreationInfo creationInfo = new(Name, 1, 0, 0x8000000, 1, Flags, 0, 0); - KernelStatic.StartInitialProcess(context, creationInfo, DefaultCapabilities, 44, Main); + KernelStatic.StartInitialProcess(context, creationInfo, DefaultCapabilities, 44, () => + { + var currentThread = KernelStatic.GetCurrentThread(); + currentThread.HostThread.Name = $"{{{Name}}}"; + + Main(); + }); } private void AddPort(int serverPortHandle, Func objectFactory) diff --git a/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs b/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs index f19eeebfc..6aaad74d3 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs @@ -17,13 +17,12 @@ namespace Ryujinx.HLE.HOS.Services.Sm private static readonly Dictionary _services; private readonly SmRegistry _registry; - private readonly ServerBase _commonServer; + private ServerBase _commonServer; private bool _isInitialized; public IUserInterface(KernelContext context, SmRegistry registry) : base(registerTipc: true) { - _commonServer = new ServerBase(context, "CommonServer"); _registry = registry; } @@ -97,6 +96,11 @@ namespace Ryujinx.HLE.HOS.Services.Sm IpcService service = GetServiceInstance(type, context, serviceAttribute.Parameter); + if (_commonServer is null) + { + _commonServer = new ServerBase(context.Device.System.KernelContext, "Common"); + } + service.TrySetServer(_commonServer); service.Server.AddSessionObj(session.ServerSession, service); } @@ -253,7 +257,7 @@ namespace Ryujinx.HLE.HOS.Services.Sm public override void DestroyAtExit() { - _commonServer.Dispose(); + _commonServer?.Dispose(); base.DestroyAtExit(); } diff --git a/src/Ryujinx.Horizon/ServiceEntry.cs b/src/Ryujinx.Horizon/ServiceEntry.cs index edf76fcd8..8cdeeff21 100644 --- a/src/Ryujinx.Horizon/ServiceEntry.cs +++ b/src/Ryujinx.Horizon/ServiceEntry.cs @@ -9,12 +9,14 @@ namespace Ryujinx.Horizon private readonly Action _entrypoint; private readonly ServiceTable _serviceTable; private readonly HorizonOptions _options; + public readonly string Name; - internal ServiceEntry(Action entrypoint, ServiceTable serviceTable, HorizonOptions options) + internal ServiceEntry(Action entrypoint, ServiceTable serviceTable, HorizonOptions options, string name) { _entrypoint = entrypoint; _serviceTable = serviceTable; _options = options; + Name = name; } public void Start(ISyscallApi syscallApi, IVirtualMemoryManager addressSpace, IThreadContext threadContext) diff --git a/src/Ryujinx.Horizon/ServiceTable.cs b/src/Ryujinx.Horizon/ServiceTable.cs index db24c193d..172d2919b 100644 --- a/src/Ryujinx.Horizon/ServiceTable.cs +++ b/src/Ryujinx.Horizon/ServiceTable.cs @@ -37,7 +37,7 @@ namespace Ryujinx.Horizon void RegisterService() where T : IService { - entries.Add(new ServiceEntry(T.Main, this, options)); + entries.Add(new ServiceEntry(T.Main, this, options, typeof(T).Name)); } RegisterService(); diff --git a/src/Ryujinx.Tests/Audio/Renderer/Parameter/Effect/BiquadFilterEffectParameterTests.cs b/src/Ryujinx.Tests/Audio/Renderer/Parameter/Effect/BiquadFilterEffectParameterTests.cs index d76478ed8..df63046af 100644 --- a/src/Ryujinx.Tests/Audio/Renderer/Parameter/Effect/BiquadFilterEffectParameterTests.cs +++ b/src/Ryujinx.Tests/Audio/Renderer/Parameter/Effect/BiquadFilterEffectParameterTests.cs @@ -10,7 +10,7 @@ namespace Ryujinx.Tests.Audio.Renderer.Parameter.Effect public void EnsureTypeSize() { Assert.AreEqual(0x18, Unsafe.SizeOf()); - Assert.AreEqual(0x24, Unsafe.SizeOf()); + Assert.AreEqual(0x28, Unsafe.SizeOf()); } } }