diff --git a/.deadcode-out b/.deadcode-out index f71ef41ea2..97093ce93b 100644 --- a/.deadcode-out +++ b/.deadcode-out @@ -50,9 +50,6 @@ forgejo.org/models/organization forgejo.org/models/perm/access GetRepoWriters -forgejo.org/models/repo - WatchRepoMode - forgejo.org/models/user IsErrUserWrongType IsErrExternalLoginUserAlreadyExist @@ -238,6 +235,7 @@ forgejo.org/services/repository forgejo.org/services/repository/files ContentType.String + RepoFileOptionMode forgejo.org/services/repository/gitgraph Parser.Reset diff --git a/.forgejo/cascading-release-end-to-end b/.forgejo/cascading-release-end-to-end index 9be0737b0f..f78c3aeedb 100755 --- a/.forgejo/cascading-release-end-to-end +++ b/.forgejo/cascading-release-end-to-end @@ -2,6 +2,9 @@ set -ex +# WARNING: Changes to the behaviour of this file should be backported to all active releases, as it is used in +# `build-release.yml` from release branches. + end_to_end=$1 end_to_end_pr=$2 forgejo=$3 diff --git a/.forgejo/workflows-composite/install-minimum-git-version/action.yaml b/.forgejo/workflows-composite/install-minimum-git-version/action.yaml index d4e6e3f2a7..ae50d38794 100644 --- a/.forgejo/workflows-composite/install-minimum-git-version/action.yaml +++ b/.forgejo/workflows-composite/install-minimum-git-version/action.yaml @@ -13,7 +13,7 @@ runs: apt-get update -qq apt-get -q install -y -qq curl ca-certificates - curl -sS -o /tmp/git-man.deb http://archive.ubuntu.com/ubuntu/pool/main/g/git/git-man_2.34.1-1ubuntu1_all.deb + curl -sS -o /tmp/git-man.deb https://archive.ubuntu.com/ubuntu/pool/main/g/git/git-man_2.34.1-1ubuntu1_all.deb curl -sS -o /tmp/git.deb https://archive.ubuntu.com/ubuntu/pool/main/g/git/git_2.34.1-1ubuntu1_amd64.deb curl -sS -o /tmp/git-lfs.deb https://archive.ubuntu.com/ubuntu/pool/universe/g/git-lfs/git-lfs_3.0.2-1_amd64.deb diff --git a/.forgejo/workflows-composite/setup-cache-go/action.yaml b/.forgejo/workflows-composite/setup-cache-go/action.yaml index fec166fc35..c44eaf24bd 100644 --- a/.forgejo/workflows-composite/setup-cache-go/action.yaml +++ b/.forgejo/workflows-composite/setup-cache-go/action.yaml @@ -52,10 +52,9 @@ runs: id: cache-deps uses: https://data.forgejo.org/actions/cache@v4 with: - key: setup-cache-go-deps-${{ runner.os }}-${{ inputs.username }}-${{ steps.go-version.outputs.go_version }}-${{ hashFiles('go.sum', 'go.mod') }} + key: setup-cache-go-deps-${{ runner.os }}-${{ inputs.username }}-${{ steps.go-version.outputs.go_version }}-${{ hashFiles('go.sum', 'go.mod', 'Makefile') }} restore-keys: | setup-cache-go-deps-${{ runner.os }}-${{ inputs.username }}-${{ steps.go-version.outputs.go_version }}- - setup-cache-go-deps-${{ runner.os }}-${{ inputs.username }}- path: | ${{ steps.go-environment.outputs.modcache }} ${{ steps.go-environment.outputs.cache }} diff --git a/.forgejo/workflows/build-release-integration.yml b/.forgejo/workflows/build-release-integration.yml index aa5e69f64d..d22126bad4 100644 --- a/.forgejo/workflows/build-release-integration.yml +++ b/.forgejo/workflows/build-release-integration.yml @@ -29,7 +29,7 @@ jobs: - uses: https://data.forgejo.org/actions/checkout@v5 - id: forgejo - uses: https://data.forgejo.org/actions/setup-forgejo@v3.0.6 + uses: https://data.forgejo.org/actions/setup-forgejo@v3.1.7 with: user: root password: admin1234 diff --git a/.forgejo/workflows/build-release.yml b/.forgejo/workflows/build-release.yml index 042a981881..eb99efbc38 100644 --- a/.forgejo/workflows/build-release.yml +++ b/.forgejo/workflows/build-release.yml @@ -164,7 +164,7 @@ jobs: - name: build container & release if: ${{ secrets.TOKEN != '' }} - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.4.1 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.5.1 with: forgejo: "${{ env.GITHUB_SERVER_URL }}" owner: "${{ env.GITHUB_REPOSITORY_OWNER }}" @@ -183,7 +183,7 @@ jobs: - name: build rootless container if: ${{ secrets.TOKEN != '' }} - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.4.1 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.5.1 with: forgejo: "${{ env.GITHUB_SERVER_URL }}" owner: "${{ env.GITHUB_REPOSITORY_OWNER }}" @@ -206,7 +206,7 @@ jobs: origin-url: ${{ env.GITHUB_SERVER_URL }} origin-repo: ${{ github.repository }} origin-token: ${{ secrets.CASCADE_ORIGIN_TOKEN }} - origin-ref: refs/heads/forgejo + origin-ref: ${{ github.ref }} destination-url: https://code.forgejo.org destination-fork-repo: ${{ vars.CASCADE_DESTINATION_DOER }}/end-to-end destination-repo: forgejo/end-to-end diff --git a/.forgejo/workflows/publish-release.yml b/.forgejo/workflows/publish-release.yml index a583756656..208c16d002 100644 --- a/.forgejo/workflows/publish-release.yml +++ b/.forgejo/workflows/publish-release.yml @@ -44,7 +44,7 @@ jobs: - uses: https://data.forgejo.org/actions/checkout@v5 - name: copy & sign - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.4.1 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.5.1 with: from-forgejo: ${{ vars.FORGEJO }} to-forgejo: ${{ vars.FORGEJO }} @@ -63,14 +63,14 @@ jobs: - name: get trigger mirror issue id: mirror - uses: https://data.forgejo.org/infrastructure/issue-action/get@v1.3.0 + uses: https://data.forgejo.org/infrastructure/issue-action/get@v1.5.0 with: forgejo: https://code.forgejo.org repository: forgejo/forgejo labels: mirror-trigger - name: trigger the mirror - uses: https://data.forgejo.org/infrastructure/issue-action/set@v1.3.0 + uses: https://data.forgejo.org/infrastructure/issue-action/set@v1.5.0 with: forgejo: https://code.forgejo.org repository: forgejo/forgejo diff --git a/.forgejo/workflows/testing.yml b/.forgejo/workflows/testing.yml index 199e616daa..466195f69c 100644 --- a/.forgejo/workflows/testing.yml +++ b/.forgejo/workflows/testing.yml @@ -35,6 +35,9 @@ jobs: options: --tmpfs /tmp:exec,noatime steps: - uses: https://data.forgejo.org/actions/checkout@v5 + - uses: https://data.forgejo.org/actions/setup-node@v6 + with: + node-version-file: .node-version - run: make deps-frontend - run: make lint-frontend - run: make checks-frontend diff --git a/assets/go-licenses.json b/assets/go-licenses.json index 6f1e5d5225..a66088f5f2 100644 --- a/assets/go-licenses.json +++ b/assets/go-licenses.json @@ -219,11 +219,6 @@ "path": "connectrpc.com/connect/LICENSE", "licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2021-2025 The Connect Authors\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" }, - { - "name": "dario.cat/mergo", - "path": "dario.cat/mergo/LICENSE", - "licenseText": "Copyright (c) 2013 Dario Castañé. All rights reserved.\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" - }, { "name": "filippo.io/edwards25519", "path": "filippo.io/edwards25519/LICENSE", @@ -459,21 +454,6 @@ "path": "github.com/cloudflare/circl/LICENSE", "licenseText": "Copyright (c) 2019 Cloudflare. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Cloudflare nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n========================================================================\n\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, - { - "name": "github.com/cyphar/filepath-securejoin", - "path": "github.com/cyphar/filepath-securejoin/COPYING.md", - "licenseText": "## COPYING ##\n\n`SPDX-License-Identifier: BSD-3-Clause AND MPL-2.0`\n\nThis project is made up of code licensed under different licenses. Which code\nyou use will have an impact on whether only one or both licenses apply to your\nusage of this library.\n\nNote that **each file** in this project individually has a code comment at the\nstart describing the license of that particular file -- this is the most\naccurate license information of this project; in case there is any conflict\nbetween this document and the comment at the start of a file, the comment shall\ntake precedence. The only purpose of this document is to work around [a known\ntechnical limitation of pkg.go.dev's license checking tool when dealing with\nnon-trivial project licenses][go75067].\n\n[go75067]: https://go.dev/issue/75067\n\n### `BSD-3-Clause` ###\n\nAt time of writing, the following files and directories are licensed under the\nBSD-3-Clause license:\n\n * `doc.go`\n * `join*.go`\n * `vfs.go`\n * `internal/consts/*.go`\n * `pathrs-lite/internal/gocompat/*.go`\n * `pathrs-lite/internal/kernelversion/*.go`\n\nThe text of the BSD-3-Clause license used by this project is the following (the\ntext is also available from the [`LICENSE.BSD`](./LICENSE.BSD) file):\n\n```\nCopyright (C) 2014-2015 Docker Inc \u0026 Go Authors. All rights reserved.\nCopyright (C) 2017-2024 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n```\n\n### `MPL-2.0` ###\n\nAll other files (unless otherwise marked) are licensed under the Mozilla Public\nLicense (version 2.0).\n\nThe text of the Mozilla Public License (version 2.0) is the following (the text\nis also available from the [`LICENSE.MPL-2.0`](./LICENSE.MPL-2.0) file):\n\n```\nMozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\"\n means each individual or legal entity that creates, contributes to\n the creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n means the combination of the Contributions of others (if any) used\n by a Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n means Source Code Form to which the initial Contributor has attached\n the notice in Exhibit A, the Executable Form of such Source Code\n Form, and Modifications of such Source Code Form, in each case\n including portions thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n means\n\n (a) that the initial Contributor has attached the notice described\n in Exhibit B to the Covered Software; or\n\n (b) that the Covered Software was made available under the terms of\n version 1.1 or earlier of the License, but not also under the\n terms of a Secondary License.\n\n1.6. \"Executable Form\"\n means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n means a work that combines Covered Software with other material, in\n a separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n means this document.\n\n1.9. \"Licensable\"\n means having the right to grant, to the maximum extent possible,\n whether at the time of the initial grant or subsequently, any and\n all of the rights conveyed by this License.\n\n1.10. \"Modifications\"\n means any of the following:\n\n (a) any file in Source Code Form that results from an addition to,\n deletion from, or modification of the contents of Covered\n Software; or\n\n (b) any new file in Source Code Form that contains any Covered\n Software.\n\n1.11. \"Patent Claims\" of a Contributor\n means any patent claim(s), including without limitation, method,\n process, and apparatus claims, in any patent Licensable by such\n Contributor that would be infringed, but for the grant of the\n License, by the making, using, selling, offering for sale, having\n made, import, or transfer of either its Contributions or its\n Contributor Version.\n\n1.12. \"Secondary License\"\n means either the GNU General Public License, Version 2.0, the GNU\n Lesser General Public License, Version 2.1, the GNU Affero General\n Public License, Version 3.0, or any later versions of those\n licenses.\n\n1.13. \"Source Code Form\"\n means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n means an individual or a legal entity exercising rights under this\n License. For legal entities, \"You\" includes any entity that\n controls, is controlled by, or is under common control with You. For\n purposes of this definition, \"control\" means (a) the power, direct\n or indirect, to cause the direction or management of such entity,\n whether by contract or otherwise, or (b) ownership of more than\n fifty percent (50%) of the outstanding shares or beneficial\n ownership of such entity.\n\n2. License Grants and Conditions\n--------------------------------\n\n2.1. Grants\n\nEach Contributor hereby grants You a world-wide, royalty-free,\nnon-exclusive license:\n\n(a) under intellectual property rights (other than patent or trademark)\n Licensable by such Contributor to use, reproduce, make available,\n modify, display, perform, distribute, and otherwise exploit its\n Contributions, either on an unmodified basis, with Modifications, or\n as part of a Larger Work; and\n\n(b) under Patent Claims of such Contributor to make, use, sell, offer\n for sale, have made, import, and otherwise transfer either its\n Contributions or its Contributor Version.\n\n2.2. Effective Date\n\nThe licenses granted in Section 2.1 with respect to any Contribution\nbecome effective for each Contribution on the date the Contributor first\ndistributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\nThe licenses granted in this Section 2 are the only rights granted under\nthis License. No additional rights or licenses will be implied from the\ndistribution or licensing of Covered Software under this License.\nNotwithstanding Section 2.1(b) above, no patent license is granted by a\nContributor:\n\n(a) for any code that a Contributor has removed from Covered Software;\n or\n\n(b) for infringements caused by: (i) Your and any other third party's\n modifications of Covered Software, or (ii) the combination of its\n Contributions with other software (except as part of its Contributor\n Version); or\n\n(c) under Patent Claims infringed by Covered Software in the absence of\n its Contributions.\n\nThis License does not grant any rights in the trademarks, service marks,\nor logos of any Contributor (except as may be necessary to comply with\nthe notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\nNo Contributor makes additional grants as a result of Your choice to\ndistribute the Covered Software under a subsequent version of this\nLicense (see Section 10.2) or under the terms of a Secondary License (if\npermitted under the terms of Section 3.3).\n\n2.5. Representation\n\nEach Contributor represents that the Contributor believes its\nContributions are its original creation(s) or it has sufficient rights\nto grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\nThis License is not intended to limit any rights You have under\napplicable copyright doctrines of fair use, fair dealing, or other\nequivalents.\n\n2.7. Conditions\n\nSections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted\nin Section 2.1.\n\n3. Responsibilities\n-------------------\n\n3.1. Distribution of Source Form\n\nAll distribution of Covered Software in Source Code Form, including any\nModifications that You create or to which You contribute, must be under\nthe terms of this License. You must inform recipients that the Source\nCode Form of the Covered Software is governed by the terms of this\nLicense, and how they can obtain a copy of this License. You may not\nattempt to alter or restrict the recipients' rights in the Source Code\nForm.\n\n3.2. Distribution of Executable Form\n\nIf You distribute Covered Software in Executable Form then:\n\n(a) such Covered Software must also be made available in Source Code\n Form, as described in Section 3.1, and You must inform recipients of\n the Executable Form how they can obtain a copy of such Source Code\n Form by reasonable means in a timely manner, at a charge no more\n than the cost of distribution to the recipient; and\n\n(b) You may distribute such Executable Form under the terms of this\n License, or sublicense it under different terms, provided that the\n license for the Executable Form does not attempt to limit or alter\n the recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\nYou may create and distribute a Larger Work under terms of Your choice,\nprovided that You also comply with the requirements of this License for\nthe Covered Software. If the Larger Work is a combination of Covered\nSoftware with a work governed by one or more Secondary Licenses, and the\nCovered Software is not Incompatible With Secondary Licenses, this\nLicense permits You to additionally distribute such Covered Software\nunder the terms of such Secondary License(s), so that the recipient of\nthe Larger Work may, at their option, further distribute the Covered\nSoftware under the terms of either this License or such Secondary\nLicense(s).\n\n3.4. Notices\n\nYou may not remove or alter the substance of any license notices\n(including copyright notices, patent notices, disclaimers of warranty,\nor limitations of liability) contained within the Source Code Form of\nthe Covered Software, except that You may alter any license notices to\nthe extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\nYou may choose to offer, and to charge a fee for, warranty, support,\nindemnity or liability obligations to one or more recipients of Covered\nSoftware. However, You may do so only on Your own behalf, and not on\nbehalf of any Contributor. You must make it absolutely clear that any\nsuch warranty, support, indemnity, or liability obligation is offered by\nYou alone, and You hereby agree to indemnify every Contributor for any\nliability incurred by such Contributor as a result of warranty, support,\nindemnity or liability terms You offer. You may include additional\ndisclaimers of warranty and limitations of liability specific to any\njurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n---------------------------------------------------\n\nIf it is impossible for You to comply with any of the terms of this\nLicense with respect to some or all of the Covered Software due to\nstatute, judicial order, or regulation then You must: (a) comply with\nthe terms of this License to the maximum extent possible; and (b)\ndescribe the limitations and the code they affect. Such description must\nbe placed in a text file included with all distributions of the Covered\nSoftware under this License. Except to the extent prohibited by statute\nor regulation, such description must be sufficiently detailed for a\nrecipient of ordinary skill to be able to understand it.\n\n5. Termination\n--------------\n\n5.1. The rights granted under this License will terminate automatically\nif You fail to comply with any of its terms. However, if You become\ncompliant, then the rights granted under this License from a particular\nContributor are reinstated (a) provisionally, unless and until such\nContributor explicitly and finally terminates Your grants, and (b) on an\nongoing basis, if such Contributor fails to notify You of the\nnon-compliance by some reasonable means prior to 60 days after You have\ncome back into compliance. Moreover, Your grants from a particular\nContributor are reinstated on an ongoing basis if such Contributor\nnotifies You of the non-compliance by some reasonable means, this is the\nfirst time You have received notice of non-compliance with this License\nfrom such Contributor, and You become compliant prior to 30 days after\nYour receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\ninfringement claim (excluding declaratory judgment actions,\ncounter-claims, and cross-claims) alleging that a Contributor Version\ndirectly or indirectly infringes any patent, then the rights granted to\nYou by any and all Contributors for the Covered Software under Section\n2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all\nend user license agreements (excluding distributors and resellers) which\nhave been validly granted by You or Your distributors under this License\nprior to termination shall survive termination.\n\n************************************************************************\n* *\n* 6. Disclaimer of Warranty *\n* ------------------------- *\n* *\n* Covered Software is provided under this License on an \"as is\" *\n* basis, without warranty of any kind, either expressed, implied, or *\n* statutory, including, without limitation, warranties that the *\n* Covered Software is free of defects, merchantable, fit for a *\n* particular purpose or non-infringing. The entire risk as to the *\n* quality and performance of the Covered Software is with You. *\n* Should any Covered Software prove defective in any respect, You *\n* (not any Contributor) assume the cost of any necessary servicing, *\n* repair, or correction. This disclaimer of warranty constitutes an *\n* essential part of this License. No use of any Covered Software is *\n* authorized under this License except under this disclaimer. *\n* *\n************************************************************************\n\n************************************************************************\n* *\n* 7. Limitation of Liability *\n* -------------------------- *\n* *\n* Under no circumstances and under no legal theory, whether tort *\n* (including negligence), contract, or otherwise, shall any *\n* Contributor, or anyone who distributes Covered Software as *\n* permitted above, be liable to You for any direct, indirect, *\n* special, incidental, or consequential damages of any character *\n* including, without limitation, damages for lost profits, loss of *\n* goodwill, work stoppage, computer failure or malfunction, or any *\n* and all other commercial damages or losses, even if such party *\n* shall have been informed of the possibility of such damages. This *\n* limitation of liability shall not apply to liability for death or *\n* personal injury resulting from such party's negligence to the *\n* extent applicable law prohibits such limitation. Some *\n* jurisdictions do not allow the exclusion or limitation of *\n* incidental or consequential damages, so this exclusion and *\n* limitation may not apply to You. *\n* *\n************************************************************************\n\n8. Litigation\n-------------\n\nAny litigation relating to this License may be brought only in the\ncourts of a jurisdiction where the defendant maintains its principal\nplace of business and such litigation shall be governed by laws of that\njurisdiction, without reference to its conflict-of-law provisions.\nNothing in this Section shall prevent a party's ability to bring\ncross-claims or counter-claims.\n\n9. Miscellaneous\n----------------\n\nThis License represents the complete agreement concerning the subject\nmatter hereof. If any provision of this License is held to be\nunenforceable, such provision shall be reformed only to the extent\nnecessary to make it enforceable. Any law or regulation which provides\nthat the language of a contract shall be construed against the drafter\nshall not be used to construe this License against a Contributor.\n\n10. Versions of the License\n---------------------------\n\n10.1. New Versions\n\nMozilla Foundation is the license steward. Except as provided in Section\n10.3, no one other than the license steward has the right to modify or\npublish new versions of this License. Each version will be given a\ndistinguishing version number.\n\n10.2. Effect of New Versions\n\nYou may distribute the Covered Software under the terms of the version\nof the License under which You originally received the Covered Software,\nor under the terms of any subsequent version published by the license\nsteward.\n\n10.3. Modified Versions\n\nIf you create software not governed by this License, and you want to\ncreate a new license for such software, you may create and use a\nmodified version of this License if you rename the license and remove\nany references to the name of the license steward (except to note that\nsuch modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\nLicenses\n\nIf You choose to distribute Source Code Form that is Incompatible With\nSecondary Licenses under the terms of this version of the License, the\nnotice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n-------------------------------------------\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at https://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular\nfile, then You may include the notice in a location (such as a LICENSE\nfile in a relevant directory) where a recipient would be likely to look\nfor such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n---------------------------------------------------------\n\n This Source Code Form is \"Incompatible With Secondary Licenses\", as\n defined by the Mozilla Public License, v. 2.0.\n```\n" - }, - { - "name": "github.com/cyphar/filepath-securejoin", - "path": "github.com/cyphar/filepath-securejoin/LICENSE.BSD", - "licenseText": "Copyright (C) 2014-2015 Docker Inc \u0026 Go Authors. All rights reserved.\nCopyright (C) 2017-2024 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" - }, - { - "name": "github.com/cyphar/filepath-securejoin", - "path": "github.com/cyphar/filepath-securejoin/LICENSE.MPL-2.0", - "licenseText": "Mozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\"\n means each individual or legal entity that creates, contributes to\n the creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n means the combination of the Contributions of others (if any) used\n by a Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n means Source Code Form to which the initial Contributor has attached\n the notice in Exhibit A, the Executable Form of such Source Code\n Form, and Modifications of such Source Code Form, in each case\n including portions thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n means\n\n (a) that the initial Contributor has attached the notice described\n in Exhibit B to the Covered Software; or\n\n (b) that the Covered Software was made available under the terms of\n version 1.1 or earlier of the License, but not also under the\n terms of a Secondary License.\n\n1.6. \"Executable Form\"\n means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n means a work that combines Covered Software with other material, in\n a separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n means this document.\n\n1.9. \"Licensable\"\n means having the right to grant, to the maximum extent possible,\n whether at the time of the initial grant or subsequently, any and\n all of the rights conveyed by this License.\n\n1.10. \"Modifications\"\n means any of the following:\n\n (a) any file in Source Code Form that results from an addition to,\n deletion from, or modification of the contents of Covered\n Software; or\n\n (b) any new file in Source Code Form that contains any Covered\n Software.\n\n1.11. \"Patent Claims\" of a Contributor\n means any patent claim(s), including without limitation, method,\n process, and apparatus claims, in any patent Licensable by such\n Contributor that would be infringed, but for the grant of the\n License, by the making, using, selling, offering for sale, having\n made, import, or transfer of either its Contributions or its\n Contributor Version.\n\n1.12. \"Secondary License\"\n means either the GNU General Public License, Version 2.0, the GNU\n Lesser General Public License, Version 2.1, the GNU Affero General\n Public License, Version 3.0, or any later versions of those\n licenses.\n\n1.13. \"Source Code Form\"\n means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n means an individual or a legal entity exercising rights under this\n License. For legal entities, \"You\" includes any entity that\n controls, is controlled by, or is under common control with You. For\n purposes of this definition, \"control\" means (a) the power, direct\n or indirect, to cause the direction or management of such entity,\n whether by contract or otherwise, or (b) ownership of more than\n fifty percent (50%) of the outstanding shares or beneficial\n ownership of such entity.\n\n2. License Grants and Conditions\n--------------------------------\n\n2.1. Grants\n\nEach Contributor hereby grants You a world-wide, royalty-free,\nnon-exclusive license:\n\n(a) under intellectual property rights (other than patent or trademark)\n Licensable by such Contributor to use, reproduce, make available,\n modify, display, perform, distribute, and otherwise exploit its\n Contributions, either on an unmodified basis, with Modifications, or\n as part of a Larger Work; and\n\n(b) under Patent Claims of such Contributor to make, use, sell, offer\n for sale, have made, import, and otherwise transfer either its\n Contributions or its Contributor Version.\n\n2.2. Effective Date\n\nThe licenses granted in Section 2.1 with respect to any Contribution\nbecome effective for each Contribution on the date the Contributor first\ndistributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\nThe licenses granted in this Section 2 are the only rights granted under\nthis License. No additional rights or licenses will be implied from the\ndistribution or licensing of Covered Software under this License.\nNotwithstanding Section 2.1(b) above, no patent license is granted by a\nContributor:\n\n(a) for any code that a Contributor has removed from Covered Software;\n or\n\n(b) for infringements caused by: (i) Your and any other third party's\n modifications of Covered Software, or (ii) the combination of its\n Contributions with other software (except as part of its Contributor\n Version); or\n\n(c) under Patent Claims infringed by Covered Software in the absence of\n its Contributions.\n\nThis License does not grant any rights in the trademarks, service marks,\nor logos of any Contributor (except as may be necessary to comply with\nthe notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\nNo Contributor makes additional grants as a result of Your choice to\ndistribute the Covered Software under a subsequent version of this\nLicense (see Section 10.2) or under the terms of a Secondary License (if\npermitted under the terms of Section 3.3).\n\n2.5. Representation\n\nEach Contributor represents that the Contributor believes its\nContributions are its original creation(s) or it has sufficient rights\nto grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\nThis License is not intended to limit any rights You have under\napplicable copyright doctrines of fair use, fair dealing, or other\nequivalents.\n\n2.7. Conditions\n\nSections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted\nin Section 2.1.\n\n3. Responsibilities\n-------------------\n\n3.1. Distribution of Source Form\n\nAll distribution of Covered Software in Source Code Form, including any\nModifications that You create or to which You contribute, must be under\nthe terms of this License. You must inform recipients that the Source\nCode Form of the Covered Software is governed by the terms of this\nLicense, and how they can obtain a copy of this License. You may not\nattempt to alter or restrict the recipients' rights in the Source Code\nForm.\n\n3.2. Distribution of Executable Form\n\nIf You distribute Covered Software in Executable Form then:\n\n(a) such Covered Software must also be made available in Source Code\n Form, as described in Section 3.1, and You must inform recipients of\n the Executable Form how they can obtain a copy of such Source Code\n Form by reasonable means in a timely manner, at a charge no more\n than the cost of distribution to the recipient; and\n\n(b) You may distribute such Executable Form under the terms of this\n License, or sublicense it under different terms, provided that the\n license for the Executable Form does not attempt to limit or alter\n the recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\nYou may create and distribute a Larger Work under terms of Your choice,\nprovided that You also comply with the requirements of this License for\nthe Covered Software. If the Larger Work is a combination of Covered\nSoftware with a work governed by one or more Secondary Licenses, and the\nCovered Software is not Incompatible With Secondary Licenses, this\nLicense permits You to additionally distribute such Covered Software\nunder the terms of such Secondary License(s), so that the recipient of\nthe Larger Work may, at their option, further distribute the Covered\nSoftware under the terms of either this License or such Secondary\nLicense(s).\n\n3.4. Notices\n\nYou may not remove or alter the substance of any license notices\n(including copyright notices, patent notices, disclaimers of warranty,\nor limitations of liability) contained within the Source Code Form of\nthe Covered Software, except that You may alter any license notices to\nthe extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\nYou may choose to offer, and to charge a fee for, warranty, support,\nindemnity or liability obligations to one or more recipients of Covered\nSoftware. However, You may do so only on Your own behalf, and not on\nbehalf of any Contributor. You must make it absolutely clear that any\nsuch warranty, support, indemnity, or liability obligation is offered by\nYou alone, and You hereby agree to indemnify every Contributor for any\nliability incurred by such Contributor as a result of warranty, support,\nindemnity or liability terms You offer. You may include additional\ndisclaimers of warranty and limitations of liability specific to any\njurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n---------------------------------------------------\n\nIf it is impossible for You to comply with any of the terms of this\nLicense with respect to some or all of the Covered Software due to\nstatute, judicial order, or regulation then You must: (a) comply with\nthe terms of this License to the maximum extent possible; and (b)\ndescribe the limitations and the code they affect. Such description must\nbe placed in a text file included with all distributions of the Covered\nSoftware under this License. Except to the extent prohibited by statute\nor regulation, such description must be sufficiently detailed for a\nrecipient of ordinary skill to be able to understand it.\n\n5. Termination\n--------------\n\n5.1. The rights granted under this License will terminate automatically\nif You fail to comply with any of its terms. However, if You become\ncompliant, then the rights granted under this License from a particular\nContributor are reinstated (a) provisionally, unless and until such\nContributor explicitly and finally terminates Your grants, and (b) on an\nongoing basis, if such Contributor fails to notify You of the\nnon-compliance by some reasonable means prior to 60 days after You have\ncome back into compliance. Moreover, Your grants from a particular\nContributor are reinstated on an ongoing basis if such Contributor\nnotifies You of the non-compliance by some reasonable means, this is the\nfirst time You have received notice of non-compliance with this License\nfrom such Contributor, and You become compliant prior to 30 days after\nYour receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\ninfringement claim (excluding declaratory judgment actions,\ncounter-claims, and cross-claims) alleging that a Contributor Version\ndirectly or indirectly infringes any patent, then the rights granted to\nYou by any and all Contributors for the Covered Software under Section\n2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all\nend user license agreements (excluding distributors and resellers) which\nhave been validly granted by You or Your distributors under this License\nprior to termination shall survive termination.\n\n************************************************************************\n* *\n* 6. Disclaimer of Warranty *\n* ------------------------- *\n* *\n* Covered Software is provided under this License on an \"as is\" *\n* basis, without warranty of any kind, either expressed, implied, or *\n* statutory, including, without limitation, warranties that the *\n* Covered Software is free of defects, merchantable, fit for a *\n* particular purpose or non-infringing. The entire risk as to the *\n* quality and performance of the Covered Software is with You. *\n* Should any Covered Software prove defective in any respect, You *\n* (not any Contributor) assume the cost of any necessary servicing, *\n* repair, or correction. This disclaimer of warranty constitutes an *\n* essential part of this License. No use of any Covered Software is *\n* authorized under this License except under this disclaimer. *\n* *\n************************************************************************\n\n************************************************************************\n* *\n* 7. Limitation of Liability *\n* -------------------------- *\n* *\n* Under no circumstances and under no legal theory, whether tort *\n* (including negligence), contract, or otherwise, shall any *\n* Contributor, or anyone who distributes Covered Software as *\n* permitted above, be liable to You for any direct, indirect, *\n* special, incidental, or consequential damages of any character *\n* including, without limitation, damages for lost profits, loss of *\n* goodwill, work stoppage, computer failure or malfunction, or any *\n* and all other commercial damages or losses, even if such party *\n* shall have been informed of the possibility of such damages. This *\n* limitation of liability shall not apply to liability for death or *\n* personal injury resulting from such party's negligence to the *\n* extent applicable law prohibits such limitation. Some *\n* jurisdictions do not allow the exclusion or limitation of *\n* incidental or consequential damages, so this exclusion and *\n* limitation may not apply to You. *\n* *\n************************************************************************\n\n8. Litigation\n-------------\n\nAny litigation relating to this License may be brought only in the\ncourts of a jurisdiction where the defendant maintains its principal\nplace of business and such litigation shall be governed by laws of that\njurisdiction, without reference to its conflict-of-law provisions.\nNothing in this Section shall prevent a party's ability to bring\ncross-claims or counter-claims.\n\n9. Miscellaneous\n----------------\n\nThis License represents the complete agreement concerning the subject\nmatter hereof. If any provision of this License is held to be\nunenforceable, such provision shall be reformed only to the extent\nnecessary to make it enforceable. Any law or regulation which provides\nthat the language of a contract shall be construed against the drafter\nshall not be used to construe this License against a Contributor.\n\n10. Versions of the License\n---------------------------\n\n10.1. New Versions\n\nMozilla Foundation is the license steward. Except as provided in Section\n10.3, no one other than the license steward has the right to modify or\npublish new versions of this License. Each version will be given a\ndistinguishing version number.\n\n10.2. Effect of New Versions\n\nYou may distribute the Covered Software under the terms of the version\nof the License under which You originally received the Covered Software,\nor under the terms of any subsequent version published by the license\nsteward.\n\n10.3. Modified Versions\n\nIf you create software not governed by this License, and you want to\ncreate a new license for such software, you may create and use a\nmodified version of this License if you rename the license and remove\nany references to the name of the license steward (except to note that\nsuch modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\nLicenses\n\nIf You choose to distribute Source Code Form that is Incompatible With\nSecondary Licenses under the terms of this version of the License, the\nnotice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n-------------------------------------------\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at https://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular\nfile, then You may include the notice in a location (such as a LICENSE\nfile in a relevant directory) where a recipient would be likely to look\nfor such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n---------------------------------------------------------\n\n This Source Code Form is \"Incompatible With Secondary Licenses\", as\n defined by the Mozilla Public License, v. 2.0.\n" - }, { "name": "github.com/davecgh/go-spew/spew", "path": "github.com/davecgh/go-spew/spew/LICENSE", @@ -549,11 +529,6 @@ "path": "github.com/emersion/go-sasl/LICENSE", "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2016 emersion\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" }, - { - "name": "github.com/emirpasic/gods", - "path": "github.com/emirpasic/gods/LICENSE", - "licenseText": "Copyright (c) 2015, Emir Pasic\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n-------------------------------------------------------------------------------\n\nAVL Tree:\n\nCopyright (c) 2017 Benjamin Scher Purcell \u003cbenjapurcell@gmail.com\u003e\n\nPermission to use, copy, modify, and distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n" - }, { "name": "github.com/fatih/color", "path": "github.com/fatih/color/LICENSE.md", @@ -709,11 +684,6 @@ "path": "github.com/golang/geo/LICENSE", "licenseText": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" }, - { - "name": "github.com/golang/groupcache/lru", - "path": "github.com/golang/groupcache/lru/LICENSE", - "licenseText": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"[]\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" - }, { "name": "github.com/golang/snappy", "path": "github.com/golang/snappy/LICENSE", @@ -730,8 +700,8 @@ "licenseText": "Copyright (c) 2017 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, { - "name": "github.com/google/go-github/v74/github", - "path": "github.com/google/go-github/v74/github/LICENSE", + "name": "github.com/google/go-github/v81/github", + "path": "github.com/google/go-github/v81/github/LICENSE", "licenseText": "Copyright (c) 2013 The go-github AUTHORS. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, { @@ -859,11 +829,6 @@ "path": "github.com/kballard/go-shellquote/LICENSE", "licenseText": "Copyright (C) 2014 Kevin Ballard\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the \"Software\"),\nto deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\nand/or sell copies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\nOR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n" }, - { - "name": "github.com/kevinburke/ssh_config", - "path": "github.com/kevinburke/ssh_config/LICENSE", - "licenseText": "Copyright (c) 2017 Kevin Burke.\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n===================\n\nThe lexer and parser borrow heavily from github.com/pelletier/go-toml. The\nlicense for that project is copied below.\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 - 2017 Thomas Pelletier, Eric Anderton\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" - }, { "name": "github.com/klauspost/compress", "path": "github.com/klauspost/compress/LICENSE", @@ -1069,11 +1034,6 @@ "path": "github.com/pierrec/lz4/v4/LICENSE", "licenseText": "Copyright (c) 2015, Pierre Curto\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of xxHash nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n" }, - { - "name": "github.com/pjbgf/sha1cd", - "path": "github.com/pjbgf/sha1cd/LICENSE", - "licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2023 pjbgf\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" - }, { "name": "github.com/pkg/errors", "path": "github.com/pkg/errors/LICENSE", @@ -1154,11 +1114,6 @@ "path": "github.com/sirupsen/logrus/LICENSE", "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2014 Simon Eskildsen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n" }, - { - "name": "github.com/skeema/knownhosts", - "path": "github.com/skeema/knownhosts/LICENSE", - "licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright {yyyy} {name of copyright owner}\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" - }, { "name": "github.com/sorairolake/lzip-go", "path": "github.com/sorairolake/lzip-go/LICENSE-APACHE", @@ -1209,11 +1164,6 @@ "path": "github.com/x448/float16/LICENSE", "licenseText": "MIT License\n\nCopyright (c) 2019 Montgomery Edwards⁴⁴⁸ and Faye Amacker\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n" }, - { - "name": "github.com/xanzy/ssh-agent", - "path": "github.com/xanzy/ssh-agent/LICENSE", - "licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright {yyyy} {name of copyright owner}\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n" - }, { "name": "github.com/yohcop/openid-go", "path": "github.com/yohcop/openid-go/LICENSE", @@ -1272,7 +1222,7 @@ { "name": "go.yaml.in/yaml/v4", "path": "go.yaml.in/yaml/v4/LICENSE", - "licenseText": "\nThis project is covered by two different licenses: MIT and Apache.\n\n#### MIT License ####\n\nThe following files were ported to Go from C files of libyaml, and thus\nare still covered by their original MIT license, with the additional\ncopyright staring in 2011 when the project was ported over:\n\n apic.go emitterc.go parserc.go readerc.go scannerc.go\n writerc.go yamlh.go yamlprivateh.go\n\nCopyright (c) 2006-2010 Kirill Simonov\nCopyright (c) 2006-2011 Kirill Simonov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n### Apache License ###\n\nAll the remaining project files are covered by the Apache license:\n\nCopyright (c) 2011-2019 Canonical Ltd\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n" + "licenseText": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2025 - The go-yaml Project Contributors\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" }, { "name": "go4.org/readerutil", diff --git a/build/lint-locale-usage/handle-tmpl.go b/build/lint-locale-usage/handle-tmpl.go index e8d4832f9d..8d03291205 100644 --- a/build/lint-locale-usage/handle-tmpl.go +++ b/build/lint-locale-usage/handle-tmpl.go @@ -73,12 +73,6 @@ func (handler Handler) handleTemplateNode(fset *token.FileSet, node tmplParser.N funcname = nodeVar.Ident[2] } - if funcname == "IterWithTr" { - for i := 2; i < len(nodeCommand.Args); i += 2 { - handler.handleTemplateMsgid(fset, nodeCommand.Args[i]) - } - } - var gotUnexpectedInvoke *int ltf, ok := handler.LocaleTrFunctions[funcname] if !ok { diff --git a/cmd/admin.go b/cmd/admin.go index 90157e2d5a..60b25eb971 100644 --- a/cmd/admin.go +++ b/cmd/admin.go @@ -64,6 +64,8 @@ func subcmdAuth() *cli.Command { microcmdAuthUpdateLdapBindDn(), microcmdAuthAddLdapSimpleAuth(), microcmdAuthUpdateLdapSimpleAuth(), + microcmdAuthAddPAM(), + microcmdAuthUpdatePAM(), microcmdAuthAddSMTP(), microcmdAuthUpdateSMTP(), microcmdAuthList(), diff --git a/cmd/admin_auth_pam.go b/cmd/admin_auth_pam.go new file mode 100644 index 0000000000..25e32503e0 --- /dev/null +++ b/cmd/admin_auth_pam.go @@ -0,0 +1,145 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package cmd + +import ( + "context" + "errors" + + auth_model "forgejo.org/models/auth" + "forgejo.org/services/auth/source/pam" + + "github.com/urfave/cli/v3" +) + +func pamCLIFlags() []cli.Flag { + return []cli.Flag{ + &cli.StringFlag{ + Name: "name", + Value: "", + Usage: "Application Name", + }, + &cli.StringFlag{ + Name: "service-name", + Value: "PLAIN", + Usage: "PAM service name", + }, + &cli.StringFlag{ + Name: "email-domain", + Value: "", + Usage: "PAM email domain", + }, + &cli.BoolFlag{ + Name: "skip-local-2fa", + Usage: "Skip 2FA to log on.", + Value: true, + }, + &cli.BoolFlag{ + Name: "active", + Usage: "This Authentication Source is Activated.", + Value: true, + }, + } +} + +func microcmdAuthAddPAM() *cli.Command { + return &cli.Command{ + Name: "add-pam", + Usage: "Add new PAM authentication source", + Before: noDanglingArgs, + Action: newAuthService().addPAM, + Flags: pamCLIFlags(), + } +} + +func microcmdAuthUpdatePAM() *cli.Command { + return &cli.Command{ + Name: "update-pam", + Usage: "Update existing PAM authentication source", + Before: noDanglingArgs, + Action: newAuthService().updatePAM, + Flags: append(pamCLIFlags()[:1], append([]cli.Flag{idFlag()}, pamCLIFlags()[1:]...)...), + } +} + +func parsePAMConfig(_ context.Context, c *cli.Command) *pam.Source { + return &pam.Source{ + ServiceName: c.String("service-name"), + EmailDomain: c.String("email-domain"), + SkipLocalTwoFA: c.Bool("skip-local-2fa"), + } +} + +func (a *authService) addPAM(ctx context.Context, c *cli.Command) error { + ctx, cancel := installSignals(ctx) + defer cancel() + + if err := a.initDB(ctx); err != nil { + return err + } + + if !c.IsSet("name") || len(c.String("name")) == 0 { + return errors.New("name must be set") + } + if !c.IsSet("service-name") || len(c.String("service-name")) == 0 { + return errors.New("service-name must be set") + } + active := true + if c.IsSet("active") { + active = c.Bool("active") + } + + config := parsePAMConfig(ctx, c) + + return a.createAuthSource(ctx, &auth_model.Source{ + Type: auth_model.PAM, + Name: c.String("name"), + IsActive: active, + Cfg: config, + }) +} + +func (a *authService) updatePAM(ctx context.Context, c *cli.Command) error { + if !c.IsSet("id") { + return errors.New("--id flag is missing") + } + + ctx, cancel := installSignals(ctx) + defer cancel() + + if err := a.initDB(ctx); err != nil { + return err + } + + source, err := a.getAuthSource(ctx, c, auth_model.PAM) + if err != nil { + return err + } + + pamConfig := source.Cfg.(*pam.Source) + + if c.IsSet("name") { + source.Name = c.String("name") + } + + if c.IsSet("service-name") { + pamConfig.ServiceName = c.String("service-name") + } + + if c.IsSet("email-domain") { + pamConfig.EmailDomain = c.String("email-domain") + } + + if c.IsSet("skip-local-2fa") { + pamConfig.SkipLocalTwoFA = c.Bool("skip-local-2fa") + } + + if c.IsSet("active") { + source.IsActive = c.Bool("active") + } + + source.Cfg = pamConfig + + return a.updateAuthSource(ctx, source) +} diff --git a/cmd/admin_auth_pam_test.go b/cmd/admin_auth_pam_test.go new file mode 100644 index 0000000000..d14dfe790b --- /dev/null +++ b/cmd/admin_auth_pam_test.go @@ -0,0 +1,293 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package cmd + +import ( + "context" + "testing" + + "forgejo.org/models/auth" + "forgejo.org/modules/test" + "forgejo.org/services/auth/source/pam" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/urfave/cli/v3" +) + +func TestPamService(t *testing.T) { + // Mock cli functions to do not exit on error + defer test.MockVariableValue(&cli.OsExiter, func(code int) {})() + + // Test cases + cases := []struct { + args []string + source *auth.Source + errMsg string + }{ + // case 0 + { + args: []string{ + "pam-test", + "--name", "Pam Service", + "--service-name", "myservice", + }, + source: &auth.Source{ + Type: auth.PAM, + Name: "Pam Service", + IsActive: true, + Cfg: &pam.Source{ + ServiceName: "myservice", + EmailDomain: "", + SkipLocalTwoFA: true, + }, + }, + }, + // case 1 + { + args: []string{ + "pam-test", + "--name", "Pam Service", + "--service-name", "myservice", + "--email-domain", "testdomain.org", + "--skip-local-2fa", + }, + source: &auth.Source{ + Type: auth.PAM, + Name: "Pam Service", + IsActive: true, + Cfg: &pam.Source{ + ServiceName: "myservice", + EmailDomain: "testdomain.org", + SkipLocalTwoFA: true, + }, + }, + }, + // case 2 + { + args: []string{ + "pam-test", + "--service-name", "myservice", + "--email-domain", "testdomain.org", + "--skip-local-2fa", "false", + "--active", "true", + }, + errMsg: "name must be set", + }, + // case 3 + { + args: []string{ + "pam-test", + "--name", "Pam Service", + "--email-domain", "testdomain.org", + "--skip-local-2fa", "false", + "--active", "true", + }, + errMsg: "service-name must be set", + }, + } + + for n, c := range cases { + // Mock functions. + var createdAuthSource *auth.Source + service := &authService{ + initDB: func(context.Context) error { + return nil + }, + createAuthSource: func(ctx context.Context, authSource *auth.Source) error { + createdAuthSource = authSource + return nil + }, + updateAuthSource: func(ctx context.Context, authSource *auth.Source) error { + assert.FailNow(t, "should not call updateAuthSource", "case: %d", n) + return nil + }, + getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) { + assert.FailNow(t, "should not call getAuthSourceByID", "case: %d", n) + return nil, nil + }, + } + + // Create a copy of command to test + app := cli.Command{} + app.Flags = microcmdAuthAddPAM().Flags + app.Action = service.addPAM + + // Run it + err := app.Run(t.Context(), c.args) + if c.errMsg != "" { + assert.EqualError(t, err, c.errMsg, "case %d: error should match", n) + } else { + require.NoError(t, err, "case %d: should have no errors", n) + assert.Equal(t, c.source, createdAuthSource, "case %d: wrong authSource", n) + } + } +} + +func TestUpdatePAM(t *testing.T) { + // Mock cli functions to do not exit on error + defer test.MockVariableValue(&cli.OsExiter, func(code int) {})() + + // Test cases + cases := []struct { + args []string + id int64 + existingAuthSource *auth.Source + authSource *auth.Source + errMsg string + }{ + // case 0 + { + args: []string{ + "pam-test", + "--id", "23", + "--name", "PAM Service", + "--service-name", "myservice", + }, + id: 23, + existingAuthSource: &auth.Source{ + Type: auth.PAM, + IsActive: true, + Cfg: &pam.Source{}, + }, + authSource: &auth.Source{ + Type: auth.PAM, + Name: "PAM Service", + IsActive: true, + Cfg: &pam.Source{ + ServiceName: "myservice", + }, + }, + }, + // case 1 + { + args: []string{ + "pam-test", + "--id", "1", + }, + authSource: &auth.Source{ + Type: auth.PAM, + Cfg: &pam.Source{}, + }, + }, + // case 2 + { + args: []string{ + "pam-test", + "--id", "1", + "--name", "pam service", + }, + authSource: &auth.Source{ + Type: auth.PAM, + Name: "pam service", + Cfg: &pam.Source{}, + }, + }, + // case 3 + { + args: []string{ + "pam-test", + "--id", "1", + "--active=false", + }, + existingAuthSource: &auth.Source{ + Type: auth.PAM, + IsActive: true, + Cfg: &pam.Source{}, + }, + authSource: &auth.Source{ + Type: auth.PAM, + IsActive: false, + Cfg: &pam.Source{}, + }, + }, + // case 4 + { + args: []string{ + "pam-test", + "--id", "1", + "--service-name", "myservice", + }, + authSource: &auth.Source{ + Type: auth.PAM, + Cfg: &pam.Source{ + ServiceName: "myservice", + }, + }, + }, + // case 5 + { + args: []string{ + "pam-test", + "--id", "1", + "--skip-local-2fa=false", + }, + authSource: &auth.Source{ + Type: auth.PAM, + Cfg: &pam.Source{ + SkipLocalTwoFA: false, + }, + }, + }, + // case 6 + { + args: []string{ + "pam-test", + "--id", "1", + "--email-domain", "testdomain.org", + }, + authSource: &auth.Source{ + Type: auth.PAM, + Cfg: &pam.Source{ + EmailDomain: "testdomain.org", + }, + }, + }, + } + + for n, c := range cases { + // Mock functions. + var updatedAuthSource *auth.Source + service := &authService{ + initDB: func(context.Context) error { + return nil + }, + createAuthSource: func(ctx context.Context, authSource *auth.Source) error { + assert.FailNow(t, "should not call createAuthSource", "case: %d", n) + return nil + }, + updateAuthSource: func(ctx context.Context, authSource *auth.Source) error { + updatedAuthSource = authSource + return nil + }, + getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) { + if c.id != 0 { + assert.Equal(t, c.id, id, "case %d: wrong id", n) + } + if c.existingAuthSource != nil { + return c.existingAuthSource, nil + } + return &auth.Source{ + Type: auth.PAM, + Cfg: &pam.Source{}, + }, nil + }, + } + + // Create a copy of command to test + app := cli.Command{} + app.Flags = microcmdAuthUpdatePAM().Flags + app.Action = service.updatePAM + + // Run it + err := app.Run(t.Context(), c.args) + if c.errMsg != "" { + assert.EqualError(t, err, c.errMsg, "case %d: error should match", n) + } else { + require.NoError(t, err, "case %d: should have no errors", n) + assert.Equal(t, c.authSource, updatedAuthSource, "case %d: wrong authSource", n) + } + } +} diff --git a/cmd/doctor.go b/cmd/doctor.go index f557481110..c2ddfef9c5 100644 --- a/cmd/doctor.go +++ b/cmd/doctor.go @@ -15,6 +15,7 @@ import ( "text/tabwriter" "forgejo.org/models/db" + git_model "forgejo.org/models/git" "forgejo.org/models/gitea_migrations" migrate_base "forgejo.org/models/gitea_migrations/base" repo_model "forgejo.org/models/repo" @@ -41,6 +42,7 @@ func cmdDoctor() *cli.Command { cmdRecreateTable(), cmdDoctorConvert(), cmdAvatarStripExif(), + cmdCleanupCommitStatuses(), }, } } @@ -115,6 +117,54 @@ func cmdAvatarStripExif() *cli.Command { } } +func cmdCleanupCommitStatuses() *cli.Command { + return &cli.Command{ + Name: "cleanup-commit-status", + Usage: "Cleanup extra records in commit_status table", + Description: `Forgejo suffered from a bug which caused the creation of more entries in the +"commit_status" table than necessary. This operation removes the redundant +data caused by the bug. Removing this data is almost always safe. +These redundant records can be accessed by users through the API, making it +possible, but unlikely, that removing it could have an impact to +integrating services (API: /repos/{owner}/{repo}/commits/{ref}/statuses). + +It is safe to run while Forgejo is online. + +On very large Forgejo instances, the performance of operation will improve +if the buffer-size option is used with large values. Approximately 130 MB of +memory is required for every 100,000 records in the buffer. + +Bug reference: https://codeberg.org/forgejo/forgejo/issues/10671 +`, + + Before: multipleBefore(noDanglingArgs, PrepareConsoleLoggerLevel(log.INFO)), + Action: runCleanupCommitStatus, + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "verbose", + Aliases: []string{"V"}, + Usage: "Show process details", + }, + &cli.BoolFlag{ + Name: "dry-run", + Usage: "Report statistics from the operation but do not modify the database", + }, + &cli.IntFlag{ + Name: "buffer-size", + Usage: "Record count per query while iterating records; larger values are typically faster but use more memory", + // See IterateByKeyset's documentation for performance notes which led to the choice of the default + // buffer size for this operation. + Value: 100000, + }, + &cli.IntFlag{ + Name: "delete-chunk-size", + Usage: "Number of records to delete per DELETE query", + Value: 1000, + }, + }, + } +} + func runRecreateTable(stdCtx context.Context, ctx *cli.Command) error { stdCtx, cancel := installSignals(stdCtx) defer cancel() @@ -322,3 +372,19 @@ func runAvatarStripExif(ctx context.Context, c *cli.Command) error { return nil } + +func runCleanupCommitStatus(ctx context.Context, cli *cli.Command) error { + ctx, cancel := installSignals(ctx) + defer cancel() + + if err := initDB(ctx); err != nil { + return err + } + + bufferSize := cli.Int("buffer-size") + deleteChunkSize := cli.Int("delete-chunk-size") + dryRun := cli.Bool("dry-run") + log.Debug("bufferSize = %d, deleteChunkSize = %d, dryRun = %v", bufferSize, deleteChunkSize, dryRun) + + return git_model.CleanupCommitStatus(ctx, bufferSize, deleteChunkSize, dryRun) +} diff --git a/cmd/hook.go b/cmd/hook.go index d92e84b289..82dcb30866 100644 --- a/cmd/hook.go +++ b/cmd/hook.go @@ -237,7 +237,7 @@ Forgejo or set your environment appropriately.`, "") continue } - fields := bytes.Fields(scanner.Bytes()) + fields := bytes.Split(scanner.Bytes(), []byte(" ")) if len(fields) != 3 { continue } @@ -369,7 +369,7 @@ Forgejo or set your environment appropriately.`, "") continue } - fields := bytes.Fields(scanner.Bytes()) + fields := bytes.Split(scanner.Bytes(), []byte(" ")) if len(fields) != 3 { continue } diff --git a/cmd/hook_test.go b/cmd/hook_test.go index 19e10455cb..a40036ffd5 100644 --- a/cmd/hook_test.go +++ b/cmd/hook_test.go @@ -14,6 +14,9 @@ import ( "testing" "time" + "forgejo.org/modules/git" + "forgejo.org/modules/json" + "forgejo.org/modules/private" "forgejo.org/modules/setting" "forgejo.org/modules/test" @@ -161,3 +164,133 @@ func TestDelayWriter(t *testing.T) { require.Empty(t, out) }) } + +func TestRunHookPrePostReceive(t *testing.T) { + // Setup the environment. + defer test.MockVariableValue(&setting.InternalToken, "Random")() + defer test.MockVariableValue(&setting.InstallLock, true)() + defer test.MockVariableValue(&setting.Git.VerbosePush, true)() + t.Setenv("SSH_ORIGINAL_COMMAND", "true") + + tests := []struct { + name string + inputLine string + oldCommitID string + newCommitID string + refFullName string + }{ + { + name: "base case", + inputLine: "00000000000000000000 00000000000000000001 refs/head/main\n", + oldCommitID: "00000000000000000000", + newCommitID: "00000000000000000001", + refFullName: "refs/head/main", + }, + { + name: "nbsp case", + inputLine: "00000000000000000000 00000000000000000001 refs/head/ma\u00A0in\n", + oldCommitID: "00000000000000000000", + newCommitID: "00000000000000000001", + refFullName: "refs/head/ma\u00A0in", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Setup the Stdin. + f, err := os.OpenFile(t.TempDir()+"/stdin", os.O_RDWR|os.O_CREATE|os.O_EXCL, 0o666) + require.NoError(t, err) + _, err = f.Write([]byte(tt.inputLine)) + require.NoError(t, err) + _, err = f.Seek(0, 0) + require.NoError(t, err) + defer test.MockVariableValue(os.Stdin, *f)() + + // Setup the server that processes the hooks. + var serverError error + var hookOpts *private.HookOptions + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + body, err := io.ReadAll(r.Body) + if err != nil { + serverError = err + w.WriteHeader(500) + return + } + + err = json.Unmarshal(body, &hookOpts) + if err != nil { + serverError = err + w.WriteHeader(500) + return + } + + w.WriteHeader(200) + + resp := &private.HookPostReceiveResult{} + bytes, err := json.Marshal(resp) + if err != nil { + serverError = err + return + } + + _, err = w.Write(bytes) + if err != nil { + serverError = err + return + } + })) + defer ts.Close() + defer test.MockVariableValue(&setting.LocalURL, ts.URL+"/")() + + t.Run("pre-receive", func(t *testing.T) { + app := cli.Command{} + app.Commands = []*cli.Command{subcmdHookPreReceive()} + + finish := captureOutput(t, os.Stdout) + err = app.Run(t.Context(), []string{"./forgejo", "pre-receive"}) + require.NoError(t, err) + out := finish() + require.Empty(t, out) + + require.NoError(t, serverError) + require.NotNil(t, hookOpts) + + require.Len(t, hookOpts.OldCommitIDs, 1) + assert.Equal(t, tt.oldCommitID, hookOpts.OldCommitIDs[0]) + require.Len(t, hookOpts.NewCommitIDs, 1) + assert.Equal(t, tt.newCommitID, hookOpts.NewCommitIDs[0]) + require.Len(t, hookOpts.RefFullNames, 1) + assert.Equal(t, git.RefName(tt.refFullName), hookOpts.RefFullNames[0]) + }) + + // seek stdin back to beginning + _, err = f.Seek(0, 0) + require.NoError(t, err) + // reset state from prev test + serverError = nil + hookOpts = nil + + t.Run("post-receive", func(t *testing.T) { + app := cli.Command{} + app.Commands = []*cli.Command{subcmdHookPostReceive()} + + finish := captureOutput(t, os.Stdout) + err = app.Run(t.Context(), []string{"./forgejo", "post-receive"}) + require.NoError(t, err) + out := finish() + require.Empty(t, out) + + require.NoError(t, serverError) + require.NotNil(t, hookOpts) + + require.Len(t, hookOpts.OldCommitIDs, 1) + assert.Equal(t, tt.oldCommitID, hookOpts.OldCommitIDs[0]) + require.Len(t, hookOpts.NewCommitIDs, 1) + assert.Equal(t, tt.newCommitID, hookOpts.NewCommitIDs[0]) + require.Len(t, hookOpts.RefFullNames, 1) + assert.Equal(t, git.RefName(tt.refFullName), hookOpts.RefFullNames[0]) + }) + }) + } +} diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index a432a142c3..f45b7731c5 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -362,7 +362,7 @@ RUN_USER = ; git DB_TYPE = sqlite3 ;PATH= ; defaults to data/forgejo.db ;SQLITE_TIMEOUT = ; Query timeout defaults to: 500 -;SQLITE_JOURNAL_MODE = ; defaults to sqlite database default (often DELETE), can be used to enable WAL mode. https://www.sqlite.org/pragma.html#pragma_journal_mode +;SQLITE_JOURNAL_MODE = WAL; defaults to sqlite database default (often DELETE), can be used to enable WAL mode. https://www.sqlite.org/pragma.html#pragma_journal_mode ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; diff --git a/eslint.config.mjs b/eslint.config.mjs index 61987aef14..df3425d7a0 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -528,11 +528,7 @@ export default tseslint.config( 'no-this-before-super': [2], 'no-throw-literal': [2], 'no-undef-init': [2], - - 'no-undef': [2, { - typeof: true, - }], - + 'no-undef': [0], 'no-undefined': [0], 'no-underscore-dangle': [0], 'no-unexpected-multiline': [2], diff --git a/go.mod b/go.mod index 9e1615f9d2..5295ea234e 100644 --- a/go.mod +++ b/go.mod @@ -2,22 +2,22 @@ module forgejo.org go 1.25.0 -toolchain go1.25.5 +toolchain go1.25.8 require ( code.forgejo.org/f3/gof3/v3 v3.11.1 code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 - code.forgejo.org/forgejo/actions-proto v0.5.3 + code.forgejo.org/forgejo/actions-proto v0.6.0 code.forgejo.org/forgejo/go-rpmutils v1.0.0 code.forgejo.org/forgejo/levelqueue v1.0.0 code.forgejo.org/forgejo/reply v1.0.2 - code.forgejo.org/forgejo/runner/v12 v12.2.0 + code.forgejo.org/forgejo/runner/v12 v12.6.4 code.forgejo.org/go-chi/binding v1.0.1 code.forgejo.org/go-chi/cache v1.0.1 code.forgejo.org/go-chi/captcha v1.0.2 code.forgejo.org/go-chi/session v1.0.2 code.gitea.io/sdk/gitea v0.21.0 - code.superseriousbusiness.org/exif-terminator v0.11.0 + code.superseriousbusiness.org/exif-terminator v0.11.1 code.superseriousbusiness.org/go-jpeg-image-structure/v2 v2.3.0 codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570 connectrpc.com/connect v1.19.1 @@ -45,7 +45,7 @@ require ( github.com/gliderlabs/ssh v0.3.8 github.com/go-ap/activitypub v0.0.0-20231114162308-e219254dc5c9 github.com/go-ap/jsonld v0.0.0-20251216162253-e38fa664ea77 - github.com/go-chi/chi/v5 v5.2.3 + github.com/go-chi/chi/v5 v5.2.4 github.com/go-chi/cors v1.2.2 github.com/go-co-op/gocron v1.37.0 github.com/go-enry/go-enry/v2 v2.9.2 @@ -58,7 +58,7 @@ require ( github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 github.com/golang-jwt/jwt/v5 v5.3.0 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 - github.com/google/go-github/v74 v74.0.0 + github.com/google/go-github/v81 v81.0.0 github.com/google/pprof v0.0.0-20251114195745-4902fdda35c8 github.com/google/uuid v1.6.0 github.com/gorilla/feeds v1.2.0 @@ -71,11 +71,11 @@ require ( github.com/jhillyerd/enmime/v2 v2.2.0 github.com/json-iterator/go v1.1.12 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 - github.com/klauspost/compress v1.18.2 + github.com/klauspost/compress v1.18.3 github.com/klauspost/cpuid/v2 v2.2.11 github.com/markbates/goth v1.80.0 github.com/mattn/go-isatty v0.0.20 - github.com/mattn/go-sqlite3 v1.14.32 + github.com/mattn/go-sqlite3 v1.14.34 github.com/meilisearch/meilisearch-go v0.34.0 github.com/mholt/archives v0.1.5 github.com/microcosm-cc/bluemonday v1.0.27 @@ -102,13 +102,13 @@ require ( gitlab.com/gitlab-org/api/client-go v0.143.2 go.uber.org/mock v0.6.0 go.yaml.in/yaml/v3 v3.0.4 - golang.org/x/crypto v0.46.0 - golang.org/x/image v0.33.0 - golang.org/x/net v0.47.0 + golang.org/x/crypto v0.47.0 + golang.org/x/image v0.36.0 + golang.org/x/net v0.49.0 golang.org/x/oauth2 v0.34.0 golang.org/x/sync v0.19.0 - golang.org/x/sys v0.39.0 - golang.org/x/text v0.32.0 + golang.org/x/sys v0.40.0 + golang.org/x/text v0.34.0 google.golang.org/protobuf v1.36.11 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/ini.v1 v1.67.0 @@ -120,10 +120,8 @@ require ( require ( cloud.google.com/go/compute/metadata v0.6.0 // indirect code.superseriousbusiness.org/go-png-image-structure/v2 v2.3.0 // indirect - dario.cat/mergo v1.0.2 // indirect filippo.io/edwards25519 v1.1.0 // indirect git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect - github.com/Microsoft/go-winio v0.6.2 // indirect github.com/RoaringBitmap/roaring/v2 v2.4.5 // indirect github.com/STARRY-S/zip v0.2.3 // indirect github.com/andybalholm/brotli v1.2.0 // indirect @@ -158,8 +156,7 @@ require ( github.com/caddyserver/zerossl v0.1.3 // indirect github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cloudflare/circl v1.6.1 // indirect - github.com/cyphar/filepath-securejoin v0.6.0 // indirect + github.com/cloudflare/circl v1.6.3 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davidmz/go-pageant v1.0.2 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect @@ -169,7 +166,6 @@ require ( github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c // indirect github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349 // indirect github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect - github.com/emirpasic/gods v1.18.1 // indirect github.com/fatih/color v1.18.0 // indirect github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-ap/errors v0.0.0-20231003111023-183eef4b31b7 // indirect @@ -179,7 +175,7 @@ require ( github.com/go-fed/httpsig v1.1.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect - github.com/go-git/go-git/v5 v5.16.3 // indirect + github.com/go-git/go-git/v5 v5.16.5 // indirect github.com/go-ini/ini v1.67.0 // indirect github.com/go-openapi/jsonpointer v0.22.3 // indirect github.com/go-openapi/jsonreference v0.21.3 // indirect @@ -195,7 +191,6 @@ require ( github.com/goccy/go-json v0.10.5 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 // indirect - github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect github.com/google/go-cmp v0.7.0 // indirect @@ -211,7 +206,6 @@ require ( github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/josharian/intern v1.0.0 // indirect - github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/pgzip v1.2.6 // indirect github.com/lib/pq v1.10.9 // indirect github.com/libdns/libdns v1.0.0 // indirect @@ -239,23 +233,20 @@ require ( github.com/onsi/ginkgo v1.16.5 // indirect github.com/philhofer/fwd v1.2.0 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/pjbgf/sha1cd v0.3.2 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.62.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect - github.com/rhysd/actionlint v1.7.8 // indirect + github.com/rhysd/actionlint v1.7.10 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rs/xid v1.6.0 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/skeema/knownhosts v1.3.1 // indirect + github.com/sirupsen/logrus v1.9.4 // indirect github.com/sorairolake/lzip-go v0.3.8 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect github.com/tinylib/msgp v1.3.0 // indirect github.com/x448/float16 v0.8.4 // indirect - github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/zeebo/assert v1.3.0 // indirect github.com/zeebo/blake3 v0.2.4 // indirect go.etcd.io/bbolt v1.4.3 // indirect @@ -263,11 +254,11 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect go.uber.org/zap/exp v0.3.0 // indirect - go.yaml.in/yaml/v4 v4.0.0-rc.2 // indirect + go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect - golang.org/x/mod v0.31.0 // indirect + golang.org/x/mod v0.32.0 // indirect golang.org/x/time v0.14.0 // indirect - golang.org/x/tools v0.39.0 // indirect + golang.org/x/tools v0.41.0 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 17be63a395..fc9c716bc2 100644 --- a/go.sum +++ b/go.sum @@ -20,8 +20,8 @@ code.forgejo.org/f3/gof3/v3 v3.11.1 h1:c0vE8XvqpbXuSv8gzttn96k5T2FQi0u9bYnux46qS code.forgejo.org/f3/gof3/v3 v3.11.1/go.mod h1:1p2UKrqZiwxKneQF2DKrMnc403YIgR/lfcfvadZtmDs= code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 h1:HTZl3CBk3ABNYtFI6TPLvJgGKFIhKT5CBk0sbOtkDKU= code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:PphB88CPbx601QrWPMZATeorACeVmQlyv3u+uUMbSaM= -code.forgejo.org/forgejo/actions-proto v0.5.3 h1:dDProRNB4CDvEl9gfo8jkiVfGdiW7fXAt5TM9Irka28= -code.forgejo.org/forgejo/actions-proto v0.5.3/go.mod h1:33iTdur/jVa/wAQP+BuciRTK9WZcVaxy0BNEnSWWFDM= +code.forgejo.org/forgejo/actions-proto v0.6.0 h1:dw1Dogk9A4V/yrLVkhe9dSZPsqNAIkI1kCXPSqG3tZA= +code.forgejo.org/forgejo/actions-proto v0.6.0/go.mod h1:+444hHBs9/qDh5X/AedaTv0Egj3vd/EXP93vg9zFV2E= code.forgejo.org/forgejo/go-rpmutils v1.0.0 h1:RZGGeKt70p/WaIEL97pyT6uiiEIoN8/aLmS5Z6WmX0M= code.forgejo.org/forgejo/go-rpmutils v1.0.0/go.mod h1:cg+VbgLXfrDPza9T+kBsMb3TVmmzPN4XseT6gDGLSUk= code.forgejo.org/forgejo/go-xsd-duration v0.0.0-20220703122237-02e73435a078 h1:RArF5AsF9LH4nEoJxqRxcP5r8hhRfWcId84G82YbqzA= @@ -30,8 +30,8 @@ code.forgejo.org/forgejo/levelqueue v1.0.0 h1:9krYpU6BM+j/1Ntj6m+VCAIu0UNnne1/Uf code.forgejo.org/forgejo/levelqueue v1.0.0/go.mod h1:fmG6zhVuqim2rxSFOoasgXO8V2W/k9U31VVYqLIRLhQ= code.forgejo.org/forgejo/reply v1.0.2 h1:dMhQCHV6/O3L5CLWNTol+dNzDAuyCK88z4J/lCdgFuQ= code.forgejo.org/forgejo/reply v1.0.2/go.mod h1:RyZUfzQLc+fuLIGjTSQWDAJWPiL4WtKXB/FifT5fM7U= -code.forgejo.org/forgejo/runner/v12 v12.2.0 h1:CNRdZqXD32xZOdlQe154c+rIY6VcQ3avEyBqKcAy9SU= -code.forgejo.org/forgejo/runner/v12 v12.2.0/go.mod h1:m6i/RnHQObdagTZUUPR+Nb2Th3VBLOHzjZ6tVw7F0qs= +code.forgejo.org/forgejo/runner/v12 v12.6.4 h1:nhYj2wSj5BVKxcF0bRtMt/A9iGkxHPFJiIui+T/4mrc= +code.forgejo.org/forgejo/runner/v12 v12.6.4/go.mod h1:34ATLtcxtOgjAJiINaJvBoNJiKpL1hGn0kt+gk+zdyk= code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616 h1:kEZL84+02jY9RxXM4zHBWZ3Fml0B09cmP1LGkDsCfIA= code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= code.forgejo.org/go-chi/binding v1.0.1 h1:coKNI+X1NzRN7X85LlrpvBRqk0TXpJ+ja28vusQWEuY= @@ -46,8 +46,8 @@ code.forgejo.org/xorm/xorm v1.3.9-forgejo.4 h1:kyJHREXNEIuzpMwQoouTbUldPP6s/UlL3 code.forgejo.org/xorm/xorm v1.3.9-forgejo.4/go.mod h1:5ouTxqMcalQUvlBpQynRpzu/44GwaMpkA1nU+encsDE= code.gitea.io/sdk/gitea v0.21.0 h1:69n6oz6kEVHRo1+APQQyizkhrZrLsTLXey9142pfkD4= code.gitea.io/sdk/gitea v0.21.0/go.mod h1:tnBjVhuKJCn8ibdyyhvUyxrR1Ca2KHEoTWoukNhXQPA= -code.superseriousbusiness.org/exif-terminator v0.11.0 h1:Hof0MCcsa+1fS17gf86fTTZ8AQnMY9h9kzcc+2C6mVg= -code.superseriousbusiness.org/exif-terminator v0.11.0/go.mod h1:9sutT1axa/kSdlPLlRFjCNKmyo/KNx8eX3XZvWBlAEY= +code.superseriousbusiness.org/exif-terminator v0.11.1 h1:qnujLH4/Yk/CFtFMmtjozbdV6Ry5G3Q/E/mLlWm/gQI= +code.superseriousbusiness.org/exif-terminator v0.11.1/go.mod h1:/Z+3DHSrefCzzN5ePkGjVYKFErRimoeUf694Gz8Pn/Y= code.superseriousbusiness.org/go-jpeg-image-structure/v2 v2.3.0 h1:r9uq8StaSHYKJ8DklR9Xy+E9c40G1Z8yj5TRGi8L6+4= code.superseriousbusiness.org/go-jpeg-image-structure/v2 v2.3.0/go.mod h1:IK1OlR6APjVB3E9tuYGvf0qXMrwP+TrzcHS5rf4wffQ= code.superseriousbusiness.org/go-png-image-structure/v2 v2.3.0 h1:I512jiIeXDC4//2BeSPrRM2ZS4wpBKUaPeTPxakMNGA= @@ -56,8 +56,6 @@ codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570 h1:TXbikPqa7YRtf codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570/go.mod h1:IIAjsijsd8q1isWX8MACefDEgTQslQ4stk2AeeTt3kM= connectrpc.com/connect v1.19.1 h1:R5M57z05+90EfEvCY1b7hBxDVOUl45PrtXtAV2fOC14= connectrpc.com/connect v1.19.1/go.mod h1:tN20fjdGlewnSFeZxLKb0xwIZ6ozc3OQs2hTXy4du9w= -dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= -dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= @@ -73,9 +71,6 @@ github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+ github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= -github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo= @@ -102,8 +97,6 @@ github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kk github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -189,11 +182,9 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= -github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= +github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.6.0 h1:BtGB77njd6SVO6VztOHfPxKitJvd/VPT+OFBFMOi1Is= -github.com/cyphar/filepath-securejoin v0.6.0/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -241,8 +232,6 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/editorconfig/editorconfig-core-go/v2 v2.6.4 h1:CHwUbBVVyKWRX9kt5A/OtwhYUJB32DrFp9xzmjR6cac= github.com/editorconfig/editorconfig-core-go/v2 v2.6.4/go.mod h1:JWRVKHdVW+dkv6F8p+xGCa6a+TyMrqsFbFkSs/aQkrQ= -github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= -github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= github.com/emersion/go-imap v1.2.1 h1:+s9ZjMEjOB8NzZMVTM3cCenz2JrQIGGo5j1df19WjTA= github.com/emersion/go-imap v1.2.1/go.mod h1:Qlx1FSx2FTxjnjWpIlVNEuX+ylerZQNFE5NsmKFSejY= github.com/emersion/go-message v0.15.0/go.mod h1:wQUEfE+38+7EW8p8aZ96ptg6bAb1iwdgej19uXASlE4= @@ -250,8 +239,6 @@ github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTe github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 h1:hH4PQfOndHDlpzYfLAAfl63E8Le6F2+EL/cdhlkyRJY= github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U= -github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= -github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -276,8 +263,8 @@ github.com/go-ap/jsonld v0.0.0-20251216162253-e38fa664ea77/go.mod h1:4h93IBxgfnE github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo= github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-chi/chi/v5 v5.0.1/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-chi/chi/v5 v5.2.3 h1:WQIt9uxdsAbgIYgid+BpYc+liqQZGMHRaUwp0JUcvdE= -github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= +github.com/go-chi/chi/v5 v5.2.4 h1:WtFKPHwlywe8Srng8j2BhOD9312j9cGUxG1SP4V2cR4= +github.com/go-chi/chi/v5 v5.2.4/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0= github.com/go-chi/cors v1.2.2 h1:Jmey33TE+b+rB7fT8MUy1u0I4L+NARQlK6LhzKPSyQE= github.com/go-chi/cors v1.2.2/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58= github.com/go-co-op/gocron v1.37.0 h1:ZYDJGtQ4OMhTLKOKMIch+/CY70Brbb1dGdooLEhh7b0= @@ -297,10 +284,8 @@ github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66D github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.16.3 h1:Z8BtvxZ09bYm/yYNgPKCzgWtaRqDTgIKRgIRHBfU6Z8= -github.com/go-git/go-git/v5 v5.16.3/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= +github.com/go-git/go-git/v5 v5.16.5 h1:mdkuqblwr57kVfXri5TTH+nMFLNUxIj9Z7F5ykFbw5s= +github.com/go-git/go-git/v5 v5.16.5/go.mod h1:QOMLpNf1qxuSY4StA/ArOdfFR2TrKEjJiye2kel2m+M= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= @@ -369,8 +354,6 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -401,8 +384,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/go-github/v74 v74.0.0 h1:yZcddTUn8DPbj11GxnMrNiAnXH14gNs559AsUpNpPgM= -github.com/google/go-github/v74 v74.0.0/go.mod h1:ubn/YdyftV80VPSI26nSJvaEsTOnsjrxG3o9kJhcyak= +github.com/google/go-github/v81 v81.0.0 h1:hTLugQRxSLD1Yei18fk4A5eYjOGLUBKAl/VCqOfFkZc= +github.com/google/go-github/v81 v81.0.0/go.mod h1:upyjaybucIbBIuxgJS7YLOZGziyvvJ92WX6WEBNE3sM= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/go-tpm v0.9.5 h1:ocUmnDebX54dnW+MQWGQRbdaAcJELsa6PqZhJ48KwVU= @@ -492,12 +475,10 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= -github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= -github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= +github.com/klauspost/compress v1.18.3 h1:9PJRvfbmTabkOX8moIpXPbMMbYN60bWImDDU7L+/6zw= +github.com/klauspost/compress v1.18.3/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= @@ -535,8 +516,8 @@ github.com/mattn/go-runewidth v0.0.17 h1:78v8ZlW0bP43XfmAfPsdXcoNCelfMHsDmd/pkEN github.com/mattn/go-runewidth v0.0.17/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= -github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v1.14.34 h1:3NtcvcUnFBPsuRcno8pUtupspG/GM+9nZ88zgJcp6Zk= +github.com/mattn/go-sqlite3 v1.14.34/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/meilisearch/meilisearch-go v0.34.0 h1:P+Ohdx4/PCxXaoI5wNi0LMwPkuiNrF/kGIzBrKYS4tw= github.com/meilisearch/meilisearch-go v0.34.0/go.mod h1:cUVJZ2zMqTvvwIMEEAdsWH+zrHsrLpAw6gm8Lt1MXK0= github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc= @@ -608,8 +589,6 @@ github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= -github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -631,8 +610,8 @@ github.com/redis/go-redis/v9 v9.17.2 h1:P2EGsA4qVIM3Pp+aPocCJ7DguDHhqrXNhVcEp4Vi github.com/redis/go-redis/v9 v9.17.2/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rhysd/actionlint v1.7.8 h1:3d+N9ourgAxVYG4z2IFxFIk/YiT6V+VnKASfXGwT60E= -github.com/rhysd/actionlint v1.7.8/go.mod h1:3kiS6egcbXG+vQsJIhFxTz+UKaF1JprsE0SKrpCZKvU= +github.com/rhysd/actionlint v1.7.10 h1:FL3XIEs72G4/++168vlv5FKOWMSWvWIQw1kBCadyOcM= +github.com/rhysd/actionlint v1.7.10/go.mod h1:ZHX/hrmknlsJN73InPTKsKdXpAv9wVdrJy8h8HAwFHg= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -651,11 +630,8 @@ github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCw github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs= github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= -github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= +github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= +github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= github.com/sorairolake/lzip-go v0.3.8 h1:j5Q2313INdTA80ureWYRhX+1K78mUXfMoPZCw/ivWik= github.com/sorairolake/lzip-go v0.3.8/go.mod h1:JcBqGMV0frlxwrsE9sMWXDjqn3EeVf0/54YPsw66qkU= github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= @@ -667,7 +643,6 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= @@ -692,8 +667,6 @@ github.com/valyala/fastjson v1.6.7 h1:ZE4tRy0CIkh+qDc5McjatheGX2czdn8slQjomexVpB github.com/valyala/fastjson v1.6.7/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= -github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yohcop/openid-go v1.0.1 h1:DPRd3iPO5F6O5zX2e62XpVAbPT6wV51cuucH0z9g3js= @@ -734,8 +707,8 @@ go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U= go.uber.org/zap/exp v0.3.0/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -go.yaml.in/yaml/v4 v4.0.0-rc.2 h1:/FrI8D64VSr4HtGIlUtlFMGsm7H7pWTbj6vOLVZcA6s= -go.yaml.in/yaml/v4 v4.0.0-rc.2/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= +go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= +go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= go4.org v0.0.0-20230225012048-214862532bf5 h1:nifaUDeh+rPaBCMPMQHZmvJf+QdpLFnuQPwx+LxVmtc= go4.org v0.0.0-20230225012048-214862532bf5/go.mod h1:F57wTi5Lrj6WLyswp5EYV1ncrEbFGHD4hhz6S1ZYeaU= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -745,13 +718,12 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= -golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= +golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= +golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -764,8 +736,8 @@ golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/y golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.33.0 h1:LXRZRnv1+zGd5XBUVRFmYEphyyKJjQjCRiOuAP3sZfQ= -golang.org/x/image v0.33.0/go.mod h1:DD3OsTYT9chzuzTQt+zMcOlBHgfoKQb1gry8p76Y1sc= +golang.org/x/image v0.36.0 h1:Iknbfm1afbgtwPTmHnS2gTM/6PPZfH+z2EFuOkSbqwc= +golang.org/x/image v0.36.0/go.mod h1:YsWD2TyyGKiIX1kZlu9QfKIsQ4nAAK9bdgdrIsE7xy4= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -787,8 +759,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= -golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= +golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= +golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -810,7 +782,6 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -820,8 +791,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -856,7 +827,6 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -865,13 +835,10 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -882,8 +849,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= -golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -893,8 +860,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= -golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= +golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= +golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -908,8 +875,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= -golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= +golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= +golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= @@ -943,8 +910,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= -golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= +golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= +golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/models/actions/run.go b/models/actions/run.go index 8194c07940..08fd445091 100644 --- a/models/actions/run.go +++ b/models/actions/run.go @@ -455,6 +455,10 @@ func GetRunByIndex(ctx context.Context, repoID, index int64) (*ActionRun, error) return run, nil } +// Error returned when ActionRun's optimistic concurrency control has indicated that the record has been updated in the +// database by another session since it was loaded in-memory in this session. +var ErrActionRunOutOfDate = errors.New("run has changed") + // UpdateRun updates a run. // It requires the inputted run has Version set. // It will return error if the version is not matched (it means the run has been changed after loaded). @@ -471,8 +475,9 @@ func UpdateRunWithoutNotification(ctx context.Context, run *ActionRun, cols ...s return err } if affected == 0 { - return errors.New("run has changed") - // It's impossible that the run is not found, since Gitea never deletes runs. + // UPDATE has no conditions on it, and we never delete runs, so the only possible cause of this is + // `xorm:"version"` tagged field indicated that the version has changed since the record was loaded. + return ErrActionRunOutOfDate } if run.Status != 0 || slices.Contains(cols, "status") { @@ -495,4 +500,35 @@ func UpdateRunWithoutNotification(ctx context.Context, run *ActionRun, cols ...s return nil } +// Compute the Status, Started, and Stopped fields of an ActionRun based upon the current job state within the run. +// Returned is the [ActionRun] with modifications if necessary, a slice of column names that have been updated, or an +// error if the calculation failed. The caller is responsible for then invoking [actions_service.UpdateRun] for an +// update with notifications, or [actions_model.UpdateRunWithoutNotification] if notifications are already handled. +func ComputeRunStatus(ctx context.Context, runID int64) (run *ActionRun, columns []string, err error) { + run, err = GetRunByID(ctx, runID) + if err != nil { + return nil, nil, err + } + jobs, err := GetRunJobsByRunID(ctx, runID) + if err != nil { + return nil, nil, err + } + + newStatus := AggregateJobStatus(jobs) + if run.Status != newStatus { + run.Status = newStatus + columns = append(columns, "status") + } + if run.Started.IsZero() && run.Status.IsRunning() { + run.Started = timeutil.TimeStampNow() + columns = append(columns, "started") + } + if run.Stopped.IsZero() && run.Status.IsDone() { + run.Stopped = timeutil.TimeStampNow() + columns = append(columns, "stopped") + } + + return run, columns, nil +} + type ActionRunIndex db.ResourceIndex diff --git a/models/actions/run_job.go b/models/actions/run_job.go index 8096bfb6b5..ed1cefbaa5 100644 --- a/models/actions/run_job.go +++ b/models/actions/run_job.go @@ -137,6 +137,22 @@ func GetRunJobsByRunID(ctx context.Context, runID int64) ([]*ActionRunJob, error return jobs, nil } +// Check if the ActionRun has any jobs other than those included in the jobs parameter. +func RunHasOtherJobs(ctx context.Context, runID int64, jobs []*ActionRunJob) (bool, error) { + jobIDs := make([]int64, len(jobs)) + for i, job := range jobs { + jobIDs[i] = job.ID + } + otherJobs, err := db.GetEngine(ctx). + Where("run_id = ?", runID). + Where(builder.NotIn("id", jobIDs)). + Count(&ActionRunJob{}) + if err != nil { + return false, err + } + return otherJobs > 0, nil +} + // All calls to UpdateRunJobWithoutNotification that change run.Status for any run from a not done status to a done status must call the ActionRunNowDone notification channel. // Use the wrapper function UpdateRunJob instead. func UpdateRunJobWithoutNotification(ctx context.Context, job *ActionRunJob, cond builder.Cond, cols ...string) (int64, error) { @@ -174,34 +190,18 @@ func UpdateRunJobWithoutNotification(ctx context.Context, job *ActionRunJob, con } } - { - // Other goroutines may aggregate the status of the run and update it too. - // So we need load the run and its jobs before updating the run. - run, err := GetRunByID(ctx, job.RunID) - if err != nil { - return 0, err - } - jobs, err := GetRunJobsByRunID(ctx, job.RunID) - if err != nil { - return 0, err - } - run.Status = AggregateJobStatus(jobs) - if run.Started.IsZero() && run.Status.IsRunning() { - run.Started = timeutil.TimeStampNow() - } - if run.Stopped.IsZero() && run.Status.IsDone() { - run.Stopped = timeutil.TimeStampNow() - } - // As the caller has to ensure the ActionRunNowDone notification is sent we can ignore doing so here. - if err := UpdateRunWithoutNotification(ctx, run, "status", "started", "stopped"); err != nil { - return 0, fmt.Errorf("update run %d: %w", run.ID, err) - } + run, columns, err := ComputeRunStatus(ctx, job.RunID) + if err != nil { + return 0, fmt.Errorf("compute run status: %w", err) + } + if err := UpdateRunWithoutNotification(ctx, run, columns...); err != nil { + return 0, fmt.Errorf("update run %d: %w", run.ID, err) } return affected, nil } -func AggregateJobStatus(jobs []*ActionRunJob) Status { +var AggregateJobStatus = func(jobs []*ActionRunJob) Status { allSuccessOrSkipped := len(jobs) != 0 allSkipped := len(jobs) != 0 var hasFailure, hasCancelled, hasWaiting, hasRunning, hasBlocked bool diff --git a/models/actions/run_job_list.go b/models/actions/run_job_list.go index afc754f26a..f4cc4bfb45 100644 --- a/models/actions/run_job_list.go +++ b/models/actions/run_job_list.go @@ -8,6 +8,7 @@ import ( "forgejo.org/models/db" "forgejo.org/modules/container" + "forgejo.org/modules/optional" "forgejo.org/modules/timeutil" "xorm.io/builder" @@ -48,14 +49,15 @@ func (jobs ActionJobList) LoadAttributes(ctx context.Context, withRepo bool) err type FindRunJobOptions struct { db.ListOptions - RunID int64 - RepoID int64 - OwnerID int64 - CommitSHA string - Statuses []Status - UpdatedBefore timeutil.TimeStamp - Events []string // []webhook_module.HookEventType - RunNumber int64 + RunID int64 + RepoID int64 + OwnerID int64 + CommitSHA string + Statuses []Status + UpdatedBefore timeutil.TimeStamp + Events []string // []webhook_module.HookEventType + RunNumber int64 + RunNeedsApproval optional.Option[bool] } func (opts FindRunJobOptions) ToConds() builder.Cond { @@ -84,5 +86,12 @@ func (opts FindRunJobOptions) ToConds() builder.Cond { if opts.RunNumber > 0 { cond = cond.And(builder.Eq{"`index`": opts.RunNumber}) } + if opts.RunNeedsApproval.Has() { + cond = cond.And(builder.Exists(builder.Select("id").From("action_run", "outer_run"). + Where(builder.Eq{ + "outer_run.need_approval": opts.RunNeedsApproval.Value(), + "outer_run.id": builder.Expr("run_id"), + }))) + } return cond } diff --git a/models/actions/run_job_test.go b/models/actions/run_job_test.go index 9cba48705b..c122b1ff55 100644 --- a/models/actions/run_job_test.go +++ b/models/actions/run_job_test.go @@ -159,3 +159,23 @@ func TestActionRunJob_IsIncompleteRunsOn(t *testing.T) { }) } } + +func TestRunHasOtherJobs(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + jobs, err := GetRunJobsByRunID(t.Context(), 791) + require.NoError(t, err) + assert.Len(t, jobs, 1) + + has, err := RunHasOtherJobs(t.Context(), 791, nil) + require.NoError(t, err) + assert.True(t, has) + + has, err = RunHasOtherJobs(t.Context(), 791, []*ActionRunJob{}) + require.NoError(t, err) + assert.True(t, has) + + has, err = RunHasOtherJobs(t.Context(), 791, jobs) + require.NoError(t, err) + assert.False(t, has) +} diff --git a/models/actions/run_list.go b/models/actions/run_list.go index 174d2aa70c..92be510569 100644 --- a/models/actions/run_list.go +++ b/models/actions/run_list.go @@ -5,7 +5,6 @@ package actions import ( "context" - "strings" "forgejo.org/models/db" repo_model "forgejo.org/models/repo" @@ -65,15 +64,14 @@ func (runs RunList) LoadRepos(ctx context.Context) error { type FindRunOptions struct { db.ListOptions - RepoID int64 - OwnerID int64 - WorkflowID string - Ref string // the commit/tag/… that caused this workflow - TriggerUserID int64 - TriggerEvent webhook_module.HookEventType - Approved bool // not util.OptionalBool, it works only when it's true - Status []Status - ConcurrencyGroup string + RepoID int64 + OwnerID int64 + WorkflowID string + Ref string // the commit/tag/… that caused this workflow + TriggerUserID int64 + TriggerEvent webhook_module.HookEventType + Approved bool // not util.OptionalBool, it works only when it's true + Status []Status } func (opts FindRunOptions) ToConds() builder.Cond { @@ -102,9 +100,6 @@ func (opts FindRunOptions) ToConds() builder.Cond { if opts.TriggerEvent != "" { cond = cond.And(builder.Eq{"trigger_event": opts.TriggerEvent}) } - if opts.ConcurrencyGroup != "" { - cond = cond.And(builder.Eq{"concurrency_group": strings.ToLower(opts.ConcurrencyGroup)}) - } return cond } diff --git a/models/actions/run_test.go b/models/actions/run_test.go index 3a169dd56a..064f3fbcea 100644 --- a/models/actions/run_test.go +++ b/models/actions/run_test.go @@ -272,3 +272,122 @@ jobs: // Expect job with an incomplete runs-on to be StatusBlocked: assert.Equal(t, StatusBlocked, job.Status) } + +func TestComputeRunStatus(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + t.Run("no changes", func(t *testing.T) { + run, columns, err := ComputeRunStatus(t.Context(), 791) + require.NoError(t, err) + assert.Equal(t, StatusSuccess, run.Status) + assert.NotContains(t, columns, "status") + assert.EqualValues(t, 1683636528, run.Started) + assert.NotContains(t, columns, "started") + assert.EqualValues(t, 1683636626, run.Stopped) + assert.NotContains(t, columns, "stopped") + }) + + t.Run("change status", func(t *testing.T) { + job := unittest.AssertExistsAndLoadBean(t, &ActionRunJob{ID: 192}) + job.Status = StatusFailure + affected, err := db.GetEngine(t.Context()).Cols("status").ID(job.ID).Update(job) + require.NoError(t, err) + require.EqualValues(t, 1, affected) + + run, columns, err := ComputeRunStatus(t.Context(), 791) + require.NoError(t, err) + assert.Equal(t, StatusFailure, run.Status) + assert.Contains(t, columns, "status") + assert.NotContains(t, columns, "started") + assert.NotContains(t, columns, "stopped") + }) + + t.Run("won't change started if not running", func(t *testing.T) { + job := unittest.AssertExistsAndLoadBean(t, &ActionRunJob{ID: 192}) + job.Status = StatusBlocked + affected, err := db.GetEngine(t.Context()).Cols("status").ID(job.ID).Update(job) + require.NoError(t, err) + require.EqualValues(t, 1, affected) + + preRun := unittest.AssertExistsAndLoadBean(t, &ActionRun{ID: 791}) + preRun.Started = 0 + affected, err = db.GetEngine(t.Context()).Cols("started").ID(preRun.ID).Update(preRun) + require.NoError(t, err) + require.EqualValues(t, 1, affected) + + run, columns, err := ComputeRunStatus(t.Context(), 791) + require.NoError(t, err) + assert.Equal(t, StatusBlocked, run.Status) + assert.EqualValues(t, 0, run.Started) + assert.Contains(t, columns, "status") + assert.NotContains(t, columns, "started") + assert.NotContains(t, columns, "stopped") + }) + + t.Run("change started", func(t *testing.T) { + // Need the job to be "Running" for started to appear to change + job := unittest.AssertExistsAndLoadBean(t, &ActionRunJob{ID: 192}) + job.Status = StatusRunning + affected, err := db.GetEngine(t.Context()).Cols("status").ID(job.ID).Update(job) + require.NoError(t, err) + require.EqualValues(t, 1, affected) + + preRun := unittest.AssertExistsAndLoadBean(t, &ActionRun{ID: 791}) + preRun.Started = 0 + affected, err = db.GetEngine(t.Context()).Cols("started").ID(preRun.ID).Update(preRun) + require.NoError(t, err) + require.EqualValues(t, 1, affected) + + run, columns, err := ComputeRunStatus(t.Context(), 791) + require.NoError(t, err) + assert.Equal(t, StatusRunning, run.Status) + assert.NotEqualValues(t, 0, run.Started) + assert.Contains(t, columns, "status") + assert.Contains(t, columns, "started") + assert.NotContains(t, columns, "stopped") + }) + + t.Run("won't change stopped if not done", func(t *testing.T) { + job := unittest.AssertExistsAndLoadBean(t, &ActionRunJob{ID: 192}) + job.Status = StatusRunning + affected, err := db.GetEngine(t.Context()).Cols("status").ID(job.ID).Update(job) + require.NoError(t, err) + require.EqualValues(t, 1, affected) + + preRun := unittest.AssertExistsAndLoadBean(t, &ActionRun{ID: 791}) + preRun.Stopped = 0 + affected, err = db.GetEngine(t.Context()).Cols("stopped").ID(preRun.ID).Update(preRun) + require.NoError(t, err) + require.EqualValues(t, 1, affected) + + run, columns, err := ComputeRunStatus(t.Context(), 791) + require.NoError(t, err) + assert.Equal(t, StatusRunning, run.Status) + assert.EqualValues(t, 0, run.Stopped) + assert.Contains(t, columns, "status") + assert.NotContains(t, columns, "stopped") + }) + + t.Run("change stopped", func(t *testing.T) { + // Need the job to be some version of Done for stopped to appear to change + job := unittest.AssertExistsAndLoadBean(t, &ActionRunJob{ID: 192}) + job.Status = StatusSuccess + affected, err := db.GetEngine(t.Context()).Cols("status").ID(job.ID).Update(job) + require.NoError(t, err) + require.EqualValues(t, 1, affected) + + preRun := unittest.AssertExistsAndLoadBean(t, &ActionRun{ID: 791}) + preRun.Stopped = 0 + affected, err = db.GetEngine(t.Context()).Cols("stopped").ID(preRun.ID).Update(preRun) + require.NoError(t, err) + require.EqualValues(t, 1, affected) + + run, columns, err := ComputeRunStatus(t.Context(), 791) + require.NoError(t, err) + assert.Equal(t, StatusSuccess, run.Status) + assert.NotEqualValues(t, 0, run.Stopped) + assert.NotContains(t, columns, "status") + assert.NotContains(t, columns, "started") + assert.Contains(t, columns, "stopped") + }) +} diff --git a/models/activities/main_test.go b/models/activities/main_test.go index a5245ab1d3..403cf10c0f 100644 --- a/models/activities/main_test.go +++ b/models/activities/main_test.go @@ -7,10 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/models/asymkey/gpg_key.go b/models/asymkey/gpg_key.go index 64866da076..cae717011e 100644 --- a/models/asymkey/gpg_key.go +++ b/models/asymkey/gpg_key.go @@ -111,7 +111,13 @@ func GPGKeyToEntity(ctx context.Context, k *GPGKey) (*openpgp.Entity, error) { if err != nil { return nil, err } - return keys[0], err + + for _, key := range keys { + if key.PrimaryKey.KeyIdString() == k.KeyID { + return key, nil + } + } + return nil, fmt.Errorf("key with %s id not found", k.KeyID) } // parseSubGPGKey parse a sub Key diff --git a/models/auth/main_test.go b/models/auth/main_test.go index b30db24483..5b8ca00831 100644 --- a/models/auth/main_test.go +++ b/models/auth/main_test.go @@ -8,12 +8,7 @@ import ( "forgejo.org/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/auth" - _ "forgejo.org/models/forgefed" - _ "forgejo.org/models/perm/access" + _ "forgejo.org/modules/testimport" ) func TestMain(m *testing.M) { diff --git a/models/avatars/main_test.go b/models/avatars/main_test.go index bdc66954b1..f8c90a09e6 100644 --- a/models/avatars/main_test.go +++ b/models/avatars/main_test.go @@ -7,10 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/perm/access" ) func TestMain(m *testing.M) { diff --git a/models/db/iterate.go b/models/db/iterate.go index 5e30b5e8bc..d2315cb12c 100644 --- a/models/db/iterate.go +++ b/models/db/iterate.go @@ -5,8 +5,10 @@ package db import ( "context" + "errors" "fmt" "reflect" + "strings" "forgejo.org/modules/setting" @@ -84,3 +86,123 @@ func extractFieldValue(bean any, fieldName string) any { field := v.FieldByName(fieldName) return field.Interface() } + +// IterateByKeyset iterates all the records on a database (matching the provided condition) in the order of specified +// order fields, and invokes the provided handler function for each record. It is safe to UPDATE or DELETE the record in +// the handler function, as long as the order fields are not mutated on the record (which could cause records to be +// missed or iterated multiple times). +// +// Assuming order fields a, b, and c, then database queries will be performed as "SELECT * FROM table WHERE (a, b, c) > +// (last_a, last_b, last_c) ORDER BY a, b, c LIMIT buffer_size" repeatedly until the query returns no records (except +// the first query will have no WHERE clause). +// +// Critical requirements for proper usage: +// +// - the order fields encompass at least one UNIQUE or PRIMARY KEY constraint of the table to ensure that records are +// not duplicated -- for example, if the table has a unique index covering `(repo_id, index)`, then it would be safe to +// use this function as long as both fields (in either order) are provided as order fields. +// +// - none of the order fields may have NULL values in them, as the `=` and `>` comparisons being performed by the +// iterative queries will not operate on these records consistently as they do with other values. +// +// This implementation could be a much simpler streaming scan of the query results, except that doesn't permit making +// any additional database queries or data modifications in the target function -- SQLite cannot write while holding a +// read lock. Buffering pages of data in-memory avoids that issue. +// +// Performance: +// +// - High performance will result from an alignment of an index on the table with the order fields, in the same field +// order, even if additional ordering fields could be provided after the index fields. In the absence of this index +// alignment, it is reasonable to expect that every extra page of data accessed will require a query that will perform +// an index scan (if available) or sequential scan of the target table. In testing on the `commit_status` table with +// 455k records, a fully index-supported ordering allowed each query page to execute in 0.18ms, as opposed to 80ms +// per-query without matching supporting index. +// +// - In the absence of a matching index, slower per-query performance can be compensated with a larger `batchSize` +// parameter, which controls how many records to fetch at once and therefore reduces the number of queries required. +// This requires more memory. Similar `commit_status` table testing showed these stats for iteration time and memory +// usage for different buffer sizes; specifics will vary depending on the target table: +// - buffer size = 1,000,000 - iterates in 2.8 seconds, consumes 363 MB of RAM +// - buffer size = 100,000 - iterates in 3.5 seconds, consume 130 MB of RAM +// - buffer size = 10,000 - iterates in 7.1 seconds, consumes 59 MB of RAM +// - buffer size = 1,000 - iterates in 33.9 seconds, consumes 42 MB of RAM +func IterateByKeyset[Bean any](ctx context.Context, cond builder.Cond, orderFields []string, batchSize int, f func(ctx context.Context, bean *Bean) error) error { + var dummy Bean + + if len(orderFields) == 0 { + return errors.New("orderFields must be provided") + } + + table, err := TableInfo(&dummy) + if err != nil { + return fmt.Errorf("unable to fetch table info for bean %v: %w", dummy, err) + } + goFieldNames := make([]string, len(orderFields)) + for i, f := range orderFields { + goFieldNames[i] = table.GetColumn(f).FieldName + } + sqlFieldNames := make([]string, len(orderFields)) + for i, f := range orderFields { + // Support field names like "index" which need quoting in builder.Cond & OrderBy + sqlFieldNames[i] = x.Dialect().Quoter().Quote(f) + } + + var lastKey []any + + // For the order fields, generate clauses (a, b, c) and (?, ?, ?) which will be used in the WHERE clause when + // reading additional pages of data. + rowValue := strings.Builder{} + rowParameterValue := strings.Builder{} + rowValue.WriteString("(") + rowParameterValue.WriteString("(") + for i, f := range sqlFieldNames { + rowValue.WriteString(f) + rowParameterValue.WriteString("?") + if i != len(sqlFieldNames)-1 { + rowValue.WriteString(", ") + rowParameterValue.WriteString(", ") + } + } + rowValue.WriteString(")") + rowParameterValue.WriteString(")") + + for { + select { + case <-ctx.Done(): + return ctx.Err() + default: + beans := make([]*Bean, 0, batchSize) + + sess := GetEngine(ctx) + for _, f := range sqlFieldNames { + sess = sess.OrderBy(f) + } + if cond != nil { + sess = sess.Where(cond) + } + if lastKey != nil { + sess = sess.Where( + builder.Expr(fmt.Sprintf("%s > %s", rowValue.String(), rowParameterValue.String()), lastKey...)) + } + + if err := sess.Limit(batchSize).Find(&beans); err != nil { + return err + } + if len(beans) == 0 { + return nil + } + + for _, bean := range beans { + if err := f(ctx, bean); err != nil { + return err + } + } + + lastBean := beans[len(beans)-1] + lastKey = make([]any, len(goFieldNames)) + for i := range goFieldNames { + lastKey[i] = extractFieldValue(lastBean, goFieldNames[i]) + } + } + } +} diff --git a/models/db/iterate_test.go b/models/db/iterate_test.go index 405db84866..d60db3da11 100644 --- a/models/db/iterate_test.go +++ b/models/db/iterate_test.go @@ -10,6 +10,7 @@ import ( "testing" "forgejo.org/models/db" + git_model "forgejo.org/models/git" repo_model "forgejo.org/models/repo" "forgejo.org/models/unittest" "forgejo.org/modules/setting" @@ -21,7 +22,6 @@ import ( ) func TestIterate(t *testing.T) { - db.SetLogSQL(t.Context(), true) defer test.MockVariableValue(&setting.Database.IterateBufferSize, 50)() t.Run("No Modifications", func(t *testing.T) { @@ -115,3 +115,31 @@ func TestIterate(t *testing.T) { assert.Empty(t, remainingRepoIDs) }) } + +func TestIterateMultipleFields(t *testing.T) { + for _, bufferSize := range []int{1, 2, 3, 10} { // 8 records in fixture + t.Run(fmt.Sprintf("No Modifications bufferSize=%d", bufferSize), func(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + // Fetch all the commit status IDs... + var remainingIDs []int64 + err := db.GetEngine(t.Context()).Table(&git_model.CommitStatus{}).Cols("id").Find(&remainingIDs) + require.NoError(t, err) + require.NotEmpty(t, remainingIDs) + + // Ensure that every repo unit ID is found when doing iterate: + err = db.IterateByKeyset(t.Context(), + nil, + []string{"repo_id", "sha", "context", "index", "id"}, + bufferSize, + func(ctx context.Context, commit_status *git_model.CommitStatus) error { + remainingIDs = slices.DeleteFunc(remainingIDs, func(n int64) bool { + return commit_status.ID == n + }) + return nil + }) + require.NoError(t, err) + assert.Empty(t, remainingIDs) + }) + } +} diff --git a/models/db/main_test.go b/models/db/main_test.go index 4b06923950..77773b5d34 100644 --- a/models/db/main_test.go +++ b/models/db/main_test.go @@ -7,9 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models" - _ "forgejo.org/models/repo" ) func TestMain(m *testing.M) { diff --git a/models/fixtures/action_run.yml b/models/fixtures/action_run.yml index 8fa04b0066..41559ef788 100644 --- a/models/fixtures/action_run.yml +++ b/models/fixtures/action_run.yml @@ -533,3 +533,43 @@ updated: 1683636626 need_approval: false approved_by: 0 + +- + id: 895 + title: "job output" + repo_id: 4 + owner_id: 1 + workflow_id: "test.yaml" + index: 191 + trigger_user_id: 1 + ref: "refs/heads/master" + commit_sha: "c2d72f548424103f01ee1dc02889c1e2bff816b0" + event: "push" + is_fork_pull_request: false + status: 2 + started: 1683636528 + stopped: 1683636626 + created: 1683636108 + updated: 1683636626 + need_approval: false + approved_by: 0 + +- + id: 896 + title: "job output" + repo_id: 4 + owner_id: 1 + workflow_id: "test.yaml" + index: 192 + trigger_user_id: 1 + ref: "refs/heads/master" + commit_sha: "c2d72f548424103f01ee1dc02889c1e2bff816b0" + event: "push" + is_fork_pull_request: false + status: 2 + started: 1683636528 + stopped: 1683636626 + created: 1683636108 + updated: 1683636626 + need_approval: false + approved_by: 0 diff --git a/models/fixtures/action_run_job.yml b/models/fixtures/action_run_job.yml index bb812c1570..2d8ea9ff6f 100644 --- a/models/fixtures/action_run_job.yml +++ b/models/fixtures/action_run_job.yml @@ -69,6 +69,66 @@ status: 5 started: 1683636528 stopped: 1683636626 +- + id: 197 + run_id: 895 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: false + name: job1 (1) + attempt: 0 + job_id: job1 + task_id: 54 + status: 2 # failure + runs_on: '["postmarketOS"]' + started: 1683636528 + stopped: 1683636626 +- + id: 198 + run_id: 895 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: false + name: job1 (2) + attempt: 0 + job_id: job1 + task_id: 55 + status: 6 # running + runs_on: '["postmarketOS"]' + started: 1683636528 + stopped: 1683636626 +- + id: 199 + run_id: 896 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: false + name: job1 (1) + attempt: 0 + job_id: job1 + task_id: 56 + status: 2 # failure + runs_on: '["postmarketOS"]' + started: 1683636528 + stopped: 1683636626 +- + id: 200 + run_id: 896 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: false + name: job1 (2) + attempt: 0 + job_id: job1 + task_id: 57 + status: 1 # success + runs_on: '["postmarketOS"]' + started: 1683636528 + stopped: 1683636626 - id: 292 run_id: 891 diff --git a/models/fixtures/action_task.yml b/models/fixtures/action_task.yml index 956bc736f9..b931ca0aa8 100644 --- a/models/fixtures/action_task.yml +++ b/models/fixtures/action_task.yml @@ -157,3 +157,83 @@ log_length: 707 log_size: 90179 log_expired: false +- + id: 54 + job_id: 197 + attempt: 0 + runner_id: 1 + status: 2 # failure + started: 1683636528 + stopped: 1683636626 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: false + token_hash: b8d3962425466b6709b9ac51446f93260c54afe8e7b6d3686e34f991fb8a8953822b0deed86fe41a103f34bc48dbc4784225 + token_salt: ffffffffff + token_last_eight: ffffffff + log_filename: artifact-test2/2f/47.log + log_in_storage: true + log_length: 707 + log_size: 90179 + log_expired: false +- + id: 55 + job_id: 198 + attempt: 0 + runner_id: 1 + status: 6 # running + started: 1683636528 + stopped: 1683636626 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: false + token_hash: b8d3962425466b6709b9ac51446f93260c54afe8e7b6d3686e34f991fb8a8953822b0deed86fe41a103f34bc48dbc4784226 + token_salt: ffffffffff + token_last_eight: ffffffff + log_filename: artifact-test2/2f/47.log + log_in_storage: true + log_length: 707 + log_size: 90179 + log_expired: false +- + id: 56 + job_id: 199 + attempt: 0 + runner_id: 1 + status: 2 # failure + started: 1683636528 + stopped: 1683636626 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: false + token_hash: b8d3962425466b6709b9ac51446f93260c54afe8e7b6d3686e34f991fb8a8953822b0deed86fe41a103f34bc48dbc4784227 + token_salt: ffffffffff + token_last_eight: ffffffff + log_filename: artifact-test2/2f/47.log + log_in_storage: true + log_length: 707 + log_size: 90179 + log_expired: false +- + id: 57 + job_id: 200 + attempt: 0 + runner_id: 1 + status: 1 # success + started: 1683636528 + stopped: 1683636626 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: false + token_hash: b8d3962425466b6709b9ac51446f93260c54afe8e7b6d3686e34f991fb8a8953822b0deed86fe41a103f34bc48dbc4784228 + token_salt: ffffffffff + token_last_eight: ffffffff + log_filename: artifact-test2/2f/47.log + log_in_storage: true + log_length: 707 + log_size: 90179 + log_expired: false diff --git a/models/fixtures/project.yml b/models/fixtures/project.yml index 44d87bce04..54a3061859 100644 --- a/models/fixtures/project.yml +++ b/models/fixtures/project.yml @@ -42,7 +42,7 @@ is_closed: false creator_id: 2 board_type: 1 - type: 2 + type: 1 created_unix: 1688973000 updated_unix: 1688973000 @@ -54,7 +54,7 @@ is_closed: false creator_id: 2 board_type: 1 - type: 2 + type: 1 created_unix: 1688973000 updated_unix: 1688973000 @@ -66,6 +66,18 @@ is_closed: false creator_id: 2 board_type: 1 - type: 2 + type: 1 + created_unix: 1688973000 + updated_unix: 1688973000 + +- + id: 7 + title: project on org3 + owner_id: 3 + repo_id: 0 + is_closed: false + creator_id: 2 + board_type: 1 + type: 1 created_unix: 1688973000 updated_unix: 1688973000 diff --git a/models/fixtures/user.yml b/models/fixtures/user.yml index fa7607abcd..4e957f30f3 100644 --- a/models/fixtures/user.yml +++ b/models/fixtures/user.yml @@ -46,6 +46,7 @@ email: user2@example.com keep_email_private: true keep_pronouns_private: true + pronouns: he/him email_notifications_preference: enabled passwd: ZogKvWdyEx:password passwd_hash_algo: dummy diff --git a/models/forgejo/semver/main_test.go b/models/forgejo/semver/main_test.go index dcc9d588cd..d4c75675ea 100644 --- a/models/forgejo/semver/main_test.go +++ b/models/forgejo/semver/main_test.go @@ -6,11 +6,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/models/forgejo_migrations/foreign_key_utils.go b/models/forgejo_migrations/foreign_key_utils.go index fc2680e43e..2a792fd66b 100644 --- a/models/forgejo_migrations/foreign_key_utils.go +++ b/models/forgejo_migrations/foreign_key_utils.go @@ -4,28 +4,30 @@ package forgejo_migrations import ( - "errors" + "fmt" "forgejo.org/modules/log" + "xorm.io/builder" "xorm.io/xorm" ) -func syncDoctorForeignKey(x *xorm.Engine, beans []any) error { - for _, bean := range beans { - // Sync() drops indexes by default, which will cause unnecessary rebuilding of indexes when syncDoctorForeignKey - // is used with partial bean definitions; so we disable that option - _, err := x.SyncWithOptions(xorm.SyncOptions{IgnoreDropIndices: true}, bean) - if err != nil { - if errors.Is(err, xorm.ErrForeignKeyViolation) { - tableName := x.TableName(bean) - log.Error( - "Foreign key creation on table %s failed. Run `forgejo doctor check --all` to identify the orphaned records preventing this foreign key from being created. Error was: %v", - tableName, err) - return err - } - return err - } +// syncForeignKeyWithDelete will delete any records that match `cond`, and if present, log and warn to the +// administrator; then it will perform an `xorm.Sync()` in order to create foreign keys on the table definition. +func syncForeignKeyWithDelete(x *xorm.Engine, bean any, cond builder.Cond) error { + rowsDeleted, err := x.Where(cond).Delete(bean) + if err != nil { + return fmt.Errorf("failure to delete inconsistent records before foreign key sync: %w", err) } - return nil + if rowsDeleted > 0 { + tableName := x.TableName(bean) + log.Warn( + "Foreign key creation on table %s required deleting %d records with inconsistent foreign key values.", + tableName, rowsDeleted) + } + + // Sync() drops indexes by default, which will cause unnecessary rebuilding of indexes when syncForeignKeyWithDelete + // is used with partial bean definitions; so we disable that option + _, err = x.SyncWithOptions(xorm.SyncOptions{IgnoreDropIndices: true}, bean) + return err } diff --git a/models/forgejo_migrations/v14a_add-foreign-keys-collaboration.go b/models/forgejo_migrations/v14a_add-foreign-keys-collaboration.go index a52e8d6220..774dfe158c 100644 --- a/models/forgejo_migrations/v14a_add-foreign-keys-collaboration.go +++ b/models/forgejo_migrations/v14a_add-foreign-keys-collaboration.go @@ -4,6 +4,7 @@ package forgejo_migrations import ( + "xorm.io/builder" "xorm.io/xorm" ) @@ -19,7 +20,11 @@ func addForeignKeysCollaboration(x *xorm.Engine) error { RepoID int64 `xorm:"UNIQUE(s) INDEX NOT NULL REFERENCES(repository, id)"` UserID int64 `xorm:"UNIQUE(s) INDEX NOT NULL REFERENCES(user, id)"` } - return syncDoctorForeignKey(x, []any{ + return syncForeignKeyWithDelete(x, new(Collaboration), - }) + builder.Or( + builder.Expr("NOT EXISTS (SELECT id FROM repository WHERE repository.id = collaboration.repo_id)"), + builder.Expr("NOT EXISTS (SELECT id FROM `user` WHERE `user`.id = collaboration.user_id)"), + ), + ) } diff --git a/models/forgejo_migrations/v14a_add-foreign-keys-collaboration_test.go b/models/forgejo_migrations/v14a_add-foreign-keys-collaboration_test.go new file mode 100644 index 0000000000..657bdf377a --- /dev/null +++ b/models/forgejo_migrations/v14a_add-foreign-keys-collaboration_test.go @@ -0,0 +1,53 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations + +import ( + "testing" + + "forgejo.org/models/db" + migration_tests "forgejo.org/models/gitea_migrations/test" + "forgejo.org/modules/timeutil" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_addForeignKeysCollaboration(t *testing.T) { + type AccessMode int + type Collaboration struct { + ID int64 `xorm:"pk autoincr"` + RepoID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"` + UserID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"` + Mode AccessMode `xorm:"DEFAULT 2 NOT NULL"` + CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` + UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` + } + type Repository struct { + ID int64 `xorm:"pk autoincr"` + } + type User struct { + ID int64 `xorm:"pk autoincr"` + } + x, deferable := migration_tests.PrepareTestEnv(t, 0, new(User), new(Repository), new(Collaboration)) + defer deferable() + if x == nil || t.Failed() { + return + } + + require.NoError(t, addForeignKeysCollaboration(x)) + + var remainingRecords []*Collaboration + require.NoError(t, + db.GetEngine(t.Context()). + Table("collaboration"). + Select("`id`, `repo_id`, `user_id`"). + OrderBy("`id`"). + Find(&remainingRecords)) + assert.Equal(t, + []*Collaboration{ + {ID: 1, UserID: 1, RepoID: 1}, + }, + remainingRecords) +} diff --git a/models/forgejo_migrations/v14a_add-foreign-keys-forgejo_auth_token.go b/models/forgejo_migrations/v14a_add-foreign-keys-forgejo_auth_token.go index a5d8126d91..4aea62da50 100644 --- a/models/forgejo_migrations/v14a_add-foreign-keys-forgejo_auth_token.go +++ b/models/forgejo_migrations/v14a_add-foreign-keys-forgejo_auth_token.go @@ -4,6 +4,7 @@ package forgejo_migrations import ( + "xorm.io/builder" "xorm.io/xorm" ) @@ -18,7 +19,8 @@ func addForeignKeysForgejoAuthToken(x *xorm.Engine) error { type ForgejoAuthToken struct { UID int64 `xorm:"INDEX REFERENCES(user, id)"` } - return syncDoctorForeignKey(x, []any{ + return syncForeignKeyWithDelete(x, new(ForgejoAuthToken), - }) + builder.Expr("NOT EXISTS (SELECT id FROM `user` WHERE `user`.id = forgejo_auth_token.uid)"), + ) } diff --git a/models/forgejo_migrations/v14a_add-foreign-keys-forgejo_auth_token_test.go b/models/forgejo_migrations/v14a_add-foreign-keys-forgejo_auth_token_test.go new file mode 100644 index 0000000000..7f01a9ccf3 --- /dev/null +++ b/models/forgejo_migrations/v14a_add-foreign-keys-forgejo_auth_token_test.go @@ -0,0 +1,50 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations + +import ( + "testing" + + "forgejo.org/models/db" + migration_tests "forgejo.org/models/gitea_migrations/test" + "forgejo.org/modules/timeutil" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_addForeignKeysForgejoAuthToken(t *testing.T) { + type AuthorizationPurpose string + type ForgejoAuthToken struct { + ID int64 `xorm:"pk autoincr"` + UID int64 `xorm:"INDEX"` + LookupKey string `xorm:"INDEX UNIQUE"` + HashedValidator string + Purpose AuthorizationPurpose `xorm:"NOT NULL DEFAULT 'long_term_authorization'"` + Expiry timeutil.TimeStamp + } + type User struct { + ID int64 `xorm:"pk autoincr"` + } + x, deferable := migration_tests.PrepareTestEnv(t, 0, new(User), new(ForgejoAuthToken)) + defer deferable() + if x == nil || t.Failed() { + return + } + + require.NoError(t, addForeignKeysForgejoAuthToken(x)) + + var remainingRecords []*ForgejoAuthToken + require.NoError(t, + db.GetEngine(t.Context()). + Table("forgejo_auth_token"). + Select("`id`, `uid`"). + OrderBy("`id`"). + Find(&remainingRecords)) + assert.Equal(t, + []*ForgejoAuthToken{ + {ID: 1, UID: 1}, + }, + remainingRecords) +} diff --git a/models/forgejo_migrations/v14a_add-foreign-keys-pull_request-1.go b/models/forgejo_migrations/v14a_add-foreign-keys-pull_request-1.go index 6d262f385f..6e67207c7d 100644 --- a/models/forgejo_migrations/v14a_add-foreign-keys-pull_request-1.go +++ b/models/forgejo_migrations/v14a_add-foreign-keys-pull_request-1.go @@ -4,6 +4,7 @@ package forgejo_migrations import ( + "xorm.io/builder" "xorm.io/xorm" ) @@ -19,7 +20,11 @@ func addForeignKeysPullRequest1(x *xorm.Engine) error { IssueID int64 `xorm:"INDEX REFERENCES(issue, id)"` BaseRepoID int64 `xorm:"INDEX REFERENCES(repository, id)"` } - return syncDoctorForeignKey(x, []any{ + return syncForeignKeyWithDelete(x, new(PullRequest), - }) + builder.Or( + builder.Expr("NOT EXISTS (SELECT id FROM issue WHERE issue.id = pull_request.issue_id)"), + builder.Expr("NOT EXISTS (SELECT id FROM repository WHERE repository.id = pull_request.base_repo_id)"), + ), + ) } diff --git a/models/forgejo_migrations/v14a_add-foreign-keys-pull_request-1_test.go b/models/forgejo_migrations/v14a_add-foreign-keys-pull_request-1_test.go new file mode 100644 index 0000000000..ebe8600350 --- /dev/null +++ b/models/forgejo_migrations/v14a_add-foreign-keys-pull_request-1_test.go @@ -0,0 +1,69 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations + +import ( + "testing" + + "forgejo.org/models/db" + migration_tests "forgejo.org/models/gitea_migrations/test" + "forgejo.org/modules/timeutil" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_addForeignKeysPullRequest1(t *testing.T) { + type PullRequestType int + type PullRequestStatus int + type PullRequestFlow int + type PullRequest struct { + ID int64 `xorm:"pk autoincr"` + Type PullRequestType + Status PullRequestStatus + ConflictedFiles []string `xorm:"TEXT JSON"` + CommitsAhead int + CommitsBehind int + ChangedProtectedFiles []string `xorm:"TEXT JSON"` + IssueID int64 `xorm:"INDEX"` + Index int64 + HeadRepoID int64 `xorm:"INDEX"` + BaseRepoID int64 `xorm:"INDEX"` + HeadBranch string + BaseBranch string + MergeBase string `xorm:"VARCHAR(64)"` + AllowMaintainerEdit bool `xorm:"NOT NULL DEFAULT false"` + HasMerged bool `xorm:"INDEX"` + MergedCommitID string `xorm:"VARCHAR(64)"` + MergerID int64 `xorm:"INDEX"` + MergedUnix timeutil.TimeStamp `xorm:"updated INDEX"` + Flow PullRequestFlow `xorm:"NOT NULL DEFAULT 0"` + } + type Repository struct { + ID int64 `xorm:"pk autoincr"` + } + type Issue struct { + ID int64 `xorm:"pk autoincr"` + } + x, deferable := migration_tests.PrepareTestEnv(t, 0, new(Issue), new(Repository), new(PullRequest)) + defer deferable() + if x == nil || t.Failed() { + return + } + + require.NoError(t, addForeignKeysPullRequest1(x)) + + var remainingRecords []*PullRequest + require.NoError(t, + db.GetEngine(t.Context()). + Table("pull_request"). + Select("`id`, `issue_id`, `base_repo_id`"). + OrderBy("`id`"). + Find(&remainingRecords)) + assert.Equal(t, + []*PullRequest{ + {ID: 1, BaseRepoID: 1, IssueID: 1}, + }, + remainingRecords) +} diff --git a/models/forgejo_migrations_legacy/v41.go b/models/forgejo_migrations_legacy/v41.go index 4b3306debd..6dd25486c6 100644 --- a/models/forgejo_migrations_legacy/v41.go +++ b/models/forgejo_migrations_legacy/v41.go @@ -4,7 +4,6 @@ package forgejo_migrations_legacy import ( - "errors" "fmt" "forgejo.org/modules/log" @@ -13,23 +12,24 @@ import ( "xorm.io/xorm" ) -func syncDoctorForeignKey(x *xorm.Engine, beans []any) error { - for _, bean := range beans { - // Sync() drops indexes by default, which will cause unnecessary rebuilding of indexes when syncDoctorForeignKey - // is used with partial bean definitions; so we disable that option - _, err := x.SyncWithOptions(xorm.SyncOptions{IgnoreDropIndices: true}, bean) - if err != nil { - if errors.Is(err, xorm.ErrForeignKeyViolation) { - tableName := x.TableName(bean) - log.Error( - "Foreign key creation on table %s failed. Run `forgejo doctor check --all` to identify the orphaned records preventing this foreign key from being created. Error was: %v", - tableName, err) - return err - } - return err - } +// syncForeignKeyWithDelete will delete any records that match `cond`, and if present, log and warn to the +// administrator; then it will perform an `xorm.Sync()` in order to create foreign keys on the table definition. +func syncForeignKeyWithDelete(x *xorm.Engine, bean any, cond builder.Cond) error { + rowsDeleted, err := x.Where(cond).Delete(bean) + if err != nil { + return fmt.Errorf("failure to delete inconsistent records before foreign key sync: %w", err) } - return nil + if rowsDeleted > 0 { + tableName := x.TableName(bean) + log.Warn( + "Foreign key creation on table %s required deleting %d records with inconsistent foreign key values.", + tableName, rowsDeleted) + } + + // Sync() drops indexes by default, which will cause unnecessary rebuilding of indexes when syncForeignKeyWithDelete + // is used with partial bean definitions; so we disable that option + _, err = x.SyncWithOptions(xorm.SyncOptions{IgnoreDropIndices: true}, bean) + return err } func AddForeignKeysStopwatchTrackedTime(x *xorm.Engine) error { @@ -50,6 +50,7 @@ func AddForeignKeysStopwatchTrackedTime(x *xorm.Engine) error { err := x.Table("tracked_time"). Join("LEFT", "`user`", "`tracked_time`.user_id = `user`.id"). Where(builder.IsNull{"`user`.id"}). + Where(builder.NotNull{"tracked_time.user_id"}). Find(&trackedTime) if err != nil { return err @@ -63,8 +64,25 @@ func AddForeignKeysStopwatchTrackedTime(x *xorm.Engine) error { } } - return syncDoctorForeignKey(x, []any{ + err = syncForeignKeyWithDelete(x, new(Stopwatch), + builder.Or( + builder.Expr("NOT EXISTS (SELECT id FROM issue WHERE issue.id = stopwatch.issue_id)"), + builder.Expr("NOT EXISTS (SELECT id FROM `user` WHERE `user`.id = stopwatch.user_id)"), + ), + ) + if err != nil { + return err + } + + return syncForeignKeyWithDelete(x, new(TrackedTime), - }) + builder.Or( + builder.And( + builder.Expr("user_id IS NOT NULL"), + builder.Expr("NOT EXISTS (SELECT id FROM `user` WHERE `user`.id = tracked_time.user_id)"), + ), + builder.Expr("NOT EXISTS (SELECT id FROM issue WHERE issue.id = tracked_time.issue_id)"), + ), + ) } diff --git a/models/forgejo_migrations_legacy/v41_test.go b/models/forgejo_migrations_legacy/v41_test.go new file mode 100644 index 0000000000..47fc7f582e --- /dev/null +++ b/models/forgejo_migrations_legacy/v41_test.go @@ -0,0 +1,75 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations_legacy + +import ( + "testing" + + "forgejo.org/models/db" + migration_tests "forgejo.org/models/gitea_migrations/test" + "forgejo.org/modules/timeutil" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_AddForeignKeysStopwatchTrackedTime(t *testing.T) { + type Stopwatch struct { + ID int64 `xorm:"pk autoincr"` + IssueID int64 `xorm:"INDEX"` + UserID int64 `xorm:"INDEX"` + CreatedUnix timeutil.TimeStamp `xorm:"created"` + } + type TrackedTime struct { + ID int64 `xorm:"pk autoincr"` + IssueID int64 `xorm:"INDEX"` + UserID int64 `xorm:"INDEX"` + CreatedUnix int64 `xorm:"created"` + Time int64 `xorm:"NOT NULL"` + Deleted bool `xorm:"NOT NULL DEFAULT false"` + } + type User struct { + ID int64 `xorm:"pk autoincr"` + } + type Issue struct { + ID int64 `xorm:"pk autoincr"` + } + x, deferable := migration_tests.PrepareTestEnv(t, 0, new(User), new(Issue), new(Stopwatch), new(TrackedTime)) + defer deferable() + if x == nil || t.Failed() { + return + } + + require.NoError(t, AddForeignKeysStopwatchTrackedTime(x)) + + var remainingStopwatch []*Stopwatch + require.NoError(t, + db.GetEngine(t.Context()). + Table("stopwatch"). + Select("`id`, `issue_id`, `user_id`"). + OrderBy("`id`"). + Find(&remainingStopwatch)) + assert.Equal(t, + []*Stopwatch{ + {1, 1, 1, 0}, + }, + remainingStopwatch, + "stopwatch") + + var remainingTrackedTime []*TrackedTime + require.NoError(t, + db.GetEngine(t.Context()). + Table("tracked_time"). + Select("`id`, `issue_id`, `user_id`"). + OrderBy("`id`"). + Find(&remainingTrackedTime)) + assert.Equal(t, + []*TrackedTime{ + {ID: 1, IssueID: 1, UserID: 1}, + {ID: 4, IssueID: 1, UserID: 0}, + {ID: 5, IssueID: 1, UserID: 0}, + }, + remainingTrackedTime, + "tracked_time") +} diff --git a/models/forgejo_migrations_legacy/v44.go b/models/forgejo_migrations_legacy/v44.go index 459c7ac29d..9f2fcef4f4 100644 --- a/models/forgejo_migrations_legacy/v44.go +++ b/models/forgejo_migrations_legacy/v44.go @@ -4,6 +4,7 @@ package forgejo_migrations_legacy import ( + "xorm.io/builder" "xorm.io/xorm" ) @@ -12,7 +13,11 @@ func AddForeignKeysAccess(x *xorm.Engine) error { UserID int64 `xorm:"UNIQUE(s) REFERENCES(user, id)"` RepoID int64 `xorm:"UNIQUE(s) REFERENCES(repository, id)"` } - return syncDoctorForeignKey(x, []any{ + return syncForeignKeyWithDelete(x, new(Access), - }) + builder.Or( + builder.Expr("NOT EXISTS (SELECT id FROM repository WHERE repository.id = access.repo_id)"), + builder.Expr("NOT EXISTS (SELECT id FROM `user` WHERE `user`.id = access.user_id)"), + ), + ) } diff --git a/models/forgejo_migrations_legacy/v44_test.go b/models/forgejo_migrations_legacy/v44_test.go new file mode 100644 index 0000000000..e78aa2fe46 --- /dev/null +++ b/models/forgejo_migrations_legacy/v44_test.go @@ -0,0 +1,50 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations_legacy + +import ( + "testing" + + "forgejo.org/models/db" + migration_tests "forgejo.org/models/gitea_migrations/test" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_AddForeignKeysAccess(t *testing.T) { + type AccessMode int + type Access struct { + ID int64 `xorm:"pk autoincr"` + UserID int64 `xorm:"UNIQUE(s)"` + RepoID int64 `xorm:"UNIQUE(s)"` + Mode AccessMode + } + type User struct { + ID int64 `xorm:"pk autoincr"` + } + type Repository struct { + ID int64 `xorm:"pk autoincr"` + } + x, deferable := migration_tests.PrepareTestEnv(t, 0, new(User), new(Repository), new(Access)) + defer deferable() + if x == nil || t.Failed() { + return + } + + require.NoError(t, AddForeignKeysAccess(x)) + + var remainingRecords []*Access + require.NoError(t, + db.GetEngine(t.Context()). + Table("access"). + Select("`id`, `user_id`, `repo_id`"). + OrderBy("`id`"). + Find(&remainingRecords)) + assert.Equal(t, + []*Access{ + {ID: 1, UserID: 1, RepoID: 1}, + }, + remainingRecords) +} diff --git a/models/git/TestCleanupCommitStatus/commit_status.yml b/models/git/TestCleanupCommitStatus/commit_status.yml new file mode 100644 index 0000000000..e62b39b6d2 --- /dev/null +++ b/models/git/TestCleanupCommitStatus/commit_status.yml @@ -0,0 +1,135 @@ +# Fields that should, if changed, prevent deletion: repo_id, sha, context, state, description. The first test sets will +# be varying each of these fields independently to confirm they're kept. + + +# Vary description: +- + id: 10 + index: 1 + repo_id: 62 + state: "pending" + sha: "01" + description: "Waiting for wake up" + context: deploy/awesomeness +- + id: 11 + index: 2 + repo_id: 62 + state: "pending" + sha: "01" + description: "Almost woke up..." + context: deploy/awesomeness + +# Vary state: +- + id: 12 + index: 1 + repo_id: 62 + state: "pending" + sha: "02" + description: "Waiting for wake up" + context: deploy/awesomeness +- + id: 13 + index: 2 + repo_id: 62 + state: "success" + sha: "02" + description: "Waiting for wake up" + context: deploy/awesomeness + +# Vary context: +- + id: 14 + index: 1 + repo_id: 62 + state: "pending" + sha: "03" + description: "Waiting for wake up" + context: deploy/awesomeness-v1 +- + id: 15 + index: 2 + repo_id: 62 + state: "pending" + sha: "03" + description: "Waiting for wake up" + context: deploy/awesomeness-v2 + +# Vary sha: +- + id: 16 + index: 1 + repo_id: 62 + state: "pending" + sha: "04" + description: "Waiting for wake up" + context: deploy/awesomeness-v1 +- + id: 17 + index: 2 + repo_id: 62 + state: "pending" + sha: "05" + description: "Waiting for wake up" + context: deploy/awesomeness-v1 + +# Vary Repo ID: +- + id: 18 + index: 1 + repo_id: 62 + state: "pending" + sha: "06" + description: "Waiting for wake up" + context: deploy/awesomeness-v1 +- + id: 19 + index: 2 + repo_id: 63 + state: "pending" + sha: "06" + description: "Waiting for wake up" + context: deploy/awesomeness-v1 + +# That's all the varying cases, now here's the data that should be affected by the delete: +- + id: 20 + index: 1 + repo_id: 62 + state: "pending" + sha: "07" + description: "Waiting for wake up" + context: deploy/awesomeness-v1 +- # Dupe 1 + id: 21 + index: 2 + repo_id: 62 + state: "pending" + sha: "07" + description: "Waiting for wake up" + context: deploy/awesomeness-v1 +- # Dupe 2 + id: 22 + index: 3 + repo_id: 62 + state: "pending" + sha: "07" + description: "Waiting for wake up" + context: deploy/awesomeness-v1 +- # Switched to "success", keep + id: 23 + index: 4 + repo_id: 62 + state: "success" + sha: "07" + description: "Successful!" + context: deploy/awesomeness-v1 +- # Dupe reporting success again + id: 24 + index: 5 + repo_id: 62 + state: "success" + sha: "07" + description: "Successful!" + context: deploy/awesomeness-v1 diff --git a/models/git/commit_status.go b/models/git/commit_status.go index 60a0aa5a4f..4ae926eed6 100644 --- a/models/git/commit_status.go +++ b/models/git/commit_status.go @@ -467,3 +467,68 @@ func ParseCommitsWithStatus(ctx context.Context, commits []*git.Commit, repo *re func hashCommitStatusContext(context string) string { return fmt.Sprintf("%x", sha1.Sum([]byte(context))) } + +func CleanupCommitStatus(ctx context.Context, bufferSize, deleteChunkSize int, dryRun bool) error { + startTime := time.Now() + + var lastCommitStatus CommitStatus + deleteTargets := make([]int64, 0, deleteChunkSize) + recordCount := 0 + deleteCount := 0 + + err := db.IterateByKeyset(ctx, + nil, + []string{"repo_id", "sha", "context", "index", "id"}, + bufferSize, + func(ctx context.Context, commitStatus *CommitStatus) error { + if commitStatus.RepoID != lastCommitStatus.RepoID || + commitStatus.SHA != lastCommitStatus.SHA || + commitStatus.Context != lastCommitStatus.Context || + commitStatus.State != lastCommitStatus.State || + commitStatus.Description != lastCommitStatus.Description { + // New context, or changed state/description; keep it, start looking for duplicates of it. + lastCommitStatus = *commitStatus + } else { + // Same context as previous record, and same state -- this record shouldn't have been stored. + deleteTargets = append(deleteTargets, commitStatus.ID) + + if len(deleteTargets) == deleteChunkSize { + // Flush delete chunk + log.Debug("deleting chunk of %d records (dryRun=%v)", len(deleteTargets), dryRun) + if !dryRun { + if err := db.DeleteByIDs[CommitStatus](ctx, deleteTargets...); err != nil { + return err + } + } + deleteCount += len(deleteTargets) + deleteTargets = make([]int64, 0, deleteChunkSize) + } + } + recordCount++ + return nil + }) + if err != nil { + return err + } + + if len(deleteTargets) > 0 { + log.Debug("deleting final chunk of %d records (dryRun=%v)", len(deleteTargets), dryRun) + if !dryRun { + if err := db.DeleteByIDs[CommitStatus](ctx, deleteTargets...); err != nil { + return err + } + } + deleteCount += len(deleteTargets) + } + + duration := time.Since(startTime) + + if dryRun { + log.Info("Reviewed %d records in commit_status, and would delete %d", recordCount, deleteCount) + } else { + log.Info("Reviewed %d records in commit_status, and deleted %d", recordCount, deleteCount) + } + log.Info("Cleanup commit status took %d milliseconds", duration.Milliseconds()) + + return nil +} diff --git a/models/git/commit_status_test.go b/models/git/commit_status_test.go index ce6c0d4673..b5c3690e0f 100644 --- a/models/git/commit_status_test.go +++ b/models/git/commit_status_test.go @@ -244,3 +244,46 @@ func TestFindRepoRecentCommitStatusContexts(t *testing.T) { assert.Equal(t, "compliance/lint-backend", contexts[0]) } } + +func TestCleanupCommitStatus(t *testing.T) { + defer unittest.OverrideFixtures("models/git/TestCleanupCommitStatus")() + require.NoError(t, unittest.PrepareTestDatabase()) + + // No changes after a dry run: + originalCount := unittest.GetCount(t, &git_model.CommitStatus{}) + err := git_model.CleanupCommitStatus(t.Context(), 100, 100, true) + require.NoError(t, err) + countAfterDryRun := unittest.GetCount(t, &git_model.CommitStatus{}) + assert.Equal(t, originalCount, countAfterDryRun) + + // Perform actual cleanup + err = git_model.CleanupCommitStatus(t.Context(), 100, 100, false) + require.NoError(t, err) + + // Varying descriptions + unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{ID: 10}) + unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{ID: 11}) + + // Varying state + unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{ID: 12}) + unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{ID: 13}) + + // Varying context + unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{ID: 14}) + unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{ID: 15}) + + // Varying sha + unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{ID: 16}) + unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{ID: 17}) + + // Varying repo ID + unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{ID: 18}) + unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{ID: 19}) + + // Expected to remain or be removed from cleanup of fixture data: + unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{ID: 20}) + unittest.AssertNotExistsBean(t, &git_model.CommitStatus{ID: 21}) + unittest.AssertNotExistsBean(t, &git_model.CommitStatus{ID: 22}) + unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{ID: 23}) + unittest.AssertNotExistsBean(t, &git_model.CommitStatus{ID: 24}) +} diff --git a/models/git/main_test.go b/models/git/main_test.go index 63a3c363ab..c0b444db8f 100644 --- a/models/git/main_test.go +++ b/models/git/main_test.go @@ -7,11 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/models/gitea_migrations/base/db.go b/models/gitea_migrations/base/db.go index 2f70fc0806..d716e05caf 100644 --- a/models/gitea_migrations/base/db.go +++ b/models/gitea_migrations/base/db.go @@ -7,7 +7,6 @@ import ( "errors" "fmt" "reflect" - "regexp" "slices" "strings" @@ -363,7 +362,7 @@ func renameTable(sess *xorm.Session, bean any, tableName, tempTableName string, schema := sess.Engine().Dialect().URI().Schema sess.Engine().SetSchema("") - if err := sess.Table("information_schema.sequences").Cols("sequence_name").Where("sequence_name LIKE ? || '_id_seq' AND sequence_catalog = ?", tableName, setting.Database.Name).Find(&originalSequences); err != nil { + if err := sess.Table("information_schema.sequences").Cols("sequence_name").Where("sequence_schema = ? AND (sequence_name LIKE ? || '_id_seq' AND sequence_catalog = ?)", schema, tableName, setting.Database.Name).Find(&originalSequences); err != nil { log.Error("Unable to rename %s to %s. Error: %v", tempTableName, tableName, err) return err } @@ -392,7 +391,7 @@ func renameTable(sess *xorm.Session, bean any, tableName, tempTableName string, var indices []string sess.Engine().SetSchema("") - if err := sess.Table("pg_indexes").Cols("indexname").Where("tablename = ? ", tableName).Find(&indices); err != nil { + if err := sess.Table("pg_indexes").Cols("indexname").Where("tablename = ? AND schemaname = ?", tableName, schema).Find(&indices); err != nil { log.Error("Unable to rename %s to %s. Error: %v", tempTableName, tableName, err) return err } @@ -408,7 +407,7 @@ func renameTable(sess *xorm.Session, bean any, tableName, tempTableName string, var sequences []string sess.Engine().SetSchema("") - if err := sess.Table("information_schema.sequences").Cols("sequence_name").Where("sequence_name LIKE 'tmp_recreate__' || ? || '_id_seq' AND sequence_catalog = ?", tableName, setting.Database.Name).Find(&sequences); err != nil { + if err := sess.Table("information_schema.sequences").Cols("sequence_name").Where("sequence_schema = ? AND sequence_name LIKE 'tmp_recreate__' || ? || '_id_seq' AND sequence_catalog = ?", schema, tableName, setting.Database.Name).Find(&sequences); err != nil { log.Error("Unable to rename %s to %s. Error: %v", tempTableName, tableName, err) return err } @@ -469,74 +468,24 @@ func DropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin if err != nil { return err } - if len(indexRes) != 1 { - continue + containsDroppedColumn := false + for _, r := range indexRes { + indexCol := string(r["name"]) + if slices.Contains(columnNames, indexCol) { + containsDroppedColumn = true + break + } } - indexColumn := string(indexRes[0]["name"]) - for _, name := range columnNames { - if name == indexColumn { - _, err := sess.Exec(fmt.Sprintf("DROP INDEX `%s`", indexName)) - if err != nil { - return err - } + if containsDroppedColumn { + if _, err := sess.Exec(fmt.Sprintf("DROP INDEX `%s`", indexName)); err != nil { + return err } } } - - // Here we need to get the columns from the original table - sql := fmt.Sprintf("SELECT sql FROM sqlite_master WHERE tbl_name='%s' and type='table'", tableName) - res, err := sess.Query(sql) - if err != nil { - return err - } - tableSQL := string(res[0]["sql"]) - - // Get the string offset for column definitions: `CREATE TABLE ( column-definitions... )` - columnDefinitionsIndex := strings.Index(tableSQL, "(") - if columnDefinitionsIndex < 0 { - return errors.New("couldn't find column definitions") - } - - // Separate out the column definitions - tableSQL = tableSQL[columnDefinitionsIndex:] - - // Remove the required columnNames - for _, name := range columnNames { - tableSQL = regexp.MustCompile(regexp.QuoteMeta("`"+name+"`")+"[^`,)]*?[,)]").ReplaceAllString(tableSQL, "") - } - - // Ensure the query is ended properly - tableSQL = strings.TrimSpace(tableSQL) - if tableSQL[len(tableSQL)-1] != ')' { - if tableSQL[len(tableSQL)-1] == ',' { - tableSQL = tableSQL[:len(tableSQL)-1] + for _, col := range columnNames { + if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP COLUMN `%s`", tableName, col)); err != nil { + return fmt.Errorf("drop table `%s` column %s encountered error: %w", tableName, col, err) } - tableSQL += ")" - } - - // Find all the columns in the table - columns := regexp.MustCompile("`([^`]*)`").FindAllString(tableSQL, -1) - - tableSQL = fmt.Sprintf("CREATE TABLE `new_%s_new` ", tableName) + tableSQL - if _, err := sess.Exec(tableSQL); err != nil { - return err - } - - // Now restore the data - columnsSeparated := strings.Join(columns, ",") - insertSQL := fmt.Sprintf("INSERT INTO `new_%s_new` (%s) SELECT %s FROM %s", tableName, columnsSeparated, columnsSeparated, tableName) - if _, err := sess.Exec(insertSQL); err != nil { - return err - } - - // Now drop the old table - if _, err := sess.Exec(fmt.Sprintf("DROP TABLE `%s`", tableName)); err != nil { - return err - } - - // Rename the table - if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `new_%s_new` RENAME TO `%s`", tableName, tableName)); err != nil { - return err } case setting.Database.Type.IsPostgreSQL(): diff --git a/models/gitea_migrations/fixtures/Test_AddForeignKeysAccess/access.yml b/models/gitea_migrations/fixtures/Test_AddForeignKeysAccess/access.yml new file mode 100644 index 0000000000..8ce770fbd0 --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_AddForeignKeysAccess/access.yml @@ -0,0 +1,28 @@ +- + id: 1 + repo_id: 1 + user_id: 1 + +# Expected to be deleted due to invalid repository foreign key +- + id: 2 + repo_id: 100 + user_id: 1 + +# Expected to be deleted due to null repository foreign key +- + id: 3 + repo_id: null + user_id: 1 + +# Expected to be deleted due to invalid user foreign key +- + id: 4 + repo_id: 1 + user_id: 100 + +# Expected to be deleted due to null user foreign key +- + id: 5 + repo_id: 1 + user_id: null diff --git a/models/gitea_migrations/fixtures/Test_AddForeignKeysAccess/repository.yml b/models/gitea_migrations/fixtures/Test_AddForeignKeysAccess/repository.yml new file mode 100644 index 0000000000..a88c2ef89f --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_AddForeignKeysAccess/repository.yml @@ -0,0 +1,2 @@ +- + id: 1 diff --git a/models/gitea_migrations/fixtures/Test_AddForeignKeysAccess/tracked_time.yml b/models/gitea_migrations/fixtures/Test_AddForeignKeysAccess/tracked_time.yml new file mode 100644 index 0000000000..0be83d55a5 --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_AddForeignKeysAccess/tracked_time.yml @@ -0,0 +1,33 @@ +- + id: 1 + issue_id: 1 + user_id: 1 + time: 100 + +# Expected to be deleted due to invalid issue foreign key +- + id: 2 + issue_id: 100 + user_id: 1 + time: 100 + +# Expected to be deleted due to null issue foreign key +- + id: 3 + issue_id: null + user_id: 1 + time: 100 + +# Expected to be retained with null, due to invalid user foreign key +- + id: 4 + issue_id: 1 + user_id: 100 + time: 100 + +# Expected to be retained with null user foreign key +- + id: 5 + issue_id: 1 + user_id: null + time: 100 diff --git a/models/gitea_migrations/fixtures/Test_AddForeignKeysAccess/user.yml b/models/gitea_migrations/fixtures/Test_AddForeignKeysAccess/user.yml new file mode 100644 index 0000000000..a88c2ef89f --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_AddForeignKeysAccess/user.yml @@ -0,0 +1,2 @@ +- + id: 1 diff --git a/models/gitea_migrations/fixtures/Test_AddForeignKeysStopwatchTrackedTime/issue.yml b/models/gitea_migrations/fixtures/Test_AddForeignKeysStopwatchTrackedTime/issue.yml new file mode 100644 index 0000000000..a88c2ef89f --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_AddForeignKeysStopwatchTrackedTime/issue.yml @@ -0,0 +1,2 @@ +- + id: 1 diff --git a/models/gitea_migrations/fixtures/Test_AddForeignKeysStopwatchTrackedTime/stopwatch.yml b/models/gitea_migrations/fixtures/Test_AddForeignKeysStopwatchTrackedTime/stopwatch.yml new file mode 100644 index 0000000000..5d84c3a78d --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_AddForeignKeysStopwatchTrackedTime/stopwatch.yml @@ -0,0 +1,28 @@ +- + id: 1 + issue_id: 1 + user_id: 1 + +# Expected to be deleted due to invalid issue foreign key +- + id: 2 + issue_id: 100 + user_id: 1 + +# Expected to be deleted due to null issue foreign key +- + id: 3 + issue_id: null + user_id: 1 + +# Expected to be deleted due to invalid user foreign key +- + id: 4 + issue_id: 1 + user_id: 100 + +# Expected to be deleted due to null user foreign key +- + id: 5 + issue_id: 1 + user_id: null diff --git a/models/gitea_migrations/fixtures/Test_AddForeignKeysStopwatchTrackedTime/tracked_time.yml b/models/gitea_migrations/fixtures/Test_AddForeignKeysStopwatchTrackedTime/tracked_time.yml new file mode 100644 index 0000000000..0be83d55a5 --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_AddForeignKeysStopwatchTrackedTime/tracked_time.yml @@ -0,0 +1,33 @@ +- + id: 1 + issue_id: 1 + user_id: 1 + time: 100 + +# Expected to be deleted due to invalid issue foreign key +- + id: 2 + issue_id: 100 + user_id: 1 + time: 100 + +# Expected to be deleted due to null issue foreign key +- + id: 3 + issue_id: null + user_id: 1 + time: 100 + +# Expected to be retained with null, due to invalid user foreign key +- + id: 4 + issue_id: 1 + user_id: 100 + time: 100 + +# Expected to be retained with null user foreign key +- + id: 5 + issue_id: 1 + user_id: null + time: 100 diff --git a/models/gitea_migrations/fixtures/Test_AddForeignKeysStopwatchTrackedTime/user.yml b/models/gitea_migrations/fixtures/Test_AddForeignKeysStopwatchTrackedTime/user.yml new file mode 100644 index 0000000000..a88c2ef89f --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_AddForeignKeysStopwatchTrackedTime/user.yml @@ -0,0 +1,2 @@ +- + id: 1 diff --git a/models/gitea_migrations/fixtures/Test_addForeignKeysCollaboration/collaboration.yml b/models/gitea_migrations/fixtures/Test_addForeignKeysCollaboration/collaboration.yml new file mode 100644 index 0000000000..a96c2340c8 --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_addForeignKeysCollaboration/collaboration.yml @@ -0,0 +1,16 @@ +- + id: 1 + user_id: 1 + repo_id: 1 + +# Expected to be deleted due to invalid user_id foreign key +- + id: 2 + user_id: 100 + repo_id: 1 + +# Expected to be deleted due to invalid repo_id foreign key +- + id: 3 + user_id: 1 + repo_id: 100 diff --git a/models/gitea_migrations/fixtures/Test_addForeignKeysCollaboration/repository.yml b/models/gitea_migrations/fixtures/Test_addForeignKeysCollaboration/repository.yml new file mode 100644 index 0000000000..a88c2ef89f --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_addForeignKeysCollaboration/repository.yml @@ -0,0 +1,2 @@ +- + id: 1 diff --git a/models/gitea_migrations/fixtures/Test_addForeignKeysCollaboration/user.yml b/models/gitea_migrations/fixtures/Test_addForeignKeysCollaboration/user.yml new file mode 100644 index 0000000000..a88c2ef89f --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_addForeignKeysCollaboration/user.yml @@ -0,0 +1,2 @@ +- + id: 1 diff --git a/models/gitea_migrations/fixtures/Test_addForeignKeysForgejoAuthToken/forgejo_auth_token.yml b/models/gitea_migrations/fixtures/Test_addForeignKeysForgejoAuthToken/forgejo_auth_token.yml new file mode 100644 index 0000000000..ee151f769e --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_addForeignKeysForgejoAuthToken/forgejo_auth_token.yml @@ -0,0 +1,16 @@ +- + id: 1 + uid: 1 + lookup_key: key-1 + +# Expected to be deleted due to invalid user foreign key +- + id: 2 + uid: 100 + lookup_key: key-2 + +# Expected to be deleted due to a null user foreign key +- + id: 3 + uid: null + lookup_key: key-3 diff --git a/models/gitea_migrations/fixtures/Test_addForeignKeysForgejoAuthToken/user.yml b/models/gitea_migrations/fixtures/Test_addForeignKeysForgejoAuthToken/user.yml new file mode 100644 index 0000000000..a88c2ef89f --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_addForeignKeysForgejoAuthToken/user.yml @@ -0,0 +1,2 @@ +- + id: 1 diff --git a/models/gitea_migrations/fixtures/Test_addForeignKeysPullRequest1/issue.yml b/models/gitea_migrations/fixtures/Test_addForeignKeysPullRequest1/issue.yml new file mode 100644 index 0000000000..a88c2ef89f --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_addForeignKeysPullRequest1/issue.yml @@ -0,0 +1,2 @@ +- + id: 1 diff --git a/models/gitea_migrations/fixtures/Test_addForeignKeysPullRequest1/pull_request.yml b/models/gitea_migrations/fixtures/Test_addForeignKeysPullRequest1/pull_request.yml new file mode 100644 index 0000000000..390bb2ff4d --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_addForeignKeysPullRequest1/pull_request.yml @@ -0,0 +1,28 @@ +- + id: 1 + issue_id: 1 + base_repo_id: 1 + +# Expected to be deleted due to invalid issue foreign key +- + id: 2 + issue_id: 100 + base_repo_id: 1 + +# Expected to be deleted due to null issue foreign key +- + id: 3 + issue_id: null + base_repo_id: 1 + +# Expected to be deleted due to invalid repository foreign key +- + id: 4 + issue_id: 1 + base_repo_id: 100 + +# Expected to be deleted due to null repository foreign key +- + id: 5 + issue_id: 1 + base_repo_id: null diff --git a/models/gitea_migrations/fixtures/Test_addForeignKeysPullRequest1/repository.yml b/models/gitea_migrations/fixtures/Test_addForeignKeysPullRequest1/repository.yml new file mode 100644 index 0000000000..a88c2ef89f --- /dev/null +++ b/models/gitea_migrations/fixtures/Test_addForeignKeysPullRequest1/repository.yml @@ -0,0 +1,2 @@ +- + id: 1 diff --git a/models/issues/comment.go b/models/issues/comment.go index 06d35bb2d4..769feba54a 100644 --- a/models/issues/comment.go +++ b/models/issues/comment.go @@ -611,9 +611,13 @@ func (c *Comment) UpdateAttachments(ctx context.Context, uuids []string) error { } defer committer.Close() - attachments, err := repo_model.GetAttachmentsByUUIDs(ctx, uuids) + if err := c.LoadIssue(ctx); err != nil { + return fmt.Errorf("LoadIssue: %w", err) + } + + attachments, err := repo_model.FindRepoAttachmentsByUUID(ctx, c.Issue.RepoID, uuids, repo_model.FindAttachmentOptions{}) if err != nil { - return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %w", uuids, err) + return fmt.Errorf("FindRepoAttachmentsByUUID[uuids=%q,repoID=%d]: %w", uuids, c.Issue.RepoID, err) } for i := 0; i < len(attachments); i++ { attachments[i].IssueID = c.IssueID @@ -889,7 +893,7 @@ func updateCommentInfos(ctx context.Context, opts *CreateCommentOptions, comment // Check comment type. switch opts.Type { case CommentTypeCode: - if err = updateAttachments(ctx, opts, comment); err != nil { + if err := comment.UpdateAttachments(ctx, opts.Attachments); err != nil { return err } if comment.ReviewID != 0 { @@ -909,7 +913,7 @@ func updateCommentInfos(ctx context.Context, opts *CreateCommentOptions, comment } fallthrough case CommentTypeReview: - if err = updateAttachments(ctx, opts, comment); err != nil { + if err := comment.UpdateAttachments(ctx, opts.Attachments); err != nil { return err } case CommentTypeReopen, CommentTypeClose: @@ -921,23 +925,6 @@ func updateCommentInfos(ctx context.Context, opts *CreateCommentOptions, comment return UpdateIssueCols(ctx, opts.Issue, "updated_unix") } -func updateAttachments(ctx context.Context, opts *CreateCommentOptions, comment *Comment) error { - attachments, err := repo_model.GetAttachmentsByUUIDs(ctx, opts.Attachments) - if err != nil { - return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %w", opts.Attachments, err) - } - for i := range attachments { - attachments[i].IssueID = opts.Issue.ID - attachments[i].CommentID = comment.ID - // No assign value could be 0, so ignore AllCols(). - if _, err = db.GetEngine(ctx).ID(attachments[i].ID).Update(attachments[i]); err != nil { - return fmt.Errorf("update attachment [%d]: %w", attachments[i].ID, err) - } - } - comment.Attachments = attachments - return nil -} - func createDeadlineComment(ctx context.Context, doer *user_model.User, issue *Issue, newDeadlineUnix timeutil.TimeStamp) (*Comment, error) { var content string var commentType CommentType diff --git a/models/issues/issue_update.go b/models/issues/issue_update.go index 84a8820cd1..22e6fcb8d4 100644 --- a/models/issues/issue_update.go +++ b/models/issues/issue_update.go @@ -234,18 +234,18 @@ func AddDeletePRBranchComment(ctx context.Context, doer *user_model.User, repo * } // UpdateIssueAttachments update attachments by UUIDs for the issue -func UpdateIssueAttachments(ctx context.Context, issueID int64, uuids []string) (err error) { +func UpdateIssueAttachments(ctx context.Context, issue *Issue, uuids []string) (err error) { ctx, committer, err := db.TxContext(ctx) if err != nil { return err } defer committer.Close() - attachments, err := repo_model.GetAttachmentsByUUIDs(ctx, uuids) + attachments, err := repo_model.FindRepoAttachmentsByUUID(ctx, issue.RepoID, uuids, repo_model.FindAttachmentOptions{}) if err != nil { - return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %w", uuids, err) + return fmt.Errorf("FindRepoAttachmentsByUUID[uuids=%q,repoID=%d]: %w", uuids, issue.RepoID, err) } for i := 0; i < len(attachments); i++ { - attachments[i].IssueID = issueID + attachments[i].IssueID = issue.ID if err := repo_model.UpdateAttachment(ctx, attachments[i]); err != nil { return fmt.Errorf("update attachment [id: %d]: %w", attachments[i].ID, err) } @@ -394,18 +394,8 @@ func NewIssueWithIndex(ctx context.Context, doer *user_model.User, opts NewIssue return err } - if len(opts.Attachments) > 0 { - attachments, err := repo_model.GetAttachmentsByUUIDs(ctx, opts.Attachments) - if err != nil { - return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %w", opts.Attachments, err) - } - - for i := 0; i < len(attachments); i++ { - attachments[i].IssueID = opts.Issue.ID - if _, err = e.ID(attachments[i].ID).Update(attachments[i]); err != nil { - return fmt.Errorf("update attachment [id: %d]: %w", attachments[i].ID, err) - } - } + if err := UpdateIssueAttachments(ctx, opts.Issue, opts.Attachments); err != nil { + return fmt.Errorf("UpdateIssueAttachments: %w", err) } if err = opts.Issue.LoadAttributes(ctx); err != nil { return err diff --git a/models/issues/main_test.go b/models/issues/main_test.go index 05d854c964..c4057df9cc 100644 --- a/models/issues/main_test.go +++ b/models/issues/main_test.go @@ -9,12 +9,6 @@ import ( issues_model "forgejo.org/models/issues" "forgejo.org/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/repo" - _ "forgejo.org/models/user" - "github.com/stretchr/testify/require" ) diff --git a/models/issues/tracked_time.go b/models/issues/tracked_time.go index d229d83470..e083f6e1e8 100644 --- a/models/issues/tracked_time.go +++ b/models/issues/tracked_time.go @@ -148,7 +148,7 @@ func (opts *FindTrackedTimesOptions) toSession(e db.Engine) db.Engine { // GetTrackedTimes returns all tracked times that fit to the given options. func GetTrackedTimes(ctx context.Context, options *FindTrackedTimesOptions) (trackedTimes TrackedTimeList, err error) { - err = options.toSession(db.GetEngine(ctx)).Find(&trackedTimes) + err = options.toSession(db.GetEngine(ctx)).Asc("tracked_time.id").Find(&trackedTimes) return trackedTimes, err } diff --git a/models/main_test.go b/models/main_test.go index 0edcf8f49d..1e4efb46e4 100644 --- a/models/main_test.go +++ b/models/main_test.go @@ -12,10 +12,6 @@ import ( "forgejo.org/models/unittest" user_model "forgejo.org/models/user" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" - _ "forgejo.org/models/system" - "github.com/stretchr/testify/require" ) diff --git a/models/organization/main_test.go b/models/organization/main_test.go index dd10b60d30..5951e06299 100644 --- a/models/organization/main_test.go +++ b/models/organization/main_test.go @@ -8,13 +8,7 @@ import ( "forgejo.org/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" - _ "forgejo.org/models/organization" - _ "forgejo.org/models/repo" - _ "forgejo.org/models/user" + _ "forgejo.org/modules/testimport" ) func TestMain(m *testing.M) { diff --git a/models/packages/debian/search_test.go b/models/packages/debian/search_test.go index 43cca6c4bd..15e454afc0 100644 --- a/models/packages/debian/search_test.go +++ b/models/packages/debian/search_test.go @@ -14,11 +14,6 @@ import ( "forgejo.org/modules/packages" packages_service "forgejo.org/services/packages" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/models/packages/main_test.go b/models/packages/main_test.go index f9083d705d..35c37d4072 100644 --- a/models/packages/main_test.go +++ b/models/packages/main_test.go @@ -7,11 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/models/perm/access/main_test.go b/models/perm/access/main_test.go index 0c27d022e0..6ae18dbf5e 100644 --- a/models/perm/access/main_test.go +++ b/models/perm/access/main_test.go @@ -7,13 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" - _ "forgejo.org/models/repo" - _ "forgejo.org/models/user" ) func TestMain(m *testing.M) { diff --git a/models/project/main_test.go b/models/project/main_test.go index eaa13bf309..55073c628d 100644 --- a/models/project/main_test.go +++ b/models/project/main_test.go @@ -7,8 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models/repo" ) func TestMain(m *testing.M) { diff --git a/models/project/project.go b/models/project/project.go index 18c647c8ac..7d507b358d 100644 --- a/models/project/project.go +++ b/models/project/project.go @@ -309,6 +309,18 @@ func GetProjectForRepoByID(ctx context.Context, repoID, id int64) (*Project, err return p, nil } +// GetProjectForUserByID returns the project by id that belongs to the specified user. +func GetProjectForUserByID(ctx context.Context, uid, id int64) (*Project, error) { + p := new(Project) + has, err := db.GetEngine(ctx).Where("id=? AND owner_id=?", id, uid).Get(p) + if err != nil { + return nil, err + } else if !has { + return nil, ErrProjectNotExist{ID: id} + } + return p, nil +} + // UpdateProject updates project properties func UpdateProject(ctx context.Context, p *Project) error { if !IsCardTypeValid(p.CardType) { @@ -346,42 +358,26 @@ func updateRepositoryProjectCount(ctx context.Context, repoID int64) error { return nil } -// ChangeProjectStatusByRepoIDAndID toggles a project between opened and closed -func ChangeProjectStatusByRepoIDAndID(ctx context.Context, repoID, projectID int64, isClosed bool) error { - ctx, committer, err := db.TxContext(ctx) - if err != nil { - return err - } - defer committer.Close() - - p := new(Project) - - has, err := db.GetEngine(ctx).ID(projectID).Where("repo_id = ?", repoID).Get(p) - if err != nil { - return err - } else if !has { - return ErrProjectNotExist{ID: projectID, RepoID: repoID} - } - - if err := changeProjectStatus(ctx, p, isClosed); err != nil { - return err - } - - return committer.Commit() -} - -func changeProjectStatus(ctx context.Context, p *Project, isClosed bool) error { - p.IsClosed = isClosed - p.ClosedDateUnix = timeutil.TimeStampNow() - count, err := db.GetEngine(ctx).ID(p.ID).Where("repo_id = ? AND is_closed = ?", p.RepoID, !isClosed).Cols("is_closed", "closed_date_unix").Update(p) - if err != nil { - return err - } - if count < 1 { +// ChangeProjectStatus changes the status of the specified project to the state +// specified via the `isClosed` argument. +func ChangeProjectStatus(ctx context.Context, p *Project, isClosed bool) error { + if p.IsClosed == isClosed { return nil } - return updateRepositoryProjectCount(ctx, p.RepoID) + return db.WithTx(ctx, func(ctx context.Context) error { + p.IsClosed = isClosed + p.ClosedDateUnix = timeutil.TimeStampNow() + count, err := db.GetEngine(ctx).ID(p.ID).Cols("is_closed", "closed_date_unix").Update(p) + if err != nil { + return err + } + if count < 1 { + return nil + } + + return updateRepositoryProjectCount(ctx, p.RepoID) + }) } // DeleteProjectByID deletes a project from a repository. if it's not in a database diff --git a/models/project/project_test.go b/models/project/project_test.go index ab23bab0bf..8a50d73ebc 100644 --- a/models/project/project_test.go +++ b/models/project/project_test.go @@ -1,4 +1,5 @@ // Copyright 2020 The Gitea Authors. All rights reserved. +// Copyright 2026 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package project @@ -7,8 +8,8 @@ import ( "testing" "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" "forgejo.org/models/unittest" - "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -48,42 +49,6 @@ func TestGetProjects(t *testing.T) { assert.Len(t, projects, 1) } -func TestProject(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - - project := &Project{ - Type: TypeRepository, - TemplateType: TemplateTypeBasicKanban, - CardType: CardTypeTextOnly, - Title: "New Project", - RepoID: 1, - CreatedUnix: timeutil.TimeStampNow(), - CreatorID: 2, - } - - require.NoError(t, NewProject(db.DefaultContext, project)) - - _, err := GetProjectByID(db.DefaultContext, project.ID) - require.NoError(t, err) - - // Update project - project.Title = "Updated title" - require.NoError(t, UpdateProject(db.DefaultContext, project)) - - projectFromDB, err := GetProjectByID(db.DefaultContext, project.ID) - require.NoError(t, err) - - assert.Equal(t, project.Title, projectFromDB.Title) - - require.NoError(t, ChangeProjectStatusByRepoIDAndID(db.DefaultContext, project.RepoID, project.ID, true)) - - // Retrieve from DB afresh to check if it is truly closed - projectFromDB, err = GetProjectByID(db.DefaultContext, project.ID) - require.NoError(t, err) - - assert.True(t, projectFromDB.IsClosed) -} - func TestProjectsSort(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) @@ -93,19 +58,19 @@ func TestProjectsSort(t *testing.T) { }{ { sortType: "default", - wants: []int64{1, 3, 2, 6, 5, 4}, + wants: []int64{1, 3, 2, 7, 6, 5, 4}, }, { sortType: "oldest", - wants: []int64{4, 5, 6, 2, 3, 1}, + wants: []int64{4, 5, 6, 7, 2, 3, 1}, }, { sortType: "recentupdate", - wants: []int64{1, 3, 2, 6, 5, 4}, + wants: []int64{1, 3, 2, 7, 6, 5, 4}, }, { sortType: "leastupdate", - wants: []int64{4, 5, 6, 2, 3, 1}, + wants: []int64{4, 5, 6, 7, 2, 3, 1}, }, } @@ -114,11 +79,82 @@ func TestProjectsSort(t *testing.T) { OrderBy: GetSearchOrderByBySortType(tt.sortType), }) require.NoError(t, err) - assert.Equal(t, int64(6), count) - if assert.Len(t, projects, 6) { + assert.Equal(t, int64(7), count) + if assert.Len(t, projects, 7) { for i := range projects { assert.Equal(t, tt.wants[i], projects[i].ID) } } } } + +func TestGetProjectForUserByID(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + found := func(t *testing.T, uid, id int64) { + t.Helper() + + p, err := GetProjectForUserByID(t.Context(), uid, id) + require.NoError(t, err) + if assert.NotNil(t, p) { + assert.Equal(t, id, p.ID) + } + } + + notFound := func(t *testing.T, uid, id int64) { + t.Helper() + + p, err := GetProjectForUserByID(t.Context(), uid, id) + require.ErrorIs(t, err, ErrProjectNotExist{ID: id}) + assert.Nil(t, p) + } + + found(t, 2, 4) + found(t, 2, 5) + found(t, 2, 6) + found(t, 3, 7) + notFound(t, 1, 4) + notFound(t, 1, 5) + notFound(t, 1, 6) + notFound(t, 1, 7) +} + +func TestChangeProjectStatus(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + t.Run("Unchanged", func(t *testing.T) { + project := unittest.AssertExistsAndLoadBean(t, &Project{ID: 1}) + + require.NoError(t, ChangeProjectStatus(t.Context(), project, project.IsClosed)) + + projectAfter := unittest.AssertExistsAndLoadBean(t, &Project{ID: 1}) + assert.Equal(t, project.IsClosed, projectAfter.IsClosed) + }) + + t.Run("Normal", func(t *testing.T) { + project := unittest.AssertExistsAndLoadBean(t, &Project{ID: 1}) + isClosed := !project.IsClosed + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: project.RepoID}) + + require.NoError(t, ChangeProjectStatus(t.Context(), project, isClosed)) + + projectAfter := unittest.AssertExistsAndLoadBean(t, &Project{ID: 1}) + repoAfter := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: project.RepoID}) + assert.Equal(t, isClosed, projectAfter.IsClosed) + assert.Equal(t, repo.NumProjects, repoAfter.NumProjects) + assert.Equal(t, repo.NumOpenProjects-1, repoAfter.NumOpenProjects) + assert.Equal(t, repo.NumClosedProjects+1, repoAfter.NumClosedProjects) + }) + + t.Run("Invalid ID", func(t *testing.T) { + project := &Project{ID: 1001, RepoID: 1} + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: project.RepoID}) + + require.NoError(t, ChangeProjectStatus(t.Context(), project, true)) + + repoAfter := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: project.RepoID}) + assert.Equal(t, repo.NumProjects, repoAfter.NumProjects) + assert.Equal(t, repo.NumOpenProjects, repoAfter.NumOpenProjects) + assert.Equal(t, repo.NumClosedProjects, repoAfter.NumClosedProjects) + }) +} diff --git a/models/quota/main_test.go b/models/quota/main_test.go index ec0a0e0013..e752ecb690 100644 --- a/models/quota/main_test.go +++ b/models/quota/main_test.go @@ -7,11 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/models/repo/attachment.go b/models/repo/attachment.go index 6d903be5f8..1b6af572dd 100644 --- a/models/repo/attachment.go +++ b/models/repo/attachment.go @@ -1,4 +1,5 @@ // Copyright 2017 The Gitea Authors. All rights reserved. +// Copyright 2026 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package repo @@ -16,17 +17,30 @@ import ( "forgejo.org/modules/timeutil" "forgejo.org/modules/util" "forgejo.org/modules/validation" + + "xorm.io/builder" ) // Attachment represent a attachment of issue/comment/release. type Attachment struct { - ID int64 `xorm:"pk autoincr"` - UUID string `xorm:"uuid UNIQUE"` - RepoID int64 `xorm:"INDEX"` // this should not be zero - IssueID int64 `xorm:"INDEX"` // maybe zero when creating - ReleaseID int64 `xorm:"INDEX"` // maybe zero when creating - UploaderID int64 `xorm:"INDEX DEFAULT 0"` // Notice: will be zero before this column added - CommentID int64 `xorm:"INDEX"` + ID int64 `xorm:"pk autoincr"` + // UUID is the public identifier of the attachment, and is used during HTTP + // requests to refer to a specific attachment. + UUID string `xorm:"uuid UNIQUE"` + // UploaderID is always set and non-zero and refers to the user that has + // uploaded this attachment. + UploaderID int64 `xorm:"INDEX DEFAULT 0"` + // RepoID is always set and non-zero and refers to the repository where this + // attachment was uploaded to. + RepoID int64 `xorm:"INDEX"` + // IssueID, ReleaseID and CommentID have multiple possible states: + // - ReleaseID != 0 && IssueID == 0 && CommentID == 0: attached to release with id `ReleaseID`. + // - ReleaseID == 0 && IssueID != 0 && CommentID == 0: attached to the issue with id `IssueID`. + // - ReleaseID == 0 && IssueID != 0 && CommentID != 0: attached to comment with id `CommentID` that is in issue with id `IssueID`. + // All other states should be considered invalid. + IssueID int64 `xorm:"INDEX"` + ReleaseID int64 `xorm:"INDEX"` + CommentID int64 `xorm:"INDEX"` Name string DownloadCount int64 `xorm:"DEFAULT 0"` Size int64 `xorm:"DEFAULT 0"` @@ -73,6 +87,12 @@ func (a *Attachment) DownloadURL() string { return setting.AppURL + "attachments/" + url.PathEscape(a.UUID) } +// IsAttachedToResource returns true if this attachment is attached to a release, +// issue or comment. +func (a *Attachment) IsAttachedToResource() bool { + return a.ReleaseID != 0 || a.IssueID != 0 || a.CommentID != 0 +} + // ErrAttachmentNotExist represents a "AttachmentNotExist" kind of error. type ErrAttachmentNotExist struct { ID int64 @@ -133,15 +153,37 @@ func GetAttachmentByUUID(ctx context.Context, uuid string) (*Attachment, error) return attach, nil } -// GetAttachmentsByUUIDs returns attachment by given UUID list. -func GetAttachmentsByUUIDs(ctx context.Context, uuids []string) ([]*Attachment, error) { +type FindAttachmentOptions struct { + ReleaseID int64 + IssueID int64 + CommentID int64 +} + +func (opts FindAttachmentOptions) ToConds() builder.Cond { + return builder.Eq{"release_id": opts.ReleaseID, "issue_id": opts.IssueID, "comment_id": opts.CommentID} +} + +// FindRepoAttachmentsByUUID always returns attachment that has a UUID that is +// in the given `uuids` argument and is attached to the repository. +// +// The values in `opts` are always as a condition even if they are zero, this +// allows to search for attachments that are not yet attached to any resource by +// specifying a empty struct. +func FindRepoAttachmentsByUUID(ctx context.Context, repoID int64, uuids []string, opts FindAttachmentOptions) ([]*Attachment, error) { + // Nothing to match anyway. if len(uuids) == 0 { return []*Attachment{}, nil } - // Silently drop invalid uuids. + // At maximum nothing is filtered and we get all attachments via the UUID. attachments := make([]*Attachment, 0, len(uuids)) - return attachments, db.GetEngine(ctx).In("uuid", uuids).Find(&attachments) + + err := db.GetEngine(ctx). + Where("repo_id = ?", repoID). + In("uuid", uuids). + And(opts.ToConds()). + Find(&attachments) + return attachments, err } // ExistAttachmentsByUUID returns true if attachment exists with the given UUID diff --git a/models/repo/attachment_test.go b/models/repo/attachment_test.go index 23f4b3799f..2ee4ee91ed 100644 --- a/models/repo/attachment_test.go +++ b/models/repo/attachment_test.go @@ -1,9 +1,12 @@ // Copyright 2017 The Gitea Authors. All rights reserved. +// Copyright 2026 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package repo_test import ( + "cmp" + "slices" "testing" "forgejo.org/models/db" @@ -88,14 +91,67 @@ func TestUpdateAttachment(t *testing.T) { unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{Name: "new_name"}) } -func TestGetAttachmentsByUUIDs(t *testing.T) { +func TestFindRepoAttachmentsByUUID(t *testing.T) { + defer unittest.OverrideFixtures("models/repo/fixtures/TestFindRepoAttachmentsByUUID")() require.NoError(t, unittest.PrepareTestDatabase()) - attachList, err := repo_model.GetAttachmentsByUUIDs(db.DefaultContext, []string{"a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11", "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a17", "not-existing-uuid"}) - require.NoError(t, err) - assert.Len(t, attachList, 2) - assert.Equal(t, "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11", attachList[0].UUID) - assert.Equal(t, "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a17", attachList[1].UUID) - assert.Equal(t, int64(1), attachList[0].IssueID) - assert.Equal(t, int64(5), attachList[1].IssueID) + sort := func(x []*repo_model.Attachment) { + slices.SortFunc(x, func(a, b *repo_model.Attachment) int { + return cmp.Compare(a.ID, b.ID) + }) + } + + t.Run("Empty UUIDs", func(t *testing.T) { + attachments, err := repo_model.FindRepoAttachmentsByUUID(t.Context(), 1001, []string{}, repo_model.FindAttachmentOptions{}) + require.NoError(t, err) + assert.Empty(t, attachments) + }) + + t.Run("Wrong repository", func(t *testing.T) { + attachments, err := repo_model.FindRepoAttachmentsByUUID(t.Context(), 1002, []string{"31b6f65e-2745-4e87-b02c-e6bb9890d399", "e19fd169-c2d1-4fd0-a6d5-9658fd4affed", "758e41f6-e3b7-4420-b34f-1920da0858aa"}, repo_model.FindAttachmentOptions{}) + require.NoError(t, err) + assert.Empty(t, attachments) + }) + + t.Run("Not attached", func(t *testing.T) { + attachments, err := repo_model.FindRepoAttachmentsByUUID(t.Context(), 1001, []string{"31b6f65e-2745-4e87-b02c-e6bb9890d399", "e19fd169-c2d1-4fd0-a6d5-9658fd4affed", "758e41f6-e3b7-4420-b34f-1920da0858aa"}, repo_model.FindAttachmentOptions{}) + require.NoError(t, err) + if assert.Len(t, attachments, 1) { + assert.Equal(t, "31b6f65e-2745-4e87-b02c-e6bb9890d399", attachments[0].UUID) + } + }) + + t.Run("Issue", func(t *testing.T) { + attachments, err := repo_model.FindRepoAttachmentsByUUID(t.Context(), 1001, []string{"17bcdb6b-dd84-4da1-b37a-671165402d8d", "e19fd169-c2d1-4fd0-a6d5-9658fd4affed", "774f276e-c85d-488e-b735-7bc07860c756"}, repo_model.FindAttachmentOptions{IssueID: 1001}) + require.NoError(t, err) + sort(attachments) + if assert.Len(t, attachments, 2) { + assert.Equal(t, "17bcdb6b-dd84-4da1-b37a-671165402d8d", attachments[0].UUID) + assert.Equal(t, "e19fd169-c2d1-4fd0-a6d5-9658fd4affed", attachments[1].UUID) + } + }) + + t.Run("Comment", func(t *testing.T) { + attachments, err := repo_model.FindRepoAttachmentsByUUID(t.Context(), 1001, []string{"edf0d986-8a12-447a-a4bb-e9aefead251b", "774f276e-c85d-488e-b735-7bc07860c756", "e19fd169-c2d1-4fd0-a6d5-9658fd4affed"}, repo_model.FindAttachmentOptions{IssueID: 1001, CommentID: 1001}) + require.NoError(t, err) + if assert.Len(t, attachments, 1) { + assert.Equal(t, "edf0d986-8a12-447a-a4bb-e9aefead251b", attachments[0].UUID) + } + + attachments, err = repo_model.FindRepoAttachmentsByUUID(t.Context(), 1001, []string{"edf0d986-8a12-447a-a4bb-e9aefead251b", "774f276e-c85d-488e-b735-7bc07860c756", "e19fd169-c2d1-4fd0-a6d5-9658fd4affed"}, repo_model.FindAttachmentOptions{IssueID: 1001, CommentID: 1002}) + require.NoError(t, err) + if assert.Len(t, attachments, 1) { + assert.Equal(t, "774f276e-c85d-488e-b735-7bc07860c756", attachments[0].UUID) + } + }) + + t.Run("Release", func(t *testing.T) { + attachments, err := repo_model.FindRepoAttachmentsByUUID(t.Context(), 1001, []string{"d2570bab-c843-486f-b7b7-23e011c42815", "758e41f6-e3b7-4420-b34f-1920da0858aa", "e19fd169-c2d1-4fd0-a6d5-9658fd4affed"}, repo_model.FindAttachmentOptions{ReleaseID: 1001}) + require.NoError(t, err) + if assert.Len(t, attachments, 2) { + sort(attachments) + assert.Equal(t, "758e41f6-e3b7-4420-b34f-1920da0858aa", attachments[0].UUID) + assert.Equal(t, "d2570bab-c843-486f-b7b7-23e011c42815", attachments[1].UUID) + } + }) } diff --git a/models/repo/fixtures/TestFindRepoAttachmentsByUUID/attachment.yml b/models/repo/fixtures/TestFindRepoAttachmentsByUUID/attachment.yml new file mode 100644 index 0000000000..934f92d264 --- /dev/null +++ b/models/repo/fixtures/TestFindRepoAttachmentsByUUID/attachment.yml @@ -0,0 +1,116 @@ +- + id: 1001 + uuid: 70d3e7b8-5e46-41eb-bd2d-afaba53056bd + repo_id: 0 + issue_id: 0 + release_id: 0 + uploader_id: 0 + comment_id: 0 + name: attach1 + download_count: 0 + size: 0 + created_unix: 1771300000 + +- + id: 1002 + uuid: 31b6f65e-2745-4e87-b02c-e6bb9890d399 + repo_id: 1001 + issue_id: 0 + release_id: 0 + uploader_id: 1001 + comment_id: 0 + name: attach1 + download_count: 0 + size: 0 + created_unix: 1771300001 + +- + id: 1003 + uuid: 03158f6c-487c-4bc5-b24b-10f13e21c2e7 + repo_id: 1001 + issue_id: 0 + release_id: 0 + uploader_id: 1002 + comment_id: 0 + name: attach1 + download_count: 0 + size: 0 + created_unix: 1771300002 + +- + id: 1004 + uuid: 17bcdb6b-dd84-4da1-b37a-671165402d8d + repo_id: 1001 + issue_id: 1001 + release_id: 0 + uploader_id: 1001 + comment_id: 0 + name: attach1 + download_count: 0 + size: 0 + created_unix: 1771300003 + +- + id: 1005 + uuid: e19fd169-c2d1-4fd0-a6d5-9658fd4affed + repo_id: 1001 + issue_id: 1001 + release_id: 0 + uploader_id: 1002 + comment_id: 0 + name: attach1 + download_count: 0 + size: 0 + created_unix: 1771300004 + +- + id: 1006 + uuid: 758e41f6-e3b7-4420-b34f-1920da0858aa + repo_id: 1001 + issue_id: 0 + release_id: 1001 + uploader_id: 1001 + comment_id: 0 + name: attach1 + download_count: 0 + size: 0 + created_unix: 1771300005 + +- + id: 1007 + uuid: d2570bab-c843-486f-b7b7-23e011c42815 + repo_id: 1001 + issue_id: 0 + release_id: 1001 + uploader_id: 1002 + comment_id: 0 + name: attach1 + download_count: 0 + size: 0 + created_unix: 1771300006 + +- + id: 1008 + uuid: edf0d986-8a12-447a-a4bb-e9aefead251b + repo_id: 1001 + issue_id: 1001 + release_id: 0 + uploader_id: 1001 + comment_id: 1001 + name: attach1 + download_count: 0 + size: 0 + created_unix: 1771300007 + +- + id: 1009 + uuid: 774f276e-c85d-488e-b735-7bc07860c756 + repo_id: 1001 + issue_id: 1001 + release_id: 0 + uploader_id: 1002 + comment_id: 1002 + name: attach1 + download_count: 0 + size: 0 + created_unix: 1771300008 diff --git a/models/repo/main_test.go b/models/repo/main_test.go index 9fd1cacc97..3f7ab214fa 100644 --- a/models/repo/main_test.go +++ b/models/repo/main_test.go @@ -8,13 +8,7 @@ import ( "forgejo.org/models/unittest" - _ "forgejo.org/models" // register table model - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" - _ "forgejo.org/models/perm/access" // register table model - _ "forgejo.org/models/repo" // register table model - _ "forgejo.org/models/user" // register table model + _ "forgejo.org/modules/testimport" ) func TestMain(m *testing.M) { diff --git a/models/repo/release.go b/models/repo/release.go index 2310de7cb9..a421930d61 100644 --- a/models/repo/release.go +++ b/models/repo/release.go @@ -224,18 +224,14 @@ func UpdateRelease(ctx context.Context, rel *Release) error { } // AddReleaseAttachments adds a release attachments -func AddReleaseAttachments(ctx context.Context, releaseID int64, attachmentUUIDs []string) (err error) { - // Check attachments - attachments, err := GetAttachmentsByUUIDs(ctx, attachmentUUIDs) +func AddReleaseAttachments(ctx context.Context, release *Release, attachmentUUIDs []string) (err error) { + attachments, err := FindRepoAttachmentsByUUID(ctx, release.RepoID, attachmentUUIDs, FindAttachmentOptions{}) if err != nil { - return fmt.Errorf("GetAttachmentsByUUIDs [uuids: %v]: %w", attachmentUUIDs, err) + return fmt.Errorf("FindRepoAttachmentsByUUID[uuids=%q,repoID=%d]: %w", attachmentUUIDs, release.RepoID, err) } for i := range attachments { - if attachments[i].ReleaseID != 0 { - return util.NewPermissionDeniedErrorf("release permission denied") - } - attachments[i].ReleaseID = releaseID + attachments[i].ReleaseID = release.ID // No assign value could be 0, so ignore AllCols(). if _, err = db.GetEngine(ctx).ID(attachments[i].ID).Update(attachments[i]); err != nil { return fmt.Errorf("update attachment [%d]: %w", attachments[i].ID, err) diff --git a/models/repo/user_repo.go b/models/repo/user_repo.go index 309bfee18f..ca02c1e3f0 100644 --- a/models/repo/user_repo.go +++ b/models/repo/user_repo.go @@ -162,14 +162,12 @@ func GetReviewers(ctx context.Context, repo *Repository, doerID, posterID int64) return users, db.GetEngine(ctx).Where(cond).OrderBy(user_model.GetOrderByName()).Find(&users) } -// GetIssuePostersWithSearch returns users with limit of 30 whose username started with prefix that have authored an issue/pull request for the given repository -// If isShowFullName is set to true, also include full name prefix search -func GetIssuePostersWithSearch(ctx context.Context, repo *Repository, isPull bool, search string, isShowFullName bool) ([]*user_model.User, error) { +// GetIssuePostersWithSearch returns up to 30 users whose username starts with or full_name contains the given search string for the given repository. +func GetIssuePostersWithSearch(ctx context.Context, repo *Repository, isPull bool, search string) ([]*user_model.User, error) { users := make([]*user_model.User, 0, 30) - prefixCond := db.BuildCaseInsensitiveLike("name", search+"%") - if isShowFullName { - prefixCond = db.BuildCaseInsensitiveLike("full_name", "%"+search+"%") - } + prefixCond := builder.Or( + db.BuildCaseInsensitiveLike("name", search+"%"), + db.BuildCaseInsensitiveLike("full_name", "%"+search+"%")) cond := builder.In("`user`.id", builder.Select("poster_id").From("issue").Where( diff --git a/models/repo/watch.go b/models/repo/watch.go index 3fd915e1e7..e5d4b2f90e 100644 --- a/models/repo/watch.go +++ b/models/repo/watch.go @@ -185,6 +185,12 @@ func WatchIfAuto(ctx context.Context, userID, repoID int64, isWrite bool) error // UnwatchRepos will unwatch the user from all given repositories. func UnwatchRepos(ctx context.Context, userID int64, repoIDs []int64) error { - _, err := db.GetEngine(ctx).Where("user_id=?", userID).In("repo_id", repoIDs).Delete(&Watch{}) - return err + // Unfortunatly, we can't simply delete the Watch records because we do watcher counting in the repo relation. + for _, repoID := range repoIDs { + err := WatchRepoMode(ctx, userID, repoID, WatchModeNone) + if err != nil { + return err + } + } + return nil } diff --git a/models/secret/main_test.go b/models/secret/main_test.go index 85bfec0c4f..ccf8b3ba41 100644 --- a/models/secret/main_test.go +++ b/models/secret/main_test.go @@ -7,9 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models" - _ "forgejo.org/models/activities" ) func TestMain(m *testing.M) { diff --git a/models/system/main_test.go b/models/system/main_test.go index ca2846527a..bd3406b986 100644 --- a/models/system/main_test.go +++ b/models/system/main_test.go @@ -7,12 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models" // register models - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" - _ "forgejo.org/models/system" // register models of system ) func TestMain(m *testing.M) { diff --git a/models/unittest/mock_http.go b/models/unittest/mock_http.go index c2c12e55ee..b8413104b3 100644 --- a/models/unittest/mock_http.go +++ b/models/unittest/mock_http.go @@ -7,6 +7,7 @@ import ( "bufio" "fmt" "io" + "maps" "net/http" "net/http/httptest" "net/url" @@ -29,7 +30,7 @@ import ( // test data files func NewMockWebServer(t *testing.T, liveServerBaseURL, testDataDir string, liveMode bool) *httptest.Server { mockServerBaseURL := "" - ignoredHeaders := []string{"cf-ray", "server", "date", "report-to", "nel", "x-request-id"} + ignoredHeaders := []string{"cf-ray", "server", "date", "report-to", "nel", "x-request-id", "set-cookie", "x-gitlab-meta"} server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { path := NormalizedFullPath(r.URL) @@ -46,6 +47,7 @@ func NewMockWebServer(t *testing.T, liveServerBaseURL, testDataDir string, liveM fixturePath = fmt.Sprintf("%s/%s", testDataDir, strings.TrimLeft(r.URL.Path, "/")) } if liveMode { + require.NoError(t, os.MkdirAll(testDataDir, 0o755)) liveURL := fmt.Sprintf("%s%s", liveServerBaseURL, path) request, err := http.NewRequest(r.Method, liveURL, nil) @@ -68,8 +70,8 @@ func NewMockWebServer(t *testing.T, liveServerBaseURL, testDataDir string, liveM defer fixture.Close() fixtureWriter := bufio.NewWriter(fixture) - for headerName, headerValues := range response.Header { - for _, headerValue := range headerValues { + for _, headerName := range slices.Sorted(maps.Keys(response.Header)) { + for _, headerValue := range response.Header[headerName] { if !slices.Contains(ignoredHeaders, strings.ToLower(headerName)) { _, err := fmt.Fprintf(fixtureWriter, "%s: %s\n", headerName, headerValue) require.NoError(t, err, "writing the header of the HTTP response to the fixture file failed") @@ -91,8 +93,6 @@ func NewMockWebServer(t *testing.T, liveServerBaseURL, testDataDir string, liveM fixture, err := os.ReadFile(fixturePath) require.NoError(t, err, "missing mock HTTP response: "+fixturePath) - w.WriteHeader(http.StatusOK) - // replace any mention of the live HTTP service by the mocked host stringFixture := strings.ReplaceAll(string(fixture), liveServerBaseURL, mockServerBaseURL) if isGh { @@ -104,10 +104,16 @@ func NewMockWebServer(t *testing.T, liveServerBaseURL, testDataDir string, liveM for idx, line := range lines { colonIndex := strings.Index(line, ": ") if colonIndex != -1 { - w.Header().Set(line[0:colonIndex], line[colonIndex+2:]) + // Because we modified the body with ReplaceAll() above, we need to + // remove Content-Length. w.Write() should add it back. + header := line[0:colonIndex] + if !strings.EqualFold(header, "Content-Length") { + w.Header().Set(line[0:colonIndex], line[colonIndex+2:]) + } } else { // we reached the end of the headers (empty line), so what follows is the body responseBody := strings.Join(lines[idx+1:], "\n") + w.WriteHeader(http.StatusOK) _, err := w.Write([]byte(responseBody)) require.NoError(t, err, "writing the body of the HTTP response failed") break diff --git a/models/unittest/mock_http_test.go b/models/unittest/mock_http_test.go new file mode 100644 index 0000000000..9ae4592aab --- /dev/null +++ b/models/unittest/mock_http_test.go @@ -0,0 +1,24 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package unittest + +import ( + "net/http" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// NOTE: This is a test of the unittest helper itself +func TestMockWebServer(t *testing.T) { + server := NewMockWebServer(t, "https://example.com", "testdata", false) + defer server.Close() + request, err := http.NewRequest("GET", server.URL+"/", nil) + require.NoError(t, err) + response, err := server.Client().Do(request) + require.NoError(t, err) + assert.Len(t, response.Header["Header"], 1) + assert.Equal(t, "value", response.Header["Header"][0]) +} diff --git a/models/unittest/testdata/GET_%2F b/models/unittest/testdata/GET_%2F new file mode 100644 index 0000000000..8b79a2cd25 --- /dev/null +++ b/models/unittest/testdata/GET_%2F @@ -0,0 +1,3 @@ +Header: value + +bodydata diff --git a/models/user/main_test.go b/models/user/main_test.go index f0dae086e0..902389fe06 100644 --- a/models/user/main_test.go +++ b/models/user/main_test.go @@ -8,11 +8,7 @@ import ( "forgejo.org/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" - _ "forgejo.org/models/user" + _ "forgejo.org/modules/testimport" ) func TestMain(m *testing.M) { diff --git a/modules/actions/log.go b/modules/actions/log.go index 5df1f9bec3..c7cb270b18 100644 --- a/modules/actions/log.go +++ b/modules/actions/log.go @@ -61,7 +61,7 @@ func WriteLogs(ctx context.Context, filename string, offset int64, rows []*runne stat, err := f.Stat() if err != nil { - return nil, fmt.Errorf("dbfs Stat %q: %w", name, err) + return nil, fmt.Errorf("WriteLogs(name=%q, offset=%d, len(rows)=%d): dbfs Stat: %w", name, offset, len(rows), err) } if stat.Size() < offset { // If the size is less than offset, refuse to write, or it could result in content holes. diff --git a/modules/activitypub/main_test.go b/modules/activitypub/main_test.go index c46c1759c1..a3f173f408 100644 --- a/modules/activitypub/main_test.go +++ b/modules/activitypub/main_test.go @@ -7,11 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/modules/activitypub/user_settings_test.go b/modules/activitypub/user_settings_test.go index 475e761e69..f70b39d5ce 100644 --- a/modules/activitypub/user_settings_test.go +++ b/modules/activitypub/user_settings_test.go @@ -11,8 +11,6 @@ import ( user_model "forgejo.org/models/user" "forgejo.org/modules/activitypub" - _ "forgejo.org/models" // https://forum.gitea.com/t/testfixtures-could-not-clean-table-access-no-such-table-access/4137/4 - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/modules/git/blob.go b/modules/git/blob.go index e2dc624e86..020a591a23 100644 --- a/modules/git/blob.go +++ b/modules/git/blob.go @@ -141,6 +141,28 @@ func (b *Blob) Name() string { return b.name } +// NewReader return a blob-reader which fails immediately with [BlobTooLargeError] if the file is bigger than the limit +func (b *Blob) NewReader(limit int64) (rc io.ReadCloser, actualSize int64, err error) { + actualSize = b.Size() + if actualSize > limit { + return nil, actualSize, BlobTooLargeError{ + Size: actualSize, + Limit: limit, + } + } + r, _, cancel, err := b.newReader() + if err != nil { + return nil, actualSize, err + } + + return &blobReader{ + rd: r, + n: actualSize, + additionalDiscard: 0, + cancel: cancel, + }, actualSize, nil +} + // NewTruncatedReader return a blob-reader which silently truncates when the limit is reached (io.EOF will be returned) func (b *Blob) NewTruncatedReader(limit int64) (rc io.ReadCloser, fullSize int64, err error) { r, fullSize, cancel, err := b.newReader() @@ -168,14 +190,7 @@ func (b BlobTooLargeError) Error() string { // GetContentBase64 Reads the content of the blob and returns it as base64 encoded string. // Returns [BlobTooLargeError] if the (unencoded) content is larger than the limit. func (b *Blob) GetContentBase64(limit int64) (string, error) { - if b.Size() > limit { - return "", BlobTooLargeError{ - Size: b.Size(), - Limit: limit, - } - } - - rc, size, err := b.NewTruncatedReader(limit) + rc, size, err := b.NewReader(limit) if err != nil { return "", err } diff --git a/modules/git/repo_compare.go b/modules/git/repo_compare.go index 98a1930ac2..f97d7b67fa 100644 --- a/modules/git/repo_compare.go +++ b/modules/git/repo_compare.go @@ -189,7 +189,7 @@ var ( // `useMergebase` is specified then the merge base between `base` and `head` is // used to compare against `head`. func (repo *Repository) GetShortStat(base, head string, useMergebase bool) (numFiles, totalAdditions, totalDeletions int, err error) { - cmd := NewCommand(repo.Ctx, "diff-tree", "--shortstat") + cmd := NewCommand(repo.Ctx, "diff-tree", "--shortstat", "--find-renames") if useMergebase { cmd = cmd.AddArguments("--merge-base") } @@ -211,7 +211,7 @@ func (repo *Repository) GetShortStat(base, head string, useMergebase bool) (numF // GetCommitShortStat returns the number of files, total additions and total deletions the commit has. func (repo *Repository) GetCommitShortStat(commitID string) (numFiles, totalAdditions, totalDeletions int, err error) { - cmd := NewCommand(repo.Ctx, "diff-tree", "--shortstat", "--no-commit-id", "--root").AddDynamicArguments(commitID) + cmd := NewCommand(repo.Ctx, "diff-tree", "--shortstat", "--no-commit-id", "--root", "--find-renames").AddDynamicArguments(commitID) stdout, _, err := cmd.RunStdString(&RunOpts{Dir: repo.Path}) if err != nil { return 0, 0, 0, err diff --git a/modules/git/repo_compare_test.go b/modules/git/repo_compare_test.go index fcdc256112..aa8e92e0ea 100644 --- a/modules/git/repo_compare_test.go +++ b/modules/git/repo_compare_test.go @@ -242,6 +242,18 @@ func TestGetCommitShortStat(t *testing.T) { assert.Equal(t, 6, totalAddition) assert.Equal(t, 0, totalDeletions) }) + + t.Run("Renames", func(t *testing.T) { + repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "renames")) + require.NoError(t, err) + defer repo.Close() + + numFiles, totalAddition, totalDeletions, err := repo.GetCommitShortStat("f667f3a24223414e3bfbe01ab6e445c703ab8e25") + require.NoError(t, err) + assert.Equal(t, 1, numFiles) + assert.Zero(t, totalAddition) + assert.Zero(t, totalDeletions) + }) } func TestGetShortStat(t *testing.T) { @@ -301,6 +313,28 @@ func TestGetShortStat(t *testing.T) { assert.Zero(t, totalAdditions) assert.Zero(t, totalDeletions) }) + + t.Run("Renames", func(t *testing.T) { + repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "renames")) + require.NoError(t, err) + defer repo.Close() + + t.Run("Only rename", func(t *testing.T) { + numFiles, totalAdditions, totalDeletions, err := repo.GetShortStat("bc40f00489096a7d4090a609a6572f528e1acb76", "f667f3a24223414e3bfbe01ab6e445c703ab8e25", true) + require.NoError(t, err) + assert.Equal(t, 1, numFiles) + assert.Zero(t, totalAdditions) + assert.Zero(t, totalDeletions) + }) + + t.Run("Too much diverged", func(t *testing.T) { + numFiles, totalAdditions, totalDeletions, err := repo.GetShortStat("bc40f00489096a7d4090a609a6572f528e1acb76", "acdee217ada3fea6e503acfb969724cc799fc516", true) + require.NoError(t, err) + assert.Equal(t, 2, numFiles) + assert.Equal(t, 3, totalAdditions) + assert.Equal(t, 1, totalDeletions) + }) + }) } func TestGetMergeBaseSimple(t *testing.T) { diff --git a/modules/git/submodule.go b/modules/git/submodule.go index 4ea97d66eb..3d05657478 100644 --- a/modules/git/submodule.go +++ b/modules/git/submodule.go @@ -5,6 +5,7 @@ package git import ( + "errors" "fmt" "io" "net" @@ -19,6 +20,8 @@ import ( "gopkg.in/ini.v1" //nolint:depguard // used to read .gitmodules ) +const MaxGitmodulesFileSize = 64 * 1024 + // GetSubmodule returns the Submodule of a given path func (c *Commit) GetSubmodule(path string, entry *TreeEntry) (Submodule, error) { err := c.readSubmodules() @@ -55,8 +58,12 @@ func (c *Commit) readSubmodules() error { return err } - rc, _, err := entry.Blob().NewTruncatedReader(10 * 1024) + rc, _, err := entry.Blob().NewReader(MaxGitmodulesFileSize) if err != nil { + if errors.As(err, &BlobTooLargeError{}) { + c.submodules = make(map[string]Submodule) + return nil + } return err } defer rc.Close() diff --git a/modules/git/tests/repos/renames/HEAD b/modules/git/tests/repos/renames/HEAD new file mode 100644 index 0000000000..b870d82622 --- /dev/null +++ b/modules/git/tests/repos/renames/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/modules/git/tests/repos/renames/config b/modules/git/tests/repos/renames/config new file mode 100644 index 0000000000..4ea33d92c0 --- /dev/null +++ b/modules/git/tests/repos/renames/config @@ -0,0 +1,6 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true +[remote "origin"] + url = /home/gusted/Desktop/renames diff --git a/modules/git/tests/repos/renames/objects/info/commit-graph b/modules/git/tests/repos/renames/objects/info/commit-graph new file mode 100644 index 0000000000..383b1bc443 Binary files /dev/null and b/modules/git/tests/repos/renames/objects/info/commit-graph differ diff --git a/modules/git/tests/repos/renames/objects/info/packs b/modules/git/tests/repos/renames/objects/info/packs new file mode 100644 index 0000000000..226626bf64 --- /dev/null +++ b/modules/git/tests/repos/renames/objects/info/packs @@ -0,0 +1,3 @@ +P pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.pack +P pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.pack + diff --git a/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.idx b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.idx new file mode 100644 index 0000000000..7e7196c5c8 Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.idx differ diff --git a/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.mtimes b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.mtimes new file mode 100644 index 0000000000..31e93d8189 Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.mtimes differ diff --git a/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.pack b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.pack new file mode 100644 index 0000000000..880b956c0c Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.pack differ diff --git a/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.rev b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.rev new file mode 100644 index 0000000000..d2a0203abc Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.rev differ diff --git a/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.bitmap b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.bitmap new file mode 100644 index 0000000000..43debf60a7 Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.bitmap differ diff --git a/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.idx b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.idx new file mode 100644 index 0000000000..4c69d3a347 Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.idx differ diff --git a/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.pack b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.pack new file mode 100644 index 0000000000..8b808eb5f2 Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.pack differ diff --git a/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.rev b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.rev new file mode 100644 index 0000000000..44f5b3412e Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.rev differ diff --git a/modules/git/tests/repos/renames/packed-refs b/modules/git/tests/repos/renames/packed-refs new file mode 100644 index 0000000000..0688fe7613 --- /dev/null +++ b/modules/git/tests/repos/renames/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +acdee217ada3fea6e503acfb969724cc799fc516 refs/heads/main diff --git a/modules/git/tests/repos/renames/refs/heads/.gitkeep b/modules/git/tests/repos/renames/refs/heads/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/modules/httplib/url.go b/modules/httplib/url.go index 32a02e3277..66ea77add7 100644 --- a/modules/httplib/url.go +++ b/modules/httplib/url.go @@ -1,20 +1,26 @@ // Copyright 2023 The Gitea Authors. All rights reserved. +// Copyright 2026 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package httplib import ( "net/url" + "path" "strings" "forgejo.org/modules/setting" ) +// Unfortunately browsers consider a redirect Location with preceding "//", "\\", "/\" and "\/" as meaning redirect to "http(s)://REST_OF_PATH" +// Therefore we should ignore these redirect locations to prevent open redirects. +func isBrowserRedirect(s string) bool { + return len(s) > 1 && (s[0] == '/' || s[0] == '\\') && (s[1] == '/' || s[1] == '\\') +} + // IsRiskyRedirectURL returns true if the URL is considered risky for redirects func IsRiskyRedirectURL(s string) bool { - // Unfortunately browsers consider a redirect Location with preceding "//", "\\", "/\" and "\/" as meaning redirect to "http(s)://REST_OF_PATH" - // Therefore we should ignore these redirect locations to prevent open redirects - if len(s) > 1 && (s[0] == '/' || s[0] == '\\') && (s[1] == '/' || s[1] == '\\') { + if isBrowserRedirect(s) { return true } @@ -23,5 +29,12 @@ func IsRiskyRedirectURL(s string) bool { return true } + // If the path contains `..` then it's still possible this is seen + // as a browser redirect, use `path.Clean` to eliminate each inner `..` + // and then check if that might be a browser redirect. + if strings.Contains(u.Path, "..") { + return isBrowserRedirect(path.Clean(u.Path)) + } + return false } diff --git a/modules/httplib/url_test.go b/modules/httplib/url_test.go index cd2ceac267..0fd59c13a6 100644 --- a/modules/httplib/url_test.go +++ b/modules/httplib/url_test.go @@ -29,7 +29,6 @@ func TestIsRiskyRedirectURL(t *testing.T) { {"/sub/foo", false}, {"http://localhost:3000/sub/foo", false}, {"http://localhost:3000/sub/test?param=false", false}, - // FIXME: should probably be true (would requires resolving references using setting.appURL.ResolveReference(u)) {"/sub/../", false}, {"http://localhost:3000/sub/../", false}, {"/sUb/", false}, @@ -58,10 +57,12 @@ func TestIsRiskyRedirectURL(t *testing.T) { {"://missing protocol scheme", true}, // FIXME: should probably be false {"//localhost:3000/sub/test?param=false", true}, + {"/a/../\\example.com", true}, + {"/a/%2e%2e/\\example.com", true}, } for _, tt := range tests { t.Run(tt.input, func(t *testing.T) { - assert.Equal(t, tt.want, IsRiskyRedirectURL(tt.input)) + assert.Equal(t, tt.want, IsRiskyRedirectURL(tt.input), tt.input) }) } } @@ -114,6 +115,8 @@ func TestIsRiskyRedirectURLWithoutSubURL(t *testing.T) { {"https://next.forgejo.org", true}, {"//next.forgejo.org/test?param=false", true}, {"//next.forgejo.org/sub/test?param=false", true}, + {"/a/../\\example.com", true}, + {"/a/%2e%2e/\\example.com", true}, } for _, tt := range tests { t.Run(tt.input, func(t *testing.T) { diff --git a/modules/indexer/code/indexer.go b/modules/indexer/code/indexer.go index f3ed091a30..a3e20e1d5a 100644 --- a/modules/indexer/code/indexer.go +++ b/modules/indexer/code/indexer.go @@ -21,6 +21,7 @@ import ( "forgejo.org/modules/process" "forgejo.org/modules/queue" "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) var ( @@ -182,12 +183,12 @@ func Init() { log.Fatal("PID: %d Unable to initialize the bleve Repository Indexer at path: %s Error: %v", os.Getpid(), setting.Indexer.RepoPath, err) } case "elasticsearch": - log.Info("PID: %d Initializing Repository Indexer at: %s", os.Getpid(), setting.Indexer.RepoConnStr) + log.Info("PID: %d Initializing Repository Indexer at: %s", os.Getpid(), util.SanitizeCredentialURLs(setting.Indexer.RepoConnStr)) defer func() { if err := recover(); err != nil { log.Error("PANIC whilst initializing repository indexer: %v\nStacktrace: %s", err, log.Stack(2)) log.Error("The indexer files are likely corrupted and may need to be deleted") - log.Error("You can completely remove the \"%s\" index to make Forgejo recreate the indexes", setting.Indexer.RepoConnStr) + log.Error("You can completely remove the \"%s\" index to make Forgejo recreate the indexes", util.SanitizeCredentialURLs(setting.Indexer.RepoConnStr)) } }() @@ -197,7 +198,7 @@ func Init() { cancel() (*globalIndexer.Load()).Close() close(waitChannel) - log.Fatal("PID: %d Unable to initialize the elasticsearch Repository Indexer connstr: %s Error: %v", os.Getpid(), setting.Indexer.RepoConnStr, err) + log.Fatal("PID: %d Unable to initialize the elasticsearch Repository Indexer connstr: %s Error: %v", os.Getpid(), util.SanitizeCredentialURLs(setting.Indexer.RepoConnStr), err) } default: diff --git a/modules/indexer/code/indexer_test.go b/modules/indexer/code/indexer_test.go index 97f17b083f..87deaf928b 100644 --- a/modules/indexer/code/indexer_test.go +++ b/modules/indexer/code/indexer_test.go @@ -14,11 +14,6 @@ import ( "forgejo.org/modules/indexer/code/elasticsearch" "forgejo.org/modules/indexer/code/internal" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/modules/indexer/issues/indexer.go b/modules/indexer/issues/indexer.go index d472067cd8..eebcc9a509 100644 --- a/modules/indexer/issues/indexer.go +++ b/modules/indexer/issues/indexer.go @@ -25,6 +25,7 @@ import ( "forgejo.org/modules/process" "forgejo.org/modules/queue" "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) // IndexerMetadata is used to send data to the queue, so it contains only the ids. @@ -100,7 +101,7 @@ func InitIssueIndexer(syncReindex bool) { issueIndexer = elasticsearch.NewIndexer(setting.Indexer.IssueConnStr, setting.Indexer.IssueIndexerName) existed, err = issueIndexer.Init(ctx) if err != nil { - log.Fatal("Unable to issueIndexer.Init with connection %s Error: %v", setting.Indexer.IssueConnStr, err) + log.Fatal("Unable to issueIndexer.Init with connection %s Error: %v", util.SanitizeCredentialURLs(setting.Indexer.IssueConnStr), err) } case "db": issueIndexer = db_index.NewIndexer() @@ -108,7 +109,7 @@ func InitIssueIndexer(syncReindex bool) { issueIndexer = meilisearch.NewIndexer(setting.Indexer.IssueConnStr, setting.Indexer.IssueConnAuth, setting.Indexer.IssueIndexerName) existed, err = issueIndexer.Init(ctx) if err != nil { - log.Fatal("Unable to issueIndexer.Init with connection %s Error: %v", setting.Indexer.IssueConnStr, err) + log.Fatal("Unable to issueIndexer.Init with connection %s Error: %v", util.SanitizeCredentialURLs(setting.Indexer.IssueConnStr), err) } default: log.Fatal("Unknown issue indexer type: %s", setting.Indexer.IssueType) diff --git a/modules/indexer/issues/indexer_test.go b/modules/indexer/issues/indexer_test.go index 527627e0fc..99a09380e7 100644 --- a/modules/indexer/issues/indexer_test.go +++ b/modules/indexer/issues/indexer_test.go @@ -13,11 +13,6 @@ import ( "forgejo.org/modules/optional" "forgejo.org/modules/setting" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/modules/indexer/stats/indexer_test.go b/modules/indexer/stats/indexer_test.go index a5899d2506..7d51d3f522 100644 --- a/modules/indexer/stats/indexer_test.go +++ b/modules/indexer/stats/indexer_test.go @@ -13,11 +13,6 @@ import ( "forgejo.org/modules/queue" "forgejo.org/modules/setting" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/modules/markup/html.go b/modules/markup/html.go index 2fe0caa5b6..2d569725d7 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -46,6 +46,9 @@ var ( // valid chars in encoded path and parameter: [-+~_%.a-zA-Z0-9/] + // httpSchemePattern matches https:// or http:// + httpSchemePattern = regexp.MustCompile(`^https?://`) + // hashCurrentPattern matches string that represents a commit SHA, e.g. d8a994ef243349f321568f9e36d5c3f444b99cae // Although SHA1 hashes are 40 chars long, SHA256 are 64, the regex matches the hash from 7 to 64 chars in length // so that abbreviated hash links can be used as well. This matches git and GitHub usability. @@ -72,7 +75,7 @@ var ( // https://html.spec.whatwg.org/multipage/input.html#e-mail-state-(type%3Demail) emailRegex = regexp.MustCompile("(?:\\s|^|\\(|\\[)([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9]{2,}(?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+)(?:\\s|$|\\)|\\]|;|,|\\?|!|\\.(\\s|$))") - // Fediverse handle regex (same as emailRegex but with additonal @ or ! + // Fediverse handle regex (same as emailRegex but with additional @ or ! // at start) fediRegex = regexp.MustCompile("(?:\\s|^|\\(|\\[)([@!]([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+)@([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9]{2,}(?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+))(?:\\s|$|\\)|\\]|;|,|\\?|!|\\.(\\s|$))") @@ -826,10 +829,7 @@ func pullReviewCommitPatternProcessor(ctx *RenderContext, node *html.Node) { text := "!" + id + " (commit " - baseURLEnd := strings.Index(urlFull, repoSlug) + len(repoSlug) - if len(ctx.Links.Base) > 0 && !strings.HasPrefix(ctx.Links.Base, urlFull[:baseURLEnd]) { - text = repoSlug + "@" + text - } + optionalRepoSlugAndInstancePath(ctx, &text, urlFull, repoSlug) aNode.AppendChild(&html.Node{ Type: html.TextNode, @@ -1083,10 +1083,7 @@ func fullHashPatternProcessor(ctx *RenderContext, node *html.Node) { // We need to figure out the base of the provided URL, which is up to and including the // `/` slug. // With that we can determine if it matches the current repo, or if the slug should be shown. - baseURLEnd := strings.Index(urlFull, repoSlug) + len(repoSlug) - if len(ctx.Links.Base) > 0 && !strings.HasPrefix(ctx.Links.Base, urlFull[:baseURLEnd]) { - text = repoSlug + "@" + text - } + optionalRepoSlugAndInstancePath(ctx, &text, urlFull, repoSlug) // 3rd capture group matches an optional file path after the SHA filePath := "" @@ -1191,10 +1188,7 @@ func comparePatternProcessor(ctx *RenderContext, node *html.Node) { text := text1 + textDots + text2 - baseURLEnd := strings.Index(urlFull, repoSlug) + len(repoSlug) - if len(ctx.Links.Base) > 0 && !strings.HasPrefix(ctx.Links.Base, urlFull[:baseURLEnd]) { - text = repoSlug + "@" + text - } + optionalRepoSlugAndInstancePath(ctx, &text, urlFull, repoSlug) extra := "" if query != "" { @@ -1525,3 +1519,27 @@ func createDescriptionLink(href, content string) *html.Node { textNode.Parent = linkNode return linkNode } + +// Adds an optional repo slug and optionally the instance domain and URL +// +// The repo slug is added if the link points to a different repo +// The instance domain and sub-path is added if the link points to a different instance +func optionalRepoSlugAndInstancePath(ctx *RenderContext, text *string, fullURL, slug string) { + if len(ctx.Links.Base) > 0 { + // The fullURL is the url to e.g. the commit. The slug is e.g. `forgejo/forgejo`. + // To retrieve the instance domain and sub-path we need to remove the repo slug + slugStart := strings.LastIndex(fullURL, slug) + targetInstance := fullURL[:slugStart] + + // Check if the URL points to a different instance + if setting.AppURL != targetInstance { + // Remove the http scheme for displaying + targetInstance = httpSchemePattern.ReplaceAllString(targetInstance, "") + + *text = targetInstance + slug + "@" + *text + } else if !strings.HasSuffix(strings.TrimSuffix(ctx.Links.Base, "/"), slug) { + // If it is a link to a different repo, but on the same instance only add the repo slug + *text = slug + "@" + *text + } + } +} diff --git a/modules/markup/html_internal_test.go b/modules/markup/html_internal_test.go index 1f717a78ed..752ffeba6f 100644 --- a/modules/markup/html_internal_test.go +++ b/modules/markup/html_internal_test.go @@ -12,6 +12,7 @@ import ( "forgejo.org/modules/git" "forgejo.org/modules/setting" + "forgejo.org/modules/test" "forgejo.org/modules/util" "github.com/stretchr/testify/assert" @@ -19,9 +20,10 @@ import ( ) const ( - TestAppURL = "http://localhost:3000/" - TestOrgRepo = "gogits/gogs" - TestRepoURL = TestAppURL + TestOrgRepo + "/" + TestAppURL = "http://localhost:3000/" + TestOrgRepo = "gogits/gogs" + TestRepoURLWithoutSlash = TestAppURL + TestOrgRepo + TestRepoURL = TestAppURL + TestOrgRepo + "/" ) // externalIssueLink an HTML link to an alphanumeric-style issue @@ -107,7 +109,7 @@ func TestRender_IssueIndexPattern(t *testing.T) { } func TestRender_IssueIndexPattern2(t *testing.T) { - setting.AppURL = TestAppURL + defer test.MockVariableValue(&setting.AppURL, TestAppURL)() // numeric: render inputs with valid mentions test := func(s, expectedFmt, marker string, indices ...int) { @@ -174,7 +176,7 @@ func TestRender_IssueIndexPattern2(t *testing.T) { } func TestRender_IssueIndexPattern3(t *testing.T) { - setting.AppURL = TestAppURL + defer test.MockVariableValue(&setting.AppURL, TestAppURL)() // alphanumeric: render inputs without valid mentions test := func(s string) { @@ -202,7 +204,7 @@ func TestRender_IssueIndexPattern3(t *testing.T) { } func TestRender_IssueIndexPattern4(t *testing.T) { - setting.AppURL = TestAppURL + defer test.MockVariableValue(&setting.AppURL, TestAppURL)() // alphanumeric: render inputs with valid mentions test := func(s, expectedFmt string, names ...string) { @@ -222,7 +224,7 @@ func TestRender_IssueIndexPattern4(t *testing.T) { } func TestRender_IssueIndexPattern5(t *testing.T) { - setting.AppURL = TestAppURL + defer test.MockVariableValue(&setting.AppURL, TestAppURL)() // regexp: render inputs without valid mentions test := func(s, expectedFmt, pattern string, ids, names []string) { @@ -265,7 +267,7 @@ func TestRender_IssueIndexPattern5(t *testing.T) { } func TestRender_IssueIndexPattern_Document(t *testing.T) { - setting.AppURL = TestAppURL + defer test.MockVariableValue(&setting.AppURL, TestAppURL)() metas := map[string]string{ "format": "https://someurl.com/{user}/{repo}/{index}", "user": "someUser", @@ -301,9 +303,9 @@ func testRenderIssueIndexPattern(t *testing.T, input, expected string, ctx *Rend } func TestRender_AutoLink(t *testing.T) { - setting.AppURL = TestAppURL + defer test.MockVariableValue(&setting.AppURL, TestAppURL)() - test := func(input, expected, base string) { + assert := func(input, expected, base string) { var buffer strings.Builder err := PostProcess(&RenderContext{ Ctx: git.DefaultContext, @@ -330,7 +332,7 @@ func TestRender_AutoLink(t *testing.T) { t.Run("Issue", func(t *testing.T) { // render valid issue URLs - test(util.URLJoin(TestRepoURL, "issues", "3333"), + assert(util.URLJoin(TestRepoURL, "issues", "3333"), numericIssueLink(util.URLJoin(TestRepoURL, "issues"), "ref-issue", 3333, "#"), TestRepoURL) }) @@ -338,81 +340,90 @@ func TestRender_AutoLink(t *testing.T) { t.Run("Commit", func(t *testing.T) { // render valid commit URLs tmp := util.URLJoin(TestRepoURL, "commit", "d8a994ef243349f321568f9e36d5c3f444b99cae") - test(tmp, "d8a994ef24", TestRepoURL) - test(tmp, ""+TestOrgRepo+"@d8a994ef24", "https://localhost/forgejo/forgejo") - test( + assert(tmp, "d8a994ef24", TestRepoURLWithoutSlash) + assert(tmp, ""+TestOrgRepo+"@d8a994ef24", "/forgejo/forgejo") + assert( tmp+"#diff-2", "d8a994ef24 (diff-2)", TestRepoURL, ) - test( + assert( tmp+"#diff-953bb4f01b7c77fa18f0cd54211255051e647dbc", "d8a994ef24 (diff-953bb4f01b)", - TestRepoURL, + TestRepoURLWithoutSlash, ) // render other commit URLs tmp = "https://external-link.gitea.io/go-gitea/gitea/commit/d8a994ef243349f321568f9e36d5c3f444b99cae#diff-2" - test(tmp, "d8a994ef24 (diff-2)", "https://external-link.gitea.io/go-gitea/gitea") - test(tmp, "go-gitea/gitea@d8a994ef24 (diff-2)", TestRepoURL) + assert(tmp, "external-link.gitea.io/go-gitea/gitea@d8a994ef24 (diff-2)", TestOrgRepo) + defer test.MockVariableValue(&setting.AppURL, "https://external-link.gitea.io/")() + assert(tmp, "d8a994ef24 (diff-2)", "https://external-link.gitea.io/go-gitea/gitea") - tmp = "http://localhost:3000/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20" - test(tmp, "190d949293", "http://localhost:3000/gogits/gogs") - test(tmp, "gogits/gogs@190d949293", "https://external-link.gitea.io/go-gitea/gitea") + tmp = TestAppURL + "gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20" + assert(tmp, "localhost:3000/gogits/gogs@190d949293", "https://external-link.gitea.io/go-gitea/gitea") + defer test.MockVariableValue(&setting.AppURL, TestAppURL)() + assert(tmp, "190d949293", "http://localhost:3000/gogits/gogs") tmp = "http://localhost:3000/sub/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20" - test(tmp, "190d949293", "http://localhost:3000/sub/gogits/gogs") - test(tmp, "gogits/gogs@190d949293", "http://localhost:3000/gogits/gogs") - test(tmp, "gogits/gogs@190d949293", "https://external-link.gitea.io/go-gitea/gitea") + assert(tmp, "localhost:3000/sub/gogits/gogs@190d949293", TestRepoURLWithoutSlash) + assert(tmp, "localhost:3000/sub/gogits/gogs@190d949293", "https://external-link.gitea.io/go-gitea/gitea") + defer test.MockVariableValue(&setting.AppURL, TestAppURL+"sub/")() + assert(tmp, "190d949293", "http://localhost:3000/sub/gogits/gogs") tmp = "http://localhost:3000/sub1/sub2/sub3/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20" - test(tmp, "190d949293", "http://localhost:3000/sub1/sub2/sub3/gogits/gogs") - test(tmp, "gogits/gogs@190d949293", "http://localhost:3000/sub1/gogits/gogs") - test(tmp, "gogits/gogs@190d949293", "https://external-link.gitea.io/go-gitea/gitea") + defer test.MockVariableValue(&setting.AppURL, TestAppURL+"sub1/sub2/sub3/")() + assert(tmp, "190d949293", "http://localhost:3000/sub1/sub2/sub3/gogits/gogs") + defer test.MockVariableValue(&setting.AppURL, TestAppURL)() + assert(tmp, "localhost:3000/sub1/sub2/sub3/gogits/gogs@190d949293", "http://localhost:3000/sub1/gogits/gogs") + assert(tmp, "localhost:3000/sub1/sub2/sub3/gogits/gogs@190d949293", "https://external-link.gitea.io/go-gitea/gitea") // if the repository happens to be named like one of the known app routes (e.g. `src`), // we can parse the URL correctly, if there is no sub path tmp = "http://localhost:3000/gogits/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20" - test(tmp, "gogits/src@190d949293", TestRepoURL) + assert(tmp, "gogits/src@190d949293", TestRepoURL) tmp = "http://localhost:3000/gogits/src/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20" - test(tmp, "gogits/src@190d949293", TestRepoURL) + assert(tmp, "gogits/src@190d949293", TestRepoURL) // but if there is a sub path, we cannot reliably distinguish the repo name from the app route tmp = "http://localhost:3000/sub/gogits/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20" - test(tmp, "sub/gogits@190d949293", TestRepoURL) + assert(tmp, "sub/gogits@190d949293", TestRepoURL) }) t.Run("Compare", func(t *testing.T) { tmp := util.URLJoin(TestRepoURL, "compare", "d8a994ef243349f321568f9e36d5c3f444b99cae..190d9492934af498c3f669d6a2431dc5459e5b20") - test(tmp, "d8a994ef24..190d949293", TestRepoURL) - test(tmp, ""+TestOrgRepo+"@d8a994ef24..190d949293", "https://localhost/forgejo/forgejo") + assert(tmp, "d8a994ef24..190d949293", TestRepoURL) + assert(tmp, ""+TestOrgRepo+"@d8a994ef24..190d949293", "https://localhost/forgejo/forgejo") + defer test.MockVariableValue(&setting.AppURL, TestAppURL+"sub/")() tmp = "http://localhost:3000/sub/gogits/gogs/compare/190d9492934af498c3f669d6a2431dc5459e5b20..d8a994ef243349f321568f9e36d5c3f444b99cae" - test(tmp, "190d949293..d8a994ef24", "http://localhost:3000/sub/gogits/gogs") - test(tmp, "gogits/gogs@190d949293..d8a994ef24", "http://localhost:3000/gogits/gogs") - test(tmp, "gogits/gogs@190d949293..d8a994ef24", "https://external-link.gitea.io/go-gitea/gitea") + assert(tmp, "190d949293..d8a994ef24", "http://localhost:3000/sub/gogits/gogs") + assert(tmp, "gogits/gogs@190d949293..d8a994ef24", "http://localhost:3000/sub/gogits/gugs") + defer test.MockVariableValue(&setting.AppURL, "https://external-link.gitea.io/")() + assert(tmp, "localhost:3000/sub/gogits/gogs@190d949293..d8a994ef24", "https://external-link.gitea.io/go-gitea/gitea") + defer test.MockVariableValue(&setting.AppURL, TestAppURL+"sub1/sub2/sub3/")() tmp = "http://localhost:3000/sub1/sub2/sub3/gogits/gogs/compare/190d9492934af498c3f669d6a2431dc5459e5b20..d8a994ef243349f321568f9e36d5c3f444b99cae" - test(tmp, "190d949293..d8a994ef24", "http://localhost:3000/sub1/sub2/sub3/gogits/gogs") - test(tmp, "gogits/gogs@190d949293..d8a994ef24", "http://localhost:3000/sub1/gogits/gogs") - test(tmp, "gogits/gogs@190d949293..d8a994ef24", "https://external-link.gitea.io/go-gitea/gitea") + assert(tmp, "190d949293..d8a994ef24", "http://localhost:3000/sub1/sub2/sub3/gogits/gogs") + assert(tmp, "gogits/gogs@190d949293..d8a994ef24", "/gogits/gous") + assert(tmp, "gogits/gogs@190d949293..d8a994ef24", "https://external-link.gitea.io/go-gitea/gitea") tmp = "https://codeberg.org/forgejo/forgejo/compare/8bbac4c679bea930c74849c355a60ed3c52f8eb5...e2278e5a38187a1dc84dc41d583ec8b44e7257c1?files=options/locale/locale_fi-FI.ini" - test(tmp, "8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini)", "https://codeberg.org/forgejo/forgejo") - test(tmp, "forgejo/forgejo@8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini)", TestRepoURL) - test(tmp+".", "forgejo/forgejo@8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini).", TestRepoURL) + assert(tmp, "codeberg.org/forgejo/forgejo@8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini)", TestRepoURL) + assert(tmp+".", "codeberg.org/forgejo/forgejo@8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini).", TestRepoURL) + defer test.MockVariableValue(&setting.AppURL, "https://codeberg.org/")() + assert(tmp, "8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini)", "https://codeberg.org/forgejo/forgejo") tmp = "https://codeberg.org/forgejo/forgejo/compare/8bbac4c679bea930c74849c355a60ed3c52f8eb5...e2278e5a38187a1dc84dc41d583ec8b44e7257c1?files=options/locale/locale_fi-FI.ini#L2" - test(tmp, "8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini#L2)", "https://codeberg.org/forgejo/forgejo") + assert(tmp, "8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini#L2)", "https://codeberg.org/forgejo/forgejo") }) t.Run("Invalid URLs", func(t *testing.T) { tmp := "https://local host/gogits/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20" - test(tmp, "https://local host/gogits/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20", TestRepoURL) + assert(tmp, "https://local host/gogits/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20", TestRepoURL) }) } func TestRender_IssueIndexPatternRef(t *testing.T) { - setting.AppURL = TestAppURL + defer test.MockVariableValue(&setting.AppURL, TestAppURL)() test := func(input, expected string) { var buf strings.Builder @@ -428,7 +439,7 @@ func TestRender_IssueIndexPatternRef(t *testing.T) { } func TestRender_FullIssueURLs(t *testing.T) { - setting.AppURL = TestAppURL + defer test.MockVariableValue(&setting.AppURL, TestAppURL)() test := func(input, expected string) { var result strings.Builder diff --git a/modules/markup/html_test.go b/modules/markup/html_test.go index c7c53e2678..8305ada25e 100644 --- a/modules/markup/html_test.go +++ b/modules/markup/html_test.go @@ -41,7 +41,7 @@ func TestMain(m *testing.M) { } func TestRender_Commits(t *testing.T) { - setting.AppURL = markup.TestAppURL + defer test.MockVariableValue(&setting.AppURL, markup.TestAppURL)() test := func(input, expected string) { buffer, err := markup.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, @@ -94,10 +94,19 @@ func TestRender_Commits(t *testing.T) { fileStrangeChars := util.URLJoin(repo, "src", "commit", "eeb243c3395e1921c5d90e73bd739827251fc99d", "path", "to", "file%20%23.txt") test(fileStrangeChars, `

eeb243c339/path/to/file #.txt

`) + + commitLink := util.URLJoin(repo, "src", "commit", "eeb243c3395e1921c5d90e73bd739827251fc99d") + test(commitLink, `

eeb243c339

`) + + crossCommitLink := util.URLJoin(markup.TestAppURL, "forgejo/forgejo", "src", "commit", "eeb243c3395e1921c5d90e73bd739827251fc99d") + test(crossCommitLink, `

forgejo/forgejo@eeb243c339

`) + + extCommitLink := util.URLJoin("https://codeberg.org/", markup.TestOrgRepo, "src", "commit", "eeb243c3395e1921c5d90e73bd739827251fc99d") + test(extCommitLink, `

codeberg.org/`+markup.TestOrgRepo+`@eeb243c339

`) } func TestRender_CrossReferences(t *testing.T) { - setting.AppURL = markup.TestAppURL + defer test.MockVariableValue(&setting.AppURL, markup.TestAppURL)() test := func(input, expected string) { buffer, err := markup.RenderString(&markup.RenderContext{ @@ -140,7 +149,7 @@ func TestRender_CrossReferences(t *testing.T) { } func TestRender_links(t *testing.T) { - setting.AppURL = markup.TestAppURL + defer test.MockVariableValue(&setting.AppURL, markup.TestAppURL)() test := func(input, expected string) { buffer, err := markup.RenderString(&markup.RenderContext{ @@ -242,12 +251,12 @@ func TestRender_links(t *testing.T) { } func TestRender_PullReviewCommitLink(t *testing.T) { - setting.AppURL = markup.TestAppURL + defer test.MockVariableValue(&setting.AppURL, markup.TestAppURL)() sha := "190d9492934af498c3f669d6a2431dc5459e5b20" prCommitLink := util.URLJoin(markup.TestRepoURL, "pulls", "1", "commits", sha) - test := func(input, expected, base string) { + assert := func(input, expected, base string) { buffer, err := markup.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, RelativePath: ".md", @@ -261,27 +270,28 @@ func TestRender_PullReviewCommitLink(t *testing.T) { assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer)) } - test(prCommitLink, `

!1 (commit `+sha[0:10]+`)

`, markup.TestRepoURL) + assert(prCommitLink, `

!1 (commit `+sha[0:10]+`)

`, markup.TestRepoURL) prCommitLink = util.URLJoin(markup.TestAppURL, "sub1", "sub2", markup.TestOrgRepo, "pulls", "1", "commits", sha) - test( + assert( prCommitLink, - `

!1 (commit `+sha[0:10]+`)

`, + `

localhost:3000/sub1/sub2/gogits/gogs@!1 (commit `+sha[0:10]+`)

`, util.URLJoin(markup.TestAppURL, "sub1", "sub2", markup.TestOrgRepo), ) - test( + assert( prCommitLink, - `

`+markup.TestOrgRepo+`@!1 (commit `+sha[0:10]+`)

`, + `

localhost:3000/sub1/sub2/gogits/gogs@!1 (commit `+sha[0:10]+`)

`, markup.TestRepoURL, ) prCommitLink = "https://codeberg.org/forgejo/forgejo/pulls/7979/commits/4d968c08e0a8d24bd2f3fb2a3a48b37e6d84a327#diff-7649acfa98a9ee3faf0d28b488bbff428317fc72" - test(prCommitLink, `

!7979 (commit 4d968c08e0)

`, "https://codeberg.org/forgejo/forgejo") - test(prCommitLink, `

forgejo/forgejo@!7979 (commit 4d968c08e0)

`, markup.TestRepoURL) + assert(prCommitLink, `

codeberg.org/forgejo/forgejo@!7979 (commit 4d968c08e0)

`, markup.TestRepoURL) + defer test.MockVariableValue(&setting.AppURL, "https://codeberg.org/")() + assert(prCommitLink, `

!7979 (commit 4d968c08e0)

`, "https://codeberg.org/forgejo/forgejo") } func TestRender_email(t *testing.T) { - setting.AppURL = markup.TestAppURL + defer test.MockVariableValue(&setting.AppURL, markup.TestAppURL)() test := func(input, expected string) { res, err := markup.RenderString(&markup.RenderContext{ @@ -365,7 +375,7 @@ func TestRender_email(t *testing.T) { } func TestRender_emoji(t *testing.T) { - setting.AppURL = markup.TestAppURL + defer test.MockVariableValue(&setting.AppURL, markup.TestAppURL)() setting.StaticURLPrefix = markup.TestAppURL test := func(input, expected string) { @@ -432,7 +442,7 @@ func TestRender_emoji(t *testing.T) { } func TestRender_ShortLinks(t *testing.T) { - setting.AppURL = markup.TestAppURL + defer test.MockVariableValue(&setting.AppURL, markup.TestAppURL)() tree := util.URLJoin(markup.TestRepoURL, "src", "master") test := func(input, expected, expectedWiki string) { @@ -545,7 +555,7 @@ func TestRender_ShortLinks(t *testing.T) { } func TestRender_RelativeImages(t *testing.T) { - setting.AppURL = markup.TestAppURL + defer test.MockVariableValue(&setting.AppURL, markup.TestAppURL)() test := func(input, expected, expectedWiki string) { buffer, err := markdown.RenderString(&markup.RenderContext{ @@ -585,7 +595,7 @@ func TestRender_RelativeImages(t *testing.T) { } func Test_ParseClusterFuzz(t *testing.T) { - setting.AppURL = markup.TestAppURL + defer test.MockVariableValue(&setting.AppURL, markup.TestAppURL)() localMetas := map[string]string{ "user": "go-gitea", @@ -621,7 +631,7 @@ func Test_ParseClusterFuzz(t *testing.T) { } func TestPostProcess_RenderDocument(t *testing.T) { - setting.AppURL = markup.TestAppURL + defer test.MockVariableValue(&setting.AppURL, markup.TestAppURL)() setting.StaticURLPrefix = markup.TestAppURL // can't run standalone localMetas := map[string]string{ @@ -666,7 +676,7 @@ func TestPostProcess_RenderDocument(t *testing.T) { } func TestIssue16020(t *testing.T) { - setting.AppURL = markup.TestAppURL + defer test.MockVariableValue(&setting.AppURL, markup.TestAppURL)() localMetas := map[string]string{ "user": "go-gitea", @@ -731,7 +741,7 @@ func TestIssue18471(t *testing.T) { }, strings.NewReader(data), &res) require.NoError(t, err) - assert.Equal(t, "783b039...da951ce", res.String()) + assert.Equal(t, "domain/org/repo@783b039...da951ce", res.String()) } func TestRender_FilePreview(t *testing.T) { @@ -740,7 +750,7 @@ func TestRender_FilePreview(t *testing.T) { defer test.MockVariableValue(&setting.Langs, []string{"en-US"})() translation.InitLocales(t.Context()) - setting.AppURL = markup.TestAppURL + defer test.MockVariableValue(&setting.AppURL, markup.TestAppURL)() markup.Init(&markup.ProcessorHelper{ GetRepoFileBlob: func(ctx context.Context, ownerName, repoName, commitSha, filePath string, language *string) (*git.Blob, error) { gitRepo, err := git.OpenRepository(git.DefaultContext, "./tests/repo/repo1_filepreview") @@ -880,7 +890,7 @@ func TestRender_FilePreview(t *testing.T) { testRender( urlWithSub, - `

gogits/gogs@190d949293/path/to/file.go (L2-L3)

`, + `

localhost:3000/sub/gogits/gogs@190d949293/path/to/file.go (L2-L3)

`, localMetas, ) @@ -920,7 +930,7 @@ func TestRender_FilePreview(t *testing.T) { testRender( "first without sub "+commitFilePreview+" second "+urlWithSub, - `

first without sub 190d949293/path/to/file.go (L2-L3) second

`+ + `

first without sub localhost:3000/gogits/gogs@190d949293/path/to/file.go (L2-L3) second

`+ `
`+ `
`+ `
`+ diff --git a/modules/markup/markdown/goldmark.go b/modules/markup/markdown/goldmark.go index 8a3da3b08f..1ea3375ab5 100644 --- a/modules/markup/markdown/goldmark.go +++ b/modules/markup/markdown/goldmark.go @@ -1,4 +1,5 @@ // Copyright 2019 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package markdown @@ -87,6 +88,8 @@ func (g *ASTTransformer) Transform(node *ast.Document, reader text.Reader, pc pa if scope, found := ctx.Metas["scope"]; found { v.Name = fmt.Appendf(v.Name, "-%s", scope) } + case *ast.RawHTML: + g.transformRawHTML(ctx, v, reader) } return ast.WalkContinue, nil }) diff --git a/modules/markup/markdown/markdown_test.go b/modules/markup/markdown/markdown_test.go index 7c13494a67..82c2c7fe8c 100644 --- a/modules/markup/markdown/markdown_test.go +++ b/modules/markup/markdown/markdown_test.go @@ -1,4 +1,5 @@ // Copyright 2017 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package markdown_test @@ -125,6 +126,32 @@ func TestRender_Images(t *testing.T) { `

`+title+`

`) } +func TestRender_Buttons(t *testing.T) { + setting.AppURL = AppURL + + test := func(input, expected string) { + buffer, err := markdown.RenderString(&markup.RenderContext{ + Ctx: git.DefaultContext, + Links: markup.Links{ + Base: FullURL, + }, + }, input) + require.NoError(t, err) + assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(string(buffer))) + } + + test( + "", + `

`) + + test( + ``, + `

`) + test( + ``, + `

`) +} + func testAnswers(baseURLContent, baseURLImages string) []string { return []string{ `

Wiki! Enjoy :)

diff --git a/modules/markup/markdown/transform_html.go b/modules/markup/markdown/transform_html.go new file mode 100644 index 0000000000..9bebb45554 --- /dev/null +++ b/modules/markup/markdown/transform_html.go @@ -0,0 +1,28 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package markdown + +import ( + "strings" + + "forgejo.org/modules/markup" + + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" +) + +func (g *ASTTransformer) addTypeToButton(v *ast.RawHTML, segment string) { + segment = strings.TrimPrefix(segment, " 0 { policy.AllowURLSchemes(setting.Markdown.CustomURLSchemes...) diff --git a/modules/migration/release.go b/modules/migration/release.go index f92cf25e7b..1d9f32ad3c 100644 --- a/modules/migration/release.go +++ b/modules/migration/release.go @@ -10,9 +10,9 @@ import ( // ReleaseAsset represents a release asset type ReleaseAsset struct { - ID int64 - Name string - ContentType *string `yaml:"content_type"` + ID int64 + Name string + Size *int DownloadCount *int `yaml:"download_count"` Created time.Time diff --git a/modules/repository/main_test.go b/modules/repository/main_test.go index 5906b10865..942a805638 100644 --- a/modules/repository/main_test.go +++ b/modules/repository/main_test.go @@ -7,9 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/modules/setting/database.go b/modules/setting/database.go index 91b3c90747..5b8fdaa34c 100644 --- a/modules/setting/database.go +++ b/modules/setting/database.go @@ -86,8 +86,8 @@ func loadDBSetting(rootCfg ConfigProvider) { Database.CharsetCollation = sec.Key("CHARSET_COLLATION").String() Database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "forgejo.db")) - Database.Timeout = sec.Key("SQLITE_TIMEOUT").MustInt(500) - Database.SQLiteJournalMode = sec.Key("SQLITE_JOURNAL_MODE").MustString("") + Database.Timeout = sec.Key("SQLITE_TIMEOUT").MustInt(60000) + Database.SQLiteJournalMode = sec.Key("SQLITE_JOURNAL_MODE").MustString("WAL") Database.MaxIdleConns = sec.Key("MAX_IDLE_CONNS").MustInt(2) if Database.Type.IsMySQL() { @@ -239,12 +239,19 @@ func dbConnStrWithHost(host string) (string, error) { if err := os.MkdirAll(filepath.Dir(Database.Path), os.ModePerm); err != nil { return "", fmt.Errorf("failed to create directories: %w", err) } - journalMode := "" + opts := "" if Database.SQLiteJournalMode != "" { - journalMode = "&_journal_mode=" + Database.SQLiteJournalMode + opts = "&_journal_mode=" + Database.SQLiteJournalMode } - connStr = fmt.Sprintf("file:%s?cache=shared&mode=rwc&_busy_timeout=%d&_txlock=immediate%s", - Database.Path, Database.Timeout, journalMode) + + // in memory mode needs shared cache to be usable by multiple connections + // only used in tests normally + if Database.Path == ":memory:" { + opts += "&cache=shared" + } else { + opts += "&mode=rwc" + } + connStr = fmt.Sprintf("file:%s?_busy_timeout=%d&_txlock=immediate%s", Database.Path, Database.Timeout, opts) default: return "", fmt.Errorf("unknown database type: %s", Database.Type) } diff --git a/modules/ssh/init.go b/modules/ssh/init.go index 432cda0c13..ebc17de69c 100644 --- a/modules/ssh/init.go +++ b/modules/ssh/init.go @@ -85,7 +85,9 @@ func Init(ctx context.Context) error { detailConcat := strings.Join(unexpectedKeys, "\n\t") log.Fatal("An unexpected ssh public key was discovered. Forgejo will shutdown to require this to be fixed. Fix by either:\n"+ "Option 1: Delete the file %s, and Forgejo will recreate it with only expected ssh public keys.\n"+ - "Option 2: Permit unexpected keys by setting [server].SSH_ALLOW_UNEXPECTED_AUTHORIZED_KEYS=true in Forgejo's config file.\n\t"+ + "Option 2: Permit unexpected keys by setting [server].SSH_ALLOW_UNEXPECTED_AUTHORIZED_KEYS=true in Forgejo's config file.\n"+ + "Option 3: If unused, disable SSH support by setting [server].DISABLE_SSH=true in Forgejo's config file.\n"+ + "\t"+ detailConcat, filepath.Join(setting.SSH.RootPath, "authorized_keys")) } } diff --git a/modules/structs/repo_actions.go b/modules/structs/repo_actions.go index eada2db09f..b13f344738 100644 --- a/modules/structs/repo_actions.go +++ b/modules/structs/repo_actions.go @@ -32,27 +32,3 @@ type ActionTaskResponse struct { Entries []*ActionTask `json:"workflow_runs"` TotalCount int64 `json:"total_count"` } - -// ActionRunnerLabel represents a Runner Label -type ActionRunnerLabel struct { - ID int64 `json:"id"` - Name string `json:"name"` - Type string `json:"type"` -} - -// ActionRunner represents a Runner -type ActionRunner struct { - ID int64 `json:"id"` - Name string `json:"name"` - Status string `json:"status"` - Busy bool `json:"busy"` - // currently unused as forgejo does not support ephemeral runners, but they are defined in gh api spec - Ephemeral bool `json:"ephemeral"` - Labels []*ActionRunnerLabel `json:"labels"` -} - -// ActionRunnersResponse returns Runners -type ActionRunnersResponse struct { - Entries []*ActionRunner `json:"runners"` - TotalCount int64 `json:"total_count"` -} diff --git a/modules/templates/main_test.go b/modules/templates/main_test.go index 946bc603f6..422bc497d8 100644 --- a/modules/templates/main_test.go +++ b/modules/templates/main_test.go @@ -9,10 +9,6 @@ import ( "forgejo.org/models/unittest" "forgejo.org/modules/markup" - - _ "forgejo.org/models" - _ "forgejo.org/models/forgefed" - _ "forgejo.org/models/issues" ) func TestMain(m *testing.M) { diff --git a/modules/testimport/import.go b/modules/testimport/import.go new file mode 100644 index 0000000000..cefa5b32a2 --- /dev/null +++ b/modules/testimport/import.go @@ -0,0 +1,17 @@ +// Copyright 2026 The Forgejo Authors +// SPDX-License-Identifier: MIT + +package testimport + +// ensure the init() function of those modules are called in a test +// environment that may not include them. It matters when the engine +// is trying to figure out the ordering of foreign keys, for instance + +import ( //revive:disable:blank-imports + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/auth" + _ "forgejo.org/models/forgefed" + _ "forgejo.org/models/perm/access" + _ "forgejo.org/models/repo" +) diff --git a/modules/translation/translation.go b/modules/translation/translation.go index 42441115af..17c7cc068b 100644 --- a/modules/translation/translation.go +++ b/modules/translation/translation.go @@ -6,7 +6,6 @@ package translation import ( "context" "html/template" - "iter" "sort" "strings" "sync" @@ -328,16 +327,6 @@ func (l *locale) PrettyNumber(v any) string { return l.msgPrinter.Sprintf("%v", number.Decimal(v)) } -func (l *locale) IterWithTr(kvs ...string) iter.Seq2[string, template.HTML] { - return func(yield func(string, template.HTML) bool) { - for i := 0; i < len(kvs); i += 2 { - if !yield(kvs[i], l.TrHTML(kvs[i+1])) { - return - } - } - } -} - func GetPluralRule(l Locale) int { return GetPluralRuleImpl(l.Language()) } diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini index 256692c080..04f170f125 100644 --- a/options/locale/locale_ar.ini +++ b/options/locale/locale_ar.ini @@ -2117,10 +2117,10 @@ variables.management = إدارة المتغيرات runners.task_list.repository = المستودع variables = المتغيرات variables.deletion.description = إزالة المتغيرات عملية نهائية لا يمكن التراجع عنها. أتريد الاستمرار؟ -status.failure = "فشل" +status.failure = فشل runners.status.idle = خامل runners.task_list.done_at = تم عند -status.running = "يعمل" +status.running = يعمل runners.status.active = نشيط runners.status = الحالة runners.description = الوصف @@ -2128,15 +2128,15 @@ runners.update_runner = حدّث التغييرات runners.name = الاسم runners.version = النسخة runs.status = الحالة -status.unknown = "مجهول" +status.unknown = مجهول runners.owner_type = النوع -status.waiting = "ينتظر" +status.waiting = ينتظر runners.labels = التصنيفات runners.status.unspecified = مجهول runs.commit = إيداع -status.success = "نجح" +status.success = نجح runs.empty_commit_message = (رسالة إيداع فارغة) -status.cancelled = "ملغي" +status.cancelled = ملغي runs.status_no_select = كل الحالات runs.scheduled = مُجدوَل variables.edit = عدّل المتغير @@ -2261,8 +2261,8 @@ default_key = موقّع بالمفتاح المبدئي error.extract_sign = تعذّر استخراج التوقيع error.generate_hash = تعذّر إنشاء بصمة الإيداع error.no_committer_account = لا حساب مرتبط ببريد المودِع -error.not_signed_commit = "ليس إيداعًا موقّعًا" -error.failed_retrieval_gpg_keys = "تعذّر جلب مفتاح مرتبط بحساب المودِع" +error.not_signed_commit = ليس إيداعًا موقّعًا +error.failed_retrieval_gpg_keys = تعذّر جلب مفتاح مرتبط بحساب المودِع [graphs] component_loading = يحمّل %s... diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini index b8c11a6807..840645c4b8 100644 --- a/options/locale/locale_bg.ini +++ b/options/locale/locale_bg.ini @@ -138,6 +138,13 @@ webauthn_unsupported_browser = Вашият браузър в момента н webauthn_error_duplicated = Ключът за сигурност не е разрешен за тази заявка. Моля, уверете се, че ключът не е вече регистриран. tracked_time_summary = Обобщение на проследеното време въз основа на филтрите в списъка със задачи +active_stopwatch = Активен тракер за време +access_token = Токен за достъп +passcode = Паскод + +rerun_all = Повторно изпълнение на всички задания +download_logs = Изтегляне на дневниците + [settings] ui = Тема delete_key = Премахване @@ -380,6 +387,89 @@ quota.sizes.all = Всички quota.sizes.repos.all = Хранилища quota.sizes.assets.attachments.issues = Прикачени файлове към задачи +openid_deletion = Премахване на OpenID адрес +openid_deletion_desc = Премахването на този OpenID адрес от вашия акаунт ще ви попречи да влизате с него. Продължаване? +openid_deletion_success = OpenID адресът е премахнат. +add_new_openid = Добавяне на нов OpenID URI +add_openid = Добавяне на OpenID URI +add_openid_success = Новият OpenID адрес е добавен. +openid_desc = OpenID ви позволява да делегирате удостоверяването на външен доставчик. +ssh_desc = Тези публични SSH ключове са свързани с вашия акаунт. Съответните частни ключове позволяват пълен достъп до вашите хранилища. SSH ключове, които са потвърдени, могат да се използват за проверка на SSH-подписани Git подавания. +principal_desc = Тези SSH certificate principals са свързани с вашия акаунт и позволяват пълен достъп до вашите хранилища. +gpg_desc = Тези публични GPG ключове са свързани с вашия акаунт и се използват за потвърждаване на вашите подавания. Пазете частните си ключове в безопасност, тъй като те позволяват подписване на подавания с вашата самоличност. +add_new_principal = Добавяне на principal +ssh_principal_been_used = Този principal вече е добавен към сървъра. +gpg_no_key_email_found = Този GPG ключ не съвпада с нито един активиран адрес за ел. поща, свързан с вашия акаунт. Той все пак може да бъде добавен, ако подпишете предоставения токен. +gpg_key_matched_identities = Съвпадащи самоличности: +gpg_key_matched_identities_long = Вградените самоличности в този ключ съвпадат със следните активирани адреси за ел. поща на този потребител. Подавания, които съвпадат с тези адреси, могат да бъдат проверени с този ключ. +gpg_key_verified = Потвърден ключ +gpg_key_verified_long = Ключът е потвърден с токен и може да се използва за проверка на подавания, които съвпадат с активирани адреси за ел. поща на този потребител, в допълнение към всички съвпадащи самоличности за този ключ. +gpg_key_verify = Потвърждаване +gpg_invalid_token_signature = Предоставените GPG ключ, подпис и токен не съвпадат или токенът е изтекъл. +gpg_token_required = Трябва да предоставите подпис за токена по-долу +gpg_token = Токен +gpg_token_help = Можете да генерирате подпис чрез: +gpg_token_signature = Брониран (Armored) GPG подпис +verify_gpg_key_success = GPG ключът „%s“ е потвърден. +ssh_key_verified = Потвърден ключ +ssh_key_verified_long = Ключът е потвърден с токен и може да се използва за проверка на подавания, които съвпадат с активирани адреси за ел. поща на този потребител. +ssh_key_verify = Потвърждаване +ssh_invalid_token_signature = Предоставените SSH ключ, подпис или токен не съвпадат, или токенът е изтекъл. +ssh_token_required = Трябва да предоставите подпис за токена по-долу +ssh_token = Токен +ssh_token_help = Можете да генерирате подпис чрез: +ssh_token_help_ssh_agent = или ако използвате SSH агент (със зададена променлива SSH_AUTH_SOCK): +ssh_token_signature = Брониран (Armored) SSH подпис +verify_ssh_key_success = SSH ключът „%s“ е потвърден. +subkeys = Подключове +add_principal_success = SSH certificate principal „%s“ е добавен. +ssh_principal_deletion = Премахване на SSH Certificate Principal +ssh_key_deletion_desc = Премахването на SSH ключ отнема достъпа му до вашия акаунт. Продължаване? +gpg_key_deletion_desc = Премахването на GPG ключ премахва потвърждението на подаванията, подписани от него. Продължаване? +ssh_principal_deletion_desc = Премахването на SSH Certificate Principal отнема достъпа му до вашия акаунт. Продължаване? +ssh_principal_deletion_success = Този principal е премахнат. +token_state_desc = Този токен е използван през последните 7 дни +principal_state_desc = Този principal е използван през последните 7 дни +ssh_signonly = В момента SSH е изключен, затова тези ключове се използват само за проверка на подписи на подавания. +manage_access_token = Токени за достъп +generate_new_token = Генериране на нов токен +tokens_desc = Тези токени дават достъп до вашия акаунт чрез Forgejo API. +token_name = Име на токена +generate_token = Генериране на токен +generate_token_success = Новият ви токен е генериран. Копирайте го сега, тъй като няма да бъде показан отново. +access_token_deletion = Изтриване на токен за достъп +access_token_deletion_desc = Изтриването на токен ще отнеме достъпа до вашия акаунт за приложенията, които го използват. Това не може да бъде отменено. Продължаване? +delete_token_success = Токенът е изтрит. Приложенията, които го използват, вече нямат достъп до вашия акаунт. +regenerate_token = Повторно генериране +access_token_regeneration = Повторно генериране на токен за достъп +access_token_regeneration_desc = Повторното генериране на токен ще отнеме достъпа до вашия акаунт за приложенията, които го използват. Това не може да бъде отменено. Продължаване? +regenerate_token_success = Токенът е генериран повторно. Приложенията, които го използват, вече нямат достъп до вашия акаунт и трябва да бъдат обновени с новия токен. +select_permissions = Избор на разрешения +access_token_desc = Избраните разрешения на токена ограничават упълномощаването само до съответните API маршрути. Прочетете документацията за повече информация. +at_least_one_permission = Трябва да изберете поне едно разрешение, за да създадете токен +oauth2_confidential_client = Поверителен клиент. Изберете за приложения, които пазят тайната поверителна, като например уеб приложения. Не избирайте за нейтив приложения (настолни и мобилни). +oauth2_redirect_uris = URI за пренасочване. Моля, използвайте нов ред за всеки URI. +oauth2_client_id = ID на клиента +oauth2_client_secret = Тайна на клиента +oauth2_regenerate_secret = Повторно генериране на тайна +oauth2_regenerate_secret_hint = Загубили сте тайната си? +oauth2_application_create_description = OAuth2 приложенията дават достъп на вашето външно приложение до потребителски акаунти в тази инстанция. +oauth2_application_remove_description = Премахването на OAuth2 приложение ще му попречи да осъществява достъп до упълномощени потребителски акаунти в тази инстанция. Продължаване? +oauth2_application_locked = Forgejo предварително регистрира някои OAuth2 приложения при стартиране, ако е включено в конфигурацията. За да се предотврати неочаквано поведение, те не могат да бъдат нито редактирани, нито премахнати. Моля, вижте документацията на OAuth2 за повече информация. +authorized_oauth2_applications_description = Предоставили сте достъп до личния си акаунт във Forgejo на тези външни приложения. Моля, отнемете достъпа за приложения, които вече не използвате. +twofa_scratch_token_regenerate = Повторно генериране на ключ за еднократно възстановяване +twofa_scratch_token_regenerated = Вашият ключ за еднократно възстановяване вече е %s. Съхранете го на сигурно място, тъй като няма да бъде показан отново. +or_enter_secret = Или въведете тайната: %s +then_enter_passcode = И въведете паскода, показан в приложението: +passcode_invalid = Паскодът е неправилен. Опитайте отново. +twofa_enrolled = Вашият акаунт беше успешно включен. Съхранете ключа си за еднократно възстановяване (%s) на сигурно място, тъй като няма да бъде показан отново. +twofa_failed_get_secret = Неуспешно получаване на тайната. +webauthn_desc = Ключовете за сигурност са хардуерни устройства, съдържащи криптографски ключове. Те могат да се използват за двуфакторно удостоверяване. Ключовете за сигурност трябва да поддържат стандарта WebAuthn Authenticator. +manage_account_links_desc = Тези външни акаунти са свързани към вашия акаунт във Forgejo. +remove_account_link_desc = Премахването на свързан акаунт ще отнеме достъпа му до вашия акаунт във Forgejo. Продължаване? +remove_account_link_success = Свързаният акаунт е премахнат. +delete_with_all_comments = Вашият акаунт е създаден преди по-малко от %s. За да се избегнат коментари-призраци, всички коментари към задачи/заявки за сливане ще бъдат изтрити заедно с него. + [packages] container.labels.value = Стойност alpine.repository.repositories = Хранилища @@ -1211,7 +1301,7 @@ diff.file_byte_size = Размер branch.create_success = Клонът „%s“ е създаден. branch.deletion_success = Клонът „%s“ е изтрит. branch.deletion_failed = Неуспешно изтриване на клона „%s“. -branch.rename_branch_to = Преименуване от „%s“ на: +branch.rename_branch_to = Преименуване на клона „%s“. settings.web_hook_name_msteams = Microsoft Teams settings.web_hook_name_dingtalk = DingTalk branch.renamed = Клонът %s е преименуван на %s. @@ -1350,7 +1440,7 @@ issues.review.resolve_conversation = Решаване на обсъжданет diff.comment.markdown_info = Поддържа се стилизиране с Маркдаун. diff.file_suppressed = Разликите във файла са потиснати, защото са твърде много pulls.reject_count_n = %d поискани промени -settings.pulls.default_allow_edits_from_maintainers = Позволяване на редакции от поддържащите по подразбиране +settings.pulls.default_allow_edits_from_maintainers = Позволяване по подразбиране на редакции от поддържащите fork_branch = Клон за клониране в разклонението issues.review.resolved_by = отбеляза това обсъждане като решено issues.role.member = Участник @@ -1480,7 +1570,7 @@ new_advanced = Разширени настройки new_from_template = Използване на шаблон new_from_template_description = Можете да изберете съществуващо шаблонно хранилище в тази инстанция и да приложите неговите настройки. settings.event_pull_request_comment = Коментари -repo_gitignore_helper_desc = Изберете кои файлове да не се проследяват от списък с шаблони за обичайните езици. Типичните артефакти, генерирани от инструментите за изграждане, са включени в .gitignore по подразбиране. +repo_gitignore_helper_desc = Изберете кои файлове да не се проследяват от списък с шаблони за обичайните езици. Типичните артефакти, генерирани от инструментите за изграждане, са включени по подразбиране в .gitignore. object_format_helper = Формат на обектите на хранилището. Не може да се променя по-късно. SHA1 е най-съвместим. issues.num_reviews_one = %d рецензия settings.event_pull_request = Изменение @@ -1654,7 +1744,7 @@ commits.signed_by_untrusted_user = Подписано от недоверен п commits.signed_by_untrusted_user_unmatched = Подписано от недоверен потребител, който не съвпада с подаващия issues.lock.notice_1 = - Други потребители не могат да добавят нови коментари към тази задача. issues.unlock.notice_2 = - Винаги можете да заключите тази задача отново в бъдеще. -issues.unlock.title = Отключване на обсъждането по тази задача. +issues.unlock.title = Отключване на обсъждането issues.dependency.no_permission_1 = Нямате разрешение да прочетете %d зависимост issues.reopen.blocked_by_user = Не можете да отворите наново тази задача, защото сте блокирани от притежателя на хранилището или от автора на тази задача. compare.compare_base = основа @@ -1736,7 +1826,7 @@ mirror_address_url_invalid = Предоставеният URL е невалид template.git_content = Git съдържание (стандартен клон) ambiguous_runes_description = `Този файл съдържа Уникод знаци, които могат да бъдат объркани с други знаци. Ако смятате, че това е умишлено, можете спокойно да пренебрегнете това предупреждение. Използвайте бутона „Екраниране“, за да ги разкриете.` issues.lock.notice_3 = - Винаги можете да отключите тази задача отново в бъдеще. -issues.lock.title = Заключване на обсъждането по тази задача. +issues.lock.title = Заключване на обсъждането issues.dependency.issue_batch_close_blocked = Не могат да бъдат затворени групово избраните задачи, защото задача #%d все още има отворени зависимости issues.dependency.add_error_cannot_create_circular = Не можете да създадете зависимост с две задачи, които се блокират взаимно. issues.review.add_review_requests = поиска рецензии от %[1]s %[2]s @@ -1810,6 +1900,93 @@ release.summary_card_alt = Карта с обобщение на издание release.asset_external_url = Външен URL адрес error.csv.too_large = Не може да се визуализира този файл, защото е твърде голям. +commit.cherry-pick = Отбиране +pulls.cmd_instruction_checkout_title = Изтегляне +pulls.cmd_instruction_merge_title = Сливане +settings.branches.switch_default_branch = Превключване на стандартния клон +settings.branches.add_new_rule = Добавяне на ново правило +settings.pulls.ignore_whitespace = Игнориране на празните знаци при конфликти +settings.pulls.enable_autodetect_manual_merge = Включване на автоматично откриване на ръчно сливане (Бележка: В някои специални случаи може да възникнат грешни преценки) +settings.pulls.allow_rebase_update = Включване на обновяването на клон на заявка за сливане чрез пребазиране +settings.pulls.default_delete_branch_after_merge = Изтриване по подразбиране на клона на заявката за сливане след сливане +settings.admin_code_indexer = Индексатор на код +settings.admin_stats_indexer = Индексатор на статистика на кода +settings.admin_indexer_commit_sha = Последно индексирано подаване +settings.admin_indexer_unindexed = Неиндексирано +settings.reindex_button = Добавяне към опашката за преиндексиране +settings.reindex_requested = Поискано преиндексиране +settings.admin_enable_close_issues_via_commit_in_any_branch = Затваряне на задача чрез подаване, направено в клон, различен от стандартния +settings.new_owner_has_same_repo = Новият притежател вече има хранилище със същото име. Моля, изберете друго име. +settings.new_owner_blocked_doer = Новият притежател ви е блокирал. +settings.convert = Преобразуване в обикновено хранилище +settings.convert_fork = Преобразуване в обикновено хранилище +settings.convert_fork_confirm = Преобразуване на хранилището +settings.transfer.rejected = Прехвърлянето на хранилището е отхвърлено. +settings.transfer.success = Прехвърлянето на хранилището е успешно. +settings.transfer_abort = Отказ от прехвърлянето +settings.transfer_abort_invalid = Не можете да отмените несъществуващо прехвърляне на хранилище. +settings.transfer_abort_success = Прехвърлянето на хранилището към %s е успешно отменено. +settings.transfer_in_progress = В момента има текущо прехвърляне. Моля, отменете го, ако искате да прехвърлите това хранилище на друг потребител. +settings.transfer_notices_1 = - Ще загубите достъп до хранилището, ако го прехвърлите на индивидуален потребител. +settings.transfer_notices_2 = - Ще запазите достъп до хранилището, ако го прехвърлите на организация, която (съ)притежавате. +settings.transfer_notices_3 = - Ако хранилището е частно и се прехвърля на индивидуален потребител, това действие гарантира, че потребителят има поне разрешение за четене (и променя разрешенията, ако е необходимо). +settings.transfer_perform = Извършване на прехвърлянето +settings.transfer_started = Това хранилище е отбелязано за прехвърляне и очаква потвърждение от „%s“ +settings.transfer_succeed = Хранилището е прехвърлено. +settings.transfer_quota_exceeded = Новият притежател (%s) е надвишил квотата си. Хранилището не е прехвърлено. +settings.wiki_rename_branch_main = Нормализиране на името на клона на уикито +settings.wiki_rename_branch_main_desc = Преименуване на клона, използван вътрешно от уикито, на „%s“. Тази промяна е перманентна и не може да бъде отменена. +settings.wiki_rename_branch_main_notices_1 = Тази операция НЕ МОЖЕ да бъде отменена. +settings.wiki_branch_rename_success = Името на клона на уикито на хранилището е нормализирано успешно. +settings.wiki_branch_rename_failure = Неуспешно нормализиране на името на клона на уикито на хранилището. +settings.update_settings_no_unit = Хранилището трябва да позволява поне някакъв вид взаимодействие. +settings.change_team_access_not_allowed = Промяната на достъпа на екипа до хранилището е ограничена до притежателя на организацията +settings.team_not_in_organization = Екипът не е в същата организация като хранилището +settings.add_team_success = Екипът вече има достъп до хранилището. +settings.change_team_permission_tip = Разрешението на екипа се задава на страницата с настройки на екипа и не може да се променя за отделно хранилище +settings.delete_team_tip = Този екип има достъп до всички хранилища и не може да бъде премахнат +settings.remove_team_success = Достъпът на екипа до хранилището е премахнат. +settings.add_webhook.invalid_channel_name = Името на канала на уеб-куката не може да бъде празно и не може да съдържа само знак #. +settings.add_webhook.invalid_path = Пътят не трябва да съдържа част, която е „.“ или „..“ или празен низ. Той не може да започва или завършва с наклонена черта. +settings.hooks_desc = Уеб-куките автоматично правят HTTP POST заявки към сървър, когато се задействат определени събития във Forgejo. Прочетете повече в ръководството за уеб-куки. +settings.webhook_deletion = Премахване на уеб-кука +settings.webhook_deletion_desc = Премахването на уеб-кука изтрива нейните настройки и историята на доставките. Продължаване? +settings.webhook_deletion_success = Уеб-куката е премахната. +settings.webhook.test_delivery = Тестване на доставката +settings.webhook.test_delivery_desc = Тествайте тази уеб-кука с фалшиво събитие. +settings.webhook.test_delivery_desc_disabled = За да тествате тази уеб-кука с фалшиво събитие, я активирайте. +settings.webhook.replay.description = Повторно изпълнение на тази уеб-кука. +settings.webhook.replay.description_disabled = За да изпълните повторно тази уеб-кука, я активирайте. +settings.webhook.delivery.success = Събитие е добавено към опашката за доставка. Може да отнеме няколко секунди, преди да се появи в историята на доставките. +settings.githooks_desc = Git куките се задвижват от самия Git. Можете да редактирате файловете с куки по-долу, за да настроите персонализирани операции. +settings.githook_edit_desc = Ако куката е неактивна, ще бъде представено примерно съдържание. Оставянето на съдържанието с празна стойност ще изключи тази кука. +settings.githook_name = Име на куката +settings.githook_content = Съдържание на куката +settings.update_githook = Обновяване на куката +settings.add_webhook_desc = Forgejo ще изпраща POST заявки с определен Content-Type до целевия URL адрес. Прочетете повече в ръководството за уеб-куки. +settings.payload_url = Целеви URL адрес +settings.secret = Тайна +settings.protected_branch.save_rule = Запазване на правилото +settings.protected_branch.delete_rule = Изтриване на правилото +settings.protect_disable_push = Изключване на изтласкването +settings.protect_disable_push_desc = Към този клон няма да бъде разрешено никакво изтласкване. +settings.protect_enable_push = Включване на изтласкването +settings.protect_enable_push_desc = Всеки с достъп за писане ще има право да изтласква към този клон (но не и принудително изтласкване). +settings.protect_enable_merge = Включване на сливането +settings.protect_enable_merge_desc = Всеки с достъп за писане ще има право да слива заявки за сливане в този клон. +settings.require_signed_commits = Изискване на подписани подавания +settings.require_signed_commits_desc = Отхвърляне на изтласквания към този клон, ако те са неподписани или не могат да бъдат потвърдени. +settings.enforce_on_admins = Принудително прилагане на това правило за администраторите на хранилището +settings.enforce_on_admins_desc = Администраторите на хранилището не могат да заобикалят това правило. +settings.merge_style_desc = Стилове на сливане +settings.default_merge_style_desc = Стил на сливане по подразбиране +settings.choose_branch = Изберете клон… +settings.edit_protected_branch = Редактиране +settings.chat_id = ID на чата +settings.thread_id = ID на нишката +settings.matrix.room_id = ID на стаята +settings.matrix.message_type = Тип съобщение + [modal] confirm = Потвърждаване no = Не @@ -1844,6 +2021,8 @@ buttons.indent.tooltip = Вмъкване на елементи с едно ни buttons.unindent.tooltip = Изваждане на елементи с едно ниво link_modal.paste_reminder = Подсказка: С URL адрес в клипборда можете да поставите директно в редактора, за да създадете връзка. +link_modal.url = Адрес + [org] teams.write_access = Писане settings.location = Местоположение @@ -1985,7 +2164,7 @@ docker_helper = Ако стартирате Forgejo в Docker, моля, про sqlite_helper = Път на файла за SQLite3 базата данни.
Въведете абсолютен път, ако стартирате Forgejo като service. err_empty_admin_email = Администраторският адрес за ел. поща не може да бъде празен. password_algorithm = Алгоритъм за хеш. на паролите -default_keep_email_private = Скриване на адресите за ел. поща по подразбиране +default_keep_email_private = Скриване по подразбиране на адресите за ел. поща invalid_password_algorithm = Невалиден алгоритъм за хеш. на паролите err_admin_name_is_reserved = Потребителското име на администратора е невалидно, потребителското име е резервирано err_admin_name_pattern_not_allowed = Потребителското име на администратора е невалидно, потребителското име съответства с резервиран шаблон @@ -2055,6 +2234,18 @@ reset_password.text = Ако това сте вие, моля, щракнете primary_mail_change.subject = Основният ви адрес за ел. поща е променен account_security_caution.text_2 = Ако това не сте били вие, акаунтът ви е компрометиран. Моля, свържете се с администраторите на този сайт. +totp_disabled.subject = TOTP е изключен +totp_disabled.text_1 = Еднократната парола, базирана на време (TOTP), за вашия акаунт току-що беше изключена. +totp_disabled.no_2fa = Вече няма конфигурирани други 2FA методи, което означава, че вече не е необходимо да влизате в акаунта си с 2FA. +removed_security_key.subject = Ключ за сигурност беше премахнат +removed_security_key.text_1 = Ключът за сигурност „%[1]s“ току-що беше премахнат от вашия акаунт. +removed_security_key.no_2fa = Вече няма конфигурирани други 2FA методи, което означава, че вече не е необходимо да влизате в акаунта си с 2FA. +totp_enrolled.subject = Активирахте TOTP като метод за 2FA +totp_enrolled.text_1.no_webauthn = Току-що включихте TOTP за вашия акаунт. Това означава, че за всички бъдещи влизания във вашия акаунт трябва да използвате TOTP като 2FA метод. +totp_enrolled.text_1.has_webauthn = Току-що включихте TOTP за вашия акаунт. Това означава, че за всички бъдещи влизания във вашия акаунт можете да използвате TOTP като 2FA метод или някой от вашите ключове за сигурност. +issue.action.review_dismissed = @%[1]s отхвърли последната рецензия от %[2]s за тази заявка за сливане. +repo.transfer.to_you = вас + [user] joined_on = Присъединени на %s user_bio = Биография @@ -2192,6 +2383,8 @@ config.db_type = Тип monitor.queue.type = Тип notices.type = Тип +users.prohibit_login = Замразен акаунт + [error] not_found = Целта не може да бъде намерена. report_message = Ако смятате, че това е грешка на Forgejo, моля, потърсете в задачите на Codeberg или отворете нова задача, ако е необходимо. @@ -2280,6 +2473,18 @@ invalid_gpg_key = Не може да се потвърди вашият GPG кл git_ref_name_error = ` трябва да е правилно форматирано име на Git препратка.` last_org_owner = Не можете да премахнете последния потребител от екипа на „притежателите“. Трябва да има поне един притежател за организация. +AccessToken = Токен за достъп +CommitChoice = Избор на подаване +username_claiming_cooldown = Потребителското име не може да бъде взето, тъй като периодът му на изчакване все още не е приключил. То може да бъде взето на %[1]s. +repository_force_private = Принудително Частни е включено: частните хранилища не могат да станат публични. +repository_files_already_exist.adopt = Вече съществуват файлове за това хранилище и те могат само да бъдат осиновени. +repository_files_already_exist.adopt_or_delete = Вече съществуват файлове за това хранилище. Или ги осиновете, или ги изтрийте. +visit_rate_limit = Отдалеченото посещение достигна ограничението на честотата. +2fa_auth_required = Отдалеченото посещение изисква двуфакторно удостоверяване. +unset_password = Влезлият потребител не е задал паролата. +unsupported_login_type = Този тип влизане не се поддържа за изтриване на акаунт. +invalid_ssh_principal = Невалиден principal: %s + [action] close_issue = `затвори задача %[3]s#%[2]s` rename_repo = преименува хранилище от %[1]s на %[3]s @@ -2367,6 +2572,28 @@ resend_mail = Щракнете тук, за повторно изпращане change_unconfirmed_email_summary = Промяна на адреса, на който се изпраща ел. писмо за активация. change_unconfirmed_email = Ако сте въвели грешен адрес за ел. поща по време на регистрацията, можете да го промените по-долу и потвърждение ще бъде изпратено на новия адрес. +prohibit_login = Акаунтът е замразен +prohibit_login_desc = Вашият акаунт е замразен и не може да взаимодейства с инстанцията. Свържете се с администратора, за да възстановите достъпа си. +non_local_account = Нелокални потребители не могат да обновяват паролата си чрез уеб интерфейса на Forgejo. +unauthorized_credentials = Идентификационните данни са неправилни или са изтекли. Опитайте отново командата си или вижте %s за повече информация +twofa_passcode_incorrect = Вашият код за достъп (паскод) е неправилен. Ако сте изгубили устройството си, използвайте резервния си код, за да влезете. +oauth_signup_tab = Регистриране на нов акаунт +oauth_signup_title = Завършване на новия акаунт +oauth_signup_submit = Завършване на акаунта +oauth_signin_tab = Свързване към съществуващ акаунт +oauth_signin_title = Влезте, за да упълномощите свързания акаунт +oauth_signin_submit = Свързване на акаунт +oauth.signin.error = Възникна грешка при обработката на заявката за упълномощаване. Ако тази грешка продължава, моля, свържете се с администратора на сайта. +oauth.signin.error.access_denied = Заявката за упълномощаване беше отхвърлена. +oauth.signin.error.temporarily_unavailable = Упълномощаването е неуспешно, защото сървърът за удостоверяване е временно недостъпен. Моля, опитайте отново по-късно. +openid_connect_title = Свързване към съществуващ акаунт +openid_connect_desc = Избраният OpenID URI е неизвестен. Свържете го с нов акаунт тук. +openid_register_desc = Избраният OpenID URI е неизвестен. Свържете го с нов акаунт тук. +disable_forgot_password_mail = Възстановяването на акаунта е изключено, защото няма зададена ел. поща. Моля, свържете се с вашия администратор на сайта. +disable_forgot_password_mail_admin = Възстановяването на акаунта е налично само когато е зададена ел. поща. Моля, задайте ел. поща, за да включите възстановяването на акаунта. +email_domain_blacklisted = Не можете да се регистрирате с вашия адрес за ел. поща. +authorization_failed_desc = Упълномощаването е неуспешно, защото открихме невалидна заявка. Моля, свържете се с поддържащия приложението, което се опитахте да упълномощите. + [aria] footer.software = Относно този софтуер footer.links = Връзки @@ -2503,6 +2730,8 @@ union_tooltip = Включване на резултати, които съвп union = Обединение type_tooltip = Тип търсене +runner_kind = Търсене на изпълнители… + [markup] filepreview.lines = Редове от %[1]d до %[2]d в %[3]s filepreview.line = Ред %[1]d в %[2]s diff --git a/options/locale/locale_bn.ini b/options/locale/locale_bn.ini index 2155f9073c..ebcad77f97 100644 --- a/options/locale/locale_bn.ini +++ b/options/locale/locale_bn.ini @@ -1,8 +1,11 @@ [common] help = সাহায্য dashboard = ড্যাশবোর্ড -home = বাড়ি -explore = দেখোণ +home = হোম +explore = এক্সপ্লোর logo = লোগো -sign_in = সাইণ ইণ -sign_in_or = বা \ No newline at end of file +sign_in = সাইন ইন +sign_in_or = বা +sign_in_with_provider = %s দিয়ে সাইন-ইন করুন +sign_out = সাইন আউট +sign_up = নিবন্ধন করুন \ No newline at end of file diff --git a/options/locale/locale_ca.ini b/options/locale/locale_ca.ini index a3ea3843d7..ee25b916f3 100644 --- a/options/locale/locale_ca.ini +++ b/options/locale/locale_ca.ini @@ -23,7 +23,7 @@ enable_javascript = Aquest lloc web requereix Javascript. toc = Taula de Continguts licenses = Llicències sign_up = Registrar-se -link_account = Vincular un compte +link_account = Vincula un compte tracked_time_summary = Resum del temps registrat basat en filtres del llistat de temes return_to_forgejo = Tornar a Forgejo toggle_menu = Commuta el menú @@ -195,7 +195,7 @@ title = Configuració inicial docker_helper = Si executes Forgejo a Docker, si us plau llegeis la documentació abans de canviar qualsevol configuració. require_db_desc = Forgejo requereix de MySQL, PostreSQL, SQLite3 o TiDB (protocol MySQL). db_title = Configuració de la base de dades -path = Ruta +path = Camí sqlite_helper = Ruta al fitxer de la base de dades SQLite3.
Introduex la ruta absoluta si executes Forgejo com a servei. user = Nom d'usuari db_schema = Esquema @@ -206,7 +206,7 @@ reinstall_confirm_message = Reinstaŀlar amb una base de dades existent de Forge no_admin_and_disable_registration = No pot deshabilitar l'autoregistre d'usuaris sense crear un compte d'administrador. err_admin_name_is_reserved = El nom d'usuari "Administrador" no es vàlid: està reservat smtp_addr = Hoste SMTP -smtp_port = Port SMPT +smtp_port = Port SMTP smtp_from = Enviar correu com a mailer_user = Nom d'usuari SMTP err_admin_name_pattern_not_allowed = El nom d'usuari de l'administrador no es vàlid: coincideix amb un patró reservat @@ -255,7 +255,7 @@ app_slogan_helper = Escriu l'eslogan de la teva instància aquí. Deixa buit per repo_path = Ruta de l'arrel del repositori log_root_path_helper = Els arxius dels registres es s'escriuran en aquest directori. optional_title = Configuracions opcionals -host = Hoste +host = Amfitrió lfs_path = Ruta arreal de Git LFS run_user = Executar com a usuari domain_helper = Domini o adreça de l'hosta per al servidor. @@ -397,7 +397,7 @@ twofa_passcode_incorrect = El codi d'accés és incorrecte. Si heu perdut el dis oauth_signin_tab = Vincular a un compte existent oauth.signin.error = Hi ha hagut un error processant la sol·licitud d'autorització. Si persisteix, poseu-vos en contacte amb l'administrador del lloc. disable_forgot_password_mail_admin = La recuperació de comptes només està disponible quan s'ha configurat el correu electrònic. Si us plau, configureu el correu electrònic per a habilitar la recuperació de comptes. -non_local_account = Els usuaris no locals no poden actualitzar la seva contrasenya mitjançant l'interfície web de Forgejo. +non_local_account = No es permet actualitzar la contrasenya dels usuaris externs (no locals) des de la pàgina web de Forgejo. openid_register_desc = No s'ha reconegut la URI OpenID. Vinculeu-la amb un compte nou aquí. openid_connect_desc = No s'ha reconegut la URI OpenID. Vinculeu-la amb un compte nou aquí. sign_in_openid = Accediu amb OpenID @@ -494,8 +494,8 @@ primary_mail_change.subject = S'ha canviat la vostra adreça de correu electròn totp_disabled.subject = S'ha deshabilitat TOTP removed_security_key.subject = S'ha eliminat una clau de seguretat removed_security_key.text_1 = S'ha eliminat la clau de seguretat "%[1]s" del vostre compte. -account_security_caution.text_1 = Podeu ignorar aquest correu si heu sigut vos. -account_security_caution.text_2 = Si no heu sigut vos, el vostre compte està compromès. Si us plau, contacteu els administradors d'aquest lloc. +account_security_caution.text_1 = Podeu ignorar aquest correu si heu sigut vós. +account_security_caution.text_2 = Si no heu sigut vós, el vostre compte està compromès. Si us plau, contacteu els administradors d'aquest lloc. totp_enrolled.subject = Heu activat TOTP com a mètode d'autenticació de doble factor totp_enrolled.text_1.no_webauthn = Heu activat TOTP pel vostre compte. Això vol dir que haureu d'usar TOTP com a mètode d'autenticació de doble factor a tots els inicis de sessió futurs al vostre compte. issue_assigned.pull = @%[1]s us ha assignat la sol·licitud d'extracció %[2]s al repositori %[3]s. @@ -513,7 +513,7 @@ totp_disabled.no_2fa = Ja no hi ha altres mètodes d'autenticació de doble fact removed_security_key.no_2fa = Ja no hi ha altres mètodes d'autenticació de doble factor configurats, per la qual cosa ja no és necessari iniciar sessió al vostre compte mitjançat autenticació de doble factor. reset_password = Recupereu el vostre compte reset_password.text = Si heu sigut vós, cliqueu el següent enllaç per recuperar el vostre compte abans de %s: -totp_enrolled.text_1.has_webauthn = Heu habilitat el TOTP per al vostre compte. Això vol dir que, per a totes les futures connexions al vostre compte, podreu utilitzar el TOTP com a mètode d'autenticació en dos passos (2FA) o bé utilitzar qualsevol de les vostres claus de seguretat. +totp_enrolled.text_1.has_webauthn = Heu activat TOTP pel vostre compte. Això vol dir que podreu usar TOTP com a mètode d'autenticació de doble factor a tots els inicis de sessió futurs al vostre compte, o bé usar qualsevol de les vostres claus de seguretat. issue.action.force_push = %[1]s ha realitzat un «force push» de %[2]s des de %[3]s fins a %[4]s. issue.action.ready_for_review = @%[1]s ha marcat aquesta «pull request» com a preparada per a la revisió. issue.in_tree_path = A %s: @@ -554,7 +554,7 @@ last_org_owner = No podeu eliminar l'últim usuari de l'equip "propietaris". Una duplicate_invite_to_team = L'usuari ja ha estat convidat com a membre de l'equip. Biography = Biografia RepoName = Nom del repositori -TeamName = Nom de l' equip +TeamName = Nom de l'equip To = Nom de la branca NewBranchName = Nom de la nova branca Content = Contingut @@ -617,6 +617,15 @@ username_claiming_cooldown = El nom d'usuari no es pot reservar degut a que el s invalid_group_team_map_error = ` el mapatge no és vàlid: %s` repository_force_private = S'ha activat "Forçar privat": els repositoris privats no es poden fer públics. +2fa_auth_required = L'accés remot requereix una autenticació de doble factor. + +visit_rate_limit = S'ha sobrepassat la taxa de visita remota. +unset_password = L'usuari no ha establert una contrasenya. + +team_no_units_error = Permet l'accés a una secció del repositori com a mínim. +unsupported_login_type = El tipus d'accés no permet eliminar el compte. +invalid_ssh_principal = Principal invàlid: %s + [settings] pronouns = Pronoms change_username_prompt = Nota: canviar el vostre nom d'usuari també canvia l'URL del vostre compte. @@ -670,7 +679,7 @@ twofa = Autenticació de doble factor (TOTP) webauthn = Autenticació de doble factor (claus de seguretat) storage_overview = Vista general de l'emmagatzematge quota = Quota -profile_desc = Sobre vos +profile_desc = Sobre vós password_username_disabled = Els usuaris no locals no tenen permès canviar el seu nom d'usuari. Si us plau, contacteu el vostre administrador per saber-ne més. update_profile = Actualitzar el perfil update_language = Canviar l'idioma @@ -702,7 +711,7 @@ theme_desc = Aquest tema s'usarà per a la interfície web quan hàgiu iniciat s activated = Activat requires_activation = Requereix activació activations_pending = Activacions pendents -can_not_add_email_activations_pending = Hi ha una activació pendent, proveu de nou en uns minuts si voleu afegir un nou correu electrònic. +can_not_add_email_activations_pending = Hi ha una activació pendent. Si voleu afegir una nova adreça de correu electrònic, proveu-ho de nou en uns minuts. email_deletion = Elimina l'adreça de correu electrònic email_deletion_desc = Aquesta adreça de correu electrònic i la informació relacionada s'eliminaran del vostre compte. Els commits de Git fets amb ella romandran sense canvis. Continuar? email_deletion_success = S'ha eliminat l'adreça de correu electrònic. @@ -774,7 +783,7 @@ generate_token = Generar el testimoni generate_token_success = S'ha generat el vostre nou testimoni. Copieu-lo ara, ja que no es tornarà a mostrar. generate_token_name_duplicate = Ja s'ha usat %s com a nom d'aplicació. Si us plau, useu-ne un de nou. delete_token = Eliminar -access_token_deletion = +access_token_deletion =Esborra el testimoni d'accés delete_email = Eliminar biography_placeholder = Explica una mica sobre tu als altres! (Compatible amb Markdown) add_new_email = Afegir una adreça de correu electrònic @@ -833,7 +842,7 @@ twofa_scratch_token_regenerate = Regenerar la clau de recuperació d'un sol ús twofa_scratch_token_regenerated = La vostra clau de recuperació d'un sol ús ara és %s. Emmagatzemeu-la en un lloc segur, ja que no es tornarà a mostrar. twofa_disable_note = L'autenticació de doble factor es pot desactivar si és necessari. twofa_disable_desc = Desactivar l'autenticació de doble factor farà que el vostre compte sigui menys segur. Voleu continuar? -regenerate_scratch_token_desc = Si heu perdur la vostra clau de recuperació o ja l'heu fet servir per iniciar sessió, la podeu reiniciar aquí. +regenerate_scratch_token_desc = Si heu perdut la vostra clau de recuperació o ja l'heu fet servir per iniciar sessió, la podeu reiniciar aquí. twofa_disabled = S'ha desactivat l'autenticació de doble factor. scan_this_image = Escanegeu aquesta imatge amb la vostra aplicació d'autenticació: or_enter_secret = O introduïu el secret: %s @@ -881,6 +890,65 @@ visibility.limited = Limitat visibility.private = Privat primary = Principal +lookup_avatar_by_mail = Cercar l'avatar amb l'adreça de correu electrònic +access_token_desc = Els permisos de testimoni seleccionats es limiten a les rutes API corresponents. Llegiu la documentació per a més informació. +oauth2_confidential_client = Client confidencial. Seleccioneu aquesta opció per a aplicacions que mantinguin el secret confidencial, com les aplicacions web. No la seleccioneu pas per a aplicacions nadiues, tant d'escriptori com mòbils. +oauth2_application_create_description = Les aplicacions OAuth2 permeten que les vostres aplicacions de tercers accedeixin als comptes d'usuari d'aquesta instància. +oauth2_application_remove_description = Esborrar una aplicació OAuth2 li denegarà l'accés als comptes d'usuari autoritzats d'aquesta instància. Voleu continuar? +oauth2_application_locked = Forgejo registra per defecte algunes aplicacions OAuth2 en arrencar, si s'habilita a la configuració. Per evitar un comportament inesperat, aquestes aplicacions no es poden editar o eliminar. Si us plau, aneu a la documentació de l'OAuth2 per a més informació. +twofa_is_enrolled = El vostre compte té actualment activada l'autenticació de doble factor. +twofa_not_enrolled = El vostre compte no ha activat l'autenticació de doble factor. +twofa_enroll = Activar l'autenticació de doble factor +twofa_enrolled = S'ha activat satisfactòriament l'autentificació de doble factor per al vostre compte. Deseu la vostra clau de recuperació d'un sol ús (%s) en un lloc segur, ja que no es mostrarà més vegades. +hooks.desc = Afegir webhooks que s'executaran per a tots els repositoris que teniu. +delete_with_all_comments = El vostre compte és més recent que %s. Per evitar comentaris fantasma, tots els comentaris de problemes/PR s'eliminaran. +email_notifications.submit = Establir la preferència de correu electrònic +email_notifications.andyourown = I les vostres pròpies notificacions +visibility = Visibilitat d'usuari +quota.rule.exceeded.helper = La mida total dels objectes per a aquesta norma ha superat la quota. +quota.rule.no_limit = Il·limitat +quota.sizes.all = Tot +quota.sizes.assets.all = Recursos +quota.sizes.wiki = Wiki + +user_block_yourself = No us podeu bloquejar. +quota.applies_to_user = Les regles de quota següents s'apliquen al vostre compte +quota.applies_to_org = Les regles de quota següents s'apliquen a aquesta organització +quota.rule.exceeded = Sobrepassat + +change_username_redirect_prompt.with_cooldown.one = El nom d'usuari antic estarà disponible per a tothom després d'%[1]d dia. Podeu reclamar-lo abans que passi aquest temps. +change_username_redirect_prompt.with_cooldown.few = El nom d'usuari antic estarà disponible per a tothom després de %[1]d dies. Podeu reclamar-lo abans que passi aquest temps. +additional_repo_units_hint_description = Mostra un suggeriment per "Habilitar-ne més" pels repositoris que no tenen habilitades totes les unitats. +comment_type_group_lock = Estat del bloqueig +choose_new_avatar = Escolliu un nou avatar +primary_email = Fer-la principal +activate_email = Enviar l'activació +email_preference_set_success = S'ha configurat correctament la preferència de correu electrònic. +keep_email_private_popup = La vostra adreça de correu electrònic no es mostrarà al vostre perfil i no serà la predeterminada pels commits fets mitjançat la interfície web, com ara pujades de fitxers, modificacions i commits de fusió. En el seu lloc, una adreça especial %s es pot fer servir per enllaçar commits al vostre compte. Aquesta opció no afectarà els commits ja existents. +manage_ssh_principals = Gestiona els Certificats de Principals SSH +add_key = Afegir una clau +principal_desc = Aquests certificats principals d'SSH són associats al vostre compte i permeten accés complet als vostres repositoris. +add_new_principal = Afegir principal +ssh_principal_been_used = Aquest principal ja s'ha afegit al servidor. +gpg_key_matched_identities_long = Les identitats incrustades en aquesta clau coincideixen amb les següents adreces de correu electrònic activades per aquest usuari. Els commits coincidents amb aquestes adreces de correu electrònic es poden verificar amb aquesta clau. +gpg_token_signature = Firma GPG blindada +ssh_token_signature = Firma SSH blindada +add_principal_success = S'ha afegit el certificat principal SSH "%S". +ssh_principal_deletion = Eliminar Certificat Principal SSH +ssh_key_deletion_desc = Eliminar una clau SSH en revocarà l'accés al vostre compte. Voleu continuar? +gpg_key_deletion_desc = Eliminar una clau GPG des-verificarà els commits firmats per ella. Voleu continuar? +ssh_principal_deletion_desc = Eliminar un Certificat Principal SSH revoca el seu accés al vostre compte. Continuar? +ssh_principal_deletion_success = S'ha eliminat el principal. +valid_until_date = Vàlid fins %s +principal_state_desc = Aquest principal s'ha usat en els darrers 7 dies +repo_and_org_access = Accés al repositori i a l'organització +webauthn_delete_key = Eliminar una clau de seguretat +webauthn_alternative_tip = Segurament voldreu configurar un mètode d'autenticació addicional. +remove_account_link = Eliminar el compte vinculat +email_notifications.onmention = Enviar correus electrònics només quan se us mencioni +blocked_since = Bloquejat des de %s +quota.sizes.assets.attachments.releases = Fitxers adjunts a la publicació + [repo] settings.basic_settings = Configuració bàsica settings.event_issues = Modificació @@ -1280,7 +1348,7 @@ pulls = Sol·licituds d'extracció project = Projectes org_labels_desc = Etiquetes de nivell d'organització que es poden usar amb tots els repositoris dins d'aquesta organització released_this = ha publicat això -file_view_source = Veure la font +file_view_source = Veure el codi font file_too_large = El fitxer és massa gran per ser mostrat. invisible_runes_header = `Aquest fitxer conté caràcters Unicode invisibles` invisible_runes_description = `Aquest fitxer conté caràcters Unicode invisibles que són indistingibles pels humans però que un ordinador pot processar de manera diferent. Si creieu que això és intencional, podeu ignorar aquest avís. Useu el botó Esc per revelar-los.` @@ -1395,7 +1463,7 @@ issues.reaction.alt_many = %[1]s i %[2]d més han reaccionat %[3]s. issues.reaction.alt_remove = Eliminar %[1]s reacció del comentari. issues.reaction.alt_add = Afegir %[1]s reacció al comentari. issues.context.copy_link = Copiar l'enllaç -issues.context.quote_reply = +issues.context.quote_reply =Citar la resposta issues.context.reference_issue = Referenciar-la en una nova incidència issues.no_content = No s'ha proporcionat cap descripció. issues.close = Tancar la incidència @@ -1438,7 +1506,7 @@ issues.lock_duplicate = No es pot bloquejar una incidència dues vegades. issues.unlock_error = No es pot desbloquejar una incidència que no està bloquejada. issues.unlock_comment = ha desbloquejat aquesta conversa %s issues.lock.notice_1 = - Els altres usuaris no podran deixar més comentaris en aquesta incidència. -issues.lock.notice_2 = - Vos i altres col·laboradors amb accés a aquest repositori encara podeu deixar comentaris que els altres poden veure. +issues.lock.notice_2 = - Vós i altres col·laboradors amb accés a aquest repositori encara podeu deixar comentaris que els altres poden veure. issues.lock.notice_3 = - Sempre podeu desbloquejar aquesta incidència una altra vegada més endavant. issues.unlock.notice_1 = - Tothom podrà tornar a deixar comentaris en aquesta incidència. issues.unlock.notice_2 = - Sempre podeu bloquejar aquesta incidència una altra vegada més endavant. @@ -1560,6 +1628,640 @@ activity.git_stats_deletion_1 = %d eliminació activity.git_stats_deletion_n = %d eliminacions settings.mirror_settings.docs = Configureu el vostre repositori per sincronitzar automàticament commits, etiquetes i branques amb un altre repositori. +rss.must_be_on_branch = Heu d'estar en una branca per a tenir un canal RSS. +admin.manage_flags = Gestiona les marques +admin.enabled_flags = Marques habilitades del repositori: +admin.update_flags = Actualitza les marques +admin.failed_to_replace_flags = No s'han pogut reemplaçar les marques del repositori +admin.flags_replaced = S'han reemplaçat les marques del repositori +new_repo_helper = Un repositori conté tots els arxius del projecte, incloent l'historial de revisions. Ja n'esteu allotjant un en un altre lloc? Migració de repositori. +new_from_template = Usar una plantilla +size_format = %[1]s: %[2]s; %[3]s: %[4]s +visibility_helper = Fer el repositori privat +use_template = Usar aquesta plantilla +license_helper_desc = Una llicència estableix què poden fer o no les altres persones amb el vostre codi. Si no esteu segur de quina és la més adequada per al vostre projecte, aneu a Choose a license. +object_format = Format d'objecte +object_format_helper = Format d'objecte del repositori. No es pot canviar després. SHA1 és el format més compatible. +auto_init = Inicialitzar el repositori +auto_init_description = Comença l'historial de Git amb un README i, opcionalment, afegeix un arxiu de llicència i .gitignore. +create_repo = Crear un repositori +mirror_use_ssh.text = Usar l'autenticació SSH +mirror_denied_combination = No es poden usar simultàniament una autenticació per clau pública i per contrasenya. +stars_remove_warning = Això eliminarà totes les estrelles d'aquest repositori. +archive.pull.noreview = Aquest repositori està arxivat. No podeu revisar-ne les «pull requests». +sync_fork.branch_behind_one = Aquesta branca és %[1]d commit darrere de %[2]s +sync_fork.branch_behind_few = Aquesta branca és %[1]d commits darrere de %[2]s +form.reach_limit_of_creation_1 = El propietari ja ha superat el límit de %d repositori. +form.reach_limit_of_creation_n = El propietari ja ha superat el límit de %d repositoris. +form.name_reserved = El nom de repositori "%s" està reservat. +form.name_pattern_not_allowed = El patró "%s" no està permès en el nom del repositori. +form.string_too_long = El text introduït té més de %d caràcters. +migrate_options = Opcions de migració +migrate_options_mirror_helper = Aquest repositori serà un mirall +migrate_options_lfs_endpoint.description.local = També s'accepta un camí al servidor local. +migrate_items = Elements de migració + +open_with_editor = Obre amb %s +mirror_prune_desc = Elimina les referències de seguiment remot obsoletes +mirror_sync_on_commit = Sincronitza quan es pugin commits +mirror_lfs = Emmagatzematge gran de fitxers (LFS) +mirror_lfs_desc = Activa l'emmirallament de dades LFS. +mirror_lfs_endpoint = Punt final LFS +mirror_lfs_endpoint_desc = En sincronitzar, s'intentarà utilitzar l'url de clonatge per a determinar el servidor LFS. També podeu especificar un punt final personalitzat si les dades LFS del repositori són en un altre lloc. +mirror_password_help = Canvia el nom d'usuari per esborrar una contrasenya desada. +adopt_search = Entra el nom d'usuari per cercar repositoris no-adoptats... (deixeu-ho en blanc per cercar-los tots) +adopt_preexisting_label = Adopta fitxers +adopt_preexisting = Adopta fitxers preexistents +adopt_preexisting_content = Crea un repositori des de %s +adopt_preexisting_success = Fitxers adoptats i repositori creat des de %s +delete_preexisting = Elimina fitxers preexistents +delete_preexisting_content = Elimina fitxers en %s +template.git_hooks_tooltip = Actualment no podeu modificar o eliminar els ganxos git un cop s'han afegit. Només selecciona això si confieu en el repositori de plantilla. +template.one_item = Heu de seleccionar un ítem de plantilla com a mínim +template.invalid = Heu de seleccionar un repositori de plantilla +archive.title = Aquest repositori és un arxiu. Podeu veure-hi els fitxers i clonar-lo, però no podeu fer-hi canvis com pujar modificacions, crear-ne incidències, «pull requests» o comentaris. +archive.title_date = Aquest repositori és un arxiu a %s. Podeu veure-hi els fitxers i clonar-lo, però no podeu fer-hi canvis com pujar modificacions, crear-ne incidències, «pull requests» o comentaris. +archive.nocomment = No es poden crear comentaris perquè el repositori és un arxiu. +sync_fork.button = Sincronitza +migrate_options_lfs = Migra els fitxers LFS +migrate_options_lfs_endpoint.label = Punt final LFS +migrate_options_lfs_endpoint.description = En migrar, s'intentarà utilitzar el vostre remot git per a determinar el servidor LFS. També podeu especificar un punt final personalitzat si les dades LFS del repositori són en un altre lloc. +migrate_options_lfs_endpoint.placeholder = Si ho deixeu en blanc, el punt final derivarà de l'URL de clonació +migrate_items_pullrequests = Pull requests + +fork_repo = Bifurca el repositori +fork_from = Bifurcar des de +repo_gitignore_helper_desc = Escolliu de quins fitxers no s'ha de fer seguiment d'una llista de plantilles per llenguatges comuns. Els artefactes típics generats per les eines de construcció de cada llenguatge estan incloses al .gitignore de manera predeterminada. +readme_helper_desc = Aquí podeu escriure una descripció completa del vostre projecte. +default_branch_helper = La branca per defecte és la branca base pels pull requests i els commits. +mirror_interval = Interval de rèplica (les unitats de temps vàlides són "h", "m", "s"). 0 per desactivar la sincronització periòdica. (Interval mínim: %s) +mirror_use_ssh.helper = Si seleccioneu aquesta opció, Forgejo replicarà el repositori mitjançant Git per SSH i us crearà una parella de claus. Heu d'assegurar-vos que la clau pública generada estigui autoritzada per publicar al repositori de destí. No podreu fer servir autenticació basada en contrasenyes. +delete_preexisting_success = S'ha suprimit els fitxers no-adoptats a %s +blame_prior = Veure el «blame» anterior a aquest canvi +blame.ignore_revs = S'ignoren les revisions a .git-blame-ignore-revs. Fes clic aquí per veure-les. +blame.ignore_revs.failed = No s'han pogut ignorar les revisions a .git-blame-ignore-revs. +author_search_tooltip = Es mostra un màxim de 30 usuaris +summary_card_alt = Resum del repositori %s +tree_path_not_found.commit = El camí %[1]s no existeix al commit %[2]s +tree_path_not_found.branch = El camí %[1]s no existeix a la branca %[2]s +tree_path_not_found.tag = El camí %[1]s no existeix a l'etiqueta %[2]s +transfer.accept = Accepta la transferència +transfer.accept_desc = Transfereix a "%s" +transfer.reject = Denega la transferència +transfer.reject_desc = Cancel·la la transferència a "%s" +transfer.no_permission_to_accept = No teniu permisos per acceptar aquesta transferència. +transfer.no_permission_to_reject = No teniu permisos per denegar aquesta transferència. +template.items = Ítems de la plantilla +template.git_content = Contingut Git (Branca predeterminada) +template.git_hooks = Ganxos Git +migrate_items_merge_requests = Sol·licituds de fusió +migrate_repo = Migra el repositori +migrate.repo_desc_helper = Deixa-ho buit per importar la descripció existent +migrate.clone_address = Migra / Clona des d'una URL +migrate.clone_address_desc = L'URL d'HTTP(S) o de Git "clone" d'un repositori ja existent +migrate.github_token_desc = Podeu posar un o més testimonis separats amb comes per fer que la migració sigui més ràpida, evitant així el límit de taxa de l'API de GitHub. ATENCIÓ: Abusar aquesta funció pot anar en contra de la política de servei del proveïdor i pot comportar el bloqueig del/s vostre/s compte/s. +migrate.clone_local_path = o el camí a un servidor local +migrate.permission_denied = No podeu importar repositoris locals. +migrate.permission_denied_blocked = No podeu importar des d'amfitrions rebutjats, si us plau, demaneu a l'administrador que comprovi les configuracions ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS. +migrate.invalid_local_path = El camí local és invàlid. No existeix o no és un directori. +migrate.invalid_lfs_endpoint = El punt final LFS no és vàlid. +migrate.failed = La migració ha fallat: %v +migrate.migrate_items_options = Cal un testimoni d'accés per migrar els ítems addicionals +migrated_from = Migrat des de %[2]s +migrated_from_fake = Migrat des de %[1]s +migrate.migrate = Migra des de %s +migrate.migrating = S'està migrant des de %s … +migrate.migrating_failed = La migració des de %s ha fallat. +migrate.migrating_failed.error = No s'ha pogut migrar: %s +migrate.migrating_failed_no_addr = La migració ha fallat. +migrate.migrating_git = Migrant dades Git +migrate.migrating_topics = Migrant tòpics +migrate.migrating_milestones = Migrant fites +migrate.migrating_labels = Migrant etiquetes +migrate.migrating_releases = Migrant publicacions +migrate.migrating_issues = Migrant problemes +migrate.migrating_pulls = Migrant «pull requests» +migrate.cancel_migrating_title = Cancel·la la migració +migrate.cancel_migrating_confirm = Voleu cancel·lar aquesta migració? +mirror_from = mirall de +forked_from = bifurcat des de +generated_from = generat des de +fork_from_self = No podeu bifurcar un repositori que us pertany. +fork_guest_user = Inicia sessió per bifurcar aquest repositori. +watch_guest_user = Inicia sessió per vigilar aquest repositori. +star_guest_user = Inicia sessió per destacar aquest repositori. +subscribe.issue.guest.tooltip = Inicia sessió per subscriure't a aquest problema. +subscribe.pull.guest.tooltip = Inicia sessió per subscriure't a aquesta «pull request». +more_operations = Més operacions +no_desc = Sense descripció +quick_guide = Guia ràpida +clone_this_repo = Clona aquest repositori +cite_this_repo = Cita aquest repositori +create_new_repo_command = Crea un nou repositori a la línia de comandes +push_exist_repo = Puja un repositori ja existent des de la línia de comandes +empty_message = Aquest repositori està buit. +broken_message = Les dades Git d'aquest repositori no es poden llegir. Contacta amb l'administrador d'aquesta instància o suprimeix aquest repositori. +code.desc = Accedeix al codi font, els fitxers, els commits i les branques. +clear_ref = `Esborra la referència actual` +filter_branch_and_tag = Filtra per branca o etiqueta +find_tag = Cerca etiqueta +n_commit_one = %s commit +n_commit_few = %s commits +n_branch_one = Branca %s +n_branch_few = Branques %s +n_tag_one = Etiqueta %s +n_tag_few = Etiquetes %s +n_release_one = Publicació %s +n_release_few = Publicacions %s +file.title = %s a %s +file_follow = Seguir symlink +file_view_rendered = Veure renderitzat +file_view_raw = Veure cru +escape_control_characters = +commit_graph = Gràfic de commits +commit.contained_in = Aquest commit és a: +no_eol.text = Sense EOL +editor.commit_signed_changes = Fes un commit signat dels canvis +editor.commit_changes = Fes un commit dels canvis +editor.add_tmpl.filename = nom del fitxer +editor.update = Actualitzar %s +editor.patch = Aplicar pedaç +editor.patching = Aplicant el pedaç a: +editor.signoff_desc = Afegeix un "Signat per" seguit de l'autor al final del missatge del commit. +editor.commit_directly_to_this_branch = Feu un commit directament a la branca %[1]s. +editor.new_branch_name = Anomena la nova branca per a aquest commit +editor.file_already_exists = Ja hi ha un fitxer anomenat "%S" en aquest repositori. +editor.commit_id_not_matching = El fitxer ha canviat mentre l'editaves. Fes un commit a una nova branca i llavors fusiona-la. +editor.push_out_of_date = La pujada està desactualitzada. +editor.commit_empty_file_header = Fes un commit d'un fitxer buit +editor.user_no_push_to_branch = L'usuari no pot pujar a la branca +editor.cherry_pick = Triar a dit %s a: +editor.revert = Retorna %s a: +editor.commit_email = Adreça electrònica del commit +commits.no_commits = No hi ha commits en comú. "%s" i "%s" tenen històries completament diferents. +commits.signed_by_untrusted_user_unmatched = Signat per un usuari no fiable que no coincideix amb qui ha fet el commit +commits.view_path = Veure en aquest punt de la història +commits.view_single_diff = Veure els canvis fets en aquest fitxer introduïts en aquest commit +commit.revert-header = Retorna: %s +commit.revert-content = Selecciona una branca per retornar-hi: +commit.cherry-pick = Triar a dit +commit.cherry-pick-header = Triar a dit: %s +commit.cherry-pick-content = Seleccioneu una branca per triar-hi: +projects.new_subheader = Coordineu, feu el seguiment i actualitzeu la vostra feina en un sol lloc, perquè els projectes siguin transparents i compleixin els terminis. +projects.type.basic_kanban = Kanban bàsic +projects.type.bug_triage = Triatge d'errors +projects.column.set_default = Estableix per defecte +projects.column.set_default_desc = Estableix aquesta columna com a predeterminada per als problemes i pulls sense categoria +projects.column.assigned_to = Assignat a +projects.card_type.desc = Previsualització de targeta +issues.filter_assignees = Filtrar assignats +issues.filter_reviewers = Filtrar revisor +issues.new.open_projects = Projectes oberts +issues.new.open_milestone = Fites obertes +issues.new.clear_assignees = Esborra assignats +issues.new.no_assignees = Sense assignats +issues.new.assign_to_me = Assigna-m'ho +issues.new.no_reviewers = Sense revisors +issues.edit.already_changed = No s'han pogut desar els canvis al problema. Sembla que un altre usuari n'ha modificat el contingut. Si us plau, refresqueu la pàgina i intenteu-ho un altre cop per evitar reescriure els seus canvis +issues.choose.get_started = Començar +issues.choose.blank_about = Crea un problema a partir de la plantilla per defecte. +issues.choose.invalid_config = La configuració del problema té errors: +issues.label_templates.use = Utilitza una etiqueta predeterminada +issues.label_templates.fail_to_load_file = No s'ha pogut carregar el fitxer d'etiqueta predeterminada "%s": %v +issues.add_label = s'ha afegit l'etiqueta %s %s +issues.add_labels = s'han afegit les etiquetes %s %s +issues.remove_label = s'ha esborrat l'etiqueta %s %s +issues.remove_labels = s'han esborrat les etiquetes %s %s +issues.add_remove_labels = s'han afegit %s etiquetes i esborrat %s %s +issues.add_milestone_at = `s'ha afegit a la fita %s %s` +issues.add_project_at = `s'ha afegit al projecte %s %s` +issues.change_milestone_at = `s'ha modificat la fita des de %s a %s %s` +issues.change_project_at = `s'ha modificat el projecte des de %s a %s %s` +issues.remove_milestone_at = `s'ha eliminat de la fita %s %s` +issues.remove_project_at = `s'ha eliminat del projecte %s %s` +issues.self_assign_at = `s'ha auto-assignat aquest %s` +issues.add_assignee_at = `va ser assignat per %s %s` +issues.remove_assignee_at = `va ser desassignat per %s %s` +issues.remove_self_assignment = `s'ha eliminat la seva tasca %s` +issues.change_title_at = `s'ha canviat el títol de %s a %s %s` +issues.change_ref_at = `s'ha canviat la referència de %s a %s %s` +issues.remove_ref_at = `s'ha eliminat la referència %s %s` +issues.add_ref_at = `s'ha afegit la referència %s %s` +issues.delete_branch_at = `s'ha eliminat la branca %s %s` +issues.filter_label_no_select = Totes les etiquetes +issues.filter_label_select_no_label = Sense etiqueta +issues.filter_milestone_none = Sense fites +issues.filter_milestone_open = Fites obertes +issues.filter_milestone_closed = Fites tancades +issues.filter_project_all = Tots els projectes +issues.filter_project_none = Sense projecte +issues.filter_assginee_no_select = Tots els assignats +issues.filter_assginee_no_assignee = Sense assignat +issues.filter_poster_no_select = Tots els autors +issues.filter_type.all_pull_requests = Totes les «pull requests» +issues.filter_type.all_issues = Tots els problemes +issues.filter_type.assigned_to_you = Tasques que tens assignades +issues.filter_type.created_by_you = Creat per tu +issues.filter_type.mentioning_you = Que et mencionen +issues.filter_type.review_requested = S'ha demanat la revisió +issues.filter_type.reviewed_by_you = Revisats per tu +issues.filter_sort.relevance = Rellevància +issues.filter_sort.recentupdate = Actualitzats recentment +issues.filter_sort.leastupdate = Actualitzats menys recentment +issues.filter_sort.mostcomment = Més comentat +issues.filter_sort.leastcomment = Menys comentats +issues.filter_sort.nearduedate = A prop de la data de venciment +issues.filter_sort.farduedate = Lluny de la data de venciment +issues.filter_sort.moststars = Més destacats +issues.filter_sort.feweststars = Menys destacats +issues.filter_sort.mostforks = Més bifurcacions +issues.filter_sort.fewestforks = Menys bifurcacions +issues.action_assignee_no_select = Sense assignat +pulls.merged_by = per %[3]s s'ha fusionat %[1]s +issues.closed_by = per %[3]s s'ha tancat %[1]s +issues.context.menu = Menú de comentari +issues.comment_pull_merged_at = s'ha fusionat el commit %[1]s a %[2]s %[3]s +issues.comment_manually_pull_merged_at = s'ha fusionat el commit %[1]s manualment a %[2]s %[3]s +issues.role.contributor_helper = Aquest usuari ja ha fet commits en aquest repositori. +issues.is_stale = Hi ha hagut canvis a aquest PR des de la revisió +issues.label_exclusive_desc = Doneu nom a l'àmbit/ítem de l'etiqueta per fer-la mútuament exclusiva amb altres àmbits/ etiquetes. +issues.label_exclusive_warning = Qualsevol etiqueta amb àmbits conflictius s'esborrarà quan s'editin les etiquetes d'un problema o «pull request». +issues.archived_label_description = (Arxivats) %s +issues.label.filter_sort.reverse_alphabetically = Capgira-ho alfabèticament +issues.label.filter_sort.by_size = Mida més petita +issues.label.filter_sort.reverse_by_size = Mida més gran +issues.num_participants_one = %d participant +issues.num_participants_few = %d participants +issues.tracker = Rastrejador de temps +issues.start_tracking_short = Inicia el temporitzador +issues.start_tracking = Inicia el rastreig de temps +issues.start_tracking_history = `s'ha començat %s` +issues.tracker_auto_close = El temporitzador s'aturarà automàticament quan el problema s'hagi resolt +issues.tracking_already_started = `Ja has començat a rastrejar el temps en un altre problema!` +issues.stop_tracking = Atura el temporitzador +issues.stop_tracking_history = `s'ha aturat %s` +issues.cancel_tracking_history = `s'ha cancel·lat el rastreig de temps %s` +issues.add_time = Afegeix el temps manualment +issues.del_time = Elimina aquest registre de temps +issues.add_time_short = Afegeix temps +issues.add_time_history = `s'ha afegit temps passat %s` +issues.del_time_history = `s'ha eliminat temps passat %s` +issues.add_time_sum_to_small = No s'ha introduït temps. +issues.time_spent_from_all_authors = `Temps total: %s` +issues.due_date = Data de venciment +issues.push_commit_1 = s'ha afegit %d commit %s +issues.push_commits_n = s'ha afegit %d commits %s +issues.force_push_codes = `s'ha forçat la pujada %[1]s des de %[2]s %[8]s a %[4]s %[9]s %[6]s` +issues.due_date_not_set = No s'ha establert una data de venciment. +issues.due_date_added = s'ha afegit la data de venciment %s %s +issues.due_date_modified = s'ha modificat la data de venciment de %[2]s a %[1]s %[3]s +issues.due_date_remove = s'ha eliminat la data de venciment %s %s +issues.due_date_invalid = La data de venciment no és vàlida o és fora de rang. Si us plau, useu el format "aaaa-mm-dd". +issues.dependency.issue_no_dependencies = No s'han establert dependències. +issues.dependency.pr_no_dependencies = No s'ha establert cap dependència. +issues.dependency.no_permission_1 = No teniu permisos per llegir %d dependència +issues.dependency.no_permission_n = No teniu permisos per llegir %d dependències +issues.dependency.no_permission.can_remove = No teniu permisos per llegir aquesta dependència, però la podeu eliminar +issues.dependency.add = Afegir dependència… +issues.dependency.remove_info = Eliminar aquesta dependència +issues.dependency.added_dependency = `s'ha afegit una nova dependència %s` +issues.dependency.removed_dependency = `s'ha eliminat una dependència %s` +issues.dependency.pr_closing_blockedby = No es pot tancar aquesta «pull request» perquè té els següents problemes +issues.dependency.issue_closing_blockedby = No es pot tancar aquest problema perquè té els següents problemes +issues.dependency.issue_close_blocks = Aquest problema bloqueja el tancament d'aquests altres problemes +issues.dependency.pr_close_blocks = Aquesta «pull request» bloqueja el tancament d'aquests problemes +issues.dependency.issue_close_blocked = Heu de tancar tots els problemes que en bloquegen el tancament d'aquest. +issues.dependency.issue_batch_close_blocked = No es poden tancar tots els problemes marcats perquè el problema #%d encara té dependències obertes +issues.dependency.pr_close_blocked = Heu de tancar tots els problemes que bloquegen aquesta «pull request» abans de fusionar-la. +issues.dependency.blocked_by_short = Depèn de +issues.dependency.remove_header = Eliminar dependència +issues.dependency.issue_remove_text = Això eliminarà la dependència d'aquest problema. Continuar? +issues.dependency.pr_remove_text = Això eliminarà la dependència d'aquesta «pull request». Continuar? +issues.dependency.setting = Activa les dependències per a problemes i «pull requests» +issues.dependency.add_error_same_issue = No podeu fer que un problema depengui d'ell mateix. +issues.dependency.add_error_dep_issue_not_exist = El problema que en depèn no existeix. +issues.dependency.add_error_dep_not_exist = La dependència no existeix. +issues.dependency.add_error_dep_exists = La dependència ja existeix. +issues.dependency.add_error_cannot_create_circular = No podeu crear una dependència amb dos problemes que es bloquegen mútuament. +issues.dependency.add_error_dep_not_same_repo = Els dos problemes han d'ésser al mateix repositori. +issues.review.self.approval = No podeu aprovar la vostra «pull request». +issues.review.self.rejection = No podeu sol·licitar canvis en la vostra «pull request». +issues.review.approve = ha aprovat aquests canvis %s +issues.review.comment = ha revisat %s +issues.review.dismissed = ha rebutjat la revisió de %s %s +issues.review.left_comment = ha fet un comentari +issues.review.content.empty = Heu de fer un comentari indicant els canvis que sol·liciteu. +issues.review.reject = canvis sol·licitats %s +issues.review.add_review_request = ha sol·licitat una revisió de %[1]s %[2]s +issues.review.add_review_requests = ha sol·licitat revisions de %[1]s %[2]s +issues.review.remove_review_request = ha eliminat la sol·licitud de revisió per a %[1]s %[2]s +issues.review.remove_review_requests = ha eliminat les sol·licituds de revisió per a %[1]s %[2]s +issues.review.remove_review_request_self = ha rebutjat la revisió %s +issues.review.add_remove_review_requests = ha demanat la revisió a %[1]s i ha eliminat les peticions de revisió a %[2]s %[3]s +issues.review.pending.tooltip = Actualment, la resta d'usuaris no poden veure aquest comentari. Per a publicar els comentaris pendents, selecciona "%s" -> "%s/%s/%s" més amunt. +issues.review.outdated_description = El contingut ha canviat des que es va publicar aquest comentari +issues.review.option.show_outdated_comments = Mostra els comentaris antics +issues.review.option.hide_outdated_comments = Amaga els comentaris antics +issues.review.show_outdated = Mostrar antics +issues.review.hide_outdated = Amagar antics +issues.review.show_resolved = Mostrar resolts +issues.review.hide_resolved = Amagar resolts +issues.review.resolve_conversation = Resol la conversa +issues.review.un_resolve_conversation = Desfés la resolució de la conversa +issues.review.resolved_by = ha marcat aquesta conversa com a resolta +issues.content_history.delete_from_history = Eliminar de la història +issues.content_history.delete_from_history_confirm = Eliminar de la història? +issues.blocked_by_user = No podeu crear problemes en aquest repositori perquè el seu propietari us ha bloquejat. +comment.blocked_by_user = No podeu fer comentaris perquè el propietari o autor del repositori us ha bloquejat. +issues.summary_card_alt = Targeta de resum d'un problema titulat "%s" al repositori %s +pulls.edit.already_changed = No s'han pogut desar els canvis a la «pull request». Sembla que un altre usuari n'ha modificat el contingut. Si us plau, refresqueu la pàgina i intenteu-ho un altre cop per evitar reescriure els seus canvis +pulls.viewed_files_label = s'ha revisat %[1]d / %[2]d fitxers +pulls.filter_branch = Filtra branca +pulls.showing_only_single_commit = Només es mostren els canvis del commit %[1]s +pulls.showing_specified_commit_range = Només es mostren els canvis entre %[1]s..%[2]s +pulls.filter_changes_by_commit = Filtrar per commit +pulls.tab_files = Fitxers modificats +pulls.title_wip_desc = `Comença el títol amb %s per evitar que la «pull request» sigui fusionada accidentalment.` +pulls.still_in_progress = Encara hi treballeu? +pulls.add_prefix = Afegeix el prefix %s +pulls.ready_for_review = A punt per revisar? +pulls.remove_prefix = Elimina el prefix %s +pulls.data_broken = Aquesta «pull request» és malmesa perquè hi falta la informació de la bifurcació. +pulls.required_status_check_failed = Algunes comprovacions no han sigut satisfactòries. +pulls.required_status_check_missing = Falten algunes comprovacions. +pulls.wrong_commit_id = L'ID del commit ha d'ésser a la branca objectiu +pulls.rebase_merge_pull_request = Canvia de base i avança ràpid +pulls.rebase_merge_commit_pull_request = Fes «rebase» i després el commit de fusió +pulls.squash_merge_pull_request = Fes un «squash commit» +pulls.fast_forward_only_merge_pull_request = Només avança ràpid +pulls.rebase_conflict = La fusió ha fallat: Hi ha hagut un conflicte mentre es feia el «rebase» del commit: %[1]s. Consell: Intenteu una altra estratègia +pulls.unrelated_histories = La fusió ha fallat: El cap (head) de la fusió i la base no tenen una història comú. Consell: Intenteu una altra estratègia +pulls.merge_out_of_date = La fusió ha fallat: La base s'ha actualitzat mentre es generava la fusió. Consell: Torneu-ho a intentar. +pulls.head_out_of_date = La fusió ha fallat: El cap (head) s'ha actualitzat mentre es generava la fusió. Consell: Torneu-ho a intentar. +pulls.has_merged = Fallit: La «pull request» ja s'ha fusionat, no podeu fusionar-la de nou ni canviar la branca objectiu. +pulls.push_rejected = La pujada ha fallat: La pujada (push) s'ha rebutjat. Revisa els ganxos Git d'aquest repositori. +pulls.push_rejected_summary = Missatge complet del rebuig +pulls.push_rejected_no_message = La pujada ha fallat: La pujada (push) s'ha rebutjat però no hi havia un missatge remot. Revisa els ganxos Git d'aquest repositori +pulls.open_unmerged_pull_exists = `No podeu reobrir perquè hi ha una «pull request» pendent (#%d) amb les mateixes característiques.` +pulls.status_checking = Hi ha algunes comprovacions pendents +pulls.status_checks_success = Totes les comprovacions s'han resolt +pulls.status_checks_warning = Algunes comprovacions tenen advertències +pulls.status_checks_failure = Algunes comprovacions han fallat +pulls.status_checks_error = Algunes comprovacions han donat errors +pulls.status_checks_hide_all = Amaga totes les comprovacions +pulls.status_checks_show_all = Mostra totes les comprovacions +pulls.update_branch = Actualitza la branca fusionant +pulls.update_branch_rebase = Actualitza la branca fent «rebase» +pulls.update_branch_success = S'ha actualitzat la branca correctament +pulls.update_not_allowed = No teniu permisos per actualitzar la branca +pulls.outdated_with_base_branch = Aquesta branca està desactualitzada amb la branca base +pulls.close = Tancar «pull request» +pulls.closed_at = `ha tancat aquesta «pull request» %s` +pulls.reopened_at = `ha reobert aquesta «pull request» %s` +pulls.commit_ref_at = `ha fet referència a aquesta «pull request» des d'un commit %s` +pulls.cmd_instruction_hint = Veure les instruccions de la línia de comandes +pulls.cmd_instruction_checkout_title = Canviar branca +pulls.cmd_instruction_checkout_desc = Des del repositori del vostre projecte, canvia a una nova branca i comprova els canvis. +pulls.cmd_instruction_merge_desc = Fusionar els canvis i actualitzar-los a Forgejo. +pulls.cmd_instruction_merge_warning = Atenció: La configuració de "Detecta automàticament la fusió manual" no està activa en aquest repositori, haureu de marcar després aquesta «pull request» com a fusionada manualment. +pulls.clear_merge_message = Neteja el missatge de fusió +pulls.clear_merge_message_hint = Netejar el missatge de fusió només esborrarà el contingut del missatge de commit i mantindrà la firma generada de git com "Co-Authored-By …". +pulls.reopen_failed.head_branch = La «pull request» no es pot reobrir perquè el cap (head) de la branca ja no existeix. +pulls.reopen_failed.base_branch = La «pull request» no es pot reobrir perquè la base de la branca ja no existeix. +pulls.agit_explanation = Creat amb el flux de treball d'AGit. L'AGit permet que els contribuents proposin canvis amb "git push" sense crear una bifurcació o branca. +pulls.editable = Editable +pulls.editable_explanation = Els mantenidors poden editar aquesta «pull request». Podeu editar-la directament. +pulls.auto_merge_button_when_succeed = (Quan les comprovacions siguin satisfactòries) +pulls.auto_merge_when_succeed = Fusiona automàticament quan totes les comprovacions siguin satisfactòries +pulls.auto_merge_newly_scheduled = S'ha programat la «pull request» per a ser fusionada quan totes les comprovacions siguin satisfactòries. +pulls.auto_merge_has_pending_schedule = %[1]s ha programat aquesta «pull request» per a ser fusionada quan totes les comprovacions siguin satisfactòries %[2]s. +pulls.auto_merge_cancel_schedule = Cancel·la la fusió automàtica +pulls.auto_merge_not_scheduled = Aquesta «pull request» no es fusionarà automàticament. +pulls.auto_merge_canceled_schedule = S'ha cancel·lat la fusió automàtica per a aquesta «pull request». +pulls.auto_merge_newly_scheduled_comment = `ha programat aquesta «pull request» per a ser fusionada quan totes les comprovacions siguin satisfactòries. %[1]s` +pulls.auto_merge_canceled_schedule_comment = `ha cancel·lat la fusió automàtica d'aquesta «pull request» quan totes les comprovacions siguin satisfactòries %[1]s` +pulls.delete_after_merge.head_branch.is_default = La branca cap (head) que voleu eliminar és la branca predeterminada i no es pot eliminar. +pulls.delete_after_merge.head_branch.is_protected = La branca cap (head) que voleu eliminar està protegida i no es pot eliminar. +pulls.delete_after_merge.head_branch.insufficient_branch = No teniu permisos per eliminar la branca cap (head). +pulls.delete.title = Eliminar aquesta «pull request»? +pulls.delete.text = Realment voleu eliminar aquesta «pull request»? (Això eliminarà permanentment tot el contingut. Considereu millor tancar-la, si la voleu arxivar) +pulls.recently_pushed_new_branches = Heu pujat a la branca %[1]s %[2]s +comments.edit.already_changed = No s'han pogut desar els canvis al comentari. Sembla que un altre usuari n'ha modificat el contingut. Si us plau, refresqueu la pàgina i intenteu-ho un altre cop per evitar reescriure els seus canvis +milestones.new = Nova fita +milestones.closed = Tancat %s +milestones.update_ago = Actualitzat %s +milestones.no_due_date = Sense data de venciment +milestones.new_subheader = Les fites us poden ajudar a organitzar els problemes i fer-ne el seguiment. +milestones.completeness = %d%% Completat +milestones.create = Crear fita +milestones.due_date = Data de venciment (opcional) +milestones.invalid_due_date_format = El format de la data de venciment ha de ser "aaaa-mm-dd". +milestones.create_success = S'ha creat la fita "%s". +milestones.edit = Editar fita +milestones.edit_subheader = Les fites organitzen els problemes i en fan el seguiment. +milestones.modify = Actualitzar fita +milestones.edit_success = S'ha actualitzat la fita "%s". +milestones.deletion = Eliminar fita +milestones.deletion_desc = Eliminar una fita n'esborra tots els problemes. Continuar? +milestones.deletion_success = S'ha eliminat la fita. +milestones.filter_sort.name = Nom +milestones.filter_sort.earliest_due_data = A prop de la data de venciment +milestones.filter_sort.latest_due_date = Lluny de la data de venciment +milestones.filter_sort.least_complete = Menys completa +milestones.filter_sort.most_complete = Més completa +diff.git-notes = Notes +diff.git-notes.add = Afegir nota +diff.git-notes.remove-header = Eliminar nota +diff.git-notes.remove-body = Aquesta nota no s'eliminarà. +diff.data_not_available = El contingut del diff no és disponible +diff.options_button = Opcions del diff +diff.download_patch = Baixa el fitxer pedaç +diff.download_diff = Baixa el fitxer de diff +diff.show_split_view = Vista dividida +diff.show_unified_view = Vista única +diff.whitespace_show_everything = Mostrar tots els canvis +diff.whitespace_ignore_all_whitespace = Ignora els espais en blanc quan es comparin línies +diff.whitespace_ignore_amount_changes = Ignora els canvis en el nombre d'espais en blanc +diff.whitespace_ignore_at_eol = Ignorar els canvis en els espais en blanc al final de la línia +diff.stats_desc = %d fitxers modificats amb %d afegits i %d supressions +diff.stats_desc_file = %d canvis: %d afegits i %d supressions +diff.bin_not_shown = No es mostra el fitxer binari. +diff.view_file = Visualitza el fitxer +diff.file_suppressed = S'ha suprimit el fitxer diff perquè és massa gran +diff.file_suppressed_line_too_long = S'ha suprimit el fitxer de diff perquè una o més línies són massa llargues +diff.too_many_files = Alguns fitxers no es mostren perquè hi ha massa modificacions de fitxers en aquest diff +diff.show_more = Mostra'n més +diff.load = Carrega el diff +diff.generated = generat +diff.comment.add_line_comment = Afegeix un comentari de línia +diff.comment.placeholder = Fes un comentari +diff.comment.add_single_comment = Afegeix només un comentari +diff.comment.add_review_comment = Afegeix un comentari +diff.comment.start_review = Comença la revisió +diff.comment.reply = Respon +diff.review = Acaba la revisió +diff.review.header = Lliura la revisió +diff.review.placeholder = Revisa el comentari +diff.review.comment = Comentari +diff.review.approve = Aprova +diff.review.self_reject = Els autors de la «pull request» no en poden demanar canvis +diff.review.reject = Demana canvis +diff.review.self_approve = Els autors de la «pull request» no la poden aprovar +diff.committed_by = comès per +diff.protected = Protegit +diff.image.side_by_side = L'un vora l'altre +diff.image.swipe = Llisca +diff.image.overlay = Sobreposa +diff.show_file_tree = Mostra l'arbre de fitxers +diff.hide_file_tree = Amaga l'arbre de fitxers +release.releases = Publicacions +release.detail = Detalls de la publicació +release.tags = Etiquetes +release.new_release = Nova publicació +release.draft = Esborrany +release.prerelease = Pre-publicació +release.stable = Estable +release.compare = Compara +release.edit = Edita +release.ahead.commits = %d commits +release.ahead.target = a %s des d'aquesta publicació +release.source_code = Codi font +release.new_subheader = Les publicacions organitzen les versions del projecte. +release.edit_subheader = Les publicacions organitzen les versions del projecte. +release.tag_name = Nom de l'etiqueta +release.target = Objectiu +release.tag_helper = Escull una etiqueta preexistent o crea'n una. +release.tag_helper_new = Nova etiqueta. Aquesta etiqueta es crearà des de l'objectiu. +release.tag_helper_existing = Etiqueta preexistent. +release.title = Nom de publicació +release.title_empty = El títol no pot ser buit. +release.message = Descriu aquesta publicació +release.prerelease_desc = Marca-ho com a pre-publicació +release.prerelease_helper = Marca aquesta publicació com a inadequada en producció. +release.cancel = Cancel·la +release.publish = Publica la publicació +release.save_draft = Desa un esborrany +release.edit_release = Actualitza la publicació +release.delete_release = Elimina la publicació +release.delete_tag = Elimina l'etiqueta +release.deletion = Elimina la publicació +release.deletion_desc = Eliminar una publicació només l'esborra de Forgejo. Això no afectarà l'etiqueta Git, el contingut del vostre repositori o la seva història. Continuar? +release.deletion_success = La publicació s'ha suprimit. +release.deletion_tag_desc = S'esborrarà aquesta etiqueta del repositori. El contingut del repositori i la seva història no es modificaran. Continuar? +release.deletion_tag_success = L'etiqueta s'ha eliminat. +release.tag_name_already_exist = Ja hi ha una publicació amb aquest nom d'etiqueta. +release.tag_name_invalid = El nom d'etiqueta no és vàlid. +release.tag_name_protected = El nom d'etiqueta és protegit. +release.downloads = Baixades + +signing.wont_sign.parentsigned = El commit no se signarà perquè el commit pare no està signat. +signing.wont_sign.headsigned = La fusió no se signarà perquè el commit cap (head) no està signat. +wiki.create_first_page = Crea la primera pàgina +wiki.filter_page = Filtrar pàgina +wiki.search = Cercar wiki +activity.navbar.code_frequency = Freqüència del codi +activity.no_git_activity = No hi ha hagut activitat de commits en aquest període. +activity.git_stats_exclude_merges = Excloent les fusions, +activity.git_stats_push_to_branch = a %s i +activity.git_stats_on_default_branch = En %s, +activity.commit = Activitat de commits +settings.federation_following_repos = URLs dels repositoris següents. Separats per ";" i sense espais. +settings.mirror_settings = Emmiralla la configuració +settings.mirror_settings.docs.disabled_push_mirror.instructions = Configureu el projecte per baixar commits, etiquetes i branques automàticament des d'un altre repositori. +settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = De moment, això només es pot fer en el menú "Nova Migració". Per a més informació, consulteu: +settings.mirror_settings.docs.disabled_push_mirror.info = L'administrador del vostre lloc ha desactivat la pujada de miralls. +settings.mirror_settings.docs.no_new_mirrors = El vostre repositori emmiralla els canvis d'un altre repositori. Si us plau, tingueu en compte que no podeu crear més miralls de moment. +settings.mirror_settings.docs.can_still_use = Malgrat que no podeu modificar o crear nous miralls, encara podeu usar el mirall existent. +settings.mirror_settings.docs.pull_mirror_instructions = Per configurar un mirall de baixada, consulteu: +settings.mirror_settings.docs.more_information_if_disabled = Aquí trobareu més informació sobre els miralls de pujada i baixada: +settings.mirror_settings.docs.doc_link_title = Com emmirallo repositoris? +settings.mirror_settings.docs.doc_link_pull_section = la secció "Baixar des d'un repositori remot" ("Pulling from a remote repository") a la documentació. +settings.mirror_settings.docs.pulling_remote_title = Baixar des d'un repositori remot +settings.mirror_settings.mirrored_repository = Repositori emmirallat +settings.mirror_settings.pushed_repository = Repositori pujat +settings.mirror_settings.direction.pull = Baixar +settings.mirror_settings.push_mirror.none = No s'ha configurat cap mirall de pujada +settings.mirror_settings.push_mirror.remote_url = URL del repositori Git remot +settings.mirror_settings.push_mirror.add = Afegir un mirall de pujada +settings.mirror_settings.push_mirror.edit_sync_time = Editar l'interval de sincronització del mirall +settings.mirror_settings.push_mirror.none_ssh = Cap +settings.units.add_more = Activa més +settings.pull_mirror_sync_in_progress = Baixant canvis del remot %s. +settings.pull_mirror_sync_quota_exceeded = S'ha superat la quota. No es baixen els canvis. +settings.push_mirror_sync_in_progress = Pujant canvis al remot %s. +settings.update_settings = Desar configuració +settings.update_mirror_settings = Actualitzar la configuració del mirall +settings.branches.add_new_rule = Afegir una nova regla +settings.wiki_desc = Activar la wiki del repositori +settings.wiki_globally_editable = Permet a tothom editar la wiki +settings.use_internal_wiki = Usar la wiki pròpia +settings.use_external_wiki = Usar una wiki externa +settings.external_wiki_url = URL de la wiki externa +settings.external_wiki_url_error = L'URL de la wiki externa no és vàlida. +settings.external_wiki_url_desc = Els visitants es redirigiran a l'URL de la wiki externa quan facin clic a la pestanya wiki. +settings.enable_timetracker = Activar el seguiment de temps +settings.pulls_desc = Activar les «pull requests» del repositori +settings.pulls.enable_autodetect_manual_merge = Activar la detecció automàtica de les fusions manuals (Nota: En alguns casos, la detecció es pot equivocar) +settings.projects_desc = Activar els projectes del repositori +settings.actions_desc = Activar la «pipeline» CI/CD integrada amb Forgejo Actions +settings.admin_enable_health_check = Activar les comprovacions de salut del repositori (git fsck) +settings.reindex_button = Afegir per reindexar la cua +settings.convert_desc = Podeu convertir aquest mirall en un repositori normal. Aquesta acció no es pot desfer. +settings.convert_notices_1 = Aquesta operació convertirà el mirall en un repositori normal i no es pot desfer. +settings.convert_succeed = El mirall s'ha convertit en un repositori normal. +settings.convert_fork = Convertir a un repositori normal +settings.convert_fork_desc = Podeu convertir aquesta bifurcació en un repositori normal. Aquesta acció no es pot desfer. +settings.convert_fork_notices_1 = Aquesta operació convertirà la bifurcació en un repositori normal i no es pot desfer. +settings.convert_fork_succeed = La bifurcació s'ha convertit en un repositori normal. +settings.transfer_in_progress = Hi ha una transferència en procés. Si us plau, cancel·leu-la si voleu transferir aquest repositori a un altre usuari. +settings.transfer_quota_exceeded = El nou propietari (%s) ha superat la quota. El repositori no s'ha transferit. +settings.signing_settings = Configuració de la verificació de signatures +settings.trust_model = Model de confiança de signatures +settings.trust_model.default = Model de confiança per defecte +settings.trust_model.default.desc = Usar el model de confiança per defecte del repositori per a aquesta instal·lació. +settings.wiki_rename_branch_main = Normalitzar el nom de branca de la wiki +settings.wiki_rename_branch_main_desc = Reanomena la branca interna de la wiki a "%s". Aquest canvi és permanent i no es pot desfer. +settings.wiki_rename_branch_main_notices_1 = Aquesta operació NO es pot desfer. +settings.wiki_branch_rename_success = El nom de branca de la wiki del repositori s'ha normalitzat correctament. +settings.wiki_branch_rename_failure = No s'ha pogut normalitzar el nom de branca de la wiki del repositori. +settings.confirm_wiki_branch_rename = Reanomenar la branca de la wiki +settings.wiki_delete = Eliminar les dades de la wiki +settings.wiki_delete_desc = Eliminar les dades de la wiki del repositori és una acció permanent i no es pot desfer. +settings.wiki_delete_notices_1 = - Això eliminarà permanentment i desactivarà la wiki del repositori %s. +settings.confirm_wiki_delete = Eliminar les dades de la wiki +settings.wiki_deletion_success = Les dades de la wiki del repositori s'han eliminat. +settings.delete = Eliminar aquest repositori +settings.delete_desc = Eliminar un repositori és permanent i no es pot desfer. +settings.delete_notices_1 = - Aquesta operació NO es pot desfer. +settings.delete_notices_2 = - Aquesta operació eliminarà permanentment el repositori %s, incloent el codi, les incidències, els comentaris, la wiki i les configuracions dels col·laboradors. +settings.delete_notices_fork_1 = - Les bifurcacions d'aquest repositori esdevindran independents després de l'eliminació. +settings.deletion_success = El repositori s'ha eliminat. +settings.update_settings_success = S'ha actualitzat la configuració del repositori. +settings.update_settings_no_unit = El repositori hauria de permetre algun tipus d'interacció. +settings.confirm_delete = Eliminar repositori +settings.add_collaborator = Afegir col·laborador +settings.add_collaborator_success = El col·laborador s'ha afegit. +settings.add_collaborator_inactive_user = No podeu afegir un usuari inactiu com a col·laborador. +settings.add_collaborator_owner = No podeu afegir un propietari com a col·laborador. +settings.add_collaborator_duplicate = Aquesta col·laborador ja està afegit al repositori. +settings.add_collaborator_blocked_our = No podeu afegir aquest col·laborador perquè el propietari del repositori l'ha bloquejat. +settings.add_collaborator_blocked_them = No podeu afegir aquest col·laborador perquè ha bloquejat el propietari del repositori. +settings.collaborator_deletion = Suprimir col·laborador +settings.collaborator_deletion_desc = Suprimir un col·laborador en traurà l'accés al repositori. Continuar? +settings.remove_collaborator_success = El col·laborador s'ha suprimit. +settings.org_not_allowed_to_be_collaborator = No podeu afegir una organització com a col·laborador. +settings.change_team_access_not_allowed = Només el propietari de l'organització pot canviar l'accés d'equip en aquest repositori +settings.team_not_in_organization = L'equip no és en la mateixa organització que el repositori +settings.add_team_duplicate = L'equip ja té el repositori +settings.add_team_success = L'equip ara tindrà accés al repositori. +settings.change_team_permission_tip = Els permisos de l'equip es configuren a la pàgina de l'equip i no es poden canviar individualment per repositori +settings.add_webhook = Afegir webhook +settings.add_webhook.invalid_channel_name = El nom del canal webhook no pot ser buit i no pot contenir només un #. +settings.add_webhook.invalid_path = El camí no pot contenir ".", ".." o una cadena buida. Tampoc pot començar o acabar amb una barra "/". +settings.webhook_deletion = Eliminar webhook +settings.webhook_deletion_desc = Eliminar un webhook n'elimina la configuració i la història de lliurament. Continuar? +settings.webhook_deletion_success = S'ha eliminat el webhook. + [user] unblock = Desbloquejar followers_one = %d seguidor @@ -1601,6 +2303,8 @@ public_activity.visibility_hint.self_private_profile = La vostra activitat és v change_avatar = Canvieu el vostre avatar… joined_on = S'ha unit el %s +starred = Repositoris destacats + [git.filemode] executable_file = Fitxer executable symbolic_link = Enllaç simbòlic @@ -1665,6 +2369,15 @@ teams.invite_team_member = Convidar a %s teams.invite_team_member.list = Invitacions pendents teams.delete_team_title = Eliminar l'equip +members = Membres +teams = Equips +code = Codi +lower_members = membres +lower_repositories = repositoris +org_desc = Descripció +team_name = Nom de l'equip +team_desc = Descripció + [admin] dashboard.cron.finished = Cron: %[1]s ha finalitzat dashboard.delete_inactive_accounts = Suprimir tots els comptes no activats @@ -1675,4 +2388,59 @@ dashboard.delete_missing_repos = Suprimir tots els repositoris que no tinguin el dashboard.delete_missing_repos.started = S'ha iniciat la tasca per suprimir tots els repositoris que no tinguin els fitxers de Git. dashboard.update_mirrors = Actualitzar les rèpliques dashboard.archive_cleanup = Suprimir els arxius de repositori antics -dashboard.memory_allocate_times = Assignacions de memòria \ No newline at end of file +dashboard.memory_allocate_times = Assignacions de memòria +repositories = Repositoris +hooks = Webhooks +users.name = Nom d'usuari +users.full_name = Nom complet +users.activated = Activat +users.admin = Administrador +users.list_status_filter.is_admin = Administrador +emails.activated = Activat +emails.filter_sort.email = Correu electrònic +emails.filter_sort.name = Nom d'usuari +orgs.name = Nom +orgs.teams = Equips +orgs.members = Membres +orgs.new_orga = Nova organització +repos.name = Nom +repos.issues = Problemes +repos.size = Mida +packages.name = Nom +packages.version = Versió +packages.type = Tipus +packages.repository = Repositori +packages.size = Mida +auths.name = Nom +auths.type = Tipus +auths.enabled = Habilitat +auths.host = Amfitrió +auths.port = Port +config.ssh_enabled = Habilitat +config.ssh_port = Port +config.lfs_enabled = Habilitat +config.db_type = Tipus +config.db_host = Amfitrió +config.db_name = Nom +config.db_user = Nom d'usuari +config.db_schema = Esquema +config.db_ssl_mode = SSL +config.db_path = Camí +config.mailer_enabled = Habilitat +config.mailer_name = Nom +monitor.name = Nom +monitor.queue.name = Nom +monitor.queue.type = Tipus +notices.type = Tipus +notices.type_1 = Repositori +notices.desc = Descripció + +[actions] +runners.name = Nom +runners.owner_type = Tipus +runners.description = Descripció +runners.labels = Etiquetes +runners.task_list.repository = Repositori +runners.task_list.commit = Commit +runners.version = Versió +runs.commit = Commit \ No newline at end of file diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 3007546f37..a219068a60 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -9,7 +9,7 @@ sign_in_with_provider=Anmelden mit %s sign_in_or=oder sign_out=Abmelden sign_up=Registrieren -link_account=Account verbinden +link_account=Konto verbinden register=Registrieren version=Version powered_by=Betrieben mit %s @@ -103,7 +103,7 @@ preview=Vorschau loading=Laden … error=Fehler -error404=Die Seite, die du versuchst aufzurufen, existiert nicht, wurde entfernt oder du bist nicht berechtigt, diese anzusehen. +error404=Die Seite, die du versuchst aufzurufen, existiert nicht oder wurde entfernt, oder du bist nicht berechtigt, diese anzusehen. go_back=Zurück never=Niemals @@ -152,7 +152,7 @@ more_items = Mehr Einträge invalid_data = Ungültige Daten: %v copy_generic = In die Zwischenablage kopieren test = Test -error413 = Du hast deine Quota ausgereizt. +error413 = Du hast dein Kontingent ausgereizt. new_repo.title = Neues Repository new_migrate.title = Neue Migration new_org.title = Neue Organisation @@ -202,7 +202,7 @@ table_modal.label.columns = Spalten link_modal.header = Einen Link hinzufügen link_modal.url = URL link_modal.description = Beschreibung -link_modal.paste_reminder = Hinweis: Wenn du einen URL in der Zwischenablage hast, kannst du durch einfügen im Editor direkt einen Link erstellen. +link_modal.paste_reminder = Hinweis: Wenn du einen URL in der Zwischenablage hast, kannst du durch Einfügen im Editor direkt einen Link erstellen. [filter] string.asc=A–Z @@ -244,7 +244,7 @@ path=Pfad sqlite_helper=Dateipfad zur SQLite3-Datenbank.
Gib einen absoluten Pfad an, wenn Forgejo als Service gestartet wird. reinstall_error=Du versuchst, in eine bereits existierende Forgejo-Datenbank zu installieren reinstall_confirm_message=Eine Neuinstallation mit einer bestehenden Forgejo-Datenbank kann mehrere Probleme verursachen. In den meisten Fällen solltest du deine vorhandene „app.ini“ verwenden, um Forgejo auszuführen. Wenn du weißt, was du tust, bestätige die folgenden Angaben: -reinstall_confirm_check_1=Die von der SECRET_KEY in app.ini verschlüsselten Daten können verloren gehen: Benutzer können sich unter Umständen nicht mit 2FA/OTP einloggen und Spiegel könnten nicht mehr richtig funktionieren. Mit der Ankreuzung dieses Kästchens bestätigst du, dass die aktuelle app.ini-Datei den korrekten SECRET_KEY enthält. +reinstall_confirm_check_1=Die vom SECRET_KEY in app.ini verschlüsselten Daten können verloren gehen: Benutzer können sich unter Umständen nicht mit 2FA/OTP einloggen und Spiegel könnten nicht mehr richtig funktionieren. Mit der Ankreuzung dieses Kästchens bestätigst du, dass die aktuelle app.ini-Datei den korrekten SECRET_KEY enthält. reinstall_confirm_check_2=Die Repositorys und Einstellungen müssen eventuell neu synchronisiert werden. Durch das Ankreuzen dieses Kästchens bestätigst du, dass du die Hooks für die Repositorys und die authorized_keys-Datei manuell neu synchronisierst. Du bestätigst, dass du sicherstellst, dass die Repository- und Spiegeleinstellungen korrekt sind. reinstall_confirm_check_3=Du bestätigst, dass du absolut sicher bist, dass diese Forgejo mit der richtigen app.ini läuft, und du sicher bist, dass du neu installieren musst. Du bestätigst, dass du die oben genannten Risiken anerkennst. err_empty_db_path=Der SQLite3-Datenbankpfad darf nicht leer sein. @@ -293,7 +293,7 @@ disable_gravatar.description=Gravatar und andere Drittanbieter-Avatar-Quellen de federated_avatar_lookup=Föderierte Profilbilder einschalten federated_avatar_lookup.description=Profilbilder mittels Libravatar suchen. disable_registration=Registrierung deaktivieren -disable_registration.description=Nur Instanz-Administratoren können neue Benutzerkonten anlegen. Es wird dazu geraten, die Registrierung deaktiviert zu lassen, außer wenn man eine öffentliche Instanz für alle hosten will und bereit ist, mit Spam-Accounts in großer Anzahl umzugehen. +disable_registration.description=Nur Instanz-Administratoren können neue Benutzerkonten anlegen. Es wird dazu geraten, die Registrierung deaktiviert zu lassen, außer wenn man eine öffentliche Instanz für alle hosten will und bereit ist, mit Spam-Konten in großer Anzahl umzugehen. allow_only_external_registration.description=Benutzer können nur über die konfigurierten externe Dienste neue Konten anlegen. openid_signin=OpenID-Anmeldung aktivieren openid_signin.description=Benutzeranmeldung via OpenID aktivieren. @@ -391,8 +391,8 @@ allow_password_change=Verlange vom Benutzer das Passwort zu ändern (empfohlen) reset_password_mail_sent_prompt=Eine Bestätigungs-E-Mail wurde an %s gesendet. Um den Kontowiederherstellungsprozess abzuschließen, überprüfe bitte deinen Posteingang und folge dem angegebenen Link innerhalb von %s. active_your_account=Aktiviere dein Konto account_activated=Konto wurde aktiviert -prohibit_login=Der Account ist gesperrt -prohibit_login_desc=Dein Account ist auf dieser Instanz gesperrt worden. Bitte kontaktiere den Instanz-Administrator. +prohibit_login=Das Konto ist gesperrt +prohibit_login_desc=Dein Konto ist auf dieser Instanz gesperrt worden. Bitte kontaktiere den Instanz-Administrator. resent_limit_prompt=Du hast bereits eine Aktivierungs-E-Mail angefordert. Bitte warte 3 Minuten und probiere es dann nochmal. has_unconfirmed_mail=Hallo %s, du hast eine unbestätigte E-Mail-Adresse (%s). Wenn du keine Bestätigungs-E-Mail erhalten hast oder eine neue senden möchtest, klicke bitte auf den folgenden Button. resend_mail=Aktivierungs-E-Mail erneut verschicken @@ -433,11 +433,11 @@ email_domain_blacklisted=Du kannst dich nicht mit deiner E-Mail-Adresse registri authorize_application=Anwendung autorisieren authorize_redirect_notice=Du wirst zu %s weitergeleitet, wenn du diese Anwendung autorisierst. authorize_application_created_by=Diese Anwendung wurde von %s erstellt. -authorize_application_description=Wenn du diese Anwendung autorisierst, wird sie die Berechtigung erhalten, alle Informationen zu deinem Account zu bearbeiten oder zu lesen. Dies beinhaltet auch private Repositorys und Organisationen. -authorize_title=„%s“ den Zugriff auf deinen Account gestatten? +authorize_application_description=Wenn du diese Anwendung autorisierst, wird sie die Berechtigung erhalten, alle Informationen zu deinem Konto zu bearbeiten oder zu lesen. Dies beinhaltet auch private Repositorys und Organisationen. +authorize_title=„%s“ den Zugriff auf dein Konto gestatten? authorization_failed=Autorisierung fehlgeschlagen authorization_failed_desc=Die Autorisierung ist fehlgeschlagen, da wir eine ungültige Anfrage erkannt haben. Bitte kontaktiere den Betreuer der App, die du zu autorisieren versucht hast. -password_pwned=Das von dir gewählte Passwort befindet sich auf einer List gestohlener Passwörter, die öffentlich verfügbar sind. Bitte versuche es erneut mit einem anderen Passwort und ziehe in Erwägung, auch anderswo deine Passwörter zu ändern. +password_pwned=Das von dir gewählte Passwort befindet sich auf einer Liste gestohlener Passwörter, die öffentlich verfügbar sind. Bitte versuche es erneut mit einem anderen Passwort und ziehe in Erwägung, auch anderswo deine Passwörter zu ändern. password_pwned_err=Anfrage an HaveIBeenPwned konnte nicht abgeschlossen werden change_unconfirmed_email_summary = Ändern der E-Mail-Adresse, an die die Aktivierungsnachricht gesendet wird. change_unconfirmed_email_error = Ändern der E-Mail-Adresse fehlgeschlagen: %v @@ -449,7 +449,7 @@ sign_in_openid = Mit OpenID fortfahren hint_login = Hast du bereits ein Konto? Jetzt anmelden! hint_register = Brauchst du ein Konto? Jetzt registrieren. unauthorized_credentials = Die Zugangsdaten sind inkorrekt oder abgelaufen. Versuchen es erneut oder siehe %s für mehr Informationen -use_onetime_code = Einen One-Time-Code benutzen +use_onetime_code = Einen Einmal-Code benutzen [mail] view_it_on=Auf %s ansehen @@ -467,7 +467,7 @@ activate_email.text=Bitte klicke innerhalb von %s auf folgenden Link, um register_notify=Willkommen bei %s register_notify.text_1=dies ist deine Bestätigungs-E-Mail für %s! register_notify.text_2=Du kannst dich mit dem Benutzernamen „%s“ anmelden -register_notify.text_3=Wenn jemand anderes diesen Account für dich erstellt hat, musst du zuerst dein Passwort setzen. +register_notify.text_3=Wenn jemand anderes dieses Konto für dich erstellt hat, musst du zuerst dein Passwort setzen. reset_password=Stelle dein Konto wieder her reset_password.text=Falls du das warst, klicke bitte innerhalb von %s auf folgenden Link, um dein Konto wiederherzustellen: @@ -516,20 +516,20 @@ admin.new_user.subject = Neuer Benutzer %s hat sich gerade angemeldet admin.new_user.user_info = Benutzerinformationen admin.new_user.text = Bitte hier klicken, um den Benutzer aus dem Admin-Panel zu verwalten. password_change.subject = Dein Passwort wurde geändert -password_change.text_1 = Das Passwort für deinen Account wurde soeben geändert. +password_change.text_1 = Das Passwort für dein Konto wurde soeben geändert. primary_mail_change.subject = Deine primäre E-Mail-Adresse wurde geändert totp_disabled.subject = TOTP wurde deaktiviert -totp_disabled.text_1 = TOTP (Time-based one-time password [zeitbasiertes Einmalpasswort]) wurde auf deinem Account soeben deaktiviert. -totp_disabled.no_2fa = Es sind keine anderen 2FA-Methoden mehr konfiguriert, was bedeutet, dass es nicht mehr nötig ist, sich in deinen Account mit 2FA einzuloggen. +totp_disabled.text_1 = TOTP (Time-based one-time password [zeitbasiertes Einmalpasswort]) wurde auf deinem Konto soeben deaktiviert. +totp_disabled.no_2fa = Es sind keine anderen 2FA-Methoden mehr konfiguriert, was bedeutet, dass es nicht mehr nötig ist, sich in dein Konto mit 2FA einzuloggen. removed_security_key.subject = Ein Sicherheitsschlüssel wurde entfernt -removed_security_key.no_2fa = Es sind keine anderen 2FA-Methoden mehr konfiguriert, was bedeutet, dass es nicht mehr nötig ist, sich in deinen Account mit 2FA einzuloggen. +removed_security_key.no_2fa = Es sind keine anderen 2FA-Methoden mehr konfiguriert, was bedeutet, dass es nicht mehr nötig ist, sich in dein Konto mit 2FA einzuloggen. account_security_caution.text_1 = Wenn du das warst, kannst du diese E-Mail bedenkenlos ignorieren. -removed_security_key.text_1 = Sicherheitsschlüssel „%[1]s“ wurde soeben von deinem Account entfernt. -primary_mail_change.text_1 = Die primäre E-Mail-Adresse deines Account wurde soeben zu %[1]s geändert. Das bedeutet, dass diese E-Mail-Adresse keine E-Mail-Benachrichtigungen für deinen Account erhalten wird. -account_security_caution.text_2 = Wenn du das nicht warst, wurde dein Account kompromittiert. Bitte kontaktiere die Admins dieser Webseite. +removed_security_key.text_1 = Sicherheitsschlüssel „%[1]s“ wurde soeben aus deinem Konto entfernt. +primary_mail_change.text_1 = Die primäre E-Mail-Adresse deines Kontos wurde soeben zu %[1]s geändert. Das bedeutet, dass diese E-Mail-Adresse keine E-Mail-Benachrichtigungen für dein Konto erhalten wird. +account_security_caution.text_2 = Wenn du das nicht warst, wurde dein Konto kompromittiert. Bitte kontaktiere die Admins dieser Webseite. totp_enrolled.subject = Du hast TOTP als 2FA-Methode aktiviert -totp_enrolled.text_1.has_webauthn = Du hast gerade eben TOTP für deinen Account aktiviert. Das bedeutet, dass du in Zukunft für alle Logins in deinen Account TOTP als 2FA-Methode oder einen deiner Sicherheitsschlüssel benutzen könntest. -totp_enrolled.text_1.no_webauthn = Du hast gerade eben TOTP für deinen Account aktiviert. Das bedeutet, dass du in Zukunft für alle Logins in deinen Account TOTP als 2FA-Methode benutzen musst. +totp_enrolled.text_1.has_webauthn = Du hast gerade eben TOTP für dein Konto aktiviert. Das bedeutet, dass du in Zukunft für alle Logins in dein Konto TOTP als 2FA-Methode oder einen deiner Sicherheitsschlüssel benutzen könntest. +totp_enrolled.text_1.no_webauthn = Du hast gerade eben TOTP für dein Konto aktiviert. Das bedeutet, dass du in Zukunft für alle Logins in dein Konto TOTP als 2FA-Methode benutzen musst. [modal] yes=Ja @@ -568,7 +568,7 @@ url_error=`„%s“ ist keine gültige URL.` include_error=` muss den Text „%s“ enthalten.` glob_pattern_error=` Glob-Pattern ist ungültig: %s.` regex_pattern_error=` regex ist ungültig: %s.` -username_error=` darf nur alphanumerische Zeichen („0-9“, „a-z“, „A-Z“), Bindestriche („-“), Unterstriche („_“) und Punkte („.“) enthalten. Es kann nicht mit nicht-alphanumerischen Zeichen beginnen oder enden und aufeinanderfolgende nicht-alphanumerische Zeichen sind ebenfalls verboten.` +username_error=` darf nur alphanumerische Zeichen („0-9“, „a-z“, „A-Z“), Bindestriche („-“), Unterstriche („_“) und Punkte („.“) enthalten. Es darf nicht mit nicht-alphanumerischen Zeichen beginnen oder enden, und aufeinanderfolgende nicht-alphanumerische Zeichen sind ebenfalls verboten.` invalid_group_team_map_error=` Zuordnung ist ungültig: %s` unknown_error=Unbekannter Fehler: captcha_incorrect=Der eingegebene CAPTCHA-Code ist falsch. @@ -625,7 +625,7 @@ target_branch_not_exist=Der Ziel-Branch existiert nicht. username_error_no_dots = ` darf nur alphanumerische Zeichen („0-9“, „a-z“, „A-Z“), Bindestriche („-“), Unterstriche („_“) enthalten. Es kann nicht mit nicht-alphanumerischen Zeichen beginnen oder enden und aufeinanderfolgende nicht-alphanumerische Zeichen sind ebenfalls verboten.` admin_cannot_delete_self = Du kannst dich nicht selbst löschen, wenn du ein Admin bist. Bitte entferne zuerst deine Adminrechte. unset_password = Für den Benutzer ist das Passwort nicht gesetzt. -unsupported_login_type = Dieser Login-Typ unterstützt keine Accountlöschung. +unsupported_login_type = Dieser Login-Typ unterstützt keine Kontolöschung. required_prefix = Eingabe muss mit „%s“ anfangen Description = Beschreibung FullName = Vollständiger Name @@ -678,9 +678,9 @@ following.title.few = Folgt followers.title.one = Follower public_activity.visibility_hint.self_public = Deine Aktivität ist sichtbar für alle, außer für Interaktionen in privaten Räumen. Konfigurieren. public_activity.visibility_hint.admin_public = Diese Aktivität ist sichtbar für alle, aber als Administrator kannst du außerdem Interaktionen in privaten Räumen sehen. -public_activity.visibility_hint.self_private = Deine Aktivität ist nur sichtbar für dich und den Instanzadministratoren. Konfigurieren. +public_activity.visibility_hint.self_private = Deine Aktivität ist nur sichtbar für dich und die Instanzadministratoren. Konfigurieren. public_activity.visibility_hint.admin_private = Diese Aktivität ist sichtbar für dich, weil du ein Administrator bist, aber der Benutzer will sie privat halten. -public_activity.visibility_hint.self_private_profile = Deine Aktivität ist nur für dich und die Instanzadministratoren sichtbar, weil den Profil privat ist. Konfigurieren. +public_activity.visibility_hint.self_private_profile = Deine Aktivität ist nur für dich und die Instanzadministratoren sichtbar, weil dein Profil privat ist. Konfigurieren. [settings] profile=Profil @@ -699,7 +699,7 @@ organization=Organisationen uid=UID webauthn=Zwei-Faktor-Authentifizierung (Sicherheitsschlüssel) -public_profile=Öffentliches profil +public_profile=Öffentliches Profil biography_placeholder=Erzähle anderen ein wenig über dich selbst! (Markdown wird unterstützt) location_placeholder=Teile deinen ungefähren Standort mit anderen profile_desc=Über dich @@ -789,16 +789,16 @@ add_email_success=Die neue E-Mail-Addresse wurde hinzugefügt. email_preference_set_success=E-Mail-Einstellungen wurden erfolgreich aktualisiert. add_openid_success=Die neue OpenID-Adresse wurde hinzugefügt. keep_email_private=E-Mail-Adresse verbergen -keep_email_private_popup=Die E-Mail-Adresse wird nicht im Profil angezeigt und wird nicht der Standard für Commits über das Webinterface sein, wie zum Beispiel Dateiuploads, Bearbeitungen, und Merge-Commits. Stattdessen kann eine besondere Adresse %s benutzt werden, um Commits mit dem Benutzeraccount zu verbinden. Diese Option wirkt sich nicht auf bestehende Commits aus. +keep_email_private_popup=Die E-Mail-Adresse wird nicht im Profil angezeigt und wird nicht der Standard für Commits über das Webinterface sein, wie zum Beispiel Dateiuploads, Bearbeitungen und Merge-Commits. Stattdessen kann eine besondere Adresse %s benutzt werden, um Commits mit dem Benutzerkonto zu verbinden. Diese Option wirkt sich nicht auf bestehende Commits aus. openid_desc=Mit OpenID kannst du dich über einen Drittanbieter authentifizieren. manage_ssh_keys=SSH-Schlüssel verwalten manage_ssh_principals=SSH-Zertifikats-Principals verwalten manage_gpg_keys=GPG-Schlüssel verwalten add_key=Schlüssel hinzufügen -ssh_desc=Diese öffentlichen SSH-Schlüssel sind mit deinem Account verbunden. Der dazugehörigen privaten SSH-Schlüssel geben dir vollen Zugriff auf deine Repositorys. Verifizierte SSH-Schlüssel können verwendet werden, um SSH-signierte Git-Commits zu signieren. +ssh_desc=Diese öffentlichen SSH-Schlüssel sind mit deinem Konto verbunden. Die dazugehörigen privaten SSH-Schlüssel geben dir vollen Zugriff auf deine Repositorys. Verifizierte SSH-Schlüssel können verwendet werden, um SSH-signierte Git-Commits zu signieren. principal_desc=Diese SSH-Zertifikat-Principals sind mit deinem Konto verknüpft und erlauben den vollen Zugriff auf deine Repositorys. -gpg_desc=Diese öffentlichen GPG-Schlüssel sind mit deinem Account verbunden und werden benutzt, um deine Commits zu verifizieren. Halte die dazugehörigen privaten GPG-Schlüssel geheim, da diese deine Commits signieren. +gpg_desc=Diese öffentlichen GPG-Schlüssel sind mit deinem Konto verbunden und werden benutzt, um deine Commits zu verifizieren. Halte die dazugehörigen privaten GPG-Schlüssel geheim, da diese deine Commits signieren. ssh_helper=Brauchst du Hilfe? Sieh dir die Anleitung zum Erzeugen deiner eigenen SSH-Schlüssel an oder zum Lösen häufiger Probleme, denen du bei der Arbeit mit SSH begegnen kannst. gpg_helper=Brauchst du Hilfe? Sieh dir die Anleitung über GPG an. key_content_ssh_placeholder=Startet mit „ssh-ed25519“, „ssh-rsa“, „ecdsa-sha2-nistp256“, „ecdsa-sha2-nistp384“, „ecdsa-sha2-nistp521“, „sk-ecdsa-sha2-nistp256@openssh.com“ oder „sk-ssh-ed25519@openssh.com“ @@ -814,7 +814,7 @@ gpg_key_matched_identities_long=Die eingebetteten Identitäten in diesem Schlüs gpg_key_verified=Verifizierter Schlüssel gpg_key_verified_long=Der Schlüssel wurde mit einem Token verifiziert. Er kann verwendet werden, um Commits zu verifizieren, die mit irgendeiner für diesen Nutzer aktivierten E-Mail-Adresse und irgendeiner Identität dieses Schlüssels übereinstimmen. gpg_key_verify=Verifizieren -gpg_invalid_token_signature=Der GPG-Key, die Signatur und das Token stimmen nicht überein, oder das Token ist veraltet. +gpg_invalid_token_signature=Der GPG-Schlüssel, die Signatur und das Token stimmen nicht überein, oder das Token ist veraltet. gpg_token_required=Du musst eine Signatur für das folgende Token angeben gpg_token=Token gpg_token_help=Du kannst eine Signatur wie folgt generieren: @@ -830,7 +830,7 @@ ssh_token=Token ssh_token_help=Sie können eine Signatur wie folgt generieren: ssh_token_signature=SSH-Textsignatur (armored signature) key_signature_ssh_placeholder=Beginnt mit „-----BEGIN SSH SIGNATURE-----“ -verify_ssh_key_success=SSH-Key „%s“ wurde verifiziert. +verify_ssh_key_success=SSH-Schlüssel „%s“ wurde verifiziert. subkeys=Unterschlüssel key_id=Schlüssel-ID key_name=Schlüsselname @@ -906,12 +906,12 @@ oauth2_regenerate_secret=Geheimnis neu generieren oauth2_regenerate_secret_hint=Geheimnis verloren? oauth2_client_secret_hint=Das Geheimnis wird nach dem Verlassen oder Aktualisieren dieser Seite nicht mehr angezeigt. Bitte stelle sicher, dass du es gespeichert hast. oauth2_application_edit=Bearbeiten -oauth2_application_create_description=OAuth2-Anwendungen geben deiner Drittanwendung Zugriff auf Benutzeraccounts dieser Forgejo-Instanz. +oauth2_application_create_description=OAuth2-Anwendungen geben deiner Drittanwendung Zugriff auf Benutzerkonten dieser Forgejo-Instanz. oauth2_application_remove_description=Das Entfernen einer OAuth2-Anwendung hat zur Folge, dass diese nicht mehr auf autorisierte Benutzeraccounts auf dieser Instanz zugreifen kann. Möchtest Du fortfahren? oauth2_application_locked=Wenn es in der Konfiguration aktiviert ist, registriert Forgejo einige OAuth2-Anwendungen beim Starten vor. Um unerwartetes Verhalten zu verhindern, können diese weder bearbeitet noch entfernt werden. Weitere Informationen findest Du in der OAuth2-Dokumentation. authorized_oauth2_applications=Autorisierte OAuth2-Anwendungen -authorized_oauth2_applications_description=Den folgenden Drittanbieter-Apps hast du Zugriff auf deinen persönlichen Forgejo-Account gewährt. Bitte widerrufe die Autorisierung für Apps, die nicht länger verwendet werden. +authorized_oauth2_applications_description=Den folgenden Drittanbieter-Apps hast du Zugriff auf dein persönliches Forgejo-Konto gewährt. Bitte widerrufe die Autorisierung für Apps, die nicht länger verwendet werden. revoke_key=Widerrufen revoke_oauth2_grant=Autorisierung widerrufen revoke_oauth2_grant_description=Wenn du die Autorisierung widerrufst, kann die Anwendung nicht mehr auf deine Daten zugreifen. Bist du dir sicher? @@ -926,7 +926,7 @@ twofa_scratch_token_regenerated=Dein einmalig verwendbarer Wiederherstellungssch twofa_enroll=Zwei-Faktor-Authentifizierung aktivieren twofa_disable_note=Du kannst die Zwei-Faktor-Authentifizierung auch wieder deaktivieren. twofa_disable_desc=Wenn du die Zwei-Faktor-Authentifizierung deaktivierst, wird die Sicherheit deines Kontos verringert. Fortfahren? -regenerate_scratch_token_desc=Wenn du deinen Wiederherstellungsschlüssel verlegst oder es bereits benutzt hast, kannst du es hier zurücksetzen. +regenerate_scratch_token_desc=Wenn du deinen Wiederherstellungsschlüssel verlegst oder ihn bereits benutzt hast, kannst du ihn hier zurücksetzen. twofa_disabled=Zwei-Faktor-Authentifizierung wurde deaktiviert. scan_this_image=Scanne diese Grafik mit deiner Authentifizierungs-App: or_enter_secret=Oder gib das Geheimnis ein: %s @@ -941,12 +941,12 @@ webauthn_nickname=Nickname webauthn_delete_key=Sicherheitsschlüssel entfernen webauthn_delete_key_desc=Wenn du einen Sicherheitsschlüssel entfernst, kannst du dich nicht mehr mit ihm anmelden. Fortfahren? -manage_account_links=Verknüpfte Accounts +manage_account_links=Verknüpfte Konten manage_account_links_desc=Diese externen Accounts sind mit deinem Forgejo-Account verknüpft. -link_account=Account verbinden -remove_account_link=Verknüpften Account entfernen -remove_account_link_desc=Wenn du den verknüpften Account entfernst, wirst du darüber nicht mehr auf deinen Forgejo-Account zugreifen können. Fortfahren? -remove_account_link_success=Der verknüpfte Account wurde entfernt. +link_account=Konto verbinden +remove_account_link=Verknüpftes Konto entfernen +remove_account_link_desc=Wenn du das verknüpfte Konto entfernst, wirst du darüber nicht mehr auf dein Forgejo-Konto zugreifen können. Fortfahren? +remove_account_link_success=Das verknüpfte Konto wurde entfernt. hooks.desc=Webhooks hinzufügen, die für alle Repositorys, die dir gehören, ausgelöst werden. @@ -955,7 +955,7 @@ repos_none=Du besitzt keine Repositorys. delete_account=Konto löschen delete_prompt=Wenn du fortfährst, wird dein Account permanent gelöscht. Dies KANN NICHT rückgängig gemacht werden. -delete_with_all_comments=Dein Account existiert seit weniger als %s. Um Geisterkommentare zu vermeiden, werden alle deine Issue/PR-Kommentare gelöscht. +delete_with_all_comments=Dein Konto existiert seit weniger als %s. Um Geisterkommentare zu vermeiden, werden alle deine Issue/PR-Kommentare gelöscht. confirm_delete_account=Löschen bestätigen delete_account_title=Benutzerkonto löschen delete_account_desc=Bist du sicher, dass du diesen Account dauerhaft löschen möchtest? @@ -994,12 +994,12 @@ keep_activity_private.description = Deine öffentliche AktivitätMehr erfahren. language.description = Diese Sprache wird in deinem Konto gespeichert und standardmäßig nach dem Anmelden benutzt. user_block_yourself = Du kannst dich nicht selbst blockieren. -change_username_redirect_prompt.with_cooldown.one = Der alte Benutzername ist nach einer Schutzzeit von einem Tag wieder für alle verfügbar. Du kannst den alten Benutzername während dieser Schutzzeit erneut beanspruchen. -change_username_redirect_prompt.with_cooldown.few = Der alte Benutzername ist nach einer Schutzzeit von %[1]d Tagen wieder für alle verfügbar. Du kannst den alten Benutzername während dieser Schutzzeit erneut beanspruchen. +change_username_redirect_prompt.with_cooldown.one = Der alte Benutzername ist nach einer Schutzzeit von einem Tag wieder für alle verfügbar. Du kannst den alten Benutzernamen während dieser Schutzzeit erneut beanspruchen. +change_username_redirect_prompt.with_cooldown.few = Der alte Benutzername ist nach einer Schutzzeit von %[1]d Tagen wieder für alle verfügbar. Du kannst den alten Benutzernamen während dieser Schutzzeit erneut beanspruchen. keep_pronouns_private = Pronomen nur angemeldeten Nutzern anzeigen keep_pronouns_private.description = Dies verbirgt deine Pronomen von Besuchern, die nicht angemeldet sind. quota.sizes.assets.artifacts = Artefakte -quota.applies_to_user = Die folgenden Quota-Regeln greifen für deinen Account +quota.applies_to_user = Die folgenden Quota-Regeln greifen für dein Konto quota.sizes.assets.attachments.issues = Issue-Anhänge quota.rule.exceeded.helper = Die Gesamtgröße der Objekte für diese Regel hat die Quota überschritten. storage_overview = Speicherübersicht @@ -1018,9 +1018,9 @@ quota.sizes.assets.all = Assets quota.sizes.assets.attachments.all = Anhänge quota.sizes.assets.packages.all = Pakete quota.sizes.wiki = Wiki -regenerate_token_success = Der Token wurde regeneriert. Anwendungen, die ihn benutzen, haben nicht länger Zugriff auf deinen Account und müssen mit dem neuen Token aktualisiert werden. +regenerate_token_success = Der Token wurde regeneriert. Anwendungen, die ihn benutzen, haben nicht länger Zugriff auf dein Konto und müssen mit dem neuen Token aktualisiert werden. access_token_regeneration = Zugangstoken regenerieren -access_token_regeneration_desc = Einen Token zu regenerieren, wird den Zugriff auf deinen Account von Anwendungen, die ihn nutzen, zurückziehen. Dies kann nicht rückgängig gemacht werden. Fortsetzen? +access_token_regeneration_desc = Einen Token zu regenerieren, wird den Zugriff auf dein Konto von Anwendungen, die ihn nutzen, zurückziehen. Dies kann nicht rückgängig gemacht werden. Fortsetzen? regenerate_token = Regenerieren ssh_token_help_ssh_agent = , oder, falls Sie einen SSH-Agenten benutzen (mit der Variable SSH_AUTH_SOCK gesetzt): @@ -1058,12 +1058,12 @@ repo_desc=Beschreibung repo_desc_helper=Gib eine kurze Beschreibung an (optional) repo_lang=Sprache repo_gitignore_helper=Wähle .gitignore-Vorlagen aus -repo_gitignore_helper_desc=Wähle aus einer Liste an Vorlagen für bekannte Sprachen, welche Dateien ignoriert werden sollen. Typische Artefakte, die durch die Build-Tools der gewählten Sprache generiert werden, sind standardmäßig Bestandteil der .gitignore. +repo_gitignore_helper_desc=Wähle aus einer Liste an Vorlagen für bekannte Sprachen, welche Dateien ignoriert werden sollen. Typische Artefakte, die durch die Build-Werkzeuge der gewählten Sprache generiert werden, sind standardmäßig Bestandteil der .gitignore. issue_labels=Labels issue_labels_helper=Wähle eine Label-Sammlung license=Lizenz license_helper=Wähle eine Lizenz -license_helper_desc=Eine Lizenz regelt, was andere mit deinem Code tun (oder nicht tun) können. Unsicher, welche für dein Projekt die richtige ist? Siehe Choose a license. +license_helper_desc=Eine Lizenz regelt, was andere mit deinem Code tun (oder nicht tun) dürfen. Unsicher, welche für dein Projekt die richtige ist? Siehe Choose a license. readme=README readme_helper=Wähle eine README-Vorlage readme_helper_desc=Hier kannst du eine komplette Beschreibung für dein Projekt schreiben. @@ -1079,7 +1079,7 @@ mirror_interval_invalid=Das Spiegel-Intervall ist ungültig. mirror_sync_on_commit=Synchronisieren, wenn Commits gepusht wurden mirror_address=Klonen via URL mirror_address_desc=Gib alle erforderlichen Anmeldedaten im Abschnitt „Authentifizierung“ ein. -mirror_address_url_invalid=Die angegebene URL ist ungültig. Achte darauf, dass alle Komponenten der URL korrekt escaped wurden. +mirror_address_url_invalid=Die angegebene URL ist ungültig. Achte darauf, dass alle Komponenten der URL korrekt escapt wurden. mirror_address_protocol_invalid=Die angegebene URL ist ungültig. Nur Orte mit „http(s)://“ oder „git://“ können fürs Spiegeln benutzt werden. mirror_lfs=Großdatei-Speicher (LFS) mirror_lfs_desc=Spiegeln von LFS-Dateien aktivieren. @@ -1139,7 +1139,7 @@ template.one_item=Es muss mindestens ein Vorlagenelement ausgewählt werden template.invalid=Es muss ein Vorlagen-Repository ausgewählt werden archive.title=Dieses Repository ist archiviert. Du kannst Dateien ansehen und es klonen, kannst aber seinen Status nicht verändern, zum Beispiel nichts pushen, keine Issues eröffnen und keine Pull-Requests oder Kommentare erstellen. -archive.title_date=Dieses Repository wurde am %s archiviert. Du kannst Dateien ansehen und es klonen, kannst aber seinen Status nicht verändern, zum Beispiel nichts pushen, und keine Issues eröffnen, oder Pull-Requests oder Kommentare erstellen. +archive.title_date=Dieses Repository wurde am %s archiviert. Du kannst Dateien ansehen und es klonen, kannst aber seinen Status nicht verändern, zum Beispiel nichts pushen, und keine Issues eröffnen oder Pull-Requests oder Kommentare erstellen. form.reach_limit_of_creation_1=Du hast bereits dein Limit von %d Repository erreicht. form.reach_limit_of_creation_n=Du hast bereits dein Limit von %d Repositorys erreicht. form.name_reserved=Der Repository-Name „%s“ ist reserviert. @@ -1669,7 +1669,7 @@ issues.due_date_added=hat %[2]s das Fälligkeitsdatum %[1]s hinzugefügt issues.due_date_modified=hat das Fälligkeitsdatum von %[2]s auf %[1]s %[3]s geändert issues.due_date_remove=hat %[2]s das Fälligkeitsdatum %[1]s entfernt issues.due_date_overdue=Überfällig -issues.due_date_invalid=Das Fälligkeitsdatum ist ungültig oder außerhalb des zulässigen Bereichs. Bitte verwende das Format „jjjj-mm-tt“. +issues.due_date_invalid=Das Fälligkeitsdatum ist ungültig oder außerhalb des zulässigen Bereichs. Bitte verwende das Format „JJJJ-MM-TT“. issues.dependency.title=Abhängigkeiten issues.dependency.issue_no_dependencies=Keine Abhängigkeiten gesetzt. issues.dependency.pr_no_dependencies=Keine Abhängigkeiten gesetzt. @@ -1788,7 +1788,7 @@ pulls.remove_prefix=Präfix „%s“ entfernen pulls.data_broken=Dieser Pull-Requests ist kaputt, da Fork-Informationen gelöscht wurden. pulls.files_conflicted=Dieser Pull-Request hat Änderungen, die Konflikte mit dem Ziel-Branch haben. pulls.is_checking=Die Merge-Konfliktprüfung läuft noch. Bitte aktualisiere die Seite in wenigen Augenblicken. -pulls.is_ancestor=Dieser Branch ist bereits im Zielbranch enthalten. Es existiert nichts zusammenzuführen. +pulls.is_ancestor=Dieser Branch ist bereits im Zielbranch enthalten. Es existiert nichts zum Zusammenführen. pulls.is_empty=Die Änderungen an diesem Branch sind bereits auf dem Zielbranch. Dies wird ein leerer Commit sein. pulls.required_status_check_failed=Einige erforderliche Prüfungen waren nicht erfolgreich. pulls.required_status_check_missing=Einige erforderliche Prüfungen fehlen. @@ -1826,9 +1826,9 @@ pulls.merge_commit_id=Die Merge-Commit-ID pulls.require_signed_wont_sign=Der Branch erfordert einen signierten Commit, aber dieser Merge wird nicht signiert pulls.invalid_merge_option=Du kannst diese Merge-Option auf diesen Pull-Request nicht anwenden. -pulls.merge_conflict=Merge fehlgeschlagen: Beim Zusammenführen existierte ein Konflikt. Tipp: Probiere eine andere Strategie +pulls.merge_conflict=Merge fehlgeschlagen: Beim Zusammenführen ist ein Konflikt entstanden. Tipp: Probiere eine andere Strategie pulls.merge_conflict_summary=Fehlermeldung -pulls.rebase_conflict=Merge fehlgeschlagen: Es existierte ein Konflikt beim Rebasen des Commits: %[1]s. Tipp: Versuche eine andere Strategie +pulls.rebase_conflict=Merge fehlgeschlagen: Es ist ein Konflikt beim Rebasen des Commits entstanden: %[1]s. Tipp: Versuche eine andere Strategie pulls.rebase_conflict_summary=Fehlermeldung pulls.unrelated_histories=Merge fehlgeschlagen: Der Head des Merges und die Basis haben keinen gemeinsamen Verlauf. Tipp: Versuche eine andere Strategie pulls.merge_out_of_date=Merge fehlgeschlagen: Während des Zusammenführens wurde die Basis aktualisiert. Tipp: Versuche es erneut. @@ -2133,7 +2133,7 @@ settings.trust_model.collaborator.long=Mitarbeiter: Vertraue Signaturen von Mita settings.trust_model.collaborator.desc=Gültige Signaturen von Mitarbeitern dieses Projekts werden als „vertrauenswürdig“ markiert (egal, ob sie mit dem Committer übereinstimmen oder nicht). Andernfalls werden gültige Signaturen als „nicht vertrauenswürdig“ markiert, falls die Signatur zum Committer passt, ansonsten werden sie als „nicht übereinstimmend“ markiert. settings.trust_model.committer=Committer settings.trust_model.committer.long=Committer: Vertraue Signaturen, die zu Committern passen (dies stimmt mit GitHub überein und zwingt signierte Commits von Forgejo dazu, Forgejo als Committer zu haben) -settings.trust_model.committer.desc=Gültige Signaturen werden nur dann als „vertrauenswürdig“ gekennzeichnet, wenn sie mit ihrem Committer übereinstimmen. Ansonsten werden sie als „nicht übereinstimmend“ markiert. Das führt dazu, dass Forgejo auf signierten Commits, bei denen der echte Committer als „Co-authored-by:“ oder „Co-committed-by:“ in der Beschreibung eingetragen wurde, als Committer gilt. Der Forgejo-Standard-Key muss zu einem Benutzer in der Datenbank passen. +settings.trust_model.committer.desc=Gültige Signaturen werden nur dann als „vertrauenswürdig“ gekennzeichnet, wenn sie mit ihrem Committer übereinstimmen. Ansonsten werden sie als „nicht übereinstimmend“ markiert. Das führt dazu, dass Forgejo auf signierten Commits, bei denen der echte Committer als „Co-authored-by:“ oder „Co-committed-by:“ in der Beschreibung eingetragen wurde, als Committer gilt. Der Forgejo-Standard-Schlüssel muss zu einem Benutzer in der Datenbank passen. settings.trust_model.collaboratorcommitter=Mitarbeiter+Committer settings.trust_model.collaboratorcommitter.long=Mitarbeiter+Committer: Signaturen der Mitarbeiter vertrauen die mit dem Committer übereinstimmen settings.trust_model.collaboratorcommitter.desc=Gültige Signaturen von Mitarbeitern dieses Projekts werden als „vertrauenswürdig“ markiert, wenn sie mit dem Committer übereinstimmen. Andernfalls werden gültige Signaturen als „nicht vertrauenswürdig“ markiert, wenn die Signatur mit dem Committer übereinstimmt. Ansonsten werden sie als „nicht übereinstimmend“ markiert. Dies zwingt Forgejo, als Committer bei signierten Commits mit dem echten Committer als „Co-Authored-By:“ und „Co-Committed-By:“ im Commit zu markieren. Der Standard-Forgejo-Schlüssel muss mit einem Benutzer in der Datenbank übereinstimmen. @@ -2254,7 +2254,7 @@ settings.event_pull_request_merge=Pull-Request-Merge settings.event_package=Paket settings.event_package_desc=Paket wurde in einem Repository erstellt oder gelöscht. settings.branch_filter=Branch-Filter -settings.branch_filter_desc=Positivliste für Branches für Push-, Erzeugungs- und Löschevents, als glob-Pattern beschrieben. Es werden Events für alle Branches gemeldet, falls das Pattern * ist oder falls es leer ist. Siehe die %[2]s-Dokumentation für die Syntax (Englisch). Beispiele: master, {master,release*}. +settings.branch_filter_desc=Positivliste für Branches für Push-, Erzeugungs- und Löschevents, als Glob-Muster beschrieben. Es werden Ereignisse für alle Branches gemeldet, falls das Muster * ist oder falls es leer ist. Siehe die %[2]s-Dokumentation für die Syntax (Englisch). Beispiele: master, {master,release*}. settings.authorization_header=Authorization-Header settings.authorization_header_desc=Wird, falls vorhanden, als Authorization-Header mitgesendet. Beispiele: %s. settings.active=Aktiv @@ -2286,9 +2286,9 @@ settings.web_hook_name_packagist=Packagist settings.packagist_username=Benutzername für Packagist settings.packagist_api_token=API-Token settings.packagist_package_url=Paket-URL -settings.deploy_keys=Deploy-Keys -settings.add_deploy_key=Deploy-Key hinzufügen -settings.deploy_key_desc=Deploy-Keys können Nur-Lese-Zugriff oder Lese- und Schreibzugriff auf das Repository haben. +settings.deploy_keys=Deploy-Schlüssel +settings.add_deploy_key=Deploy-Schlüssel hinzufügen +settings.deploy_key_desc=Deploy-Schlüssel können Nur-Lese-Zugriff oder Lese-und-Schreib-Zugriff auf das Repository haben. settings.is_writable=Erlaube Schreibzugriff settings.is_writable_info=Erlaube diesem Deploy-Key auf das Repository zu pushen. settings.no_deploy_keys=Noch keine Deploy-Keys vorhanden. @@ -2296,8 +2296,8 @@ settings.title=Titel settings.deploy_key_content=Inhalt settings.key_been_used=Ein Deploy-Key mit identischem Inhalt wird bereits verwendet. settings.key_name_used=Ein Deploy-Key mit diesem Namen existiert bereits. -settings.add_key_success=Der Deploy-Key „%s“ wurde erfolgreich hinzugefügt. -settings.deploy_key_deletion=Deploy-Key löschen +settings.add_key_success=Der Deploy-Schlüssel „%s“ wurde erfolgreich hinzugefügt. +settings.deploy_key_deletion=Deploy-Schlüssel löschen settings.deploy_key_deletion_desc=Nach dem Löschen wird dieser Deploy-Key keinen Zugriff mehr auf dieses Repository haben. Fortfahren? settings.deploy_key_deletion_success=Der Deploy-Key wurde entfernt. settings.branches=Branches @@ -2313,7 +2313,7 @@ settings.protect_enable_merge=Merge aktivieren settings.protect_enable_merge_desc=Jeder mit Schreibzugriff darf die Pull-Requests in diesen Branch zusammenführen. settings.protect_whitelist_committers=Positivlisten-eingeschränkter Push settings.protect_whitelist_committers_desc=Jeder, der auf der Whitelist steht, darf in diesen Branch pushen (aber kein Force-Push). -settings.protect_whitelist_deploy_keys=Deploy-Key mit Schreibzugriff zum Pushen whitelisten. +settings.protect_whitelist_deploy_keys=Deploy-Schlüssel mit Schreibzugriff zum Pushen auf die Positivliste setzen. settings.protect_whitelist_users=Nutzer, die pushen dürfen settings.protect_whitelist_teams=Teams, die pushen dürfen settings.protect_merge_whitelist_committers=Merge-Positivliste aktivieren @@ -2323,10 +2323,10 @@ settings.protect_merge_whitelist_teams=Teams, die zusammenführen dürfen settings.protect_check_status_contexts=Statusprüfung aktivieren settings.protect_status_check_patterns=Statuscheck-Muster settings.protect_status_check_patterns_desc=Gib Muster ein, um festzulegen, welche Statusüberprüfungen durchgeführt werden müssen, bevor Branches in einen Branch, der dieser Regel entspricht, zusammenführen werden können. Jede Zeile gibt ein Muster an. Muster dürfen nicht leer sein. -settings.protect_check_status_contexts_desc=Vor dem Zusammenführen müssen Statusprüfungen bestanden werden. Wähle aus, welche Statusprüfungen erfolgreich durchgeführt werden müssen, bevor Branches in einen anderen zusammengeführt werden können, der dieser Regel entspricht. Wenn aktiviert, müssen Commits zuerst auf einen anderen Branch gepusht werden, dann nach bestandener Statusprüfung gemergt oder direkt auf einen Branch gepusht werden, der dieser Regel entspricht. Wenn kein Kontext ausgewählt ist, muss der letzte Commit unabhängig vom Kontext erfolgreich sein. +settings.protect_check_status_contexts_desc=Vor dem Zusammenführen müssen Statusprüfungen bestanden werden. Wähle aus, welche Statusprüfungen erfolgreich durchgeführt werden müssen, bevor Branches in einen anderen zusammengeführt werden können, der dieser Regel entspricht. Wenn aktiviert, müssen Commits zuerst auf einen anderen Branch gepusht werden, dann nach bestandener Statusprüfung zusammengeführt oder direkt auf einen Branch gepusht werden, der dieser Regel entspricht. Wenn kein Kontext ausgewählt ist, muss der letzte Commit unabhängig vom Kontext erfolgreich sein. settings.protect_check_status_contexts_list=Statusprüfungen, die in der letzten Woche für dieses Repository gefunden wurden settings.protect_status_check_matched=Übereinstimmung -settings.protect_invalid_status_check_pattern=Ungültiges Statusprüfungspattern: „%s“. +settings.protect_invalid_status_check_pattern=Ungültiges Statusprüfungsmuster: „%s“. settings.protect_no_valid_status_check_patterns=Keine gültigen Statuscheck-Muster. settings.protect_required_approvals=Erforderliche Genehmigungen settings.protect_required_approvals_desc=Erlaube das Zusammenführen des Pull-Requests nur mit genügend positiven Sichtungen. @@ -2340,7 +2340,7 @@ settings.require_signed_commits=Signierte Commits erforderlich settings.require_signed_commits_desc=Pushes auf diesen Branch ablehnen, wenn Commits nicht signiert oder nicht überprüfbar sind. settings.protect_branch_name_pattern=Muster für geschützte Branchnamen settings.protect_patterns=Muster -settings.protect_protected_file_patterns=Geschützte Dateimuster (durch Semikolon „;“ getrennt) +settings.protect_protected_file_patterns=Muster für geschützte Dateien (durch Semikolon „;“ getrennt) settings.protect_protected_file_patterns_desc=Geschützte Dateien dürfen nicht direkt geändert werden, auch wenn der Benutzer Rechte hat, Dateien in diesem Branch hinzuzufügen, zu bearbeiten oder zu löschen. Mehrere Muster können mit Semikolon („;“) getrennt werden. Siehe %s-Dokumentation zur Mustersyntax. Beispiele: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Ungeschützte Dateimuster (durch Semikolon „;“ getrennt) settings.protect_unprotected_file_patterns_desc=Ungeschützte Dateien, die direkt geändert werden dürfen, wenn der Benutzer Schreibzugriff hat, können die Push-Beschränkung umgehen. Mehrere Muster können mit Semikolon („;“) getrennt werden. Siehe %[2]s-Dokumentation zur Mustersyntax. Beispiele: .drone.yml, /docs/**/*.txt. @@ -2350,13 +2350,13 @@ settings.remove_protected_branch_failed=Entfernen der Branchschutzregel „%s“ settings.protected_branch_deletion=Branch-Schutz löschen settings.protected_branch_deletion_desc=Wenn du den Branch-Schutz deaktivierst, können alle Nutzer mit Schreibrechten auf den Branch pushen. Fortfahren? settings.block_rejected_reviews=Zusammenführung bei abgelehnten Sichtungen blockieren -settings.block_rejected_reviews_desc=Merge ist nicht möglich, wenn Änderungen durch offizielle Prüfer angefragt werden, auch wenn genügend Genehmigungen existieren. +settings.block_rejected_reviews_desc=Zusammenführen ist nicht möglich, wenn Änderungen durch offizielle Prüfer angefragt werden, auch wenn genügend Genehmigungen existieren. settings.block_on_official_review_requests=Merge bei offiziellen Sichtungsanfragen blockieren settings.block_on_official_review_requests_desc=Merge ist nicht möglich, wenn offizielle Sichtungsanfrangen vorliegen, selbst wenn genügend Genehmigungen existieren. settings.block_outdated_branch=Merge blockieren, wenn der Pull-Request veraltet ist settings.block_outdated_branch_desc=Merge ist nicht möglich, wenn der Head-Branch hinter dem Basis-Branch ist. settings.default_branch_desc=Wähle einen Standardbranch für Pull-Requests und Code-Commits: -settings.merge_style_desc=Merge-Styles +settings.merge_style_desc=Merge-Stile settings.default_merge_style_desc=Standard-Mergeverhalten settings.choose_branch=Branch wählen … settings.no_protected_branch=Es gibt keine geschützten Branches. @@ -2615,7 +2615,7 @@ pulls.cmd_instruction_hint = Anweisungen für die Kommandozeile betrachten pulls.cmd_instruction_checkout_title = Auschecken wiki.cancel = Abbrechen settings.wiki_globally_editable = Allen erlauben, das Wiki zu bearbeiten -settings.protect_branch_name_pattern_desc = Geschützte Branch-Namens-Patterns. Siehe die Dokumentation für Pattern-Syntax. Beispiele: main, release/** +settings.protect_branch_name_pattern_desc = Namensmuster für geschützte Branches. Siehe die Dokumentation für Mustersyntax. Beispiele: main, release/** settings.ignore_stale_approvals = Abgestandene Genehmigungen ignorieren settings.ignore_stale_approvals_desc = Genehmigungen, welche für ältere Commits gemacht wurden (abgestandene Sichtungen), nicht in die Gesamtzahl der Genehmigung des PRs mitzählen. Irrelevant, falls abgestandene Sichtungen bereits verworfen werden. pulls.commit_ref_at = `referenzierte diesen Pull-Request aus einem Commit %s` @@ -2685,11 +2685,11 @@ settings.federation_following_repos = URLs folgender Repositorys. Durch „;“ settings.federation_not_enabled = Föderation ist auf deiner Instanz nicht aktiviert. settings.federation_apapiurl = Föderations-URL dieses Repositorys. Kopiere sie und füge sie in die Föderationseinstellungen eines anderen Repositorys als URL eines folgenden Repositorys ein. project = Projekte -comments.edit.already_changed = Die Änderungen an diesem Kommentar können nicht gespeichert werden. Es scheint, als seien die Inhalte bereits durch einen anderen Benutzer verändert worden. Bitte die Seite neu laden und das Bearbeiten erneut versuchen, um deren Änderungen nicht zu überschreiben +comments.edit.already_changed = Die Änderungen an diesem Kommentar können nicht gespeichert werden. Es scheint, als seien die Inhalte bereits durch einen anderen Benutzer verändert worden. Bitte die Seite neu laden und das Bearbeiten erneut versuchen, um dessen Änderungen nicht zu überschreiben issues.edit.already_changed = Die Änderungen an diesem Issue können nicht gespeichert werden. Es scheint, als seien die Inhalte bereits durch einen anderen Benutzer verändert worden. Bitte die Seite neu laden und das Bearbeiten erneut versuchen, um deren Änderungen nicht zu überschreiben -pulls.edit.already_changed = Die Änderungen an diesem Pull-Request können nicht gespeichert werden. Es scheint, als seien die Inhalte bereits durch einen anderen Benutzer verändert worden. Bitte die Seite neu laden und das Bearbeiten erneut versuchen, um deren Änderungen nicht zu überschreiben -subscribe.pull.guest.tooltip = Einloggen, um diesen Pull-Request zu abbonieren. -subscribe.issue.guest.tooltip = Einloggen, um dieses Issue zu abbonieren. +pulls.edit.already_changed = Die Änderungen an diesem Pull-Request können nicht gespeichert werden. Es scheint, als seien die Inhalte bereits durch einen anderen Benutzer verändert worden. Bitte die Seite neu laden und das Bearbeiten erneut versuchen, um dessen Änderungen nicht zu überschreiben +subscribe.pull.guest.tooltip = Anmelden, um diesen Pull-Request zu abbonieren. +subscribe.issue.guest.tooltip = Anmelden, um dieses Issue zu abbonieren. issues.author.tooltip.pr = Dieser Benutzer ist der Autor dieses Pull-Requests. issues.author.tooltip.issue = Dieser Benutzer ist der Autor dieses Issues. activity.commit = Commit-Aktivität @@ -2732,7 +2732,7 @@ issues.num_reviews_one = %d Sichtung issues.summary_card_alt = Zusammenfassung eines Issues mit dem Titel „%s“ im Repository %s issues.num_reviews_few = %d Sichtungen editor.add_tmpl.filename = Dateiname -settings.default_update_style_desc = Standard-Aktualisierungsart um Pull-Requests zu aktualisieren, die hinter dem Base-Branch sind. +settings.default_update_style_desc = Standard-Aktualisierungsart, um Pull-Requests zu aktualisieren, die hinter dem Base-Branch sind. new_advanced = Erweiterte Einstellungen new_advanced_expand = Zum Ausklappen klicken pulls.sign_in_require = Anmelden, um einen neuen Pull-Request zu erstellen. @@ -2758,8 +2758,8 @@ issues.filter_no_results_placeholder = Versuche, deine Suchfilter anzupassen. migrate.repo_desc_helper = Leer lassen, um vorhandene Beschreibung zu importieren archive.nocomment = Kommentieren ist nicht möglich, da das Repository archiviert ist. comment.blocked_by_user = Kommentieren ist nicht möglich, da du vom Repository-Besitzer oder vom Autor blockiert wurdest. -sync_fork.branch_behind_one = Dieser Branch ist %[1]d Commit hinter %[2]s -sync_fork.branch_behind_few = Dieser Branch ist %[1]d Commits hinter %[2]s +sync_fork.branch_behind_one = Dieser Branch hinkt %[1]d Commit hinter %[2]s +sync_fork.branch_behind_few = Dieser Branch hinkt %[1]d Commits hinter %[2]s sync_fork.button = Sync settings.event_action_failure_desc = Action-Run endete im Fehlschlag. settings.event_action_success_desc = Action-Run war erfolgreich. @@ -2944,11 +2944,11 @@ dashboard.delete_inactive_accounts.started=Löschen aller nicht aktivierten Acco dashboard.delete_repo_archives=Lösche alle Repository-Archive (ZIP, TAR.GZ, etc.) dashboard.delete_repo_archives.started=Löschen aller Repository-Archive gestartet. dashboard.delete_missing_repos=Alle Repository-Datensätze mit verloren gegangenen Git-Dateien löschen -dashboard.delete_missing_repos.started=Alle Repositorys löschen, die den Git-File-Task nicht gestartet haben. +dashboard.delete_missing_repos.started=Alle Repositorys löschen, die den Git-Dateien-Task nicht gestartet haben. dashboard.delete_generated_repository_avatars=Generierte Repository-Avatare löschen dashboard.sync_repo_branches=Fehlende Branches aus den Git-Daten in die Datenbank synchronisieren dashboard.update_mirrors=Spiegel aktualisieren -dashboard.repo_health_check=Healthchecks für alle Repositorys ausführen +dashboard.repo_health_check=Health-Prüfungen für alle Repositorys ausführen dashboard.check_repo_stats=Überprüfe alle Repository-Statistiken dashboard.archive_cleanup=Alte Repository-Archive löschen dashboard.deleted_branches_cleanup=Gelöschte Branches bereinigen @@ -2971,13 +2971,13 @@ dashboard.pointer_lookup_times=Anzahl Zeigerlookups dashboard.memory_allocate_times=Speicheranforderungen dashboard.memory_free_times=Speicherfreigaben dashboard.current_heap_usage=Aktuelle Heap-Auslastung -dashboard.heap_memory_obtained=Erhaltener Heap-Memory -dashboard.heap_memory_idle=Unbenutzter Heap-Memory -dashboard.heap_memory_in_use=Benutzter-Heap-Memory -dashboard.heap_memory_released=Freigegebener Heap-Memory +dashboard.heap_memory_obtained=Erhaltener Heap-Arbeitsspeicher +dashboard.heap_memory_idle=Unbenutzter Heap-Arbeitsspeicher +dashboard.heap_memory_in_use=Benutzter-Heap-Arbeitsspeicher +dashboard.heap_memory_released=Freigegebener Heap-Arbeitsspeicher dashboard.heap_objects=Heap-Objekte dashboard.bootstrap_stack_usage=Bootstrap-Stack-Auslastung -dashboard.stack_memory_obtained=Erhaltener Stack-Memory +dashboard.stack_memory_obtained=Erhaltener Stack-Arbeitsspeicher dashboard.mspan_structures_usage=MSpan-Structures-Auslastung dashboard.mspan_structures_obtained=Erhaltene MSpan-Structures dashboard.mcache_structures_usage=MCache-Structures-Auslastung @@ -3003,7 +3003,7 @@ dashboard.sync_branch.started=Synchronisierung der Branches gestartet dashboard.rebuild_issue_indexer=Issue-Indexer neu bauen users.user_manage_panel=Benutzerkonten verwalten -users.new_account=Benutzeraccount erstellen +users.new_account=Benutzerkonto erstellen users.name=Benutzername users.full_name=Vollständiger Name users.activated=Aktiviert @@ -3018,7 +3018,7 @@ users.created=Registriert am users.last_login=Letzte Anmeldung users.never_login=Hat sich noch nie eingeloggt users.send_register_notify=Benachrichtigung über Registrierung per E-Mail -users.new_success=Der Account „%s“ wurde erstellt. +users.new_success=Das Konto „%s“ wurde erstellt. users.edit=Bearbeiten users.auth_source=Authentifizierungsquelle users.local=Lokal @@ -3028,10 +3028,10 @@ users.update_profile_success=Das Benutzerkonto wurde aktualisiert. users.edit_account=Benutzerkonto bearbeiten users.max_repo_creation=Maximale Anzahl an Repositorys users.max_repo_creation_desc=(Gib -1 ein, um das globale Standardlimit zu verwenden.) -users.is_activated=Aktivierter Account -users.prohibit_login=Gesperrter Account -users.is_admin=Administrator-Account -users.is_restricted=Eingeschränkter Account +users.is_activated=Aktiviertes Konto +users.prohibit_login=Gesperrtes Konto +users.is_admin=Administrator-Konto +users.is_restricted=Eingeschränktes Konto users.allow_git_hook=Kann Git-Hooks erstellen users.allow_git_hook_tooltip=Git-Hooks werden mit denselben Benutzer-Rechten ausgeführt, mit denen Forgejo läuft, und haben die gleiche Ebene von Host-Zugriff. Dadurch können Benutzer mit diesen speziellen Git-Hook-Rechten auf alle Forgejo-Repositorys sowie auf die von Forgejo verwendete Datenbank zugreifen und diese ändern. Auch das Erhalten von Administratorrechten für Forgejo ist möglich. users.allow_import_local=Kann lokale Repositorys importieren @@ -3054,8 +3054,8 @@ users.list_status_filter.is_admin=Administrator users.list_status_filter.not_admin=Nicht-Administrator users.list_status_filter.is_restricted=Eingeschränkt users.list_status_filter.not_restricted=Unbegrenzt -users.list_status_filter.is_prohibit_login=Login verbieten -users.list_status_filter.not_prohibit_login=Login erlaubt +users.list_status_filter.is_prohibit_login=Anmelden verbieten +users.list_status_filter.not_prohibit_login=Anmelden erlaubt users.list_status_filter.is_2fa_enabled=2FA aktiviert users.list_status_filter.not_2fa_enabled=2FA deaktiviert users.details=Benutzerdetails @@ -3102,12 +3102,12 @@ packages.size=Größe packages.published=Veröffentlicht defaulthooks=Standard-Webhooks -defaulthooks.desc=Webhooks senden automatisch HTTP-POST-Anfragen an einen Server, wenn bestimmte Forgejo-Events ausgelöst werden. Hier definierte Webhooks sind die Standardwerte, die in alle neuen Repositorys kopiert werden. Mehr Infos findest du in der Webhooks-Anleitung (auf Englisch). +defaulthooks.desc=Webhooks senden automatisch HTTP-POST-Anfragen an einen Server, wenn bestimmte Forgejo-Ereignisse ausgelöst werden. Hier definierte Webhooks sind die Standardwerte, die in alle neuen Repositorys kopiert werden. Mehr Infos findest du in der Webhooks-Anleitung (auf Englisch). defaulthooks.add_webhook=Standard-Webhook hinzufügen defaulthooks.update_webhook=Standard-Webhook aktualisieren systemhooks=System-Webhooks -systemhooks.desc=Webhooks senden automatisch HTTP-POST-Anfragen an einen Server, wenn bestimmte Forgejo-Events ausgelöst werden. Hier definierte Webhooks werden auf alle Repositorys des Systems übertragen, beachte daher mögliche Performance-Einbrüche. Mehr Infos findest du in der Webhooks-Anleitung (auf Englisch). +systemhooks.desc=Webhooks senden automatisch HTTP-POST-Anfragen an einen Server, wenn bestimmte Forgejo-Ereignisse ausgelöst werden. Hier definierte Webhooks werden auf alle Repositorys des Systems übertragen, beachte daher mögliche Performance-Einbrüche. Mehr Infos findest du in der Webhooks-Anleitung (auf Englisch). systemhooks.add_webhook=System-Webhook hinzufügen systemhooks.update_webhook=System-Webhook aktualisieren @@ -3142,9 +3142,9 @@ auths.search_page_size=Seitengröße auths.filter=Benutzerfilter auths.admin_filter=Admin-Filter auths.restricted_filter=Eingeschränkte Filter -auths.restricted_filter_helper=Leer lassen, um keine Benutzer als eingeschränkt festzulegen. Verwende einen Asterisk („*“), um alle Benutzer, die nicht dem Admin-Filter entsprechen, als eingeschränkt zu setzen. +auths.restricted_filter_helper=Leer lassen, um keine Benutzer als eingeschränkt festzulegen. Verwende ein Sternchen („*“), um alle Benutzer, die nicht dem Admin-Filter entsprechen, als eingeschränkt zu setzen. auths.verify_group_membership=Gruppenmitgliedschaft in LDAP verifizieren (zum Überspringen leer lassen) -auths.group_search_base=Gruppensuche Basisdomainname +auths.group_search_base=Gruppensuche-Basisdomainname auths.group_attribute_list_users=Gruppenattribut, welches Benutzerliste enthält auths.user_attribute_in_group=Benutzerattribut in der Gruppenliste auths.map_group_to_team=Ordne LDAP-Gruppen Organisationsteams zu (zum Überspringen leer lassen) @@ -3175,7 +3175,7 @@ auths.oauth2_authURL=Authorisierungs-URL auths.oauth2_profileURL=Profil-URL auths.oauth2_emailURL=E-Mail-URL auths.skip_local_two_fa=Lokale 2FA überspringen -auths.skip_local_two_fa_helper=Das Leerlassen bedeutet, dass lokale User die 2FA immer noch bestehen müssen, um sich anzumelden +auths.skip_local_two_fa_helper=Leerlassen bedeutet, dass lokale Benutzer die 2FA weiterhin durchführen müssen, um sich anzumelden auths.oauth2_tenant=Inhaber auths.oauth2_scopes=Zusätzliche Bereiche auths.oauth2_required_claim_name=Benötigter Claim-Name @@ -3192,7 +3192,7 @@ auths.tips.oauth2.general=OAuth2-Authentifizierung auths.tips.oauth2.general.tip=Beim Registrieren einer OAuth2-Anwendung sollte die Callback-URL folgendermaßen lauten: auths.tip.oauth2_provider=OAuth2-Anbieter auths.tip.bitbucket=Registriere einen neuen OAuth-Consumer unter %s -auths.tip.nextcloud=Registriere einen neuen OAuth-Consumer auf deiner Instanz über das folgende Menü: „Settings -> Security -> OAuth 2.0 client“ +auths.tip.nextcloud=Registriere einen neuen OAuth-Consumer auf deiner Instanz über das folgende Menü: „Einstellungen -> Sicherheit -> OAuth-2.0-Client“ auths.tip.dropbox=Erstelle eine neue App auf %s auths.tip.facebook=Erstelle eine neue Anwendung auf %s und füge das Produkt „Facebook Login“ hinzu auths.tip.github=Registriere unter %s eine neue OAuth-Anwendung @@ -3434,7 +3434,7 @@ users.block.description = Diesem Benutzer verbieten, durch sein Konto mit diesem users.restricted.description = Nur Interaktionen mit den Repositorys und Organisationen erlauben, wo der Benutzer als Mitarbeiter hinzugefügt wurde. Dies verhindert Zugriff auf öffentliche Repositorys in dieser Instanz. users.local_import.description = Import von Repositorys aus dem lokalen Dateisystem des Servers erlauben. Dies kann ein Sicherheitsproblem sein. users.organization_creation.description = Erstellung neuer Organisationen erlauben. -users.activated.description = Abschluss der E-Mail-Verifizierung. Der Besitzer eines nicht aktivierten Accounts wird nicht in der Lage sein, sich einzuloggen, bis die E-Mail-Verifikation abgeschlossen wurde. +users.activated.description = Abschluss der E-Mail-Verifizierung. Der Besitzer eines nicht aktivierten Kontos wird nicht in der Lage sein, sich anzumelden, bis die E-Mail-Verifikation abgeschlossen wurde. users.admin.description = Diesem Benutzer vollständigen Zugriff zu allen administrativen Funktionen gewähren, die über das Web-UI und die API verfügbar sind. emails.delete = E-Mail-Adresse löschen emails.deletion_success = Die E-Mail-Adresse wurde gelöscht. @@ -3696,7 +3696,7 @@ arch.version.provides = Bietet arch.version.groups = Gruppe arch.version.depends = Hängt ab von arch.version.makedepends = Make-Abhängigkeit -arch.version.checkdepends = Check-Abhängigkeit +arch.version.checkdepends = Prüfungs-Abhängigkeit arch.version.conflicts = Konflikte arch.version.replaces = Ersetzt arch.version.backup = Backup @@ -3869,7 +3869,7 @@ exact_tooltip = Nur Ergebnisse einbinden, die auf den exakten Suchbegriff passen issue_kind = Issues suchen … pull_kind = Pulls suchen … union = Vereinigungsmenge -union_tooltip = Ergebnisse, die auf ein beliebiges von den Whitespace getrennten Schlüsselwörtern passen, einbinden +union_tooltip = Ergebnisse einbeziehen, die auf ein beliebiges der durch Leerzeichen getrennten Schlüsselwörter passen regexp = RegExp regexp_tooltip = Suchbegriff als regulären Ausdruck interpretieren @@ -3903,7 +3903,7 @@ wiki.read = Lesen: Das integrierte Wiki und seine Historie lesen. wiki.write = Schreiben: Seiten im integrierten Wiki erstellen, aktualisieren und löschen. projects.read = Lesen: Zugriff auf Projektboards des Repositorys. projects.write = Schreiben: Projekte und Spalten erstellen und bearbeiten. -packages.read = Lesen: Pakete dieses Repositorys betrachten und herunterladen. +packages.read = Lesen: Pakete dieses Repositorys einsehen und herunterladen. packages.write = Schreiben: Pakete dieses Repositorys veröffentlichen und löschen. actions.read = Lesen: Workflow-Ausführungen und ihre Logs betrachten. actions.write = Schreiben: Workflows auslösen, neu starten und abbrechen. Vertrauensdelegation an Pull-Request-Einreicher verwalten. diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index 065dc85b98..8c531b477e 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -897,7 +897,7 @@ create_oauth2_application_button=Δημιουργία εφαρμογής create_oauth2_application_success=Δημιουργήσατε επιτυχώς μια νέα εφαρμογή OAuth2. update_oauth2_application_success=Ενημερώσατε την εφαρμογή OAuth2 επιτυχώς. oauth2_application_name=Όνομα εφαρμογής -oauth2_confidential_client=Εμπιστευτικός πελάτης (client). Επιλέξτε το για εφαρμογές που διατηρούν το μυστικό κωδικό κρυφό, όπως π.χ. εφαρμογές ιστού. Μην επιλέγετε για εγγενείς εφαρμογές, συμπεριλαμβανομένων εφαρμογών επιφάνειας εργασίας και εφαρμογών για κινητά. +oauth2_confidential_client=Εμπιστευτικός πελάτης (client). Επιλέξτε το για εφαρμογές που διατηρούν το μυστικό κωδικό κρυφό, όπως π.χ. εφαρμογές ιστού. Μην επιλέγετε για εγγενείς εφαρμογές, συμπεριλαμβανομένων εφαρμογών για υπολογιστές και για κινητά. oauth2_redirect_uris=URI Ανακατεύθυνσης. Χρησιμοποιήστε μια νέα γραμμή για κάθε URI. save_application=Αποθήκευση oauth2_client_id=Ταυτότητα Πελάτη @@ -2401,7 +2401,7 @@ settings.archive.tagsettings_unavailable=Οι ρυθμίσεις ετικέτα settings.unarchive.button=Αναίρεση αρχειοθέτησης αποθετηρίου settings.unarchive.header=Απο-Αρχειοθέτηση του αποθετηρίου settings.unarchive.text=Η απο-αρχειοθέτηση του αποθετηρίου θα αποκαταστήσει την ικανότητά του να λαμβάνει υποβολές και ωθήσεις, καθώς και νέα ζητήματα και pull-requests. -settings.unarchive.success=Το repository απο-αρχειοθετήθηκε με επιτυχία. +settings.unarchive.success=Το αποθετήριο απο-αρχειοθετήθηκε με επιτυχία. settings.unarchive.error=Παρουσιάστηκε σφάλμα κατά την προσπάθεια απο-αρχειοθέτησης του αποθετηρίου. Δείτε τις καταγραφές για περισσότερες λεπτομέρειες. settings.update_avatar_success=Η εικόνα του αποθετηρίου έχει ενημερωθεί. settings.lfs=LFS @@ -2673,7 +2673,7 @@ issues.author.tooltip.pr = Αυτό το pull request δημιουργήθηκε settings.federation_settings = Ρυθμίσεις διαλειτουργικότητας settings.federation_apapiurl = Το Federation URL (διαλειτουργικότητας) του αποθετηρίου. Αντιγράψτε το στις ρυθμίσεις διαλειτουργικότητας ενός άλλου αποθετηρίου ως το URL ενός Ακολουθούμενου Αποθετηρίου. form.string_too_long = Το κείμενο είναι μεγαλύτερο από %d χαρακτήρες. -release.hide_archive_links = Απόκρυψη αυτόματα δημιουργημένων archive +release.hide_archive_links = Απόκρυψη αυτόματα δημιουργημένων αρχείων λήψης settings.graphql_url = URL του GraphQL issues.edit.already_changed = Δεν ήταν δυνατή η αποθήκευση των αλλαγών στο ζήτημα αυτό, επειδή το περιεχόμενο έχει ήδη αλλαχθεί από κάποιον άλλο χρήστη. Για να μην χαθούν οι αλλαγές του, ανανεώστε την σελίδα και προσπαθήστε να το επεξεργαστείτε ξανά project = Έργα @@ -2895,7 +2895,7 @@ teams.invite.title=Έχετε προσκληθεί να συμμετάσχετε teams.invite.by=Προσκλήθηκε από %s teams.invite.description=Παρακαλώ κάντε κλικ στον παρακάτω σύνδεσμο για συμμετοχή στην ομάδα. follow_blocked_user = Δεν μπορείτε να ακολουθήσετε τον οργανισμό, επειδή σας έχει αποκλείσει. -open_dashboard = Δημιουργία πίνακα δραστηριότητας +open_dashboard = Άνοιγμα πίνακα ελέγχου settings.change_orgname_redirect_prompt.with_cooldown.one = Το παλιό όνομα οργανισμού θα είναι διαθέσιμο σε όλους μετά από καθυστέρηση %[1]d ημέρας. Μπορείτε ακόμα να ανακτήσετε το παλιό όνομα κατά τη διάρκεια αυτής. settings.change_orgname_redirect_prompt.with_cooldown.few = Το παλιό όνομα οργανισμού θα είναι διαθέσιμο σε όλους μετά από καθυστέρηση %[1]d ημερών. Μπορείτε ακόμα να ανακτήσετε το παλιό όνομα κατά τη διάρκεια αυτής. @@ -2955,7 +2955,7 @@ dashboard.update_migration_poster_id=Ενημέρωση των ID συντακτ dashboard.git_gc_repos=Garbage collect όλων των αποθετηρίων dashboard.resync_all_sshkeys=Ενημέρωση του αρχείου «.ssh/authorized_keys» με τα κλειδιά SSH του Forgejo. dashboard.resync_all_sshprincipals=Ενημέρωση του αρχείου «.ssh/authorized_principals» με τις αρχές SSH του Forgejo. -dashboard.resync_all_hooks=Επανασυγχρονισμός των hook pre-receive, update και post-receive όλων των αποθετηρίων +dashboard.resync_all_hooks=Επανασυγχρονισμός των Git hook όλων των αποθετηρίων (pre-receive, update, post-receive, proc-receive, …) dashboard.reinit_missing_repos=Επανεκκινήστε όλα τα αποθετήρια Git που λείπουν και για τα οποία υπάρχουν εγγραφές dashboard.sync_external_users=Συγχρονισμός δεδομένων εξωτερικών χρηστών dashboard.cleanup_hook_task_table=Εκκαθάριση πίνακα hook_task diff --git a/options/locale/locale_eo.ini b/options/locale/locale_eo.ini index fd69e375aa..ac3aa478b5 100644 --- a/options/locale/locale_eo.ini +++ b/options/locale/locale_eo.ini @@ -576,6 +576,8 @@ To = Branĉonomo AccessToken = Atingoĵetono required_prefix = La enigaĵo devas komenciĝi per "%s" +username_error = ` enhavu sole literojn («a–z», «A–Z»), numerojn («0–9«), strekojn («-»), substrekojn («_») kaj punktojn («.»). Gi ne povas komenci kun ne-alfanumeraj signoj, kaj sinsekva ne-alfanumeraj signoj ankaŭ estas malpermesitaj.` + [modal] confirm = Konfirmi no = Ne @@ -710,7 +712,7 @@ password_incorrect = La nuna pasvorto malĝustas. gpg_helper = Ĉu bezonas helpon? Legetu la gvidon pri GPG. choose_new_avatar = Elekti novan profilbildon activated = Konfirmita -add_new_email = Aldoni novan retpoŝtadreson +add_new_email = Aldoni retpoŝtadreson verify_gpg_key_success = GPG-ŝlosilo «%s» jam konfirmiĝis. show_openid = Montri je profilo hide_openid = Kaŝi de profilo @@ -738,7 +740,7 @@ ssh_key_deletion_desc = Forigi SSH-ŝlosilon reprenus ĝian aliron al via konto. permission_no_access = Neniu aliro comment_type_group_dependency = Dependaĵo change_password_success = Via pasvorto konserviĝis. Salutu ekde nun per tiu nova pasvorto. -email_deletion_desc = La retpoŝtmesaĝo kaj rilataj informoj forviŝiĝos de via konto. Git-enmetoj de tiu ĉi adreso restos senŝanĝaj. Ĉu daŭrigu? +email_deletion_desc = Tiu ĉi retpoŝtadreso kaj rilataj informoj forviŝiĝos de via konto. Git-enmetoj de tiu ĉi adreso restos senŝanĝaj. Ĉu daŭrigu? permissions_list = Permesoj: permission_write = Lega kaj Skriba key_content = Enhavo @@ -768,7 +770,7 @@ enable_custom_avatar = Uzi propran profilbildon change_password = Ŝanĝi pasvorton keep_pronouns_private = Montri pronomojn nur al la aŭtentikigitaj uzantoj keep_pronouns_private.description = Tio maskos viajn pronomojn kontraŭ neaŭtentikigitaj vizitantoj. -add_new_principal = +add_new_principal = gpg_token_required = Vi devas disponigi signaturon por la malsupran ĵetono gpg_token = Ĵetono gpg_token_help = Vi povas generi signaturon uzante: @@ -919,6 +921,11 @@ migrate_items_releases = Eldonoj commits.commits = Enmetoj rss.must_be_on_branch = Vi devas esti en branĉo por havi RSS-fluon. +repo_name = Deponejonomo +size_format = %[1]s: %[2]s; %[3]s: %[4]s +template = Ŝablono +template_select = Elektu ŝablonon + [org] code = Fontkodo settings = Agordoj @@ -976,4 +983,7 @@ directory = Dosierujo normal_file = Normala dosiero executable_file = Rulebla dosiero symbolic_link = Simbola ligilo -submodule = Submodulo \ No newline at end of file +submodule = Submodulo + +[translation_meta] +test = Mi prononcas Forgejo per g-sono. Ĝi ja ne estas literumita forĝejo :) \ No newline at end of file diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index 224864c24a..1beb70f716 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -178,8 +178,8 @@ contributions_format = {contributions} el {day} {month} {year} [editor] buttons.heading.tooltip=Añadir encabezado -buttons.bold.tooltip=Añadir texto en negrita -buttons.italic.tooltip=Añadir texto en cursiva +buttons.bold.tooltip=Añadir texto en negrita (Ctrl+B / ⌘B) +buttons.italic.tooltip=Añadir texto en cursiva (Ctrl+I / ⌘I) buttons.quote.tooltip=Citar texto buttons.code.tooltip=Añadir código buttons.link.tooltip=Añadir un enlace @@ -789,7 +789,7 @@ add_email_success=La nueva dirección de correo electrónico ha sido añadida. email_preference_set_success=La preferencia de correo electrónico se ha establecido correctamente. add_openid_success=La nueva dirección OpenID ha sido añadida. keep_email_private=Ocultar dirección de correo electrónico -keep_email_private_popup=Su dirección de correo electrónico no se mostrará en su perfil y no será la predeterminada para las confirmaciones realizadas a través de la interfaz web, como las subidas de archivos, las ediciones y las confirmaciones de fusión. En su lugar, se utilizará una dirección especial %s para vincular las confirmaciones a tu cuenta. Esta opción no afectará a las confirmaciones existentes. +keep_email_private_popup=La dirección de correo electrónico no se mostrará en el perfil y no será la predeterminada para las confirmaciones realizadas a través de la interfaz web, como las subidas de archivos, las ediciones y las confirmaciones de fusión. En su lugar, se utilizará una dirección especial %s para vincular las confirmaciones a la cuenta. Esta opción no afectará a las confirmaciones existentes. openid_desc=OpenID le permite delegar la autenticación a un proveedor externo. manage_ssh_keys=Gestionar claves SSH @@ -1023,6 +1023,8 @@ quota.applies_to_user = Las siguientes reglas de cuota se aplican a tu cuenta quota.applies_to_org = Las siguientes reglas de cuota se aplican a esta organización quota.rule.exceeded.helper = El tamaño total de los objetos para esta regla ha superado la cuota. +ssh_token_help_ssh_agent = o, si está usando un agente SSH (con la variable de entorno SSH_AUTH_SOCK): + [repo] owner=Propietario owner_helper=Algunas organizaciones pueden no aparecer en el menú desplegable debido a un límite máximo de recuento de repositorios. @@ -1628,8 +1630,8 @@ issues.lock.notice_3=- Siempre puede desbloquear esta incidencia de nuevo en el issues.unlock.notice_1=- Todos podrían comentar esta incidencia de nuevo. issues.unlock.notice_2=- Siempre puede bloquear esta incidencia de nuevo en el futuro. issues.lock.reason=Motivo del bloqueo -issues.lock.title=Bloquear conversación sobre esta incidencia. -issues.unlock.title=Desbloquear conversación sobre esta incidencia. +issues.lock.title=Bloquear conversación +issues.unlock.title=Desbloquear conversación issues.comment_on_locked=No puede comentar una incidencia bloqueada. issues.delete=Eliminar issues.delete.title=¿Eliminar esta incidencia? @@ -2288,7 +2290,7 @@ settings.packagist_api_token=Token de API settings.packagist_package_url=URL del paquete Packagist settings.deploy_keys=Claves de implementación settings.add_deploy_key=Añadir clave de implementación -settings.deploy_key_desc=Las claves de implementación tienen acceso de sólo lectura al repositorio. +settings.deploy_key_desc=Las claves de implementación pueden tener acceso de solo lectura o lectura y escritura al repositorio. settings.is_writable=Habilitar acceso de escritura settings.is_writable_info=Permitir que esta clave de implementación pueda hacer push a este repositorio. settings.no_deploy_keys=Aún no existen claves de implementación. @@ -2740,6 +2742,24 @@ archive.nocomment = No es posible hacer comentarios porque el repositorio está sync_fork.branch_behind_one = Esta rama esta %[1]d cambios detrás de %[2]s sync_fork.branch_behind_few = Esta rama está %[1]d confirmaciones detrás de %[2]s +migrate.repo_desc_helper = Deje vacío para importar la descripción existente +commits.view_single_diff = Ver los cambios introducidos por la confirmación para este archivo +issues.filter_type.all_pull_requests = Todas las solicitudes de incorporación de cambios +issues.reaction.alt_many = %[1]s y %[2]d reaccionaron más que %[3]s. +comment.blocked_by_user = No es posible comentar porque ha sido bloqueado por el dueño del repositorio o el autor. +issues.summary_card_alt = El resumen de la incidencia titulada "%s" en el repositorio %s +pulls.editable_explanation = Esta incorporación de cambios permite ediciones de mantenedores. Tu puedes contribuir directamente a ella. +pulls.delete_after_merge.head_branch.is_protected = La cabeza de la rama que quiere borrar está protegida y no se puede eliminar. +pulls.delete_after_merge.head_branch.insufficient_branch = No tienes permiso para eliminar esa cabeza de la rama. +settings.default_update_style_desc = El modo por defecto utilizado para actualizar las solicitudes de incorporación de cambios que estén detrás de la rama base. +settings.wiki_branch_rename_success = La wiki de la rama del repositorio ha sido normalizada correctamente. +settings.wiki_branch_rename_failure = Hubo un error al normalizar el nombre de la rama de la wiki del repositorio. +release.hide_archive_links_helper = Ocultar el archivo de código generado automáticamente de este lanzamiento. Por ejemplo, si estás subiendo el tuyo propio. + +settings.event_action_recover = Recuperar +settings.event_action_success = Éxito +settings.event_action_success_desc = La ejecución de la acción se ejecutó con éxito. + [graphs] component_loading = Cargando %s… component_loading_failed = No se pudo cargar %s @@ -2998,7 +3018,7 @@ users.edit_account=Editar cuenta de usuario users.max_repo_creation=Número máximo de repositorios users.max_repo_creation_desc=(Introduzca -1 para usar el límite por defecto global.) users.is_activated=Cuenta de usuario activada -users.prohibit_login=Suspender cuenta +users.prohibit_login=Cuenta suspendida users.is_admin=Cuenta adminstrador users.is_restricted=Cuenta restringida users.allow_git_hook=Puede crear Git hooks diff --git a/options/locale/locale_et.ini b/options/locale/locale_et.ini index f62360f5ea..eebdb3ab6f 100644 --- a/options/locale/locale_et.ini +++ b/options/locale/locale_et.ini @@ -33,7 +33,7 @@ toggle_menu = Lülita menüü sisse/välja more_items = Rohkem objekte email = E-posti aadress password = Salasõna -access_token = Tunnusluba +access_token = Juurdepääsu tunnusluba re_type = Kinnita salasõna twofa = Kahefaktoriline autentimine twofa_scratch = Kahefaktoriline kriipsukood @@ -67,7 +67,7 @@ all = Kõik sources = Allikad mirror = Peegelpilt mirrors = Peegelpildid -forks = Harud +forks = Koodiharud activities = Tegevused pull_requests = Päringud koodi mestimiseks issues = Veahaldus @@ -92,7 +92,7 @@ copy = Kopeeri copy_url = Kopeeri võrguaadress copy_hash = Kopeeri räsi copy_content = Kopeeri sisu -copy_branch = Kopeeri haru nimi +copy_branch = Kopeeri alamharu nimi copy_success = Kopeeritud! copy_error = Kopeerimine ei õnnestunud copy_type_unsupported = Seda failitüüpi ei saa kopeerida @@ -124,8 +124,8 @@ filter = Filter filter.clear = Tühjenda filtrid filter.is_archived = Arhiveeritud filter.not_archived = Arhiveerimata -filter.is_fork = -filter.not_fork = +filter.is_fork =Koodiharud +filter.not_fork =Pole koodiharud filter.is_mirror = Peegelpildid filter.not_mirror = Pole peegelpilte filter.is_template = Mallid @@ -156,7 +156,7 @@ team_kind = Otsi tiime… code_kind = Otsi koodi… package_kind = Otsi pakette… project_kind = Otsi projekte… -branch_kind = Otsi harusid… +branch_kind = Otsi alamharusid… commit_kind = Otsi kommiteid… runner_kind = Otsi jooksjaid… no_results = Sobivaid tulemusi ei leitud. @@ -334,25 +334,52 @@ offline_mode.description = Lülitage kolmandate osapoolte sisuedastusvõrgud vä password_algorithm = Salasõna räsialgoritm invalid_password_algorithm = Vigane salasõna räsialgoritm +invalid_repo_path = Tarkvarahoidla juurkaust on vigane: %v +invalid_app_data_path = Rakenduse andmete asukoht on vigane: %v + [auth] allow_password_change = Eelda, et kasutajad muudavad oma salasõna (soovitatav) forgot_password_title = Ununenud salasõna must_change_password = Muuda oma salasõna forgot_password = Kas salasõna ununes? +verify = Verifitseeri +openid_connect_submit = Ühenda + [mail] password_change.subject = Sinu salasõna on muutunud password_change.text_1 = Sinu kasutajakonto salasõna on just muutunud. totp_disabled.text_1 = Lisaautentimine ehk ajapõhise salasõna (TOTP) kasutamine on sinu kasutajakontol just välja lülitatud. +release.note = Märkus: +release.downloads = Allalaadimised: +repo.transfer.to_you = sina + [form] Retype = Korda salasõna password_not_match = Salasõnad ei klapi. Password = Salasõna username_password_incorrect = Kassutajanimi või salasõna pole õige. required_prefix = Sisendi alguses peab olema „&s“ -To = Haru nimi -NewBranchName = Haru uus nimi +To = Alamharu nimi +NewBranchName = Alamharu uus nimi + +UserName = Kasutajanimi +Description = Kirjeldus +Pronouns = Asesõnad +Biography = Biograafia +Website = Veebisait +Location = Asukoht +Content = Sisu + +password_complexity = Salasõna ei vasta keerukuse reeglitele: +password_lowercase_one = Peaks olema vähemalt üks väiketäht +password_uppercase_one = Peaks olema vähemalt üks suurtäht +password_digit_one = Peaks olema vähemalt üks number +password_special_one = Peaks olema vähemalt üks erimärk (kirjavahemärk, sulg, jutumärk, jne) +enterred_invalid_password = Sinu sisestatud salasõna pole korrektne. +unset_password = Siselogiv kasutaja pole lisanud oma kontole salasõna. +target_branch_not_exist = Sihiks võetud alamharu pole olemas. [settings] retype_new_password = Korda uut salasõna @@ -361,7 +388,56 @@ change_password_success = Sina salasõna on nüüd muudetud. Edaspidi kasuta sis update_password = Muuda salasõna old_password = Senine salasõna new_password = Uus salasõna -comment_type_group_branch = Koodiharu +comment_type_group_branch = Alamharu + +profile = Profiil +account = Kasutajakonto +appearance = Välimus +security = Turvalisus +avatar = Tunnuspilt +applications = Rakendused +orgs = Organisatsioonid +repos = Koodihoidlad +organization = Organisatsioonid +website = Veebisait +location = Asukoht +pronouns = Asesõnad +pronouns_unspecified = Määratlemata +cancel = Katkesta +language = Keel +ui = Kujundus +hints = Vihjed +comment_type_group_reference = Viide +comment_type_group_label = Silt +comment_type_group_milestone = Vahe-eesmärk +comment_type_group_assignee = Määratud kasutajale +comment_type_group_title = Pealkiri +comment_type_group_deadline = Tähtaeg +comment_type_group_dependency = Sõltuvus +comment_type_group_project = Projekt +privacy = Privaatsus +primary = Esmane +activated = Aktiveeritud +delete_email = Eemalda +gpg_key_verify = Verifitseeri +gpg_token = Tunnusluba +ssh_key_verify = Verifitseeri +ssh_token = Tunnusluba +subkeys = Alamvõtmed +key_content = Sisu +principal_content = Sisu +delete_key = Eemalda +can_read_info = Lugemine +can_write_info = Kirjutamine +delete_token = Kustuta +permission_read = Lugemine +permissions_list = Õigused: +save_application = Salvesta +oauth2_application_edit = Muuda + +change_password = Salasõna muutmine +password_change_disabled = Kohalikus serveris mitteleiduvad kasutajad ei saa oma salasõna Forgejo kasutajaliidesest muuta. +email_desc = Sinu põhilist e-posti aadressi kasutatakse teavitusteks, salasõna taastamiseks ning kui ta pole peidetud, siis ka veebipõhisteks toiminguteks gitiga. [repo] mirror_sync_on_commit = Sünkrooni sissekannete tegemisel @@ -374,7 +450,7 @@ mirror_password_help = Salvestatud salasõna kustutamiseks muuda kasutajanime. mirror_address = Klooni võrguaadressilt mirror_password_blank_placeholder = (Seadistamata) commits.message = Sõnum -commits.search_all = Kõik koodiharud +commits.search_all = Kõik alamharu commits.author = Autor commits.browse_further = Sirvi edasi commits.renamed_from = Nimi muudetud, vana nimi oli „%s“ @@ -382,7 +458,7 @@ commits.date = Kuupäev commits.older = Vanemad commits.newer = Uuemad commitstatus.error = Viga -commits.search_branch = See koodiharu +commits.search_branch = See alamharu projects = Projektid commitstatus.failure = Tõrge commitstatus.pending = Ootel @@ -392,32 +468,102 @@ issues.filter_sort.moststars = Enim tärne issues.choose.get_started = Alustame issues.start_tracking_short = Käivita taimer issues.filter_sort.feweststars = Kõike vähem tärne -rss.must_be_on_branch = RSS-voo jaoks pead asuma koodiharus. -all_branches = Kõik koodiharud -default_branch = Vaikimisi koodiharu +rss.must_be_on_branch = RSS-voo jaoks pead asuma alamharus. +all_branches = Kõik alamharud +default_branch = Vaikimisi alamharu default_branch_label = vaikimisi -code.desc = Ligipääs lähtekoodile, failidele, sissekannetele ja koodiharudele. -filter_branch_and_tag = Filtreeri koodiharu või sildi alusel -branches = Koodiharud -n_branch_one = %s koodiharu -n_branch_few = %s koodiharu -commit_graph.select = Vali koodiharud -commit.contained_in_default_branch = See sissekanne on vaikimisi koodiharu osa -editor.new_branch_name_desc = Koodiharu uus nimi… -commits.nothing_to_compare = Need koodiharud on võrdsed. -issues.no_ref = Ühtegi koodiharu/silti pole määratud -pulls.merged_info_text = Koodiharu %s võid nüüd kustutada. -pulls.update_branch_success = Koodiharu uuendamine õnnestus -pulls.update_not_allowed = Sul pole õigust koodiharu uuendada +code.desc = Ligipääs lähtekoodile, failidele, sissekannetele ja alamharudele. +filter_branch_and_tag = Filtreeri alamharu või sildi alusel +branches = Alamharud +n_branch_one = %s alamharu +n_branch_few = %s alamharu +commit_graph.select = Vali alamharud +commit.contained_in_default_branch = See sissekanne on vaikimisi alamharu osa +editor.new_branch_name_desc = Alamharu uus nimi… +commits.nothing_to_compare = Need alamharud on võrdsed. +issues.no_ref = Ühtegi alamharu/silti pole määratud +pulls.merged_info_text = Selle alamharu %s võid nüüd kustutada. +pulls.update_branch_success = Alamharu uuendamine õnnestus +pulls.update_not_allowed = Sul pole õigust alamharu uuendada pull.deleted_branch = (kustutatud):%s -settings.branches.update_default_branch = Uuenda vaikimisi koodiharu +settings.branches.update_default_branch = Uuenda vaikimisi alamharu settings.branches.add_new_rule = Lisa uus reegel -settings.event_create_desc = Koodiharu või silt on loodud. -settings.event_delete_desc = Koodiharu või silt on kustutatud. -settings.branches = Kooduharud +settings.event_create_desc = Alamharu või silt on loodud. +settings.event_delete_desc = Alamharu või silt on kustutatud. +settings.branches = Alamharud settings.protected_branch.save_rule = Salvesta reegel settings.protected_branch.delete_rule = Kustuta reegel +editor.add_file = Lisa fail +editor.or = või +editor.cancel_lower = Katkesta +editor.add_tmpl.filename = failinimi +pulls.editable = Muudetav + +fork_repo = Tee lähtekoodihoidlast uus koodiharu +fork_from = Tee koodiharu allikast +already_forked = Sa juba oled siit teinud koodiharu: %s +fork_to_different_account = Tee koodihatu teisele kasutajakontole +fork_visibility_helper = Lähtekoodihoidla koodiharu nähtavust ei saa muuta. +fork_branch = Alamharu, millest tahad kloonid koodiharu +mirror_denied_combination = Salasõnapõhist ja avaliku võtme põhist autentimist ei saa samal ajal kasutada. +forks = Koodharud +tree_path_not_found.branch = Asukohta „%[1]s“ pole olemas alamharus „%[2]s“ +template.git_content = Giti sisu (vaikimisi alamharu) +sync_fork.button = Sünkrooni +forked_from = koodiharu allikast +fork_from_self = Sa ei saa endale kuuluvast lähtekoodi hoidlast koodiharu teha. +fork_guest_user = Logi sisse sellest lähtekoodi hoidlast koodiharu tegemiseks. +fork = Tee koodiharu +commit.load_referencing_branches_and_tags = Laadi alamharud ja sildid, mis viitavad sellele sissekandele +editor.must_be_on_a_branch = Selle faili muutmiseks või muudatuste pakkumiseks pead asuma antud alamharus. +editor.create_new_branch_np = Loo selle sissekande jaoks uus alamharu. +editor.new_branch_name = Anna selle sissekande jaoks loodud uuele alamharule nimi +editor.branch_does_not_exist = Selles lähtekoodihoidlas pole olemas alamharu nimega „%s“. +editor.branch_already_exists = Selles lähtekoodihoidlas juba on olemas alamharu nimega „%s“. +editor.cannot_commit_to_protected_branch = Kaitstud alamharusse nimega „%s“ ei saa sissekandeid teha. +commit.revert-content = Vali alamharu, kuhu tahad tagasi pöörata: +issues.delete_branch_at = `kustutatud alamharu %s %s` +pulls.filter_branch = Filtreeri alamharu alusel +pulls.nothing_to_compare_have_tag = Valitud alamharud/sildid on võrdsed. +activity.git_stats_push_to_branch = alamharusse %s ja +activity.git_stats_push_to_all_branches = kõikidesse alamharudesse. +activity.git_stats_on_default_branch = Alamharus %s, +settings.branches.switch_default_branch = Vaheta vaikimisi alamharusse +settings.branch_filter = Alamharude filter +settings.protected_branch = Alamharu kaitse +settings.branch_protection = %s alamharu kaitsmise reeglid +settings.protect_new_rule = Lisa uus alamharu kaitsmise reegel +settings.rename_branch = Muuda alamharu nime +branch.name = Alamharu nimi +branch.already_exists = Alamharu nimega „%s“ on juba olemas. +branch.delete = Kustuta alamharu „%s“ +branch.delete_html = Kustuta alamharu +branch.deletion_success = Alamharu „%s“ on kustutatud. +branch.deletion_failed = Alamharu „%s“ kustutamine ei õnnestunud. +branch.create_branch = Loo Alamharu „%s“ +branch.create_from = allikast „%s“ +branch.create_success = Alamharu „%s“ on loodud. +branch.branch_already_exists = Alamharu nimega „%s“ on selles lähtekoodihoidlas juba olemas. +branch.branch_name_conflict = Alamharu nimi „%s“ on vastolus olemasoleva alamharuga „%s“. +branch.deleted_by = Kustutaja: %s +branch.restore_success = Alamharu „%s“ on taastatud. +branch.restore_failed = Alamharu „%s“ taastamine ei õnnestunud. +branch.protected_deletion_failed = Alamharu „%s“ on kaitstud ja teda ei saa kustutada. +branch.default_deletion_failed = Alamharu „%s“ on vaikimisi alamharu ja teda ei saa kustutada. +branch.restore = Taasta alamharu „%s“ +branch.download = Laadi alla alamharu „%s“ +branch.rename = Muuda alamharu „%s“ nime +branch.included_desc = See alamharu on vaikimisi alamharu osa +branch.included = Sealhulgas +branch.create_new_branch = Loo sellest alamharust uus alamharu: +branch.confirm_create_branch = Loo alamharu +branch.warning_rename_default_branch = Sa muudad vaikimisi alamharu nime. +branch.rename_branch_to = Alamharu „%s“ nimi on muutmisel. +branch.create_branch_operation = Loo alamharu +branch.new_branch = Loo uus alamharu +branch.new_branch_from = Loo uus alamharu siit: „%s“ + [actions] variables = Muutujad variables.deletion = Eemalda muutuja @@ -433,5 +579,40 @@ auths.bind_password = Seo salasõna [explore] users = Kasutajad +repos = Koodihoidlad +organizations = Organisatsioonid +code = Kood + [user] -starred = Tärniga märgitud hoidlad \ No newline at end of file +starred = Tärniga märgitud hoidlad +repositories = Koodihoidlad +followers.title.one = Jälgija +followers.title.few = Jälgijad +following.title.one = Sa jälgid +following.title.few = Sa jälgid +follow = Jälgi +unfollow = Lõpeta jälgimine +code = Kood +projects = Projektid +overview = Ülevaade +block = Blokeeri +unblock = Eemalda blokeering +user_bio = Elulugu + +[home] +my_repos = Koodihoidlad +my_orgs = Organisatsioonid +show_archived = Arhiveeritud +show_private = Privaatne + +[modal] +yes = Jah +no = Ei +confirm = Kinnita +cancel = Katkesta + +[action] +compare_branch = Võrdle + +[packages] +alpine.repository.branches = Alamharud \ No newline at end of file diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 235ff2ed91..1519d711ba 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -151,7 +151,7 @@ confirm_delete_artifact = Haluatko varmasti poistaa artefaktin "%s"? new_migrate.title = Uusi migraatio test = Testi concept_system_global = Yleisesti pätevä -sign_in_with_provider = Kirjaudu %s-tilillä +sign_in_with_provider = Kirjaudu käyttäen %sia filter.is_fork = Forkit filter.is_mirror = Peilit filter.is_template = Mallipohjat @@ -902,7 +902,7 @@ webauthn_key_loss_warning = Jos menetät turva-avaimesi, menetät pääsyn tilil keep_activity_private.description = Julkinen toimintasi näkyy vain sinulle ja instanssin ylläpitäjille. email_desc = Ensisijaista sähköpostiosoitettasi käytetään ilmoituksiin, salasanan palautukseen ja jos sähköpostiosoite ei ole piilotettu, web-pohjaisiin Git-toimenpiteisiin. tokens_desc = Nämä poletit mahdollistavat pääsyn tilillesi Forgejon rajapintaa vasten. -keep_email_private_popup = Sähköpostiosoitettasi ei näytetä profiilissasi, eikä sitä käytetä oletuksena verkkokäyttöliittymän kautta tehtävissä kommiteissa, kuten tiedostojen lähetyksissä, muokkauksissa ja yhdistämiskommiteissa. Sen sijaan voit käyttää erityistä osoitetta %s kommittien linkittämiseen tiliisi. Tämä vaihtoehto ei vaikuta olemassa oleviin kommitteihin. +keep_email_private_popup = Sähköpostiosoitetta ei näytetä profiilisivulla, eikä sitä käytetä oletuksena verkkokäyttöliittymän kautta tehtävissä kommiteissa, kuten tiedostojen lähetyksissä, muokkauksissa ja yhdistämiskommiteissa. Sen sijaan erityistä osoitetta %s voi käyttää kommittien linkittämiseen käyttäjätiliin. Tämä asetus ei vaikuta olemassa oleviin kommitteihin. added_on = Lisätty %s additional_repo_units_hint = Ehdota tietovaraston lisäyksiköiden käyttöönottoa revoke_oauth2_grant_success = Pääsy mitätöity. @@ -1010,6 +1010,15 @@ principal_state_desc = Tätä prinsipaalia on käytetty viimeisen seitsemän pä regenerate_token_success = Poletti on luotu uudelleen. Sovellukset, jotka käyttivät polettia, eivät enää pääse tilillesi. Kyseiset sovellukset tulee päivittää uudella poletilla. quota.sizes.assets.all = Resurssit +can_not_add_email_activations_pending = Aktivointi odottaa. Odota hetki ja yritä uudelleen muutaman minuutin kuluttua, jos haluat lisätä uuden sähköpostiosoitteen. +gpg_invalid_token_signature = Annettu GPG-avain, allekirjoitus ja poletti eivät täsmää, tai poletti on vanhentunut. +ssh_invalid_token_signature = Annettu SSH-avain, allekirjoitus tai poletti eivät täsmää, tai poletti on vanhentunut. +access_token_desc = Valitut poletin käyttöoikeudet rajoittavat valtuuden vain vastaaville API-reiteille. Lue dokumentaatio saadaksesi lisätietoja. + +oauth2_application_remove_description = OAuth2-sovelluksen poistaminen estää sitä pääsemästä valtuutettuihin käyttäjätileihin tässä instanssissa. Jatketaanko? +oauth2_application_locked = Forgejo esirekisteröi joitain OAuth2-sovelluksia käynnistymisen yhteydessä, jos näin on määritetty kokoonpanon asetuksissa. Odottamattoman toiminnan estämiseksi näitä sovelluksia ei voi muokata tai poistaa. Lisätietoja on saatavilla OAuth2-dokumentaatiossa. +quota.rule.exceeded.helper = Objektien yhteiskoko tälle säännölle on ylittänyt kiintiön. + [repo] owner=Omistaja owner_helper=Jotkin organisaatiot eivät välttämättä näy pudotusvalikossa, koska tietovarastojen enimmäismäärää on rajoitettu. @@ -1050,7 +1059,7 @@ desc.private=Yksityinen desc.public=Julkinen desc.template=Mallipohja desc.internal=Sisäinen -desc.archived=Arkistoidut +desc.archived=Arkistoitu template.git_hooks=Git-koukut template.webhooks=Webkoukut @@ -1192,7 +1201,7 @@ issues.new.open_milestone=Avoimet merkkipaalut issues.new.closed_milestone=Suljetut merkkipaalut issues.new.assignees=Käsittelijä issues.new.clear_assignees=Tyhjennä käsittelijä -issues.new.no_assignees=Ei käsittelijää +issues.new.no_assignees=Ei käsittelijöitä issues.choose.open_external_link=Avaa issues.choose.blank=Oletus issues.no_ref=Haaraa/tagia ei määritelty @@ -1263,7 +1272,7 @@ issues.reopen_comment_issue=Kommentoi ja avaa uudelleen issues.create_comment=Kommentoi issues.closed_at=`sulki tämän tukipyynnön %s` issues.reopened_at=`avasi tämän tukipyynnön uudelleen %s` -issues.commit_ref_at=`viittasi tähän tukipyyntöön sitoumuksesta %s` +issues.commit_ref_at=`viittasi tähän ongelmaan kommitista %s` issues.author=Tekijä issues.role.owner=Omistaja issues.role.member=Jäsen @@ -1419,7 +1428,7 @@ activity.closed_issues_count_1=suljettu ongelma activity.closed_issues_count_n=suljettua ongelmaa activity.title.issues_created_by=%s luonut %s activity.closed_issue_label=Suljettu -activity.new_issues_count_1=Uusi ongelma +activity.new_issues_count_1=uusi ongelma activity.new_issues_count_n=uutta ongelmaa activity.new_issue_label=Avoinna activity.unresolved_conv_label=Auki @@ -1822,10 +1831,10 @@ readme_helper = Valitse README-tiedoston mallipohja settings.default_merge_style_desc = Oletusarvoinen yhdistämistyyli wiki.back_to_wiki = Takaisin wikisivulle wiki.delete_page_notice_1 = Wikisivun "%s" poistamista ei voi perua. Jatketaanko? -activity.merged_prs_count_1 = Yhdistetty vetopyyntö -activity.merged_prs_count_n = Yhdistettyä vetopyyntöä -activity.opened_prs_count_1 = Ehdotettu vetopyyntö -activity.opened_prs_count_n = Ehdotettua vetopyyntöä +activity.merged_prs_count_1 = yhdistetty vetopyyntö +activity.merged_prs_count_n = yhdistettyä vetopyyntöä +activity.opened_prs_count_1 = ehdotettu vetopyyntö +activity.opened_prs_count_n = ehdotettua vetopyyntöä activity.title.user_1 = %d käyttäjä activity.title.prs_n = %d vetopyyntöä settings.sourcehut_builds.secrets = Salaisuudet @@ -2139,7 +2148,7 @@ issues.add_label = lisäsi nimilapun %s %s issues.due_date_added = lisäsi eräpäivän %s %s issues.review.add_review_request = pyysi katselmointia käyttäjältä %[1]s %[2]s issues.ref_pull_from = `viittasi tähän vetopyyntöön %[3]s %[1]s` -pulls.commit_ref_at = `viittasi tähän vetopyyntöön sitoumuksesta %s` +pulls.commit_ref_at = `viittasi tähän vetopyyntöön kommitista %s` issues.review.comment = katselmoi %s issues.add_labels = lisäsi nimilaput %s %s issues.review.add_review_requests = pyysi katselmointeja käyttäjiltä %[1]s %[2]s @@ -2322,7 +2331,7 @@ pulls.status_checks_warning = Jotkin tarkistukset raportoivat varoituksia pulls.status_checks_error = Jotkin tarkistukset raportoivat virheitä pulls.reopened_at = `avasi tämän vetopyynnön uudelleen %s` pulls.auto_merge_when_succeed = Yhdistä automaatisesti kun kaikki tarkistukset onnistuvat -signing.wont_sign.error = Tapahtui virhe tarkistettaessa, voiko sitoumus allekirjoittaa. +signing.wont_sign.error = Tapahtui virhe tarkistettaessa, voiko kommitin allekirjoittaa. signing.wont_sign.twofa = Sinulla tulee olla kaksivaiheinen todennus käytössä, jotta kommitit voi allekirjoittaa. pulls.data_broken = Tämä vetopyyntö on rikki johtuen puuttuvasta forkkitiedosta. pulls.files_conflicted = Tämä vetopyyntö sisältää muutoksia, jotka ovat ristiriidassa kohdehaaran kanssa. @@ -2549,6 +2558,36 @@ issues.unlock_error = Ongelmaa, jota ei ole lukittu, ei voi avata lukituksesta. +issues.tracking_already_started = `Olet jo aloittanut ajanseurannan toisessa ongelmassa!` +issues.cancel_tracking_history = `perui ajanseurannan %s` + +summary_card_alt = Tietovaraston %s yhteenvetokortti +migrate_options_lfs_endpoint.placeholder = Jos jätetty tyhjäksi, päätepiste johdetaan kloonaus-URL:stä +broken_message = Tämän tietovaraston taustalla olevaa Git-dataa ei voi lukea. Ota yhteys tämän instanssin ylläpitoon tai poista tietovarasto. +issues.edit.already_changed = Muutosten tallentaminen ongelmaan ei onnistu. Vaikuttaa siltä, että sisältöä on jo muutettu toisen käyttäjän toimesta. Päivitä sivu ja yritä muokata uudelleen välttääksesi muiden tekemien muutosten ylikirjoittamisen +issues.choose.invalid_templates = Virheellisiä mallipohjia löytyi %v +issues.filter_assginee_no_assignee = Ei käsittelijää +issues.action_assignee_no_select = Ei käsittelijää +issues.ref_issue_from = `viittasi tähän ongelmaan %[3]s %[1]s` +issues.due_date_invalid = Eräpäivä on virheellinen tai ajanjakson ulkopuolella. Käytä muotoa "yyyy-mm-dd". +issues.dependency.issue_close_blocked = Sinun täytyy sulkea kaikki tämän ongelman estävät ongelmat, ennen kuin voit sulkea tämän ongelman. +issues.review.pending.tooltip = Tämä kommentti ei ole näkyvissä tällä hetkellä muille käyttäjille. Lähettääksesi odottavat kommentit, valitse "%s" -> "%s/%s/%s" sivun yläosasta. +milestones.deletion_desc = Merkkipaalun poistaminen poistaa sen kaikista siihen liittyvistä ongelmista. Jatketaanko? +activity.title.issues_closed_from = %s sulkenut %s +settings.protected_branch_duplicate_rule_name = Tälle joukolle haaroja on jo olemassa sääntö + +commit.contained_in = Tämä kommitti sisältyy haaraan: +issues.ref_closing_from = `viittasi tähän ongelmaan vetopyynnöstä %[3]s, joka sulkee ongelman, %[1]s` +issues.ref_reopening_from = `viittasi tähän ongelmaan vetopyynnöstä %[3]s, joka avaa ongelman uudelleen, %[1]s` +issues.lock_no_reason = lukitsi ja rajoitti keskustelun avustajille %s +issues.dependency.no_permission_1 = Sinulla ei ole oikeutta lukea %d riippuvuutta +issues.dependency.no_permission_n = Sinulla ei ole oikeutta lukea %d riippuvuutta +pulls.editable = Muokattavissa +settings.wiki_branch_rename_success = Tietovaraston wikin haaranimi on normalisoitu onnistuneesti. +settings.wiki_branch_rename_failure = Tietovaraston wikin haaranimen normalisointi epäonnistui. +release.releases_for = Projektin %s julkaisut +release.tags_for = Projektin %s tagit + [graphs] component_loading_info = Tämä saattaa kestää hetken… component_failed_to_load = Odottamaton virhe. @@ -2673,6 +2712,9 @@ settings.change_orgname_redirect_prompt.with_cooldown.few = Vanha organisaation teams.all_repositories_helper = Tiimillä on pääsy kaikkiin tietovarastoihin. Tämän valitseminen lisää kaikki olemassa olevat tietovarastot tiimiin. settings.labels_desc = Lisää nimilappuja, joita voi käyttää tämän organisaation kaikkien tietovarastojen ongelmissa. +teams.general_access_helper = Jäsenten oikeudet päätetään alla olevan käyttöoikeustaulun perusteella. +teams.invite_team_member = Kutsu tiimiin %s + [admin] dashboard=Kojelauta users=Käyttäjätilit @@ -3119,6 +3161,9 @@ auths.force_smtps_helper = SMTPS:ää käytetään aina portissa 465. Aseta täm dashboard.resync_all_sshprincipals = Päivitä ".ssh/authorized_principals"-tiedosto Forgejon SSH-prinsipaaleilla. +auths.verify_group_membership = Vahvista ryhmäjäsenyys LDAP:issa (jätä suodatin tyhjäksi ohittaaksesi) +auths.oauth2_map_group_to_team_removal = Poista käyttäjät synkronoiduista tiimeistä, jos käyttäjä ei kuulu vastaavaan ryhmään. + [action] create_repo=loi tietovaraston %s rename_repo=asetti tietovaraston %[1]s uudeksi nimeksi %[3]s @@ -3473,6 +3518,11 @@ runs.no_workflows.help_write_access = Etkö tiedä, miten aloittaa Forgejo Actio +runs.status_no_select = Kaikki tilat + +workflow.dispatch.trigger_found = Tällä työnkululla on workflow_dispatch-tapahtumaliipaisin. +workflow.dispatch.success = Työnkulun suoritusta pyydettiin onnistuneesti. + [projects] type-1.display_name = Yksittäinen projekti deleted.display_name = Poistettu projekti diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini index 4ab4ccab8e..c2cf9fd951 100644 --- a/options/locale/locale_fil.ini +++ b/options/locale/locale_fil.ini @@ -938,8 +938,8 @@ keep_activity_private.description = Makikita mo lang at mga tagapangasiwa ng ins language.description = Mase-save ang wika sa iyong account at gagamitin bilang default pagkatapos mong mag-log in. language.localization_project = Tulungan kaming isalin ang Forgejo sa iyong wika! Matuto pa. user_block_yourself = Hindi mo maaaring harangan ang sarili mo. -change_username_redirect_prompt.with_cooldown.one = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown. -change_username_redirect_prompt.with_cooldown.few = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown. +change_username_redirect_prompt.with_cooldown.one = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng pagprotekta na %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang username sa panahon ng pagprotekta. +change_username_redirect_prompt.with_cooldown.few = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng pagprotekta na %[1]d na araw. Maaari mo pa ring ma-claim muli ang lumang username sa panahon ng pagprotekta. keep_pronouns_private = Ipakita lang ang mga panghalip sa mga naka-authenticate na user keep_pronouns_private.description = Itatago nito ang iyong mga panghalip mula sa mga bisita na hindi naka-log in. quota.applies_to_user = Nag-aapply ang mga sumusunod na panuntunan ng quota sa iyong account @@ -2752,7 +2752,7 @@ dashboard.deleted_branches_cleanup = Linisin ang mga binurang branch dashboard.update_migration_poster_id = I-update ang mga migration poster ID dashboard.git_gc_repos = I-garbage collect ang lahat ng mga repositoryo dashboard.resync_all_sshprincipals = I-update ang ".ssh/authorized_principals" file sa mga principal ng Forgejo SSH. -dashboard.resync_all_hooks = I-resychronize ang mga pre-receive, update at post-receive hook para sa lahat ng mga repositoryo +dashboard.resync_all_hooks = I-resychronize ang mga Git hook ng lahat ng mga repositoryo (pre-receive, post-receive, proc-receive, …) dashboard.cleanup_hook_task_table = Linisin ang hook_task table dashboard.cleanup_packages = Linisin ang mga na-expire na package dashboard.cleanup_actions = Linisin ang mga nag-expire na log at artifact mula sa mga aksyon diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini index 41a4f51227..f7d795e372 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -9,7 +9,7 @@ sign_in_with_provider = Sínigh isteach le %s sign_in_or = nó sign_out = Sínigh amach sign_up = Cláraigh -link_account = Cuntas Nasc +link_account = Nasc cuntas register = Cláraigh version = Leagan powered_by = Cumhachtaithe ag %s @@ -98,7 +98,7 @@ write = Scríobh preview = Réamhamharc loading = Á lódáil... error = Earráid -error404 = Níl an leathanach atá tú ag iarraidh a bhaint amach annníl tú údaraithe chun é a fheiceáil. +error404 = Níl an leathanach atá tú ag iarraidh a bhaint amach ann, nó baineadh éníl údarú agat é a fheiceáil. go_back = Ar ais invalid_data = Sonraí neamhbhailí: %v never = Riamh @@ -125,8 +125,26 @@ filter.not_archived = Gan Cartlannaithe filter.public = Poiblí filter.private = Príobháideach +return_to_forgejo = Fill ar ais go Forgejo +toggle_menu = Roghchlár scoránaigh +new_repo.title = Stórlann nua +new_migrate.title = Imirce nua +new_org.title = Eagraíocht nua +new_repo.link = Stórlann nua +new_migrate.link = Imirce nua +new_org.link = Eagraíocht nua +error413 = Tá do chuóta ídithe agat. +confirm_delete_artifact = An bhfuil tú cinnte gur mian leat an déantán "%s" a scriosadh? +filter.clear = Glan scagairí +filter.is_fork = Forcanna +filter.not_fork = Ní forcanna +filter.is_mirror = Scátháin +filter.not_mirror = Ní scátháin +filter.is_template = Teimpléid +filter.not_template = Ní teimpléid iad + [search] -search = Cuardaigh... +search = Cuardaigh… type_tooltip = Cineál cuardaigh fuzzy = Doiléir fuzzy_tooltip = Cuir san áireamh torthaí a mheaitseálann an téarma cuardaigh go dlúth freisin @@ -148,20 +166,32 @@ issue_kind = Saincheisteanna cuardaigh… pull_kind = Cuardaigh iarratais tarraingthe… keyword_search_unavailable = Níl cuardach de réir eochairfhocal ar fáil faoi láthair. Déan teagmháil le riarthóir an láithreáin. +union = Aontas +union_tooltip = Cuir torthaí san áireamh a mheaitseálann aon cheann de na heochairfhocail scartha le spás bán +regexp = RegExp +regexp_tooltip = Léirmhínigh an téarma cuardaigh mar ghnáthléiriú + [aria] navbar = Barra Nascleanúint footer = Buntásc footer.links = Naisc +footer.software = Maidir leis an mbogearra seo + [heatmap] number_of_contributions_in_the_last_12_months = %s ranníocaíochtaí le 12 mhí anuas less = Níos lú more = Níos mó +contributions_zero = Gan aon ranníocaíochtaí +contributions_format = {contributions} ar {month} {day}, {year} +contributions_one = ranníocaíocht +contributions_few = ranníocaíochtaí + [editor] buttons.heading.tooltip = Cuir ceannteideal leis -buttons.bold.tooltip = Cuir téacs trom leis -buttons.italic.tooltip = Cuir téacs iodálach leis +buttons.bold.tooltip = Cuir téacs trom leis (Ctrl+B / ⌘B) +buttons.italic.tooltip = Cuir téacs iodálach leis (Ctrl+I / ⌘I) buttons.quote.tooltip = Téacs luaigh buttons.code.tooltip = Cuir cód leis buttons.link.tooltip = Cuir nasc leis @@ -174,6 +204,19 @@ buttons.switch_to_legacy.tooltip = Úsáid an eagarthóir oidhreachta ina ionad buttons.enable_monospace_font = Cumasaigh cló monospace buttons.disable_monospace_font = Díchumasaigh cló monospace +buttons.indent.tooltip = Míreanna neadaithe leibhéal amháin +buttons.unindent.tooltip = Díneadaigh míreanna leibhéal amháin +buttons.new_table.tooltip = Cuir tábla leis +table_modal.header = Cuir tábla leis +table_modal.placeholder.header = Ceanntásc +table_modal.placeholder.content = Ábhar +table_modal.label.rows = Sraitheanna +table_modal.label.columns = Colúin +link_modal.header = Cuir nasc leis +link_modal.url = Url +link_modal.description = Cur síos +link_modal.paste_reminder = Leid: Le URL i do ghearrthaisce, is féidir leat é a ghreamú go díreach isteach san eagarthóir chun nasc a chruthú. + [filter] string.asc = A - Z string.desc = Z - A @@ -183,6 +226,9 @@ occurred = Tharla earráid not_found = Ní raibh an sprioc in ann a fháil. network_error = Earráid líonra +report_message = Má chreideann tú gur fabht Forgejo atá ann, déan cuardach ar shaincheisteanna ar Codeberg nó oscail saincheist nua más gá. +server_internal = Earráid inmheánach freastalaí + [startpage] app_desc = Seirbhís Git gan phian, féin-óstáil install = Éasca a shuiteáil @@ -191,6 +237,10 @@ platform = Tras-ardán lightweight = Éadrom license = Foinse Oscailte +platform_desc = Tá sé deimhnithe go n-oibríonn Forgejo ar chórais oibriúcháin saor in aisce ar nós Linux agus FreeBSD, chomh maith le hailtireachtaí LAP éagsúla. Roghnaigh an ceann is fearr leat! +lightweight_desc = Tá riachtanais íosta ísle ag Forgejo agus is féidir é a rith ar Raspberry Pi saor. Sábháil fuinneamh do mheaisín! +license_desc = Téigh agus faigh Forgejo! Bí linn trí cur leis chun an tionscadal seo a dhéanamh níos fearr fós. Ná bíodh drogall ort a bheith i do rannpháirtí! + [install] install = Suiteáil title = Cumraíocht Tosaigh @@ -267,6 +317,8 @@ enable_update_checker = Cumasaigh Seiceoir Nuashonraithe env_config_keys = Cumraíocht Comhshaoil env_config_keys_prompt = Cuirfear na hathróga comhshaoil seo a leanas i bhfeidhm ar do chomhad cumraíochta freisin: +docker_helper = Má ritheann tú Forgejo taobh istigh de Docker, léigh an doiciméadú le do thoil sula n-athraíonn tú aon socruithe. + [home] uname_holder = Ainm Úsáideora nó Seoladh Ríomhphoist switch_dashboard_context = Athraigh Comhthéacs an Deais diff --git a/options/locale/locale_he.ini b/options/locale/locale_he.ini index a93d430271..e1d3fc334e 100644 --- a/options/locale/locale_he.ini +++ b/options/locale/locale_he.ini @@ -143,7 +143,7 @@ webauthn_use_twofa = השתמש בקוד אימות דו־שלבי מהטלפו error413 = מיצית את ההגבלה שלך. [search] -search = חיפוש... +search = חיפוש… type_tooltip = סוג חיפוש fuzzy = מקורב union = מילות מפתח @@ -168,6 +168,8 @@ keyword_search_unavailable = חיפוש מילות מפתח לא זמין. נא code_search_unavailable = חיפוש קוד לא זמין. נא לדווח למנהלי המערכת. pull_kind = חיפוש בקשות מיזוג… +regexp_tooltip = פרש את החיפוש כביטוי רגולרי + [heatmap] number_of_contributions_in_the_last_12_months = % תרומות ב־12 החודשים האחרונים contributions_zero = אפס תרומות @@ -194,8 +196,8 @@ lightweight_desc = פורג'ו צורך כמות מינימלית של משאב buttons.list.unordered.tooltip = הוספת רשימה לא ממוספרת buttons.switch_to_legacy.tooltip = מעבר לעורך הישן buttons.heading.tooltip = הוספת כותרת -buttons.bold.tooltip = הדגשת טקסט -buttons.italic.tooltip = הטיית טקסט +buttons.bold.tooltip = הדגשת טקסט (Ctrl+B / ⌘B) +buttons.italic.tooltip = הטיית טקסט (Ctrl+I / ⌘I) buttons.quote.tooltip = ציטוט buttons.code.tooltip = הוספת קוד buttons.link.tooltip = הוספת קישור @@ -212,6 +214,12 @@ table_modal.placeholder.content = תוכן table_modal.label.rows = שורות table_modal.label.columns = עמודות +buttons.indent.tooltip = קנן פריטים ברמה אחת פנימה +buttons.unindent.tooltip = קנן פריטים ברמה אחת החוצה +link_modal.header = הוספת קישור +link_modal.url = Url +link_modal.description = תיאור + [filter] string.desc = סדר אלפבתי יורד string.asc = סדר אלפבתי עולה @@ -318,6 +326,19 @@ repository_files_already_exist = כבר יש קבצים בקרפיף זה. יש AccessToken = קוד גישה Content = תוכן +email_been_used = כתובת האימייל כבר בשימוש. +email_invalid = כתובת האימייל אינה תקינה. +username_password_incorrect = שם משתמש או סיסמה לא נכונים. +password_complexity = סיסמה לא עומדת בדרישות הסיבוכיות: +password_lowercase_one = לפחות אות אנגלית קטנה אחת +password_uppercase_one = לפחות אות אנגלית גדולה אחת +password_digit_one = לפחות ספרה אחת +password_special_one = לפחות תו מיוחד אחד (סימני פיסוק, סוגריים, מרכאות וכו') +enterred_invalid_repo_name = שם הריפו שהזנת אינו תקין. +enterred_invalid_org_name = שם הארגון שהוזן אינו תקין. +enterred_invalid_owner_name = שם הבעלים החדש אינו תקין. +enterred_invalid_password = הסיסמה שהזנת אינה נכונה. + [projects] deleted.display_name = פרויקט נמחק @@ -463,9 +484,47 @@ update_avatar = עדכון תמונת פרופיל delete_current_avatar = מחיקת תמונת הפרופיל הנוכחית uploaded_avatar_not_a_image = הקובץ שהועלה לא תמונה. +ssh_key_name_used = מפתח SSH עם אותו השם כבר קיים בחשבון שלך. +gpg_key_id_used = מפתח GPG ציבורי עם אותו מזהה כבר הוסף. +gpg_key_matched_identities = זהויות תואמות: +gpg_key_verified = מפתח מאומת +gpg_token_help = ניתן ליצור חתימה באמצעות: +key_signature_gpg_placeholder = מתחיל עם "---BEGIN PGP SIGNATURE--" +ssh_key_verified = מפתח מאומת +ssh_token_help = ניתן ליצור חתימה באמצעות: +key_signature_ssh_placeholder = מתחיל עם "---BEGIN SSH SIGNATURE--" +key_id = מזהה מפתח +no_activity = אין פעילות אחרונה +regenerate_token = צור מחדש +oauth2_client_id = מזהה תוכנת לקוח +oauth2_client_secret = סוד תוכנת לקוח +oauth2_regenerate_secret = צור סוד מחדש +oauth2_regenerate_secret_hint = איבדת את הסוד שלך? +twofa_disable = כבה אימות דו-שלבי +twofa_enroll = הפעל אימות דו-שלבי +twofa_disable_note = אפשר לכבות אימות דו-שלבי במידת הצורך. +twofa_disable_desc = כיבוי אימות דו-שלבי יגרום לחשבונך להיות פחות מאובטח. להמשיך? +twofa_disabled = אימות דו-שלבי כובה. +scan_this_image = סרוק את התמונה עם יישום האימות שלך: +or_enter_secret = או הזן את הסוד: %s +then_enter_passcode = הזן את קוד המעבר המוצג ביישום: +passcode_invalid = הקוד אינו נכון. נסה שוב. +webauthn_register_key = הוסף מפתח אבטחה +webauthn_nickname = כינוי +webauthn_delete_key = הסר מפתח אבטחה +webauthn_delete_key_desc = אם מפתח האבטחה יוסר אי אפשר יהיה להתחבר איתו. להמשיך? +webauthn_key_loss_warning = אם מבטח האבטחה יאבד, תאבד את הגישה לחשבון שלך. +webauthn_alternative_tip = ייתכן שתרצה להגדיר שיטת אימות נוספת. +manage_account_links = חשבונות מקושרים +manage_account_links_desc = חשבונות חיצוניים אלה קשורים לחשבון Forgejo שלך. +link_account = קשר חשבון +remove_account_link = הסר חשבון מקושר +remove_account_link_desc = הסר חשבון מקושר תבטל את גישה היישום לחשבון Forgejo שלך. להמשיך? +remove_account_link_success = החשבון המקושר הוסר. + [repo] new_advanced = הגדרות מתקדמות -new_advanced_expand = +new_advanced_expand = owner = בעלים repo_name = שם הקרפיף repo_name_helper = שמות קרפיפים טובים הם זכירים, קצרים וייחודיים. diff --git a/options/locale/locale_hi.ini b/options/locale/locale_hi.ini index 297f131b87..21ecd34f21 100644 --- a/options/locale/locale_hi.ini +++ b/options/locale/locale_hi.ini @@ -290,6 +290,10 @@ sign_up_successful = अकाउंट बन गया है। स्वा back_to_sign_in = sign in में फिर से जाएं sign_in_openid = OpenID के साथ आगे बढ़ें +confirmation_mail_sent_prompt = एक नया कन्फर्मेशन ईमेल आपको भेजा गया है, %s। पंजीकरण पुख्ता करने के लिए अपना ईमेल इनबॉक्स चेक करें और वहां ईमेल से आगे बढ़ें %s। अगर ईमेल गलत हो गया तो आप फिर से लॉग इन करके फिरसे सही ईमेल पर पुख्ता कर सकते हैं। +must_change_password = अपना पासवर्ड अपडेट करें +allow_password_change = ये ज़रूरी है की ईमेल पासवर्ड अपडेट करें + [mail] link_not_working_do_paste = क्या कड़ी चल नहीं पाई? उसे कॉपी करके URL बार में जोड़ें। hi_user_x = नमस्ते %s, diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index fce5fd5c6d..e6a1b7e67f 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -30,8 +30,8 @@ password=Password access_token=Token di accesso re_type=Conferma password captcha=CAPTCHA -twofa=Verifica in due passaggi -twofa_scratch=Codice di recupero per la verifica in due passaggi +twofa=Autenticazione a due fattori +twofa_scratch=Codice di recupero per l'autenticazione a due fattori passcode=Codice di sicurezza webauthn_insert_key=Inserisci la tua chiave di sicurezza @@ -786,7 +786,7 @@ ssh_helper= Hai bisogno di aiuto? Dai un'occhiata alla guida pe gpg_helper=Hai bisogno di aiuto? Dai un'occhiata alla guida di GitHub riguardo il GPG. key_content_ssh_placeholder=Inizia con "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", o "sk-ssh-ed25519@openssh.com" key_content_gpg_placeholder=Inizia con "-----BEGIN PGP PUBLIC KEY BLOCK-----" -add_new_principal=Aggiungi Principal +add_new_principal=Aggiungi principale ssh_key_been_used=Questa chiave SSH è già stata aggiunta al server. ssh_key_name_used=Una chiave SSH con lo stesso nome esiste già sul tuo account. ssh_principal_been_used=Questa chiave SSH è già stata aggiunta al server. @@ -942,7 +942,7 @@ change_username_redirect_prompt = Il tuo vecchio nome utente sarà reindirizzato permissions_public_only = Solo pubblico profile_desc = Su di te email_desc = Il tuo indirizzo email principale sarà usato per inviarti notifiche, ripristino di password e, se non è stato nascosto, per le operazioni Git effettuate da web. -add_email_confirmation_sent = Una email di conferma è stata inviata a "%s". Verifica la posta in arrivo entro %s per confermare il tuo indirizzo email. +add_email_confirmation_sent = Una email di conferma è stata inviata a "%s". Controlla la posta in arrivo e utilizza il link fornito entro %s per verificare il tuo indirizzo email. hidden_comment_types_description = I tipi di commenti spuntati qui non saranno mostrati nelle pagine delle segnalazioni. Per esempio, spuntare "Etichetta" rimuove tutti i commenti " ha aggiunto/rimosso ". hidden_comment_types.ref_tooltip = Commenti in cui questa segnalazione è stata citata da un'altra segnalazione/commit/… verify_ssh_key_success = La chiave SSH "%s" è stata verificata. @@ -2110,7 +2110,7 @@ settings.protect_whitelist_deploy_keys=Chiavi di deploy in whitelist con permess settings.protect_whitelist_users=Utenti nella whitelist per pushare settings.protect_whitelist_teams=Team nella whitelist per pushare settings.protect_merge_whitelist_committers=Attiva la whitelist per le fusioni -settings.protect_merge_whitelist_committers_desc=Consentire soltanto agli utenti o ai team in whitelist il permesso di unire le pull request di questo branch. +settings.protect_merge_whitelist_committers_desc=Consentire soltanto agli utenti o ai team nella lista bianca di poter unire le richieste di modifica di questo ramo. settings.protect_merge_whitelist_users=Utenti nella whitelist per il merging settings.protect_merge_whitelist_teams=Team nella whitelist per il merging settings.protect_check_status_contexts=Abilita controllo dello stato @@ -2136,8 +2136,8 @@ settings.block_outdated_branch=Blocca il merge se la pull request è obsoleta settings.block_outdated_branch_desc=Il merging non sarà possibile quando il ramo testa è dietro il ramo base. settings.default_branch_desc=Seleziona un branch del repository predefinito per le pull request ed i commit di codice: settings.default_merge_style_desc=Modalità di fusione predefinito -settings.choose_branch=Scegli un branch… -settings.no_protected_branch=Non ci sono branch protetti. +settings.choose_branch=Scegli un ramo… +settings.no_protected_branch=Non ci sono rami protetti. settings.edit_protected_branch=Modifica settings.protected_branch_required_approvals_min=Le autorizzazioni richieste non possono essere negative. settings.tags=Etichette @@ -2159,7 +2159,7 @@ settings.archive.header=Archivia questo repositorio settings.archive.success=Il repo è stato archiviato con successo. settings.archive.error=Si è verificato un errore durante il tentativo di archiviare il repo. Vedi il log per maggiori dettagli. settings.archive.error_ismirror=Non puoi archiviare un mirror repo. -settings.archive.branchsettings_unavailable=Le impostazioni dei branch non sono disponibili se il repo è archiviato. +settings.archive.branchsettings_unavailable=Le impostazioni dei rami non sono disponibili se il repo è archiviato. settings.archive.tagsettings_unavailable=Le impostazioni dei tag non sono disponibili nei repositori archiviati. settings.update_avatar_success=L'avatar del repository è stato aggiornato. settings.lfs=LFS @@ -2286,7 +2286,7 @@ release.add_tag=Crea tag branch.name=Nome ramo branch.delete_head=Elimina branch.delete_html=Elimina ramo -branch.create_branch=Crea branch %s +branch.create_branch=Crea ramo %s branch.deleted_by=Eliminato da %s branch.included_desc=Questo ramo fa parte del ramo predefinito branch.included=Incluso @@ -2380,7 +2380,7 @@ admin.failed_to_replace_flags = Impossibile sostituire flag del repositorio admin.flags_replaced = Flag del repositorio sostituite fork_branch = Ramo da clonare sulla derivazione fork_no_valid_owners = Questo repositorio non può essere derivato perché non ci sono proprietari validi. -mirror_address_url_invalid = L'URL fornito è invalido. Devi eseguire l'escape di tutti i componenti dell'URL correttamente. +mirror_address_url_invalid = L'URL fornito è invalido. Verifica che tutti i componenti dell'URL siano correttamente inseriti tra virgolette. mirror_address_protocol_invalid = L'URL fornito è invalido. Solo posizioni http(s):// o git:// possono essere usate come specchio. stars_remove_warning = Questo rimuoverà tutte le stelle da questo repositorio. blame.ignore_revs = Le revisioni in .git-blame-ignore-revs sono ignorate. Clicca qui per bypassare e vedere la vista incolpa normale. @@ -2943,7 +2943,7 @@ dashboard.update_mirrors=Aggiorna specchi dashboard.repo_health_check=Controlla integrità di tutti i repository dashboard.check_repo_stats=Controlla tutte le statistiche del repository dashboard.archive_cleanup=Elimina vecchi archivi del repository -dashboard.deleted_branches_cleanup=Pulisci branch eliminati +dashboard.deleted_branches_cleanup=Pulisci i rami eliminati dashboard.update_migration_poster_id=Aggiorna gli ID del poster di migrazione dashboard.git_gc_repos=Esegui la garbage collection su tutti i repository dashboard.resync_all_sshkeys=Aggiornare il file ".ssh/authorized_keys" con le chiavi SSH di Forgejo. @@ -3458,7 +3458,7 @@ merge_pull_request=`ha fuso la richiesta di modifica %[3]s#%[2]s transfer_repo=repository %s trasferito in %s push_tag=ha inviato il tag %[3]s su %[4]s delete_tag=tag eliminato %[2]s da %[3]s -delete_branch=branch eliminato %[2]s da %[3]s +delete_branch=ha eliminato il ramo %[2]s da %[3]s compare_branch=Confronta compare_commits=Confronta %d commits compare_commits_general=Confronta commit diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index f20a2f08ae..92844d5dce 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -195,6 +195,16 @@ buttons.disable_monospace_font=等幅フォントを無効にする buttons.unindent.tooltip = アイテムを1つずつネストの解除をする buttons.indent.tooltip = アイテムを1つずつネストする +buttons.new_table.tooltip = テーブル追加 +table_modal.header = テーブル追加 +table_modal.placeholder.header = ヘッダー +table_modal.label.rows = 行 +table_modal.label.columns = 列 +link_modal.header = リンク追加 +link_modal.url = Url +link_modal.description = 説明 +link_modal.paste_reminder = ヒント: クリップボードに URL があれば、エディターに直接貼り付けてリンクを作成できます。 + [filter] string.asc=A - Z string.desc=Z - A @@ -216,6 +226,8 @@ lightweight_desc=Forgejo の最小動作要件は小さくて、安価な Raspbe license=オープンソース license_desc=Go get Forgejo! 私たちと一緒にこのプロジェクトをより良くしていくために、何か貢献してみませんか。 些細なことでも大丈夫! 積極的にお願いします! +platform_desc = ForgejoはLinuxやFreeBSDなどのオープンソースOS、さまざまなCPUアーキテクチャで動作することが確認されています。お気に入りの環境を選んでください! + [install] install=インストール title=初期設定 @@ -440,6 +452,8 @@ sign_up_button = 今すぐ登録して下さい。 hint_login = すでにアカウントをお持ちですか? 今すぐサインイン! hint_register = アカウントが必要ですか? 今すぐ登録してください。 +use_onetime_code = ワンタイムコードを使用する + [mail] view_it_on=%s で見る reply=またはこのメールに直接返信してください @@ -668,6 +682,8 @@ following.title.few = フォロー中 followers.title.one = フォロワー followers.title.few = フォロワー +public_activity.visibility_hint.self_private_profile = あなたのプロフィールは非公開のため、あなたのアクティビティはあなたとインスタンス管理者にのみ表示されます。設定。 + [settings] profile=プロフィール account=アカウント @@ -688,7 +704,7 @@ webauthn=2要素認証 (セキュリティキー) public_profile=公開プロフィール biography_placeholder=自己紹介してください!(Markdownを使うことができます) location_placeholder=おおよその場所を他の人と共有 -profile_desc=あなたのプロフィールが他のユーザーにどのように表示されるかを制御します。あなたのプライマリメールアドレスは、通知、パスワードの回復、WebベースのGit操作に使用されます。 +profile_desc=あなたについて password_username_disabled=非ローカルユーザーのユーザー名は変更できません。詳細はサイト管理者にお問い合わせください。 full_name=フルネーム website=Webサイト @@ -749,7 +765,7 @@ manage_emails=メールアドレスの管理 manage_themes=デフォルトテーマ manage_openid=OpenIDアドレス email_desc=プライマリメールアドレスは、通知、パスワードの回復、さらにメールアドレスを隠さない場合は、WebベースのGit操作にも使用されます。 -theme_desc=この設定がサイト全体のデフォルトのテーマとなります。 +theme_desc=このテーマは、ログイン時のWebインターフェースで使用されます。 primary=プライマリー activated=アクティベート済み requires_activation=アクティベーションが必要 @@ -759,7 +775,7 @@ activations_pending=アクティベーション待ち can_not_add_email_activations_pending=保留中のアクティベーションがあります。新しいメールを追加する場合は、数分後にもう一度お試しください。 delete_email=削除 email_deletion=メールアドレスの削除 -email_deletion_desc=メールアドレスと関連情報をアカウントから削除します。 このメールアドレスを使ったGitのコミットはそのまま残ります。 続行しますか? +email_deletion_desc=メールアドレスと関連情報をアカウントから削除します。 このメールアドレスを使ったGitのコミットは変更されません。 続行しますか? email_deletion_success=メールアドレスを削除しました。 theme_update_success=テーマを更新しました。 theme_update_error=選択されたテーマが存在しません。 @@ -775,7 +791,7 @@ add_email_success=新しいメールアドレスを追加しました。 email_preference_set_success=メール設定を保存しました。 add_openid_success=新しいOpenIDアドレスを追加しました。 keep_email_private=メールアドレスを隠す -keep_email_private_popup=これにより、プロフィールからメールアドレスが非表示になります。ファイルのアップロードや編集など、ウェブインターフェース経由で行われるコミットのデフォルトとして使用されなくなり、マージコミットにも使用されません。代わりに、コミットをあなたのアカウントに関連付けるために特別なアドレス%sを使用できます。このオプションを変更しても、既存のコミットには影響しないことに注意してください。 +keep_email_private_popup=メールアドレスはプロフィールページに表示されず、ファイルアップロード、編集、マージコミットなどのWeb画面で行うコミットのデフォルトメールアドレスとしても使用されません。代わりに、コミットをユーザーアカウントに関連付けるために特別なアドレス %s が使用されます。この設定は既存のコミットに影響を与えません。 openid_desc=OpenIDを使うと外部プロバイダーに認証を委任することができます。 manage_ssh_keys=SSHキーの管理 @@ -959,7 +975,7 @@ visibility=ユーザーの公開範囲 visibility.public=パブリック visibility.public_tooltip=全員に表示されます visibility.limited=限定 -visibility.limited_tooltip=認証されたユーザーのみに表示されます +visibility.limited_tooltip=ログインしたユーザーのみに表示されます visibility.private=プライベート visibility.private_tooltip=あなたが参加した組織のメンバーのみに表示されます blocked_users_none = ブロックしているユーザーはいません。 @@ -981,6 +997,31 @@ language.description = この言語はアカウントに保存され、ログイ language.localization_project = Forgejo をあなたの言語に翻訳するのを手伝ってください。詳細はこちら。 quota = クオータ +storage_overview = ストレージ設定 +keep_pronouns_private = 認証されたユーザーにのみ代名詞を表示する +keep_pronouns_private.description = これにより、ログインしていないユーザーに対して代名詞が表示されなくなります。 +ssh_token_help_ssh_agent = または、SSH エージェント (SSH_AUTH_SOCK 変数が設定されている) を使用している場合: +regenerate_token = 再生成 +access_token_regeneration = アクセストークンを再生成する +access_token_regeneration_desc = トークンを再生成すると、そのトークンを使用しているアプリケーションからアカウントへのアクセスが取り消されます。この操作は元に戻せません。続行しますか? +regenerate_token_success = トークンが再生成されました。このトークンを使用するアプリケーションはアカウントにアクセスできなくなったため、新しいトークンで更新する必要があります。 +user_block_yourself = 自分自身をブロックすることはできません。 +quota.applies_to_user = あなたのアカウントには以下の制限が適用されます +quota.applies_to_org = この組織には以下の制限が適用されます +quota.rule.exceeded = 超過 +quota.rule.exceeded.helper = このルールのオブジェクトの合計サイズが制限を超えました。 +quota.rule.no_limit = 無制限 +quota.sizes.all = 全体 +quota.sizes.repos.all = リポジトリ +quota.sizes.repos.public = 公開リポジトリ +quota.sizes.repos.private = プライベートリポジトリ +quota.sizes.assets.attachments.all = 添付ファイル +quota.sizes.assets.attachments.issues = イシュー添付ファイル +quota.sizes.assets.attachments.releases = リリース添付ファイル +quota.sizes.assets.artifacts = アーティファクト +quota.sizes.assets.packages.all = パッケージ +quota.sizes.wiki = Wiki + [repo] new_repo_helper=リポジトリには、プロジェクトのすべてのファイルとリビジョン履歴が入ります。 すでにほかの場所でホストしていますか? リポジトリを移行 もどうぞ。 owner=オーナー @@ -1027,7 +1068,7 @@ object_format_helper=リポジトリのオブジェクトフォーマット。 readme=README readme_helper=READMEファイル テンプレートを選択してください readme_helper_desc=プロジェクトについての説明をひととおり書く場所です。 -auto_init=リポジトリの初期設定 (.gitignore、ライセンスファイル、READMEファイルの追加) +auto_init=リポジトリの初期設定 create_repo=リポジトリを作成 default_branch=デフォルトブランチ default_branch_label=デフォルト @@ -1039,7 +1080,7 @@ mirror_interval_invalid=ミラー間隔が不正です。 mirror_sync_on_commit=コミットがプッシュされたときに同期 mirror_address=クローンするURL mirror_address_desc=必要な資格情報は「認証」セクションに設定してください。 -mirror_address_url_invalid=入力したURLは無効です。 URLの構成要素はすべて正しくエスケープする必要があります。 +mirror_address_url_invalid=入力したURLは無効です。 URLの構成要素はすべて正しくエスケープされていることを確認してください。 mirror_address_protocol_invalid=入力したURLは無効です。 ミラーできるのは、http(s):// または git:// からだけです。 mirror_lfs=Large File Storage (LFS) mirror_lfs_desc=LFS データのミラーリングを有効にする。 @@ -1135,7 +1176,7 @@ migrate.migrate_items_options=追加の項目を移行するにはアクセス migrated_from=%[2]sから移行 migrated_from_fake=%[1]sから移行 migrate.migrate=%s からの移行 -migrate.migrating=%s から移行しています ... +migrate.migrating=%s から移行しています … migrate.migrating_failed=%s からの移行が失敗しました。 migrate.migrating_failed.error=移行に失敗しました: %s migrate.migrating_failed_no_addr=移行に失敗しました。 @@ -1590,8 +1631,8 @@ issues.lock.notice_3=- アンロックはいつでも可能です。 issues.unlock.notice_1=- 誰でもこのイシューにもう一度コメントできるようになります。 issues.unlock.notice_2=- 再びロックすることはいつでも可能です。 issues.lock.reason=ロックする理由 -issues.lock.title=このイシューの会話をロックします。 -issues.unlock.title=このイシューの会話をアンロックします。 +issues.lock.title=この会話をロックします。 +issues.unlock.title=この会話をアンロックします。 issues.comment_on_locked=ロックされているイシューにコメントはできません。 issues.delete=削除 issues.delete.title=このイシューを削除しますか? @@ -2165,7 +2206,7 @@ settings.update_githook=フックを更新 settings.add_webhook_desc=ForgejoはターゲットURLに、指定したContent TypeでPOSTリクエストを送ります。 詳細はWebhookガイドへ。 settings.payload_url=ターゲットURL settings.http_method=HTTPメソッド -settings.content_type=POST Content Type +settings.content_type=POST content type settings.secret=Secret settings.slack_username=ユーザー名 settings.slack_icon_url=アイコンのURL @@ -2258,7 +2299,7 @@ settings.packagist_api_token=API トークン settings.packagist_package_url=Packagist パッケージ URL settings.deploy_keys=デプロイキー settings.add_deploy_key=デプロイキーを追加 -settings.deploy_key_desc=デプロイキーには、リポジトリの読み取り専用プルアクセス権が与えられます。 +settings.deploy_key_desc=デプロイキーには、リポジトリの読み取り専用または読み取り/書き込みのアクセスを許可できます。 settings.is_writable=書き込みアクセスも有効にする settings.is_writable_info=このデプロイキーでリポジトリへのプッシュも許可します。 settings.no_deploy_keys=デプロイキーはまだありません。 @@ -2284,14 +2325,14 @@ settings.protect_enable_merge_desc=誰でも書き込み権限があれば、こ settings.protect_whitelist_committers=ホワイトリストでプッシュを制限 settings.protect_whitelist_committers_desc=ホワイトリストに登録したユーザーまたはチームにのみ、このブランチへのプッシュが許可されます。(強制プッシュ以外) settings.protect_whitelist_deploy_keys=プッシュ可能な書き込み権限を持つデプロイキーをホワイトリストに含める。 -settings.protect_whitelist_users=プッシュ・ホワイトリストに含むユーザー: -settings.protect_whitelist_teams=プッシュ・ホワイトリストに含むチーム: +settings.protect_whitelist_users=プッシュ・ホワイトリストに含むユーザー +settings.protect_whitelist_teams=プッシュ・ホワイトリストに含むチーム settings.protect_merge_whitelist_committers=マージ・ホワイトリストを有効にする settings.protect_merge_whitelist_committers_desc=ホワイトリストに登録したユーザーまたはチームにだけ、このブランチに対するプルリクエストのマージを許可します。 -settings.protect_merge_whitelist_users=マージ・ホワイトリストに含むユーザー: -settings.protect_merge_whitelist_teams=マージ・ホワイトリストに含むチーム: +settings.protect_merge_whitelist_users=マージ・ホワイトリストに含むユーザー +settings.protect_merge_whitelist_teams=マージ・ホワイトリストに含むチーム settings.protect_check_status_contexts=ステータスチェックを有効にする -settings.protect_status_check_patterns=ステータスチェック パターン: +settings.protect_status_check_patterns=ステータスチェック パターン settings.protect_status_check_patterns_desc=このルールの対象ブランチがマージ可能になる前に、どのステータスチェックがパスしなければならないかを、パターンで入力します。 各行にパターンを指定します。 この設定は空にできません。 settings.protect_check_status_contexts_desc=マージの前にステータスチェックがパスしていることを必須にします。 有効にした場合、まず他のブランチにコミットをプッシュしておき、このルールの対象ブランチのステータスチェックがパスしたあとに、マージまたは直接プッシュする必要があります。 マッチするコンテキストが無い場合は、コンテキストに関係なく最後のコミットが成功している必要があります。 settings.protect_check_status_contexts_list=この1週間に、このリポジトリに対して行われたステータスチェック @@ -2311,7 +2352,7 @@ settings.require_signed_commits_desc=署名されていない場合、または settings.protect_branch_name_pattern=保護ブランチ名のパターン settings.protect_branch_name_pattern_desc=保護ブランチ名のパターン。書き方については ドキュメント を参照してください。例: main, release/** settings.protect_patterns=パターン -settings.protect_protected_file_patterns=保護されるファイルのパターン (セミコロン';'で区切る): +settings.protect_protected_file_patterns=保護されるファイルのパターン (セミコロン';'で区切る) settings.protect_protected_file_patterns_desc=保護されたファイルは、このブランチにファイルを追加・編集・削除する権限を持つユーザーであっても、直接変更することができなくなります。 セミコロン(';')で区切って複数のパターンを指定できます。 パターンの文法については %[2]s を参照してください。 例: .drone.yml, /docs/**/*.txt settings.protect_unprotected_file_patterns=保護しないファイルのパターン (セミコロン';'で区切る): settings.protect_unprotected_file_patterns_desc=保護しないファイルは、ユーザーに書き込み権限があればプッシュ制限をバイパスして直接変更できます。 セミコロン(';')で区切って複数のパターンを指定できます。 パターンの文法については %[2]s を参照してください。 例: .drone.yml, /docs/**/*.txt @@ -2372,19 +2413,19 @@ settings.lfs_findcommits=コミットを検索 settings.lfs_lfs_file_no_commits=このLFSファイルに関するコミットはありません settings.lfs_noattribute=このパスはデフォルトブランチでlockable属性を与えられていません settings.lfs_delete=LFSファイル(OID %s)の削除 -settings.lfs_delete_warning=LFSファイルを削除すると、チェックアウトのときに 'object does not exist' エラーが発生するかもしれません。 よろしいですか? +settings.lfs_delete_warning=LFSファイルを削除すると、チェックアウトのときに "object does not exist"エラーが発生するかもしれません。 よろしいですか? settings.lfs_findpointerfiles=ポインタファイルを検索 settings.lfs_locks=ロック settings.lfs_invalid_locking_path=不正なパス: %s settings.lfs_invalid_lock_directory=ディレクトリはロックできません: %s settings.lfs_lock_already_exists=すでにロックされています: %s settings.lfs_lock=ロック -settings.lfs_lock_path=ロックするファイルパス... +settings.lfs_lock_path=ロックするファイルパス… settings.lfs_locks_no_locks=ロックなし settings.lfs_lock_file_no_exist=ロックしたファイルがデフォルトブランチにありません settings.lfs_force_unlock=強制ロック解除 settings.lfs_pointers.found=%d件のblobポインタ - 登録済 %d件、未登録 %d件 (実体ファイルなし %d件) -settings.lfs_pointers.sha=Blob SHA +settings.lfs_pointers.sha=Blobハッシュ settings.lfs_pointers.oid=OID settings.lfs_pointers.inRepo=Repo内 settings.lfs_pointers.exists=実ファイルあり @@ -2544,7 +2585,7 @@ topic.done=完了 topic.count_prompt=選択できるのは25トピックまでです。 topic.format_prompt=トピック名は英字または数字で始め、ダッシュ('-')やドット('.')を含めることができます。最大35文字までです。文字は小文字でなければなりません。 -find_file.go_to_file=ファイルへ移動 +find_file.go_to_file=ファイルを探す find_file.no_matching=一致するファイルが見つかりません error.csv.too_large=このファイルは大きすぎるため表示できません。 @@ -2674,8 +2715,37 @@ settings.protect_new_rule = 新しいブランチ保護ルールを作成する settings.discord_icon_url.exceeds_max_length = アイコンのURLは 2048 文字以下にする必要があります issues.new.assign_to_me = 自分に割り当て +new_from_template = テンプレートを使用する +new_from_template_description = このインスタンスで既存のリポジトリ テンプレートを選択して、その設定を適用できます。 +new_advanced = 詳細設定 +new_advanced_expand = クリックして展開 +auto_init_description = READMEファイルを含めてGit履歴を開始し、オプションでライセンスファイルと.gitignoreファイルも追加できます。 +archive.nocomment = リポジトリがアーカイブされているため、コメントすることはできません。 +archive.pull.noreview = このリポジトリはアーカイブされています。プルリクエストをレビューすることはできません。 +sync_fork.branch_behind_one = このブランチは %[2]s より %[1]d コミット遅れています +sync_fork.branch_behind_few = このブランチは %[2]s より %[1]d コミット遅れています +sync_fork.button = 同期 +editor.commit_email = コミットメールアドレス +issues.filter_no_results = 結果なし +issues.filter_no_results_placeholder = 検索フィルターを調整してみてください。 +issues.filter_type.all_pull_requests = すべてのプルリクエスト +issues.filter_sort.relevance = 関連度 +issues.num_reviews_one = %d件のレビュー +issues.num_reviews_few = %d件のレビュー +issues.reaction.add = リアクションを追加 +comment.blocked_by_user = リポジトリの所有者または作成者によってブロックされているため、コメントすることはできません。 +pulls.sign_in_require = 新しいプル リクエストを作成するには、サインインしてください。 +pulls.editable_explanation = このプルリクエストはメンテナーによる編集が許可されています。直接貢献することも可能です。 +pulls.delete_after_merge.head_branch.is_default = 削除しようとしているヘッド ブランチはデフォルトのブランチであるため、削除できません。 +pulls.delete_after_merge.head_branch.is_protected = 削除しようとしているHEADブランチは保護されたブランチであるため、削除できません。 +pulls.delete_after_merge.head_branch.insufficient_branch = HEADブランチを削除する権限がありません。 +settings.default_update_style_desc = ベースブランチより遅れているプルリクエストを更新する際に使用するデフォルトの更新スタイル。 +diff.git-notes.add = ノートを追加 +diff.git-notes.remove-header = ノートを削除 +diff.git-notes.remove-body = このメモは削除されます。 + [graphs] -component_loading = %s の読み込み中... +component_loading = %s の読み込み中… component_loading_failed = %s を読み込めませんでした component_loading_info = 少し時間がかかるかもしれません… component_failed_to_load = 予期しないエラーが発生しました。 @@ -2720,7 +2790,7 @@ settings.permission=許可 settings.repoadminchangeteam=リポジトリ管理者はチームのアクセス権の追加・削除が可能 settings.visibility=表示 settings.visibility.public=公開 -settings.visibility.limited=限定 (認証済みユーザーにのみ表示) +settings.visibility.limited=限定 (ログインしたユーザーにのみ表示) settings.visibility.limited_shortname=限定 settings.visibility.private=プライベート (組織メンバーにのみ表示) settings.visibility.private_shortname=プライベート @@ -2857,7 +2927,7 @@ dashboard.update_migration_poster_id=移行する投稿者IDの更新 dashboard.git_gc_repos=すべてのリポジトリでガベージコレクションを実行 dashboard.resync_all_sshkeys=Forgejo SSH キーを使用して".ssh/authorized_keys"ファイルを更新します。 dashboard.resync_all_sshprincipals=Forgejo SSH プリンシパルを使用して".ssh/authorized_principals"ファイルを更新します。 -dashboard.resync_all_hooks=すべてのリポジトリの pre-receive, update, post-receive フックを更新する +dashboard.resync_all_hooks=すべてのリポジトリの Git フックを再同期します (pre-receive、update、post-receive、proc-receive、…) dashboard.reinit_missing_repos=レコードが存在するが見当たらないすべてのGitリポジトリを再初期化する dashboard.sync_external_users=外部ユーザーデータの同期 dashboard.cleanup_hook_task_table=hook_taskテーブルのクリーンアップ @@ -2961,7 +3031,7 @@ users.list_status_filter.is_2fa_enabled=2要素認証有効 users.list_status_filter.not_2fa_enabled=2要素認証無効 users.details=ユーザーの詳細 -emails.email_manage_panel=ユーザーメールアドレスの管理 +emails.email_manage_panel=ユーザーのメールアドレスを管理 emails.primary=プライマリー emails.activated=アクティベート済み emails.filter_sort.email=メールアドレス @@ -3058,11 +3128,11 @@ auths.smtp_auth=SMTP認証タイプ auths.smtphost=SMTPホスト auths.smtpport=SMTPポート auths.allowed_domains=許可するドメイン -auths.allowed_domains_helper=すべてのドメインを許可する場合は空のままにします。 複数のドメインはカンマ(',')で区切ります。 +auths.allowed_domains_helper=すべてのドメインを許可する場合は空のままにします。 複数のドメインはカンマ(",")で区切ります。 auths.skip_tls_verify=TLS検証を省略 auths.force_smtps=強制的にSMTPSにする auths.force_smtps_helper=ポート465ではSMTPSが常に使用されます。 これを指定すると、他のポートでもSMTPSの使用を強制します。 (指定しない場合は、ホストがサポートしていればSTARTTLSが使用されます。) -auths.helo_hostname=HELOホストネーム +auths.helo_hostname=HELOホスト名 auths.helo_hostname_helper=HELOで送られるホスト名。現在のホスト名で送信する場合は空白にします。 auths.disable_helo=HELOを無効にする auths.pam_service_name=PAMサービス名 @@ -3122,9 +3192,9 @@ auths.unable_to_initialize_openid=OpenID Connectプロバイダーを初期化 auths.invalid_openIdConnectAutoDiscoveryURL=無効な自動検出URLです(http://またはhttps://で始まる有効なURLでなければなりません) config.server_config=サーバー設定 -config.app_name=サイトのタイトル +config.app_name=インスタンスのタイトル config.app_ver=Forgejoのバージョン -config.app_url=ForgejoのベースURL +config.app_url=ベースURL config.custom_conf=設定ファイルのパス config.custom_file_root_path=カスタムファイルのルートパス config.domain=サーバードメイン @@ -3138,7 +3208,7 @@ config.repo_root_path=リポジトリのルートパス config.lfs_root_path=LFSルートパス config.log_file_root_path=ログの保存先パス config.script_type=スクリプトの種類 -config.reverse_auth_user=リバース認証ユーザー +config.reverse_auth_user=リバースプロキシ認証ユーザー config.ssh_config=SSH設定 config.ssh_enabled=有効 @@ -3148,7 +3218,7 @@ config.ssh_port=ポート config.ssh_listen_port=待受ポート config.ssh_root_path=ルートパス config.ssh_key_test_path=キーテストパス -config.ssh_keygen_path=キージェネレータ('ssh-keygen')パス +config.ssh_keygen_path=キージェネレータ("ssh-keygen")パス config.ssh_minimum_key_size_check=最小キー長のチェック config.ssh_minimum_key_sizes=最小キー長 @@ -3174,7 +3244,7 @@ config.allow_only_external_registration=外部サービスを使用した登録 config.enable_openid_signup=OpenIDを使ったセルフ登録有効 config.enable_openid_signin=OpenIDを使ったサインイン有効 config.show_registration_button=登録ボタンを表示 -config.require_sign_in_view=ページ閲覧にサインインが必要 +config.require_sign_in_view=コンテンツを表示するにはサインインが必要 config.mail_notify=メール通知有効 config.enable_captcha=CAPTCHA有効 config.active_code_lives=アカウント確認リンクの有効時間 @@ -3199,7 +3269,7 @@ config.mailer_enabled=有効 config.mailer_enable_helo=HELO有効 config.mailer_name=名称 config.mailer_protocol=プロトコル -config.mailer_smtp_addr=SMTPアドレス +config.mailer_smtp_addr=SMTPホスト config.mailer_smtp_port=SMTPポート config.mailer_user=ユーザー config.mailer_use_sendmail=Sendmailを使う @@ -3210,7 +3280,7 @@ config.mailer_use_dummy=Dummy config.test_email_placeholder=Email (例 test@example.com) config.send_test_mail=テストメールを送信 config.send_test_mail_submit=送信 -config.test_mail_failed=`"%s" へのテストメール送信に失敗しました: %v` +config.test_mail_failed="%s" へのテストメール送信に失敗しました: %v config.test_mail_sent=テストメールを "%s" へ送信しました。 config.oauth_config=OAuth設定 @@ -3238,8 +3308,8 @@ config.enable_federated_avatar=フェデレーテッド・アバター有効 config.git_config=Git設定 config.git_disable_diff_highlight=Diffのシンタックスハイライトが無効 -config.git_max_diff_lines=最大の差分行数(1ファイルあたり) -config.git_max_diff_line_characters=最大の差分文字数(1行あたり) +config.git_max_diff_lines=ファイルあたりの最大差分行数 +config.git_max_diff_line_characters=1行あたりの最大差分文字数 config.git_max_diff_files=差分を表示する最大ファイル数 config.git_gc_args=GC引数 config.git_migrate_timeout=移行タイムアウト @@ -3299,7 +3369,7 @@ monitor.queue.settings.remove_all_items=すべて削除 monitor.queue.settings.remove_all_items_done=キュー内のすべての項目を削除しました。 notices.system_notice_list=システム通知 -notices.view_detail_header=通知の詳細を表示 +notices.view_detail_header=通知の詳細 notices.operations=操作 notices.select_all=すべて選択 notices.deselect_all=すべて選択解除 @@ -3705,6 +3775,10 @@ runs.no_job = ワークフローには少なくとも1つのジョブが含ま runs.expire_log_message = ログは古すぎるため消去されています。 +runs.no_workflows.help_write_access = Forgejo アクションの始め方がわからない場合は、ユーザードキュメントのクイック スタートを参照して最初のワークフローを作成し、次に Forgejo ランナーをセットアップしてジョブを実行して下さい。 +runs.no_workflows.help_no_write_access = Forgejoアクションの詳細については、ドキュメントを参照してください。 +variables.not_found = 変数が見つかりませんでした。 + [projects] type-1.display_name=個人プロジェクト type-2.display_name=リポジトリ プロジェクト @@ -3782,7 +3856,7 @@ pulls.write = 書き込み: プルリクエストをクローズし、ラ wiki.read = 読み取り: 統合された wiki とその履歴を読み取れます。 wiki.write = 書き込み: 統合された Wiki 内のページを作成、更新、削除します。 projects.read = 読み取り: リポジトリ プロジェクト ボードにアクセスします。 -actions.read = 読み取り: 統合された CI/CD パイプラインとそのログを表示します。 +actions.read = 読み取り: ワークフローの実行とそのログを表示します。 [translation_meta] test = これはテスト文字列です。Forgejo UI には表示されませんが、テスト目的で使用されます。早く済ませるために"ok"と入力するか楽しかった出来事を入力して下さい。そうすれば、完了することができます :) diff --git a/options/locale/locale_kab.ini b/options/locale/locale_kab.ini index 9fd0dd6222..683b6c3268 100644 --- a/options/locale/locale_kab.ini +++ b/options/locale/locale_kab.ini @@ -1,6 +1,3 @@ - - - [common] home = Agejdan username = Isem n useqdac @@ -39,7 +36,7 @@ template = Tamudemt notifications = Ilɣa create_new = Snulfu-d… licenses = Turagin -captcha = CAPČA +captcha = KAPČA passcode = Angal n wadduf settings = Iɣewwaren your_profile = Amaɣnu @@ -67,6 +64,21 @@ link_account = Qqen amiḍan email = Tansa imayl access_token = Ajuṭu n unekcum +sign_in_with_provider = Qqen s %s +powered_by = S lmendad n %s +user_profile_and_more = Amaɣnu akken iɣewwaren… +signed_in_as = D uqqin amzun d +enable_javascript = Asmel-a Web yesra JavaScript. +return_to_forgejo = Tuɣalin ɣer Forgejo +twofa = Asesteb s snat n tarrayin +copy_url = Nɣel tansa URL +copy_path = Nɣel abrid +copy_content = Nɣel agbur +go_back = Uɣal ɣee deffir + +admin_panel = Tadbelt n wesmel +filter.not_template = Mačči d timudmiwin + [user] code = Tangalt repositories = Ikufan @@ -81,6 +93,12 @@ following.title.few = Yeṭṭafaṛ unfollow = Ur ṭṭafar ara overview = Tamuɣli s umata +settings = Iɣewwaren n useqdac + +change_avatar = Beddel avaṭar-ik… +activity = Armud azayez +block_user = Sewḥel aseqdac + [org] code = Tanglat team_desc = Aglam @@ -91,6 +109,17 @@ settings.options = Tuddsa members.remove = Kkes teams.settings = Iɣewwaren +create_new_team = Agraw amaynut +create_team = Snulfu-d yiwen n ugraw +team_name = Isem n ugraw +settings.visibility.public = Azayaz +settings.visibility.private_shortname = Uslig +members.private = Yettwaffer +members.owner = Bab-is +members.member = Aɛeggal + +settings = Iɣewwaren + [repo] release.source_code = Tangalt taɣbalut settings.slack_username = Isem n useqdac @@ -263,6 +292,92 @@ activity.period.quarterly = 3 n wayyuren activity.period.semiyearly = 6 n wayyuren activity.period.yearly = 1 n useggas +new_advanced = Iɣewwaren leqqayen +template_select = Fren yiwet n tmudemt +download_zip = Sader-d ZIP +download_tar = Sader-d TAR.GZ +download_bundle = Sader-d BUNDLE +editor.add_tmpl = Rnu "<%s>" +editor.add = Rnu %s +projects.edit = Ẓreg asenfar +projects.modify = Ẓreg asenfar +wiki.page_title = Azwel n usebtar +wiki.page_content = Agbur n usebter +wiki.save_page = Sekles asebter +wiki.new_page_button = Asebter amaynut +wiki.delete_page_button = Kkes asebter +wiki.search = Nadi deg wiki +wiki.no_search_results = Ulac igmaḍ yettwafen +activity.title.user_1 = %d n useqdac +activity.title.user_n = %d n iseqdacen +activity.git_stats_file_1 = %d n ufaylu +activity.git_stats_file_n = %d n ifuyla +settings.collaboration.admin = Anedbal +settings.collaboration.write = Tira +settings.collaboration.read = Taɣuṛi +settings.collaboration.owner = Bab-is +settings.sync_mirror = Mtawi tura +settings.update_settings = Sekles iɣewwaren +settings.advanced_settings = Iɣewwaren leqqayen +settings.admin_settings = Iɣewwaren n unedbal +settings.add_team = Rnu yiwen n ugraw +settings.slack_icon_url = URL n tignit +settings.discord_icon_url = URL n tignit +settings.event_create = Snulfu-d +settings.event_delete = Tukksa +settings.graphql_url = URL n GraphQL +settings.web_hook_name_msteams = Microsoft Teams +settings.web_hook_name_larksuite_only = Lark Suite +settings.packagist_username = Isem n useqdac n Packagist +release.draft = Arewway + +new_from_template = Seqdec tamudemt +size_format = %[1]s: %[2]s, %[3]s: %[4]s +use_template = Fren tamudemt-a +open_with_editor = Ldi s %s +license_helper = Fren afaylu n turagt +template.items = Iferdisen n tmudemt +download_file = Sader-d afaylu +editor.name_your_file = Efk-as isem i ufaylu-k… +editor.delete = Kkes %s +editor.new_branch_name_desc = Isem amaynut n tseṭṭa… +editor.filename_is_invalid = Isem n ufaylu d arameɣtu: "%s". +editor.fail_to_update_file_summary = Izen n tuccḍa: +editor.add_subdir = Rnu akaram… +projects.create = Snulfu-d asenfar +projects.new = Asenfar amaynut +projects.deletion = Kkes asenfar +projects.column.set_default = Sbadu-t d amezwer +projects.card_type.text_only = Aḍris kan +issues.filter_no_results = Ulac igmaḍ +issues.new.open_projects = Isenfaren yeldin +issues.open_title = Yeldin +issues.closed_title = Yemedlen +issues.num_comments_1 = %d n uwennit +issues.num_comments = %d n iwenniten +issues.context.copy_link = Nɣel aseɣwen +issues.label_count = %d n tebzimin +issues.label_modify = Ẓreg tabzimt +issues.label_deletion = Kkes tabzimt +pulls.merge_conflict_summary = Izen n tuccḍa +pulls.status_checks_details = Talqayt +wiki.welcome = Ansuf ar uwiki. +activity.closed_issue_label = Yemedlen +activity.unresolved_conv_label = Ldi +settings = Iɣewwaren +settings.basic_settings = Iɣewwaren n taffa +settings.federation_settings = Iɣewwaren n tfidiralit +settings.tracker_issue_style.numeric = Umḍin +settings.tracker_issue_style.alphanumeric = Agmumḍin +settings.teams = Igrawen +settings.slack_token = Tiddest +settings.slack_domain = Taɣult +settings.slack_channel = Abadu +settings.lfs = LFS +diff.git-notes = Tizmilin +diff.comment.reply = Efk-d tiririt +diff.review.comment = Awennit + [install] admin_password = Awal n uɛeddi password = Awal n uɛeddi @@ -274,6 +389,21 @@ ssl_mode = SSL path = Abrid db_name = Isem n taffa n yisefka +general_title = Iɣewwaren Imuta +app_name = Azwel n tummant +admin_name = Isem n useqdac n unedbal +confirm_password = Serggeg awal n uɛeddi +admin_email = Tansa imayl +install_btn_confirm = Sebded Forgejo + +domain = Taɣult n aqeddac +app_url = URL n taffa +email_title = Iɣewwaren n imayl +smtp_addr = Asenneftaɣ n SMTP +smtp_port = Tawwurt n SMTP +mailer_user = Isem n useqdac SMTP +mailer_password = Awal n uɛeddi SMTP + [admin] notices.type_1 = Akufi packages.repository = Akufi @@ -299,10 +429,57 @@ dashboard.statistic = Agzul users.2fa = 2FA config.db_ssl_mode = SSL +first_page = Amezwaru +last_page = Aneggaru +users.edit = Ẓreg +emails.filter_sort.email = Imayl +orgs.teams = Igrawen +orgs.members = Imttekkiyen +repos.owner = Bab-is +config.mailer_user = Aseqdac + +users.full_name = Isem ummid +users.admin = Anedbal +users.last_login = Tuqqna taneggarut +users.auth_source = Tiɣbula n usesteb +users.is_activated = Amiḍan-a d urmid +users.list_status_filter.is_admin = Anedbal +repos.size = Tiddi +repos.lfs_size = Tiddi LFS +packages.owner = Bab-is +packages.creator = Asaraw +packages.version = Lqem +packages.type = Tawsit +packages.size = Tiddi +auths.search_page_size = Tiddi n usebter +auths.tips.gmail_settings = Iɣewwaren n Gmail: +config.server_config = Tawila n uqeddac +config.app_name = Azwel n wesmel +config.app_ver = Lqem n Forgejo +config.app_url = URL n taffa n Forgejo +config.domain = Taɣult n uqeddac +config.ssh_config = Tawila n SSH +config.mailer_smtp_port = Tawwurt n SMTP +config.mailer_use_sendmail = Seqdec Sendmail +config.https_only = HTTPS kan +config.git_config = Tawila n Git +monitor.queue.settings.remove_all_items = Kkes-iten akk + [search] code_kind = Nadi tangalt… search = Nadi… +repo_kind = Nadi deg ikufiyen… +user_kind = Nadi iseqdacen… +org_kind = Nadi tirmisin… +team_kind = Nadi igrawen… +package_kind = Nadi ikemmusen… +project_kind = Nadi isenfaren… +branch_kind = Nadi tiseḍwa… + +type_tooltip = Tawsit n unadi +union = Tadukli + [mail] release.download.targz = Tangalt taɣbalut (TAR.GZ) release.download.zip = Tangalt taɣbalut (ZIP) @@ -310,6 +487,15 @@ release.note = Tazmilt: release.downloads = Isidar: repo.transfer.to_you = kečč·kemm +hi_user_x = Azul a %s, +admin.new_user.user_info = Talɣut ɣef useqdac +register_notify = Ansuf ar %s +release.title = Azwel: %s + +view_it_on = Wali-t ɣef %s +activate_account = Ttxil, rmed amiḍan-ik +issue.in_tree_path = Deg %s : + [editor] buttons.code.tooltip = Rnu tangalt table_modal.placeholder.content = Agbur @@ -321,12 +507,18 @@ table_modal.label.rows = Izirigen buttons.new_table.tooltip = Rnu tafelwit table_modal.header = Rnu tafelwit +buttons.link.tooltip = Rnu yiwen n useɣwen + +link_modal.header = Rnu yiwen n useɣwen + [explore] code = Tanglat repos = Ikufan users = Iseqdacen organizations = Tuddsiwin +go_to = Ddu ɣer + [form] UserName = Isem n useqdac Password = Awal n uɛeddi @@ -340,6 +532,16 @@ TeamName = Isem n terbaɛt Email = Tansa imayl Retype = Sentem awal n uɛeddi +FullName = Isem ummid + +AdminEmail = Imayl n unedbal +To = Isem n tseṭṭa +AccessToken = Tiddest n wadduf +NewBranchName = Isem amaynut n tseṭṭa +require_error = ` ur izmir ara ad yeqqim d ilem.` +user_not_exist = Aseqdac-a ur yelli ara. +team_not_exist = Agraw-a ur yelli ara. + [aria] footer.links = Iseɣwan footer = Aḍar n usebter @@ -351,16 +553,32 @@ more = Ugar lightweight = D afessas license = Aɣbalu yeldin +install = Fessus i usebded + [home] my_repos = Ikufan show_private = Uslig my_orgs = Tuddsiwin +uname_holder = Isem n useqdac neɣ tansa imayl + [auth] openid_connect_submit = Tuqqna verify = Senqed login_userpass = Qqen +create_new_account = Snulfu-d amiḍan +forgot_password_title = Tettuḍ awal n uɛeddi +forgot_password = Tettuḍ awal n uɛeddi? +sign_up_button = Asnulfu n umiḍan. +reset_password = Tiririt n umiḍan + +active_your_account = Sermed amiḍan-ik +account_activated = Amiḍan-a yettwarmed +openid_register_title = Snulfu-d amiḍan amaynut +back_to_sign_in = Tuɣalin ar tuqqna +sign_in_openid = Kemmel s OpenID + [modal] yes = Ih no = Uhu @@ -418,6 +636,53 @@ delete_email = Kkes update_language = Beddel tutlayt language.title = Tutlayt tamezwarut +blocked_users = Imiḍanen yettusḥebsen +old_password = Awal n uɛeddi amiran +new_password = Awal n uɛeddi amaynut +manage_themes = Asentel amezwer +manage_openid = Tansiwin OpenID +add_key = Rnu yiwet n tsarut +quota.sizes.git.lfs = Git LFS + +ssh_gpg_keys = Tisura SSH / GPG +profile_desc = Fell-ak·am +full_name = Isem ummid +pronouns = ismawen +update_theme = Beddel asentel +update_profile = Ẓreg amaɣnu +update_language_not_found = Tutlayt n "%s" ur telli ara. +update_language_success = Tettwaleqqem tutlayt. +language.localization_project = Ɛawen-aɣ ad d-nessuqel Forgejo ɣer tutlayt-nwen! Lmed ugar. +change_password = Senfel awal n uɛeddi +update_password = Leqqem awal n uɛeddi +retype_new_password = Serggeg tikkelt-nniḍen awal n uɛeddi amaynut +password_incorrect = Awal-a n uɛeddi amiran d arameɣtu. +manage_emails = Sefrek tansiwin n imayl +activated = D urmid +primary_email = Err-itt d tansa-k tamezwarut +email_deletion = Kkes tansa imayl +theme_update_success = Yettuleqqem usentel-ik. +theme_update_error = Asentel yettufernen ulac-it. +openid_deletion = Kkes tansa OpenID +add_new_email = Rnu tansa imayl +add_email = Rnu tansa imayl +manage_ssh_keys = Sefrek tisura SSH +manage_gpg_keys = Sefrek tisura GPG +add_new_principal = Rnu agejdan +key_id = Asulay ID n tsarut +key_name = Isem n tsarut +ssh_key_deletion = Kkes tasarut SSH +gpg_key_deletion = Kkes tasarut GPG +generate_new_token = Sarew-d tiddest tamaynut +token_name = Isem n tiddest +generate_token = Sarew-d tiddest +permissions_public_only = Azayez kan +oauth2_application_name = Isem n usnas +webauthn_register_key = Rnu yiwet n tsarut n tɣellist +webauthn_delete_key = Kkes tasarut-nni n tɣellist +delete_account = Kkes amiḍan-ik +quota.sizes.git.all = Agbur deg Git + [packages] arch.version.description = Aglam alpine.repository.branches = Tiṣeḍwa @@ -430,6 +695,12 @@ alt.repository.architectures = Tisegda container.images.title = Tugniwin container.details.platform = Tiɣerɣert +installation = Asebded +details.project_site = Asmel Web n usenfar +details.repository_site = Asmel Web n ukufi +details.documentation_site = Asmel Web n tsemlit +versions.view_all = Wali-ten akk + [actions] runners.description = Aglam runners.name = Isem @@ -439,4 +710,23 @@ runners.task_list.repository = Akufi type-2.display_name = Asenfar n ukufi [error] -network_error = Tuccḍa deg uẓeṭṭa \ No newline at end of file +network_error = Tuccḍa deg uẓeṭṭa + +occurred = Tella-d tuccḍa + +[filter] +string.asc = A - Z +string.desc = Z - A + +[tool] +1mon = 1 n wayyur +1y = 1 n useggas +days = %d n wussan +weeks = %d n imalasen +months = %d n wayyuren +years = %d n iseggasen + +1d = 1 n wass + +[dropzone] +remove_file = Kkes afaylu \ No newline at end of file diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index b8ffcc190d..0f4f096331 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -178,9 +178,9 @@ less = 적은 more = 많은 [editor] -buttons.italic.tooltip = 기울어진 텍스트 추가 +buttons.italic.tooltip = 기울어진 텍스트 추가 (Ctrl+I / ⌘I) buttons.heading.tooltip = 헤딩 추가 -buttons.bold.tooltip = 두꺼운 텍스트 추가 +buttons.bold.tooltip = 두꺼운 텍스트 추가 (Ctrl+B / ⌘B) buttons.code.tooltip = 코드 추가 buttons.link.tooltip = 링크 추가 buttons.quote.tooltip = 인용구 추가 @@ -199,6 +199,13 @@ table_modal.placeholder.content = 내용 table_modal.label.rows = 행 table_modal.label.columns = 열 +buttons.indent.tooltip = 항목들을 한 단계 들여쓰기 +buttons.unindent.tooltip = 항목들을 한 단계 내어쓰기 +link_modal.header = 링크 추가 +link_modal.url = Url +link_modal.description = 설명 +link_modal.paste_reminder = 힌트: 클립보드에 URL이 있으면 편집기에 직접 붙여 넣어 링크를 만들 수 있습니다. + [filter] string.desc = 하 - 가 string.asc = 가 - 하 @@ -331,6 +338,15 @@ env_config_keys = 환경 설정 invalid_password_algorithm = 올바르지 않은 암호 해시 알고리즘 invalid_db_table = 데이터베이스 테이블 "%s"이(가) 올바르지 않습니다: %v +domain_helper = 서버의 도메인 혹은 호스트 주소. +require_sign_in_view.description = 콘텐츠 접근을 로그인한 사용자에게만 허용합니다. 손님은 인증 페이지를 통해서만 방문할 수 있습니다. +config_location_hint = 이 구성 옵션은 다음 위치에 저장됩니다: +invalid_app_data_path = 앱 데이터 경로가 잘못되었습니다: %v +internal_token_failed = 내부 토큰을 생성하는데 실패했습니다: %v +enable_update_checker_helper_forgejo = 이것은 release.forgejo.org의 TXT DNS 레코드를 확인함으로써 주기적으로 새로운 Forgejo 버전을 확인할 것입니다. +password_algorithm_helper = 비밀번호 해싱 알고리즘을 설정합니다. 알고리즘은 요구사항과 강점이 서로 다릅니다. Argon2 알고리즘은 상당히 안전하지만 많은 메모리를 사용하므로 소형 시스템에는 적합하지 않을 수 있습니다. +env_config_keys_prompt = 다음 환경 변수들은 구성 파일에도 저장됩니다: + [home] uname_holder=사용자명 또는 이메일 주소 switch_dashboard_context=대시보드 컨텍스트 바꾸기 @@ -343,12 +359,23 @@ issues.in_your_repos=당신의 저장소에 feed_of = "%s"의 피드 filter = 다른 필터 +filter_by_team_repositories = 팀 저장소로 필터링 +show_archived = 보관됨 +show_both_archived_unarchived = 보관된 항목과 보관되지 않은 항목 모두 표시 +show_only_archived = 보관된 항목만 표시 +show_only_unarchived = 보관되지 않은 항목만 표시 +show_both_private_public = 공개 및 비공개 모두 표시 +show_only_private = 비공개만 표시 +show_only_public = 공개만 표시 + [explore] repos=저장소 users=사용자 organizations=조직 code=코드 +go_to = 이동 + [auth] create_new_account=계정 등록 disable_register_prompt=계정 등록이 비활성화 되었습니다. 사이트 관리자에게 문의해주십시오. @@ -1841,4 +1868,5 @@ union = 통합 검색 union_tooltip = 공백으로 구분된 키워드 중 하나라도 일치하는 결과를 포함하세요 exact = 정확한 regexp = 정규 표현식 -regexp_tooltip = 검색어를 정규 표현식으로 해석합니다 \ No newline at end of file +regexp_tooltip = 검색어를 정규 표현식으로 해석합니다 +runner_kind = 러너 검색… \ No newline at end of file diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 4b518260d4..1745af2776 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1040,7 +1040,7 @@ visibility_description=Tikai apvienības īpašnieks vai tās dalībnieki, ja vi visibility_helper=Padarīt glabātavu privātu visibility_helper_forced=Vietnes pārvaldītājs ir noteicis, ka jaunām glabātavām ir jābūt privātām. visibility_fork_helper=(Šīs vērtības mainīšana ietekmēs visus atzarojumus.) -clone_helper=Nepieciešama palīdzība klonēšanā? Apmeklē palīdzības sadaļu. +clone_helper=Nepieciešama palīdzība klonēšanā? Apmeklē palīdzības sadaļu! fork_repo=Izveidot glabātavas atzarojumu fork_from=Izveidot atzarojumu no already_forked=Jau ir atzarojums no %s diff --git a/options/locale/locale_mic.ini b/options/locale/locale_mic.ini new file mode 100644 index 0000000000..381e2b236c --- /dev/null +++ b/options/locale/locale_mic.ini @@ -0,0 +1,5 @@ +[common] +home = L'mie +help = apoqnmui +ok = A' +name = Teluisi diff --git a/options/locale/locale_nb_NO.ini b/options/locale/locale_nb_NO.ini index 14bee09141..e751aec344 100644 --- a/options/locale/locale_nb_NO.ini +++ b/options/locale/locale_nb_NO.ini @@ -141,7 +141,7 @@ filter.not_fork = Ikke forks pull_requests = Pull requests copy_branch = Kopier branch navn error404 = Siden du forsøker å nå eksisterer ikke, er blitt fjernet eller du har ikke tilgang til å se den. -tracked_time_summary = Oppsummering av sporet tid basert på problemfiltre +tracked_time_summary = Oppsummering av registrert tid basert på problemfiltre [search] search = Søk… @@ -206,6 +206,40 @@ reset_password = Kontogjenoppretting invalid_code = Din bekreftningskode er ugyldig eller har utløpt. invalid_code_forgot_password = Din bekreftningskode er ugyldig eller har utløpt. Trykk her for å starte ny økt. +invalid_password = Passordet ditt er ikke det samme som ble brukt til å opprette kontoen. +reset_password_helper = Gjenopprett konto +reset_password_wrong_user = Du er logget på som %s, men lenken for gjenoppretting av kontoen er tiltenkt %s +password_too_short = Lengden på passordet kan ikke være kortere enn %d tegn. +non_local_account = Brukere fra andre kilder kan ikke oppdatere passordet ved hjelp av Forgejos webgrensesnitt. +unauthorized_credentials = Akkreditering er uriktig eller har løpt ut. Gjenta kommandoen eller se %s for mer informasjon +scratch_code = Sikkerhetskode +use_scratch_code = Bruk sikkerhetskode +use_onetime_code = Bruk engangskode +twofa_scratch_used = Du har brukt sikkerhetskoden din. Du har blitt videresendt til siden for tofaktorinnstillinger, slik at du kan fjerne din enhetsregistrering eller generere en ny sikkerhetskode. +twofa_passcode_incorrect = Tilgangskoden din er feil. Om du har forlagt enheten, kan du bruke sikkerhetskoden for å logge inn. +twofa_scratch_token_incorrect = Sikkerhetskoden din er feil. +oauth_signin_tab = Tilknytt en eksisterende konto +oauth_signin_title = Logg inn for å autorisere den tilknyttede kontoen +oauth_signin_submit = Tilknytt konto +oauth.signin.error = Det oppstod en feil underveis med forespørselen for autorisasjon. Dersom feilen vedvarer, vennligst kontakt systemansvarlig. +oauth.signin.error.access_denied = Forespørselen om autorisasjon ble avslått. +oauth.signin.error.temporarily_unavailable = Kunne ikke autorisere fordi autorisasjonstjeneren er midlertidig utilgjengelig. Vennligst prøv igjen senere. +openid_connect_submit = Koble til +openid_connect_title = Koble til en eksisterende konto +openid_connect_desc = Den valgte OpenID-URIen er ukjent. Knytt den til en ny konto her. +openid_register_title = Opprett ny konto +openid_register_desc = Den valgte OpenID-URIen er ukjent. Tilknytt den til en ny konto her. +openid_signin_desc = Oppgi din OpenID-URI. Eksempelvis alice.openid.example.org eller https://openid.example.org/alice. +disable_forgot_password_mail = Gjenoppretting av konto er deaktivert ettersom det ikke er satt opp en e-post. Vennligst kontakt din systemansvarlig. +disable_forgot_password_mail_admin = Gjenoppretting av konto er kun tilgjengelig når e-post er satt opp. Vennligst sett opp e-post for gjenoppretting av konto. +email_domain_blacklisted = Du kan ikke registrere deg med din e-postadresse. +authorize_application = Autoriser applikasjon +authorize_redirect_notice = Du vil bli omdirigert til %s dersom du autoriserer denne applikasjonen. +authorize_application_created_by = Denne applikasjonen ble laget av %s. +authorize_application_description = Dersom du gir tilgang vil den kunne lese og skrive til all kontoinformasjonen din, inklusive private repo-er og organisasjoner. +authorize_title = Autoriser "%s" for tilgang til din konto? +authorization_failed = Autorisering feilet + [home] uname_holder = Brukernavn eller e-postadresse switch_dashboard_context = Bytt dashboard miljø diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 4693b969a8..329df5bc50 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -2942,7 +2942,7 @@ dashboard.update_migration_poster_id=Werk migratie-poster IDs bij dashboard.git_gc_repos=Voer garbage collectie uit voor alle repositories dashboard.resync_all_sshkeys=Werk de ".ssh/authorized_keys" bestand bij met Forgejo SSH sleutels. dashboard.resync_all_sshprincipals=Update het ".ssh/authorized_principals" bestand met Forgejo SSH verantwoordelijken. -dashboard.resync_all_hooks=Opnieuw synchroniseren van pre-ontvangst, bewerk en post-ontvangst hooks voor alle repositories +dashboard.resync_all_hooks=Git hooks van alle repositories opnieuw synchroniseren (pre-receive, update en, post-receive hooks van alle repositories, proc-receive, ...) dashboard.reinit_missing_repos=Herinitialiseer alle ontbrekende Git repositories waarvoor records bestaan dashboard.sync_external_users=Externe gebruikersgegevens synchroniseren dashboard.server_uptime=Uptime server diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index b61e91ada0..d058718e36 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -203,6 +203,8 @@ link_modal.header = Dodaj link link_modal.url = Url link_modal.description = Opis +link_modal.paste_reminder = Wskazówka: Jeśli masz adres URL w schowku, możesz wkleić go bezpośrednio do edytora aby utworzyć link. + [filter] string.asc = A - Z string.desc = Z - A @@ -334,7 +336,7 @@ smtp_from_invalid = Adres "Wyślij e-mail jako" jest nieprawidłowy env_config_keys_prompt = Następujące zmienne środowiskowe zostaną również zastosowane do pliku konfiguracyjnego: enable_update_checker_helper_forgejo = Będzie on okresowo sprawdzał dostępność nowych wersji Forgejo poprzez sprawdzanie rekordu TXT DNS pod adresem release.forgejo.org. config_location_hint = Te opcje konfiguracji zostaną zapisane w: -password_algorithm_helper = Ustaw algorytm haszowania haseł. Algorytmy mają różne wymagania i siłę. Algorytm argon2 jest dość bezpieczny, ale zużywa dużo pamięci i może być nieodpowiedni dla małych systemów. +password_algorithm_helper = Ustaw algorytm haszowania haseł. Algorytmy mają różne wymagania i siły. Algorytm argon2 jest dość bezpieczny, ale zużywa dużo pamięci i może być nieodpowiedni dla małych systemów. enable_update_checker = Włącz sprawdzanie aktualizacji env_config_keys = Konfiguracja środowiska run_user_helper = Nazwa użytkownika systemu operacyjnego, pod którą działa Forgejo. Należy pamiętać, że ten użytkownik musi mieć dostęp do ścieżki głównej repozytorium. @@ -740,7 +742,7 @@ activate_email=Wyślij e-mail aktywacyjny activations_pending=Oczekujące aktywacje delete_email=Usuń email_deletion=Usuń adres e-mail -email_deletion_desc=Adres e-mail i powiązane informacje zostaną usunięte z Twojego konta. Commity za pomocą tego adresu e-mail pozostaną niezmienione. Kontynuować? +email_deletion_desc=Ten adres e-mail i powiązane z nim informacje zostaną usunięte z Twojego konta. Commity za pomocą tego adresu e-mail pozostaną niezmienione. Kontynuować? email_deletion_success=Adres e-mail został usunięty. theme_update_success=Twój motyw został zaktualizowany. theme_update_error=Wybrany motyw nie istnieje. @@ -921,7 +923,7 @@ key_content_ssh_placeholder = Rozpoczyna się z "ssh-ed25519", "ssh-rsa", "ecdsa repo_and_org_access = Dostęp do Repozytoriów i Organizacji revoke_oauth2_grant_success = Dostęp cofnięty pomyślnie. update_language = Zmień język -keep_email_private_popup = Twój adres e-mail nie będzie pokazywany na twoim profilu i nie będzie używany jako domyślny dla commitów utworzonych przez interfejs przeglądarki, takich jak wgrywanie plików, edycje, commity scalające. Zamiast tego, specjalny adres %s może zostać użyty do powiązania commitów z twoim kontem. Ta opcja nie wpływa na commity już istniejące. +keep_email_private_popup = Adres e-mail nie będzie pokazywany na profilu i nie będzie używany jako domyślny dla commitów utworzonych przez interfejs przeglądarki, takich jak wgrywanie plików, edycje, czy commity scalające. Zamiast tego, specjalny adres %s może zostać użyty do powiązania commitów z kontem użytkownika. Ta opcja nie wpływa na commity już istniejące. repos_none = Nie posiadasz żadnych repozytoriów. verify_gpg_key_success = Klucz GPG "%s" został zweryfikowany. email_notifications.andyourown = Dodaj swoje własne powiadomienia @@ -998,6 +1000,22 @@ add_principal_success = Podmiot certyfikatu SSH "%s" został dodany. keep_pronouns_private = Wyświetlaj zaimki tylko uwierzytelnionym użytkownikom keep_pronouns_private.description = Spowoduje to ukrycie zaimków przed odwiedzającymi, którzy nie są zalogowani. +storage_overview = Przegląd pamięci +ssh_token_help_ssh_agent = lub jeśli używasz agenta SSH (z ustawioną zmienną SSH_AUTH_SOCK): +regenerate_token = Wygeneruj ponownie +access_token_regeneration = Wygeneruj token dostępu ponownie +access_token_regeneration_desc = Ponowne wygenerowanie tokenu spowoduje cofnięcie dostępu do Twojego konta dla aplikacji, które go używają. Tej czynności nie można cofnąć. Kontynuować? +regenerate_token_success = Token został wygenerowany ponownie. Aplikacje, które go używają, nie mają już dostępu do Twojego konta i muszą zostać zaktualizowane nowym tokenem. +quota.applies_to_user = Następujące zasady limitów obowiązują dla Twojego konta +quota.applies_to_org = Następujące zasady limitów obowiązują dla tej organizacji +quota.rule.exceeded = Przekroczona +quota.rule.exceeded.helper = Całkowity rozmiar obiektów dla tej zasady przekroczył limit. +quota.rule.no_limit = Nielimitowana +quota.sizes.all = Wszystkie +quota.sizes.repos.all = Repozytoria +quota.sizes.repos.public = Publiczne repozytoria +quota.sizes.repos.private = Prywatne repozytoria + [repo] owner=Właściciel owner_helper=Niektóre organizacje mogą nie pojawiać się w liście ze względu na limit maksymalnej liczby repozytoriów. diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 823737a6db..cf25e1b4c2 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -1151,7 +1151,7 @@ migrate_items_wiki=Wiki migrate_items_milestones=Marcos migrate_items_labels=Etiquetas migrate_items_issues=Issues -migrate_items_pullrequests=Pull requests +migrate_items_pullrequests=Propostas de revisão migrate_items_merge_requests=Pedidos de merge migrate_items_releases=Versões migrate_repo=Migrar repositório @@ -1178,7 +1178,7 @@ migrate.migrating_milestones=Migrando marcos migrate.migrating_labels=Migrando rótulos migrate.migrating_releases=Migrando releases migrate.migrating_issues=Migrando issues -migrate.migrating_pulls=Migrando pull requests +migrate.migrating_pulls=Migrando propostas de revisão migrate.cancel_migrating_title=Cancelar migração migrate.cancel_migrating_confirm=Você quer cancelar essa migração? @@ -1216,7 +1216,7 @@ find_tag=Pesquisar etiqueta branches=Branches tags=Tags issues=Issues -pulls=Pull requests +pulls=Propostas de revisão packages=Pacotes actions=Ações labels=Etiquetas @@ -1257,7 +1257,7 @@ symbolic_link=Link simbólico executable_file=Arquivo executável commit_graph=Gráfico de commits commit_graph.select=Selecionar branches -commit_graph.hide_pr_refs=Esconder pull requests +commit_graph.hide_pr_refs=Esconder propostas de revisão commit_graph.monochrome=Monocromático commit_graph.color=Colorido commit.contained_in=Esse commit está contido em: @@ -1550,9 +1550,9 @@ issues.closed_at=`fechou esta issue %s` issues.reopened_at=`reabriu esta issue %s` issues.commit_ref_at=`citou esta issue de um commit %s` issues.ref_issue_from=`citou esta issue %[3]s %[1]s` -issues.ref_pull_from=`citou este pull request %[3]s %[1]s` -issues.ref_closing_from=`citou esta issue de um pull request %[3]s que a fechará %[1]s` -issues.ref_reopening_from=`citou esta issue de um pull request %[3]s que a reabrirá, %[1]s` +issues.ref_pull_from=`citou esta proposta de revisão %[3]s %[1]s` +issues.ref_closing_from=`citou esta questão a partir de uma proposta de revisão %[3]s que a fechará, %[1]s` +issues.ref_reopening_from=`citou esta questão de uma proposta de revisão %[3]s que a reabrirá, %[1]s` issues.ref_from=`de %[1]s` issues.author=Autor issues.role.owner=Proprietário(a) @@ -1677,7 +1677,7 @@ issues.dependency.blocked_by_short=Depende de issues.dependency.remove_header=Remover dependência issues.dependency.issue_remove_text=Isto removerá a dependência desta issue. Continuar? issues.dependency.pr_remove_text=Isto removerá a dependência deste pull request. Continuar? -issues.dependency.setting=Habilitar dependências para issues e pull requests +issues.dependency.setting=Habilitar dependências para questões e propostas de revisão issues.dependency.add_error_same_issue=Você não pode fazer uma issue depender de si mesma. issues.dependency.add_error_dep_issue_not_exist=Issue dependente não existe. issues.dependency.add_error_dep_not_exist=Dependência não existe. @@ -1722,9 +1722,9 @@ compare.compare_base=base compare.compare_head=comparar pulls.desc=Habilitar pull requests e revisões de código. -pulls.new=Novo pull request -pulls.view=Ver pull request -pulls.compare_changes=Novo pull request +pulls.new=Nova solicitação de revisão +pulls.view=Ver proposta de revisão +pulls.compare_changes=Nova proposta de revisão pulls.allow_edits_from_maintainers=Permitir edições de mantenedores pulls.allow_edits_from_maintainers_desc=Usuários com acesso de gravação para o branch base também podem fazer push para este branch pulls.allow_edits_from_maintainers_err=Falha na atualização @@ -1750,7 +1750,7 @@ pulls.filter_changes_by_commit=Filtrar por commit pulls.nothing_to_compare=Estes branches são iguais. Não há nenhuma necessidade para criar um pull request. pulls.nothing_to_compare_and_allow_empty_pr=Estes branches são iguais. Este PR ficará vazio. pulls.has_pull_request=`Um pull request entre esses branches já existe: %[2]s#%[3]d` -pulls.create=Criar pull request +pulls.create=Criar proposta de revisão pulls.change_target_branch_at=`mudou o branch de destino de %s para %s %s` pulls.tab_conversation=Conversação pulls.tab_commits=Commits @@ -1776,12 +1776,12 @@ pulls.is_empty=As alterações neste branch já estão no branch de destino. Est pulls.required_status_check_failed=Algumas verificações necessárias não foram bem sucedidas. pulls.required_status_check_missing=Estão faltando algumas verificações necessárias. pulls.required_status_check_administrator=Como administrador, você ainda pode aplicar o merge deste pull request. -pulls.blocked_by_approvals=Este pull request ainda não tem aprovações suficientes. %d de %d aprovações concedidas. -pulls.blocked_by_rejection=Este pull request tem alterações solicitadas por um revisor oficial. -pulls.blocked_by_official_review_requests=Este pull request está bloqueado porque falta aprovação de um ou mais revisores oficiais. -pulls.blocked_by_outdated_branch=Este pull request está bloqueado porque está desatualizado. -pulls.blocked_by_changed_protected_files_1=Este pull request está bloqueado porque altera um arquivo protegido: -pulls.blocked_by_changed_protected_files_n=Este pull request está bloqueado porque altera arquivos protegidos: +pulls.blocked_by_approvals=Esta proposta de requisição ainda não tem aprovações suficientes. %d de %d aprovações concedidas. +pulls.blocked_by_rejection=Esta proposta de revisão tem alterações solicitadas por um revisor oficial. +pulls.blocked_by_official_review_requests=Esta proposta de revisão está bloqueada por faltar aprovação de um ou mais revisores oficiais. +pulls.blocked_by_outdated_branch=Esta proposta de revisão está bloqueada por ter sido superada. +pulls.blocked_by_changed_protected_files_1=Esta proposta de revisão está bloqueada porque altera um arquivo protegido: +pulls.blocked_by_changed_protected_files_n=Esta proposta de revisão está bloqueada porque altera arquivos protegidos: pulls.can_auto_merge_desc=O merge deste pull request pode ser aplicado automaticamente. pulls.cannot_auto_merge_desc=O merge deste pull request não pode ser aplicado automaticamente pois há conflitos. pulls.cannot_auto_merge_helper=Faça o merge manualmente para resolver os conflitos. @@ -2633,7 +2633,7 @@ settings.wiki_branch_rename_failure = Falha ao regularizar o nome do ramo da wik settings.add_collaborator_blocked_them = Não foi possível adicionar o(a) colaborador(a) porque ele(a) bloqueou o(a) proprietário(a) do repositório. settings.thread_id = ID da discussão issues.edit.already_changed = Não foi possível salvar as alterações desta questão. O conteúdo parece já ter sido alterado por outro(a) usuário(a). Atualize a página e tente novamente para evitar sobrescrever estas alterações -pulls.edit.already_changed = Não foi possível salvar as alterações deste pull request. Parece que o conteúdo já foi alterado por outro(a) usuário(a). Atualize a página e tente novamente para evitar sobrescrever estas alterações +pulls.edit.already_changed = Não foi possível salvar as alterações desta proposta de revisão. Parece que o conteúdo já foi alterado por outra conta. Atualize a página e tente editar novamente para evitar sobrescrever as alterações dela editor.commit_id_not_matching = O arquivo foi alterado durante a edição. Salve as alterações em um novo ramo e realize a mesclagem. blame.ignore_revs = As revisões em .git-blame-ignore-revs foram ignoradas. Clique aqui para retornar à visualização normal. topic.format_prompt = Os tópicos devem começar com um caracter alfanumérico, podem incluir hífens ("-") e pontos ("."), e podem ter até 35 caracteres. As letras devem ser minúsculas. @@ -2645,10 +2645,10 @@ issues.author.tooltip.issue = Este(a) usuário(a) é o(a) autor(a) desta questã no_eol.text = Sem EOL no_eol.tooltip = Não há um caractere de fim de linha no final do arquivo. pulls.fast_forward_only_merge_pull_request = Apenas fast-forward -pulls.has_merged = Falha: O pull request foi merged, você não pode merge novamente ou mudar o branch destino. -issues.author.tooltip.pr = Esse usuário é o autor dessa solicitação de pull. +pulls.has_merged = Falha: A proposta de revisão foi integrada ao repositório e não é possível integrá-la novamente ou alterar o ramo-alvo. +issues.author.tooltip.pr = Este usuário é o autor desta proposta de revisão. editor.push_out_of_date = O push parece estar desatualizado. -pulls.blocked_by_user = Você não pode criar uma solicitação de pull nesse repositório porque você está bloqueado pelo dono do repositório. +pulls.blocked_by_user = Você não pode criar uma proposta de revisão nesse repositório porque você está bloqueado pelo dono do repositório. mirror_use_ssh.helper = Forgejo irá espelhar o repositório via Git através de SSH e criar um par de chaves para você ao escolher essa opção. Você deverá garantir que a chave pública gerada está autorizada a fazer push para o repositório de destino. Você não pode usar autorização baseada em senha ao escolher essa opção. mirror_denied_combination = Não é possível combinar o uso de chave pública e autenticação baseada em senha. mirror_public_key = Chave SSH pública @@ -2667,7 +2667,7 @@ settings.mirror_settings.pushed_repository = Repositório enviado settings.mirror_settings.docs.disabled_pull_mirror.instructions = Configure seu projeto para automaticamente fazer push de commits, tags e branches para outro repositório. Espelhos de pull foram desativados pelo administrador do seu site. settings.mirror_settings.docs.disabled_push_mirror.instructions = Configure seu projeto para automaticamente fazer pull de commits, tags e branches de outro repositório. settings.mirror_settings.docs.doc_link_pull_section = a seção "Fazendo pull de um repositório remoto" da documentação. -subscribe.pull.guest.tooltip = Inicie a sessão para receber notificações deste pull request. +subscribe.pull.guest.tooltip = Inicie a sessão para receber notificações desta proposta de revisão. settings.pull_mirror_sync_quota_exceeded = Cota excedida, não será feito pull das mudanças. settings.mirror_settings.docs.more_information_if_disabled = Saiba mais sobre espelhos de push e pull aqui: settings.transfer_quota_exceeded = O novo dono (%s) excedeu a cota. O repositório não foi transferido. @@ -2733,7 +2733,7 @@ issues.num_reviews_one = %d revisão issues.summary_card_alt = Cartão de resumo de um issue com o título "%s" no repositório %s issues.num_reviews_few = %d revisões settings.default_update_style_desc = Estilo padrão de atualização usado para atualizar pull requests que estão atrasados em relação ao branch base. -pulls.sign_in_require = Entre para criar um novo pull request. +pulls.sign_in_require = Entre para criar uma nova proposta de revisão. new_from_template = Use um modelo new_from_template_description = Você pode selecionar um modelo de repositório nesta instância e aplicar suas configurações. new_advanced = Configurações avançadas @@ -2747,7 +2747,7 @@ issues.reaction.alt_few = %[1]s reagiu com %[2]s. issues.reaction.alt_many = %[1]s e mais %[2]d reagiram com %[3]s. summary_card_alt = Cartão de resumo do repositório %s release.summary_card_alt = Cartão de resumo de um release intitulado "%s" no repositório %s -archive.pull.noreview = Este repositório está arquivado. Não é possível revisar pull requests. +archive.pull.noreview = Este repositório está arquivado. Não é possível revisar propostas. editor.commit_email = Email de commit commits.view_single_diff = Ver modificações neste arquivo introduzidas neste commit pulls.editable = Editável @@ -2768,7 +2768,7 @@ settings.event_action_recover = Recuperar settings.event_action_recover_desc = A execução da Action teve sucesso após a última execução no mesmo workflow ter falhado. settings.event_action_success = Sucesso settings.event_action_success_desc = A execução da Action foi bem sucedida. -issues.filter_type.all_pull_requests = Todos os pull requests +issues.filter_type.all_pull_requests = Todas as propostas de revisão tree_path_not_found.commit = O caminho %[1]s não existe no commit %[2]s tree_path_not_found.branch = O caminho %[1]s não existe no branch %[2]s tree_path_not_found.tag = O caminho %[1]s não existe na etiqueta %[2]s diff --git a/options/locale/locale_ro.ini b/options/locale/locale_ro.ini index 790a9c37eb..6eff6a7131 100644 --- a/options/locale/locale_ro.ini +++ b/options/locale/locale_ro.ini @@ -187,6 +187,11 @@ install = Ușor de instalat license = Sursă deschisă app_desc = Un serviciu Git fără probleme, auto-găzduit +platform_desc = Forgejo rulează pe sisteme de operare libere ca Linux și FreeBSD, precum și pe diferite arhitecturi CPU. Alege ceea ce îți place! +lightweight = Lejer +lightweight_desc = Forgejo are cerințe minime mici și poate rula pe un Raspberry Pi ieftin. Economisește energie computațională! +license_desc = Descarcă Forgejo! Alătură-te nouă și contribuie să îmbunătățești acest proiect. Nu ezita sa devii un contributor! + [install] require_db_desc = Forgejo are nevoie de MySQL, PostgreSQL, SQLite3 sau TiDB (protocol MySQL). db_title = Setări bază de date @@ -279,6 +284,8 @@ app_slogan = Sloganul instanței app_slogan_helper = Introdu sloganul instanței aici. Lasă gol pentru a dezactiva. host = Gazdă +db_schema = Schema + [search] user_kind = Căutați utilizatori… team_kind = Căutați echipe… diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 0cf1e52d86..d3b8102fcc 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -291,7 +291,7 @@ offline_mode.description=Отключить сторонние службы до disable_gravatar=Отключить Gravatar disable_gravatar.description=Отключить Gravatar и прочие сторонние источники изображений профилей. Если у пользователя нет локально установленного изображения профиля, будет использовано изображение по умолчанию. federated_avatar_lookup=Федерированные изображения профилей -federated_avatar_lookup.description=Искать изображения профилей, используя Libravatar. +federated_avatar_lookup.description=Искать изображения профилей через Libravatar. disable_registration=Отключить самостоятельную регистрацию disable_registration.description=Только администраторы смогут создавать новые учётные записи пользователей. Отключение саморегистрации крайне рекомендовано, разве что если вы не собираетесь создать публичный сервер для всех и готовы бороться с большим количеством спама. allow_only_external_registration.description=Пользователи смогут создавать новые учётные записи только через добавленные сторонние службы. @@ -745,7 +745,7 @@ lookup_avatar_by_mail=Найти изображение по моему адре enable_custom_avatar=Использовать своё изображение профиля choose_new_avatar=Выберите новое изображение профиля update_avatar=Обновить изображение профиля -delete_current_avatar=Удалить текущее изображение профиля +delete_current_avatar=Удалить изображение профиля uploaded_avatar_not_a_image=Загруженный файл не является изображением. uploaded_avatar_is_too_big=Размер выбранного файла (%d КиБ) превышает максимальный размер (%d КиБ). update_avatar_success=Изображение профиля было изменено. @@ -1018,7 +1018,7 @@ quota.sizes.assets.attachments.all = Все прикреплённые файл quota.sizes.assets.attachments.releases = Файлы выпусков quota.sizes.assets.attachments.issues = Файлы задач quota.sizes.assets.artifacts = Артефакты -regenerate_token = Заменить +regenerate_token = Создать новый access_token_regeneration_desc = Будет создан новый токен, предыдущий будет отозван. Вам потребуется заменить токен в приложениях, использующих его. Это действие нельзя отменить. Продолжить? regenerate_token_success = Токен был заменён. Приложения, использующие его, более не имеют доступа к этой учётной записи и должны получить новый токен. access_token_regeneration = Замена токена доступа @@ -2684,7 +2684,7 @@ issues.edit.already_changed = Не удалось отредактировать pulls.edit.already_changed = Не удалось отредактировать запрос слияния. Похоже, содержимое уже было изменено другим пользователем. Попробуйте обновить страницу и отредактировать запрос ещё раз, чтобы избежать отмены чужих изменений comments.edit.already_changed = Не удалось отредактировать комментарий. Похоже, он уже был изменён другим пользователем. Попробуйте обновить страницу и отредактировать его ещё раз, чтобы избежать отмены чужих изменений settings.federation_settings = Настройки федерации -settings.federation_apapiurl = Федеративная ссылка на этот репозиторий. Скопируйте и вставьте её в настройки федерации другого репозитория как ссылку репозитория для отслеживания. +settings.federation_apapiurl = Федеративная ссылка на этот репозиторий. Скопируйте и вставьте её в настройки федерации другого репозитория как ссылку отслеживаемого репозитория. settings.federation_following_repos = Ссылки на отслеживаемые репозитории. Разделяются с помощью «;», без пробелов. n_release_one = %s выпуск n_release_few = %s выпусков diff --git a/options/locale/locale_sl.ini b/options/locale/locale_sl.ini index f90a20391d..3543966631 100644 --- a/options/locale/locale_sl.ini +++ b/options/locale/locale_sl.ini @@ -433,7 +433,7 @@ openid_signin_desc = Vnesite svoj URI OpenID. Na primer: alice.openid.example.or twofa_scratch_token_incorrect = Vaša koda je napačna. login_userpass = Prijavite se oauth_signup_title = Dokončanje novega računa -oauth_signup_submit = Celoten račun +oauth_signup_submit = Dokončanje računa oauth_signin_title = Prijavite se za avtorizacijo povezanega računa oauth_signin_submit = Povezava z računom oauth.signin.error.access_denied = Zahtevek za odobritev je bil zavrnjen. diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 74b19b02c6..9ab774fac6 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -33,11 +33,11 @@ twofa_scratch=Tvåfaktorsskrapkod passcode=Kod -repository=Utvecklingskatalog +repository=Kodförråd organization=Organisation mirror=Spegel new_mirror=Ny spegling -new_fork=Ny förgrening av utvecklingskatalog +new_fork=Ny avgrening av kodförråd new_project=Nytt projekt admin_panel=Sidadministration settings=inställningar @@ -49,10 +49,10 @@ all=Alla sources=Källor mirrors=Speglar collaborative=Kollaborativa -forks=Forks +forks=Avgreningar activities=Aktiviteter -pull_requests=Pull-förfrågningar +pull_requests=Ändringsförfrågningar issues=Ärenden milestones=Milstolpar @@ -70,7 +70,7 @@ disabled=Inaktiverad write=Skriv preview=Förhandsgranska -loading=Laddar… +loading=Läser in… error404=Sidan du försöker nå finns inte, har tagits bort eller så har du inte behörighet att se den. @@ -80,7 +80,7 @@ error404=Sidan du försöker nå finns inte, har tagits archived=Arkiverade -concept_code_repository=Utvecklingskatalog +concept_code_repository=Kodförråd concept_user_organization=Organisation @@ -90,7 +90,7 @@ logo = Logotyp sign_in_with_provider = Logga in med %s enable_javascript = Denna webbplats kräver JavaScript. ok = OK -more_items = Fler saker +more_items = Fler objekt webauthn_sign_in = Tryck på knappen på din säkerhetsnyckel. Om din säkerhetsnyckel inte har en knapp, dra ut den och sätt in den igen. new_project_column = Ny kolumn copy_type_unsupported = Den här filtypen kan inte kopieras @@ -104,10 +104,10 @@ copy_url = Kopiera URL copy_error = Kopiering misslyckades copy_content = Kopiera innehåll webauthn_insert_key = Skriv in din säkerhetsnyckel -webauthn_press_button = Var god tryck på knappen på din säkerhetsnyckel… -webauthn_error = Kunde inte läsa din säkerhetsnyckel. -webauthn_unsupported_browser = Din webbläsare har inte ännu stöd för WebAuthn. -webauthn_error_unknown = Ett okänt fel har inträffat. Var god försök igen. +webauthn_press_button = Vänligen tryck på knappen på din säkerhetsnyckel… +webauthn_error = Det gick inte att läsa din säkerhetsnyckel. +webauthn_unsupported_browser = Din webbläsare har ännu inte stöd för WebAuthn. +webauthn_error_unknown = Ett okänt fel har inträffat. Vänligen försök igen. webauthn_error_empty = Du måste ange ett namn för den här nyckeln. new_org.title = Ny organisation new_org.link = Ny organisation @@ -119,9 +119,9 @@ never = Aldrig unknown = Okänd confirm_delete_artifact = Är du säker på att du vill ta bort artefakten "%s"? artifacts = Artefakter -show_timestamps = Visa tidsstämpel +show_timestamps = Visa tidsstämplar show_full_screen = Visa i fullskärm -download_logs = Ladda ner loggar +download_logs = Hämta ned loggar go_back = Gå tillbaka show_log_seconds = Visa sekunder rerun = Kör om @@ -132,38 +132,38 @@ filter.is_mirror = Speglar copy_path = Kopiera sökväg unpin = Lossa value = Värde -filter.not_archived = Inte arkiverade +filter.not_archived = Ej arkiverade error413 = Du har använt upp din kvot. invalid_data = Ogiltig data: %v -filter.not_template = Inte mallar +filter.not_template = Ej mallar copy_hash = Kopiera hash -view = Se +view = Visa copy_branch = Kopiera grennamn pin = Fäst filter.public = Publika -new_repo.title = Ny utvecklingskatalog +new_repo.title = Nytt kodförråd new_migrate.title = Ny migrering -new_repo.link = Ny utvecklingskatalog +new_repo.link = Nytt kodförråd new_migrate.link = Ny migrering -filter.not_mirror = Inte speglar +filter.not_mirror = Ej speglar filter.is_template = Mallar filter.private = Privata active_stopwatch = Spårning av aktiv tid tracked_time_summary = Sammanfattning av spårad tid baserat på filter av ärendelistan -toggle_menu = Visningsmeny +toggle_menu = Växla meny confirm_delete_selected = Bekräfta för att ta bort alla valda objekt? -webauthn_error_timeout = Timeout uppnåddes innan din nyckel kan läsas. Vänligen ladda om denna sida och försök igen. -filter.is_fork = Förgreningar +webauthn_error_timeout = Det gick inte att läsa din nyckel innan tidsgränsen nåddes. Läs om denna sida och försök igen. +filter.is_fork = Avgreningar webauthn_error_duplicated = Säkerhetsnyckeln är inte tillåten för denna begäran. Se till att nyckeln inte redan är registrerad. -filter.not_fork = Inte förgrenade -remove_label_str = Ta bort objektet "%" +filter.not_fork = Ej avgreningar +remove_label_str = Ta bort objektet "%s" webauthn_use_twofa = Använd en tvåfaktorskod från din telefon webauthn_error_insecure = WebAuthn stöder endast säkra anslutningar. För testning över HTTP kan du använda "localhost" eller "127.0.0.1" webauthn_error_unable_to_process = Servern kunde inte hantera din begäran. copy_generic = Kopiera till urklipp [aria] -footer.software = Om den här mjukvaran +footer.software = Om programvaran footer.links = Länkar footer = Sidfot navbar = Navigeringsfält @@ -171,10 +171,10 @@ navbar = Navigeringsfält [heatmap] contributions_one = bidrag contributions_zero = Inga bidrag -contributions_format = {contributions} på {day} {month}, {year} +contributions_format = {contributions} den {day} {month} {year} contributions_few = bidrag -less = Mindre -more = Mer +less = Färre +more = Flera number_of_contributions_in_the_last_12_months = %s bidrag under de senaste 12 månaderna [editor] @@ -186,23 +186,25 @@ buttons.bold.tooltip = Lägg till fetstilt text (CTRL+B / ⌘B) buttons.italic.tooltip = Lägg till kursiv text (CTRL+I / ⌘I) buttons.list.unordered.tooltip = Lägg till en punktlista buttons.list.ordered.tooltip = Lägg till en numrerad lista -buttons.list.task.tooltip = Lägg till en lista med sysslor -buttons.mention.tooltip = Nämn en användare eller ett team -buttons.ref.tooltip = Hänvisa till ett ärende eller en pull request +buttons.list.task.tooltip = Lägg till en uppgiftslista +buttons.mention.tooltip = Nämn en användare eller ett lag +buttons.ref.tooltip = Hänvisa till ett ärende eller en ändringsförfrågan buttons.new_table.tooltip = Lägg till tabell table_modal.header = Lägg till tabell -table_modal.placeholder.header = Sidhuvud +table_modal.placeholder.header = Rubrik table_modal.placeholder.content = Innehåll table_modal.label.rows = Rader table_modal.label.columns = Kolumner -buttons.switch_to_legacy.tooltip = Använd legacy-redigeraren istället -link_modal.url = Url +buttons.switch_to_legacy.tooltip = Använd den föråldrade redigeraren istället +link_modal.url = URL link_modal.description = Beskrivning link_modal.header = Lägg till en länk -buttons.disable_monospace_font = Avaktivera jämnbrett typsnitt -link_modal.paste_reminder = Tips: Med ett URL i ditt klippbord, kan du klistra in direkt i textredigeraren för att skapa en länk. +buttons.disable_monospace_font = Inaktivera jämnbrett typsnitt +link_modal.paste_reminder = Tips: Med en URL i urklipp kan du klistra in direkt i textredigeraren för att skapa en länk. buttons.enable_monospace_font = Aktivera jämnbrett typsnitt -buttons.indent.tooltip = Inplacera föremål med en nivå +buttons.indent.tooltip = Öka indrag med en nivå + +buttons.unindent.tooltip = Minska indrag med en nivå [filter] string.asc = A - Ö @@ -212,18 +214,20 @@ string.desc = Ö - A occurred = Ett fel har inträffat server_internal = Internt serverfel network_error = Nätverksfel -report_message = Om du tror att detta är en Forgejo-bugg, sök efter ärenden på Codeberg eller öppna ett nytt ärende om det behövs. +report_message = Om du tror att detta är ett programfel i Forgejo, sök efter ärenden på Codeberg eller öppna ett nytt ärende om det behövs. not_found = Målet kunde inte hittas. [startpage] app_desc=En smidig, självhostad Git-tjänst install=Lätt att installera platform=Plattformsoberoende -platform_desc=Forgejo har bekräftats körbart på libre-operativsystem så som Linux och FreeBSD, samt på olika CPU-arkitekturer. Välj den du älskar! +platform_desc=Forgejo har bekräftats vara körbart på fria operativsystem såsom Linux och FreeBSD, såväl som på olika CPU-arkitekturer. Välj det du föredrar! lightweight=Lättviktig lightweight_desc=Forgejo har låga minimum-krav och kan köras på en billig Rasperry Pi. Spara på din maskins kraft! license=Öppen källkod -license_desc=Hämta Forgejo! Gå med oss genom att bidra för att göra projektet ännu bättre. Var inte blyg för att bli en medarbetare! +license_desc=Hämta Forgejo! Gå med oss genom att bidra för att göra projektet ännu bättre. Var inte blyg - bli en bidragsgivare! + +install_desc = Kör den binära filen för din plattform, lansera den med Docker, eller få den paketerad. [install] install=Installation @@ -250,16 +254,16 @@ err_admin_name_is_invalid=Administratörsanvändarnamnet är ogiltigt general_title=Allmänna inställningar app_name=Instansens titel -app_name_helper=Skriv in din instans namn här. Det kommer att visas på varje sida. -repo_path=Rotsökväg för utvecklingskatalog -repo_path_helper=Fjärrutvecklingskataloger kommer att sparas i denna katalog. +app_name_helper=Skriv in instansens namn här. Det kommer att visas på varje sida. +repo_path=Rotsökväg för kodförråd +repo_path_helper=Fjärrkodförråd kommer att sparas i denna katalog. lfs_path=LFS rotsökväg lfs_path_helper=Filer hanterade av Git LFS kommer att sparas i denna mapp. Lämna tom för att avaktivera. run_user=Användare att köra som ssh_port=SSH-serverport -ssh_port_helper=Portnumret som din SSH-server använder. Lämna tom för att inaktivera SSH-server. +ssh_port_helper=Portnumret för din SSH-server. Lämna tomt för att inaktivera. http_port=HTTP-lyssningsport -http_port_helper=Portnumret som kommer att användas av Forgejos webbserver. +http_port_helper=Portnumret för Forgejos webbserver. app_url=Bas-URL app_url_helper=Basadressen för HTTP(S)-kloningslänkar och mejlnotifikationer. log_root_path=Loggsökväg @@ -269,21 +273,21 @@ optional_title=Övriga inställningar email_title=E-postinställningar smtp_addr=SMTP-server smtp_port=SMTP-port -smtp_from=Skicka E-post som +smtp_from=Skicka e-post som smtp_from_helper=Mejladress som Forgejo kommer att använda. Anges i simpelt ('email@example.com') eller fullständigt ('Name ') format. mailer_user=SMTP-användarnamn mailer_password=SMTP-lösenord -register_confirm=Kräv bekräftelse via E-post för att registrera -mail_notify=Aktivera E-postnotifikationer +register_confirm=Kräv bekräftelse via e-post för att registrera +mail_notify=Aktivera e-postnotiser server_service_title=Inställningar för server- och tredjepartstjänster offline_mode=Aktivera lokalt läge offline_mode.description=Inaktivera CDN från tredjepart och distribuera samtliga resurser lokalt istället. disable_gravatar=Inaktivera Gravatar -disable_gravatar.description=Inaktivera Gravatar- och avatarskällor från tredjepart. Standardbilder kommer att användas för användaravatarer om dom inte laddar upp en egen avatar till instansen. -federated_avatar_lookup=Aktivera federerade avatarer -federated_avatar_lookup.description=Använd Libavatar för uppslagning av avatarer. +disable_gravatar.description=Inaktivera Gravatar- och avatarskällor från tredjepart. Standardbilder kommer att användas för användprofilbilder om de inte laddar upp en egen profilbild till instansen. +federated_avatar_lookup=Aktivera federerade profilbilder +federated_avatar_lookup.description=Använd Libavatar för uppslagning av profilbilder. disable_registration=Inaktivera självregistrering -disable_registration.description=Endast instansens administratörer kommer kunna skapa nya konton. Det rekommenderas starkt att inaktivera självregistrering av användare om du inte tänker driva en publik instans för alla och är redo att hantera en stor mängd spam-konton. +disable_registration.description=Endast instansens administratörer kommer att kunna skapa nya konton. Det rekommenderas starkt att inaktivera självregistrering av användare om du inte tänker driva en publik instans för alla och är redo att hantera en stor mängd spam-konton. allow_only_external_registration.description=Användare kommer endast kunna skapa nya konton genom att använda konfigurerade externa tjänster. openid_signin=Aktivera OpenID-inloggning openid_signin.description=Tillåt användare att logga in via OpenID. @@ -299,29 +303,29 @@ admin_password=Lösenord confirm_password=Bekräfta lösenord admin_email=E-postadress install_btn_confirm=Installera Forgejo -test_git_failed=Misslyckades att testa "git" kommando: %v +test_git_failed=Det gick inte att testa "git"-kommando: %v sqlite3_not_available=Denna version av Forgejo stödjer inte SQLite3. Ladda ner den officiella binären från %s (inte "gobuild" versionen). invalid_db_setting=Databasinställningarna är ogiltiga: %v -invalid_repo_path=Utvecklingskatalogens rotsökväg är ogiltig: %v +invalid_repo_path=Kodförrådets rotsökväg är ogiltig: %v run_user_not_match=Systemtjänstanvändaren är inte den nuvarande användaren: %s -> %s save_config_failed=Misslyckades att spara konfigurationen: %v invalid_admin_setting=Inställning för administartörskontot är ogiltig: %v invalid_log_root_path=Sökvägen för loggar är ogiltig: %v default_keep_email_private=Dölj e-postadresser som standard default_keep_email_private.description=Dölj e-postadress för nya användarkonton som standard så att den informationen inte omedelbart läcker efter registrering. -default_allow_create_organization=Tillåt skapandet utav organisationer som standard +default_allow_create_organization=Tillåt skapande av organisationer som standard default_allow_create_organization.description=Tillåt nya användarkonton att skapa organisationer som standard. När detta alternativt ej är aktivt så behöver en administratör tilldela rättigheter att skapa organisationer till nya användare. default_enable_timetracking=Aktivera tidredovisning som standard -default_enable_timetracking.description=Aktivera tidsredovisning för nya utvecklingskataloger som standard. +default_enable_timetracking.description=Aktivera tidsredovisning för nya kodförråd som standard. no_reply_address=Dold e-postdomän -no_reply_address_helper=Domännamn för användare med en dold e-postadress. Exempelvis kommer användarnamnet "joe" att loggas i Git som "joe@noreply.example.org" om den dolda e-postdomänen är satt till "noreply.example.org". +no_reply_address_helper=Domännamn för användare med en dold e-postadress. Exempelvis kommer användarnamnet "loke" att loggas i Git som "loke@noreply.example.org" om den dolda e-postdomänen är satt till "noreply.example.org". require_db_desc = Forgejo kräver MySQL, PostgreSQL, SQLite3 eller TiDB (MySQL-protokoll). allow_only_external_registration = Tillåt registrering endast via externa tjänster app_slogan = Instansslogan -app_slogan_helper = Skriv in din slogan här. Lämna tom för att stänga av. +app_slogan_helper = Skriv in din slogan här. Lämna tomt för att stänga av. domain = Serverdomän domain_helper = Domän eller värdadress för servern. -reinstall_error = Du försöker att installera i en existerande Forgejo-databas +reinstall_error = Du försöker att installera i en befintlig Forgejo-databas password_algorithm_helper = Ställ in hashalgoritmen för lösenord. Algoritmer har olika krav och styrkor. Argon2-algoritmen är ganska säker men använder mycket minne och kan vara olämplig för små system. config_location_hint = Dessa konfigurationsinställningar kommer att sparas i: invalid_db_table = Databastabellen "%s" är ogiltig: %v @@ -330,20 +334,24 @@ allow_dots_in_usernames = Tillåt användare att använda punkter i sina använd reinstall_confirm_message = Ominstallation med en befintlig Forgejo-databas kan orsaka flera problem. I de flesta fall bör du använda din befintliga "app.ini" för att köra Forgejo. Om du vet vad du håller på med, bekräfta följande: require_sign_in_view.description = Begränsa åtkomst till innehåll till inloggade användare. Gäster kommer endast att kunna besöka autentiseringssidorna. invalid_app_data_path = Sökvägen för appdata är ogiltig: %v -internal_token_failed = Misslyckades att generera intern token: %v +internal_token_failed = Misslyckades med att generera intern token: %v password_algorithm = Hashalgoritm för lösenord invalid_password_algorithm = Ogiltig hashalgoritm för lösenord env_config_keys_prompt = Följande miljövariabler kommer också att tillämpas på din konfigurationsfil: -smtp_from_invalid = "Skicka E-post som" adressen är ogiltig -reinstall_confirm_check_1 = Data krypterad av HEMLIG_NYCKEL i app.ini kan gå förlorad: användare kommer kanske inte att kunna logga in med 2FA/OTP & speglar funkar kanske inte korrekt. Genom att kryssa i rutan godkänner du att den nuvarande app.ini innehåller korrekta HEMLIG_NYCKEL. -reinstall_confirm_check_2 = Kodkatalogerna och inställningarna kan behövas omsynkroniseras. Genom att kryssa i rutan bekräftar du att du kommer omsynkronisera hakarna för kodkatalogerna och befogade_nycklar filen manuellt. Du bekräfar att du säkerställer att kodkatalogen och spegel inställningarna är korrekt. -run_user_helper = Operativsystemets användarnamn som Forgejo körs som. Notera att denna användare måste ha tillgång till utvecklingskatalogens rotsökväg. -enable_update_checker_helper_forgejo = Den kommer periodiskt kolla efter nya Forgejo-versionser genom att kolla ett TXT-DNS-record på release.forgejo.org. +smtp_from_invalid = "Skicka e-post som"-adressen är ogiltig +reinstall_confirm_check_1 = Data krypterad av SECRET_KEY i app.ini kan gå förlorad: användare kommer kanske inte att kunna logga in med 2FA/OTP och speglar fungerar kanske inte korrekt. Genom att kryssa i rutan godkänner du att den nuvarande app.ini innehåller korrekt SECRET_KEY. +reinstall_confirm_check_2 = Kodförråden och inställningarna kan behöva omsynkroniseras. Genom att kryssa i rutan bekräftar du att du kommer omsynkronisera krokarna för kodförråden och authorized_keys-filen manuellt. Du bekräftar att du säkerställer att kodförrådet och spegelinställningarna är korrekta. +run_user_helper = Operativsystemets användarnamn som Forgejo körs som. Observera att denna användare måste ha tillgång till kodförrådets rotsökväg. +enable_update_checker_helper_forgejo = Den kommer regelbundet att leta efter nya Forgejo-versioner genom att läsa av en DNS TXT-post från release.forgejo.org. + +reinstall_confirm_check_3 = Du bekräftar att du är helt säker att Forgejo kör med korrekt app.ini plats och att du är säker att du behöver ominstallera. Du bekräftar att du har förstått ovanstående risker. +enable_update_checker = Aktivera uppdateringskontroll +env_config_keys = Miljökonfiguration [home] uname_holder=Användarnamn eller e-postadress switch_dashboard_context=Växla visad instrumentpanel -my_repos=Utvecklingskataloger +my_repos=Kodförråd my_orgs=Organisationer view_home=Visa %s filter=Övriga filter @@ -358,19 +366,19 @@ show_both_private_public=Visar både offentliga och privata show_only_private=Visar endast privata show_only_public=Visar endast publika -issues.in_your_repos=I dina utvecklingskataloger -filter_by_team_repositories = Filtrera efter lagutvecklingskataloger +issues.in_your_repos=I dina kodförråd +filter_by_team_repositories = Filtrera efter teamkodförråd feed_of = Flöde av "%s" [explore] -repos=Utvecklingskataloger +repos=Kodförråd users=Användare organizations=Organisationer code=Kod code_last_indexed_at=Indexerades senast %s go_to = Gå till -relevant_repositories = Endast relevanta utvecklingskataloger visas, visa ofiltrerade resultat. -relevant_repositories_tooltip = Utvecklingskataloger som är gafflingar eller inte har ämne, ikon, och beskrivning är dolda. +relevant_repositories = Endast relevanta kodförråd visas, visa ofiltrerade resultat. +relevant_repositories_tooltip = Kodförråd som är avgreningar eller inte har ämne, ikon, och beskrivning är dolda. [auth] create_new_account=Registrera konto @@ -379,17 +387,17 @@ disable_register_mail=Bekräftelsemejl vid registrering är inaktiverad. remember_me=Kom ihåg denna enhet forgot_password_title=Glömt lösenord forgot_password=Glömt lösenord? -confirmation_mail_sent_prompt=Ett nytt bekräftelsemejl has skickats till %s. För att slutföra registreringsprocessen, vänligen kolla din inkorg inom dom kommande %s. Om e-postadressen är felaktig så kan du logga in och begära att få ett nytt bekräftelsemejlet skickat till en annan e-postadressen. +confirmation_mail_sent_prompt=Ett nytt bekräftelsemeddelande har skickats till %s. För att slutföra registreringsprocessen, vänligen kontrollera din inkorg inom de kommande %s. Om e-postadressen är felaktig så kan du logga in och begära att få ett nytt bekräftelsemeddelande skickat till en annan e-postadress. must_change_password=Ändra ditt lösenord allow_password_change=Kräv att användaren byter lösenord (rekommenderas) -reset_password_mail_sent_prompt=Ett nytt bekräftelsemail has skickats till %s. För att slutföra återställning av ditt konto, kontrollera din inkorg och gå till den bifogade länken inom de kommande %s. +reset_password_mail_sent_prompt=Ett nytt bekräftelsemeddelande har skickats till %s. För att slutföra återställning av ditt konto, kontrollera din inkorg och gå till den bifogade länken inom de kommande %s. active_your_account=Aktivera ditt konto account_activated=Kontot har aktiverats -prohibit_login=Kontot är avstängd +prohibit_login=Kontot är avstängt resent_limit_prompt=Du har redan begärt ett aktiveringsmejl nyligen. Vänligen vänta 3 minuter och försök igen. has_unconfirmed_mail=Hej %s, du har en obekräftad epostaddress (%s). Om du inte har fått ett bekräftelsemail eller behöver ett nytt, klicka på knappen nedan. resend_mail=Klicka här för att skicka ditt aktiveringsmejl igen -send_reset_mail=Skicka mejl för kontoåterställning +send_reset_mail=Skicka e-post för kontoåterställning reset_password=Kontoåterställning invalid_code=Din bekräftelsekod är ogiltig eller har löpt ut. reset_password_helper=Återställ konto @@ -417,29 +425,37 @@ email_domain_blacklisted=Du kan inte registrera dig med din e-postadress. authorize_application=Godkänn applikation authorize_redirect_notice=Du kommer att omdirigeras till %s om du auktoriserar denna applikation. authorize_application_created_by=Denna applikation skapades av %s. -authorize_application_description=Om du beviljar åtkomst kommer den att kunna läsa och skriva information om ditt konto, inklusive privata förråd och organisationer. +authorize_application_description=Om du beviljar åtkomst kommer den att kunna läsa och skriva information om ditt konto, inklusive privata kodförråd och organisationer. authorize_title=Ge "%s" tillgång till ditt konto? authorization_failed=Auktorisering misslyckades password_pwned_err=Kunde inte slutföra begäran till HaveIBeenPwned reset_password_wrong_user = Du är inloggad som %s, men kontoåterställningslänken är avsedd för %s -invalid_code_forgot_password = Din bekräftelsekod är ogiltig eller har gått ut. Klicka på här för att påbörja en ny session. +invalid_code_forgot_password = Din bekräftelsekod är ogiltig eller har gått ut. Påbörja en ny session. invalid_password = Ditt lösenord matchar inte lösenordet som användes för att skapa kontot. openid_signin_desc = Ange din OpenID URI. Till exempel: alice.openid.example.org eller https://openid.example.org/alice. sign_in_openid = Fortsätt med OpenID hint_login = Har du redan ett konto? Logga in nu! -change_unconfirmed_email_summary = Ändra e-postadressen som aktiveringsmejl skickas till. +change_unconfirmed_email_summary = Ändra e-postadressen som aktiveringsmeddelanden skickas till. change_unconfirmed_email_error = Det går inte att ändra e-postadressen: %v use_onetime_code = Använde en engångskod last_admin = Du kan inte ta bort den sista administratören. Det måste finnas minst en administratör. back_to_sign_in = Tillbaka till Logga in hint_register = Behöver du ett konto? Registrera ett nu. -prohibit_login_desc = Ditt konto har blivit avstängt från att interagera med instansen. Kontakta instansadministratören för att återfå tillgång. +prohibit_login_desc = Ditt konto har stängts av från att interagera med instansen. Kontakta instansadministratören för att återfå tillgång. password_pwned = Lösenordet du valde finns på en lista över stulna lösenord som tidigare exponerats i offentliga dataintrång. Försök igen med ett annat lösenord och överväg att ändra detta lösenord på annat håll också. sign_up_button = Registrera dig. -sign_up_successful = Kontot skapades. Välkommen! -change_unconfirmed_email = Om du har fått fel e-post-adress under registrering kan du ändra den nedan och ett konfirmationsmejl kommer skickas till den nya e-posten istället. +sign_up_successful = Ditt konto har skapats. Välkommen! +change_unconfirmed_email = Om du har fått fel e-postadress under registrering kan du ändra den nedan och ett bekräftelsemeddelande kommer skickas till den nya adressen istället. unauthorized_credentials = Inloggningsuppgifterna är felaktiga eller har gått ut. Försök kommandot igen eller se %s för mer information +manual_activation_only = Kontakta webbplatsadministratören för att slutföra aktiveringen. +oauth.signin.error = Ett fel uppstod vid behandling av behörighetsbegäran. Om felet kvarstår, kontakta webbplatsadministratören. +oauth.signin.error.access_denied = Behörighetsbegäran nekades. +oauth.signin.error.temporarily_unavailable = Behörighetskontrollen misslyckades eftersom autentiseringsservern är tillfälligt otillgänglig. Försök igen senare. +disable_forgot_password_mail = Kontoåterställning är inaktiverad eftersom ingen e-post har konfigurerats. Kontakta din webbplatsadministratör. +disable_forgot_password_mail_admin = Kontoåterställning är endast tillgänglig när e-post har konfigurerats. Konfigurera e-post för att aktivera kontoåterställning. +authorization_failed_desc = Auktoriseringen misslyckades eftersom vi upptäckte en ogiltig begäran. Kontakta ansvarig för appen du försökte auktorisera. + [mail] activate_account=Vänligen aktivera ditt konto @@ -453,11 +469,11 @@ register_success=Registreringen lyckades password_change.subject = Ditt lösenord har uppdaterats password_change.text_1 = Lösenordet för ditt konto ändrades just. primary_mail_change.subject = Din primära e-postadress har ändrats -activate_account.text_1 = Hej %[1]s, tack för att du registrerat dig hos %[2]s! +activate_account.text_1 = Hej %[1]s, tack för att du har registrerat dig hos %[2]s! reply = eller svara på detta e-postmeddelande direkt hi_user_x = Hej %s, admin.new_user.user_info = Användarinformation -admin.new_user.text = Vänligen klicka här för att hantera denna användare från administratörspanelen. +admin.new_user.text = Hantera denna användare från administratörspanelen. admin.new_user.subject = Ny användare %s har just registrerat sig totp_disabled.no_2fa = Det finns inga andra 2FA-metoder konfigurerade längre, vilket innebär att det inte längre är nödvändigt att logga in på ditt konto med 2FA. removed_security_key.text_1 = Säkerhetsnyckeln ”%[1]s” har just tagits bort från ditt konto. @@ -477,22 +493,22 @@ account_security_caution.text_1 = Om detta var du, kan du tryggt ignorera detta activate_account.text_2 = Klicka på följande länk för att aktivera ditt konto inom %s: activate_email.text = Klicka på följande länk för att verifiera din e-postadress inom %s: register_notify.text_3 = Om någon annan har skapat det här kontot åt dig måste du först ställa in ditt lösenord. -issue.x_mentioned_you = @%s2 nämnde dig: +issue.x_mentioned_you = @%s nämnde dig: repo.collaborator.added.subject = %s har lagt till dig som medarbetare i %s -repo.collaborator.added.text = Du har lagts till som medarbetare i förrådet: +repo.collaborator.added.text = Du har lagts till som medarbetare i kodförrådet: team_invite.subject = %[1]s har bjudit in dig att gå med i organisationen %[2]s register_notify.text_1 = detta är din registreringsbekräftelse via e-post för %s! release.downloads = Hämtningar: release.download.zip = Källkod (ZIP) release.download.targz = Källkod (TAR.GZ) -repo.transfer.subject_to = %s vill överföra förrådet ”%s” till %s +repo.transfer.subject_to = %s vill överföra kodförrådet ”%s” till %s removed_security_key.subject = En säkerhetsnyckel har tagits bort -issue_assigned.pull = @%[1] har tilldelat dig pull-begäran %[2]s i förrådet %[3]s. -issue_assigned.issue = @%[1] har tilldelat dig ärendet %[2] i förrådet %[3]. +issue_assigned.pull = @%[1]s har tilldelat dig ändringsförfrågan %[2]s i kodförrådet %[3]s. +issue_assigned.issue = @%[1]s har tilldelat dig ärendet %[2]s i kodförrådet %[3]s. register_notify.text_2 = Du kan logga in på ditt konto med ditt användarnamn: %s reset_password.text = Om detta var du, klicka på följande länk för att återställa ditt konto inom %s: -issue.action.force_push = %[1]s2 gjorde en force-push av %[2]s från %[3]s till %[4]s. -repo.transfer.subject_to_you = %s vill överföra förrådet ”%s” till dig +issue.action.force_push = %[1]s tvångsskickade %[2]s från %[3]s till %[4]s. +repo.transfer.subject_to_you = %s vill överföra kodförrådet ”%s” till dig release.title = Titel: %s @@ -501,6 +517,25 @@ release.title = Titel: %s +view_it_on = Visa på %s +issue.action.push_1 = @%[1]s skickade %[3]d incheckning till %[2]s +issue.action.push_n = @%[1]s skickade %[3]d incheckningar till %[2]s +issue.action.close = @%[1]s stängde #%[2]d. +issue.action.reopen = @%[1]s öppnade #%[2]d igen. +issue.action.merge = @%[1]s sammanfogade #%[2]d till %[3]s. +issue.action.approve = @%[1]s godkände denna ändringsförfrågan. +issue.action.reject = @%[1]s begärde ändringar på denna ändringsförfrågan. +issue.action.review = @%[1]s kommenterade på denna ändringsförfrågan. +issue.action.review_dismissed = @%[1]s avfärdade senaste granskningen från %[2]s för denna ändringsförfrågan. +issue.action.ready_for_review = @%[1]s markerade denna ändringsförfrågan som redo för granskning. +issue.action.new = @%[1]s skapade #%[2]d. +issue.in_tree_path = I %s: +release.new.subject = %s i %s har publicerats +release.new.text = @%[1]s publicerade %[2]s i %[3]s +team_invite.text_1 = %[1]s har bjudit in dig till teamet %[2]s i organisationen %[3]s. +team_invite.text_2 = Klicka på följande länk för att gå med i teamet: +team_invite.text_3 = Obs: Denna inbjudan var avsedd för %[1]s. Om du inte förväntade dig denna inbjudan kan du ignorera detta e-postmeddelande. + [modal] yes=Ja no=Nej @@ -510,7 +545,7 @@ confirm = Bekräfta [form] UserName=Användarnamn -RepoName=Utvecklingskatalogens namn +RepoName=Kodförrådsnamn Email=E-postadress Password=Lösenord Retype=Bekräfta lösenord @@ -529,7 +564,7 @@ Content=Innehåll require_error=får inte vara tomt alpha_dash_error=` bör endast innehålla alfanumeriska tecken, bindestreck ("-") och understreck ("_").` alpha_dash_dot_error=` bör endast innehålla alfanumeriska tecken, bindestreck ("-"), understreck ("_") och punkter (".").` -git_ref_name_error=måste vara ett för Git välformaterat referensnamn. +git_ref_name_error=`måste vara ett för Git välformaterat referensnamn.` size_error=` måste vara av storleken %s` min_size_error=` måste innehålla minst %s tecken.` max_size_error=` får inte innehålla mer än %s tecken.` @@ -541,16 +576,16 @@ password_not_match=Lösenorden matchar inte. lang_select_error=Välj ett språk från listan. username_been_taken=Användarnamnet är redan taget. -repo_name_been_taken=Namnet för utvecklingskatalogen är upptaget. -repository_files_already_exist=Filer finns redan för denna utvecklingskatalog. Kontakta systemadministratören. -repository_files_already_exist.adopt=Filer finns redan för denna utvecklingskatalog och kan bara antas. -repository_files_already_exist.delete=Filer finns redan för denna utvecklingskatalog. Du måste ta bort dem. -repository_files_already_exist.adopt_or_delete=Filer finns redan för denna utvecklingskatalog. Antingen anta dem eller ta bort dem. +repo_name_been_taken=Kodförrådsnamnet används redan. +repository_files_already_exist=Det finns redan filer för detta kodförråd. Kontakta systemadministratören. +repository_files_already_exist.adopt=Det finns redan filer för detta kodförråd och de kan bara behållas. +repository_files_already_exist.delete=Det finns redan filer för detta kodförråd. Du måste ta bort dem. +repository_files_already_exist.adopt_or_delete=Det finns redan filer för detta kodförråd. Behåll dem eller ta bort dem. visit_rate_limit=För många förfrågningar på för kort tid till fjärrvärden. 2fa_auth_required=Fjärrbesök kräver tvåfaktorsautentisering. org_name_been_taken=Organisationsnamnet är redan taget. team_name_been_taken=Teamnamnet är redan taget. -team_no_units_error=Tillåt åtkomst för åtminstone en del av utvecklingskatalogen. +team_no_units_error=Tillåt åtkomst för åtminstone en del av kodförrådet. email_been_used=Mejladressen är upptagen. email_invalid=E-postadresssen är ogiltig. username_password_incorrect=Användarnamnet eller lösenordet är felaktigt. @@ -559,12 +594,12 @@ password_lowercase_one=Åtminstone en gemen password_uppercase_one=Åtminstone en versal password_digit_one=Åtminstone en siffra password_special_one=Åtminstone ett specialtecken (kommatering, parenteser, citattecken osv.) -enterred_invalid_repo_name=Namnet för utvecklingskatalogen som angavs är felaktigt. +enterred_invalid_repo_name=Namnet som angavs för kodförrådet är felaktigt. enterred_invalid_owner_name=Det nya namnet på ägaren är ogiltligt. enterred_invalid_password=Det angivna lösenordet är felaktigt. user_not_exist=Användaren finns inte. team_not_exist=Teamet finns inte. -last_org_owner=Du kan inte ta bort den sista användaren från "owners" teamet. Det måste finnas minst en ägare för en organisation. +last_org_owner=Du kan inte ta bort den sista användaren från "owners"-teamet. Det måste finnas minst en ägare för en organisation. cannot_add_org_to_team=En organisation kan inte läggas till som teammedlem. invalid_ssh_key=Kunde inte verifiera din SSH-nyckel: %s @@ -573,10 +608,10 @@ auth_failed=Autentisering misslyckades: %v target_branch_not_exist=Målgrenen finns inte. -org_still_own_repo = Denna organisation äger fortfarande ett eller flera förråd, ta bort eller överför dem först. +org_still_own_repo = Denna organisation äger fortfarande ett eller flera kodförråd, ta bort eller överför dem först. must_use_public_key = Den nyckel du angav är en privat nyckel. Skicka inte upp din privata nyckel någonstans. Använd istället din publika nyckel. unable_verify_ssh_key = SSH-nyckeln kan inte verifieras. Kontrollera att den är korrekt. -still_own_repo = Ditt konto äger ett eller flera förråd, ta bort eller överför dem först. +still_own_repo = Ditt konto äger ett eller flera kodförråd, ta bort eller överför dem först. still_has_org = Ditt konto är medlem i en eller flera organisationer. Lämna dem först. still_own_packages = Ditt konto har ett eller flera paket, ta bort dem först. Description = Beskrivning @@ -587,12 +622,35 @@ FullName = Fullständigt namn To = Grennamn +Pronouns = Pronomen +AccessToken = Åtkomsttoken +url_error = `"%s" är inte en giltig URL.` +include_error = ` måste innehålla delsträngen "%s".` +regex_pattern_error = ` regex-mönstret är ogiltigt: %s.` +username_error = ` kan endast innehålla alfanumeriska tecken ("0-9","a-z","A-Z"), bindestreck ("-"), understreck ("_") och punkt ("."). Det får inte börja eller sluta med icke-alfanumeriska tecken, och flera icke-alfanumeriska tecken i rad är också förbjudna.` +username_error_no_dots = ` kan endast innehålla alfanumeriska tecken ("0-9","a-z","A-Z"), bindestreck ("-") och understreck ("_"). Det får inte börja eller sluta med icke-alfanumeriska tecken, och flera icke-alfanumeriska tecken i rad är också förbjudna.` +invalid_group_team_map_error = ` mappning är ogiltig: %s` +username_change_not_local_user = Icke-lokala användare får inte ändra sitt användarnamn. +username_claiming_cooldown = Användarnamnet kan inte tas i anspråk, eftersom vänteperioden inte är över än. Det kan tas i anspråk %[1]s. +repository_force_private = Tvingad privat är aktiverat: privata kodförråd kan inte göras publika. +email_domain_is_not_allowed = Domänen för användarens e-postadress %s är i konflikt med EMAIL_DOMAIN_ALLOWLIST eller EMAIL_DOMAIN_BLOCKLIST. Kontrollera att e-postadressen är korrekt angiven. +openid_been_used = OpenID-adressen "%s" används redan. +enterred_invalid_org_name = Organisationsnamnet du angav är felaktigt. +unset_password = Användaren har inte angett något lösenord. +unsupported_login_type = Inloggningstypen stöds inte för att ta bort konto. +duplicate_invite_to_team = Användaren har redan bjudits in som teammedlem. +organization_leave_success = Du har lämnat organisationen %s. +invalid_ssh_principal = Ogiltigt certifikatnamn: %s +org_still_own_packages = Denna organisation äger fortfarande ett eller flera paket, ta bort dem först. +admin_cannot_delete_self = Du kan inte ta bort dig själv när du är administratör. Ta bort dina administratörsbehörigheter först. +required_prefix = Inmatningen måste börja med "%s" + [user] change_avatar=Byt din avatar… -repositories=Utvecklingskataloger +repositories=Kodförråd activity=Offentlig aktivitet followers_few=%d följare -starred=Stjärnmärkta utvecklingskataloger +starred=Stjärnmärkta kodförråd projects=Projekt overview=Översikt following_few=%d följer @@ -601,7 +659,7 @@ unfollow=Sluta följa user_bio=Biografi disabled_public_activity=Den här användaren har inaktiverat den publika synligheten av aktiviteten. code = Kod -watched = Övervakade förråd +watched = Bevakade kodförråd unblock = Avblockera email_visibility.limited = Din e-postadress är synlig för alla autentiserade användare show_on_map = Visa denna plats på en karta @@ -616,6 +674,21 @@ followers_one = %d följare following_one = %d följer +joined_on = Gick med %s +block_user.detail = Observera att blockering av en användare har andra effekter, såsom: +block_user.detail_1 = Ni kommer att sluta följa varandra och kommer inte kunna följa varandra. +block_user.detail_2 = Denna användare kommer inte kunna interagera med de kodförråd du äger, eller de ärenden och kommentarer du har skapat. +block_user.detail_3 = Ni kommer inte kunna lägga till varandra som medarbetare i kodförråd. +follow_blocked_user = Du kan inte följa denna användare eftersom du har blockerat denna användare eller denna användare har blockerat dig. +public_activity.visibility_hint.self_public = Din aktivitet är synlig för alla, förutom interaktioner i privata utrymmen. Konfigurera. +public_activity.visibility_hint.admin_public = Denna aktivitet är synlig för alla, men som administratör kan du även se interaktioner i privata utrymmen. +public_activity.visibility_hint.self_private = Din aktivitet är endast synlig för dig och instansadministratörerna. Konfigurera. +public_activity.visibility_hint.admin_private = Denna aktivitet är synlig för dig eftersom du är administratör, men användaren vill att den ska förbli privat. +public_activity.visibility_hint.self_private_profile = Din aktivitet är endast synlig för dig och instansadministratörerna eftersom din profil är privat. Konfigurera. +form.name_reserved = Användarnamnet "%s" är reserverat. +form.name_pattern_not_allowed = Mönstret "%s" är inte tillåtet i ett användarnamn. +form.name_chars_not_allowed = Användarnamnet "%s" innehåller ogiltiga tecken. + [settings] profile=Profil account=Konto @@ -625,7 +698,7 @@ avatar=Visningsbild ssh_gpg_keys=SSH/GPG-nycklar applications=Applikationer orgs=Organisationer -repos=Utvecklingskataloger +repos=Kodförråd delete=Radera konto twofa=Tvåfaktorsautentisering (TOTP) organization=Organisationer @@ -646,10 +719,10 @@ ui=Tema comment_type_group_title=Titel privacy=Sekretess lookup_avatar_by_mail=Slå upp avatar efter e-postadress -enable_custom_avatar=Använd anpassad avatar +enable_custom_avatar=Använd anpassad profilbild choose_new_avatar=Välj ny avatar -update_avatar=Uppdatera avatar -delete_current_avatar=Ta bort aktuell avatar +update_avatar=Uppdatera profilbild +delete_current_avatar=Ta bort aktuell profilbild uploaded_avatar_not_a_image=Den uppladdade filen är inte en bild. update_avatar_success=Din avatar har blivit uppdaterad. @@ -667,12 +740,12 @@ theme_desc=Detta tema kommer att användas för webbgränssnittet när du är in primary=Primär activated=Aktiverad requires_activation=Aktivering krävs -primary_email=Gör primär +primary_email=Sätt som primär activate_email=Skicka aktivering activations_pending=Väntar på aktivering delete_email=Ta Bort email_deletion=Ta bort e-postadress -email_deletion_desc=Denna mejladress och relaterad information kommer tas bort från ditt konto. Git-commits med denna mejladress förblir oförändrade. Vill du fortsätta? +email_deletion_desc=Denna e-postadress och relaterad information kommer tas bort från ditt konto. Git-incheckningar med denna e-postadress förblir oförändrade. Vill du fortsätta? email_deletion_success=Mejladressen har tagits bort. theme_update_success=Ditt tema ändrades. theme_update_error=Det valda temat finns inte. @@ -692,8 +765,8 @@ openid_desc=OpenID låter dig delegera autentiseringen till en extern leverantö manage_ssh_keys=Hantera SSH-nycklar manage_gpg_keys=Hantera GPG-nycklar add_key=Lägg till nyckel -ssh_desc=Dessa publika SSH nycklar är associerade med ditt konto. De motsvarande privata nycklarna tillåter full åtkomst till dina utvecklingskataloger. SSH-nycklar som har blivit verifierade kan användas för att verifiera SSH-signerade Git-commiter. -gpg_desc=Dessa publika GPG nycklar är associerade med ditt konto. Håll dina privata nycklar säkra då de tillåter att commits kan verifieras. +ssh_desc=Dessa offentliga SSH-nycklar är kopplade till ditt konto. De motsvarande privata nycklarna ger full åtkomst till dina kodförråd. SSH-nycklar som har verifierats kan användas för att verifiera SSH-signerade Git-incheckningar. +gpg_desc=Dessa publika GPG-nycklar är kopplade till ditt konto. Håll dina privata nycklar säkra då de gör det möjligt att verifiera incheckningar. ssh_helper=Behöver du hjälp? Kolla in Github's guide för att skapa din egen SSH-nycklar eller lösa vanliga problem som kan uppstå med SSH. gpg_helper=Behöver du hjälp? Ta en titt på Github's guide om GPG. key_content_gpg_placeholder=Börjar med "-----BEGIN PGP PUBLIC KEY BLOCK-----" @@ -725,7 +798,7 @@ token_state_desc=Denna token har används inom dom senaste 7 dagarna show_openid=Synlig på min profil hide_openid=Dold från min profil ssh_disabled=SSH är inaktiverat -manage_access_token=Åtkomsttokens +manage_access_token=Åtkomsttoken generate_new_token=Generera ny token tokens_desc=Dessa tokens tillåter åtkomst till ditt konto via Forgejo API. token_name=Tokennamn @@ -756,14 +829,14 @@ oauth2_application_create_description=OAuth2-applikationer ger tredjepartsapplik authorized_oauth2_applications=Auktoriserade OAuth2-appar revoke_key=Upphäv -revoke_oauth2_grant=Dra in åtkomst +revoke_oauth2_grant=Återkalla åtkomst revoke_oauth2_grant_description=Återkallning av åtkomst för detta tredjepartsprogram kommer att hindra programmet från att komma åt dina data. Är du säker? twofa_desc=Tvåfaktorsautentisering förbättrar säkerheten på ditt konto. twofa_is_enrolled=Ditt konto är för närvarande uppsäkrad med tvåfaktorsautentisering. twofa_not_enrolled=Ditt konto är för närvarande inte uppsäkrad med tvåfaktorsautentisering. twofa_disable=Inaktivera tvåfaktorsautentisering -twofa_scratch_token_regenerate=Generera ny skrapkod +twofa_scratch_token_regenerate=Generera ny engångsåterställningnyckel twofa_enroll=Aktivera tvåfaktorsautentisering twofa_disable_note=Du kan inaktivera tvåfaktorsautentisering om det behövs. twofa_disable_desc=Avaktivering av tvåfaktorsautentisering kommer göra ditt konto mindre säkert. Vill du fortsätta? @@ -773,15 +846,15 @@ scan_this_image=Skanna denna bild med ditt autentiseringsprogram: or_enter_secret=Eller skriv in följande sträng: %s then_enter_passcode=Och ange den lösenkod som visas i programmet: passcode_invalid=Koden är ogiltig. Försök igen. -twofa_enrolled=Tvåfaktorsautentisering har aktiverats för ditt konto. Förvara din skrapkod (%s) på en säker plats eftersom den bara visas en gång! +twofa_enrolled=Tvåfaktorsautentisering har aktiverats för ditt konto. Förvara din engångskod för återställning (%s) på en säker plats eftersom den bara visas en gång. manage_account_links=Länkade konton manage_account_links_desc=Dessa externa konton är länkade till ditt Forgejo-konto. link_account=Länka konto remove_account_link=Ta bort länkat konto -remove_account_link_desc=Borttagning av länkade konton kommer häva dess åtkomst till ditt Forgejo-konto. Vill du fortsätta? -remove_account_link_success=Det länkade konton har tagits bort. +remove_account_link_desc=Borttagning av länkade konton kommer ta bort dess åtkomst till ditt Forgejo-konto. Vill du fortsätta? +remove_account_link_success=Det länkade kontot har tagits bort. orgs_none=Du är inte en medlem i någon organisation. @@ -802,7 +875,7 @@ visibility.private=Privat change_password = Byt lösenord user_block_success = Användaren har blockerats. blocked_since = Blockerad sedan %s -user_unblock_success = Användaren har blivit avblockerad. +user_unblock_success = Användaren har avblockerats. visibility.limited = Begränsad visibility.limited_tooltip = Synlig endast för inloggade användare visibility.private_tooltip = Synlig endast för medlemmar i organisationer som du har gått med i @@ -829,23 +902,151 @@ blocked_users = Blockerade användare update_hints = Uppdatera tips language.title = Standardspråk +webauthn = Tvåfaktorsautentisering (Säkerhetsnycklar) +storage_overview = Lagringsöversikt +quota = Kvot +biography_placeholder = Berätta lite om dig själv! (Markdown stöds) +location_placeholder = Dela din ungefärliga plats med andra +pronouns = Pronomen +pronouns_unspecified = Ej angivet +update_language_not_found = Språket "%s" är inte tillgängligt. +update_language_success = Språket har uppdaterats. +change_username_prompt = Obs: Att ändra ditt användarnamn ändrar också din konto-URL. +change_username_redirect_prompt = Det gamla användarnamnet kommer omdirigera tills någon tar det i anspråk. +change_username_redirect_prompt.with_cooldown.one = Det gamla användarnamnet blir tillgängligt för alla efter en vänteperiod på %[1]d dag. Du kan fortfarande återta det gamla användarnamnet under vänteperioden. +change_username_redirect_prompt.with_cooldown.few = Det gamla användarnamnet blir tillgängligt för alla efter en vänteperiod på %[1]d dagar. Du kan fortfarande återta det gamla användarnamnet under vänteperioden. +language.description = Detta språk sparas på ditt konto och används som standard efter inloggning. +language.localization_project = Hjälp oss översätta Forgejo till ditt språk! Läs mer. +additional_repo_units_hint = Föreslå att aktivera ytterligare kodförrådsenheter +additional_repo_units_hint_description = Visa tips om att "Aktivera fler" för kodförråd som inte har alla tillgängliga enheter aktiverade. +update_hints_success = Tipsen har uppdaterats. +hidden_comment_types = Dolda kommentarstyper +hidden_comment_types_description = Kommentarstyper som är markerade här visas inte på ärendesidor. Att markera "Etikett" tar till exempel bort alla " lade till/tog bort 被回滚。 -settings.delete_notices_2=- 此操作将永久删除仓库 %s,包括 Git 数据、 议题、评论、百科和协作者的操作权限。 +settings.delete_notices_2=- 此操作将永久删除仓库 %s,包括 Git 数据、议题、评论、百科和协作者的操作权限。 settings.delete_notices_fork_1=- 在此仓库删除后,它的派生仓库将变成独立仓库。 settings.deletion_success=仓库已被删除。 settings.update_settings_success=仓库设置已更新。 @@ -2190,28 +2190,28 @@ settings.change_team_permission_tip=团队权限设置于团队设置页面, settings.delete_team_tip=该团队仍有仓库, 无法删除 settings.remove_team_success=团队访问仓库的权限已被删除。 settings.add_webhook=添加 Web 钩子 -settings.add_webhook.invalid_channel_name=Webhook 通道名称不能为空且不能仅包含一个 # 字符。 -settings.hooks_desc=当Forgejo事件发生时,Web钩子自动发出HTTP POST请求。在 指南 中阅读更多内容。 +settings.add_webhook.invalid_channel_name=Web 钩子通道名称不能为空且不能仅包含一个 # 字符。 +settings.hooks_desc=当某些 Forgejo 事件发生时,Web 钩子将自动发出 HTTP POST 请求。在 Web 钩子指南阅读更多内容。 settings.webhook_deletion=删除 Web 钩子 -settings.webhook_deletion_desc=删除 web钩子 将删除其设置和历史记录。继续? +settings.webhook_deletion_desc=删除 Web 钩子将删除其设置和历史记录。继续? settings.webhook_deletion_success=Web 钩子已移除。 settings.webhook.test_delivery=测试推送 -settings.webhook.test_delivery_desc=用假事件测试这个 web钩子。 -settings.webhook.test_delivery_desc_disabled=要用 虚假事件 测试这个Webhook,请激活它。 +settings.webhook.test_delivery_desc=使用假事件测试此 Web 钩子。 +settings.webhook.test_delivery_desc_disabled=用假事件测试这个 Web 钩子前,请先激活它。 settings.webhook.request=请求内容 settings.webhook.response=响应内容 settings.webhook.headers=头信息 settings.webhook.payload=内容 settings.webhook.body=响应体 -settings.webhook.replay.description=重放此 webhook。 -settings.webhook.replay.description_disabled=若要重播此 WebHook,请激活它。 +settings.webhook.replay.description=重新执行此 Web 钩子。 +settings.webhook.replay.description_disabled=重新执行此 Web 钩子前,请先激活它。 settings.webhook.delivery.success=一个事件已被添加到推送队列。可能需要过几秒钟才会显示在推送记录中。 -settings.githooks_desc=Git Hook 是 Git 本身提供的功能。您可以在下方编辑 hook 文件以设置自定义操作。 +settings.githooks_desc=Git 钩子是 Git 本身提供的功能。您可以在下方编辑 hook 文件以设置自定义操作。 settings.githook_edit_desc=如果钩子未启动,则会显示样例文件中的内容。如果想要删除某个钩子,则提交空白文本即可。 settings.githook_name=钩子名称 settings.githook_content=钩子内容 settings.update_githook=更新钩子 -settings.add_webhook_desc=Forgejo 将向目标 URL 发送具有指定内容类型的 POST 请求。在 webhooks 指南 中阅读更多内容。 +settings.add_webhook_desc=Forgejo 将向目标 URL 发送具有指定 Content-Type 的 POST 请求。在 Web 钩子指南阅读更多内容。 settings.payload_url=目标 URL settings.http_method=HTTP 方法 settings.content_type=POST 内容类型 @@ -2273,11 +2273,11 @@ settings.event_pull_request_merge=合并请求合并 settings.event_package=软件包 settings.event_package_desc=软件包已在仓库中被创建或删除。 settings.branch_filter=分支过滤 -settings.branch_filter_desc=推送、创建,删除分支事件的分支白名单,使用 glob 模式匹配指定。若为空或 *,则将报告所有分支的事件。语法文档见 %[2]s。示例:master,{master,release*}。 +settings.branch_filter_desc=推送事件、创建或删除分支事件的分支白名单,使用 glob 模式匹配指定。若为空或 *,则将报告所有分支的事件。语法文档见 %[2]s。示例:master{master,release*}。 settings.authorization_header=授权标头 settings.authorization_header_desc=当存在时将被作为授权标头包含在内。例如:%s。 settings.active=激活 -settings.active_helper=触发事件的信息将发送到此 webhook 网址。 +settings.active_helper=将触发事件的信息发送到此 Web 钩子 URL。 settings.add_hook_success=Web 钩子已添加。 settings.update_webhook=更新 Web 钩子 settings.update_hook_success=Web 钩子已更新。 @@ -2287,7 +2287,7 @@ settings.hook_type=钩子类型 settings.slack_token=令牌 settings.slack_domain=域名 settings.slack_channel=频道 -settings.add_web_hook_desc=将 %s集成到您的代码库。 +settings.add_web_hook_desc=将 %s 集成到您的仓库。 settings.web_hook_name_gitea=Gitea settings.web_hook_name_forgejo = Forgejo settings.web_hook_name_gogs=Gogs @@ -2363,9 +2363,9 @@ settings.protect_branch_name_pattern=受保护的分支名称正则 settings.protect_branch_name_pattern_desc=受保护的分支名称正则。语法请参阅文档 。如:main, release/** settings.protect_patterns=规则 settings.protect_protected_file_patterns=受保护的文件模式(使用半角分号“;”分隔) -settings.protect_protected_file_patterns_desc=即使用户有权添加、编辑或删除此分支中的文件,也不允许直接更改受保护的文件。 可以使用半角分号(“;”)分隔多个模式。 见%[2]s文档了解模式语法。例如:.drone.yml, /docs/**/*.txt。 +settings.protect_protected_file_patterns_desc=即便用户有权添加、编辑或删除此分支中的文件,也不允许直接更改受保护的文件。多个匹配模式使用半角分号(";")分隔。查阅 %[2]s 文档了解匹配模式语法。例如:.drone.yml/docs/**/*.txt。 settings.protect_unprotected_file_patterns=不受保护的文件模式(使用半角分号“;”分隔) -settings.protect_unprotected_file_patterns_desc=在用户有写权限的情况下允许绕过限制,直接修改设为不保护的文件。如有多个匹配模式,则可用半角分号(“;”)分隔开。见 %[2]s 的文档以了解匹配模式的格式。例子:.drone.yml/docs/**/*.txt。 +settings.protect_unprotected_file_patterns_desc=在用户有写权限的情况下允许绕过限制,直接修改设为不保护的文件。多个匹配模式可以使用半角分号(“;”)分隔。查阅 %[2]s 文档了解匹配模式语法。例子:.drone.yml, /docs/**/*.txt。 settings.update_protect_branch_success=分支保护规则 %s 更新成功。 settings.remove_protected_branch_success=移除分支保护规则"%s"成功。 settings.remove_protected_branch_failed=移除分支保护规则"%s"失败。 @@ -2387,20 +2387,20 @@ settings.protected_branch_required_rule_name=必须填写规则名称 settings.protected_branch_duplicate_rule_name=这些分支已设有规则 settings.protected_branch_required_approvals_min=所需的审批数不能为负数。 settings.tags=标签 -settings.tags.protection=Git标签保护 -settings.tags.protection.pattern=Git标签模式 +settings.tags.protection=标签保护 +settings.tags.protection.pattern=标签模式 settings.tags.protection.allowed=允许列表 settings.tags.protection.allowed.users=允许的账号 settings.tags.protection.allowed.teams=允许的团队 settings.tags.protection.allowed.noone=无 settings.tags.protection.create=添加规则 -settings.tags.protection.none=没有Git标签受到保护。 -settings.tags.protection.pattern.description=你可以使用单个名称或 glob 模式匹配或正则表达式来匹配多个标签。了解详情请访问 受保护Git标签指南。 +settings.tags.protection.none=没有受保护的标签。 +settings.tags.protection.pattern.description=你可以使用单个名称、glob 模式匹配或正则表达式来匹配多个标签。了解详情请访问 受保护标签指南。 settings.bot_token=机器人令牌 settings.chat_id=聊天 ID settings.thread_id=线程 ID settings.matrix.homeserver_url=主服务器网址 -settings.matrix.room_id=房间ID +settings.matrix.room_id=房间 ID settings.matrix.message_type=消息类型 settings.archive.button=存档仓库 settings.archive.header=存档此仓库 @@ -2506,7 +2506,7 @@ diff.hide_file_tree=隐藏文件树 releases.desc=跟踪项目版本和下载。 release.releases=版本发布 release.detail=发布详情 -release.tags=Git标签 +release.tags=标签 release.new_release=发布新版 release.draft=草稿 release.prerelease=预发行 @@ -2537,12 +2537,12 @@ release.delete_release=删除发布 release.delete_tag=删除标签 release.deletion=删除发布 release.deletion_desc=删除版本发布只会从 Forgejo 中移除。这不会影响 Git 的标签以及您仓库的内容和历史。是否继续? -release.deletion_success=Release已被删除。 -release.deletion_tag_desc=将从仓库中删除此 Git标签。仓库内容和历史记录保持不变。继续吗? +release.deletion_success=已删除此版本发布。 +release.deletion_tag_desc=将从仓库中删除此标签,仓库内容和历史记录将保持不变。继续吗? release.deletion_tag_success=该 Git 标签已被删除。 release.tag_name_already_exist=使用此标签名称的发布版本已经存在。 release.tag_name_invalid=标签名称无效。 -release.tag_name_protected=Git标签名称已受保护。 +release.tag_name_protected=标签名称受到保护。 release.tag_already_exist=此 Git 标签已存在。 release.downloads=下载附件 release.add_tag_msg=使用发布的标题和内容作为标签消息。 @@ -2605,7 +2605,7 @@ error.csv.invalid_field_count=无法渲染此文件,因为它在第 %d 行中 admin.enabled_flags = 该仓库启用的标志: admin.flags_replaced = 仓库标志已被替换 admin.update_flags = 更新标志 -rss.must_be_on_branch = 您必须处于一个分支上才能拥有一个RSS订阅源。 +rss.must_be_on_branch = 只有在分支上才能有 RSS 订阅源。 admin.manage_flags = 管理标志 admin.failed_to_replace_flags = 替换仓库标志失败 issues.blocked_by_user = 由于你已被仓库所有者屏蔽,你无法在此仓库创建议题。 @@ -2685,9 +2685,9 @@ pulls.edit.already_changed = 无法保存对合并请求的更改。内容似乎 comments.edit.already_changed = 无法保存对评论的更改。内容似乎已经被另一个用户修改了,为了防止修改被覆盖,请刷新页面后再次尝试编辑 subscribe.issue.guest.tooltip = 登录以订阅议题。 subscribe.pull.guest.tooltip = 登录以订阅此合并请求。 -settings.federation_following_repos = 关注的仓库URL地址,多个地址以 “;” 分隔,不需要前后空格。 +settings.federation_following_repos = 关注的仓库 URL 地址。以 ";" 分隔,不需要空格。 settings.federation_settings = 邦联设置 -settings.federation_apapiurl = 此仓库的邦联URL地址。将其作为关注的仓库URL地址填写到另一个仓库的邦联设置中。 +settings.federation_apapiurl = 此仓库的联邦 URL 地址。将其作为关注的仓库 URL 地址填写到另一个仓库的联邦设置中。 settings.federation_not_enabled = 当前实例未启用邦联功能。 issues.author.tooltip.issue = 此用户是本议题的作者。 issues.author.tooltip.pr = 此用户是此合并请求的作者。 @@ -2737,7 +2737,7 @@ new_from_template = 使用模板 new_from_template_description = 您可以选择此实例上现有仓库模板并应用其设置。 new_advanced = 高级设置 new_advanced_expand = 单击展开 -auto_init_description = 以一个自述文件、可选的许可证与 .gitignore 文件开始Git历史。 +auto_init_description = 以自述文件、可选的许可证和 .gitignore 文件开启 Git 历史。 issues.reaction.add = 添加回应 issues.reaction.alt_few = %[1]s 回应了 %[2]s。 issues.reaction.alt_many = %[1]s 和另外 %[2]d 人回应了 %[3]s。 @@ -2762,19 +2762,19 @@ sync_fork.branch_behind_one = 此分支落后于 %[2]s %[1]d 个提交 sync_fork.branch_behind_few = 此分支落后于 %[2]s %[1]d 个提交 settings.event_action_failure = 失败 settings.event_action_recover = 恢复 -settings.event_action_recover_desc = Action运行在同一工作流上次失败后成功。 +settings.event_action_recover_desc = Action 运行在同一工作流上次失败后成功。 settings.event_action_success = 成功 -settings.event_action_success_desc = Action运行以成功结束。 -settings.event_action_failure_desc = Action运行以失败结束。 -settings.event_header_action = Action运行事件 +settings.event_action_success_desc = Action 运行以成功结束。 +settings.event_action_failure_desc = Action 运行以失败结束。 +settings.event_header_action = Action 运行事件 issues.filter_type.all_pull_requests = 所有合并请求 tree_path_not_found.commit = 路径 %[1]s 在提交 %[2]s 中不存在 tree_path_not_found.branch = 路径 %[1]s 在分支 %[2]s 中不存在 tree_path_not_found.tag = 路径 %[1]s 在标签 %[2]s 中不存在 [graphs] -component_loading=正在加载%s… -component_loading_failed=无法加载%s +component_loading=正在加载 %s… +component_loading_failed=无法加载 %s component_loading_info=这可能需要一点时间… component_failed_to_load=意外的错误发生了。 contributors.what=贡献 @@ -2943,28 +2943,28 @@ dashboard.cron.error=任务中的错误:%s:%[3]s dashboard.cron.finished=任务:%[1]s 已经完成 dashboard.delete_inactive_accounts=删除所有未激活的帐户 dashboard.delete_inactive_accounts.started=删除所有未激活的账户任务已启动。 -dashboard.delete_repo_archives=删除所有仓库的存档(ZIP、 TAR.GZ 等…) +dashboard.delete_repo_archives=删除所有仓库的存档(ZIP、TAR.GZ等) dashboard.delete_repo_archives.started=删除所有仓库存档任务已启动。 dashboard.delete_missing_repos=删除所有丢失 Git 文件的仓库 dashboard.delete_missing_repos.started=删除所有丢失 Git 文件的仓库任务已启动。 dashboard.delete_generated_repository_avatars=删除生成的仓库头像 dashboard.sync_repo_branches=将缺少的分支从 Git 数据同步到数据库 -dashboard.sync_repo_tags = 将 git 数据中的标签同步到数据库 +dashboard.sync_repo_tags = 同步 Git 数据中的标签至数据库 dashboard.update_mirrors=更新镜像仓库 dashboard.repo_health_check=对所有仓库健康检查 dashboard.check_repo_stats=检查所有仓库统计 dashboard.archive_cleanup=删除旧的仓库存档 dashboard.deleted_branches_cleanup=清理已删除的分支 -dashboard.update_migration_poster_id=更新迁移的发表者ID +dashboard.update_migration_poster_id=更新迁移的发布者 ID dashboard.git_gc_repos=对仓库进行垃圾回收 dashboard.resync_all_sshkeys=使用 Forgejo 的 SSH 密钥更新“.ssh/authorized_keys”文件。 dashboard.resync_all_sshprincipals=使用 Forgejo 的 SSH 规则更新“.ssh/authorized_principals”文件。 -dashboard.resync_all_hooks=重新同步所有仓库的 pre-receive、update、 post-receive、proc-receive 等钩子 +dashboard.resync_all_hooks=重新同步所有仓库的 Git 钩子(pre-receive、update、post-receive、proc-receive 等) dashboard.reinit_missing_repos=重新初始化所有丢失的 Git 仓库存在的记录 dashboard.sync_external_users=同步外部用户数据 dashboard.cleanup_hook_task_table=清理 hook_task 表 dashboard.cleanup_packages=清理过期的软件包 -dashboard.cleanup_actions=清理过期的Actions日志和制品 +dashboard.cleanup_actions=清理过期的 Actions 日志和制品 dashboard.server_uptime=服务运行时间 dashboard.current_goroutine=当前 Goroutines 数量 dashboard.current_memory_usage=当前内存使用量 @@ -3037,7 +3037,7 @@ users.prohibit_login=已暂停账号 users.is_admin=管理员账号 users.is_restricted=受限账号 users.allow_git_hook=允许创建 Git 钩子 -users.allow_git_hook_tooltip=Git 钩子将会被以操作系统用户运行,将会拥有同样的主机访问权限。因此,拥有此特殊的Git 钩子权限将能够访问合修改所有的 Forgejo 仓库或者Forgejo的数据库。同时也能获得Forgejo的管理员权限。 +users.allow_git_hook_tooltip=Git 钩子将以运行 Forgejo 的操作系统用户的身份执行,并拥有同等级别的主机访问权限。因此,拥有这种特殊 Git 钩子权限的用户可以访问和修改所有 Forgejo 仓库以及 Forgejo 使用的数据库。这使得他们也能够借此获取 Forgejo 管理员权限。 users.allow_import_local=允许导入本地仓库 users.allow_create_organization=允许创建组织 users.update_profile=更新帐户 @@ -3107,13 +3107,13 @@ packages.repository=仓库 packages.size=大小 packages.published=已发布 -defaulthooks=默认Web钩子 +defaulthooks=默认 Web 钩子 defaulthooks.desc=当某些 Forgejo 事件触发时,Web 钩子自动向服务器发出 HTTP POST 请求。这里定义的 Web 钩子是默认配置,将被复制到所有新的仓库中。详情请访问 Web 钩子指南。 -defaulthooks.add_webhook=添加默认Web 钩子 -defaulthooks.update_webhook=更新默认 Web 钩子 +defaulthooks.add_webhook=添加默认 Web 钩子 +defaulthooks.update_webhook=更新默认 Web 钩子 systemhooks=系统 Web 钩子 -systemhooks.desc=当某些 Forgejo 事件触发时,Web 钩子自动向服务器发出HTTP POST请求。这里定义的 Web 钩子将作用于系统上的所有仓库,所以请考虑这可能带来的任何性能影响。了解详情请访问 Web 钩子指南。 +systemhooks.desc=当某些 Forgejo 事件触发时,Web 钩子自动向服务器发出 HTTP POST 请求。这里定义的 Web 钩子将作用于系统上的所有仓库,所以请考虑这可能带来的任何性能影响。了解详情请访问 Web 钩子指南。 systemhooks.add_webhook=添加系统 Web 钩子 systemhooks.update_webhook=更新系统 Web 钩子 @@ -3135,11 +3135,11 @@ auths.bind_password=绑定密码 auths.user_base=用户搜索基准 auths.user_dn=用户 DN auths.attribute_username=用户名属性 -auths.attribute_username_placeholder=置空将使用Forgejo的用户名。 +auths.attribute_username_placeholder=留空以使用 Forgejo 中输入的的用户名。 auths.attribute_name=名字属性 auths.attribute_surname=姓氏属性 auths.attribute_mail=电子邮件地址属性 -auths.attribute_ssh_public_key=SSH公钥属性 +auths.attribute_ssh_public_key=SSH 公钥属性 auths.attribute_avatar=头像属性 auths.attributes_in_bind=从 bind DN 中拉取属性信息 auths.allow_deactivate_all=允许在搜索结果为空时停用所有用户 @@ -3172,7 +3172,7 @@ auths.pam_service_name=PAM 服务名称 auths.pam_email_domain=PAM 电子邮件域(可选) auths.oauth2_provider=OAuth2 提供程序 auths.oauth2_icon_url=图标 URL -auths.oauth2_clientID=客户端 ID (键) +auths.oauth2_clientID=客户端 ID(密钥) auths.oauth2_clientSecret=客户端密钥 auths.openIdConnectAutoDiscoveryURL=OpenID 连接自动发现 URL auths.oauth2_use_custom_url=使用自定义的 URL 而不是默认的 URL @@ -3197,17 +3197,17 @@ auths.tips=帮助提示 auths.tips.oauth2.general=OAuth2 认证 auths.tips.oauth2.general.tip=当注册新的 OAuth2 身份验证时,回调/重定向 URL 应该是: auths.tip.oauth2_provider=OAuth2 提供程序 -auths.tip.bitbucket=`在 %s -auths.tip.nextcloud=使用菜单“设置->安全->OAuth 2.0客户端”在您的实例上注册一个新的 OAuth 客户端 +auths.tip.bitbucket=在 %s 注册新的 OAuth 客户端,并添加“账户”—“读取”权限 +auths.tip.nextcloud=在您的实例上使用菜单“设置 -> 安全 -> OAuth 2.0 客户端”注册新的 OAuth 客户端 auths.tip.dropbox=在 %s 上创建一个新的应用程序 auths.tip.facebook=`在 %s 注册一个新的应用,并添加产品"Facebook 登录"` auths.tip.github=在 %s 注册一个 OAuth 应用程序 auths.tip.google_plus=从谷歌 API 控制台(%s) 获得 OAuth2 客户端凭据 -auths.tip.openid_connect=使用 OpenID 连接发现 URL(/.well-known/openid-configuration) 来指定终点 +auths.tip.openid_connect=使用 OpenID Connect 发现 URL(/.well-known/openid-configuration)指定端点 auths.tip.twitter=前往 %s,创建一个应用程序并确保启用了“允许此应用程序用于使用 Twitter 登录”选项 auths.tip.discord=在 %s 上注册新应用程序 auths.tip.gitea=注册一个新的 OAuth2 应用程序。可以访问 %s 查看帮助 -auths.tip.yandex=在 %s 上创建一个新的应用程序。在“ Yandex.Passport API”这部分中选择以下权限:“访问电子邮件地址(Access to email address)”,“访问用户头像(Access to user avatar)”和“访问用户名,名字和姓氏,性别(Access to username, first name and surname, genderAccess to username, first name and surname, gender)” +auths.tip.yandex=在 %s 上创建一个新的应用程序。在“Yandex.Passport API”这部分中选择以下权限:“访问电子邮件地址(Access to email address)”,“访问用户头像(Access to user avatar)”和“访问用户名,名字和姓氏,性别(Access to username, first name and surname, gender)” auths.tip.mastodon=输入您想要认证的 mastodon 实例的自定义 URL(或使用默认值) auths.edit=修改认证源 auths.activated=该认证源已经启用 @@ -3227,7 +3227,7 @@ auths.invalid_openIdConnectAutoDiscoveryURL=无效的 Auto Discovery URL(这 config.server_config=服务器配置 config.app_name=实例名称 config.app_ver=Forgejo 版本 -config.app_url=基本 URL +config.app_url=基础 URL config.custom_conf=配置文件路径 config.custom_file_root_path=自定义文件根路径 config.domain=服务器域名 @@ -3299,7 +3299,7 @@ config.skip_tls_verify=跳过 TLS 验证 config.mailer_config=邮件配置 config.mailer_enabled=启用服务 -config.mailer_enable_helo=启用HELO +config.mailer_enable_helo=启用 HELO config.mailer_name=任务名称 config.mailer_protocol=协议 config.mailer_smtp_addr=SMTP 地址 @@ -3417,8 +3417,8 @@ notices.op=操作 notices.delete_success=系统通知已被删除。 self_check.no_problem_found=尚未发现问题。 self_check.database_collation_mismatch=期望数据库使用的校验方式:%s -self_check.database_collation_case_insensitive=数据库正在使用排序规则%s,这是一个不敏感的排序规则。虽然Forgejo可以与其一同工作,但可能有一些罕见的情况存在问题。 -self_check.database_inconsistent_collation_columns=数据库正在使用%s的排序规则,但是这些列使用了不匹配的排序规则。这可能会造成一些意外问题。 +self_check.database_collation_case_insensitive=数据库正在使用排序规则 %s,这是一个不敏感的排序规则。虽然 Forgejo 可以与其一同工作,但可能有一些罕见的情况存在问题。 +self_check.database_inconsistent_collation_columns=数据库正在使用 %s 排序规则,但是这些列使用了不匹配的排序规则,可能会造成一些意外问题。 self_check.database_fix_mysql=对于 MySQL/MariaDB 用户,您可以使用“forgejo doctor convert”命令来修复排序规则问题,或者您也可以手动通过“ALTER ... COLLATE ...” SQL 修复该问题。 auths.tips.gmail_settings = Gmail 设置: auths.tip.gitlab_new = 在 %s 上注册新应用 @@ -3497,7 +3497,7 @@ raw_seconds=秒 raw_minutes=分钟 [dropzone] -default_message=拖放文件或点击此处上传。 +default_message=拖放文件或点击此处上传 invalid_input_type=您不能上传该类型的文件。 file_too_big=文件体积({{filesize}} MB)超过了最大允许体积({{maxFilesize}} MB)。 remove_file=移除文件 @@ -3524,8 +3524,8 @@ error.no_committer_account=没有帐户链接到提交者的电子邮件 error.no_gpg_keys_found=找不到此签名对应的密钥 error.not_signed_commit=提交未签名 error.failed_retrieval_gpg_keys=找不到任何与该提交者账号相关的密钥 -error.probable_bad_signature=警告!虽然数据库中有一个此ID对应的密钥,但这个密钥不能验证此提交!该提交可疑。 -error.probable_bad_default_signature=警告!虽然默认密钥拥有此ID,但不能验证此提交!该提交可疑。 +error.probable_bad_signature=警告!尽管数据库中有此 ID 对应的密钥,但此提交未通过验证!此提交是可疑的。 +error.probable_bad_default_signature=警告!尽管默认密钥具有此 ID,但此提交未通过验证!此提交是可疑的。 [units] unit=单元 @@ -3671,7 +3671,7 @@ owner.settings.cleanuprules.enabled=启用 owner.settings.cleanuprules.pattern_full_match=应用规则到完整软件包名称 owner.settings.cleanuprules.keep.title=与这些规则相匹配的版本即使与下面的删除规则相匹配,也将予以保留。 owner.settings.cleanuprules.keep.count=保留最新的 -owner.settings.cleanuprules.keep.count.1=每个软件包1个版本 +owner.settings.cleanuprules.keep.count.1=每个软件包 1 个版本 owner.settings.cleanuprules.keep.count.n=每个软件包 %d 个版本 owner.settings.cleanuprules.keep.pattern=保持版本匹配 owner.settings.cleanuprules.keep.pattern.container=容器的latest版本总是会被保留。 @@ -3722,7 +3722,7 @@ creation.success=您的密钥 '%s' 添加成功。 creation.failed=添加密钥失败。 deletion=删除密钥 deletion.description=删除密钥是永久性的,无法撤消。继续吗? -deletion.success=此Secret已被删除。 +deletion.success=已删除此机密。 deletion.failed=删除密钥失败。 management=密钥管理 @@ -3733,7 +3733,7 @@ unit.desc=使用 Forgejo Actions 管理集成的 CI/CD 管道。 status.unknown=未知 status.waiting=等待中 -status.running=正在运行 +status.running=运行中 status.success=成功 status.failure=失败 status.cancelled=已取消 @@ -3826,8 +3826,8 @@ workflow.dispatch.run = 运行工作流 workflow.dispatch.success = 已成功请求工作流运行。 workflow.dispatch.input_required = 需要输入“%s”的值。 runs.expire_log_message = 已清除日志,因为它们太旧了。 -runs.no_workflows.help_write_access = 不知道如何上手 Forgejo Actions?查看用户文档的快速上手部分来编写你的第一个工作流,然后配置一个Forgejo运行器来运行你的任务。 -runs.no_workflows.help_no_write_access = 欲了解关于Forgejo Actions的更多信息,请参见文档。 +runs.no_workflows.help_write_access = 不知道如何上手 Forgejo Actions?查看用户文档的快速上手部分来编写你的第一个工作流,然后配置一个 Forgejo 运行器来运行你的任务。 +runs.no_workflows.help_no_write_access = 欲了解关于 Forgejo Actions 的更多信息,请参见文档。 variables.not_found = 找不到变量。 [projects] @@ -3837,7 +3837,7 @@ type-3.display_name=组织项目 deleted.display_name = 已删除项目 [git.filemode] -changed_filemode=%[1]s -> %[2]s +changed_filemode=%[1]s → %[2]s directory=目录 normal_file=普通文件 executable_file=可执行文件 diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index e19e23c51f..45c487fe61 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -1017,7 +1017,7 @@ monitor.execute_time=已執行時間 monitor.queue.name=組織名稱 monitor.queue.type=認證類型 -monitor.queue.settings.submit=更新組織設定 +monitor.queue.settings.submit=更新設定 notices.system_notice_list=系統提示管理 notices.view_detail_header=查看提示細節 @@ -1037,7 +1037,7 @@ users = 使用者帳戶 defaulthooks = 預設 Webhook -config_settings = 組織設定 +config_settings = 設定 [action] create_repo=建立了儲存庫 %s diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index c72e1c6ce1..09bee2fbe1 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -16,7 +16,7 @@ page=頁面 template=模板 language=語言 notifications=通知 -active_stopwatch=啟動的時間追蹤器 +active_stopwatch=使用中的時間追蹤器 create_new=建立… user_profile_and_more=個人資料和設定… signed_in_as=已登入為 @@ -178,8 +178,8 @@ contributions_few = 項貢獻 [editor] buttons.heading.tooltip=新增標題 -buttons.bold.tooltip=新增粗體文字 -buttons.italic.tooltip=新增斜體文字 +buttons.bold.tooltip=新增粗體文字(Ctrl+B/⌘B) +buttons.italic.tooltip=新增斜體文字(Ctrl+I/⌘I) buttons.quote.tooltip=引用文字 buttons.code.tooltip=新增程式碼 buttons.link.tooltip=新增連結 @@ -759,7 +759,7 @@ activate_email=寄送啟用信 activations_pending=等待啟用中 delete_email=移除 email_deletion=移除電子信箱 -email_deletion_desc=您的帳號中的電子信箱和相關資訊將被刪除,使用此電子信箱的 Git 提交將保持不變。要繼續嗎? +email_deletion_desc=此電子信箱地址和相關資訊將從您的帳號中刪除。使用此電子信箱地址的 Git 提交將保持不變。繼續? email_deletion_success=該電子信箱已被刪除。 theme_update_success=已更新佈景主題。 theme_update_error=選取的佈景主題不存在。 @@ -962,7 +962,7 @@ change_username_prompt = 註:更改您的使用者名稱也會更改您的帳 change_username_redirect_prompt = 舊的使用者名稱在被其他使用者認領之前將會轉址到新的使用者名稱。 visibility.limited_tooltip = 僅對已登入的使用者可見 visibility.private_tooltip = 只有您加入的組織之成員能看見 -keep_email_private_popup = 您的電子郵件地址不會顯示在個人資料頁面中,也不會成為透過網頁介面(例如上傳檔案、編輯或合併提交)所建立的提交紀錄的預設地址。取而代之的是,可以使用特殊地址 %s 將這些提交關聯到您的帳號。此設定不會影響既有的提交紀錄。 +keep_email_private_popup = 電子信箱地址不會顯示在個人資料頁面中,也不會作為透過網頁介面(例如上傳檔案、編輯或合併提交)所建立的提交紀錄的預設地址。取而代之的是,可以使用特殊地址 %s 將這些提交關聯到您的帳號。此設定不會影響既有的提交紀錄。 ssh_signonly = 因為目前 SSH 已被停用,這個金鑰只被用來校驗提交簽署。 email_desc = 您的主要電子信箱將被用於通知、密碼復原、和網頁 Git 操作(如果您的信箱不是隱藏的)。 oauth2_client_secret_hint = 這把密鑰在您離開或重新整理此頁面後將不再被顯示。請確保您已儲存它。 @@ -993,7 +993,7 @@ language.localization_project = 幫助我們翻譯 Forgejo 至您的語言!公開活動只有你和站點管理員可見。 quota.rule.exceeded = 已超出 quota.sizes.assets.packages.all = 軟體包 @@ -1022,6 +1022,8 @@ quota.sizes.assets.attachments.releases = 版本發布附件 keep_pronouns_private = 僅向已驗證的使用者顯示代名詞 keep_pronouns_private.description = 這將對未登入的訪客隱藏您的代名詞。 +ssh_token_help_ssh_agent = 或者,如果您正在使用 SSH 代理(已設定 SSH_AUTH_SOCK 變數): + [repo] owner=所有者 owner_helper=組織可能因為儲存庫數量上限而未列入此選單。 @@ -1444,7 +1446,7 @@ issues.remove_ref_at=`移除了參考 %s %s` issues.add_ref_at=`新增了參考 %s %s` issues.delete_branch_at=`刪除分支 %s %s` issues.filter_label=標籤 -issues.filter_label_exclude=`使用 alt + click/enter 來排除標籤` +issues.filter_label_exclude=使用 Alt + 點擊 來排除標籤 issues.filter_label_no_select=所有標籤 issues.filter_label_select_no_label=沒有標籤 issues.filter_milestone=里程碑 @@ -1573,8 +1575,8 @@ issues.lock.notice_3=- 你以後可以隨時再解鎖這個問題。 issues.unlock.notice_1=- 所有人將可對此問題再次發表留言。 issues.unlock.notice_2=- 您之後可以隨時再鎖定這個問題。 issues.lock.reason=鎖定原因 -issues.lock.title=鎖定此問題的對話。 -issues.unlock.title=解鎖此問題的對話。 +issues.lock.title=鎖定對話 +issues.unlock.title=解除鎖定對話 issues.comment_on_locked=您無法在已鎖定的問題上留言。 issues.delete=刪除 issues.delete.title=刪除此問題? @@ -2166,7 +2168,7 @@ settings.packagist_api_token=API 符記 settings.packagist_package_url=Packagist 軟體包 URL settings.deploy_keys=部署金鑰 settings.add_deploy_key=新增部署金鑰 -settings.deploy_key_desc=部署金鑰具有唯讀權限,可拉取此儲存庫。 +settings.deploy_key_desc=部署金鑰可具有唯讀或讀寫權限,可拉取此儲存庫。 settings.is_writable=啟用寫入權限 settings.is_writable_info=允許此部署金鑰推送至儲存庫。 settings.no_deploy_keys=沒有任何部屬金鑰。 @@ -2456,7 +2458,7 @@ desc.sha256 = SHA256 form.name_pattern_not_allowed = 您無法在儲存庫的名字中使用「%s」式樣。 admin.manage_flags = 管理旗標 visibility_helper = 將儲存庫設為私有 -mirror_address_url_invalid = URL 無效。您必須正確的跳脫(escape)該 URL 的每個部份。 +mirror_address_url_invalid = 提供的網址無效。必須確保正確的跳脫(escape)此網址的每個部份。 migrate.migrating_failed.error = 遷移失敗:%s migrate.cancel_migrating_confirm = 您確定要取消這次的遷移嗎? invisible_runes_header = `此檔案內含不可見的 Unicode 字元` @@ -2508,7 +2510,7 @@ settings.mirror_settings.docs.pull_mirror_instructions = 如需建立一個拉 blame.ignore_revs = .git-blame-ignore-revs 中的修訂已被忽略。點擊這裡來檢視一般的責任歸屬界面。 editor.file_is_a_symlink = `「%s」是一個符號連結。網頁編輯器無法編輯符號連結` issues.label_archive = 封存標籤 -pulls.nothing_to_compare_have_tag = 所選的分支/標籤是相等的。 +pulls.nothing_to_compare_have_tag = 所選擇的分支/標籤是相等的。 pulls.select_commit_hold_shift_for_range = 選則一個提交。按住 shift 並點擊來選擇一個範圍 pulls.review_only_possible_for_full_diff = 只有在檢視完整 diff 時才能進行審閱 pulls.filter_changes_by_commit = 以提交來篩選 @@ -2613,7 +2615,7 @@ issues.filter_milestone_closed = 已關閉的里程碑 settings.sourcehut_builds.secrets = 秘密 settings.ignore_stale_approvals = 忽略過時的批准 settings.unarchive.button = 取消封存儲存庫 -branch.rename_branch_to = 重新命名「%s」至: +branch.rename_branch_to = 正在重新命名分支「%s」。 activity.published_tag_label = 標籤 settings.event_pull_request_merge = 合併請求合併 settings.update_mirror_settings = 更新鏡像設定 @@ -2769,6 +2771,8 @@ settings.web_hook_name_sourcehut_builds = SourceHut Builds diff.git-notes.remove-body = 此注釋將會被移除。 settings.sourcehut_builds.secrets_helper = 授權此作業存取建置機密(需要 SECRETS:RO 權限) +issues.filter_type.all_pull_requests = 所有合併請求 + [graphs] component_loading = 正在載入 %s… code_frequency.what = 寫程式頻率 @@ -2895,8 +2899,8 @@ form.name_pattern_not_allowed = 組織名稱中不允許使用式樣「%s」。 follow_blocked_user = 你無法關注此組織,因為此組織已封鎖你。 teams.invite.title = 你已被邀請加入組織 %[2]s 中的團隊 %[1]s。 settings.change_orgname_prompt = 注意:變更組織名稱也會變更你組織的網址並釋放舊名稱。 -settings.change_orgname_redirect_prompt.with_cooldown.few = 舊的組織名稱將在 %[1]d 天的冷卻期後對所有人可用,你仍然可以在冷卻期內重新使用舊名稱。 -settings.change_orgname_redirect_prompt.with_cooldown.one = 舊的組織名稱將在 %[1]d 天的冷卻期後對所有人可用,您仍然可以在冷卻期內重新使用舊名稱。 +settings.change_orgname_redirect_prompt.with_cooldown.few = 舊的組織名稱將在 %[1]d 天的冷卻期後對所有人可用。你仍然可以在冷卻期內重新使用舊名稱。 +settings.change_orgname_redirect_prompt.with_cooldown.one = 舊的組織名稱將在 %[1]d 天的冷卻期後對所有人可用。您仍然可以在冷卻期內重新使用舊名稱。 [admin] dashboard=資訊主頁 @@ -2947,7 +2951,7 @@ dashboard.update_migration_poster_id=更新遷移發布者 ID dashboard.git_gc_repos=對所有儲存庫進行垃圾回收 dashboard.resync_all_sshkeys=使用 Forgejo 的 SSH 金鑰更新「.ssh/authorized_keys」檔案。 dashboard.resync_all_sshprincipals=使用 Forgejo 的 SSH 規則更新「.ssh/authorized_principals」檔案。 -dashboard.resync_all_hooks=重新同步所有儲存庫的 pre-receive、update 和 post-receive Hook +dashboard.resync_all_hooks=重新同步所有儲存庫的 Git hooks(pre-receive、update、post-receive、proc-receive 等) dashboard.reinit_missing_repos=重新初始化所有記錄存在但遺失的 Git 儲存庫 dashboard.sync_external_users=同步外部使用者資料 dashboard.cleanup_hook_task_table=清理 hook_task 資料表 @@ -3378,7 +3382,7 @@ emails.change_email_text = 您確定要更新這個電子信箱地址嗎? monitor.download_diagnosis_report = 下載診斷報告 dashboard.task.cancelled = 作業:%[1]s 已被取消:%[3]s dashboard.cron.cancelled = 定時作業:%[1]s 已被取消:%[3]s -dashboard.cleanup_actions = 清除過期的 Action 日誌和物件 +dashboard.cleanup_actions = 清理過期的 Action 日誌和物件 users.bot = 機器人 users.remote = 遠端 monitor.queue.settings.remove_all_items_done = 已移除佇列中所有項目。 @@ -3399,7 +3403,7 @@ identity_access = 身分和存取 config.cache_test = 測試快取 config_settings = 設定 config_summary = 概要 -emails.delete = 刪除電子郵件 +emails.delete = 刪除電子信箱地址 dashboard.sync_tag.started = 標籤同步已開始 users.reserved = 已保留 auths.tips.gmail_settings = Gmail 設定: @@ -3647,7 +3651,7 @@ owner.settings.cargo.initialize.error=初始化 Cargo 索引失敗: %v owner.settings.cargo.initialize.success=成功建立了 Cargo 索引。 owner.settings.cargo.rebuild=重建索引 owner.settings.cargo.rebuild.error=重建 Cargo 索引失敗: %v -owner.settings.cargo.rebuild.success=成功重建了 Cargo 索引。 +owner.settings.cargo.rebuild.success=已成功重建 Cargo 索引。 owner.settings.cleanuprules.title=清理規則 owner.settings.cleanuprules.add=加入清理規則 owner.settings.cleanuprules.edit=編輯清理規則 @@ -3907,5 +3911,5 @@ projects.read = 讀取:存取儲存庫的專案看板。 packages.write = 寫入:發布與刪除指派給此儲存庫的套件。 projects.write = 寫入:建立專案與欄位,並編輯它們。 packages.read = 讀取:檢視並下載指派給此儲存庫的套件。 -actions.read = 讀取:查看整合的 CI/CD 流程及其紀錄。 -actions.write = 寫入:手動觸發、重新啟動、取消或核准待處理的 CI/CD 流程。 \ No newline at end of file +actions.read = 讀取:查看工作流程運行及其紀錄。 +actions.write = 寫入:觸發、重新啟動和取消工作流程。管理對合併請求提交者的信任委託。 \ No newline at end of file diff --git a/options/locale_next/locale_bg.json b/options/locale_next/locale_bg.json index ae55b01566..1ca3c23d50 100644 --- a/options/locale_next/locale_bg.json +++ b/options/locale_next/locale_bg.json @@ -118,5 +118,27 @@ "pulse.n_active_prs": { "one": "%s активна заявка за сливане", "other": "%s активни заявки за сливане" - } + }, + "repo.issues.filter_poster.hint": "Филтриране по автор", + "repo.issues.filter_assignee.hint": "Филтриране по възложен потребител", + "repo.issues.filter_reviewers.hint": "Филтриране по потребител, който е рецензирал", + "repo.issues.filter_mention.hint": "Филтриране по споменат потребител", + "repo.issues.filter_modified.hint": "Филтриране по дата на последното изменение", + "repo.issues.filter_sort.hint": "Сортиране по: създаден/коментари/актуализиран/краен срок", + "issues.updated": "обновено %s", + "repo.pulls.poster_manage_approval": "Управление на одобренията", + "repo.pulls.poster_requires_approval": "Някои работни процеси са в очакване на преглед.", + "repo.pulls.poster_requires_approval.tooltip": "На автора на тази заявка за сливане не се доверява да изпълнява работни потоци, задействани от заявка за сливане, създадено от разклонено хранилище или с AGit. Работните потоци, задействани от събитие `pull_request`, няма да се изпълняват, докато не бъдат одобрени.", + "repo.pulls.poster_is_trusted": "Авторът на това искане за изтегляне е винаги надежден за изпълнение на работни процеси.pick", + "repo.pulls.poster_is_trusted.tooltip": "На автора на тази заявка за сливане се предоставя изрично доверие да изпълнява работни потоци, задействани от събития `pull_request`.", + "repo.pulls.poster_trust_deny": "Отказване", + "repo.pulls.poster_trust_deny.tooltip": "Работните процеси, които чакат одобрение, ще бъдат отменени.", + "repo.pulls.poster_trust_once": "Одобряване веднъж", + "repo.pulls.poster_trust_always": "Одобряване винаги", + "repo.pulls.poster_trust_revoke": "Отмяна", + "repo.pulls.already_merged": "Сливането се провали: Тази заявка за сливане вече е била слята.", + "moderation.action.account.suspend": "Замразяване на акаунта", + "moderation.users.cannot_suspend_self": "Не можете да замразите себе си.", + "mail.actions.run_info_sha": "Подаване: %[1]s", + "discussion.sidebar.reference": "Препратка" } diff --git a/options/locale_next/locale_bn.json b/options/locale_next/locale_bn.json index 56a6e6dae4..f29fe43d5a 100644 --- a/options/locale_next/locale_bn.json +++ b/options/locale_next/locale_bn.json @@ -1,3 +1,4 @@ { - "moderation.abuse_category.malware": "ম্যালওয়্যার" + "moderation.abuse_category.malware": "ম্যালওয়্যার", + "meta.last_line": " " } diff --git a/options/locale_next/locale_bs.json b/options/locale_next/locale_bs.json index 0967ef424b..a038db2f72 100644 --- a/options/locale_next/locale_bs.json +++ b/options/locale_next/locale_bs.json @@ -1 +1 @@ -{} +{"meta.last_line": " "} diff --git a/options/locale_next/locale_ca.json b/options/locale_next/locale_ca.json index a1bd4c73c0..2957797087 100644 --- a/options/locale_next/locale_ca.json +++ b/options/locale_next/locale_ca.json @@ -196,5 +196,52 @@ "other": "%s observadors" }, "teams.remove_all_repos.modal.header": "Suprimeix tots els repositoris", - "teams.add_all_repos.modal.header": "Afegir tots els repositoris" + "teams.add_all_repos.modal.header": "Afegir tots els repositoris", + "repo.issues.filter_poster.hint": "Filtra per l'autor", + "repo.issues.filter_assignee.hint": "Filtra per l'usuari assignat", + "repo.issues.filter_reviewers.hint": "Filtra per l'usuari que revisa", + "repo.issues.filter_mention.hint": "Filtra per l'usuari mencionat", + "repo.issues.filter_modified.hint": "Filtra per la darrera data de modificació", + "repo.issues.filter_sort.hint": "Ordena per: creació/comentaris/actualització/termini", + "repo.pulls.poster_manage_approval": "Gestiona l'aprovació", + "repo.pulls.poster_requires_approval": "Alguns fluxos de treball encara estan pendents de revisió.", + "repo.pulls.poster_is_trusted": "L'autor d'aquesta «pull request» sempre podrà executar fluxos de treball.", + "repo.pulls.poster_is_trusted.tooltip": "L'autor d'aquesta «pull request» està explícitament autoritzat per a executar fluxos de treball a partir d'esdeveniments `pull_request`.", + "repo.pulls.poster_trust_deny": "Denega", + "repo.pulls.poster_trust_deny.tooltip": "Es cancel·laran els fluxos de treball pendents d'aprovació.", + "repo.pulls.poster_trust_once": "Aprova una vegada", + "repo.pulls.poster_trust_once.tooltip": "Els fluxos de treball provocats per un esdeveniment `pull_request` s'executaran en aquest commit, però caldrà aprovar-los per als futurs commits que siguin pujats a aquesta «pull request».", + "repo.pulls.poster_trust_always": "Aprova sempre", + "repo.pulls.poster_trust_always.tooltip": "Els fluxos de treball provocats per un esdeveniment `pull_request` s'executaran en aquest commit, i no caldrà aprovar futures execucions d'aquesta «pull request» o futures «pull requests» autoritzades pel mateix usuari.", + "repo.pulls.poster_trust_revoke": "Revoca", + "repo.pulls.poster_trust_revoke.tooltip": "L'autor d'aquesta «pull request» ja no serà autoritzat per a executar fluxos de treball a partir d'esdeveniments `pull_request`. Cada execució s'haurà d'aprovar manualment.", + "search.syntax": "Sintaxi de cerca", + "search.fuzzy": "Difusa", + "search.fuzzy_tooltip": "Inclou resultats que siguin una coincidència aproximada al terme de cerca", + "keys.verify.token.hint": "El testimoni només és vàlid durant un minut. Obtén-ne un de nou si ha caducat.", + "moderation.report.mark_as_handled": "Marca com a resolt", + "moderation.report.mark_as_ignored": "Marca com a ignorat", + "moderation.action.account.delete": "Elimina el compte", + "moderation.action.account.suspend": "Suspèn el compte", + "moderation.action.repo.delete": "Elimina el repositori", + "moderation.action.issue.delete": "Elimina el problema", + "moderation.action.comment.delete": "Elimina el comentari", + "moderation.unknown_action": "Acció desconeguda", + "moderation.users.cannot_suspend_admins": "Els usuaris amb privilegis d'administrador no es poden suspendre.", + "moderation.users.cannot_suspend_org": "Les organitzacions no es poden suspendre.", + "moderation.users.already_suspended": "Aquest compte d'usuari ja està suspès.", + "moderation.users.suspend_success": "El compte d'usuari s'ha suspès.", + "moderation.users.cannot_delete_admins": "Els usuaris amb privilegis d'administrador no es poden suprimir.", + "moderation.issue.deletion_success": "S'ha esborrat el problema.", + "moderation.comment.deletion_success": "S'ha esborrat el comentari.", + "admin.dashboard.transfer_lingering_logs": "Transfereix els registres d'accions finalitzades de la base de dades a l'emmagatzematge", + "actions.workflow.persistent_incomplete_matrix": "No s'ha pogut avaluar `strategy.matrix` del treball %[1]s a causa d'una expressió `needs` no vàlida. Potser fa referència a un treball que no és a la seva llista 'needs' (%[2]s), o una sortida que no existeix en un d'aquests treballs.", + "actions.workflow.incomplete_matrix_missing_job": "No s'ha pogut avaluar `strategy.matrix` del treball %[1]s: el treball %[2]s no és a la llista `needs` del treball %[1]s (%[3]s).", + "actions.workflow.incomplete_matrix_missing_output": "No s'ha pogut avaluar `strategy.matrix` del treball %[1]s: el treball %[2]s no té una sortida %[3]s.", + "actions.workflow.incomplete_matrix_unknown_cause": "No s'ha pogut avaluar `strategy.matrix` del treball %[1]s: error desconegut.", + "actions.workflow.incomplete_runson_missing_job": "No s'ha pogut avaluar `runs-on` del treball %[1]s: el treball %[2]s no és a la llista `needs` del treball %[1]s (%[3]s).", + "actions.workflow.incomplete_runson_missing_output": "No s'ha pogut avaluar `runs-on` del treball %[1]s: el treball %[2]s no té una sortida %[3]s.", + "actions.workflow.incomplete_runson_missing_matrix_dimension": "No s'ha pogut avaluar `runs-on` del treball %[1]s: la mida de la matriu %[2]s no existeix.", + "actions.workflow.incomplete_runson_unknown_cause": "No s'ha pogut avaluar `runs-on` del treball %[1]s: error desconegut.", + "admin.auths.oauth2_quota_group_map_removal": "Elimina els usuaris dels grups de quotes sincronitzats si l'usuari no pertany al grup corresponent." } diff --git a/options/locale_next/locale_cs-CZ.json b/options/locale_next/locale_cs-CZ.json index 090be0f3a9..a02b1e825f 100644 --- a/options/locale_next/locale_cs-CZ.json +++ b/options/locale_next/locale_cs-CZ.json @@ -251,5 +251,20 @@ "actions.workflow.incomplete_runson_missing_job": "Nepodařilo se vyhodnotit `runs-on` úlohy %[1]s: úloha %[2]s není v seznamu `needs` úlohy %[1]s (%[3]s).", "actions.workflow.incomplete_runson_missing_output": "Nepodařilo se vyhodnotit `runs-on` úlohy %[1]s: úloha %[2]s nemá výstup %[3]s.", "actions.workflow.incomplete_runson_missing_matrix_dimension": "Nepodařilo se vyhodnotit `runs-on` úlohy %[1]s: dimenze matice %[2]s neexistuje.", - "actions.workflow.incomplete_runson_unknown_cause": "Nepodařilo se vyhodnotit `runs-on` úlohy %[1]s: neznámá chyba." + "actions.workflow.incomplete_runson_unknown_cause": "Nepodařilo se vyhodnotit `runs-on` úlohy %[1]s: neznámá chyba.", + "issues.updated": "aktualizováno %s", + "search.fuzzy": "Přibližné", + "search.fuzzy_tooltip": "Zahrnout výsledky, které jsou v přibližné shodě s hledaným výrazem", + "repo.view.gitmodules_too_large": "Soubor .gitmodules je příliš velký a bude ignorován (např. při voláních API)", + "editor.search": "Hledat", + "editor.find_previous": "Předchozí výsledek", + "editor.find_next": "Další výsledek", + "editor.replace": "Nahradit", + "editor.replace_all": "Nahradit vše", + "editor.toggle_case": "Přepnout rozlišování velikosti písmen", + "editor.toggle_regex": "Přepnout používání regulárních výrazů", + "editor.toggle_whole_word": "Přepnout shodu s celými slovy", + "install.ssh_authorized_keys_inspection_error": "Nepodařilo se projít existující soubor authorized_keys: %v", + "install.ssh_authorized_keys_unexpected_key": "Povolení SSH pro Forgejo je v konfliktu se souborem umístěným v %s, který obsahuje existující klíče SSH. Návrhy: použijte pro Forgejo vyhrazeného systémového uživatele nebo SSH deaktivujte.", + "repo.issues.filter_sort.hint_with_placeholder": "Řadit podle: %s" } diff --git a/options/locale_next/locale_cy.json b/options/locale_next/locale_cy.json index 0967ef424b..a038db2f72 100644 --- a/options/locale_next/locale_cy.json +++ b/options/locale_next/locale_cy.json @@ -1 +1 @@ -{} +{"meta.last_line": " "} diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json index 0cd8d0ba75..b89d0ba1ed 100644 --- a/options/locale_next/locale_de-DE.json +++ b/options/locale_next/locale_de-DE.json @@ -207,11 +207,11 @@ "repo.issues.filter_reviewers.hint": "Nach Benutzer, der gesichtet hat, filtern", "repo.issues.filter_mention.hint": "Nach erwähntem Benutzer filtern", "repo.issues.filter_modified.hint": "Nach letzten modifiziertem Datum filtern", - "repo.issues.filter_sort.hint": "Sortieren nach: erstellt/Kommentare/aktualisiert/Ablaufdatum", + "repo.issues.filter_sort.hint": "Sortieren nach: created/comments/updated/deadline", "search.syntax": "Suchsyntax", "admin.dashboard.transfer_lingering_logs": "Aktionslogs von fertigen Aktions-Jobs aus der Datenbank in den Speicher übertragen", "actions.workflow.persistent_incomplete_matrix": "`strategy.matrix` vom Job %[1]s konnte aufgrund eines ungültigen `needs`-Ausdrucks nicht ausgewertet werden. Er könnte auf einen Job verweisen, der nicht in seiner „needs“-Liste (%[2]s) ist, oder auf eine Ausgabe, die in keinem dieser Jobs existiert.", - "admin.auths.oauth2_quota_group_map_removal": "Benutzer von synchronisierten Quotagruppen entfernen, falls Benutzer nicht zur entsprechenden Grupe gehört.", + "admin.auths.oauth2_quota_group_map_removal": "Benutzer von synchronisierten Quotagruppen entfernen, falls Benutzer nicht zur entsprechenden Gruppe gehört.", "moderation.action.account.delete": "Account löschen", "moderation.action.account.suspend": "Account sperren", "moderation.action.repo.delete": "Repository löschen", @@ -236,5 +236,20 @@ "actions.workflow.incomplete_runson_missing_job": "`runs-on` vom Job %[1]s konnte nicht evaluiert werden: %[2]s ist nicht in der `needs`-Liste von Job %[1]s (%[3]s).", "actions.workflow.incomplete_runson_missing_output": "`runs-on` vom Job %[1]s konnte nicht evaluiert werden: %[2]s hat keine Ausgabe %[3]s.", "actions.workflow.incomplete_runson_missing_matrix_dimension": "`runs-on` vom Job %[1]s konnte nicht evaluiert werden: Matrixdimension %[2]s existiert nicht.", - "actions.workflow.incomplete_runson_unknown_cause": "`runs-on` vom Job %[1]s konnte nicht evaluiert werden: unbekannter Fehler." + "actions.workflow.incomplete_runson_unknown_cause": "`runs-on` vom Job %[1]s konnte nicht evaluiert werden: unbekannter Fehler.", + "issues.updated": "%s aktualisiert", + "search.fuzzy": "Unscharf", + "search.fuzzy_tooltip": "Ergebnisse, die ungefähr zum Suchbegriff passen, einbinden", + "repo.view.gitmodules_too_large": "Die .gitmodules-Datei ist zu groß und wird ignoriert (zum Beispiel für API-Aufrufe)", + "editor.search": "Suchen", + "editor.find_previous": "Vorheriger Treffer", + "editor.find_next": "Nächster Treffer", + "editor.replace": "Ersetzen", + "editor.replace_all": "Alle ersetzen", + "editor.toggle_case": "Beachtung der Groß-/Kleinschreibung umschalten", + "editor.toggle_regex": "Mit regulären Ausdrücken umschalten", + "editor.toggle_whole_word": "Treffer auf ganze Wörter umschalten", + "install.ssh_authorized_keys_inspection_error": "Existierende authorized_keys-Datei konnte nicht untersucht werden: %v", + "install.ssh_authorized_keys_unexpected_key": "Die Aktivierung von SSH für Forgejo steht im Konflikt mit der Datei, die sich bei %s befindet und existierende SSH-Keys enthält. Vorschlag: Benutzen Sie einen eigenen Systembenutzer für Forgejo oder deaktivieren Sie SSH.", + "repo.issues.filter_sort.hint_with_placeholder": "Sortieren nach: %" } diff --git a/options/locale_next/locale_el-GR.json b/options/locale_next/locale_el-GR.json index 0d4328e0df..f8617a4fb2 100644 --- a/options/locale_next/locale_el-GR.json +++ b/options/locale_next/locale_el-GR.json @@ -29,7 +29,7 @@ "discussion.locked": "Αυτή η συζήτηση έχει κλειδωθεί. Ο σχολιασμός περιορίζεται στους συνεισφέροντες.", "incorrect_root_url": "Αυτή η εγκατάσταση του Forgejo έχει ρυθμιστεί στο \"%s\". Αυτή τη στιγμή βλέπετε το Forgejo μέσω ενός διαφορετικού URL, το οποίο μπορεί να προκαλέσει δυσλειτουργία σε τμήματα της εφαρμογής. Το κανονικό URL ελέγχεται από τους διαχειριστές του Forgejo με τη ρύθμιση ROOT_URL στο αρχείο app.ini.", "home.explore_orgs": "Εξερευνήστε οργανισμούς", - "home.welcome.activity_hint": "Δεν υπάρχει τίποτα στην τροφοδοσία σας ακόμα. Οι ενέργειές σας και η δραστηριότητά σας από τα αποθετήρια που παρακολουθείτε θα εμφανίζονται εδώ.", + "home.welcome.activity_hint": "Δεν υπάρχει τίποτα στη ροή σας ακόμη. Οι ενέργειές σας και η δραστηριότητά σας από τα αποθετήρια που παρακολουθείτε θα εμφανίζονται εδώ.", "home.explore_repos": "Εξερευνήστε τα αποθετήρια", "home.explore_users": "Εξερευνήστε τους χρήστες", "migrate.github.description": "Μεταφορά δεδομένων από το github.com ή διακομιστές GitHub Enterprise.", @@ -47,11 +47,11 @@ "error.not_found.title": "Δε βρέθηκε η σελίδα", "themes.names.forgejo-auto": "Forgejo (ακολουθεί το θέμα του συστήματος)", "themes.names.forgejo-light": "Forgejo φωτεινό", - "stars.list.none": "Κανένα αστέρι ακόμα για αυτό το αποθετήριο.", + "stars.list.none": "Κανένα αστέρι ακόμη για αυτό το αποθετήριο.", "watch.list.none": "Καμία παρακολούθηση αυτού του αποθετηρίου.", "followers.incoming.list.self.none": "Καμία παρακολούθηση στο προφίλ σας.", "followers.incoming.list.none": "Κανείς δεν ακολουθεί αυτό το χρήστη.", - "followers.outgoing.list.none": "δεν ακολουθεί κανένα.", + "followers.outgoing.list.none": "Ο χρήστης %s δεν ακολουθεί κανέναν.", "relativetime.2days": "πριν από δύο μέρες", "relativetime.1week": "την προηγούμενη εβδομάδα", "relativetime.2weeks": "πριν από δύο εβδομάδες", @@ -82,13 +82,13 @@ "other": "πριν από %d έτη" }, "themes.names.forgejo-dark": "Forgejo σκοτεινό", - "warning.repository.out_of_sync": "Αυτό το αποθετήριο είναι εκτός συγχρονισμού με την αναπαράσταση του στη βάση δεδομένων. Αν αυτή η προειδοποίηση εμφανίζεται ακόμα και αν ωθήσατε μια υποβολή στο αποθετήριο, τότε επικοινωνήστε με το διαχειριστή.", + "warning.repository.out_of_sync": "Αυτό το αποθετήριο είναι εκτός συγχρονισμού με την αναπαράσταση του στη βάση δεδομένων. Αν αυτή η προειδοποίηση εμφανίζεται ακόμη και αν ωθήσατε μια υποβολή στο αποθετήριο, τότε επικοινωνήστε με το διαχειριστή.", "mail.actions.run_info_cur_status": "Κατάσταση αυτής της εκτέλεσης: %[1]s (μόλις άλλαξε από %[2]s)", "repo.diff.commit.previous-short": "Προηγ", "editor.textarea.shift_tab_hint": "Καμία στοίχιση σε αυτή τη γραμμή. Πατήστε Shift + Tab ξανά ή Escape για να βγείτε από το συντάκτη.", "og.repo.summary_card.alt_description": "Συνοπτική καρτέλα του αποθετηρίου %[1]s, περιγράφεται ως: %[2]s", "repo.diff.commit.next-short": "Επόμ", - "followers.outgoing.list.self.none": "Δεν ακολουθείτε κανένα.", + "followers.outgoing.list.self.none": "Δεν ακολουθείτε κανέναν.", "mail.actions.run_info_previous_status": "Κατάσταση Προηγούμενης Εκτέλεσης: %[1]s", "editor.textarea.tab_hint": "Η γραμμή είναι ήδη στοιχισμένη. Πατήστε Tab ξανά ή Escape για να βγείτε από το συντάκτη.", "repo.settings.push_mirror.branch_filter.description": "Κλάδοι που θα καθρεφτιστούν. Αφήστε κενό για να καθρεφτίζονται όλοι οι κλάδοι. Δείτε τη τεκμηρίωση του %[2]s για τη σύνταξη. Παράδειγμα: main, release/*", @@ -122,7 +122,7 @@ "alert.range_error": " πρέπει να είναι αριθμός μεταξύ %[1]s και %[2]s.", "admin.auths.allow_username_change.description": "Επιτρέπεται στους χρήστες να αλλάξουν το όνομα χρήστη τους στις ρυθμίσεις προφίλ", "profile.edit.link": "Επεξεργασία προφίλ", - "feed.atom.link": "Ροή atom", + "feed.atom.link": "Ροή Atom", "keys.ssh.link": "Κλειδιά SSH", "keys.gpg.link": "Κλειδιά GPG", "admin.config.moderation_config": "Ρυθμίσεις εποπτείας", @@ -131,7 +131,7 @@ "moderation.report_abuse_form.invalid": "Μη έγκυρες παράμετροι", "admin.dashboard.cleanup_offline_runners": "Καθαρισμός των εκτελεστών εκτός σύνδεσης", "admin.dashboard.remove_resolved_reports": "Αφαίρεση επιλυμένων αναφορών", - "profile.actions.tooltip": "Περισσότερες δράσεις", + "profile.actions.tooltip": "Περισσότερες ενέργειες", "moderation.submit_report": "Υποβολή έκθεσης", "moderation.reporting_failed": "Αδυναμία υποβολής της νέας έκθεσης κατάχρησης:% v", "admin.moderation.moderation_reports": "Αναφορές εποπτείας", @@ -177,5 +177,41 @@ "repo.issues.filter_modified.hint": "Φίλτρο με βάση την τελευταία τροποποίηση", "repo.pulls.poster_manage_approval": "Διαχείριση έγκρισης", "repo.issues.filter_reviewers.hint": "Φίλτρο με βάση το χρήστη που αναθεώρησε", - "repo.pulls.poster_requires_approval": "Κάποιες ροές εργασίας περιμένουν για αναθεώρηση." + "repo.pulls.poster_requires_approval": "Κάποιες ροές εργασίας περιμένουν για αναθεώρηση.", + "issues.updated": "ενημερώθηκε %s", + "repo.pulls.poster_trust_deny": "Απόρριψη", + "repo.pulls.poster_trust_once": "Έγκριση μια φορά", + "repo.pulls.poster_trust_always": "Έγκριση πάντα", + "repo.pulls.poster_trust_revoke": "Ανάκληση", + "search.syntax": "Σύνταξη αναζήτησης", + "search.fuzzy": "Παραπλήσια", + "search.fuzzy_tooltip": "Να συμπεριλαμβάνονται αποτελέσματα που έχουν παρεμφερή αντιστοιχία με τον όρο αναζήτησης", + "keys.verify.token.hint": "Το διακριτικό είναι έγκυρο μόνο για 1 λεπτό. Λάβετε ένα καινούργιο εάν έχει λήξει.", + "moderation.action.account.delete": "Διαγραφή λογαριασμού", + "moderation.action.account.suspend": "Αναστολή λογαριασμού", + "moderation.action.repo.delete": "Διαγραφή αποθετηρίου", + "moderation.action.issue.delete": "Διαγραφή ζητήματος", + "moderation.action.comment.delete": "Διαγραφή σχολίου", + "moderation.unknown_action": "Άγνωστη ενέργεια", + "repo.issues.filter_sort.hint": "Ταξινόμηση κατά: δημιουργήθηκε/σχόλια/ενημερώθηκε/διορία", + "moderation.users.cannot_suspend_self": "Δεν μπορείτε να αναστείλετε τον εαυτό σας.", + "moderation.users.cannot_suspend_admins": "Οι χρήστες με δικαιώματα διαχειριστή δεν μπορούν να ανασταλούν.", + "moderation.users.cannot_suspend_org": "Οι οργανισμοί δεν μπορούν να ανασταλούν.", + "moderation.users.already_suspended": "Ο λογαριασμός χρήστη είναι ήδη σε αναστολή.", + "moderation.users.suspend_success": "Ο λογαριασμός χρήστη έχει ανασταλεί.", + "moderation.users.cannot_delete_admins": "Οι χρήστες με δικαιώματα διαχειριστή δεν μπορούν να διαγραφούν.", + "moderation.issue.deletion_success": "Το ζήτημα έχει διαγραφεί.", + "moderation.comment.deletion_success": "Το σχόλιο έχει διαγραφεί.", + "admin.dashboard.actions_action_user": "Ανακαλέσετε την εμπιστοσύνη του Forgejo Actions για ανενεργούς χρήστες", + "admin.dashboard.transfer_lingering_logs": "Μεταβιβάστε τις καταγραφές ενεργειών για τις ολοκληρωμένες εργασίες ενεργειών από τη βάση δεδομένων στον αποθηκευτικό χώρο", + "migrate.pagure.private_issues.summary": "Ιδιωτικά Ζητήματα (Προαιρετικό)", + "teams.add_all_repos.modal.header": "Προσθήκη όλων των αποθετηρίων", + "teams.remove_all_repos.modal.header": "Αφαίρεση όλων των αποθετηρίων", + "editor.search": "Αναζήτηση", + "editor.find_previous": "Προηγούμενη εύρεση", + "editor.find_next": "Επόμενη εύρεση", + "editor.replace": "Αντικατάσταση", + "editor.replace_all": "Αντικατάσταση όλων", + "migrate.pagure.token.placeholder": "Μόνο για δημιουργία ιδιωτικού αρχείου ζητημάτων", + "repo.issues.filter_sort.hint_with_placeholder": "Ταξινόμηση κατά: %s" } diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json index d9d23653cd..c947975724 100644 --- a/options/locale_next/locale_en-US.json +++ b/options/locale_next/locale_en-US.json @@ -1,242 +1,255 @@ { "home.welcome.no_activity": "No activity", - "home.welcome.activity_hint": "There is nothing in your feed yet. Your actions and activity from repositories that you watch will show up here.", - "home.explore_repos": "Explore repositories", - "home.explore_users": "Explore users", - "home.explore_orgs": "Explore organizations", - "fork.n_forks": { - "one": "%s fork", - "other": "%s forks" - }, - "stars.list.none": "No one starred this repo.", - "stars.n_stars": { - "one": "%s star", - "other": "%s stars" - }, - "watch.list.none": "No one is watching this repo.", - "watch.n_watchers": { - "one": "%s watcher", - "other": "%s watchers" - }, - "followers.incoming.list.self.none": "No one is following your profile.", - "followers.incoming.list.none": "No one is following this user.", - "followers.outgoing.list.self.none": "You are not following anyone.", - "followers.outgoing.list.none": "%s isn't following anyone.", - "relativetime.now": "now", - "relativetime.future": "in future", - "relativetime.mins": { - "one": "%d minute ago", - "other": "%d minutes ago" - }, - "relativetime.hours": { - "one": "%d hour ago", - "other": "%d hours ago" - }, - "relativetime.days": { - "one": "%d day ago", - "other": "%d days ago" - }, - "relativetime.weeks": { - "one": "%d week ago", - "other": "%d weeks ago" - }, - "relativetime.months": { - "one": "%d month ago", - "other": "%d months ago" - }, - "relativetime.years": { - "one": "%d year ago", - "other": "%d years ago" - }, - "relativetime.1day": "yesterday", - "relativetime.2days": "two days ago", - "relativetime.1week": "last week", - "relativetime.2weeks": "two weeks ago", - "relativetime.1month": "last month", - "relativetime.2months": "two months ago", - "relativetime.1year": "last year", - "relativetime.2years": "two years ago", - "repo.issues.filter_poster.hint": "Filter by the author", - "repo.issues.filter_assignee.hint": "Filter by assigned user", - "repo.issues.filter_reviewers.hint": "Filter by user who reviewed", - "repo.issues.filter_mention.hint": "Filter by mentioned user", - "repo.issues.filter_modified.hint": "Filter by last modified date", - "repo.issues.filter_sort.hint": "Sort by: created/comments/updated/deadline", - "repo.pulls.poster_manage_approval": "Manage approval", - "repo.pulls.poster_requires_approval": "Some workflows are waiting to be reviewed.", - "repo.pulls.poster_requires_approval.tooltip": "The author of this pull request is not trusted to run workflows triggered by a pull request created from a forked repository or with AGit. The workflows triggered by a `pull_request` event will not run until they are approved.", - "repo.pulls.poster_is_trusted": "The author of this pull request is always trusted to run workflows.", - "repo.pulls.poster_is_trusted.tooltip": "The author of this pull request is explicitly trusted to run workflows triggered by `pull_request` events.", - "repo.pulls.poster_trust_deny": "Deny", - "repo.pulls.poster_trust_deny.tooltip": "The workflows waiting approval will be canceled.", - "repo.pulls.poster_trust_once": "Approve once", - "repo.pulls.poster_trust_once.tooltip": "The workflows triggered by a `pull_request` event will run on this commit but will need to be approved for all future commits pushed to this pull request.", - "repo.pulls.poster_trust_always": "Approve always", - "repo.pulls.poster_trust_always.tooltip": "The workflows triggered by a `pull_request` event will run on this commit and there will be no need to approve runs from this pull request or future pull requests authored by the same user.", - "repo.pulls.poster_trust_revoke": "Revoke", - "repo.pulls.poster_trust_revoke.tooltip": "The author of this pull request will no longer be trusted to run workflows triggered by a `pull_request` event, each run will have to be manually approved.", - "repo.pulls.already_merged": "Merge failed: This pull request has already been merged.", - "repo.pulls.merged_title_desc": { - "one": "merged %[1]d commit from %[2]s into %[3]s %[4]s", - "other": "merged %[1]d commits from %[2]s into %[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "one": "wants to merge %[1]d commit from %[2]s into %[3]s", - "other": "wants to merge %[1]d commits from %[2]s into %[3]s" - }, - "repo.pulls.maintainers_can_edit": "Maintainers can edit this pull request.", - "repo.pulls.maintainers_cannot_edit": "Maintainers cannot edit this pull request.", - "repo.form.cannot_create": "All spaces in which you can create repositories have reached the limit of repositories.", - "migrate.form.error.url_credentials": "The URL contains credentials, put them in the username and password fields respectively", - "migrate.github.description": "Migrate data from github.com or GitHub Enterprise server.", - "migrate.git.description": "Migrate a repository only from any Git service.", - "migrate.gitea.description": "Migrate data from gitea.com or other Gitea instances.", - "migrate.gitlab.description": "Migrate data from gitlab.com or other GitLab instances.", - "migrate.gogs.description": "Migrate data from notabug.org or other Gogs instances.", - "migrate.onedev.description": "Migrate data from code.onedev.io or other OneDev instances.", - "migrate.gitbucket.description": "Migrate data from GitBucket instances.", - "migrate.codebase.description": "Migrate data from codebasehq.com.", - "migrate.forgejo.description": "Migrate data from codeberg.org or other Forgejo instances.", - "repo.issue_indexer.title": "Issue Indexer", - "search.milestone_kind": "Search milestones…", - "search.syntax": "Search syntax", - "search.fuzzy": "Fuzzy", - "search.fuzzy_tooltip": "Include results is an approximate match to the search term", - "repo.settings.push_mirror.branch_filter.label": "Branch filter (optional)", - "repo.settings.push_mirror.branch_filter.description": "Branches to be mirrored. Leave blank to mirror all branches. See %[2]s documentation for syntax. Examples: main, release/*", - "incorrect_root_url": "This Forgejo instance is configured to be served on \"%s\". You are currently viewing Forgejo through a different URL, which may cause parts of the application to break. The canonical URL is controlled by Forgejo admins via the ROOT_URL setting in the app.ini.", - "themes.names.forgejo-auto": "Forgejo (follow system theme)", - "themes.names.forgejo-light": "Forgejo light", - "themes.names.forgejo-dark": "Forgejo dark", - "error.not_found.title": "Page not found", - "warning.repository.out_of_sync": "The database representation of this repository is out of synchronization. If this warning is still shown after pushing a commit to this repository contact the administrator.", - "alert.asset_load_failed": "Failed to load asset files from {path}. Please make sure the asset files can be accessed.", - "alert.range_error": " must be a number between %[1]s and %[2]s.", - "install.invalid_lfs_path": "Unable to create the LFS root at the specified path: %[1]s", - "profile.actions.tooltip": "More actions", - "profile.edit.link": "Edit profile", - "feed.atom.link": "Atom feed", - "keys.ssh.link": "SSH keys", - "keys.gpg.link": "GPG keys", - "keys.verify.token.hint": "The token is only valid for 1 minute. Get a new one if it expired.", - "admin.config.moderation_config": "Moderation configuration", - "admin.moderation.moderation_reports": "Moderation reports", - "admin.moderation.reports": "Reports", - "admin.moderation.no_open_reports": "There are currently no open reports.", - "admin.moderation.deleted_content_ref": "Reported content with type %[1]v and id %[2]d no longer exists", - "moderation.report.mark_as_handled": "Mark as handled", - "moderation.report.mark_as_ignored": "Mark as ignored", - "moderation.action.account.delete": "Delete account", - "moderation.action.account.suspend": "Suspend account", - "moderation.action.repo.delete": "Delete repository", - "moderation.action.issue.delete": "Delete issue", - "moderation.action.comment.delete": "Delete comment", - "moderation.unknown_action": "Unknown action", - "moderation.users.cannot_suspend_self": "You cannot suspend yourself.", - "moderation.users.cannot_suspend_admins": "Users with admin privileges cannot be suspended.", - "moderation.users.cannot_suspend_org": "Organizations cannot be suspended.", - "moderation.users.already_suspended": "User account is already suspended.", - "moderation.users.suspend_success": "The user account has been suspended.", - "moderation.users.cannot_delete_admins": "Users with admin privileges cannot be deleted.", - "moderation.issue.deletion_success": "The issue has been deleted.", - "moderation.comment.deletion_success": "The comment has been deleted.", - "moderation.report_abuse": "Report abuse", - "moderation.report_content": "Report content", - "moderation.report_abuse_form.header": "Report abuse to administrator", - "moderation.report_abuse_form.details": "This form should be used to report users who create spam profiles, repositories, issues, comments or behave inappropriately.", - "moderation.report_abuse_form.invalid": "Invalid arguments", - "moderation.report_abuse_form.already_reported": "You've already reported this content", - "moderation.abuse_category": "Category", - "moderation.abuse_category.placeholder": "Select a category", - "moderation.abuse_category.spam": "Spam", - "moderation.abuse_category.malware": "Malware", - "moderation.abuse_category.illegal_content": "Illegal content", - "moderation.abuse_category.other_violations": "Other violations of platform rules", - "moderation.report_remarks": "Remarks", - "moderation.report_remarks.placeholder": "Please provide some details regarding the abuse you are reporting.", - "moderation.submit_report": "Submit report", - "moderation.reporting_failed": "Unable to submit the new abuse report: %v", - "moderation.reported_thank_you": "Thank you for your report. The administration has been made aware of it.", - "mail.actions.successful_run_after_failure_subject": "Workflow %[1]s recovered in repository %[2]s", - "mail.actions.not_successful_run_subject": "Workflow %[1]s failed in repository %[2]s", - "mail.actions.successful_run_after_failure": "Workflow %[1]s recovered in repository %[2]s", - "mail.actions.not_successful_run": "Workflow %[1]s failed in repository %[2]s", - "mail.actions.run_info_cur_status": "This Run's Status: %[1]s (just updated from %[2]s)", - "mail.actions.run_info_previous_status": "Previous Run's Status: %[1]s", - "mail.actions.run_info_sha": "Commit: %[1]s", - "mail.actions.run_info_trigger": "Triggered because: %[1]s by: %[2]s", - "mail.issue.action.close_by_commit": "%[1]s closed %[2]s in commit %[3]s.", - "repo.diff.commit.next-short": "Next", - "repo.diff.commit.previous-short": "Prev", - "discussion.locked": "This discussion has been locked. Commenting is limited to contributors.", - "discussion.sidebar.reference": "Reference", - "editor.textarea.tab_hint": "Line already indented. Press Tab again or Escape to leave the editor.", - "editor.textarea.shift_tab_hint": "No indentation on this line. Press Shift + Tab again or Escape to leave the editor.", - "admin.auths.allow_username_change": "Allow username change", - "admin.auths.allow_username_change.description": "Allow users to change their username in the profile settings", - "admin.dashboard.cleanup_offline_runners": "Cleanup offline runners", - "admin.dashboard.remove_resolved_reports": "Remove resolved reports", - "admin.dashboard.actions_action_user": "Revoke Forgejo Actions trust for inactive users", - "admin.dashboard.transfer_lingering_logs": "Transfer actions logs of finished actions jobs from the database to storage", - "admin.config.security": "Security configuration", - "admin.config.global_2fa_requirement.title": "Global two-factor requirement", - "admin.config.global_2fa_requirement.none": "No", - "admin.config.global_2fa_requirement.all": "All users", - "admin.config.global_2fa_requirement.admin": "Administrators", - "settings.visibility.description": "Profile visibility affects others' ability to access your non-private repositories. Learn more.", - "settings.twofa_unroll_unavailable": "Two-factor authentication is required for your account and cannot be disabled.", - "settings.twofa_reenroll": "Re-enroll two-factor authentication", - "settings.twofa_reenroll.description": "Re-enroll your two-factor authentication", - "settings.must_enable_2fa": "This Forgejo instance requires users to enable two-factor authentication before they can access their accounts.", - "error.must_enable_2fa": "This Forgejo instance requires users to enable two-factor authentication before they can access their accounts. Enable it at: %s", - "avatar.constraints_hint": "Custom avatar may not exceed %[1]s in size or be larger than %[2]dx%[3]d pixels", - "user.ghost.tooltip": "This user has been deleted, or cannot be matched.", - "og.repo.summary_card.alt_description": "Summary card of repository %[1]s, described as: %[2]s", - "repo.commit.load_tags_failed": "Load tags failed because of internal error", - "compare.branches.title": "Compare branches", - "migrate.pagure.description": "Migrate data from pagure.io or other Pagure instances.", - "migrate.pagure.incorrect_url": "Incorrect source repository URL has been provided", - "migrate.pagure.project_url": "Pagure project URL", - "migrate.pagure.project_example": "The Pagure project URL, e.g. https://pagure.io/pagure", - "migrate.pagure.token_label": "Pagure API Token", - "migrate.pagure.private_issues.summary": "Private Issues (Optional)", - "migrate.pagure.private_issues.description": "This feature is designed to create a second repository containing only private issues from your Pagure project for archive purposes. First, perform a normal migration (without a token) to import all public content. Then, if you have private issues to preserve, create a separate repository using this token option to archive those private issues.", - "migrate.pagure.private_issues.warning": "Be sure to set the repository visibility above to Private if you are using the API key to import private issues. This prevents accidentally exposing private content in a public repository.", - "migrate.pagure.token.placeholder": "Only for creating private issues archive", - "release.n_downloads": { - "one": "%s download", - "other": "%s downloads" - }, - "actions.status.diagnostics.waiting": { - "one": "Waiting for a runner with the following label: %s", - "other": "Waiting for a runner with the following labels: %s" - }, - "actions.runs.run_attempt_label": "Run attempt #%[1]s (%[2]s)", - "actions.runs.viewing_out_of_date_run": "You are viewing an out-of-date run of this job that was executed %[1]s.", - "actions.runs.view_most_recent_run": "View most recent run", - "actions.workflow.job_parsing_error": "Unable to parse jobs in workflow: %v", - "actions.workflow.event_detection_error": "Unable to parse supported events in workflow: %v", - "actions.workflow.persistent_incomplete_matrix": "Unable to evaluate `strategy.matrix` of job %[1]s due to a `needs` expression that was invalid. It may reference a job that is not in it's 'needs' list (%[2]s), or an output that doesn't exist on one of those jobs.", - "actions.workflow.incomplete_matrix_missing_job": "Unable to evaluate `strategy.matrix` of job %[1]s: job %[2]s is not in the `needs` list of job %[1]s (%[3]s).", + "home.welcome.activity_hint": "There is nothing in your feed yet. Your actions and activity from repositories that you watch will show up here.", + "home.explore_repos": "Explore repositories", + "home.explore_users": "Explore users", + "home.explore_orgs": "Explore organizations", + "fork.n_forks": { + "one": "%s fork", + "other": "%s forks" + }, + "stars.list.none": "No one starred this repo.", + "stars.n_stars": { + "one": "%s star", + "other": "%s stars" + }, + "watch.list.none": "No one is watching this repo.", + "watch.n_watchers": { + "one": "%s watcher", + "other": "%s watchers" + }, + "followers.incoming.list.self.none": "No one is following your profile.", + "followers.incoming.list.none": "No one is following this user.", + "followers.outgoing.list.self.none": "You are not following anyone.", + "followers.outgoing.list.none": "%s isn't following anyone.", + "relativetime.now": "now", + "relativetime.future": "in future", + "relativetime.mins": { + "one": "%d minute ago", + "other": "%d minutes ago" + }, + "relativetime.hours": { + "one": "%d hour ago", + "other": "%d hours ago" + }, + "relativetime.days": { + "one": "%d day ago", + "other": "%d days ago" + }, + "relativetime.weeks": { + "one": "%d week ago", + "other": "%d weeks ago" + }, + "relativetime.months": { + "one": "%d month ago", + "other": "%d months ago" + }, + "relativetime.years": { + "one": "%d year ago", + "other": "%d years ago" + }, + "relativetime.1day": "yesterday", + "relativetime.2days": "two days ago", + "relativetime.1week": "last week", + "relativetime.2weeks": "two weeks ago", + "relativetime.1month": "last month", + "relativetime.2months": "two months ago", + "relativetime.1year": "last year", + "relativetime.2years": "two years ago", + "repo.issues.filter_poster.hint": "Filter by the author", + "repo.issues.filter_assignee.hint": "Filter by assigned user", + "repo.issues.filter_reviewers.hint": "Filter by user who reviewed", + "repo.issues.filter_mention.hint": "Filter by mentioned user", + "repo.issues.filter_modified.hint": "Filter by last modified date", + "repo.issues.filter_sort.hint_with_placeholder": "Sort by: %s", + "issues.updated": "updated %s", + "repo.pulls.auto_merge.no_permission": "You do not have permission to cancel this pull request's auto merge.", + "repo.pulls.poster_manage_approval": "Manage approval", + "repo.pulls.poster_requires_approval": "Some workflows are waiting to be reviewed.", + "repo.pulls.poster_requires_approval.tooltip": "The author of this pull request is not trusted to run workflows triggered by a pull request created from a forked repository or with AGit. The workflows triggered by a `pull_request` event will not run until they are approved.", + "repo.pulls.poster_is_trusted": "The author of this pull request is always trusted to run workflows.", + "repo.pulls.poster_is_trusted.tooltip": "The author of this pull request is explicitly trusted to run workflows triggered by `pull_request` events.", + "repo.pulls.poster_trust_deny": "Deny", + "repo.pulls.poster_trust_deny.tooltip": "The workflows waiting approval will be canceled.", + "repo.pulls.poster_trust_once": "Approve once", + "repo.pulls.poster_trust_once.tooltip": "The workflows triggered by a `pull_request` event will run on this commit but will need to be approved for all future commits pushed to this pull request.", + "repo.pulls.poster_trust_always": "Approve always", + "repo.pulls.poster_trust_always.tooltip": "The workflows triggered by a `pull_request` event will run on this commit and there will be no need to approve runs from this pull request or future pull requests authored by the same user.", + "repo.pulls.poster_trust_revoke": "Revoke", + "repo.pulls.poster_trust_revoke.tooltip": "The author of this pull request will no longer be trusted to run workflows triggered by a `pull_request` event, each run will have to be manually approved.", + "repo.pulls.already_merged": "Merge failed: This pull request has already been merged.", + "repo.pulls.merged_title_desc": { + "one": "merged %[1]d commit from %[2]s into %[3]s %[4]s", + "other": "merged %[1]d commits from %[2]s into %[3]s %[4]s" + }, + "repo.pulls.title_desc": { + "one": "wants to merge %[1]d commit from %[2]s into %[3]s", + "other": "wants to merge %[1]d commits from %[2]s into %[3]s" + }, + "repo.pulls.maintainers_can_edit": "Maintainers can edit this pull request.", + "repo.pulls.maintainers_cannot_edit": "Maintainers cannot edit this pull request.", + "repo.form.cannot_create": "All spaces in which you can create repositories have reached the limit of repositories.", + "migrate.form.error.url_credentials": "The URL contains credentials, put them in the username and password fields respectively", + "migrate.github.description": "Migrate data from github.com or GitHub Enterprise server.", + "migrate.git.description": "Migrate a repository only from any Git service.", + "migrate.gitea.description": "Migrate data from gitea.com or other Gitea instances.", + "migrate.gitlab.description": "Migrate data from gitlab.com or other GitLab instances.", + "migrate.gogs.description": "Migrate data from notabug.org or other Gogs instances.", + "migrate.onedev.description": "Migrate data from code.onedev.io or other OneDev instances.", + "migrate.gitbucket.description": "Migrate data from GitBucket instances.", + "migrate.codebase.description": "Migrate data from codebasehq.com.", + "migrate.forgejo.description": "Migrate data from codeberg.org or other Forgejo instances.", + "repo.issue_indexer.title": "Issue Indexer", + "search.milestone_kind": "Search milestones…", + "search.syntax": "Search syntax", + "search.fuzzy": "Fuzzy", + "search.fuzzy_tooltip": "Include results is an approximate match to the search term", + "repo.settings.push_mirror.branch_filter.label": "Branch filter (optional)", + "repo.settings.push_mirror.branch_filter.description": "Branches to be mirrored. Leave blank to mirror all branches. See %[2]s documentation for syntax. Examples: main, release/*", + "incorrect_root_url": "This Forgejo instance is configured to be served on \"%s\". You are currently viewing Forgejo through a different URL, which may cause parts of the application to break. The canonical URL is controlled by Forgejo admins via the ROOT_URL setting in the app.ini.", + "themes.names.forgejo-auto": "Forgejo (follow system theme)", + "themes.names.forgejo-light": "Forgejo light", + "themes.names.forgejo-dark": "Forgejo dark", + "error.not_found.title": "Page not found", + "warning.repository.out_of_sync": "The database representation of this repository is out of synchronization. If this warning is still shown after pushing a commit to this repository contact the administrator.", + "alert.asset_load_failed": "Failed to load asset files from {path}. Please make sure the asset files can be accessed.", + "alert.range_error": " must be a number between %[1]s and %[2]s.", + "install.invalid_lfs_path": "Unable to create the LFS root at the specified path: %[1]s", + "profile.actions.tooltip": "More actions", + "profile.edit.link": "Edit profile", + "feed.atom.link": "Atom feed", + "keys.ssh.link": "SSH keys", + "keys.gpg.link": "GPG keys", + "keys.verify.token.hint": "The token is only valid for 1 minute. Get a new one if it expired.", + "admin.config.moderation_config": "Moderation configuration", + "admin.moderation.moderation_reports": "Moderation reports", + "admin.moderation.reports": "Reports", + "admin.moderation.no_open_reports": "There are currently no open reports.", + "admin.moderation.deleted_content_ref": "Reported content with type %[1]v and id %[2]d no longer exists", + "moderation.report.mark_as_handled": "Mark as handled", + "moderation.report.mark_as_ignored": "Mark as ignored", + "moderation.action.account.delete": "Delete account", + "moderation.action.account.suspend": "Suspend account", + "moderation.action.repo.delete": "Delete repository", + "moderation.action.issue.delete": "Delete issue", + "moderation.action.comment.delete": "Delete comment", + "moderation.unknown_action": "Unknown action", + "moderation.users.cannot_suspend_self": "You cannot suspend yourself.", + "moderation.users.cannot_suspend_admins": "Users with admin privileges cannot be suspended.", + "moderation.users.cannot_suspend_org": "Organizations cannot be suspended.", + "moderation.users.already_suspended": "User account is already suspended.", + "moderation.users.suspend_success": "The user account has been suspended.", + "moderation.users.cannot_delete_admins": "Users with admin privileges cannot be deleted.", + "moderation.issue.deletion_success": "The issue has been deleted.", + "moderation.comment.deletion_success": "The comment has been deleted.", + "moderation.report_abuse": "Report abuse", + "moderation.report_content": "Report content", + "moderation.report_abuse_form.header": "Report abuse to administrator", + "moderation.report_abuse_form.details": "This form should be used to report users who create spam profiles, repositories, issues, comments or behave inappropriately.", + "moderation.report_abuse_form.invalid": "Invalid arguments", + "moderation.report_abuse_form.already_reported": "You've already reported this content", + "moderation.abuse_category": "Category", + "moderation.abuse_category.placeholder": "Select a category", + "moderation.abuse_category.spam": "Spam", + "moderation.abuse_category.malware": "Malware", + "moderation.abuse_category.illegal_content": "Illegal content", + "moderation.abuse_category.other_violations": "Other violations of platform rules", + "moderation.report_remarks": "Remarks", + "moderation.report_remarks.placeholder": "Please provide some details regarding the abuse you are reporting.", + "moderation.submit_report": "Submit report", + "moderation.reporting_failed": "Unable to submit the new abuse report: %v", + "moderation.reported_thank_you": "Thank you for your report. The administration has been made aware of it.", + "mail.actions.successful_run_after_failure_subject": "Workflow %[1]s recovered in repository %[2]s", + "mail.actions.not_successful_run_subject": "Workflow %[1]s failed in repository %[2]s", + "mail.actions.successful_run_after_failure": "Workflow %[1]s recovered in repository %[2]s", + "mail.actions.not_successful_run": "Workflow %[1]s failed in repository %[2]s", + "mail.actions.run_info_cur_status": "This Run's Status: %[1]s (just updated from %[2]s)", + "mail.actions.run_info_previous_status": "Previous Run's Status: %[1]s", + "mail.actions.run_info_sha": "Commit: %[1]s", + "mail.actions.run_info_trigger": "Triggered because: %[1]s by: %[2]s", + "mail.issue.action.close_by_commit": "%[1]s closed %[2]s in commit %[3]s.", + "repo.diff.commit.next-short": "Next", + "repo.diff.commit.previous-short": "Prev", + "discussion.locked": "This discussion has been locked. Commenting is limited to contributors.", + "discussion.sidebar.reference": "Reference", + "editor.textarea.tab_hint": "Line already indented. Press Tab again or Escape to leave the editor.", + "editor.textarea.shift_tab_hint": "No indentation on this line. Press Shift + Tab again or Escape to leave the editor.", + "admin.auths.allow_username_change": "Allow username change", + "admin.auths.allow_username_change.description": "Allow users to change their username in the profile settings", + "admin.dashboard.cleanup_offline_runners": "Cleanup offline runners", + "admin.dashboard.remove_resolved_reports": "Remove resolved reports", + "admin.dashboard.actions_action_user": "Revoke Forgejo Actions trust for inactive users", + "admin.dashboard.transfer_lingering_logs": "Transfer actions logs of finished actions jobs from the database to storage", + "admin.config.security": "Security configuration", + "admin.config.global_2fa_requirement.title": "Global two-factor requirement", + "admin.config.global_2fa_requirement.none": "No", + "admin.config.global_2fa_requirement.all": "All users", + "admin.config.global_2fa_requirement.admin": "Administrators", + "settings.visibility.description": "Profile visibility affects others' ability to access your non-private repositories. Learn more.", + "settings.twofa_unroll_unavailable": "Two-factor authentication is required for your account and cannot be disabled.", + "settings.twofa_reenroll": "Re-enroll two-factor authentication", + "settings.twofa_reenroll.description": "Re-enroll your two-factor authentication", + "settings.must_enable_2fa": "This Forgejo instance requires users to enable two-factor authentication before they can access their accounts.", + "error.must_enable_2fa": "This Forgejo instance requires users to enable two-factor authentication before they can access their accounts. Enable it at: %s", + "avatar.constraints_hint": "Custom avatar may not exceed %[1]s in size or be larger than %[2]dx%[3]d pixels", + "user.ghost.tooltip": "This user has been deleted, or cannot be matched.", + "og.repo.summary_card.alt_description": "Summary card of repository %[1]s, described as: %[2]s", + "repo.commit.load_tags_failed": "Load tags failed because of internal error", + "compare.branches.title": "Compare branches", + "migrate.pagure.description": "Migrate data from pagure.io or other Pagure instances.", + "migrate.pagure.incorrect_url": "Incorrect source repository URL has been provided", + "migrate.pagure.project_url": "Pagure project URL", + "migrate.pagure.project_example": "The Pagure project URL, e.g. https://pagure.io/pagure", + "migrate.pagure.token_label": "Pagure API Token", + "migrate.pagure.private_issues.summary": "Private Issues (Optional)", + "migrate.pagure.private_issues.description": "This feature is designed to create a second repository containing only private issues from your Pagure project for archive purposes. First, perform a normal migration (without a token) to import all public content. Then, if you have private issues to preserve, create a separate repository using this token option to archive those private issues.", + "migrate.pagure.private_issues.warning": "Be sure to set the repository visibility above to Private if you are using the API key to import private issues. This prevents accidentally exposing private content in a public repository.", + "migrate.pagure.token.placeholder": "Only for creating private issues archive", + "release.n_downloads": { + "one": "%s download", + "other": "%s downloads" + }, + "actions.status.diagnostics.waiting": { + "one": "Waiting for a runner with the following label: %s", + "other": "Waiting for a runner with the following labels: %s" + }, + "actions.runs.run_attempt_label": "Run attempt #%[1]s (%[2]s)", + "actions.runs.viewing_out_of_date_run": "You are viewing an out-of-date run of this job that was executed %[1]s.", + "actions.runs.view_most_recent_run": "View most recent run", + "actions.workflow.job_parsing_error": "Unable to parse jobs in workflow: %v", + "actions.workflow.event_detection_error": "Unable to parse supported events in workflow: %v", + "actions.workflow.persistent_incomplete_matrix": "Unable to evaluate `strategy.matrix` of job %[1]s due to a `needs` expression that was invalid. It may reference a job that is not in it's 'needs' list (%[2]s), or an output that doesn't exist on one of those jobs.", + "actions.workflow.incomplete_matrix_missing_job": "Unable to evaluate `strategy.matrix` of job %[1]s: job %[2]s is not in the `needs` list of job %[1]s (%[3]s).", "actions.workflow.incomplete_matrix_missing_output": "Unable to evaluate `strategy.matrix` of job %[1]s: job %[2]s does not have an output %[3]s.", - "actions.workflow.incomplete_matrix_unknown_cause": "Unable to evaluate `strategy.matrix` of job %[1]s: unknown error.", - "actions.workflow.incomplete_runson_missing_job": "Unable to evaluate `runs-on` of job %[1]s: job %[2]s is not in the `needs` list of job %[1]s (%[3]s).", + "actions.workflow.incomplete_matrix_unknown_cause": "Unable to evaluate `strategy.matrix` of job %[1]s: unknown error.", + "actions.workflow.incomplete_runson_missing_job": "Unable to evaluate `runs-on` of job %[1]s: job %[2]s is not in the `needs` list of job %[1]s (%[3]s).", "actions.workflow.incomplete_runson_missing_output": "Unable to evaluate `runs-on` of job %[1]s: job %[2]s does not have an output %[3]s.", - "actions.workflow.incomplete_runson_missing_matrix_dimension": "Unable to evaluate `runs-on` of job %[1]s: matrix dimension %[2]s does not exist.", - "actions.workflow.incomplete_runson_unknown_cause": "Unable to evaluate `runs-on` of job %[1]s: unknown error.", - "actions.workflow.pre_execution_error": "Workflow was not executed due to an error that blocked the execution attempt.", - "pulse.n_active_issues": { - "one": "%s active issue", - "other": "%s active issues" - }, - "pulse.n_active_prs": { - "one": "%s active pull request", - "other": "%s active pull requests" - }, - "teams.add_all_repos.modal.header": "Add all repositories", - "teams.remove_all_repos.modal.header": "Remove all repositories", - "admin.auths.oauth2_quota_group_claim_name": "Claim name providing group names for this source to be used for quota management. (Optional)", - "admin.auths.oauth2_quota_group_map": "Map claimed groups to quota groups. (Optional - requires claim name above)", - "admin.auths.oauth2_quota_group_map_removal": "Remove users from synchronized quota groups if user does not belong to corresponding group.", - "meta.last_line": "Thank you for translating Forgejo! This line isn't seen by the users but it serves other purposes in the translation management. You can place a fun fact in the translation instead of translating it." + "actions.workflow.incomplete_runson_missing_matrix_dimension": "Unable to evaluate `runs-on` of job %[1]s: matrix dimension %[2]s does not exist.", + "actions.workflow.incomplete_runson_unknown_cause": "Unable to evaluate `runs-on` of job %[1]s: unknown error.", + "actions.workflow.pre_execution_error": "Workflow was not executed due to an error that blocked the execution attempt.", + "pulse.n_active_issues": { + "one": "%s active issue", + "other": "%s active issues" + }, + "pulse.n_active_prs": { + "one": "%s active pull request", + "other": "%s active pull requests" + }, + "teams.add_all_repos.modal.header": "Add all repositories", + "teams.remove_all_repos.modal.header": "Remove all repositories", + "admin.auths.oauth2_quota_group_claim_name": "Claim name providing group names for this source to be used for quota management. (Optional)", + "admin.auths.oauth2_quota_group_map": "Map claimed groups to quota groups. (Optional - requires claim name above)", + "admin.auths.oauth2_quota_group_map_removal": "Remove users from synchronized quota groups if user does not belong to corresponding group.", + "editor.search": "Search", + "editor.find_previous": "Previous find", + "editor.find_next": "Next find", + "editor.replace": "Replace", + "editor.replace_all": "Replace all", + "editor.toggle_case": "Toggle case sensitivity", + "editor.toggle_regex": "Toggle using regular expressions", + "editor.toggle_whole_word": "Toggle matching whole words", + "repo.view.gitmodules_too_large": "The .gitmodules file is too large and will be ignored (on API calls for instance)", + "install.ssh_authorized_keys_inspection_error": "Failed to inspect existing authorized_keys file: %v", + "install.ssh_authorized_keys_unexpected_key": "Enabling SSH for Forgejo conflicts with the file located at %s that contains existing SSH keys. Suggestions: use a dedicated system user for Forgejo, or disable SSH.", + "meta.last_line": "Thank you for translating Forgejo! This line isn't seen by the users but it serves other purposes in the translation management. You can place a fun fact in the translation instead of translating it." } diff --git a/options/locale_next/locale_eo.json b/options/locale_next/locale_eo.json index 3c1a173ded..2073be7afa 100644 --- a/options/locale_next/locale_eo.json +++ b/options/locale_next/locale_eo.json @@ -92,5 +92,7 @@ "repo.issues.filter_assignee.hint": "Filtri laŭ asignita uzanto", "repo.issues.filter_reviewers.hint": "Filtri laŭ uzanto kiu recenzis", "repo.issues.filter_mention.hint": "Filtri laŭ menciita uzanto", - "repo.issues.filter_modified.hint": "Filtri laŭ lasta modifdato" + "repo.issues.filter_modified.hint": "Filtri laŭ lasta modifdato", + "moderation.report_remarks": "Rimarkoj", + "meta.last_line": " " } diff --git a/options/locale_next/locale_es-ES.json b/options/locale_next/locale_es-ES.json index 113eebd165..ad8ddc6440 100644 --- a/options/locale_next/locale_es-ES.json +++ b/options/locale_next/locale_es-ES.json @@ -135,5 +135,43 @@ "pulse.n_active_prs": { "one": "%s pull request activa", "other": "%s pull requests activas" - } + }, + "repo.issues.filter_poster.hint": "Filtrar por autor", + "repo.issues.filter_assignee.hint": "Filtrar por usuario asignado", + "repo.issues.filter_reviewers.hint": "Filtrar por usuario revisor", + "repo.issues.filter_mention.hint": "Filtrar por usuario mencionado", + "repo.issues.filter_modified.hint": "Filtrar por fecha de última modificación", + "repo.issues.filter_sort.hint": "Ordenar por: creación/comentarios/actualización/fecha límite", + "issues.updated": "actualizado %s", + "repo.pulls.poster_manage_approval": "Administrar la aprobación", + "repo.pulls.poster_requires_approval.tooltip": "Al autor de esta solicitud de incorporación de cambios no se le confía el ejecutar flujos de trabajo desencadenados por una solicitud de incorporación de cambios creada a partir de un repositorio bifurcado o con AGit. Los flujos de trabajo desencadenados por un evento \"pull_request\" no funcionarán hasta ser aprobados.", + "repo.pulls.poster_is_trusted.tooltip": "Al autor de esta solicitud de incorporación de cambios se le ha confiado explícitamente ejecutar los flujos de trabajo desencadenados por los eventos `pull_request`.", + "repo.pulls.poster_trust_deny": "Denegar", + "repo.pulls.poster_trust_deny.tooltip": "Los flujos de trabajo esperando por aprobación serán cancelados.", + "repo.pulls.poster_trust_once": "Aprobar una vez", + "repo.pulls.poster_trust_once.tooltip": "Los flujos de trabajo desencadenados por un evento 'pull_request' se ejecutarán en esta confirmación pero tendrán que ser aprobados para todos las futuras confirmaciones enviadas a esta solicitud de incorporación de cambios.", + "repo.pulls.poster_trust_always.tooltip": "Los flujos de trabajo desencadenados por un evento 'pull_request' se ejecutarán en esta confirmación y no habrá necesidad de aprobar las ejecuciones de esta solicitud de incorporación de cambios o futuras solicitudes de incorporación de cambios creadas por el mismo usuario.", + "repo.pulls.poster_trust_revoke": "Revocar", + "repo.pulls.poster_trust_revoke.tooltip": "Ya no se confiará al autor de esta solicitud de incorporación de cambios para ejecutar los flujos de trabajo desencadenados por un evento “pull_request”, cada ejecución tendrá que ser aprobada manualmente.", + "repo.view.gitmodules_too_large": "El archivo .gitmodules es demasiado grande y será ignorado (en llamadas a la API por ejemplo)", + "migrate.form.error.url_credentials": "La URL contiene credenciales, colóquelas en los campos de nombre de usuario y contraseña respectivamente", + "search.syntax": "Sintaxis de búsqueda", + "install.ssh_authorized_keys_inspection_error": "Error al inspeccionar el archivo autorized_keys existente: %v", + "moderation.report.mark_as_ignored": "Marcar como ignorado", + "moderation.action.account.delete": "Eliminar cuenta", + "moderation.action.account.suspend": "Suspender cuenta", + "moderation.action.repo.delete": "Eliminar repositorio", + "moderation.action.issue.delete": "Eliminar incidencia", + "moderation.action.comment.delete": "Eliminar comentario", + "moderation.unknown_action": "Acción desconocida", + "moderation.users.cannot_suspend_org": "Las organizaciones no pueden ser suspendidas.", + "moderation.users.already_suspended": "La cuenta de usuario ya está suspendida.", + "moderation.users.suspend_success": "La cuenta de usuario ha sido suspendida.", + "moderation.issue.deletion_success": "La incidencia ha sido eliminada.", + "moderation.comment.deletion_success": "El comentario ha sido eliminado.", + "mail.actions.run_info_sha": "Confirmación: %[1]s", + "mail.actions.run_info_trigger": "Desencadenado por: %[1]s by: %[2]s", + "mail.issue.action.close_by_commit": "%[1]s cerró %[2]s en la confirmación %[3]s.", + "repo.diff.commit.next-short": "Siguiente", + "repo.issues.filter_sort.hint_with_placeholder": "Ordenar por: %s" } diff --git a/options/locale_next/locale_et.json b/options/locale_next/locale_et.json index 40219acda3..bd8ed6e7fa 100644 --- a/options/locale_next/locale_et.json +++ b/options/locale_next/locale_et.json @@ -53,7 +53,7 @@ "home.explore_repos": "Uuri lähtekoodi hoidlaid", "home.explore_users": "Otsi kasutajaid", "home.explore_orgs": "Tutvu organisatsioonidega", - "meta.last_line": "Tänud, et oled Forgejo'd tõlkinud! Work hard and put in the effort, and love will come. (Tee tööd ja näe vaeva, siis tuleb armastus - A. H. Tammsaare)", + "meta.last_line": "Tänud, et oled Forgejo'd tõlkinud! Work hard and put in the effort, and love will come. (Tee tööd ja näe vaeva, siis tuleb armastus - A. H. Tammsaare).", "keys.ssh.link": "SSH võtmed", "keys.gpg.link": "GPG võtmed", "profile.edit.link": "Muuda profiili", @@ -66,5 +66,7 @@ "release.n_downloads": { "one": "%s allalaadimine", "other": "%s allalaadimist" - } + }, + "repo.settings.push_mirror.branch_filter.label": "Alamharude filter (kui soovid)", + "compare.branches.title": "Võrdle alamharusid" } diff --git a/options/locale_next/locale_eu.json b/options/locale_next/locale_eu.json index 0967ef424b..a038db2f72 100644 --- a/options/locale_next/locale_eu.json +++ b/options/locale_next/locale_eu.json @@ -1 +1 @@ -{} +{"meta.last_line": " "} diff --git a/options/locale_next/locale_fa-IR.json b/options/locale_next/locale_fa-IR.json index ec3d5e16e0..1cd615f279 100644 --- a/options/locale_next/locale_fa-IR.json +++ b/options/locale_next/locale_fa-IR.json @@ -27,5 +27,6 @@ "pulse.n_active_prs": { "one": "%s تقاضای واکشی فعال", "other": "%s تقاضاهای واکشی فعال" - } + }, + "meta.last_line": " " } diff --git a/options/locale_next/locale_fi-FI.json b/options/locale_next/locale_fi-FI.json index 809d22a1b7..e31e720b8d 100644 --- a/options/locale_next/locale_fi-FI.json +++ b/options/locale_next/locale_fi-FI.json @@ -192,5 +192,11 @@ "moderation.users.already_suspended": "Käyttäjätili on jo jäädytetty.", "moderation.users.suspend_success": "Käyttäjätili on jäädytetty.", "moderation.issue.deletion_success": "Ongelma on poistettu.", - "moderation.comment.deletion_success": "Kommentti on poistettu." + "moderation.comment.deletion_success": "Kommentti on poistettu.", + "issues.updated": "päivitetty %s", + "search.fuzzy": "Sumea", + "mail.issue.action.close_by_commit": "%[1]s sulki %[2]s kommitissa %[3]s.", + "editor.search": "Hae", + "editor.replace": "Korvaa", + "editor.replace_all": "Korvaa kaikki" } diff --git a/options/locale_next/locale_fil.json b/options/locale_next/locale_fil.json index 3527875176..7a21cf6283 100644 --- a/options/locale_next/locale_fil.json +++ b/options/locale_next/locale_fil.json @@ -90,7 +90,7 @@ "moderation.abuse_category.illegal_content": "Ilegal na nilalaman", "moderation.abuse_category.other_violations": "Mga ibang paglabag sa mga patakaran ng platform", "moderation.report_remarks": "Mga pahayag", - "moderation.report_remarks.placeholder": "Mangyaring magbigay ng mga detalye tungkol sa pang aabuso na inuulat mo.", + "moderation.report_remarks.placeholder": "Pakibigay ang mga detalye tungkol sa pang aabuso na inuulat mo.", "moderation.submit_report": "I-submit ang ulat", "moderation.reporting_failed": "Hindi ma-submit ang bagong ulat sa pang aabuso: %v", "moderation.reported_thank_you": "Salamat sa iyong ulat. Naipaalam na ito sa administrasyon.", @@ -209,5 +209,47 @@ "other": "Naghihintay ng runner na may sumusunod na mga label: %s" }, "teams.add_all_repos.modal.header": "Idagdag ang lahat ng mga repositoryo", - "teams.remove_all_repos.modal.header": "Tanggalin ang lahat ng mga repositoryo" + "teams.remove_all_repos.modal.header": "Tanggalin ang lahat ng mga repositoryo", + "issues.updated": "binago %s", + "search.fuzzy": "Humigit-kumulang", + "search.fuzzy_tooltip": "Ang mga resulta ay isang higit-kumukulang na tugma sa terminong hinahanap", + "moderation.report.mark_as_handled": "Markahan bilang ginawa", + "moderation.report.mark_as_ignored": "Markahan bilang hindi pinansin", + "moderation.action.account.delete": "Burahin ang account", + "moderation.action.account.suspend": "Isuspinde ang account", + "moderation.action.repo.delete": "Burahin ang repositoryo", + "moderation.action.issue.delete": "Burahin ang isyu", + "moderation.action.comment.delete": "Burahin ang komento", + "moderation.unknown_action": "Hindi alam na aksyon", + "moderation.users.cannot_suspend_self": "Hindi mo maaaring isuspinde ang sarili mo.", + "moderation.users.cannot_suspend_admins": "Hindi maaaring isuspinde ang mga user na may pribilehiyong tagapangasiwa.", + "moderation.users.cannot_suspend_org": "Hindi maaaring isuspinde ang mga organisasyon.", + "moderation.users.already_suspended": "Sinuspinde na ang user account.", + "moderation.users.suspend_success": "Nasuspinde na ang user account.", + "moderation.users.cannot_delete_admins": "Hindi maaaring burahin ang mga user na may pribilehiyong tagapangasiwa.", + "moderation.issue.deletion_success": "Binura na ang isyu.", + "moderation.comment.deletion_success": "Binura na ang komento.", + "actions.workflow.persistent_incomplete_matrix": "Hindi masuri ang `strategy.matrix` ng trabahong %[1]s dahil sa hindi wastong `needs` na ekspresyon. Maaari itong sumangguni sa isang trabaho na hindi nasa `needs` na listahan (%[2]s), o isang output na hindi umiiral sa isa sa mga trabaho na iyon.", + "actions.workflow.incomplete_matrix_missing_job": "Hindi masuri ang `strategy.matrix` ng trabahong %[1]s: hindi nasa listahan ng `needs`ng trabahong %[1]s (%[3]s) ang trabahong %[2]s.", + "actions.workflow.incomplete_matrix_missing_output": "Hindi masuri ang `strategy.matrix` ng trabahong %[1]s: walang output na %[3]s ang trabahong %[2]s.", + "actions.workflow.incomplete_matrix_unknown_cause": "Hindi masuri ang `strategy.matrix` ng trabahong %[1]s: hindi alam na error.", + "actions.workflow.incomplete_runson_missing_job": "Hindi masuri ang `runs-on` ng trabahong %[1]s: hindi nasa listahan ng `needs` ng trabahong %[1]s (%[3]s) ang trabahong %[2]s.", + "actions.workflow.incomplete_runson_missing_output": "Hindi masuri ang `runs-on` ng trabahong %[1]s: walang output na %[3]s ang trabahong %[2]s.", + "actions.workflow.incomplete_runson_missing_matrix_dimension": "Hindi masuri ang `runs-on` ng trabahong %[1]s: hindi umiiral ang matrix dimension na %[2]s.", + "actions.workflow.incomplete_runson_unknown_cause": "Hindi masuri ang `runs-on` ng trabahong %[1]s: hindi alam na error.", + "admin.auths.oauth2_quota_group_claim_name": "Claim name na nagbibigay ng mga pangalan ng grupo para sa pinagmulan na ito na gagamitin sa pamamahala ng quota. (Opsyonal)", + "admin.auths.oauth2_quota_group_map": "I-map ang mga claimed group sa mga quota group. (Opsyonal - kinakailangan ang claim name sa itaas)", + "admin.auths.oauth2_quota_group_map_removal": "Tanggalin ang mga user mula sa mga naka-sync na quota group kung hindi nabibilang sa katumbas na grupo ang user.", + "repo.view.gitmodules_too_large": "Masyadong malaki ang .gitmodules file at hindi ito papansinin (hal. para sa API call)", + "install.ssh_authorized_keys_inspection_error": "Nabigong suriin ang umiiral na authroized_keys file: %v", + "install.ssh_authorized_keys_unexpected_key": "Sumasalungat sa file na nakalagay sa %s ng mga umiiral na SSH key ang pag-enable ng SSH para sa Forgejo. Mga mungkahi: gumamit ng dedikadong system user para sa Forgejo, o I-disable ang SSH.", + "editor.search": "Maghanap", + "editor.find_previous": "Nakaraang hanap", + "editor.find_next": "Susunod na hanap", + "editor.replace": "Palitan", + "editor.replace_all": "Palitan lahat", + "editor.toggle_case": "I-toggle ang case sensitivity", + "editor.toggle_regex": "I-toggle ang paggamit ng mga regular na ekspresyon", + "editor.toggle_whole_word": "I-toggle ang pagtugma ng mga buong salita", + "repo.issues.filter_sort.hint_with_placeholder": "Isaayos ayon sa: %s" } diff --git a/options/locale_next/locale_fr-FR.json b/options/locale_next/locale_fr-FR.json index 7dcda632d7..c383ee1b4c 100644 --- a/options/locale_next/locale_fr-FR.json +++ b/options/locale_next/locale_fr-FR.json @@ -127,7 +127,7 @@ "keys.ssh.link": "Clé SSH", "keys.gpg.link": "Clés GPG", "compare.branches.title": "Comparer les branches", - "repo.settings.push_mirror.branch_filter.description": "Branches a répliquer. Laisser vide pour répliquer toutes les branches. Voir la documentation %[2] pour la syntaxe. Exemples : main, release/*", + "repo.settings.push_mirror.branch_filter.description": "Branches a répliquer. Laisser vide pour répliquer toutes les branches. Voir la documentation %[2]s pour la syntaxe. Exemples : main, release/*", "mail.actions.run_info_sha": "Commit: %[1]s", "admin.moderation.deleted_content_ref": "Le signalement avec le type %[1]v et l'identifiant %[2]d n'existe plus", "error.must_enable_2fa": "Cette instance Forgejo exige que les utilisateurs activent l'authentification à deux facteurs avant qu'ils puissent accéder a leurs comptes. Activez-la sur  : %s", @@ -214,12 +214,49 @@ "repo.issues.filter_reviewers.hint": "Filtrer par l'utilisateur qui a examiné", "repo.issues.filter_mention.hint": "Filtrer par utilisateur mentionné", "repo.issues.filter_modified.hint": "Filtrer par la dernière date modifiée", - "repo.issues.filter_sort.hint": "Trier par: date de création/commentaires/mise à jour/date limite", + "repo.issues.filter_sort.hint": "Trier par : date de création/commentaires/mise à jour/date limite", "search.syntax": "Syntaxe de recherche", "admin.dashboard.transfer_lingering_logs": "Transférer les journaux des actions terminées de la base de données au stockage", "actions.status.diagnostics.waiting": { "one": "Attente d'un exécuteur avec l'étiquette suivante : %s", "many": "Attente d'un exécuteur avec les étiquettes suivantes : %s", "other": "" - } + }, + "moderation.report.mark_as_ignored": "Marquer comme ignoré", + "moderation.action.account.delete": "Supprimer le compte", + "moderation.action.account.suspend": "Suspendre le compte", + "moderation.action.repo.delete": "Supprimer le dépôt", + "moderation.action.issue.delete": "Supprimer le ticket", + "moderation.action.comment.delete": "Supprimer le commentaire", + "moderation.unknown_action": "Action inconnue", + "moderation.users.cannot_suspend_self": "Vous ne pouvez pas vous suspendre vous même.", + "moderation.users.cannot_suspend_admins": "Les utilisateurs avec les droits administrateur ne peuvent pas être suspendus.", + "moderation.users.cannot_suspend_org": "Les organisations ne peuvent pas être suspendues.", + "moderation.users.already_suspended": "Le compte est déjà suspendu.", + "moderation.users.suspend_success": "Le compte a été suspendu.", + "moderation.users.cannot_delete_admins": "Les utilisateurs avec les droits d'administration ne peuvent pas être supprimés.", + "moderation.issue.deletion_success": "Le ticket a été supprimé.", + "moderation.comment.deletion_success": "Le commentaire a été supprimé.", + "actions.workflow.incomplete_matrix_missing_job": "Impossible d'évaluer `strategy.matrix` de la tâche %[1]s : la tâche %[2]s n'est pas dans la liste `needs` de la tâche %[1]s (%[3]s).", + "actions.workflow.incomplete_matrix_missing_output": "Impossible d'évaluer `strategy.matrix` de la tâche %[1]s : la tâche %[2]s n'a pas de sortie %[3]s.", + "actions.workflow.incomplete_matrix_unknown_cause": "Impossible d'évaluer `strategy.matrix` de la tâche %[1]s : erreur inconnue.", + "actions.workflow.incomplete_runson_missing_job": "Impossible d'évaluer les `runs-on` de la tâche %[1]s : la tâche %[2]s n'est pas dans la liste des `needs` de la tâche %[1]s (%[3]s).", + "actions.workflow.incomplete_runson_missing_output": "Impossible d'évaluer les `runs-on` de la tâche %[1]s : la tâche %[2]s n'a pas de sortie %[3]s.", + "actions.workflow.incomplete_runson_missing_matrix_dimension": "Impossible d'évaluer les `runs-on` de la tâche %[1]s : la dimension matricielle %[2]s n'existe pas.", + "actions.workflow.incomplete_runson_unknown_cause": "Impossible d'évaluer `runs-on` de la tâche %[1]s : erreur inconnue.", + "admin.auths.oauth2_quota_group_map_removal": "Supprimer les utilisateurs des groupes de quotas synchronisés si l'utilisateur n'appartient pas au groupe correspondant.", + "issues.updated": "actualisé %s", + "repo.view.gitmodules_too_large": "Le fichier .gitmodules est trop volumineux et sera ignoré (lors des appels API par exemple)", + "search.fuzzy": "Approximative", + "search.fuzzy_tooltip": "Inclure les résultats avec une correspondance approximative avec le terme recherché", + "moderation.report.mark_as_handled": "Marquer comme traité", + "editor.search": "Rechercher", + "editor.find_previous": "Recherche précédente", + "editor.find_next": "Recherche suivante", + "editor.replace": "Remplacer", + "editor.toggle_case": "Activer/désactiver la sensibilité à la casse", + "editor.toggle_regex": "Activer/désactiver l'utilisation d'expressions régulières", + "install.ssh_authorized_keys_inspection_error": "Échec de l'inspection du fichier authorized_keys existant : %v", + "install.ssh_authorized_keys_unexpected_key": "Activer SSH pour Forgejo est en conflit avec le fichier situé à %s qui contient les clés SSH existantes. Suggestions : utilisez un utilisateur dédié du système pour Forgejo ou désactivez SSH.", + "admin.dashboard.actions_action_user": "Révoquer les Actions Forgejo autorisé pour les utilisateurs inactifs" } diff --git a/options/locale_next/locale_fur.ini b/options/locale_next/locale_fur.ini new file mode 100644 index 0000000000..a439c26cbd --- /dev/null +++ b/options/locale_next/locale_fur.ini @@ -0,0 +1 @@ +{"home.welcome.no_activity": "Nissune ativitât"} diff --git a/options/locale_next/locale_ga.json b/options/locale_next/locale_ga.json index 0734ca8447..c9b7fb21b6 100644 --- a/options/locale_next/locale_ga.json +++ b/options/locale_next/locale_ga.json @@ -1,17 +1,198 @@ { - "migrate.git.description": "Aistrigh stór amháin ó aon seirbhís Git.", - "migrate.gitea.description": "Aistrigh sonraí ó gitea.com nó ó chásanna Gitea eile.", - "migrate.gitlab.description": "Aistrigh sonraí ó gitlab.com nó ó chásanna GitLab eile.", - "migrate.gogs.description": "Aistrigh sonraí ó notabug.org nó ó chásanna eile de chuid Gogs.", - "migrate.onedev.description": "Aistrigh sonraí ó code.onedev.io nó ó chásanna OneDev eile.", - "migrate.gitbucket.description": "Aistrigh sonraí ó chásanna GitBucket.", - "migrate.codebase.description": "Aistrigh sonraí ó codebasehq.com.", + "migrate.git.description": "Ná himirce stórlann ach ó aon seirbhís Git.", + "migrate.gitea.description": "Imirce sonraí ó gitea.com nó ó chásanna Gitea eile.", + "migrate.gitlab.description": "Imirce sonraí ó gitlab.com nó ó chásanna GitLab eile.", + "migrate.gogs.description": "Imirce sonraí ó notabug.org nó ó chásanna Gogs eile.", + "migrate.onedev.description": "Imirce sonraí ó code.onedev.io nó ó chásanna OneDev eile.", + "migrate.gitbucket.description": "Imirce sonraí ó chásanna GitBucket.", + "migrate.codebase.description": "Imirce sonraí ó codebasehq.com.", "pulse.n_active_issues": { - "one": "%s Eagrán Gníomhach", - "other": "%s Ceisteanna Gníomhacha" + "one": "%s saincheist ghníomhach", + "other": "%s saincheisteanna ghníomhach" }, "pulse.n_active_prs": { - "one": "%s Iarratas Tarraingthe Gníomhach", - "other": "%s Iarratais Tharraing Ghníomhach" - } + "one": "%s iarratas tarraingthe gníomhach", + "other": "%s iarratais tarraingthe gníomhach" + }, + "home.welcome.no_activity": "Gan aon ghníomhaíocht", + "home.welcome.activity_hint": "Níl aon rud i do bheatha go fóill. Taispeánfar anseo do ghníomhartha agus do ghníomhaíocht ó stórtha a bhféachann tú orthu.", + "home.explore_repos": "Taiscéal stórtha", + "home.explore_users": "Taiscéal úsáideoirí", + "home.explore_orgs": "Taiscéal eagraíochtaí", + "stars.list.none": "Níor chuir aon duine réalta leis an stór seo.", + "watch.list.none": "Níl aon duine ag breathnú ar an stór seo.", + "followers.incoming.list.self.none": "Níl aon duine ag leanúint do phróifíl.", + "followers.incoming.list.none": "Níl aon duine ag leanúint an úsáideora seo.", + "followers.outgoing.list.self.none": "Níl tú ag leanúint aon duine.", + "followers.outgoing.list.none": "Níl %s ag leanúint aon duine.", + "relativetime.now": "anois", + "relativetime.future": "sa todhchaí", + "relativetime.1day": "inné", + "relativetime.2days": "dhá lá ó shin", + "relativetime.1week": "an tseachtain seo caite", + "relativetime.2weeks": "coicís ó shin", + "relativetime.1month": "an mhí seo caite", + "relativetime.2months": "dhá mhí ó shin", + "relativetime.1year": "anuraidh", + "relativetime.2years": "dhá bhliain ó shin", + "repo.issues.filter_poster.hint": "Scag de réir an údair", + "repo.issues.filter_assignee.hint": "Scag de réir úsáideora sannta", + "repo.issues.filter_reviewers.hint": "Scag de réir úsáideora a rinne athbhreithniú", + "repo.issues.filter_mention.hint": "Scag de réir úsáideora luaite", + "repo.issues.filter_modified.hint": "Scag de réir an dáta deiridh a ndearnadh an modhnú air", + "repo.issues.filter_sort.hint": "Sórtáil de réir: cruthaithe/tráchtanna/nuashonraithe/spriocdháta", + "issues.updated": "nuashonraithe %s", + "repo.pulls.poster_manage_approval": "Bainistigh ceadú", + "repo.pulls.poster_requires_approval": "Tá roinnt sreafaí oibre ag fanacht le hathbhreithniú.", + "repo.pulls.poster_requires_approval.tooltip": "Níl muinín ag údar an iarratais tarraingthe seo chun sreafaí oibre a rith a spreagtar ag iarratas tarraingthe a cruthaíodh ó stór forcaithe nó le AGit. Ní rithfidh na sreafaí oibre a spreagtar ag imeacht `pull_request` go dtí go gceadófar iad.", + "repo.pulls.poster_is_trusted": "Tá iontaointe i gcónaí as údar an iarratais tarraingthe seo chun sreafaí oibre a rith.", + "repo.pulls.poster_is_trusted.tooltip": "Tá muinín shoiléir as údar an iarratais tarraingthe seo chun sreafaí oibre a rith arna spreagadh ag imeachtaí `pull_request`.", + "repo.pulls.poster_trust_deny": "Diúltaigh", + "repo.pulls.poster_trust_deny.tooltip": "Cuirfear na sreafaí oibre atá ag fanacht le ceadú ar ceal.", + "repo.pulls.poster_trust_once": "Ceadaigh uair amháin", + "repo.pulls.poster_trust_once.tooltip": "Rithfidh na sreafaí oibre a spreagtar ag imeacht `pull_request` ar an tiomantas seo ach beidh gá iad a cheadú do gach tiomantas amach anseo a bhrúitear chuig an iarratas tarraingthe seo.", + "repo.pulls.poster_trust_always": "Ceadaigh i gcónaí", + "repo.pulls.poster_trust_always.tooltip": "Rithfidh na sreafaí oibre a spreagtar ag imeacht `pull_request` ar an tiomantas seo agus ní bheidh aon ghá le ritheanna ón iarratas tarraingthe seo ná ó iarratais tarraingthe amach anseo arna n-údarú ag an úsáideoir céanna a cheadú.", + "repo.pulls.poster_trust_revoke": "Cúlghairm", + "repo.pulls.poster_trust_revoke.tooltip": "Ní bheidh muinín a thuilleadh as údar an iarratais tarraingthe seo chun sreafaí oibre a rith arna spreagadh ag imeacht `pull_request`, beidh ort gach rith a cheadú de láimh.", + "repo.pulls.already_merged": "Theip ar chumasc: Tá an t-iarratas tarraingthe seo cumasctha cheana féin.", + "repo.pulls.maintainers_can_edit": "Is féidir le cothabhálaithe an iarratas tarraingthe seo a chur in eagar.", + "repo.pulls.maintainers_cannot_edit": "Ní féidir le cothabhálaithe an iarratas tarraingthe seo a chur in eagar.", + "repo.form.cannot_create": "Tá an teorainn stórtha sroichte ag na spásanna uile inar féidir leat stórtha a chruthú.", + "repo.view.gitmodules_too_large": "Tá an comhad .gitmodules rómhór agus déanfar neamhaird de (ar ghlaonna API mar shampla)", + "migrate.form.error.url_credentials": "Tá dintiúir sa URL, cuir iad sna réimsí ainm úsáideora agus pasfhocail faoi seach", + "migrate.github.description": "Imirce sonraí ó github.com nó freastalaí GitHub Enterprise.", + "migrate.forgejo.description": "Imirce sonraí ó codeberg.org nó ó chásanna Forgejo eile.", + "repo.issue_indexer.title": "Innéacsóir na Saincheisteanna", + "search.milestone_kind": "Cuardaigh clocha míle…", + "search.syntax": "Comhréir cuardaigh", + "search.fuzzy": "Doiléir", + "search.fuzzy_tooltip": "Is meaitseáil gharbh leis an téarma cuardaigh é torthaí a chur san áireamh", + "repo.settings.push_mirror.branch_filter.label": "Scagaire brainse (roghnach)", + "repo.settings.push_mirror.branch_filter.description": "Brainsí le scáthánú. Fág bán chun gach brainse a scáthánú. Féach ar doiciméadú %[2]s le haghaidh comhréir. Samplaí: main, release/*", + "incorrect_root_url": "Tá an sampla Forgejo seo cumraithe le freastal ar \"%s\". Tá tú ag féachaint ar Forgejo faoi láthair trí URL difriúil, rud a d'fhéadfadh a bheith ina chúis le briseadh i gcodanna den fheidhmchlár. Rialaíonn riarthóirí Forgejo an URL canónach tríd an socrú ROOT_URL san app.ini.", + "themes.names.forgejo-auto": "Forgejo (téama an chórais a leanúint)", + "themes.names.forgejo-light": "Solas Forgejo", + "themes.names.forgejo-dark": "Forgejo dorcha", + "error.not_found.title": "Leathanach gan aimsiú", + "warning.repository.out_of_sync": "Tá ionadaíocht bhunachar sonraí an stórais seo as sioncrónú. Má tá an rabhadh seo fós le feiceáil tar éis tiomnú a bhrú chuig an stóras seo, déan teagmháil leis an riarthóir.", + "alert.asset_load_failed": "Theip ar chomhaid sócmhainní a luchtú ó {path}. Cinntigh le do thoil gur féidir rochtain a fháil ar na comhaid sócmhainní.", + "alert.range_error": " ní mór gur uimhir idir %[1]s agus %[2]s í.", + "install.invalid_lfs_path": "Ní féidir fréamh LFS a chruthú ag an gcosán sonraithe: %[1]s", + "profile.actions.tooltip": "Tuilleadh gníomhartha", + "profile.edit.link": "Cuir próifíl in eagar", + "feed.atom.link": "Beatha adamhach", + "keys.ssh.link": "Eochracha SSH", + "keys.gpg.link": "Eochracha GPG", + "keys.verify.token.hint": "Níl an comhartha bailí ach ar feadh nóiméid amháin. Faigh ceann nua má tá sé imithe in éag.", + "admin.config.moderation_config": "Cumraíocht modhnóireachta", + "admin.moderation.moderation_reports": "Tuairiscí modhnóireachta", + "admin.moderation.reports": "Tuairiscí", + "admin.moderation.no_open_reports": "Níl aon tuarascálacha oscailte faoi láthair.", + "admin.moderation.deleted_content_ref": "Níl an t-ábhar tuairiscithe le cineál %[1]v agus id %[2]d ann a thuilleadh", + "moderation.report.mark_as_handled": "Marcáil mar láimhseáilte", + "moderation.report.mark_as_ignored": "Marcáil mar neamhaird", + "moderation.action.account.delete": "Scrios cuntas", + "moderation.action.account.suspend": "Cuir cuntas ar fionraí", + "moderation.action.repo.delete": "Scrios an stórlann", + "moderation.action.issue.delete": "Scrios an cheist", + "moderation.action.comment.delete": "Scrios trácht", + "moderation.unknown_action": "Gníomh anaithnid", + "moderation.users.cannot_suspend_self": "Ní féidir leat tú féin a chur ar fionraí.", + "moderation.users.cannot_suspend_admins": "Ní féidir úsáideoirí a bhfuil pribhléidí riarthóra acu a chur ar fionraí.", + "moderation.users.cannot_suspend_org": "Ní féidir eagraíochtaí a chur ar fionraí.", + "moderation.users.already_suspended": "Tá cuntas úsáideora ar fionraí cheana féin.", + "moderation.users.suspend_success": "Tá an cuntas úsáideora curtha ar fionraí.", + "moderation.users.cannot_delete_admins": "Ní féidir úsáideoirí a bhfuil pribhléidí riarthóra acu a scriosadh.", + "moderation.issue.deletion_success": "Tá an cheist scriosta.", + "moderation.comment.deletion_success": "Scriosadh an trácht.", + "moderation.report_abuse": "Tuairiscigh mí-úsáid", + "moderation.report_content": "Tuairiscigh ábhar", + "moderation.report_abuse_form.header": "Tuairiscigh mí-úsáid don riarthóir", + "moderation.report_abuse_form.details": "Ba chóir an fhoirm seo a úsáid chun tuairisc a thabhairt ar úsáideoirí a chruthaíonn próifílí turscair, stórtha, fadhbanna, tuairimí nó a iompraíonn iad féin go míchuí.", + "moderation.report_abuse_form.invalid": "Argóintí neamhbhailí", + "moderation.report_abuse_form.already_reported": "Tá an t-ábhar seo tuairiscithe agat cheana féin", + "moderation.abuse_category": "Catagóir", + "moderation.abuse_category.placeholder": "Roghnaigh catagóir", + "moderation.abuse_category.spam": "Turscar", + "moderation.abuse_category.malware": "Bogearraí mailíseacha", + "moderation.abuse_category.illegal_content": "Ábhar mídhleathach", + "moderation.abuse_category.other_violations": "Sáruithe eile ar rialacha an ardáin", + "moderation.report_remarks": "Suntas", + "moderation.report_remarks.placeholder": "Tabhair roinnt sonraí maidir leis an mí-úsáid atá á tuairisciú agat, le do thoil.", + "moderation.submit_report": "Cuir isteach tuarascáil", + "moderation.reporting_failed": "Ní féidir an tuarascáil nua mí-úsáide a chur isteach: %v", + "moderation.reported_thank_you": "Go raibh maith agat as do thuairisc. Tá an riarachán curtha ar an eolas faoi.", + "mail.actions.successful_run_after_failure_subject": "Aisghafa sreabhadh oibre %[1]s i stórlann %[2]s", + "mail.actions.not_successful_run_subject": "Theip ar shreabhadh oibre %[1]s i stórlann %[2]s", + "mail.actions.successful_run_after_failure": "Aisghafa sreabhadh oibre %[1]s i stórlann %[2]s", + "mail.actions.not_successful_run": "Theip ar shreabhadh oibre %[1]s i stórlann %[2]s", + "mail.actions.run_info_cur_status": "Stádas an Rith seo: %[1]s (nuashonraithe díreach ó %[2]s)", + "mail.actions.run_info_previous_status": "Stádas an Rith Roimhe Seo: %[1]s", + "mail.actions.run_info_sha": "Tiomantas: %[1]s", + "mail.actions.run_info_trigger": "Spreagtha mar gheall ar: %[1]s ag: %[2]s", + "mail.issue.action.close_by_commit": "%[1]s dhún %[2]s i ngealltanas %[3]s.", + "repo.diff.commit.next-short": "Ar Aghaidh", + "repo.diff.commit.previous-short": "Roimh", + "discussion.locked": "Tá an plé seo faoi ghlas. Tá cead trácht a dhéanamh teoranta do rannpháirtithe.", + "discussion.sidebar.reference": "Tagairt", + "editor.textarea.tab_hint": "Tá an líne fillte cheana féin. Brúigh Tab arís nó Escape chun an eagarthóir a fhágáil.", + "editor.textarea.shift_tab_hint": "Gan aon eangú ar an líne seo. Brúigh Shift + Tab arís nó Escape chun an t-eagarthóir a fhágáil.", + "admin.auths.allow_username_change": "Ceadaigh athrú ainm úsáideora", + "admin.auths.allow_username_change.description": "Ceadaigh d’úsáideoirí a n-ainm úsáideora a athrú sna socruithe próifíle", + "admin.dashboard.cleanup_offline_runners": "Glanadh reathaithe as líne", + "admin.dashboard.remove_resolved_reports": "Bain tuairiscí réitithe", + "admin.dashboard.actions_action_user": "Cúlghair muinín Forgejo Actions d'úsáideoirí neamhghníomhacha", + "admin.dashboard.transfer_lingering_logs": "Aistrigh logaí gníomhartha na bpost gníomhartha críochnaithe ón mbunachar sonraí go dtí an stóras", + "admin.config.security": "Cumraíocht slándála", + "admin.config.global_2fa_requirement.title": "Riachtanas domhanda dhá fhachtóir", + "admin.config.global_2fa_requirement.none": "Níl", + "admin.config.global_2fa_requirement.all": "Gach úsáideoirí", + "admin.config.global_2fa_requirement.admin": "Riarthóirí", + "settings.visibility.description": "Bíonn tionchar ag infheictheacht próifíle ar chumas daoine eile rochtain a fháil ar do stórtha neamhphríobháideacha. Foghlaim tuilleadh.", + "settings.twofa_unroll_unavailable": "Tá fíordheimhniú dhá fhachtóir ag teastáil do do chuntas agus ní féidir é a dhíchumasú.", + "settings.twofa_reenroll": "Athchláraigh fíordheimhniú dhá fhachtóir", + "settings.twofa_reenroll.description": "Athchláraigh d’fhíordheimhniú dhá fhachtóir", + "settings.must_enable_2fa": "Éilíonn an cás Forgejo seo ar úsáideoirí fíordheimhniú dhá fhachtóir a chumasú sula bhféadann siad rochtain a fháil ar a gcuntais.", + "error.must_enable_2fa": "Éilíonn an sampla Forgejo seo ar úsáideoirí fíordheimhniú dhá fhachtóir a chumasú sula bhféadann siad rochtain a fháil ar a gcuntais. Cumasaigh é ag: %s", + "avatar.constraints_hint": "Ní fhéadfaidh avatar saincheaptha a bheith níos mó ná %[1]s i méid ná níos mó ná %[2]dx%[3]d picteilín", + "user.ghost.tooltip": "Tá an t-úsáideoir seo scriosta, nó ní féidir é a mheaitseáil.", + "og.repo.summary_card.alt_description": "Cárta achoimre stórtha %[1]s, curtha síos mar: %[2]s", + "repo.commit.load_tags_failed": "Theip ar chlibeanna a luchtú mar gheall ar earráid inmheánach", + "compare.branches.title": "Déan comparáid idir brainsí", + "migrate.pagure.description": "Imirce sonraí ó pagure.io nó ó chásanna Pagure eile.", + "migrate.pagure.incorrect_url": "Soláthraíodh URL stórais foinse mícheart", + "migrate.pagure.project_url": "URL tionscadail leathanaigh", + "migrate.pagure.project_example": "URL thionscadal Pagure, m.sh. https://pagure.io/pagure", + "migrate.pagure.token_label": "Comhartha API Pagure", + "migrate.pagure.private_issues.summary": "Saincheisteanna Príobháideacha (Roghnach)", + "migrate.pagure.private_issues.description": "Tá an ghné seo deartha chun dara stór a chruthú ina bhfuil saincheisteanna príobháideacha ó do thionscadal Pagure amháin chun críocha cartlannaithe. Ar dtús, déan aistriú gnáth (gan chomhartha) chun an t-ábhar poiblí go léir a allmhairiú. Ansin, má tá saincheisteanna príobháideacha agat le caomhnú, cruthaigh stór ar leith ag baint úsáide as an rogha comhartha seo chun na saincheisteanna príobháideacha sin a chartlannú.", + "migrate.pagure.private_issues.warning": "Bí cinnte infheictheacht an stórais thuas a shocrú go Príobháideach má tá tú ag úsáid an eochair API chun saincheisteanna príobháideacha a allmhairiú. Cuireann sé seo cosc ar ábhar príobháideach a nochtadh de thaisme i stór poiblí.", + "migrate.pagure.token.placeholder": "Chun cartlann saincheisteanna príobháideacha a chruthú amháin", + "actions.runs.run_attempt_label": "Iarracht rith #%[1]s (%[2]s)", + "actions.runs.viewing_out_of_date_run": "Tá tú ag féachaint ar rith atá as dáta den phost seo a cuireadh i gcrích %[1]s.", + "actions.runs.view_most_recent_run": "Féach ar an rith is déanaí", + "actions.workflow.job_parsing_error": "Ní féidir poist a pharsáil sa sreabhadh oibre: %v", + "actions.workflow.event_detection_error": "Ní féidir imeachtaí tacaithe a pharsáil sa sreabhadh oibre: %v", + "actions.workflow.persistent_incomplete_matrix": "Ní féidir `strategy.matrix` den phost %[1]s a mheas mar gheall ar léiriú `needs` a bhí neamhbhailí. D’fhéadfadh sé tagairt a dhéanamh do phost nach bhfuil ina liosta 'needs' (%[2]s), nó d’aschur nach bhfuil ann ar cheann de na poist sin.", + "actions.workflow.incomplete_matrix_missing_job": "Ní féidir `strategy.matrix` de phost %[1]s a mheas: níl post %[2]s ar an liosta `riachtanais` de phost %[1]s (%[3]s).", + "actions.workflow.incomplete_matrix_unknown_cause": "Ní féidir `strategy.matrix` den phost %[1]s a mheas: earráid anaithnid.", + "actions.workflow.incomplete_runson_missing_job": "Ní féidir `run-on` de phost %[1]s a mheas: níl post %[2]s ar an liosta `needs` de phost %[1]s (%[3]s).", + "actions.workflow.incomplete_runson_missing_matrix_dimension": "Ní féidir `runs-on` an phoist %[1]s a mheas: níl toise maitrís %[2]s ann.", + "actions.workflow.incomplete_runson_unknown_cause": "Ní féidir `runs-on` den phost %[1]s a mheas: earráid anaithnid.", + "actions.workflow.pre_execution_error": "Níor cuireadh an sreabhadh oibre i gcrích mar gheall ar earráid a chuir bac ar an iarracht forghníomhaithe.", + "teams.add_all_repos.modal.header": "Cuir na stórais uile leis", + "teams.remove_all_repos.modal.header": "Bain na stórais uile", + "admin.auths.oauth2_quota_group_claim_name": "Ainm an éilimh lena soláthraítear ainmneacha grúpa don fhoinse seo le húsáid le haghaidh bainistíocht cuóta. (Roghnach)", + "admin.auths.oauth2_quota_group_map": "Mapáil grúpaí éilithe chuig grúpaí cuóta. (Roghnach - tá ainm an éilimh thuas ag teastáil)", + "admin.auths.oauth2_quota_group_map_removal": "Bain úsáideoirí as grúpaí cuóta sioncrónaithe mura mbaineann an t-úsáideoir leis an ngrúpa comhfhreagrach.", + "editor.search": "Cuardaigh", + "editor.find_previous": "Aimsiú roimhe seo", + "editor.find_next": "An chéad aimsiú eile", + "editor.replace": "Athsholáthair", + "editor.replace_all": "Cuir gach rud in ionad", + "editor.toggle_case": "Íogaireacht cás a scoránaigh", + "editor.toggle_regex": "Scoránaigh ag baint úsáide as nathanna rialta", + "editor.toggle_whole_word": "Athraigh focail iomlána meaitseála", + "meta.last_line": "Go raibh maith agat as Forgejo a aistriú! Ní fheiceann na húsáideoirí an líne seo ach tá cuspóirí eile aici i mbainistíocht an aistriúcháin. Is féidir leat fíric spraíúil a chur san aistriúchán in ionad í a aistriú." } diff --git a/options/locale_next/locale_gl.json b/options/locale_next/locale_gl.json index e83a2ecbd9..27e6c91a19 100644 --- a/options/locale_next/locale_gl.json +++ b/options/locale_next/locale_gl.json @@ -35,5 +35,6 @@ "relativetime.years": { "one": "hai %d ano", "other": "hai %d anos" - } + }, + "meta.last_line": " " } diff --git a/options/locale_next/locale_he.json b/options/locale_next/locale_he.json index 15882ce862..7c8c46ef43 100644 --- a/options/locale_next/locale_he.json +++ b/options/locale_next/locale_he.json @@ -18,5 +18,63 @@ "migrate.gitbucket.description": "יבוא מידע משרת GitBucket.", "migrate.codebase.description": "ייבוא מידע מ־codebasehq.com.", "migrate.forgejo.description": "ייבוא מידע מקודברג או שרת פורג'ו אחר.", - "home.welcome.no_activity": "אין פעילות" + "home.welcome.no_activity": "אין פעילות", + "home.explore_users": "גלה משתמשים", + "home.explore_orgs": "גלה ארגונים", + "followers.incoming.list.self.none": "אף אחד לא עוקב אחרי הפרופיל שלך.", + "followers.incoming.list.none": "אף אחד לא עוקב אחרי המשתמש הזה.", + "followers.outgoing.list.self.none": "אתה לא עוקב אחרי אף אחד.", + "followers.outgoing.list.none": "%s לא עוקב אחרי אף אחד.", + "relativetime.now": "עכשיו", + "relativetime.future": "בעתיד", + "relativetime.1day": "אתמול", + "relativetime.2days": "לפני יומיים", + "relativetime.1week": "בשבוע שעבר", + "relativetime.2weeks": "לפני שבועיים", + "relativetime.1month": "בחודש שעבר", + "relativetime.2months": "לפני חודשיים", + "relativetime.1year": "בשנה שעברה", + "relativetime.2years": "לפני שנתיים", + "repo.issues.filter_poster.hint": "סנן לפי המחבר", + "repo.issues.filter_assignee.hint": "סנן לפי המשתמש האחראי", + "repo.issues.filter_reviewers.hint": "סנן לפי המשתמש שערך ביקורת", + "repo.issues.filter_mention.hint": "סנן לפי המשתמש שהוזכר", + "repo.issues.filter_modified.hint": "סנן לפי תאריך שינוי אחרון", + "admin.moderation.reports": "דוחות", + "admin.moderation.no_open_reports": "כרגע אין דיווחים פתוחים.", + "moderation.report.mark_as_handled": "סמן כטופל", + "moderation.report.mark_as_ignored": "סמן כהוזמנח", + "moderation.action.account.delete": "מחק חשבון", + "moderation.action.account.suspend": "השעה חשבון", + "moderation.action.repo.delete": "מחק ריפו", + "moderation.action.issue.delete": "מחק סוגייה", + "moderation.action.comment.delete": "מחק תגובה", + "moderation.unknown_action": "פעולה לא ידועה", + "moderation.users.cannot_suspend_self": "אתה לא יכול להשעות את עצמך.", + "moderation.users.cannot_suspend_org": "ארגונים לא יכולים להיות מושעים.", + "moderation.users.already_suspended": "חשבון משתמש כבר מושעה.", + "moderation.users.suspend_success": "חשבון המשתמש הושעה.", + "moderation.issue.deletion_success": "הסוגייה נמחקה.", + "moderation.comment.deletion_success": "התגובה נמחקה.", + "moderation.report_abuse": "דיווח על התעללות", + "moderation.report_content": "תוכן הדיווח", + "moderation.report_abuse_form.header": "דיווח על התעללות למנהל", + "moderation.report_abuse_form.already_reported": "כבר דיווחת על התוכן הזה", + "moderation.abuse_category": "קטגוריה", + "moderation.abuse_category.placeholder": "בחר קטגוריה", + "moderation.abuse_category.spam": "ספאם", + "moderation.abuse_category.malware": "תוכנה זדונית", + "moderation.abuse_category.illegal_content": "תוכן בלתי חוקי", + "moderation.abuse_category.other_violations": "הפרות אחרות של כללי פלטפורמה", + "moderation.report_remarks": "הערות", + "moderation.report_remarks.placeholder": "אנא ספק פרטים בנוגע לניצול לרעה שאתה מדווח עליו.", + "moderation.submit_report": "הגש דיווח", + "moderation.reporting_failed": "דיווח התעללות נכשל: %v", + "moderation.reported_thank_you": "תודה על הדיווח שלך. ההנהלה עודכנה על כך.", + "mail.actions.run_info_sha": "קומיט: %[1]s", + "repo.diff.commit.next-short": "הבא", + "repo.diff.commit.previous-short": "הקודם", + "discussion.locked": "הדיון ננעל. היכולת להגיב מוגבלת לתורמים בלבד.", + "discussion.sidebar.reference": "מקור", + "meta.last_line": " " } diff --git a/options/locale_next/locale_hu-HU.json b/options/locale_next/locale_hu-HU.json index 8698473f66..00e42b939c 100644 --- a/options/locale_next/locale_hu-HU.json +++ b/options/locale_next/locale_hu-HU.json @@ -10,5 +10,6 @@ "pulse.n_active_prs": { "one": "%s Aktív Egyesítési Kérés", "other": "%s Aktív Egyesítési Kérések" - } + }, + "meta.last_line": " " } diff --git a/options/locale_next/locale_is-IS.json b/options/locale_next/locale_is-IS.json index add24fce42..704c43f06f 100644 --- a/options/locale_next/locale_is-IS.json +++ b/options/locale_next/locale_is-IS.json @@ -2,5 +2,6 @@ "repo.pulls.title_desc": { "other": "vill sameina %[1]d framlög frá %[2]s í %[3]s" }, - "migrate.git.description": "Flytja hugbúnaðarsafn aðeins frá Git þjónustu." + "migrate.git.description": "Flytja hugbúnaðarsafn aðeins frá Git þjónustu.", + "meta.last_line": " " } diff --git a/options/locale_next/locale_isv.json b/options/locale_next/locale_isv.json index b6081762cd..c405ee29d7 100644 --- a/options/locale_next/locale_isv.json +++ b/options/locale_next/locale_isv.json @@ -1,3 +1,4 @@ { - "home.welcome.no_activity": "Nema aktivnosti" + "home.welcome.no_activity": "Nema aktivnosti", + "meta.last_line": " " } diff --git a/options/locale_next/locale_it-IT.json b/options/locale_next/locale_it-IT.json index c36cd7b4c1..94bcc44245 100644 --- a/options/locale_next/locale_it-IT.json +++ b/options/locale_next/locale_it-IT.json @@ -196,5 +196,11 @@ "actions.workflow.event_detection_error": "Impossibile analizzare gli eventi previsti nel flusso di lavoro: %v", "actions.workflow.pre_execution_error": "Il flusso di lavoro non è stato completato a causa di un errore che ha bloccato il tentativo di esecuzione.", "teams.add_all_repos.modal.header": "Aggiungi tutti i repositori", - "teams.remove_all_repos.modal.header": "Rimuovi tutti i repositori" + "teams.remove_all_repos.modal.header": "Rimuovi tutti i repositori", + "moderation.action.account.delete": "Elimina profilo", + "moderation.action.account.suspend": "Sospendi profilo", + "moderation.action.comment.delete": "Elimina commento", + "repo.issues.filter_reviewers.hint": "Filtra per utente che ha recensito", + "repo.issues.filter_mention.hint": "Filtra per utente menzionato", + "repo.issues.filter_modified.hint": "Filtra per ultima data modificata" } diff --git a/options/locale_next/locale_ja-JP.json b/options/locale_next/locale_ja-JP.json index b7c106fdfc..e371b1970e 100644 --- a/options/locale_next/locale_ja-JP.json +++ b/options/locale_next/locale_ja-JP.json @@ -31,5 +31,14 @@ "pulse.n_active_prs": { "one": "%s件のアクティブなプルリクエスト", "other": "%s件のアクティブなプルリクエスト" - } + }, + "meta.last_line": " ", + "home.welcome.no_activity": "活動はありません", + "home.welcome.activity_hint": "あなたのフィードにはまだ何もありません。行動と見ているリポジトリの活動がここに見えます。", + "home.explore_repos": "リポジトリを探索する", + "home.explore_users": "ユーザーを探索する", + "home.explore_orgs": "組織を探索する", + "stars.list.none": "このリポを誰もスターしなかった。", + "watch.list.none": "このリポを誰も見ていない。", + "watch.n_watchers": "%s人のウォッチャー" } diff --git a/options/locale_next/locale_jbo.json b/options/locale_next/locale_jbo.json index 0967ef424b..a038db2f72 100644 --- a/options/locale_next/locale_jbo.json +++ b/options/locale_next/locale_jbo.json @@ -1 +1 @@ -{} +{"meta.last_line": " "} diff --git a/options/locale_next/locale_ka.json b/options/locale_next/locale_ka.json index 0967ef424b..a038db2f72 100644 --- a/options/locale_next/locale_ka.json +++ b/options/locale_next/locale_ka.json @@ -1 +1 @@ -{} +{"meta.last_line": " "} diff --git a/options/locale_next/locale_kab.json b/options/locale_next/locale_kab.json index e64c287a38..bae14b3588 100644 --- a/options/locale_next/locale_kab.json +++ b/options/locale_next/locale_kab.json @@ -29,5 +29,15 @@ "error.not_found.title": "Asebtar ulac-it", "moderation.abuse_category.placeholder": "Fren taggayt", "migrate.pagure.project_url": "Tansa URL n usenfar Pagure", - "themes.names.forgejo-auto": "Forgejo (akken i yella usentel n unagraw)" + "themes.names.forgejo-auto": "Forgejo (akken i yella usentel n unagraw)", + "meta.last_line": " ", + "moderation.action.account.delete": "Kkes amiḍan", + "moderation.action.comment.delete": "Kkes awennit", + "moderation.unknown_action": "Tigawt tarussint", + "moderation.submit_report": "Ceyyeɛ aneqqis", + "teams.add_all_repos.modal.header": "Rnu ikufiyen akk-nsen", + "teams.remove_all_repos.modal.header": "Kkes akk ikufan", + "editor.search": "Nadi", + "editor.replace": "Semselsi", + "editor.replace_all": "Semselsi-iten akk" } diff --git a/options/locale_next/locale_kmr.json b/options/locale_next/locale_kmr.json index 0967ef424b..a038db2f72 100644 --- a/options/locale_next/locale_kmr.json +++ b/options/locale_next/locale_kmr.json @@ -1 +1 @@ -{} +{"meta.last_line": " "} diff --git a/options/locale_next/locale_ko-KR.json b/options/locale_next/locale_ko-KR.json index d187cf10d3..dda660d5f7 100644 --- a/options/locale_next/locale_ko-KR.json +++ b/options/locale_next/locale_ko-KR.json @@ -10,5 +10,6 @@ "pulse.n_active_issues": { "one": "%s 개의 활성화된 이슈", "other": "%s 개의 활성화된 이슈" - } + }, + "meta.last_line": " " } diff --git a/options/locale_next/locale_la.json b/options/locale_next/locale_la.json index 18cd17762b..adc4ddad18 100644 --- a/options/locale_next/locale_la.json +++ b/options/locale_next/locale_la.json @@ -6,5 +6,6 @@ "relativetime.mins": { "one": "ante %d minuta", "other": "%d minuta abhinc" - } + }, + "meta.last_line": " " } diff --git a/options/locale_next/locale_lt.json b/options/locale_next/locale_lt.json index 9f97587b09..85ab8afc3f 100644 --- a/options/locale_next/locale_lt.json +++ b/options/locale_next/locale_lt.json @@ -1,3 +1,4 @@ { - "search.milestone_kind": "Ieškoti gairių..." + "search.milestone_kind": "Ieškoti gairių...", + "meta.last_line": " " } diff --git a/options/locale_next/locale_lv-LV.json b/options/locale_next/locale_lv-LV.json index 1b98131fae..2471233c2e 100644 --- a/options/locale_next/locale_lv-LV.json +++ b/options/locale_next/locale_lv-LV.json @@ -251,5 +251,19 @@ "actions.workflow.incomplete_runson_missing_job": "Nevar novērtēt darba %[1]s `runs-on`: darbs %[2]s nav %[1]s `needs` sarakstā (%[3]s).", "actions.workflow.incomplete_runson_missing_output": "Nevar novērtēt darba %[1]s `runs-on`: darbam %[2]s nav izvades %[3]s.", "actions.workflow.incomplete_runson_missing_matrix_dimension": "Nevar novērtēt darba %[1]s `runs-on`: matricas dimensija %[2]s nepastāv.", - "actions.workflow.incomplete_runson_unknown_cause": "Nevar novērtēt darba %[1]s `runs-on`: nezināma kļūda." + "actions.workflow.incomplete_runson_unknown_cause": "Nevar novērtēt darba %[1]s `runs-on`: nezināma kļūda.", + "issues.updated": "atjaunināts %s", + "search.fuzzy": "Aptuveni", + "search.fuzzy_tooltip": "Iekļaut iznākumus, kas aptuveni atbilst meklētajam", + "repo.view.gitmodules_too_large": "Datne .gitmodules ir pārāk liela un netiks ņemta vērā (piemēram, API izsaukumos)", + "editor.search": "Meklēt", + "editor.find_previous": "Iepriekšējais atradums", + "editor.find_next": "Nākamais atradums", + "editor.replace": "Aizstāt", + "editor.replace_all": "Aizstāt visu", + "editor.toggle_case": "Pārslēgt reģistrjutīgumu", + "editor.toggle_regex": "Pārslēgt regulāro izteiksmju izmantošanu", + "editor.toggle_whole_word": "Pārslēgt atbilstību veseliem vārdiem", + "install.ssh_authorized_keys_inspection_error": "Neizdevās pārbaudīt esošu authorized_keys datni: %v", + "install.ssh_authorized_keys_unexpected_key": "SSH iespējošana Forgejo nesader ar datni, kas atrodas %s, kas satur esošas SSH atslēgas. Ieteikumi: Forgejo vajadzībām izmantot atsevišķu sistēmas lietotāju vai atspējot SSH." } diff --git a/options/locale_next/locale_mic.ini b/options/locale_next/locale_mic.ini new file mode 100644 index 0000000000..a038db2f72 --- /dev/null +++ b/options/locale_next/locale_mic.ini @@ -0,0 +1 @@ +{"meta.last_line": " "} diff --git a/options/locale_next/locale_ml-IN.json b/options/locale_next/locale_ml-IN.json index 0967ef424b..a038db2f72 100644 --- a/options/locale_next/locale_ml-IN.json +++ b/options/locale_next/locale_ml-IN.json @@ -1 +1 @@ -{} +{"meta.last_line": " "} diff --git a/options/locale_next/locale_nb_NO.json b/options/locale_next/locale_nb_NO.json index 79129dd86b..d12fb4215b 100644 --- a/options/locale_next/locale_nb_NO.json +++ b/options/locale_next/locale_nb_NO.json @@ -66,7 +66,7 @@ "incorrect_root_url": "Denne Forgejo instansen er konfigurert til å bruke \"%s\". Du bruker Forgejo via en annen URL, noe som kan forårsake at deler av applikasjonen ikke fungerer. Den kanoniske URL-en styres av Forgejo-administratorer via innstillingen ROOT_URL i app.ini-filen.", "mail.actions.run_info_trigger": "Startet på grunn av: %[1]s by: %[2]s", "admin.dashboard.cleanup_offline_runners": "Rydd opp offline runners", - "settings.visibility.description": "Profilens synlighet påvirker andres mulighet til å få tilgang til dine ikke-private repositorier. Les mer", + "settings.visibility.description": "Profilens synlighet påvirker andres mulighet til å få tilgang til dine ikke-private repositorier. Les mer.", "profile.actions.tooltip": "Flere handlinger", "profile.edit.link": "Rediger profil", "relativetime.days": { @@ -129,5 +129,77 @@ "repo.pulls.poster_trust_deny": "Avslå", "repo.pulls.poster_trust_deny.tooltip": "Workflow-ene som venter på godkjenning vil være avslått.", "repo.pulls.poster_trust_once": "Godta én gang", - "repo.pulls.poster_trust_once.tooltip": "Workflow-ene kjørt av `pull_request`event vil kjøre på denne commit-en, men vil trenge godkjenning for fremtidige commit-er som blir tilsatt til denne pull requesten." + "repo.pulls.poster_trust_once.tooltip": "Workflow-ene kjørt av `pull_request`event vil kjøre på denne commit-en, men vil trenge godkjenning for fremtidige commit-er som blir tilsatt til denne pull requesten.", + "issues.updated": "oppdaterte %s", + "repo.pulls.poster_trust_always": "Tilatt alltid", + "repo.pulls.poster_trust_always.tooltip": "Workflow som blei startet av en `pull_request` event blir kjørt på denne commiten og det vil ikke være nødvendig å manuelt tilatte runs fra denne pull requesten eller fremtidige pull requester av den samme brukeren.", + "repo.pulls.poster_trust_revoke": "Fradra", + "repo.pulls.poster_trust_revoke.tooltip": "Forfatteren av denne pull requesten er ikke lenger klarert til å kjøre workflow som blir kjørt av en `pull_request` event, hver run må bli manuelt bekreftet.", + "repo.pulls.already_merged": "Fusjonering feilet: Denne pull requesten har allerede blitt fusjonert.", + "repo.pulls.maintainers_can_edit": "Eierne kan endre på denne pull requesten.", + "repo.pulls.maintainers_cannot_edit": "Eiere kan ikke endre på denne pull requesten.", + "repo.view.gitmodules_too_large": ".gitmodules-filen er for stor og vil bli ignorert (f.eks. av API tilkallinger)", + "migrate.form.error.url_credentials": "URL-en inneholder brukerdata, putt de separat i brukernavn- og passordfeltet", + "migrate.github.description": "Migrer data fra github.com eller GitHub Enterprise server.", + "migrate.git.description": "Migrer en repository fra hvilken som helst Git-service.", + "migrate.gitea.description": "Migrer data fra gitea.com eller andre Gitea instanser.", + "migrate.gitlab.description": "Migrer data fra gitlab.com eller andre GitLab instanser.", + "migrate.gogs.description": "Migrer data fra notabug.org eller andre Gogs instanser.", + "migrate.onedev.description": "Migrer data fra code.onedev.io eller andre OneDev instanser.", + "migrate.gitbucket.description": "Migrer data fra GitBucket instanser.", + "migrate.codebase.description": "Migrer data fra codebasehq.com.", + "migrate.forgejo.description": "Migrer data fra codeberg.org eller andre Forgejo instanser.", + "search.syntax": "Søkesyntaks", + "search.fuzzy": "Fuzzy", + "search.fuzzy_tooltip": "Inkluder resultater som er omtrent like søkeordet", + "repo.settings.push_mirror.branch_filter.label": "Branch filter (valgfritt)", + "repo.settings.push_mirror.branch_filter.description": "Brancher kan bli speilet. La være tom for å speile alle brancher. Se %[2]s dokumentasjon for syntaks. Eks.: main, release/*", + "warning.repository.out_of_sync": "Databasen representasjon av denne repositorien er usynkronisert. Hvis denne varslen vises fremdeles etter at du har pushet en ny commit, kontakt administratoren.", + "install.ssh_authorized_keys_inspection_error": "Feilet mens sjekket eksisterende authorized_keys fil: %v", + "install.ssh_authorized_keys_unexpected_key": "Ved å skru på SSH på Forgejo konflikterer det med plassering til filen i %s som inneholder SSH-nøklene. Tips: bruk en dedikert systembruker for Forgejo, eller skru av SSH.", + "keys.verify.token.hint": "Tokenen er gyldig kun i ett minutt. Få ny hvis gjeldende utløpte.", + "admin.moderation.moderation_reports": "Moderasjonsrapporter", + "admin.moderation.reports": "Rapporter", + "admin.moderation.no_open_reports": "Det er ingen åpne rapporter per nå.", + "admin.moderation.deleted_content_ref": "Rapportert innhold med type %[1]v og id %[2]d eksisterer ikke lenger", + "moderation.report.mark_as_handled": "Merk som løst", + "moderation.report.mark_as_ignored": "Merk som ignorert", + "moderation.action.account.delete": "Slett konto", + "moderation.action.account.suspend": "Suspender konto", + "moderation.action.repo.delete": "Slett repository", + "moderation.action.issue.delete": "Slett issue", + "moderation.action.comment.delete": "Slett kommentar", + "moderation.unknown_action": "Ukjent handling", + "moderation.users.cannot_suspend_self": "Du kan ikke suspendere deg selv.", + "moderation.users.cannot_suspend_admins": "Brukere med administrator privilegier kan ikke blir suspendert.", + "moderation.users.cannot_suspend_org": "Organisasjoner kan ikke blir suspendert.", + "moderation.users.already_suspended": "Bruker konto er allerede suspendert.", + "moderation.users.suspend_success": "Denne bruker kontoen har blitt suspendert.", + "moderation.users.cannot_delete_admins": "Brukere med administrator privilegier kan ikke blir slettet.", + "moderation.issue.deletion_success": "Issuen blei slettet.", + "moderation.comment.deletion_success": "Kommentaren har blitt slettet.", + "mail.actions.run_info_sha": "Commit: %[1]s", + "mail.issue.action.close_by_commit": "%[1]s lukket %[2]s i commit %[3]s.", + "discussion.sidebar.reference": "Referanse", + "admin.auths.allow_username_change": "Tilatt endring av brukernavn", + "admin.auths.allow_username_change.description": "Tillatt brukere å endre sitt brukernavn i profilinnstilinger", + "admin.dashboard.remove_resolved_reports": "Slett ferdigbehandlet rapporter", + "admin.dashboard.actions_action_user": "Fradra Forgejo Actions klarering for inaktive brukere", + "admin.dashboard.transfer_lingering_logs": "Flytt actions logger av ferdige actionsjobber fra databasen til storage", + "admin.config.security": "Sikkerhetskonfigurering", + "admin.config.global_2fa_requirement.title": "Global påbud av to-faktor autentifisering", + "admin.config.global_2fa_requirement.none": "Nei", + "admin.config.global_2fa_requirement.all": "Alle brukere", + "admin.config.global_2fa_requirement.admin": "Administratorer", + "settings.twofa_unroll_unavailable": "To-faktor autentifisering er påbud for din konto og kan ikke bli skrudd av.", + "settings.twofa_reenroll": "Sette opp to-faktor autentifisering på nytt", + "settings.twofa_reenroll.description": "Sette opp din to-faktor autentifisering på nytt", + "settings.must_enable_2fa": "Denne Forgejo instansen påbyr bruker om å skru på to-faktor autentifisering før de kan få tilgang til sine kontoer.", + "error.must_enable_2fa": "Denne Forgejo instansen påbyr bruker om å skru på to-faktor autentifisering før de kan få tilgang til sine kontoer. Skru på i: %s", + "user.ghost.tooltip": "Denne brukeren har blitt slettet, eller kan ikke matches.", + "repo.commit.load_tags_failed": "Lasting av tagger feilet pga. intern feil", + "compare.branches.title": "Sammenlign branches", + "migrate.pagure.description": "Migrer data fra pagure.io eller andre Pagure instanser.", + "migrate.pagure.incorrect_url": "Ugyldig kilde-repository URL blei oppgitt", + "migrate.pagure.project_url": "Pagure prosjekt URL" } diff --git a/options/locale_next/locale_nds.json b/options/locale_next/locale_nds.json index 19af25d076..92b16d94d8 100644 --- a/options/locale_next/locale_nds.json +++ b/options/locale_next/locale_nds.json @@ -236,5 +236,20 @@ "actions.workflow.incomplete_runson_missing_output": "Kann de `runs-on` vun Upgaav %[1]s nich utweerten: Upgaav %[2]s hett keene Utgaav %[3]s.", "actions.workflow.incomplete_matrix_unknown_cause": "Kann de `strategy.matrix` vun Upgaav %[1]s nich utweerten: Unbekannter Fehler.", "actions.workflow.incomplete_runson_unknown_cause": "Kann de `runs-on` vun Upgaav %[1]s nich utweerten: Unbekannter Fehler.", - "actions.workflow.incomplete_runson_missing_matrix_dimension": "Kann de `runs-on` vun Upgaav %[1]s nich utweerten: Matrix-Richt %[2]s gifft dat nich." + "actions.workflow.incomplete_runson_missing_matrix_dimension": "Kann de `runs-on` vun Upgaav %[1]s nich utweerten: Matrix-Richt %[2]s gifft dat nich.", + "issues.updated": "%s verneeit", + "search.fuzzy": "Umslags", + "search.fuzzy_tooltip": "Ok Resultaten wiesen, wat so wat umslags to de Söökwoorden passen", + "repo.view.gitmodules_too_large": "De .gitmodules-Datei is to grot un word minnacht (to’n Bispööl för API-Upropen)", + "editor.search": "Söök", + "editor.find_previous": "Lester Fund", + "editor.find_next": "Anner Fund", + "editor.replace": "Utwesseln", + "editor.replace_all": "All utwesseln", + "editor.toggle_case": "Grot- un Kleenschrievens minnachten an- of utknipsen", + "editor.toggle_regex": "Regel-Utdrücken bruken an- of utknipsen", + "editor.toggle_whole_word": "Hele Woorden söken an- of utknipsen", + "install.ssh_authorized_keys_inspection_error": "Kunn bestahn authorized_keys-Datei nich nakieken: %v", + "install.ssh_authorized_keys_unexpected_key": "SSH för Forgejo antoknipsen is nich verdragelk mit de Datei unner %s, waar bestahn SSH-Slötels drinstahn. Vörslaag: Bruuk eenen Systeem-Bruker blots för Forgejo, of knips SSH ut.", + "repo.issues.filter_sort.hint_with_placeholder": "Sorteren na: %s" } diff --git a/options/locale_next/locale_nl-NL.json b/options/locale_next/locale_nl-NL.json index f424bdf94d..2902114e1c 100644 --- a/options/locale_next/locale_nl-NL.json +++ b/options/locale_next/locale_nl-NL.json @@ -201,5 +201,52 @@ "one": "Wachten op een runner met het volgende label: %s", "other": "Wachten op een runner met de volgende labels: %s" }, - "keys.verify.token.hint": "De token is slechts 1 minuut geldig. Krijg een nieuwe als deze verlopen is." + "keys.verify.token.hint": "De token is slechts 1 minuut geldig. Krijg een nieuwe als deze verlopen is.", + "repo.issues.filter_poster.hint": "Filter op auteur", + "repo.issues.filter_assignee.hint": "Filter op toegewezen gebruiker", + "repo.issues.filter_reviewers.hint": "Filteren op gebruiker die beoordeelde", + "repo.issues.filter_mention.hint": "Filteren op genoemde gebruiker", + "repo.issues.filter_modified.hint": "Filteren op laatst gewijzigde datum", + "repo.issues.filter_sort.hint": "Sorteer op: aangemaakt/reacties/updated/deadline", + "issues.updated": "bijgewerkt %s", + "repo.view.gitmodules_too_large": "Het .gitmodules-bestand is te groot en wordt genegeerd (bijvoorbeeld bij API-aanroepen)", + "search.syntax": "Syntaxis zoeken", + "search.fuzzy": "Fuzzy", + "search.fuzzy_tooltip": "Resultaten opnemen is een benaderende overeenkomst met de zoekterm", + "install.ssh_authorized_keys_inspection_error": "Kon bestaand authorized_keys-bestand niet inspecteren: %v", + "install.ssh_authorized_keys_unexpected_key": "Het inschakelen van SSH voor Forgejo veroorzaakt conflicten met het bestand in %s dat bestaande SSH-sleutels bevat. Suggesties: gebruik een speciale systeemgebruiker voor Forgejo of schakel SSH uit.", + "moderation.report.mark_as_handled": "Markeren als behandeld", + "moderation.report.mark_as_ignored": "Markeren als genegeerd", + "moderation.action.account.delete": "Account verwijderen", + "moderation.action.account.suspend": "Account opgeschort", + "moderation.action.repo.delete": "Verwijder repository", + "moderation.action.issue.delete": "Verwijder issue", + "moderation.action.comment.delete": "Verwijder reactie", + "moderation.unknown_action": "Onbekende actie", + "moderation.users.cannot_suspend_self": "Je kunt jezelf niet schorsen.", + "moderation.users.cannot_suspend_admins": "Gebruikers met beheerdersrechten kunnen niet worden geschorst.", + "moderation.users.cannot_suspend_org": "Organisaties kunnen niet worden geschorst.", + "moderation.users.already_suspended": "Gebruikersaccount is al opgeschort.", + "moderation.users.suspend_success": "Het gebruikersaccount is opgeschort.", + "moderation.users.cannot_delete_admins": "Gebruikers met beheerdersrechten kunnen niet worden verwijderd.", + "moderation.issue.deletion_success": "De issue is verwijderd.", + "moderation.comment.deletion_success": "De reactie is verwijderd.", + "admin.dashboard.transfer_lingering_logs": "Overdrachtsactielogboeken van voltooide actietaken van de database naar opslag", + "actions.workflow.persistent_incomplete_matrix": "Kan `strategy.matrix` van taak %[1]s niet evalueren vanwege een ongeldige `needs`-uitdrukking. Deze verwijst mogelijk naar een taak die niet in de ‘needs’-lijst (%[2]s) staat, of naar een uitvoer die niet bestaat in een van die taken.", + "actions.workflow.incomplete_matrix_missing_job": "Kan `strategy.matrix` van taak %[1]s niet evalueren: taak %[2]s staat niet in de `needs`-lijst van taak %[1]s (%[3]s).", + "actions.workflow.incomplete_matrix_unknown_cause": "Kan `strategy.matrix` van taak %[1]s niet evalueren: onbekende fout.", + "actions.workflow.incomplete_runson_missing_job": "Kan `runs-on` van taak %[1]s niet evalueren: taak %[2]s staat niet in de `needs`-lijst van taak %[1]s (%[3]s).", + "actions.workflow.incomplete_runson_missing_matrix_dimension": "Kan `runs-on` van taak %[1]s niet evalueren: matrixdimensie %[2]s bestaat niet.", + "actions.workflow.incomplete_runson_unknown_cause": "Kan `runs-on` van taak %[1]s niet evalueren: onbekende fout.", + "admin.auths.oauth2_quota_group_claim_name": "Claimnaam die groepsnamen voor deze bron opgeeft die moeten worden gebruikt voor quotabeheer. (Optioneel)", + "admin.auths.oauth2_quota_group_map": "Koppel geclaimde groepen aan quotagroepen. (Optioneel - vereist bovenstaande claimnaam)", + "admin.auths.oauth2_quota_group_map_removal": "Verwijder gebruikers uit gesynchroniseerde quotagroepen als de gebruiker niet tot de betreffende groep behoort.", + "editor.search": "Zoek", + "editor.find_previous": "Vorige vondst", + "editor.find_next": "Volgende vondst", + "editor.replace": "Vervangen", + "editor.replace_all": "Vervang alles", + "editor.toggle_case": "Hoofdlettergevoeligheid in- of uitschakelen", + "editor.toggle_regex": "Schakelen met behulp van reguliere expressies", + "editor.toggle_whole_word": "Schakel het matchen van hele woorden in of uit" } diff --git a/options/locale_next/locale_pl-PL.json b/options/locale_next/locale_pl-PL.json index d98b14157b..23d4b8a77a 100644 --- a/options/locale_next/locale_pl-PL.json +++ b/options/locale_next/locale_pl-PL.json @@ -30,12 +30,12 @@ "stars.list.none": "Nikt nie dał gwiazdki temu repozytorium.", "followers.incoming.list.self.none": "Nikt nie obserwuje twojego profilu.", "followers.incoming.list.none": "Nikt nie obserwuje tego użytkownika.", - "followers.outgoing.list.self.none": "Nie obserwujesz nikogo.", - "followers.outgoing.list.none": "%s nie obserwuje nikogo.", + "followers.outgoing.list.self.none": "Nikogo nie obserwujesz.", + "followers.outgoing.list.none": "%s nikogo nie obserwuje.", "home.welcome.no_activity": "Brak aktywności", - "home.explore_repos": "Eksploruj repozytoria", - "home.explore_users": "Eksploruj użytkowników", - "home.explore_orgs": "Eksploruj organizacje", + "home.explore_repos": "Przeglądaj repozytoria", + "home.explore_users": "Przeglądaj użytkowników", + "home.explore_orgs": "Przeglądaj organizacje", "relativetime.mins": { "one": "%d minutę temu", "few": "%d minuty temu", @@ -142,5 +142,91 @@ "many": "%s obserwujących" }, "repo.issues.filter_poster.hint": "Filtruj według autora", - "repo.issues.filter_assignee.hint": "Filtruj według przypisanego użytkownika" + "repo.issues.filter_assignee.hint": "Filtruj według przypisanego użytkownika", + "repo.issues.filter_reviewers.hint": "Filtruj według recenzentów", + "repo.issues.filter_mention.hint": "Filtruj według wspomnianych użytkowników", + "repo.issues.filter_modified.hint": "Filtruj według daty ostatniej modyfikacji", + "repo.issues.filter_sort.hint": "Sortuj według: created/comments/updated/deadline", + "issues.updated": "ostatnia aktualizacja: %s", + "repo.pulls.poster_manage_approval": "Zarządzaj zatwierdzeniami", + "repo.pulls.poster_requires_approval": "Kilka workflowów oczekuje na sprawdzenie.", + "repo.pulls.poster_requires_approval.tooltip": "Autor tego pull requesta nie jest zaufany do uruchamiania workflowów wyzwalanych przez pull requesty utworzone z forkowanego repozytorium lub z AGit. Workflowy wyzwalane przez zdarzenie `pull_request` nie zostaną uruchomione, dopóki nie zostaną zatwierdzone.", + "repo.pulls.poster_is_trusted": "Autor tego pull requesta jest zawsze zaufany do uruchamiania workflowów.", + "repo.pulls.poster_is_trusted.tooltip": "Autor tego pull requesta jest jawnie zaufany do uruchamiania workflowów wyzwalanych przez zdarzenia `pull_request`.", + "repo.pulls.poster_trust_deny": "Odmów", + "repo.pulls.poster_trust_deny.tooltip": "Workflowy oczekujące na zatwierdzenie zostaną anulowane.", + "repo.pulls.poster_trust_once": "Zezwól jednokrotnie", + "repo.pulls.poster_trust_once.tooltip": "Workflowy wyzwalane przez zdarzenie `pull_request` zostaną uruchomione dla tego commita, ale będą wymagały zatwierdzenia dla wszystkich przyszłych commitów pushowanych do tego pull requesta.", + "repo.pulls.poster_trust_always": "Zawsze zezwalaj", + "repo.pulls.poster_trust_always.tooltip": "Workflowy wyzwalane przez zdarzenie `pull_request` zostaną uruchomione dla tego commita i nie będzie potrzeby zatwierdzania uruchomień z tego pull requesta ani z przyszłych pull requestów utworzonych przez tego samego użytkownika.", + "repo.pulls.poster_trust_revoke": "Unieważnij", + "repo.pulls.poster_trust_revoke.tooltip": "Autor tego pull requesta nie będzie już zaufany do uruchamiania workflowów wyzwalanych przez zdarzenie `pull_request`. Każde uruchomienie będzie musiało zostać zatwierdzone ręcznie.", + "search.syntax": "Syntax wyszukiwania", + "search.fuzzy": "fFzzy", + "moderation.report.mark_as_ignored": "Oznacz jako ignorowane", + "moderation.action.account.delete": "Usuń konto", + "moderation.action.account.suspend": "Zawieś konto", + "moderation.action.repo.delete": "Usuń repozytorium", + "moderation.action.issue.delete": "Usuń zgłoszenie", + "moderation.action.comment.delete": "Usuń komentarz", + "moderation.unknown_action": "Nieznana akcja", + "moderation.users.cannot_suspend_self": "Nie możesz zawiesić samego siebie.", + "moderation.users.cannot_suspend_admins": "Użytkownik z uprawnieniami administratora nie może zostać zawieszony.", + "moderation.users.cannot_suspend_org": "Organizacja nie może zostać zawieszona.", + "moderation.users.already_suspended": "Konto jest już zawieszone.", + "moderation.users.suspend_success": "Konto zostało zawieszone.", + "moderation.users.cannot_delete_admins": "Użytkownik z uprawnieniami administratora nie może zostać usunięty.", + "moderation.issue.deletion_success": "Zgłoszenie zostało usunięte.", + "moderation.comment.deletion_success": "Komentarz został usunięty.", + "moderation.report_abuse_form.details": "Ten formularz powinien być używany do zgłaszania użytkowników, którzy tworzą spamowe profile, repozytoria, zgłoszenia lub komentarze albo zachowują się nieodpowiednio.", + "moderation.report_abuse_form.already_reported": "Już to zgłosiłeś", + "moderation.report_remarks.placeholder": "Opisz nadużycie, które zgłaszasz.", + "moderation.reporting_failed": "Nie udało się wysłać zgłoszenia: %v", + "moderation.reported_thank_you": "Dziękujemy za zgłoszenie. Administracja została o tym powiadomiona.", + "mail.actions.successful_run_after_failure_subject": "Workflow %[1]s został przywrócony w repozytorium %[2]s", + "mail.actions.not_successful_run_subject": "Workflow %[1]s zakończył się niepowodzeniem w repozytorium %[2]s", + "mail.actions.successful_run_after_failure": "Workflow %[1]s został przywrócony w repozytorium %[2]s", + "mail.actions.not_successful_run": "Workflow %[1]s zakończył się niepowodzeniem w repozytorium %[2]s", + "mail.actions.run_info_cur_status": "Stan tego uruchomienia: %[1]s (dopiero zmieniony z %[2]s)", + "mail.actions.run_info_previous_status": "Stan poprzedniego uruchomienia: %[1]s", + "mail.actions.run_info_sha": "Commit: %[1]s", + "mail.actions.run_info_trigger": "Wyzwolony ponieważ: %[1]s przez: %[2]s", + "discussion.locked": "Ta dyskusja została ograniczona. Komentowanie dozwolone jest jedynie kontrybutorom.", + "discussion.sidebar.reference": "Referencja", + "admin.auths.allow_username_change": "Zezwalaj na zmiany nazw użytkownika", + "admin.auths.allow_username_change.description": "Zezwól użytkownikom na zmiane nazwy użytkownika w ustawieniach profilu", + "admin.dashboard.cleanup_offline_runners": "Wyczyść runners offline", + "admin.dashboard.remove_resolved_reports": "Usuń rozwiązane zgłoszenia", + "admin.config.security": "Konfiguracja zabezpieczeń", + "admin.config.global_2fa_requirement.title": "Globalne wymagane podwójnej weryfikacji", + "admin.config.global_2fa_requirement.none": "Nie", + "admin.config.global_2fa_requirement.all": "Wszyscy użytkownicy", + "admin.config.global_2fa_requirement.admin": "Administratorzy", + "avatar.constraints_hint": "Własny awatar nie może przekraczać %[1]s rozmiaru pliku lub być większym niż %[2]dx%[3]d pikseli", + "user.ghost.tooltip": "Ten użytkownik został usunięty lub nie można go znaleźć.", + "og.repo.summary_card.alt_description": "Karta podsumowująca repozytorium %[1]s, opisana jako: %[2]s", + "repo.commit.load_tags_failed": "Wczytywanie tagów nie powiodło się z powodu wewnętrznego błędu serwera", + "compare.branches.title": "Porównaj gałęzie", + "migrate.pagure.description": "Przenieś dane z pagure.io lub innej instancji Pagure.", + "migrate.pagure.incorrect_url": "Nieprawidłowy URL repozytorium źródłowego został podany", + "migrate.pagure.project_url": "Adres URL projektu na Pagure", + "migrate.pagure.project_example": "Adres URL projektu na Pagure, np. https://pagure.io/pagure", + "migrate.pagure.token_label": "Token do API Pagure", + "migrate.pagure.private_issues.summary": "Prywatne zgłoszenia (opcjonalne)", + "actions.runs.run_attempt_label": "Próba uruchomienia #%[1]s (%[2]s)", + "actions.runs.view_most_recent_run": "Pokaż ostatnie uruchomienie", + "actions.workflow.job_parsing_error": "Nie można przeanalizować zadań w workflow: %v", + "actions.workflow.event_detection_error": "Nie można przeanalizować obsługiwanych zdarzeń w workflow: %v", + "actions.workflow.persistent_incomplete_matrix": "Nie można ocenić `strategy.matrix` zadania %[1]s z powodu nieprawidłowego wyrażenia `needs`. Może ono odwoływać się do zadania, które nie znajduje się na liście 'needs' (%[2]s), lub do wyniku, który nie istnieje w żadnym z tych zadań.", + "actions.workflow.incomplete_matrix_missing_job": "Nie można ocenić `strategy.matrix` zadania %[1]s: zadanie %[2]s nie znajduje się na liście `needs` zadania %[1]s (%[3]s).", + "actions.workflow.incomplete_matrix_missing_output": "Nie można ocenić `strategy.matrix` zadania %[1]s: zadanie %[2]s nie ma wyniku %[3]s.", + "actions.workflow.incomplete_matrix_unknown_cause": "Nie można ocenić `strategy.matrix` zadania %[1]s: nieznany błąd.", + "actions.workflow.incomplete_runson_missing_job": "Nie można ocenić `runs-on` zadania %[1]s: zadanie %[2]s nie znajduje się na liście `needs` zadania %[1]s (%[3]s).", + "actions.workflow.incomplete_runson_missing_output": "Nie można ocenić `runs-on` zadania %[1]s: zadanie %[2]s nie ma wyniku %[3]s.", + "actions.workflow.incomplete_runson_missing_matrix_dimension": "Nie można ocenić `runs-on` zadania %[1]s: wymiar macierzy %[2]s nie istnieje.", + "actions.workflow.incomplete_runson_unknown_cause": "Nie można ocenić `runs-on` zadania %[1]s: nieznany błąd.", + "actions.workflow.pre_execution_error": "Workflow nie został uruchomiony z powodu błędu, który zablokował próbę jego wykonania.", + "teams.add_all_repos.modal.header": "Dodaj wszystkie repozytoria", + "teams.remove_all_repos.modal.header": "Usuń wszystkie repozytoria", + "meta.last_line": " " } diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json index 3dca31a73f..6337a01e1b 100644 --- a/options/locale_next/locale_pt-BR.json +++ b/options/locale_next/locale_pt-BR.json @@ -38,7 +38,7 @@ "alert.asset_load_failed": "Não foi possível carregar arquivos de assets de {path}. Por favor, certifique-se que os arquivos podem ser acessados.", "install.invalid_lfs_path": "Não foi possível criar um root LFS no caminho especificado: %[1]s", "alert.range_error": " deve ser um número entre %[1]s e %[2]s.", - "meta.last_line": "real hot girl shit", + "meta.last_line": " ", "mail.actions.run_info_cur_status": "Status desta execução: %[1]s (atualizado recentemente de %[2]s)", "mail.actions.run_info_previous_status": "Status da execução anterior: %[1]s", "mail.actions.successful_run_after_failure_subject": "Workflow %[1]s recuperado no repositório %[2]s", @@ -251,5 +251,12 @@ "actions.workflow.incomplete_runson_missing_job": "Não foi possível avaliar `runs-on` do trabalho %[1]s: o trabalho %[2]s não está na lista `needs` do trabalho %[1]s (%[3]s).", "actions.workflow.incomplete_runson_missing_output": "Não é possível avaliar `runs-on` do trabalho %[1]s: o trabalho %[2]s não tem uma saída %[3]s.", "actions.workflow.incomplete_runson_missing_matrix_dimension": "Não é possível avaliar `runs-on` do trabalho %[1]s: a dimensão da matriz %[2]s não existe.", - "actions.workflow.incomplete_runson_unknown_cause": "Não é possível avaliar `runs-on` do trabalho %[1]s: erro desconhecido." + "actions.workflow.incomplete_runson_unknown_cause": "Não é possível avaliar `runs-on` do trabalho %[1]s: erro desconhecido.", + "issues.updated": "%s atualizado", + "repo.view.gitmodules_too_large": "O arquivo .gitmodules é muito grande e portanto será ignorado (em chamadas de API nesta instância)", + "search.fuzzy": "Difusa", + "search.fuzzy_tooltip": "Incluir resultados que sejam uma correspondência aproximada ao termo de busca", + "install.ssh_authorized_keys_inspection_error": "Falha ao inspecionar o arquivo authorized_keys existente: %v", + "install.ssh_authorized_keys_unexpected_key": "Habilitar SSH para o Forgejo conflita com o arquivo localizado em %s que contém chaves SSH existentes. Sugestões: use um usuário de sistema dedicado para o Forgejo ou desabilite o SSH.", + "repo.issues.filter_sort.hint_with_placeholder": "Ordenar por: %s" } diff --git a/options/locale_next/locale_pt-PT.json b/options/locale_next/locale_pt-PT.json index 689d5d5fa6..1f25d4c9da 100644 --- a/options/locale_next/locale_pt-PT.json +++ b/options/locale_next/locale_pt-PT.json @@ -251,5 +251,20 @@ "actions.workflow.incomplete_runson_unknown_cause": "Não é possível avaliar `runs-on` do trabalho %[1]s: erro desconhecido.", "admin.auths.oauth2_quota_group_claim_name": "Nome da reivindicação que fornece nomes de grupos para esta fonte a ser usada para gestão de quotas. (Opcional)", "admin.auths.oauth2_quota_group_map": "Atribuir grupos reivindicados a grupos de quotas. (Opcional - requer o nome da reivindicação acima)", - "admin.auths.oauth2_quota_group_map_removal": "Remover os utilizadores dos grupos de quotas sincronizados se o utilizador não pertencer ao grupo correspondente." + "admin.auths.oauth2_quota_group_map_removal": "Remover os utilizadores dos grupos de quotas sincronizados se o utilizador não pertencer ao grupo correspondente.", + "issues.updated": "%s atualizado", + "search.fuzzy": "Difusa", + "search.fuzzy_tooltip": "Incluir resultados que correspondam aproximadamente ao termo de pesquisa", + "repo.view.gitmodules_too_large": "O ficheiro .gitmodules é demasiado grande e será ignorado (por exemplo, em chamadas API)", + "editor.search": "Procurar", + "editor.find_previous": "Ocorrência anterior", + "editor.find_next": "Ocorrência seguinte", + "editor.replace": "Substituir", + "editor.replace_all": "Substituir tudo", + "editor.toggle_case": "Ativar/desativar a diferenciação de maiúsculas e minúsculas", + "editor.toggle_regex": "Ativar/desativar o uso de expressões regulares", + "editor.toggle_whole_word": "Ativar/desativar correspondência de palavras inteiras", + "install.ssh_authorized_keys_inspection_error": "Falha ao inspecionar o ficheiro authorized_keys existente: %v", + "install.ssh_authorized_keys_unexpected_key": "A ativação do SSH para o Forgejo entra em conflito com o ficheiro localizado em %s que contém chaves SSH existentes. Sugestões: use um utilizador de sistema dedicado para o Forgejo ou desative o SSH.", + "repo.issues.filter_sort.hint_with_placeholder": "Ordenar por: %s" } diff --git a/options/locale_next/locale_ro.json b/options/locale_next/locale_ro.json index 0967ef424b..a038db2f72 100644 --- a/options/locale_next/locale_ro.json +++ b/options/locale_next/locale_ro.json @@ -1 +1 @@ -{} +{"meta.last_line": " "} diff --git a/options/locale_next/locale_ru-RU.json b/options/locale_next/locale_ru-RU.json index 14556e8c40..57920ea470 100644 --- a/options/locale_next/locale_ru-RU.json +++ b/options/locale_next/locale_ru-RU.json @@ -38,7 +38,7 @@ "alert.asset_load_failed": "Не удалось получить ресурсы из {path}. Убедитесь, что файлы ресурсов доступны.", "install.invalid_lfs_path": "Не удалось расположить корень LFS по указанному пути: %[1]s", "alert.range_error": " - число должно быть в диапазоне от %[1]s-%[2]s.", - "meta.last_line": "This magic string will cause Codeberg Translate to create a new pull request in **the** Forgejo repository.", + "meta.last_line": "This magic string will cause Codeberg Translate to create a new pull request in **the** Forgejo repository. Hi.", "mail.actions.not_successful_run_subject": "Провал раб. потока %[1]s в репозитории %[2]s", "mail.actions.successful_run_after_failure_subject": "Возобновление раб. потока %[1]s в репозитории %[2]s", "mail.actions.run_info_trigger": "Причина срабатывания: %[1]s by: %[2]s", @@ -109,7 +109,7 @@ "moderation.report_content": "Пожаловаться", "moderation.report_abuse_form.already_reported": "Вы уже пожаловались на это содержимое", "moderation.submit_report": "Пожаловаться", - "moderation.reported_thank_you": "Спасибо за ваше сообщение. Администрация оповещена.", + "moderation.reported_thank_you": "Спасибо за ваше сообщение. Администрация была оповещена.", "moderation.report_abuse_form.details": "Через эту форму можно жаловаться на пользователей, распространяющих спам или ведущих себя неадекватно.", "moderation.report_abuse_form.invalid": "Невалидные аргументы", "moderation.report_abuse_form.header": "Жалоба администрации", @@ -168,7 +168,7 @@ "user.ghost.tooltip": "Пользователь удалён или неизвестен.", "migrate.form.error.url_credentials": "Ссылка содержит данные авторизации. Поместите их в соответствующие поля", "actions.runs.run_attempt_label": "Попытка №%[1]s (%[2]s)", - "actions.runs.viewing_out_of_date_run": "Это устаревший результат. Задание было выполнено %[1]s.", + "actions.runs.viewing_out_of_date_run": "Это устаревший результат задания, которое выполнялось %[1]s.", "actions.runs.view_most_recent_run": "Перейти к актуальному", "repo.pulls.maintainers_can_edit": "Сопровождающие могут вносить правки.", "repo.pulls.maintainers_cannot_edit": "Сопровождающие не могут вносить правки.", @@ -251,5 +251,20 @@ "actions.workflow.incomplete_runson_missing_output": "Не удалось проверить `runs-on` задачи %[1]s – задача %[2]s не имеет интерфейс вывода %[3]s.", "actions.workflow.incomplete_runson_missing_matrix_dimension": "Не удалось проверить `runs-on` задачи %[1]s – измерение матрицы %[2]s не существует.", "actions.workflow.incomplete_runson_unknown_cause": "Не удалось проверить `runs-on` задачи %[1]s – неизвестная ошибка.", - "admin.auths.oauth2_quota_group_map": "Связывать группы из указанного выше утверждения (claim) с группами квот" + "admin.auths.oauth2_quota_group_map": "Связывать группы из указанного выше утверждения (claim) с группами квот", + "issues.updated": "обнов. %s", + "search.fuzzy": "Приблиз.", + "search.fuzzy_tooltip": "Включает результаты, приблизительно соответствующие запросу", + "repo.view.gitmodules_too_large": "Файл .gitmodules слишком большой и будет игнорироваться (например, при вызовах API)", + "editor.search": "Поиск", + "editor.find_previous": "Предыдущий результат", + "editor.find_next": "Следующий результат", + "editor.replace": "Заменить", + "editor.replace_all": "Заменить все", + "editor.toggle_case": "Изменить чувствительность к регистру", + "editor.toggle_regex": "Изменить использование рег. выражений", + "editor.toggle_whole_word": "Изменить поиск целых слов", + "install.ssh_authorized_keys_inspection_error": "Не удалось проверить файл authorized_keys: %v", + "install.ssh_authorized_keys_unexpected_key": "Использование SSH конфликтует с файлом %s, уже содержащим ключи SSH. Возможные действия: добавьте в системе отдельного пользователя для Forgejo или выключите SSH в Forgejo.", + "repo.issues.filter_sort.hint_with_placeholder": "Сортировать по: %s" } diff --git a/options/locale_next/locale_si-LK.json b/options/locale_next/locale_si-LK.json index 4748bf6eb5..a7a990505d 100644 --- a/options/locale_next/locale_si-LK.json +++ b/options/locale_next/locale_si-LK.json @@ -18,5 +18,6 @@ "pulse.n_active_prs": { "one": "%s ක්රියාකාරී අදින්න ඉල්ලීම", "other": "%s ක්රියාකාරී අදින්න ඉල්ලීම්" - } + }, + "meta.last_line": " " } diff --git a/options/locale_next/locale_sk-SK.json b/options/locale_next/locale_sk-SK.json index c5b54cb198..6fba2f8441 100644 --- a/options/locale_next/locale_sk-SK.json +++ b/options/locale_next/locale_sk-SK.json @@ -1,11 +1,11 @@ { "fork.n_forks": { "one": "%s fork", - "other": "%s forky" + "other": "" }, "stars.n_stars": { "one": "%s hviezda", - "other": "%s hviezdy" + "other": "" }, "error.not_found.title": "Stránka nebola nájedná", "incorrect_root_url": "Táto inštancia Forgejo je nakonfigurovaná tak, aby bola obsluhovaná na „%s“. Momentálne zobrazujete Forgejo prostredníctvom inej adresy URL, čo môže spôsobiť poruchu niektorých častí aplikácie. Kanonickú adresu URL kontrolujú správcovia aplikácie Forgejo prostredníctvom nastavenia ROOT_URL v súbore app.ini.", @@ -154,5 +154,10 @@ "migrate.pagure.description": "Migrujte dáta z pagure.io alebo iných inštancií Pagure.", "migrate.pagure.incorrect_url": "Bola zadaná nesprávna URL adresa zdrojového repozitáru", "migrate.pagure.project_url": "URL adresa projektu Pagure", - "migrate.pagure.token_label": "Token" + "migrate.pagure.token_label": "Token", + "repo.issues.filter_poster.hint": "Filtrovať podľa autora", + "repo.issues.filter_assignee.hint": "Filtrovať podľa priradeného používateľa", + "repo.issues.filter_mention.hint": "Filtrovať podľa spomenutého použivateľa", + "repo.issues.filter_modified.hint": "Filtrovať podľa dátumu poslednej úpravy", + "issues.updated": "aktualizované %s" } diff --git a/options/locale_next/locale_sl.json b/options/locale_next/locale_sl.json index 0967ef424b..a038db2f72 100644 --- a/options/locale_next/locale_sl.json +++ b/options/locale_next/locale_sl.json @@ -1 +1 @@ -{} +{"meta.last_line": " "} diff --git a/options/locale_next/locale_sr-SP.json b/options/locale_next/locale_sr-SP.json index 881c261462..edf9815746 100644 --- a/options/locale_next/locale_sr-SP.json +++ b/options/locale_next/locale_sr-SP.json @@ -158,6 +158,6 @@ }, "teams.add_all_repos.modal.header": "Додај сви репозиторијуми", "teams.remove_all_repos.modal.header": "Обриши сви репозиторијуми", - "meta.last_line": "If you know a Latin and a Cyrillic alphabet, then you basically already know how the Greek alphabet works from which those alphabets stem from. Also, learning Cyrillic isn't difficult, but while Serbo-Croatian grammar can be annoying at times, at least its pronunciation is pretty easy – unlike Russian haha.", + "meta.last_line": "If you know a Latin and a Cyrillic alphabet, then you basically already know how the Greek alphabet works from which those alphabets stem from. Also, learning Cyrillic isn't difficult, but while Serbo-Croatian grammar can be annoying at times, at least its pronunciation is pretty easy – unlike Russian haha.\n(I also agree that Cyrillic isn't difficult. And comes with advantage of lack of unreadable words like Illinois)", "migrate.pagure.token_label": "Pagure АПИ токен" } diff --git a/options/locale_next/locale_sv-SE.json b/options/locale_next/locale_sv-SE.json index 5efbae56ef..559e2a839d 100644 --- a/options/locale_next/locale_sv-SE.json +++ b/options/locale_next/locale_sv-SE.json @@ -12,7 +12,7 @@ "other": "vill sammanfoga %[1]d incheckningar från s[2]s in i %[3]s" }, "search.milestone_kind": "Sök milstolpar…", - "mail.actions.not_successful_run_subject": "Arbetsflödet %[1]s misslyckades i förrådet %[2]s", + "mail.actions.not_successful_run_subject": "Arbetsflödet %[1]s misslyckades i kodförrådet %[2]s", "discussion.locked": "Denna diskussion har låsts. Kommentarer är begränsade till bidragsgivare.", "relativetime.now": "nu", "relativetime.1day": "igår", @@ -21,14 +21,14 @@ "one": "%d dag sedan", "other": "%d dagar sedan" }, - "admin.dashboard.cleanup_offline_runners": "Städa upp offline runners", - "repo.issue_indexer.title": "Indexerare för utgåvor", - "moderation.reported_thank_you": "Tack för din rapport. Administrationen har gjorts uppmärksam på det.", + "admin.dashboard.cleanup_offline_runners": "Städa upp ej uppkopplade körare", + "repo.issue_indexer.title": "ärendeindexerare", + "moderation.reported_thank_you": "Tack för din rapport. Administrationen har meddelats.", "themes.names.forgejo-light": "Forgejo ljus", "themes.names.forgejo-dark": "Forgejo mörk", - "themes.names.forgejo-auto": "Forgejo (följ systemets tema)", + "themes.names.forgejo-auto": "Forgejo (använd systemtemat)", "moderation.submit_report": "Skicka in rapport", - "moderation.reporting_failed": "Det gick inte att skicka in den nya övergreppsrapporten: %v", + "moderation.reporting_failed": "Det gick inte att skicka in den nya missbruksrapporten: %v", "mail.actions.run_info_cur_status": "Status för denna körning: %[1]s (just uppdaterad från %[2]s)", "mail.actions.run_info_previous_status": "Status för föregående körning: %[1]s", "mail.actions.run_info_trigger": "Utlöses på grund av: %[1]s av: %[2]s", @@ -36,7 +36,7 @@ "install.invalid_lfs_path": "Det gick inte att skapa LFS-roten på den angivna sökvägen: %[1]s", "alert.range_error": " måste vara ett tal mellan %[1]s och %[2]s.", "stars.list.none": "Ingen har stjärnmarkerat detta förråd.", - "watch.list.none": "Ingen tittar på det här förrådet.", + "watch.list.none": "Ingen följer det här kodförrådet.", "followers.incoming.list.self.none": "Ingen följer din profil.", "followers.incoming.list.none": "Ingen följer den här användaren.", "followers.outgoing.list.self.none": "Du följer inte någon.", @@ -48,22 +48,22 @@ "relativetime.2months": "för två månader sedan", "relativetime.1year": "förra året", "relativetime.2years": "för två år sedan", - "repo.form.cannot_create": "Alla utrymmen där du kan skapa förråd har nått gränsen för antal förråd.", - "incorrect_root_url": "Denna Forgejo-instans är konfigurerad att serveras på \"%s\". Du tittar för närvarande på Forgejo via en annan URL, vilket kan leda till att delar av applikationen bryts. Den kanoniska webbadressen styrs av Forgejo-administratörer via inställningen ROOT_URL i app.ini.", + "repo.form.cannot_create": "Alla utrymmen där du kan skapa kodförråd har nått gränsen för antalet kodförråd.", + "incorrect_root_url": "Denna Forgejo-instans är konfigurerad att serveras på \"%s\". Du tittar för närvarande på Forgejo via en annan URL, vilket kan leda till att delar av applikationen inte fungerar. Den kanoniska webbadressen styrs av Forgejo-administratörer via inställningen ROOT_URL i app.ini.", "error.not_found.title": "Sidan hittades inte", "moderation.abuse_category.illegal_content": "Olagligt innehåll", "moderation.abuse_category.other_violations": "Andra överträdelser av plattformsreglerna", "moderation.report_remarks": "Anmärkningar", - "moderation.report_remarks.placeholder": "Ge några detaljer om det övergrepp som du rapporterar.", + "moderation.report_remarks.placeholder": "Beskriv några detaljer om det missbruk som du rapporterar.", "mail.actions.successful_run_after_failure_subject": "Arbetsflöde %[1]s återställdes i förrådet %[2]s", - "mail.actions.successful_run_after_failure": "Arbetsflöde %[1]s återställdes i förrådet %[2]s", - "mail.actions.not_successful_run": "Arbetsflödet %[1]s misslyckades i förrådet %[2]s", + "mail.actions.successful_run_after_failure": "Arbetsflöde %[1]s återställdes i kodförrådet %[2]s", + "mail.actions.not_successful_run": "Arbetsflödet %[1]s misslyckades i kodförrådet %[2]s", "editor.textarea.shift_tab_hint": "Ingen indragning på den här raden. Tryck på Shift + Tab igen eller Escape för att lämna redigeringsläget.", - "meta.last_line": "Daniel Nylander heter jag och har översatt Forgejo. Mer information om mig på https://www.danielnylander.se", + "meta.last_line": "Tack för ditt bidrag till översättningen av Forgejo! Denna sträng visas inte för slutanvändare utan används internt för administrationsändamål. Det går bra att ersätta denna text med en intressant kuriosa.", "editor.textarea.tab_hint": "Raden är redan indragen. Tryck på Tab igen eller Escape för att lämna redigeringsläget.", "home.welcome.no_activity": "Ingen aktivitet", - "home.welcome.activity_hint": "Det finns inget i ditt flöde ännu. Dina åtgärder och aktivitet från förråd som du bevakar kommer att visas här.", - "home.explore_repos": "Utforska förråd", + "home.welcome.activity_hint": "Det finns inget i ditt flöde ännu. Dina åtgärder och aktiviteter från kodförråd som du bevakar kommer att visas här.", + "home.explore_repos": "Utforska kodförråd", "home.explore_users": "Utforska användare", "home.explore_orgs": "Utforska organisationer", "relativetime.mins": { @@ -86,20 +86,20 @@ "one": "%d år sedan", "other": "%d år sedan" }, - "admin.config.moderation_config": "Konfiguration av moderering", + "admin.config.moderation_config": "Modereringsinställningar", "moderation.report_abuse": "Rapportera missbruk", "moderation.report_content": "Rapportera innehåll", "moderation.report_abuse_form.header": "Rapportera missbruk till administratör", - "moderation.report_abuse_form.details": "Detta formulär ska användas för att rapportera användare som skapar skräpprofiler, förråd, problem, kommentarer eller beter sig olämpligt.", + "moderation.report_abuse_form.details": "Detta formulär används för att rapportera användare som skapar skräpprofiler, kodörråd, ärenden, kommentarer eller beter sig olämpligt.", "moderation.report_abuse_form.invalid": "Ogiltiga argument", "moderation.report_abuse_form.already_reported": "Du har redan rapporterat detta innehåll", "moderation.abuse_category": "Kategori", "moderation.abuse_category.placeholder": "Välj en kategori", - "moderation.abuse_category.spam": "Skräppost", + "moderation.abuse_category.spam": "Skräp", "moderation.abuse_category.malware": "Skadlig kod", "settings.visibility.description": "Profilens synlighet påverkar andras möjlighet att komma åt dina icke-privata förråd. Läs mer.", - "avatar.constraints_hint": "Anpassade avatarer får inte vara större än %[1] eller %[2]dx%[3] bildpunkter", - "og.repo.summary_card.alt_description": "Sammanfattningskort för arkivet %[1]s, beskrivet som: %[2]s", + "avatar.constraints_hint": "Anpassade profilbilder får inte vara större än %[1] eller %[2]dx%[3] bildpunkter", + "og.repo.summary_card.alt_description": "Sammanfattningskort för kodförrådet %[1]s, beskrivet som: %[2]s", "profile.actions.tooltip": "Fler åtgärder", "keys.gpg.link": "GPG-nycklar", "profile.edit.link": "Redigera profil", @@ -107,7 +107,7 @@ "repo.diff.commit.next-short": "Nästa", "repo.diff.commit.previous-short": "Föreg", "feed.atom.link": "Atom-flöde", - "repo.pulls.already_merged": "Sammanfogning misslyckades: Denna pulka förfrågning har redan blivit sammanfogad.", + "repo.pulls.already_merged": "Sammanfogning misslyckades: Denna ändringsbegäran har redan sammanfogats.", "pulse.n_active_issues": { "one": "%s aktivt ärende", "other": "%s aktiva ärenden" @@ -117,7 +117,7 @@ "other": "%s aktiva pull-förfrågningar" }, "migrate.form.error.url_credentials": "URL:en innehåller inloggningsuppgifter, sätt dem i respektive användarnamn- och lösenordsfält", - "migrate.git.description": "Migrera endast utvecklingskatalogen från vilken Git-tjänst som helst.", + "migrate.git.description": "Migrera ett kodförråd från en Git-tjänst.", "migrate.gitea.description": "Migrera data från gitea.com eller andra Gitea-instanser.", "migrate.gitlab.description": "Migrera data från gitlab.com eller annan GitLab-instans.", "migrate.gogs.description": "Migrera data från notabug.org eller annan Gogs-instans.", @@ -127,7 +127,7 @@ "migrate.forgejo.description": "Migrera data från codeberg.org eller annan Forgejo-instans.", "repo.settings.push_mirror.branch_filter.label": "Grenfilter (frivilligt)", "repo.settings.push_mirror.branch_filter.description": "Grenar att speglas. Lämna tom för att spegla alla grenar. Se %[2]s dokumentation för syntax. Exempel: main, release/*", - "admin.moderation.moderation_reports": "Moderationsrapporter", + "admin.moderation.moderation_reports": "Modereringsrapporter", "admin.moderation.reports": "Rapporter", "admin.moderation.no_open_reports": "Det finns för tillfället inga öppna rapporter.", "mail.actions.run_info_sha": "Commit: %[1]s", @@ -141,9 +141,9 @@ "admin.config.global_2fa_requirement.all": "Alla användare", "admin.config.global_2fa_requirement.admin": "Administratörer", "settings.twofa_unroll_unavailable": "Tvåfaktorsautentisering krävs för ditt konto och kan inte inaktiveras.", - "settings.must_enable_2fa": "Denna Forgejo-instans kräver användare att aktivera tvåfaktorsautentisering innan de kan komma at deras konto.", - "error.must_enable_2fa": "Denna Forgejo-instans kräver användare att aktivera tvåfaktorsautentisering innan de kan komma åt deras konto. Aktivera det på: %s", - "repo.commit.load_tags_failed": "Laddning av taggar misslyckades på grund av internt fel", + "settings.must_enable_2fa": "Denna Forgejo-instans kräver att användare aktiverar tvåfaktorsautentisering för att kunna komma åt sitt konto.", + "error.must_enable_2fa": "Denna Forgejo-instans kräver att användare aktiverar tvåfaktorsautentisering för att kunna komma åt sina konton. Aktivera det på: %s", + "repo.commit.load_tags_failed": "Insläsning av taggar misslyckades på grund av internt fel", "compare.branches.title": "Jämför grenar", "migrate.pagure.description": "Migrera data från pagure.io eller andra Pagure-instanser.", "migrate.pagure.project_url": "Pagure projekt-URL", @@ -151,35 +151,35 @@ "migrate.pagure.token_label": "Pagure API-token", "actions.runs.run_attempt_label": "Kör försök #%[1]s (%[2]s)", "migrate.github.description": "Migrera data från github.com eller GitHub Enterprise server.", - "repo.pulls.maintainers_can_edit": "Underhållsansvariga kan redigera denna pull-begäran.", - "repo.pulls.maintainers_cannot_edit": "Underhållsansvariga kan inte redigera denna pull-begäran.", - "mail.issue.action.close_by_commit": "%[1]s stängde %[2]s i commit %[3]s.", - "user.ghost.tooltip": "Denna användare har tagits bort eller kan inte matchas.", + "repo.pulls.maintainers_can_edit": "Förvaltare kan redigera denna ändringsbegäran.", + "repo.pulls.maintainers_cannot_edit": "Förvaltare kan inte redigera denna ändringsbegäran.", + "mail.issue.action.close_by_commit": "%[1]s stängde %[2]s i incheckning %[3]s.", + "user.ghost.tooltip": "Denna användare har blivit borttagen, eller kan inte hittas.", "migrate.pagure.private_issues.summary": "Privata ärenden (valfritt)", "release.n_downloads": { "one": "%s nedladdning", "other": "%s nedladdningar" }, - "actions.runs.view_most_recent_run": "Visa senaste körning", + "actions.runs.view_most_recent_run": "Visa senaste körningen", "actions.workflow.job_parsing_error": "Kunde inte tolka jobb i arbetsflöde: %v", "actions.workflow.pre_execution_error": "Arbetsflödet kördes inte på grund av ett fel som blockerade körningsförsöket.", - "warning.repository.out_of_sync": "Databasrepresentationen av detta arkiv är inte synkroniserad. Om denna varning fortfarande visas efter att du har skickat en commit till detta arkiv, kontakta administratören.", + "warning.repository.out_of_sync": "Databasrepresentationen av detta arkiv är inte synkroniserad. Om denna varning fortfarande visas efter att du har skickat en incheckning till detta arkiv, kontakta administratören.", "admin.moderation.deleted_content_ref": "Rapporterat innehåll med typ %[1]v och id %[2]d finns inte längre", "settings.twofa_reenroll": "Registrera om tvåfaktorsautentisering", "settings.twofa_reenroll.description": "Registrera om din tvåfaktorsautentisering", - "migrate.pagure.incorrect_url": "Felaktig URL till källarkivet har angetts", + "migrate.pagure.incorrect_url": "Felaktig URL för kodförråd", "migrate.pagure.private_issues.description": "Denna funktion är utformad för att skapa ett andra arkiv som endast innehåller privata ärenden från ditt Pagure-projekt för arkiveringsändamål. Utför först en normal migrering (utan token) för att importera allt publika innehåll. Om du har privata ärenden som du vill bevara skapar du sedan ett separat arkiv med hjälp av denna token-option för att arkivera dessa privata ärenden.", - "migrate.pagure.private_issues.warning": "Se till att ställa in synligheten för arkivet ovan till Privat om du använder API-nyckeln för att importera privata ärenden. Detta förhindrar att privat innehåll av misstag exponeras i ett publikt arkiv.", + "migrate.pagure.private_issues.warning": "Se till att ställa in synligheten för kodförrådet ovan till Privat om du använder API-nyckeln för att importera privata ärenden. Detta förhindrar att privat innehåll av misstag exponeras i ett publikt kodförråd.", "migrate.pagure.token.placeholder": "Endast för att skapa privata ärendearkiv", "actions.runs.viewing_out_of_date_run": "Du tittar på en föråldrad körning av detta jobb som utfördes %[1]s.", "actions.workflow.event_detection_error": "Det går inte att tolka stödda händelser i arbetsflödet: %v", "repo.pulls.poster_manage_approval": "Hantera godkännande", - "repo.issues.filter_poster.hint": "Filtrera efter upphovsperson", + "repo.issues.filter_poster.hint": "Filtrera efter författare", "repo.issues.filter_assignee.hint": "Filtrera efter tilldelad användare", "repo.issues.filter_reviewers.hint": "Filtrera efter användare som granskat", "repo.issues.filter_mention.hint": "Filtrera efter nämnd användare", "repo.issues.filter_modified.hint": "Filtrera efter senaste ändringsdatum", - "repo.pulls.poster_requires_approval.tooltip": "Upphovspersonen till denna pull-begäran är inte godkänd för att köra arbetsflöden som utlöses av en pull-begäran som skapats från ett förgrenat arkiv eller med AGit. Arbetsflöden som utlöses av en `pull_request`-händelse kommer inte att köras förrän de har godkänts.", + "repo.pulls.poster_requires_approval.tooltip": "Författaren av denna ändringsbegäran är inte godkänd för att köra arbetsflöden som utlöses av en ändringsbegäran skapad från ett avgrenat arkiv eller med AGit. Arbetsflöden som utlöses av en `pull_request`-händelse kommer inte att köras förrän de har godkänts.", "repo.pulls.poster_trust_deny": "Neka", "repo.pulls.poster_trust_deny.tooltip": "Arbetsflöden som väntar på godkännande kommer att avbrytas.", "repo.pulls.poster_trust_once": "Godkänn en gång", @@ -190,5 +190,52 @@ "actions.workflow.persistent_incomplete_matrix": "Det går inte att utvärdera `strategy.matrix` för jobb %[1]s på grund av ett ogiltigt `needs`-uttryck. Det kan hänvisa till ett jobb som inte finns i dess ’needs’-lista (%[2]s) eller en utdata som inte finns i något av dessa jobb.", "teams.add_all_repos.modal.header": "Lägg till arkiv", "teams.remove_all_repos.modal.header": "Ta bort alla arkiv", - "admin.auths.oauth2_quota_group_map_removal": "Ta bort användare från synkroniserade kvotgrupper om användaren inte tillhör motsvarande grupp." + "admin.auths.oauth2_quota_group_map_removal": "Ta bort användare från synkroniserade kvotgrupper om användaren inte tillhör motsvarande grupp.", + "repo.issues.filter_sort.hint": "Sortera utifrån: skapad/kommentarer/uppdaterad/slutdatum", + "issues.updated": "uppdaterade %s", + "repo.pulls.poster_requires_approval": "Några arbetsflöden väntar på att bli undersökta.", + "repo.pulls.poster_is_trusted": "Författaren till denna ändringsbegäran är alltid godkänd för att köra arbetsflöden.", + "repo.pulls.poster_is_trusted.tooltip": "Författaren till denna ändringsbegäran är specifikt godkänd för att köra arbetsflöden som utlöses av `pull_request`-händelser.", + "repo.pulls.poster_trust_once.tooltip": "Arbetsflöden som utlöses av en `pull_request`-begäran kommer att köra för denna incheckning men kommer att behöva godkännas för alla framtida incheckningar uppskickade till denna ändringsbegäran.", + "repo.pulls.poster_trust_always.tooltip": "Arbetsflöden som utlöses av en `pull_request`-begäran kommer köra för denna incheckning och kommer inte att behöva godkännas för den här eller framtida ändringsbegäran från samma användare.", + "repo.pulls.poster_trust_revoke.tooltip": "Författaren av denna ändringsbegäran kommer inte längre vara godkänd för att köra arbetsflöden som utlösts av en `pull_request`-begäran, varje körning måste godkännas manuellt.", + "search.syntax": "Söksyntax", + "search.fuzzy": "Ungefärlig", + "search.fuzzy_tooltip": "Inkludera resultat som ungefärligt matchar söktermen", + "keys.verify.token.hint": "Denna token är bara giltig i 1 minut Skaffa en ny om den har gått ut.", + "moderation.report.mark_as_handled": "Markera som hanterad", + "moderation.report.mark_as_ignored": "Markera som ignorerad", + "moderation.action.account.delete": "Radera kontot", + "moderation.action.account.suspend": "Stäng av kontot", + "moderation.action.repo.delete": "Radera kodförrådet", + "moderation.action.issue.delete": "Radera ärende", + "moderation.action.comment.delete": "Radera kommentar", + "moderation.unknown_action": "Okänd åtgärd", + "moderation.users.cannot_suspend_self": "Du kan inte stänga av dig själv.", + "moderation.users.cannot_suspend_admins": "Användare med administrativa rättigheter kan inte bli avstängda.", + "moderation.users.cannot_suspend_org": "Organisationer kan inte bli avstängda.", + "moderation.users.already_suspended": "Användarkontot är redan avstängt.", + "repo.view.gitmodules_too_large": ".gitmodules-filen är för stor och kommer därför att ignoreras (till exempel vid anrop via API)", + "install.ssh_authorized_keys_inspection_error": "Misslyckades med att inspektera befintlig authorized_keys-fil: %v", + "install.ssh_authorized_keys_unexpected_key": "SSH-aktivering för Forgejo krockar med den befintliga nyckelfilen på %s som innehåller existerande SSH-nycklar. Förslag: använd en egen systemanvändare för Forgejo eller inaktivera SSH.", + "moderation.users.suspend_success": "Användarkontot har inaktiverats.", + "moderation.users.cannot_delete_admins": "Det går inte att radera användare med administrationsrättigheter.", + "moderation.issue.deletion_success": "Ärendet har tagits bort.", + "moderation.comment.deletion_success": "Kommentaren har tagits bort.", + "actions.workflow.incomplete_matrix_missing_job": "Misslyckades med att läsa `strategy.matrix` för jobb %[1]s: jobb %[1]s saknar jobb %[2]s i sin `needs`-lista (%[3]s).", + "actions.workflow.incomplete_matrix_unknown_cause": "Misslyckades med att utvärdera `strategy.matrix` för jobb %[1]s: okänt fel uppstod.", + "actions.workflow.incomplete_runson_missing_job": "Misslyckades med att utvärdera `runs-on` för jobb %[1]s: jobb %[2]s saknas i `needs`-listan för jobb %[1]s (referens: %[3]s).", + "actions.workflow.incomplete_runson_missing_matrix_dimension": "Misslyckades med att utvärdera `runs-on` för jobb %[1]s: matrisdimension %[2]s saknas.", + "actions.workflow.incomplete_runson_unknown_cause": "Misslyckades med att utvärdera `runs-on` för jobb %[1]s: okänt fel.", + "admin.auths.oauth2_quota_group_claim_name": "Namn på anspråk (claim) som tillhandahåller gruppnamn för denna källa, att användas för kvothantering. (Valfritt)", + "admin.auths.oauth2_quota_group_map": "Mappa grupper från 'claim' till kvotgrupper. (Valfritt – kräver 'claim'-namn ovan)", + "editor.search": "Sök", + "editor.find_previous": "Föregående", + "editor.find_next": "Nästa", + "editor.replace": "Ersätt", + "editor.replace_all": "Ersätta alla", + "editor.toggle_case": "Växla skiftlägeskänslighet", + "editor.toggle_regex": "Använd reguljära uttryck", + "editor.toggle_whole_word": "Matcha hela ord", + "repo.issues.filter_sort.hint_with_placeholder": "Sortera efter: %s" } diff --git a/options/locale_next/locale_ta.json b/options/locale_next/locale_ta.json index 475a7773fb..f3049a98e2 100644 --- a/options/locale_next/locale_ta.json +++ b/options/locale_next/locale_ta.json @@ -236,5 +236,20 @@ "actions.workflow.incomplete_runson_unknown_cause": "%[1]s வேலையின் `ரன்-ஆன்` என்பதை மதிப்பிட முடியவில்லை: தெரியாத பிழை.", "admin.auths.oauth2_quota_group_claim_name": "இந்த மூலத்திற்கான குழுப் பெயர்களை வழங்குவதற்கான உரிமைகோரல் பெயர் ஒதுக்கீடு மேலாண்மைக்கு பயன்படுத்தப்படும். (விரும்பினால்)", "admin.auths.oauth2_quota_group_map": "மேப் உரிமைகோரப்பட்ட குழுக்களுக்கு ஒதுக்கப்பட்ட குழுக்களுக்கு. (விரும்பினால் - மேலே உள்ள உரிமைகோரல் பெயர் தேவை)", - "admin.auths.oauth2_quota_group_map_removal": "பயனர் தொடர்புடைய குழுவில் இல்லை என்றால், ஒத்திசைக்கப்பட்ட கோட்டா குழுக்களில் இருந்து பயனர்களை அகற்றவும்." + "admin.auths.oauth2_quota_group_map_removal": "பயனர் தொடர்புடைய குழுவில் இல்லை என்றால், ஒத்திசைக்கப்பட்ட கோட்டா குழுக்களில் இருந்து பயனர்களை அகற்றவும்.", + "issues.updated": "புதுப்பிக்கப்பட்டது %s", + "repo.view.gitmodules_too_large": ".gitmodules கோப்பு மிகவும் பெரியது மற்றும் புறக்கணிக்கப்படும் (உதாரணமாக பநிஇ அழைப்புகளில்)", + "search.fuzzy": "தெளிவற்ற", + "search.fuzzy_tooltip": "முடிவுகளைச் சேர்த்தல் என்பது தேடல் சொல்லுடன் தோராயமான பொருத்தமாகும்", + "install.ssh_authorized_keys_inspection_error": "ஏற்கனவே உள்ள authorized_keys கோப்பை ஆய்வு செய்ய முடியவில்லை: %v", + "install.ssh_authorized_keys_unexpected_key": "Forgejo க்கு பாஓடு ஐ இயக்குவது ஏற்கனவே உள்ள பாஓடு விசைகளைக் கொண்ட %s இல் உள்ள கோப்புடன் முரண்படுகிறது. பரிந்துரைகள்: Forgejo க்கான பிரத்யேக கணினி பயனரைப் பயன்படுத்தவும் அல்லது பாஓடு ஐ முடக்கவும்.", + "editor.search": "தேடல்", + "editor.find_previous": "முந்தைய கண்டுபிடிப்பு", + "editor.find_next": "அடுத்த கண்டுபிடிப்பு", + "editor.replace": "மாற்றவும்", + "editor.replace_all": "அனைத்தையும் மாற்றவும்", + "editor.toggle_case": "கேச் உணர்திறனை நிலைமாற்று", + "editor.toggle_regex": "வழக்கமான வெளிப்பாடுகளைப் பயன்படுத்தி மாறவும்", + "editor.toggle_whole_word": "முழு வார்த்தைகளையும் பொருத்த நிலைமாற்று", + "repo.issues.filter_sort.hint_with_placeholder": "இதன்படி வரிசைப்படுத்து: %s" } diff --git a/options/locale_next/locale_tok.json b/options/locale_next/locale_tok.json index 0967ef424b..96dd51f640 100644 --- a/options/locale_next/locale_tok.json +++ b/options/locale_next/locale_tok.json @@ -1 +1 @@ -{} +{"meta.last_line": " ", "home.welcome.no_activity": "ijo sin ala li lon", "home.welcome.activity_hint": "sina pali la sona pali li lon ni.", "home.explore_repos": "o alasa e poki", "home.explore_users": "o alasa e jan", "home.explore_orgs": "o alasa e kulupu"} diff --git a/options/locale_next/locale_tt.json b/options/locale_next/locale_tt.json index a06110c46a..6f359598eb 100644 --- a/options/locale_next/locale_tt.json +++ b/options/locale_next/locale_tt.json @@ -4,5 +4,6 @@ "home.explore_repos": "Репозиторийларны карау", "home.explore_users": "Кулланучыларны өйрәнү", "home.explore_orgs": "Оешмаларны өйрәнү", - "fork.n_forks": "%s чәнечке" + "fork.n_forks": "%s чәнечке", + "meta.last_line": " " } diff --git a/options/locale_next/locale_uk-UA.json b/options/locale_next/locale_uk-UA.json index 7496fb2601..989678b411 100644 --- a/options/locale_next/locale_uk-UA.json +++ b/options/locale_next/locale_uk-UA.json @@ -139,7 +139,7 @@ "repo.commit.load_tags_failed": "Завантаження тегів не вдалося через внутрішню помилку", "admin.auths.allow_username_change.description": "Дозволити користувачам змінювати ім’я користувача в налаштуваннях профілю", "admin.auths.allow_username_change": "Дозволити змінювати імена", - "warning.repository.out_of_sync": "База даних цього репозиторію не синхронізована. Якщо ви знову бачите це попередження після надсилання коміту в цей репозиторій, зверніться до адміністратора.", + "warning.repository.out_of_sync": "База даних цього репозиторію не синхронізована. Якщо ви знову бачите це попередження після надсилання коміту в цей репозиторій, зверніться до адміністрації.", "repo.pulls.already_merged": "Не вдалося об’єднати: цей запит на злиття вже об’єднано.", "migrate.pagure.description": "Перенести дані з pagure.io або інших екземплярів Pagure.", "migrate.pagure.token_label": "Токен API Pagure", @@ -183,7 +183,7 @@ "many": "%s активних запитів на злиття" }, "migrate.pagure.private_issues.summary": "Приватні задачі (необов’язково)", - "migrate.pagure.private_issues.description": "Ця функція дозволяє створити додатковий репозиторій для архівування в ньому приватних задач із вашого проєкту Pagure. Спочатку виконайте звичайну міграцію (без токена), щоб імпортувати весь публічний вміст. Потім, якщо у вас є приватні задачі, які потрібно зберегти, створіть окремий репозиторій, використовуючи токен, щоб архівувати ці приватні задачі.", + "migrate.pagure.private_issues.description": "Ця функція дозволяє створити додатковий репозиторій для архівування в ньому приватних задач із вашого проєкту Pagure. Спочатку виконайте звичайне перенесення (без токена), щоб імпортувати весь публічний вміст. Потім, якщо у вас є приватні задачі, які потрібно зберегти, створіть окремий репозиторій, використовуючи токен, щоб архівувати ці приватні задачі.", "migrate.pagure.private_issues.warning": "Обов’язково встановіть видимість репозиторію на «Приватний», якщо використовуєте ключ API для імпорту приватних задач. Це запобігає випадковому розкриттю приватного вмісту в публічному репозиторії.", "migrate.pagure.token.placeholder": "Тільки для створення архіву приватних задач", "mail.issue.action.close_by_commit": "%[1]s закриває %[2]s в коміті %[3]s.", @@ -210,14 +210,14 @@ "repo.pulls.poster_trust_once.tooltip": "Робочі потоки, ініційовані подією `pull_request`, будуть виконані для цього коміту, але їх потрібно буде схвалювати для всіх наступних комітів, надісланих до цього запиту на злиття.", "repo.pulls.poster_trust_always.tooltip": "Робочі потоки, ініційовані подією `pull_request`, будуть виконані для цього коміту, і не буде необхідності схвалювати запуски з цього запиту на злиття або наступних запитів, створених тим самим користувачем.", "repo.pulls.poster_trust_revoke.tooltip": "Автор цього запиту на злиття більше не зможе запускати робочі потоки, ініційовані подією `pull_request`, кожен запуск потрібно буде схвалювати вручну.", - "admin.dashboard.actions_action_user": "Відкликати довіру Дій Forgejo для неактивних користувачів", + "admin.dashboard.actions_action_user": "Відкликати довіру Дій Forgejo у неактивних користувачів", "actions.status.diagnostics.waiting": { "one": "Очікування ранера з міткою: %s", "few": "Очікування ранера з мітками: %s", "many": "Очікування ранера з мітками: %s" }, "keys.verify.token.hint": "Токен дійсний лише протягом 1 хвилини. Отримайте новий, якщо термін дії закінчився.", - "admin.dashboard.transfer_lingering_logs": "Перенести журнали виконаних завдань із бази даних до сховища", + "admin.dashboard.transfer_lingering_logs": "Перемістити журнали виконаних завдань із бази даних до сховища", "search.syntax": "Синтаксис пошуку", "repo.issues.filter_poster.hint": "Фільтрувати за автором", "repo.issues.filter_assignee.hint": "Фільтрувати за призначеним користувачем", @@ -251,5 +251,20 @@ "actions.workflow.incomplete_matrix_missing_output": "Неможливо оцінити `strategy.matrix` завдання %[1]s: результат %[3]s не існує в завданні %[2]s.", "actions.workflow.incomplete_runson_missing_job": "Неможливо оцінити `runs-on` завдання %[1]s: завдання %[2]s немає у списку `needs` завдання %[1]s (%[3]s).", "actions.workflow.incomplete_runson_missing_output": "Неможливо оцінити `runs-on` завдання %[1]s: результат %[3]s не існує в завданні %[2]s.", - "actions.workflow.incomplete_runson_missing_matrix_dimension": "Неможливо оцінити `runs-on` завдання %[1]s: розмір матриці %[2]s не існує." + "actions.workflow.incomplete_runson_missing_matrix_dimension": "Неможливо оцінити `runs-on` завдання %[1]s: розмір матриці %[2]s не існує.", + "issues.updated": "оновлено %s", + "search.fuzzy": "Нечіткий", + "search.fuzzy_tooltip": "Включати результати, які приблизно відповідають пошуковому запиту", + "repo.view.gitmodules_too_large": "Файл .gitmodules занадто великий і буде проігнорований (наприклад, при викликах API)", + "editor.search": "Знайти", + "editor.find_previous": "Попередній", + "editor.find_next": "Наступний", + "editor.replace": "Замінити", + "editor.replace_all": "Замінити все", + "editor.toggle_case": "Перемкнути врахування регістру", + "editor.toggle_regex": "Перемкнути регулярні вирази", + "editor.toggle_whole_word": "Перемкнути пошук цілих слів", + "install.ssh_authorized_keys_inspection_error": "Не вдалося перевірити наявний файл authorized_keys: %v", + "install.ssh_authorized_keys_unexpected_key": "Увімкнення SSH для Forgejo конфліктує з файлом, розташованим за адресою %s, який містить існуючі ключі SSH. Підказка: використовуйте для Forgejo спеціального системного користувача або вимкніть SSH.", + "repo.issues.filter_sort.hint_with_placeholder": "Сортувати за: %s" } diff --git a/options/locale_next/locale_uz.json b/options/locale_next/locale_uz.json index 1cd7fd1960..3b44ecf045 100644 --- a/options/locale_next/locale_uz.json +++ b/options/locale_next/locale_uz.json @@ -43,5 +43,6 @@ "relativetime.1year": "oxirgi yil", "relativetime.2years": "ikki yil oldin", "search.syntax": "Qidiruv sintaksisi", - "repo.settings.push_mirror.branch_filter.label": "Branch filteri (ixtiyoriy)" + "repo.settings.push_mirror.branch_filter.label": "Branch filteri (ixtiyoriy)", + "meta.last_line": " " } diff --git a/options/locale_next/locale_yi.json b/options/locale_next/locale_yi.json index 0967ef424b..a038db2f72 100644 --- a/options/locale_next/locale_yi.json +++ b/options/locale_next/locale_yi.json @@ -1 +1 @@ -{} +{"meta.last_line": " "} diff --git a/options/locale_next/locale_zh-CN.json b/options/locale_next/locale_zh-CN.json index 83c0b72aa1..2e0833fe45 100644 --- a/options/locale_next/locale_zh-CN.json +++ b/options/locale_next/locale_zh-CN.json @@ -164,5 +164,46 @@ "repo.pulls.poster_trust_always": "始终批准", "repo.pulls.poster_trust_always.tooltip": "由`pull_request`事件触发的工作流会基于此提交运行,且来自此合并请求或同一用户的其他合并请求的运行不需要批准。", "repo.pulls.poster_trust_revoke": "撤销", - "repo.pulls.poster_trust_revoke.tooltip": "此合并请求的作者将不再被信任以运行`pull_request`事件触发的工作流,所有运行均需被手动批准。" + "repo.pulls.poster_trust_revoke.tooltip": "此合并请求的作者将不再被信任以运行`pull_request`事件触发的工作流,所有运行均需被手动批准。", + "issues.updated": "更新于 %s", + "search.fuzzy": "模糊", + "search.fuzzy_tooltip": "包含与搜索关键字相似的结果", + "moderation.report.mark_as_handled": "标记为已处理", + "moderation.report.mark_as_ignored": "标记为忽略", + "moderation.action.account.delete": "删除账户", + "moderation.action.account.suspend": "封禁账户", + "moderation.action.repo.delete": "删除仓库", + "moderation.action.issue.delete": "删除议题", + "moderation.action.comment.delete": "删除评论", + "moderation.unknown_action": "未知操作", + "moderation.users.cannot_suspend_self": "您不能封禁您自己。", + "moderation.users.cannot_suspend_admins": "您不能封禁有管理权限的用户。", + "moderation.users.cannot_suspend_org": "您不能封禁组织。", + "moderation.users.already_suspended": "该账户已经处于封禁状态。", + "moderation.users.suspend_success": "已封禁该账户。", + "moderation.users.cannot_delete_admins": "您不能删除有管理权限的账户。", + "moderation.issue.deletion_success": "已删除该议题。", + "moderation.comment.deletion_success": "已删除该评论。", + "actions.workflow.persistent_incomplete_matrix": "因`needs`表达式无效,无法解析该任务的`strategy.martix`。可能引用了一个未在其 needs 列表(%[2]s)当中的任务,或者该列表中某些任务没有输出。", + "actions.workflow.incomplete_matrix_missing_job": "无法解析任务‘%[1]s’的`strategy.martix`:任务‘%[2]s’不在‘%[1]s’的`needs`列表当中(%[3]s)。", + "actions.workflow.incomplete_matrix_missing_output": "无法解析任务‘%[1]s’的`strategy.martix`:任务‘%[2]s’没有输出‘%[3]s’。", + "actions.workflow.incomplete_matrix_unknown_cause": "无法解析任务‘%[1]s’的`strategy.martix`:未知错误。", + "actions.workflow.incomplete_runson_missing_job": "无法解析任务‘%[1]s’的`runs-on`:任务‘%[2]s’不在任务‘%[1]s’的`needs`列表内(%[3]s)。", + "actions.workflow.incomplete_runson_missing_output": "无法解析任务‘%[1]s’的`runs-on`:任务‘%[2]s’没有输出‘%[3]s’。", + "actions.workflow.incomplete_runson_missing_matrix_dimension": "无法解析任务‘%[1]s’的`runs-on`:矩阵维度‘%[2]s’不存在。", + "actions.workflow.incomplete_runson_unknown_cause": "无法解析任务‘%[1]s’的`runs-on`:未知错误。", + "admin.auths.oauth2_quota_group_claim_name": "用于设定该来源配额组名的声明(claim)的名称。(可选)", + "admin.auths.oauth2_quota_group_map": "将声明组映射到配额组。(可选,需要填写上述声明名称)", + "admin.auths.oauth2_quota_group_map_removal": "如果用户不是对应组的成员,则将用户从同步的配额组中移出。", + "repo.view.gitmodules_too_large": ".gitmodules 因太大而被(API等)忽略", + "editor.search": "查找", + "editor.find_previous": "上一个结果", + "editor.find_next": "下一个结果", + "editor.replace": "替换", + "editor.replace_all": "替换全部", + "editor.toggle_case": "切换大小写敏感", + "editor.toggle_regex": "切换正则表达式", + "editor.toggle_whole_word": "切换全词匹配", + "install.ssh_authorized_keys_inspection_error": "无法检查已存在的 authorized_keys 文件:%v", + "install.ssh_authorized_keys_unexpected_key": "为 Forgejo 启用 SSH 与位于 %s 的文件冲突,该文件包含已存在的 SSH 密钥。建议:为 Forgejo 使用独立的系统用户或禁用 SSH。" } diff --git a/options/locale_next/locale_zh-HK.json b/options/locale_next/locale_zh-HK.json index 277385cf5f..5b08a8b078 100644 --- a/options/locale_next/locale_zh-HK.json +++ b/options/locale_next/locale_zh-HK.json @@ -1,4 +1,5 @@ { "repo.pulls.merged_title_desc": "於 %[4]s 將 %[1]d 次代碼提交從 %[2]s合併至 %[3]s", - "moderation.abuse_category.malware": "惡意程式" + "moderation.abuse_category.malware": "惡意程式", + "meta.last_line": " " } diff --git a/options/locale_next/locale_zh-TW.json b/options/locale_next/locale_zh-TW.json index 0f0f20e448..6a590da067 100644 --- a/options/locale_next/locale_zh-TW.json +++ b/options/locale_next/locale_zh-TW.json @@ -101,5 +101,15 @@ "pulse.n_active_prs": { "one": "%s 個合併請求", "other": "%s 個合併請求" - } + }, + "watch.n_watchers": "%s 位關注者", + "repo.issues.filter_poster.hint": "按作者過濾", + "repo.issues.filter_assignee.hint": "按指定用戶過濾", + "repo.issues.filter_reviewers.hint": "按審閱用戶過濾", + "repo.issues.filter_mention.hint": "按提及用戶過濾", + "repo.issues.filter_modified.hint": "按最後修改時間過濾", + "issues.updated": "更新與 %s", + "repo.pulls.poster_manage_approval": "管理批准", + "repo.pulls.poster_requires_approval.tooltip": "此合併請求的提交者,不信任執行由衍生儲存庫或 AGit 所建立的 PR 所觸發的工作流程。由 `pull_request` 事件觸發的工作流程,將不會持續執行,直到核准為止。", + "repo.issues.filter_sort.hint_with_placeholder": "排序依據:%s" } diff --git a/package-lock.json b/package-lock.json index 357528d355..01d484c8cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,11 +8,34 @@ "dependencies": { "@citation-js/core": "0.7.21", "@citation-js/plugin-bibtex": "0.7.21", - "@citation-js/plugin-software-formats": "0.6.1", + "@citation-js/plugin-software-formats": "0.6.2", + "@codemirror/autocomplete": "6.20.0", + "@codemirror/commands": "6.10.1", + "@codemirror/lang-cpp": "6.0.3", + "@codemirror/lang-css": "6.3.1", + "@codemirror/lang-go": "6.0.1", + "@codemirror/lang-html": "6.4.11", + "@codemirror/lang-java": "6.0.2", + "@codemirror/lang-javascript": "6.2.4", + "@codemirror/lang-json": "6.0.2", + "@codemirror/lang-less": "6.0.2", + "@codemirror/lang-liquid": "6.3.1", + "@codemirror/lang-markdown": "6.5.0", + "@codemirror/lang-php": "6.0.2", + "@codemirror/lang-python": "6.2.1", + "@codemirror/lang-rust": "6.0.2", + "@codemirror/lang-sass": "6.0.2", + "@codemirror/lang-xml": "6.1.0", + "@codemirror/lang-yaml": "6.1.2", + "@codemirror/language": "6.12.1", + "@codemirror/search": "6.5.11", + "@codemirror/state": "6.5.3", + "@codemirror/view": "6.39.9", "@github/markdown-toolbar-element": "2.2.3", "@github/quote-selection": "2.1.0", "@github/text-expander-element": "2.8.0", "@google/model-viewer": "4.1.0", + "@lezer/highlight": "1.2.1", "@mcaptcha/vanilla-glue": "0.1.0-alpha-3", "@primer/octicons": "19.14.0", "ansi_up": "6.0.5", @@ -34,9 +57,7 @@ "katex": "0.16.27", "mermaid": "11.12.2", "mini-css-extract-plugin": "2.9.3", - "minimatch": "10.1.1", - "monaco-editor": "0.52.2", - "monaco-editor-webpack-plugin": "7.1.1", + "minimatch": "10.2.3", "pdfobject": "2.3.0", "postcss": "8.5.6", "postcss-loader": "8.2.0", @@ -56,7 +77,7 @@ "vue-chartjs": "5.3.3", "vue-loader": "17.4.2", "vue3-calendar-heatmap": "2.0.5", - "webpack": "5.103.0", + "webpack": "5.104.1", "webpack-cli": "6.0.1", "wrap-ansi": "9.0.2" }, @@ -96,7 +117,7 @@ "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.0.1", - "svgo": "4.0.0", + "svgo": "4.0.1", "typescript": "5.9.3", "typescript-eslint": "8.48.0", "vite-string-plugin": "1.4.9", @@ -398,22 +419,22 @@ } }, "node_modules/@citation-js/plugin-cff": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@citation-js/plugin-cff/-/plugin-cff-0.6.1.tgz", - "integrity": "sha512-tLjTgsfzNOdQWGn5mNc2NAaydHnlRucSERoyAXLN7u0BQBfp7j5zwdxCmxcQD/N7hH3fpDKMG+qDzbqpJuKyNA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@citation-js/plugin-cff/-/plugin-cff-0.6.2.tgz", + "integrity": "sha512-jvERDFbtQQOBb9s+E8VbRIYsEIb2YEbcLH3yVDxXK0xqBGQDE5m8JZAYUkENy4FmbaD979l0+xJTWAsYN1pV/w==", "license": "MIT", "dependencies": { "@citation-js/date": "^0.5.0", - "@citation-js/plugin-yaml": "^0.6.1" + "@citation-js/plugin-yaml": "^0.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@citation-js/plugin-github": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@citation-js/plugin-github/-/plugin-github-0.6.1.tgz", - "integrity": "sha512-1ZeSgQ5AoYsa8n2acVooUeRk76oA8rLszYNBjzj5z6MPa11BZlQJ9O+Gy4tHjlImvsENLbLPx5f8/V1VHXaCfQ==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@citation-js/plugin-github/-/plugin-github-0.6.2.tgz", + "integrity": "sha512-NKq/1Ja060o4II1Z4p1+utwpvMsx+XIWdNiFvnJDfR2Z9E1xGETjByPpdobGBsteUTpJPEe9OVfF8Dee/Q7zLQ==", "license": "MIT", "dependencies": { "@citation-js/date": "^0.5.0", @@ -424,9 +445,9 @@ } }, "node_modules/@citation-js/plugin-npm": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@citation-js/plugin-npm/-/plugin-npm-0.6.1.tgz", - "integrity": "sha512-rojJA+l/p2KBpDoY+8n0YfNyQO1Aw03fQR5BN+gXD1LNAP1V+8wqvdPsaHnzPsrhrd4ZXDR7ch/Nk0yynPkJ3Q==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@citation-js/plugin-npm/-/plugin-npm-0.6.2.tgz", + "integrity": "sha512-mbQg/N9HM+gOqHJCdDZEElSW+h/oM94snKCl3llXuZ4MEH3tHraElS6CYRW/vW7s8KUTTHhgE62Q6ua5aRml8g==", "license": "MIT", "dependencies": { "@citation-js/date": "^0.5.0", @@ -437,25 +458,25 @@ } }, "node_modules/@citation-js/plugin-software-formats": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@citation-js/plugin-software-formats/-/plugin-software-formats-0.6.1.tgz", - "integrity": "sha512-BDF9rqi56K0hoTgYTVANCFVRSbWKC9V06Uap7oa8SjqCTgnHJAy8t/F3NxsyYPPG+zmRsLW9VNbcIsJOl0eu/w==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@citation-js/plugin-software-formats/-/plugin-software-formats-0.6.2.tgz", + "integrity": "sha512-x1IG0LBKglBU6SuiiKfvOtn7g7o7s+YhQhB44o7zrFaKEO8jkyQ5qMKtM5VFdCBL7teLfzZLjpjNkdJXtZ6XZw==", "license": "MIT", "dependencies": { - "@citation-js/plugin-cff": "^0.6.1", - "@citation-js/plugin-github": "^0.6.1", - "@citation-js/plugin-npm": "^0.6.1", - "@citation-js/plugin-yaml": "^0.6.1", - "@citation-js/plugin-zenodo": "^0.6.1" + "@citation-js/plugin-cff": "^0.6.2", + "@citation-js/plugin-github": "^0.6.2", + "@citation-js/plugin-npm": "^0.6.2", + "@citation-js/plugin-yaml": "^0.6.2", + "@citation-js/plugin-zenodo": "^0.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@citation-js/plugin-yaml": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@citation-js/plugin-yaml/-/plugin-yaml-0.6.1.tgz", - "integrity": "sha512-XEVVks1cJTqRbjy+nmthfw/puR6NwRB3fyJWi1tX13UYXlkhP/h45nsv4zjgLLGekdcMHQvhad9MAYunOftGKA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@citation-js/plugin-yaml/-/plugin-yaml-0.6.2.tgz", + "integrity": "sha512-qw53Uy2fDekKAzNhv8pkAWpIccIxyKQ3nQuClMgzDPdyeWg34ElIs4bDub9ZZup15fy+X//2gP8k12RJqNo4lA==", "license": "MIT", "dependencies": { "js-yaml": "^4.0.0" @@ -465,9 +486,9 @@ } }, "node_modules/@citation-js/plugin-zenodo": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@citation-js/plugin-zenodo/-/plugin-zenodo-0.6.1.tgz", - "integrity": "sha512-bUybENHoZqJ6gheUqgkumjI+mu+fA2bg6VoniDmZTb7Qng9iEpi+IWEAR26/vBE0gK0EWrJjczyDW3HCwrhvVw==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@citation-js/plugin-zenodo/-/plugin-zenodo-0.6.2.tgz", + "integrity": "sha512-3XQOO3u4WXY/7AWZyQ+9SuBzS8bYTlJ+NF1uCgrZO64g36nK5iIc5YV9cBl2TL2QhHF6S36nvAsXsj5fX9FeHw==", "license": "MIT", "dependencies": { "@citation-js/date": "^0.5.0", @@ -477,6 +498,297 @@ "node": ">=14.0.0" } }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz", + "integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.1.tgz", + "integrity": "sha512-uWDWFypNdQmz2y1LaNJzK7fL7TYKLeUAU0npEC685OKTF3KcQ2Vu3klIM78D7I6wGhktme0lh3CuQLv0ZCrD9Q==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-cpp": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@codemirror/lang-cpp/-/lang-cpp-6.0.3.tgz", + "integrity": "sha512-URM26M3vunFFn9/sm6rzqrBzDgfWuDixp85uTY49wKudToc2jTHUrKIGGKs+QWND+YLofNNZpxcNGRynFJfvgA==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/cpp": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-css": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", + "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.1.7" + } + }, + "node_modules/@codemirror/lang-go": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-go/-/lang-go-6.0.1.tgz", + "integrity": "sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/go": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.11", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.11.tgz", + "integrity": "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.12" + } + }, + "node_modules/@codemirror/lang-java": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-java/-/lang-java-6.0.2.tgz", + "integrity": "sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/java": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.4.tgz", + "integrity": "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-json": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.2.tgz", + "integrity": "sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/json": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-less": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-less/-/lang-less-6.0.2.tgz", + "integrity": "sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==", + "license": "MIT", + "dependencies": { + "@codemirror/lang-css": "^6.2.0", + "@codemirror/language": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-liquid": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-liquid/-/lang-liquid-6.3.1.tgz", + "integrity": "sha512-S/jE/D7iij2Pu70AC65ME6AYWxOOcX20cSJvaPgY5w7m2sfxsArAcUAuUgm/CZCVmqoi9KiOlS7gj/gyLipABw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.1" + } + }, + "node_modules/@codemirror/lang-markdown": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.0.tgz", + "integrity": "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.7.1", + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.3.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.2.1", + "@lezer/markdown": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-php": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-php/-/lang-php-6.0.2.tgz", + "integrity": "sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA==", + "license": "MIT", + "dependencies": { + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/php": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-python": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-python/-/lang-python-6.2.1.tgz", + "integrity": "sha512-IRjC8RUBhn9mGR9ywecNhB51yePWCGgvHfY1lWN/Mrp3cKuHr0isDKia+9HnvhiWNnMpbGhWrkhuWOc09exRyw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.3.2", + "@codemirror/language": "^6.8.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.2.1", + "@lezer/python": "^1.1.4" + } + }, + "node_modules/@codemirror/lang-rust": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-rust/-/lang-rust-6.0.2.tgz", + "integrity": "sha512-EZaGjCUegtiU7kSMvOfEZpaCReowEf3yNidYu7+vfuGTm9ow4mthAparY5hisJqOHmJowVH3Upu+eJlUji6qqA==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/rust": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-sass": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-sass/-/lang-sass-6.0.2.tgz", + "integrity": "sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==", + "license": "MIT", + "dependencies": { + "@codemirror/lang-css": "^6.2.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/sass": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-xml": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.1.0.tgz", + "integrity": "sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/xml": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-yaml": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-yaml/-/lang-yaml-6.1.2.tgz", + "integrity": "sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.2.0", + "@lezer/lr": "^1.0.0", + "@lezer/yaml": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.1.tgz", + "integrity": "sha512-Fa6xkSiuGKc8XC8Cn96T+TQHYj4ZZ7RdFmXA3i9xe/3hLHfwPZdM+dqfX0Cp0zQklBKhVD8Yzc8LS45rkqcwpQ==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.2", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.2.tgz", + "integrity": "sha512-sv3DylBiIyi+xKwRCJAAsBZZZWo82shJ/RTMymLabAdtbkV5cSKwWDeCgtUq3v8flTaXS2y1kKkICuRYtUswyQ==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.35.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.5.11", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.11.tgz", + "integrity": "sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.3.tgz", + "integrity": "sha512-MerMzJzlXogk2fxWFU1nKp36bY5orBG59HnPiz0G9nLRebWa0zXuv2siH6PLIHBvv5TH8CkQRqjBs0MlxCZu+A==", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.39.9", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.39.9.tgz", + "integrity": "sha512-miGSIfBOKC1s2oHoa80dp+BjtsL8sXsrgGlQnQuOcfvaedcQUtqddTmKbJSDkLl4mkgPvZyXuKic2HDNYcJLYA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.5.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, "node_modules/@csstools/css-parser-algorithms": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", @@ -1914,6 +2226,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, "license": "MIT", "engines": { "node": "20 || >=22" @@ -1923,6 +2236,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, "license": "MIT", "dependencies": { "@isaacs/balanced-match": "^4.0.1" @@ -2131,6 +2445,183 @@ "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", "license": "MIT" }, + "node_modules/@lezer/common": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.0.tgz", + "integrity": "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA==", + "license": "MIT" + }, + "node_modules/@lezer/cpp": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@lezer/cpp/-/cpp-1.1.4.tgz", + "integrity": "sha512-aYSdZyUueeTgnfXQntiGUqKNW5WujlAsIbbHzkfJDneSZoyjPg8ObmWG3bzDPVYMC/Kf4l43WJLCunPnYFfQ0g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/css": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.0.tgz", + "integrity": "sha512-pBL7hup88KbI7hXnZV3PQsn43DHy6TWyzuyk2AO9UyoXcDltvIdqWKE1dLL/45JVZ+YZkHe1WVHqO6wugZZWcw==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/go": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@lezer/go/-/go-1.0.1.tgz", + "integrity": "sha512-xToRsYxwsgJNHTgNdStpcvmbVuKxTapV0dM0wey1geMMRc9aggoVyKgzYp41D2/vVOx+Ii4hmE206kvxIXBVXQ==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/highlight": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", + "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.12.tgz", + "integrity": "sha512-RJ7eRWdaJe3bsiiLLHjCFT1JMk8m1YP9kaUbvu2rMLEoOnke9mcTVDyfOslsln0LtujdWespjJ39w6zo+RsQYw==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/java": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@lezer/java/-/java-1.1.3.tgz", + "integrity": "sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", + "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/json": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", + "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.5.tgz", + "integrity": "sha512-/YTRKP5yPPSo1xImYQk7AZZMAgap0kegzqCSYHjAL9x1AZ0ZQW+IpcEzMKagCsbTsLnVeWkxYrCNeXG8xEPrjg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/markdown": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.6.1.tgz", + "integrity": "sha512-72ah+Sml7lD8Wn7lnz9vwYmZBo9aQT+I2gjK/0epI+gjdwUbWw3MJ/ZBGEqG1UfrIauRqH37/c5mVHXeCTGXtA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@lezer/php": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@lezer/php/-/php-1.0.5.tgz", + "integrity": "sha512-W7asp9DhM6q0W6DYNwIkLSKOvxlXRrif+UXBMxzsJUuqmhE7oVU+gS3THO4S/Puh7Xzgm858UNaFi6dxTP8dJA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.1.0" + } + }, + "node_modules/@lezer/python": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@lezer/python/-/python-1.1.18.tgz", + "integrity": "sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/rust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@lezer/rust/-/rust-1.0.2.tgz", + "integrity": "sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/sass": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lezer/sass/-/sass-1.1.0.tgz", + "integrity": "sha512-3mMGdCTUZ/84ArHOuXWQr37pnf7f+Nw9ycPUeKX+wu19b7pSMcZGLbaXwvD2APMBDOGxPmpK/O6S1v1EvLoqgQ==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/xml": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.6.tgz", + "integrity": "sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/yaml": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@lezer/yaml/-/yaml-1.0.3.tgz", + "integrity": "sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.4.0" + } + }, "node_modules/@lit-labs/ssr-dom-shim": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.4.0.tgz", @@ -2146,6 +2637,12 @@ "@lit-labs/ssr-dom-shim": "^1.4.0" } }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "license": "MIT" + }, "node_modules/@mcaptcha/core-glue": { "version": "0.1.0-alpha-5", "resolved": "https://registry.npmjs.org/@mcaptcha/core-glue/-/core-glue-0.1.0-alpha-5.tgz", @@ -5937,6 +6434,12 @@ } } }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -7218,6 +7721,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { @@ -11265,20 +11769,41 @@ } }, "node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", + "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/minimatch/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/minimatch/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -11324,26 +11849,6 @@ "ufo": "^1.6.1" } }, - "node_modules/monaco-editor": { - "version": "0.52.2", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", - "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", - "license": "MIT", - "peer": true - }, - "node_modules/monaco-editor-webpack-plugin": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-7.1.1.tgz", - "integrity": "sha512-WxdbFHS3Wtz4V9hzhe/Xog5hQRSMxmDLkEEYZwqMDHgJlkZo00HVFZR0j5d0nKypjTUkkygH3dDSXERLG4757A==", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.2" - }, - "peerDependencies": { - "monaco-editor": ">= 0.31.0", - "webpack": "^4.5.0 || 5.x" - } - }, "node_modules/moo": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", @@ -13781,6 +14286,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "license": "MIT" + }, "node_modules/style-search": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", @@ -14081,9 +14592,9 @@ "dev": true }, "node_modules/svgo": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", - "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", "dev": true, "license": "MIT", "dependencies": { @@ -14093,7 +14604,7 @@ "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", - "sax": "^1.4.1" + "sax": "^1.5.0" }, "bin": { "svgo": "bin/svgo.js" @@ -14117,11 +14628,14 @@ } }, "node_modules/svgo/node_modules/sax": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", - "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", + "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", "dev": true, - "license": "BlueOak-1.0.0" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } }, "node_modules/swagger-ui-dist": { "version": "5.31.0", @@ -14253,9 +14767,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.15", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.15.tgz", - "integrity": "sha512-PGkOdpRFK+rb1TzVz+msVhw4YMRT9txLF4kRqvJhGhCM324xuR3REBSHALN+l+sAhKUmz0aotnjp5D+P83mLhQ==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", @@ -15292,6 +15806,12 @@ "vue": "^3.2.29" } }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, "node_modules/watchpack": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", @@ -15312,9 +15832,9 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.103.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.103.0.tgz", - "integrity": "sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==", + "version": "5.104.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", + "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "license": "MIT", "peer": true, "dependencies": { @@ -15326,10 +15846,10 @@ "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", - "browserslist": "^4.26.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.3", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.17.4", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -15340,7 +15860,7 @@ "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.11", + "terser-webpack-plugin": "^5.3.16", "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" }, @@ -15442,6 +15962,12 @@ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, + "node_modules/webpack/node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "license": "MIT" + }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -15465,9 +15991,9 @@ } }, "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", + "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", "license": "MIT", "engines": { "node": ">=10.13.0" diff --git a/package.json b/package.json index cee576d1ba..d2ad521db6 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,34 @@ "dependencies": { "@citation-js/core": "0.7.21", "@citation-js/plugin-bibtex": "0.7.21", - "@citation-js/plugin-software-formats": "0.6.1", + "@citation-js/plugin-software-formats": "0.6.2", + "@codemirror/autocomplete": "6.20.0", + "@codemirror/commands": "6.10.1", + "@codemirror/lang-cpp": "6.0.3", + "@codemirror/lang-css": "6.3.1", + "@codemirror/lang-go": "6.0.1", + "@codemirror/lang-html": "6.4.11", + "@codemirror/lang-java": "6.0.2", + "@codemirror/lang-javascript": "6.2.4", + "@codemirror/lang-json": "6.0.2", + "@codemirror/lang-less": "6.0.2", + "@codemirror/lang-liquid": "6.3.1", + "@codemirror/lang-markdown": "6.5.0", + "@codemirror/lang-php": "6.0.2", + "@codemirror/lang-python": "6.2.1", + "@codemirror/lang-rust": "6.0.2", + "@codemirror/lang-sass": "6.0.2", + "@codemirror/lang-xml": "6.1.0", + "@codemirror/lang-yaml": "6.1.2", + "@codemirror/language": "6.12.1", + "@codemirror/search": "6.5.11", + "@codemirror/state": "6.5.3", + "@codemirror/view": "6.39.9", "@github/markdown-toolbar-element": "2.2.3", "@github/quote-selection": "2.1.0", "@github/text-expander-element": "2.8.0", "@google/model-viewer": "4.1.0", + "@lezer/highlight": "1.2.1", "@mcaptcha/vanilla-glue": "0.1.0-alpha-3", "@primer/octicons": "19.14.0", "ansi_up": "6.0.5", @@ -33,9 +56,7 @@ "katex": "0.16.27", "mermaid": "11.12.2", "mini-css-extract-plugin": "2.9.3", - "minimatch": "10.1.1", - "monaco-editor": "0.52.2", - "monaco-editor-webpack-plugin": "7.1.1", + "minimatch": "10.2.3", "pdfobject": "2.3.0", "postcss": "8.5.6", "postcss-loader": "8.2.0", @@ -55,7 +76,7 @@ "vue-chartjs": "5.3.3", "vue-loader": "17.4.2", "vue3-calendar-heatmap": "2.0.5", - "webpack": "5.103.0", + "webpack": "5.104.1", "webpack-cli": "6.0.1", "wrap-ansi": "9.0.2" }, @@ -95,15 +116,13 @@ "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.0.1", - "svgo": "4.0.0", + "svgo": "4.0.1", "typescript": "5.9.3", "typescript-eslint": "8.48.0", "vite-string-plugin": "1.4.9", "vitest": "4.0.14" }, - "browserslist": [ - "defaults" - ], + "browserslist": ["defaults"], "scarfSettings": { "enabled": false } diff --git a/release-notes/10037.md b/release-notes/10037.md deleted file mode 100644 index f0019ef55b..0000000000 --- a/release-notes/10037.md +++ /dev/null @@ -1,6 +0,0 @@ -fix(api): fix dependency repo perms in Create/RemoveIssueDependency -fix(api): draft releases could be read before being published -fix: misconfigured security checks on tag delete web form -fix: incorrect logic in "Update PR" did not enforce head branch protection rules correctly -fix: issue owner can delete another user's comment's edit history on same issue -fix: tag protection rules can be bypassed during tag delete operation diff --git a/release-notes/11282.md b/release-notes/11282.md new file mode 100644 index 0000000000..be91c77bff --- /dev/null +++ b/release-notes/11282.md @@ -0,0 +1,3 @@ +fix: prevent panic when importing issues from GitLab +fix: prevent panic when importing releases with more than 4 release assets from GitLab +fix: correct re-mapping of merge-request numbers mentioned in GitLab comments diff --git a/release-notes/9840.md b/release-notes/9840.md deleted file mode 100644 index f9ebc4a25c..0000000000 --- a/release-notes/9840.md +++ /dev/null @@ -1,5 +0,0 @@ -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/675eb9b9e69bd287c28052ef40e34c30f3c6a00a) prevent commit API from leaking user's hidden email address on valid GPG signed commits -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/7be431da88acdedabb02d8e3881cdc18294e3ce8) prevent writing to out-of-repo symlink destinations while evaluating template repos -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/77cab5dbe29955c3e63470c27393fb676ea8f00b) prevent .forgejo/template from being out-of-repo content -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/9144f3e6b354cd7f7966e8c696b54ed8758c0661) return on error if an LFS token cannot be parsed - diff --git a/renovate.json b/renovate.json index 908c24e836..6d75cc303c 100644 --- a/renovate.json +++ b/renovate.json @@ -137,11 +137,6 @@ ], "automerge": true }, - { - "description": "Hold back on some package updates for a few days", - "matchPackageNames": ["monaco-editor"], - "minimumReleaseAge": "30 days" - }, { "description": "Disable indirect updates for stable branches", "matchBaseBranches": ["/^v\\d+\\.\\d+\\/forgejo$/"], diff --git a/routers/api/actions/runner/main_test.go b/routers/api/actions/runner/main_test.go index 112ebe3cb6..e061521e92 100644 --- a/routers/api/actions/runner/main_test.go +++ b/routers/api/actions/runner/main_test.go @@ -7,8 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/routers/api/actions/runner/runner.go b/routers/api/actions/runner/runner.go index 83a93cb1c9..bbf1f6989c 100644 --- a/routers/api/actions/runner/runner.go +++ b/routers/api/actions/runner/runner.go @@ -152,6 +152,7 @@ func (s *Service) FetchTask( latestVersion++ } + var additionalTasks []*runnerv1.Task if tasksVersion != latestVersion { // if the task version in request is not equal to the version in db, // it means there may still be some tasks not be assigned. @@ -161,11 +162,29 @@ func (s *Service) FetchTask( return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("pick task: %w", err)) } else if ok { task = t + + taskCapacity := req.Msg.GetTaskCapacity() + taskCapacity-- // remove 1 for the task already fetched as `task` + for taskCapacity > 0 { + if t, ok, err := actions_service.PickTask(ctx, runner); err != nil { + // Don't return an error to the client/runner -- we've already assigned one-or-more tasks to the runner + // and if we don't return them, they can't be picked up by another runner and will become zombie tasks. + // Log the error and return the tasks we've assigned so far. + log.Error("pick task failed: %v", err) + break + } else if ok { + additionalTasks = append(additionalTasks, t) + taskCapacity-- + } else { + break + } + } } } res := connect.NewResponse(&runnerv1.FetchTaskResponse{ - Task: task, - TasksVersion: latestVersion, + Task: task, + TasksVersion: latestVersion, + AdditionalTasks: additionalTasks, }) return res, nil } diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go index 47e582eb92..3b51ddc406 100644 --- a/routers/api/packages/api.go +++ b/routers/api/packages/api.go @@ -118,6 +118,7 @@ func verifyAuth(r *web.Route, authMethods []auth.Method) { ctx.Doer, err = authGroup.Verify(ctx.Req, ctx.Resp, ctx, ctx.Session) if err != nil { log.Info("Failed to verify user: %v", err) + container.APIUnauthorizedError(ctx) ctx.Error(http.StatusUnauthorized, "authGroup.Verify") return } diff --git a/routers/api/packages/container/container.go b/routers/api/packages/container/container.go index 873ce5c23a..373847b3ab 100644 --- a/routers/api/packages/container/container.go +++ b/routers/api/packages/container/container.go @@ -125,15 +125,16 @@ func apiErrorDefined(ctx *context.Context, err *namedError) { }) } -func apiUnauthorizedError(ctx *context.Context) { - ctx.Resp.Header().Add("WWW-Authenticate", `Bearer realm="`+setting.AppURL+`v2/token",service="container_registry",scope="*"`) +func APIUnauthorizedError(ctx *context.Context) { + ctx.Resp.Header().Set("WWW-Authenticate", `Bearer realm="`+setting.AppURL+`v2/token",service="container_registry",scope="*",`+ + `Basic realm="`+setting.AppURL+`v2",service="container_registry",scope="*"`) apiErrorDefined(ctx, errUnauthorized) } // ReqContainerAccess is a middleware which checks the current user valid (real user or ghost if anonymous access is enabled) func ReqContainerAccess(ctx *context.Context) { if ctx.Doer == nil || (setting.Service.RequireSignInView && ctx.Doer.IsGhost()) { - apiUnauthorizedError(ctx) + APIUnauthorizedError(ctx) } } @@ -158,7 +159,7 @@ func Authenticate(ctx *context.Context) { u := ctx.Doer if u == nil { if setting.Service.RequireSignInView { - apiUnauthorizedError(ctx) + APIUnauthorizedError(ctx) return } diff --git a/routers/api/v1/admin/runners.go b/routers/api/v1/admin/runners.go index 7c53a717a9..e459b947ff 100644 --- a/routers/api/v1/admin/runners.go +++ b/routers/api/v1/admin/runners.go @@ -14,7 +14,7 @@ import ( func GetRegistrationToken(ctx *context.APIContext) { // swagger:operation GET /admin/runners/registration-token admin adminGetRunnerRegistrationToken // --- - // summary: Get a global actions runner registration token + // summary: Get an global actions runner registration token // produces: // - application/json // parameters: @@ -44,81 +44,3 @@ func SearchActionRunJobs(ctx *context.APIContext) { // "$ref": "#/responses/forbidden" shared.GetActionRunJobs(ctx, 0, 0) } - -// CreateRegistrationToken returns the token to register global runners -func CreateRegistrationToken(ctx *context.APIContext) { - // swagger:operation POST /admin/actions/runners/registration-token admin adminCreateRunnerRegistrationToken - // --- - // summary: Get a global actions runner registration token - // produces: - // - application/json - // parameters: - // responses: - // "200": - // "$ref": "#/responses/RegistrationToken" - - shared.GetRegistrationToken(ctx, 0, 0) -} - -// ListRunners get all runners -func ListRunners(ctx *context.APIContext) { - // swagger:operation GET /admin/actions/runners admin getAdminRunners - // --- - // summary: Get all runners - // produces: - // - application/json - // responses: - // "200": - // "$ref": "#/definitions/ActionRunnersResponse" - // "400": - // "$ref": "#/responses/error" - // "404": - // "$ref": "#/responses/notFound" - shared.ListRunners(ctx, 0, 0) -} - -// GetRunner get a global runner -func GetRunner(ctx *context.APIContext) { - // swagger:operation GET /admin/actions/runners/{runner_id} admin getAdminRunner - // --- - // summary: Get a global runner - // produces: - // - application/json - // parameters: - // - name: runner_id - // in: path - // description: id of the runner - // type: string - // required: true - // responses: - // "200": - // "$ref": "#/definitions/ActionRunner" - // "400": - // "$ref": "#/responses/error" - // "404": - // "$ref": "#/responses/notFound" - shared.GetRunner(ctx, 0, 0, ctx.ParamsInt64("runner_id")) -} - -// DeleteRunner delete a global runner -func DeleteRunner(ctx *context.APIContext) { - // swagger:operation DELETE /admin/actions/runners/{runner_id} admin deleteAdminRunner - // --- - // summary: Delete a global runner - // produces: - // - application/json - // parameters: - // - name: runner_id - // in: path - // description: id of the runner - // type: string - // required: true - // responses: - // "204": - // description: runner has been deleted - // "400": - // "$ref": "#/responses/error" - // "404": - // "$ref": "#/responses/notFound" - shared.DeleteRunner(ctx, 0, 0, ctx.ParamsInt64("runner_id")) -} diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 1206d653c1..dc0e3390d1 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -856,11 +856,7 @@ func Routes() *web.Route { }) m.Group("/runners", func() { - m.Get("", reqToken(), reqChecker, act.ListRunners) m.Get("/registration-token", reqToken(), reqChecker, act.GetRegistrationToken) - m.Post("/registration-token", reqToken(), reqChecker, act.CreateRegistrationToken) - m.Get("/{runner_id}", reqToken(), reqChecker, act.GetRunner) - m.Delete("/{runner_id}", reqToken(), reqChecker, act.DeleteRunner) m.Get("/jobs", reqToken(), reqChecker, act.SearchActionRunJobs) }) }) @@ -1020,11 +1016,7 @@ func Routes() *web.Route { }) m.Group("/runners", func() { - m.Get("", reqToken(), user.ListRunners) m.Get("/registration-token", reqToken(), user.GetRegistrationToken) - m.Post("/registration-token", reqToken(), user.CreateRegistrationToken) - m.Get("/{runner_id}", reqToken(), user.GetRunner) - m.Delete("/{runner_id}", reqToken(), user.DeleteRunner) m.Get("/jobs", reqToken(), user.SearchActionRunJobs) }) }) @@ -1702,12 +1694,6 @@ func Routes() *web.Route { Patch(bind(api.EditHookOption{}), admin.EditHook). Delete(admin.DeleteHook) }) - m.Group("/actions/runners", func() { - m.Get("", admin.ListRunners) - m.Post("/registration-token", admin.CreateRegistrationToken) - m.Get("/{runner_id}", admin.GetRunner) - m.Delete("/{runner_id}", admin.DeleteRunner) - }) m.Group("/runners", func() { m.Get("/registration-token", admin.GetRegistrationToken) m.Get("/jobs", admin.SearchActionRunJobs) diff --git a/routers/api/v1/org/action.go b/routers/api/v1/org/action.go index b3fcbca6b1..8fd8b1b985 100644 --- a/routers/api/v1/org/action.go +++ b/routers/api/v1/org/action.go @@ -214,27 +214,6 @@ func (Action) SearchActionRunJobs(ctx *context.APIContext) { shared.GetActionRunJobs(ctx, ctx.Org.Organization.ID, 0) } -// https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#create-a-registration-token-for-an-organization -// CreateRegistrationToken returns the token to register org runners -func (Action) CreateRegistrationToken(ctx *context.APIContext) { - // swagger:operation POST /orgs/{org}/actions/runners/registration-token organization orgCreateRunnerRegistrationToken - // --- - // summary: Get an organization's actions runner registration token - // produces: - // - application/json - // parameters: - // - name: org - // in: path - // description: name of the organization - // type: string - // required: true - // responses: - // "200": - // "$ref": "#/responses/RegistrationToken" - - shared.GetRegistrationToken(ctx, ctx.Org.Organization.ID, 0) -} - // ListVariables list org-level variables func (Action) ListVariables(ctx *context.APIContext) { // swagger:operation GET /orgs/{org}/actions/variables organization getOrgVariablesList @@ -287,85 +266,6 @@ func (Action) ListVariables(ctx *context.APIContext) { ctx.JSON(http.StatusOK, variables) } -// ListRunners get org-level runners -func (Action) ListRunners(ctx *context.APIContext) { - // swagger:operation GET /orgs/{org}/actions/runners organization getOrgRunners - // --- - // summary: Get org-level runners - // produces: - // - application/json - // parameters: - // - name: org - // in: path - // description: name of the organization - // type: string - // required: true - // responses: - // "200": - // "$ref": "#/definitions/ActionRunnersResponse" - // "400": - // "$ref": "#/responses/error" - // "404": - // "$ref": "#/responses/notFound" - shared.ListRunners(ctx, ctx.Org.Organization.ID, 0) -} - -// GetRunner get an org-level runner -func (Action) GetRunner(ctx *context.APIContext) { - // swagger:operation GET /orgs/{org}/actions/runners/{runner_id} organization getOrgRunner - // --- - // summary: Get an org-level runner - // produces: - // - application/json - // parameters: - // - name: org - // in: path - // description: name of the organization - // type: string - // required: true - // - name: runner_id - // in: path - // description: id of the runner - // type: string - // required: true - // responses: - // "200": - // "$ref": "#/definitions/ActionRunner" - // "400": - // "$ref": "#/responses/error" - // "404": - // "$ref": "#/responses/notFound" - shared.GetRunner(ctx, ctx.Org.Organization.ID, 0, ctx.ParamsInt64("runner_id")) -} - -// DeleteRunner delete an org-level runner -func (Action) DeleteRunner(ctx *context.APIContext) { - // swagger:operation DELETE /orgs/{org}/actions/runners/{runner_id} organization deleteOrgRunner - // --- - // summary: Delete an org-level runner - // produces: - // - application/json - // parameters: - // - name: org - // in: path - // description: name of the organization - // type: string - // required: true - // - name: runner_id - // in: path - // description: id of the runner - // type: string - // required: true - // responses: - // "204": - // description: runner has been deleted - // "400": - // "$ref": "#/responses/error" - // "404": - // "$ref": "#/responses/notFound" - shared.DeleteRunner(ctx, ctx.Org.Organization.ID, 0, ctx.ParamsInt64("runner_id")) -} - // GetVariable gives organization's variable func (Action) GetVariable(ctx *context.APIContext) { // swagger:operation GET /orgs/{org}/actions/variables/{variablename} organization getOrgVariable diff --git a/routers/api/v1/repo/action.go b/routers/api/v1/repo/action.go index 9085ee8e70..40aab5e449 100644 --- a/routers/api/v1/repo/action.go +++ b/routers/api/v1/repo/action.go @@ -505,125 +505,6 @@ func (Action) GetRegistrationToken(ctx *context.APIContext) { shared.GetRegistrationToken(ctx, 0, ctx.Repo.Repository.ID) } -// CreateRegistrationToken returns the token to register repo runners -func (Action) CreateRegistrationToken(ctx *context.APIContext) { - // swagger:operation POST /repos/{owner}/{repo}/actions/runners/registration-token repository repoCreateRunnerRegistrationToken - // --- - // summary: Get a repository's actions runner registration token - // produces: - // - application/json - // parameters: - // - name: owner - // in: path - // description: owner of the repo - // type: string - // required: true - // - name: repo - // in: path - // description: name of the repo - // type: string - // required: true - // responses: - // "200": - // "$ref": "#/responses/RegistrationToken" - - shared.GetRegistrationToken(ctx, 0, ctx.Repo.Repository.ID) -} - -// ListRunners get repo-level runners -func (Action) ListRunners(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/actions/runners repository getRepoRunners - // --- - // summary: Get repo-level runners - // produces: - // - application/json - // parameters: - // - name: owner - // in: path - // description: owner of the repo - // type: string - // required: true - // - name: repo - // in: path - // description: name of the repo - // type: string - // required: true - // responses: - // "200": - // "$ref": "#/definitions/ActionRunnersResponse" - // "400": - // "$ref": "#/responses/error" - // "404": - // "$ref": "#/responses/notFound" - shared.ListRunners(ctx, 0, ctx.Repo.Repository.ID) -} - -// GetRunner get a repo-level runner -func (Action) GetRunner(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/actions/runners/{runner_id} repository getRepoRunner - // --- - // summary: Get a repo-level runner - // produces: - // - application/json - // parameters: - // - name: owner - // in: path - // description: owner of the repo - // type: string - // required: true - // - name: repo - // in: path - // description: name of the repo - // type: string - // required: true - // - name: runner_id - // in: path - // description: id of the runner - // type: string - // required: true - // responses: - // "200": - // "$ref": "#/definitions/ActionRunner" - // "400": - // "$ref": "#/responses/error" - // "404": - // "$ref": "#/responses/notFound" - shared.GetRunner(ctx, 0, ctx.Repo.Repository.ID, ctx.ParamsInt64("runner_id")) -} - -// DeleteRunner delete a repo-level runner -func (Action) DeleteRunner(ctx *context.APIContext) { - // swagger:operation DELETE /repos/{owner}/{repo}/actions/runners/{runner_id} repository deleteRepoRunner - // --- - // summary: Delete a repo-level runner - // produces: - // - application/json - // parameters: - // - name: owner - // in: path - // description: owner of the repo - // type: string - // required: true - // - name: repo - // in: path - // description: name of the repo - // type: string - // required: true - // - name: runner_id - // in: path - // description: id of the runner - // type: string - // required: true - // responses: - // "204": - // description: runner has been deleted - // "400": - // "$ref": "#/responses/error" - // "404": - // "$ref": "#/responses/notFound" - shared.DeleteRunner(ctx, 0, ctx.Repo.Repository.ID, ctx.ParamsInt64("runner_id")) -} - // SearchActionRunJobs return a list of actions jobs filtered by the provided parameters func (Action) SearchActionRunJobs(ctx *context.APIContext) { // swagger:operation GET /repos/{owner}/{repo}/actions/runners/jobs repository repoSearchRunJobs diff --git a/routers/api/v1/repo/hook.go b/routers/api/v1/repo/hook.go index 5d277604b8..a0e28f0685 100644 --- a/routers/api/v1/repo/hook.go +++ b/routers/api/v1/repo/hook.go @@ -15,7 +15,6 @@ import ( "forgejo.org/modules/setting" api "forgejo.org/modules/structs" "forgejo.org/modules/web" - webhook_module "forgejo.org/modules/webhook" "forgejo.org/routers/api/v1/utils" "forgejo.org/services/context" "forgejo.org/services/convert" @@ -177,7 +176,7 @@ func TestHook(ctx *context.APIContext) { commit := convert.ToPayloadCommit(ctx, ctx.Repo.Repository, ctx.Repo.Commit) commitID := ctx.Repo.Commit.ID.String() - if err := webhook_service.PrepareWebhook(ctx, hook, webhook_module.HookEventPush, &api.PushPayload{ + if err := webhook_service.PrepareTestWebhook(ctx, hook, &api.PushPayload{ Ref: ref, Before: commitID, After: commitID, diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index 778a1c17b1..5ae86c5925 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -14,6 +14,7 @@ import ( "forgejo.org/models" activities_model "forgejo.org/models/activities" + "forgejo.org/models/db" git_model "forgejo.org/models/git" issues_model "forgejo.org/models/issues" access_model "forgejo.org/models/perm/access" @@ -1373,33 +1374,18 @@ func CancelScheduledAutoMerge(ctx *context.APIContext) { return } - exist, autoMerge, err := pull_model.GetScheduledMergeByPullID(ctx, pull.ID) - if err != nil { - ctx.InternalServerError(err) - return - } - if !exist { - ctx.NotFound() - return - } - - if ctx.Doer.ID != autoMerge.DoerID { - allowed, err := access_model.IsUserRepoAdmin(ctx, ctx.Repo.Repository, ctx.Doer) - if err != nil { - ctx.InternalServerError(err) - return - } - if !allowed { + if err := automerge.RemoveScheduledAutoMerge(ctx, ctx.Doer, pull, ctx.Repo.Permission); err != nil { + switch { + case errors.Is(err, util.ErrPermissionDenied): ctx.Error(http.StatusForbidden, "No permission to cancel", "user has no permission to cancel the scheduled auto merge") - return + case db.IsErrNotExist(err): + ctx.NotFound() + default: + ctx.InternalServerError(err) } + return } - - if err := automerge.RemoveScheduledAutoMerge(ctx, ctx.Doer, pull); err != nil { - ctx.InternalServerError(err) - } else { - ctx.Status(http.StatusNoContent) - } + ctx.Status(http.StatusNoContent) } // GetPullRequestCommits gets all commits associated with a given PR diff --git a/routers/api/v1/repo/release.go b/routers/api/v1/repo/release.go index cacdcfefba..0f48c8427e 100644 --- a/routers/api/v1/repo/release.go +++ b/routers/api/v1/repo/release.go @@ -230,6 +230,10 @@ func CreateRelease(ctx *context.APIContext) { ctx.Error(http.StatusUnprocessableEntity, "RepoIsEmpty", errors.New("repo is empty")) return } + title := form.Title + if len(title) == 0 { + title = form.TagName + } rel, err := repo_model.GetRelease(ctx, ctx.Repo.Repository.ID, form.TagName) if err != nil { if !repo_model.IsErrReleaseNotExist(err) { @@ -246,7 +250,7 @@ func CreateRelease(ctx *context.APIContext) { Publisher: ctx.Doer, TagName: form.TagName, Target: form.Target, - Title: form.Title, + Title: title, Note: form.Note, IsDraft: form.IsDraft, IsPrerelease: form.IsPrerelease, @@ -272,7 +276,7 @@ func CreateRelease(ctx *context.APIContext) { return } - rel.Title = form.Title + rel.Title = title rel.Note = form.Note rel.IsDraft = form.IsDraft rel.IsPrerelease = form.IsPrerelease diff --git a/routers/api/v1/shared/runners.go b/routers/api/v1/shared/runners.go index feb47dacaa..3e10dd85af 100644 --- a/routers/api/v1/shared/runners.go +++ b/routers/api/v1/shared/runners.go @@ -5,7 +5,6 @@ package shared import ( "errors" - "fmt" "net/http" "strings" @@ -13,9 +12,7 @@ import ( "forgejo.org/models/db" "forgejo.org/modules/structs" "forgejo.org/modules/util" - "forgejo.org/routers/api/v1/utils" "forgejo.org/services/context" - "forgejo.org/services/convert" ) // RegistrationToken is a string used to register a runner with a server @@ -75,95 +72,3 @@ func fromRunJobModelToResponse(job []*actions_model.ActionRunJob, labels []strin } return res } - -// ListRunners lists runners for api route validated ownerID and repoID -// ownerID == 0 and repoID == 0 means all runners including global runners, does not appear in sql where clause -// ownerID == 0 and repoID != 0 means all runners for the given repo -// ownerID != 0 and repoID == 0 means all runners for the given user/org -// ownerID != 0 and repoID != 0 undefined behavior -// Access rights are checked at the API route level -func ListRunners(ctx *context.APIContext, ownerID, repoID int64) { - if ownerID != 0 && repoID != 0 { - ctx.Error(http.StatusUnprocessableEntity, "", fmt.Errorf("ownerID and repoID should not be both set: %d and %d", ownerID, repoID)) - return - } - runners, total, err := db.FindAndCount[actions_model.ActionRunner](ctx, &actions_model.FindRunnerOptions{ - OwnerID: ownerID, - RepoID: repoID, - ListOptions: utils.GetListOptions(ctx), - }) - if err != nil { - ctx.Error(http.StatusInternalServerError, "FindCountRunners", map[string]string{}) - return - } - - res := new(structs.ActionRunnersResponse) - res.TotalCount = total - - res.Entries = make([]*structs.ActionRunner, len(runners)) - for i, runner := range runners { - res.Entries[i] = convert.ToActionRunner(ctx, runner) - } - - ctx.JSON(http.StatusOK, &res) -} - -// GetRunner get the runner for api route validated ownerID and repoID -// ownerID == 0 and repoID == 0 means any runner including global runners -// ownerID == 0 and repoID != 0 means any runner for the given repo -// ownerID != 0 and repoID == 0 means any runner for the given user/org -// ownerID != 0 and repoID != 0 undefined behavior -// Access rights are checked at the API route level -func GetRunner(ctx *context.APIContext, ownerID, repoID, runnerID int64) { - if ownerID != 0 && repoID != 0 { - ctx.Error(http.StatusUnprocessableEntity, "", fmt.Errorf("ownerID and repoID should not be both set: %d and %d", ownerID, repoID)) - return - } - runner, err := actions_model.GetRunnerByID(ctx, runnerID) - if err != nil { - if errors.Is(err, util.ErrNotExist) { - ctx.Error(http.StatusNotFound, "GetRunnerNotFound", err) - } else { - ctx.Error(http.StatusInternalServerError, "GetRunnerFailed", err) - } - return - } - if !runner.Editable(ownerID, repoID) { - ctx.Error(http.StatusNotFound, "RunnerEdit", "No permission to get this runner") - return - } - ctx.JSON(http.StatusOK, convert.ToActionRunner(ctx, runner)) -} - -// DeleteRunner deletes the runner for api route validated ownerID and repoID -// ownerID == 0 and repoID == 0 means any runner including global runners -// ownerID == 0 and repoID != 0 means any runner for the given repo -// ownerID != 0 and repoID == 0 means any runner for the given user/org -// ownerID != 0 and repoID != 0 undefined behavior -// Access rights are checked at the API route level -func DeleteRunner(ctx *context.APIContext, ownerID, repoID, runnerID int64) { - if ownerID != 0 && repoID != 0 { - ctx.Error(http.StatusUnprocessableEntity, "", fmt.Errorf("ownerID and repoID should not be both set: %d and %d", ownerID, repoID)) - return - } - runner, err := actions_model.GetRunnerByID(ctx, runnerID) - if err != nil { - if errors.Is(err, util.ErrNotExist) { - ctx.Error(http.StatusNotFound, "DeleteRunnerNotFound", err) - } else { - ctx.Error(http.StatusInternalServerError, "DeleteRunnerFailed", err) - } - return - } - if !runner.Editable(ownerID, repoID) { - ctx.Error(http.StatusNotFound, "EditRunner", "No permission to delete this runner") - return - } - - err = actions_model.DeleteRunner(ctx, runner) - if err != nil { - ctx.InternalServerError(err) - return - } - ctx.Status(http.StatusNoContent) -} diff --git a/routers/api/v1/swagger/action.go b/routers/api/v1/swagger/action.go index cf853c986f..910c265150 100644 --- a/routers/api/v1/swagger/action.go +++ b/routers/api/v1/swagger/action.go @@ -56,17 +56,3 @@ type swaggerRegistrationToken struct { // in: body Body shared.RegistrationToken `json:"body"` } - -// ActionRunner represents a Runner -// swagger:response ActionRunner -type swaggerActionRunner struct { - // in: body - Body api.ActionRunner `json:"body"` -} - -// ActionRunnersResponse returns Runners -// swagger:response ActionRunnersResponse -type swaggerActionRunnerResponse struct { - // in: body - Body api.ActionRunnersResponse `json:"body"` -} diff --git a/routers/api/v1/user/runners.go b/routers/api/v1/user/runners.go index 2cfdd8a03a..579e3eb932 100644 --- a/routers/api/v1/user/runners.go +++ b/routers/api/v1/user/runners.go @@ -50,89 +50,3 @@ func SearchActionRunJobs(ctx *context.APIContext) { // "$ref": "#/responses/forbidden" shared.GetActionRunJobs(ctx, ctx.Doer.ID, 0) } - -// CreateRegistrationToken returns the token to register user runners -func CreateRegistrationToken(ctx *context.APIContext) { - // swagger:operation POST /user/actions/runners/registration-token user userCreateRunnerRegistrationToken - // --- - // summary: Get an user's actions runner registration token - // produces: - // - application/json - // parameters: - // responses: - // "200": - // "$ref": "#/responses/RegistrationToken" - // "401": - // "$ref": "#/responses/unauthorized" - - shared.GetRegistrationToken(ctx, ctx.Doer.ID, 0) -} - -// ListRunners get user-level runners -func ListRunners(ctx *context.APIContext) { - // swagger:operation GET /user/actions/runners user getUserRunners - // --- - // summary: Get user-level runners - // produces: - // - application/json - // responses: - // "200": - // "$ref": "#/responses/ActionRunnersResponse" - // "400": - // "$ref": "#/responses/error" - // "401": - // "$ref": "#/responses/unauthorized" - // "404": - // "$ref": "#/responses/notFound" - shared.ListRunners(ctx, ctx.Doer.ID, 0) -} - -// GetRunner get an user-level runner -func GetRunner(ctx *context.APIContext) { - // swagger:operation GET /user/actions/runners/{runner_id} user getUserRunner - // --- - // summary: Get an user-level runner - // produces: - // - application/json - // parameters: - // - name: runner_id - // in: path - // description: id of the runner - // type: string - // required: true - // responses: - // "200": - // "$ref": "#/responses/ActionRunner" - // "400": - // "$ref": "#/responses/error" - // "401": - // "$ref": "#/responses/unauthorized" - // "404": - // "$ref": "#/responses/notFound" - shared.GetRunner(ctx, ctx.Doer.ID, 0, ctx.ParamsInt64("runner_id")) -} - -// DeleteRunner delete an user-level runner -func DeleteRunner(ctx *context.APIContext) { - // swagger:operation DELETE /user/actions/runners/{runner_id} user deleteUserRunner - // --- - // summary: Delete an user-level runner - // produces: - // - application/json - // parameters: - // - name: runner_id - // in: path - // description: id of the runner - // type: string - // required: true - // responses: - // "204": - // description: runner has been deleted - // "400": - // "$ref": "#/responses/error" - // "401": - // "$ref": "#/responses/unauthorized" - // "404": - // "$ref": "#/responses/notFound" - shared.DeleteRunner(ctx, ctx.Doer.ID, 0, ctx.ParamsInt64("runner_id")) -} diff --git a/routers/init.go b/routers/init.go index 6313d9a3ad..4fd708c47b 100644 --- a/routers/init.go +++ b/routers/init.go @@ -9,7 +9,6 @@ import ( "runtime" "forgejo.org/models" - asymkey_model "forgejo.org/models/asymkey" auth_model "forgejo.org/models/auth" "forgejo.org/modules/cache" "forgejo.org/modules/eventsource" @@ -95,10 +94,6 @@ func syncAppConfForGit(ctx context.Context) error { if updated { log.Info("re-sync repository hooks ...") mustInitCtx(ctx, repo_service.SyncRepositoryHooks) - - log.Info("re-write ssh public keys ...") - mustInitCtx(ctx, asymkey_model.RewriteAllPublicKeys) - return system.AppState.Set(ctx, runtimeState) } return nil diff --git a/routers/install/install.go b/routers/install/install.go index 63a3f965f4..243f4a8f19 100644 --- a/routers/install/install.go +++ b/routers/install/install.go @@ -15,6 +15,7 @@ import ( "strings" "time" + "forgejo.org/models/asymkey" "forgejo.org/models/db" db_install "forgejo.org/models/db/install" "forgejo.org/models/gitea_migrations" @@ -403,6 +404,25 @@ func SubmitInstall(ctx *context.Context) { } else { cfg.Section("server").Key("DISABLE_SSH").SetValue("false") cfg.Section("server").Key("SSH_PORT").SetValue(fmt.Sprint(form.SSHPort)) + + sshKeyErrors, err := asymkey.InspectPublicKeys(ctx) + if err != nil { + ctx.RenderWithErr(ctx.Tr("install.ssh_authorized_keys_inspection_error", err), tplInstall, &form) + return + } + + var authorizedKeysWillCauseFatalError bool + for _, finding := range sshKeyErrors { + if finding.Type == asymkey.InspectionResultUnexpectedKey { + // Any single finding of this type would cause `ssh.Init` to have a fatal error on Forgejo startup, so + // let's note it here while the install page is still usable and allow users to deal with it. + authorizedKeysWillCauseFatalError = true + } + } + if authorizedKeysWillCauseFatalError { + ctx.RenderWithErr(ctx.Tr("install.ssh_authorized_keys_unexpected_key", filepath.Join(setting.SSH.RootPath, "authorized_keys")), tplInstall, &form) + return + } } if form.LFSRootPath != "" { diff --git a/routers/web/auth/oauth.go b/routers/web/auth/oauth.go index f44a102a49..9099aedb44 100644 --- a/routers/web/auth/oauth.go +++ b/routers/web/auth/oauth.go @@ -479,8 +479,7 @@ func AuthorizeOAuth(ctx *context.Context) { // pkce support switch form.CodeChallengeMethod { - case "S256": - case "plain": + case "S256", "plain": if err := ctx.Session.Set("CodeChallengeMethod", form.CodeChallengeMethod); err != nil { handleAuthorizeError(ctx, AuthorizeError{ ErrorCode: ErrorCodeServerError, diff --git a/routers/web/feed/convert.go b/routers/web/feed/convert.go index 7b09c92ee5..c492b9c586 100644 --- a/routers/web/feed/convert.go +++ b/routers/web/feed/convert.go @@ -224,7 +224,7 @@ func feedActionsToFeedItems(ctx *context.Context, actions activities_model.Actio } if push.Len > 1 { - link = &feeds.Link{Href: fmt.Sprintf("%s/%s", setting.AppSubURL, push.CompareURL)} + link = &feeds.Link{Href: setting.AppURL + push.CompareURL} } else if push.Len == 1 { link = &feeds.Link{Href: fmt.Sprintf("%s/commit/%s", act.GetRepoAbsoluteLink(ctx), push.Commits[0].Sha1)} } diff --git a/routers/web/org/projects.go b/routers/web/org/projects.go index 66c560f55e..a492d85d84 100644 --- a/routers/web/org/projects.go +++ b/routers/web/org/projects.go @@ -218,8 +218,13 @@ func ChangeProjectStatus(ctx *context.Context) { } id := ctx.ParamsInt64(":id") - if err := project_model.ChangeProjectStatusByRepoIDAndID(ctx, 0, id, toClose); err != nil { - ctx.NotFoundOrServerError("ChangeProjectStatusByRepoIDAndID", project_model.IsErrProjectNotExist, err) + project, err := project_model.GetProjectForUserByID(ctx, ctx.ContextUser.ID, id) + if err != nil { + ctx.NotFoundOrServerError("GetProjectForUserByID", project_model.IsErrProjectNotExist, err) + return + } + if err := project_model.ChangeProjectStatus(ctx, project, toClose); err != nil { + ctx.ServerError("ChangeProjectStatus", err) return } ctx.JSONRedirect(project_model.ProjectLinkForOrg(ctx.ContextUser, id)) diff --git a/routers/web/repo/actions/view.go b/routers/web/repo/actions/view.go index 9b36f7b8cb..68466ee848 100644 --- a/routers/web/repo/actions/view.go +++ b/routers/web/repo/actions/view.go @@ -282,7 +282,6 @@ func getViewResponse(ctx *app_context.Context, req *ViewRequest, runIndex, jobIn resp.State.Run.Title = run.Title resp.State.Run.TitleHTML = templates.RenderCommitMessage(ctx, run.Title, metas) resp.State.Run.Link = run.Link() - resp.State.Run.CanCancel = !run.Status.IsDone() && ctx.Repo.CanWrite(unit.TypeActions) resp.State.Run.CanApprove = run.NeedApproval && ctx.Repo.CanWrite(unit.TypeActions) resp.State.Run.CanRerun = run.Status.IsDone() && ctx.Repo.CanWrite(unit.TypeActions) resp.State.Run.CanDeleteArtifact = run.Status.IsDone() && ctx.Repo.CanWrite(unit.TypeActions) @@ -310,6 +309,7 @@ func getViewResponse(ctx *app_context.Context, req *ViewRequest, runIndex, jobIn }) } resp.State.Run.Done = done + resp.State.Run.CanCancel = !done && ctx.Repo.CanWrite(unit.TypeActions) pusher := ViewUser{ DisplayName: run.TriggerUser.GetDisplayName(), diff --git a/routers/web/repo/actions/view_test.go b/routers/web/repo/actions/view_test.go index 61579b3208..48ebdf4cdc 100644 --- a/routers/web/repo/actions/view_test.go +++ b/routers/web/repo/actions/view_test.go @@ -382,6 +382,55 @@ func TestActionsViewViewPost(t *testing.T) { } } +func TestActionsViewCancelableUntilAllJobsFinished(t *testing.T) { + unittest.PrepareTestEnv(t) + + tests := []struct { + name string + runIndex int64 + assert func(*testing.T, *ViewResponse) + }{ + { + name: "failed and running", + runIndex: 191, + assert: func(t *testing.T, actual *ViewResponse) { + assert.Equal(t, "failure", actual.State.Run.Jobs[0].Status) + assert.Equal(t, "running", actual.State.Run.Jobs[1].Status) + assert.True(t, actual.State.Run.CanCancel) + }, + }, + { + name: "failed and success", + runIndex: 192, + assert: func(t *testing.T, actual *ViewResponse) { + assert.Equal(t, "failure", actual.State.Run.Jobs[0].Status) + assert.Equal(t, "success", actual.State.Run.Jobs[1].Status) + assert.False(t, actual.State.Run.CanCancel) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx, resp := contexttest.MockContext(t, "user2/repo1/actions/runs/0") + contexttest.LoadUser(t, ctx, 1) + contexttest.LoadRepo(t, ctx, 4) + ctx.SetParams(":run", fmt.Sprintf("%d", tt.runIndex)) + ctx.SetParams(":attempt", fmt.Sprintf("%d", 0)) + web.SetForm(ctx, &ViewRequest{}) + + ViewPost(ctx) + require.Equal(t, http.StatusOK, resp.Result().StatusCode, "failure in ViewPost(): %q", resp.Body.String()) + + var actual ViewResponse + err := json.Unmarshal(resp.Body.Bytes(), &actual) + require.NoError(t, err) + + tt.assert(t, &actual) + }) + } +} + func TestActionsViewRedirectToLatestAttempt(t *testing.T) { unittest.PrepareTestEnv(t) diff --git a/routers/web/repo/card.go b/routers/web/repo/card.go index c8bab8cc49..dd0cedae2d 100644 --- a/routers/web/repo/card.go +++ b/routers/web/repo/card.go @@ -152,7 +152,13 @@ func drawRepoSummaryCard(ctx *context.Context, repo *repo_model.Repository) (*ca } issueDescription.SetMargin(10) - _, err = issueDescription.DrawText(repo.Description, color.Gray{128}, 36, card.Top, card.Left) + // Replace new lines with spaces to match repo description in-app rendering + issueDescriptionText := strings.NewReplacer( + "\r\n", " ", + "\r", " ", + "\n", " ", + ).Replace(repo.Description) + _, err = issueDescription.DrawText(issueDescriptionText, color.Gray{128}, 36, card.Top, card.Left) if err != nil { return nil, err } diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index df61ef0daf..44e8e88596 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -3670,7 +3670,7 @@ func updateAttachments(ctx *context.Context, item any, files []string) error { if len(files) > 0 { switch content := item.(type) { case *issues_model.Issue: - err = issues_model.UpdateIssueAttachments(ctx, content.ID, files) + err = issues_model.UpdateIssueAttachments(ctx, content, files) case *issues_model.Comment: err = content.UpdateAttachments(ctx, files) default: @@ -3767,7 +3767,7 @@ func PullPosters(ctx *context.Context) { func issuePosters(ctx *context.Context, isPullList bool) { repo := ctx.Repo.Repository search := strings.TrimSpace(ctx.FormString("q")) - posters, err := repo_model.GetIssuePostersWithSearch(ctx, repo, isPullList, search, setting.UI.DefaultShowFullName) + posters, err := repo_model.GetIssuePostersWithSearch(ctx, repo, isPullList, search) if err != nil { ctx.JSON(http.StatusInternalServerError, err) return diff --git a/routers/web/repo/projects.go b/routers/web/repo/projects.go index ecc1cc89d9..e3e9ce0eb7 100644 --- a/routers/web/repo/projects.go +++ b/routers/web/repo/projects.go @@ -192,8 +192,13 @@ func ChangeProjectStatus(ctx *context.Context) { } id := ctx.ParamsInt64(":id") - if err := project_model.ChangeProjectStatusByRepoIDAndID(ctx, ctx.Repo.Repository.ID, id, toClose); err != nil { - ctx.NotFoundOrServerError("ChangeProjectStatusByRepoIDAndID", project_model.IsErrProjectNotExist, err) + project, err := project_model.GetProjectForRepoByID(ctx, ctx.Repo.Repository.ID, id) + if err != nil { + ctx.NotFoundOrServerError("GetProjectForRepoByID", project_model.IsErrProjectNotExist, err) + return + } + if err := project_model.ChangeProjectStatus(ctx, project, toClose); err != nil { + ctx.ServerError("ChangeProjectStatus", err) return } ctx.JSONRedirect(project_model.ProjectLinkForRepo(ctx.Repo.Repository, id)) diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index 69710824a4..781a001fba 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -1538,17 +1538,22 @@ func CancelAutoMergePullRequest(ctx *context.Context) { return } - if err := automerge.RemoveScheduledAutoMerge(ctx, ctx.Doer, issue.PullRequest); err != nil { - if db.IsErrNotExist(err) { + if err := automerge.RemoveScheduledAutoMerge(ctx, ctx.Doer, issue.PullRequest, ctx.Repo.Permission); err != nil { + switch { + case errors.Is(err, util.ErrPermissionDenied): + ctx.Flash.Error(ctx.Tr("repo.pulls.auto_merge.no_permission")) + ctx.Redirect(issue.HTMLURL()) + case db.IsErrNotExist(err): ctx.Flash.Error(ctx.Tr("repo.pulls.auto_merge_not_scheduled")) - ctx.Redirect(fmt.Sprintf("%s/pulls/%d", ctx.Repo.RepoLink, issue.Index)) - return + ctx.Redirect(issue.HTMLURL()) + default: + ctx.ServerError("RemoveScheduledAutoMerge", err) } - ctx.ServerError("RemoveScheduledAutoMerge", err) return } + ctx.Flash.Success(ctx.Tr("repo.pulls.auto_merge_canceled_schedule")) - ctx.Redirect(fmt.Sprintf("%s/pulls/%d", ctx.Repo.RepoLink, issue.Index)) + ctx.Redirect(issue.HTMLURL()) } func stopTimerIfAvailable(ctx *context.Context, user *user_model.User, issue *issues_model.Issue) error { diff --git a/routers/web/repo/search.go b/routers/web/repo/search.go index c3b4d07fa0..11b6c3b218 100644 --- a/routers/web/repo/search.go +++ b/routers/web/repo/search.go @@ -69,8 +69,9 @@ func Search(ctx *context.Context) { mode := ExactSearchMode if modeStr := ctx.FormString("mode"); len(modeStr) > 0 { mode = searchModeFromString(modeStr) - } else if ctx.FormOptionalBool("fuzzy").ValueOrDefault(true) { // for backward compatibility in links - mode = UnionSearchMode + } else if ctx.FormOptionalBool("fuzzy").ValueOrDefault(true) && + setting.Indexer.RepoIndexerEnableFuzzy { // for backward compatibility in links + mode = FuzzySearchMode } ctx.Data["Keyword"] = keyword @@ -85,6 +86,11 @@ func Search(ctx *context.Context) { } if keyword == "" { + if setting.Indexer.RepoIndexerEnabled { + ctx.Data["CodeSearchMode"] = mode.ToIndexer().String() + } else { + ctx.Data["CodeSearchMode"] = mode.ToGitGrep().String() + } ctx.HTML(http.StatusOK, tplSearch) return } diff --git a/routers/web/repo/setting/avatar.go b/routers/web/repo/setting/avatar.go index 20e211316d..be45bb8e7b 100644 --- a/routers/web/repo/setting/avatar.go +++ b/routers/web/repo/setting/avatar.go @@ -4,13 +4,8 @@ package setting import ( - "errors" "fmt" - "io" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/typesniffer" "forgejo.org/modules/web" "forgejo.org/services/context" "forgejo.org/services/forms" @@ -19,37 +14,14 @@ import ( // UpdateAvatarSetting update repo's avatar func UpdateAvatarSetting(ctx *context.Context, form forms.AvatarForm) error { - ctxRepo := ctx.Repo.Repository - - if form.Avatar == nil { - // No avatar is uploaded and we not removing it here. - // No random avatar generated here. - // Just exit, no action. - if ctxRepo.CustomAvatarRelativePath() == "" { - log.Trace("No avatar was uploaded for repo: %d. Default icon will appear instead.", ctxRepo.ID) - } + data, err := forms.ReadAvatar(form.Avatar, ctx.Locale) + if err != nil { + return err + } + if data == nil { return nil } - - r, err := form.Avatar.Open() - if err != nil { - return fmt.Errorf("Avatar.Open: %w", err) - } - defer r.Close() - - if form.Avatar.Size > setting.Avatar.MaxFileSize { - return errors.New(ctx.Locale.TrString("settings.uploaded_avatar_is_too_big", form.Avatar.Size/1024, setting.Avatar.MaxFileSize/1024)) - } - - data, err := io.ReadAll(r) - if err != nil { - return fmt.Errorf("io.ReadAll: %w", err) - } - st := typesniffer.DetectContentType(data, "") - if !st.IsImage() || st.IsSvgImage() { - return errors.New(ctx.Locale.TrString("settings.uploaded_avatar_not_a_image")) - } - if err = repo_service.UploadAvatar(ctx, ctxRepo, data); err != nil { + if err := repo_service.UploadAvatar(ctx, ctx.Repo.Repository, data); err != nil { return fmt.Errorf("UploadAvatar: %w", err) } return nil diff --git a/routers/web/repo/setting/webhook.go b/routers/web/repo/setting/webhook.go index 0caa196e25..ec5c9c4d27 100644 --- a/routers/web/repo/setting/webhook.go +++ b/routers/web/repo/setting/webhook.go @@ -445,7 +445,7 @@ func WebhookTest(ctx *context.Context) { Pusher: apiUser, Sender: apiUser, } - if err := webhook_service.PrepareWebhook(ctx, w, webhook_module.HookEventPush, p); err != nil { + if err := webhook_service.PrepareTestWebhook(ctx, w, p); err != nil { ctx.Flash.Error("PrepareWebhook: " + err.Error()) ctx.Status(http.StatusInternalServerError) } else { diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index 74ed38de65..4d44a485b9 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -445,6 +445,10 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) { ctx.Data["FileWarning"] = strings.Join(warnings, "\n") } } + } else if ctx.Repo.TreePath == ".gitmodules" { + if fInfo.fileSize > git.MaxGitmodulesFileSize { + ctx.Data["FileWarning"] = ctx.Locale.Tr("repo.view.gitmodules_too_large") + } } isDisplayingSource := ctx.FormString("display") == "source" diff --git a/routers/web/shared/user/header.go b/routers/web/shared/user/header.go index 745b3c1dca..e37e3cea64 100644 --- a/routers/web/shared/user/header.go +++ b/routers/web/shared/user/header.go @@ -97,8 +97,8 @@ func PrepareContextForProfileBigAvatar(ctx *context.Context) { func FindUserProfileReadme(ctx *context.Context, doer *user_model.User) (profileDbRepo *repo_model.Repository, profileGitRepo *git.Repository, profileReadmeBlob *git.Blob, profileClose func()) { profileDbRepo, err := repo_model.GetRepositoryByName(ctx, ctx.ContextUser.ID, ".profile") if err == nil { - // Don't show profile content if .profile repository is a fork - if profileDbRepo.IsFork { + // Don't show profile content if .profile repository is a fork or private + if profileDbRepo.IsFork || profileDbRepo.IsPrivate { return nil, nil, nil, func() {} } perm, err := access_model.GetUserRepoPermission(ctx, profileDbRepo, doer) diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index e0ce88b582..7cdbdfb3da 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -5,9 +5,7 @@ package setting import ( - "errors" "fmt" - "io" "math/big" "net/http" "os" @@ -25,7 +23,6 @@ import ( "forgejo.org/modules/optional" "forgejo.org/modules/setting" "forgejo.org/modules/translation" - "forgejo.org/modules/typesniffer" "forgejo.org/modules/util" "forgejo.org/modules/web" "forgejo.org/modules/web/middleware" @@ -135,27 +132,12 @@ func UpdateAvatarSetting(ctx *context.Context, form *forms.AvatarForm, ctxUser * ctxUser.AvatarEmail = form.Gravatar } - if form.Avatar != nil && form.Avatar.Filename != "" { - fr, err := form.Avatar.Open() - if err != nil { - return fmt.Errorf("Avatar.Open: %w", err) - } - defer fr.Close() - - if form.Avatar.Size > setting.Avatar.MaxFileSize { - return errors.New(ctx.Locale.TrString("settings.uploaded_avatar_is_too_big", form.Avatar.Size/1024, setting.Avatar.MaxFileSize/1024)) - } - - data, err := io.ReadAll(fr) - if err != nil { - return fmt.Errorf("io.ReadAll: %w", err) - } - - st := typesniffer.DetectContentType(data, "") - if !st.IsImage() || st.IsSvgImage() { - return errors.New(ctx.Locale.TrString("settings.uploaded_avatar_not_a_image")) - } - if err = user_service.UploadAvatar(ctx, ctxUser, data); err != nil { + data, err := forms.ReadAvatar(form.Avatar, ctx.Locale) + if err != nil { + return err + } + if data != nil { + if err := user_service.UploadAvatar(ctx, ctxUser, data); err != nil { return fmt.Errorf("UploadAvatar: %w", err) } } else if ctxUser.UseCustomAvatar && ctxUser.Avatar == "" { diff --git a/routers/web/web.go b/routers/web/web.go index 4e10dcc67b..f213d9cbb3 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -1654,7 +1654,7 @@ func registerRoutes(m *web.Route) { m.Post("/sync_fork", context.RepoMustNotBeArchived(), repo.MustBeNotEmpty, reqRepoCodeWriter, repo.SyncFork) }, ignSignIn, context.RepoAssignment, context.UnitTypes()) - m.Post("/{username}/{reponame}/lastcommit/*", reqSignIn, context.RepoAssignment, context.UnitTypes(), context.RepoRefByType(context.RepoRefCommit), reqRepoCodeReader, repo.LastCommit) + m.Post("/{username}/{reponame}/lastcommit/*", ignSignIn, context.RepoAssignment, context.UnitTypes(), context.RepoRefByType(context.RepoRefCommit), reqRepoCodeReader, repo.LastCommit) m.Group("/{username}/{reponame}", func() { if !setting.Repository.DisableStars { diff --git a/services/actions/TestCancelAbandonedJobs/action_run.yml b/services/actions/TestCancelAbandonedJobs/action_run.yml new file mode 100644 index 0000000000..809048039b --- /dev/null +++ b/services/actions/TestCancelAbandonedJobs/action_run.yml @@ -0,0 +1,25 @@ +# Supporting data for Case 600 - 603 +- + id: 900 + title: "running" + owner_id: 2 + repo_id: 63 + workflow_id: "running.yaml" + index: 4 + trigger_event: "push" + is_fork_pull_request: false + trigger_user_id: 2 + need_approval: false + +# Supporting data for Case 604 +- + id: 901 + title: "running" + owner_id: 2 + repo_id: 63 + workflow_id: "running.yaml" + index: 5 + trigger_event: "push" + is_fork_pull_request: false + trigger_user_id: 2 + need_approval: true diff --git a/services/actions/TestCancelAbandonedJobs/action_run_job.yml b/services/actions/TestCancelAbandonedJobs/action_run_job.yml new file mode 100644 index 0000000000..f2a4f8b663 --- /dev/null +++ b/services/actions/TestCancelAbandonedJobs/action_run_job.yml @@ -0,0 +1,34 @@ +# Case 600 -- status waiting, too long, ready to be abandoned +- + id: 600 + run_id: 900 + status: 5 # waiting + updated: 981228409 + +# Case 601 -- status blocked, too long, ready to be abandoned +- + id: 601 + run_id: 900 + status: 7 # blocked + updated: 981228409 + +# Case 602 -- status blocked, *not* too long, not to be abandoned +- + id: 602 + run_id: 900 + status: 7 # blocked + updated: 4105366009 # set to 2100-02-03 -- sorry to whoever fixes this 75 years from now + +# Case 603 -- status running, not to be abandoned +- + id: 603 + run_id: 900 + status: 6 # running + updated: 981228409 + +# Case 604 -- run needs approval (in action_run.yml), not to be abandoned +- + id: 604 + run_id: 901 + status: 5 # waiting + updated: 981228409 diff --git a/services/actions/TestCreateCommitStatus/action_run.yml b/services/actions/TestCreateCommitStatus/action_run.yml new file mode 100644 index 0000000000..cbeef34d70 --- /dev/null +++ b/services/actions/TestCreateCommitStatus/action_run.yml @@ -0,0 +1,25 @@ +- + id: 900 + title: "update actions" + repo_id: 4 + owner_id: 1 + workflow_id: "artifact.yaml" + index: 200 + trigger_user_id: 1 + ref: "refs/heads/master" + commit_sha: "c7cd3cd144e6d23c9d6f3d07e52b2c1a956e0338" + event: "push" + is_fork_pull_request: false + status: 1 + started: 1683636528 + stopped: 1683636626 + created: 1683636108 + updated: 1683636626 + need_approval: false + approved_by: 0 + event_payload: | + { + "head_commit": { + "id": "c7cd3cd144e6d23c9d6f3d07e52b2c1a956e0338" + } + } diff --git a/services/actions/TestCreateCommitStatus/action_run_job.yml b/services/actions/TestCreateCommitStatus/action_run_job.yml new file mode 100644 index 0000000000..1c3b8e4b7d --- /dev/null +++ b/services/actions/TestCreateCommitStatus/action_run_job.yml @@ -0,0 +1,26 @@ +- + id: 400 + run_id: 900 + repo_id: 4 + owner_id: 1 + commit_sha: c7cd3cd144e6d23c9d6f3d07e52b2c1a956e0338 + is_fork_pull_request: false + name: job_2 + attempt: 1 + job_id: job_2 + task_id: 47 + status: 7 # blocked + started: 1683636528 + stopped: 1683636626 + workflow_payload: | + "on": + push: + jobs: + produce-artifacts: + name: produce-artifacts + runs-on: docker + steps: + - run: echo "OK!" + strategy: + matrix: + color: red diff --git a/services/actions/Test_checkJobsOfRun/action_run.yml b/services/actions/Test_checkJobsOfRun/action_run.yml new file mode 100644 index 0000000000..1033fb43f8 --- /dev/null +++ b/services/actions/Test_checkJobsOfRun/action_run.yml @@ -0,0 +1,18 @@ +- + id: 900 + title: "running workflow_dispatch run" + repo_id: 63 + owner_id: 2 + workflow_id: "running.yaml" + index: 4 + trigger_user_id: 2 + ref: "refs/heads/main" + commit_sha: "97f29ee599c373c729132a5c46a046978311e0ee" + trigger_event: "workflow_dispatch" + is_fork_pull_request: 0 + status: 6 # running + started: 1683636528 + created: 1683636108 + updated: 1683636626 + need_approval: 0 + approved_by: 0 diff --git a/services/actions/Test_checkJobsOfRun/action_run_job.yml b/services/actions/Test_checkJobsOfRun/action_run_job.yml new file mode 100644 index 0000000000..3ececeb458 --- /dev/null +++ b/services/actions/Test_checkJobsOfRun/action_run_job.yml @@ -0,0 +1,40 @@ +- + id: 601 + run_id: 900 + repo_id: 63 + owner_id: 2 + commit_sha: 97f29ee599c373c729132a5c46a046978311e0ee + is_fork_pull_request: 0 + name: job_1 + attempt: 0 + job_id: produce-artifacts + task_id: 0 + status: 7 # blocked + runs_on: '["fedora"]' + needs: '["define-matrix"]' + workflow_payload: | + "on": + push: + jobs: + produce-artifacts: + name: produce-artifacts (incomplete matrix) + runs-on: docker + steps: + - run: echo "OK!" + strategy: + matrix: + color: ${{ fromJSON(needs.define-matrix.outputs.colors) }} + incomplete_matrix: true +- + id: 602 + run_id: 900 + repo_id: 63 + owner_id: 2 + commit_sha: 97f29ee599c373c729132a5c46a046978311e0ee + is_fork_pull_request: 0 + name: define-matrix + attempt: 0 + job_id: define-matrix + task_id: 100 + status: 1 # success + runs_on: '["fedora"]' diff --git a/services/actions/Test_checkJobsOfRun/action_task_output.yml b/services/actions/Test_checkJobsOfRun/action_task_output.yml new file mode 100644 index 0000000000..b678ac22a9 --- /dev/null +++ b/services/actions/Test_checkJobsOfRun/action_task_output.yml @@ -0,0 +1,5 @@ +- + id: 100 + task_id: 100 + output_key: colors + output_value: '["red", "blue", "green"]' diff --git a/services/actions/Test_tryHandleIncompleteMatrix/action_run.yml b/services/actions/Test_tryHandleIncompleteMatrix/action_run.yml index 2bbd44b405..ae70fae37e 100644 --- a/services/actions/Test_tryHandleIncompleteMatrix/action_run.yml +++ b/services/actions/Test_tryHandleIncompleteMatrix/action_run.yml @@ -283,3 +283,22 @@ need_approval: 0 approved_by: 0 concurrency_group: abc123 +- + id: 922 + title: "running workflow_dispatch run" + repo_id: 63 + owner_id: 2 + workflow_id: "running.yaml" + index: 26 + trigger_user_id: 2 + ref: "refs/heads/main" + commit_sha: "97f29ee599c373c729132a5c46a046978311e0ee" + trigger_event: "workflow_dispatch" + is_fork_pull_request: 0 + status: 6 # running + started: 1683636528 + created: 1683636108 + updated: 1683636626 + need_approval: 0 + approved_by: 0 + concurrency_group: abc123 diff --git a/services/actions/Test_tryHandleIncompleteMatrix/action_run_job.yml b/services/actions/Test_tryHandleIncompleteMatrix/action_run_job.yml index a352f54ee6..2dfe87b03d 100644 --- a/services/actions/Test_tryHandleIncompleteMatrix/action_run_job.yml +++ b/services/actions/Test_tryHandleIncompleteMatrix/action_run_job.yml @@ -596,3 +596,44 @@ task_id: 107 status: 1 # success runs_on: '["fedora"]' + +- + id: 642 + run_id: 922 + repo_id: 63 + owner_id: 2 + commit_sha: 97f29ee599c373c729132a5c46a046978311e0ee + is_fork_pull_request: 0 + name: job2 + attempt: 0 + job_id: job2 + task_id: 0 + status: 7 # blocked + runs_on: '[]' + needs: '["job1"]' + workflow_payload: | + on: + push: + branches: [main] + jobs: + job2: + runs-on: default + strategy: + matrix: + name: ${{ fromJSON(needs.job1.outputs.empty-list) }} + steps: + - run: echo "${{ matrix.name }}" + incomplete_matrix: true +- + id: 643 + run_id: 922 + repo_id: 63 + owner_id: 2 + commit_sha: 97f29ee599c373c729132a5c46a046978311e0ee + is_fork_pull_request: 0 + name: job1 + attempt: 0 + job_id: job1 + task_id: 110 + status: 1 # success + runs_on: '["fedora"]' diff --git a/services/actions/Test_tryHandleIncompleteMatrix/action_task_output.yml b/services/actions/Test_tryHandleIncompleteMatrix/action_task_output.yml index 6633ee72ee..424c8ed6ba 100644 --- a/services/actions/Test_tryHandleIncompleteMatrix/action_task_output.yml +++ b/services/actions/Test_tryHandleIncompleteMatrix/action_task_output.yml @@ -48,3 +48,8 @@ task_id: 107 output_key: run-on-this output_value: nixos-25.11 +- + id: 112 + task_id: 110 + output_key: empty-list + output_value: "[]" diff --git a/services/actions/clear_tasks.go b/services/actions/clear_tasks.go index c36dda55b2..507659d085 100644 --- a/services/actions/clear_tasks.go +++ b/services/actions/clear_tasks.go @@ -12,6 +12,7 @@ import ( "forgejo.org/models/db" "forgejo.org/modules/actions" "forgejo.org/modules/log" + "forgejo.org/modules/optional" "forgejo.org/modules/setting" "forgejo.org/modules/timeutil" ) @@ -75,8 +76,9 @@ func stopTasks(ctx context.Context, opts actions_model.FindTaskOptions) error { // CancelAbandonedJobs cancels the jobs which have waiting status, but haven't been picked by a runner for a long time func CancelAbandonedJobs(ctx context.Context) error { jobs, err := db.Find[actions_model.ActionRunJob](ctx, actions_model.FindRunJobOptions{ - Statuses: []actions_model.Status{actions_model.StatusWaiting, actions_model.StatusBlocked}, - UpdatedBefore: timeutil.TimeStamp(time.Now().Add(-setting.Actions.AbandonedJobTimeout).Unix()), + Statuses: []actions_model.Status{actions_model.StatusWaiting, actions_model.StatusBlocked}, + UpdatedBefore: timeutil.TimeStamp(time.Now().Add(-setting.Actions.AbandonedJobTimeout).Unix()), + RunNeedsApproval: optional.Some(false), }) if err != nil { log.Warn("find abandoned tasks: %v", err) diff --git a/services/actions/clear_tasks_test.go b/services/actions/clear_tasks_test.go new file mode 100644 index 0000000000..ce99ce9569 --- /dev/null +++ b/services/actions/clear_tasks_test.go @@ -0,0 +1,41 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package actions + +import ( + "testing" + + actions_model "forgejo.org/models/actions" + "forgejo.org/models/unittest" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestCancelAbandonedJobs(t *testing.T) { + defer unittest.OverrideFixtures("services/actions/TestCancelAbandonedJobs")() + require.NoError(t, unittest.PrepareTestDatabase()) + + require.NoError(t, CancelAbandonedJobs(t.Context())) + + // status waiting, too long, ready to be abandoned + job := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{ID: 600}) + assert.Equal(t, actions_model.StatusCancelled, job.Status) + + // status blocked, too long, ready to be abandoned + job = unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{ID: 601}) + assert.Equal(t, actions_model.StatusCancelled, job.Status) + + // status blocked, *not* too long, not to be abandoned + job = unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{ID: 602}) + assert.Equal(t, actions_model.StatusBlocked, job.Status) + + // status running, not to be abandoned + job = unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{ID: 603}) + assert.Equal(t, actions_model.StatusRunning, job.Status) + + // related run needs approval, not to be abandoned + job = unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{ID: 604}) + assert.Equal(t, actions_model.StatusWaiting, job.Status) +} diff --git a/services/actions/commit_status.go b/services/actions/commit_status.go index e5093301ea..72e468e7be 100644 --- a/services/actions/commit_status.go +++ b/services/actions/commit_status.go @@ -8,6 +8,7 @@ import ( "errors" "fmt" "path" + "strings" actions_model "forgejo.org/models/actions" "forgejo.org/models/db" @@ -84,28 +85,6 @@ func createCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er return nil } - repo := run.Repo - // TODO: store workflow name as a field in ActionRun to avoid parsing - runName := path.Base(run.WorkflowID) - if wfs, err := jobparser.Parse(job.WorkflowPayload, false); err == nil && len(wfs) > 0 { - runName = wfs[0].Name - } - ctxname := fmt.Sprintf("%s / %s (%s)", runName, job.Name, event) - state := toCommitStatus(job.Status) - if statuses, _, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptionsAll); err == nil { - for _, v := range statuses { - if v.Context == ctxname { - if v.State == state { - // no need to update - return nil - } - break - } - } - } else { - return fmt.Errorf("GetLatestCommitStatus: %w", err) - } - description := "" switch job.Status { // TODO: if we want support description in different languages, we need to support i18n placeholders in it @@ -125,6 +104,30 @@ func createCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er description = "Blocked by required conditions" } + repo := run.Repo + // TODO: store workflow name as a field in ActionRun to avoid parsing + runName := path.Base(run.WorkflowID) + if wfs, err := jobparser.Parse(job.WorkflowPayload, false); err == nil && len(wfs) > 0 { + runName = wfs[0].Name + } + ctxname := fmt.Sprintf("%s / %s (%s)", runName, job.Name, event) + state := toCommitStatus(job.Status) + if statuses, _, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptionsAll); err == nil { + for _, v := range statuses { + // TrimSpace(ctxname) & TrimSpace(description) to match stored value which is trimmed in + // `git.NewCommitStatus` + if v.Context == strings.TrimSpace(ctxname) { + if v.State == state && v.Description == strings.TrimSpace(description) { + // no need to update + return nil + } + break + } + } + } else { + return fmt.Errorf("GetLatestCommitStatus: %w", err) + } + index, err := getIndexOfJob(ctx, job) if err != nil { return fmt.Errorf("getIndexOfJob: %w", err) diff --git a/services/actions/commit_status_test.go b/services/actions/commit_status_test.go index 0872a9d7df..c564c17bfb 100644 --- a/services/actions/commit_status_test.go +++ b/services/actions/commit_status_test.go @@ -7,9 +7,14 @@ import ( "testing" actions_model "forgejo.org/models/actions" + git_model "forgejo.org/models/git" "forgejo.org/models/unittest" + "forgejo.org/modules/cache" + "forgejo.org/modules/structs" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "xorm.io/builder" ) func TestCreateCommitStatus_IncompleteMatrix(t *testing.T) { @@ -36,3 +41,64 @@ func TestCreateCommitStatus_IncompleteMatrix(t *testing.T) { err = createCommitStatus(t.Context(), job) require.NoError(t, err) } + +func TestCreateCommitStatus_AvoidsDuplicates(t *testing.T) { + defer unittest.OverrideFixtures("services/actions/TestCreateCommitStatus")() + require.NoError(t, unittest.PrepareTestDatabase()) + cache.Init() + + job := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{ID: 400}) + targetCommitStatusFilter := builder.Eq{"repo_id": 4, "sha": job.CommitSHA} + + // Begin with 0 commit statuses + assert.Equal(t, 0, unittest.GetCount(t, &git_model.CommitStatus{}, targetCommitStatusFilter)) + + err := createCommitStatus(t.Context(), job) + require.NoError(t, err) + + // Should have 1 commit status now with one createCommitStatus call + assert.Equal(t, 1, unittest.GetCount(t, &git_model.CommitStatus{}, targetCommitStatusFilter)) + status := unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{}, targetCommitStatusFilter) + assert.EqualValues(t, 4, status.RepoID) + assert.Equal(t, structs.CommitStatusState("pending"), status.State) + assert.Equal(t, "c7cd3cd144e6d23c9d6f3d07e52b2c1a956e0338", status.SHA) + assert.Equal(t, "/user5/repo4/actions/runs/200/jobs/0", status.TargetURL) + assert.Equal(t, "Blocked by required conditions", status.Description) + assert.Equal(t, "39c46bc9f0f68e0dcfbb59118e12778fa095b066", status.ContextHash) + assert.Equal(t, "/ job_2 (push)", status.Context) // This test is intended to cover the runName = "" case, which trims whitespace in this context string -- don't change it in the future + assert.EqualValues(t, 1, status.Index) + + // No status change, but createCommitStatus invoked again + err = createCommitStatus(t.Context(), job) + require.NoError(t, err) + + // Should have just the same 1 commit status since the context & state was unchanged. + assert.Equal(t, 1, unittest.GetCount(t, &git_model.CommitStatus{}, targetCommitStatusFilter)) + + // Change status, but still pending -- should add new commit status just for the Description change + job.Status = actions_model.StatusWaiting // Blocked -> Waiting + err = createCommitStatus(t.Context(), job) + require.NoError(t, err) + + // New commit status added + assert.Equal(t, 2, unittest.GetCount(t, &git_model.CommitStatus{}, targetCommitStatusFilter)) + status = unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{Index: 2}, targetCommitStatusFilter) + assert.Equal(t, structs.CommitStatusState("pending"), status.State) + assert.Equal(t, "Waiting to run", status.Description) + + // Invoke createCommitStatus again, check no new record created again + err = createCommitStatus(t.Context(), job) + require.NoError(t, err) + assert.Equal(t, 2, unittest.GetCount(t, &git_model.CommitStatus{}, targetCommitStatusFilter)) + + // Update job status & create new commit status + job.Status = actions_model.StatusSuccess + err = createCommitStatus(t.Context(), job) + require.NoError(t, err) + + // New commit status added w/ updated state & description + assert.Equal(t, 3, unittest.GetCount(t, &git_model.CommitStatus{}, targetCommitStatusFilter)) + status = unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatus{Index: 3}, targetCommitStatusFilter) + assert.Equal(t, structs.CommitStatusState("success"), status.State) + assert.Equal(t, "Successful in 1m38s", status.Description) +} diff --git a/services/actions/context.go b/services/actions/context.go index 4e4bfd75ea..964cba3b64 100644 --- a/services/actions/context.go +++ b/services/actions/context.go @@ -101,6 +101,7 @@ func GenerateGiteaContext(run *actions_model.ActionRun, job *actions_model.Actio // additional contexts gitContext["gitea_default_actions_url"] = setting.Actions.DefaultActionsURL.URL() + gitContext["forgejo_server_version"] = setting.AppVer if job != nil { gitContext["job"] = job.JobID diff --git a/services/actions/interface.go b/services/actions/interface.go index a5e0543594..54a30061bc 100644 --- a/services/actions/interface.go +++ b/services/actions/interface.go @@ -27,12 +27,4 @@ type API interface { GetRegistrationToken(*context.APIContext) // SearchActionRunJobs get pending Action run jobs SearchActionRunJobs(*context.APIContext) - // CreateRegistrationToken get registration token - CreateRegistrationToken(*context.APIContext) - // ListRunners list runners - ListRunners(*context.APIContext) - // GetRunner get a runner - GetRunner(*context.APIContext) - // DeleteRunner delete runner - DeleteRunner(*context.APIContext) } diff --git a/services/actions/job_emitter.go b/services/actions/job_emitter.go index 9484f7aed7..3a6bc4529e 100644 --- a/services/actions/job_emitter.go +++ b/services/actions/job_emitter.go @@ -44,7 +44,7 @@ func jobEmitterQueueHandler(items ...*jobUpdate) []*jobUpdate { ctx := graceful.GetManager().ShutdownContext() var ret []*jobUpdate for _, update := range items { - if err := checkJobsOfRun(ctx, update.RunID); err != nil { + if err := checkJobsOfRun(ctx, update.RunID, 0); err != nil { logger.Error("checkJobsOfRun failed for RunID = %d: %v", update.RunID, err) ret = append(ret, update) } @@ -52,7 +52,15 @@ func jobEmitterQueueHandler(items ...*jobUpdate) []*jobUpdate { return ret } -func checkJobsOfRun(ctx context.Context, runID int64) error { +func checkJobsOfRun(ctx context.Context, runID int64, recursionCount int) error { + // Recursion happens if one job finishing causes another job to be evaluated so that it creates new jobs (eg. + // dynamic matrix), those new jobs need to have their 'needs' re-evaluated. Safety check here against infinite + // recursion -- no clear reason this should happen more than once in a check since after one recurse there aren't + // any actual new jobs completed, but better safe than sorry. + if recursionCount > 5 { + return fmt.Errorf("checkJobsOfRun for runID %d hit recursion limit %d", runID, recursionCount) + } + jobs, err := db.Find[actions_model.ActionRunJob](ctx, actions_model.FindRunJobOptions{RunID: runID}) if err != nil { return err @@ -89,6 +97,17 @@ func checkJobsOfRun(ctx context.Context, runID int64) error { return err } CreateCommitStatus(ctx, jobs...) + + // tryHandleIncompleteMatrix can create new jobs in this run which may initially be persisted in the DB as blocked + // because they have non-empty `needs`. In that case, we need to recursively run the job emitter so that new jobs + // are recognized as having their `needs` completed and be set as unblocked. Check if any new jobs were created and + // rerun the job emitter if so. + if hasNewJobs, err := actions_model.RunHasOtherJobs(ctx, runID, jobs); err != nil { + return fmt.Errorf("RunHasOtherJobs error: %w", err) + } else if hasNewJobs { + return checkJobsOfRun(ctx, runID, recursionCount+1) + } + return nil } @@ -242,6 +261,7 @@ func tryHandleIncompleteMatrix(ctx context.Context, blockedJob *actions_model.Ac // reported back to the user for them to correct their workflow, so we slip this notification into // PreExecutionError. for _, swf := range newJobWorkflows { + jobID, job := swf.Job() if swf.IncompleteMatrix { errorCode, errorDetails := persistentIncompleteMatrixError(blockedJob, swf.IncompleteMatrixNeeds) if err := FailRunPreExecutionError(ctx, blockedJob.Run, errorCode, errorDetails); err != nil { @@ -257,6 +277,20 @@ func tryHandleIncompleteMatrix(ctx context.Context, blockedJob *actions_model.Ac // Return `true` to skip running this job in this invalid state return true, nil } + + // Original job had a `needs: ...blockedJob.Needs...`. Even though we've now expanded that job, which would + // evaluate any ${{ needs.... }} reference that is required for expansion, this job could still have other + // reasons to require acccess to those needs variables. We need to reinsert those `needs` into the new job so + // that those job's outputs and results are made available to this new job. + newNeeds := append(job.Needs(), blockedJob.Needs...) + err := job.RawNeeds.Encode(newNeeds) + if err != nil { + return false, fmt.Errorf("failure to encode newNeeds: %w", err) + } + err = swf.SetJob(jobID, job) + if err != nil { + return false, fmt.Errorf("failure to reencode updated job: %w", err) + } } err = db.WithTx(ctx, func(ctx context.Context) error { @@ -273,6 +307,19 @@ func tryHandleIncompleteMatrix(ctx context.Context, blockedJob *actions_model.Ac return fmt.Errorf("unexpected record count in delete incomplete_matrix=true job with ID %d; count = %d", blockedJob.ID, count) } + // If len(newJobWorkflows) is 0, and blockedJob was the last job in this run, then the job will be complete -- + // ComputeRunStatus will check for that state. + run, columns, err := actions_model.ComputeRunStatus(ctx, blockedJob.RunID) + if err != nil { + return fmt.Errorf("compute run status: %w", err) + } + if len(columns) != 0 { + err := UpdateRun(ctx, run, columns...) + if err != nil { + return fmt.Errorf("update run: %w", err) + } + } + return nil }) if err != nil { diff --git a/services/actions/job_emitter_test.go b/services/actions/job_emitter_test.go index 0125e924d1..f9c6e2cdbc 100644 --- a/services/actions/job_emitter_test.go +++ b/services/actions/job_emitter_test.go @@ -4,6 +4,7 @@ package actions import ( + "context" "slices" "testing" @@ -11,6 +12,7 @@ import ( "forgejo.org/models/db" "forgejo.org/models/unittest" "forgejo.org/modules/test" + notify_service "forgejo.org/services/notify" "code.forgejo.org/forgejo/runner/v12/act/model" "github.com/stretchr/testify/assert" @@ -142,6 +144,20 @@ jobs: } } +type callArgsActionRunNowDone struct { + run *actions_model.ActionRun + priorStatus actions_model.Status + lastRun *actions_model.ActionRun +} +type mockNotifier struct { + notify_service.NullNotifier + calls []*callArgsActionRunNowDone +} + +func (m *mockNotifier) ActionRunNowDone(ctx context.Context, run *actions_model.ActionRun, priorStatus actions_model.Status, lastRun *actions_model.ActionRun) { + m.calls = append(m.calls, &callArgsActionRunNowDone{run, priorStatus, lastRun}) +} + func Test_tryHandleIncompleteMatrix(t *testing.T) { // Shouldn't get any decoding errors during this test -- pop them up from a log warning to a test fatal error. defer test.MockVariableValue(&model.OnDecodeNodeError, func(node yaml.Node, out any, err error) { @@ -157,6 +173,8 @@ func Test_tryHandleIncompleteMatrix(t *testing.T) { preExecutionError actions_model.PreExecutionError preExecutionErrorDetails []any runsOn map[string][]string + needs map[string][]string + actionRunStatusChange actions_model.Status }{ { name: "not incomplete", @@ -167,6 +185,12 @@ func Test_tryHandleIncompleteMatrix(t *testing.T) { runJobID: 601, consumed: true, runJobNames: []string{"define-matrix", "produce-artifacts (blue)", "produce-artifacts (green)", "produce-artifacts (red)"}, + needs: map[string][]string{ + "define-matrix": nil, + "produce-artifacts (blue)": {"define-matrix"}, + "produce-artifacts (green)": {"define-matrix"}, + "produce-artifacts (red)": {"define-matrix"}, + }, }, { name: "needs an incomplete job", @@ -314,12 +338,26 @@ func Test_tryHandleIncompleteMatrix(t *testing.T) { preExecutionError: actions_model.ErrorCodeIncompleteRunsOnMissingMatrixDimension, preExecutionErrorDetails: []any{"consume-runs-on", "dimension-oops-error"}, }, + { + name: "action run completed after expansion", + runJobID: 642, + consumed: true, + runJobNames: []string{ + "job1", + // job2 which expanded into an empty matrix is gone + }, + actionRunStatusChange: actions_model.StatusSuccess, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { defer unittest.OverrideFixtures("services/actions/Test_tryHandleIncompleteMatrix")() require.NoError(t, unittest.PrepareTestDatabase()) + notifier := &mockNotifier{} + notify_service.RegisterNotifier(notifier) + defer notify_service.UnregisterNotifier(notifier) + blockedJob := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{ID: tt.runJobID}) jobsInRun, err := db.Find[actions_model.ActionRunJob](t.Context(), actions_model.FindRunJobOptions{RunID: blockedJob.RunID}) @@ -340,6 +378,15 @@ func Test_tryHandleIncompleteMatrix(t *testing.T) { // expectations are that the ActionRun has an empty PreExecutionError actionRun := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{ID: blockedJob.RunID}) assert.EqualValues(t, 0, actionRun.PreExecutionErrorCode) + if tt.actionRunStatusChange != 0 { + assert.Equal(t, tt.actionRunStatusChange, actionRun.Status) + require.Len(t, notifier.calls, 1) + call := notifier.calls[0] + assert.Equal(t, actionRun.ID, call.run.ID) + assert.Nil(t, call.lastRun) + assert.Equal(t, actions_model.StatusRunning, call.priorStatus) + assert.Equal(t, tt.actionRunStatusChange, call.run.Status) + } // compare jobs that exist with `runJobNames` to ensure new jobs are inserted: allJobsInRun, err := db.Find[actions_model.ActionRunJob](t.Context(), actions_model.FindRunJobOptions{RunID: blockedJob.RunID}) @@ -362,6 +409,17 @@ func Test_tryHandleIncompleteMatrix(t *testing.T) { } } } + + if tt.needs != nil { + for _, j := range allJobsInRun { + expected, ok := tt.needs[j.Name] + if assert.Truef(t, ok, "unable to find needs[%q] in test case", j.Name) { + slices.Sort(j.Needs) + slices.Sort(expected) + assert.Equalf(t, expected, j.Needs, "comparing needs expectations for job %q", j.Name) + } + } + } } else if tt.preExecutionError != 0 { // expectations are that the ActionRun has a populated PreExecutionError, is marked as failed actionRun := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{ID: blockedJob.RunID}) @@ -382,3 +440,32 @@ func Test_tryHandleIncompleteMatrix(t *testing.T) { }) } } + +func Test_checkJobsOfRun_ExpandsMatrixWithCorrectOutputJobStatuses(t *testing.T) { + defer unittest.OverrideFixtures("services/actions/Test_checkJobsOfRun")() + require.NoError(t, unittest.PrepareTestDatabase()) + + jobs, err := actions_model.GetRunJobsByRunID(t.Context(), 900) + require.NoError(t, err) + require.Len(t, jobs, 2) + + require.NoError(t, checkJobsOfRun(t.Context(), 900, 0)) + + jobs, err = actions_model.GetRunJobsByRunID(t.Context(), 900) + require.NoError(t, err) + assert.Len(t, jobs, 4) + for _, job := range jobs { + switch job.Name { + case "define-matrix": + assert.Equal(t, actions_model.StatusSuccess, job.Status) + case "produce-artifacts (blue)": + fallthrough + case "produce-artifacts (green)": + fallthrough + case "produce-artifacts (red)": + assert.Equal(t, actions_model.StatusWaiting, job.Status) + default: + assert.Fail(t, "unexpected job name") + } + } +} diff --git a/services/actions/main_test.go b/services/actions/main_test.go index 71ec1d3426..1151ab8f20 100644 --- a/services/actions/main_test.go +++ b/services/actions/main_test.go @@ -7,10 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/services/actions/notifier.go b/services/actions/notifier.go index 7b291d491b..401a64e8cb 100644 --- a/services/actions/notifier.go +++ b/services/actions/notifier.go @@ -138,6 +138,15 @@ func (n *actionsNotifier) IssueChangeStatus(ctx context.Context, doer *user_mode WithPayload(apiPullRequest). WithPullRequest(issue.PullRequest). Notify(ctx) + + // PR may have left unapproved runs if the author wasn't trusted, and now that it's been closed those should be + // cancelled. Note that this occurs after new events are fired -- even a 'closed' event could generate a pull + // request run that needs to be cancelled. + if isClosed { + if err := cleanupPullRequestUnapprovedRuns(ctx, issue.RepoID, issue.PullRequest.ID); err != nil { + log.Error("cleanupPullRequestUnapprovedRuns: %v", err) + } + } return } apiIssue := &api.IssuePayload{ diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go index cb27914ae0..1b0bd67f12 100644 --- a/services/actions/notifier_helper.go +++ b/services/actions/notifier_helper.go @@ -187,8 +187,8 @@ func notify(ctx context.Context, input *notifyInput) error { return handleWorkflows(ctx, detectedWorkflows, commit, input, ref.String()) } -func getGitRepoAndCommit(_ context.Context, input *notifyInput) (*git.Repository, *git.Commit, git.RefName, error) { - gitRepo, err := gitrepo.OpenRepository(context.Background(), input.Repo) +func getGitRepoAndCommit(ctx context.Context, input *notifyInput) (*git.Repository, *git.Commit, git.RefName, error) { + gitRepo, err := gitrepo.OpenRepository(ctx, input.Repo) if err != nil { return nil, nil, "", fmt.Errorf("git.OpenRepository: %w", err) } @@ -598,7 +598,7 @@ func DetectAndHandleSchedules(ctx context.Context, repo *repo_model.Repository) return nil } - gitRepo, err := gitrepo.OpenRepository(context.Background(), repo) + gitRepo, err := gitrepo.OpenRepository(ctx, repo) if err != nil { return fmt.Errorf("git.OpenRepository: %w", err) } diff --git a/services/actions/schedule_tasks.go b/services/actions/schedule_tasks.go index 17a5484551..4f4c5635e7 100644 --- a/services/actions/schedule_tasks.go +++ b/services/actions/schedule_tasks.go @@ -8,6 +8,7 @@ import ( "context" "errors" "fmt" + "strings" "time" actions_model "forgejo.org/models/actions" @@ -212,7 +213,7 @@ func CancelPreviousJobs(ctx context.Context, repoID int64, ref, workflowID strin // Iterate over each found run and cancel its associated jobs. errorSlice := []error{} for _, run := range runs { - err := cancelJobsForRun(ctx, run) + err := cancelJobsForRun(ctx, run.ID) errorSlice = append(errorSlice, err) } err = errors.Join(errorSlice...) @@ -225,22 +226,27 @@ func CancelPreviousJobs(ctx context.Context, repoID int64, ref, workflowID strin // Cancels all pending jobs in the same repository with the same concurrency group. func CancelPreviousWithConcurrencyGroup(ctx context.Context, repoID int64, concurrencyGroup string) error { - runs, _, err := db.FindAndCount[actions_model.ActionRun](ctx, actions_model.FindRunOptions{ - RepoID: repoID, - ConcurrencyGroup: concurrencyGroup, - Status: []actions_model.Status{actions_model.StatusRunning, actions_model.StatusWaiting, actions_model.StatusBlocked}, - }) - if err != nil { + // Find all runs in the concurrency group which have at least one job that is still pending; we can't use the run's + // status for this because runs are set to failed if a single job is marked as failed, even if other jobs are still + // running. + runIDs := make([]int64, 0, 10) + if err := db.GetEngine(ctx).Table("action_run"). + Join("INNER", "action_run_job", "action_run_job.run_id = action_run.id"). + Where("action_run.repo_id = ? AND action_run.concurrency_group = ?", repoID, strings.ToLower(concurrencyGroup)). + In("action_run_job.status", actions_model.PendingStatuses()). + Distinct("action_run.id"). + Select("action_run.id"). + Find(&runIDs); err != nil { return err } // Iterate over each found run and cancel its associated jobs. errorSlice := []error{} - for _, run := range runs { - err := cancelJobsForRun(ctx, run) + for _, runID := range runIDs { + err := cancelJobsForRun(ctx, runID) errorSlice = append(errorSlice, err) } - err = errors.Join(errorSlice...) + err := errors.Join(errorSlice...) if err != nil { return err } @@ -248,10 +254,10 @@ func CancelPreviousWithConcurrencyGroup(ctx context.Context, repoID int64, concu return nil } -func cancelJobsForRun(ctx context.Context, run *actions_model.ActionRun) error { +func cancelJobsForRun(ctx context.Context, runID int64) error { // Find all jobs associated with the current run. jobs, err := db.Find[actions_model.ActionRunJob](ctx, actions_model.FindRunJobOptions{ - RunID: run.ID, + RunID: runID, }) if err != nil { return err @@ -290,7 +296,7 @@ func cancelJobsForRun(ctx context.Context, run *actions_model.ActionRun) error { // If the job has an associated task, try to stop the task, effectively cancelling the job. if err := StopTask(ctx, job.TaskID, actions_model.StatusCancelled); err != nil { - errorSlice = append(errorSlice, errors.New("job has changed, try again")) + errorSlice = append(errorSlice, err) continue } } diff --git a/services/actions/schedule_tasks_test.go b/services/actions/schedule_tasks_test.go index 4e70708a5d..0d80648e0a 100644 --- a/services/actions/schedule_tasks_test.go +++ b/services/actions/schedule_tasks_test.go @@ -205,8 +205,10 @@ func TestCancelPreviousJobs(t *testing.T) { func TestCancelPreviousWithConcurrencyGroup(t *testing.T) { for _, tc := range []struct { - name string - updateRun901 map[string]any + name string + updateRun901 map[string]any + updateRun901Jobs map[string]any + expected901Status actions_model.Status }{ // run 900 & 901 in the fixture data have almost the same data and so should both be cancelled by // TestCancelPreviousWithConcurrencyGroup -- but each test case will vary something different about 601 to @@ -220,8 +222,15 @@ func TestCancelPreviousWithConcurrencyGroup(t *testing.T) { updateRun901: map[string]any{"concurrency_group": "321cba"}, }, { - name: "only cancels running", - updateRun901: map[string]any{"status": actions_model.StatusSuccess}, + name: "only cancels running", + updateRun901: map[string]any{"status": actions_model.StatusSuccess}, + updateRun901Jobs: map[string]any{"status": actions_model.StatusSuccess}, + expected901Status: actions_model.StatusSuccess, + }, + { + name: "cancels running job in failed run", + updateRun901: map[string]any{"status": actions_model.StatusFailure}, // still has a running job in it (601), but run is marked as failed as-if another job had failed in it + expected901Status: actions_model.StatusCancelled, }, } { t.Run(tc.name, func(t *testing.T) { @@ -235,18 +244,20 @@ func TestCancelPreviousWithConcurrencyGroup(t *testing.T) { affected, err := e.Table(&actions_model.ActionRun{}).Where("id = ?", 901).Update(tc.updateRun901) require.NoError(t, err) require.EqualValues(t, 1, affected) - newStatus, ok := tc.updateRun901["status"] - if ok { - expected901Status = newStatus.(actions_model.Status) - } + } + if tc.updateRun901Jobs != nil { + affected, err := e.Table(&actions_model.ActionRunJob{}).Where("run_id = ?", 901).Update(tc.updateRun901Jobs) + require.NoError(t, err) + require.EqualValues(t, 1, affected) + } + if tc.expected901Status != actions_model.StatusUnknown { + expected901Status = tc.expected901Status } run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{ID: 900}) assert.Equal(t, actions_model.StatusRunning, run.Status) assert.EqualValues(t, 1683636626, run.Updated) assert.Equal(t, "abc123", run.ConcurrencyGroup) - run = unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{ID: 901}) - assert.Equal(t, expected901Status, run.Status) runJob := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{RunID: 900}) assert.Equal(t, actions_model.StatusRunning, runJob.Status) assert.EqualValues(t, 1683636528, runJob.Started) diff --git a/services/actions/trust.go b/services/actions/trust.go index 55d97a5756..eed411bf1b 100644 --- a/services/actions/trust.go +++ b/services/actions/trust.go @@ -5,6 +5,7 @@ package actions import ( "context" + "errors" "fmt" actions_model "forgejo.org/models/actions" @@ -324,3 +325,21 @@ func pullRequestApprove(ctx context.Context, doerID, repoID, pullRequestID int64 } return nil } + +func cleanupPullRequestUnapprovedRuns(ctx context.Context, repoID, pullRequestID int64) error { + runs, err := actions_model.GetRunsThatNeedApprovalByRepoIDAndPullRequestID(ctx, repoID, pullRequestID) + if err != nil { + return err + } + + errorSlice := []error{} + for _, run := range runs { + if err := CancelRun(ctx, run); err != nil { + errorSlice = append(errorSlice, err) + } + } + if len(errorSlice) > 0 { + return errors.Join(errorSlice...) + } + return nil +} diff --git a/services/actions/trust_test.go b/services/actions/trust_test.go index d5aa08e35f..e43ab946b7 100644 --- a/services/actions/trust_test.go +++ b/services/actions/trust_test.go @@ -227,6 +227,20 @@ jobs: assert.False(t, run.NeedApproval) } }) + + t.Run("cleanupPullRequestUnapprovedRuns", func(t *testing.T) { + pullRequestID := int64(534) + runNotApproved := createPullRequestRun(t, pullRequestID, repoID) + + previousCancelledCount := unittest.GetCount(t, &actions_model.ActionRun{Status: actions_model.StatusCancelled}) + + require.NoError(t, cleanupPullRequestUnapprovedRuns(t.Context(), repoID, pullRequestID)) + + currentCancelledCount := unittest.GetCount(t, &actions_model.ActionRun{Status: actions_model.StatusCancelled}) + assert.Equal(t, previousCancelledCount+1, currentCancelledCount) + run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{ID: runNotApproved.ID}) + assert.Equal(t, actions_model.StatusCancelled.String(), run.Status.String()) + }) } func TestActionsTrust_GetPullRequestUserIsTrustedWithActions(t *testing.T) { diff --git a/services/attachment/attachment.go b/services/attachment/attachment.go index b6f763842b..420e95d1eb 100644 --- a/services/attachment/attachment.go +++ b/services/attachment/attachment.go @@ -24,6 +24,9 @@ func NewAttachment(ctx context.Context, attach *repo_model.Attachment, file io.R if attach.RepoID == 0 { return nil, fmt.Errorf("attachment %s should belong to a repository", attach.Name) } + if attach.UploaderID == 0 { + return nil, fmt.Errorf("attachment %s should have a uploader", attach.Name) + } err := db.WithTx(ctx, func(ctx context.Context) error { attach.UUID = uuid.New().String() @@ -48,6 +51,9 @@ func NewExternalAttachment(ctx context.Context, attach *repo_model.Attachment) ( if attach.RepoID == 0 { return nil, fmt.Errorf("attachment %s should belong to a repository", attach.Name) } + if attach.UploaderID == 0 { + return nil, fmt.Errorf("attachment %s should have a uploader", attach.Name) + } if attach.ExternalURL == "" { return nil, fmt.Errorf("attachment %s should have a external url", attach.Name) } diff --git a/services/attachment/attachment_test.go b/services/attachment/attachment_test.go index ef002bf16c..a6662b2837 100644 --- a/services/attachment/attachment_test.go +++ b/services/attachment/attachment_test.go @@ -13,9 +13,6 @@ import ( "forgejo.org/models/unittest" user_model "forgejo.org/models/user" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/services/auth/auth.go b/services/auth/auth.go index 52f1f65cce..14d78cdbc0 100644 --- a/services/auth/auth.go +++ b/services/auth/auth.go @@ -33,7 +33,9 @@ func isAttachmentDownload(req *http.Request) bool { // isContainerPath checks if the request targets the container endpoint func isContainerPath(req *http.Request) bool { - return strings.HasPrefix(req.URL.Path, "/v2/") + // Go's URL omits trailing slashes from `Path`. That means that `/v2/`, the top-level endpoint, appears as `/v2`. + // strings.HasPrefix(req.URL.Path, "/v2") would be inappropriate because it would match paths like `/v2-abcd`, too. + return req.URL.Path == "/v2" || strings.HasPrefix(req.URL.Path, "/v2/") } var ( diff --git a/services/auth/auth_test.go b/services/auth/auth_test.go index a6c6c74022..82308402d2 100644 --- a/services/auth/auth_test.go +++ b/services/auth/auth_test.go @@ -6,9 +6,13 @@ package auth import ( "net/http" + "net/url" "testing" "forgejo.org/modules/setting" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func Test_isGitRawOrLFSPath(t *testing.T) { @@ -132,3 +136,63 @@ func Test_isGitRawOrLFSPath(t *testing.T) { } setting.LFS.StartServer = origLFSStartServer } + +func TestAuth_isContainerPath(t *testing.T) { + testCases := []struct { + name string + input string + isContainerPath bool + }{ + { + name: "without trailing slash", + input: "https://example.com/v2", + isContainerPath: true, + }, + { + name: "with trailing slash", + input: "https://example.com/v2/", + isContainerPath: true, + }, + { + name: "with additional path components", + input: "https://example.com/v2/example/blobs/uploads/", + isContainerPath: true, + }, + { + name: "without v2", + input: "https://example.com/", + isContainerPath: false, + }, + { + name: "v2 not at the beginning", + input: "https://example.com/something/v2/", + isContainerPath: false, + }, + { + name: "v2 with prefix", + input: "https://example.com/abcd-v2/", + isContainerPath: false, + }, + { + name: "v2 with suffix", + input: "https://example.com/v2-abcd/", + isContainerPath: false, + }, + { + name: "v1", + input: "https://example.com/v1/", + isContainerPath: false, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + inputURL, err := url.Parse(testCase.input) + require.NoError(t, err) + + request := http.Request{URL: inputURL} + + assert.Equal(t, testCase.isContainerPath, isContainerPath(&request)) + }) + } +} diff --git a/services/auth/basic.go b/services/auth/basic.go index f117494762..2167055384 100644 --- a/services/auth/basic.go +++ b/services/auth/basic.go @@ -72,7 +72,7 @@ func (b *Basic) Verify(req *http.Request, w http.ResponseWriter, store DataStore } // check oauth2 token - uid, _ := CheckOAuthAccessToken(req.Context(), authToken) + uid, grantScopes := CheckOAuthAccessToken(req.Context(), authToken) if uid != 0 { log.Trace("Basic Authorization: Valid OAuthAccessToken for user[%d]", uid) @@ -83,6 +83,11 @@ func (b *Basic) Verify(req *http.Request, w http.ResponseWriter, store DataStore } store.GetData()["IsApiToken"] = true + if grantScopes != "" { + store.GetData()["ApiTokenScope"] = auth_model.AccessTokenScope(grantScopes) + } else { + store.GetData()["ApiTokenScope"] = auth_model.AccessTokenScopeAll // fallback to all + } return u, nil } diff --git a/services/automerge/automerge.go b/services/automerge/automerge.go index 0cdc113379..099d048927 100644 --- a/services/automerge/automerge.go +++ b/services/automerge/automerge.go @@ -20,6 +20,7 @@ import ( "forgejo.org/modules/log" "forgejo.org/modules/process" "forgejo.org/modules/queue" + "forgejo.org/modules/util" notify_service "forgejo.org/services/notify" pull_service "forgejo.org/services/pull" repo_service "forgejo.org/services/repository" @@ -67,7 +68,25 @@ func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pull *issues_ } // RemoveScheduledAutoMerge cancels a previously scheduled pull request -func RemoveScheduledAutoMerge(ctx context.Context, doer *user_model.User, pull *issues_model.PullRequest) error { +func RemoveScheduledAutoMerge(ctx context.Context, doer *user_model.User, pull *issues_model.PullRequest, repoPerms access_model.Permission) error { + exist, autoMerge, err := pull_model.GetScheduledMergeByPullID(ctx, pull.ID) + if err != nil { + return err + } + if !exist { + return db.ErrNotExist{Resource: "auto_merge", ID: pull.ID} + } + + if doer.ID != autoMerge.DoerID { + allowed, err := pull_service.IsUserAllowedToMerge(ctx, pull, repoPerms, doer) + if err != nil { + return err + } + if !allowed { + return util.ErrPermissionDenied + } + } + return db.WithTx(ctx, func(ctx context.Context) error { if err := pull_model.DeleteScheduledAutoMerge(ctx, pull.ID); err != nil { return err diff --git a/services/automerge/automerge_test.go b/services/automerge/automerge_test.go new file mode 100644 index 0000000000..38ed4dcd9f --- /dev/null +++ b/services/automerge/automerge_test.go @@ -0,0 +1,55 @@ +// Copyright 2026 Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package automerge + +import ( + "testing" + + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/perm" + access_model "forgejo.org/models/perm/access" + pull_model "forgejo.org/models/pull" + "forgejo.org/models/unit" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/util" + + "github.com/stretchr/testify/require" +) + +func TestRemoveScheduledAutoMerge(t *testing.T) { + defer unittest.OverrideFixtures("services/automerge/fixtures/TestRemoveScheduledAutoMerge")() + require.NoError(t, unittest.PrepareTestDatabase()) + + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + user5 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}) + pull1 := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 1}) + pull2 := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2}) + + t.Run("No automerge", func(t *testing.T) { + err := RemoveScheduledAutoMerge(t.Context(), user5, pull2, access_model.Permission{}) + require.ErrorIs(t, err, db.ErrNotExist{Resource: "auto_merge", ID: 2}) + }) + + t.Run("No permission", func(t *testing.T) { + err := RemoveScheduledAutoMerge(t.Context(), user5, pull1, access_model.Permission{}) + require.ErrorIs(t, err, util.ErrPermissionDenied) + + err = RemoveScheduledAutoMerge(t.Context(), user5, pull1, access_model.Permission{UnitsMode: map[unit.Type]perm.AccessMode{ + unit.TypePullRequests: perm.AccessModeRead, + }}) + require.ErrorIs(t, err, util.ErrPermissionDenied) + }) + + t.Run("Normal", func(t *testing.T) { + err := RemoveScheduledAutoMerge(t.Context(), user2, pull1, access_model.Permission{UnitsMode: map[unit.Type]perm.AccessMode{ + unit.TypePullRequests: perm.AccessModeWrite, + }}) + require.NoError(t, err) + + unittest.AssertExistsIf(t, false, &pull_model.AutoMerge{PullID: pull1.ID}) + unittest.AssertExistsIf(t, true, &issues_model.Comment{IssueID: pull1.IssueID, Type: issues_model.CommentTypePRUnScheduledToAutoMerge}) + }) +} diff --git a/services/automerge/fixtures/TestRemoveScheduledAutoMerge/pull_auto_merge.yml b/services/automerge/fixtures/TestRemoveScheduledAutoMerge/pull_auto_merge.yml new file mode 100644 index 0000000000..2cacb611c3 --- /dev/null +++ b/services/automerge/fixtures/TestRemoveScheduledAutoMerge/pull_auto_merge.yml @@ -0,0 +1,8 @@ +- + id: 1001 + pull_id: 1 + doer_id: 2 + merge_style: "merge" + message: "Automatically merged" + delete_branch_after_merge: false + created_unix: 1771800000 diff --git a/services/automerge/main_test.go b/services/automerge/main_test.go new file mode 100644 index 0000000000..8c0e558b17 --- /dev/null +++ b/services/automerge/main_test.go @@ -0,0 +1,14 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package automerge + +import ( + "testing" + + "forgejo.org/models/unittest" +) + +func TestMain(m *testing.M) { + unittest.MainTest(m) +} diff --git a/services/context/api.go b/services/context/api.go index 19e0c04911..be8d5ae724 100644 --- a/services/context/api.go +++ b/services/context/api.go @@ -289,14 +289,6 @@ func APIContexter() func(http.Handler) http.Handler { ctx.AppendContextValue(apiContextKey, ctx) ctx.AppendContextValueFunc(gitrepo.RepositoryContextKey, func() any { return ctx.Repo.GitRepo }) - // If request sends files, parse them here otherwise the Query() can't be parsed and the CsrfToken will be invalid. - if ctx.Req.Method == "POST" && strings.Contains(ctx.Req.Header.Get("Content-Type"), "multipart/form-data") { - if err := ctx.Req.ParseMultipartForm(setting.Attachment.MaxSize << 20); err != nil && !strings.Contains(err.Error(), "EOF") { // 32MB max size - ctx.InternalServerError(err) - return - } - } - httpcache.SetCacheControlInHeader(ctx.Resp.Header(), 0, "no-transform") ctx.Resp.Header().Set(`X-Frame-Options`, setting.CORSConfig.XFrameOptions) diff --git a/services/context/context.go b/services/context/context.go index 728a955692..c8a3a71a2e 100644 --- a/services/context/context.go +++ b/services/context/context.go @@ -173,14 +173,6 @@ func Contexter() func(next http.Handler) http.Handler { } }) - // If request sends files, parse them here otherwise the Query() can't be parsed and the CsrfToken will be invalid. - if ctx.Req.Method == "POST" && strings.Contains(ctx.Req.Header.Get("Content-Type"), "multipart/form-data") { - if err := ctx.Req.ParseMultipartForm(setting.Attachment.MaxSize << 20); err != nil && !strings.Contains(err.Error(), "EOF") { // 32MB max size - ctx.ServerError("ParseMultipartForm", err) - return - } - } - httpcache.SetCacheControlInHeader(ctx.Resp.Header(), 0, "no-transform") ctx.Resp.Header().Set(`X-Frame-Options`, setting.CORSConfig.XFrameOptions) diff --git a/services/convert/convert.go b/services/convert/convert.go index eaf6459cfd..44b12fa8a0 100644 --- a/services/convert/convert.go +++ b/services/convert/convert.go @@ -30,8 +30,6 @@ import ( api "forgejo.org/modules/structs" "forgejo.org/modules/util" "forgejo.org/services/gitdiff" - - runnerv1 "code.forgejo.org/forgejo/actions-proto/runner/v1" ) // ToEmail convert models.EmailAddress to api.Email @@ -521,27 +519,3 @@ func ToChangedFile(f *gitdiff.DiffFile, repo *repo_model.Repository, commit stri return file } - -func ToActionRunner(ctx context.Context, runner *actions_model.ActionRunner) *api.ActionRunner { - status := runner.Status() - apiStatus := "offline" - if runner.IsOnline() { - apiStatus = "online" - } - labels := make([]*api.ActionRunnerLabel, len(runner.AgentLabels)) - for i, label := range runner.AgentLabels { - labels[i] = &api.ActionRunnerLabel{ - ID: int64(i), - Name: label, - Type: "custom", - } - } - return &api.ActionRunner{ - ID: runner.ID, - Name: runner.Name, - Status: apiStatus, - Busy: status == runnerv1.RunnerStatus_RUNNER_STATUS_ACTIVE, - // Ephemeral: runner.Ephemeral, - Labels: labels, - } -} diff --git a/services/convert/main_test.go b/services/convert/main_test.go index 5915d16be4..e6d7a4a323 100644 --- a/services/convert/main_test.go +++ b/services/convert/main_test.go @@ -7,9 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/services/convert/repository.go b/services/convert/repository.go index f3603ee7f1..3823fd3a09 100644 --- a/services/convert/repository.go +++ b/services/convert/repository.go @@ -4,7 +4,7 @@ package convert import ( - "context" + stdCtx "context" "time" "forgejo.org/models" @@ -15,14 +15,15 @@ import ( unit_model "forgejo.org/models/unit" "forgejo.org/modules/log" api "forgejo.org/modules/structs" + "forgejo.org/services/context" ) // ToRepo converts a Repository to api.Repository -func ToRepo(ctx context.Context, repo *repo_model.Repository, permissionInRepo access_model.Permission) *api.Repository { +func ToRepo(ctx stdCtx.Context, repo *repo_model.Repository, permissionInRepo access_model.Permission) *api.Repository { return innerToRepo(ctx, repo, permissionInRepo, false) } -func innerToRepo(ctx context.Context, repo *repo_model.Repository, permissionInRepo access_model.Permission, isParent bool) *api.Repository { +func innerToRepo(ctx stdCtx.Context, repo *repo_model.Repository, permissionInRepo access_model.Permission, isParent bool) *api.Repository { var parent *api.Repository if permissionInRepo.Units == nil && permissionInRepo.UnitsMode == nil { @@ -179,9 +180,19 @@ func innerToRepo(ctx context.Context, repo *repo_model.Repository, permissionInR repoAPIURL := repo.APIURL() + // Calculate the effective permission for `ToUserWithAccessMode` for the repo owner. When accessing a public repo, + // permissionInRepo.AccessMode will be AccessModeRead even for an anonymous user -- in that case, downgrade + // `ownerViewPerms` to `AccessModeNone`. `innerToRepo` doesn't have great access to recognize an anonymous user, so + // the best-effort made here is to check if `ctx` is an `APIContext`. + ownerViewPerms := permissionInRepo.AccessMode + apiCtx, ok := ctx.(*context.APIContext) + if ok && apiCtx.Doer == nil { + ownerViewPerms = perm.AccessModeNone + } + return &api.Repository{ ID: repo.ID, - Owner: ToUserWithAccessMode(ctx, repo.Owner, permissionInRepo.AccessMode), + Owner: ToUserWithAccessMode(ctx, repo.Owner, ownerViewPerms), Name: repo.Name, FullName: repo.FullName(), Description: repo.Description, @@ -246,7 +257,7 @@ func innerToRepo(ctx context.Context, repo *repo_model.Repository, permissionInR } // ToRepoTransfer convert a models.RepoTransfer to a structs.RepeTransfer -func ToRepoTransfer(ctx context.Context, t *models.RepoTransfer) *api.RepoTransfer { +func ToRepoTransfer(ctx stdCtx.Context, t *models.RepoTransfer) *api.RepoTransfer { teams, _ := ToTeams(ctx, t.Teams, false) return &api.RepoTransfer{ diff --git a/services/feed/action.go b/services/feed/action.go index 96de080691..96ed154064 100644 --- a/services/feed/action.go +++ b/services/feed/action.go @@ -308,6 +308,10 @@ func (*actionNotifier) AutoMergePullRequest(ctx context.Context, doer *user_mode } func (*actionNotifier) PullReviewDismiss(ctx context.Context, doer *user_model.User, review *issues_model.Review, comment *issues_model.Comment) { + if err := review.LoadReviewer(ctx); err != nil { + log.Error("LoadReviewer '%d/%d': %v", review.ID, review.ReviewerID, err) + return + } reviewerName := review.Reviewer.Name if len(review.OriginalAuthor) > 0 { reviewerName = review.OriginalAuthor diff --git a/services/feed/action_test.go b/services/feed/action_test.go index fd27bf32a9..51df063c52 100644 --- a/services/feed/action_test.go +++ b/services/feed/action_test.go @@ -18,9 +18,6 @@ import ( "forgejo.org/modules/setting" "forgejo.org/modules/test" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/services/forgejo/main_test.go b/services/forgejo/main_test.go index 5523ed1aab..12d768cbcb 100644 --- a/services/forgejo/main_test.go +++ b/services/forgejo/main_test.go @@ -6,11 +6,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/services/forms/avatar.go b/services/forms/avatar.go new file mode 100644 index 0000000000..47cdc6c0df --- /dev/null +++ b/services/forms/avatar.go @@ -0,0 +1,45 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package forms + +import ( + "errors" + "fmt" + "io" + "mime/multipart" + + "forgejo.org/modules/setting" + "forgejo.org/modules/translation" + "forgejo.org/modules/typesniffer" +) + +// ReadAvatar reads and validates an avatar from a multipart file header. +func ReadAvatar(header *multipart.FileHeader, locale translation.Locale) ([]byte, error) { + if header == nil || header.Filename == "" { + return nil, nil + } + + r, err := header.Open() + if err != nil { + return nil, fmt.Errorf("Avatar.Open: %w", err) + } + defer r.Close() + + if header.Size > setting.Avatar.MaxFileSize { + return nil, errors.New(locale.TrString("settings.uploaded_avatar_is_too_big", header.Size/1024, setting.Avatar.MaxFileSize/1024)) + } + + data, err := io.ReadAll(r) + if err != nil { + return nil, fmt.Errorf("io.ReadAll: %w", err) + } + + st := typesniffer.DetectContentType(data, "") + if !st.IsImage() || st.IsSvgImage() { + return nil, errors.New(locale.TrString("settings.uploaded_avatar_not_a_image")) + } + + return data, nil +} diff --git a/services/gitdiff/main_test.go b/services/gitdiff/main_test.go index cd7a6a4a6b..7deeef34c0 100644 --- a/services/gitdiff/main_test.go +++ b/services/gitdiff/main_test.go @@ -7,11 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/services/issue/comments_test.go b/services/issue/comments_test.go index fcf06d9ec8..c7609b57a9 100644 --- a/services/issue/comments_test.go +++ b/services/issue/comments_test.go @@ -18,8 +18,6 @@ import ( issue_service "forgejo.org/services/issue" "forgejo.org/tests" - _ "forgejo.org/services/webhook" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/services/issue/main_test.go b/services/issue/main_test.go index 673ec5e4cc..b54ff9ca02 100644 --- a/services/issue/main_test.go +++ b/services/issue/main_test.go @@ -9,8 +9,6 @@ import ( "forgejo.org/models/unittest" "forgejo.org/modules/setting" "forgejo.org/services/webhook" - - _ "forgejo.org/models/actions" ) func TestMain(m *testing.M) { diff --git a/services/mailer/fixtures/TestMailNewRelease/watch.yml b/services/mailer/fixtures/TestMailNewRelease/watch.yml new file mode 100644 index 0000000000..4c488a6f85 --- /dev/null +++ b/services/mailer/fixtures/TestMailNewRelease/watch.yml @@ -0,0 +1,5 @@ +- + id: 1001 + user_id: 11 + repo_id: 41 + mode: 1 diff --git a/services/mailer/mail_release.go b/services/mailer/mail_release.go index 0f2ef33fe1..2111083bd4 100644 --- a/services/mailer/mail_release.go +++ b/services/mailer/mail_release.go @@ -6,8 +6,11 @@ package mailer import ( "bytes" "context" + "slices" + access_model "forgejo.org/models/perm/access" repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" user_model "forgejo.org/models/user" "forgejo.org/modules/base" "forgejo.org/modules/log" @@ -40,6 +43,12 @@ func MailNewRelease(ctx context.Context, rel *repo_model.Release) { return } + // Users are not eligible to receive this mail if they are not active or + // they don't have permissions to read releases. + recipients = slices.DeleteFunc(recipients, func(u *user_model.User) bool { + return !u.IsActive || !access_model.CheckRepoUnitUser(ctx, rel.Repo, u, unit.TypeReleases) + }) + langMap := make(map[string][]*user_model.User) for _, user := range recipients { if user.ID != rel.PublisherID { diff --git a/services/mailer/mail_release_test.go b/services/mailer/mail_release_test.go new file mode 100644 index 0000000000..4b37afb8cd --- /dev/null +++ b/services/mailer/mail_release_test.go @@ -0,0 +1,122 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package mailer_test + +import ( + "testing" + + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/gitrepo" + "forgejo.org/services/mailer" + release_service "forgejo.org/services/release" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestMailNewRelease(t *testing.T) { + defer unittest.OverrideFixtures("services/mailer/fixtures/TestMailNewRelease")() + defer require.NoError(t, unittest.PrepareTestDatabase()) + + user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + user11 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 11}) + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + + gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + require.NoError(t, err) + defer gitRepo.Close() + + t.Run("Normal", func(t *testing.T) { + called := false + + defer mailer.MockMailSettings(func(msgs ...*mailer.Message) { + assert.Len(t, msgs, 2) + if user1.EmailTo() == msgs[0].To { + assert.Equal(t, user11.EmailTo(), msgs[1].To) + } else { + assert.Equal(t, user11.EmailTo(), msgs[0].To) + assert.Equal(t, user1.EmailTo(), msgs[1].To) + } + + assert.Equal(t, "v0.1 in user2/repo1 released", msgs[0].Subject) + called = true + })() + + require.NoError(t, release_service.CreateRelease(gitRepo, &repo_model.Release{ + RepoID: repo.ID, + Repo: repo, + PublisherID: user2.ID, + Publisher: user2, + TagName: "v0.1", + Target: "master", + Title: "v0.1 is released", + Note: "v0.1 is released", + }, "", []*release_service.AttachmentChange{})) + + assert.True(t, called) + }) + + t.Run("Non-active user", func(t *testing.T) { + _, err := db.GetEngine(db.DefaultContext).Exec("UPDATE user SET is_active=false WHERE id=11") + require.NoError(t, err) + + t.Cleanup(func() { + _, err := db.GetEngine(db.DefaultContext).Exec("UPDATE user SET is_active=true WHERE id=11") + require.NoError(t, err) + }) + called := false + + defer mailer.MockMailSettings(func(msgs ...*mailer.Message) { + assert.Len(t, msgs, 1) + assert.Equal(t, user1.EmailTo(), msgs[0].To) + + assert.Equal(t, "v0.2 in user2/repo1 released", msgs[0].Subject) + called = true + })() + + require.NoError(t, release_service.CreateRelease(gitRepo, &repo_model.Release{ + RepoID: repo.ID, + Repo: repo, + PublisherID: user2.ID, + Publisher: user2, + TagName: "v0.2", + Target: "master", + Title: "v0.2 is released", + Note: "v0.2 is released", + }, "", []*release_service.AttachmentChange{})) + + assert.True(t, called) + }) + + t.Run("No permissions for releases", func(t *testing.T) { + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 41}) + + gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + require.NoError(t, err) + defer gitRepo.Close() + + called := false + + defer mailer.MockMailSettings(func(msgs ...*mailer.Message) { + called = true + })() + + require.NoError(t, release_service.CreateRelease(gitRepo, &repo_model.Release{ + RepoID: repo.ID, + Repo: repo, + PublisherID: user2.ID, + Publisher: user2, + TagName: "v0.2", + Target: "master", + Title: "v0.2 is released", + Note: "v0.2 is released", + }, "", []*release_service.AttachmentChange{})) + + assert.False(t, called) + }) +} diff --git a/services/mailer/main_test.go b/services/mailer/main_test.go index a42f487c32..eb998aa7ec 100644 --- a/services/mailer/main_test.go +++ b/services/mailer/main_test.go @@ -16,7 +16,7 @@ import ( "forgejo.org/modules/test" "forgejo.org/modules/translation" - _ "forgejo.org/models/actions" + _ "forgejo.org/modules/testimport" "github.com/stretchr/testify/assert" ) diff --git a/services/migrations/error.go b/services/migrations/error.go index 2dd9647d95..dee008a071 100644 --- a/services/migrations/error.go +++ b/services/migrations/error.go @@ -7,7 +7,7 @@ package migrations import ( "errors" - "github.com/google/go-github/v74/github" + "github.com/google/go-github/v81/github" ) // ErrRepoNotCreated returns the error that repository not created diff --git a/services/migrations/github.go b/services/migrations/github.go index 87e8248cab..ed419ed444 100644 --- a/services/migrations/github.go +++ b/services/migrations/github.go @@ -20,7 +20,7 @@ import ( "forgejo.org/modules/proxy" "forgejo.org/modules/structs" - "github.com/google/go-github/v74/github" + "github.com/google/go-github/v81/github" "golang.org/x/oauth2" ) @@ -98,7 +98,6 @@ func NewGithubDownloaderV3(ctx context.Context, baseURL string, getPullRequests, userName: userName, baseURL: baseURL, password: password, - ctx: ctx, repoOwner: repoOwner, repoName: repoName, maxPerPage: 100, @@ -106,6 +105,8 @@ func NewGithubDownloaderV3(ctx context.Context, baseURL string, getPullRequests, getIssues: getIssues, } + downloader.SetContext(ctx) + if token != "" { tokens := strings.Split(token, ",") for _, token := range tokens { @@ -159,6 +160,7 @@ func (g *GithubDownloaderV3) addClient(client *http.Client, baseURL string) { // SetContext set context func (g *GithubDownloaderV3) SetContext(ctx context.Context) { + ctx = context.WithValue(ctx, github.SleepUntilPrimaryRateLimitResetWhenRateLimited, true) g.ctx = ctx } @@ -350,7 +352,6 @@ func (g *GithubDownloaderV3) convertGithubRelease(rel *github.RepositoryRelease) r.Assets = append(r.Assets, &base.ReleaseAsset{ ID: asset.GetID(), Name: asset.GetName(), - ContentType: asset.ContentType, Size: asset.Size, DownloadCount: asset.DownloadCount, Created: asset.CreatedAt.Time, @@ -430,9 +431,6 @@ func (g *GithubDownloaderV3) GetReleases() ([]*base.Release, error) { // GetIssues returns issues according start and limit func (g *GithubDownloaderV3) GetIssues(page, perPage int) ([]*base.Issue, bool, error) { - var issues []*github.Issue - var resp *github.Response - var err error if perPage > g.maxPerPage { perPage = g.maxPerPage } @@ -440,29 +438,17 @@ func (g *GithubDownloaderV3) GetIssues(page, perPage int) ([]*base.Issue, bool, allIssues := make([]*base.Issue, 0, perPage) g.waitAndPickClient() - if page == 1 { - issues, resp, err = g.getClient().Issues.ListByRepo(g.ctx, g.repoOwner, g.repoName, &github.IssueListByRepoOptions{ - Sort: "created", - Direction: "asc", - State: "all", - ListCursorOptions: github.ListCursorOptions{ - PerPage: perPage, - Page: strconv.Itoa(page), - }, - }) - g.githubPagingInfo.After = resp.After - } else { - issues, resp, err = g.getClient().Issues.ListByRepo(g.ctx, g.repoOwner, g.repoName, &github.IssueListByRepoOptions{ - Sort: "created", - Direction: "asc", - State: "all", - ListCursorOptions: github.ListCursorOptions{ - PerPage: perPage, - After: g.githubPagingInfo.After, - }, - }) - g.githubPagingInfo.After = resp.After - } + issues, resp, err := g.getClient().Issues.ListByRepo(g.ctx, g.repoOwner, g.repoName, &github.IssueListByRepoOptions{ + Sort: "created", + Direction: "asc", + State: "all", + ListCursorOptions: github.ListCursorOptions{ + PerPage: perPage, + After: g.githubPagingInfo.After, + }, + }) + + g.githubPagingInfo.After = resp.After if err != nil { return nil, false, fmt.Errorf("error while listing repos: %w", err) diff --git a/services/migrations/github_test.go b/services/migrations/github_test.go index 786becd420..29a78f53fc 100644 --- a/services/migrations/github_test.go +++ b/services/migrations/github_test.go @@ -5,14 +5,18 @@ package migrations import ( + "net/http" "os" + "regexp" + "strconv" "testing" "time" "forgejo.org/models/unittest" + "forgejo.org/modules/log" base "forgejo.org/modules/migration" - "github.com/google/go-github/v74/github" + "github.com/google/go-github/v81/github" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -97,6 +101,29 @@ func TestGithubDownloaderFilterComments(t *testing.T) { } } +func ratelimitInjectHandler(handler http.Handler, urlpattern *regexp.Regexp, every int) http.HandlerFunc { + var requestCount int + // because we also count the rate limit response + every++ + + return (http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + match := urlpattern.MatchString(r.URL.Path) + if match { + requestCount++ + } + + if match && requestCount%every == 0 { + log.Info("ratelimitInject %s", r.URL) + w.Header().Set("X-Ratelimit-Reset", + strconv.FormatInt(time.Now().Add(time.Second).Unix(), 10)) + w.Header().Set("X-Ratelimit-Remaining", "0") + w.WriteHeader(http.StatusForbidden) + } else { + handler.ServeHTTP(w, r) + } + })) +} + func TestGitHubDownloadRepo(t *testing.T) { GithubLimitRateRemaining = 3 // Wait at 3 remaining since we could have 3 CI in // @@ -105,6 +132,10 @@ func TestGitHubDownloadRepo(t *testing.T) { server := unittest.NewMockWebServer(t, "https://api.github.com", fixturePath, false) defer server.Close() + urlpattern := regexp.MustCompile("test_repo/") + + server.Config.Handler = ratelimitInjectHandler(server.Config.Handler, urlpattern, 7) + downloader := NewGithubDownloaderV3(t.Context(), server.URL, true, true, "", "", token, "forgejo", "test_repo") err := downloader.RefreshRate() require.NoError(t, err) @@ -205,7 +236,6 @@ func TestGitHubDownloadRepo(t *testing.T) { }, labels) id := int64(280443629) - ct := "application/pdf" size := 550175 dc := 0 @@ -225,7 +255,6 @@ func TestGitHubDownloadRepo(t *testing.T) { { ID: id, Name: "wireguard.pdf", - ContentType: &ct, Size: &size, DownloadCount: &dc, Created: time.Date(2025, time.August, 7, 23, 39, 27, 0, time.UTC), @@ -462,12 +491,14 @@ func TestGithubMultiToken(t *testing.T) { func TestGithubIssuePagination(t *testing.T) { GithubLimitRateRemaining = 3 // Wait at 3 remaining since we could have 3 CI in // - token := os.Getenv("GITHUB_READ_TOKEN") - if token == "" { - t.Skip() - } + token := os.Getenv("GITHUB_READ_TOKEN_NIGOROLL") + liveMode := token != "" - downloader := NewGithubDownloaderV3(t.Context(), "https://api.github.com", true, true, "", "", token, "galaxyproject", "galaxy") + fixturePath := "./testdata/github/pagination" + server := unittest.NewMockWebServer(t, "https://api.github.com", fixturePath, liveMode) + defer server.Close() + + downloader := NewGithubDownloaderV3(t.Context(), server.URL, true, true, "", "", token, "nigoroll", "libvmod-dynamic") downloader.SkipReactions = true err := downloader.RefreshRate() require.NoError(t, err) @@ -476,18 +507,26 @@ func TestGithubIssuePagination(t *testing.T) { require.NoError(t, err) assertRepositoryEqual(t, &base.Repository{ - Name: "galaxy", - Owner: "galaxyproject", - Description: "Data intensive science for everyone.", - CloneURL: "https://github.com/galaxyproject/galaxy.git", - OriginalURL: "https://github.com/galaxyproject/galaxy", - DefaultBranch: "dev", - Website: "https://galaxyproject.org", + Name: "libvmod-dynamic", + Owner: "nigoroll", + Description: "The Varnish dns/named director continued", + CloneURL: server.URL + "/nigoroll/libvmod-dynamic.git", + OriginalURL: server.URL + "/nigoroll/libvmod-dynamic", + DefaultBranch: "master", }, repo) + seen := make(map[int64]bool) + perPage := 45 for page := 1; page <= 250; page++ { - _, _, err = downloader.GetIssues(page, perPage) + issues, last, err := downloader.GetIssues(page, perPage) require.NoError(t, err) + for _, issue := range issues { + assert.False(t, seen[issue.Number]) + seen[issue.Number] = true + } + if last { + break + } } } diff --git a/services/migrations/gitlab.go b/services/migrations/gitlab.go index b58046c4fc..53d3ab7490 100644 --- a/services/migrations/gitlab.go +++ b/services/migrations/gitlab.go @@ -65,10 +65,13 @@ type gitlabIIDResolver struct { } func (r *gitlabIIDResolver) recordIssueIID(issueIID int) { - if r.frozen { - panic("cannot record issue IID after pull request IID generation has started") + if int64(issueIID) <= r.maxIssueIID { + return } - r.maxIssueIID = max(r.maxIssueIID, int64(issueIID)) + if r.frozen { + panic("cannot record bigger issue IID after pull request IID generation has started") + } + r.maxIssueIID = int64(issueIID) } func (r *gitlabIIDResolver) generatePullRequestNumber(mrIID int) int64 { @@ -332,12 +335,11 @@ func (g *GitlabDownloader) convertGitlabRelease(rel *gitlab.Release) *base.Relea httpClient := NewMigrationHTTPClient() - for k, asset := range rel.Assets.Links { + for _, asset := range rel.Assets.Links { assetID := asset.ID // Don't optimize this, for closure we need a local variable r.Assets = append(r.Assets, &base.ReleaseAsset{ ID: int64(asset.ID), Name: asset.Name, - ContentType: &rel.Assets.Sources[k].Format, Size: &zero, DownloadCount: &zero, DownloadFunc: func() (io.ReadCloser, error) { @@ -403,15 +405,18 @@ type gitlabIssueContext struct { // Note: issue label description and colors are not supported by the go-gitlab library at this time func (g *GitlabDownloader) GetIssues(page, perPage int) ([]*base.Issue, bool, error) { state := "all" - sort := "asc" + // we want most recent issues first, to get the biggest issue IID immediately + sort := "desc" + orderBy := "created_at" if perPage > g.maxPerPage { perPage = g.maxPerPage } opt := &gitlab.ListProjectIssuesOptions{ - State: &state, - Sort: &sort, + State: &state, + Sort: &sort, + OrderBy: &orderBy, ListOptions: gitlab.ListOptions{ PerPage: perPage, Page: page, @@ -795,39 +800,14 @@ func (g *GitlabDownloader) awardsToReactions(awards []*gitlab.AwardEmoji) []*bas return result } -// Build on the assumption, that PR IDs will resolve after Issue IDs -func (g *GitlabDownloader) convertMRReference(body string) string { - maxLength := len(body) - for i := 0; i < maxLength; i++ { - if body[i] == '!' { - var collected string - for k := i + 1; k < maxLength; k++ { // for each rune after ! check if next rune is integer - if body[k]-'0' <= 9 { - collected += string(body[k]) - if k == maxLength-1 { // The last rune in the string was an integer - body = g.updateAndInsert(body, collected, i+1, k) - } - } else if len(collected) > 0 { // Integers have been collected, update value - body = g.updateAndInsert(body, collected, i+1, k) - maxLength = len(body) - i = k - break // We're done, continue after our replacement - } - } - } - } - return body -} +var mrFinder = regexp.MustCompile(`![0-9]+`) -func (g *GitlabDownloader) updateAndInsert(description, oldReference string, endFirst, startSecond int) string { - oldVal, _ := strconv.Atoi(oldReference) - newVal := oldVal + int(g.iidResolver.maxIssueIID) - firstPart := description[0:endFirst] - firstPart += strconv.Itoa(newVal) - var secondPart string - if startSecond < len(description)-1 { - secondPart = description[startSecond:] - } - description = firstPart + secondPart - return description +// In gitlab, issues and merge-request have split numbering +// Adjust the merge-request numbers (preserve the issue numbers) +func (g *GitlabDownloader) convertMRReference(body string) string { + return mrFinder.ReplaceAllStringFunc(body, func(s string) string { + oldVal, _ := strconv.Atoi(s[1:]) // skip the leading exclamation mark + newVal := g.iidResolver.generatePullRequestNumber(oldVal) + return "!" + strconv.FormatInt(newVal, 10) + }) } diff --git a/services/migrations/gitlab_test.go b/services/migrations/gitlab_test.go index 2a1ecc1c9f..37fdea9475 100644 --- a/services/migrations/gitlab_test.go +++ b/services/migrations/gitlab_test.go @@ -48,8 +48,8 @@ func TestGitlabDownloadRepo(t *testing.T) { topics, err := downloader.GetTopics() require.NoError(t, err) - assert.Len(t, topics, 2) - assert.Equal(t, []string{"migration", "test"}, topics) + assert.Len(t, topics, 3) + assert.Equal(t, []string{"migration", "migration test", "test"}, topics) milestones, err := downloader.GetMilestones() require.NoError(t, err) @@ -123,6 +123,10 @@ func TestGitlabDownloadRepo(t *testing.T) { releases, err := downloader.GetReleases() require.NoError(t, err) + // TODO: fix size, currently reported as 0 + // See https://codeberg.org/forgejo/forgejo/issues/11471 + size := 0 + dc := 0 assertReleasesEqual(t, []*base.Release{ { TagName: "v0.9.99", @@ -132,6 +136,50 @@ func TestGitlabDownloadRepo(t *testing.T) { Created: time.Date(2024, 9, 3, 15, 1, 1, 513000000, time.UTC), PublisherID: 548513, PublisherName: "mkobel", + Assets: []*base.ReleaseAsset{ + { + ID: 10694714, + Name: "Forgejo logo", + Size: &size, + DownloadCount: &dc, + }, + { + // TODO: fix name or URL, doesn't make sense to download without extension + // See https://codeberg.org/forgejo/forgejo/issues/11471 + ID: 10687293, + Name: "zip (other)", + Size: &size, + DownloadCount: &dc, + // TODO: fix date, currently time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC) + // See https://codeberg.org/forgejo/forgejo/issues/11471 + // Created: time.Date(2025, time.August, 7, 23, 39, 27, 0, time.UTC), + // Updated: time.Date(2025, time.August, 7, 23, 39, 29, 0, time.UTC), + }, + { + ID: 10687292, + Name: "Forgejo", + Size: &size, + DownloadCount: &dc, + }, + { + ID: 10687291, + Name: "Frogejo 🐸", + Size: &size, + DownloadCount: &dc, + }, + { + ID: 10687290, + Name: "tar.bz2 (runbook)", + Size: &size, + DownloadCount: &dc, + }, + { + ID: 10687289, + Name: "tar.gz (package)", + Size: &size, + DownloadCount: &dc, + }, + }, }, }, releases) @@ -140,36 +188,30 @@ func TestGitlabDownloadRepo(t *testing.T) { assert.False(t, isEnd) assertIssuesEqual(t, []*base.Issue{ { - Number: 1, - Title: "Please add an animated gif icon to the merge button", - Content: "I just want the merge button to hurt my eyes a little. :stuck_out_tongue_closed_eyes:", - Milestone: "1.0.0", - PosterID: 548513, - PosterName: "mkobel", - State: "closed", - Created: time.Date(2024, 9, 3, 14, 42, 34, 924000000, time.UTC), - Updated: time.Date(2024, 9, 3, 14, 48, 43, 756000000, time.UTC), - Labels: []*base.Label{ - { - Name: "bug", - }, - { - Name: "discussion", - }, - }, - Reactions: []*base.Reaction{ - { - UserID: 548513, - UserName: "mkobel", - Content: "thumbsup", - }, - { - UserID: 548513, - UserName: "mkobel", - Content: "open_mouth", - }, - }, - Closed: timePtr(time.Date(2024, 9, 3, 14, 43, 10, 708000000, time.UTC)), + Number: 4, + Title: "Missing \"migration_test\" and \"migration_test_migration_test_migration_test\" topic", + Content: "This is required for https://codeberg.org/forgejo/forgejo/pulls/10336.", + Milestone: "", + PosterID: 29018602, + PosterName: "amadaluzia", + State: "opened", + Created: time.Date(2025, time.December, 6, 14, 2, 59, 995000000, time.UTC), + Updated: time.Date(2025, time.December, 6, 15, 4, 37, 324000000, time.UTC), + Labels: []*base.Label{}, + Reactions: []*base.Reaction{}, + }, + { + Number: 3, + Title: "Fix plz", + Content: "Can we do something about it? !6 is maybe related to that.", // was "!2" on gitlab, now !6 on forgejo + Milestone: "", + PosterID: 10529876, + PosterName: "patdyn", + State: "opened", + Created: time.Date(2025, time.November, 25, 9, 49, 31, 991000000, time.UTC), + Updated: time.Date(2025, time.November, 25, 9, 49, 31, 991000000, time.UTC), + Labels: []*base.Label{}, + Reactions: []*base.Reaction{}, }, { Number: 2, @@ -180,7 +222,7 @@ func TestGitlabDownloadRepo(t *testing.T) { PosterName: "mkobel", State: "closed", Created: time.Date(2024, 9, 3, 14, 42, 35, 371000000, time.UTC), - Updated: time.Date(2024, 9, 3, 20, 3, 43, 536000000, time.UTC), + Updated: time.Date(2026, 2, 13, 20, 46, 11, 889000000, time.UTC), Labels: []*base.Label{ { Name: "duplicate", @@ -220,18 +262,42 @@ func TestGitlabDownloadRepo(t *testing.T) { }, Closed: timePtr(time.Date(2024, 9, 3, 14, 43, 10, 906000000, time.UTC)), }, + }, issues) + issues, isEnd, err = downloader.GetIssues(2, 3) + require.NoError(t, err) + assert.True(t, isEnd) + assertIssuesEqual(t, []*base.Issue{ { - Number: 3, - Title: "Fix plz", - Content: "Can we do something about it? !5 is maybe related to that.", - Milestone: "", - PosterID: 10529876, - PosterName: "patdyn", - State: "opened", - Created: time.Date(2025, time.November, 25, 9, 49, 31, 991000000, time.UTC), - Updated: time.Date(2025, time.November, 25, 9, 49, 31, 991000000, time.UTC), - Labels: []*base.Label{}, - Reactions: []*base.Reaction{}, + Number: 1, + Title: "Please add an animated gif icon to the merge button", + Content: "I just want the merge button to hurt my eyes a little. :stuck_out_tongue_closed_eyes:", + Milestone: "1.0.0", + PosterID: 548513, + PosterName: "mkobel", + State: "closed", + Created: time.Date(2024, 9, 3, 14, 42, 34, 924000000, time.UTC), + Updated: time.Date(2024, 9, 3, 14, 48, 43, 756000000, time.UTC), + Labels: []*base.Label{ + { + Name: "bug", + }, + { + Name: "discussion", + }, + }, + Reactions: []*base.Reaction{ + { + UserID: 548513, + UserName: "mkobel", + Content: "thumbsup", + }, + { + UserID: 548513, + UserName: "mkobel", + Content: "open_mouth", + }, + }, + Closed: timePtr(time.Date(2024, 9, 3, 14, 43, 10, 708000000, time.UTC)), }, }, issues) @@ -258,6 +324,15 @@ func TestGitlabDownloadRepo(t *testing.T) { Content: "A second comment", Reactions: nil, }, + { + IssueIndex: 2, + PosterID: 2005797, + PosterName: "oliverpool", + Created: time.Date(2026, 2, 13, 20, 46, 11, 841000000, time.UTC), + Content: "with an image ![image](/uploads/3756af8a4893bea08b99536df000e932/image.png){width=217 height=280}", + Reactions: nil, + CommentType: "close", + }, { IssueIndex: 2, PosterID: 548513, @@ -281,7 +356,7 @@ func TestGitlabDownloadRepo(t *testing.T) { PosterID: 10529876, PosterName: "patdyn", Created: time.Date(2025, time.November, 25, 9, 49, 50, 899000000, time.UTC), - Content: "No actually its !4", + Content: "No actually its !5", Reactions: nil, }, }, comments) @@ -298,7 +373,7 @@ func TestGitlabDownloadRepo(t *testing.T) { PosterID: 10529876, PosterName: "patdyn", Created: time.Date(2025, time.November, 25, 9, 49, 0, 750000000, time.UTC), - Content: "Although we had some trouble with !4", + Content: "Although we had some trouble with !5.", Reactions: nil, }, { @@ -315,9 +390,9 @@ func TestGitlabDownloadRepo(t *testing.T) { require.NoError(t, err) assertPullRequestsEqual(t, []*base.PullRequest{ { - Number: 5, + Number: 6, Title: "Test/parsing", - Content: "Simillar to !4 this solves an issue.", + Content: "Simillar to !5 this solves an issue.", Milestone: "", PosterID: 10529876, PosterName: "patdyn", @@ -347,7 +422,7 @@ func TestGitlabDownloadRepo(t *testing.T) { Context: gitlabIssueContext{IsMergeRequest: true}, }, { - Number: 4, + Number: 5, Title: "Test branch", Content: "do not merge this PR", Milestone: "1.1.0", @@ -417,19 +492,20 @@ func TestGitlabSkippedIssueNumber(t *testing.T) { server := unittest.NewMockWebServer(t, "https://gitlab.com", fixturePath, gitlabPersonalAccessToken != "") defer server.Close() - downloader, err := NewGitlabDownloader(t.Context(), server.URL, "troyengel/archbuild", "", "", gitlabPersonalAccessToken) + downloader, err := NewGitlabDownloader(t.Context(), server.URL, "forgejo/test_repo-skipped-numbers", "", "", gitlabPersonalAccessToken) if err != nil { t.Fatalf("NewGitlabDownloader is nil: %v", err) } repo, err := downloader.GetRepoInfo() require.NoError(t, err) + // Repo Owner is blank in Gitlab Group repos assertRepositoryEqual(t, &base.Repository{ - Name: "archbuild", - Owner: "troyengel", - Description: "Arch packaging and build files", - CloneURL: server.URL + "/troyengel/archbuild.git", - OriginalURL: server.URL + "/troyengel/archbuild", - DefaultBranch: "master", + Name: "test_repo-skipped-numbers", + Owner: "", + Description: "", + CloneURL: server.URL + "/forgejo/test_repo-skipped-numbers.git", + OriginalURL: server.URL + "/forgejo/test_repo-skipped-numbers", + DefaultBranch: "main", }, repo) issues, isEnd, err := downloader.GetIssues(1, 10) @@ -439,7 +515,7 @@ func TestGitlabSkippedIssueNumber(t *testing.T) { // the only issue in this repository has number 2 assert.Len(t, issues, 1) assert.EqualValues(t, 2, issues[0].Number) - assert.Equal(t, "vpn unlimited errors", issues[0].Title) + assert.Equal(t, "2nd issue", issues[0].Title) prs, _, err := downloader.GetPullRequests(1, 10) require.NoError(t, err) @@ -448,7 +524,7 @@ func TestGitlabSkippedIssueNumber(t *testing.T) { // pull request 3 in Forgejo assert.Len(t, prs, 1) assert.EqualValues(t, 3, prs[0].Number) - assert.Equal(t, "Review", prs[0].Title) + assert.Equal(t, "cleanup README.md", prs[0].Title) } func gitlabClientMockSetup(t *testing.T) (*http.ServeMux, *httptest.Server, *gitlab.Client) { @@ -744,6 +820,7 @@ func TestCommentBodyParser(t *testing.T) { testNote4 := makeTestNote(4, "Closed by !1 and !14", false, now) testNote5 := makeTestNote(5, "Actually !1 and !1 are the same but !100 and !214 are not", false, now) testNote6 := makeTestNote(6, "!11 and !1 are simillar but !201 and !100 are not!", false, now) + testNote7 := makeTestNote(1, "Simillar to #9, may be solved in !004", false, now) parsedBody1 := downloader.convertMRReference(testNote1.Body) parsedBody2 := downloader.convertMRReference(testNote2.Body) @@ -751,6 +828,7 @@ func TestCommentBodyParser(t *testing.T) { parsedBody4 := downloader.convertMRReference(testNote4.Body) parsedBody5 := downloader.convertMRReference(testNote5.Body) parsedBody6 := downloader.convertMRReference(testNote6.Body) + parsedBody7 := downloader.convertMRReference(testNote7.Body) // Assuming a total of 20 comments + PRs assert.Equal(t, "Simillar to #9, may be solved in !14", parsedBody1) @@ -759,4 +837,5 @@ func TestCommentBodyParser(t *testing.T) { assert.Equal(t, "Closed by !11 and !24", parsedBody4) assert.Equal(t, "Actually !11 and !11 are the same but !110 and !224 are not", parsedBody5) assert.Equal(t, "!21 and !11 are simillar but !211 and !110 are not!", parsedBody6) + assert.Equal(t, "Simillar to #9, may be solved in !14", parsedBody7) } diff --git a/services/migrations/main_test.go b/services/migrations/main_test.go index d543bd6d9c..860483deed 100644 --- a/services/migrations/main_test.go +++ b/services/migrations/main_test.go @@ -5,6 +5,7 @@ package migrations import ( + "fmt" "testing" "time" @@ -109,7 +110,9 @@ func assertIssueEqual(t *testing.T, expected, actual *base.Issue) { func assertIssuesEqual(t *testing.T, expected, actual []*base.Issue) { if assert.Len(t, actual, len(expected)) { for i := range expected { - assertIssueEqual(t, expected[i], actual[i]) + t.Run(fmt.Sprintf("issue[%d]", i), func(t *testing.T) { + assertIssueEqual(t, expected[i], actual[i]) + }) } } } @@ -172,7 +175,6 @@ func assertReactionsEqual(t *testing.T, expected, actual []*base.Reaction) { func assertReleaseAssetEqual(t *testing.T, expected, actual *base.ReleaseAsset) { assert.Equal(t, expected.ID, actual.ID) assert.Equal(t, expected.Name, actual.Name) - assert.Equal(t, expected.ContentType, actual.ContentType) assert.Equal(t, expected.Size, actual.Size) assert.Equal(t, expected.DownloadCount, actual.DownloadCount) assertTimeEqual(t, expected.Created, actual.Created) @@ -181,9 +183,11 @@ func assertReleaseAssetEqual(t *testing.T, expected, actual *base.ReleaseAsset) } func assertReleaseAssetsEqual(t *testing.T, expected, actual []*base.ReleaseAsset) { - if assert.Len(t, actual, len(expected)) { + if assert.Len(t, actual, len(expected), "wrong number of assets") { for i := range expected { - assertReleaseAssetEqual(t, expected[i], actual[i]) + t.Run(fmt.Sprintf("asset[%d]", i), func(t *testing.T) { + assertReleaseAssetEqual(t, expected[i], actual[i]) + }) } } } @@ -204,9 +208,11 @@ func assertReleaseEqual(t *testing.T, expected, actual *base.Release) { } func assertReleasesEqual(t *testing.T, expected, actual []*base.Release) { - if assert.Len(t, actual, len(expected)) { + if assert.Len(t, actual, len(expected), "wrong number of releases") { for i := range expected { - assertReleaseEqual(t, expected[i], actual[i]) + t.Run(fmt.Sprintf("release[%d]", i), func(t *testing.T) { + assertReleaseEqual(t, expected[i], actual[i]) + }) } } } diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%3Fdirection=asc&page=1&per_page=2&sort=created&state=all b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%3Fdirection=asc&per_page=2&sort=created&state=all similarity index 100% rename from services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%3Fdirection=asc&page=1&per_page=2&sort=created&state=all rename to services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%3Fdirection=asc&per_page=2&sort=created&state=all diff --git a/services/migrations/testdata/github/pagination/GET_%2Frate_limit b/services/migrations/testdata/github/pagination/GET_%2Frate_limit new file mode 100644 index 0000000000..1491ff7e90 --- /dev/null +++ b/services/migrations/testdata/github/pagination/GET_%2Frate_limit @@ -0,0 +1,22 @@ +X-Ratelimit-Resource: core +Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset +X-Frame-Options: deny +X-Content-Type-Options: nosniff +X-Xss-Protection: 0 +Content-Security-Policy: default-src 'none' +Cache-Control: no-cache +X-Github-Api-Version-Selected: 2022-11-28 +X-Ratelimit-Limit: 5000 +X-Ratelimit-Used: 0 +Access-Control-Allow-Origin: * +Strict-Transport-Security: max-age=31536000; includeSubdomains; preload +Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin +X-Github-Media-Type: github.v3; format=json +X-Accepted-Github-Permissions: allows_permissionless_access=true +X-Ratelimit-Remaining: 5000 +X-Ratelimit-Reset: 1769189499 +Vary: Accept-Encoding, Accept, X-Requested-With +Content-Type: application/json; charset=utf-8 +X-Github-Request-Id: 545E:1E338F:1CE3AD6:1995EED:6973A26A + +{"resources":{"core":{"limit":5000,"used":0,"remaining":5000,"reset":1769189499},"search":{"limit":30,"used":0,"remaining":30,"reset":1769185959},"graphql":{"limit":5000,"used":0,"remaining":5000,"reset":1769189499},"integration_manifest":{"limit":5000,"used":0,"remaining":5000,"reset":1769189499},"source_import":{"limit":100,"used":0,"remaining":100,"reset":1769185959},"code_scanning_upload":{"limit":5000,"used":0,"remaining":5000,"reset":1769189499},"code_scanning_autofix":{"limit":10,"used":0,"remaining":10,"reset":1769185959},"actions_runner_registration":{"limit":10000,"used":0,"remaining":10000,"reset":1769189499},"scim":{"limit":15000,"used":0,"remaining":15000,"reset":1769189499},"dependency_snapshots":{"limit":100,"used":0,"remaining":100,"reset":1769185959},"dependency_sbom":{"limit":100,"used":0,"remaining":100,"reset":1769185959},"audit_log":{"limit":1750,"used":0,"remaining":1750,"reset":1769189499},"audit_log_streaming":{"limit":15,"used":0,"remaining":15,"reset":1769189499},"code_search":{"limit":10,"used":0,"remaining":10,"reset":1769185959}},"rate":{"limit":5000,"used":0,"remaining":5000,"reset":1769189499}} \ No newline at end of file diff --git a/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic b/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic new file mode 100644 index 0000000000..c50dc204a8 --- /dev/null +++ b/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic @@ -0,0 +1,24 @@ +X-Ratelimit-Limit: 5000 +X-Ratelimit-Reset: 1769189499 +Cache-Control: private, max-age=60, s-maxage=60 +Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With +X-Accepted-Github-Permissions: metadata=read +Strict-Transport-Security: max-age=31536000; includeSubdomains; preload +X-Content-Type-Options: nosniff +X-Github-Request-Id: 545E:1E338F:1CE3BE0:1995FCF:6973A26B +Etag: W/"f8dcc1a5a57a21528eb36e54740dd9b6307feb68e14c6143d8b3a5ab47c48f9e" +Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset +Access-Control-Allow-Origin: * +X-Xss-Protection: 0 +Content-Type: application/json; charset=utf-8 +X-Github-Media-Type: github.v3; param=scarlet-witch-preview; format=json, github.mercy-preview; param=baptiste-preview.nebula-preview; format=json +X-Github-Api-Version-Selected: 2022-11-28 +X-Frame-Options: deny +Content-Security-Policy: default-src 'none' +X-Ratelimit-Remaining: 4999 +X-Ratelimit-Used: 1 +X-Ratelimit-Resource: core +Last-Modified: Thu, 08 Jan 2026 21:08:39 GMT +Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin + +{"id":68390476,"node_id":"MDEwOlJlcG9zaXRvcnk2ODM5MDQ3Ng==","name":"libvmod-dynamic","full_name":"nigoroll/libvmod-dynamic","private":false,"owner":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"html_url":"https://github.com/nigoroll/libvmod-dynamic","description":"The Varnish dns/named director continued","fork":false,"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","forks_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/forks","keys_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/teams","hooks_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/hooks","issue_events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/events{/number}","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/events","assignees_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/assignees{/user}","branches_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/branches{/branch}","tags_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/tags","blobs_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/git/refs{/sha}","trees_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/statuses/{sha}","languages_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/languages","stargazers_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/stargazers","contributors_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/contributors","subscribers_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/subscribers","subscription_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/subscription","commits_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/commits{/sha}","git_commits_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/git/commits{/sha}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/comments{/number}","issue_comment_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/comments{/number}","contents_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/contents/{+path}","compare_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/merges","archive_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/downloads","issues_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues{/number}","pulls_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls{/number}","milestones_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/milestones{/number}","notifications_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels{/name}","releases_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/releases{/id}","deployments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/deployments","created_at":"2016-09-16T15:13:13Z","updated_at":"2026-01-08T21:08:39Z","pushed_at":"2025-12-12T11:12:19Z","git_url":"git://github.com/nigoroll/libvmod-dynamic.git","ssh_url":"git@github.com:nigoroll/libvmod-dynamic.git","clone_url":"https://github.com/nigoroll/libvmod-dynamic.git","svn_url":"https://github.com/nigoroll/libvmod-dynamic","homepage":"","size":706,"stargazers_count":104,"watchers_count":104,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":38,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":3,"license":{"key":"bsd-2-clause","name":"BSD 2-Clause \"Simplified\" License","spdx_id":"BSD-2-Clause","url":"https://api.github.com/licenses/bsd-2-clause","node_id":"MDc6TGljZW5zZTQ="},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["director","dns","varnish","varnish-cache","vmod"],"visibility":"public","forks":38,"open_issues":3,"watchers":104,"default_branch":"master","permissions":{"admin":true,"maintain":true,"push":true,"triage":true,"pull":true},"network_count":38,"subscribers_count":10} \ No newline at end of file diff --git a/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic%2Fissues%3Fafter=Y3Vyc29yOnYyOpLPAAABaaHKpHDOGUReFQ%253D%253D&direction=asc&per_page=45&sort=created&state=all b/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic%2Fissues%3Fafter=Y3Vyc29yOnYyOpLPAAABaaHKpHDOGUReFQ%253D%253D&direction=asc&per_page=45&sort=created&state=all new file mode 100644 index 0000000000..3f5fa2799c --- /dev/null +++ b/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic%2Fissues%3Fafter=Y3Vyc29yOnYyOpLPAAABaaHKpHDOGUReFQ%253D%253D&direction=asc&per_page=45&sort=created&state=all @@ -0,0 +1,24 @@ +Content-Type: application/json; charset=utf-8 +Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With +Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset +Strict-Transport-Security: max-age=31536000; includeSubdomains; preload +Content-Security-Policy: default-src 'none' +X-Ratelimit-Reset: 1769189499 +X-Ratelimit-Resource: core +Etag: W/"ed7ff15fd20853d181507588a8f6671a3f5f71f80578be1f45d7f6ecd077d147" +Access-Control-Allow-Origin: * +X-Frame-Options: deny +Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin +X-Ratelimit-Limit: 5000 +X-Github-Api-Version-Selected: 2022-11-28 +X-Content-Type-Options: nosniff +X-Xss-Protection: 0 +X-Ratelimit-Remaining: 4997 +X-Ratelimit-Used: 3 +Cache-Control: private, max-age=60, s-maxage=60 +X-Github-Media-Type: github.v3; param=squirrel-girl-preview +Link: ; rel="next", ; rel="prev" +X-Accepted-Github-Permissions: issues=read +X-Github-Request-Id: 545E:1E338F:1CE43FC:19966FB:6973A26C + +[{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/47","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/47/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/47/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/47/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/47","id":436380232,"node_id":"MDU6SXNzdWU0MzYzODAyMzI=","number":47,"title":"missing /etc/services -> test09 timeout ","user":{"login":"danielmotaleite","id":11890049,"node_id":"MDQ6VXNlcjExODkwMDQ5","avatar_url":"https://avatars.githubusercontent.com/u/11890049?v=4","gravatar_id":"","url":"https://api.github.com/users/danielmotaleite","html_url":"https://github.com/danielmotaleite","followers_url":"https://api.github.com/users/danielmotaleite/followers","following_url":"https://api.github.com/users/danielmotaleite/following{/other_user}","gists_url":"https://api.github.com/users/danielmotaleite/gists{/gist_id}","starred_url":"https://api.github.com/users/danielmotaleite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danielmotaleite/subscriptions","organizations_url":"https://api.github.com/users/danielmotaleite/orgs","repos_url":"https://api.github.com/users/danielmotaleite/repos","events_url":"https://api.github.com/users/danielmotaleite/events{/privacy}","received_events_url":"https://api.github.com/users/danielmotaleite/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2019-04-23T20:40:43Z","updated_at":"2019-04-27T09:43:12Z","closed_at":"2019-04-27T09:43:12Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I'm building the master vs varnish 6.2.0 inside a debian based docker and when running the tests, test09 fails with the error below.\r\n\r\n **** v1 0.6 vsl| 0 Error - vmod-dynamic: vcl1 d4 127.0.0.1:http getaddrinfo -8 (Servname not supported for ai_socktype)\r\n\r\nAs i noticed the `:http` port, i went to check the container /etc/services and it didn't existed. Creating it fixed the problem.\r\n\r\nSo probably it would be better to use a number instead of port name, so this do not happen to other people trying to build this inside a container \r\n\r\nThanks\r\n\r\nfull error log:\r\n\r\n```\r\n===============================================\r\n libvmod-dynamic trunk: src/test-suite.log\r\n===============================================\r\n\r\n# TOTAL: 14\r\n# PASS: 13\r\n# SKIP: 0\r\n# XFAIL: 0\r\n# FAIL: 1\r\n# XPASS: 0\r\n# ERROR: 0\r\n\r\n.. contents:: :depth: 2\r\n\r\nFAIL: tests/test09\r\n==================\r\n\r\n* top 0.0 TEST ./tests/test09.vtc starting\r\n**** top 0.0 extmacro def pwd=/usr/src/libvmod-dynamic/src\r\n**** top 0.0 extmacro def vmod_dynamic=dynamic from \"/usr/src/libvmod-dynamic/src/.libs/libvmod_dynamic.so\"\r\n**** top 0.0 extmacro def localhost=127.0.0.1\r\n**** top 0.0 extmacro def bad_backend=127.0.0.1 33485\r\n**** top 0.0 extmacro def bad_ip=192.0.2.255\r\n**** top 0.0 macro def testdir=/usr/src/libvmod-dynamic/src/./tests\r\n**** top 0.0 macro def tmpdir=/tmp/vtc.18162.680e3a26\r\n** top 0.0 === varnishtest \"Ipv4- or IPv6-only\"\r\n* top 0.0 VTEST Ipv4- or IPv6-only\r\n** top 0.0 === shell \"getent hosts localhost www.localhost img.localhost ||...\r\n**** top 0.0 shell_cmd|exec 2>&1 ; getent hosts localhost www.localhost img.localhost || true\r\n**** top 0.0 shell_out|::1 localhost ip6-localhost ip6-loopback\r\n**** top 0.0 shell_out|127.0.0.1 www.localhost img.localhost\r\n**** top 0.0 shell_out|127.0.0.1 www.localhost img.localhost\r\n**** top 0.0 shell_status = 0x0000\r\n** top 0.0 === server s1 { } -start\r\n** s1 0.0 Starting server\r\n**** s1 0.0 macro def s1_addr=127.0.0.1\r\n**** s1 0.0 macro def s1_port=41365\r\n**** s1 0.0 macro def s1_sock=127.0.0.1 41365\r\n* s1 0.0 Listen on 127.0.0.1 41365\r\n** top 0.0 === varnish v1 -vcl+backend {\r\n** s1 0.0 Started on 127.0.0.1 41365 (1 iterations)\r\n** v1 0.0 Launch\r\n*** v1 0.0 CMD: cd ${pwd} && exec varnishd -d -n /tmp/vtc.18162.680e3a26/v1 -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p sigsegv_handler=on -p thread_pool_min=10 -p debug=+vtc_mode -a '127.0.0.1:0' -M '127.0.0.1 34053' -P /tmp/vtc.18162.680e3a26/v1/varnishd.pid \r\n*** v1 0.0 CMD: cd /usr/src/libvmod-dynamic/src && exec varnishd -d -n /tmp/vtc.18162.680e3a26/v1 -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p sigsegv_handler=on -p thread_pool_min=10 -p debug=+vtc_mode -a '127.0.0.1:0' -M '127.0.0.1 34053' -P /tmp/vtc.18162.680e3a26/v1/varnishd.pid \r\n*** v1 0.0 PID: 18170\r\n**** v1 0.0 macro def v1_pid=18170\r\n**** v1 0.0 macro def v1_name=/tmp/vtc.18162.680e3a26/v1\r\n*** v1 0.0 debug|Debug: Version: varnish-6.2.0 revision b14a3d38dbe918ad50d3838b11aa596f42179b54\r\n*** v1 0.0 debug|Debug: Platform: Linux,5.0.9-050009-generic,x86_64,-junix,-sdefault,-sdefault,-hcritbit\r\n*** v1 0.0 debug|200 321 \r\n*** v1 0.0 debug|-----------------------------\r\n*** v1 0.0 debug|Varnish Cache CLI 1.0\r\n*** v1 0.0 debug|-----------------------------\r\n*** v1 0.0 debug|Linux,5.0.9-050009-generic,x86_64,-junix,-sdefault,-sdefault,-hcritbit\r\n*** v1 0.0 debug|varnish-6.2.0 revision b14a3d38dbe918ad50d3838b11aa596f42179b54\r\n*** v1 0.0 debug|\r\n*** v1 0.0 debug|Type 'help' for command list.\r\n*** v1 0.0 debug|Type 'quit' to close CLI session.\r\n*** v1 0.0 debug|Type 'start' to launch worker process.\r\n*** v1 0.0 debug|\r\n**** v1 0.1 CLIPOLL 1 0x1 0x0\r\n*** v1 0.1 CLI connection fd = 7\r\n*** v1 0.1 CLI RX 107\r\n**** v1 0.1 CLI RX|sxjzgcofjaexybfaeanoudglalzrweqs\r\n**** v1 0.1 CLI RX|\r\n**** v1 0.1 CLI RX|Authentication required.\r\n**** v1 0.1 CLI TX|auth a484337cbdcd04a8fb8f97602334132d9decb95eb024cba29c416958fc4e114e\r\n*** v1 0.1 CLI RX 200\r\n**** v1 0.1 CLI RX|-----------------------------\r\n**** v1 0.1 CLI RX|Varnish Cache CLI 1.0\r\n**** v1 0.1 CLI RX|-----------------------------\r\n**** v1 0.1 CLI RX|Linux,5.0.9-050009-generic,x86_64,-junix,-sdefault,-sdefault,-hcritbit\r\n**** v1 0.1 CLI RX|varnish-6.2.0 revision b14a3d38dbe918ad50d3838b11aa596f42179b54\r\n**** v1 0.1 CLI RX|\r\n**** v1 0.1 CLI RX|Type 'help' for command list.\r\n**** v1 0.1 CLI RX|Type 'quit' to close CLI session.\r\n**** v1 0.1 CLI RX|Type 'start' to launch worker process.\r\n**** v1 0.1 CLI TX|vcl.inline vcl1 << %XJEIFLH|)Xspa8P\r\n**** v1 0.1 CLI TX|vcl 4.1;\r\n**** v1 0.1 CLI TX|backend s1 { .host = \"127.0.0.1\"; .port = \"41365\"; }\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\timport dynamic from \"/usr/src/libvmod-dynamic/src/.libs/libvmod_dynamic.so\";\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tacl ipv4_only { \"0.0.0.0\"/0; }\r\n**** v1 0.1 CLI TX|\\tacl ipv6_only { \"::0\"/0; }\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tsub vcl_init {\r\n**** v1 0.1 CLI TX|\\t\\tnew d4 = dynamic.director(whitelist = ipv4_only);\r\n**** v1 0.1 CLI TX|\\t\\tnew d6 = dynamic.director(whitelist = ipv6_only);\r\n**** v1 0.1 CLI TX|\\t}\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tsub vcl_recv {\r\n**** v1 0.1 CLI TX|\\t\\tset req.backend_hint = d4.backend(\"127.0.0.1\");\r\n**** v1 0.1 CLI TX|\\t\\tset req.backend_hint = d4.backend(\"::1\");\r\n**** v1 0.1 CLI TX|\\t\\tset req.backend_hint = d6.backend(\"127.0.0.1\");\r\n**** v1 0.1 CLI TX|\\t\\tset req.backend_hint = d6.backend(\"::1\");\r\n**** v1 0.1 CLI TX|\\t\\treturn (synth(200));\r\n**** v1 0.1 CLI TX|\\t}\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|%XJEIFLH|)Xspa8P\r\n*** v1 0.2 vsl|No VSL chunk found (child not started ?)\r\n*** v1 0.3 CLI RX 200\r\n**** v1 0.3 CLI RX|VCL compiled.\r\n**** v1 0.3 CLI TX|vcl.use vcl1\r\n*** v1 0.3 CLI RX 200\r\n** v1 0.3 Start\r\n**** v1 0.3 CLI TX|start\r\n*** v1 0.3 vsl|No VSL chunk found (child not started ?)\r\n*** v1 0.4 debug|Debug: Child (18184) Started\r\n*** v1 0.4 CLI RX 200\r\n*** v1 0.4 wait-running\r\n**** v1 0.4 CLI TX|status\r\n*** v1 0.4 debug|Info: Child (18184) said Child starts\r\n**** v1 0.4 vsl| 0 CLI - Rd vcl.load \"vcl1\" vcl_vcl1.1556051154.031158/vgc.so 1auto\r\n**** v1 0.4 vsl| 0 CLI - Wr 200 52 Loaded \"vcl_vcl1.1556051154.031158/vgc.so\" as \"vcl1\"\r\n**** v1 0.4 vsl| 0 CLI - Rd vcl.use \"vcl1\"\r\n**** v1 0.4 vsl| 0 CLI - Wr 200 0 \r\n**** v1 0.4 vsl| 0 CLI - Rd start\r\n**** v1 0.4 vsl| 0 CLI - Wr 200 0 \r\n*** v1 0.4 CLI RX 200\r\n**** v1 0.4 CLI RX|Child in state running\r\n**** v1 0.4 CLI TX|debug.listen_address\r\n*** v1 0.5 CLI RX 200\r\n**** v1 0.5 CLI RX|127.0.0.1 46781\r\n**** v1 0.5 CLI TX|debug.xid 999\r\n*** v1 0.5 CLI RX 200\r\n**** v1 0.5 CLI RX|XID is 999\r\n**** v1 0.5 CLI TX|debug.listen_address\r\n**** v1 0.5 vsl| 0 CLI - Rd debug.listen_address \r\n**** v1 0.5 vsl| 0 CLI - Wr 200 16 127.0.0.1 46781\r\n\r\n**** v1 0.5 vsl| 0 CLI - Rd debug.xid 999 \r\n**** v1 0.5 vsl| 0 CLI - Wr 200 10 XID is 999\r\n*** v1 0.6 CLI RX 200\r\n**** v1 0.6 CLI RX|127.0.0.1 46781\r\n** v1 0.6 Listen on 127.0.0.1 46781\r\n**** v1 0.6 macro def v1_addr=127.0.0.1\r\n**** v1 0.6 macro def v1_port=46781\r\n**** v1 0.6 macro def v1_sock=127.0.0.1 46781\r\n** top 0.6 === logexpect l4 -v v1 -g raw {expect * 0 Error \"d4 ::1:http acl...\r\n** l4 0.6 === expect * 0 Error \"d4 ::1:http acl-mismatch\"\r\n** top 0.6 === logexpect l6 -v v1 -g raw {expect * 0 Error \"d6 127.0.0.1:ht...\r\n**** l4 0.6 begin|\r\n*** l4 0.6 expecting| expect * 0 Error d4 ::1:http acl-mismatch\r\n** l6 0.6 === expect * 0 Error \"d6 127.0.0.1:http acl-mismatch\"\r\n** top 0.6 === client c1 {\r\n** c1 0.6 Starting client\r\n** c1 0.6 Waiting for client\r\n**** l6 0.6 begin|\r\n*** l6 0.6 expecting| expect * 0 Error d6 127.0.0.1:http acl-mismatch\r\n*** c1 0.6 Connect to 127.0.0.1 46781\r\n*** c1 0.6 connected fd 27 from 127.0.0.1 53442 to 127.0.0.1 46781\r\n** c1 0.6 === txreq\r\n**** c1 0.6 txreq|GET / HTTP/1.1\\r\r\n**** c1 0.6 txreq|Host: 127.0.0.1\\r\r\n**** c1 0.6 txreq|\\r\r\n** c1 0.6 === rxresp\r\n**** c1 0.6 rxhdr|HTTP/1.1 200 OK\\r\r\n**** c1 0.6 rxhdr|Date: Tue, 23 Apr 2019 20:25:54 GMT\\r\r\n**** c1 0.6 rxhdr|Server: Varnish\\r\r\n**** c1 0.6 rxhdr|X-Varnish: 1001\\r\r\n**** c1 0.6 rxhdr|Content-Type: text/html; charset=utf-8\\r\r\n**** c1 0.6 rxhdr|Retry-After: 5\\r\r\n**** c1 0.6 rxhdr|Content-Length: 227\\r\r\n**** c1 0.6 rxhdr|Accept-Ranges: bytes\\r\r\n**** c1 0.6 rxhdr|Connection: keep-alive\\r\r\n**** c1 0.6 rxhdr|\\r\r\n**** c1 0.6 rxhdrlen = 213\r\n**** c1 0.6 http[ 0] |HTTP/1.1\r\n**** c1 0.6 http[ 1] |200\r\n**** c1 0.6 http[ 2] |OK\r\n**** c1 0.6 http[ 3] |Date: Tue, 23 Apr 2019 20:25:54 GMT\r\n**** c1 0.6 http[ 4] |Server: Varnish\r\n**** c1 0.6 http[ 5] |X-Varnish: 1001\r\n**** c1 0.6 http[ 6] |Content-Type: text/html; charset=utf-8\r\n**** c1 0.6 http[ 7] |Retry-After: 5\r\n**** c1 0.6 http[ 8] |Content-Length: 227\r\n**** c1 0.6 http[ 9] |Accept-Ranges: bytes\r\n**** c1 0.6 http[10] |Connection: keep-alive\r\n**** c1 0.6 c-l|\r\n**** c1 0.6 c-l|\r\n**** c1 0.6 c-l| \r\n**** c1 0.6 c-l| 200 OK\r\n**** c1 0.6 c-l| \r\n**** c1 0.6 c-l| \r\n**** c1 0.6 c-l|

Error 200 OK

\r\n**** c1 0.6 c-l|

OK

\r\n**** c1 0.6 c-l|

Guru Meditation:

\r\n**** c1 0.6 c-l|

XID: 1001

\r\n**** c1 0.6 c-l|
\r\n**** c1 0.6 c-l|

Varnish cache server

\r\n**** c1 0.6 c-l| \r\n**** c1 0.6 c-l|\r\n**** c1 0.6 bodylen = 227\r\n** c1 0.6 === expect resp.status == 200\r\n**** c1 0.6 EXPECT resp.status (200) == \"200\" match\r\n*** c1 0.6 closing fd 27\r\n** c1 0.6 Ending\r\n** top 0.6 === logexpect l4 -wait\r\n** l4 0.6 Waiting for logexp\r\n**** v1 0.6 vsl| 0 CLI - Rd debug.listen_address \r\n**** v1 0.6 vsl| 0 CLI - Wr 200 16 127.0.0.1 46781\r\n\r\n**** v1 0.6 vsl| 1000 Begin c sess 0 HTTP/1\r\n**** v1 0.6 vsl| 1000 SessOpen c 127.0.0.1 53442 a0 127.0.0.1 46781 1556051154.473491 19\r\n**** v1 0.6 vsl| 1000 Link c req 1001 rxreq\r\n**** v1 0.6 vsl| 0 Timestamp - vmod-dynamic vcl1.d4(127.0.0.1:http) Lookup: 1556051154.473908 0.000000 0.000000\r\n**** v1 0.6 vsl| 0 Timestamp - vmod-dynamic vcl1.d4(::1:http) Lookup: 1556051154.474028 0.000000 0.000000\r\n**** v1 0.6 vsl| 0 Timestamp - vmod-dynamic vcl1.d6(127.0.0.1:http) Lookup: 1556051154.474126 0.000000 0.000000\r\n**** v1 0.6 vsl| 0 Timestamp - vmod-dynamic vcl1.d6(::1:http) Lookup: 1556051154.474199 0.000000 0.000000\r\n**** v1 0.6 vsl| 0 Timestamp - vmod-dynamic vcl1.d4(::1:http) Results: 1556051154.475055 0.001027 0.001027\r\n**** v1 0.6 vsl| 0 Error - vmod-dynamic: vcl1 d4 ::1:http getaddrinfo -8 (Servname not supported for ai_socktype)\r\n**** v1 0.6 vsl| 1001 Begin c req 1000 rxreq\r\n**** v1 0.6 vsl| 1001 Timestamp c Start: 1556051154.473606 0.000000 0.000000\r\n**** v1 0.6 vsl| 1001 Timestamp c Req: 1556051154.473606 0.000000 0.000000\r\n**** v1 0.6 vsl| 1001 VCL_use c vcl1\r\n**** v1 0.6 vsl| 1001 ReqStart c 127.0.0.1 53442 a0\r\n**** v1 0.6 vsl| 1001 ReqMethod c GET\r\n**** v1 0.6 vsl| 1001 ReqURL c /\r\n**** v1 0.6 vsl| 1001 ReqProtocol c HTTP/1.1\r\n**** v1 0.6 vsl| 1001 ReqHeader c Host: 127.0.0.1\r\n**** v1 0.6 vsl| 1001 ReqHeader c X-Forwarded-For: 127.0.0.1\r\n**** v1 0.6 vsl| 1001 VCL_call c RECV\r\n**** v1 0.6 vsl| 1001 VCL_return c synth\r\n**** v1 0.6 vsl| 1001 VCL_call c HASH\r\n**** v1 0.6 vsl| 1001 VCL_return c lookup\r\n**** v1 0.6 vsl| 1001 Timestamp c Process: 1556051154.474159 0.000553 0.000553\r\n**** v1 0.6 vsl| 1001 RespHeader c Date: Tue, 23 Apr 2019 20:25:54 GMT\r\n**** v1 0.6 vsl| 1001 RespHeader c Server: Varnish\r\n**** v1 0.6 vsl| 1001 RespHeader c X-Varnish: 1001\r\n**** v1 0.6 vsl| 1001 RespProtocol c HTTP/1.1\r\n**** v1 0.6 vsl| 1001 RespStatus c 200\r\n**** v1 0.6 vsl| 1001 RespReason c OK\r\n**** v1 0.6 vsl| 1001 RespReason c OK\r\n**** v1 0.6 vsl| 1001 VCL_call c SYNTH\r\n**** v1 0.6 vsl| 1001 RespHeader c Content-Type: text/html; charset=utf-8\r\n**** v1 0.6 vsl| 1001 RespHeader c Retry-After: 5\r\n**** v1 0.6 vsl| 1001 VCL_return c deliver\r\n**** v1 0.6 vsl| 1001 RespHeader c Content-Length: 227\r\n**** v1 0.6 vsl| 1001 Storage c malloc Transient\r\n**** v1 0.6 vsl| 1001 Filters c \r\n**** v1 0.6 vsl| 1001 RespHeader c Accept-Ranges: bytes\r\n**** v1 0.6 vsl| 1001 RespHeader c Connection: keep-alive\r\n**** v1 0.6 vsl| 1001 Timestamp c Resp: 1556051154.475164 0.001558 0.001005\r\n**** v1 0.6 vsl| 1001 ReqAcct c 35 0 35 213 227 440\r\n**** v1 0.6 vsl| 1001 End c \r\n**** v1 0.6 vsl| 0 Timestamp - vmod-dynamic vcl1.d4(127.0.0.1:http) Results: 1556051154.475189 0.001281 0.001281\r\n**** v1 0.6 vsl| 0 Timestamp - vmod-dynamic vcl1.d6(127.0.0.1:http) Results: 1556051154.475199 0.001073 0.001073\r\n**** v1 0.6 vsl| 0 Error - vmod-dynamic: vcl1 d4 127.0.0.1:http getaddrinfo -8 (Servname not supported for ai_socktype)\r\n**** v1 0.6 vsl| 0 Error - vmod-dynamic: vcl1 d6 127.0.0.1:http getaddrinfo -8 (Servname not supported for ai_socktype)\r\n**** v1 0.6 vsl| 0 Timestamp - vmod-dynamic vcl1.d6(::1:http) Results: 1556051154.475218 0.001018 0.001018\r\n**** v1 0.6 vsl| 0 Error - vmod-dynamic: vcl1 d6 ::1:http getaddrinfo -8 (Servname not supported for ai_socktype)\r\n**** v1 0.6 vsl| 1000 SessClose c REM_CLOSE 0.003\r\n**** v1 0.6 vsl| 1000 End c \r\n**** v1 3.4 vsl| 0 CLI - Rd ping\r\n**** v1 3.4 vsl| 0 CLI - Wr 200 19 PONG 1556051157 1.0\r\n**** v1 6.4 vsl| 0 CLI - Rd ping\r\n**** v1 6.4 vsl| 0 CLI - Wr 200 19 PONG 1556051160 1.0\r\n**** v1 9.4 vsl| 0 CLI - Rd ping\r\n**** v1 9.4 vsl| 0 CLI - Wr 200 19 PONG 1556051163 1.0\r\n**** v1 12.5 vsl| 0 CLI - Rd ping\r\n**** v1 12.5 vsl| 0 CLI - Wr 200 19 PONG 1556051166 1.0\r\n**** v1 15.5 vsl| 0 CLI - Rd ping\r\n**** v1 15.5 vsl| 0 CLI - Wr 200 19 PONG 1556051169 1.0\r\n**** v1 18.5 vsl| 0 CLI - Rd ping\r\n**** v1 18.5 vsl| 0 CLI - Wr 200 19 PONG 1556051172 1.0\r\n**** v1 21.4 vsl| 0 CLI - Rd ping\r\n**** v1 21.4 vsl| 0 CLI - Wr 200 19 PONG 1556051175 1.0\r\n**** v1 24.4 vsl| 0 CLI - Rd ping\r\n**** v1 24.4 vsl| 0 CLI - Wr 200 19 PONG 1556051178 1.0\r\n**** v1 27.4 vsl| 0 CLI - Rd ping\r\n**** v1 27.4 vsl| 0 CLI - Wr 200 19 PONG 1556051181 1.0\r\n**** v1 30.4 vsl| 0 CLI - Rd ping\r\n**** v1 30.4 vsl| 0 CLI - Wr 200 19 PONG 1556051184 1.0\r\n**** v1 33.4 vsl| 0 CLI - Rd ping\r\n**** v1 33.4 vsl| 0 CLI - Wr 200 19 PONG 1556051187 1.0\r\n**** v1 36.4 vsl| 0 CLI - Rd ping\r\n**** v1 36.4 vsl| 0 CLI - Wr 200 19 PONG 1556051190 1.0\r\n**** v1 39.4 vsl| 0 CLI - Rd ping\r\n**** v1 39.4 vsl| 0 CLI - Wr 200 19 PONG 1556051193 1.0\r\n**** v1 42.4 vsl| 0 CLI - Rd ping\r\n**** v1 42.4 vsl| 0 CLI - Wr 200 19 PONG 1556051196 1.0\r\n**** v1 45.4 vsl| 0 CLI - Rd ping\r\n**** v1 45.4 vsl| 0 CLI - Wr 200 19 PONG 1556051199 1.0\r\n**** v1 48.4 vsl| 0 CLI - Rd ping\r\n**** v1 48.4 vsl| 0 CLI - Wr 200 19 PONG 1556051202 1.0\r\n**** v1 51.4 vsl| 0 CLI - Rd ping\r\n**** v1 51.4 vsl| 0 CLI - Wr 200 19 PONG 1556051205 1.0\r\n**** v1 54.4 vsl| 0 CLI - Rd ping\r\n**** v1 54.4 vsl| 0 CLI - Wr 200 19 PONG 1556051208 1.0\r\n**** v1 57.4 vsl| 0 CLI - Rd ping\r\n**** v1 57.4 vsl| 0 CLI - Wr 200 19 PONG 1556051211 1.0\r\n# top TEST ./tests/test09.vtc TIMED OUT (kill -9)\r\n# top TEST ./tests/test09.vtc FAILED (60.061) signal=9\r\nFAIL tests/test09.vtc (exit status: 2)\r\n\r\n============================================================================\r\nTestsuite summary for libvmod-dynamic trunk\r\n============================================================================\r\n# TOTAL: 14\r\n# PASS: 13\r\n# SKIP: 0\r\n# XFAIL: 0\r\n# FAIL: 1\r\n# XPASS: 0\r\n# ERROR: 0\r\n============================================================================\r\nSee src/test-suite.log\r\n============================================================================\r\n\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/47/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/47/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/48","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/48/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/48/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/48/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/48","id":468740958,"node_id":"MDU6SXNzdWU0Njg3NDA5NTg=","number":48,"title":"Compile error in varnish 6.0.1-1~stretch","user":{"login":"razvanphp","id":4599319,"node_id":"MDQ6VXNlcjQ1OTkzMTk=","avatar_url":"https://avatars.githubusercontent.com/u/4599319?v=4","gravatar_id":"","url":"https://api.github.com/users/razvanphp","html_url":"https://github.com/razvanphp","followers_url":"https://api.github.com/users/razvanphp/followers","following_url":"https://api.github.com/users/razvanphp/following{/other_user}","gists_url":"https://api.github.com/users/razvanphp/gists{/gist_id}","starred_url":"https://api.github.com/users/razvanphp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/razvanphp/subscriptions","organizations_url":"https://api.github.com/users/razvanphp/orgs","repos_url":"https://api.github.com/users/razvanphp/repos","events_url":"https://api.github.com/users/razvanphp/events{/privacy}","received_events_url":"https://api.github.com/users/razvanphp/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":5,"created_at":"2019-07-16T16:05:31Z","updated_at":"2019-07-25T10:01:07Z","closed_at":"2019-07-17T09:56:52Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"We are using tag 6.0, where you backported some refactorings and we are now getting the following error:\r\n\r\n```\r\nIn file included from vmod_dynamic.c:56:0:\r\nvmod_dynamic.h:88:2: error: unknown type name ‘vtim_real’\r\n vtim_real deadline;\r\n ^~~~~~~~~\r\nvmod_dynamic.h:137:2: error: unknown type name ‘vtim_real’\r\n vtim_real deadline;\r\n ^~~~~~~~~\r\nvmod_dynamic.c:410:17: error: unknown type name ‘vtim_real’\r\n void *priv, vtim_real now)\r\n ^~~~~~~~~\r\nvmod_dynamic.c: In function ‘dynamic_lookup_thread’:\r\nvmod_dynamic.c:474:2: error: unknown type name ‘vtim_real’\r\n vtim_real lookup, results, update;\r\n ^~~~~~~~~\r\nvmod_dynamic.c:498:4: error: implicit declaration of function ‘dynamic_update_domain’ [-Werror=implicit-function-declaration]\r\n dynamic_update_domain(dom, res, res_priv, results);\r\n ^~~~~~~~~~~~~~~~~~~~~\r\nAt top level:\r\nvmod_dynamic.c:311:1: error: ‘dynamic_add’ defined but not used [-Werror=unused-function]\r\n dynamic_add(VRT_CTX, struct dynamic_domain *dom, const struct res_info *info)\r\n ^~~~~~~~~~~\r\ncc1: all warnings being treated as errors\r\nmake[2]: *** [vmod_dynamic.lo] Error 1\r\nmake[1]: ***\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/48/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/48/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/49","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/49/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/49/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/49/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/49","id":472708206,"node_id":"MDU6SXNzdWU0NzI3MDgyMDY=","number":49,"title":"compilation issue for 6.0.3","user":{"login":"darjisanket","id":28775672,"node_id":"MDQ6VXNlcjI4Nzc1Njcy","avatar_url":"https://avatars.githubusercontent.com/u/28775672?v=4","gravatar_id":"","url":"https://api.github.com/users/darjisanket","html_url":"https://github.com/darjisanket","followers_url":"https://api.github.com/users/darjisanket/followers","following_url":"https://api.github.com/users/darjisanket/following{/other_user}","gists_url":"https://api.github.com/users/darjisanket/gists{/gist_id}","starred_url":"https://api.github.com/users/darjisanket/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/darjisanket/subscriptions","organizations_url":"https://api.github.com/users/darjisanket/orgs","repos_url":"https://api.github.com/users/darjisanket/repos","events_url":"https://api.github.com/users/darjisanket/events{/privacy}","received_events_url":"https://api.github.com/users/darjisanket/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2019-07-25T07:27:49Z","updated_at":"2019-07-25T09:45:05Z","closed_at":"2019-07-25T09:45:02Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Thanks for libvmod-dynamic it helps us to scale up/down our environment based on traffic. currently, we are using 4.1 and wanted to move to 6.0.\r\nI am using https://packagecloud.io/varnishcache/varnish60lts repo for varnish.\r\nwhile compiling, I got below compilation issues.\r\n \r\n```\r\n VMODTOOL vcc_dynamic_if.c\r\n CC vmod_dynamic.lo\r\n CC dyn_resolver_gai.lo\r\n CC vmod_dynamic_service.lo\r\nvmod_dynamic_service.c: In function 'service_resolve':\r\nvmod_dynamic_service.c:161:5: error: 'n' may be used uninitialized in this function [-Werror=maybe-uninitialized]\r\n if (n == 0)\r\n ^\r\nvmod_dynamic_service.c:166:5: error: 'w' may be used uninitialized in this function [-Werror=maybe-uninitialized]\r\n if (w == 0) {\r\n ^\r\ncc1: all warnings being treated as errors\r\nmake[2]: Leaving directory `/usr/redsky/src/libvmod-dynamic/src'\r\nmake[2]: *** [vmod_dynamic_service.lo] Error 1\r\nmake[1]: *** [all-recursive] Error 1\r\nmake[1]: Leaving directory `/usr/redsky/src/libvmod-dynamic'\r\nmake: *** [all] Error 2\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/49/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/49/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/50","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/50/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/50/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/50/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/50","id":484121184,"node_id":"MDExOlB1bGxSZXF1ZXN0MzEwMDY2MDM2","number":50,"title":"Add missing headers when building under FreeBSD + FreeBSD installation instructions","user":{"login":"zi0r","id":1676702,"node_id":"MDQ6VXNlcjE2NzY3MDI=","avatar_url":"https://avatars.githubusercontent.com/u/1676702?v=4","gravatar_id":"","url":"https://api.github.com/users/zi0r","html_url":"https://github.com/zi0r","followers_url":"https://api.github.com/users/zi0r/followers","following_url":"https://api.github.com/users/zi0r/following{/other_user}","gists_url":"https://api.github.com/users/zi0r/gists{/gist_id}","starred_url":"https://api.github.com/users/zi0r/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zi0r/subscriptions","organizations_url":"https://api.github.com/users/zi0r/orgs","repos_url":"https://api.github.com/users/zi0r/repos","events_url":"https://api.github.com/users/zi0r/events{/privacy}","received_events_url":"https://api.github.com/users/zi0r/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2019-08-22T17:29:30Z","updated_at":"2019-08-23T07:54:20Z","closed_at":"2019-08-23T07:54:16Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/50","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/50","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/50.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/50.patch","merged_at":"2019-08-23T07:54:16Z"},"body":"Currently fails to build under FreeBSD 11.3 without these includes.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/50/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/50/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/51","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/51/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/51/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/51/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/51","id":503980746,"node_id":"MDU6SXNzdWU1MDM5ODA3NDY=","number":51,"title":"vmod-dynamic accepts port=0 which causes segfault","user":{"login":"lukaszlach","id":5011490,"node_id":"MDQ6VXNlcjUwMTE0OTA=","avatar_url":"https://avatars.githubusercontent.com/u/5011490?v=4","gravatar_id":"","url":"https://api.github.com/users/lukaszlach","html_url":"https://github.com/lukaszlach","followers_url":"https://api.github.com/users/lukaszlach/followers","following_url":"https://api.github.com/users/lukaszlach/following{/other_user}","gists_url":"https://api.github.com/users/lukaszlach/gists{/gist_id}","starred_url":"https://api.github.com/users/lukaszlach/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lukaszlach/subscriptions","organizations_url":"https://api.github.com/users/lukaszlach/orgs","repos_url":"https://api.github.com/users/lukaszlach/repos","events_url":"https://api.github.com/users/lukaszlach/events{/privacy}","received_events_url":"https://api.github.com/users/lukaszlach/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":1,"created_at":"2019-10-08T11:13:28Z","updated_at":"2019-10-10T12:11:38Z","closed_at":"2019-10-10T12:11:38Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"If you define a service (for example in Consul) and do not provide the port number, SRV records return value of `0`. When vmod-dynamic tries to load such backend Varnish crashes with:\r\n\r\n```\r\nChild (24198) Panic at: Tue, 08 Oct 2019 10:45:17 GMT Wrong turn at mgt/mgt_child.c:287: Signal 11 (Segmentation fault) received at 0x10 si_code 1 version = varnish-5.2.0 revision 4c4875cbf, vrt api = 6.1 ident = Linux,3.16.0-6-amd64,x86_64,-junix,-smalloc,-smalloc,-hcritbit,epoll now = 19962215.563448 (mono), 1570531516.494987 (real)\r\n```\r\n\r\nThe issue is on this line:\r\nhttps://github.com/nigoroll/libvmod-dynamic/blob/master/src/dyn_resolver_getdns.c#L386\r\n\r\nThe internal discussion I have had about this issue ended with conslusion that if the port returned in SRV is invalid (`<= 0`), vmod should just ignore it and no try to fix it with hardcoded port `80`.\r\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/51/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/51/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/52","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/52/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/52/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/52/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/52","id":559811795,"node_id":"MDU6SXNzdWU1NTk4MTE3OTU=","number":52,"title":"Varnish stopped processing requests - threads waiting on vcl_mtx lock","user":{"login":"jpastuszek","id":20052,"node_id":"MDQ6VXNlcjIwMDUy","avatar_url":"https://avatars.githubusercontent.com/u/20052?v=4","gravatar_id":"","url":"https://api.github.com/users/jpastuszek","html_url":"https://github.com/jpastuszek","followers_url":"https://api.github.com/users/jpastuszek/followers","following_url":"https://api.github.com/users/jpastuszek/following{/other_user}","gists_url":"https://api.github.com/users/jpastuszek/gists{/gist_id}","starred_url":"https://api.github.com/users/jpastuszek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jpastuszek/subscriptions","organizations_url":"https://api.github.com/users/jpastuszek/orgs","repos_url":"https://api.github.com/users/jpastuszek/repos","events_url":"https://api.github.com/users/jpastuszek/events{/privacy}","received_events_url":"https://api.github.com/users/jpastuszek/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":2228316027,"node_id":"MDU6TGFiZWwyMjI4MzE2MDI3","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/needs%20varnish-cache","name":"needs varnish-cache","color":"006b75","default":false,"description":"needs work in varnish-cache"}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2020-02-04T15:54:47Z","updated_at":"2020-12-16T15:11:19Z","closed_at":"2020-12-16T15:11:19Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I think this was caused by a deadlock related to VMOD `dynamic` and `varnishadm` utility with Varnish v6.3 (patched).\r\n\r\nI am using VMOD dynamic with a backend that keeps rotating its IP addresses frequently. Also I monitor Varnish with a script calling `varnishadm backend.list` every few minutes.\r\n\r\nI was able to obtain a stack trace after Varnish stopped processing requests and before it got auto-restarted by manager (CLI timeout).\r\n\r\nAs far as I can tell from the trace, request processing threads got stuck on `Lck_Lock(&vcl_mtx);` call.\r\n\r\nI found two outstanding threads also involved in locking:\r\n\r\nWhat I suspect a thread running from VMOD dynamic calling into `dynamic_lookup_thread` function:\r\n```\r\n #3 0x0000000000437e4f in Lck__Lock (lck=, p=p@entry=0x4c6800 <__func__.9352> \"VRT_AddDirector\", l=l@entry=192) at cache/cache_lck.c:120\r\n #4 0x000000000045acb7 in VRT_AddDirector (ctx=ctx@entry=0x7fc5bdf01d80, m=m@entry=0x4b6980 , priv=priv@entry=0x7fc5da5b1080, fmt=fmt@entry=0x4c1fe4 \"%s\") at cache/cache_vrt_vcl.c:192\r\n\t[WAITING A] Lck_Lock(&vcl_mtx); https://github.com/varnishcache/varnish-cache/blob/0e192d6fa1691ebe9a4a3dcb600579cd43a0c1ba/bin/varnishd/cache/cache_vrt_vcl.c#L199\r\n #5 0x000000000041aac7 in VRT_new_backend_clustered (ctx=0x7fc5bdf01d80, vc=, vrt=0x7fc5bdf01e10) at cache/cache_backend.c:601\r\n\tcalled by VRT_new_backend\r\n\tsrc/vmod_dynamic.c:405 VRT_new_backend <- (dynamic_add <- dynamic_update_domain <- dynamic_lookup_thread)\r\n dynamic_update_domain:\r\n [LOCKED B] Lck_Lock(&dom->mtx); https://github.com/nigoroll/libvmod-dynamic/blob/71820eb7f91ad7e87755d02e522893a9e12dd55b/src/vmod_dynamic.c#L432\r\n #6 0x00007fc62c574550 in ?? ()\r\n #7 0x00007fc5ee1caa40 in ?? ()\r\n #8 0x00007fc62c579f3f in ?? ()\r\n #9 0x00007fc5bdf01ed0 in ?? ()\r\n #10 0x00007fc62c573cdc in ?? ()\r\n #11 0x500000024b1e9335 in ?? ()\r\n #12 0x000000001736c622 in ?? ()\r\n #13 0x0000000000000000 in ?? ()\r\n```\r\n\r\nWhat I suspect a thread running in response to `varnishadm backend.list` command calling `cli_backend_list` function:\r\n```\r\n #3 0x0000000000437e4f in Lck__Lock (lck=, p=, l=) at cache/cache_lck.c:120\r\n\tdynamic_healthy\r\n\t[WAITING B] Lck_Lock(&dom->mtx); https://github.com/nigoroll/libvmod-dynamic/blob/71820eb7f91ad7e87755d02e522893a9e12dd55b/src/vmod_dynamic.c#L180\r\n #4 0x00007fc62c5733e8 in ?? ()\r\n #5 0x00007ffed88ef710 in ?? ()\r\n #6 0x00007fd104c68cdd in __GI___clock_gettime (clock_id=, tp=) at ../sysdeps/unix/clock_gettime.c:115\r\n #7 0x00000000004ad83e in VTIM_real () at vtim.c:152\r\n #8 0x00007fd104027210 in ?? ()\r\n #9 0x00000000004238f0 in ?? () at cache/cache_director.c:224\r\n #10 0x0000000000423a66 in cli_health (d=0x7fc5df8584e0, ctx=) at cache/cache_director.c:308\r\n #11 do_list (cli=, d=0x7fc5df8584e0, priv=0x0) at cache/cache_director.c:335\r\n #12 0x000000000044c90c in vcl_iterdir (cli=cli@entry=0x7fd104027210, pat=0x7fc5e41cb880 \"default_reload_20200128_101739.*\", func=0x7fc5df8584f8, func@entry=0x4238f0 , priv=priv@entry=0x7ffed88ef710, vcl=0x7fc5db2fbaa0) at cache/cache_vcl.c:275\r\n\t[LOCKED A] Lck_Lock(&vcl_mtx); https://github.com/varnishcache/varnish-cache/blob/0e192d6fa1691ebe9a4a3dcb600579cd43a0c1ba/bin/varnishd/cache/cache_vcl.c#L342\r\n #13 0x000000000044df13 in VCL_IterDirector (cli=cli@entry=0x7fd104027210, pat=, func=func@entry=0x4238f0 , priv=priv@entry=0x7ffed88ef710) at cache/cache_vcl.c:310\r\n #14 0x000000000042328d in cli_backend_list (cli=0x7fd104027210, av=0x7fd10401d980, priv=) at cache/cache_director.c:439\r\n```\r\n\r\nUnfortunately the traces from VMOD are missing symbol names even though I have debug symbols installed (dynamic loading?). So what is following is a bit of a guess work.\r\n\r\nThe `cli_backend_list` call, before it can iterate backend list, acquires the `vcl_mtx` lock (https://github.com/varnishcache/varnish-cache/blob/0e192d6fa1691ebe9a4a3dcb600579cd43a0c1ba/bin/varnishd/cache/cache_vcl.c#L342), next it asks each backend for health status (for the listing) via `VRT_Healthy`, this call is forwarded to VMOD dynamic which firstly tries to acquire `dom->mtx` lock (https://github.com/nigoroll/libvmod-dynamic/blob/71820eb7f91ad7e87755d02e522893a9e12dd55b/src/vmod_dynamic.c#L180) before it can iterate dynamic sub-directors to enquire for their status.\r\nNow at the same time `dynamic_lookup_thread` wakes up to update the dynamic sub-director list from DNS results: it resolves the domain name in DNS and if IP list differs from last run it will go and acquire `dom->mtx` lock (https://github.com/nigoroll/libvmod-dynamic/blob/71820eb7f91ad7e87755d02e522893a9e12dd55b/src/vmod_dynamic.c#L432) and call into Varnish to add new backend with `VRT_new_backend` call, this call requires `vcl_mtx` locked (https://github.com/varnishcache/varnish-cache/blob/0e192d6fa1691ebe9a4a3dcb600579cd43a0c1ba/bin/varnishd/cache/cache_vrt_vcl.c#L199) for Varnish to be able to add entry to backend list which is held currently by `cli_backend_list` call chain waiting for `dom->mtx` lock leading to ABBA deadlock.\r\n\r\nWhat follows is that any time a request, that requires access to a backend, comes in Varnish will block on `vcl_mtx`.\r\nI suspect this issue has occurred few times before, but I got it mixed up with hangs related to thread scheduling that I got patched up now.\r\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/52/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/52/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/53","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/53/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/53/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/53/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/53","id":580546409,"node_id":"MDU6SXNzdWU1ODA1NDY0MDk=","number":53,"title":"dynamic.director not creating backends","user":{"login":"Raboo","id":1148206,"node_id":"MDQ6VXNlcjExNDgyMDY=","avatar_url":"https://avatars.githubusercontent.com/u/1148206?v=4","gravatar_id":"","url":"https://api.github.com/users/Raboo","html_url":"https://github.com/Raboo","followers_url":"https://api.github.com/users/Raboo/followers","following_url":"https://api.github.com/users/Raboo/following{/other_user}","gists_url":"https://api.github.com/users/Raboo/gists{/gist_id}","starred_url":"https://api.github.com/users/Raboo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Raboo/subscriptions","organizations_url":"https://api.github.com/users/Raboo/orgs","repos_url":"https://api.github.com/users/Raboo/repos","events_url":"https://api.github.com/users/Raboo/events{/privacy}","received_events_url":"https://api.github.com/users/Raboo/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":9,"created_at":"2020-03-13T11:38:44Z","updated_at":"2020-07-24T18:09:48Z","closed_at":"2020-07-24T18:09:47Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi,\r\n\r\nI am trying this vmod (and varnish) for the first time. Is there any helpful soul that can explain why only the dummy backend gets created? Am I missing something in my configuration?\r\n\r\n*opentsdb.service.consul* resolves into two SRV records that points to two nodes with weight and priority 1. TTL from DNS is 0.\r\nHowever I also tested *_test._tcp.vmod-dynamic.uplex.de* and that didn't work either.\r\n\r\n\r\n```\r\nvcl 4.1;\r\nimport dynamic;\r\n\r\nbackend dummy { .host = \"localhost\"; }\r\n\r\nprobe tsdb_probe {\r\n .url = \"/version\";\r\n .interval = 5s;\r\n .timeout = 1s;\r\n .window = 5;\r\n .threshold = 3;\r\n .initial = 3;\r\n}\r\n\r\nsub vcl_init {\r\n new r = dynamic.resolver();\r\n new d = dynamic.director(\r\n resolver = r.use(),\r\n probe = tsdb_probe,\r\n ttl = 30s,\r\n ttl_from = cfg\r\n );\r\n d.debug(true);\r\n}\r\n\r\nsub vcl_recv {\r\n set req.backend_hint = d.service(\"opentsdb.service.consul\");\r\n set client.identity = regsuball(req.url, \"&(o|ignore|png|json|html|y2?range|y2?label|y2?log|key|nokey)\\b(=[^&]*)?\", \"\");\r\n}\r\n\r\nsub vcl_hash {\r\n hash_data(regsuball(req.url, \"&ignore\\b(=[^&]*)?\", \"\"));\r\n if (req.http.host) {\r\n hash_data(req.http.host);\r\n } else {\r\n hash_data(server.ip);\r\n }\r\n return (lookup);\r\n}\r\n```\r\n\r\nRunning `backend.list` in varnish debug mode. I get this output, i.e. the dummy backend. No created backend from dynamic.director().\r\n```\r\nbackend.list\r\n200 134\r\nBackend name Admin Probe Health Last change\r\nboot.dummy healthy 0/0 healthy Fri, 13 Mar 2020 02:13:56 GMT\r\n```\r\n\r\nI can add that doing a tcpdump when starting varnish shows me it is not even doing any DNS lookups.\r\n\r\nI tested varnish 6.3.2, but also tried 6.2.3 and 6.0.6.\r\nOn 6.3.2 I ran with libvmod-dynamic commit 71820eb7f91ad7e87755d02e522893a9e12dd55b and 88161b3018305915c9cf0d2b45f695da709275da.\r\n\r\nUpdate: add tcpdump info.\r\nUpdate: add version info.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/53/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/53/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/54","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/54/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/54/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/54/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/54","id":583553144,"node_id":"MDU6SXNzdWU1ODM1NTMxNDQ=","number":54,"title":"Difficulties compiling for Varnish 5.2 into a .deb package","user":{"login":"Thertor","id":53084078,"node_id":"MDQ6VXNlcjUzMDg0MDc4","avatar_url":"https://avatars.githubusercontent.com/u/53084078?v=4","gravatar_id":"","url":"https://api.github.com/users/Thertor","html_url":"https://github.com/Thertor","followers_url":"https://api.github.com/users/Thertor/followers","following_url":"https://api.github.com/users/Thertor/following{/other_user}","gists_url":"https://api.github.com/users/Thertor/gists{/gist_id}","starred_url":"https://api.github.com/users/Thertor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Thertor/subscriptions","organizations_url":"https://api.github.com/users/Thertor/orgs","repos_url":"https://api.github.com/users/Thertor/repos","events_url":"https://api.github.com/users/Thertor/events{/privacy}","received_events_url":"https://api.github.com/users/Thertor/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":7,"created_at":"2020-03-18T08:25:07Z","updated_at":"2020-03-18T10:14:56Z","closed_at":"2020-03-18T09:42:19Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi, I'm trying to compile the module from source and building it into a .deb package in ubuntu, but I'm getting errors during the last step, see below logs:\r\n\r\n```\r\nBuilding using working tree\r\nBuilding package in normal mode\r\nPurging the build dir: /home/eivind/build-area/libvmod-dynamic-5.2-1\r\nLooking for a way to retrieve the upstream tarball\r\nUpstream tarball already exists in build directory, using that\r\nBuilding the package in /home/eivind/build-area/libvmod-dynamic-5.2-1, using debuild -us -uc\r\n dpkg-buildpackage -rfakeroot -us -uc -ui\r\ndpkg-buildpackage: info: source package libvmod-dynamic\r\ndpkg-buildpackage: info: source version 5.2-1-1\r\ndpkg-buildpackage: info: source distribution bionic\r\ndpkg-buildpackage: info: source changed by Eivind Sivertsen \r\n dpkg-source --before-build libvmod-dynamic-5.2-1\r\ndpkg-buildpackage: info: host architecture amd64\r\n fakeroot debian/rules clean\r\ndh clean\r\n dh_clean\r\n dpkg-source -b libvmod-dynamic-5.2-1\r\ndpkg-source: info: using source format '3.0 (quilt)'\r\ndpkg-source: info: building libvmod-dynamic using existing ./libvmod-dynamic_5.2-1.orig.tar.gz\r\ndpkg-source: info: building libvmod-dynamic in libvmod-dynamic_5.2-1-1.debian.tar.xz\r\ndpkg-source: info: building libvmod-dynamic in libvmod-dynamic_5.2-1-1.dsc\r\n debian/rules build\r\ndh build\r\n dh_update_autotools_config\r\n dh_autoreconf\r\naclocal: error: couldn't open directory '/aclocal': No such file or directory\r\nautoreconf: aclocal failed with exit status: 1\r\ndh_autoreconf: autoreconf -f -i returned exit code 1\r\ndebian/rules:18: recipe for target 'build' failed\r\nmake: *** [build] Error 2\r\ndpkg-buildpackage: error: debian/rules build subprocess returned exit status 2\r\ndebuild: fatal error at line 1152:\r\ndpkg-buildpackage -rfakeroot -us -uc -ui failed\r\nbzr: ERROR: The build failed.\r\n````","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/54/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/54/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/55","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/55/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/55/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/55/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/55","id":583788982,"node_id":"MDU6SXNzdWU1ODM3ODg5ODI=","number":55,"title":"panic when creating new backends","user":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804422,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjI=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/bug","name":"bug","color":"ee0701","default":true,"description":null},{"id":2228311103,"node_id":"MDU6TGFiZWwyMjI4MzExMTAz","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/needs%20%E2%99%A1Sponsor","name":"needs ♡Sponsor","color":"e094d3","default":false,"description":"looking for support ♥"}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":8,"created_at":"2020-03-18T14:57:01Z","updated_at":"2020-10-26T21:44:31Z","closed_at":"2020-10-14T10:00:31Z","author_association":"OWNER","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"reported by @Raboo in https://github.com/nigoroll/libvmod-dynamic/issues/53#issuecomment-600657956\r\n```\r\n# varnishadm panic.show\r\nPanic at: Wed, 18 Mar 2020 14:31:52 GMT\r\nAssert error in vbp_build_req(), cache/cache_backend_probe.c line 593:\r\n Condition((be->hosthdr) != 0) not true.\r\nversion = varnish-6.4.0 revision 13f137934ec1cf14af66baf7896311115ee35598, vrt api = 11.0\r\nident = Linux,4.4.0-171-generic,x86_64,-junix,-smalloc,-sdefault,-hcritbit,epoll\r\nnow = 3632990.458782 (mono), 1584541911.163488 (real)\r\nBacktrace:\r\n 0x55fa88f43b85: varnishd(+0x50b85) [0x55fa88f43b85]\r\n 0x55fa88fb11e7: varnishd(VAS_Fail+0x17) [0x55fa88fb11e7]\r\n 0x55fa88f213ca: varnishd(+0x2e3ca) [0x55fa88f213ca]\r\n 0x55fa88f1ec78: varnishd(VRT_new_backend_clustered+0x2d8) [0x55fa88f1ec78]\r\n 0x7f0ee3ce3f49: ./vmod_cache/_vmod_dynamic.8464fed2571d152330aca2a8c2ba9d613da02b332f734302a48d8a6371a4998a(+0x5f49) [0x7f0ee3ce3f49]\r\n 0x7f0ef1711fa3: /lib/x86_64-linux-gnu/libpthread.so.0(+0x7fa3) [0x7f0ef1711fa3]\r\n 0x7f0ef16424cf: /lib/x86_64-linux-gnu/libc.so.6(clone+0x3f) [0x7f0ef16424cf]\r\npthread.attr = {\r\n guard = 4096,\r\n stack_bottom = 0x7f0ee1c48000,\r\n stack_top = 0x7f0ee2448000,\r\n stack_size = 8388608,\r\n}\r\nthr.req = (nil) {\r\n},\r\nthr.busyobj = (nil) {\r\n},\r\nvmods = {\r\n dynamic = {0x7f0ef0eea070, Varnish 6.4.0 13f137934ec1cf14af66baf7896311115ee35598, 0.0},\r\n},\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/55/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/55/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/56","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/56/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/56/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/56/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/56","id":642977329,"node_id":"MDExOlB1bGxSZXF1ZXN0NDM3ODY1NjQ5","number":56,"title":"Update RPM packaging for compatibility with Varnish 6.3.2 and 6.4.0.","user":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2020-06-22T11:09:14Z","updated_at":"2020-06-23T15:50:54Z","closed_at":"2020-06-23T15:50:54Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/56","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/56","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/56.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/56.patch","merged_at":"2020-06-23T15:50:54Z"},"body":"I also pushed some tags to this fork, but I'm not sure if tags are included in a github PR. The tags go with these commitishes:\r\n2.0.0 => 71820eb7f91ad7e87755d02e522893a9e12dd55b\r\n2.1.0 => b08408a45f3d4a3c13cd2d43f8125256f5454487\r\n2.2.0 => 92ab61fd3cb73edbec30e6e754f5c9862767466d\r\nThat way, the VERSION set in AC_INIT, and set for the RPM version, matches the git tag.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/56/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/56/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/57","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/57/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/57/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/57/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/57","id":643952782,"node_id":"MDExOlB1bGxSZXF1ZXN0NDM4NjYwOTA3","number":57,"title":"Enable use of dynamic.backend() in vcl_init.","user":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":3,"created_at":"2020-06-23T15:48:29Z","updated_at":"2020-06-24T09:12:52Z","closed_at":"2020-06-24T09:12:52Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/57","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/57","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/57.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/57.patch","merged_at":"2020-06-24T09:12:52Z"},"body":"I'm not sure if this is right, so I'm primarily asking for review and feedback. (But of course the PR can be merged if it is right.)\r\n\r\nThat is, I'm not sure if it's enough just to decline starting the lookup thread when `.backend()` is called in `vcl_init`, or if there are other conditions and/or invariants that might be violated.\r\n\r\nI'm also not sure if the added check in `.backend()` is strictly necessary -- load failure if the `.host` field is not set. It just doesn't make much sense to me to use `.backend()` in `vcl_init` unless you are providing a host to look up.\r\n\r\nAnd I haven't thought of a way to write a vtc test without installing another VMOD, since you need something that uses a BACKEND in `vcl_init`. I tested with this VCL using VMOD re2:\r\n```\r\nvcl 4.1;\r\n\r\nimport re2;\r\nimport dynamic;\r\n\r\nbackend fail None;\r\n\r\nsub vcl_init {\r\n new d = dynamic.director();\r\n d.debug(true);\r\n\r\n new r = re2.set(literal=true, anchor=both);\r\n r.add(\"one\", backend=d.backend(\"one.test.uplex.de\"));\r\n r.add(\"two-a\", backend=d.backend(\"two-a.test.uplex.de\"));\r\n r.add(\"two-b\", backend=d.backend(\"two-b.test.uplex.de\"));\r\n r.compile();\r\n}\r\n\r\nsub vcl_recv {\r\n set req.backend_hint = fail;\r\n if (r.match(req.http.Domain)) {\r\n set req.backend_hint = r.backend();\r\n }\r\n}\r\n```\r\n\r\nBefore the change, calling `.backend()` in `vcl_init` resulted in assertion failure, since the lookup thread was started by both `dynamic_get()` (called by the method implementation) and `dynamic_start()` (called by the event handler). Obviously we wouldn't want two threads running when one is enough. But it also violated assumptions about the state enum:\r\n```\r\nDebug: Child (16913) Started\r\nError: Child (16913) not responding to CLI, killed it.\r\nCLI result = 400\r\nError: Child (16913) Pushing vcls failed:\r\nCLI communication error (hdr)\r\nDebug: Stopping Child\r\nError: Child (16913) died signal=6 (core dumped)\r\nError: Child (16913) Panic at: Tue, 23 Jun 2020 12:40:35 GMT\r\nAssert error in dynamic_start(), vmod_dynamic.c line 646:\r\n Condition(dom->status == DYNAMIC_ST_READY) not true.\r\n```\r\nThis was because `.backend()` was called first, which started the thread and changed the state before the evnt handler ran and called `dynamic_start()`.\r\n\r\nWith the change in the PR, I get the expected result:\r\n```\r\n# varnish listening at port :8080\r\n$ curl -I -X GET -H 'Domain: one' -H 'Host: one.test.uplex.de' http://localhost:8080\r\nHTTP/1.1 302 Found\r\nDate: Tue, 23 Jun 2020 15:42:36 GMT\r\nServer: Varnish\r\nX-Varnish: 18335502\r\nLocation: https://one.test.uplex.de/\r\nContent-Length: 0\r\nX-Varnish: 32773\r\nAge: 0\r\nVia: 1.1 varnish (Varnish/6.4)\r\nConnection: keep-alive\r\n```\r\nThe redirect response to https matches the response you get for `http://one.test.uplex.de`, and the same thing happens for the `two-a` and `two-b` domains.\r\n\r\nI also see the Timestamps from VMOD dynamic as expected in the log:\r\n```\r\n$ varnishlog -g raw -q 'vxid == 0 and Timestamp' -d\r\n 0 Timestamp - vmod-dynamic boot.d(one.test.uplex.de:http) Lookup: 1592925593.002916 0.000000 0.000000\r\n 0 Timestamp - vmod-dynamic boot.d(two-a.test.uplex.de:http) Lookup: 1592925593.002975 0.000000 0.000000\r\n 0 Timestamp - vmod-dynamic boot.d(two-b.test.uplex.de:http) Lookup: 1592925593.002990 0.000000 0.000000\r\n 0 Timestamp - vmod-dynamic boot.d(one.test.uplex.de:http) Results: 1592925593.006311 0.003395 0.003395\r\n 0 Timestamp - vmod-dynamic boot.d(one.test.uplex.de:http) Update: 1592925593.006472 0.003555 0.000160\r\n 0 Timestamp - vmod-dynamic boot.d(two-b.test.uplex.de:http) Results: 1592925593.007160 0.004170 0.004170\r\n 0 Timestamp - vmod-dynamic boot.d(two-b.test.uplex.de:http) Update: 1592925593.007166 0.004176 0.000006\r\n 0 Timestamp - vmod-dynamic boot.d(two-a.test.uplex.de:http) Results: 1592925593.007333 0.004358 0.004358\r\n 0 Timestamp - vmod-dynamic boot.d(two-a.test.uplex.de:http) Update: 1592925593.007339 0.004364 0.000006\r\n```\r\n@nigoroll have I overlooked anything? (Could it be this easy?)","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/57/reactions","total_count":1,"+1":1,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/57/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/58","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/58/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/58/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/58/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/58","id":645436170,"node_id":"MDExOlB1bGxSZXF1ZXN0NDM5OTE4NDg0","number":58,"title":"Add branch 6.3","user":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2020-06-25T10:07:19Z","updated_at":"2020-06-26T09:43:54Z","closed_at":"2020-06-26T09:43:53Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/58","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/58","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/58.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/58.patch","merged_at":null},"body":"This adds a new branch, since the most recently added test (test14.vtc) uses backend None, which was not available in Varnish 6.3. There are currently 10 vtc tests that use the `$bad_ip` macro, so we may want to change these over time on the master branch to use None.\r\n\r\nThe new branch includes a version 2.1.1, which I used for a new RPM that adds the recent new feature -- calling `.backend()` in `vcl_init`, which among other things allows the dynamic cirector to be layered with other directors. The RPM is already available at https://pkg.uplex.de.\r\n\r\n@nigoroll I tagged commit f9f4b245c8dca9b8c7ef1ecc815fa79566789bf1 as v2.1.1, but tags are not merged when github PRs are merged. So you'll probably have to do that for your github repo. I recommend that the main repo has git tags to match the version in `AC_INIT`, so that they match the RPM version numbers, and the version number created in the name of a distribution tarball. They also appear in github in the \"Release\" tab.\r\n\r\nSince there probably won't be any new Varnish 6.3.x releases, this branch will most likely be used to backport VMOD features for use with Varnish 6.3, and for new packaging, if we so choose.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/58/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/58/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/59","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/59/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/59/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/59/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/59","id":645439741,"node_id":"MDExOlB1bGxSZXF1ZXN0NDM5OTIxMTQz","number":59,"title":"Add version 2.2.1","user":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2020-06-25T10:12:42Z","updated_at":"2020-06-26T09:36:55Z","closed_at":"2020-06-26T09:36:55Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/59","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/59","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/59.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/59.patch","merged_at":"2020-06-26T09:36:54Z"},"body":"This adds version 2.2.1, which I used to build a new RPM that is compatible with Varnish 6.4.0 and adds the recent new feature (calling `.backend()` in `vcl_init`, layering dynamic with other directors). The RPM is already available at http://pkg.uplex.de.\r\n\r\n@nigoroll as with version 2.1.1 on branch 6.3, you'll probably have to apply tag v2.2.1 to commit 109a7300a1f9a128ddd79d6bddf7595770f56ee5 -- I did that in the fork, but tags are not merged with a github PR.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/59/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/59/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/60","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/60/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/60/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/60/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/60","id":656684529,"node_id":"MDU6SXNzdWU2NTY2ODQ1Mjk=","number":60,"title":"Varnish crashing because of dynamic vmod","user":{"login":"tmcevoy14","id":6459343,"node_id":"MDQ6VXNlcjY0NTkzNDM=","avatar_url":"https://avatars.githubusercontent.com/u/6459343?v=4","gravatar_id":"","url":"https://api.github.com/users/tmcevoy14","html_url":"https://github.com/tmcevoy14","followers_url":"https://api.github.com/users/tmcevoy14/followers","following_url":"https://api.github.com/users/tmcevoy14/following{/other_user}","gists_url":"https://api.github.com/users/tmcevoy14/gists{/gist_id}","starred_url":"https://api.github.com/users/tmcevoy14/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tmcevoy14/subscriptions","organizations_url":"https://api.github.com/users/tmcevoy14/orgs","repos_url":"https://api.github.com/users/tmcevoy14/repos","events_url":"https://api.github.com/users/tmcevoy14/events{/privacy}","received_events_url":"https://api.github.com/users/tmcevoy14/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804426,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjY=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/invalid","name":"invalid","color":"e6e6e6","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":3,"created_at":"2020-07-14T15:05:10Z","updated_at":"2020-07-15T10:00:39Z","closed_at":"2020-07-14T16:00:25Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"We are using the dynamic vmod (from branch 5.2) and it is frequently causing Varnish to crash. \r\n\r\nCrash logs show this:\r\n```\r\nvarnishadm panic.show\r\nPanic at: Tue, 14 Jul 2020 06:42:52 GMT\r\nAssert error in SES_Delete(), cache/cache_session.c line 546:\r\n Condition(VTAILQ_EMPTY(&sp->privs->privs)) not true.\r\nversion = varnish-5.2.1 revision 67e562482, vrt api = 6.1\r\nident = Linux,3.10.0-1127.el7.x86_64,x86_64,-junix,-smalloc,-smalloc,-hcritbit,epoll\r\nnow = 5776089.456303 (mono), 1594708967.979804 (real)\r\nBacktrace:\r\n 0x4396da: /usr/sbin/varnishd() [0x4396da]\r\n 0x47ef02: /usr/sbin/varnishd(VAS_Fail+0x42) [0x47ef02]\r\n 0x442520: /usr/sbin/varnishd(SES_Delete+0x1f0) [0x442520]\r\n 0x459e7a: /usr/sbin/varnishd() [0x459e7a]\r\n 0x42cc61: /usr/sbin/varnishd() [0x42cc61]\r\n 0x42de19: /usr/sbin/varnishd(HSH_Unbusy+0x179) [0x42de19]\r\n 0x428d5d: /usr/sbin/varnishd() [0x428d5d]\r\n 0x45287e: /usr/sbin/varnishd() [0x45287e]\r\n 0x452d10: /usr/sbin/varnishd() [0x452d10]\r\n 0x7fa3f6ecdea5: /lib64/libpthread.so.0(+0x7ea5) [0x7fa3f6ecdea5]\r\nthread = (cache-worker)\r\nthr.req = (nil) {\r\n},\r\nthr.busyobj = 0x7f9ded9bb020 {\r\n ws = 0x7f9ded9bb0a0 {\r\n id = \\\"bo\\\",\r\n {s, f, r, e} = {0x7f9ded9bd5c0, +15592, (nil), +121400},\r\n },\r\n retries = 0, failed = 0, flags = {do_stream, uncacheable, is_gunzip},\r\n http_conn = 0x7f9ded9be590 {\r\n fd = 9951 (@0x7fa0e14ef354),\r\n doclose = REQ_CLOSE,\r\n ws = 0x7f9ded9bb0a0 {\r\n [Already dumped, see above]\r\n },\r\n {rxbuf_b, rxbuf_e} = {0x7f9ded9be5f0, 0x7f9ded9bf515},\r\n {pipeline_b, pipeline_e} = {0x7f9ded9bf515, 0x7f9ded9c1238},\r\n content_length = 16063,\r\n body_status = length,\r\n first_byte_timeout = 20.000000,\r\n between_bytes_timeout = 20.000000,\r\n },\r\n filters = V1F_STRAIGHT=0\r\n director_req = 0x7fa074ac14e0 {\r\n vcl_name = director_web_default,\r\n type = random {\r\n },\r\n },\r\n director_resp = 0x7fa07e8ff538 {\r\n vcl_name = web100-va2b,\r\n type = backend {\r\n display_name = reload_2020-07-13T032012.web100-va2b,\r\n ipv4 = 10.40.131.200,\r\n port = 10260,\r\n hosthdr = web100-va2b.udsrvs.net,\r\n health = healthy,\r\n admin_health = probe, changed = 1594679804.904402,\r\n n_conn = 8,\r\n },\r\n },\r\n http[bereq] = 0x7f9ded9bb890 {\r\n ws = 0x7f9ded9bb0a0 {\r\n [Already dumped, see above]\r\n },\r\n hdrs {\r\n },\r\n },\r\n http[beresp] = 0x7f9ded9bbf28 {\r\n ws = 0x7f9ded9bb0a0 {\r\n [Already dumped, see above]\r\n },\r\n hdrs {\r\n },\r\n },\r\n objcore[fetch] = 0x7fa00125cec0 {\r\n refcnt = 3,\r\n flags = {pass},\r\n exp_flags = {refd},\r\n boc = 0x7f9dd9501640 {\r\n refcnt = 2,\r\n state = prep_stream,\r\n vary = (nil),\r\n stevedore_priv = (nil),\r\n },\r\n exp = {1594708967.979577, 120.000000, 10.000000, 0.000000},\r\n objhead = 0x7fa071611860,\r\n stevedore = 0x7fa3f60cd240 (malloc Transient) {\r\n Simple = 0x7fa2181ea000,\r\n Obj = 0x7fa08dacb608 {priv=0x7fa08dacb600, ptr=0x7fa2181ea000, len=3984, space=3984},\r\n LEN = 0x0...0,\r\n VXID = 0x0db772f0,\r\n FLAGS = 0x00,\r\n GZIPBITS = 0x0...0,\r\n LASTMODIFIED = 0x41d7c354f9c00000,\r\n VARY = {len=0, ptr=(nil)},\r\n HEADERS = {len=3864, ptr=0x7fa2181ea078},\r\n },\r\n },\r\n vcl = {\r\n name = \\\"reload_2020-07-13T032012\\\",\r\n busy = 11984,\r\n discard = 0,\r\n state = auto,\r\n temp = warm,\r\n conf = {\r\n srcname = {\r\n \\\"/etc/varnish/vcl/django.vcl\\\",\r\n \\\"Builtin\\\",\r\n \\\"/etc/varnish/backend_default.vcl\\\",\r\n \\\"/etc/varnish/libraries/main.vcl\\\",\r\n \\\"/etc/varnish/libraries/all.vcl\\\",\r\n \\\"/etc/varnish/libraries/filters.vcl\\\",\r\n \\\"/etc/varnish/libraries/uuid_generation.vcl\\\",\r\n \\\"/etc/varnish/libraries/normalized_variables.vcl\\\",\r\n \\\"/etc/varnish/libraries/request_headers.vcl\\\",\r\n \\\"/etc/varnish/libraries/response_headers.vcl\\\",\r\n \\\"/etc/varnish/libraries/synthetic_responses.vcl\\\",\r\n \\\"/etc/varnish/libraries/variables/cacheable_per_path.vcl\\\",\r\n \\\"/etc/varnish/libraries/variables/country.vcl\\\",\r\n \\\"/etc/varnish/libraries/variables/device.vcl\\\",\r\n \\\"/etc/varnish/libraries/variables/modern_browser.vcl\\\",\r\n \\\"/etc/varnish/libraries/variables/language.vcl\\\",\r\n \\\"/etc/varnish/libraries/variables/logged_in.vcl\\\",\r\n \\\"/etc/varnish/libraries/variables/normalized_urls.vcl\\\",\r\n \\\"/etc/varnish/libraries/variables/path.vcl\\\",\r\n \\\"/etc/varnish/libraries/errors/5xx.vcl\\\",\r\n },\r\n },\r\n },\r\n vmods = {\r\n std = {Varnish 5.2.1 67e562482, 0.0},\r\n cookie = {Varnish 5.2.1 67e562482, 0.0},\r\n header = {Varnish 5.2.1 67e562482, 0.0},\r\n var = {Varnish 5.2.1 67e562482, 0.0},\r\n digest = {Varnish 5.2.1 67e562482, 0.0},\r\n uuid = {Varnish 5.2.1 67e562482, 0.0},\r\n directors = {Varnish 5.2.1 67e562482, 0.0},\r\n dynamic = {Varnish 5.2.1 67e562482, 0.0},\r\n },\r\n},\r\n```\r\n\r\n**FYI:** I've obfuscated the req and res headers because they contain user specific information. \r\n\r\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/60/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/60/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/61","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/61/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/61/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/61/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/61","id":665296397,"node_id":"MDU6SXNzdWU2NjUyOTYzOTc=","number":61,"title":"Least connection support","user":{"login":"danielmotaleite","id":11890049,"node_id":"MDQ6VXNlcjExODkwMDQ5","avatar_url":"https://avatars.githubusercontent.com/u/11890049?v=4","gravatar_id":"","url":"https://api.github.com/users/danielmotaleite","html_url":"https://github.com/danielmotaleite","followers_url":"https://api.github.com/users/danielmotaleite/followers","following_url":"https://api.github.com/users/danielmotaleite/following{/other_user}","gists_url":"https://api.github.com/users/danielmotaleite/gists{/gist_id}","starred_url":"https://api.github.com/users/danielmotaleite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danielmotaleite/subscriptions","organizations_url":"https://api.github.com/users/danielmotaleite/orgs","repos_url":"https://api.github.com/users/danielmotaleite/repos","events_url":"https://api.github.com/users/danielmotaleite/events{/privacy}","received_events_url":"https://api.github.com/users/danielmotaleite/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804424,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjQ=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/enhancement","name":"enhancement","color":"84b6eb","default":true,"description":null},{"id":2228311103,"node_id":"MDU6TGFiZWwyMjI4MzExMTAz","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/needs%20%E2%99%A1Sponsor","name":"needs ♡Sponsor","color":"e094d3","default":false,"description":"looking for support ♥"}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2020-07-24T16:59:34Z","updated_at":"2020-12-16T15:13:42Z","closed_at":"2020-12-16T15:13:42Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi\r\n\r\nFrom what i understand, we have by default round-robin backend policy... Is there any way to switch to least connections?\r\n\r\nIf one backend locks up or get overload\r\n, with round-robin, varnish will still try to deliver requests, not only overloading it more, but increasing the number of requests that may fail (when finally the healthcheck removes the bad backend) or get bad performance... with least connections, the locked one still will keep some requests, but new ones will be delivered to good backends, avoiding overloading even more the bad backend\r\n\r\nthanks","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/61/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/61/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/62","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/62/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/62/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/62/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/62","id":681916680,"node_id":"MDU6SXNzdWU2ODE5MTY2ODA=","number":62,"title":"Problem while building for varnish 6.4","user":{"login":"abresson","id":23034299,"node_id":"MDQ6VXNlcjIzMDM0Mjk5","avatar_url":"https://avatars.githubusercontent.com/u/23034299?v=4","gravatar_id":"","url":"https://api.github.com/users/abresson","html_url":"https://github.com/abresson","followers_url":"https://api.github.com/users/abresson/followers","following_url":"https://api.github.com/users/abresson/following{/other_user}","gists_url":"https://api.github.com/users/abresson/gists{/gist_id}","starred_url":"https://api.github.com/users/abresson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abresson/subscriptions","organizations_url":"https://api.github.com/users/abresson/orgs","repos_url":"https://api.github.com/users/abresson/repos","events_url":"https://api.github.com/users/abresson/events{/privacy}","received_events_url":"https://api.github.com/users/abresson/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2020-08-19T15:07:50Z","updated_at":"2020-08-26T15:11:19Z","closed_at":"2020-08-26T15:11:19Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I'm probably doing something wrong, but I cannot figure out what\r\n\r\nHere are some information about the steps I'm doing\r\n```\r\nvarnishd (varnish-6.4.0 revision 13f137934ec1cf14af66baf7896311115ee35598)\r\nCopyright (c) 2006 Verdens Gang AS\r\nCopyright (c) 2006-2020 Varnish Software AS\r\n```\r\n```\r\napt-cache policy varnish\r\nvarnish:\r\n Installed: 6.4.0-1~buster\r\n Candidate: 6.4.0-1~buster\r\n Version table:\r\n *** 6.4.0-1~buster 500\r\n 500 https://packagecloud.io/varnishcache/varnish64/debian buster/main amd64 Packages\r\n 100 /var/lib/dpkg/status\r\n 6.1.1-1+deb10u1 500\r\n```\r\n\r\n```\r\ncat /etc/debian_version \r\n10.4\r\n```\r\n\r\n```\r\ndpkg -l |grep -E \"libgetdns-dev|automake|libvarnishapi-dev|libtool|pkg-config\"\r\nii automake 1:1.16.1-4 all Tool for generating GNU Standards-compliant Makefiles\r\nii libgetdns-dev 1.5.1-1 amd64 modern asynchronous DNS API (development)\r\nii libltdl-dev:amd64 2.4.6-9 amd64 System independent dlopen wrapper for GNU libtool\r\nii libltdl7:amd64 2.4.6-9 amd64 System independent dlopen wrapper for GNU libtool\r\nii libtool 2.4.6-9 all Generic library support script\r\nii libvarnishapi-dev:amd64 6.1.1-1+deb10u1 amd64 development files for Varnish\r\nii pkg-config 0.29-6 amd64 manage compile and link flags for libraries\r\n```\r\n\r\n```\r\ngit clone https://github.com/nigoroll/libvmod-dynamic.git\r\ngit checkout 6.4\r\n```\r\n\r\n```\r\n./autogen.sh\r\n./configure\r\n```\r\n\r\nThen I run make, and it fail..\r\n```\r\nmake\r\n\r\nmake all-recursive\r\nmake[1]: Entering directory '/tmp/bb/libvmod-dynamic'\r\nMaking all in src\r\nmake[2]: Entering directory '/tmp/bb/libvmod-dynamic/src'\r\n CC vmod_dynamic.lo\r\nIn file included from vmod_dynamic.c:55:\r\ndyn_resolver.h:34:31: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token\r\n struct VPFX(dynamic_resolver) * dyn_resolver_blob(VCL_BLOB);\r\n ^\r\ndyn_resolver.h:51:56: error: expected ‘;’, ‘,’ or ‘)’ before ‘*’ token\r\n typedef int res_lookup_f(struct VPFX(dynamic_resolver) *r,\r\n ^\r\ndyn_resolver.h:58:56: error: expected ‘;’, ‘,’ or ‘)’ before ‘*’ token\r\n typedef int srv_lookup_f(struct VPFX(dynamic_resolver) *r,\r\n ^\r\ndyn_resolver.h:72:2: error: unknown type name ‘res_lookup_f’\r\n res_lookup_f *lookup;\r\n ^~~~~~~~~~~~\r\ndyn_resolver.h:76:2: error: unknown type name ‘srv_lookup_f’\r\n srv_lookup_f *srv_lookup;\r\n ^~~~~~~~~~~~\r\nIn file included from vmod_dynamic.c:56:\r\nvmod_dynamic.h:177:33: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘*’ token\r\n struct VPFX(dynamic_resolver) *resolver_inst;\r\n ^\r\nvmod_dynamic.c: In function ‘dynamic_update_domain’:\r\nvmod_dynamic.c:456:21: error: ‘struct vmod_dynamic_director’ has no member named ‘ttl_from’\r\n } else if (dom->obj->ttl_from == cfg) {\r\n ^~\r\nvmod_dynamic.c:458:21: error: ‘struct vmod_dynamic_director’ has no member named ‘ttl_from’\r\n } else if (dom->obj->ttl_from == min) {\r\n ^~\r\nvmod_dynamic.c:461:21: error: ‘struct vmod_dynamic_director’ has no member named ‘ttl_from’\r\n } else if (dom->obj->ttl_from == max) {\r\n ^~\r\nIn file included from /usr/include/varnish/cache/cache.h:50,\r\n from vmod_dynamic.c:45:\r\nvmod_dynamic.c:465:18: error: ‘struct vmod_dynamic_director’ has no member named ‘ttl_from’\r\n assert(dom->obj->ttl_from == dns);\r\n ^~\r\n/usr/include/varnish/vas.h:59:8: note: in definition of macro ‘assert’\r\n if (!(e)) { \\\r\n ^\r\nvmod_dynamic.c: In function ‘dynamic_lookup_thread’:\r\nvmod_dynamic.c:502:26: error: ‘struct vmod_dynamic_director’ has no member named ‘resolver_inst’; did you mean ‘resolver’?\r\n ret = res->lookup(obj->resolver_inst, dom->addr,\r\n ^~~~~~~~~~~~~\r\n resolver\r\nvmod_dynamic.c:502:9: error: called object is not a function or function pointer\r\n ret = res->lookup(obj->resolver_inst, dom->addr,\r\n ^~~\r\nvmod_dynamic.c: In function ‘dynamic_stop’:\r\nvmod_dynamic.c:630:2: error: implicit declaration of function ‘VRT_VCL_Allow_Discard’; did you mean ‘VRT_VSC_Alloc’? [-Werror=implicit-function-declaration]\r\n VRT_VCL_Allow_Discard(&obj->vclref);\r\n ^~~~~~~~~~~~~~~~~~~~~\r\n VRT_VSC_Alloc\r\nvmod_dynamic.c: In function ‘dynamic_start’:\r\nvmod_dynamic.c:645:16: error: implicit declaration of function ‘VRT_VCL_Prevent_Discard’ [-Werror=implicit-function-declaration]\r\n obj->vclref = VRT_VCL_Prevent_Discard(ctx, buf);\r\n ^~~~~~~~~~~~~~~~~~~~~~~\r\nvmod_dynamic.c:645:14: error: assignment to ‘struct vclref *’ from ‘int’ makes pointer from integer without a cast [-Werror=int-conversion]\r\n obj->vclref = VRT_VCL_Prevent_Discard(ctx, buf);\r\n ^\r\nvmod_dynamic.c: In function ‘vmod_director__init’:\r\nvmod_dynamic.c:936:5: error: ‘struct vmod_dynamic_director’ has no member named ‘ttl_from’\r\n obj->ttl_from = dynamic_ttl_parse(ttl_from_s);\r\n ^~\r\nvmod_dynamic.c:940:8: error: ‘struct vmod_dynamic_director’ has no member named ‘resolver_inst’; did you mean ‘resolver’?\r\n obj->resolver_inst = dyn_resolver_blob(resolver);\r\n ^~~~~~~~~~~~~\r\n resolver\r\nvmod_dynamic.c:940:24: error: implicit declaration of function ‘dyn_resolver_blob’; did you mean ‘vmod_resolver_use’? [-Werror=implicit-function-declaration]\r\n obj->resolver_inst = dyn_resolver_blob(resolver);\r\n ^~~~~~~~~~~~~~~~~\r\n vmod_resolver_use\r\nvmod_dynamic.c:941:12: error: ‘struct vmod_dynamic_director’ has no member named ‘resolver_inst’; did you mean ‘resolver’?\r\n if (obj->resolver_inst == NULL)\r\n ^~~~~~~~~~~~~\r\n resolver\r\nvmod_dynamic.c:945:10: error: ‘struct vmod_dynamic_director’ has no member named ‘ttl_from’\r\n if (obj->ttl_from != cfg)\r\n ^~\r\nIn file included from vmod_dynamic.c:55:\r\nvmod_dynamic.c: At top level:\r\ndyn_resolver.h:32:13: error: storage size of ‘dynamic_resolver’ isn’t known\r\n struct VPFX(dynamic_resolver);\r\n ^~~~~~~~~~~~~~~~\r\ncc1: all warnings being treated as errors\r\nmake[2]: *** [Makefile:702: vmod_dynamic.lo] Error 1\r\nmake[2]: Leaving directory '/tmp/bb/libvmod-dynamic/src'\r\nmake[1]: *** [Makefile:494: all-recursive] Error 1\r\nmake[1]: Leaving directory '/tmp/bb/libvmod-dynamic'\r\nmake: *** [Makefile:405: all] Error 2\r\n```\r\n\r\nI have no problem compiling other modules such as xkey or curl.\r\nAny help pointing what I'm doing wrong would be much appreciated, thanks","closed_by":{"login":"abresson","id":23034299,"node_id":"MDQ6VXNlcjIzMDM0Mjk5","avatar_url":"https://avatars.githubusercontent.com/u/23034299?v=4","gravatar_id":"","url":"https://api.github.com/users/abresson","html_url":"https://github.com/abresson","followers_url":"https://api.github.com/users/abresson/followers","following_url":"https://api.github.com/users/abresson/following{/other_user}","gists_url":"https://api.github.com/users/abresson/gists{/gist_id}","starred_url":"https://api.github.com/users/abresson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abresson/subscriptions","organizations_url":"https://api.github.com/users/abresson/orgs","repos_url":"https://api.github.com/users/abresson/repos","events_url":"https://api.github.com/users/abresson/events{/privacy}","received_events_url":"https://api.github.com/users/abresson/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/62/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/62/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/63","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/63/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/63/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/63/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/63","id":687925709,"node_id":"MDU6SXNzdWU2ODc5MjU3MDk=","number":63,"title":"Is it possible: self-routing sharded Varnish Cache cluster with libvmod-dynamic ?","user":{"login":"abresson","id":23034299,"node_id":"MDQ6VXNlcjIzMDM0Mjk5","avatar_url":"https://avatars.githubusercontent.com/u/23034299?v=4","gravatar_id":"","url":"https://api.github.com/users/abresson","html_url":"https://github.com/abresson","followers_url":"https://api.github.com/users/abresson/followers","following_url":"https://api.github.com/users/abresson/following{/other_user}","gists_url":"https://api.github.com/users/abresson/gists{/gist_id}","starred_url":"https://api.github.com/users/abresson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abresson/subscriptions","organizations_url":"https://api.github.com/users/abresson/orgs","repos_url":"https://api.github.com/users/abresson/repos","events_url":"https://api.github.com/users/abresson/events{/privacy}","received_events_url":"https://api.github.com/users/abresson/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":5,"created_at":"2020-08-28T09:02:38Z","updated_at":"2024-03-18T20:26:02Z","closed_at":"2020-09-02T10:47:13Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hello,\r\n\r\nI usually (without libvmod-dynamic) use cache sharding on varnish, based on what is described here : https://info.varnish-software.com/blog/creating-self-routing-varnish-cluster\r\n\r\nWith libvmod-dynamic I'm not able to determine the varnish backend identity from which the traffic is coming from because `req.backend_hint` doesn't return the name of a specific backend, but instead the general name of the dynamic backend.\r\n\r\nHere are some vcl configuration to try to make myself clear:\r\n\r\n**Without dynamic**\r\n```\r\nbackend node1 {\r\n .host = \"node1.example.com\";\r\n .port = \"80\";\r\n}\r\n\r\nbackend node2 {\r\n .host = \"node2.example.com\";\r\n .port = \"80\";\r\n}\r\n\r\nbackend content {\r\n .host = \"content-origin.example.com\";\r\n .port = \"80\";\r\n}\r\n\r\nsub vcl_init\r\n{\r\n new cluster = directors.hash();\r\n cluster.add_backend(node1, 1);\r\n cluster.add_backend(node2, 1);\r\n}\r\n\r\nsub vcl_recv\r\n{\r\n set req.backend_hint = cluster.backend();\r\n set req.http.X-shard = req.backend_hint;\r\n\r\n if (req.http.X-shard == server.identity) {\r\n set req.backend_hint = content;\r\n } else {\r\n return(pass);\r\n }\r\n}\r\n```\r\nIn the above code, there is no problem, req.backend_hint will be set to either node1.example.com or node2.example.com\r\n\r\n**With dynamic**\r\n\r\nLet's imagine node.example.com is a multi A DNS record with 2 varnish servers,\r\n`node.example.com 300 IN CNAME varnish1`\r\n `node.example.com 300 IN CNAME varnish2`\r\n\r\n```\r\nprobe node_probe {\r\n .interval = 5s;\r\n .timeout = 1s;\r\n .window = 5;\r\n .threshold = 3;\r\n .initial = 3;\r\n .request =\r\n \"HEAD / HTTP/1.1\"\r\n \"Host: node.example.com\"\r\n \"Connection: close\"\r\n \"User-Agent: Varnish node Health Probe\";\r\n\r\n}\r\n\r\nprobe content_probe {\r\n .interval = 5s;\r\n .timeout = 1s;\r\n .window = 5;\r\n .threshold = 3;\r\n .initial = 3;\r\n .request =\r\n \"HEAD / HTTP/1.1\"\r\n \"Host: content-origin.example.com\"\r\n \"Connection: close\"\r\n \"User-Agent: Varnish content Health Probe\";\r\n}\r\n\r\nsub vcl_init\r\n{\r\n new d_node = dynamic.director(\r\n probe = node_probe,\r\n host_header = \"Host\",\r\n port = 80,\r\n ttl = 30s\r\n );\r\n\r\n new d_content= dynamic.director(\r\n probe = content_probe,\r\n host_header = \"Host\",\r\n port = 80,\r\n ttl = 30s\r\n );\r\n\r\n new v_cluster = directors.shard();\r\n varnish_nodes.add_backend(d_node.backend(\"node.example.com\",\"80\"));\r\n varnish_nodes.reconfigure();\r\n\r\n new c_cluster = directors.round_robin();\r\n front_nodes.add_backend(d_content.backend(\"content-origin.example.com\",\"80\"));\r\n}\r\n\r\nsub vcl_recv\r\n{\r\n set req.backend_hint = v_cluster.backend();\r\n set req.http.X-shard = req.backend_hint;\r\n\r\n if (req.http.X-shard == server.identity) {\r\n set req.backend_hint = c_cluster;\r\n } else {\r\n return(pass);\r\n }\r\n}\r\n```\r\n\r\nThe above code doesn't work because `req.backend_hint = v_cluster.backend()` will be set to `v_cluster(node.example.com:80)` and not to the actual varnish backend hosts. \r\nI mean `req.http.X-shard` will be set to either `varnish2` or `varnish1` whereas `req.backend_hint` wil always be set to `v_cluster(node.example.com:80)`\r\n\r\nIs there any way to put hostname of the varnish wich actually catched the orign request in \r\n`req.backend_hint` ?\r\n\r\nI'm sorry if my explanation is confused, let me know if you need me to add more information to clarify.\r\n\r\nRegards,","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/63/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/63/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/64","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/64/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/64/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/64/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/64","id":720085486,"node_id":"MDU6SXNzdWU3MjAwODU0ODY=","number":64,"title":"Compilation error against Varnish 6.1.1","user":{"login":"wimsymons","id":1419117,"node_id":"MDQ6VXNlcjE0MTkxMTc=","avatar_url":"https://avatars.githubusercontent.com/u/1419117?v=4","gravatar_id":"","url":"https://api.github.com/users/wimsymons","html_url":"https://github.com/wimsymons","followers_url":"https://api.github.com/users/wimsymons/followers","following_url":"https://api.github.com/users/wimsymons/following{/other_user}","gists_url":"https://api.github.com/users/wimsymons/gists{/gist_id}","starred_url":"https://api.github.com/users/wimsymons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wimsymons/subscriptions","organizations_url":"https://api.github.com/users/wimsymons/orgs","repos_url":"https://api.github.com/users/wimsymons/repos","events_url":"https://api.github.com/users/wimsymons/events{/privacy}","received_events_url":"https://api.github.com/users/wimsymons/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2020-10-13T10:13:01Z","updated_at":"2020-10-14T11:21:26Z","closed_at":"2020-10-14T08:54:45Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi,\r\n\r\nI'm trying to compile the module against Varnish 6.1.1 provided by Debian 10 (Buster).\r\nAs stated in the README, I should use branch 6.2 for that.\r\n\r\nBut when I try to do so, I get these compilation errors:\r\n\r\n```\r\nmake all-recursive\r\nmake[1]: Entering directory '/home/vagrant/libvmod-dynamic64'\r\nMaking all in src\r\nmake[2]: Entering directory '/home/vagrant/libvmod-dynamic64/src'\r\n VMODTOOL vcc_dynamic_if.c\r\n CC vmod_dynamic.lo\r\nIn file included from vmod_dynamic.c:55:\r\ndyn_resolver.h:34:31: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token\r\n struct VPFX(dynamic_resolver) * dyn_resolver_blob(VCL_BLOB);\r\n ^\r\ndyn_resolver.h:51:56: error: expected ‘;’, ‘,’ or ‘)’ before ‘*’ token\r\n typedef int res_lookup_f(struct VPFX(dynamic_resolver) *r,\r\n ^\r\ndyn_resolver.h:58:56: error: expected ‘;’, ‘,’ or ‘)’ before ‘*’ token\r\n typedef int srv_lookup_f(struct VPFX(dynamic_resolver) *r,\r\n ^\r\ndyn_resolver.h:72:2: error: unknown type name ‘res_lookup_f’\r\n res_lookup_f *lookup;\r\n ^~~~~~~~~~~~\r\ndyn_resolver.h:76:2: error: unknown type name ‘srv_lookup_f’\r\n srv_lookup_f *srv_lookup;\r\n ^~~~~~~~~~~~\r\nIn file included from vmod_dynamic.c:56:\r\nvmod_dynamic.h:176:33: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘*’ token\r\n struct VPFX(dynamic_resolver) *resolver_inst;\r\n ^\r\nvmod_dynamic.c: In function ‘dynamic_update_domain’:\r\nvmod_dynamic.c:452:21: error: ‘struct vmod_dynamic_director’ has no member named ‘ttl_from’\r\n } else if (dom->obj->ttl_from == cfg) {\r\n ^~\r\nvmod_dynamic.c:454:21: error: ‘struct vmod_dynamic_director’ has no member named ‘ttl_from’\r\n } else if (dom->obj->ttl_from == min) {\r\n ^~\r\nvmod_dynamic.c:457:21: error: ‘struct vmod_dynamic_director’ has no member named ‘ttl_from’\r\n } else if (dom->obj->ttl_from == max) {\r\n ^~\r\nIn file included from /usr/include/varnish/cache/cache.h:50,\r\n from vmod_dynamic.c:45:\r\nvmod_dynamic.c:461:18: error: ‘struct vmod_dynamic_director’ has no member named ‘ttl_from’\r\n assert(dom->obj->ttl_from == dns);\r\n ^~\r\n/usr/include/varnish/vas.h:59:8: note: in definition of macro ‘assert’\r\n if (!(e)) { \\\r\n ^\r\nvmod_dynamic.c: In function ‘dynamic_lookup_thread’:\r\nvmod_dynamic.c:498:26: error: ‘struct vmod_dynamic_director’ has no member named ‘resolver_inst’; did you mean ‘resolver’?\r\n ret = res->lookup(obj->resolver_inst, dom->addr,\r\n ^~~~~~~~~~~~~\r\n resolver\r\nvmod_dynamic.c:498:9: error: called object is not a function or function pointer\r\n ret = res->lookup(obj->resolver_inst, dom->addr,\r\n ^~~\r\nvmod_dynamic.c: In function ‘vmod_director__init’:\r\nvmod_dynamic.c:932:5: error: ‘struct vmod_dynamic_director’ has no member named ‘ttl_from’\r\n obj->ttl_from = dynamic_ttl_parse(ttl_from_s);\r\n ^~\r\nvmod_dynamic.c:936:8: error: ‘struct vmod_dynamic_director’ has no member named ‘resolver_inst’; did you mean ‘resolver’?\r\n obj->resolver_inst = dyn_resolver_blob(resolver);\r\n ^~~~~~~~~~~~~\r\n resolver\r\nvmod_dynamic.c:936:24: error: implicit declaration of function ‘dyn_resolver_blob’; did you mean ‘vmod_resolver_use’? [-Werror=implicit-function-declaration]\r\n obj->resolver_inst = dyn_resolver_blob(resolver);\r\n ^~~~~~~~~~~~~~~~~\r\n vmod_resolver_use\r\nvmod_dynamic.c:937:12: error: ‘struct vmod_dynamic_director’ has no member named ‘resolver_inst’; did you mean ‘resolver’?\r\n if (obj->resolver_inst == NULL)\r\n ^~~~~~~~~~~~~\r\n resolver\r\nvmod_dynamic.c:941:10: error: ‘struct vmod_dynamic_director’ has no member named ‘ttl_from’\r\n if (obj->ttl_from != cfg)\r\n ^~\r\nIn file included from vmod_dynamic.c:55:\r\nvmod_dynamic.c: At top level:\r\ndyn_resolver.h:32:13: error: storage size of ‘dynamic_resolver’ isn’t known\r\n struct VPFX(dynamic_resolver);\r\n ^~~~~~~~~~~~~~~~\r\ncc1: all warnings being treated as errors\r\nmake[2]: *** [Makefile:704: vmod_dynamic.lo] Error 1\r\nmake[2]: Leaving directory '/home/vagrant/libvmod-dynamic64/src'\r\nmake[1]: *** [Makefile:497: all-recursive] Error 1\r\nmake[1]: Leaving directory '/home/vagrant/libvmod-dynamic64'\r\nmake: *** [Makefile:408: all] Error 2\r\n```\r\n\r\nSteps to reproduce on Debian Buster:\r\n```\r\nsudo apt-get install libgetdns-dev libvarnishapi-dev automake libtool python3-docutils\r\ngit clone https://github.com/nigoroll/libvmod-dynamic.git libvmod-dynamic64\r\ncd libvmod-dynamic64/\r\ngit checkout 6.2\r\n./autogen.sh\r\n./configure\r\nmake\r\n```\r\n\r\nPackage versions:\r\n```\r\nvagrant@debian-10:~/libvmod-dynamic64$ dpkg -l libvarnishapi-dev libgetdns-dev\r\nDesired=Unknown/Install/Remove/Purge/Hold\r\n| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend\r\n|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)\r\n||/ Name Version Architecture Description\r\n+++-=======================-===============-============-=================================\r\nii libgetdns-dev 1.5.1-1 amd64 modern asynchronous DNS API (development)\r\nii libvarnishapi-dev:amd64 6.1.1-1+deb10u1 amd64 development files for Varnish\r\n```\r\n\r\nIs the 6.2 branch no longer compatible with Varnish 6.1.1?\r\n\r\nKind regards\r\n\r\nWim","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/64/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/64/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/65","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/65/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/65/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/65/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/65","id":743264836,"node_id":"MDExOlB1bGxSZXF1ZXN0NTIxMjAxMjA2","number":65,"title":"Fix for addition of struct vrt_endpoint to VRT.","user":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2020-11-15T14:10:02Z","updated_at":"2020-11-16T15:43:04Z","closed_at":"2020-11-16T15:43:04Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/65","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/65","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/65.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/65.patch","merged_at":"2020-11-16T15:43:04Z"},"body":"","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/65/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/65/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/66","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/66/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/66/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/66/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/66","id":772100619,"node_id":"MDU6SXNzdWU3NzIxMDA2MTk=","number":66,"title":"error: storage size of 'ep' isn't known","user":{"login":"ronaldploeger","id":2346952,"node_id":"MDQ6VXNlcjIzNDY5NTI=","avatar_url":"https://avatars.githubusercontent.com/u/2346952?v=4","gravatar_id":"","url":"https://api.github.com/users/ronaldploeger","html_url":"https://github.com/ronaldploeger","followers_url":"https://api.github.com/users/ronaldploeger/followers","following_url":"https://api.github.com/users/ronaldploeger/following{/other_user}","gists_url":"https://api.github.com/users/ronaldploeger/gists{/gist_id}","starred_url":"https://api.github.com/users/ronaldploeger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ronaldploeger/subscriptions","organizations_url":"https://api.github.com/users/ronaldploeger/orgs","repos_url":"https://api.github.com/users/ronaldploeger/repos","events_url":"https://api.github.com/users/ronaldploeger/events{/privacy}","received_events_url":"https://api.github.com/users/ronaldploeger/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804426,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjY=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/invalid","name":"invalid","color":"e6e6e6","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2020-12-21T11:43:49Z","updated_at":"2021-09-15T22:55:30Z","closed_at":"2020-12-21T13:00:09Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I am building inside a docker container based on \"ubuntu:18.04\" running: \r\n\r\n```\r\nVMOD_DYNAMIC_BUILD_DEPS=\"autotools-dev \\\r\n automake \\\r\n libtool \\\r\n autoconf \\\r\n libncurses-dev \\\r\n xsltproc \\\r\n groff-base \\\r\n libpcre3-dev \\\r\n pkg-config \\\r\n build-essential \\\r\n python3 \\\r\n python3-docutils \\\r\n libjemalloc-dev \\\r\n libreadline-dev \\\r\n python3-sphinx \\\r\n libcurl3-dev \\\r\n unzip\"\r\n\r\n# Install dependencies\r\n# ------------------------------------------------------------------------------\r\napt-get update\r\napt-get install --no-install-recommends --no-install-suggests -y ${VMOD_DYNAMIC_BUILD_DEPS}\r\n\r\nunzip \"${VMOD_DYNAMIC_DOWNLOAD}\"\r\n\r\nsh autogen.sh\r\nsh configure \\\r\n --bindir=/usr/bin \\\r\n --sbindir=/usr/sbin \\\r\n --sysconfdir=/etc \\\r\n --libdir=/usr/lib\r\nmake\r\nmake install\r\n```\r\n\r\nFrom this commit https://github.com/nigoroll/libvmod-dynamic/commit/caab533a23f60c9e1227c4db241b7749841f780d on I can not build anymore but get\r\n\r\n```\r\nmake all-recursive\r\nmake[1]: Entering directory '/tmp/docker/libvmod-dynamic-caab533a23f60c9e1227c4db241b7749841f780d'\r\nMaking all in src\r\nmake[2]: Entering directory '/tmp/docker/libvmod-dynamic-caab533a23f60c9e1227c4db241b7749841f780d/src'\r\n VMODTOOL vcc_dynamic_if.c\r\n CC vmod_dynamic.lo\r\nvmod_dynamic.c: In function 'dynamic_add':\r\nvmod_dynamic.c:327:22: error: storage size of 'ep' isn't known\r\n struct vrt_endpoint ep;\r\n ^~\r\nIn file included from /usr/local/include/varnish/cache/cache.h:51:0,\r\n from vmod_dynamic.c:45:\r\nvmod_dynamic.c:396:16: error: 'VRT_ENDPOINT_MAGIC' undeclared (first use in this function); did you mean 'VRT_BACKEND_MAGIC'?\r\n INIT_OBJ(&ep, VRT_ENDPOINT_MAGIC);\r\n ^\r\n/usr/local/include/varnish/miniobj.h:17:18: note: in definition of macro 'INIT_OBJ'\r\n (to)->magic = (type_magic); \\\r\n ^~~~~~~~~~\r\nvmod_dynamic.c:396:16: note: each undeclared identifier is reported only once for each function it appears in\r\n INIT_OBJ(&ep, VRT_ENDPOINT_MAGIC);\r\n ^\r\n/usr/local/include/varnish/miniobj.h:17:18: note: in definition of macro 'INIT_OBJ'\r\n (to)->magic = (type_magic); \\\r\n ^~~~~~~~~~\r\nvmod_dynamic.c:410:5: error: 'struct vrt_backend' has no member named 'endpoint'\r\n vrt.endpoint = &ep;\r\n ^\r\nvmod_dynamic.c:327:22: error: unused variable 'ep' [-Werror=unused-variable]\r\n struct vrt_endpoint ep;\r\n ^~\r\ncc1: all warnings being treated as errors\r\nMakefile:689: recipe for target 'vmod_dynamic.lo' failed\r\nmake[2]: Leaving directory '/tmp/docker/libvmod-dynamic-caab533a23f60c9e1227c4db241b7749841f780d/src'\r\nmake[2]: *** [vmod_dynamic.lo] Error 1\r\nMakefile:494: recipe for target 'all-recursive' failed\r\nmake[1]: Leaving directory '/tmp/docker/libvmod-dynamic-caab533a23f60c9e1227c4db241b7749841f780d'\r\nmake[1]: *** [all-recursive] Error 1\r\nMakefile:405: recipe for target 'all' failed\r\nmake: *** [all] Error 2\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/66/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/66/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/67","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/67/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/67/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/67/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/67","id":780680903,"node_id":"MDU6SXNzdWU3ODA2ODA5MDM=","number":67,"title":"Assert error in VRT_VSC_Destroy()","user":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804422,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjI=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/bug","name":"bug","color":"ee0701","default":true,"description":null}],"state":"closed","locked":false,"assignee":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":0,"created_at":"2021-01-06T16:28:04Z","updated_at":"2021-01-07T13:50:11Z","closed_at":"2021-01-07T13:50:11Z","author_association":"OWNER","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"seen by @slimhazard\r\n```\r\nPanic at: Wed, 06 Jan 2021 13:53:13 GMT\r\nAssert error in VRT_VSC_Destroy(), common/common_vsc.c line 200:\r\n Condition((vsg) != NULL) not true.\r\nversion = varnish-6.5.1 revision1dae23376bb5ea7a6b8e9e4b9ed95cdc9469fb64, vrt api = 12.0\r\nident = Linux,4.19.0-6-amd64,x86_64,-junix,-sdefault,-sdefault,-hcritbit,epoll\r\nnow = 486009.986834 (mono), 1609941193.760639 (real)\r\nBacktrace:\r\n 0x43f7df: /usr/sbin/varnishd() [0x43f7df]\r\n 0x4a99b5: /usr/sbin/varnishd(VAS_Fail+0x45) [0x4a99b5]\r\n 0x4644f1: /usr/sbin/varnishd() [0x4644f1]\r\n 0x7f951d5fd990: ./vmod_cache/_vmod_dynamic.99d3db6707fde818e419de5d6c0c375da7efe809681dcdc4ffcf909db540302c(vmod_event+0x470)\r\n[0x7f951d5fd990]\r\n 0x7f9519e1e726: vcl_vk8s_ing_65OeQ3N75jaW8kbTEH3frDay01MAwI8ve4hKg7.1609940320.829609/vgc.so(+0x4726)\r\n[0x7f9519e1e726]\r\n 0x44f3c8: /usr/sbin/varnishd() [0x44f3c8]\r\n 0x451113: /usr/sbin/varnishd(VCL_Poll+0x123) [0x451113]\r\n 0x4513dd: /usr/sbin/varnishd() [0x4513dd]\r\n 0x4abbca: /usr/sbin/varnishd() [0x4abbca]\r\n 0x4ac09e: /usr/sbin/varnishd(VCLS_Poll+0x35e)\r\n...\r\n```","closed_by":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/67/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/67/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/68","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/68/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/68/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/68/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/68","id":794019764,"node_id":"MDU6SXNzdWU3OTQwMTk3NjQ=","number":68,"title":"can not build on alpine:3.13","user":{"login":"raybog","id":8174876,"node_id":"MDQ6VXNlcjgxNzQ4NzY=","avatar_url":"https://avatars.githubusercontent.com/u/8174876?v=4","gravatar_id":"","url":"https://api.github.com/users/raybog","html_url":"https://github.com/raybog","followers_url":"https://api.github.com/users/raybog/followers","following_url":"https://api.github.com/users/raybog/following{/other_user}","gists_url":"https://api.github.com/users/raybog/gists{/gist_id}","starred_url":"https://api.github.com/users/raybog/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/raybog/subscriptions","organizations_url":"https://api.github.com/users/raybog/orgs","repos_url":"https://api.github.com/users/raybog/repos","events_url":"https://api.github.com/users/raybog/events{/privacy}","received_events_url":"https://api.github.com/users/raybog/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":7,"created_at":"2021-01-26T08:01:19Z","updated_at":"2021-03-16T15:48:05Z","closed_at":"2021-03-16T15:48:05Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Trying to build varnish docker on latest alpine:\r\n\r\n```\r\nFROM alpine:3.13 AS builder\r\nENV LIBVMOD_DYNAMIC_VERSION=2.3.0\r\nRUN apk --no-cache add automake autoconf libtool make curl python3 py3-sphinx py-docutils pkgconf \\\r\n gcc make g++ zlib-dev pcre-dev libedit-dev readline-dev libexecinfo-dev linux-headers \\\r\n varnish varnish-dev\r\n\r\nRUN cd /tmp && curl -sSLO https://github.com/nigoroll/libvmod-dynamic/archive/v${LIBVMOD_DYNAMIC_VERSION}.zip && \\\r\n unzip v${LIBVMOD_DYNAMIC_VERSION}.zip && cd libvmod-dynamic-${LIBVMOD_DYNAMIC_VERSION} && \\\r\n ./autogen.sh && ./configure && make && make install\r\n\r\n```\r\n\r\nGetting this error:\r\n\r\n```\r\n/usr/lib/gcc/x86_64-alpine-linux-musl/10.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: .libs/vmod_dynamic_service.o:/tmp/libvmod-dynamic-2.3.0/src/vmod_dynamic.h:181: multiple definition of `objects'; .libs/vmod_dynamic.o:/tmp/libvmod-dynamic-2.3.0/src/vmod_dynamic.h:181: first defined here\r\ncollect2: error: ld returned 1 exit status\r\nmake[2]: Leaving directory '/tmp/libvmod-dynamic-2.3.0/src'\r\n```\r\n\r\n\r\n\r\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/68/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/68/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/69","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/69/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/69/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/69/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/69","id":830221383,"node_id":"MDU6SXNzdWU4MzAyMjEzODM=","number":69,"title":"Compilation error on Debian bullseye (testing)","user":{"login":"huiser","id":50897,"node_id":"MDQ6VXNlcjUwODk3","avatar_url":"https://avatars.githubusercontent.com/u/50897?v=4","gravatar_id":"","url":"https://api.github.com/users/huiser","html_url":"https://github.com/huiser","followers_url":"https://api.github.com/users/huiser/followers","following_url":"https://api.github.com/users/huiser/following{/other_user}","gists_url":"https://api.github.com/users/huiser/gists{/gist_id}","starred_url":"https://api.github.com/users/huiser/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/huiser/subscriptions","organizations_url":"https://api.github.com/users/huiser/orgs","repos_url":"https://api.github.com/users/huiser/repos","events_url":"https://api.github.com/users/huiser/events{/privacy}","received_events_url":"https://api.github.com/users/huiser/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804423,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjM=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/duplicate","name":"duplicate","color":"cccccc","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2021-03-12T15:21:26Z","updated_at":"2021-03-12T15:49:02Z","closed_at":"2021-03-12T15:48:54Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I try to compile tag v2.3.0 in a Debian bullseye docker container, but it fails with the following error:\r\n\r\n```\r\nroot@8a81ad28d485:/src/libvmod-dynamic# make \r\nmake all-recursive\r\nmake[1]: Entering directory '/src/libvmod-dynamic'\r\nMaking all in src\r\nmake[2]: Entering directory '/src/libvmod-dynamic/src'\r\n CCLD libvmod_dynamic.la\r\n/usr/bin/ld: .libs/vmod_dynamic_service.o:/src/libvmod-dynamic/src/vmod_dynamic.h:181: multiple definition of `objects'; .libs/vmod_dynamic.o:/src/libvmod-dynamic/src/vmod_dynamic.h:181: first defined here\r\ncollect2: error: ld returned 1 exit status\r\nmake[2]: *** [Makefile:667: libvmod_dynamic.la] Error 1\r\nmake[2]: Leaving directory '/src/libvmod-dynamic/src'\r\nmake[1]: *** [Makefile:499: all-recursive] Error 1\r\nmake[1]: Leaving directory '/src/libvmod-dynamic'\r\nmake: *** [Makefile:410: all] Error 2\r\n```\r\n\r\nCommand to start container:\r\n```\r\ndocker run -ti --rm --name debian debian:bullseye-20210311-slim\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/69/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/69/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/70","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/70/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/70/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/70/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/70","id":833597611,"node_id":"MDU6SXNzdWU4MzM1OTc2MTE=","number":70,"title":"Assert error in VRT_SetHealth(), cache/cache_vcl_vrt.c line 223","user":{"login":"wimsymons","id":1419117,"node_id":"MDQ6VXNlcjE0MTkxMTc=","avatar_url":"https://avatars.githubusercontent.com/u/1419117?v=4","gravatar_id":"","url":"https://api.github.com/users/wimsymons","html_url":"https://github.com/wimsymons","followers_url":"https://api.github.com/users/wimsymons/followers","following_url":"https://api.github.com/users/wimsymons/following{/other_user}","gists_url":"https://api.github.com/users/wimsymons/gists{/gist_id}","starred_url":"https://api.github.com/users/wimsymons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wimsymons/subscriptions","organizations_url":"https://api.github.com/users/wimsymons/orgs","repos_url":"https://api.github.com/users/wimsymons/repos","events_url":"https://api.github.com/users/wimsymons/events{/privacy}","received_events_url":"https://api.github.com/users/wimsymons/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":2228311103,"node_id":"MDU6TGFiZWwyMjI4MzExMTAz","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/needs%20%E2%99%A1Sponsor","name":"needs ♡Sponsor","color":"e094d3","default":false,"description":"looking for support ♥"}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2021-03-17T09:58:35Z","updated_at":"2021-03-17T10:40:37Z","closed_at":"2021-03-17T10:40:37Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi,\r\n\r\nWe found a (concurrency?) bug, running on Varnish 6.1.1.\r\n\r\nNot sure that it is in this module, but it happened when a deploy occurred on the infrastructure behind on of the dynamic directors (AWS Beanstalk). The load balancer got new instances, thus the IP addresses changed.\r\n\r\nVarnish child dies, this is posted in the logs:\r\n```\r\nMar 16 16:04:24 ip-172-22-84-104 varnishd[19503]: Child (19522) not responding to CLI, killed it.\r\nMar 16 16:04:24 ip-172-22-84-104 varnishd[19503]: Unexpected reply from ping: 400 CLI communication error (hdr)\r\nMar 16 16:04:24 ip-172-22-84-104 varnishd[19503]: Child (19522) died signal=6\r\nMar 16 16:04:24 ip-172-22-84-104 varnishd[19503]: Child (19522) Panic at: Tue, 16 Mar 2021 16:04:24 GMT\r\n Assert error in VRT_SetHealth(), cache/cache_vcl_vrt.c line 223:\r\n Condition((d) != NULL) not true.\r\n version = varnish-6.1.1 revision efc2f6c1536cf2272e471f5cff5f145239b19460, vrt api = 8.0\r\n ident = Linux,4.19.0-14-amd64,x86_64,-junix,-smalloc,-sdefault,-hcritbit,epoll\r\n now = 714264.543532 (mono), 1615910663.806864 (real)\r\n Backtrace:\r\n 0x5616f60a3d2a: /usr/sbin/varnishd(+0x4cd2a) [0x5616f60a3d2a]\r\n 0x5616f610bcc3: /usr/sbin/varnishd(VAS_Fail+0x13) [0x5616f610bcc3]\r\n 0x5616f60b6c0b: /usr/sbin/varnishd(VRT_SetHealth+0x6b) [0x5616f60b6c0b]\r\n 0x5616f6083520: /usr/sbin/varnishd(VBP_Remove+0x60) [0x5616f6083520]\r\n 0x5616f607f83e: /usr/sbin/varnishd(+0x2883e) [0x5616f607f83e]\r\n 0x5616f60b69d2: /usr/sbin/varnishd(VRT_DelDirector+0x112) [0x5616f60b69d2]\r\n 0x5616f6081509: /usr/sbin/varnishd(VBE_Poll+0xc9) [0x5616f6081509]\r\n 0x5616f6087d0d: /usr/sbin/varnishd(+0x30d0d) [0x5616f6087d0d]\r\n 0x5616f610dd02: /usr/sbin/varnishd(+0xb6d02) [0x5616f610dd02]\r\n 0x5616f610e369: /usr/sbin/varnishd(VCLS_Poll+0x2e9) [0x5616f610e369]\r\n thread = (cache-main)\r\n thr.req = (nil) {\r\n },\r\n thr.busyobj = (nil) {\r\n },\r\nMar 16 16:04:24 ip-172-22-84-104 varnishd[19503]: Child cleanup complete\r\nMar 16 16:04:24 ip-172-22-84-104 varnishd[19503]: Child (30911) Started\r\nMar 16 16:04:24 ip-172-22-84-104 varnishd[19503]: Child (30911) said Child starts\r\n```\r\n\r\nSome snippets from the VCL config:\r\n```\r\nprobe dynamic_probe {\r\n .interval = 5s;\r\n .timeout = 5s;\r\n .initial = 3;\r\n .threshold = 2;\r\n .window = 3;\r\n .request =\r\n \"GET /health HTTP/1.1\"\r\n \"User-Agent: Varnish Probe\"\r\n \"Host: localhost\"\r\n \"Connection: close\";\r\n}\r\n\r\n...\r\n\r\nsub vcl_init {\r\n new dynamic_director = dynamic.director(\r\n port = \"80\",\r\n ttl = 2m,\r\n connect_timeout = 3s,\r\n first_byte_timeout = 10s,\r\n between_bytes_timeout = 5s,\r\n probe = dynamic_probe\r\n );\r\n}\r\n```\r\n\r\nThe libvmod-dynamic module was compiled on Thu, 15 Oct 2020 09:12:00 +0000 against the latest code now on the 6.1 branch (https://github.com/nigoroll/libvmod-dynamic/commit/4931cfd08ad6f142a9f13b064c8a5aa0723f84a1).\r\n\r\nWe need to restart the [Varnish Prometheus exporter](https://github.com/jonnenauha/prometheus_varnish_exporter) after that to send out correct metrics after that, but that's another issue.","closed_by":{"login":"wimsymons","id":1419117,"node_id":"MDQ6VXNlcjE0MTkxMTc=","avatar_url":"https://avatars.githubusercontent.com/u/1419117?v=4","gravatar_id":"","url":"https://api.github.com/users/wimsymons","html_url":"https://github.com/wimsymons","followers_url":"https://api.github.com/users/wimsymons/followers","following_url":"https://api.github.com/users/wimsymons/following{/other_user}","gists_url":"https://api.github.com/users/wimsymons/gists{/gist_id}","starred_url":"https://api.github.com/users/wimsymons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wimsymons/subscriptions","organizations_url":"https://api.github.com/users/wimsymons/orgs","repos_url":"https://api.github.com/users/wimsymons/repos","events_url":"https://api.github.com/users/wimsymons/events{/privacy}","received_events_url":"https://api.github.com/users/wimsymons/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/70/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/70/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/71","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/71/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/71/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/71/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/71","id":910220237,"node_id":"MDExOlB1bGxSZXF1ZXN0NjYwNjc2MTE3","number":71,"title":"Add least connections and weighted least connections balancing algorithms","user":{"login":"karlvr","id":1086005,"node_id":"MDQ6VXNlcjEwODYwMDU=","avatar_url":"https://avatars.githubusercontent.com/u/1086005?v=4","gravatar_id":"","url":"https://api.github.com/users/karlvr","html_url":"https://github.com/karlvr","followers_url":"https://api.github.com/users/karlvr/followers","following_url":"https://api.github.com/users/karlvr/following{/other_user}","gists_url":"https://api.github.com/users/karlvr/gists{/gist_id}","starred_url":"https://api.github.com/users/karlvr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/karlvr/subscriptions","organizations_url":"https://api.github.com/users/karlvr/orgs","repos_url":"https://api.github.com/users/karlvr/repos","events_url":"https://api.github.com/users/karlvr/events{/privacy}","received_events_url":"https://api.github.com/users/karlvr/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804424,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjQ=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/enhancement","name":"enhancement","color":"84b6eb","default":true,"description":null},{"id":2228311103,"node_id":"MDU6TGFiZWwyMjI4MzExMTAz","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/needs%20%E2%99%A1Sponsor","name":"needs ♡Sponsor","color":"e094d3","default":false,"description":"looking for support ♥"},{"id":2228316027,"node_id":"MDU6TGFiZWwyMjI4MzE2MDI3","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/needs%20varnish-cache","name":"needs varnish-cache","color":"006b75","default":false,"description":"needs work in varnish-cache"}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":3,"created_at":"2021-06-03T07:51:21Z","updated_at":"2023-01-05T04:40:45Z","closed_at":"2022-11-08T19:55:08Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/71","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/71","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/71.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/71.patch","merged_at":null},"body":"There is some code to tidy up in here (a x 1.25 particularly), but I am hoping to gauge your interest in merging something like this! I made these changes several years ago, and we've been running with these changes for all of that time. Although I did just port them to 6.6.\r\n\r\nLet me know and I'll work on making it beautiful with you!","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/71/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/71/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/72","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/72/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/72/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/72/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/72","id":942117663,"node_id":"MDU6SXNzdWU5NDIxMTc2NjM=","number":72,"title":"the counter main.backend-unhealthy in varnishstat dont work when use the libvmod-dynamic","user":{"login":"yeurin","id":1029571,"node_id":"MDQ6VXNlcjEwMjk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1029571?v=4","gravatar_id":"","url":"https://api.github.com/users/yeurin","html_url":"https://github.com/yeurin","followers_url":"https://api.github.com/users/yeurin/followers","following_url":"https://api.github.com/users/yeurin/following{/other_user}","gists_url":"https://api.github.com/users/yeurin/gists{/gist_id}","starred_url":"https://api.github.com/users/yeurin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yeurin/subscriptions","organizations_url":"https://api.github.com/users/yeurin/orgs","repos_url":"https://api.github.com/users/yeurin/repos","events_url":"https://api.github.com/users/yeurin/events{/privacy}","received_events_url":"https://api.github.com/users/yeurin/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2021-07-12T14:21:43Z","updated_at":"2021-10-26T17:09:01Z","closed_at":"2021-10-26T17:09:01Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"hello, i'm using varnish 6.5.1, and libvmod-dynamic. and when i shut my backend define with the libvmod, varnish detect the unhealthy backend, switch to grace mode etc.. BUT, the counter MAIN.backend_unhealthy stay at 0. For information, i configured a health probe\r\n\r\nis there anything to do to correct that ?","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/72/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/72/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/73","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/73/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/73/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/73/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/73","id":998150632,"node_id":"I_kwDOBBOOTM47fpHo","number":73,"title":"`configure` doesn't read `libdir` from `varnishapi.pc`","user":{"login":"VasiliPupkin256","id":27725951,"node_id":"MDQ6VXNlcjI3NzI1OTUx","avatar_url":"https://avatars.githubusercontent.com/u/27725951?v=4","gravatar_id":"","url":"https://api.github.com/users/VasiliPupkin256","html_url":"https://github.com/VasiliPupkin256","followers_url":"https://api.github.com/users/VasiliPupkin256/followers","following_url":"https://api.github.com/users/VasiliPupkin256/following{/other_user}","gists_url":"https://api.github.com/users/VasiliPupkin256/gists{/gist_id}","starred_url":"https://api.github.com/users/VasiliPupkin256/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/VasiliPupkin256/subscriptions","organizations_url":"https://api.github.com/users/VasiliPupkin256/orgs","repos_url":"https://api.github.com/users/VasiliPupkin256/repos","events_url":"https://api.github.com/users/VasiliPupkin256/events{/privacy}","received_events_url":"https://api.github.com/users/VasiliPupkin256/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2021-09-16T12:23:11Z","updated_at":"2021-10-26T16:22:37Z","closed_at":"2021-10-26T16:22:37Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I see the variable is read in the scripts but it seems that it is only used for testing. When I run configure/make/install of the version 2.3.1 on Ubuntu 21.04 it tries to install module in `/usr/lib/varnish/vmods` instead of `/usr/lib/x86_64-linux-gnu/varnish/vmods` where it belongs on this repo. I've solved this with this hack\r\n\r\n ./configure --without-getdns \\\r\n --prefix=$(pkg-config --variable=prefix varnishapi) \\\r\n --bindir=$(pkg-config --variable=bindir varnishapi) \\\r\n --sbindir=$(pkg-config --variable=sbindir varnishapi) \\\r\n --sysconfdir=$(pkg-config --variable=sysconfdir varnishapi) \\\r\n --libdir=$(pkg-config --variable=libdir varnishapi)\r\n\r\nBut of course I don't like it. \r\n\r\nPS: I've tried to set `PKG_CONFIG_PATH` it doesn't change anything.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/73/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/73/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/74","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/74/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/74/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/74/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/74","id":1026076348,"node_id":"I_kwDOBBOOTM49KK68","number":74,"title":"test failing with varnish 6.6","user":{"login":"blacktek","id":42382745,"node_id":"MDQ6VXNlcjQyMzgyNzQ1","avatar_url":"https://avatars.githubusercontent.com/u/42382745?v=4","gravatar_id":"","url":"https://api.github.com/users/blacktek","html_url":"https://github.com/blacktek","followers_url":"https://api.github.com/users/blacktek/followers","following_url":"https://api.github.com/users/blacktek/following{/other_user}","gists_url":"https://api.github.com/users/blacktek/gists{/gist_id}","starred_url":"https://api.github.com/users/blacktek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/blacktek/subscriptions","organizations_url":"https://api.github.com/users/blacktek/orgs","repos_url":"https://api.github.com/users/blacktek/repos","events_url":"https://api.github.com/users/blacktek/events{/privacy}","received_events_url":"https://api.github.com/users/blacktek/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2021-10-14T07:50:41Z","updated_at":"2021-10-26T16:12:27Z","closed_at":"2021-10-26T16:12:27Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hello,\r\n we just installed this library on Varnish 6.6 and One of tests failed (out of 21):\r\n\r\n*** v1 CLI RX 106\r\n**** v1 CLI RX|Message from VCC-compiler:\r\n**** v1 CLI RX|Expected '{' got '+'\r\n**** v1 CLI RX|(program line 560), at\r\n**** v1 CLI RX|('' Line 7 Pos 27)\r\n**** v1 CLI RX| acl ipv4_loopback +log {\r\n**** v1 CLI RX|--------------------------#-----\r\n**** v1 CLI RX|\r\n**** v1 CLI RX|Running VCC-compiler failed, exited with 2\r\n**** v1 CLI RX|VCL compilation failed\r\n\r\n\r\n18 varnish v1 -vcl {\r\n19 import ${vmod_dynamic};\r\n20\r\n21 backend dummy { .host = \"${bad_ip}\"; .port = \"9080\"; }\r\n22\r\n23 acl ipv4_loopback +log {\r\n24 \"127/24\";\r\n25 }\r\n26\r\n27 sub vcl_init {\r\n28 new d1 = dynamic.director(\r\n29 port = \"${s1_port}\",\r\n30 whitelist = ipv4_loopback,\r\n31 domain_usage_timeout = 1s);\r\n32 d1.debug(true);\r\n33 }\r\n34\r\n35 sub vcl_recv {\r\n36 set req.backend_hint = d1.backend();\r\n37 }\r\n38 } -start\r\n\r\nCould you please make it working with Varnish 6.6?\r\n\r\nWhat are the consequences of the failed test?\r\n\r\nThank you","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/74/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/74/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/75","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/75/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/75/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/75/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/75","id":1027494200,"node_id":"I_kwDOBBOOTM49PlE4","number":75,"title":"Is \"master\" already ready for Varnish 7?","user":{"login":"ronaldploeger","id":2346952,"node_id":"MDQ6VXNlcjIzNDY5NTI=","avatar_url":"https://avatars.githubusercontent.com/u/2346952?v=4","gravatar_id":"","url":"https://api.github.com/users/ronaldploeger","html_url":"https://github.com/ronaldploeger","followers_url":"https://api.github.com/users/ronaldploeger/followers","following_url":"https://api.github.com/users/ronaldploeger/following{/other_user}","gists_url":"https://api.github.com/users/ronaldploeger/gists{/gist_id}","starred_url":"https://api.github.com/users/ronaldploeger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ronaldploeger/subscriptions","organizations_url":"https://api.github.com/users/ronaldploeger/orgs","repos_url":"https://api.github.com/users/ronaldploeger/repos","events_url":"https://api.github.com/users/ronaldploeger/events{/privacy}","received_events_url":"https://api.github.com/users/ronaldploeger/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2021-10-15T14:19:45Z","updated_at":"2021-10-26T15:54:54Z","closed_at":"2021-10-26T15:54:54Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Is \"master\" already ready for Varnish 7.0.0?\r\n\r\nThanks and all the best,\r\nRonald","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/75/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/75/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/76","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/76/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/76/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/76/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/76","id":1044868162,"node_id":"PR_kwDOBBOOTM4uGT2M","number":76,"title":"Add the authority parameter to .director().","user":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":3,"created_at":"2021-11-04T15:09:14Z","updated_at":"2023-07-07T13:59:13Z","closed_at":"2023-07-07T13:59:13Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":true,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/76","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/76","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/76.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/76.patch","merged_at":null},"body":"Previously this was always set to the value of the VRT_backend host\r\nheader. That is still the default, but with the new parameter a\r\ndifferent value may be set, or the parameter may be set to the\r\nempty string, to specify that no authority TLV should be sent.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/76/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/76/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/77","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/77/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/77/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/77/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/77","id":1045836082,"node_id":"I_kwDOBBOOTM4-VjEy","number":77,"title":"Cannot build on alpine:3.14","user":{"login":"alexpozzi","id":8307861,"node_id":"MDQ6VXNlcjgzMDc4NjE=","avatar_url":"https://avatars.githubusercontent.com/u/8307861?v=4","gravatar_id":"","url":"https://api.github.com/users/alexpozzi","html_url":"https://github.com/alexpozzi","followers_url":"https://api.github.com/users/alexpozzi/followers","following_url":"https://api.github.com/users/alexpozzi/following{/other_user}","gists_url":"https://api.github.com/users/alexpozzi/gists{/gist_id}","starred_url":"https://api.github.com/users/alexpozzi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexpozzi/subscriptions","organizations_url":"https://api.github.com/users/alexpozzi/orgs","repos_url":"https://api.github.com/users/alexpozzi/repos","events_url":"https://api.github.com/users/alexpozzi/events{/privacy}","received_events_url":"https://api.github.com/users/alexpozzi/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":7,"created_at":"2021-11-05T13:13:17Z","updated_at":"2021-11-08T10:32:20Z","closed_at":"2021-11-05T16:30:10Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hello,\r\nI'm trying to build this mod on alpine:3.14 (same version used by official Varnish alpine docker images) but I get the following error:\r\n```\r\n./configure: line 12848: syntax error: unexpected newline (expecting \")\")\r\nThe command '/bin/sh -c cd /tmp && curl -sSLO https://github.com/nigoroll/libvmod-dynamic/archive/v${LIBVMOD_DYNAMIC_VERSION}.zip && unzip v${LIBVMOD_DYNAMIC_VERSION}.zip && cd libvmod-dynamic-${LIBVMOD_DYNAMIC_VERSION} && ./autogen.sh && ./configure && make && make install' returned a non-zero code: 2\r\n```\r\n\r\nExample Dockerfile to reproduce the problem:\r\n```\r\nFROM alpine:3.14 AS prod\r\nENV LIBVMOD_DYNAMIC_VERSION=2.3.1\r\nRUN apk --no-cache add automake autoconf libtool make curl python3 py3-sphinx py-docutils pkgconf \\\r\n gcc make g++ zlib-dev pcre-dev libedit-dev readline-dev libexecinfo-dev linux-headers \\\r\n varnish varnish-dev\r\n\r\nRUN cd /tmp && curl -sSLO https://github.com/nigoroll/libvmod-dynamic/archive/v${LIBVMOD_DYNAMIC_VERSION}.zip && \\\r\n unzip v${LIBVMOD_DYNAMIC_VERSION}.zip && cd libvmod-dynamic-${LIBVMOD_DYNAMIC_VERSION} && \\\r\n ./autogen.sh && ./configure && make && make install\r\n```\r\n\r\nIs there something I'm missing?\r\nDo you have any hint on how to solve the issue?\r\n\r\nThank you!","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/77/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/77/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/78","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/78/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/78/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/78/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/78","id":1112007836,"node_id":"I_kwDOBBOOTM5CR-Sc","number":78,"title":"Deadlock on service lookup when all contexts in use","user":{"login":"jake-dog","id":20374198,"node_id":"MDQ6VXNlcjIwMzc0MTk4","avatar_url":"https://avatars.githubusercontent.com/u/20374198?v=4","gravatar_id":"","url":"https://api.github.com/users/jake-dog","html_url":"https://github.com/jake-dog","followers_url":"https://api.github.com/users/jake-dog/followers","following_url":"https://api.github.com/users/jake-dog/following{/other_user}","gists_url":"https://api.github.com/users/jake-dog/gists{/gist_id}","starred_url":"https://api.github.com/users/jake-dog/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jake-dog/subscriptions","organizations_url":"https://api.github.com/users/jake-dog/orgs","repos_url":"https://api.github.com/users/jake-dog/repos","events_url":"https://api.github.com/users/jake-dog/events{/privacy}","received_events_url":"https://api.github.com/users/jake-dog/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":4,"created_at":"2022-01-23T22:43:48Z","updated_at":"2025-01-02T16:02:33Z","closed_at":"2022-01-24T10:07:41Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Observed on b72c723acff5b2ef46c9de8cef036cee3a380a64 (`6.0` branch).\r\n\r\nA deadlock can occur when looking up a service record with a `vmod_dynamic.resolver` that has run out of contexts (`parallel` argument to resolver constructor). One thread will wait infinitely for a context so it may resolve the domain returned by the SRV record, and the other thread will wait infinitely for the `dom->resolve` condition to be set before it releases the context.\r\n\r\nPer the following thread stack traces: thread 957 is waiting for the condition `dom->resolve` while holding a resolver context; thread 972 is waiting for a resolver context so it can set the condition `dom->resolve`.\r\n\r\n```\r\nThread 957 (Thread 0x7fcf717ea700 (LWP 350411)):\r\n#0 pthread_cond_timedwait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:238\r\n#1 0x0000000000436bf6 in Lck_CondWait ()\r\n#2 0x00007fd1b4df21c9 in service_doms (prios=0x7fd1b0631080, obj=0x7fd1c341a440, ctx=0x7fcf717e9e10) at vmod_dynamic_service.c:266\r\n#3 service_update (res=0x7fd1b4ffb360 , now=1642054171.002723, priv=, srv=0x7fd16a822300) at vmod_dynamic_service.c:424\r\n#4 service_lookup_thread (priv=0x7fd16a822300) at vmod_dynamic_service.c:496\r\n#5 0x00007fd1c405eea5 in start_thread (arg=0x7fcf717ea700) at pthread_create.c:307\r\n#6 0x00007fd1c3d879fd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111\r\n\r\nThread 972 (Thread 0x7fcf6a7dc700 (LWP 350426)):\r\n#0 pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:185\r\n#1 0x00007fd1b4df5063 in dyn_getdns_get_context (r=r@entry=0x7fd1c341da80) at dyn_getdns.c:64\r\n#2 0x00007fd1b4df5f16 in getdns_lookup (r=0x7fd1c341da80, node=0x7fd1c34d5dc0 \"redacted.example.svc.cluster.local.\", service=0x7fd1c34d7120 \"42667\", priv=0x7fcf6a7dbc70) at dyn_resolver_getdns.c:183\r\n#3 0x00007fd1b4ded90e in dynamic_lookup_thread (priv=0x7fd1c35c6700) at vmod_dynamic.c:490\r\n#4 0x00007fd1c405eea5 in start_thread (arg=0x7fcf6a7dc700) at pthread_create.c:307\r\n#5 0x00007fd1c3d879fd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111\r\n```\r\n\r\nThe possibility of a deadlock is the result of the context not being released until after the service is updated in the function `service_lookup_thread`.\r\n\r\n1. A resolver context is obtained\r\nhttps://github.com/nigoroll/libvmod-dynamic/blob/b72c723acff5b2ef46c9de8cef036cee3a380a64/src/vmod_dynamic_service.c#L488\r\n\r\n2. Update service, which requires condition be set by other thread(s) attaining resolver context\r\nhttps://github.com/nigoroll/libvmod-dynamic/blob/b72c723acff5b2ef46c9de8cef036cee3a380a64/src/vmod_dynamic_service.c#L496\r\n\r\n3. Release context obtained in step 1\r\nhttps://github.com/nigoroll/libvmod-dynamic/blob/b72c723acff5b2ef46c9de8cef036cee3a380a64/src/vmod_dynamic_service.c#L517\r\n\r\nTo eliminate the possibility of a deadlock the resolver context needs to be released (`res->srv_fini(&res_priv)` from [line 517](https://github.com/nigoroll/libvmod-dynamic/blob/b72c723acff5b2ef46c9de8cef036cee3a380a64/src/vmod_dynamic_service.c#L517)) prior to [locking/waiting on the `dom->resolve` condition](https://github.com/nigoroll/libvmod-dynamic/blob/b72c723acff5b2ef46c9de8cef036cee3a380a64/src/vmod_dynamic_service.c#L262-L270). This could _probably_ be done most easily by moving the `srv_fini()` call to [line 423](https://github.com/nigoroll/libvmod-dynamic/blob/b72c723acff5b2ef46c9de8cef036cee3a380a64/src/vmod_dynamic_service.c#L423), just before the call to `service_doms()`, and adding another `srv_fini()` to handle the [`else` condition](https://github.com/nigoroll/libvmod-dynamic/blob/b72c723acff5b2ef46c9de8cef036cee3a380a64/src/vmod_dynamic_service.c#L510).\r\n\r\nA possible workaround for anyone impacted by this issue is set a larger value for `parallel` (defaut: 16) in the resolver constructor.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/78/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/78/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/79","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/79/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/79/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/79/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/79","id":1119737295,"node_id":"PR_kwDOBBOOTM4x2ouU","number":79,"title":"Declare $ABI vrt.","user":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2022-01-31T17:41:30Z","updated_at":"2022-02-02T08:19:32Z","closed_at":"2022-02-02T08:19:32Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/79","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/79","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/79.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/79.patch","merged_at":"2022-02-02T08:19:32Z"},"body":"As far as I can tell, the VMOD code conforms to VRT. @nigoroll please make your own judgment on that, I may have missed something.\r\n\r\nVRT makes like easier when there's a Varnish version update that doesn't change the VRT version -- the VMOD usually doesn't have to be updated. With $ABI strict, we have to update the VMOD even if nothing changes except the Varnish commit ID.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/79/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/79/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/80","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/80/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/80/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/80/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/80","id":1125025593,"node_id":"I_kwDOBBOOTM5DDoc5","number":80,"title":"no release works with 7.0.2","user":{"login":"gquintard","id":3776553,"node_id":"MDQ6VXNlcjM3NzY1NTM=","avatar_url":"https://avatars.githubusercontent.com/u/3776553?v=4","gravatar_id":"","url":"https://api.github.com/users/gquintard","html_url":"https://github.com/gquintard","followers_url":"https://api.github.com/users/gquintard/followers","following_url":"https://api.github.com/users/gquintard/following{/other_user}","gists_url":"https://api.github.com/users/gquintard/gists{/gist_id}","starred_url":"https://api.github.com/users/gquintard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gquintard/subscriptions","organizations_url":"https://api.github.com/users/gquintard/orgs","repos_url":"https://api.github.com/users/gquintard/repos","events_url":"https://api.github.com/users/gquintard/events{/privacy}","received_events_url":"https://api.github.com/users/gquintard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":4,"created_at":"2022-02-05T20:37:35Z","updated_at":"2022-03-01T18:23:49Z","closed_at":"2022-03-01T11:58:52Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Unless I'm mistaken, `2.5.0` is the latest tag, and has `VARNISH_PREREQ([6.6.0],[7.0.0])`, preventing it from building again `7.0.2`\r\nI can of course pick the top of master, but I'd like to package this vmod into the official `docker` image, and so having an official tag/release would be nice","closed_by":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/80/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/80/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/81","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/81/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/81/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/81/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/81","id":1142330043,"node_id":"I_kwDOBBOOTM5EFpK7","number":81,"title":"Assertion error for service with purged dynamic_domain","user":{"login":"jake-dog","id":20374198,"node_id":"MDQ6VXNlcjIwMzc0MTk4","avatar_url":"https://avatars.githubusercontent.com/u/20374198?v=4","gravatar_id":"","url":"https://api.github.com/users/jake-dog","html_url":"https://github.com/jake-dog","followers_url":"https://api.github.com/users/jake-dog/followers","following_url":"https://api.github.com/users/jake-dog/following{/other_user}","gists_url":"https://api.github.com/users/jake-dog/gists{/gist_id}","starred_url":"https://api.github.com/users/jake-dog/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jake-dog/subscriptions","organizations_url":"https://api.github.com/users/jake-dog/orgs","repos_url":"https://api.github.com/users/jake-dog/repos","events_url":"https://api.github.com/users/jake-dog/events{/privacy}","received_events_url":"https://api.github.com/users/jake-dog/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":12,"created_at":"2022-02-18T04:28:18Z","updated_at":"2023-07-21T03:10:00Z","closed_at":"2023-07-03T15:01:52Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Observed on 5c1c68b (w/ varnish 6.0.9) and b72c723 (w/ varnish 6.0.7).\r\n\r\n```\r\nPanic at: Fri, 28 Jan 2022 04:08:36 GMT\r\nAssert error in service_resolve(), vmod_dynamic_service.c line 150:\r\n Condition((t->dom)->magic == 0x1bfe1345) not true.\r\nversion = varnish-6.0.9 revision 3383d3d02c6ee459f20e1f46cfcb9692726a6387, vrt api = 7.1\r\nident = Linux,5.4.77-flatcar,x86_64,-junix,-smalloc,-sdefault,-hcritbit,epoll\r\nnow = 18260503.813988 (mono), 1643342916.576233 (real)\r\nBacktrace:\r\n 0x43c46e: varnishd() [0x43c46e]\r\n 0x49f272: varnishd(VAS_Fail+0x42) [0x49f272]\r\n 0x7fb8159f13da: ./vmod_cache/_vmod_dynamic.04887395d86555991e34ec9874763b01e23b00135a5367941f17a5e0076a9451(+0x83da) [0x7fb8159f13da]\r\n 0x4216a3: varnishd() [0x4216a3]\r\n 0x421d83: varnishd(VDI_GetHdr+0x33) [0x421d83]\r\n 0x42a859: varnishd() [0x42a859]\r\n 0x45a4db: varnishd() [0x45a4db]\r\n 0x45a9c0: varnishd() [0x45a9c0]\r\n 0x7fb8257d2ea5: /lib64/libpthread.so.0(+0x7ea5) [0x7fb8257d2ea5]\r\n 0x7fb8254fbb0d: /lib64/libc.so.6(clone+0x6d) [0x7fb8254fbb0d]\r\n```\r\n\r\n[Full panic output from VTC test log.](https://github.com/nigoroll/libvmod-dynamic/files/8113720/r81.log)\r\n\r\n## Reproduction steps\r\n\r\nA [gist has been created with VTC](https://gist.github.com/jake-dog/25a77e193c406bf5744005fa7a021e9d) that reproduces the panic. Please follow the instructions inside of the gist, which includes installing and configuring dnsmasq.\r\n\r\nOther test conditions, such as changing A names in SRV responses, have also succeeded in reproducing the assertion error.\r\n\r\n## Investigation\r\n\r\nThe assertion error was not reproducible when `dynamic_domain` usage timeout checks were hardcoded out, blocking timeout purges in the [`dynamic_search`](https://github.com/nigoroll/libvmod-dynamic/blob/5c1c68b7914a10726d724ad8c60562019baa6371/src/vmod_dynamic.c#L650) function, demonstrating that the bug occurs when a `dynamic_domain` is purged while still referenced by a `dynamic_service`.\r\n\r\nThe life cycles of `dynamic_domain` structs, and the `dynamic_service` structs which reference them, are not tightly coupled. Under specific conditions data races are possible.\r\n\r\nOne such scenario, as demonstrated in the provided VTC, involves three components:\r\n\r\n1. `dynamic_domain` structs exclusively referenced by a `dynamic_service` only have their `last_used` property updated when SRV resolve is successful ([code](https://github.com/nigoroll/libvmod-dynamic/blob/5c1c68b7914a10726d724ad8c60562019baa6371/src/vmod_dynamic_service.c#L245))\r\n2. the delay between SRV resolves is set to `obj->ttl` when the previous DNS resolve fails ([code](https://github.com/nigoroll/libvmod-dynamic/blob/5c1c68b7914a10726d724ad8c60562019baa6371/src/vmod_dynamic_service.c#L522))\r\n3. when retrieving a specific `dynamic_domain`, any active domain which doesn't match is subject to a timeout purge ([code](https://github.com/nigoroll/libvmod-dynamic/blob/5c1c68b7914a10726d724ad8c60562019baa6371/src/vmod_dynamic.c#L670))\r\n\r\nWith these components a panic can be instigated via a simple sequence of requests and DNS failures:\r\n\r\n1. Send a request for a valid `d.service` with DNS running\r\n2. Kill/block DNS\r\n3. Send several more requests to the same `d.service` from step 1 until DNS resolve timeout occurs\r\n4. Enable/unblock DNS\r\n5. Send several requests for a different `d.service` to trigger a timeout purge of the `d.service` from step 1\r\n6. Continue sending requests to the `d.service` from step 1 until panic\r\n\r\nThis sequence of lookups, and purges, looks like this (from provided VTC log):\r\n\r\n```\r\n**** v1 0.7 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-3.example.svc.cluster.local) Lookup: 1645503346.958248 0.000000 0.000000\r\n**** v1 0.7 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-3.example.svc.cluster.local) Results: 1645503346.958876 0.000628 0.000628\r\n**** v1 0.7 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(p-test-3.example.svc.cluster.local.:8893) Lookup: 1645503346.959250 0.000000 0.000000\r\n**** v1 0.7 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(p-test-3.example.svc.cluster.local.:8893) Results: 1645503346.959764 0.000514 0.000514\r\n**** v1 0.7 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(p-test-3.example.svc.cluster.local.:8893) Update: 1645503346.959862 0.000613 0.000099\r\n**** v1 0.7 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-3.example.svc.cluster.local) Update: 1645503346.959927 0.001679 0.001051\r\n**** v1 2.2 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-3.example.svc.cluster.local) Lookup: 1645503348.470227 0.000000 0.000000\r\n**** v1 7.3 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-3.example.svc.cluster.local) Results: 1645503353.475618 5.005390 5.005390\r\n**** v1 7.3 vsl| 0 Error - vmod-dynamic: vcl1 d1 _http._tcp.p-test-3.example.svc.cluster.local getdns 902 (All queries for the name timed out)\r\n**** v1 15.8 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-2.example.svc.cluster.local) Lookup: 1645503362.042588 0.000000 0.000000\r\n**** v1 15.8 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-2.example.svc.cluster.local) Results: 1645503362.043147 0.000558 0.000558\r\n**** v1 15.8 vsl| 0 VCL_Log - vmod-dynamic: vcl1 d1 p-test-3.example.svc.cluster.local.:8893 timeout\r\n**** v1 15.8 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(p-test-3.example.svc.cluster.local.:8893) Done: 1645503362.043266 0.000000 0.000000\r\n**** v1 15.8 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(p-test-2.example.svc.cluster.local.:8892) Lookup: 1645503362.043516 0.000000 0.000000\r\n**** v1 15.8 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(p-test-2.example.svc.cluster.local.:8892) Results: 1645503362.043797 0.000281 0.000281\r\n**** v1 15.8 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(p-test-2.example.svc.cluster.local.:8892) Update: 1645503362.043895 0.000379 0.000098\r\n**** v1 15.8 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-2.example.svc.cluster.local) Update: 1645503362.043962 0.001374 0.000815\r\n**** v1 17.3 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-2.example.svc.cluster.local) Lookup: 1645503363.554317 0.000000 0.000000\r\n**** v1 17.3 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-2.example.svc.cluster.local) Results: 1645503363.554597 0.000280 0.000280\r\n**** v1 17.3 vsl| 0 VCL_Log - vmod-dynamic: vcl1 d1 p-test-3.example.svc.cluster.local.:8893 deleted\r\n**** v1 17.3 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-2.example.svc.cluster.local) Update: 1645503363.554614 0.000297 0.000017\r\n```\r\n\r\nNote that the service `_http._tcp.p-test-3.example.svc.cluster.local` is still active, and has not changed, but the domain it points to `p-test-3.example.svc.cluster.local` has timed out and was eventually deleted.\r\n\r\n## Solutions\r\n\r\nThough not completely without the possibility of data races, and not tested, the following should avoid the bulk of the race conditions. Based on 5c1c68b\r\n\r\n```diff\r\ndiff --git a/src/vmod_dynamic_service.c b/src/vmod_dynamic_service.c\r\nindex 2140a2d..c77ca06 100644\r\n--- a/src/vmod_dynamic_service.c\r\n+++ b/src/vmod_dynamic_service.c\r\n@@ -521,3 +521,6 @@ service_lookup_thread(void *priv)\r\n res->name, ret, res->strerror(ret));\r\n- srv->deadline = results + obj->ttl;\r\n+ if (obj->ttl < obj->domain_usage_tmo / 2)\r\n+ srv->deadline = results + obj->ttl;\r\n+ else\r\n+ srv->deadline = results + (obj->domain_usage_tmo / 2);\r\n dbg_res_details(NULL, srv->obj, res, res_priv);\r\n@@ -737,2 +740,5 @@ vmod_director_service(VRT_CTX, struct VPFX(dynamic_director) *obj,\r\n struct dynamic_service *srv;\r\n+ const struct service_prios *prios;\r\n+ const struct service_prio *p;\r\n+ const struct service_target *t;\r\n CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);\r\n@@ -750,2 +756,16 @@ vmod_director_service(VRT_CTX, struct VPFX(dynamic_director) *obj,\r\n srv->last_used = ctx->now;\r\n+\r\n+ VRMB();\r\n+ prios = srv->prios;\r\n+\r\n+ if (prios != NULL) {\r\n+ VTAILQ_FOREACH(p, &prios->head, list) {\r\n+ CHECK_OBJ_NOTNULL(p, SERVICE_PRIO_MAGIC);\r\n+ VTAILQ_FOREACH(t, &p->targets, list) {\r\n+ CHECK_OBJ_NOTNULL(t, SERVICE_TARGET_MAGIC);\r\n+ CHECK_OBJ_NOTNULL(t->dom, DYNAMIC_DOMAIN_MAGIC);\r\n+ t->dom->last_used = ctx->now;\r\n+ }\r\n+ }\r\n+ }\r\n Lck_Unlock(&obj->mtx);\r\n```\r\n\r\nThe problems with the trivial solution include:\r\n\r\n* still possibility of data races\r\n * multiple services using a shared domain\r\n * multiple unique services with unique domains causing thread races to purge timed out domains\r\n* pattern of SRV resolves is inconsistent and diverges from user configuration\r\n\r\nI've sent #82 introducing minimal reference counting logic to block `dynamic_domain` timeout purges while referenced by a `dynamic_service`, thus tightly coupling them.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/81/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/81/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/82","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/82/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/82/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/82/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/82","id":1142330257,"node_id":"PR_kwDOBBOOTM4zCxtc","number":82,"title":"Fixing domain purge data race","user":{"login":"jake-dog","id":20374198,"node_id":"MDQ6VXNlcjIwMzc0MTk4","avatar_url":"https://avatars.githubusercontent.com/u/20374198?v=4","gravatar_id":"","url":"https://api.github.com/users/jake-dog","html_url":"https://github.com/jake-dog","followers_url":"https://api.github.com/users/jake-dog/followers","following_url":"https://api.github.com/users/jake-dog/following{/other_user}","gists_url":"https://api.github.com/users/jake-dog/gists{/gist_id}","starred_url":"https://api.github.com/users/jake-dog/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jake-dog/subscriptions","organizations_url":"https://api.github.com/users/jake-dog/orgs","repos_url":"https://api.github.com/users/jake-dog/repos","events_url":"https://api.github.com/users/jake-dog/events{/privacy}","received_events_url":"https://api.github.com/users/jake-dog/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2022-02-18T04:28:41Z","updated_at":"2023-07-03T15:32:58Z","closed_at":"2023-07-03T15:32:57Z","author_association":"NONE","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/82","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/82","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/82.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/82.patch","merged_at":null},"body":"# What's new\r\n\r\n* fix #81 with a ref counter on `dynamic_domains` linked to `dynamic_services`\r\n* fix SRV resolve TTL so it isn't limited by [`0.5 * domain_usage_tmo`](https://github.com/nigoroll/libvmod-dynamic/blob/5c1c68b7914a10726d724ad8c60562019baa6371/src/vmod_dynamic_service.c#L513-L515)\r\n* fix `dynamic_domain` timeout behavior for `dynamic_domains` linked to `dynamic_services`\r\n\r\n# Why\r\n\r\nThere are several scenarios to consider when fixing #81. A `dynamic_domain` could be linked to zero or more `dynamic_services`, and/or a `dynamic_domain` linked to `dynamic_service` could be called directly via `d.backend`. A simple reference counter accommodates all of these possibilities, and prevents all services/domain timeout related data races. In a word, it is bombproof.\r\n\r\nTimeout initiated purges will be blocked for all `dynamic_domain` structs referenced by `dynamic_services`. Only after a `dynamic_service` is purged will the corresponding `dynamic_domain` ref counter(s) be decremented. \r\n\r\nWhile adding the ref counter logic I discovered two other unexpected behaviors which were linked to each other:\r\n\r\n* SRV resolve TTL is limited to `0.5 * domain_usage_tmo` or `obj->ttl` (whichever is smaller)\r\n* domains exclusively linked to services had `last_used` updated only when SRV resolve succeeded\r\n\r\nThese behaviors together formed a partially protective layer against early purge of service linked domains. The addition of a ref counter to service linked domains removes the need for previous workarounds, fixes all early purge vulnerabilities, and makes the behavior of `d.backend` and `d.service` consistent and predictable.\r\n\r\nThis branch passed the [`r81.vtc`](https://gist.github.com/jake-dog/25a77e193c406bf5744005fa7a021e9d) test, and produces the following expected pattern of dynamic backends:\r\n\r\n```\r\n**** v1 0.6 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-3.example.svc.cluster.local) Lookup: 1645504100.142287 0.000000 0.000000\r\n**** v1 0.6 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-3.example.svc.cluster.local) Results: 1645504100.142864 0.000577 0.000577\r\n**** v1 0.6 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(p-test-3.example.svc.cluster.local.:8893) Lookup: 1645504100.143254 0.000000 0.000000\r\n**** v1 0.6 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(p-test-3.example.svc.cluster.local.:8893) Results: 1645504100.143684 0.000430 0.000430\r\n**** v1 0.6 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(p-test-3.example.svc.cluster.local.:8893) Update: 1645504100.143806 0.000552 0.000122\r\n**** v1 0.6 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-3.example.svc.cluster.local) Update: 1645504100.143882 0.001595 0.001019\r\n**** v1 15.7 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-2.example.svc.cluster.local) Lookup: 1645504115.210968 0.000000 0.000000\r\n**** v1 15.7 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-2.example.svc.cluster.local) Results: 1645504115.211497 0.000529 0.000529\r\n**** v1 15.7 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(p-test-2.example.svc.cluster.local.:8892) Lookup: 1645504115.211926 0.000000 0.000000\r\n**** v1 15.7 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(p-test-2.example.svc.cluster.local.:8892) Results: 1645504115.212421 0.000495 0.000495\r\n**** v1 15.7 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(p-test-2.example.svc.cluster.local.:8892) Update: 1645504115.212502 0.000576 0.000081\r\n**** v1 15.7 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-2.example.svc.cluster.local) Update: 1645504115.212528 0.001560 0.001031\r\n**** v1 18.8 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _http._tcp.p-test-2.example.svc.cluster.local) Done: 1645504118.317811 0.000000 0.000000\r\n**** v1 18.8 vsl| 1039 VCL_Log c vmod-dynamic: vcl1 d1 _http._tcp.p-test-2.example.svc.cluster.local timeout\r\n**** v1 19.8 vsl| 1041 VCL_Log c vmod-dynamic: vcl1 d1 _http._tcp.p-test-2.example.svc.cluster.local deleted\r\n```\r\n\r\n# Performance Considerations\r\n\r\nWhen an existing service is resolved, and no changes are made, no additional locking is necessary, however extra looping over `srv->prios` is still required to determine if refcounts changed. Only when an existing service is resolved, and domains are removed from it, is additional locking required to decrement refcounts.\r\n\r\nAn additional loop of `srv->prios` was also added to each `d.service` call to ensure that `last_used` was updated for all linked domains, ensuring that domain timeout behavior will be consistent when the service changes or is removed.\r\n\r\nIn testing with a fairly small number of service backends (5-10), each containing only a single A record, I saw no measurable difference in CPU usage at high transaction rates (3k-5k req/s).","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/82/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/82/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/83","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/83/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/83/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/83/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/83","id":1150626937,"node_id":"I_kwDOBBOOTM5ElSx5","number":83,"title":"Unguarded use-after-free in dynamic_resolve","user":{"login":"rezan","id":1030507,"node_id":"MDQ6VXNlcjEwMzA1MDc=","avatar_url":"https://avatars.githubusercontent.com/u/1030507?v=4","gravatar_id":"","url":"https://api.github.com/users/rezan","html_url":"https://github.com/rezan","followers_url":"https://api.github.com/users/rezan/followers","following_url":"https://api.github.com/users/rezan/following{/other_user}","gists_url":"https://api.github.com/users/rezan/gists{/gist_id}","starred_url":"https://api.github.com/users/rezan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rezan/subscriptions","organizations_url":"https://api.github.com/users/rezan/orgs","repos_url":"https://api.github.com/users/rezan/repos","events_url":"https://api.github.com/users/rezan/events{/privacy}","received_events_url":"https://api.github.com/users/rezan/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2022-02-25T16:17:10Z","updated_at":"2023-06-30T05:38:42Z","closed_at":"2023-06-30T05:38:42Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"There is an unguarded use-after-free error [here in vmod_dynamic.c](https://github.com/nigoroll/libvmod-dynamic/blob/9666973952f62110c872d720af3dae0b85b4b597/src/vmod_dynamic.c#L160). This affects all versions of `vmod_dynamic`, potentially all the way back to 4.1. This is unguarded meaning there are no magic checks preventing this from happening or being exploited.\r\n\r\n**Cause**\r\n\r\nResolve a director while doing a plain DNS update where a backend is deleted. Note that without a magic check, this use-after-free is undetectable without extra memory checks.\r\n\r\n**Outcome**\r\n\r\nNothing, a crash/panic, or you can land on a different random backend or an attacker controlled backend.\r\n\r\n**Fix**\r\n\r\n* Add magic checks to all dynamic structs. This is how the bug was uncovered.\r\n* Move the `struct dynamic_ref *next` [dereference in question](https://github.com/nigoroll/libvmod-dynamic/blob/9666973952f62110c872d720af3dae0b85b4b597/src/vmod_dynamic.c#L160) up into the locked section. Grab a reference to the director there and return it.\r\n\r\nI will not be making a PR for this and this has not been reported anywhere else.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/83/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/83/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/84","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/84/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/84/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/84/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/84","id":1170732528,"node_id":"I_kwDOBBOOTM5Fx_Xw","number":84,"title":"A branch dedicated to 7.1?","user":{"login":"anthosz","id":14294064,"node_id":"MDQ6VXNlcjE0Mjk0MDY0","avatar_url":"https://avatars.githubusercontent.com/u/14294064?v=4","gravatar_id":"","url":"https://api.github.com/users/anthosz","html_url":"https://github.com/anthosz","followers_url":"https://api.github.com/users/anthosz/followers","following_url":"https://api.github.com/users/anthosz/following{/other_user}","gists_url":"https://api.github.com/users/anthosz/gists{/gist_id}","starred_url":"https://api.github.com/users/anthosz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anthosz/subscriptions","organizations_url":"https://api.github.com/users/anthosz/orgs","repos_url":"https://api.github.com/users/anthosz/repos","events_url":"https://api.github.com/users/anthosz/events{/privacy}","received_events_url":"https://api.github.com/users/anthosz/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2022-03-16T09:07:22Z","updated_at":"2022-04-07T12:42:38Z","closed_at":"2022-04-07T12:42:38Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hello,\r\n\r\nIs it planned to create a branch dedicated to 7.1 or we simply need to use master?\r\n\r\nBest regards,","closed_by":{"login":"anthosz","id":14294064,"node_id":"MDQ6VXNlcjE0Mjk0MDY0","avatar_url":"https://avatars.githubusercontent.com/u/14294064?v=4","gravatar_id":"","url":"https://api.github.com/users/anthosz","html_url":"https://github.com/anthosz","followers_url":"https://api.github.com/users/anthosz/followers","following_url":"https://api.github.com/users/anthosz/following{/other_user}","gists_url":"https://api.github.com/users/anthosz/gists{/gist_id}","starred_url":"https://api.github.com/users/anthosz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anthosz/subscriptions","organizations_url":"https://api.github.com/users/anthosz/orgs","repos_url":"https://api.github.com/users/anthosz/repos","events_url":"https://api.github.com/users/anthosz/events{/privacy}","received_events_url":"https://api.github.com/users/anthosz/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/84/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/84/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/85","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/85/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/85/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/85/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/85","id":1175165710,"node_id":"I_kwDOBBOOTM5GC5sO","number":85,"title":"Support for arm containers on m1 mac","user":{"login":"janosmiko","id":693558,"node_id":"MDQ6VXNlcjY5MzU1OA==","avatar_url":"https://avatars.githubusercontent.com/u/693558?v=4","gravatar_id":"","url":"https://api.github.com/users/janosmiko","html_url":"https://github.com/janosmiko","followers_url":"https://api.github.com/users/janosmiko/followers","following_url":"https://api.github.com/users/janosmiko/following{/other_user}","gists_url":"https://api.github.com/users/janosmiko/gists{/gist_id}","starred_url":"https://api.github.com/users/janosmiko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janosmiko/subscriptions","organizations_url":"https://api.github.com/users/janosmiko/orgs","repos_url":"https://api.github.com/users/janosmiko/repos","events_url":"https://api.github.com/users/janosmiko/events{/privacy}","received_events_url":"https://api.github.com/users/janosmiko/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2022-03-21T10:17:07Z","updated_at":"2022-04-21T10:58:40Z","closed_at":"2022-04-21T10:58:40Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi,\r\n\r\nI'm building varnish containers for amd64 and arm64 using this vmod. While it's working well on amd64 and it also works well when I'm using an arm64 linux server it's not working for desktop users using m1 mac.\r\n\r\nThey got the following error:\r\n```\r\nError:\r\nvarnish_1 | Message from VCC-compiler:\r\nvarnish_1 | Could not open VMOD dynamic\r\nvarnish_1 | \tFile name: /usr/lib/varnish/vmods/libvmod_dynamic.so\r\nvarnish_1 | \tdlerror: /usr/lib/varnish/vmods/libvmod_dynamic.so: undefined symbol: vmb_pthread\r\nvarnish_1 | ('/etc/varnish/default.vcl' Line 5 Pos 8)\r\nvarnish_1 | import dynamic;\r\nvarnish_1 | -------#######-\r\nvarnish_1 | \r\n```\r\n\r\nThe Dockerfile I'm using:\r\nhttps://github.com/rewardenv/reward/blob/main/images/varnish/debian/6.5/Dockerfile\r\n\r\n\r\nRelated issue:\r\nhttps://github.com/rewardenv/reward/issues/17","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/85/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/85/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/86","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/86/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/86/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/86/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/86","id":1187420285,"node_id":"PR_kwDOBBOOTM41XT3a","number":86,"title":"align vmb.h with the varnish version","user":{"login":"gquintard","id":3776553,"node_id":"MDQ6VXNlcjM3NzY1NTM=","avatar_url":"https://avatars.githubusercontent.com/u/3776553?v=4","gravatar_id":"","url":"https://api.github.com/users/gquintard","html_url":"https://github.com/gquintard","followers_url":"https://api.github.com/users/gquintard/followers","following_url":"https://api.github.com/users/gquintard/following{/other_user}","gists_url":"https://api.github.com/users/gquintard/gists{/gist_id}","starred_url":"https://api.github.com/users/gquintard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gquintard/subscriptions","organizations_url":"https://api.github.com/users/gquintard/orgs","repos_url":"https://api.github.com/users/gquintard/repos","events_url":"https://api.github.com/users/gquintard/events{/privacy}","received_events_url":"https://api.github.com/users/gquintard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":3,"created_at":"2022-03-31T02:47:21Z","updated_at":"2022-06-07T10:02:45Z","closed_at":"2022-04-21T10:58:40Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/86","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/86","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/86.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/86.patch","merged_at":"2022-04-21T10:58:40Z"},"body":"fixes #85\r\n\r\nit shouldn't break 7.0- as the header file predates it, but I haven't tested it","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/86/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/86/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/87","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/87/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/87/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/87/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/87","id":1334710826,"node_id":"PR_kwDOBBOOTM489mU0","number":87,"title":"align vmb.h with the varnish version","user":{"login":"janosmiko","id":693558,"node_id":"MDQ6VXNlcjY5MzU1OA==","avatar_url":"https://avatars.githubusercontent.com/u/693558?v=4","gravatar_id":"","url":"https://api.github.com/users/janosmiko","html_url":"https://github.com/janosmiko","followers_url":"https://api.github.com/users/janosmiko/followers","following_url":"https://api.github.com/users/janosmiko/following{/other_user}","gists_url":"https://api.github.com/users/janosmiko/gists{/gist_id}","starred_url":"https://api.github.com/users/janosmiko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janosmiko/subscriptions","organizations_url":"https://api.github.com/users/janosmiko/orgs","repos_url":"https://api.github.com/users/janosmiko/repos","events_url":"https://api.github.com/users/janosmiko/events{/privacy}","received_events_url":"https://api.github.com/users/janosmiko/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2022-08-10T14:23:30Z","updated_at":"2022-08-10T14:49:54Z","closed_at":"2022-08-10T14:49:54Z","author_association":"NONE","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/87","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/87","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/87.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/87.patch","merged_at":"2022-08-10T14:49:54Z"},"body":"I open these pull requests to apply @gquintard 's fix on ARM builds for older varnish versions.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/87/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/87/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/88","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/88/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/88/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/88/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/88","id":1334710920,"node_id":"PR_kwDOBBOOTM489mWM","number":88,"title":"align vmb.h with the varnish version","user":{"login":"janosmiko","id":693558,"node_id":"MDQ6VXNlcjY5MzU1OA==","avatar_url":"https://avatars.githubusercontent.com/u/693558?v=4","gravatar_id":"","url":"https://api.github.com/users/janosmiko","html_url":"https://github.com/janosmiko","followers_url":"https://api.github.com/users/janosmiko/followers","following_url":"https://api.github.com/users/janosmiko/following{/other_user}","gists_url":"https://api.github.com/users/janosmiko/gists{/gist_id}","starred_url":"https://api.github.com/users/janosmiko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janosmiko/subscriptions","organizations_url":"https://api.github.com/users/janosmiko/orgs","repos_url":"https://api.github.com/users/janosmiko/repos","events_url":"https://api.github.com/users/janosmiko/events{/privacy}","received_events_url":"https://api.github.com/users/janosmiko/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2022-08-10T14:23:35Z","updated_at":"2022-08-10T14:50:03Z","closed_at":"2022-08-10T14:50:03Z","author_association":"NONE","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/88","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/88","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/88.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/88.patch","merged_at":"2022-08-10T14:50:03Z"},"body":"I open these pull requests to apply @gquintard 's fix on ARM builds for older varnish versions.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/88/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/88/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/89","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/89/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/89/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/89/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/89","id":1334711085,"node_id":"PR_kwDOBBOOTM489mYZ","number":89,"title":"align vmb.h with the varnish version","user":{"login":"janosmiko","id":693558,"node_id":"MDQ6VXNlcjY5MzU1OA==","avatar_url":"https://avatars.githubusercontent.com/u/693558?v=4","gravatar_id":"","url":"https://api.github.com/users/janosmiko","html_url":"https://github.com/janosmiko","followers_url":"https://api.github.com/users/janosmiko/followers","following_url":"https://api.github.com/users/janosmiko/following{/other_user}","gists_url":"https://api.github.com/users/janosmiko/gists{/gist_id}","starred_url":"https://api.github.com/users/janosmiko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janosmiko/subscriptions","organizations_url":"https://api.github.com/users/janosmiko/orgs","repos_url":"https://api.github.com/users/janosmiko/repos","events_url":"https://api.github.com/users/janosmiko/events{/privacy}","received_events_url":"https://api.github.com/users/janosmiko/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2022-08-10T14:23:41Z","updated_at":"2022-08-10T14:50:11Z","closed_at":"2022-08-10T14:50:11Z","author_association":"NONE","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/89","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/89","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/89.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/89.patch","merged_at":"2022-08-10T14:50:11Z"},"body":"I open these pull requests to apply @gquintard 's fix on ARM builds for older varnish versions.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/89/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/89/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/90","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/90/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/90/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/90/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/90","id":1334711147,"node_id":"PR_kwDOBBOOTM489mZO","number":90,"title":"align vmb.h with the varnish version","user":{"login":"janosmiko","id":693558,"node_id":"MDQ6VXNlcjY5MzU1OA==","avatar_url":"https://avatars.githubusercontent.com/u/693558?v=4","gravatar_id":"","url":"https://api.github.com/users/janosmiko","html_url":"https://github.com/janosmiko","followers_url":"https://api.github.com/users/janosmiko/followers","following_url":"https://api.github.com/users/janosmiko/following{/other_user}","gists_url":"https://api.github.com/users/janosmiko/gists{/gist_id}","starred_url":"https://api.github.com/users/janosmiko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janosmiko/subscriptions","organizations_url":"https://api.github.com/users/janosmiko/orgs","repos_url":"https://api.github.com/users/janosmiko/repos","events_url":"https://api.github.com/users/janosmiko/events{/privacy}","received_events_url":"https://api.github.com/users/janosmiko/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2022-08-10T14:23:44Z","updated_at":"2022-08-10T14:50:19Z","closed_at":"2022-08-10T14:50:19Z","author_association":"NONE","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/90","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/90","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/90.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/90.patch","merged_at":"2022-08-10T14:50:19Z"},"body":"I open these pull requests to apply @gquintard 's fix on ARM builds for older varnish versions.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/90/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/90/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/91","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/91/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/91/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/91/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/91","id":1334711226,"node_id":"PR_kwDOBBOOTM489maX","number":91,"title":"align vmb.h with the varnish version","user":{"login":"janosmiko","id":693558,"node_id":"MDQ6VXNlcjY5MzU1OA==","avatar_url":"https://avatars.githubusercontent.com/u/693558?v=4","gravatar_id":"","url":"https://api.github.com/users/janosmiko","html_url":"https://github.com/janosmiko","followers_url":"https://api.github.com/users/janosmiko/followers","following_url":"https://api.github.com/users/janosmiko/following{/other_user}","gists_url":"https://api.github.com/users/janosmiko/gists{/gist_id}","starred_url":"https://api.github.com/users/janosmiko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janosmiko/subscriptions","organizations_url":"https://api.github.com/users/janosmiko/orgs","repos_url":"https://api.github.com/users/janosmiko/repos","events_url":"https://api.github.com/users/janosmiko/events{/privacy}","received_events_url":"https://api.github.com/users/janosmiko/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2022-08-10T14:23:48Z","updated_at":"2022-08-10T14:50:26Z","closed_at":"2022-08-10T14:50:26Z","author_association":"NONE","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/91","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/91","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/91.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/91.patch","merged_at":"2022-08-10T14:50:26Z"},"body":"I open these pull requests to apply @gquintard 's fix on ARM builds for older varnish versions.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/91/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/91/timeline","performed_via_github_app":null,"state_reason":null}] \ No newline at end of file diff --git a/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic%2Fissues%3Fafter=Y3Vyc29yOnYyOpLPAAABgogj3SDOT44Tug%253D%253D&direction=asc&per_page=45&sort=created&state=all b/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic%2Fissues%3Fafter=Y3Vyc29yOnYyOpLPAAABgogj3SDOT44Tug%253D%253D&direction=asc&per_page=45&sort=created&state=all new file mode 100644 index 0000000000..6af7fe094a --- /dev/null +++ b/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic%2Fissues%3Fafter=Y3Vyc29yOnYyOpLPAAABgogj3SDOT44Tug%253D%253D&direction=asc&per_page=45&sort=created&state=all @@ -0,0 +1,24 @@ +Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset +Content-Security-Policy: default-src 'none' +X-Ratelimit-Limit: 5000 +X-Github-Request-Id: 545E:1E338F:1CE4A84:1996CBD:6973A26D +X-Github-Media-Type: github.v3; param=squirrel-girl-preview +X-Content-Type-Options: nosniff +X-Ratelimit-Remaining: 4996 +X-Ratelimit-Used: 4 +X-Ratelimit-Resource: core +Cache-Control: private, max-age=60, s-maxage=60 +Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With +Etag: W/"a49a1c60869efd0512ebf397fe3b38f0f0780cd1108773b389a457d5139908be" +Access-Control-Allow-Origin: * +Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin +Link: ; rel="next", ; rel="prev" +X-Github-Api-Version-Selected: 2022-11-28 +Strict-Transport-Security: max-age=31536000; includeSubdomains; preload +X-Frame-Options: deny +X-Xss-Protection: 0 +X-Ratelimit-Reset: 1769189499 +Content-Type: application/json; charset=utf-8 +X-Accepted-Github-Permissions: issues=read + +[{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/92","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/92/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/92/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/92/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/92","id":1334711283,"node_id":"PR_kwDOBBOOTM489mbM","number":92,"title":"align vmb.h with the varnish version","user":{"login":"janosmiko","id":693558,"node_id":"MDQ6VXNlcjY5MzU1OA==","avatar_url":"https://avatars.githubusercontent.com/u/693558?v=4","gravatar_id":"","url":"https://api.github.com/users/janosmiko","html_url":"https://github.com/janosmiko","followers_url":"https://api.github.com/users/janosmiko/followers","following_url":"https://api.github.com/users/janosmiko/following{/other_user}","gists_url":"https://api.github.com/users/janosmiko/gists{/gist_id}","starred_url":"https://api.github.com/users/janosmiko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janosmiko/subscriptions","organizations_url":"https://api.github.com/users/janosmiko/orgs","repos_url":"https://api.github.com/users/janosmiko/repos","events_url":"https://api.github.com/users/janosmiko/events{/privacy}","received_events_url":"https://api.github.com/users/janosmiko/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2022-08-10T14:23:51Z","updated_at":"2022-08-10T14:50:33Z","closed_at":"2022-08-10T14:50:33Z","author_association":"NONE","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/92","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/92","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/92.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/92.patch","merged_at":"2022-08-10T14:50:33Z"},"body":"I open these pull requests to apply @gquintard 's fix on ARM builds for older varnish versions.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/92/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/92/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/93","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/93/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/93/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/93/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/93","id":1334955060,"node_id":"PR_kwDOBBOOTM48-Zu6","number":93,"title":"Branch for 7.1","user":{"login":"janosmiko","id":693558,"node_id":"MDQ6VXNlcjY5MzU1OA==","avatar_url":"https://avatars.githubusercontent.com/u/693558?v=4","gravatar_id":"","url":"https://api.github.com/users/janosmiko","html_url":"https://github.com/janosmiko","followers_url":"https://api.github.com/users/janosmiko/followers","following_url":"https://api.github.com/users/janosmiko/following{/other_user}","gists_url":"https://api.github.com/users/janosmiko/gists{/gist_id}","starred_url":"https://api.github.com/users/janosmiko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janosmiko/subscriptions","organizations_url":"https://api.github.com/users/janosmiko/orgs","repos_url":"https://api.github.com/users/janosmiko/repos","events_url":"https://api.github.com/users/janosmiko/events{/privacy}","received_events_url":"https://api.github.com/users/janosmiko/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2022-08-10T17:32:13Z","updated_at":"2022-11-08T19:48:10Z","closed_at":"2022-11-08T19:48:10Z","author_association":"NONE","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/93","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/93","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/93.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/93.patch","merged_at":null},"body":"I prepared a branch for Varnish 7.1.\r\n\r\nOn top of the regular CI-elated changes I replaced the `Lck_CondWait` functions with `Lck_CondWaitTimeout` in the `src/vmod_dynamic.c` file to be up-to-date with Varnish 7.1 (https://github.com/varnishcache/varnish-cache/blob/5424da941529503c724911d8141e6824db756f88/doc/changes.rst)","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/93/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/93/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/94","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/94/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/94/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/94/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/94","id":1410081152,"node_id":"I_kwDOBBOOTM5UDCGA","number":94,"title":"Branches 7.1 / 7.2","user":{"login":"ronaldploeger","id":2346952,"node_id":"MDQ6VXNlcjIzNDY5NTI=","avatar_url":"https://avatars.githubusercontent.com/u/2346952?v=4","gravatar_id":"","url":"https://api.github.com/users/ronaldploeger","html_url":"https://github.com/ronaldploeger","followers_url":"https://api.github.com/users/ronaldploeger/followers","following_url":"https://api.github.com/users/ronaldploeger/following{/other_user}","gists_url":"https://api.github.com/users/ronaldploeger/gists{/gist_id}","starred_url":"https://api.github.com/users/ronaldploeger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ronaldploeger/subscriptions","organizations_url":"https://api.github.com/users/ronaldploeger/orgs","repos_url":"https://api.github.com/users/ronaldploeger/repos","events_url":"https://api.github.com/users/ronaldploeger/events{/privacy}","received_events_url":"https://api.github.com/users/ronaldploeger/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2022-10-15T07:35:36Z","updated_at":"2022-11-09T16:17:58Z","closed_at":"2022-11-08T19:49:42Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi, \r\n\r\nwill there be a branch 7.1 and 7.2 or does the branch 7.0 work correctly with those versions of varnish? \r\n\r\nThanks and best regards,\r\nRonald","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/94/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/94/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/95","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/95/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/95/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/95/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/95","id":1440805930,"node_id":"I_kwDOBBOOTM5V4PQq","number":95,"title":"Update RPM build","user":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":3,"created_at":"2022-11-08T19:47:13Z","updated_at":"2022-11-17T16:23:21Z","closed_at":"2022-11-17T16:23:21Z","author_association":"OWNER","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Ref https://github.com/nigoroll/libvmod-dynamic/pull/93/commits/e7c14cf7bbeaa51e15a2e2921629ab15c701b09d and #93 \r\n\r\nWe should update our RPM build to support 7.1 and/or 7.2\r\n","closed_by":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/95/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/95/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/96","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/96/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/96/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/96/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/96","id":1626745126,"node_id":"I_kwDOBBOOTM5g9ikm","number":96,"title":"7.3 compatibility","user":{"login":"gquintard","id":3776553,"node_id":"MDQ6VXNlcjM3NzY1NTM=","avatar_url":"https://avatars.githubusercontent.com/u/3776553?v=4","gravatar_id":"","url":"https://api.github.com/users/gquintard","html_url":"https://github.com/gquintard","followers_url":"https://api.github.com/users/gquintard/followers","following_url":"https://api.github.com/users/gquintard/following{/other_user}","gists_url":"https://api.github.com/users/gquintard/gists{/gist_id}","starred_url":"https://api.github.com/users/gquintard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gquintard/subscriptions","organizations_url":"https://api.github.com/users/gquintard/orgs","repos_url":"https://api.github.com/users/gquintard/repos","events_url":"https://api.github.com/users/gquintard/events{/privacy}","received_events_url":"https://api.github.com/users/gquintard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":3,"created_at":"2023-03-16T05:25:51Z","updated_at":"2023-03-17T09:03:03Z","closed_at":"2023-03-17T05:03:27Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"hi,\r\n\r\nAs I'm sure you know, some APIs have changed in Varnish 7.3, and libvmod-dynamic doesn't compile against it. I'm opening this for visibility, and I'll try to look into it this week-end if nobody beats me to it","closed_by":{"login":"gquintard","id":3776553,"node_id":"MDQ6VXNlcjM3NzY1NTM=","avatar_url":"https://avatars.githubusercontent.com/u/3776553?v=4","gravatar_id":"","url":"https://api.github.com/users/gquintard","html_url":"https://github.com/gquintard","followers_url":"https://api.github.com/users/gquintard/followers","following_url":"https://api.github.com/users/gquintard/following{/other_user}","gists_url":"https://api.github.com/users/gquintard/gists{/gist_id}","starred_url":"https://api.github.com/users/gquintard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gquintard/subscriptions","organizations_url":"https://api.github.com/users/gquintard/orgs","repos_url":"https://api.github.com/users/gquintard/repos","events_url":"https://api.github.com/users/gquintard/events{/privacy}","received_events_url":"https://api.github.com/users/gquintard/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/96/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/96/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/97","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/97/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/97/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/97/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/97","id":1628702332,"node_id":"I_kwDOBBOOTM5hFAZ8","number":97,"title":"via.vtc failing with \"Cannot assign requested address\"","user":{"login":"gquintard","id":3776553,"node_id":"MDQ6VXNlcjM3NzY1NTM=","avatar_url":"https://avatars.githubusercontent.com/u/3776553?v=4","gravatar_id":"","url":"https://api.github.com/users/gquintard","html_url":"https://github.com/gquintard","followers_url":"https://api.github.com/users/gquintard/followers","following_url":"https://api.github.com/users/gquintard/following{/other_user}","gists_url":"https://api.github.com/users/gquintard/gists{/gist_id}","starred_url":"https://api.github.com/users/gquintard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gquintard/subscriptions","organizations_url":"https://api.github.com/users/gquintard/orgs","repos_url":"https://api.github.com/users/gquintard/repos","events_url":"https://api.github.com/users/gquintard/events{/privacy}","received_events_url":"https://api.github.com/users/gquintard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2023-03-17T05:10:25Z","updated_at":"2023-06-29T14:51:33Z","closed_at":"2023-06-29T14:51:32Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"stumbled onto this when trying to build https://github.com/varnish/docker-varnish/blob/master/fresh/debian/Dockerfile\r\n\r\ncould it be that\r\n```\r\nshell \"getent hosts localhost www.localhost img.localhost || true\"\r\n```\r\nshould actually be\r\n```\r\nfeature cmd \"getent hosts localhost www.localhost img.localhost || true\"\r\n```\r\n?\r\n\r\n```\r\nFAIL: tests/via\r\n===============\r\n\r\n**** dT 0.000\r\n* top TEST ./tests/via.vtc starting\r\n**** top extmacro def pkg_version=7.3.0\r\n**** top extmacro def pkg_branch=7.3\r\n**** top extmacro def pwd=/tmp/module_to_build/src\r\n**** top extmacro def date(...)\r\n**** top extmacro def string(...)\r\n**** top extmacro def vmod_dynamic=dynamic from \"/tmp/module_to_build/src/.libs/libvmod_dynamic.so\"\r\n**** top extmacro def localhost=127.0.0.1\r\n**** top extmacro def bad_backend=127.0.0.1:37455\r\n**** top extmacro def listen_addr=127.0.0.1:0\r\n**** top extmacro def bad_ip=192.0.2.255\r\n**** top macro def testdir=/tmp/module_to_build/src/./tests\r\n**** top macro def tmpdir=/tmp/vtc.31252.7c6136c4\r\n** top === varnishtest \"via\"\r\n* top VTEST via\r\n** top === shell \"getent hosts localhost www.localhost img.localhost ||...\r\n**** top shell_cmd|exec 2>&1 ; getent hosts localhost www.localhost img.localhost || true\r\n**** dT 0.213\r\n**** top shell_out|::1 localhost ip6-localhost ip6-loopback\r\n**** top shell_status = 0x0000\r\n** top === server s1 {\r\n** s1 Starting server\r\n**** s1 macro def s1_addr=127.0.0.1\r\n**** s1 macro def s1_port=41173\r\n**** s1 macro def s1_sock=127.0.0.1:41173\r\n* s1 Listen on 127.0.0.1:41173\r\n** top === varnish v2 -proto PROXY -vcl {\r\n** s1 Started on 127.0.0.1:41173 (1 iterations)\r\n**** dT 0.216\r\n** v2 Launch\r\n*** v2 CMD: cd ${pwd} && exec varnishd -d -n /tmp/vtc.31252.7c6136c4/v2 -i v2 -p debug=+vcl_keep -p debug=+vmod_so_keep -p debug=+vsm_keep -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p thread_pool_min=10 -p debug=+vtc_mode -p vsl_mask=+Debug -p h2_initial_window_size=1m -p h2_rx_window_low_water=64k -a '127.0.0.1:0',PROXY -M '127.0.0.1 45329' -P /tmp/vtc.31252.7c6136c4/v2/varnishd.pid \r\n*** v2 CMD: cd /tmp/module_to_build/src && exec varnishd -d -n /tmp/vtc.31252.7c6136c4/v2 -i v2 -p debug=+vcl_keep -p debug=+vmod_so_keep -p debug=+vsm_keep -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p thread_pool_min=10 -p debug=+vtc_mode -p vsl_mask=+Debug -p h2_initial_window_size=1m -p h2_rx_window_low_water=64k -a '127.0.0.1:0',PROXY -M '127.0.0.1 45329' -P /tmp/vtc.31252.7c6136c4/v2/varnishd.pid \r\n*** v2 PID: 31281\r\n**** v2 macro def v2_pid=31281\r\n**** v2 macro def v2_name=/tmp/vtc.31252.7c6136c4/v2\r\n**** dT 0.226\r\n*** v2 debug|Debug: Version: varnish-7.3.0 revision 84d79120b6d17b11819a663a93160743f293e63f\r\n*** v2 debug|Debug: Platform: Linux,6.1.11-arch1-1,x86_64,-junix,-sdefault,-sdefault,-hcritbit\r\n*** v2 debug|200 315 \r\n*** v2 debug|-----------------------------\r\n*** v2 debug|Varnish Cache CLI 1.0\r\n*** v2 debug|-----------------------------\r\n*** v2 debug|Linux,6.1.11-arch1-1,x86_64,-junix,-sdefault,-sdefault,-hcritbit\r\n*** v2 debug|varnish-7.3.0 revision 84d79120b6d17b11819a663a93160743f293e63f\r\n*** v2 debug|\r\n*** v2 debug|Type 'help' for command list.\r\n*** v2 debug|Type 'quit' to close CLI session.\r\n*** v2 debug|Type 'start' to launch worker process.\r\n*** v2 debug|\r\n**** dT 0.325\r\n**** v2 CLIPOLL 1 0x1 0x0 0x0\r\n*** v2 CLI connection fd = 7\r\n*** v2 CLI RX 107\r\n**** v2 CLI RX|tpbjefitubonnjbuqolncwowdyrfjdyh\r\n**** v2 CLI RX|\r\n**** v2 CLI RX|Authentication required.\r\n**** v2 CLI TX|auth d37955cd96eb9ec6ae08fedc09e18c6ffcf62bd5fbc1526bc3ef40c651cb3a9b\r\n**** dT 0.326\r\n*** v2 CLI RX 200\r\n**** v2 CLI RX|-----------------------------\r\n**** v2 CLI RX|Varnish Cache CLI 1.0\r\n**** v2 CLI RX|-----------------------------\r\n**** v2 CLI RX|Linux,6.1.11-arch1-1,x86_64,-junix,-sdefault,-sdefault,-hcritbit\r\n**** v2 CLI RX|varnish-7.3.0 revision 84d79120b6d17b11819a663a93160743f293e63f\r\n**** v2 CLI RX|\r\n**** v2 CLI RX|Type 'help' for command list.\r\n**** v2 CLI RX|Type 'quit' to close CLI session.\r\n**** v2 CLI RX|Type 'start' to launch worker process.\r\n**** v2 CLI TX|vcl.inline vcl1 << %XJEIFLH|)Xspa8P\r\n**** v2 CLI TX|vcl 4.1;\r\n**** v2 CLI TX|\r\n**** v2 CLI TX|\\timport dynamic from \"/tmp/module_to_build/src/.libs/libvmod_dynamic.so\";\r\n**** v2 CLI TX|\\timport std;\r\n**** v2 CLI TX|\\timport proxy;\r\n**** v2 CLI TX|\r\n**** v2 CLI TX|\\tbackend dummy { .host = \"127.0.0.1:37455\"; }\r\n**** v2 CLI TX|\r\n**** v2 CLI TX|\\tsub vcl_init {\r\n**** v2 CLI TX|\\t\\tnew d1 = dynamic.director();\r\n**** v2 CLI TX|\\t}\r\n**** v2 CLI TX|\r\n**** v2 CLI TX|\\tsub vcl_recv {\r\n**** v2 CLI TX|\\t\\tset req.backend_hint = d1.backend(server.ip,\r\n**** v2 CLI TX|\\t\\t std.port(server.ip));\r\n**** v2 CLI TX|\\t\\tset req.http.Authority = proxy.authority();\r\n**** v2 CLI TX|\r\n**** v2 CLI TX|\\t\\treturn (pass);\r\n**** v2 CLI TX|\\t}\r\n**** v2 CLI TX|\r\n**** v2 CLI TX|\\tsub vcl_deliver {\r\n**** v2 CLI TX|\\t\\tset resp.http.Authority = req.http.Authority;\r\n**** v2 CLI TX|\\t}\r\n**** v2 CLI TX|\r\n**** v2 CLI TX|%XJEIFLH|)Xspa8P\r\n**** dT 0.426\r\n*** v2 vsl|No VSL chunk found (child not started ?)\r\n**** dT 0.526\r\n*** v2 vsl|No VSL chunk found (child not started ?)\r\n**** dT 0.606\r\n*** v2 CLI RX 200\r\n**** v2 CLI RX|VCL compiled.\r\n**** v2 CLI TX|vcl.use vcl1\r\n*** v2 CLI RX 200\r\n**** v2 CLI RX|VCL 'vcl1' now active\r\n** v2 Start\r\n**** v2 CLI TX|start\r\n**** dT 0.626\r\n*** v2 vsl|No VSL chunk found (child not started ?)\r\n**** dT 0.649\r\n*** v2 debug|Debug: Child (31370) Started\r\n**** dT 0.673\r\n*** v2 debug|Child launched OK\r\n**** dT 0.678\r\n*** v2 debug|Info: Child (31370) said Child starts\r\n*** v2 CLI RX 200\r\n*** v2 wait-running\r\n**** v2 CLI TX|status\r\n**** dT 0.721\r\n*** v2 CLI RX 200\r\n**** v2 CLI RX|Child in state running\r\n**** v2 CLI TX|debug.listen_address\r\n**** dT 0.727\r\n**** v2 vsl| 0 CLI - Rd vcl.load \"vcl1\" vcl_vcl1.1679028965.187541/vgc.so 1auto\r\n**** v2 vsl| 0 CLI - Wr 200 52 Loaded \"vcl_vcl1.1679028965.187541/vgc.so\" as \"vcl1\"\r\n**** v2 vsl| 0 CLI - Rd vcl.use \"vcl1\"\r\n**** v2 vsl| 0 CLI - Wr 200 0 \r\n**** v2 vsl| 0 CLI - Rd start\r\n**** v2 vsl| 0 Debug - sockopt: Setting SO_LINGER for a0=127.0.0.1:35713\r\n**** v2 vsl| 0 Debug - sockopt: Setting SO_KEEPALIVE for a0=127.0.0.1:35713\r\n**** v2 vsl| 0 Debug - sockopt: Setting SO_SNDTIMEO for a0=127.0.0.1:35713\r\n**** v2 vsl| 0 Debug - sockopt: Setting SO_RCVTIMEO for a0=127.0.0.1:35713\r\n**** v2 vsl| 0 Debug - sockopt: Setting TCP_NODELAY for a0=127.0.0.1:35713\r\n**** v2 vsl| 0 Debug - sockopt: Setting TCP_KEEPIDLE for a0=127.0.0.1:35713\r\n**** v2 vsl| 0 Debug - sockopt: Setting TCP_KEEPCNT for a0=127.0.0.1:35713\r\n**** v2 vsl| 0 Debug - sockopt: Setting TCP_KEEPINTVL for a0=127.0.0.1:35713\r\n**** v2 vsl| 0 CLI - Wr 200 0 \r\n**** dT 0.764\r\n*** v2 CLI RX 200\r\n**** v2 CLI RX|a0 127.0.0.1 35713\r\n**** v2 CLI TX|debug.xid 1000\r\n**** dT 0.811\r\n*** v2 CLI RX 200\r\n**** v2 CLI RX|XID is 1000 chunk 1\r\n**** v2 CLI TX|debug.listen_address\r\n**** dT 0.827\r\n**** v2 vsl| 0 CLI - Rd debug.listen_address \r\n**** v2 vsl| 0 CLI - Wr 200 19 a0 127.0.0.1 35713\r\n\r\n**** v2 vsl| 0 CLI - Rd debug.xid 1000 \r\n**** v2 vsl| 0 CLI - Wr 200 19 XID is 1000 chunk 1\r\n**** dT 0.854\r\n*** v2 CLI RX 200\r\n**** v2 CLI RX|a0 127.0.0.1 35713\r\n** v2 Listen on 127.0.0.1 35713\r\n**** v2 macro def v2_addr=127.0.0.1\r\n**** v2 macro def v2_port=35713\r\n**** v2 macro def v2_sock=127.0.0.1:35713\r\n**** v2 macro def v2_a0_addr=127.0.0.1\r\n**** v2 macro def v2_a0_port=35713\r\n**** v2 macro def v2_a0_sock=127.0.0.1:35713\r\n** top === varnish v1 -vcl {\r\n**** dT 0.857\r\n** v1 Launch\r\n*** v1 CMD: cd ${pwd} && exec varnishd -d -n /tmp/vtc.31252.7c6136c4/v1 -i v1 -p debug=+vcl_keep -p debug=+vmod_so_keep -p debug=+vsm_keep -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p thread_pool_min=10 -p debug=+vtc_mode -p vsl_mask=+Debug -p h2_initial_window_size=1m -p h2_rx_window_low_water=64k -a '127.0.0.1:0' -M '127.0.0.1 33113' -P /tmp/vtc.31252.7c6136c4/v1/varnishd.pid \r\n*** v1 CMD: cd /tmp/module_to_build/src && exec varnishd -d -n /tmp/vtc.31252.7c6136c4/v1 -i v1 -p debug=+vcl_keep -p debug=+vmod_so_keep -p debug=+vsm_keep -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p thread_pool_min=10 -p debug=+vtc_mode -p vsl_mask=+Debug -p h2_initial_window_size=1m -p h2_rx_window_low_water=64k -a '127.0.0.1:0' -M '127.0.0.1 33113' -P /tmp/vtc.31252.7c6136c4/v1/varnishd.pid \r\n*** v1 PID: 31413\r\n**** v1 macro def v1_pid=31413\r\n**** v1 macro def v1_name=/tmp/vtc.31252.7c6136c4/v1\r\n**** dT 0.866\r\n*** v1 debug|Debug: Version: varnish-7.3.0 revision 84d79120b6d17b11819a663a93160743f293e63f\r\n*** v1 debug|Debug: Platform: Linux,6.1.11-arch1-1,x86_64,-junix,-sdefault,-sdefault,-hcritbit\r\n*** v1 debug|200 315 \r\n*** v1 debug|-----------------------------\r\n*** v1 debug|Varnish Cache CLI 1.0\r\n*** v1 debug|-----------------------------\r\n*** v1 debug|Linux,6.1.11-arch1-1,x86_64,-junix,-sdefault,-sdefault,-hcritbit\r\n*** v1 debug|varnish-7.3.0 revision 84d79120b6d17b11819a663a93160743f293e63f\r\n*** v1 debug|\r\n*** v1 debug|Type 'help' for command list.\r\n*** v1 debug|Type 'quit' to close CLI session.\r\n*** v1 debug|Type 'start' to launch worker process.\r\n*** v1 debug|\r\n**** dT 0.927\r\n**** v2 vsl| 0 CLI - Rd debug.listen_address \r\n**** v2 vsl| 0 CLI - Wr 200 19 a0 127.0.0.1 35713\r\n\r\n**** dT 0.966\r\n**** v1 CLIPOLL 1 0x1 0x0 0x0\r\n*** v1 CLI connection fd = 18\r\n*** v1 CLI RX 107\r\n**** v1 CLI RX|sivrodaptpqwhiockdagcddondbmlnoq\r\n**** v1 CLI RX|\r\n**** v1 CLI RX|Authentication required.\r\n**** v1 CLI TX|auth d2c2d189e19fd9551e2913d49c42111c030d1fc301821431c9802913b9bf5307\r\n*** v1 CLI RX 200\r\n**** v1 CLI RX|-----------------------------\r\n**** v1 CLI RX|Varnish Cache CLI 1.0\r\n**** v1 CLI RX|-----------------------------\r\n**** v1 CLI RX|Linux,6.1.11-arch1-1,x86_64,-junix,-sdefault,-sdefault,-hcritbit\r\n**** v1 CLI RX|varnish-7.3.0 revision 84d79120b6d17b11819a663a93160743f293e63f\r\n**** v1 CLI RX|\r\n**** v1 CLI RX|Type 'help' for command list.\r\n**** v1 CLI RX|Type 'quit' to close CLI session.\r\n**** v1 CLI RX|Type 'start' to launch worker process.\r\n**** dT 0.967\r\n**** v1 CLI TX|vcl.inline vcl1 << %XJEIFLH|)Xspa8P\r\n**** v1 CLI TX|vcl 4.1;\r\n**** v1 CLI TX|\r\n**** v1 CLI TX|\\timport dynamic from \"/tmp/module_to_build/src/.libs/libvmod_dynamic.so\";\r\n**** v1 CLI TX|\r\n**** v1 CLI TX|\\tbackend v2 { .host = \"127.0.0.1\"; .port = \"35713\"; }\r\n**** v1 CLI TX|\r\n**** v1 CLI TX|\\tsub vcl_init {\r\n**** v1 CLI TX|\\t\\tnew d1 = dynamic.director(\r\n**** v1 CLI TX|\\t\\t port = \"41173\",\r\n**** v1 CLI TX|\\t\\t via = v2);\r\n**** v1 CLI TX|\\t}\r\n**** v1 CLI TX|\r\n**** v1 CLI TX|\\tsub vcl_recv {\r\n**** v1 CLI TX|\\t\\tset req.backend_hint = d1.backend(\"localhost\");\r\n**** v1 CLI TX|\\t}\r\n**** v1 CLI TX|\r\n**** v1 CLI TX|\\tsub vcl_backend_error {\r\n**** v1 CLI TX|\\t\\t# the director may resolve ::1 first\r\n**** v1 CLI TX|\\t\\treturn (retry);\r\n**** v1 CLI TX|\\t}\r\n**** v1 CLI TX|\r\n**** v1 CLI TX|%XJEIFLH|)Xspa8P\r\n**** dT 1.067\r\n*** v1 vsl|No VSL chunk found (child not started ?)\r\n**** dT 1.167\r\n*** v1 vsl|No VSL chunk found (child not started ?)\r\n**** dT 1.228\r\n*** v1 CLI RX 200\r\n**** v1 CLI RX|VCL compiled.\r\n**** v1 CLI TX|vcl.use vcl1\r\n*** v1 CLI RX 200\r\n**** v1 CLI RX|VCL 'vcl1' now active\r\n** v1 Start\r\n**** v1 CLI TX|start\r\n**** dT 1.267\r\n*** v1 vsl|No VSL chunk found (child not started ?)\r\n**** dT 1.272\r\n*** v1 debug|Debug: Child (31486) Started\r\n**** dT 1.297\r\n*** v1 debug|Child launched OK\r\n**** dT 1.301\r\n*** v1 CLI RX 200\r\n*** v1 debug|Info: Child (31486) said Child starts\r\n*** v1 wait-running\r\n**** v1 CLI TX|status\r\n**** dT 1.344\r\n*** v1 CLI RX 200\r\n**** v1 CLI RX|Child in state running\r\n**** v1 CLI TX|debug.listen_address\r\n**** dT 1.367\r\n**** v1 vsl| 0 CLI - Rd vcl.load \"vcl1\" vcl_vcl1.1679028965.828132/vgc.so 1auto\r\n**** v1 vsl| 0 CLI - Wr 200 52 Loaded \"vcl_vcl1.1679028965.828132/vgc.so\" as \"vcl1\"\r\n**** v1 vsl| 0 CLI - Rd vcl.use \"vcl1\"\r\n**** v1 vsl| 0 CLI - Wr 200 0 \r\n**** v1 vsl| 0 CLI - Rd start\r\n**** v1 vsl| 0 Debug - sockopt: Setting SO_LINGER for a0=127.0.0.1:44415\r\n**** v1 vsl| 0 Debug - sockopt: Setting SO_KEEPALIVE for a0=127.0.0.1:44415\r\n**** v1 vsl| 0 Debug - sockopt: Setting SO_SNDTIMEO for a0=127.0.0.1:44415\r\n**** v1 vsl| 0 Debug - sockopt: Setting SO_RCVTIMEO for a0=127.0.0.1:44415\r\n**** v1 vsl| 0 Debug - sockopt: Setting TCP_NODELAY for a0=127.0.0.1:44415\r\n**** v1 vsl| 0 Debug - sockopt: Setting TCP_KEEPIDLE for a0=127.0.0.1:44415\r\n**** v1 vsl| 0 Debug - sockopt: Setting TCP_KEEPCNT for a0=127.0.0.1:44415\r\n**** v1 vsl| 0 Debug - sockopt: Setting TCP_KEEPINTVL for a0=127.0.0.1:44415\r\n**** v1 vsl| 0 CLI - Wr 200 0 \r\n**** dT 1.391\r\n*** v1 CLI RX 200\r\n**** v1 CLI RX|a0 127.0.0.1 44415\r\n**** v1 CLI TX|debug.xid 1000\r\n**** dT 1.434\r\n*** v1 CLI RX 200\r\n**** v1 CLI RX|XID is 1000 chunk 1\r\n**** v1 CLI TX|debug.listen_address\r\n**** dT 1.467\r\n**** v1 vsl| 0 CLI - Rd debug.listen_address \r\n**** v1 vsl| 0 CLI - Wr 200 19 a0 127.0.0.1 44415\r\n\r\n**** v1 vsl| 0 CLI - Rd debug.xid 1000 \r\n**** v1 vsl| 0 CLI - Wr 200 19 XID is 1000 chunk 1\r\n**** dT 1.477\r\n*** v1 CLI RX 200\r\n**** v1 CLI RX|a0 127.0.0.1 44415\r\n** v1 Listen on 127.0.0.1 44415\r\n**** v1 macro def v1_addr=127.0.0.1\r\n**** v1 macro def v1_port=44415\r\n**** v1 macro def v1_sock=127.0.0.1:44415\r\n**** v1 macro def v1_a0_addr=127.0.0.1\r\n**** v1 macro def v1_a0_port=44415\r\n**** v1 macro def v1_a0_sock=127.0.0.1:44415\r\n** top === client c1 {\r\n** c1 Starting client\r\n** c1 Waiting for client\r\n** c1 Started on 127.0.0.1:44415 (1 iterations)\r\n*** c1 Connect to 127.0.0.1:44415\r\n*** c1 connected fd 28 from 127.0.0.1 38040 to 127.0.0.1:44415\r\n**** dT 1.478\r\n** c1 === txreq\r\n**** c1 txreq|GET / HTTP/1.1\\r\r\n**** c1 txreq|Host: 127.0.0.1\\r\r\n**** c1 txreq|\\r\r\n** c1 === rxresp\r\n**** dT 1.480\r\n**** c1 rxhdr|HTTP/1.1 503 Backend fetch failed\\r\r\n**** c1 rxhdr|Date: Fri, 17 Mar 2023 04:56:06 GMT\\r\r\n**** c1 rxhdr|Server: Varnish\\r\r\n**** c1 rxhdr|Content-Type: text/html; charset=utf-8\\r\r\n**** c1 rxhdr|Retry-After: 5\\r\r\n**** c1 rxhdr|X-Varnish: 1001\\r\r\n**** c1 rxhdr|Authority: localhost\\r\r\n**** c1 rxhdr|Content-Length: 281\\r\r\n**** c1 rxhdr|X-Varnish: 1001\\r\r\n**** c1 rxhdr|Age: 0\\r\r\n**** c1 rxhdr|Via: 1.1 v2 (Varnish/7.3), 1.1 v1 (Varnish/7.3)\\r\r\n**** c1 rxhdr|Connection: keep-alive\\r\r\n**** c1 rxhdr|\\r\r\n**** c1 rxhdrlen = 305\r\n**** c1 http[ 0] |HTTP/1.1\r\n**** c1 http[ 1] |503\r\n**** c1 http[ 2] |Backend fetch failed\r\n**** c1 http[ 3] |Date: Fri, 17 Mar 2023 04:56:06 GMT\r\n**** c1 http[ 4] |Server: Varnish\r\n**** c1 http[ 5] |Content-Type: text/html; charset=utf-8\r\n**** c1 http[ 6] |Retry-After: 5\r\n**** c1 http[ 7] |X-Varnish: 1001\r\n**** c1 http[ 8] |Authority: localhost\r\n**** c1 http[ 9] |Content-Length: 281\r\n**** c1 http[10] |X-Varnish: 1001\r\n**** c1 http[11] |Age: 0\r\n**** c1 http[12] |Via: 1.1 v2 (Varnish/7.3), 1.1 v1 (Varnish/7.3)\r\n**** c1 http[13] |Connection: keep-alive\r\n**** c1 c-l|\r\n**** c1 c-l|\r\n**** c1 c-l| \r\n**** c1 c-l| 503 Backend fetch failed\r\n**** c1 c-l| \r\n**** c1 c-l| \r\n**** c1 c-l|

Error 503 Backend fetch failed

\r\n**** c1 c-l|

Backend fetch failed

\r\n**** c1 c-l|

Guru Meditation:

\r\n**** c1 c-l|

XID: 1002

\r\n**** c1 c-l|
\r\n**** c1 c-l|

Varnish cache server

\r\n**** c1 c-l| \r\n**** c1 c-l|\r\n**** c1 bodylen = 281\r\n** c1 === expect resp.status == 200\r\n---- c1 EXPECT resp.status (503) == \"200\" failed\r\n* top RESETTING after ./tests/via.vtc\r\n** s1 Waiting for server (4/-1)\r\n** v2 Wait\r\n**** v2 CLI TX|panic.show\r\n**** dT 1.524\r\n*** v2 CLI RX 300\r\n**** v2 CLI RX|Child has not panicked or panic has been cleared\r\n*** v2 debug|Info: manager stopping child\r\n*** v2 debug|Debug: Stopping Child\r\n**** dT 1.528\r\n**** v2 vsl| 1000 Begin c sess 0 PROXY\r\n**** v2 vsl| 1000 SessOpen c 127.0.0.1 59120 a0 127.0.0.1 35713 1679028966.339887 19\r\n**** v2 vsl| 1000 Debug c sockopt: SO_LINGER may be inherited for a0=127.0.0.1:35713\r\n**** v2 vsl| 1000 Debug c sockopt: SO_KEEPALIVE may be inherited for a0=127.0.0.1:35713\r\n**** v2 vsl| 1000 Debug c sockopt: SO_SNDTIMEO may be inherited for a0=127.0.0.1:35713\r\n**** v2 vsl| 1000 Debug c sockopt: SO_RCVTIMEO may be inherited for a0=127.0.0.1:35713\r\n**** v2 vsl| 1000 Debug c sockopt: TCP_NODELAY may be inherited for a0=127.0.0.1:35713\r\n**** v2 vsl| 1000 Debug c sockopt: TCP_KEEPIDLE may be inherited for a0=127.0.0.1:35713\r\n**** v2 vsl| 1000 Debug c sockopt: TCP_KEEPCNT may be inherited for a0=127.0.0.1:35713\r\n**** v2 vsl| 1000 Debug c sockopt: TCP_KEEPINTVL may be inherited for a0=127.0.0.1:35713\r\n**** v2 vsl| 1000 Proxy c 2 :: 0 ::1 41173\r\n**** v2 vsl| 1000 Link c req 1001 rxreq\r\n**** v2 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(::1:41173) Lookup: 1679028966.340034 0.000000 0.000000\r\n**** v2 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(::1:41173) Results: 1679028966.340130 0.000096 0.000096\r\n**** v2 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(::1:41173) Update: 1679028966.340295 0.000261 0.000165\r\n**** v2 vsl| 1002 Begin b bereq 1001 pass\r\n**** v2 vsl| 1002 VCL_use b vcl1\r\n**** v2 vsl| 1002 Timestamp b Start: 1679028966.340091 0.000000 0.000000\r\n**** v2 vsl| 1002 BereqMethod b GET\r\n**** v2 vsl| 1002 BereqURL b /\r\n**** v2 vsl| 1002 BereqProtocol b HTTP/1.1\r\n**** v2 vsl| 1002 BereqHeader b Host: 127.0.0.1\r\n**** v2 vsl| 1002 BereqHeader b Accept-Encoding: gzip\r\n**** v2 vsl| 1002 BereqHeader b X-Varnish: 1002\r\n**** v2 vsl| 1002 BereqHeader b X-Forwarded-For: 127.0.0.1, ::\r\n**** v2 vsl| 1002 BereqHeader b Via: 1.1 v1 (Varnish/7.3), 1.1 v2 (Varnish/7.3)\r\n**** v2 vsl| 1002 BereqHeader b Authority: localhost\r\n**** v2 vsl| 1002 BereqHeader b X-Varnish: 1002\r\n**** v2 vsl| 1002 VCL_call b BACKEND_FETCH\r\n**** v2 vsl| 1002 VCL_return b fetch\r\n**** v2 vsl| 1002 Timestamp b Fetch: 1679028966.340108 0.000017 0.000017\r\n**** v2 vsl| 1002 FetchError b backend d1(::1:41173): fail errno 99 (Cannot assign requested address)\r\n**** v2 vsl| 1002 Timestamp b Beresp: 1679028966.340422 0.000331 0.000313\r\n**** v2 vsl| 1002 Timestamp b Error: 1679028966.340424 0.000333 0.000002\r\n**** v2 vsl| 1002 BerespProtocol b HTTP/1.1\r\n**** v2 vsl| 1002 BerespStatus b 503\r\n**** v2 vsl| 1002 BerespReason b Backend fetch failed\r\n**** v2 vsl| 1002 BerespHeader b Date: Fri, 17 Mar 2023 04:56:06 GMT\r\n**** v2 vsl| 1002 BerespHeader b Server: Varnish\r\n**** v2 vsl| 1002 VCL_call b BACKEND_ERROR\r\n**** v2 vsl| 1002 BerespHeader b Content-Type: text/html; charset=utf-8\r\n**** v2 vsl| 1002 BerespHeader b Retry-After: 5\r\n**** v2 vsl| 1002 VCL_return b deliver\r\n**** v2 vsl| 1002 Storage b malloc Transient\r\n**** v2 vsl| 1002 Length b 281\r\n**** v2 vsl| 1002 BereqAcct b 0 0 0 0 0 0\r\n**** v2 vsl| 1002 End b \r\n**** v2 vsl| 1001 Begin c req 1000 rxreq\r\n**** v2 vsl| 1001 Timestamp c Start: 1679028966.339929 0.000000 0.000000\r\n**** v2 vsl| 1001 Timestamp c Req: 1679028966.339929 0.000000 0.000000\r\n**** v2 vsl| 1001 VCL_use c vcl1\r\n**** v2 vsl| 1001 ReqStart c :: 0 a0\r\n**** v2 vsl| 1001 ReqMethod c GET\r\n**** v2 vsl| 1001 ReqURL c /\r\n**** v2 vsl| 1001 ReqProtocol c HTTP/1.1\r\n**** v2 vsl| 1001 ReqHeader c Host: 127.0.0.1\r\n**** v2 vsl| 1001 ReqHeader c X-Forwarded-For: 127.0.0.1\r\n**** v2 vsl| 1001 ReqHeader c Via: 1.1 v1 (Varnish/7.3)\r\n**** v2 vsl| 1001 ReqHeader c Accept-Encoding: gzip\r\n**** v2 vsl| 1001 ReqHeader c X-Varnish: 1002\r\n**** v2 vsl| 1001 ReqUnset c X-Forwarded-For: 127.0.0.1\r\n**** v2 vsl| 1001 ReqHeader c X-Forwarded-For: 127.0.0.1, ::\r\n**** v2 vsl| 1001 ReqUnset c Via: 1.1 v1 (Varnish/7.3)\r\n**** v2 vsl| 1001 ReqHeader c Via: 1.1 v1 (Varnish/7.3), 1.1 v2 (Varnish/7.3)\r\n**** v2 vsl| 1001 VCL_call c RECV\r\n**** v2 vsl| 1001 ReqHeader c Authority: localhost\r\n**** v2 vsl| 1001 VCL_return c pass\r\n**** v2 vsl| 1001 VCL_call c HASH\r\n**** v2 vsl| 1001 VCL_return c lookup\r\n**** v2 vsl| 1001 VCL_call c PASS\r\n**** v2 vsl| 1001 VCL_return c fetch\r\n**** v2 vsl| 1001 Link c bereq 1002 pass\r\n**** v2 vsl| 1001 Timestamp c Fetch: 1679028966.340555 0.000625 0.000625\r\n**** v2 vsl| 1001 RespProtocol c HTTP/1.1\r\n**** v2 vsl| 1001 RespStatus c 503\r\n**** v2 vsl| 1001 RespReason c Backend fetch failed\r\n**** v2 vsl| 1001 RespHeader c Date: Fri, 17 Mar 2023 04:56:06 GMT\r\n**** v2 vsl| 1001 RespHeader c Server: Varnish\r\n**** v2 vsl| 1001 RespHeader c Content-Type: text/html; charset=utf-8\r\n**** v2 vsl| 1001 RespHeader c Retry-After: 5\r\n**** v2 vsl| 1001 RespHeader c X-Varnish: 1001\r\n**** v2 vsl| 1001 RespHeader c Age: 0\r\n**** v2 vsl| 1001 RespHeader c Via: 1.1 v2 (Varnish/7.3)\r\n**** v2 vsl| 1001 VCL_call c DELIVER\r\n**** v2 vsl| 1001 RespHeader c Authority: localhost\r\n**** v2 vsl| 1001 VCL_return c deliver\r\n**** v2 vsl| 1001 Timestamp c Process: 1679028966.340574 0.000644 0.000018\r\n**** v2 vsl| 1001 Filters c \r\n**** v2 vsl| 1001 RespHeader c Content-Length: 281\r\n**** v2 vsl| 1001 RespHeader c Connection: keep-alive\r\n**** v2 vsl| 1001 Timestamp c Resp: 1679028966.340619 0.000689 0.000045\r\n**** v2 vsl| 1001 ReqAcct c 130 0 130 266 281 547\r\n**** v2 vsl| 1001 End c \r\n**** v2 vsl| 0 CLI - EOF on CLI connection, worker stops\r\n**** dT 1.567\r\n**** v1 vsl| 0 CLI - Rd debug.listen_address \r\n**** v1 vsl| 0 CLI - Wr 200 19 a0 127.0.0.1 44415\r\n\r\n**** v1 vsl| 1000 Begin c sess 0 HTTP/1\r\n**** v1 vsl| 1000 SessOpen c 127.0.0.1 38040 a0 127.0.0.1 44415 1679028966.339009 19\r\n**** v1 vsl| 1000 Debug c sockopt: SO_LINGER may be inherited for a0=127.0.0.1:44415\r\n**** v1 vsl| 1000 Debug c sockopt: SO_KEEPALIVE may be inherited for a0=127.0.0.1:44415\r\n**** v1 vsl| 1000 Debug c sockopt: SO_SNDTIMEO may be inherited for a0=127.0.0.1:44415\r\n**** v1 vsl| 1000 Debug c sockopt: SO_RCVTIMEO may be inherited for a0=127.0.0.1:44415\r\n**** v1 vsl| 1000 Debug c sockopt: TCP_NODELAY may be inherited for a0=127.0.0.1:44415\r\n**** v1 vsl| 1000 Debug c sockopt: TCP_KEEPIDLE may be inherited for a0=127.0.0.1:44415\r\n**** v1 vsl| 1000 Debug c sockopt: TCP_KEEPCNT may be inherited for a0=127.0.0.1:44415\r\n**** v1 vsl| 1000 Debug c sockopt: TCP_KEEPINTVL may be inherited for a0=127.0.0.1:44415\r\n**** v1 vsl| 1000 Link c req 1001 rxreq\r\n**** v1 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(localhost:41173) Lookup: 1679028966.339141 0.000000 0.000000\r\n**** v1 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(localhost:41173) Results: 1679028966.339372 0.000231 0.000231\r\n**** v1 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(localhost:41173) Update: 1679028966.339616 0.000475 0.000244\r\n**** v1 vsl| 1002 Begin b bereq 1001 fetch\r\n**** v1 vsl| 1002 VCL_use b vcl1\r\n**** v1 vsl| 1002 Timestamp b Start: 1679028966.339237 0.000000 0.000000\r\n**** v1 vsl| 1002 BereqMethod b GET\r\n**** v1 vsl| 1002 BereqURL b /\r\n**** v1 vsl| 1002 BereqProtocol b HTTP/1.1\r\n**** v1 vsl| 1002 BereqHeader b Host: 127.0.0.1\r\n**** v1 vsl| 1002 BereqHeader b X-Forwarded-For: 127.0.0.1\r\n**** dT 1.568\r\n**** v1 vsl| 1002 BereqHeader b Via: 1.1 v1 (Varnish/7.3)\r\n**** v1 vsl| 1002 BereqHeader b Accept-Encoding: gzip\r\n**** v1 vsl| 1002 BereqHeader b X-Varnish: 1002\r\n**** v1 vsl| 1002 VCL_call b BACKEND_FETCH\r\n**** v1 vsl| 1002 VCL_return b fetch\r\n**** v1 vsl| 1002 Timestamp b Fetch: 1679028966.339257 0.000019 0.000019\r\n**** v1 vsl| 1002 Timestamp b Connected: 1679028966.339806 0.000568 0.000549\r\n**** v1 vsl| 1002 BackendOpen b 25 d1.localhost(::1:41173) 127.0.0.1 35713 127.0.0.1 59120 connect\r\n**** v1 vsl| 1002 Timestamp b Bereq: 1679028966.339835 0.000597 0.000028\r\n**** v1 vsl| 1002 BerespProtocol b HTTP/1.1\r\n**** v1 vsl| 1002 BerespStatus b 503\r\n**** v1 vsl| 1002 BerespReason b Backend fetch failed\r\n**** v1 vsl| 1002 BerespHeader b Date: Fri, 17 Mar 2023 04:56:06 GMT\r\n**** v1 vsl| 1002 BerespHeader b Server: Varnish\r\n**** v1 vsl| 1002 BerespHeader b Content-Type: text/html; charset=utf-8\r\n**** v1 vsl| 1002 BerespHeader b Retry-After: 5\r\n**** v1 vsl| 1002 BerespHeader b X-Varnish: 1001\r\n**** v1 vsl| 1002 BerespHeader b Age: 0\r\n**** v1 vsl| 1002 BerespHeader b Via: 1.1 v2 (Varnish/7.3)\r\n**** v1 vsl| 1002 BerespHeader b Authority: localhost\r\n**** v1 vsl| 1002 BerespHeader b Content-Length: 281\r\n**** v1 vsl| 1002 BerespHeader b Connection: keep-alive\r\n**** v1 vsl| 1002 Timestamp b Beresp: 1679028966.340633 0.001396 0.000798\r\n**** v1 vsl| 1002 TTL b RFC -1 10 0 1679028966 1679028966 1679028966 0 0 cacheable\r\n**** v1 vsl| 1002 VCL_call b BACKEND_RESPONSE\r\n**** v1 vsl| 1002 TTL b VCL 120 10 0 1679028966 cacheable\r\n**** v1 vsl| 1002 TTL b VCL 120 10 0 1679028966 uncacheable\r\n**** v1 vsl| 1002 VCL_return b deliver\r\n**** v1 vsl| 1002 Timestamp b Process: 1679028966.340654 0.001416 0.000020\r\n**** v1 vsl| 1002 Filters b \r\n**** v1 vsl| 1002 Storage b malloc Transient\r\n**** v1 vsl| 1002 Fetch_Body b 3 length stream\r\n**** v1 vsl| 1002 BackendClose b 25 d1.localhost(::1:41173) recycle\r\n**** v1 vsl| 1002 Timestamp b BerespBody: 1679028966.350797 0.011559 0.010143\r\n**** v1 vsl| 1002 Length b 281\r\n**** v1 vsl| 1002 BereqAcct b 130 0 130 266 281 547\r\n**** v1 vsl| 1002 End b \r\n**** v1 vsl| 1001 Begin c req 1000 rxreq\r\n**** v1 vsl| 1001 Timestamp c Start: 1679028966.339053 0.000000 0.000000\r\n**** v1 vsl| 1001 Timestamp c Req: 1679028966.339053 0.000000 0.000000\r\n**** v1 vsl| 1001 VCL_use c vcl1\r\n**** v1 vsl| 1001 ReqStart c 127.0.0.1 38040 a0\r\n**** v1 vsl| 1001 ReqMethod c GET\r\n**** v1 vsl| 1001 ReqURL c /\r\n**** v1 vsl| 1001 ReqProtocol c HTTP/1.1\r\n**** v1 vsl| 1001 ReqHeader c Host: 127.0.0.1\r\n**** v1 vsl| 1001 ReqHeader c X-Forwarded-For: 127.0.0.1\r\n**** v1 vsl| 1001 ReqHeader c Via: 1.1 v1 (Varnish/7.3)\r\n**** v1 vsl| 1001 VCL_call c RECV\r\n**** v1 vsl| 1001 VCL_return c hash\r\n**** v1 vsl| 1001 VCL_call c HASH\r\n**** v1 vsl| 1001 VCL_return c lookup\r\n**** v1 vsl| 1001 VCL_call c MISS\r\n**** v1 vsl| 1001 VCL_return c fetch\r\n**** v1 vsl| 1001 Link c bereq 1002 fetch\r\n**** v1 vsl| 1001 Timestamp c Fetch: 1679028966.340701 0.001648 0.001648\r\n**** v1 vsl| 1001 RespProtocol c HTTP/1.1\r\n**** v1 vsl| 1001 RespStatus c 503\r\n**** v1 vsl| 1001 RespReason c Backend fetch failed\r\n**** v1 vsl| 1001 RespHeader c Date: Fri, 17 Mar 2023 04:56:06 GMT\r\n**** v1 vsl| 1001 RespHeader c Server: Varnish\r\n**** v1 vsl| 1001 RespHeader c Content-Type: text/html; charset=utf-8\r\n**** v1 vsl| 1001 RespHeader c Retry-After: 5\r\n**** v1 vsl| 1001 RespHeader c X-Varnish: 1001\r\n**** v1 vsl| 1001 RespHeader c Via: 1.1 v2 (Varnish/7.3)\r\n**** v1 vsl| 1001 RespHeader c Authority: localhost\r\n**** v1 vsl| 1001 RespHeader c Content-Length: 281\r\n**** v1 vsl| 1001 RespHeader c X-Varnish: 1001\r\n**** v1 vsl| 1001 RespHeader c Age: 0\r\n**** v1 vsl| 1001 RespUnset c Via: 1.1 v2 (Varnish/7.3)\r\n**** v1 vsl| 1001 RespHeader c Via: 1.1 v2 (Varnish/7.3), 1.1 v1 (Varnish/7.3)\r\n**** v1 vsl| 1001 VCL_call c DELIVER\r\n**** v1 vsl| 1001 VCL_return c deliver\r\n**** v1 vsl| 1001 Timestamp c Process: 1679028966.340725 0.001672 0.000023\r\n**** v1 vsl| 1001 Filters c \r\n**** v1 vsl| 1001 RespHeader c Connection: keep-alive\r\n**** v1 vsl| 1001 Timestamp c Resp: 1679028966.350810 0.011757 0.010085\r\n**** v1 vsl| 1001 ReqAcct c 35 0 35 305 281 586\r\n**** v1 vsl| 1001 End c \r\n**** dT 1.624\r\n*** v2 debug|Info: Child (31370) ended\r\n*** v2 debug|Info: Child (31370) said Child dies\r\n*** v2 debug|Debug: Child cleanup complete\r\n*** v2 debug|Info: manager dies\r\n**** dT 1.625\r\n**** v2 STDOUT EOF\r\n**** dT 1.628\r\n** v2 WAIT4 pid=31281 status=0x0000 (user 0.259649 sys 0.048448)\r\n** v1 Wait\r\n**** v1 CLI TX|panic.show\r\n**** dT 1.671\r\n*** v1 CLI RX 300\r\n**** v1 CLI RX|Child has not panicked or panic has been cleared\r\n*** v1 debug|Info: manager stopping child\r\n*** v1 debug|Debug: Stopping Child\r\n**** dT 1.768\r\n**** v1 vsl| 0 CLI - EOF on CLI connection, worker stops\r\n**** dT 1.771\r\n*** v1 debug|Info: Child (31486) ended\r\n*** v1 debug|Info: Child (31486) said Child dies\r\n*** v1 debug|Debug: Child cleanup complete\r\n*** v1 debug|Info: manager dies\r\n**** dT 1.772\r\n**** v1 STDOUT EOF\r\n**** dT 1.868\r\n** v1 WAIT4 pid=31413 status=0x0000 (user 0.236578 sys 0.053338)\r\n* top TEST ./tests/via.vtc FAILED\r\n# top TEST ./tests/via.vtc FAILED (1.869) exit=2\r\nFAIL tests/via.vtc (exit status: 2)\r\n\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/97/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/97/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/98","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/98/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/98/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/98/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/98","id":1628706525,"node_id":"PR_kwDOBBOOTM5MRmCZ","number":98,"title":"shell -> feature cmd","user":{"login":"gquintard","id":3776553,"node_id":"MDQ6VXNlcjM3NzY1NTM=","avatar_url":"https://avatars.githubusercontent.com/u/3776553?v=4","gravatar_id":"","url":"https://api.github.com/users/gquintard","html_url":"https://github.com/gquintard","followers_url":"https://api.github.com/users/gquintard/followers","following_url":"https://api.github.com/users/gquintard/following{/other_user}","gists_url":"https://api.github.com/users/gquintard/gists{/gist_id}","starred_url":"https://api.github.com/users/gquintard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gquintard/subscriptions","organizations_url":"https://api.github.com/users/gquintard/orgs","repos_url":"https://api.github.com/users/gquintard/repos","events_url":"https://api.github.com/users/gquintard/events{/privacy}","received_events_url":"https://api.github.com/users/gquintard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":5,"created_at":"2023-03-17T05:15:33Z","updated_at":"2023-03-22T00:19:21Z","closed_at":"2023-03-21T18:27:53Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/98","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/98","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/98.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/98.patch","merged_at":"2023-03-21T18:27:53Z"},"body":"hopefuly, it's the correct fix for https://github.com/nigoroll/libvmod-dynamic/issues/97","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/98/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/98/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/99","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/99/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/99/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/99/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/99","id":1733615949,"node_id":"I_kwDOBBOOTM5nVOFN","number":99,"title":"Varnish 7.3","user":{"login":"ronald-sz","id":97725423,"node_id":"U_kgDOBdMr7w","avatar_url":"https://avatars.githubusercontent.com/u/97725423?v=4","gravatar_id":"","url":"https://api.github.com/users/ronald-sz","html_url":"https://github.com/ronald-sz","followers_url":"https://api.github.com/users/ronald-sz/followers","following_url":"https://api.github.com/users/ronald-sz/following{/other_user}","gists_url":"https://api.github.com/users/ronald-sz/gists{/gist_id}","starred_url":"https://api.github.com/users/ronald-sz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ronald-sz/subscriptions","organizations_url":"https://api.github.com/users/ronald-sz/orgs","repos_url":"https://api.github.com/users/ronald-sz/repos","events_url":"https://api.github.com/users/ronald-sz/events{/privacy}","received_events_url":"https://api.github.com/users/ronald-sz/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":3,"created_at":"2023-05-31T08:04:47Z","updated_at":"2023-07-04T17:34:03Z","closed_at":"2023-07-04T17:01:09Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi Nils, \r\n\r\nis master ready for Varnish 7.3? Could you please create a branch for 7.3?\r\n\r\nAll the best,\r\nRonald","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/99/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/99/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/100","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/100/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/100/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/100/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/100","id":1799293379,"node_id":"I_kwDOBBOOTM5rPwnD","number":100,"title":"Assert error in VBP_Remove()","user":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":2228316027,"node_id":"MDU6TGFiZWwyMjI4MzE2MDI3","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/needs%20varnish-cache","name":"needs varnish-cache","color":"006b75","default":false,"description":"needs work in varnish-cache"}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2023-07-11T16:16:29Z","updated_at":"2023-07-17T13:21:14Z","closed_at":"2023-07-17T13:21:14Z","author_association":"OWNER","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Seen with ad2285bb5915ceee6949f02bdca15333bdd159d5 on varnish-cache [69fe28ffd981a3714f32faa54a4c47c6c5f1753e](https://github.com/nigoroll/varnish-cache/tree/unmerged_code_20230704_185303), which is based on 48681cc872c17d339bb6ddb47304db0685e844ba:\r\n\r\n```\r\n 0x4f0dba: /opt/varnish/sbin/varnishd() [0x4f0dba]\r\nAssert error in VBP_Remove(), cache/cache_backend_probe.c line 718:\r\n Condition(vt->heap_idx == VBH_NOIDX) not true.\r\nversion = varnish-trunk revision 69fe28ffd981a3714f32faa54a4c47c6c5f1753e, vrt api = 17.0\r\nident = Linux,3.10.0-862.14.4.el7.x86_64,x86_64,-jnone,-smalloc,-sdefault,-hcritbit,epoll\r\nnow = 146369807.049963 (mono), 1689082818.407869 (real)\r\nBacktrace:\r\n 0x44e3c2: /opt/varnish/sbin/varnishd() [0x44e3c2]\r\n 0x44eacf: /opt/varnish/sbin/varnishd() [0x44eacf]\r\n 0x4ee962: /opt/varnish/sbin/varnishd(VAS_Fail+0x53) [0x4ee962]\r\n 0x41fb40: /opt/varnish/sbin/varnishd(VBP_Remove+0x15f) [0x41fb40]\r\n 0x41bdd7: /opt/varnish/sbin/varnishd() [0x41bdd7]\r\n 0x41bf4a: /opt/varnish/sbin/varnishd() [0x41bf4a]\r\n 0x4751d6: /opt/varnish/sbin/varnishd() [0x4751d6]\r\n 0x4752fa: /opt/varnish/sbin/varnishd() [0x4752fa]\r\n 0x4755aa: /opt/varnish/sbin/varnishd(VRT_Assign_Backend+0x12b) [0x4755aa]\r\n 0x7f9d011eaded: ./vmod_cache/_vmod_dynamic.5658350bfea26ceaa0bf26746c43cfa37683f4f5a1d373819db83c01b95cee9a(+0x6ded) [0x7f9d011eaded]\r\n 0x475421: /opt/varnish/sbin/varnishd(VRT_DelDirector+0x122) [0x475421]\r\n 0x7f9d011eaa30: ./vmod_cache/_vmod_dynamic.5658350bfea26ceaa0bf26746c43cfa37683f4f5a1d373819db83c01b95cee9a(+0x6a30) [0x7f9d011eaa30]\r\n 0x7f9d011ec527: ./vmod_cache/_vmod_dynamic.5658350bfea26ceaa0bf26746c43cfa37683f4f5a1d373819db83c01b95cee9a(vmod_event+0x437) [0x7f9d011ec527]\r\n 0x7f9d115143cd: vcl_boot.1688716416.512333/vgc.so(+0xba3cd) [0x7f9d115143cd]\r\n 0x45f67d: /opt/varnish/sbin/varnishd() [0x45f67d]\r\n 0x460b0e: /opt/varnish/sbin/varnishd() [0x460b0e]\r\n 0x461d82: /opt/varnish/sbin/varnishd() [0x461d82]\r\n 0x4f049c: /opt/varnish/sbin/varnishd() [0x4f049c]\r\n 0x4f0810: /opt/varnish/sbin/varnishd() [0x4f0810]\r\n 0x4f0dba: /opt/varnish/sbin/varnishd() [0x4f0dba]\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/100/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/100/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/101","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/101/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/101/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/101/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/101","id":1800366045,"node_id":"I_kwDOBBOOTM5rT2fd","number":101,"title":"Hang & child cli timeout/quit related to VRT_Healthy","user":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2023-07-12T07:32:02Z","updated_at":"2023-07-12T08:00:09Z","closed_at":"2023-07-12T08:00:08Z","author_association":"OWNER","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Seen with aa7919e76a3184d158a4d7f1698ad8925353d4b4 on varnish-cache [unmerged_code_20230711_235413](https://github.com/nigoroll/varnish-cache/tree/unmerged_code_20230711_235413) which is based on d99f62a9c5d4c6de492abae63510555d51a53324\r\n\r\n```\r\nPanic at: Wed, 12 Jul 2023 07:18:04 GMT\r\nWrong turn at cache/cache_main.c:375:\r\nIt's time for the big quit\r\nversion = varnish-trunk revision eb42e0a09dec02915caf6b821ff531f3d684de5b, vrt api = 17.0\r\nident = Linux,3.10.0-862.14.4.el7.x86_64,x86_64,-jnone,-smalloc,-sdefault,-hcritbit,epoll\r\nnow = 146433270.810059 (mono), 1689146282.167964 (real)\r\nBacktrace:\r\n 0x44e46c: /opt/varnish/sbin/varnishd() [0x44e46c]\r\n 0x44eb79: /opt/varnish/sbin/varnishd() [0x44eb79]\r\n 0x4eec40: /opt/varnish/sbin/varnishd(VAS_Fail+0x53) [0x4eec40]\r\n 0x448264: /opt/varnish/sbin/varnishd() [0x448264]\r\n 0x7f41e457c400: /lib64/libc.so.6(+0x36400) [0x7f41e457c400]\r\n 0x7f41e491fa33: /lib64/libpthread.so.0(pthread_cond_wait+0xc3) [0x7f41e491fa33]\r\n 0x447169: /opt/varnish/sbin/varnishd(Lck_CondWaitUntil+0x141) [0x447169]\r\n 0x446f57: /opt/varnish/sbin/varnishd(Lck_CondWait+0x27) [0x446f57]\r\n 0x7f41c358cd0c: ./vmod_cache/_vmod_dynamic.29b766e616262ab0ef9252419367ce48fbf642168ba34fc382b1742a77dac5c4(+0x7d0c) [0x7f41c358cd0c]\r\n 0x42b27b: /opt/varnish/sbin/varnishd(VRT_Healthy+0x15e) [0x42b27b]\r\n 0x7f41c4fc4591: ./vmod_cache/_vmod_directors.edab1c2b46260ba7857d12e0b786d29b78460cd930959505a67272486eac4683(+0x3591) [0x7f41c4fc4591]\r\n 0x7f41c4fc4d37: ./vmod_cache/_vmod_directors.edab1c2b46260ba7857d12e0b786d29b78460cd930959505a67272486eac4683(+0x3d37) [0x7f41c4fc4d37]\r\n 0x42b6f1: /opt/varnish/sbin/varnishd() [0x42b6f1]\r\n 0x45ff11: /opt/varnish/sbin/varnishd() [0x45ff11]\r\n 0x46017b: /opt/varnish/sbin/varnishd(VCL_IterDirector+0x23e) [0x46017b]\r\n 0x42bf2c: /opt/varnish/sbin/varnishd() [0x42bf2c]\r\n 0x4f077a: /opt/varnish/sbin/varnishd() [0x4f077a]\r\n 0x4f0aee: /opt/varnish/sbin/varnishd() [0x4f0aee]\r\n 0x4f1098: /opt/varnish/sbin/varnishd() [0x4f1098]\r\n 0x4f2183: /opt/varnish/sbin/varnishd(VCLS_Poll+0x2c6) [0x4f2183]\r\n ```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/101/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/101/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/102","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/102/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/102/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/102/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/102","id":1801475335,"node_id":"I_kwDOBBOOTM5rYFUH","number":102,"title":"Director Layering triggers domain_timeout, consequently no backend is returned","user":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804422,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjI=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/bug","name":"bug","color":"ee0701","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2023-07-12T17:49:01Z","updated_at":"2023-07-14T13:33:39Z","closed_at":"2023-07-14T13:33:39Z","author_association":"OWNER","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"When layering a dynamic director under another director, the last use is not updated and, when the domain timeout expires, the director stops returning backends (`FetchError Director ONTOP returned no backend` with `ONTOP` being the director having configured a dynamic domain as a backend).\r\nI guess this use case makes the whole concept of a domain timeout useless, but I'll need to ponder this for a bit.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/102/reactions","total_count":1,"+1":1,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/102/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/103","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/103/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/103/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/103/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/103","id":1820210930,"node_id":"PR_kwDOBBOOTM5WU6-n","number":103,"title":"Add resolver fallback to the null resolver (getaddrinfo)","user":{"login":"delthas","id":1863865,"node_id":"MDQ6VXNlcjE4NjM4NjU=","avatar_url":"https://avatars.githubusercontent.com/u/1863865?v=4","gravatar_id":"","url":"https://api.github.com/users/delthas","html_url":"https://github.com/delthas","followers_url":"https://api.github.com/users/delthas/followers","following_url":"https://api.github.com/users/delthas/following{/other_user}","gists_url":"https://api.github.com/users/delthas/gists{/gist_id}","starred_url":"https://api.github.com/users/delthas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/delthas/subscriptions","organizations_url":"https://api.github.com/users/delthas/orgs","repos_url":"https://api.github.com/users/delthas/repos","events_url":"https://api.github.com/users/delthas/events{/privacy}","received_events_url":"https://api.github.com/users/delthas/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2023-07-25T12:22:05Z","updated_at":"2024-01-28T19:21:27Z","closed_at":null,"author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/103","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/103","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/103.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/103.patch","merged_at":null},"body":"This enables a best-effort, two-step resolution when a resolver is configured:\r\n- if the DNS resolver returns any domain, that record is used with its corresponding TTL\r\n- otherwise, the module tries resolving the name with the default, NULL resolver, which is just a wrapper over getaddrinfo\r\n * if the resolution succeeds, this was likely a domain in /etc/hosts or an IP literal, which was not known by the DNS server. The associated record has no TTL value and uses the default director TTL.\r\n * if the resolution fails, this was likely a bad domain. No records are stored and a new request is made after the default director TTL, as was done previously.\r\n\r\n-----\r\n\r\nThe patch is somewhat dumb, it just wraps the resolve logic in a loop that can iterate twice. The goal was to minimize the size of `git diff -w`.\r\n\r\nThis causes the module to log Lookup & Results & Error twice in case we do the fallback attempt, which could be a nice side-effect (we can investigate a DNS error in varnishlog but see that it still succeeded). I don't have a strong opinion about this one.\r\n\r\nFeel free to amend and merge if you'd like. Otherwise I can make changes. :smile: ","closed_by":null,"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/103/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/103/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/104","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/104/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/104/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/104/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/104","id":1913624666,"node_id":"I_kwDOBBOOTM5yD5ha","number":104,"title":"implicit declaration of function 'IS_CLI'","user":{"login":"BernardRobbins","id":959230,"node_id":"MDQ6VXNlcjk1OTIzMA==","avatar_url":"https://avatars.githubusercontent.com/u/959230?v=4","gravatar_id":"","url":"https://api.github.com/users/BernardRobbins","html_url":"https://github.com/BernardRobbins","followers_url":"https://api.github.com/users/BernardRobbins/followers","following_url":"https://api.github.com/users/BernardRobbins/following{/other_user}","gists_url":"https://api.github.com/users/BernardRobbins/gists{/gist_id}","starred_url":"https://api.github.com/users/BernardRobbins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BernardRobbins/subscriptions","organizations_url":"https://api.github.com/users/BernardRobbins/orgs","repos_url":"https://api.github.com/users/BernardRobbins/repos","events_url":"https://api.github.com/users/BernardRobbins/events{/privacy}","received_events_url":"https://api.github.com/users/BernardRobbins/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2023-09-26T14:19:06Z","updated_at":"2023-09-26T14:29:16Z","closed_at":"2023-09-26T14:29:16Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Compiling varnish 7.3 & libvmod-dynamic-master from source on AL2023.\r\nVarnish is running fine.\r\n\r\nRunning make gives me this error:\r\n\r\n`make[2]: Entering directory '/home/ec2-user/libvmod-dynamic-master/src'\r\n CC vmod_dynamic.lo\r\nvmod_dynamic.c: In function 'dom_healthy':\r\nvmod_dynamic.c:319:31: error: implicit declaration of function 'IS_CLI' [-Werror=implicit-function-declaration]\r\n 319 | if (retval || IS_CLI())\r\n | ^~~~~~\r\ncc1: all warnings being treated as errors\r\nmake[2]: *** [Makefile:708: vmod_dynamic.lo] Error 1\r\nmake[2]: Leaving directory '/home/ec2-user/libvmod-dynamic-master/src'\r\nmake[1]: *** [Makefile:500: all-recursive] Error 1\r\nmake[1]: Leaving directory '/home/ec2-user/libvmod-dynamic-master'\r\nmake: *** [Makefile:411: all] Error 2\r\n`\r\n\r\nmake -v\r\nGNU Make 4.3\r\nBuilt for x86_64-amazon-linux-gnu\r\n\r\nvarnishd -V\r\nvarnishd (varnish-7.3.0 revision 84d79120b6d17b11819a663a93160743f293e63f)\r\n\r\ngcc -v\r\ngcc version 11.4.1 20230605 (Red Hat 11.4.1-2) (GCC)","closed_by":{"login":"BernardRobbins","id":959230,"node_id":"MDQ6VXNlcjk1OTIzMA==","avatar_url":"https://avatars.githubusercontent.com/u/959230?v=4","gravatar_id":"","url":"https://api.github.com/users/BernardRobbins","html_url":"https://github.com/BernardRobbins","followers_url":"https://api.github.com/users/BernardRobbins/followers","following_url":"https://api.github.com/users/BernardRobbins/following{/other_user}","gists_url":"https://api.github.com/users/BernardRobbins/gists{/gist_id}","starred_url":"https://api.github.com/users/BernardRobbins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BernardRobbins/subscriptions","organizations_url":"https://api.github.com/users/BernardRobbins/orgs","repos_url":"https://api.github.com/users/BernardRobbins/repos","events_url":"https://api.github.com/users/BernardRobbins/events{/privacy}","received_events_url":"https://api.github.com/users/BernardRobbins/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/104/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/104/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/105","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/105/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/105/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/105/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/105","id":1931814034,"node_id":"I_kwDOBBOOTM5zJSSS","number":105,"title":"assertion `(dom->status == DYNAMIC_ST_STARTING)` failing sporadically","user":{"login":"kaiburjack","id":72760888,"node_id":"MDQ6VXNlcjcyNzYwODg4","avatar_url":"https://avatars.githubusercontent.com/u/72760888?v=4","gravatar_id":"","url":"https://api.github.com/users/kaiburjack","html_url":"https://github.com/kaiburjack","followers_url":"https://api.github.com/users/kaiburjack/followers","following_url":"https://api.github.com/users/kaiburjack/following{/other_user}","gists_url":"https://api.github.com/users/kaiburjack/gists{/gist_id}","starred_url":"https://api.github.com/users/kaiburjack/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kaiburjack/subscriptions","organizations_url":"https://api.github.com/users/kaiburjack/orgs","repos_url":"https://api.github.com/users/kaiburjack/repos","events_url":"https://api.github.com/users/kaiburjack/events{/privacy}","received_events_url":"https://api.github.com/users/kaiburjack/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":3,"created_at":"2023-10-08T13:53:12Z","updated_at":"2023-10-17T09:28:29Z","closed_at":"2023-10-17T09:21:42Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"## Description\r\n\r\nWe are currently evaluating Varnish as a cache behind an ingress in our Kubernetes setup.\r\nFor this, we use the varnish:7.4.1-alpine Docker image, which also contains this libvmod-dynamic module.\r\nWe then use a very simple VCL to begin with:\r\n```\r\nvcl 4.1;\r\nimport dynamic;\r\nbackend default none;\r\nsub vcl_init {\r\n new d = dynamic.director(port = \"80\");\r\n}\r\nsub vcl_recv {\r\n set req.backend_hint = d.backend(req.http.host);\r\n}\r\n```\r\nAs a side-note: This is also used with an Istio service mesh, so in the end Istio will determine the actual destination IP to route to after Varnish sends the request to the supposed `req.http.host` backend based on the HTTP Host/Authority header.\r\n\r\nSo far so good. Everything works well but occasionally we see this assertion failing:\r\nhttps://github.com/nigoroll/libvmod-dynamic/blob/master/src/vmod_dynamic.c#L788\r\n\r\nThis does not happen very often (only about 1 or 2 times a day), but it does happen and I wonder, why.\r\n\r\n## Initial analysis\r\n\r\nLooking at the code, the function where this assertion fails is the entrypoint function for a pthread spawned by https://github.com/nigoroll/libvmod-dynamic/blob/master/src/vmod_dynamic.c#L1012 .\r\n\r\nBefore the thread is spawned, the `dom->status` is set to the asserted `DYNAMIC_ST_STARTING;`.\r\n\r\nAnd both the writing and reading of `dom->status` are covered by a lock/mutex.\r\nAnd there is definitely a happens-before relation between the code setting `dom->status = DYNAMIC_ST_STARTING;` and the pthread function seeing the value of `dom->status`.\r\n*However* there is no guarantee that another event in `dom_event` might not set a _different_ value for `dom->status` after the processing of the `VCL_EVENT_WARM` event and the effective start of the pthread function in a separately spawned thread. Could there be maybe a `VCL_EVENT_COLD` event fired right after the `VCL_EVENT_WARM` which would set `dom->status` again to a different value, making the assertion then fail?\r\n\r\nComing to think of the actual assertion `dom->status == DYNAMIC_ST_STARTING`: What is being asserted there and why?\r\nBecause the while loop directly afterwards will also check if the condition for whether the thread should run is still true `while (dom->status <= DYNAMIC_ST_ACTIVE) {` and I think this would also cover the check of `status == DYNAMIC_ST_STARTING`, since `DYNAMIC_ST_STARTING <= DYNAMIC_ST_ACTIVE` would be true as well.\r\n\r\n## stdout/stderr output of Varnish\r\n\r\nThe following are what Varnish's container will output to stdout/stderr when the assertion fails and the child process is killed and restarted:\r\n```\r\nError: Child (254) died signal=6\r\nError: Child (254) Panic at: Sat, 07 Oct 2023 22:15:50 GMT\r\nAssert error in dom_lookup_thread(), vmod_dynamic.c line 788:\r\n Condition(dom->status == DYNAMIC_ST_STARTING) not true.\r\nversion = varnish-7.4.1 revision d5a5aa9cc879320840ca467ddbb7df0f99c9ba0f, vrt api = 18.0\r\nident = Linux,5.15.120+,x86_64,-jnone,-smalloc,-sdefault,-hcritbit,epoll\r\nnow = 1659349.487516 (mono), 1696716950.705925 (real)\r\nBacktrace:\r\n ip=0x5ccdac571cdf sp=0x7b10d72ae240\r\n ip=0x5ccdac5d089b sp=0x7b10d72ae390\r\n ip=0x7b10d75e061c sp=0x7b10d72ae3d0 \r\n ip=0x7b10dde66285 sp=0x7b10d72aeac0 \r\nargv = {\r\n [0] = \\\"varnishd\\\",\r\n [1] = \\\"-F\\\",\r\n [2] = \\\"-f\\\",\r\n [3] = \\\"/etc/varnish/default.vcl\\\",\r\n [4] = \\\"-a\\\",\r\n [5] = \\\"http=:8080,HTTP\\\",\r\n [6] = \\\"-a\\\",\r\n [7] = \\\"proxy=:8443,PROXY\\\",\r\n [8] = \\\"-p\\\",\r\n [9] = \\\"feature=+http2\\\",\r\n [10] = \\\"-s\\\",\r\n [11] = \\\"malloc,1073741824\\\",\r\n [12] = \\\"-n\\\",\r\n [13] = \\\"/tmp/varnish_workdir\\\",\r\n [14] = \\\"-t\\\",\r\n [15] = \\\"5s\\\",\r\n [16] = \\\"-p\\\",\r\n [17] = \\\"default_grace=10s\\\",\r\n [18] = \\\"-p\\\",\r\n [19] = \\\"default_keep=0s\\\",\r\n}\r\npthread.self = 0x7b10d72aeb38\r\npthread.attr = {\r\n guard = 8192,\r\n stack_bottom = 0x7b10d728e000,\r\n stack_top = 0x7b10d72aeb08,\r\n stack_size = 133896,\r\n}\r\nthr.req = NULL\r\nthr.busyobj = NULL\r\nthr.worker = NULL\r\nvmods = {\r\n std = {0x7b10d858cbc0, Varnish 7.4.1 d5a5aa9cc879320840ca467ddbb7df0f99c9ba0f, 0.0},\r\n dynamic = {0x7b10d858cc30, Varnish 7.4.1 d5a5aa9cc879320840ca467ddbb7df0f99c9ba0f, 18.0},\r\n basicauth = {0x7b10d858cca0, Varnish 7.4.1 d5a5aa9cc879320840ca467ddbb7df0f99c9ba0f, 0.0},\r\n},\r\npools = {\r\n pool = 0x7b10d8c68c20 {\r\n nidle = 93,\r\n nthr = 100,\r\n lqueue = 0\r\n },\r\n pool = 0x7b10d8c68d50 {\r\n nidle = 96,\r\n nthr = 100,\r\n lqueue = 0\r\n },\r\n},\r\n\r\n\r\nDebug: Child cleanup complete\r\nDebug: Child (480) Started\r\nChild launched OK\r\nInfo: Child (480) said Child starts\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/105/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/105/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/106","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/106/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/106/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/106/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/106","id":2057031869,"node_id":"I_kwDOBBOOTM56m9C9","number":106,"title":"Varnish 7.4","user":{"login":"ronald-sz","id":97725423,"node_id":"U_kgDOBdMr7w","avatar_url":"https://avatars.githubusercontent.com/u/97725423?v=4","gravatar_id":"","url":"https://api.github.com/users/ronald-sz","html_url":"https://github.com/ronald-sz","followers_url":"https://api.github.com/users/ronald-sz/followers","following_url":"https://api.github.com/users/ronald-sz/following{/other_user}","gists_url":"https://api.github.com/users/ronald-sz/gists{/gist_id}","starred_url":"https://api.github.com/users/ronald-sz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ronald-sz/subscriptions","organizations_url":"https://api.github.com/users/ronald-sz/orgs","repos_url":"https://api.github.com/users/ronald-sz/repos","events_url":"https://api.github.com/users/ronald-sz/events{/privacy}","received_events_url":"https://api.github.com/users/ronald-sz/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":3,"created_at":"2023-12-27T07:44:20Z","updated_at":"2024-01-28T19:19:35Z","closed_at":"2024-01-09T15:37:31Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi Nils,\r\n\r\nis master ready for Varnish 7.4? Could you please create a branch for 7.4?\r\n\r\nThank you and all the best,\r\nRonald","closed_by":{"login":"ronald-sz","id":97725423,"node_id":"U_kgDOBdMr7w","avatar_url":"https://avatars.githubusercontent.com/u/97725423?v=4","gravatar_id":"","url":"https://api.github.com/users/ronald-sz","html_url":"https://github.com/ronald-sz","followers_url":"https://api.github.com/users/ronald-sz/followers","following_url":"https://api.github.com/users/ronald-sz/following{/other_user}","gists_url":"https://api.github.com/users/ronald-sz/gists{/gist_id}","starred_url":"https://api.github.com/users/ronald-sz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ronald-sz/subscriptions","organizations_url":"https://api.github.com/users/ronald-sz/orgs","repos_url":"https://api.github.com/users/ronald-sz/repos","events_url":"https://api.github.com/users/ronald-sz/events{/privacy}","received_events_url":"https://api.github.com/users/ronald-sz/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/106/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/106/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/107","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/107/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/107/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/107/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/107","id":2067347632,"node_id":"I_kwDOBBOOTM57OTiw","number":107,"title":"Assert error in dom_release(): Condition((dom->thread) == 0) not true","user":{"login":"delthas","id":1863865,"node_id":"MDQ6VXNlcjE4NjM4NjU=","avatar_url":"https://avatars.githubusercontent.com/u/1863865?v=4","gravatar_id":"","url":"https://api.github.com/users/delthas","html_url":"https://github.com/delthas","followers_url":"https://api.github.com/users/delthas/followers","following_url":"https://api.github.com/users/delthas/following{/other_user}","gists_url":"https://api.github.com/users/delthas/gists{/gist_id}","starred_url":"https://api.github.com/users/delthas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/delthas/subscriptions","organizations_url":"https://api.github.com/users/delthas/orgs","repos_url":"https://api.github.com/users/delthas/repos","events_url":"https://api.github.com/users/delthas/events{/privacy}","received_events_url":"https://api.github.com/users/delthas/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":5,"created_at":"2024-01-05T13:24:41Z","updated_at":"2024-01-05T20:55:40Z","closed_at":"2024-01-05T20:54:53Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi,\r\n\r\n*(Following our discussion on IRC, I'm opening an issue.)*\r\n\r\nI got a panic in libvmod-dynamic after reloading Varnish (varnishreload, so loading a new VCL, using it, and discarding an older one), running https://github.com/nigoroll/libvmod-dynamic/commit/2d51da74680e849c8411bcd6d85cd53c149b3052 against Varnish 7.3.0.\r\n\r\nLooks like the panic is caused when handling a VCL_EVENT_COLD event, when releasing a dynamic director.\r\n\r\nPanic annotated with some locations:\r\n```\r\nAssert error in dom_release(), vmod_dynamic.c line 952:\r\n Condition((dom->thread) == 0) not true.\r\nBacktrace:\r\n 0x5609d924f872: /usr/sbin/varnishd(+0x5b872) [0x5609d924f872] -> pan_ic\r\n 0x5609d92cc745: /usr/sbin/varnishd(VAS_Fail+0x45) [0x5609d92cc745]\r\n 0x7564a4065fe2: ./vmod_cache/_vmod_dynamic.29b766e616262ab0ef9252419367ce48fbf642168ba34fc382b1742a77dac5c4(+0x4fe2) [0x7564a4065fe2] -> (dom_destroy ?) -> dom_release\r\n 0x5609d927186a: /usr/sbin/varnishd(+0x7d86a) [0x5609d927186a] -> vcldir_deref\r\n 0x7564a40662fa: ./vmod_cache/_vmod_dynamic.29b766e616262ab0ef9252419367ce48fbf642168ba34fc382b1742a77dac5c4(+0x52fa) [0x7564a40662fa] (? guessed from the code) dynamic_stop -> dynamic_gc_expired -> dom_free -> VRT_DelDirector\r\n 0x7564a4069156: ./vmod_cache/_vmod_dynamic.29b766e616262ab0ef9252419367ce48fbf642168ba34fc382b1742a77dac5c4(vmod_event+0x176) [0x7564a4069156] -> vmod_event (VCL_EVENT_COLD)\r\n 0x754e303bc5b5: vcl_reload_20231121_143229_2498323.1700577149.771996/vgc.so(+0x305b5) [0x754e303bc5b5]\r\n 0x5609d925fd71: /usr/sbin/varnishd(+0x6bd71) [0x5609d925fd71] -> vcl_send_event (VCL_EVENT_COLD)\r\n 0x5609d926027d: /usr/sbin/varnishd(+0x6c27d) [0x5609d926027d] -> vcl_set_state (0)\r\n 0x5609d9261fb8: /usr/sbin/varnishd(VCL_Poll+0xe8) [0x5609d9261fb8] -> VCL_Poll\r\n```\r\n\r\nAccording to our discussion on IRC; this could have been solved by https://github.com/nigoroll/libvmod-dynamic/commit/b54c48849a0ffb940f87d641c0b13584cb21540e, but I'm running a version after that commit.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/107/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/107/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/108","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/108/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/108/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/108/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/108","id":2072231214,"node_id":"I_kwDOBBOOTM57g70u","number":108,"title":"Assert: Dynamic Backends can only be added to warm VCLs","user":{"login":"delthas","id":1863865,"node_id":"MDQ6VXNlcjE4NjM4NjU=","avatar_url":"https://avatars.githubusercontent.com/u/1863865?v=4","gravatar_id":"","url":"https://api.github.com/users/delthas","html_url":"https://github.com/delthas","followers_url":"https://api.github.com/users/delthas/followers","following_url":"https://api.github.com/users/delthas/following{/other_user}","gists_url":"https://api.github.com/users/delthas/gists{/gist_id}","starred_url":"https://api.github.com/users/delthas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/delthas/subscriptions","organizations_url":"https://api.github.com/users/delthas/orgs","repos_url":"https://api.github.com/users/delthas/repos","events_url":"https://api.github.com/users/delthas/events{/privacy}","received_events_url":"https://api.github.com/users/delthas/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":4,"created_at":"2024-01-09T11:58:02Z","updated_at":"2024-05-27T10:40:50Z","closed_at":"2024-01-28T19:13:16Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I got the following panic in production:\r\n```\r\nWrong turn at cache/cache_vrt_vcl.c:224:\r\nDynamic Backends can only be added to warm VCLs\r\nBacktrace:\r\n 0x557c3b6a7872: /usr/sbin/varnishd(+0x5b872) [0x557c3b6a7872]\r\n 0x557c3b724745: /usr/sbin/varnishd(VAS_Fail+0x45) [0x557c3b724745]\r\n 0x557c3b6cb1e1: /usr/sbin/varnishd(VRT_AddDirector+0x3d1) [0x557c3b6cb1e1]\r\n 0x557c3b67c023: /usr/sbin/varnishd(VRT_new_backend_clustered+0x4c3) [0x557c3b67c023]\r\n 0x7fc4469918b8: ./vmod_cache/_vmod_dynamic.29b766e616262ab0ef9252419367ce48fbf642168ba34fc382b1742a77dac5c4(+0x68b8) [0x7fc4469918b8]\r\n 0x7fc45f817064: /lib/x86_64-linux-gnu/libpthread.so.0(+0x8064) [0x7fc45f817064]\r\n 0x7fc45f54c62d: /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7fc45f54c62d]\r\n```\r\nCall stack is probably: dom_lookup_thread -> dom_update -> ref_add -> VRT_new_backend -> VRT_new_backend_clustered -> VRT_AddDirector\r\n\r\nCould there possibly be a race condition between the lookup thread that could take a while to look up DNS records, then try to insert the new backends while the VCL was unloaded/set to cooling?\r\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/108/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/108/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/109","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/109/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/109/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/109/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/109","id":2082315931,"node_id":"I_kwDOBBOOTM58HZ6b","number":109,"title":"Assert error in ref_del(): Condition((r->dir) != NULL) not true","user":{"login":"delthas","id":1863865,"node_id":"MDQ6VXNlcjE4NjM4NjU=","avatar_url":"https://avatars.githubusercontent.com/u/1863865?v=4","gravatar_id":"","url":"https://api.github.com/users/delthas","html_url":"https://github.com/delthas","followers_url":"https://api.github.com/users/delthas/followers","following_url":"https://api.github.com/users/delthas/following{/other_user}","gists_url":"https://api.github.com/users/delthas/gists{/gist_id}","starred_url":"https://api.github.com/users/delthas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/delthas/subscriptions","organizations_url":"https://api.github.com/users/delthas/orgs","repos_url":"https://api.github.com/users/delthas/repos","events_url":"https://api.github.com/users/delthas/events{/privacy}","received_events_url":"https://api.github.com/users/delthas/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":5,"created_at":"2024-01-15T16:03:07Z","updated_at":"2024-01-26T17:20:14Z","closed_at":"2024-01-26T17:14:29Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I found an assert with a simple minimum working example.\r\n\r\nRunning against Varnish 7.4.2, against libvmod-dynamic master.\r\n\r\n```\r\nAssert error in ref_del(), vmod_dynamic.c line 427:\r\n Condition((r->dir) != NULL) not true.\r\nBacktrace:\r\n ip=0x5555555c669e sp=0x7fffffffba20 \r\n ip=0x5555556966b5 sp=0x7fffffffbbb0 \r\n ip=0x7fffeab0dad7 sp=0x7fffffffbc00 \r\n ip=0x7fffeab0e120 sp=0x7fffffffbc20 \r\n ip=0x5555556023fa sp=0x7fffffffbc50 \r\n ip=0x5555555fd863 sp=0x7fffffffbc70 \r\n ip=0x5555555fda2e sp=0x7fffffffbc90 \r\n ip=0x7fffeaa958ac sp=0x7fffffffbcc0 \r\n ip=0x7fffeaa98435 sp=0x7fffffffbce0 \r\n ip=0x5555555fd67c sp=0x7fffffffbd00 \r\n ip=0x7fffeaa97a5a sp=0x7fffffffbd30 \r\n ip=0x7fffeaa8c3bf sp=0x7fffffffbd50 \r\n ip=0x5555555e15ad sp=0x7fffffffbd70 \r\n ip=0x5555555e082f sp=0x7fffffffbdd0 \r\n ip=0x5555555e2db3 sp=0x7fffffffbe10 \r\n ip=0x55555569b18c sp=0x7fffffffbe50 \r\n ip=0x55555569ad67 sp=0x7fffffffbe80 \r\n ip=0x555555699ad9 sp=0x7fffffffbee0 \r\n ip=0x5555556994bf sp=0x7fffffffbf50 \r\n ip=0x555555592704 sp=0x7fffffffdfb0 \r\n ip=0x5555555c07ac sp=0x7fffffffdfe0 \r\n ip=0x5555556330e9 sp=0x7fffffffe040 \r\n ip=0x555555632a01 sp=0x7fffffffe0c0 \r\n ip=0x55555563aa60 sp=0x7fffffffe0e0 \r\n ip=0x7ffff7958cd0 sp=0x7fffffffe320 <__libc_init_first+0x90>\r\n ip=0x7ffff7958d8a sp=0x7fffffffe3c0 <__libc_start_main+0x8a>\r\n ip=0x55555557ded5 sp=0x7fffffffe410 <_start+0x25>\r\n```\r\n\r\nThis happens when discarding a VCL.\r\n\r\n---\r\n\r\nTo reproduce, here's a failing VTC (timeout, but the process actually crashes)\r\n\r\n```\r\nvarnishtest \"reload\"\r\n\r\nshell {\r\n\tcat >${tmpdir}/f1 <<-EOF\r\n\tvcl 4.1;\r\n\timport ${vmod_dynamic};\r\n\timport directors;\r\n\r\n\tbackend none none;\r\n\r\n\tsub vcl_init {\r\n\t\tnew dir = directors.fallback();\r\n\t\tnew res = dynamic.resolver();\r\n\t\tnew dyn = dynamic.director(resolver = res.use());\r\n\t\tdir.add_backend(dyn.backend(host={\"example.com\"}, port={\"80\"}) );\r\n\t}\r\n\tEOF\r\n}\r\n\r\nvarnish v1 -cliok \"vcl.load vcl1 ${tmpdir}/f1\"\r\nvarnish v1 -cliok \"vcl.use vcl1\"\r\nvarnish v1 -cliok \"start\"\r\n\r\nvarnish v1 -cliok \"vcl.load vcl2 ${tmpdir}/f1\"\r\nvarnish v1 -cliok \"vcl.use vcl2\"\r\nvarnish v1 -cliok \"vcl.discard vcl1\"\r\n\r\nvarnish v1 -cliok \"vcl.load vcl3 ${tmpdir}/f1\"\r\nvarnish v1 -cliok \"vcl.use vcl3\"\r\nvarnish v1 -cliok \"vcl.discard vcl2\"\r\n\r\nvarnish v1 -cliok \"vcl.load vcl4 ${tmpdir}/f1\"\r\nvarnish v1 -cliok \"vcl.use vcl4\"\r\nvarnish v1 -cliok \"vcl.discard vcl3\"\r\n\r\nvarnish v1 -cliok \"vcl.load vcl5 ${tmpdir}/f1\"\r\nvarnish v1 -cliok \"vcl.use vcl5\"\r\nvarnish v1 -cliok \"vcl.discard vcl4\"\r\n```\r\n\r\n---\r\n\r\nYou can't see the panic when using the VTC, so I'm instead doing:\r\n\r\ncrash.vcl:\r\n```\r\nvcl 4.1;\r\nimport dynamic from \".../libvmod-dynamic/src/.libs/libvmod_dynamic.so\";\r\nimport directors;\r\n\r\nbackend proforma none;\r\n\r\nsub vcl_init {\r\n new dir = directors.fallback();\r\n new res = dynamic.resolver();\r\n new dyn = dynamic.director(resolver = res.use());\r\n dir.add_backend(dyn.backend(host={\"example.com\"}, port={\"80\"}) );\r\n}\r\n```\r\n\r\nreload.sh:\r\n```\r\n#!/bin/bash\r\nvarnishadm vcl.load v1 crash.vcl\r\nvarnishadm vcl.use v1\r\nvarnishadm vcl.discard boot\r\nfor i in $(seq 2 100); do\r\nvarnishadm vcl.load v$i crash.vcl\r\nvarnishadm vcl.use v$i\r\nvarnishadm vcl.discard v$((i-1))\r\nsleep 0.1\r\ndone\r\n```\r\n\r\n```\r\nvarnishd -F -j none -p \"debug=+vmod_so_keep\" -a :12333 -f crash.vcl\r\nreload.sh\r\n```\r\n\r\nAnd with this I can systematically reproduce the panic and get the trace.\r\n\r\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/109/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/109/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/110","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/110/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/110/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/110/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/110","id":2106304036,"node_id":"I_kwDOBBOOTM59i6Yk","number":110,"title":"deadlock between lookup thread / VRT_AddDirector() and VDI_Event(..., VCL_EVENT_COLD)","user":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":6,"created_at":"2024-01-29T19:56:19Z","updated_at":"2024-02-05T23:46:49Z","closed_at":"2024-02-05T23:46:49Z","author_association":"OWNER","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"@delthas reported another issue based on a test case which I could have looked at in more detail earlier (I did not because I did not want to use `example.com`, but I really should have):\r\n\r\n(I have slightly modified the test case - @delthas, do you agree to add it?)\r\n\r\n```\r\nvarnishtest \"Reloading after creating backend in init\"\r\n\r\nfeature cmd \"getent hosts example.com\"\r\n\r\n# contributed by delthas, added with minor modifications\r\n\r\nshell {\r\n\tcat >${tmpdir}/f1 <<-EOF\r\n\tvcl 4.1;\r\n\timport ${vmod_dynamic};\r\n\timport directors;\r\n\r\n\tbackend none none;\r\n\r\n\tsub vcl_init {\r\n\t\tnew dir = directors.fallback();\r\n\t\tnew res = dynamic.resolver();\r\n\t\tnew dyn = dynamic.director(domain_usage_timeout = 0.1s, resolver = res.use());\r\n\t\tdir.add_backend(dyn.backend(host={\"example.com\"}, port={\"80\"}) );\r\n\t}\r\n\tEOF\r\n}\r\n\r\nvarnish v1 -cliok \"vcl.load vcl1 ${tmpdir}/f1\"\r\nvarnish v1 -cliok \"vcl.use vcl1\"\r\nvarnish v1 -cliok \"start\"\r\n\r\nvarnish v1 -cliok \"vcl.load vcl2 ${tmpdir}/f1\"\r\nvarnish v1 -cliok \"vcl.use vcl2\"\r\nvarnish v1 -cliok \"vcl.discard vcl1\"\r\n```\r\n\r\nthe issue here is that `VDI_Event(..., VCL_EVENT_COLD)` waits for the lookup threads to finish while holding the `vcl_mtx`, which prevents the lookup threads to ... finish:\r\n\r\n```c\r\n#5 0x00007fa9c72b0e76 in dom_event (dir=, ev=) at vmod_dynamic.c:1041\r\n#6 0x000055d6f1c1e84d in VDI_Event (d=0x7fa9c6e1e7d0, ev=VCL_EVENT_COLD) at cache/cache_director.c:277\r\n#7 0x000055d6f1c61bfc in vcl_BackendEvent (vcl=0x7fa9c6e451e0, e=VCL_EVENT_COLD) at cache/cache_vcl.c:449\r\n#8 0x000055d6f1c61068 in vcl_set_state (vcl=0x7fa9c6e451e0, state=0x7fa9c6e28390 \"0cold\", msg=0x7ffc69699e08) at cache/cache_vcl.c:597\r\n#9 0x000055d6f1c62905 in vcl_cli_state (cli=0x7fa9c6ed29d0, av=0x7fa9c6e2c580, priv=0x0) at cache/cache_vcl.c:861\r\n#10 0x000055d6f1d11f22 in cls_dispatch (cli=0x7fa9c6ed29d0, cs=0x7fa9c6e22b30, av=0x7fa9c6e2c580, ac=3) at vcli_serve.c:273\r\n#11 0x000055d6f1d11a0d in cls_exec (cfd=0x7fa9c6ed29a0, av=0x7fa9c6e2c580, ac=3) at vcli_serve.c:324\r\n#12 0x000055d6f1d108a6 in cls_feed (cfd=0x7fa9c6ed29a0, p=0x7ffc69699f94 \"\\n2.1706557731.695251/vgc.so 1auto\\no\\nloneTable\", \r\n e=0x7ffc69699f95 \"2.1706557731.695251/vgc.so 1auto\\no\\nloneTable\") at vcli_serve.c:412\r\n#13 0x000055d6f1d1036a in VCLS_Poll (cs=0x7fa9c6e22b30, cli=0x7fa9c6ed29d0, timeout=-1) at vcli_serve.c:617\r\n#14 0x000055d6f1c18c12 in CLI_Run () at cache/cache_cli.c:110\r\n```\r\n\r\n```c\r\n#4 0x000055d6f1c40ca4 in Lck__Lock (lck=0x55d6f1db57f8 , p=0x55d6f1d45aec \"VRT_AddDirector\", l=212) at cache/cache_lck.c:124\r\n#5 0x000055d6f1c7bfd3 in VRT_AddDirector (ctx=0x7fa9bbd7df90, m=0x55d6f1da7260 , priv=0x7fa9ba821780, \r\n fmt=0x55d6f1d42f7f \"%s\") at cache/cache_vrt_vcl.c:212\r\n#6 0x000055d6f1c09c4d in VRT_new_backend_clustered (ctx=0x7fa9bbd7df90, vc=0x0, vrt=0x7fa9bbd7deb0, via=0x0)\r\n at cache/cache_backend.c:737\r\n#7 0x000055d6f1c0a632 in VRT_new_backend (ctx=0x7fa9bbd7df90, vrt=0x7fa9bbd7deb0, via=0x0) at cache/cache_backend.c:755\r\n#8 0x00007fa9c72b24b4 in ref_add (r=0x7fa9ba827720, ctx=0x7fa9bbd7df90) at vmod_dynamic.c:617\r\n#9 dom_update (now=1706557732.7551613, priv=, res=0x7fa9c72c2ba0 , dom=0x7fa9c6e44100)\r\n at vmod_dynamic.c:728\r\n#10 dom_lookup_thread (priv=0x7fa9c6e44100) at vmod_dynamic.c:819\r\n#11 0x00007fa9c77c9044 in start_thread (arg=) at ./nptl/pthread_create.c:442\r\n#12 0x00007fa9c784961c in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81\r\n```\r\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/110/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/110/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/111","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/111/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/111/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/111/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/111","id":2138443008,"node_id":"I_kwDOBBOOTM5_dg0A","number":111,"title":"unit test issues tests/service/basic","user":{"login":"halittiryaki","id":29786283,"node_id":"MDQ6VXNlcjI5Nzg2Mjgz","avatar_url":"https://avatars.githubusercontent.com/u/29786283?v=4","gravatar_id":"","url":"https://api.github.com/users/halittiryaki","html_url":"https://github.com/halittiryaki","followers_url":"https://api.github.com/users/halittiryaki/followers","following_url":"https://api.github.com/users/halittiryaki/following{/other_user}","gists_url":"https://api.github.com/users/halittiryaki/gists{/gist_id}","starred_url":"https://api.github.com/users/halittiryaki/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/halittiryaki/subscriptions","organizations_url":"https://api.github.com/users/halittiryaki/orgs","repos_url":"https://api.github.com/users/halittiryaki/repos","events_url":"https://api.github.com/users/halittiryaki/events{/privacy}","received_events_url":"https://api.github.com/users/halittiryaki/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2024-02-16T11:49:12Z","updated_at":"2024-02-17T20:51:46Z","closed_at":"2024-02-17T20:51:46Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"tests/service/basic always fails. any ideas why?\r\n\r\nhere is the log output:\r\n\r\n```\r\n113.2 FAIL: tests/service/basic\r\n113.2 =========================\r\n113.2 \r\n113.2 **** dT 0.000\r\n113.2 * top TEST ./tests/service/basic.vtc starting\r\n113.2 **** top extmacro def pkg_version=7.4.2\r\n113.2 **** top extmacro def pkg_branch=7.4\r\n113.2 **** top extmacro def pwd=/usr/src/libvmod-dynamic/src\r\n113.2 **** top extmacro def date(...)\r\n113.2 **** top extmacro def string(...)\r\n113.2 **** top extmacro def vmod_dynamic=dynamic from \"/usr/src/libvmod-dynamic/src/.libs/libvmod_dynamic.so\"\r\n113.2 **** top extmacro def localhost=127.0.0.1\r\n113.2 **** top extmacro def bad_backend=127.0.0.1:34783\r\n113.2 **** top extmacro def listen_addr=127.0.0.1:0\r\n113.2 **** top extmacro def bad_ip=192.0.2.255\r\n113.2 **** top macro def testdir=/usr/src/libvmod-dynamic/src/./tests/service\r\n113.2 **** top macro def tmpdir=/tmp/vtc.6616.0c8774d2\r\n113.2 **** top macro def vtcid=vtc.6616.0c8774d2\r\n113.2 ** top === varnishtest \"service smoke test\"\r\n113.2 * top VTEST service smoke test\r\n113.2 ** top === feature cmd {dig @b.root-servers.net. a.root-servers.net. >/...\r\n113.2 **** dT 0.162\r\n113.2 ** top === varnish v1 -vcl {\r\n113.2 **** dT 0.163\r\n113.2 ** v1 Launch\r\n113.2 *** v1 CMD: cd ${pwd} && exec varnishd -d -n /tmp/vtc.6616.0c8774d2/v1 -i v1 -p debug=+vcl_keep -p debug=+vmod_so_keep -p debug=+vsm_keep -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p thread_pool_min=10 -p debug=+vtc_mode -p vsl_mask=+Debug,+H2RxHdr,+H2RxBody -p h2_initial_window_size=1m -p h2_rx_window_low_water=64k -a '127.0.0.1:0' -M '127.0.0.1 32961' -P /tmp/vtc.6616.0c8774d2/v1/varnishd.pid \r\n113.2 *** v1 CMD: cd /usr/src/libvmod-dynamic/src && exec varnishd -d -n /tmp/vtc.6616.0c8774d2/v1 -i v1 -p debug=+vcl_keep -p debug=+vmod_so_keep -p debug=+vsm_keep -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p thread_pool_min=10 -p debug=+vtc_mode -p vsl_mask=+Debug,+H2RxHdr,+H2RxBody -p h2_initial_window_size=1m -p h2_rx_window_low_water=64k -a '127.0.0.1:0' -M '127.0.0.1 32961' -P /tmp/vtc.6616.0c8774d2/v1/varnishd.pid \r\n113.2 *** v1 PID: 6625\r\n113.2 **** v1 macro def v1_pid=6625\r\n113.2 **** v1 macro def v1_name=/tmp/vtc.6616.0c8774d2/v1\r\n113.2 **** dT 0.170\r\n113.2 *** v1 debug|Debug: Version: varnish-7.4.2 revision cd1d10ab53a6f6115b2b4f3b2a1da94c1f749f80\r\n113.2 *** v1 debug|Debug: Platform: Linux,6.1.21.2-microsoft-standard-WSL2+,x86_64,-jnone,-sdefault,-sdefault,-hcritbit\r\n113.2 *** v1 debug|200 334 \r\n113.2 *** v1 debug|-----------------------------\r\n113.2 *** v1 debug|Varnish Cache CLI 1.0\r\n113.2 *** v1 debug|-----------------------------\r\n113.2 *** v1 debug|Linux,6.1.21.2-microsoft-standard-WSL2+,x86_64,-jnone,-sdefault,-sdefault,-hcritbit\r\n113.2 *** v1 debug|varnish-7.4.2 revision cd1d10ab53a6f6115b2b4f3b2a1da94c1f749f80\r\n113.2 *** v1 debug|\r\n113.2 *** v1 debug|Type 'help' for command list.\r\n113.2 *** v1 debug|Type 'quit' to close CLI session.\r\n113.2 *** v1 debug|Type 'start' to launch worker process.\r\n113.2 *** v1 debug|\r\n113.2 **** dT 0.270\r\n113.2 **** v1 CLIPOLL 1 0x1 0x0 0x0\r\n113.2 *** v1 CLI connection fd = 5\r\n113.2 *** v1 CLI RX 107\r\n113.2 **** v1 CLI RX|drotryltqdjwwoecnnqazieftftfdooh\r\n113.2 **** v1 CLI RX|\r\n113.2 **** v1 CLI RX|Authentication required.\r\n113.2 **** v1 CLI TX|auth b5df73e06088d59c977725d021704506e8320db5b28ea9b8bd8dd729867e78c6\r\n113.2 *** v1 CLI RX 200\r\n113.2 **** v1 CLI RX|-----------------------------\r\n113.2 **** v1 CLI RX|Varnish Cache CLI 1.0\r\n113.2 **** v1 CLI RX|-----------------------------\r\n113.2 **** v1 CLI RX|Linux,6.1.21.2-microsoft-standard-WSL2+,x86_64,-jnone,-sdefault,-sdefault,-hcritbit\r\n113.2 **** v1 CLI RX|varnish-7.4.2 revision cd1d10ab53a6f6115b2b4f3b2a1da94c1f749f80\r\n113.2 **** v1 CLI RX|\r\n113.2 **** v1 CLI RX|Type 'help' for command list.\r\n113.2 **** v1 CLI RX|Type 'quit' to close CLI session.\r\n113.2 **** v1 CLI RX|Type 'start' to launch worker process.\r\n113.2 **** v1 CLI TX|vcl.inline vcl1 << %XJEIFLH|)Xspa8P\r\n113.2 **** v1 CLI TX|vcl 4.1;\r\n113.2 **** v1 CLI TX|\r\n113.2 **** v1 CLI TX|\\timport dynamic from \"/usr/src/libvmod-dynamic/src/.libs/libvmod_dynamic.so\";\r\n113.2 **** v1 CLI TX|\r\n113.2 **** v1 CLI TX|\\tbackend proforma none;\r\n113.2 **** v1 CLI TX|\r\n113.2 **** v1 CLI TX|\\tsub vcl_init {\r\n113.2 **** v1 CLI TX|\\t\\tnew r1 = dynamic.resolver();\r\n113.2 **** v1 CLI TX|\\t\\tnew d1 = dynamic.director(\r\n113.2 **** v1 CLI TX|\\t\\t resolver = r1.use());\r\n113.2 **** v1 CLI TX|\\t\\td1.debug(true);\r\n113.2 **** v1 CLI TX|\\t}\r\n113.2 **** v1 CLI TX|\r\n113.2 **** v1 CLI TX|\\tsub vcl_recv {\r\n113.2 **** v1 CLI TX|\\t\\tset req.backend_hint =\r\n113.2 **** v1 CLI TX|\\t\\t d1.service(\"_test._tcp.vmod-dynamic.uplex.de\");\r\n113.2 **** v1 CLI TX|\\t\\tset req.http.Host = \"varnish-cache.org\";\r\n113.2 **** v1 CLI TX|\\t}\r\n113.2 **** v1 CLI TX|\r\n113.2 **** v1 CLI TX|\\tsub vcl_backend_fetch {\r\n113.2 **** v1 CLI TX|\\t\\tset bereq.first_byte_timeout = 1s;\r\n113.2 **** v1 CLI TX|\\t\\tset bereq.connect_timeout = 1s;\r\n113.2 **** v1 CLI TX|\\t}\r\n113.2 **** v1 CLI TX|\r\n113.2 **** v1 CLI TX|\\tsub vcl_backend_response {\r\n113.2 **** v1 CLI TX|\\t\\tset beresp.http.backend = beresp.backend;\r\n113.2 **** v1 CLI TX|\\t}\r\n113.2 **** v1 CLI TX|\r\n113.2 **** v1 CLI TX|\\tsub vcl_backend_error {\r\n113.2 **** v1 CLI TX|\\t\\tset beresp.http.backend = beresp.backend;\r\n113.2 **** v1 CLI TX|\\t}\r\n113.2 **** v1 CLI TX|\r\n113.2 **** v1 CLI TX|%XJEIFLH|)Xspa8P\r\n113.2 **** dT 0.371\r\n113.2 *** v1 vsl|No VSL chunk found (child not started ?)\r\n113.2 **** dT 0.471\r\n113.2 *** v1 vsl|No VSL chunk found (child not started ?)\r\n113.2 **** dT 0.571\r\n113.2 *** v1 vsl|No VSL chunk found (child not started ?)\r\n113.2 **** dT 0.662\r\n113.2 *** v1 CLI RX 200\r\n113.2 **** v1 CLI RX|VCL compiled.\r\n113.2 **** v1 CLI TX|vcl.use vcl1\r\n113.2 **** dT 0.663\r\n113.2 *** v1 CLI RX 200\r\n113.2 **** v1 CLI RX|VCL 'vcl1' now active\r\n113.2 ** v1 Start\r\n113.2 **** v1 CLI TX|start\r\n113.2 **** dT 0.671\r\n113.2 *** v1 vsl|No VSL chunk found (child not started ?)\r\n113.2 **** dT 0.706\r\n113.2 *** v1 debug|Debug: Child (6639) Started\r\n113.2 **** dT 0.730\r\n113.2 *** v1 debug|Child launched OK\r\n113.2 **** dT 0.736\r\n113.2 *** v1 CLI RX 200\r\n113.2 *** v1 debug|Info: Child (6639) said Child starts\r\n113.2 *** v1 wait-running\r\n113.2 **** v1 CLI TX|status\r\n113.2 **** dT 0.772\r\n113.2 **** v1 vsl| 0 CLI - Rd vcl.load \"vcl1\" vcl_vcl1.1708082841.201980/vgc.so 1auto\r\n113.2 **** v1 vsl| 0 CLI - Wr 200 52 Loaded \"vcl_vcl1.1708082841.201980/vgc.so\" as \"vcl1\"\r\n113.2 **** v1 vsl| 0 CLI - Rd vcl.use \"vcl1\"\r\n113.2 **** v1 vsl| 0 CLI - Wr 200 0 \r\n113.2 **** v1 vsl| 0 CLI - Rd start\r\n113.2 **** v1 vsl| 0 Debug - sockopt: Setting SO_LINGER for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 0 Debug - sockopt: Setting SO_KEEPALIVE for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 0 Debug - sockopt: Setting SO_SNDTIMEO for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 0 Debug - sockopt: Setting SO_RCVTIMEO for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 0 Debug - sockopt: Setting TCP_NODELAY for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 0 Debug - sockopt: Setting TCP_KEEPIDLE for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 0 Debug - sockopt: Setting TCP_KEEPCNT for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 0 Debug - sockopt: Setting TCP_KEEPINTVL for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 0 CLI - Wr 200 0 \r\n113.2 **** dT 0.785\r\n113.2 *** v1 CLI RX 200\r\n113.2 **** v1 CLI RX|Child in state running\r\n113.2 **** v1 CLI TX|debug.listen_address\r\n113.2 **** dT 0.835\r\n113.2 *** v1 CLI RX 200\r\n113.2 **** v1 CLI RX|a0 127.0.0.1 38125\r\n113.2 **** v1 CLI TX|debug.xid 1000\r\n113.2 **** dT 0.872\r\n113.2 **** v1 vsl| 0 CLI - Rd debug.listen_address \r\n113.2 **** v1 vsl| 0 CLI - Wr 200 19 a0 127.0.0.1 38125\r\n113.2 \r\n113.2 **** dT 0.885\r\n113.2 *** v1 CLI RX 200\r\n113.2 **** v1 CLI RX|XID is 1000 chunk 1\r\n113.2 **** v1 CLI TX|debug.listen_address\r\n113.2 **** dT 0.935\r\n113.2 *** v1 CLI RX 200\r\n113.2 **** v1 CLI RX|a0 127.0.0.1 38125\r\n113.2 ** v1 Listen on 127.0.0.1 38125\r\n113.2 **** v1 macro def v1_addr=127.0.0.1\r\n113.2 **** v1 macro def v1_port=38125\r\n113.2 **** v1 macro def v1_sock=127.0.0.1:38125\r\n113.2 **** v1 macro def v1_a0_addr=127.0.0.1\r\n113.2 **** v1 macro def v1_a0_port=38125\r\n113.2 **** v1 macro def v1_a0_sock=127.0.0.1:38125\r\n113.2 ** top === varnish v1 -cli \"backend.list\"\r\n113.2 **** v1 CLI TX|backend.list\r\n113.2 **** dT 0.972\r\n113.2 **** v1 vsl| 0 CLI - Rd debug.xid 1000 \r\n113.2 **** v1 vsl| 0 CLI - Wr 200 19 XID is 1000 chunk 1\r\n113.2 **** v1 vsl| 0 CLI - Rd debug.listen_address \r\n113.2 **** v1 vsl| 0 CLI - Wr 200 19 a0 127.0.0.1 38125\r\n113.2 \r\n113.2 **** dT 0.985\r\n113.2 *** v1 CLI RX 200\r\n113.2 **** v1 CLI RX|Backend name Admin Probe Health Last change\r\n113.2 ** v1 CLI 200 \r\n113.2 ** top === client c1 {\r\n113.2 ** c1 Starting client\r\n113.2 ** c1 Waiting for client\r\n113.2 ** c1 Started on 127.0.0.1:38125 (1 iterations)\r\n113.2 *** c1 Connect to 127.0.0.1:38125\r\n113.2 *** c1 connected fd 15 from 127.0.0.1 55250 to 127.0.0.1:38125\r\n113.2 ** c1 === txreq\r\n113.2 **** c1 txreq|GET / HTTP/1.1\\r\r\n113.2 **** c1 txreq|Host: 127.0.0.1\\r\r\n113.2 **** c1 txreq|User-Agent: c1\\r\r\n113.2 **** c1 txreq|\\r\r\n113.2 ** c1 === rxresp\r\n113.2 **** dT 0.992\r\n113.2 **** c1 rxhdrlen = 0\r\n113.2 ---- c1 HTTP header is incomplete\r\n113.2 * top RESETTING after ./tests/service/basic.vtc\r\n113.2 ** v1 Wait\r\n113.2 **** v1 CLI TX|panic.show\r\n113.2 *** v1 debug|Error: Child (6639) died signal=11\r\n113.2 **** dT 0.993\r\n113.2 *** v1 debug|Debug: Child cleanup complete\r\n113.2 **** dT 1.035\r\n113.2 *** v1 CLI RX 300\r\n113.2 **** v1 CLI RX|Child has not panicked or panic has been cleared\r\n113.2 *** v1 debug|Info: manager stopping child\r\n113.2 *** v1 debug|Info: manager dies\r\n113.2 **** dT 1.038\r\n113.2 **** v1 STDOUT EOF\r\n113.2 **** dT 1.072\r\n113.2 **** v1 vsl| 0 CLI - Rd backend.list \r\n113.2 **** v1 vsl| 0 CLI - Wr 200 55 Backend name Admin Probe Health Last change\r\n113.2 \r\n113.2 **** v1 vsl| 1000 Begin c sess 0 HTTP/1\r\n113.2 **** v1 vsl| 1000 SessOpen c 127.0.0.1 55250 a0 127.0.0.1 38125 1708082841.917190 22\r\n113.2 **** v1 vsl| 1000 Debug c sockopt: SO_LINGER may be inherited for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 1000 Debug c sockopt: SO_KEEPALIVE may be inherited for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 1000 Debug c sockopt: SO_SNDTIMEO may be inherited for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 1000 Debug c sockopt: SO_RCVTIMEO may be inherited for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 1000 Debug c sockopt: TCP_NODELAY may be inherited for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 1000 Debug c sockopt: TCP_KEEPIDLE may be inherited for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 1000 Debug c sockopt: TCP_KEEPCNT may be inherited for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 1000 Debug c sockopt: TCP_KEEPINTVL may be inherited for a0=127.0.0.1:38125\r\n113.2 **** v1 vsl| 1000 Link c req 1001 rxreq\r\n113.2 **** v1 vsl| 0 Debug - vmod-dynamic vcl1 d1 _test._tcp.vmod-dynamic.uplex.de event 1\r\n113.2 **** v1 vsl| 0 Debug - vmod-dynamic vcl1 d1 _test._tcp.vmod-dynamic.uplex.de event 1\r\n113.2 **** v1 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(srv _test._tcp.vmod-dynamic.uplex.de) Lookup: 1708082841.917460 0.000000 0.000000\r\n113.2 **** v1 vsl| 0 Debug - vmod-dynamic vcl1 d1 _test._tcp.vmod-dynamic.uplex.de wait-active\r\n113.2 ** v1 WAIT4 pid=6625 status=0x4000 (user 0.332437 sys 0.094343)\r\n113.2 * v1 Expected exit: 0x0 signal: 0 core: 0\r\n113.2 ---- v1 Bad exit status: 0x4000 exit 0x40 signal 0 core 0\r\n113.2 * top failure during reset\r\n113.2 # top TEST ./tests/service/basic.vtc FAILED (1.073) exit=2\r\n113.2 FAIL tests/service/basic.vtc (exit status: 2)\r\n```","closed_by":{"login":"halittiryaki","id":29786283,"node_id":"MDQ6VXNlcjI5Nzg2Mjgz","avatar_url":"https://avatars.githubusercontent.com/u/29786283?v=4","gravatar_id":"","url":"https://api.github.com/users/halittiryaki","html_url":"https://github.com/halittiryaki","followers_url":"https://api.github.com/users/halittiryaki/followers","following_url":"https://api.github.com/users/halittiryaki/following{/other_user}","gists_url":"https://api.github.com/users/halittiryaki/gists{/gist_id}","starred_url":"https://api.github.com/users/halittiryaki/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/halittiryaki/subscriptions","organizations_url":"https://api.github.com/users/halittiryaki/orgs","repos_url":"https://api.github.com/users/halittiryaki/repos","events_url":"https://api.github.com/users/halittiryaki/events{/privacy}","received_events_url":"https://api.github.com/users/halittiryaki/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/111/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/111/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/112","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/112/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/112/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/112/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/112","id":2149582378,"node_id":"I_kwDOBBOOTM6AIAYq","number":112,"title":"Use after free in layer_reolad.vtc from Debug messages","user":{"login":"stevendore","id":19986241,"node_id":"MDQ6VXNlcjE5OTg2MjQx","avatar_url":"https://avatars.githubusercontent.com/u/19986241?v=4","gravatar_id":"","url":"https://api.github.com/users/stevendore","html_url":"https://github.com/stevendore","followers_url":"https://api.github.com/users/stevendore/followers","following_url":"https://api.github.com/users/stevendore/following{/other_user}","gists_url":"https://api.github.com/users/stevendore/gists{/gist_id}","starred_url":"https://api.github.com/users/stevendore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stevendore/subscriptions","organizations_url":"https://api.github.com/users/stevendore/orgs","repos_url":"https://api.github.com/users/stevendore/repos","events_url":"https://api.github.com/users/stevendore/events{/privacy}","received_events_url":"https://api.github.com/users/stevendore/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2024-02-22T17:40:07Z","updated_at":"2024-03-07T21:04:32Z","closed_at":"2024-03-07T21:04:32Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"When running `layer_reolad.vtc` with ASAN CFLAGS, ASAN finds a `heap-use-after-free` in `dom_destroy()`. This is found using latest Varnish Cache and latest libvmod dynamic. The issue could be hidden by allocating the fallback director after the dynamic director, this results in the director/domain being freed in the \"right\" order.\r\n\r\nSteps to reproduce:\r\n1. Configure varnish with `--enable-asan` and then before make set enviorment vairables `ASAN_OPTIONS=abort_on_error=1,detect_odr_violation=1,detect_leaks=1,detect_stack_use_after_return=1,detect_invalid_pointer_pairs=1,handle_segv=0,handle_sigbus=0,use_sigaltstack=0,disable_coredump=0` and `LSAN_OPTIONS=abort_on_error=1,use_sigaltstack=0,suppressions=${path_to}/varnish-cache/tools/lsan.suppr`\r\n2. configure libvmod-dynamic with `CFLAGS='-fsanitize=address' ./configure` and export the same SAN options as Varnish \r\n3. run make check\r\n\r\nCollapsible VTC Log: \r\n
\r\n toggle view log\r\n\r\n```\r\n\r\n**** dT 0.000\r\n* top TEST ./tests/layer_reload.vtc starting\r\n**** top extmacro def pkg_version=trunk\r\n**** top extmacro def pkg_branch=trunk\r\n**** top extmacro def pwd=/home/swojcik/code/libvmod-dynamic/src\r\n**** top extmacro def date(...)\r\n**** top extmacro def string(...)\r\n**** top extmacro def vmod_dynamic=dynamic from \"/home/swojcik/code/libvmod-dynamic/src/.libs/libvmod_dynamic.so\"\r\n**** top extmacro def localhost=127.0.0.1\r\n**** top extmacro def bad_backend=127.0.0.1:41381\r\n**** top extmacro def listen_addr=127.0.0.1:0\r\n**** top extmacro def bad_ip=192.0.2.255\r\n**** top macro def testdir=/home/swojcik/code/libvmod-dynamic/src/./tests\r\n**** top macro def tmpdir=/tmp/vtc.2872792.2223da65\r\n**** top macro def vtcid=vtc.2872792.2223da65\r\n** top === varnishtest \"Reloading after creating backend in init\"\r\n* top VTEST Reloading after creating backend in init\r\n** top === feature cmd \"getent hosts example.com\"\r\n**** dT 0.024\r\n** top === shell {\r\n**** top shell_cmd|exec 2>&1 ; \r\n**** top shell_cmd|\\tcat >/tmp/vtc.2872792.2223da65/f1 <<-EOF\r\n**** top shell_cmd|\\tvcl 4.1;\r\n**** top shell_cmd|\\timport dynamic from \"/home/swojcik/code/libvmod-dynamic/src/.libs/libvmod_dynamic.so\";\r\n**** top shell_cmd|\\timport directors;\r\n**** top shell_cmd|\r\n**** top shell_cmd|\\tbackend none none;\r\n**** top shell_cmd|\r\n**** top shell_cmd|\\tsub vcl_init {\r\n**** top shell_cmd|\\t\\tnew dir = directors.fallback();\r\n**** top shell_cmd|\\t\\tnew res = dynamic.resolver();\r\n**** top shell_cmd|\\t\\tnew dyn = dynamic.director(domain_usage_timeout = 0.1s, resolver = res.use());\r\n**** top shell_cmd|\\t\\tdir.add_backend(dyn.backend(host={\"example.com\"}, port={\"80\"}) );\r\n**** top shell_cmd|\\t}\r\n**** top shell_cmd|\\tEOF\r\n**** dT 0.028\r\n**** top shell_status = 0x0000\r\n** top === varnish v1 -cliok \"vcl.load vcl1 ${tmpdir}/f1\"\r\n**** dT 0.033\r\n** v1 Launch\r\n*** v1 CMD: cd ${pwd} && exec varnishd -d -n /tmp/vtc.2872792.2223da65/v1 -i v1 -p debug=+vcl_keep -p debug=+vmod_so_keep -p debug=+vsm_keep -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p thread_pool_min=10 -p debug=+vtc_mode -p vsl_mask=+Debug,+H2RxHdr,+H2RxBody -p h2_initial_window_size=1m -p h2_rx_window_low_water=64k -a '127.0.0.1:0' -M '127.0.0.1 38685' -P /tmp/vtc.2872792.2223da65/v1/varnishd.pid \r\n*** v1 CMD: cd /home/swojcik/code/libvmod-dynamic/src && exec varnishd -d -n /tmp/vtc.2872792.2223da65/v1 -i v1 -p debug=+vcl_keep -p debug=+vmod_so_keep -p debug=+vsm_keep -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p thread_pool_min=10 -p debug=+vtc_mode -p vsl_mask=+Debug,+H2RxHdr,+H2RxBody -p h2_initial_window_size=1m -p h2_rx_window_low_water=64k -a '127.0.0.1:0' -M '127.0.0.1 38685' -P /tmp/vtc.2872792.2223da65/v1/varnishd.pid \r\n**** dT 0.034\r\n*** v1 PID: 2872812\r\n**** v1 macro def v1_pid=2872812\r\n**** v1 macro def v1_name=/tmp/vtc.2872792.2223da65/v1\r\n**** dT 0.054\r\n*** v1 debug|Debug: Version: varnish-trunk revision d77da13b9baf268196075bda0808d0d2e8721470\r\n*** v1 debug|Debug: Platform: Linux,6.5.0-17-generic,x86_64,-jnone,-sdefault,-sdefault,-hcritbit\r\n*** v1 debug|200 317 \r\n*** v1 debug|-----------------------------\r\n*** v1 debug|Varnish Cache CLI 1.0\r\n*** v1 debug|-----------------------------\r\n*** v1 debug|Linux,6.5.0-17-generic,x86_64,-jnone,-sdefault,-sdefault,-hcritbit\r\n*** v1 debug|varnish-trunk revision d77da13b9baf268196075bda0808d0d2e8721470\r\n*** v1 debug|\r\n*** v1 debug|Type 'help' for command list.\r\n*** v1 debug|Type 'quit' to close CLI session.\r\n*** v1 debug|Type 'start' to launch worker process.\r\n*** v1 debug|\r\n**** dT 0.153\r\n**** v1 CLIPOLL 1 0x1 0x0 0x0\r\n*** v1 CLI connection fd = 4\r\n**** dT 0.154\r\n*** v1 CLI RX 107\r\n**** v1 CLI RX|ygvcsiionoelhdqmokrfteicbjzhrzuc\r\n**** v1 CLI RX|\r\n**** v1 CLI RX|Authentication required.\r\n**** v1 CLI TX|auth 90608ea81d2bbbfa7774fd79c416390009fbabba31979c1a26762f0a0fe266fd\r\n**** dT 0.155\r\n*** v1 CLI RX 200\r\n**** v1 CLI RX|-----------------------------\r\n**** v1 CLI RX|Varnish Cache CLI 1.0\r\n**** v1 CLI RX|-----------------------------\r\n**** v1 CLI RX|Linux,6.5.0-17-generic,x86_64,-jnone,-sdefault,-sdefault,-hcritbit\r\n**** v1 CLI RX|varnish-trunk revision d77da13b9baf268196075bda0808d0d2e8721470\r\n**** v1 CLI RX|\r\n**** v1 CLI RX|Type 'help' for command list.\r\n**** v1 CLI RX|Type 'quit' to close CLI session.\r\n**** v1 CLI RX|Type 'start' to launch worker process.\r\n**** dT 0.156\r\n**** v1 CLI TX|vcl.load vcl1 /tmp/vtc.2872792.2223da65/f1\r\n**** dT 0.256\r\n*** v1 vsl|No VSL chunk found (child not started ?)\r\n**** dT 0.356\r\n*** v1 vsl|No VSL chunk found (child not started ?)\r\n**** dT 0.456\r\n*** v1 vsl|No VSL chunk found (child not started ?)\r\n**** dT 0.556\r\n*** v1 vsl|No VSL chunk found (child not started ?)\r\n**** dT 0.657\r\n*** v1 vsl|No VSL chunk found (child not started ?)\r\n**** dT 0.757\r\n*** v1 vsl|No VSL chunk found (child not started ?)\r\n**** dT 0.832\r\n*** v1 CLI RX 200\r\n**** v1 CLI RX|Message from VCC-compiler:\r\n**** v1 CLI RX|-----------------------------------------------------\r\n**** v1 CLI RX|Suppressions used:\r\n**** v1 CLI RX| count bytes template\r\n**** v1 CLI RX| 2 136 HSH_config\r\n**** v1 CLI RX| 9 360 vcc_\r\n**** v1 CLI RX|-----------------------------------------------------\r\n**** v1 CLI RX|\r\n**** v1 CLI RX|Message from dlopen:\r\n**** v1 CLI RX|-----------------------------------------------------\r\n**** v1 CLI RX|Suppressions used:\r\n**** v1 CLI RX| count bytes template\r\n**** v1 CLI RX| 2 136 HSH_config\r\n**** v1 CLI RX|-----------------------------------------------------\r\n**** v1 CLI RX|\r\n**** v1 CLI RX|VCL compiled.\r\n** v1 CLI 200 \r\n** top === varnish v1 -cliok \"vcl.use vcl1\"\r\n**** v1 CLI TX|vcl.use vcl1\r\n*** v1 CLI RX 200\r\n**** v1 CLI RX|VCL 'vcl1' now active\r\n** v1 CLI 200 \r\n** top === varnish v1 -cliok \"start\"\r\n**** v1 CLI TX|start\r\n**** dT 0.857\r\n*** v1 vsl|No VSL chunk found (child not started ?)\r\n**** dT 0.875\r\n*** v1 debug|Debug: Child (2872880) Started\r\n**** dT 0.900\r\n*** v1 debug|Child launched OK\r\n**** dT 0.913\r\n*** v1 CLI RX 200\r\n** v1 CLI 200 \r\n** top === varnish v1 -cliok \"vcl.load vcl2 ${tmpdir}/f1\"\r\n*** v1 debug|Info: Child (2872880) said Child starts\r\n**** v1 CLI TX|vcl.load vcl2 /tmp/vtc.2872792.2223da65/f1\r\n**** dT 0.957\r\n**** v1 vsl| 0 CLI - Rd vcl.load \"vcl1\" vcl_vcl1.1708618810.078643/vgc.so 1auto\r\n**** v1 vsl| 0 Timestamp - vmod-dynamic vcl1.dyn(example.com:80) Lookup: 1708618810.794116 0.000000 0.000000\r\n**** v1 vsl| 0 CLI - Wr 200 52 Loaded \"vcl_vcl1.1708618810.078643/vgc.so\" as \"vcl1\"\r\n**** v1 vsl| 0 CLI - Rd vcl.use \"vcl1\"\r\n**** v1 vsl| 0 CLI - Wr 200 0 \r\n**** v1 vsl| 0 CLI - Rd start\r\n**** v1 vsl| 0 Debug - sockopt: Setting SO_LINGER for a0=127.0.0.1:45489\r\n**** v1 vsl| 0 Debug - sockopt: Setting SO_KEEPALIVE for a0=127.0.0.1:45489\r\n**** v1 vsl| 0 Debug - sockopt: Setting SO_SNDTIMEO for a0=127.0.0.1:45489\r\n**** v1 vsl| 0 Debug - sockopt: Setting SO_RCVTIMEO for a0=127.0.0.1:45489\r\n**** v1 vsl| 0 Debug - sockopt: Setting TCP_NODELAY for a0=127.0.0.1:45489\r\n**** v1 vsl| 0 Debug - sockopt: Setting TCP_KEEPIDLE for a0=127.0.0.1:45489\r\n**** v1 vsl| 0 Debug - sockopt: Setting TCP_KEEPCNT for a0=127.0.0.1:45489\r\n**** v1 vsl| 0 Debug - sockopt: Setting TCP_KEEPINTVL for a0=127.0.0.1:45489\r\n**** v1 vsl| 0 CLI - Wr 200 0 \r\n**** v1 vsl| 0 Timestamp - vmod-dynamic vcl1.dyn(example.com:80) Results: 1708618810.802496 0.008379 0.008379\r\n**** v1 vsl| 0 Error - vmod-dynamic vcl1 dyn example.com:80 getdns 901 (Queries for the name yielded all negative responses)\r\n**** dT 1.057\r\n**** v1 vsl| 0 VCL_Log - vmod-dynamic vcl1 dyn example.com:80 timeout\r\n**** v1 vsl| 0 Timestamp - vmod-dynamic vcl1.dyn(example.com:80) Lookup: 1708618810.881813 0.000000 0.000000\r\n**** v1 vsl| 0 Timestamp - vmod-dynamic vcl1.dyn(example.com:80) Results: 1708618810.887776 0.005963 0.005963\r\n**** v1 vsl| 0 Error - vmod-dynamic vcl1 dyn example.com:80 getdns 901 (Queries for the name yielded all negative responses)\r\n**** dT 1.568\r\n*** v1 CLI RX 200\r\n**** v1 CLI RX|Message from VCC-compiler:\r\n**** v1 CLI RX|-----------------------------------------------------\r\n**** v1 CLI RX|Suppressions used:\r\n**** v1 CLI RX| count bytes template\r\n**** v1 CLI RX| 2 136 HSH_config\r\n**** v1 CLI RX| 9 360 vcc_\r\n**** v1 CLI RX|-----------------------------------------------------\r\n**** v1 CLI RX|\r\n**** v1 CLI RX|Message from dlopen:\r\n**** v1 CLI RX|-----------------------------------------------------\r\n**** v1 CLI RX|Suppressions used:\r\n**** v1 CLI RX| count bytes template\r\n**** v1 CLI RX| 2 136 HSH_config\r\n**** v1 CLI RX|-----------------------------------------------------\r\n**** v1 CLI RX|\r\n** v1 CLI 200 \r\n** top === varnish v1 -cliok \"vcl.use vcl2\"\r\n**** v1 CLI TX|vcl.use vcl2\r\n*** v1 CLI RX 200\r\n**** v1 CLI RX|VCL 'vcl2' now active\r\n** v1 CLI 200 \r\n** top === varnish v1 -cliok \"vcl.discard vcl1\"\r\n**** v1 CLI TX|vcl.discard vcl1\r\n**** dT 1.658\r\n**** v1 vsl| 0 CLI - Rd vcl.load vcl2 vcl_vcl2.1708618810.794719/vgc.so 1auto\r\n**** v1 vsl| 0 CLI - Wr 200 52 Loaded \"vcl_vcl2.1708618810.794719/vgc.so\" as \"vcl2\"\r\n**** v1 vsl| 0 Timestamp - vmod-dynamic vcl2.dyn(example.com:80) Lookup: 1708618811.449167 0.000000 0.000000\r\n**** v1 vsl| 0 CLI - Rd vcl.use vcl2\r\n**** v1 vsl| 0 CLI - Wr 200 0 \r\n**** v1 vsl| 0 Timestamp - vmod-dynamic vcl2.dyn(example.com:80) Results: 1708618811.457072 0.007905 0.007905\r\n**** v1 vsl| 0 Error - vmod-dynamic vcl2 dyn example.com:80 getdns 901 (Queries for the name yielded all negative responses)\r\n**** v1 vsl| 0 CLI - Rd vcl.state vcl1 0cold\r\n**** v1 vsl| 0 Timestamp - vmod-dynamic vcl1.dyn(example.com:80) Done: 1708618811.494451 0.000000 0.000000\r\n**** v1 vsl| 0 VCL_Log - vmod-dynamic vcl1 dyn example.com:80 deleted (expired)\r\n**** v1 vsl| 0 CLI - Wr 200 0 \r\n**** v1 vsl| 0 CLI - Rd vcl.discard vcl1\r\n**** dT 1.758\r\n**** v1 vsl| 0 VCL_Log - vmod-dynamic vcl2 dyn example.com:80 timeout\r\n**** v1 vsl| 0 Timestamp - vmod-dynamic vcl2.dyn(example.com:80) Lookup: 1708618811.542969 0.000000 0.000000\r\n**** v1 vsl| 0 Timestamp - vmod-dynamic vcl2.dyn(example.com:80) Results: 1708618811.547853 0.004884 0.004884\r\n**** v1 vsl| 0 Error - vmod-dynamic vcl2 dyn example.com:80 getdns 901 (Queries for the name yielded all negative responses)\r\n**** dT 2.790\r\n*** v1 debug|Error: Child (2872880) not responding to CLI, killed it.\r\n*** v1 CLI RX 200\r\n** v1 CLI 200 \r\n* top RESETTING after ./tests/layer_reload.vtc\r\n** v1 Wait\r\n**** v1 CLI TX|backend.list\r\n*** v1 debug|Info: Child (2872880) said =================================================================\r\n*** v1 debug|Info: Child (2872880) said ==2872880==ERROR: AddressSanitizer: heap-use-after-free on address 0x6120000119c4 at pc 0x7fad9b650290 bp 0x7ffe80f849a0 sp 0x7ffe80f84990\r\n*** v1 debug|Info: Child (2872880) said READ of size 4 at 0x6120000119c4 thread T0\r\n*** v1 debug|Info: Child (2872880) said #0 0x7fad9b65028f in dom_destroy (vmod_cache/_vmod_dynamic.29b766e616262ab0ef9252419367ce48fbf642168ba34fc382b1742a77dac5c4+0x1f28f)\r\n*** v1 debug|Info: Child (2872880) said #1 0x561c4abfd611 in vcldir_retire cache/cache_vrt_vcl.c:287\r\n*** v1 debug|Info: Child (2872880) said #2 0x561c4abfd611 in vcldir_deref cache/cache_vrt_vcl.c:305\r\n*** v1 debug|Info: Child (2872880) said #3 0x561c4ac00754 in VRT_Assign_Backend cache/cache_vrt_vcl.c:343\r\n*** v1 debug|Info: Child (2872880) said #4 0x7fad998559ef in vdir_release /home/swojcik/code/varnish-cache/vmod/vmod_directors.c:99\r\n*** v1 debug|Info: Child (2872880) said #5 0x561c4ac00420 in VRT_DelDirector cache/cache_vrt_vcl.c:321\r\n*** v1 debug|Info: Child (2872880) said #6 0x7fad9ca2fd0b in VGC_Discard /tmp/vtc.2872792.2223da65/v1/vcl_vcl1.1708618810.078643/vgc.c:4194\r\n*** v1 debug|Info: Child (2872880) said #7 0x7fad9ca2fd0b in VGC_Event /tmp/vtc.2872792.2223da65/v1/vcl_vcl1.1708618810.078643/vgc.c:4287\r\n*** v1 debug|Info: Child (2872880) said #8 0x561c4abdb6e5 in vcl_send_event cache/cache_vcl.c:255\r\n*** v1 debug|Info: Child (2872880) said #9 0x561c4abdf9e2 in VCL_Poll cache/cache_vcl.c:736\r\n*** v1 debug|Info: Child (2872880) said #10 0x561c4abe01c4 in vcl_cli_discard cache/cache_vcl.c:903\r\n*** v1 debug|Info: Child (2872880) said #11 0x561c4acd567f in cls_dispatch /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:273\r\n*** v1 debug|Info: Child (2872880) said #12 0x561c4acd567f in cls_exec /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:324\r\n*** v1 debug|Info: Child (2872880) said #13 0x561c4acd6335 in cls_feed /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:412\r\n*** v1 debug|Info: Child (2872880) said #14 0x561c4acd6335 in VCLS_Poll /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:617\r\n*** v1 debug|Info: Child (2872880) said #15 0x561c4ab66923 in CLI_Run cache/cache_cli.c:110\r\n*** v1 debug|Info: Child (2872880) said #16 0x561c4abac4d9 in child_main cache/cache_main.c:467\r\n*** v1 debug|Info: Child (2872880) said #17 0x561c4ac482df in mgt_launch_child mgt/mgt_child.c:402\r\n*** v1 debug|Info: Child (2872880) said #18 0x561c4acd567f in cls_dispatch /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:273\r\n*** v1 debug|Info: Child (2872880) said #19 0x561c4acd567f in cls_exec /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:324\r\n*** v1 debug|Info: Child (2872880) said #20 0x561c4acd6335 in cls_feed /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:412\r\n*** v1 debug|Info: Child (2872880) said #21 0x561c4acd6335 in VCLS_Poll /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:617\r\n*** v1 debug|Info: Child (2872880) said #22 0x561c4acda316 in VEV_Once /home/swojcik/code/varnish-cache/lib/libvarnish/vev.c:466\r\n*** v1 debug|Info: Child (2872880) said #23 0x561c4acda687 in VEV_Loop /home/swojcik/code/varnish-cache/lib/libvarnish/vev.c:354\r\n*** v1 debug|Info: Child (2872880) said #24 0x561c4ab47691 in main mgt/mgt_main.c:995\r\n*** v1 debug|Info: Child (2872880) said #25 0x7fadb3829d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58\r\n*** v1 debug|Info: Child (2872880) said #26 0x7fadb3829e3f in __libc_start_main_impl ../csu/libc-start.c:392\r\n*** v1 debug|Info: Child (2872880) said #27 0x561c4ab48834 in _start (/opt/varnish/os-main-asan/sbin/varnishd+0x11f834)\r\n*** v1 debug|Info: Child (2872880) said \r\n*** v1 debug|Info: Child (2872880) said 0x6120000119c4 is located 260 bytes inside of 264-byte region [0x6120000118c0,0x6120000119c8)\r\n*** v1 debug|Info: Child (2872880) said freed by thread T0 here:\r\n*** v1 debug|Info: Child (2872880) said #0 0x7fadb40b4537 in __interceptor_free ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:127\r\n*** v1 debug|Info: Child (2872880) said #1 0x7fad9b6540ff in vmod_director__fini (vmod_cache/_vmod_dynamic.29b766e616262ab0ef9252419367ce48fbf642168ba34fc382b1742a77dac5c4+0x230ff)\r\n*** v1 debug|Info: Child (2872880) said #2 0x7fad9ca2fcdd in VGC_Discard /tmp/vtc.2872792.2223da65/v1/vcl_vcl1.1708618810.078643/vgc.c:4186\r\n*** v1 debug|Info: Child (2872880) said #3 0x7fad9ca2fcdd in VGC_Event /tmp/vtc.2872792.2223da65/v1/vcl_vcl1.1708618810.078643/vgc.c:4287\r\n*** v1 debug|Info: Child (2872880) said #4 0x561c4abdb6e5 in vcl_send_event cache/cache_vcl.c:255\r\n*** v1 debug|Info: Child (2872880) said #5 0x561c4abdf9e2 in VCL_Poll cache/cache_vcl.c:736\r\n*** v1 debug|Info: Child (2872880) said #6 0x561c4abe01c4 in vcl_cli_discard cache/cache_vcl.c:903\r\n*** v1 debug|Info: Child (2872880) said #7 0x561c4acd567f in cls_dispatch /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:273\r\n*** v1 debug|Info: Child (2872880) said #8 0x561c4acd567f in cls_exec /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:324\r\n*** v1 debug|Info: Child (2872880) said #9 0x561c4acd6335 in cls_feed /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:412\r\n*** v1 debug|Info: Child (2872880) said #10 0x561c4acd6335 in VCLS_Poll /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:617\r\n*** v1 debug|Info: Child (2872880) said #11 0x561c4ab66923 in CLI_Run cache/cache_cli.c:110\r\n*** v1 debug|Info: Child (2872880) said #12 0x561c4abac4d9 in child_main cache/cache_main.c:467\r\n*** v1 debug|Info: Child (2872880) said #13 0x561c4ac482df in mgt_launch_child mgt/mgt_child.c:402\r\n*** v1 debug|Info: Child (2872880) said #14 0x561c4acd567f in cls_dispatch /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:273\r\n*** v1 debug|Info: Child (2872880) said #15 0x561c4acd567f in cls_exec /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:324\r\n*** v1 debug|Info: Child (2872880) said #16 0x561c4acd6335 in cls_feed /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:412\r\n*** v1 debug|Info: Child (2872880) said #17 0x561c4acd6335 in VCLS_Poll /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:617\r\n*** v1 debug|Info: Child (2872880) said #18 0x561c4acda316 in VEV_Once /home/swojcik/code/varnish-cache/lib/libvarnish/vev.c:466\r\n*** v1 debug|Info: Child (2872880) said #19 0x561c4acda687 in VEV_Loop /home/swojcik/code/varnish-cache/lib/libvarnish/vev.c:354\r\n*** v1 debug|Info: Child (2872880) said #20 0x561c4ab47691 in main mgt/mgt_main.c:995\r\n*** v1 debug|Info: Child (2872880) said #21 0x7fadb3829d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58\r\n*** v1 debug|Info: Child (2872880) said \r\n*** v1 debug|Info: Child (2872880) said previously allocated by thread T0 here:\r\n*** v1 debug|Info: Child (2872880) said #0 0x7fadb40b4a57 in __interceptor_calloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:154\r\n*** v1 debug|Info: Child (2872880) said #1 0x7fad9b65293d in vmod_director__init (vmod_cache/_vmod_dynamic.29b766e616262ab0ef9252419367ce48fbf642168ba34fc382b1742a77dac5c4+0x2193d)\r\n*** v1 debug|Info: Child (2872880) said #2 0x7fad9ca294c3 in VGC_function_vcl_init /tmp/vtc.2872792.2223da65/v1/vcl_vcl1.1708618810.078643/vgc.c:3862\r\n*** v1 debug|Info: Child (2872880) said #3 0x561c4abdb6e5 in vcl_send_event cache/cache_vcl.c:255\r\n*** v1 debug|Info: Child (2872880) said #4 0x561c4abdded6 in vcl_load cache/cache_vcl.c:696\r\n*** v1 debug|Info: Child (2872880) said #5 0x561c4abdded6 in vcl_cli_load cache/cache_vcl.c:843\r\n*** v1 debug|Info: Child (2872880) said #6 0x561c4acd567f in cls_dispatch /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:273\r\n*** v1 debug|Info: Child (2872880) said #7 0x561c4acd567f in cls_exec /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:324\r\n*** v1 debug|Info: Child (2872880) said #8 0x561c4acd6335 in cls_feed /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:412\r\n*** v1 debug|Info: Child (2872880) said #9 0x561c4acd6335 in VCLS_Poll /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:617\r\n*** v1 debug|Info: Child (2872880) said #10 0x561c4ab66923 in CLI_Run cache/cache_cli.c:110\r\n*** v1 debug|Info: Child (2872880) said #11 0x561c4abac4d9 in child_main cache/cache_main.c:467\r\n*** v1 debug|Info: Child (2872880) said #12 0x561c4ac482df in mgt_launch_child mgt/mgt_child.c:402\r\n*** v1 debug|Info: Child (2872880) said #13 0x561c4acd567f in cls_dispatch /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:273\r\n*** v1 debug|Info: Child (2872880) said #14 0x561c4acd567f in cls_exec /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:324\r\n*** v1 debug|Info: Child (2872880) said #15 0x561c4acd6335 in cls_feed /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:412\r\n*** v1 debug|Info: Child (2872880) said #16 0x561c4acd6335 in VCLS_Poll /home/swojcik/code/varnish-cache/lib/libvarnish/vcli_serve.c:617\r\n*** v1 debug|Info: Child (2872880) said #17 0x561c4acda316 in VEV_Once /home/swojcik/code/varnish-cache/lib/libvarnish/vev.c:466\r\n*** v1 debug|Info: Child (2872880) said #18 0x561c4acda687 in VEV_Loop /home/swojcik/code/varnish-cache/lib/libvarnish/vev.c:354\r\n*** v1 debug|Info: Child (2872880) said #19 0x561c4ab47691 in main mgt/mgt_main.c:995\r\n*** v1 debug|Info: Child (2872880) said #20 0x7fadb3829d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58\r\n*** v1 debug|Info: Child (2872880) said \r\n*** v1 debug|Info: Child (2872880) said SUMMARY: AddressSanitizer: heap-use-after-free (vmod_cache/_vmod_dynamic.29b766e616262ab0ef9252419367ce48fbf642168ba34fc382b1742a77dac5c4+0x1f28f) in dom_destroy\r\n*** v1 debug|Info: Child (2872880) said Shadow bytes around the buggy address:\r\n*** v1 debug|Info: Child (2872880) said 0x0c247fffa2e0: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd\r\n*** v1 debug|Info: Child (2872880) said 0x0c247fffa2f0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd\r\n*** v1 debug|Info: Child (2872880) said 0x0c247fffa300: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd\r\n*** v1 debug|Info: Child (2872880) said 0x0c247fffa310: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd\r\n*** v1 debug|Info: Child (2872880) said 0x0c247fffa320: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd\r\n*** v1 debug|Info: Child (2872880) said =>0x0c247fffa330: fd fd fd fd fd fd fd fd[fd]fa fa fa fa fa fa fa\r\n*** v1 debug|Info: Child (2872880) said 0x0c247fffa340: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd\r\n*** v1 debug|Info: Child (2872880) said 0x0c247fffa350: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd\r\n*** v1 debug|Info: Child (2872880) said 0x0c247fffa360: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd\r\n*** v1 debug|Info: Child (2872880) said 0x0c247fffa370: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd\r\n*** v1 debug|Info: Child (2872880) said 0x0c247fffa380: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd\r\n*** v1 debug|Info: Child (2872880) said Shadow byte legend (one shadow byte represents 8 application bytes):\r\n*** v1 debug|Info: Child (2872880) said Addressable: 00\r\n*** v1 debug|Info: Child (2872880) said Partially addressable: 01 02 03 04 05 06 07 \r\n*** v1 debug|Info: Child (2872880) said Heap left redzone: fa\r\n*** v1 debug|Info: Child (2872880) said Freed heap region: fd\r\n*** v1 debug|Info: Child (2872880) said Stack left redzone: f1\r\n*** v1 debug|Info: Child (2872880) said Stack mid redzone: f2\r\n*** v1 debug|Info: Child (2872880) said Stack right redzone: f3\r\n*** v1 debug|Info: Child (2872880) said Stack after return: f5\r\n*** v1 debug|Info: Child (2872880) said Stack use after scope: f8\r\n*** v1 debug|Info: Child (2872880) said Global redzone: f9\r\n*** v1 debug|Info: Child (2872880) said Global init order: f6\r\n*** v1 debug|Info: Child (2872880) said Poisoned by user: f7\r\n*** v1 debug|Info: Child (2872880) said Container overflow: fc\r\n*** v1 debug|Info: Child (2872880) said Array cookie: ac\r\n*** v1 debug|Info: Child (2872880) said Intra object redzone: bb\r\n*** v1 debug|Info: Child (2872880) said ASan internal: fe\r\n*** v1 debug|Info: Child (2872880) said Left alloca redzone: ca\r\n*** v1 debug|Info: Child (2872880) said Right alloca redzone: cb\r\n*** v1 debug|Info: Child (2872880) said Shadow gap: cc\r\n*** v1 debug|Info: Child (2872880) said ==2872880==ABORTING\r\n*** v1 debug|Error: Child (2872880) died signal=6 (core dumped)\r\n*** v1 debug|Error: Child (2872880) Panic at: Thu, 22 Feb 2024 16:20:12 GMT\r\n*** v1 debug|Wrong turn at cache/cache_main.c:328:\r\n*** v1 debug|Signal 6 (Aborted) received at 0x3e8002bd630 si_code -6\r\n*** v1 debug|version = varnish-trunk revision d77da13b9baf268196075bda0808d0d2e8721470, vrt api = 18.1\r\n*** v1 debug|ident = Linux,6.5.0-17-generic,x86_64,-jnone,-sdefault,-sdefault,-hcritbit,epoll\r\n*** v1 debug|now = 324499.612377 (mono), 1708618811.590555 (real)\r\n*** v1 debug|Backtrace:\r\n*** v1 debug| ip=0x561c4abb7dc4 sp=0x7fadafd93b10 \r\n*** v1 debug| ip=0x561c4accff78 sp=0x7fadafd93d40 \r\n*** v1 debug| ip=0x561c4ababb1e sp=0x7fadafd93d90 \r\n*** v1 debug| ip=0x7fadb3842520 sp=0x7fadafd94380 <__sigaction+0x50>\r\n*** v1 debug| ip=0x7fadb38969fc sp=0x7ffe80f839d0 \r\n*** v1 debug| ip=0x7fadb3842476 sp=0x7ffe80f83a90 \r\n*** v1 debug| ip=0x7fadb38287f3 sp=0x7ffe80f83aa0 \r\n*** v1 debug| ip=0x7fadb40d2712 sp=0x7ffe80f83be0 <_ZN11__sanitizer5AbortEv+0x32>\r\n*** v1 debug| ip=0x7fadb40de2cc sp=0x7ffe80f83c90 <_ZN11__sanitizer3DieEv+0x4c>\r\n*** v1 debug| ip=0x7fadb40bd77c sp=0x7ffe80f83cb0 <_ZN6__asan19ScopedInErrorReportD1Ev+0x1ac>\r\n*** v1 debug| ip=0x7fadb40bd015 sp=0x7ffe80f83d00 <_ZN6__asan18ReportGenericErrorEmmmmbmjb+0x125>\r\n*** v1 debug| ip=0x7fadb40bdd3b sp=0x7ffe80f84980 <__asan_report_load4+0x3b>\r\n*** v1 debug| ip=0x7fad9b650290 sp=0x7ffe80f849b0 \r\n*** v1 debug| ip=0x561c4abfd612 sp=0x7ffe80f84a50 \r\n*** v1 debug| ip=0x561c4ac00755 sp=0x7ffe80f84a90 \r\n*** v1 debug| ip=0x7fad998559f0 sp=0x7ffe80f84ad0 \r\n*** v1 debug| ip=0x561c4ac00421 sp=0x7ffe80f84b20 \r\n*** v1 debug| ip=0x7fad9ca2fd0c sp=0x7ffe80f84b40 \r\n*** v1 debug| ip=0x561c4abdb6e6 sp=0x7ffe80f84b60 \r\n*** v1 debug| ip=0x561c4abdf9e3 sp=0x7ffe80f84c30 \r\n*** v1 debug| ip=0x561c4abe01c5 sp=0x7ffe80f84d10 \r\n*** v1 debug| ip=0x561c4acd5680 sp=0x7ffe80f84db0 \r\n*** v1 debug| ip=0x561c4acd6336 sp=0x7ffe80f84e20 \r\n*** v1 debug| ip=0x561c4ab66924 sp=0x7ffe80f87040 \r\n*** v1 debug| ip=0x561c4abac4da sp=0x7ffe80f87060 \r\n*** v1 debug| ip=0x561c4ac482e0 sp=0x7ffe80f871d0 \r\n*** v1 debug| ip=0x561c4acd5680 sp=0x7ffe80f87310 \r\n*** v1 debug| ip=0x561c4acd6336 sp=0x7ffe80f87380 \r\n*** v1 debug| ip=0x561c4acda317 sp=0x7ffe80f895a0 \r\n*** v1 debug| ip=0x561c4acda688 sp=0x7ffe80f89600 \r\n*** v1 debug| ip=0x561c4ab47692 sp=0x7ffe80f89620 \r\n*** v1 debug| ip=0x7fadb3829d90 sp=0x7ffe80f899d0 <__libc_init_first+0x90>\r\n*** v1 debug| ip=0x7fadb3829e40 sp=0x7ffe80f89a70 <__libc_start_main+0x80>\r\n*** v1 debug| ip=0x561c4ab48835 sp=0x7ffe80f89ac0 <_start+0x25>\r\n*** v1 debug|errno = 25 (Inappropriate ioctl for device)\r\n*** v1 debug|argv = {\r\n*** v1 debug| [0] = \\\"varnishd\\\",\r\n*** v1 debug| [1] = \\\"-d\\\",\r\n*** v1 debug| [2] = \\\"-n\\\",\r\n*** v1 debug| [3] = \\\"/tmp/vtc.2872792.2223da65/v1\\\",\r\n*** v1 debug| [4] = \\\"-i\\\",\r\n*** v1 debug| [5] = \\\"v1\\\",\r\n*** v1 debug| [6] = \\\"-p\\\",\r\n*** v1 debug| [7] = \\\"debug=+vcl_keep\\\",\r\n*** v1 debug| [8] = \\\"-p\\\",\r\n*** v1 debug| [9] = \\\"debug=+vmod_so_keep\\\",\r\n*** v1 debug| [10] = \\\"-p\\\",\r\n*** v1 debug| [11] = \\\"debug=+vsm_keep\\\",\r\n*** v1 debug| [12] = \\\"-l\\\",\r\n*** v1 debug| [13] = \\\"2m\\\",\r\n*** v1 debug| [14] = \\\"-p\\\",\r\n*** v1 debug| [15] = \\\"auto_restart=off\\\",\r\n*** v1 debug| [16] = \\\"-p\\\",\r\n*** v1 debug| [17] = \\\"syslog_cli_traffic=off\\\",\r\n*** v1 debug| [18] = \\\"-p\\\",\r\n*** v1 debug| [19] = \\\"thread_pool_min=10\\\",\r\n*** v1 debug| [20] = \\\"-p\\\",\r\n*** v1 debug| [21] = \\\"debug=+vtc_mode\\\",\r\n*** v1 debug| [22] = \\\"-p\\\",\r\n*** v1 debug| [23] = \\\"vsl_mask=+Debug,+H2RxHdr,+H2RxBody\\\",\r\n*** v1 debug| [24] = \\\"-p\\\",\r\n*** v1 debug| [25] = \\\"h2_initial_window_size=1m\\\",\r\n*** v1 debug| [26] = \\\"-p\\\",\r\n*** v1 debug| [27] = \\\"h2_rx_window_low_water=64k\\\",\r\n*** v1 debug| [28] = \\\"-a\\\",\r\n*** v1 debug| [29] = \\\"127.0.0.1:0\\\",\r\n*** v1 debug| [30] = \\\"-M\\\",\r\n*** v1 debug| [31] = \\\"127.0.0.1 38685\\\",\r\n*** v1 debug| [32] = \\\"-P\\\",\r\n*** v1 debug| [33] = \\\"/tmp/vtc.2872792.2223da65/v1/varnishd.pid\\\",\r\n*** v1 debug|}\r\n*** v1 debug|pthread.self = 0x7fadb3ee7040\r\n*** v1 debug|pthread.name = (cache-main)\r\n*** v1 debug|pthread.attr = {\r\n*** v1 debug| guard = 0,\r\n*** v1 debug| stack_bottom = 0x7ffe8078d000,\r\n*** v1 debug| stack_top = 0x7ffe80f8a000,\r\n*** v1 debug| stack_size = 8376320,\r\n*** v1 debug|}\r\n*** v1 debug|thr.req = NULL\r\n*** v1 debug|thr.busyobj = NULL\r\n*** v1 debug|thr.worker = NULL\r\n*** v1 debug|vmods = {\r\n*** v1 debug| dynamic = {0x60b0000005c0, Varnish trunk d77da13b9baf268196075bda0808d0d2e8721470, 18.1},\r\n*** v1 debug| directors = {0x60b000000720, Varnish trunk d77da13b9baf268196075bda0808d0d2e8721470, 0.0},\r\n*** v1 debug|},\r\n*** v1 debug|pools = {\r\n*** v1 debug| pool = 0x612000000040 {\r\n*** v1 debug| nidle = 9,\r\n*** v1 debug| nthr = 10,\r\n*** v1 debug| lqueue = 0\r\n*** v1 debug| },\r\n*** v1 debug| pool = 0x6120000001c0 {\r\n*** v1 debug| nidle = 9,\r\n*** v1 debug| nthr = 10,\r\n*** v1 debug| lqueue = 0\r\n*** v1 debug| },\r\n*** v1 debug|},\r\n*** v1 debug|\r\n*** v1 debug|\r\n*** v1 debug|Debug: Child cleanup complete\r\n**** dT 2.791\r\n*** v1 CLI RX 101\r\n**** v1 CLI RX|Unknown request in manager process (child not running).\r\n**** v1 CLI RX|Type 'help' for more info.\r\n** v1 Stop\r\n**** v1 CLI TX|stop\r\n**** dT 2.833\r\n*** v1 CLI RX 300\r\n**** v1 CLI RX|Child in state stopped\r\n*** v1 wait-stopped\r\n**** v1 CLI TX|status\r\n**** dT 2.877\r\n*** v1 CLI RX 200\r\n**** v1 CLI RX|Child in state stopped\r\n**** v1 CLI TX|panic.show\r\n**** dT 2.925\r\n*** v1 CLI RX 200\r\n**** v1 CLI RX|Panic at: Thu, 22 Feb 2024 16:20:12 GMT\r\n**** v1 CLI RX|Wrong turn at cache/cache_main.c:328:\r\n**** v1 CLI RX|Signal 6 (Aborted) received at 0x3e8002bd630 si_code -6\r\n**** v1 CLI RX|version = varnish-trunk revision d77da13b9baf268196075bda0808d0d2e8721470, vrt api = 18.1\r\n**** v1 CLI RX|ident = Linux,6.5.0-17-generic,x86_64,-jnone,-sdefault,-sdefault,-hcritbit,epoll\r\n**** v1 CLI RX|now = 324499.612377 (mono), 1708618811.590555 (real)\r\n**** v1 CLI RX|Backtrace:\r\n**** v1 CLI RX| ip=0x561c4abb7dc4 sp=0x7fadafd93b10 \r\n**** v1 CLI RX| ip=0x561c4accff78 sp=0x7fadafd93d40 \r\n**** v1 CLI RX| ip=0x561c4ababb1e sp=0x7fadafd93d90 \r\n**** v1 CLI RX| ip=0x7fadb3842520 sp=0x7fadafd94380 <__sigaction+0x50>\r\n**** v1 CLI RX| ip=0x7fadb38969fc sp=0x7ffe80f839d0 \r\n**** v1 CLI RX| ip=0x7fadb3842476 sp=0x7ffe80f83a90 \r\n**** v1 CLI RX| ip=0x7fadb38287f3 sp=0x7ffe80f83aa0 \r\n**** v1 CLI RX| ip=0x7fadb40d2712 sp=0x7ffe80f83be0 <_ZN11__sanitizer5AbortEv+0x32>\r\n**** v1 CLI RX| ip=0x7fadb40de2cc sp=0x7ffe80f83c90 <_ZN11__sanitizer3DieEv+0x4c>\r\n**** v1 CLI RX| ip=0x7fadb40bd77c sp=0x7ffe80f83cb0 <_ZN6__asan19ScopedInErrorReportD1Ev+0x1ac>\r\n**** v1 CLI RX| ip=0x7fadb40bd015 sp=0x7ffe80f83d00 <_ZN6__asan18ReportGenericErrorEmmmmbmjb+0x125>\r\n**** v1 CLI RX| ip=0x7fadb40bdd3b sp=0x7ffe80f84980 <__asan_report_load4+0x3b>\r\n**** v1 CLI RX| ip=0x7fad9b650290 sp=0x7ffe80f849b0 \r\n**** v1 CLI RX| ip=0x561c4abfd612 sp=0x7ffe80f84a50 \r\n**** v1 CLI RX| ip=0x561c4ac00755 sp=0x7ffe80f84a90 \r\n**** v1 CLI RX| ip=0x7fad998559f0 sp=0x7ffe80f84ad0 \r\n**** v1 CLI RX| ip=0x561c4ac00421 sp=0x7ffe80f84b20 \r\n**** v1 CLI RX| ip=0x7fad9ca2fd0c sp=0x7ffe80f84b40 \r\n**** v1 CLI RX| ip=0x561c4abdb6e6 sp=0x7ffe80f84b60 \r\n**** v1 CLI RX| ip=0x561c4abdf9e3 sp=0x7ffe80f84c30 \r\n**** v1 CLI RX| ip=0x561c4abe01c5 sp=0x7ffe80f84d10 \r\n**** v1 CLI RX| ip=0x561c4acd5680 sp=0x7ffe80f84db0 \r\n**** v1 CLI RX| ip=0x561c4acd6336 sp=0x7ffe80f84e20 \r\n**** v1 CLI RX| ip=0x561c4ab66924 sp=0x7ffe80f87040 \r\n**** v1 CLI RX| ip=0x561c4abac4da sp=0x7ffe80f87060 \r\n**** v1 CLI RX| ip=0x561c4ac482e0 sp=0x7ffe80f871d0 \r\n**** v1 CLI RX| ip=0x561c4acd5680 sp=0x7ffe80f87310 \r\n**** v1 CLI RX| ip=0x561c4acd6336 sp=0x7ffe80f87380 \r\n**** v1 CLI RX| ip=0x561c4acda317 sp=0x7ffe80f895a0 \r\n**** v1 CLI RX| ip=0x561c4acda688 sp=0x7ffe80f89600 \r\n**** v1 CLI RX| ip=0x561c4ab47692 sp=0x7ffe80f89620 \r\n**** v1 CLI RX| ip=0x7fadb3829d90 sp=0x7ffe80f899d0 <__libc_init_first+0x90>\r\n**** v1 CLI RX| ip=0x7fadb3829e40 sp=0x7ffe80f89a70 <__libc_start_main+0x80>\r\n**** v1 CLI RX| ip=0x561c4ab48835 sp=0x7ffe80f89ac0 <_start+0x25>\r\n**** v1 CLI RX|errno = 25 (Inappropriate ioctl for device)\r\n**** v1 CLI RX|argv = {\r\n**** v1 CLI RX| [0] = \\\"varnishd\\\",\r\n**** v1 CLI RX| [1] = \\\"-d\\\",\r\n**** v1 CLI RX| [2] = \\\"-n\\\",\r\n**** v1 CLI RX| [3] = \\\"/tmp/vtc.2872792.2223da65/v1\\\",\r\n**** v1 CLI RX| [4] = \\\"-i\\\",\r\n**** v1 CLI RX| [5] = \\\"v1\\\",\r\n**** v1 CLI RX| [6] = \\\"-p\\\",\r\n**** v1 CLI RX| [7] = \\\"debug=+vcl_keep\\\",\r\n**** v1 CLI RX| [8] = \\\"-p\\\",\r\n**** v1 CLI RX| [9] = \\\"debug=+vmod_so_keep\\\",\r\n**** v1 CLI RX| [10] = \\\"-p\\\",\r\n**** v1 CLI RX| [11] = \\\"debug=+vsm_keep\\\",\r\n**** v1 CLI RX| [12] = \\\"-l\\\",\r\n**** v1 CLI RX| [13] = \\\"2m\\\",\r\n**** v1 CLI RX| [14] = \\\"-p\\\",\r\n**** v1 CLI RX| [15] = \\\"auto_restart=off\\\",\r\n**** v1 CLI RX| [16] = \\\"-p\\\",\r\n**** v1 CLI RX| [17] = \\\"syslog_cli_traffic=off\\\",\r\n**** v1 CLI RX| [18] = \\\"-p\\\",\r\n**** v1 CLI RX| [19] = \\\"thread_pool_min=10\\\",\r\n**** v1 CLI RX| [20] = \\\"-p\\\",\r\n**** v1 CLI RX| [21] = \\\"debug=+vtc_mode\\\",\r\n**** v1 CLI RX| [22] = \\\"-p\\\",\r\n**** v1 CLI RX| [23] = \\\"vsl_mask=+Debug,+H2RxHdr,+H2RxBody\\\",\r\n**** v1 CLI RX| [24] = \\\"-p\\\",\r\n**** v1 CLI RX| [25] = \\\"h2_initial_window_size=1m\\\",\r\n**** v1 CLI RX| [26] = \\\"-p\\\",\r\n**** v1 CLI RX| [27] = \\\"h2_rx_window_low_water=64k\\\",\r\n**** v1 CLI RX| [28] = \\\"-a\\\",\r\n**** v1 CLI RX| [29] = \\\"127.0.0.1:0\\\",\r\n**** v1 CLI RX| [30] = \\\"-M\\\",\r\n**** v1 CLI RX| [31] = \\\"127.0.0.1 38685\\\",\r\n**** v1 CLI RX| [32] = \\\"-P\\\",\r\n**** v1 CLI RX| [33] = \\\"/tmp/vtc.2872792.2223da65/v1/varnishd.pid\\\",\r\n**** v1 CLI RX|}\r\n**** v1 CLI RX|pthread.self = 0x7fadb3ee7040\r\n**** v1 CLI RX|pthread.name = (cache-main)\r\n**** v1 CLI RX|pthread.attr = {\r\n**** v1 CLI RX| guard = 0,\r\n**** v1 CLI RX| stack_bottom = 0x7ffe8078d000,\r\n**** v1 CLI RX| stack_top = 0x7ffe80f8a000,\r\n**** v1 CLI RX| stack_size = 8376320,\r\n**** v1 CLI RX|}\r\n**** v1 CLI RX|thr.req = NULL\r\n**** v1 CLI RX|thr.busyobj = NULL\r\n**** v1 CLI RX|thr.worker = NULL\r\n**** v1 CLI RX|vmods = {\r\n**** v1 CLI RX| dynamic = {0x60b0000005c0, Varnish trunk d77da13b9baf268196075bda0808d0d2e8721470, 18.1},\r\n**** v1 CLI RX| directors = {0x60b000000720, Varnish trunk d77da13b9baf268196075bda0808d0d2e8721470, 0.0},\r\n**** v1 CLI RX|},\r\n**** v1 CLI RX|pools = {\r\n**** v1 CLI RX| pool = 0x612000000040 {\r\n**** v1 CLI RX| nidle = 9,\r\n**** v1 CLI RX| nthr = 10,\r\n**** v1 CLI RX| lqueue = 0\r\n**** v1 CLI RX| },\r\n**** v1 CLI RX| pool = 0x6120000001c0 {\r\n**** v1 CLI RX| nidle = 9,\r\n**** v1 CLI RX| nthr = 10,\r\n**** v1 CLI RX| lqueue = 0\r\n**** v1 CLI RX| },\r\n**** v1 CLI RX|},\r\n**** v1 CLI RX|\r\n**** v1 CLI RX|\r\n---- v1 Unexpected panic\r\n* top failure during reset\r\n* diag 0.0 2606:2800:220:1:248:1893:25c8:1946 example.com\r\n* diag 0.0 -----------------------------------------------------\r\n* diag 0.0 Suppressions used:\r\n* diag 0.0 count bytes template\r\n* diag 0.0 7 1491 parse_string\r\n* diag 0.0 -----------------------------------------------------\r\n* diag 0.0 \r\n# top TEST ./tests/layer_reload.vtc FAILED (3.042) exit=2\r\nFAIL tests/layer_reload.vtc (exit status: 2)\r\n\r\n```\r\n
","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/112/reactions","total_count":1,"+1":1,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/112/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/113","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/113/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/113/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/113/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/113","id":2193407206,"node_id":"I_kwDOBBOOTM6CvLzm","number":113,"title":"7.5 release","user":{"login":"gquintard","id":3776553,"node_id":"MDQ6VXNlcjM3NzY1NTM=","avatar_url":"https://avatars.githubusercontent.com/u/3776553?v=4","gravatar_id":"","url":"https://api.github.com/users/gquintard","html_url":"https://github.com/gquintard","followers_url":"https://api.github.com/users/gquintard/followers","following_url":"https://api.github.com/users/gquintard/following{/other_user}","gists_url":"https://api.github.com/users/gquintard/gists{/gist_id}","starred_url":"https://api.github.com/users/gquintard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gquintard/subscriptions","organizations_url":"https://api.github.com/users/gquintard/orgs","repos_url":"https://api.github.com/users/gquintard/repos","events_url":"https://api.github.com/users/gquintard/events{/privacy}","received_events_url":"https://api.github.com/users/gquintard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":5,"created_at":"2024-03-18T21:45:09Z","updated_at":"2024-05-15T23:42:10Z","closed_at":"2024-04-09T15:19:21Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi!\r\n\r\ncould we get a release (or a branch, I'm not greedy) targeting 7.5 (`master` targets `trunk` at the moment)? I need it to release the `docker` images","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/113/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/113/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/114","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/114/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/114/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/114/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/114","id":2205936169,"node_id":"I_kwDOBBOOTM6De-op","number":114,"title":"Object resolver not initialized?","user":{"login":"cosimo","id":109366,"node_id":"MDQ6VXNlcjEwOTM2Ng==","avatar_url":"https://avatars.githubusercontent.com/u/109366?v=4","gravatar_id":"","url":"https://api.github.com/users/cosimo","html_url":"https://github.com/cosimo","followers_url":"https://api.github.com/users/cosimo/followers","following_url":"https://api.github.com/users/cosimo/following{/other_user}","gists_url":"https://api.github.com/users/cosimo/gists{/gist_id}","starred_url":"https://api.github.com/users/cosimo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cosimo/subscriptions","organizations_url":"https://api.github.com/users/cosimo/orgs","repos_url":"https://api.github.com/users/cosimo/repos","events_url":"https://api.github.com/users/cosimo/events{/privacy}","received_events_url":"https://api.github.com/users/cosimo/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":6,"created_at":"2024-03-25T14:47:12Z","updated_at":"2024-03-25T16:57:37Z","closed_at":"2024-03-25T16:57:37Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi!\r\n\r\nI'm trying to use libvmod_dynamic with varnish 7.4:\r\n* varnishcache/varnish-cache@b659b7ae62b44c05888919c5c1cd03ba6eaec681\r\n* libvmod-dynamic rev: 3697d6f195fe077fe213918b7b67f5da4efdede2\r\n\r\nThis is on Ubuntu 20.04, and I've build `libvmod_dynamic.so` using this Dockerfile: https://gist.github.com/cosimo/314e441313426a93bdfd3438059e44f9\r\n\r\nMy runtime environment is varnish 7.4.3-1~focal on Ubuntu 20.04.6 TLS x86_64 from the `https://packagecloud.io/varnishcache/varnish74/ubuntu/ focal main` debian repository.\r\n\r\nThe relevant VCL code is:\r\n\r\n```\r\nvcl 4.0;\r\nimport dynamic;\r\n\r\nbackend default none;\r\n\r\nsub vcl_init {\r\n new r = dynamic.resolver();\r\n new rest = dynamic.director(\r\n port = \"80\",\r\n resolver = r.use(),\r\n ttl_from = dns\r\n );\r\n}\r\n\r\nsub vcl_recv {\r\n # `_rest._tcp.example.com` is an SRV record\r\n set req.backend_hint = rest.backend(\"_rest._tcp.example.com\");\r\n}\r\n```\r\n\r\nWhen starting up varnish, I'm getting the following error:\r\n\r\n```\r\nMar 25 14:27:35 host varnishd[2689915]: Version: varnish-7.4.3 revision b659b7ae62b44c05888919c5c1cd03ba6eaec681\r\nMar 25 14:27:35 host varnishd[2689915]: Platform: Linux,5.15.0-1053-aws,x86_64,-junix,-smalloc,-sdefault,-hcritbit\r\nMar 25 14:27:35 host varnishd[2689915]: Child (2689931) Started\r\nMar 25 14:27:35 host varnishd[2689915]: Child launched OK\r\nMar 25 14:27:35 host varnishd[2689915]: Error: Child (2689931) Pushing vcls failed:\r\nMar 25 14:27:35 host varnishd[2689915]: VCL \"boot\" Failed initialization\r\nMar 25 14:27:35 host varnishd[2689915]: Message:\r\nMar 25 14:27:35 host varnishd[2689915]: Object r not initialized\r\nMar 25 14:27:35 host varnishd[2689915]: Info: Child (2689931) said Child starts\r\nMar 25 14:27:35 host varnishd[2689915]: Child (2689931) Pushing vcls failed:\r\n VCL \"boot\" Failed initialization\r\n Message:\r\n Object r not initialized\r\nMar 25 14:27:35 host varnishd[2689915]: Stopping Child\r\nMar 25 14:27:35 host varnishd[2689915]: Child (2689931) said Child starts\r\nMar 25 14:27:35 host varnishd[2689915]: Info: Child (2689931) said Child dies\r\nMar 25 14:27:35 host varnishd[2689915]: Info: Child (2689931) ended\r\nMar 25 14:27:35 host varnishd[2689915]: Child (2689931) said Child dies\r\nMar 25 14:27:35 host varnishd[2689915]: Child (2689931) ended\r\nMar 25 14:27:35 host varnishd[2689915]: Child cleanup complete\r\n```\r\n\r\nHave looked at the documentation in the `vmod_dynamic.vcc` but I haven't really understood the reason why the resolver object is not initialized.\r\n\r\nOther things I've noticed:\r\n- When querying `varnishadm backend.list -j` I see that the backends seem to be considered sick, as in:\r\n```\r\nroot@host:/etc/varnish# varnishadm backend.list -j\r\n[ 3, [\"backend.list\", \"-j\"], 1711378545.538,\r\n {\r\n \"boot.rest(_rest._tcp.example.com:(null))\": {\r\n \"type\": \"dynamic\",\r\n \"admin_health\": \"probe\",\r\n \"probe_message\": [0, 0, \"sick\"],\r\n \"last_change\": 1711378480.950\r\n }\r\n }\r\n]\r\n```\r\n- I can't seem to be able to use the `ttl_from = dns` option, the error message mentioned that I need to use a `resolver`, which I am indeed doing.\r\n- When running `make check` from inside the Docker container build, 1 test is failing. Here's the output I'm seeing:\r\n\r\n```\r\nPASS: tests/layer.vtc\r\nPASS: tests/r00107.vtc\r\nPASS: tests/stale_obj.vtc\r\nPASS: tests/test01.vtc\r\nPASS: tests/test02.vtc\r\nPASS: tests/test03.vtc\r\nPASS: tests/test04.vtc\r\nPASS: tests/test05.vtc\r\nPASS: tests/test06.vtc\r\nPASS: tests/test07.vtc\r\nPASS: tests/test08.vtc\r\nPASS: tests/test09.vtc\r\nPASS: tests/test10.vtc\r\nPASS: tests/test11.vtc\r\nPASS: tests/test12.vtc\r\nFAIL: tests/test13.vtc\r\nPASS: tests/test14.vtc\r\nPASS: tests/via.vtc\r\n```\r\n\r\nWould you have any guidance, or examples of usage of libvmod-dynamic? I haven't found much doing web searches or checking other repositories on github.\r\n\r\nThanks!","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/114/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/114/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/115","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/115/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/115/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/115/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/115","id":2292508729,"node_id":"I_kwDOBBOOTM6IpOg5","number":115,"title":"Unexpected behavior with new timeouts: \"zero\" timeout despite long defaults","user":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2024-05-13T11:10:43Z","updated_at":"2024-05-14T06:44:13Z","closed_at":"2024-05-14T06:43:00Z","author_association":"OWNER","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"logging an issue found by @martin-uplex\r\n\r\nUsing this dynamic director\r\n\r\n```vcl\r\nbackend sslon {\r\n .path = \"/tmp/varnish_sslon.proxy.sock\";\r\n .connect_timeout = 5s;\r\n .first_byte_timeout = 20s;\r\n .between_bytes_timeout = 20s;\r\n}\r\n\r\nsub vcl_init {\r\n new https = dynamic.director(via = sslon, port = 443);\r\n}\r\n```\r\n\r\nwith these global timeouts\r\n```\r\nfirst_byte_timeout 300.000 [seconds]\r\nidle_send_timeout 300.000 [seconds]\r\npipe_timeout 300.000 [seconds]\r\n```\r\n\r\nand no vcl override of timeouts leads to behavior as if a 0 timeout was configured:\r\n\r\n```\r\n--- Timestamp Fetch: 1715591622.154104 0.008790 0.000009\r\n--- Timestamp Connected: 1715591622.154129 0.008815 0.000025\r\n--- BackendOpen 644 https.www.site.de(X.X.X.X:443) 0.0.0.0 0 0.0.0.0 0 connect\r\n--- Timestamp Bereq: 1715591622.154136 0.008822 0.000006\r\n--- FetchError first byte timeout\r\n--- BackendClose 644 https.www.site.de(X.X.X.X:443) close Receive timeout\r\n--- Timestamp Beresp: 1715591622.155162 0.009848 0.001025\r\n--- Timestamp Error: 1715591622.155163 0.009849 0.000000 \r\n```\r\n\r\nThe workaround is to set explicit timeouts in the director.\r\n\r\nProbably related to a7059d4efab10a285c1f57f7e02bbe631cf3a649 / https://github.com/varnishcache/varnish-cache/commit/119056c4d9319155c6c6c2148519d2e8d81d5f76","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/115/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/115/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/116","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/116/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/116/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/116/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/116","id":2315307267,"node_id":"I_kwDOBBOOTM6KAMkD","number":116,"title":"Assert error in getdns_result(): Condition((rr) != 0) not true.","user":{"login":"delthas","id":1863865,"node_id":"MDQ6VXNlcjE4NjM4NjU=","avatar_url":"https://avatars.githubusercontent.com/u/1863865?v=4","gravatar_id":"","url":"https://api.github.com/users/delthas","html_url":"https://github.com/delthas","followers_url":"https://api.github.com/users/delthas/followers","following_url":"https://api.github.com/users/delthas/following{/other_user}","gists_url":"https://api.github.com/users/delthas/gists{/gist_id}","starred_url":"https://api.github.com/users/delthas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/delthas/subscriptions","organizations_url":"https://api.github.com/users/delthas/orgs","repos_url":"https://api.github.com/users/delthas/repos","events_url":"https://api.github.com/users/delthas/events{/privacy}","received_events_url":"https://api.github.com/users/delthas/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2024-05-24T12:36:39Z","updated_at":"2024-05-27T16:32:51Z","closed_at":"2024-05-27T16:32:40Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Stressing Varnish + libvmod-dynamic with many dynamic backends (with probes), I'm sometimes getting the following panic:\r\n```\r\nAssert error in getdns_result(), dyn_resolver_getdns.c line 259:\r\n Condition((rr) != 0) not true.\r\nBacktrace:\r\n 0x55bf1d92da92: /usr/sbin/varnishd(+0x5ba92) [0x55bf1d92da92]\r\n 0x55bf1d9aac45: /usr/sbin/varnishd(VAS_Fail+0x45) [0x55bf1d9aac45]\r\n 0x7f845e54e5ec: ./vmod_cache/_vmod_dynamic.29b766e616262ab0ef9252419367ce48fbf642168ba34fc382b1742a77dac5c4(+0xf5ec) [0x7f845e54e5ec]\r\n 0x7f845e544b65: ./vmod_cache/_vmod_dynamic.29b766e616262ab0ef9252419367ce48fbf642168ba34fc382b1742a77dac5c4(+0x5b65) [0x7f845e544b65]\r\n 0x7f84731cd064: /lib/x86_64-linux-gnu/libpthread.so.0(+0x8064) [0x7f84731cd064]\r\n 0x7f8472f0262d: /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7f8472f0262d]\r\n```\r\nThis refers to the assert here: https://github.com/nigoroll/libvmod-dynamic/blob/master/src/dyn_resolver_getdns.c#L259\r\n\r\nI can't reproduce this on my machine to debug locally, I only got this on a remote server. I think the DNS server there might be having issues; but if this is caused by some DNS server issue we should probably not panic (and instead just add no backend).\r\n\r\nFrom my understanding of the function, this can happen if `getdns_common_more_answers(state) != 0` from the beginning (or if `getdns_common_more_answers(state) == 0` and `getdns_list_get_dict(state->answers, state->answer++, &rr)` gives a NULL `rr`, not sure if that's relevant).","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/116/reactions","total_count":1,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":1,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/116/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/117","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/117/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/117/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/117/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/117","id":2318884269,"node_id":"I_kwDOBBOOTM6KN12t","number":117,"title":"Still happens: Dynamic Backends can only be added to warm VCLs","user":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804425,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjU=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/help%20wanted","name":"help wanted","color":"128A0C","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":7,"created_at":"2024-05-27T11:03:00Z","updated_at":"2024-11-14T17:58:05Z","closed_at":"2024-11-14T17:58:04Z","author_association":"OWNER","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I'm getting the same assert again, but in a slightly different way (even with the fix).\r\n\r\nThe stack is still:\r\n```\r\nWrong turn at cache/cache_vrt_vcl.c:251:\r\nDynamic Backends can only be added to warm VCLs\r\nBacktrace:\r\n ip=0x5f26789d8ebe sp=0x70bc775fe870 \r\n ip=0x5f2678aa5985 sp=0x70bc775fe9e0 \r\n ip=0x5f2678a0ee86 sp=0x70bc775fea30 \r\n ip=0x5f267899527d sp=0x70bc775feb80 \r\n ip=0x5f2678995d22 sp=0x70bc775fec80 \r\n ip=0x70bc82abfe61 sp=0x70bc775fecb0 \r\n ip=0x70bc82ac0acc sp=0x70bc775ff1d0 \r\n ip=0x70bc82ac1395 sp=0x70bc775ff340 \r\n ip=0x70bc99399ded sp=0x70bc775ff450\r\n ip=0x70bc9941d0dc sp=0x70bc775ff500\r\n```\r\n\r\nI'm stressing Varnish + libvmod-dynamic with a lot of VCL reloads. Everything usually works fine for a while (sometimes hours), until Varnish starts to loop on this error, every ~15s to ~1 minute. So, no issues for hours and then once I get this panic, it repeats every ~15s to ~1min: child crashes, child restarts, child crashes, ...\r\n\r\nHere's an excerpt of the full logs:\r\n```\r\nDebug: Child (606349) Started\r\nChild launched OK\r\nInfo: Child (606349) said Child starts\r\nError: Child (606349) not responding to CLI, killed it.\r\nError: Child (606349) not responding to CLI, killed it.\r\nError: Unexpected reply from ping: 400 CLI communication error (hdr)\r\nError: Child (606349) not responding to CLI, killed it.\r\nError: Unexpected reply from ping: 400 CLI communication error\r\nError: Child (606349) died signal=3 (core dumped)\r\nDebug: Child cleanup complete\r\nDebug: Child (645026) Started\r\nChild launched OK\r\nInfo: Child (645026) said Child starts\r\nError: Child (645026) not responding to CLI, killed it.\r\nError: Child (645026) not responding to CLI, killed it.\r\nError: Unexpected reply from ping: 400 CLI communication error\r\nError: Child (645026) died signal=6 (core dumped)\r\nError: Child (645026) Panic at: Fri, 24 May 2024 14:58:32 GMT\r\nWrong turn at cache/cache_vrt_vcl.c:251:\r\nDynamic Backends can only be added to warm VCLs\r\nBacktrace:\r\n ip=0x6281a32f6ebe sp=0x76e6579fe870 \r\n ip=0x6281a33c3985 sp=0x76e6579fe9e0 \r\n ip=0x6281a332ce86 sp=0x76e6579fea30 \r\n ip=0x6281a32b327d sp=0x76e6579feb80 \r\n ip=0x6281a32b3d22 sp=0x76e6579fec80 \r\n ip=0x76e661960e61 sp=0x76e6579fecb0 \r\n ip=0x76e661961acc sp=0x76e6579ff1d0 \r\n ip=0x76e661962395 sp=0x76e6579ff340 \r\n ip=0x76e676e3aded sp=0x76e6579ff450\r\n ip=0x76e676ebe0dc sp=0x76e6579ff500\r\nDebug: Child cleanup complete\r\nDebug: Child (649299) Started\r\nChild launched OK\r\nInfo: Child (649299) said Child starts\r\nError: Child (649299) not responding to CLI, killed it.\r\nError: Child (649299) not responding to CLI, killed it.\r\nError: Unexpected reply from ping: 400 CLI communication error\r\nError: Child (649299) died signal=6 (core dumped)\r\nError: Child (649299) Panic at: Fri, 24 May 2024 14:58:46 GMT\r\nWrong turn at cache/cache_vrt_vcl.c:251:\r\nDynamic Backends can only be added to warm VCLs\r\nBacktrace:\r\n ip=0x6281a32f6ebe sp=0x76e654bfe870 \r\n ip=0x6281a33c3985 sp=0x76e654bfe9e0 \r\n ip=0x6281a332ce86 sp=0x76e654bfea30 \r\n ip=0x6281a32b327d sp=0x76e654bfeb80 \r\n ip=0x6281a32b3d22 sp=0x76e654bfec80 \r\n ip=0x76e661686e61 sp=0x76e654bfecb0 \r\n ip=0x76e661687acc sp=0x76e654bff1d0 \r\n ip=0x76e661688395 sp=0x76e654bff340 \r\n ip=0x76e676e3aded sp=0x76e654bff450\r\n ip=0x76e676ebe0dc sp=0x76e654bff500\r\nDebug: Child cleanup complete\r\nDebug: Child (653709) Started\r\nChild launched OK\r\nInfo: Child (653709) said Child starts\r\nError: Child (653709) not responding to CLI, killed it.\r\nError: Child (653709) not responding to CLI, killed it.\r\nError: Unexpected reply from ping: 400 CLI communication error\r\nError: Child (653709) died signal=6 (core dumped)\r\nError: Child (653709) Panic at: Fri, 24 May 2024 14:59:01 GMT\r\nWrong turn at cache/cache_vrt_vcl.c:251:\r\nDynamic Backends can only be added to warm VCLs\r\nBacktrace:\r\n ip=0x6281a32f6ebe sp=0x76e6523fe870 \r\n ip=0x6281a33c3985 sp=0x76e6523fe9e0 \r\n ip=0x6281a332ce86 sp=0x76e6523fea30 \r\n ip=0x6281a32b327d sp=0x76e6523feb80 \r\n ip=0x6281a32b3d22 sp=0x76e6523fec80 \r\n ip=0x76e66099fe61 sp=0x76e6523fecb0 \r\n ip=0x76e6609a0acc sp=0x76e6523ff1d0 \r\n ip=0x76e6609a1395 sp=0x76e6523ff340 \r\n ip=0x76e676e3aded sp=0x76e6523ff450\r\n ip=0x76e676ebe0dc sp=0x76e6523ff500\r\nDebug: Child cleanup complete\r\nDebug: Child (658076) Started\r\nChild launched OK\r\nInfo: Child (658076) said Child starts\r\nError: Child (658076) not responding to CLI, killed it.\r\nError: Child (658076) not responding to CLI, killed it.\r\nError: Unexpected reply from ping: 400 CLI communication error\r\nError: Child (658076) died signal=6 (core dumped)\r\nError: Child (658076) Panic at: Fri, 24 May 2024 14:59:21 GMT\r\nWrong turn at cache/cache_vrt_vcl.c:251:\r\nDynamic Backends can only be added to warm VCLs\r\nBacktrace:\r\n ip=0x6281a32f6ebe sp=0x76e655ffe870 \r\n ip=0x6281a33c3985 sp=0x76e655ffe9e0 \r\n ip=0x6281a332ce86 sp=0x76e655ffea30 \r\n ip=0x6281a32b327d sp=0x76e655ffeb80 \r\n ip=0x6281a32b3d22 sp=0x76e655ffec80 \r\n ip=0x76e6617a5e61 sp=0x76e655ffecb0 \r\n ip=0x76e6617a6acc sp=0x76e655fff1d0 \r\n ip=0x76e6617a7395 sp=0x76e655fff340 \r\n ip=0x76e676e3aded sp=0x76e655fff450\r\n ip=0x76e676ebe0dc sp=0x76e655fff500\r\nDebug: Child cleanup complete\r\nDebug: Child (662441) Started\r\nChild launched OK\r\nInfo: Child (662441) said Child starts\r\nError: Child (662441) not responding to CLI, killed it.\r\nError: Child (662441) not responding to CLI, killed it.\r\nError: Unexpected reply from ping: 400 CLI communication error\r\nError: Child (662441) died signal=6 (core dumped)\r\nError: Child (662441) Panic at: Fri, 24 May 2024 14:59:38 GMT\r\nWrong turn at cache/cache_vrt_vcl.c:251:\r\nDynamic Backends can only be added to warm VCLs\r\nBacktrace:\r\n ip=0x6281a32f6ebe sp=0x76e6567fe870 \r\n ip=0x6281a33c3985 sp=0x76e6567fe9e0 \r\n ip=0x6281a332ce86 sp=0x76e6567fea30 \r\n ip=0x6281a32b327d sp=0x76e6567feb80 \r\n ip=0x6281a32b3d22 sp=0x76e6567fec80 \r\n ip=0x76e662eaae61 sp=0x76e6567fecb0 \r\n ip=0x76e662eabacc sp=0x76e6567ff1d0 \r\n ip=0x76e662eac395 sp=0x76e6567ff340 \r\n ip=0x76e676e3aded sp=0x76e6567ff450\r\n ip=0x76e676ebe0dc sp=0x76e6567ff500\r\nDebug: Child cleanup complete\r\n```\r\nIt continued crashing in a loop indefinitely for multiple days. I managed to attach to the process and the VCL was indeed COOL at the time of the panic.\r\n\r\n_Originally posted by @delthas in https://github.com/nigoroll/libvmod-dynamic/issues/108#issuecomment-2133195974_\r\n ","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/117/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/117/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/118","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/118/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/118/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/118/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/118","id":2437742171,"node_id":"I_kwDOBBOOTM6RTP5b","number":118,"title":"Assert error in VRT_Assign_Backend() Condition(vdir->refcnt > 0)","user":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2024-07-30T12:39:14Z","updated_at":"2024-07-31T13:00:03Z","closed_at":"2024-07-31T13:00:03Z","author_association":"OWNER","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"https://github.com/nigoroll/libvmod-dynamic/commit/d8eea028563837e74b8d7f1467c0a8118f6cfc6d exposes what looks like a race between expiry of a newly created backend and resolution.\r\n\r\n```\r\nAssert error in VRT_Assign_Backend(), cache/cache_vrt_vcl.c line 346:\r\n Condition(vdir->refcnt > 0) not true.\r\nversion = varnish-trunk revision c79f57fc116a958631c79e1c24f57e729df17850, vrt api = 19.1\r\nident = Linux,6.1.0-15-amd64,x86_64,-jnone,-sdefault,-sdefault,-hcritbit,epoll\r\nnow = 13523.786472 (mono), 1722337142.480783 (real)\r\nBacktrace:\r\n ip=0x5625db174ee5 sp=0x7fea20456180 \r\n ip=0x5625db0ad0b3 sp=0x7fea204561a0 \r\n ip=0x5625db0acdfa sp=0x7fea204561c0 \r\n ip=0x5625db174115 sp=0x7fea20456340 \r\n ip=0x5625db0e2e17 sp=0x7fea20456390 \r\n ip=0x7fea2f4111e6 sp=0x7fea204563c0 \r\n ip=0x7fea2f412d50 sp=0x7fea204563e0 \r\n ip=0x5625db081835 sp=0x7fea20456410 \r\n ip=0x7fea165faf62 sp=0x7fea20456440\r\n ip=0x5625db0e4e6c sp=0x7fea20456490 \r\n ip=0x5625db0e6c70 sp=0x7fea204565d0 \r\n```\r\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/118/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/118/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/119","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/119/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/119/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/119/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/119","id":2472659871,"node_id":"I_kwDOBBOOTM6TYcuf","number":119,"title":"IPv6 backends remain sick - Varnish 7.4.3, vmod_dynamic 2.8.0","user":{"login":"gerhard","id":3342,"node_id":"MDQ6VXNlcjMzNDI=","avatar_url":"https://avatars.githubusercontent.com/u/3342?v=4","gravatar_id":"","url":"https://api.github.com/users/gerhard","html_url":"https://github.com/gerhard","followers_url":"https://api.github.com/users/gerhard/followers","following_url":"https://api.github.com/users/gerhard/following{/other_user}","gists_url":"https://api.github.com/users/gerhard/gists{/gist_id}","starred_url":"https://api.github.com/users/gerhard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gerhard/subscriptions","organizations_url":"https://api.github.com/users/gerhard/orgs","repos_url":"https://api.github.com/users/gerhard/repos","events_url":"https://api.github.com/users/gerhard/events{/privacy}","received_events_url":"https://api.github.com/users/gerhard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2024-08-19T07:32:03Z","updated_at":"2024-08-19T09:58:57Z","closed_at":"2024-08-19T09:58:57Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Given the following DNS records:\r\n\r\n```console\r\ndig changelog-2024-01-12.internal AAAA +short\r\nfdaa:0:4556:a7b:303:5118:aa8a:2\r\nfdaa:0:4556:a7b:303:ccc2:4a66:2\r\n```\r\n\r\nAnd the following dynamic backend config:\r\n\r\n```vcl\r\nbackend default none;\r\n\r\nprobe changelog_health {\r\n .url = \"/health\";\r\n .interval = 5s;\r\n .timeout = 2s;\r\n .window = 10;\r\n .threshold = 5;\r\n}\r\n\r\n# Define IPv6 only ACL for the module\r\nacl ipv6_only { \"::0\"/0; }\r\n\r\n# Setup a dynamic director\r\nsub vcl_init {\r\n new changelog = dynamic.director(\r\n ttl = 1m,\r\n probe = changelog_health,\r\n first_byte_timeout = 5s,\r\n connect_timeout = 5s,\r\n between_bytes_timeout = 30s,\r\n whitelist = ipv6_only\r\n );\r\n}\r\n\r\nsub vcl_recv {\r\n set req.backend_hint = changelog.backend(\"changelog-2024-01-12.internal\", \"4000\");\r\n}\r\n\r\n```\r\n\r\nEven though the backends are resolved correctly, they remain sick:\r\n\r\n```console\r\nvarnishadm backend.list\r\nBackend name Admin Probe Health Last change\r\nboot.changelog(changelog-2024-01-12.internal:4000) probe 0/2 sick Mon, 19 Aug 2024 07:17:07 GMT\r\nboot.changelog(fdaa:0:4556:a7b:303:5118:aa8a:2:4000) probe 0/10 sick Mon, 19 Aug 2024 07:17:07 GMT\r\nboot.changelog(fdaa:0:4556:a7b:303:ccc2:4a66:2:4000) probe 0/10 sick Mon, 19 Aug 2024 07:17:07 GMT\r\n```\r\n\r\nThis is what I see in `varnishlog`:\r\n\r\n```console\r\nvarnishlog -g raw -i backend_health\r\n 0 Backend_health - changelog(fdaa:0:4556:a7b:303:ccc2:4a66:2:4000) Still sick -6--X-R- 0 5 10 0.001638 0.000000 \"HTTP/1.1 400 Bad Request\"\r\n 0 Backend_health - changelog(fdaa:0:4556:a7b:303:5118:aa8a:2:4000) Still sick -6--X-R- 0 5 10 0.001533 0.000000 \"HTTP/1.1 400 Bad Request\"\r\n 0 Backend_health - changelog(fdaa:0:4556:a7b:303:5118:aa8a:2:4000) Still sick -6--X-R- 0 5 10 0.001314 0.000000 \"HTTP/1.1 400 Bad Request\"\r\n 0 Backend_health - changelog(fdaa:0:4556:a7b:303:ccc2:4a66:2:4000) Still sick -6--X-R- 0 5 10 0.001499 0.000000 \"HTTP/1.1 400 Bad Request\"\r\n...\r\n```\r\n\r\nAnd yet if I use `curl`, both these backends work:\r\n\r\n```console\r\ncurl -v6 http://[fdaa:0:4556:a7b:303:ccc2:4a66:2]:4000/health\r\n* Trying [fdaa:0:4556:a7b:303:ccc2:4a66:2]:4000...\r\n* Connected to fdaa:0:4556:a7b:303:ccc2:4a66:2 (fdaa:0:4556:a7b:303:ccc2:4a66:2) port 4000 (#0)\r\n> GET /health HTTP/1.1\r\n> Host: [fdaa:0:4556:a7b:303:ccc2:4a66:2]:4000\r\n> User-Agent: curl/7.88.1\r\n> Accept: */*\r\n>\r\n< HTTP/1.1 200 OK\r\n< cache-control: max-age=0, private, must-revalidate\r\n< content-length: 0\r\n< date: Mon, 19 Aug 2024 07:28:15 GMT\r\n< server: Cowboy\r\n<\r\n* Connection #0 to host fdaa:0:4556:a7b:303:ccc2:4a66:2 left intact\r\n\r\ncurl -v6 http://[fdaa:0:4556:a7b:303:5118:aa8a:2]:4000/health\r\n* Trying [fdaa:0:4556:a7b:303:5118:aa8a:2]:4000...\r\n* Connected to fdaa:0:4556:a7b:303:5118:aa8a:2 (fdaa:0:4556:a7b:303:5118:aa8a:2) port 4000 (#0)\r\n> GET /health HTTP/1.1\r\n> Host: [fdaa:0:4556:a7b:303:5118:aa8a:2]:4000\r\n> User-Agent: curl/7.88.1\r\n> Accept: */*\r\n>\r\n< HTTP/1.1 200 OK\r\n< cache-control: max-age=0, private, must-revalidate\r\n< content-length: 0\r\n< date: Mon, 19 Aug 2024 07:28:48 GMT\r\n< server: Cowboy\r\n<\r\n* Connection #0 to host fdaa:0:4556:a7b:303:5118:aa8a:2 left intact\r\n```\r\n\r\nI **think** that the backend IPv6 is not interpolated correctly - `changelog(fdaa:0:4556:a7b:303:ccc2:4a66:2:4000)` should be `changelog([fdaa:0:4556:a7b:303:ccc2:4a66:2]:4000)` but maybe the formatting is misleading me.\r\n\r\nIs there anything that I could do to debug this further?\r\n\r\n---\r\n\r\n- Varnish `7.4.3`\r\n- vmod_dynamic `2.8.0` [15e32fb](https://github.com/nigoroll/libvmod-dynamic/tree/15e32fb8cf96752c90d895b0ca31451bd05d92d9)\r\n- Deployed to Fly.io, uses [`.internal` domain](https://fly.io/docs/networking/private-networking/#fly-io-internal-dns)\r\n\r\n---\r\n\r\nFTR:\r\n- https://github.com/thechangelog/changelog.com/pull/518\r\n- https://github.com/thechangelog/pipedream/pull/1","closed_by":{"login":"gerhard","id":3342,"node_id":"MDQ6VXNlcjMzNDI=","avatar_url":"https://avatars.githubusercontent.com/u/3342?v=4","gravatar_id":"","url":"https://api.github.com/users/gerhard","html_url":"https://github.com/gerhard","followers_url":"https://api.github.com/users/gerhard/followers","following_url":"https://api.github.com/users/gerhard/following{/other_user}","gists_url":"https://api.github.com/users/gerhard/gists{/gist_id}","starred_url":"https://api.github.com/users/gerhard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gerhard/subscriptions","organizations_url":"https://api.github.com/users/gerhard/orgs","repos_url":"https://api.github.com/users/gerhard/repos","events_url":"https://api.github.com/users/gerhard/events{/privacy}","received_events_url":"https://api.github.com/users/gerhard/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/119/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/119/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/120","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/120/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/120/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/120/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/120","id":2494183718,"node_id":"I_kwDOBBOOTM6Uqjkm","number":120,"title":"Help wanted: configure dynamic backend via SRV Records","user":{"login":"am4rth","id":96725262,"node_id":"U_kgDOBcPpDg","avatar_url":"https://avatars.githubusercontent.com/u/96725262?v=4","gravatar_id":"","url":"https://api.github.com/users/am4rth","html_url":"https://github.com/am4rth","followers_url":"https://api.github.com/users/am4rth/followers","following_url":"https://api.github.com/users/am4rth/following{/other_user}","gists_url":"https://api.github.com/users/am4rth/gists{/gist_id}","starred_url":"https://api.github.com/users/am4rth/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/am4rth/subscriptions","organizations_url":"https://api.github.com/users/am4rth/orgs","repos_url":"https://api.github.com/users/am4rth/repos","events_url":"https://api.github.com/users/am4rth/events{/privacy}","received_events_url":"https://api.github.com/users/am4rth/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2024-08-29T11:34:24Z","updated_at":"2024-08-30T06:07:11Z","closed_at":"2024-08-30T06:07:11Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hello,\r\n\r\ni'm currently tring to get varnish running with dynamic backend servers provied via SRV DNS Records.\r\n\r\nResolving the domains via `host` is no problem, the following data is returned:\r\n```\r\n# host -t SRV service.namespace.local\r\nservice.namespace.localhas SRV record 1 1 32768 995a7bee76fa40b194e2b761b9dfb90a.service.namespace.local.\r\n```\r\nThis is my varnish config:\r\n```\r\nbackend default none;\r\n\r\nsub vcl_init {\r\n new r = dynamic.resolver();\r\n new d = dynamic.director(\r\n resolver = r.use(),\r\n );\r\n}\r\n\r\nsub vcl_recv {\r\n set req.backend_hint = d.service(\"service.namespace.local\");\r\n \r\n # more config to come\r\n}\r\n```\r\n\r\nWhen ever I try to perform a request, the resolution via getdns seems to fail:\r\n```\r\n0 Timestamp - vmod-dynamic boot.d(srv service.namespace.local) Lookup: 1724930480.177774 0.000000 0.000000\r\n0 Timestamp - vmod-dynamic boot.d(srv service.namespace.local) Results: 1724930480.177919 0.000145 0.000145\r\n0 Error - vmod-dynamic boot d service.namespace.local getdns 901 (Queries for the name yielded all negative responses)\r\n```\r\n\r\nDo I miss something? Sorry if it's a obvious problem, not as experienced in varnish config.\r\n\r\nThanks in advance!","closed_by":{"login":"am4rth","id":96725262,"node_id":"U_kgDOBcPpDg","avatar_url":"https://avatars.githubusercontent.com/u/96725262?v=4","gravatar_id":"","url":"https://api.github.com/users/am4rth","html_url":"https://github.com/am4rth","followers_url":"https://api.github.com/users/am4rth/followers","following_url":"https://api.github.com/users/am4rth/following{/other_user}","gists_url":"https://api.github.com/users/am4rth/gists{/gist_id}","starred_url":"https://api.github.com/users/am4rth/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/am4rth/subscriptions","organizations_url":"https://api.github.com/users/am4rth/orgs","repos_url":"https://api.github.com/users/am4rth/repos","events_url":"https://api.github.com/users/am4rth/events{/privacy}","received_events_url":"https://api.github.com/users/am4rth/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/120/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/120/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/121","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/121/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/121/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/121/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/121","id":2528087988,"node_id":"I_kwDOBBOOTM6Wr4-0","number":121,"title":"via_uds.vtc fails when run as root","user":{"login":"delthas","id":1863865,"node_id":"MDQ6VXNlcjE4NjM4NjU=","avatar_url":"https://avatars.githubusercontent.com/u/1863865?v=4","gravatar_id":"","url":"https://api.github.com/users/delthas","html_url":"https://github.com/delthas","followers_url":"https://api.github.com/users/delthas/followers","following_url":"https://api.github.com/users/delthas/following{/other_user}","gists_url":"https://api.github.com/users/delthas/gists{/gist_id}","starred_url":"https://api.github.com/users/delthas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/delthas/subscriptions","organizations_url":"https://api.github.com/users/delthas/orgs","repos_url":"https://api.github.com/users/delthas/repos","events_url":"https://api.github.com/users/delthas/events{/privacy}","received_events_url":"https://api.github.com/users/delthas/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2024-09-16T10:34:16Z","updated_at":"2024-09-17T08:33:00Z","closed_at":"2024-09-17T08:33:00Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"On my build server (VM, running as root), `make check` fails because `via_uds.vtc` fails.\r\n\r\nThe cause is that `v2`, making a connection to `v1` over a UDS, fails to connect, with `FetchError b backend d1.localhost(127.0.0.1:45103): fail errno 13 (Permission denied)`. Looking into this further I can see that the `v2.sock` is created as `root:root` but the worker processes run as `vcache`, so it is normal that the connection is denied?\r\n\r\nAdding `-arg \"-j none\"` to the `varnish` commands in the VTC makes the test pass.\r\n\r\nI've made the following reproducer MWE (a heavily trimmed down via_uds):\r\n```vtc\r\nvarnishtest \"basic uds\"\r\n\r\nserver s1 {\r\n\trxreq\r\n\ttxresp\r\n} -start\r\n\r\nvarnish v2 -arg \"-a uds=${tmpdir}/v2.sock\" -vcl+backend {\r\n} -start\r\n\r\nvarnish v1 -vcl {\r\n\tbackend v2 { .path = \"${tmpdir}/v2.sock\"; }\r\n\r\n\tsub vcl_recv {\r\n\t\tset req.backend_hint = v2;\r\n\t}\r\n} -start\r\n\r\n# Uncomment in order to examine system state\r\n# delay 20\r\n\r\nclient c1 {\r\n\ttxreq\r\n\trxresp\r\n\texpect resp.status == 200\r\n} -run\r\n```\r\n\r\nRunning these commands during the delay shows the issue:\r\n\r\n```shell\r\n# ls -lA /tmp/vtc.2754.159e675b/\r\ntotal 12\r\n-rw-r--r-- 1 root root 24 Sep 16 12:30 INFO\r\ndrwxr-xr-x 7 root varnish 4096 Sep 16 12:30 v1\r\ndrwxr-xr-x 7 root varnish 4096 Sep 16 12:30 v2\r\nsrwxr-xr-x 1 root root 0 Sep 16 12:30 v2.sock\r\n```\r\n\r\n`v2.sock` is `root:root`\r\n\r\n```shell\r\n# ps aux | grep varnishd\r\nvarnish 2878 0.0 0.1 39396 12356 pts/0 SL 12:30 0:00 varnishd -d -n /tmp/vtc.2872.33571ff0/v2 -i v2 -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p thread_pool_min=10 -p debug=+vtc_mode -p vsl_mask=+Debug,+H2RxHdr,+H2RxBody -p h2_initial_window_size=1m -p h2_rx_window_low_water=64k -M 127.0.0.1 37205 -P /tmp/vtc.2872.33571ff0/v2/varnishd.pid -a uds=/tmp/vtc.2872.33571ff0/v2.sock\r\nvcache 2894 1.0 0.7 217572 63596 pts/0 SLl 12:30 0:00 varnishd -d -n /tmp/vtc.2872.33571ff0/v2 -i v2 -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p thread_pool_min=10 -p debug=+vtc_mode -p vsl_mask=+Debug,+H2RxHdr,+H2RxBody -p h2_initial_window_size=1m -p h2_rx_window_low_water=64k -M 127.0.0.1 37205 -P /tmp/vtc.2872.33571ff0/v2/varnishd.pid -a uds=/tmp/vtc.2872.33571ff0/v2.sock\r\nvarnish 2933 0.5 0.1 39396 10312 pts/0 SL 12:30 0:00 varnishd -d -n /tmp/vtc.2872.33571ff0/v1 -i v1 -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p thread_pool_min=10 -p debug=+vtc_mode -p vsl_mask=+Debug,+H2RxHdr,+H2RxBody -p h2_initial_window_size=1m -p h2_rx_window_low_water=64k -a 127.0.0.1:0 -M 127.0.0.1 33001 -P /tmp/vtc.2872.33571ff0/v1/varnishd.pid\r\nvcache 2949 2.0 0.7 217572 63568 pts/0 SLl 12:30 0:00 varnishd -d -n /tmp/vtc.2872.33571ff0/v1 -i v1 -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p thread_pool_min=10 -p debug=+vtc_mode -p vsl_mask=+Debug,+H2RxHdr,+H2RxBody -p h2_initial_window_size=1m -p h2_rx_window_low_water=64k -a 127.0.0.1:0 -M 127.0.0.1 33001 -P /tmp/vtc.2872.33571ff0/v1/varnishd.pid\r\n```\r\n\r\nMasters are `varnish`, workers are `vcache`, not `root`.\r\n\r\n---\r\n\r\n[Full original failing VTC](https://github.com/user-attachments/files/17011618/vtc.txt)\r\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/121/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/121/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/122","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/122/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/122/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/122/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/122","id":2529375190,"node_id":"I_kwDOBBOOTM6WwzPW","number":122,"title":"7.6 branch","user":{"login":"gquintard","id":3776553,"node_id":"MDQ6VXNlcjM3NzY1NTM=","avatar_url":"https://avatars.githubusercontent.com/u/3776553?v=4","gravatar_id":"","url":"https://api.github.com/users/gquintard","html_url":"https://github.com/gquintard","followers_url":"https://api.github.com/users/gquintard/followers","following_url":"https://api.github.com/users/gquintard/following{/other_user}","gists_url":"https://api.github.com/users/gquintard/gists{/gist_id}","starred_url":"https://api.github.com/users/gquintard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gquintard/subscriptions","organizations_url":"https://api.github.com/users/gquintard/orgs","repos_url":"https://api.github.com/users/gquintard/repos","events_url":"https://api.github.com/users/gquintard/events{/privacy}","received_events_url":"https://api.github.com/users/gquintard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2024-09-16T20:10:00Z","updated_at":"2024-11-14T18:18:22Z","closed_at":"2024-11-14T18:18:22Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"can we get a release/branch/tag that will work with an installed Varnish please 7.6.\r\n\r\nRight now I'm getting the usual:\r\n```\r\nchecking for Varnish... 7.6.0\r\nconfigure: error: Varnish version trunk or higher is required.\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/122/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/122/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/123","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/123/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/123/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/123/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/123","id":2529383907,"node_id":"PR_kwDOBBOOTM57q3Nt","number":123,"title":"require 7.6","user":{"login":"gquintard","id":3776553,"node_id":"MDQ6VXNlcjM3NzY1NTM=","avatar_url":"https://avatars.githubusercontent.com/u/3776553?v=4","gravatar_id":"","url":"https://api.github.com/users/gquintard","html_url":"https://github.com/gquintard","followers_url":"https://api.github.com/users/gquintard/followers","following_url":"https://api.github.com/users/gquintard/following{/other_user}","gists_url":"https://api.github.com/users/gquintard/gists{/gist_id}","starred_url":"https://api.github.com/users/gquintard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gquintard/subscriptions","organizations_url":"https://api.github.com/users/gquintard/orgs","repos_url":"https://api.github.com/users/gquintard/repos","events_url":"https://api.github.com/users/gquintard/events{/privacy}","received_events_url":"https://api.github.com/users/gquintard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2024-09-16T20:13:30Z","updated_at":"2024-11-14T18:18:55Z","closed_at":"2024-11-14T18:18:55Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/123","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/123","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/123.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/123.patch","merged_at":null},"body":"just opening this PR so I can find that commit in this repository to build the Docker image","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/123/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/123/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/124","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/124/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/124/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/124/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/124","id":2530432380,"node_id":"I_kwDOBBOOTM6W01V8","number":124,"title":"Add wait_timeout & wait_limit","user":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804424,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjQ=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/enhancement","name":"enhancement","color":"84b6eb","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2024-09-17T08:36:29Z","updated_at":"2024-11-14T17:42:57Z","closed_at":"2024-11-14T17:42:57Z","author_association":"OWNER","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Ref https://github.com/varnishcache/varnish-cache/pull/4030","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/124/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/124/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/125","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/125/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/125/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/125/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/125","id":2542835261,"node_id":"PR_kwDOBBOOTM58YWGF","number":125,"title":"Fix layer_probe.vtc: dynamic -> ${vmod_dynamic}","user":{"login":"delthas","id":1863865,"node_id":"MDQ6VXNlcjE4NjM4NjU=","avatar_url":"https://avatars.githubusercontent.com/u/1863865?v=4","gravatar_id":"","url":"https://api.github.com/users/delthas","html_url":"https://github.com/delthas","followers_url":"https://api.github.com/users/delthas/followers","following_url":"https://api.github.com/users/delthas/following{/other_user}","gists_url":"https://api.github.com/users/delthas/gists{/gist_id}","starred_url":"https://api.github.com/users/delthas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/delthas/subscriptions","organizations_url":"https://api.github.com/users/delthas/orgs","repos_url":"https://api.github.com/users/delthas/repos","events_url":"https://api.github.com/users/delthas/events{/privacy}","received_events_url":"https://api.github.com/users/delthas/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2024-09-23T14:24:56Z","updated_at":"2024-09-24T09:57:53Z","closed_at":"2024-09-24T09:57:53Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/125","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/125","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/125.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/125.patch","merged_at":"2024-09-24T09:57:53Z"},"body":null,"closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/125/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/125/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/126","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/126/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/126/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/126/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/126","id":2652670463,"node_id":"I_kwDOBBOOTM6eHIn_","number":126,"title":"503 on first request for Dynamic Backends with probe","user":{"login":"ronald-sz","id":97725423,"node_id":"U_kgDOBdMr7w","avatar_url":"https://avatars.githubusercontent.com/u/97725423?v=4","gravatar_id":"","url":"https://api.github.com/users/ronald-sz","html_url":"https://github.com/ronald-sz","followers_url":"https://api.github.com/users/ronald-sz/followers","following_url":"https://api.github.com/users/ronald-sz/following{/other_user}","gists_url":"https://api.github.com/users/ronald-sz/gists{/gist_id}","starred_url":"https://api.github.com/users/ronald-sz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ronald-sz/subscriptions","organizations_url":"https://api.github.com/users/ronald-sz/orgs","repos_url":"https://api.github.com/users/ronald-sz/repos","events_url":"https://api.github.com/users/ronald-sz/events{/privacy}","received_events_url":"https://api.github.com/users/ronald-sz/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2024-11-12T16:21:14Z","updated_at":"2024-11-12T17:06:26Z","closed_at":"2024-11-12T17:06:25Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi Nils, \r\n\r\nwe are using Varnish 7.5. \r\n\r\nAfter a fresh start of Varnish I do not see any dynamic backends when I use `backend.list` in `varnishadm`. \r\n\r\nThis seems normal and after a first request a backend is generated. I suppose this happens as soon as Varnish executes the VCL-code:\r\n\r\n`set req.backend_hint = xxx.backend(\"xxxyyyzzz\");`\r\n\r\nIf there is no probe attached to this backend then the request is answered by a 200 response. \r\n\r\nAfter adding a probe to the backend the first request gets answered by a 503 response. \r\n\r\n```\r\nprobe readyCheckDefault {\r\n .url = \"/readyCheck\";\r\n .timeout = 1s;\r\n .interval = 3s;\r\n .window = 5;\r\n .threshold = 4;\r\n}\r\n\r\nnew xxx = dynamic.director(ttl = 10s, port = 3000, probe = readyCheckDefault);\r\n```\r\n\r\nIs this how it is supposed to work? Is this a bug? A misconfiguration on our side? \r\n\r\nThanks,\r\nRonald","closed_by":{"login":"ronald-sz","id":97725423,"node_id":"U_kgDOBdMr7w","avatar_url":"https://avatars.githubusercontent.com/u/97725423?v=4","gravatar_id":"","url":"https://api.github.com/users/ronald-sz","html_url":"https://github.com/ronald-sz","followers_url":"https://api.github.com/users/ronald-sz/followers","following_url":"https://api.github.com/users/ronald-sz/following{/other_user}","gists_url":"https://api.github.com/users/ronald-sz/gists{/gist_id}","starred_url":"https://api.github.com/users/ronald-sz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ronald-sz/subscriptions","organizations_url":"https://api.github.com/users/ronald-sz/orgs","repos_url":"https://api.github.com/users/ronald-sz/repos","events_url":"https://api.github.com/users/ronald-sz/events{/privacy}","received_events_url":"https://api.github.com/users/ronald-sz/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/126/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/126/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/127","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/127/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/127/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/127/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/127","id":2653837938,"node_id":"PR_kwDOBBOOTM6BtTLv","number":127,"title":"Add `wait_timeout` and `wait_limit` support","user":{"login":"karlvr","id":1086005,"node_id":"MDQ6VXNlcjEwODYwMDU=","avatar_url":"https://avatars.githubusercontent.com/u/1086005?v=4","gravatar_id":"","url":"https://api.github.com/users/karlvr","html_url":"https://github.com/karlvr","followers_url":"https://api.github.com/users/karlvr/followers","following_url":"https://api.github.com/users/karlvr/following{/other_user}","gists_url":"https://api.github.com/users/karlvr/gists{/gist_id}","starred_url":"https://api.github.com/users/karlvr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/karlvr/subscriptions","organizations_url":"https://api.github.com/users/karlvr/orgs","repos_url":"https://api.github.com/users/karlvr/repos","events_url":"https://api.github.com/users/karlvr/events{/privacy}","received_events_url":"https://api.github.com/users/karlvr/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2024-11-13T01:33:57Z","updated_at":"2024-11-14T20:27:50Z","closed_at":"2024-11-14T17:29:35Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/127","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/127","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/127.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/127.patch","merged_at":"2024-11-14T17:29:35Z"},"body":"Support the new backend parameters added in Varnish 7.6 for backend connection queuing as per https://varnish-cache.org/docs/7.6/whats-new/changes-7.6.html","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/127/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/127/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/128","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/128/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/128/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/128/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/128","id":2653848083,"node_id":"PR_kwDOBBOOTM6BtVfz","number":128,"title":"Least connections algorithm","user":{"login":"karlvr","id":1086005,"node_id":"MDQ6VXNlcjEwODYwMDU=","avatar_url":"https://avatars.githubusercontent.com/u/1086005?v=4","gravatar_id":"","url":"https://api.github.com/users/karlvr","html_url":"https://github.com/karlvr","followers_url":"https://api.github.com/users/karlvr/followers","following_url":"https://api.github.com/users/karlvr/following{/other_user}","gists_url":"https://api.github.com/users/karlvr/gists{/gist_id}","starred_url":"https://api.github.com/users/karlvr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/karlvr/subscriptions","organizations_url":"https://api.github.com/users/karlvr/orgs","repos_url":"https://api.github.com/users/karlvr/repos","events_url":"https://api.github.com/users/karlvr/events{/privacy}","received_events_url":"https://api.github.com/users/karlvr/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804424,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjQ=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/enhancement","name":"enhancement","color":"84b6eb","default":true,"description":null},{"id":2228311103,"node_id":"MDU6TGFiZWwyMjI4MzExMTAz","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/needs%20%E2%99%A1Sponsor","name":"needs ♡Sponsor","color":"e094d3","default":false,"description":"looking for support ♥"},{"id":2228316027,"node_id":"MDU6TGFiZWwyMjI4MzE2MDI3","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/needs%20varnish-cache","name":"needs varnish-cache","color":"006b75","default":false,"description":"needs work in varnish-cache"}],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":3,"created_at":"2024-11-13T01:39:43Z","updated_at":"2025-03-06T15:09:59Z","closed_at":null,"author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/128","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/128","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/128.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/128.patch","merged_at":null},"body":"Perhaps to reopen the conversation from #71, I have ported just the _least connections_ algorithm to the master branch. We have abandoned the weighted and slow start that complicated the previous implementation. We have been using `LEAST` in production for > 5 years. We've tried switching back to the default `RR` implementation but experience issues when one of our backends runs slowly.\r\n\r\nAs you noted in #71 it isn't a guarantee of least connections (as the connection is not reserved) however we are treating it as a heuristic, and as such it has worked really well for us.\r\n\r\nAgain, if you're interested, I am happy to work this code to get it into a shape you like. I've tried to reproduce the basic logic from `dom_find` in `dom_find_leastconn` without worrying about the `alt` behaviour as it uses `dom_find` as a fall-back anyway. I look forward to hearing your thoughts when you have the time & energy!","closed_by":null,"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/128/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/128/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/129","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/129/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/129/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/129/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/129","id":2702623880,"node_id":"I_kwDOBBOOTM6hFsSI","number":129,"title":"503 for first page load after starting Varnish, no backends listed","user":{"login":"poshaughnessy","id":151207,"node_id":"MDQ6VXNlcjE1MTIwNw==","avatar_url":"https://avatars.githubusercontent.com/u/151207?v=4","gravatar_id":"","url":"https://api.github.com/users/poshaughnessy","html_url":"https://github.com/poshaughnessy","followers_url":"https://api.github.com/users/poshaughnessy/followers","following_url":"https://api.github.com/users/poshaughnessy/following{/other_user}","gists_url":"https://api.github.com/users/poshaughnessy/gists{/gist_id}","starred_url":"https://api.github.com/users/poshaughnessy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/poshaughnessy/subscriptions","organizations_url":"https://api.github.com/users/poshaughnessy/orgs","repos_url":"https://api.github.com/users/poshaughnessy/repos","events_url":"https://api.github.com/users/poshaughnessy/events{/privacy}","received_events_url":"https://api.github.com/users/poshaughnessy/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2024-11-28T15:59:50Z","updated_at":"2024-11-29T16:27:33Z","closed_at":"2024-11-29T16:27:05Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi. Using this vmod (v7.5) for the first time, need some help please!\r\n\r\nWhen I start Varnish up (Mac, with `sudo varnishd -F -a 127.0.0.1:80 -f $(pwd)/varnish-local.vcl -s file,/tmp,500M`) and run `sudo varnishadm backend.list`, I see an empty list of backends.\r\n\r\nAnd when I try to load the page the first time, I get a `503` error. Varnishlog says `fail errno 61 (Connection refused)`. \r\n\r\nThis happens every time I stop and restart Varnish. _After_ the first page load, then the backend does appear in the list, is shown as `healthy`, and subsequent page loads work OK.\r\n\r\nThe backend application is up the whole time and I can't think why it wouldn't be able to connect the first time. I can't see any logs for the backend application which would indicate a request coming through, for the first page load.\r\n\r\nFull varnishlog for the problematic first request:\r\n\r\n```\r\n* << BeReq >> 3 \r\n- Begin bereq 2 fetch\r\n- VCL_use boot\r\n- Timestamp Start: 1732807418.475018 0.000000 0.000000\r\n- BereqMethod GET\r\n- BereqURL /ecom/products/\r\n- BereqProtocol HTTP/1.1\r\n- BereqHeader Host: localhost\r\n- BereqHeader sec-ch-ua: \"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"\r\n- BereqHeader sec-ch-ua-mobile: ?0\r\n- BereqHeader sec-ch-ua-platform: \"macOS\"\r\n- BereqHeader Upgrade-Insecure-Requests: 1\r\n- BereqHeader User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36\r\n- BereqHeader Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\r\n- BereqHeader Sec-Fetch-Site: none\r\n- BereqHeader Sec-Fetch-Mode: navigate\r\n- BereqHeader Sec-Fetch-User: ?1\r\n- BereqHeader Sec-Fetch-Dest: document\r\n- BereqHeader Accept-Language: en-GB,en-US;q=0.9,en;q=0.8\r\n- BereqHeader X-Forwarded-For: 127.0.0.1\r\n- BereqHeader Via: 1.1 HO-LAR17GRWNW7J (Varnish/7.5)\r\n- BereqHeader X-Iso-Timestamp: Thu, 28 Nov 2024 15:23:38 GMT\r\n- BereqHeader X-Esi-Request: false\r\n- BereqHeader X-Has-Token-Session: false\r\n- BereqHeader Cookie: X-Has-Token-Session=false\r\n- BereqHeader X-Mfe-Type: page\r\n- BereqHeader X-Cookie-Consent-Given: false\r\n- BereqHeader X-Functional-Cookie-Accepted: false\r\n- BereqHeader X-Analytics-Cookie-Accepted: false\r\n- BereqHeader X-Advertising-Cookie-Accepted: false\r\n- BereqHeader Accept-Encoding: gzip\r\n- BereqHeader X-Cache: MISS\r\n- BereqHeader X-Varnish: 3\r\n- VCL_call BACKEND_FETCH\r\n- VCL_return fetch\r\n- Timestamp Fetch: 1732807418.475039 0.000020 0.000020\r\n- FetchError backend browse(127.0.0.1:9190): fail errno 61 (Connection refused)\r\n- Timestamp Beresp: 1732807418.481269 0.006250 0.006229\r\n- Timestamp Error: 1732807418.481271 0.006253 0.000002\r\n- BerespProtocol HTTP/1.1\r\n- BerespStatus 503\r\n- BerespReason Backend fetch failed\r\n- BerespHeader Date: Thu, 28 Nov 2024 15:23:38 GMT\r\n- BerespHeader Server: Varnish\r\n- VCL_call BACKEND_ERROR\r\n- BerespHeader X-Log-Priority: ERROR\r\n- BerespHeader X-Varnish-Backend: browse\r\n- BerespHeader Content-Type: text/html; charset=utf-8\r\n- BerespHeader Retry-After: 5\r\n- VCL_return deliver\r\n- Storage malloc Transient\r\n- Length 278\r\n- BereqAcct 0 0 0 0 0 0\r\n- End \r\n\r\n* << Request >> 2 \r\n- Begin req 1 rxreq\r\n- Timestamp Start: 1732807418.471300 0.000000 0.000000\r\n- Timestamp Req: 1732807418.471300 0.000000 0.000000\r\n- VCL_use boot\r\n- ReqStart 127.0.0.1 50574 a0\r\n- ReqMethod GET\r\n- ReqURL /ecom/products/\r\n- ReqProtocol HTTP/1.1\r\n- ReqHeader Host: localhost\r\n- ReqHeader Connection: keep-alive\r\n- ReqHeader Cache-Control: max-age=0\r\n- ReqHeader sec-ch-ua: \"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"\r\n- ReqHeader sec-ch-ua-mobile: ?0\r\n- ReqHeader sec-ch-ua-platform: \"macOS\"\r\n- ReqHeader Upgrade-Insecure-Requests: 1\r\n- ReqHeader User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36\r\n- ReqHeader Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\r\n- ReqHeader Sec-Fetch-Site: none\r\n- ReqHeader Sec-Fetch-Mode: navigate\r\n- ReqHeader Sec-Fetch-User: ?1\r\n- ReqHeader Sec-Fetch-Dest: document\r\n- ReqHeader Accept-Encoding: gzip, deflate, br, zstd\r\n- ReqHeader Accept-Language: en-GB,en-US;q=0.9,en;q=0.8\r\n- ReqHeader Cookie: X-Has-Token-Session=false\r\n- ReqHeader X-Forwarded-For: 127.0.0.1\r\n- ReqHeader Via: 1.1 HO-LAR17GRWNW7J (Varnish/7.5)\r\n- VCL_call RECV\r\n- ReqHeader X-Iso-Timestamp: Thu, 28 Nov 2024 15:23:38 GMT\r\n- ReqHeader X-Esi-Request: false\r\n- ReqHeader X-Has-Token-Session: false\r\n- VCL_Log customerId:-1\r\n- ReqUnset Cookie: X-Has-Token-Session=false\r\n- ReqHeader Cookie: X-Has-Token-Session=false\r\n- ReqHeader X-Mfe-Type: page\r\n- ReqHeader X-Cookie-Consent-Given: false\r\n- ReqHeader X-Functional-Cookie-Accepted: false\r\n- ReqHeader X-Analytics-Cookie-Accepted: false\r\n- ReqHeader X-Advertising-Cookie-Accepted: false\r\n- VCL_return hash\r\n- ReqUnset Accept-Encoding: gzip, deflate, br, zstd\r\n- ReqHeader Accept-Encoding: gzip\r\n- VCL_call HASH\r\n- VCL_return lookup\r\n- VCL_call MISS\r\n- ReqHeader X-Cache: MISS\r\n- VCL_return fetch\r\n- Link bereq 3 fetch\r\n- Timestamp Fetch: 1732807418.481376 0.010076 0.010076\r\n- RespProtocol HTTP/1.1\r\n- RespStatus 503\r\n- RespReason Backend fetch failed\r\n- RespHeader Date: Thu, 28 Nov 2024 15:23:38 GMT\r\n- RespHeader Server: Varnish\r\n- RespHeader X-Log-Priority: ERROR\r\n- RespHeader X-Varnish-Backend: browse\r\n- RespHeader Content-Type: text/html; charset=utf-8\r\n- RespHeader Retry-After: 5\r\n- RespHeader X-Varnish: 2\r\n- RespHeader Age: 0\r\n- RespHeader Via: 1.1 HO-LAR17GRWNW7J (Varnish/7.5)\r\n- VCL_call DELIVER\r\n- RespHeader X-Proxy-Cache: MISS\r\n- RespHeader X-Mfe-Type: page\r\n- RespHeader Set-Cookie: X-Has-Token-Session=false; path=/; max-age=3600; samesite=strict; secure\r\n- VCL_return deliver\r\n- Timestamp Process: 1732807418.481394 0.010094 0.000018\r\n- Filters \r\n- RespHeader Content-Length: 278\r\n- RespHeader Connection: keep-alive\r\n- Timestamp Resp: 1732807418.481611 0.010311 0.000216\r\n- ReqAcct 796 0 796 429 278 707\r\n- End \r\n```\r\n\r\nRelevant parts of the VCL:\r\n\r\n```\r\nimport dynamic;\r\n\r\n...\r\n\r\nbackend default none;\r\n\r\n...\r\n\r\nsub vcl_init {\r\n new browse = dynamic.director(ttl = 15m, connect_timeout = 5s, first_byte_timeout = 30s, between_bytes_timeout = 10s);\r\n # Other backends...\r\n}\r\n\r\nsub vcl_recv {\r\n\r\n ...\r\n\r\n if () {\r\n set req.backend_hint = browse.backend(\"localhost\", \"9190\");\r\n }\r\n\r\n ...\r\n```\r\n\r\n(I can't share the whole VCL, but could share other specific bits as needed. I could also try to make a stripped-down VCL for minimal replication if helpful?)\r\n\r\nThe behaviour I was expecting was for the backends to be initialised at startup, but I might have assumed that incorrectly - on the fly is fine, as long as the first page load can be served correctly?\r\n\r\nThanks v much in advance and for all your work on this vmod, which should be really useful for us!","closed_by":{"login":"poshaughnessy","id":151207,"node_id":"MDQ6VXNlcjE1MTIwNw==","avatar_url":"https://avatars.githubusercontent.com/u/151207?v=4","gravatar_id":"","url":"https://api.github.com/users/poshaughnessy","html_url":"https://github.com/poshaughnessy","followers_url":"https://api.github.com/users/poshaughnessy/followers","following_url":"https://api.github.com/users/poshaughnessy/following{/other_user}","gists_url":"https://api.github.com/users/poshaughnessy/gists{/gist_id}","starred_url":"https://api.github.com/users/poshaughnessy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/poshaughnessy/subscriptions","organizations_url":"https://api.github.com/users/poshaughnessy/orgs","repos_url":"https://api.github.com/users/poshaughnessy/repos","events_url":"https://api.github.com/users/poshaughnessy/events{/privacy}","received_events_url":"https://api.github.com/users/poshaughnessy/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/129/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/129/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/130","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/130/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/130/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/130/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/130","id":2876199629,"node_id":"I_kwDOBBOOTM6rb1LN","number":130,"title":"Does HTTPS / SSL work out of the box?","user":{"login":"musabshak","id":20545913,"node_id":"MDQ6VXNlcjIwNTQ1OTEz","avatar_url":"https://avatars.githubusercontent.com/u/20545913?v=4","gravatar_id":"","url":"https://api.github.com/users/musabshak","html_url":"https://github.com/musabshak","followers_url":"https://api.github.com/users/musabshak/followers","following_url":"https://api.github.com/users/musabshak/following{/other_user}","gists_url":"https://api.github.com/users/musabshak/gists{/gist_id}","starred_url":"https://api.github.com/users/musabshak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/musabshak/subscriptions","organizations_url":"https://api.github.com/users/musabshak/orgs","repos_url":"https://api.github.com/users/musabshak/repos","events_url":"https://api.github.com/users/musabshak/events{/privacy}","received_events_url":"https://api.github.com/users/musabshak/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804427,"node_id":"MDU6TGFiZWw0NDM4MDQ0Mjc=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/question","name":"question","color":"cc317c","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":4,"created_at":"2025-02-24T21:31:50Z","updated_at":"2025-03-05T16:20:22Z","closed_at":"2025-02-25T13:17:47Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I am trying to use `libvmod-dynamic` to point Varnish to Google Cloud Storage's S3 REST API endpoint [1]: `storage.googleapis.com`. That is, trying to use Varnish as a caching forward-proxy to GCS. I need to use this / other similar \"dynamic backend\" VMOD because `storage.googleapis.com` resolves to multiple IPV4 + IPV6 IPs, and without using this VMOD, Varnish results in an error of the form:\n\n```\nBackend host \"url2.external-backend.com\": resolves to multiple IPv4 addresses.\nOnly one address is allowed.\nPlease specify which exact address you want to use, we found these:\n\n```\n\nWhen I configure a dynamic director with port \"80\", Varnish is able to connect to GCS just fine:\n\n```\n new d = dynamic.director(\n port = \"80\",\n whitelist = ipv4_only,\n connect_timeout = 5s,\n first_byte_timeout = 10s,\n between_bytes_timeout = 10s,\n ttl = 1s\n );\n\n set req.backend_hint = d.backend(host = \"storage.googleapis.com\");\n```\n\nBut when I switch to using \"443\" (HTTPS), Varnish is never able to connect to the GCS backend and returns errors:\n```\n- BackendOpen 33 d(142.251.214.155:443) 142.251.214.155 443 10.0.26.45 50656 connect\n- Timestamp Bereq: 1740431027.316045 0.002099 0.000087\n- FetchError HTC eof (Unexpected end of input)\n- BackendClose 33 d(142.251.214.155:443) close RX_BAD\n- Timestamp Beresp: 1740431027.318051 0.004105 0.002006\n- Timestamp Error: 1740431027.318055 0.004109 0.000003\n- BerespProtocol HTTP/1.1\n- BerespStatus 503\n- BerespReason Backend fetch failed\n- BerespHeader Date: Mon, 24 Feb 2025 21:03:47 GMT\n- BerespHeader Server: Varnish\n- VCL_call BACKEND_ERROR\n```\n\nThe motivation obviously is to use encrypted HTTPS for sending traffic over the public internet to/from GCS. \n\nDiscussion in https://github.com/nigoroll/libvmod-dynamic/pull/76 feels relevant. Any quick thoughts / pointers much appreciated. \n\nAnother similar \"dynamic backend\" VMOD (`reqwest` [2]) claims explicit support for HTTPS but I didn't see a similar claim in the `libvmod-dynamic` docs so I thought I'd quick check. Thank you!\n\n[1] https://cloud.google.com/storage/docs/interoperability\n[2] https://github.com/gquintard/vmod_reqwest\n\nimage: varnish:7.6.1","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/130/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/130/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/131","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/131/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/131/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/131/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/131","id":2900544129,"node_id":"I_kwDOBBOOTM6s4sqB","number":131,"title":"Big quit due to deadlock when destroying dynamic domains","user":{"login":"saaguero","id":2459621,"node_id":"MDQ6VXNlcjI0NTk2MjE=","avatar_url":"https://avatars.githubusercontent.com/u/2459621?v=4","gravatar_id":"","url":"https://api.github.com/users/saaguero","html_url":"https://github.com/saaguero","followers_url":"https://api.github.com/users/saaguero/followers","following_url":"https://api.github.com/users/saaguero/following{/other_user}","gists_url":"https://api.github.com/users/saaguero/gists{/gist_id}","starred_url":"https://api.github.com/users/saaguero/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/saaguero/subscriptions","organizations_url":"https://api.github.com/users/saaguero/orgs","repos_url":"https://api.github.com/users/saaguero/repos","events_url":"https://api.github.com/users/saaguero/events{/privacy}","received_events_url":"https://api.github.com/users/saaguero/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":2228316027,"node_id":"MDU6TGFiZWwyMjI4MzE2MDI3","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/needs%20varnish-cache","name":"needs varnish-cache","color":"006b75","default":false,"description":"needs work in varnish-cache"}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":10,"created_at":"2025-03-06T14:17:41Z","updated_at":"2025-12-07T16:04:48Z","closed_at":"2025-12-07T16:04:48Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"On normal operations, without much traffic, I have seen the following panic:\n\nThe way I used it is like the following (with haproxy for ssl)\n\n```vcl\nbackend sslon {\n .path = \"/run/sslon\";\n}\n\nsub vcl_init {\n new director = dynamic.director(\n ttl = 10s,\n via = sslon,\n port = 443);\n}\n\nsub vcl_backend_fetch {\n set bereq.backend = director.backend(regsub(bereq.http.baseUrl, \"^(https://)?(.*?)/?$\", \"\\2\"));\n return(fetch);\n}\n```\n\n```\nPanic at: Thu, 06 Mar 2025 04:55:00 GMT\nWrong turn at cache/cache_main.c:362:\nIt's time for the big quit\nversion = varnish-7.6.1 revision c3d5882003eb87e5e93dc09fb9513ca96db3ca3c, vrt api = 20.1\nident = Linux,6.8.0-1018-aws,x86_64,-jlinux,-smalloc,-sdefault,-hcritbit,epoll\nnow = 1766693.617585 (mono), 1741236889.395595 (real)\nBacktrace:\n 0x5b09f7de0ee4: /usr/sbin/varnishd(VBT_format+0x74) [0x5b09f7de0ee4]\n 0x5b09f7d5c440: /usr/sbin/varnishd(+0x60440) [0x5b09f7d5c440]\n 0x5b09f7de047c: /usr/sbin/varnishd(VAS_Fail+0x4c) [0x5b09f7de047c]\n 0x5b09f7d568f5: /usr/sbin/varnishd(+0x5a8f5) [0x5b09f7d568f5]\n 0x7165f9245330: /lib/x86_64-linux-gnu/libc.so.6(+0x45330) [0x7165f9245330]\n 0x7165f9298d6f: /lib/x86_64-linux-gnu/libc.so.6(+0x98d6f) [0x7165f9298d6f]\n 0x7165f929e7a3: /lib/x86_64-linux-gnu/libc.so.6(+0x9e7a3) [0x7165f929e7a3]\n 0x7165ddc5373f: ./vmod_cache/_vmod_dynamic.d0c0174a306f0e14bae5c6aeac83d361e4a831b344efeef7fb0d42bc921cd477(+0x473f) [0x7165ddc5373f]\n 0x5b09f7d6c5a4: /usr/sbin/varnishd(+0x705a4) [0x5b09f7d6c5a4]\n 0x5b09f7d6da0e: /usr/sbin/varnishd(+0x71a0e) [0x5b09f7d6da0e]\n 0x5b09f7d6e6b5: /usr/sbin/varnishd(+0x726b5) [0x5b09f7d6e6b5]\n 0x5b09f7de2dcb: /usr/sbin/varnishd(+0xe6dcb) [0x5b09f7de2dcb]\n 0x5b09f7de330b: /usr/sbin/varnishd(VCLS_Poll+0x32b) [0x5b09f7de330b]\n 0x5b09f7d37d74: /usr/sbin/varnishd(CLI_Run+0x74) [0x5b09f7d37d74]\n 0x5b09f7d570aa: /usr/sbin/varnishd(child_main+0x21a) [0x5b09f7d570aa]\n 0x5b09f7da2b15: /usr/sbin/varnishd(+0xa6b15) [0x5b09f7da2b15]\n 0x5b09f7da3d5f: /usr/sbin/varnishd(MCH_Start_Child+0xf) [0x5b09f7da3d5f]\n 0x5b09f7d29b02: /usr/sbin/varnishd(main+0x26b2) [0x5b09f7d29b02]\n 0x7165f922a1ca: /lib/x86_64-linux-gnu/libc.so.6(+0x2a1ca) [0x7165f922a1ca]\n 0x7165f922a28b: /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x8b) [0x7165f922a28b]\nargv = {\n [0] = \\\"/usr/sbin/varnishd\\\",\n [1] = \\\"-a\\\",\n [2] = \\\":80\\\",\n [3] = \\\"-a\\\",\n [4] = \\\"localhost:8443,proxy\\\",\n [5] = \\\"-T\\\",\n [6] = \\\"localhost:6082\\\",\n [7] = \\\"-f\\\",\n [8] = \\\"/etc/varnish/default.vcl\\\",\n [9] = \\\"-s\\\",\n [10] = \\\"malloc,7GB\\\",\n [11] = \\\"-p\\\",\n [12] = \\\"vsl_buffer=32KB\\\",\n [13] = \\\"-p\\\",\n [14] = \\\"vsl_reclen=16372b\\\",\n [15] = \\\"-p\\\",\n [16] = \\\"vsl_space=256MB\\\",\n [17] = \\\"-p\\\",\n [18] = \\\"workspace_client=4MB\\\",\n [19] = \\\"-p\\\",\n [20] = \\\"workspace_backend=1MB\\\",\n [21] = \\\"-p\\\",\n [22] = \\\"transit_buffer=1M\\\",\n [23] = \\\"-p\\\",\n [24] = \\\"timeout_idle=61\\\",\n [25] = \\\"-p\\\",\n [26] = \\\"thread_pool_min=1000\\\",\n [27] = \\\"-p\\\",\n [28] = \\\"thread_pool_max=2000\\\",\n [29] = \\\"-p\\\",\n [30] = \\\"feature=none,+vcl_req_reset\\\",\n}\npthread.self = 0x7165f99705c0\npthread.name = (cache-main)\npthread.attr = {\n guard = 0,\n stack_bottom = 0x7ffdd4ec8000,\n stack_top = 0x7ffdd56c6000,\n stack_size = 8380416,\n}\nthr.req = NULL\nthr.busyobj = NULL\nthr.worker = NULL\nvmods = {\n uuid = {0x7165f8ad7230, Varnish 7.6.1 c3d5882003eb87e5e93dc09fb9513ca96db3ca3c, 20.1},\n file = {0x7165f8ad72a0, Varnish 7.6.1 c3d5882003eb87e5e93dc09fb9513ca96db3ca3c, 20.1},\n querystring = {0x7165f8ad7310, Varnish 7.6.1 c3d5882003eb87e5e93dc09fb9513ca96db3ca3c, 20.1},\n std = {0x7165f8ad7380, Varnish 7.6.1 c3d5882003eb87e5e93dc09fb9513ca96db3ca3c, 0.0},\n str = {0x7165f8ad7460, Varnish 7.6.1 c3d5882003eb87e5e93dc09fb9513ca96db3ca3c, 0.0},\n dynamic = {0x7165f8ad7540, Varnish 7.6.1 c3d5882003eb87e5e93dc09fb9513ca96db3ca3c, 20.1},\n re = {0x7165f8ad75b0, Varnish 7.6.1 c3d5882003eb87e5e93dc09fb9513ca96db3ca3c, 20.1},\n frozen = {0x7165f8ad7620, Varnish 7.6.1 c3d5882003eb87e5e93dc09fb9513ca96db3ca3c, 0.0},\n},\npools = {\n pool = 0x7165e5e00000 {\n nidle = 28,\n nthr = 2000,\n lqueue = 1\n },\n pool = 0x7165e5e00140 {\n nidle = 28,\n nthr = 2000,\n lqueue = 1\n },\n},\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/131/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/131/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/132","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/132/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/132/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/132/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/132","id":2932136844,"node_id":"I_kwDOBBOOTM6uxNuM","number":132,"title":"Supporting dual stack networking (prefer IPv6)","user":{"login":"thomasklinger1234","id":39558817,"node_id":"MDQ6VXNlcjM5NTU4ODE3","avatar_url":"https://avatars.githubusercontent.com/u/39558817?v=4","gravatar_id":"","url":"https://api.github.com/users/thomasklinger1234","html_url":"https://github.com/thomasklinger1234","followers_url":"https://api.github.com/users/thomasklinger1234/followers","following_url":"https://api.github.com/users/thomasklinger1234/following{/other_user}","gists_url":"https://api.github.com/users/thomasklinger1234/gists{/gist_id}","starred_url":"https://api.github.com/users/thomasklinger1234/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thomasklinger1234/subscriptions","organizations_url":"https://api.github.com/users/thomasklinger1234/orgs","repos_url":"https://api.github.com/users/thomasklinger1234/repos","events_url":"https://api.github.com/users/thomasklinger1234/events{/privacy}","received_events_url":"https://api.github.com/users/thomasklinger1234/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804424,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjQ=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/enhancement","name":"enhancement","color":"84b6eb","default":true,"description":null}],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":4,"created_at":"2025-03-19T15:02:35Z","updated_at":"2026-01-08T13:31:39Z","closed_at":null,"author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"## Summary\n\nAs a developer, I want to configure `dynamic` VMOD to support dualstack when resolving backend endpoint IPs, so I can support dual stack architectures. \n\nIs it possible to \"prefer\" IPv6 somehow before libvmod-dynamic considers returning IPv4 addresses when calling `xdynamic.backend()` without hacking around with operating system settings, `/etc/gai.conf` or network architecture. \n\nI have looked into [this](https://github.com/nigoroll/libvmod-dynamic/blob/master/src/tests/resolver/test01.vtc) VTC test but after some tests it seems that the `acl` will rule out IPv4 addresses completely from DNS resolution but I would like to support a softer fallback to ease migration and integration for our backend teams. \n\n## Background\n\nOur network architecture mandates the usage of [dual stack](https://www.juniper.net/documentation/us/en/software/junos/is-is/topics/concept/ipv6-dual-stack-understanding.html) networking, i.e. support for both IPv4 and IPv6 addresses on the same DNS name (not record). Currently, the setup is `HAProxy -> Varnish backend -> HAproxy backend -> resolve-prefer ipv6 -> origin`, so a very standard Varnish architecture but we want to switch to using `libvmod-dynamic` instead. \n\nFor example, if I want to proxy `example.com` with Varnish and libvmod-dynamic, it resolves to the following IPs\n\n```\n$ dig +short A example.com\n23.215.0.136\n23.215.0.138\n96.7.128.175\n96.7.128.198\n23.192.228.80\n23.192.228.8\n\n$ dig +short AAAA example.com\n2600:1408:ec00:36::1736:7f24\n2600:1408:ec00:36::1736:7f31\n2600:1406:3a00:21::173e:2e65\n2600:1406:3a00:21::173e:2e66\n2600:1406:bc00:53::b81e:94c8\n2600:1406:bc00:53::b81e:94ce\n```\n\nMy use case involves the following scenario:\n- If `example.com` supports IPv6 via AAAA record, those IPs should be preferred\n- If `example.com` does not support IPv6, fallback to IPv4\n\nThis is similar to HAProxy's [resolve-prefer](https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#5.2-resolve-prefer) option. \n\n## Environment\n\n- Varnish with `libvmod-dynamic` from `varnish:7.6.1` docker image\n- HAProxy configured via `sslon` to onload TLS (otherwise we would simply use the HAProxy setting)","closed_by":null,"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/132/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/132/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/133","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/133/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/133/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/133/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/133","id":2988056403,"node_id":"PR_kwDOBBOOTM6SOhdI","number":133,"title":"Migrate to VCDK","user":{"login":"cartoush","id":16189883,"node_id":"MDQ6VXNlcjE2MTg5ODgz","avatar_url":"https://avatars.githubusercontent.com/u/16189883?v=4","gravatar_id":"","url":"https://api.github.com/users/cartoush","html_url":"https://github.com/cartoush","followers_url":"https://api.github.com/users/cartoush/followers","following_url":"https://api.github.com/users/cartoush/following{/other_user}","gists_url":"https://api.github.com/users/cartoush/gists{/gist_id}","starred_url":"https://api.github.com/users/cartoush/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cartoush/subscriptions","organizations_url":"https://api.github.com/users/cartoush/orgs","repos_url":"https://api.github.com/users/cartoush/repos","events_url":"https://api.github.com/users/cartoush/events{/privacy}","received_events_url":"https://api.github.com/users/cartoush/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2025-04-11T09:11:00Z","updated_at":"2025-07-01T13:35:34Z","closed_at":"2025-07-01T13:35:33Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/133","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/133","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/133.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/133.patch","merged_at":"2025-07-01T13:35:33Z"},"body":"Refactoring of this VMOD so that it corresponds\r\nto the schema described in https://git.sr.ht/~dridi/vcdk","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/133/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/133/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/134","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/134/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/134/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/134/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/134","id":3044768425,"node_id":"I_kwDOBBOOTM61e3qp","number":134,"title":"Varnish 7.7","user":{"login":"ronald-sz","id":97725423,"node_id":"U_kgDOBdMr7w","avatar_url":"https://avatars.githubusercontent.com/u/97725423?v=4","gravatar_id":"","url":"https://api.github.com/users/ronald-sz","html_url":"https://github.com/ronald-sz","followers_url":"https://api.github.com/users/ronald-sz/followers","following_url":"https://api.github.com/users/ronald-sz/following{/other_user}","gists_url":"https://api.github.com/users/ronald-sz/gists{/gist_id}","starred_url":"https://api.github.com/users/ronald-sz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ronald-sz/subscriptions","organizations_url":"https://api.github.com/users/ronald-sz/orgs","repos_url":"https://api.github.com/users/ronald-sz/repos","events_url":"https://api.github.com/users/ronald-sz/events{/privacy}","received_events_url":"https://api.github.com/users/ronald-sz/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":3,"created_at":"2025-05-07T05:51:40Z","updated_at":"2025-05-22T13:44:17Z","closed_at":"2025-05-21T14:58:40Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi Nils, \n\nis libvmod-dynamic ready for Varnish 7.7? If so, could we get a branch. \n\nThank you,\nRonald","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/134/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/134/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/135","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/135/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/135/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/135/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/135","id":3424025919,"node_id":"PR_kwDOBBOOTM6o9NQX","number":135,"title":"Revert \"Handle src/vmod_vcs_version.txt\"","user":{"login":"gquintard","id":3776553,"node_id":"MDQ6VXNlcjM3NzY1NTM=","avatar_url":"https://avatars.githubusercontent.com/u/3776553?v=4","gravatar_id":"","url":"https://api.github.com/users/gquintard","html_url":"https://github.com/gquintard","followers_url":"https://api.github.com/users/gquintard/followers","following_url":"https://api.github.com/users/gquintard/following{/other_user}","gists_url":"https://api.github.com/users/gquintard/gists{/gist_id}","starred_url":"https://api.github.com/users/gquintard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gquintard/subscriptions","organizations_url":"https://api.github.com/users/gquintard/orgs","repos_url":"https://api.github.com/users/gquintard/repos","events_url":"https://api.github.com/users/gquintard/events{/privacy}","received_events_url":"https://api.github.com/users/gquintard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":4,"created_at":"2025-09-16T23:23:25Z","updated_at":"2025-12-07T18:38:43Z","closed_at":"2025-12-07T15:53:32Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/135","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/135","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/135.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/135.patch","merged_at":null},"body":"This reverts commit 2b18abec24e8b51b0b316fa028ee01cad73fc533.\r\n\r\nOn 8.0, I'm getting:\r\n\r\n```\r\n/usr/bin/install -c -m 644 vmod_dynamic.vcc ./vmod_vcs_version.txt vtc/admin_health.vtc vtc/layer.vtc vtc/layer_probe.vtc vtc/layer_reload.vtc vtc/r00107.vtc vtc/stale_obj.vtc vtc/test01.vtc vtc/test02.vtc vtc/test03.vtc vtc/test04.vtc vtc/test05.vtc vtc/test06.vtc vtc/test07.vtc vtc/test08.vtc vtc/test09.vtc vtc/test10.vtc vtc/test11.vtc vtc/test12.vtc vtc/test13.vtc vtc/test14.vtc vtc/via.vtc vtc/via_uds.vtc vtc/nogetdns/resolver_init_error.vtc '/usr/share/doc/vmod-dynamic'\r\n/bin/mkdir -p '/usr/lib/varnish/vmods'\r\ninstall: can't stat './vmod_vcs_version.txt': No such file or directory\r\n```\r\n\r\n`vmod_vcs_version.txt` doesn't seem to be generated anymore, and reverting the original commit seems to do the job.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/135/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/135/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/136","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/136/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/136/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/136/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/136","id":3652238523,"node_id":"I_kwDOBBOOTM7ZsLy7","number":136,"title":"Support for Varnish 8.0.0","user":{"login":"ronald-sz","id":97725423,"node_id":"U_kgDOBdMr7w","avatar_url":"https://avatars.githubusercontent.com/u/97725423?v=4","gravatar_id":"","url":"https://api.github.com/users/ronald-sz","html_url":"https://github.com/ronald-sz","followers_url":"https://api.github.com/users/ronald-sz/followers","following_url":"https://api.github.com/users/ronald-sz/following{/other_user}","gists_url":"https://api.github.com/users/ronald-sz/gists{/gist_id}","starred_url":"https://api.github.com/users/ronald-sz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ronald-sz/subscriptions","organizations_url":"https://api.github.com/users/ronald-sz/orgs","repos_url":"https://api.github.com/users/ronald-sz/repos","events_url":"https://api.github.com/users/ronald-sz/events{/privacy}","received_events_url":"https://api.github.com/users/ronald-sz/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2025-11-21T15:59:26Z","updated_at":"2025-12-10T15:15:49Z","closed_at":"2025-12-07T16:33:54Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi Nils, \n\nis vmod_dynamic ready for using with Varnish 8.0.0? Could we get a branch for this?\n\nThank you!","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/136/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/136/timeline","performed_via_github_app":null,"state_reason":"completed"}] \ No newline at end of file diff --git a/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic%2Fissues%3Fafter=Y3Vyc29yOnYyOpLPAAABmqckTzDO2bC8uw%253D%253D&direction=asc&per_page=45&sort=created&state=all b/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic%2Fissues%3Fafter=Y3Vyc29yOnYyOpLPAAABmqckTzDO2bC8uw%253D%253D&direction=asc&per_page=45&sort=created&state=all new file mode 100644 index 0000000000..42a7d306dc --- /dev/null +++ b/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic%2Fissues%3Fafter=Y3Vyc29yOnYyOpLPAAABmqckTzDO2bC8uw%253D%253D&direction=asc&per_page=45&sort=created&state=all @@ -0,0 +1,24 @@ +X-Ratelimit-Reset: 1769189499 +X-Ratelimit-Used: 5 +Link: ; rel="prev" +Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset +Strict-Transport-Security: max-age=31536000; includeSubdomains; preload +X-Ratelimit-Limit: 5000 +X-Github-Request-Id: 545E:1E338F:1CE503C:199716F:6973A26E +Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With +X-Github-Media-Type: github.v3; param=squirrel-girl-preview +X-Frame-Options: deny +Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin +X-Ratelimit-Resource: core +Content-Type: application/json; charset=utf-8 +Cache-Control: private, max-age=60, s-maxage=60 +Etag: W/"c62d1ce27432411ccc529108455637a8bb6afea88b1be0bc1285beac77d2d917" +X-Github-Api-Version-Selected: 2022-11-28 +X-Content-Type-Options: nosniff +X-Ratelimit-Remaining: 4995 +X-Accepted-Github-Permissions: issues=read +Access-Control-Allow-Origin: * +X-Xss-Protection: 0 +Content-Security-Policy: default-src 'none' + +[{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/137","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/137/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/137/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/137/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/137","id":3720454114,"node_id":"I_kwDOBBOOTM7dwZ_i","number":137,"title":"resolver_test01.vtc is broken to the redirection","user":{"login":"gquintard","id":3776553,"node_id":"MDQ6VXNlcjM3NzY1NTM=","avatar_url":"https://avatars.githubusercontent.com/u/3776553?v=4","gravatar_id":"","url":"https://api.github.com/users/gquintard","html_url":"https://github.com/gquintard","followers_url":"https://api.github.com/users/gquintard/followers","following_url":"https://api.github.com/users/gquintard/following{/other_user}","gists_url":"https://api.github.com/users/gquintard/gists{/gist_id}","starred_url":"https://api.github.com/users/gquintard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gquintard/subscriptions","organizations_url":"https://api.github.com/users/gquintard/orgs","repos_url":"https://api.github.com/users/gquintard/repos","events_url":"https://api.github.com/users/gquintard/events{/privacy}","received_events_url":"https://api.github.com/users/gquintard/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2025-12-11T18:11:44Z","updated_at":"2025-12-12T11:12:19Z","closed_at":"2025-12-12T11:12:19Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"https://github.com/nigoroll/libvmod-dynamic/blob/master/src/vtc/resolver/resolver_test01.vtc#L25 now gets a 301.\n\nCan we get a release soon fixing this? Until then I'll disable tests while packaging as this is blocking the docker image builds","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/137/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/137/timeline","performed_via_github_app":null,"state_reason":"completed"}] \ No newline at end of file diff --git a/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic%2Fissues%3Fdirection=asc&per_page=45&sort=created&state=all b/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic%2Fissues%3Fdirection=asc&per_page=45&sort=created&state=all new file mode 100644 index 0000000000..c62ec9e6fc --- /dev/null +++ b/services/migrations/testdata/github/pagination/GET_%2Frepos%2Fnigoroll%2Flibvmod-dynamic%2Fissues%3Fdirection=asc&per_page=45&sort=created&state=all @@ -0,0 +1,24 @@ +X-Ratelimit-Reset: 1769189499 +X-Ratelimit-Resource: core +X-Github-Request-Id: 545E:1E338F:1CE3DD7:199617C:6973A26B +Content-Type: application/json; charset=utf-8 +Etag: W/"f4096a477bafdefb5addb2cef527544dd7d154491e9fc135eec41a153aee699e" +X-Accepted-Github-Permissions: issues=read +X-Frame-Options: deny +X-Xss-Protection: 0 +Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin +Content-Security-Policy: default-src 'none' +X-Ratelimit-Remaining: 4998 +X-Ratelimit-Limit: 5000 +X-Ratelimit-Used: 2 +Cache-Control: private, max-age=60, s-maxage=60 +Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With +Link: ; rel="next" +X-Github-Api-Version-Selected: 2022-11-28 +Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset +Access-Control-Allow-Origin: * +X-Content-Type-Options: nosniff +X-Github-Media-Type: github.v3; param=squirrel-girl-preview +Strict-Transport-Security: max-age=31536000; includeSubdomains; preload + +[{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/1","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/1/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/1/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/1/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/1","id":179302563,"node_id":"MDU6SXNzdWUxNzkzMDI1NjM=","number":1,"title":"What changes are needed for \"make check\" to work","user":{"login":"danielmotaleite","id":11890049,"node_id":"MDQ6VXNlcjExODkwMDQ5","avatar_url":"https://avatars.githubusercontent.com/u/11890049?v=4","gravatar_id":"","url":"https://api.github.com/users/danielmotaleite","html_url":"https://github.com/danielmotaleite","followers_url":"https://api.github.com/users/danielmotaleite/followers","following_url":"https://api.github.com/users/danielmotaleite/following{/other_user}","gists_url":"https://api.github.com/users/danielmotaleite/gists{/gist_id}","starred_url":"https://api.github.com/users/danielmotaleite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danielmotaleite/subscriptions","organizations_url":"https://api.github.com/users/danielmotaleite/orgs","repos_url":"https://api.github.com/users/danielmotaleite/repos","events_url":"https://api.github.com/users/danielmotaleite/events{/privacy}","received_events_url":"https://api.github.com/users/danielmotaleite/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":8,"created_at":"2016-09-26T18:27:04Z","updated_at":"2016-11-28T08:17:58Z","closed_at":"2016-10-04T15:36:24Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"You say `The test suite may not currently run without global (but minor) changes to your system.` , but make no reference on what to change for then to work.\n\nPlease add some more info\n\nThanks\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/1/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/1/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/2","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/2/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/2/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/2/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/2","id":181296166,"node_id":"MDU6SXNzdWUxODEyOTYxNjY=","number":2,"title":"Steal packaging goodies from vmod-querystring","user":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804424,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjQ=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/enhancement","name":"enhancement","color":"84b6eb","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/milestones/1","html_url":"https://github.com/nigoroll/libvmod-dynamic/milestone/1","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/milestones/1/labels","id":2411902,"node_id":"MDk6TWlsZXN0b25lMjQxMTkwMg==","number":1,"title":"1.0","description":null,"creator":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":0,"closed_issues":4,"state":"open","created_at":"2017-03-26T20:50:32Z","updated_at":"2019-07-13T16:40:27Z","due_on":null,"closed_at":null},"comments":3,"created_at":"2016-10-06T00:09:42Z","updated_at":"2018-09-12T15:22:07Z","closed_at":"2018-09-12T15:22:07Z","author_association":"COLLABORATOR","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"The current packaging was inherited from vmod-example when it still had packaging built-in. RPM packaging was maintained, but the debian stuff was left alone so I'm not even sure it works.\n\nThis module could advertise turnkey [RPM](https://github.com/Dridi/libvmod-querystring/blob/master/Makefile.am#L41-L68) and [DPKG](https://github.com/Dridi/libvmod-querystring/blob/master/Makefile.am#L70-L97) packaging directly from `make` if you have the relevant tools on your system. And that includes chroot-type builds, like for instance building for Debian Sid on a Fedora system.\n\nDebian support is still experimental in vmod-querystring, but at least it is maintained.\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/2/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/2/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/3","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/3/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/3/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/3/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/3","id":184464855,"node_id":"MDU6SXNzdWUxODQ0NjQ4NTU=","number":3,"title":"Building vmod on debian jessie with varnish 4.1.3 fails","user":{"login":"filidorwiese","id":864967,"node_id":"MDQ6VXNlcjg2NDk2Nw==","avatar_url":"https://avatars.githubusercontent.com/u/864967?v=4","gravatar_id":"","url":"https://api.github.com/users/filidorwiese","html_url":"https://github.com/filidorwiese","followers_url":"https://api.github.com/users/filidorwiese/followers","following_url":"https://api.github.com/users/filidorwiese/following{/other_user}","gists_url":"https://api.github.com/users/filidorwiese/gists{/gist_id}","starred_url":"https://api.github.com/users/filidorwiese/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/filidorwiese/subscriptions","organizations_url":"https://api.github.com/users/filidorwiese/orgs","repos_url":"https://api.github.com/users/filidorwiese/repos","events_url":"https://api.github.com/users/filidorwiese/events{/privacy}","received_events_url":"https://api.github.com/users/filidorwiese/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804424,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjQ=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/enhancement","name":"enhancement","color":"84b6eb","default":true,"description":null},{"id":443804427,"node_id":"MDU6TGFiZWw0NDM4MDQ0Mjc=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/question","name":"question","color":"cc317c","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/milestones/1","html_url":"https://github.com/nigoroll/libvmod-dynamic/milestone/1","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/milestones/1/labels","id":2411902,"node_id":"MDk6TWlsZXN0b25lMjQxMTkwMg==","number":1,"title":"1.0","description":null,"creator":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":0,"closed_issues":4,"state":"open","created_at":"2017-03-26T20:50:32Z","updated_at":"2019-07-13T16:40:27Z","due_on":null,"closed_at":null},"comments":8,"created_at":"2016-10-21T11:36:47Z","updated_at":"2018-09-12T15:20:53Z","closed_at":"2018-09-12T15:20:53Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi! I'm trying to build libvmod-dynamic on a minimum Debian Jessie environment with Varnish 4.1.3 already installed. When trying to run autogen.sh I get this error:\n\n```\n$ /root/libvmod-dynamic/autogen.sh\n+ aclocal -I m4 -I /usr/share/aclocal\n+ libtoolize --copy --force\nlibtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `build-aux'.\nlibtoolize: copying file `build-aux/ltmain.sh'\nlibtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.\nlibtoolize: copying file `m4/libtool.m4'\nlibtoolize: copying file `m4/ltoptions.m4'\nlibtoolize: copying file `m4/ltsugar.m4'\nlibtoolize: copying file `m4/ltversion.m4'\nlibtoolize: copying file `m4/lt~obsolete.m4'\n+ autoheader\n+ automake --add-missing --copy --foreign\nsrc/Makefile.am:4: error: 'vmod_LTLIBRARIES' is used but 'vmoddir' is undefined\nautomake: warnings are treated as errors\nsrc/Makefile.am:6: warning: variable 'libvmod_dynamic_la_SOURCES' is defined but no program or\nsrc/Makefile.am:6: library has 'libvmod_dynamic_la' as canonical name (possible typo)\nsrc/Makefile.am:10: warning: variable 'nodist_libvmod_dynamic_la_SOURCES' is defined but no program or\nsrc/Makefile.am:10: library has 'libvmod_dynamic_la' as canonical name (possible typo)\n```\n\nI'm probably missing something obvious. Could someone point me in the right direction?\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/3/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/3/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/4","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/4/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/4/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/4/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/4","id":185894138,"node_id":"MDU6SXNzdWUxODU4OTQxMzg=","number":4,"title":"Fetcherror no backend connection","user":{"login":"markhowells","id":3914721,"node_id":"MDQ6VXNlcjM5MTQ3MjE=","avatar_url":"https://avatars.githubusercontent.com/u/3914721?v=4","gravatar_id":"","url":"https://api.github.com/users/markhowells","html_url":"https://github.com/markhowells","followers_url":"https://api.github.com/users/markhowells/followers","following_url":"https://api.github.com/users/markhowells/following{/other_user}","gists_url":"https://api.github.com/users/markhowells/gists{/gist_id}","starred_url":"https://api.github.com/users/markhowells/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/markhowells/subscriptions","organizations_url":"https://api.github.com/users/markhowells/orgs","repos_url":"https://api.github.com/users/markhowells/repos","events_url":"https://api.github.com/users/markhowells/events{/privacy}","received_events_url":"https://api.github.com/users/markhowells/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804422,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjI=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/bug","name":"bug","color":"ee0701","default":true,"description":null}],"state":"closed","locked":false,"assignee":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":20,"created_at":"2016-10-28T10:50:32Z","updated_at":"2016-11-15T15:23:05Z","closed_at":"2016-11-15T15:23:05Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I'm trying to create a simple proxy for a site. As the details are unknown until runtime vmod_dynamic looked perfect. However about 30% of the time i see the following in the log\n\n```\n- VCL_call BACKEND_FETCH\n- VCL_return fetch\n- FetchError no backend connection\n```\n\nHere's a tiny VCL that causes the problem.\n\n```\nvcl 4.0;\nimport dynamic;\nbackend default {\n .host = \"10.0.0.1\";\n .port = \"80\";\n}\nsub vcl_init {\n new dynamic_dir = dynamic.director( port=\"80\" );\n}\nsub vcl_recv {\n set req.backend_hint = dynamic_dir.backend();\n}\nsub vcl_backend_fetch {\n set bereq.backend = dynamic_dir.backend();\n}\n\n```\n\nAs it stands, I'd expect that to proxy any traffic that reaches it (I'm not expecting this to cache or anything yet). I've been testing using a range of sites but a simple test add the following to your hosts file on a desktop\n` www.dalestrailseries.co.uk`\nand point your browser at http://www.dalestrailseries.co.uk \n\nAt best you'll either see a whole page or a broken page or just an error, click a sidebar link or two and it'll always break. The same issue exists with every site i've set up... I've experimented with every timeout I can and nothing seems to change\n\nI should add that I'm totally new to Varnish - I apologise in advance if I've got the wrong end of the stick somewhere...\n\nI've attached the varnishlog\n\n[varnishlog.txt](https://github.com/nigoroll/libvmod-dynamic/files/558154/varnishlog.txt)\n","closed_by":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/4/reactions","total_count":1,"+1":1,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/4/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/5","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/5/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/5/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/5/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/5","id":187436711,"node_id":"MDExOlB1bGxSZXF1ZXN0OTI0MTQ2Njk=","number":5,"title":"Avoid deadlocking when going cold.","user":{"login":"felipewd","id":547142,"node_id":"MDQ6VXNlcjU0NzE0Mg==","avatar_url":"https://avatars.githubusercontent.com/u/547142?v=4","gravatar_id":"","url":"https://api.github.com/users/felipewd","html_url":"https://github.com/felipewd","followers_url":"https://api.github.com/users/felipewd/followers","following_url":"https://api.github.com/users/felipewd/following{/other_user}","gists_url":"https://api.github.com/users/felipewd/gists{/gist_id}","starred_url":"https://api.github.com/users/felipewd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/felipewd/subscriptions","organizations_url":"https://api.github.com/users/felipewd/orgs","repos_url":"https://api.github.com/users/felipewd/repos","events_url":"https://api.github.com/users/felipewd/events{/privacy}","received_events_url":"https://api.github.com/users/felipewd/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2016-11-04T20:58:18Z","updated_at":"2016-11-04T23:12:05Z","closed_at":"2016-11-04T23:11:58Z","author_association":"NONE","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/5","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/5","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/5.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/5.patch","merged_at":null},"body":"When we receive a cold/discard vmod event, we do a pthread_join with\r\nobj->mtx held.\r\n\r\nThis creates the possibility for a deadlock if, at the same time we're\r\nabout to pthread_join, another thread is in dynamic_update, which tries\r\nto hold the same mutex:\r\n\r\n\r\n```\r\nvmod_event thread_A\r\nobj->active = 0\r\nlock(obj->mtx)\r\n.\r\n. lock(obj->mtx) -> deadlocks\r\n. .\r\npthread_join(thread_A) .\r\n. .\r\n. unlock(obj->mtx)\r\n.\r\nunlock(obj->mtx)\r\n\r\n```\r\nThe solution is after we get the DNS results, we do an early check if\r\nthe obj is still active. If it's not, just exit there and finish the\r\nthread.\r\n\r\nThis fixes https://github.com/varnishcache/varnish-cache/issues/2103","closed_by":{"login":"felipewd","id":547142,"node_id":"MDQ6VXNlcjU0NzE0Mg==","avatar_url":"https://avatars.githubusercontent.com/u/547142?v=4","gravatar_id":"","url":"https://api.github.com/users/felipewd","html_url":"https://github.com/felipewd","followers_url":"https://api.github.com/users/felipewd/followers","following_url":"https://api.github.com/users/felipewd/following{/other_user}","gists_url":"https://api.github.com/users/felipewd/gists{/gist_id}","starred_url":"https://api.github.com/users/felipewd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/felipewd/subscriptions","organizations_url":"https://api.github.com/users/felipewd/orgs","repos_url":"https://api.github.com/users/felipewd/repos","events_url":"https://api.github.com/users/felipewd/events{/privacy}","received_events_url":"https://api.github.com/users/felipewd/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/5/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/5/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/6","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/6/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/6/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/6/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/6","id":187459577,"node_id":"MDExOlB1bGxSZXF1ZXN0OTI0MzEyNDI=","number":6,"title":"Avoid deadlocking when going cold - take 2","user":{"login":"felipewd","id":547142,"node_id":"MDQ6VXNlcjU0NzE0Mg==","avatar_url":"https://avatars.githubusercontent.com/u/547142?v=4","gravatar_id":"","url":"https://api.github.com/users/felipewd","html_url":"https://github.com/felipewd","followers_url":"https://api.github.com/users/felipewd/followers","following_url":"https://api.github.com/users/felipewd/following{/other_user}","gists_url":"https://api.github.com/users/felipewd/gists{/gist_id}","starred_url":"https://api.github.com/users/felipewd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/felipewd/subscriptions","organizations_url":"https://api.github.com/users/felipewd/orgs","repos_url":"https://api.github.com/users/felipewd/repos","events_url":"https://api.github.com/users/felipewd/events{/privacy}","received_events_url":"https://api.github.com/users/felipewd/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2016-11-04T23:29:34Z","updated_at":"2016-11-07T15:42:22Z","closed_at":"2016-11-07T15:42:22Z","author_association":"NONE","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/6","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/6","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/6.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/6.patch","merged_at":null},"body":"When we receive a cold/discard vmod event, we do a pthread_join with\r\nobj->mtx held.\r\n\r\nThis creates the possibility for a deadlock if, at the same time we're\r\nabout to pthread_join, another thread is in dynamic_update, which tries\r\nto hold the same mutex:\r\n\r\n```\r\nvmod_event thread_A\r\nobj->active = 0\r\nlock(obj->mtx)\r\n.\r\n. lock(obj->mtx) -> deadlock\r\n. .\r\npthread_join(thread_A) .\r\n. .\r\n. unlock(obj->mtx)\r\n.\r\nunlock(obj->mtx)\r\n\r\n```\r\nThe solution is after we get the DNS results, we do an early check if\r\nthe obj is still active. If it's not, just exit there and finish the\r\nthread.\r\n\r\nSince we're dropping the update and exiting the thread, the user can be confused if this is logged in SLT_Error or SLT_VCL_Log.\r\n\r\nThis fixes varnishcache/varnish-cache#2103","closed_by":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/6/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/6/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/7","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/7/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/7/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/7/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/7","id":187761638,"node_id":"MDU6SXNzdWUxODc3NjE2Mzg=","number":7,"title":"infinite loop in dynamic_resolve","user":{"login":"felipewd","id":547142,"node_id":"MDQ6VXNlcjU0NzE0Mg==","avatar_url":"https://avatars.githubusercontent.com/u/547142?v=4","gravatar_id":"","url":"https://api.github.com/users/felipewd","html_url":"https://github.com/felipewd","followers_url":"https://api.github.com/users/felipewd/followers","following_url":"https://api.github.com/users/felipewd/following{/other_user}","gists_url":"https://api.github.com/users/felipewd/gists{/gist_id}","starred_url":"https://api.github.com/users/felipewd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/felipewd/subscriptions","organizations_url":"https://api.github.com/users/felipewd/orgs","repos_url":"https://api.github.com/users/felipewd/repos","events_url":"https://api.github.com/users/felipewd/events{/privacy}","received_events_url":"https://api.github.com/users/felipewd/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804422,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjI=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/bug","name":"bug","color":"ee0701","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":17,"created_at":"2016-11-07T16:39:59Z","updated_at":"2018-09-12T15:19:25Z","closed_at":"2018-09-12T15:19:25Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi,\r\n\r\nWe're facing an infinite loop in dynamic_resolve:\r\n\r\n> do {\r\n> if (next != NULL)\r\n> next = VTAILQ_NEXT(next, list);\r\n> if (next == NULL)\r\n> next = VTAILQ_FIRST(&dom->refs);\r\n> } while (next != dom->current &&\r\n> !next->be->dir->healthy(next->be->dir, NULL, NULL));\r\n\r\none possible cause for this is dom->current being NULL in first place.\r\n\r\nOnly one other function changes the value of dom->current and _could_ make this condition possible, it's dynamic_del:\r\n\r\n> if (r == dom->current)\r\n> dom->current = VTAILQ_NEXT(r, list);\r\n\r\nSince this part of the code doesn't have the protection to go back do VTAILQ_FIRST in case NEXT is NULL.\r\n\r\nWe'll submit a patch to fix this.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/7/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/7/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/8","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/8/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/8/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/8/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/8","id":187761915,"node_id":"MDExOlB1bGxSZXF1ZXN0OTI2MTg2MDg=","number":8,"title":"Never allow a NULL reference in dom->current","user":{"login":"felipewd","id":547142,"node_id":"MDQ6VXNlcjU0NzE0Mg==","avatar_url":"https://avatars.githubusercontent.com/u/547142?v=4","gravatar_id":"","url":"https://api.github.com/users/felipewd","html_url":"https://github.com/felipewd","followers_url":"https://api.github.com/users/felipewd/followers","following_url":"https://api.github.com/users/felipewd/following{/other_user}","gists_url":"https://api.github.com/users/felipewd/gists{/gist_id}","starred_url":"https://api.github.com/users/felipewd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/felipewd/subscriptions","organizations_url":"https://api.github.com/users/felipewd/orgs","repos_url":"https://api.github.com/users/felipewd/repos","events_url":"https://api.github.com/users/felipewd/events{/privacy}","received_events_url":"https://api.github.com/users/felipewd/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2016-11-07T16:40:53Z","updated_at":"2016-12-01T15:02:02Z","closed_at":"2016-12-01T15:02:02Z","author_association":"NONE","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/8","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/8","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/8.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/8.patch","merged_at":null},"body":"If dom->current is the very last position on the queue and we're going\r\nto delete it, VTAILQ_NEXT is going to be NULL. When this happens,\r\ngo back to the first element.\r\n\r\nThis fixes issue #7","closed_by":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/8/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/8/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/9","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/9/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/9/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/9/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/9","id":189007684,"node_id":"MDU6SXNzdWUxODkwMDc2ODQ=","number":9,"title":"Condition(Segmentation fault by instruction at 0x8) not true","user":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804422,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjI=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/bug","name":"bug","color":"ee0701","default":true,"description":null}],"state":"closed","locked":false,"assignee":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":1,"created_at":"2016-11-14T00:40:46Z","updated_at":"2016-11-28T23:21:25Z","closed_at":"2016-11-28T23:21:25Z","author_association":"COLLABORATOR","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I managed to make Varnish panic while I was writing a test case:\r\n\r\n```\r\nvarnishtest \"debugging\"\r\n\r\nserver s1 {\r\n\trxreq\r\n\ttxresp\r\n\r\n\taccept\r\n\trxreq\r\n\ttxresp\r\n\r\n\taccept\r\n\trxreq\r\n\ttxresp\r\n} -start\r\n\r\nvarnish v1 -vcl {\r\n\timport ${vmod_dynamic};\r\n\r\n\tbackend dummy { .host = \"${bad_ip}\"; .port = \"9080\"; }\r\n\r\n\tacl ipv4_loopback {\r\n\t\t\"127/24\";\r\n\t}\r\n\r\n\tsub vcl_init {\r\n\t\tnew d1 = dynamic.director(\r\n\t\t\tport = \"${s1_port}\",\r\n\t\t\twhitelist = ipv4_loopback,\r\n\t\t\tdomain_usage_timeout = 1s);\r\n\t\td1.debug(true);\r\n\t}\r\n\r\n\tsub vcl_recv {\r\n\t\tset req.backend_hint = d1.backend();\r\n\t}\r\n} -start\r\n\r\nlogexpect l1 -v v1 -g raw {\r\n\texpect * * Debug\t\"vmod-dynamic: vcl1 d1 localhost addr 127.0.0.1\"\r\n\texpect * * VCL_acl\t\"^MATCH ipv4_loopback\"\r\n\texpect * * Debug\t\"vmod-dynamic: vcl1 d1 localhost add-backend d1(127.0.0.1)\"\r\n\texpect * * Debug\t\"vmod-dynamic: vcl1 d1 localhost ref-backend d1(127.0.0.1) (1 in total)\"\r\n\texpect * * Debug\t\"vmod-dynamic: vcl1 d1 img.localhost addr 127.0.0.1\"\r\n\texpect * * VCL_acl\t\"^MATCH ipv4_loopback\"\r\n\texpect * * Debug\t\"vmod-dynamic: vcl1 d1 img.localhost ref-backend d1(127.0.0.1) (2 in total)\"\r\n\texpect * * VCL_Log\t\"vmod-dynamic: vcl1 d1 localhost deleted\"\r\n\texpect * * Debug\t\"vmod-dynamic: vcl1 d1 localhost unref-backend d1(127.0.0.1) (1 remaining)\"\r\n} -start\r\n\r\nclient c1 {\r\n\ttxreq -hdr \"Host: localhost\"\r\n\trxresp\r\n\texpect resp.status == 200\r\n\r\n\tdelay 1.5\r\n\r\n\ttxreq -hdr \"Host: img.localhost\"\r\n\trxresp\r\n\texpect resp.status == 200\r\n\r\n\ttxreq -hdr \"Host: www.localhost\"\r\n\trxresp\r\n\texpect resp.status == 200\r\n} -run\r\n\r\nlogexpect l1 -wait\r\n```\r\n\r\nFiling it here to make sure not to forget it, it may be related to recent changes in master.","closed_by":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/9/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/9/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/10","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/10/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/10/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/10/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/10","id":190753343,"node_id":"MDExOlB1bGxSZXF1ZXN0OTQ2MzkzNTI=","number":10,"title":"Fix use-after-free","user":{"login":"rnsanchez","id":87608,"node_id":"MDQ6VXNlcjg3NjA4","avatar_url":"https://avatars.githubusercontent.com/u/87608?v=4","gravatar_id":"","url":"https://api.github.com/users/rnsanchez","html_url":"https://github.com/rnsanchez","followers_url":"https://api.github.com/users/rnsanchez/followers","following_url":"https://api.github.com/users/rnsanchez/following{/other_user}","gists_url":"https://api.github.com/users/rnsanchez/gists{/gist_id}","starred_url":"https://api.github.com/users/rnsanchez/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rnsanchez/subscriptions","organizations_url":"https://api.github.com/users/rnsanchez/orgs","repos_url":"https://api.github.com/users/rnsanchez/repos","events_url":"https://api.github.com/users/rnsanchez/events{/privacy}","received_events_url":"https://api.github.com/users/rnsanchez/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":3,"created_at":"2016-11-21T15:42:48Z","updated_at":"2016-11-21T15:54:18Z","closed_at":"2016-11-21T15:46:58Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/10","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/10","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/10.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/10.patch","merged_at":"2016-11-21T15:46:58Z"},"body":"Clang's static analyzer found a use-after-free in dynamic_stop(). dom\r\npointer is passed to dynamic_free() which deallocate its contents, but\r\nupon returning from dynamic_free(), dom and its possibly-stale contents\r\nare used unguarded in VTAILQ_REMOVE(), immediately.\r\n\r\nThis use-after-free could explain the hard-to-reproduce issue #7.","closed_by":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/10/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/10/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/11","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/11/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/11/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/11/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/11","id":191737172,"node_id":"MDExOlB1bGxSZXF1ZXN0OTUzMjg4OTI=","number":11,"title":"Fix #9 in two parts","user":{"login":"rnsanchez","id":87608,"node_id":"MDQ6VXNlcjg3NjA4","avatar_url":"https://avatars.githubusercontent.com/u/87608?v=4","gravatar_id":"","url":"https://api.github.com/users/rnsanchez","html_url":"https://github.com/rnsanchez","followers_url":"https://api.github.com/users/rnsanchez/followers","following_url":"https://api.github.com/users/rnsanchez/following{/other_user}","gists_url":"https://api.github.com/users/rnsanchez/gists{/gist_id}","starred_url":"https://api.github.com/users/rnsanchez/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rnsanchez/subscriptions","organizations_url":"https://api.github.com/users/rnsanchez/orgs","repos_url":"https://api.github.com/users/rnsanchez/repos","events_url":"https://api.github.com/users/rnsanchez/events{/privacy}","received_events_url":"https://api.github.com/users/rnsanchez/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804422,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjI=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/bug","name":"bug","color":"ee0701","default":true,"description":null}],"state":"closed","locked":false,"assignee":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":8,"created_at":"2016-11-25T16:37:24Z","updated_at":"2016-11-29T10:30:31Z","closed_at":"2016-11-28T23:21:25Z","author_association":"CONTRIBUTOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/11","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/11","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/11.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/11.patch","merged_at":null},"body":"With the patches in this PR, I cannot reproduce the problem proposed in #9 anymore.\r\n\r\nThe first commit fixes three other cases of use-after-free. While inspecting `dynamic_free()`, it is my understanding that given the opportunity, memory being accessed just after deallocation could lead to unexpected results. By itself, this commit does not fix #9.\r\n\r\nThe second commit avoids cleaning up the `purged_domains` list in the case domain `addr` (received in `dynamic_search()`) was not found in the `active_domains` list, thus leaving `dom` uninitialized.\r\n\r\nPlease review, since this might not be a trivial change.","closed_by":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/11/reactions","total_count":1,"+1":1,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/11/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/12","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/12/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/12/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/12/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/12","id":198042367,"node_id":"MDU6SXNzdWUxOTgwNDIzNjc=","number":12,"title":"assert in dynamic_free","user":{"login":"felipewd","id":547142,"node_id":"MDQ6VXNlcjU0NzE0Mg==","avatar_url":"https://avatars.githubusercontent.com/u/547142?v=4","gravatar_id":"","url":"https://api.github.com/users/felipewd","html_url":"https://github.com/felipewd","followers_url":"https://api.github.com/users/felipewd/followers","following_url":"https://api.github.com/users/felipewd/following{/other_user}","gists_url":"https://api.github.com/users/felipewd/gists{/gist_id}","starred_url":"https://api.github.com/users/felipewd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/felipewd/subscriptions","organizations_url":"https://api.github.com/users/felipewd/orgs","repos_url":"https://api.github.com/users/felipewd/repos","events_url":"https://api.github.com/users/felipewd/events{/privacy}","received_events_url":"https://api.github.com/users/felipewd/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804422,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjI=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/bug","name":"bug","color":"ee0701","default":true,"description":null}],"state":"closed","locked":false,"assignee":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":0,"created_at":"2016-12-29T17:36:42Z","updated_at":"2017-01-02T10:56:07Z","closed_at":"2017-01-02T10:56:07Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hey @Dridi,\r\n\r\nWe caught this assert today:\r\n\r\n```\r\n\"Assert error in dynamic_free(), vmod_dynamic.c line 506:\r\n Condition((dom->thread) == 0) not true.\r\nBacktrace:\r\n 0x43e6d0: pan_backtrace+0x1d\r\n 0x43eb27: pan_ic+0x2f3\r\n 0x7abdfedfa32e: libvmod_dynamic.so(+0x232e) [0x7abdfedfa32e]\r\n 0x7abdfedfb54b: libvmod_dynamic.so(vmod_event+0x31b) [0x7abdfedfb54b]\r\n 0x7abd29304219: vgc.so(+0x2e219) [0x7abd29304219]\r\n 0x44d354: vcl_failsafe_event+0x223\r\n 0x44d881: vcl_set_state+0x366\r\n 0x44e3de: VCL_Poll+0xb1\r\n 0x41cfba: cli_cb_before+0x6c\r\n 0x7fcd16dac0b4: libvarnish.so(+0x80b4) [0x7fcd16dac0b4]\r\n\r\n\"\r\n```\r\n","closed_by":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/12/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/12/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/13","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/13/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/13/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/13/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/13","id":198042563,"node_id":"MDExOlB1bGxSZXF1ZXN0OTk2ODA0MzU=","number":13,"title":"Always set dom->thread to 0 after a pthread join.","user":{"login":"felipewd","id":547142,"node_id":"MDQ6VXNlcjU0NzE0Mg==","avatar_url":"https://avatars.githubusercontent.com/u/547142?v=4","gravatar_id":"","url":"https://api.github.com/users/felipewd","html_url":"https://github.com/felipewd","followers_url":"https://api.github.com/users/felipewd/followers","following_url":"https://api.github.com/users/felipewd/following{/other_user}","gists_url":"https://api.github.com/users/felipewd/gists{/gist_id}","starred_url":"https://api.github.com/users/felipewd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/felipewd/subscriptions","organizations_url":"https://api.github.com/users/felipewd/orgs","repos_url":"https://api.github.com/users/felipewd/repos","events_url":"https://api.github.com/users/felipewd/events{/privacy}","received_events_url":"https://api.github.com/users/felipewd/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804424,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjQ=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/enhancement","name":"enhancement","color":"84b6eb","default":true,"description":null}],"state":"closed","locked":false,"assignee":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":4,"created_at":"2016-12-29T17:38:07Z","updated_at":"2017-01-02T23:16:17Z","closed_at":"2017-01-02T23:16:17Z","author_association":"NONE","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/13","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/13","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/13.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/13.patch","merged_at":null},"body":"After a pthread_join we need to guarantee that dom->thread is set to 0\r\nto avoid problems in dynamic_free.\r\n\r\nTo avoid copy+paste problems, let's do this in a simple function.\r\n\r\nFixes #12 ","closed_by":{"login":"felipewd","id":547142,"node_id":"MDQ6VXNlcjU0NzE0Mg==","avatar_url":"https://avatars.githubusercontent.com/u/547142?v=4","gravatar_id":"","url":"https://api.github.com/users/felipewd","html_url":"https://github.com/felipewd","followers_url":"https://api.github.com/users/felipewd/followers","following_url":"https://api.github.com/users/felipewd/following{/other_user}","gists_url":"https://api.github.com/users/felipewd/gists{/gist_id}","starred_url":"https://api.github.com/users/felipewd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/felipewd/subscriptions","organizations_url":"https://api.github.com/users/felipewd/orgs","repos_url":"https://api.github.com/users/felipewd/repos","events_url":"https://api.github.com/users/felipewd/events{/privacy}","received_events_url":"https://api.github.com/users/felipewd/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/13/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/13/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/14","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/14/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/14/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/14/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/14","id":200291644,"node_id":"MDU6SXNzdWUyMDAyOTE2NDQ=","number":14,"title":"Difficulty building against Varnish 5.0 on Ubuntu 16.04","user":{"login":"scottybrisbane","id":5016282,"node_id":"MDQ6VXNlcjUwMTYyODI=","avatar_url":"https://avatars.githubusercontent.com/u/5016282?v=4","gravatar_id":"","url":"https://api.github.com/users/scottybrisbane","html_url":"https://github.com/scottybrisbane","followers_url":"https://api.github.com/users/scottybrisbane/followers","following_url":"https://api.github.com/users/scottybrisbane/following{/other_user}","gists_url":"https://api.github.com/users/scottybrisbane/gists{/gist_id}","starred_url":"https://api.github.com/users/scottybrisbane/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scottybrisbane/subscriptions","organizations_url":"https://api.github.com/users/scottybrisbane/orgs","repos_url":"https://api.github.com/users/scottybrisbane/repos","events_url":"https://api.github.com/users/scottybrisbane/events{/privacy}","received_events_url":"https://api.github.com/users/scottybrisbane/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804427,"node_id":"MDU6TGFiZWw0NDM4MDQ0Mjc=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/question","name":"question","color":"cc317c","default":true,"description":null}],"state":"closed","locked":false,"assignee":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":5,"created_at":"2017-01-12T06:50:18Z","updated_at":"2017-02-28T06:35:56Z","closed_at":"2017-02-28T06:35:56Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I'm having trouble compiling the vmod against Varnish 5.0 on a Ubuntu 16.04 machine. When running `./autogen.sh` I receive the following output:\r\n\r\n```\r\n+ aclocal -I m4 -I /usr/share/aclocal\r\n+ libtoolize --copy --force\r\nlibtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, 'build-aux'.\r\nlibtoolize: copying file 'build-aux/ltmain.sh'\r\nlibtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.\r\nlibtoolize: copying file 'm4/libtool.m4'\r\nlibtoolize: copying file 'm4/ltoptions.m4'\r\nlibtoolize: copying file 'm4/ltsugar.m4'\r\nlibtoolize: copying file 'm4/ltversion.m4'\r\nlibtoolize: copying file 'm4/lt~obsolete.m4'\r\n+ autoheader\r\n+ automake --add-missing --copy --foreign\r\nconfigure.ac:11: installing 'build-aux/compile'\r\nconfigure.ac:9: installing 'build-aux/missing'\r\nsrc/Makefile.am:4: error: 'vmod_LTLIBRARIES' is used but 'vmoddir' is undefined\r\nautomake: warnings are treated as errors\r\nsrc/Makefile.am:6: warning: variable 'libvmod_dynamic_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:6: library has 'libvmod_dynamic_la' as canonical name (possible typo)\r\nsrc/Makefile.am:10: warning: variable 'nodist_libvmod_dynamic_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:10: library has 'libvmod_dynamic_la' as canonical name (possible typo)\r\n```\r\n\r\nChances are I've missed something, but could someone please point me in the right direction?","closed_by":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/14/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/14/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/15","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/15/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/15/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/15/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/15","id":215410291,"node_id":"MDU6SXNzdWUyMTU0MTAyOTE=","number":15,"title":"How to see the vmod-dynamic logs","user":{"login":"danielmotaleite","id":11890049,"node_id":"MDQ6VXNlcjExODkwMDQ5","avatar_url":"https://avatars.githubusercontent.com/u/11890049?v=4","gravatar_id":"","url":"https://api.github.com/users/danielmotaleite","html_url":"https://github.com/danielmotaleite","followers_url":"https://api.github.com/users/danielmotaleite/followers","following_url":"https://api.github.com/users/danielmotaleite/following{/other_user}","gists_url":"https://api.github.com/users/danielmotaleite/gists{/gist_id}","starred_url":"https://api.github.com/users/danielmotaleite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danielmotaleite/subscriptions","organizations_url":"https://api.github.com/users/danielmotaleite/orgs","repos_url":"https://api.github.com/users/danielmotaleite/repos","events_url":"https://api.github.com/users/danielmotaleite/events{/privacy}","received_events_url":"https://api.github.com/users/danielmotaleite/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":3,"created_at":"2017-03-20T12:49:48Z","updated_at":"2017-03-20T17:04:03Z","closed_at":"2017-03-20T17:04:03Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi\r\n\r\nI usually debug varnish using varnishlog, but since i added vmod-dynamic i have the problem that i do not see any log related with vmod-dynamic.\r\n\r\nhttps://github.com/nigoroll/libvmod-dynamic/blob/master/src/vmod_dynamic.vcc seems to say that it should log something, but refers no way to enable that log\r\n\r\nSo how can enable/check the vmod log? is there any vmod option that i'm unfamiliar with?\r\n\r\nThanks","closed_by":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/15/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/15/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/16","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/16/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/16/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/16/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/16","id":215742988,"node_id":"MDU6SXNzdWUyMTU3NDI5ODg=","number":16,"title":"Varnish complains about \"No backends or directors found in VCL program\"","user":{"login":"otrosien","id":129439,"node_id":"MDQ6VXNlcjEyOTQzOQ==","avatar_url":"https://avatars.githubusercontent.com/u/129439?v=4","gravatar_id":"","url":"https://api.github.com/users/otrosien","html_url":"https://github.com/otrosien","followers_url":"https://api.github.com/users/otrosien/followers","following_url":"https://api.github.com/users/otrosien/following{/other_user}","gists_url":"https://api.github.com/users/otrosien/gists{/gist_id}","starred_url":"https://api.github.com/users/otrosien/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/otrosien/subscriptions","organizations_url":"https://api.github.com/users/otrosien/orgs","repos_url":"https://api.github.com/users/otrosien/repos","events_url":"https://api.github.com/users/otrosien/events{/privacy}","received_events_url":"https://api.github.com/users/otrosien/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804427,"node_id":"MDU6TGFiZWw0NDM4MDQ0Mjc=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/question","name":"question","color":"cc317c","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":11,"created_at":"2017-03-21T13:41:41Z","updated_at":"2017-03-26T19:22:43Z","closed_at":"2017-03-26T19:22:43Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I need to add a dummy backend server in order to make varnish happy. Is that intended? Is there any possible side-effect of doing so?","closed_by":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/16/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/16/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/17","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/17/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/17/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/17/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/17","id":216841913,"node_id":"MDU6SXNzdWUyMTY4NDE5MTM=","number":17,"title":"max_connections","user":{"login":"danielmotaleite","id":11890049,"node_id":"MDQ6VXNlcjExODkwMDQ5","avatar_url":"https://avatars.githubusercontent.com/u/11890049?v=4","gravatar_id":"","url":"https://api.github.com/users/danielmotaleite","html_url":"https://github.com/danielmotaleite","followers_url":"https://api.github.com/users/danielmotaleite/followers","following_url":"https://api.github.com/users/danielmotaleite/following{/other_user}","gists_url":"https://api.github.com/users/danielmotaleite/gists{/gist_id}","starred_url":"https://api.github.com/users/danielmotaleite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danielmotaleite/subscriptions","organizations_url":"https://api.github.com/users/danielmotaleite/orgs","repos_url":"https://api.github.com/users/danielmotaleite/repos","events_url":"https://api.github.com/users/danielmotaleite/events{/privacy}","received_events_url":"https://api.github.com/users/danielmotaleite/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804424,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjQ=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/enhancement","name":"enhancement","color":"84b6eb","default":true,"description":null}],"state":"closed","locked":false,"assignee":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/milestones/1","html_url":"https://github.com/nigoroll/libvmod-dynamic/milestone/1","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/milestones/1/labels","id":2411902,"node_id":"MDk6TWlsZXN0b25lMjQxMTkwMg==","number":1,"title":"1.0","description":null,"creator":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":0,"closed_issues":4,"state":"open","created_at":"2017-03-26T20:50:32Z","updated_at":"2019-07-13T16:40:27Z","due_on":null,"closed_at":null},"comments":2,"created_at":"2017-03-24T16:41:53Z","updated_at":"2017-03-29T16:20:48Z","closed_at":"2017-03-29T16:20:48Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"In normal varnish, we can set the .max_connections in the backend... how to do this with libvmod-dynamic? what is the current max for libvmod-dynamic?\r\n\r\nThanks!","closed_by":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/17/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/17/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/18","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/18/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/18/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/18/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/18","id":217088207,"node_id":"MDExOlB1bGxSZXF1ZXN0MTEyNjQzODA4","number":18,"title":"Test with a dedicated hosts file if possible","user":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804424,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjQ=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/enhancement","name":"enhancement","color":"84b6eb","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/milestones/1","html_url":"https://github.com/nigoroll/libvmod-dynamic/milestone/1","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/milestones/1/labels","id":2411902,"node_id":"MDk6TWlsZXN0b25lMjQxMTkwMg==","number":1,"title":"1.0","description":null,"creator":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":0,"closed_issues":4,"state":"open","created_at":"2017-03-26T20:50:32Z","updated_at":"2019-07-13T16:40:27Z","due_on":null,"closed_at":null},"comments":4,"created_at":"2017-03-26T20:50:36Z","updated_at":"2019-07-13T16:40:27Z","closed_at":"2019-07-13T16:40:27Z","author_association":"COLLABORATOR","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/18","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/18","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/18.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/18.patch","merged_at":null},"body":"Ironically, this breaks my setup. I never needed to tweak my NSS\r\nconfiguration or add entries to /etc/hosts to resolve *.localhost\r\nto the loop-back interface.\r\n\r\nHowever, we can now guess at configure time whether the test suite\r\nis expected to work. Although there's no real guarantee because of\r\nthe huge TOCTOU race between `./configure` and `make check`.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/18/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/18/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/19","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/19/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/19/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/19/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/19","id":218275226,"node_id":"MDU6SXNzdWUyMTgyNzUyMjY=","number":19,"title":"question: is it possible to use dynamic with saintmode?","user":{"login":"danielmotaleite","id":11890049,"node_id":"MDQ6VXNlcjExODkwMDQ5","avatar_url":"https://avatars.githubusercontent.com/u/11890049?v=4","gravatar_id":"","url":"https://api.github.com/users/danielmotaleite","html_url":"https://github.com/danielmotaleite","followers_url":"https://api.github.com/users/danielmotaleite/followers","following_url":"https://api.github.com/users/danielmotaleite/following{/other_user}","gists_url":"https://api.github.com/users/danielmotaleite/gists{/gist_id}","starred_url":"https://api.github.com/users/danielmotaleite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danielmotaleite/subscriptions","organizations_url":"https://api.github.com/users/danielmotaleite/orgs","repos_url":"https://api.github.com/users/danielmotaleite/repos","events_url":"https://api.github.com/users/danielmotaleite/events{/privacy}","received_events_url":"https://api.github.com/users/danielmotaleite/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804427,"node_id":"MDU6TGFiZWw0NDM4MDQ0Mjc=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/question","name":"question","color":"cc317c","default":true,"description":null},{"id":443804428,"node_id":"MDU6TGFiZWw0NDM4MDQ0Mjg=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/wontfix","name":"wontfix","color":"ffffff","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2017-03-30T17:47:03Z","updated_at":"2017-03-31T11:13:20Z","closed_at":"2017-03-31T09:50:14Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi\r\n\r\nI was looking into use saintmode for some static files, but as dynamic do not defines the backends the same way, i'm not sure if it is possible to use it or not.\r\n\r\nhttps://github.com/varnish/varnish-modules/blob/master/src/vmod_saintmode.vcc\r\n\r\nSo have you any ideia if is possible and how to use both saintmode and dynamic? \r\n\r\nthanks","closed_by":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/19/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/19/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/20","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/20/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/20/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/20/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/20","id":219622749,"node_id":"MDU6SXNzdWUyMTk2MjI3NDk=","number":20,"title":"FAIL: tests/test10.vtc","user":{"login":"danielmotaleite","id":11890049,"node_id":"MDQ6VXNlcjExODkwMDQ5","avatar_url":"https://avatars.githubusercontent.com/u/11890049?v=4","gravatar_id":"","url":"https://api.github.com/users/danielmotaleite","html_url":"https://github.com/danielmotaleite","followers_url":"https://api.github.com/users/danielmotaleite/followers","following_url":"https://api.github.com/users/danielmotaleite/following{/other_user}","gists_url":"https://api.github.com/users/danielmotaleite/gists{/gist_id}","starred_url":"https://api.github.com/users/danielmotaleite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danielmotaleite/subscriptions","organizations_url":"https://api.github.com/users/danielmotaleite/orgs","repos_url":"https://api.github.com/users/danielmotaleite/repos","events_url":"https://api.github.com/users/danielmotaleite/events{/privacy}","received_events_url":"https://api.github.com/users/danielmotaleite/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2017-04-05T15:25:54Z","updated_at":"2017-04-10T19:14:06Z","closed_at":"2017-04-10T17:20:13Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Trying to compile and test this on varnish 5.1.1 i get:\r\n\r\n\r\n\r\n```\r\nchecking for a BSD-compatible install... /usr/bin/install -c\r\nchecking whether build environment is sane... yes\r\nchecking for a thread-safe mkdir -p... /bin/mkdir -p\r\nchecking for gawk... no\r\nchecking for mawk... mawk\r\nchecking whether make sets $(MAKE)... yes\r\nchecking whether make supports nested variables... yes\r\nchecking whether make supports nested variables... (cached) yes\r\nchecking for style of include used by make... GNU\r\nchecking for gcc... gcc\r\nchecking whether the C compiler works... yes\r\nchecking for C compiler default output file name... a.out\r\nchecking for suffix of executables... \r\nchecking whether we are cross compiling... no\r\nchecking for suffix of object files... o\r\nchecking whether we are using the GNU C compiler... yes\r\nchecking whether gcc accepts -g... yes\r\nchecking for gcc option to accept ISO C89... none needed\r\nchecking whether gcc understands -c and -o together... yes\r\nchecking dependency style of gcc... none\r\nchecking for ar... ar\r\nchecking the archiver (ar) interface... ar\r\nchecking build system type... x86_64-pc-linux-gnu\r\nchecking host system type... x86_64-pc-linux-gnu\r\nchecking how to print strings... printf\r\nchecking for a sed that does not truncate output... /bin/sed\r\nchecking for grep that handles long lines and -e... /bin/grep\r\nchecking for egrep... /bin/grep -E\r\nchecking for fgrep... /bin/grep -F\r\nchecking for ld used by gcc... /usr/bin/ld\r\nchecking if the linker (/usr/bin/ld) is GNU ld... yes\r\nchecking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B\r\nchecking the name lister (/usr/bin/nm -B) interface... BSD nm\r\nchecking whether ln -s works... yes\r\nchecking the maximum length of command line arguments... 1572864\r\nchecking whether the shell understands some XSI constructs... yes\r\nchecking whether the shell understands \"+=\"... yes\r\nchecking how to convert x86_64-pc-linux-gnu file names to x86_64-pc-linux-gnu format... func_convert_file_noop\r\nchecking how to convert x86_64-pc-linux-gnu file names to toolchain format... func_convert_file_noop\r\nchecking for /usr/bin/ld option to reload object files... -r\r\nchecking for objdump... objdump\r\nchecking how to recognize dependent libraries... pass_all\r\nchecking for dlltool... no\r\nchecking how to associate runtime and link libraries... printf %s\\n\r\nchecking for archiver @FILE support... @\r\nchecking for strip... strip\r\nchecking for ranlib... ranlib\r\nchecking command to parse /usr/bin/nm -B output from gcc object... ok\r\nchecking for sysroot... no\r\nchecking for mt... mt\r\nchecking if mt is a manifest tool... no\r\nchecking how to run the C preprocessor... gcc -E\r\nchecking for ANSI C header files... yes\r\nchecking for sys/types.h... yes\r\nchecking for sys/stat.h... yes\r\nchecking for stdlib.h... yes\r\nchecking for string.h... yes\r\nchecking for memory.h... yes\r\nchecking for strings.h... yes\r\nchecking for inttypes.h... yes\r\nchecking for stdint.h... yes\r\nchecking for unistd.h... yes\r\nchecking for dlfcn.h... yes\r\nchecking for objdir... .libs\r\nchecking if gcc supports -fno-rtti -fno-exceptions... no\r\nchecking for gcc option to produce PIC... -fPIC -DPIC\r\nchecking if gcc PIC flag -fPIC -DPIC works... yes\r\nchecking if gcc static flag -static works... yes\r\nchecking if gcc supports -c -o file.o... yes\r\nchecking if gcc supports -c -o file.o... (cached) yes\r\nchecking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes\r\nchecking whether -lc should be explicitly linked in... no\r\nchecking dynamic linker characteristics... GNU/Linux ld.so\r\nchecking how to hardcode library paths into programs... immediate\r\nchecking for shl_load... no\r\nchecking for shl_load in -ldld... no\r\nchecking for dlopen... no\r\nchecking for dlopen in -ldl... yes\r\nchecking whether a program can dlopen itself... yes\r\nchecking whether a statically linked program can dlopen itself... no\r\nchecking whether stripping libraries is possible... yes\r\nchecking if libtool supports shared libraries... yes\r\nchecking whether to build shared libraries... yes\r\nchecking whether to build static libraries... no\r\nchecking for rst2man... rst2man\r\nchecking for pkg-config... /usr/bin/pkg-config\r\nchecking pkg-config is at least version 0.21... yes\r\nchecking for VARNISHAPI... yes\r\nchecking for explicit_bzero... no\r\nchecking for Varnish... 5.1.1\r\nchecking vsha256.h usability... yes\r\nchecking vsha256.h presence... yes\r\nchecking for vsha256.h... yes\r\nchecking cache/cache.h usability... yes\r\nchecking cache/cache.h presence... yes\r\nchecking for cache/cache.h... yes\r\nchecking for gcc option to accept ISO C99... -std=gnu99\r\nchecking for a Python interpreter with version >= 2.7... python\r\nchecking for python... /usr/bin/python\r\nchecking for python version... 2.7\r\nchecking for python platform... linux2\r\nchecking for python script directory... ${prefix}/lib/python2.7/dist-packages\r\nchecking for python extension module directory... ${exec_prefix}/lib/python2.7/dist-packages\r\nchecking that generated files are newer than configure... done\r\nconfigure: creating ./config.status\r\nconfig.status: creating Makefile\r\nconfig.status: creating src/Makefile\r\nconfig.status: creating config.h\r\nconfig.status: executing depfiles commands\r\nconfig.status: executing libtool commands\r\nconfigure: WARNING: unrecognized options: --disable-maintainer-mode\r\n dh_auto_build\r\n\tmake -j1\r\nmake[1]: Entering directory '/usr/src/libvmod-dynamic'\r\nmake all-recursive\r\nmake[2]: Entering directory '/usr/src/libvmod-dynamic'\r\nMaking all in src\r\nmake[3]: Entering directory '/usr/src/libvmod-dynamic/src'\r\n/usr/bin/python /usr/share/varnish/vmodtool.py -o vcc_dynamic_if ./vmod_dynamic.vcc\r\n/bin/bash ../libtool --tag=CC --mode=compile gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I.. -I/usr/include/varnish -Wall -Werror -g -O2 -c -o vmod_dynamic.lo vmod_dynamic.c\r\nlibtool: compile: gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I.. -I/usr/include/varnish -Wall -Werror -g -O2 -c vmod_dynamic.c -fPIC -DPIC -o .libs/vmod_dynamic.o\r\n/bin/bash ../libtool --tag=CC --mode=compile gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I.. -I/usr/include/varnish -Wall -Werror -g -O2 -c -o vcc_dynamic_if.lo vcc_dynamic_if.c\r\nlibtool: compile: gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I.. -I/usr/include/varnish -Wall -Werror -g -O2 -c vcc_dynamic_if.c -fPIC -DPIC -o .libs/vcc_dynamic_if.o\r\n/bin/bash ../libtool --tag=CC --mode=link gcc -std=gnu99 -I/usr/include/varnish -Wall -Werror -g -O2 -lvarnishapi -module -export-dynamic -avoid-version -shared -o libvmod_dynamic.la -rpath /usr/lib/varnish/vmods vmod_dynamic.lo vcc_dynamic_if.lo \r\nlibtool: link: gcc -shared -fPIC -DPIC .libs/vmod_dynamic.o .libs/vcc_dynamic_if.o -lvarnishapi -O2 -Wl,-soname -Wl,libvmod_dynamic.so -o .libs/libvmod_dynamic.so\r\nlibtool: link: ( cd \".libs\" && rm -f \"libvmod_dynamic.la\" && ln -s \"../libvmod_dynamic.la\" \"libvmod_dynamic.la\" )\r\nrst2man vmod_dynamic.man.rst vmod_dynamic.3\r\nmake[3]: Leaving directory '/usr/src/libvmod-dynamic/src'\r\nmake[3]: Entering directory '/usr/src/libvmod-dynamic'\r\nmake[3]: Leaving directory '/usr/src/libvmod-dynamic'\r\nmake[2]: Leaving directory '/usr/src/libvmod-dynamic'\r\nmake[1]: Leaving directory '/usr/src/libvmod-dynamic'\r\n dh_auto_test\r\n\tmake -j1 check\r\nmake[1]: Entering directory '/usr/src/libvmod-dynamic'\r\nMaking check in src\r\nmake[2]: Entering directory '/usr/src/libvmod-dynamic/src'\r\nmake check-TESTS\r\nmake[3]: Entering directory '/usr/src/libvmod-dynamic/src'\r\nmake[4]: Entering directory '/usr/src/libvmod-dynamic/src'\r\nPASS: tests/test01.vtc\r\nPASS: tests/test02.vtc\r\nPASS: tests/test03.vtc\r\nPASS: tests/test04.vtc\r\nPASS: tests/test05.vtc\r\nPASS: tests/test06.vtc\r\nPASS: tests/test07.vtc\r\nPASS: tests/test08.vtc\r\nPASS: tests/test09.vtc\r\nFAIL: tests/test10.vtc\r\nmake[5]: Entering directory '/usr/src/libvmod-dynamic/src'\r\nmake[5]: Nothing to be done for 'all'.\r\nmake[5]: Leaving directory '/usr/src/libvmod-dynamic/src'\r\n============================================================================\r\nTestsuite summary for libvmod-dynamic 0.2\r\n============================================================================\r\n# TOTAL: 10\r\n# PASS: 9\r\n# SKIP: 0\r\n# XFAIL: 0\r\n# FAIL: 1\r\n# XPASS: 0\r\n# ERROR: 0\r\n============================================================================\r\nSee src/test-suite.log\r\n============================================================================\r\nMakefile:767: recipe for target 'test-suite.log' failed\r\nmake[4]: *** [test-suite.log] Error 1\r\nmake[4]: Leaving directory '/usr/src/libvmod-dynamic/src'\r\nMakefile:873: recipe for target 'check-TESTS' failed\r\nmake[3]: *** [check-TESTS] Error 2\r\nmake[3]: Leaving directory '/usr/src/libvmod-dynamic/src'\r\nMakefile:939: recipe for target 'check-am' failed\r\nmake[2]: *** [check-am] Error 2\r\nmake[2]: Leaving directory '/usr/src/libvmod-dynamic/src'\r\nMakefile:481: recipe for target 'check-recursive' failed\r\nmake[1]: *** [check-recursive] Error 1\r\nmake[1]: Leaving directory '/usr/src/libvmod-dynamic'\r\ndh_auto_test: make -j1 check returned exit code 2\r\ndebian/rules:12: recipe for target 'build' failed\r\nmake: *** [build] Error 2\r\n\r\n````\r\n\r\nThe log i get: \r\n```\r\n=============================================\r\n libvmod-dynamic 0.2: src/test-suite.log\r\n=============================================\r\n\r\n# TOTAL: 10\r\n# PASS: 9\r\n# SKIP: 0\r\n# XFAIL: 0\r\n# FAIL: 1\r\n# XPASS: 0\r\n# ERROR: 0\r\n\r\n.. contents:: :depth: 2\r\n\r\nFAIL: tests/test10\r\n==================\r\n\r\n**** top 0.0 extmacro def pwd=/usr/src/libvmod-dynamic/src\r\n**** top 0.0 extmacro def vmod_dynamic=dynamic from \"/usr/src/libvmod-dynamic/src/.libs/libvmod_dynamic.so\"\r\n**** top 0.0 extmacro def localhost=127.0.0.1\r\n**** top 0.0 extmacro def bad_backend=127.0.0.1 18925\r\n**** top 0.0 extmacro def bad_ip=192.0.2.255\r\n**** top 0.0 macro def tmpdir=/tmp/vtc.12295.77019977\r\n* top 0.0 TEST ./tests/test10.vtc starting\r\n** top 0.0 === varnishtest \"max_connections\"\r\n* top 0.0 TEST max_connections\r\n** top 0.0 === barrier b1 cond 2\r\n** top 0.0 === server s1 {\r\n** s1 0.0 Starting server\r\n**** s1 0.0 macro def s1_addr=127.0.0.1\r\n**** s1 0.0 macro def s1_port=37297\r\n**** s1 0.0 macro def s1_sock=127.0.0.1 37297\r\n* s1 0.0 Listen on 127.0.0.1 37297\r\n** top 0.0 === varnish v1 -vcl+backend {\r\n** s1 0.0 Started on 127.0.0.1 37297\r\n** v1 0.0 Launch\r\n*** v1 0.0 CMD: cd ${pwd} && exec varnishd -d -n /tmp/vtc.12295.77019977/v1 -l 2m,1m,- -p auto_restart=off -p syslog_cli_traffic=off -p sigsegv_handler=on -p thread_pool_min=10 -p debug=+vtc_mode -a '127.0.0.1:0' -M '127.0.0.1 21937' -P /tmp/vtc.12295.77019977/v1/varnishd.pid \r\n*** v1 0.0 CMD: cd /usr/src/libvmod-dynamic/src && exec varnishd -d -n /tmp/vtc.12295.77019977/v1 -l 2m,1m,- -p auto_restart=off -p syslog_cli_traffic=off -p sigsegv_handler=on -p thread_pool_min=10 -p debug=+vtc_mode -a '127.0.0.1:0' -M '127.0.0.1 21937' -P /tmp/vtc.12295.77019977/v1/varnishd.pid \r\n*** v1 0.0 PID: 12301\r\n**** v1 0.0 macro def v1_pid=12301\r\n**** v1 0.0 macro def v1_name=/tmp/vtc.12295.77019977/v1\r\n*** v1 0.0 debug|Debug: Platform: Linux,4.7.0-0.bpo.1-amd64,x86_64,-junix,-smalloc,-smalloc,-hcritbit\r\n*** v1 0.0 debug|200 285 \r\n*** v1 0.0 debug|-----------------------------\r\n*** v1 0.0 debug|Varnish Cache CLI 1.0\r\n*** v1 0.0 debug|-----------------------------\r\n*** v1 0.0 debug|Linux,4.7.0-0.bpo.1-amd64,x86_64,-junix,-smalloc,-smalloc,-hcritbit\r\n*** v1 0.0 debug|varnish-5.1.1 revision de38712\r\n*** v1 0.0 debug|\r\n*** v1 0.0 debug|Type 'help' for command list.\r\n*** v1 0.0 debug|Type 'quit' to close CLI session.\r\n*** v1 0.0 debug|Type 'start' to launch worker process.\r\n*** v1 0.0 debug|\r\n**** v1 0.1 CLIPOLL 1 0x1 0x0\r\n*** v1 0.1 CLI connection fd = 10\r\n*** v1 0.1 CLI RX 107\r\n**** v1 0.1 CLI RX|stvjhhhfmktflzoagpgicdcedgmqaylg\r\n**** v1 0.1 CLI RX|\r\n**** v1 0.1 CLI RX|Authentication required.\r\n**** v1 0.1 CLI TX|auth 8c27b560d816ab69953f630bf040144ecc8919912555de6832188a04f87db7d9\r\n*** v1 0.1 CLI RX 200\r\n**** v1 0.1 CLI RX|-----------------------------\r\n**** v1 0.1 CLI RX|Varnish Cache CLI 1.0\r\n**** v1 0.1 CLI RX|-----------------------------\r\n**** v1 0.1 CLI RX|Linux,4.7.0-0.bpo.1-amd64,x86_64,-junix,-smalloc,-smalloc,-hcritbit\r\n**** v1 0.1 CLI RX|varnish-5.1.1 revision de38712\r\n**** v1 0.1 CLI RX|\r\n**** v1 0.1 CLI RX|Type 'help' for command list.\r\n**** v1 0.1 CLI RX|Type 'quit' to close CLI session.\r\n**** v1 0.1 CLI RX|Type 'start' to launch worker process.\r\n**** v1 0.1 CLI TX|vcl.inline vcl1 << %XJEIFLH|)Xspa8P\r\n**** v1 0.1 CLI TX|vcl 4.0;\r\n**** v1 0.1 CLI TX|backend s1 { .host = \"127.0.0.1\"; .port = \"37297\"; }\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\timport dynamic from \"/usr/src/libvmod-dynamic/src/.libs/libvmod_dynamic.so\";\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tsub vcl_init {\r\n**** v1 0.1 CLI TX|\\t\\tnew d1 = dynamic.director(\r\n**** v1 0.1 CLI TX|\\t\\t\\tport = \"37297\",\r\n**** v1 0.1 CLI TX|\\t\\t\\tmax_connections = 1);\r\n**** v1 0.1 CLI TX|\\t}\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tsub vcl_recv {\r\n**** v1 0.1 CLI TX|\\t\\tset req.backend_hint = d1.backend(\"127.0.0.1\");\r\n**** v1 0.1 CLI TX|\\t\\treturn (pass);\r\n**** v1 0.1 CLI TX|\\t}\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tsub vcl_backend_error {\r\n**** v1 0.1 CLI TX|\\t\\tset beresp.status = 429;\r\n**** v1 0.1 CLI TX|\\t}\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|%XJEIFLH|)Xspa8P\r\n*** v1 0.3 CLI RX 200\r\n**** v1 0.3 CLI RX|VCL compiled.\r\n**** v1 0.3 CLI TX|vcl.use vcl1\r\n*** v1 0.3 CLI RX 200\r\n** v1 0.3 Start\r\n**** v1 0.3 CLI TX|start\r\n*** v1 0.3 debug|Debug: Child (12311) Started\r\n*** v1 0.4 CLI RX 200\r\n*** v1 0.4 wait-running\r\n**** v1 0.4 CLI TX|status\r\n*** v1 0.4 debug|Info: Child (12311) said Child starts\r\n*** v1 0.4 CLI RX 200\r\n**** v1 0.4 CLI RX|Child in state running\r\n**** v1 0.4 CLI TX|debug.xid 999\r\n**** v1 0.4 vsl| 0 CLI - Rd vcl.load \"vcl1\" vcl_vcl1.1491405606.451286077/vgc.so 1auto\r\n**** v1 0.4 vsl| 0 CLI - Wr 200 55 Loaded \"vcl_vcl1.1491405606.451286077/vgc.so\" as \"vcl1\"\r\n**** v1 0.4 vsl| 0 CLI - Rd vcl.use \"vcl1\"\r\n**** v1 0.4 vsl| 0 CLI - Wr 200 0 \r\n**** v1 0.4 vsl| 0 CLI - Rd start\r\n**** v1 0.4 vsl| 0 CLI - Wr 200 0 \r\n*** v1 0.4 CLI RX 200\r\n**** v1 0.4 CLI RX|XID is 999\r\n**** v1 0.4 CLI TX|debug.listen_address\r\n*** v1 0.5 CLI RX 200\r\n**** v1 0.5 CLI RX|127.0.0.1 36231\r\n** v1 0.5 Listen on 127.0.0.1 36231\r\n**** v1 0.5 macro def v1_addr=127.0.0.1\r\n**** v1 0.5 macro def v1_port=36231\r\n**** v1 0.5 macro def v1_sock=127.0.0.1 36231\r\n** top 0.5 === client c1 {\r\n** c1 0.5 Starting client\r\n** top 0.5 === client c2 {\r\n** c2 0.5 Starting client\r\n** c2 0.5 Waiting for client\r\n*** c2 0.5 Connect to 127.0.0.1 36231\r\n*** c1 0.5 Connect to 127.0.0.1 36231\r\n*** c2 0.5 connected fd 11 from 127.0.0.1 46416 to 127.0.0.1 36231\r\n*** c1 0.5 connected fd 12 from 127.0.0.1 46418 to 127.0.0.1 36231\r\n** c2 0.5 === txreq\r\n**** c2 0.5 txreq|GET / HTTP/1.1\\r\r\n**** c2 0.5 txreq|\\r\r\n** c1 0.5 === txreq\r\n** c2 0.5 === rxresp\r\n**** c1 0.5 txreq|GET / HTTP/1.1\\r\r\n**** c1 0.5 txreq|\\r\r\n** c1 0.5 === rxresp\r\n*** s1 0.5 accepted fd 5\r\n** s1 0.5 === rxreq\r\n**** s1 0.5 rxhdr|GET / HTTP/1.1\\r\r\n**** s1 0.5 rxhdr|X-Forwarded-For: 127.0.0.1\\r\r\n**** s1 0.5 rxhdr|X-Varnish: 1004\\r\r\n**** s1 0.5 rxhdr|\\r\r\n**** s1 0.5 rxhdrlen = 63\r\n**** s1 0.5 http[ 0] |GET\r\n**** s1 0.5 http[ 1] |/\r\n**** s1 0.5 http[ 2] |HTTP/1.1\r\n**** s1 0.5 http[ 3] |X-Forwarded-For: 127.0.0.1\r\n**** s1 0.5 http[ 4] |X-Varnish: 1004\r\n**** s1 0.5 bodylen = 0\r\n** s1 0.5 === barrier b1 sync\r\n**** s1 0.5 Barrier(b1) wait 1 of 2\r\n**** v1 0.5 vsl| 0 CLI - Rd debug.xid 999 \r\n**** v1 0.5 vsl| 0 CLI - Wr 200 10 XID is 999\r\n**** v1 0.5 vsl| 0 CLI - Rd debug.listen_address \r\n**** v1 0.5 vsl| 0 CLI - Wr 200 16 127.0.0.1 36231\r\n\r\n**** v1 0.5 vsl| 1000 Begin c sess 0 HTTP/1\r\n**** v1 0.5 vsl| 1000 SessOpen c 127.0.0.1 46416 127.0.0.1:36231 127.0.0.1 36231 1491405606.804795 20\r\n**** v1 0.5 vsl| 1001 Begin c sess 0 HTTP/1\r\n**** v1 0.5 vsl| 1001 SessOpen c 127.0.0.1 46418 127.0.0.1:36231 127.0.0.1 36231 1491405606.804846 21\r\n**** v1 0.5 vsl| 1000 Link c req 1002 rxreq\r\n**** v1 0.5 vsl| 1001 Link c req 1003 rxreq\r\n**** v1 0.5 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(127.0.0.1) Lookup: 1491405606.805036 0.000000 0.000000\r\n**** v1 0.5 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(127.0.0.1) Results: 1491405606.805164 0.000128 0.000128\r\n**** v1 0.5 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(127.0.0.1) Update: 1491405606.805242 0.000206 0.000078\r\n**** v1 3.4 vsl| 0 CLI - Rd ping\r\n**** v1 3.4 vsl| 0 CLI - Wr 200 19 PONG 1491405609 1.0\r\n**** v1 6.4 vsl| 0 CLI - Rd ping\r\n**** v1 6.4 vsl| 0 CLI - Wr 200 19 PONG 1491405612 1.0\r\n**** v1 9.4 vsl| 0 CLI - Rd ping\r\n**** v1 9.4 vsl| 0 CLI - Wr 200 19 PONG 1491405615 1.0\r\n**** v1 12.4 vsl| 0 CLI - Rd ping\r\n**** v1 12.4 vsl| 0 CLI - Wr 200 19 PONG 1491405618 1.0\r\n**** v1 15.4 vsl| 0 CLI - Rd ping\r\n**** v1 15.4 vsl| 0 CLI - Wr 200 19 PONG 1491405621 1.0\r\n**** v1 18.4 vsl| 0 CLI - Rd ping\r\n**** v1 18.4 vsl| 0 CLI - Wr 200 19 PONG 1491405624 1.0\r\n**** v1 21.4 vsl| 0 CLI - Rd ping\r\n**** v1 21.4 vsl| 0 CLI - Wr 200 19 PONG 1491405627 1.0\r\n**** v1 24.4 vsl| 0 CLI - Rd ping\r\n**** v1 24.4 vsl| 0 CLI - Wr 200 19 PONG 1491405630 1.0\r\n**** v1 27.4 vsl| 0 CLI - Rd ping\r\n**** v1 27.4 vsl| 0 CLI - Wr 200 19 PONG 1491405633 1.0\r\n**** v1 30.4 vsl| 0 CLI - Rd ping\r\n**** v1 30.4 vsl| 0 CLI - Wr 200 19 PONG 1491405636 1.0\r\n---- c1 30.5 HTTP rx timeout (fd:12 30000 ms)\r\n---- c2 30.5 HTTP rx timeout (fd:11 30000 ms)\r\n* top 30.5 RESETTING after ./tests/test10.vtc\r\n** s1 30.5 Waiting for server (4/-1)\r\n**** s1 30.5 macro undef s1_addr\r\n**** s1 30.5 macro undef s1_port\r\n**** s1 30.5 macro undef s1_sock\r\n** c1 30.5 Waiting for client\r\n** v1 30.5 Wait\r\n**** v1 30.5 CLI TX|backend.list\r\n**** v1 30.5 vsl| 1005 Begin b bereq 1003 pass\r\n**** v1 30.5 vsl| 1005 Timestamp b Start: 1491405606.805094 0.000000 0.000000\r\n**** v1 30.5 vsl| 1005 BereqMethod b GET\r\n**** v1 30.5 vsl| 1005 BereqURL b /\r\n**** v1 30.5 vsl| 1005 BereqProtocol b HTTP/1.1\r\n**** v1 30.5 vsl| 1005 BereqHeader b X-Forwarded-For: 127.0.0.1\r\n**** v1 30.5 vsl| 1005 BereqHeader b X-Varnish: 1005\r\n**** v1 30.5 vsl| 1005 VCL_call b BACKEND_FETCH\r\n**** v1 30.5 vsl| 1005 VCL_return b fetch\r\n**** v1 30.5 vsl| 1005 BackendOpen b 24 vcl1.d1(127.0.0.1) 127.0.0.1 37297 127.0.0.1 45930\r\n**** v1 30.5 vsl| 1005 BackendStart b 127.0.0.1 37297\r\n**** v1 30.5 vsl| 1005 Timestamp b Bereq: 1491405606.805499 0.000405 0.000405\r\n**** v1 30.5 vsl| 1005 FetchError b HTC status -1\r\n**** v1 30.5 vsl| 1005 BackendClose b 24 vcl1.d1(127.0.0.1)\r\n**** v1 30.5 vsl| 1005 Timestamp b Beresp: 1491405636.835078 30.029983 30.029578\r\n**** v1 30.5 vsl| 1005 Timestamp b Error: 1491405636.835090 30.029996 0.000013\r\n**** v1 30.5 vsl| 1005 BerespProtocol b HTTP/1.1\r\n**** v1 30.5 vsl| 1005 BerespStatus b 503\r\n**** v1 30.5 vsl| 1005 BerespReason b Service Unavailable\r\n**** v1 30.5 vsl| 1005 BerespReason b Backend fetch failed\r\n**** v1 30.5 vsl| 1005 BerespHeader b Date: Wed, 05 Apr 2017 15:20:36 GMT\r\n**** v1 30.5 vsl| 1005 BerespHeader b Server: Varnish\r\n**** v1 30.5 vsl| 1005 VCL_call b BACKEND_ERROR\r\n**** v1 30.5 vsl| 1005 BerespStatus b 429\r\n**** v1 30.5 vsl| 1005 BerespReason b Unknown HTTP Status\r\n**** v1 30.5 vsl| 1005 BerespHeader b Content-Type: text/html; charset=utf-8\r\n**** v1 30.5 vsl| 1005 BerespHeader b Retry-After: 5\r\n**** v1 30.5 vsl| 1005 VCL_return b deliver\r\n**** v1 30.5 vsl| 1005 Storage b malloc Transient\r\n**** v1 30.5 vsl| 1005 ObjProtocol b HTTP/1.1\r\n**** v1 30.5 vsl| 1005 ObjStatus b 429\r\n**** v1 30.5 vsl| 1005 ObjReason b Unknown HTTP Status\r\n**** v1 30.5 vsl| 1005 ObjHeader b Date: Wed, 05 Apr 2017 15:20:36 GMT\r\n**** v1 30.5 vsl| 1005 ObjHeader b Server: Varnish\r\n**** v1 30.5 vsl| 1005 ObjHeader b Content-Type: text/html; charset=utf-8\r\n**** v1 30.5 vsl| 1005 ObjHeader b Retry-After: 5\r\n**** v1 30.5 vsl| 1005 Length b 278\r\n**** v1 30.5 vsl| 1005 BereqAcct b 63 0 63 0 0 0\r\n**** v1 30.5 vsl| 1005 End b \r\n**** v1 30.5 vsl| 1003 Begin c req 1001 rxreq\r\n**** v1 30.5 vsl| 1003 Timestamp c Start: 1491405606.804885 0.000000 0.000000\r\n**** v1 30.5 vsl| 1003 Timestamp c Req: 1491405606.804885 0.000000 0.000000\r\n**** v1 30.5 vsl| 1003 ReqStart c 127.0.0.1 46418\r\n**** v1 30.5 vsl| 1003 ReqMethod c GET\r\n**** v1 30.5 vsl| 1003 ReqURL c /\r\n**** v1 30.5 vsl| 1003 ReqProtocol c HTTP/1.1\r\n**** v1 30.5 vsl| 1003 ReqHeader c X-Forwarded-For: 127.0.0.1\r\n**** v1 30.5 vsl| 1003 VCL_call c RECV\r\n**** v1 30.5 vsl| 1003 VCL_return c pass\r\n**** v1 30.5 vsl| 1003 VCL_call c HASH\r\n**** v1 30.5 vsl| 1003 VCL_return c lookup\r\n**** v1 30.5 vsl| 1003 VCL_call c PASS\r\n**** v1 30.5 vsl| 1003 VCL_return c fetch\r\n**** v1 30.5 vsl| 1003 Link c bereq 1005 pass\r\n**** v1 30.5 vsl| 1003 Timestamp c Fetch: 1491405636.835360 30.030474 30.030474\r\n**** v1 30.5 vsl| 1003 RespProtocol c HTTP/1.1\r\n**** v1 30.5 vsl| 1003 RespStatus c 429\r\n**** v1 30.5 vsl| 1003 RespReason c Unknown HTTP Status\r\n**** v1 30.5 vsl| 1003 RespHeader c Date: Wed, 05 Apr 2017 15:20:36 GMT\r\n**** v1 30.5 vsl| 1003 RespHeader c Server: Varnish\r\n**** v1 30.5 vsl| 1003 RespHeader c Content-Type: text/html; charset=utf-8\r\n**** v1 30.5 vsl| 1003 RespHeader c Retry-After: 5\r\n**** v1 30.5 vsl| 1003 RespHeader c X-Varnish: 1003\r\n**** v1 30.5 vsl| 1003 RespHeader c Age: 0\r\n**** v1 30.5 vsl| 1003 RespHeader c Via: 1.1 varnish (Varnish/5.1)\r\n**** v1 30.5 vsl| 1003 VCL_call c DELIVER\r\n**** v1 30.5 vsl| 1003 VCL_return c deliver\r\n**** v1 30.5 vsl| 1003 Timestamp c Process: 1491405636.835399 30.030514 0.000039\r\n**** v1 30.5 vsl| 1003 RespHeader c Content-Length: 278\r\n**** v1 30.5 vsl| 1003 Debug c RES_MODE 2\r\n**** v1 30.5 vsl| 1003 RespHeader c Connection: keep-alive\r\n**** v1 30.5 vsl| 1003 Timestamp c Resp: 1491405636.835462 30.030577 0.000063\r\n**** v1 30.5 vsl| 1003 ReqAcct c 18 0 18 248 278 526\r\n**** v1 30.5 vsl| 1003 End c \r\n*** v1 30.6 CLI RX 200\r\n**** v1 30.6 CLI RX|Backend name Admin Probe Last updated\r\n**** v1 30.6 CLI RX|vcl1.s1 probe Healthy (no probe) Wed, 05 Apr 2017 15:20:06 GMT\r\n**** v1 30.6 CLI RX|vcl1.d1(127.0.0.1) probe Healthy (no probe) Wed, 05 Apr 2017 15:20:06 GMT\r\n*** v1 30.6 debug|Debug: Stopping Child\r\n**** v1 30.6 vsl| 0 CLI - Rd backend.list \r\n**** v1 30.6 vsl| 0 CLI - Wr 200 261 Backend name Admin Probe Last updated\r\nvcl1.s1 probe Healthy (no probe) Wed, 05 Apr 2017 15:20:06 GMT\r\nvcl1.d1(127.0.0.1) probe Healthy (no probe) Wed, 05 Apr\r\n**** v1 30.6 vsl| 0 CLI - EOF on CLI connection, worker stops\r\n*** v1 31.6 debug|Info: Child (12311) ended\r\n*** v1 31.6 debug|Info: Child (12311) said Child dies\r\n*** v1 31.6 debug|Debug: Child cleanup complete\r\n**** v1 31.6 STDOUT poll 0x10\r\n** v1 31.6 R 12301 Status: 0000 (u 0.164000 s 0.040000)\r\n* top 31.6 TEST ./tests/test10.vtc FAILED\r\n# top TEST ./tests/test10.vtc FAILED (31.646) exit=2\r\n```","closed_by":{"login":"dridi","id":891744,"node_id":"MDQ6VXNlcjg5MTc0NA==","avatar_url":"https://avatars.githubusercontent.com/u/891744?v=4","gravatar_id":"","url":"https://api.github.com/users/dridi","html_url":"https://github.com/dridi","followers_url":"https://api.github.com/users/dridi/followers","following_url":"https://api.github.com/users/dridi/following{/other_user}","gists_url":"https://api.github.com/users/dridi/gists{/gist_id}","starred_url":"https://api.github.com/users/dridi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dridi/subscriptions","organizations_url":"https://api.github.com/users/dridi/orgs","repos_url":"https://api.github.com/users/dridi/repos","events_url":"https://api.github.com/users/dridi/events{/privacy}","received_events_url":"https://api.github.com/users/dridi/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/20/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/20/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/21","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/21/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/21/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/21/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/21","id":225908469,"node_id":"MDU6SXNzdWUyMjU5MDg0Njk=","number":21,"title":"Respect TTL in DNS record","user":{"login":"teohhanhui","id":548843,"node_id":"MDQ6VXNlcjU0ODg0Mw==","avatar_url":"https://avatars.githubusercontent.com/u/548843?v=4","gravatar_id":"","url":"https://api.github.com/users/teohhanhui","html_url":"https://github.com/teohhanhui","followers_url":"https://api.github.com/users/teohhanhui/followers","following_url":"https://api.github.com/users/teohhanhui/following{/other_user}","gists_url":"https://api.github.com/users/teohhanhui/gists{/gist_id}","starred_url":"https://api.github.com/users/teohhanhui/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/teohhanhui/subscriptions","organizations_url":"https://api.github.com/users/teohhanhui/orgs","repos_url":"https://api.github.com/users/teohhanhui/repos","events_url":"https://api.github.com/users/teohhanhui/events{/privacy}","received_events_url":"https://api.github.com/users/teohhanhui/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":12,"created_at":"2017-05-03T07:58:07Z","updated_at":"2019-07-13T16:46:03Z","closed_at":"2017-08-11T16:13:11Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"It'd be great if the DNS resolution can respect the TTL specified in the DNS record (as it should), and also not to apply the TTL if it resolved to no address.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/21/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/21/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/22","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/22/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/22/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/22/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/22","id":233509305,"node_id":"MDU6SXNzdWUyMzM1MDkzMDU=","number":22,"title":"m4 include issues","user":{"login":"redbox-cdn","id":7666840,"node_id":"MDQ6VXNlcjc2NjY4NDA=","avatar_url":"https://avatars.githubusercontent.com/u/7666840?v=4","gravatar_id":"","url":"https://api.github.com/users/redbox-cdn","html_url":"https://github.com/redbox-cdn","followers_url":"https://api.github.com/users/redbox-cdn/followers","following_url":"https://api.github.com/users/redbox-cdn/following{/other_user}","gists_url":"https://api.github.com/users/redbox-cdn/gists{/gist_id}","starred_url":"https://api.github.com/users/redbox-cdn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/redbox-cdn/subscriptions","organizations_url":"https://api.github.com/users/redbox-cdn/orgs","repos_url":"https://api.github.com/users/redbox-cdn/repos","events_url":"https://api.github.com/users/redbox-cdn/events{/privacy}","received_events_url":"https://api.github.com/users/redbox-cdn/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":6,"created_at":"2017-06-05T06:57:30Z","updated_at":"2018-09-12T15:18:06Z","closed_at":"2018-09-12T15:18:06Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"hi \r\n\r\nI am facing following error. Does anyone know what is missing ?\r\n\r\n### here is my details\r\nCentos 6.7\r\nVarnish4.1.6\r\npkg-config 0.23\r\nautomake 1.12.1\r\nautoconf 2.69\r\nm4 1.4.13\r\n\r\n```\r\n./configure\r\n\r\n./configure: line 10817: PKG_PROG_PKG_CONFIG: command not found\r\n./configure: line 10818: PKG_PROG_PKG_CONFIG: command not found\r\n./configure: line 10819: PKG_PROG_PKG_CONFIG: command not found\r\n./configure: line 10820: PKG_PROG_PKG_CONFIG: command not found\r\n./configure: line 10821: PKG_PROG_PKG_CONFIG: command not found\r\n./configure: line 10822: PKG_PROG_PKG_CONFIG: command not found\r\n./configure: line 10824: syntax error near unexpected token `0.21'\r\n./configure: line 10824: ` PKG_PROG_PKG_CONFIG(0.21)'\r\n```\r\n\r\n```\r\n\r\nautogen.sh \r\n+ aclocal -I m4 -I /usr/local/varnish/share/aclocal\r\nconfigure.ac:14: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body\r\n../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from...\r\n../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from...\r\n../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from...\r\nm4/libtool.m4:1022: _LT_SYS_MODULE_PATH_AIX is expanded from...\r\nm4/libtool.m4:4161: _LT_LINKER_SHLIBS is expanded from...\r\nm4/libtool.m4:5236: _LT_LANG_C_CONFIG is expanded from...\r\nm4/libtool.m4:138: _LT_SETUP is expanded from...\r\nm4/libtool.m4:67: LT_INIT is expanded from...\r\nconfigure.ac:14: the top level\r\nconfigure.ac:14: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body\r\n../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from...\r\n../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from...\r\n../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from...\r\nm4/libtool.m4:4161: _LT_LINKER_SHLIBS is expanded from...\r\nm4/libtool.m4:5236: _LT_LANG_C_CONFIG is expanded from...\r\nm4/libtool.m4:138: _LT_SETUP is expanded from...\r\nm4/libtool.m4:67: LT_INIT is expanded from...\r\nconfigure.ac:14: the top level\r\nconfigure.ac:25: warning: PKG_PROG_PKG_CONFIG is m4_require'd but not m4_defun'd\r\nm4/ax_pkg_check_var.m4:10: PKG_CHECK_VAR is expanded from...\r\n/usr/local/varnish/share/aclocal/varnish.m4:36: _VARNISH_PKG_CONFIG is expanded from...\r\n/usr/local/varnish/share/aclocal/varnish.m4:255: VARNISH_PREREQ is expanded from...\r\nconfigure.ac:25: the top level\r\nconfigure.ac:28: warning: PKG_PROG_PKG_CONFIG is m4_require'd but not m4_defun'd\r\nm4/ax_pkg_check_var.m4:10: PKG_CHECK_VAR is expanded from...\r\nconfigure.ac:28: the top level\r\n+ libtoolize --copy --force\r\nlibtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `build-aux'.\r\nlibtoolize: copying file `build-aux/ltmain.sh'\r\nlibtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.\r\nlibtoolize: copying file `m4/libtool.m4'\r\nlibtoolize: copying file `m4/ltoptions.m4'\r\nlibtoolize: copying file `m4/ltsugar.m4'\r\nlibtoolize: copying file `m4/ltversion.m4'\r\nlibtoolize: copying file `m4/lt~obsolete.m4'\r\n+ autoheader\r\nconfigure.ac:14: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body\r\n../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from...\r\n../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from...\r\n../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from...\r\nm4/libtool.m4:1022: _LT_SYS_MODULE_PATH_AIX is expanded from...\r\nm4/libtool.m4:4161: _LT_LINKER_SHLIBS is expanded from...\r\nm4/libtool.m4:5236: _LT_LANG_C_CONFIG is expanded from...\r\nm4/libtool.m4:138: _LT_SETUP is expanded from...\r\nm4/libtool.m4:67: LT_INIT is expanded from...\r\nconfigure.ac:14: the top level\r\nconfigure.ac:14: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body\r\n../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from...\r\n../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from...\r\n../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from...\r\nm4/libtool.m4:4161: _LT_LINKER_SHLIBS is expanded from...\r\nm4/libtool.m4:5236: _LT_LANG_C_CONFIG is expanded from...\r\nm4/libtool.m4:138: _LT_SETUP is expanded from...\r\nm4/libtool.m4:67: LT_INIT is expanded from...\r\nconfigure.ac:14: the top level\r\nconfigure.ac:25: warning: PKG_PROG_PKG_CONFIG is m4_require'd but not m4_defun'd\r\nm4/ax_pkg_check_var.m4:10: PKG_CHECK_VAR is expanded from...\r\naclocal.m4:1349: _VARNISH_PKG_CONFIG is expanded from...\r\naclocal.m4:1568: VARNISH_PREREQ is expanded from...\r\nconfigure.ac:25: the top level\r\nconfigure.ac:28: warning: PKG_PROG_PKG_CONFIG is m4_require'd but not m4_defun'd\r\nm4/ax_pkg_check_var.m4:10: PKG_CHECK_VAR is expanded from...\r\nconfigure.ac:28: the top level\r\n+ automake --add-missing --copy --foreign\r\nconfigure.ac:14: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body\r\n../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from...\r\n../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from...\r\n../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from...\r\nm4/libtool.m4:1022: _LT_SYS_MODULE_PATH_AIX is expanded from...\r\nm4/libtool.m4:4161: _LT_LINKER_SHLIBS is expanded from...\r\nm4/libtool.m4:5236: _LT_LANG_C_CONFIG is expanded from...\r\nm4/libtool.m4:138: _LT_SETUP is expanded from...\r\nm4/libtool.m4:67: LT_INIT is expanded from...\r\nconfigure.ac:14: the top level\r\nconfigure.ac:14: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body\r\n../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from...\r\n../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from...\r\n../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from...\r\nm4/libtool.m4:4161: _LT_LINKER_SHLIBS is expanded from...\r\nm4/libtool.m4:5236: _LT_LANG_C_CONFIG is expanded from...\r\nm4/libtool.m4:138: _LT_SETUP is expanded from...\r\nm4/libtool.m4:67: LT_INIT is expanded from...\r\nconfigure.ac:14: the top level\r\nconfigure.ac:25: warning: PKG_PROG_PKG_CONFIG is m4_require'd but not m4_defun'd\r\nm4/ax_pkg_check_var.m4:10: PKG_CHECK_VAR is expanded from...\r\naclocal.m4:1349: _VARNISH_PKG_CONFIG is expanded from...\r\naclocal.m4:1568: VARNISH_PREREQ is expanded from...\r\nconfigure.ac:25: the top level\r\nconfigure.ac:28: warning: PKG_PROG_PKG_CONFIG is m4_require'd but not m4_defun'd\r\nm4/ax_pkg_check_var.m4:10: PKG_CHECK_VAR is expanded from...\r\nconfigure.ac:28: the top level\r\n+ autoconf\r\nconfigure.ac:14: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body\r\n../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from...\r\n../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from...\r\n../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from...\r\nm4/libtool.m4:1022: _LT_SYS_MODULE_PATH_AIX is expanded from...\r\nm4/libtool.m4:4161: _LT_LINKER_SHLIBS is expanded from...\r\nm4/libtool.m4:5236: _LT_LANG_C_CONFIG is expanded from...\r\nm4/libtool.m4:138: _LT_SETUP is expanded from...\r\nm4/libtool.m4:67: LT_INIT is expanded from...\r\nconfigure.ac:14: the top level\r\nconfigure.ac:14: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body\r\n../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from...\r\n../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from...\r\n../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from...\r\nm4/libtool.m4:4161: _LT_LINKER_SHLIBS is expanded from...\r\nm4/libtool.m4:5236: _LT_LANG_C_CONFIG is expanded from...\r\nm4/libtool.m4:138: _LT_SETUP is expanded from...\r\nm4/libtool.m4:67: LT_INIT is expanded from...\r\nconfigure.ac:14: the top level\r\nconfigure.ac:25: warning: PKG_PROG_PKG_CONFIG is m4_require'd but not m4_defun'd\r\nm4/ax_pkg_check_var.m4:10: PKG_CHECK_VAR is expanded from...\r\naclocal.m4:1349: _VARNISH_PKG_CONFIG is expanded from...\r\naclocal.m4:1568: VARNISH_PREREQ is expanded from...\r\nconfigure.ac:25: the top level\r\nconfigure.ac:28: warning: PKG_PROG_PKG_CONFIG is m4_require'd but not m4_defun'd\r\nm4/ax_pkg_check_var.m4:10: PKG_CHECK_VAR is expanded from...\r\nconfigure.ac:28: the top level\r\n\r\n\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/22/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/22/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/23","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/23/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/23/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/23/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/23","id":247464302,"node_id":"MDU6SXNzdWUyNDc0NjQzMDI=","number":23,"title":"probe not happy with .url = \"/xxx\";","user":{"login":"razvanphp","id":4599319,"node_id":"MDQ6VXNlcjQ1OTkzMTk=","avatar_url":"https://avatars.githubusercontent.com/u/4599319?v=4","gravatar_id":"","url":"https://api.github.com/users/razvanphp","html_url":"https://github.com/razvanphp","followers_url":"https://api.github.com/users/razvanphp/followers","following_url":"https://api.github.com/users/razvanphp/following{/other_user}","gists_url":"https://api.github.com/users/razvanphp/gists{/gist_id}","starred_url":"https://api.github.com/users/razvanphp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/razvanphp/subscriptions","organizations_url":"https://api.github.com/users/razvanphp/orgs","repos_url":"https://api.github.com/users/razvanphp/repos","events_url":"https://api.github.com/users/razvanphp/events{/privacy}","received_events_url":"https://api.github.com/users/razvanphp/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2017-08-02T17:26:56Z","updated_at":"2017-08-11T16:11:32Z","closed_at":"2017-08-11T16:11:32Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hey,\r\n\r\nFirst of all, thanks for this nice extension, it's finally allowing us to get rid of some local nginx instances and use only varnish to connect to AWS ALB directly.\r\n\r\nProblem is, we can't make the probes happy, they fail ~for some reason and I can't understand why~ because the dynamic vmod probes don't send a valid HTTP/1.1 request, more specifically, the `Host` header is missing.\r\n\r\nHere how it looks on the nginx side:\r\n```\r\n10.132.58.46 - - [02/Aug/2017:18:19:54 +0000] \"GET /ping HTTP/1.1\" 200 14 \"-\" \"curl/7.38.0\"\r\n10.132.58.46 - - [02/Aug/2017:18:19:55 +0000] \"GET /ping HTTP/1.1\" 200 14 \"-\" \"-\"\r\n10.132.58.46 - - [02/Aug/2017:18:19:54 +0000] \"GET /ping HTTP/1.1\" 400 166 \"-\" \"-\"\r\n```\r\ncurl works, normal backend works, dynamic backend probe gets 400 because:\r\n```\r\n2017/08/02 18:48:29 [info] 1784#1784: *710 client sent HTTP/1.1 request without \"Host\" header while reading client request headers, client: 10.132.58.46, server: _, request: \"GET /ping HTTP/1.1\"\r\n```\r\n\r\nSo, according to RFC 2316, section 14.23, HTTP 1.1 requests must contain a host header. If they don't, a server must reply with error 400.\r\n\r\nThis module should just put the DNS name of the backend as `Host` header, or just the IP like curl does when no server name is specified:\r\n```\r\n$ curl 10.132.17.10/ping -v\r\n* Hostname was NOT found in DNS cache\r\n* Trying 10.132.17.10...\r\n* Connected to 10.132.17.10 (10.132.17.10) port 80 (#0)\r\n> GET /ping HTTP/1.1\r\n> User-Agent: curl/7.38.0\r\n> Host: 10.132.17.10\r\n> Accept: */*\r\n>\r\n< HTTP/1.1 200 OK\r\n```\r\n\r\nMaybe you can also check what the original varnish code for probe does. Currently the workaround is:\r\n```\r\nprobe www_probe {\r\n .request =\r\n \"GET /ping HTTP/1.1\"\r\n \"Host: www.foo.bar\"\r\n \"Connection: close\";\r\n .timeout = 1s;\r\n .window = 8;\r\n .initial = 7;\r\n .threshold = 6;\r\n .interval = 5s;\r\n}\r\n```\r\n\r\nCheers,\r\nR","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/23/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/23/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/24","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/24/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/24/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/24/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/24","id":250079481,"node_id":"MDU6SXNzdWUyNTAwNzk0ODE=","number":24,"title":"make failed after latest commits","user":{"login":"rashidul0405","id":1697082,"node_id":"MDQ6VXNlcjE2OTcwODI=","avatar_url":"https://avatars.githubusercontent.com/u/1697082?v=4","gravatar_id":"","url":"https://api.github.com/users/rashidul0405","html_url":"https://github.com/rashidul0405","followers_url":"https://api.github.com/users/rashidul0405/followers","following_url":"https://api.github.com/users/rashidul0405/following{/other_user}","gists_url":"https://api.github.com/users/rashidul0405/gists{/gist_id}","starred_url":"https://api.github.com/users/rashidul0405/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rashidul0405/subscriptions","organizations_url":"https://api.github.com/users/rashidul0405/orgs","repos_url":"https://api.github.com/users/rashidul0405/repos","events_url":"https://api.github.com/users/rashidul0405/events{/privacy}","received_events_url":"https://api.github.com/users/rashidul0405/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":3,"created_at":"2017-08-14T16:12:02Z","updated_at":"2017-09-05T14:51:44Z","closed_at":"2017-09-05T14:51:44Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"If I build using Apr 10, 2017 commit it works fine. \r\n\r\nHowever, current latest version produces the following error:\r\n\r\nvarnish 4.1.8\r\n\r\n```\r\nubuntu@16.04 $ make\r\nmake all-recursive\r\nmake[1]: Entering directory '/home/ubuntu/dynamic/libvmod-dynamic'\r\nMaking all in src\r\nmake[2]: Entering directory '/home/ubuntu/dynamic/libvmod-dynamic/src'\r\n CC vmod_dynamic.lo\r\nIn file included from vmod_dynamic.c:47:0:\r\nvmod_dynamic.c: In function ‘dynamic_get’:\r\nvmod_dynamic.c:698:21: error: passing argument 2 of ‘Lck__New’ from incompatible pointer type [-Werror=incompatible-pointer-types]\r\n Lck_New(&dom->mtx, lck_be);\r\n ^\r\n/usr/include/varnish/cache/cache.h:835:35: note: in definition of macro ‘Lck_New’\r\n #define Lck_New(a, b) Lck__New(a, b, #b)\r\n ^\r\n/usr/include/varnish/cache/cache.h:828:6: note: expected ‘struct VSC_C_lck *’ but argument is of type ‘struct VSC_lck *’\r\n void Lck__New(struct lock *lck, struct VSC_C_lck *, const char *);\r\n ^\r\nvmod_dynamic.c: In function ‘vmod_event’:\r\nvmod_dynamic.c:732:12: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]\r\n lck_dir = Lck_CreateClass(\"dynamic.director\");\r\n ^\r\nvmod_dynamic.c:733:11: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]\r\n lck_be = Lck_CreateClass(\"dynamic.backend\");\r\n ^\r\nvmod_dynamic.c:744:4: error: implicit declaration of function ‘Lck_DestroyClass’ [-Werror=implicit-function-declaration]\r\n Lck_DestroyClass(&lck_dir);\r\n ^\r\nvmod_dynamic.c: In function ‘dynamic_share_parse’:\r\nvmod_dynamic.c:782:2: error: implicit declaration of function ‘NEEDLESS’ [-Werror=implicit-function-declaration]\r\n NEEDLESS(return(0));\r\n ^\r\nvmod_dynamic.c:782:11: error: expected expression before ‘return’\r\n NEEDLESS(return(0));\r\n ^\r\nIn file included from vmod_dynamic.c:47:0:\r\nvmod_dynamic.c: In function ‘vmod_director__init’:\r\nvmod_dynamic.c:858:21: error: passing argument 2 of ‘Lck__New’ from incompatible pointer type [-Werror=incompatible-pointer-types]\r\n Lck_New(&obj->mtx, lck_dir);\r\n ^\r\n/usr/include/varnish/cache/cache.h:835:35: note: in definition of macro ‘Lck_New’\r\n #define Lck_New(a, b) Lck__New(a, b, #b)\r\n ^\r\n/usr/include/varnish/cache/cache.h:828:6: note: expected ‘struct VSC_C_lck *’ but argument is of type ‘struct VSC_lck *’\r\n void Lck__New(struct lock *lck, struct VSC_C_lck *, const char *);\r\n ^\r\ncc1: all warnings being treated as errors\r\nMakefile:651: recipe for target 'vmod_dynamic.lo' failed\r\nmake[2]: *** [vmod_dynamic.lo] Error 1\r\nmake[2]: Leaving directory '/home/ubuntu/dynamic/libvmod-dynamic/src'\r\nMakefile:485: recipe for target 'all-recursive' failed\r\nmake[1]: *** [all-recursive] Error 1\r\nmake[1]: Leaving directory '/home/ubuntu/dynamic/libvmod-dynamic'\r\nMakefile:396: recipe for target 'all' failed\r\nmake: *** [all] Error 2\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/24/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/24/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/25","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/25/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/25/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/25/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/25","id":260193076,"node_id":"MDU6SXNzdWUyNjAxOTMwNzY=","number":25,"title":"5.0 branch build fails against varnish 4.1.8","user":{"login":"vStone","id":356719,"node_id":"MDQ6VXNlcjM1NjcxOQ==","avatar_url":"https://avatars.githubusercontent.com/u/356719?v=4","gravatar_id":"","url":"https://api.github.com/users/vStone","html_url":"https://github.com/vStone","followers_url":"https://api.github.com/users/vStone/followers","following_url":"https://api.github.com/users/vStone/following{/other_user}","gists_url":"https://api.github.com/users/vStone/gists{/gist_id}","starred_url":"https://api.github.com/users/vStone/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vStone/subscriptions","organizations_url":"https://api.github.com/users/vStone/orgs","repos_url":"https://api.github.com/users/vStone/repos","events_url":"https://api.github.com/users/vStone/events{/privacy}","received_events_url":"https://api.github.com/users/vStone/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":8,"created_at":"2017-09-25T08:30:14Z","updated_at":"2017-09-26T10:30:55Z","closed_at":"2017-09-26T08:59:14Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Building branch 5.0 against varnish-4.1.8:\r\n```\r\nmake[2]: Entering directory '/home/jan/SRC/libvmod-dynamic/src'\r\n VMODTOOL vmod_dynamic.vcc\r\nWARNING: $Event description is not included in .rst:\r\n[(162, '')]\r\n CC vmod_dynamic.lo\r\nvmod_dynamic.c: In function ‘dynamic_share_parse’:\r\nvmod_dynamic.c:782:2: error: implicit declaration of function ‘NEEDLESS’ [-Werror=implicit-function-declaration]\r\n NEEDLESS(return(0));\r\n ^\r\nvmod_dynamic.c:782:11: error: expected expression before ‘return’\r\n NEEDLESS(return(0));\r\n ^\r\ncc1: all warnings being treated as errors\r\nmake[2]: *** [Makefile:650: vmod_dynamic.lo] Error 1\r\n```\r\n\r\nMaybe split off a bit too late?","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/25/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/25/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/26","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/26/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/26/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/26/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/26","id":260411322,"node_id":"MDU6SXNzdWUyNjA0MTEzMjI=","number":26,"title":"PLease tag 5.2","user":{"login":"billnbell","id":25377089,"node_id":"MDQ6VXNlcjI1Mzc3MDg5","avatar_url":"https://avatars.githubusercontent.com/u/25377089?v=4","gravatar_id":"","url":"https://api.github.com/users/billnbell","html_url":"https://github.com/billnbell","followers_url":"https://api.github.com/users/billnbell/followers","following_url":"https://api.github.com/users/billnbell/following{/other_user}","gists_url":"https://api.github.com/users/billnbell/gists{/gist_id}","starred_url":"https://api.github.com/users/billnbell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/billnbell/subscriptions","organizations_url":"https://api.github.com/users/billnbell/orgs","repos_url":"https://api.github.com/users/billnbell/repos","events_url":"https://api.github.com/users/billnbell/events{/privacy}","received_events_url":"https://api.github.com/users/billnbell/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2017-09-25T20:52:45Z","updated_at":"2017-09-26T09:02:38Z","closed_at":"2017-09-26T09:02:38Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Please tag this for 5.2. The master right now appears to work.\r\n\r\ngit fetch https://github.com/nigoroll/libvmod-dynamic.git 89f489146f129a841ec91467178b28cea57236df ","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/26/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/26/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/27","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/27/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/27/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/27/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/27","id":261899811,"node_id":"MDU6SXNzdWUyNjE4OTk4MTE=","number":27,"title":"Building issue on RHEL7 with varnish 4.1.8","user":{"login":"imanandshah","id":31092588,"node_id":"MDQ6VXNlcjMxMDkyNTg4","avatar_url":"https://avatars.githubusercontent.com/u/31092588?v=4","gravatar_id":"","url":"https://api.github.com/users/imanandshah","html_url":"https://github.com/imanandshah","followers_url":"https://api.github.com/users/imanandshah/followers","following_url":"https://api.github.com/users/imanandshah/following{/other_user}","gists_url":"https://api.github.com/users/imanandshah/gists{/gist_id}","starred_url":"https://api.github.com/users/imanandshah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/imanandshah/subscriptions","organizations_url":"https://api.github.com/users/imanandshah/orgs","repos_url":"https://api.github.com/users/imanandshah/repos","events_url":"https://api.github.com/users/imanandshah/events{/privacy}","received_events_url":"https://api.github.com/users/imanandshah/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2017-10-01T08:06:50Z","updated_at":"2017-10-01T13:28:13Z","closed_at":"2017-10-01T13:28:13Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"\r\nI get the below error while building on a vanilla RHEL varnish 4.1.8 version. Can you help here?? \r\n\r\n\r\n> make all-recursive\r\nmake[1]: Entering directory `/var/tmp/libvmod-dynamic'\r\nMaking all in src\r\nmake[2]: Entering directory `/var/tmp/libvmod-dynamic/src'\r\n VMODTOOL vmod_dynamic.vcc\r\nWARNING: $Event description is not included in .rst:\r\n[(162, '')]\r\n CC vmod_dynamic.lo\r\nvmod_dynamic.c: In function 'dynamic_get':\r\nvmod_dynamic.c:698:2: error: passing argument 2 of 'Lck__New' from incompatible pointer type [-Werror]\r\n Lck_New(&dom->mtx, lck_be);\r\n ^\r\nIn file included from vmod_dynamic.c:47:0:\r\n/product/varnish/include/varnish/cache/cache.h:828:6: note: expected 'struct VSC_C_lck *' but argument is of type 'struct VSC_lck *'\r\n void Lck__New(struct lock *lck, struct VSC_C_lck *, const char *);\r\n ^\r\nvmod_dynamic.c: In function 'vmod_event':\r\nvmod_dynamic.c:732:12: error: assignment from incompatible pointer type [-Werror]\r\n lck_dir = Lck_CreateClass(\"dynamic.director\");\r\n ^\r\nvmod_dynamic.c:733:11: error: assignment from incompatible pointer type [-Werror]\r\n lck_be = Lck_CreateClass(\"dynamic.backend\");\r\n ^\r\nvmod_dynamic.c:744:4: error: implicit declaration of function 'Lck_DestroyClass' [-Werror=implicit-function-declaration]\r\n Lck_DestroyClass(&lck_dir);\r\n ^\r\nvmod_dynamic.c: In function 'dynamic_share_parse':\r\nvmod_dynamic.c:782:2: error: implicit declaration of function 'NEEDLESS' [-Werror=implicit-function-declaration]\r\n NEEDLESS(return(0));\r\n ^\r\nvmod_dynamic.c:782:11: error: expected expression before 'return'\r\n NEEDLESS(return(0));\r\n ^\r\nvmod_dynamic.c: In function 'vmod_director__init':\r\nvmod_dynamic.c:858:2: error: passing argument 2 of 'Lck__New' from incompatible pointer type [-Werror]\r\n Lck_New(&obj->mtx, lck_dir);\r\n ^\r\nIn file included from vmod_dynamic.c:47:0:\r\n/product/varnish/include/varnish/cache/cache.h:828:6: note: expected 'struct VSC_C_lck *' but argument is of type 'struct VSC_lck *'\r\n void Lck__New(struct lock *lck, struct VSC_C_lck *, const char *);\r\n ^\r\ncc1: all warnings being treated as errors\r\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/27/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/27/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/28","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/28/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/28/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/28/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/28","id":261999468,"node_id":"MDExOlB1bGxSZXF1ZXN0MTQ0MTIyNTUx","number":28,"title":"Improve debian package quality","user":{"login":"vStone","id":356719,"node_id":"MDQ6VXNlcjM1NjcxOQ==","avatar_url":"https://avatars.githubusercontent.com/u/356719?v=4","gravatar_id":"","url":"https://api.github.com/users/vStone","html_url":"https://github.com/vStone","followers_url":"https://api.github.com/users/vStone/followers","following_url":"https://api.github.com/users/vStone/following{/other_user}","gists_url":"https://api.github.com/users/vStone/gists{/gist_id}","starred_url":"https://api.github.com/users/vStone/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vStone/subscriptions","organizations_url":"https://api.github.com/users/vStone/orgs","repos_url":"https://api.github.com/users/vStone/repos","events_url":"https://api.github.com/users/vStone/events{/privacy}","received_events_url":"https://api.github.com/users/vStone/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2017-10-02T07:16:51Z","updated_at":"2018-09-12T15:27:28Z","closed_at":"2018-09-12T15:27:27Z","author_association":"NONE","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/28","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/28","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/28.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/28.patch","merged_at":null},"body":"Fixes all lintian (https://lintian.debian.org/manual/chapter-1.html#section-1.1) errors and fix some warnings.\r\n\r\nYou should probably double check what my changes do for the rpm build since I can't easily test that for now.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/28/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/28/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/29","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/29/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/29/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/29/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/29","id":261999621,"node_id":"MDExOlB1bGxSZXF1ZXN0MTQ0MTIyNjYx","number":29,"title":"Backport changes made to master for lintian errors and warnings","user":{"login":"vStone","id":356719,"node_id":"MDQ6VXNlcjM1NjcxOQ==","avatar_url":"https://avatars.githubusercontent.com/u/356719?v=4","gravatar_id":"","url":"https://api.github.com/users/vStone","html_url":"https://github.com/vStone","followers_url":"https://api.github.com/users/vStone/followers","following_url":"https://api.github.com/users/vStone/following{/other_user}","gists_url":"https://api.github.com/users/vStone/gists{/gist_id}","starred_url":"https://api.github.com/users/vStone/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vStone/subscriptions","organizations_url":"https://api.github.com/users/vStone/orgs","repos_url":"https://api.github.com/users/vStone/repos","events_url":"https://api.github.com/users/vStone/events{/privacy}","received_events_url":"https://api.github.com/users/vStone/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2017-10-02T07:17:45Z","updated_at":"2018-09-12T15:26:15Z","closed_at":"2018-09-12T15:25:43Z","author_association":"NONE","active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/pulls/29","html_url":"https://github.com/nigoroll/libvmod-dynamic/pull/29","diff_url":"https://github.com/nigoroll/libvmod-dynamic/pull/29.diff","patch_url":"https://github.com/nigoroll/libvmod-dynamic/pull/29.patch","merged_at":"2018-09-12T15:25:43Z"},"body":"","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/29/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/29/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/30","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/30/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/30/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/30/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/30","id":271126401,"node_id":"MDU6SXNzdWUyNzExMjY0MDE=","number":30,"title":"make check fails","user":{"login":"danielmotaleite","id":11890049,"node_id":"MDQ6VXNlcjExODkwMDQ5","avatar_url":"https://avatars.githubusercontent.com/u/11890049?v=4","gravatar_id":"","url":"https://api.github.com/users/danielmotaleite","html_url":"https://github.com/danielmotaleite","followers_url":"https://api.github.com/users/danielmotaleite/followers","following_url":"https://api.github.com/users/danielmotaleite/following{/other_user}","gists_url":"https://api.github.com/users/danielmotaleite/gists{/gist_id}","starred_url":"https://api.github.com/users/danielmotaleite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danielmotaleite/subscriptions","organizations_url":"https://api.github.com/users/danielmotaleite/orgs","repos_url":"https://api.github.com/users/danielmotaleite/repos","events_url":"https://api.github.com/users/danielmotaleite/events{/privacy}","received_events_url":"https://api.github.com/users/danielmotaleite/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2017-11-03T21:41:34Z","updated_at":"2017-11-06T18:21:21Z","closed_at":"2017-11-04T10:43:00Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi\r\n\r\nTrying to update the setup, when i build the latest version on a ubuntu 16.04 with varnish 5.1.2 and do a `make check` i get a `FAIL: tests/test13.vtc`\r\n\r\nThe test-suite.log says this:\r\n```\r\n=============================================\r\n libvmod-dynamic 0.2: src/test-suite.log\r\n=============================================\r\n\r\n# TOTAL: 13\r\n# PASS: 12\r\n# SKIP: 0\r\n# XFAIL: 0\r\n# FAIL: 1\r\n# XPASS: 0\r\n# ERROR: 0\r\n\r\n.. contents:: :depth: 2\r\n\r\nFAIL: tests/test13\r\n==================\r\n\r\n**** top 0.0 extmacro def pwd=/usr/src/libvmod-dynamic/src\r\n**** top 0.0 extmacro def vmod_dynamic=dynamic from \"/usr/src/libvmod-dynamic/src/.libs/libvmod_dynamic.so\"\r\n**** top 0.0 extmacro def localhost=127.0.0.1\r\n**** top 0.0 extmacro def bad_backend=127.0.0.1 20163\r\n**** top 0.0 extmacro def bad_ip=192.0.2.255\r\n**** top 0.0 macro def tmpdir=/tmp/vtc.13912.7d7acb57\r\n* top 0.0 TEST ./tests/test13.vtc starting\r\n** top 0.0 === varnishtest \"share = HOST and probe hostname\"\r\n* top 0.0 TEST share = HOST and probe hostname\r\n** top 0.0 === barrier b1 cond 2\r\n** top 0.0 === server s1 {\r\n** s1 0.0 Starting server\r\n**** s1 0.0 macro def s1_addr=127.0.0.1\r\n**** s1 0.0 macro def s1_port=29921\r\n**** s1 0.0 macro def s1_sock=127.0.0.1 29921\r\n* s1 0.0 Listen on 127.0.0.1 29921\r\n** top 0.0 === varnish v1 -arg \"-p vcc_allow_inline_c=true\" -vcl {\r\n** s1 0.0 Started on 127.0.0.1 29921\r\n** v1 0.0 Launch\r\n*** v1 0.0 CMD: cd ${pwd} && exec varnishd -d -n /tmp/vtc.13912.7d7acb57/v1 -l 2m,1m,- -p auto_restart=off -p syslog_cli_traffic=off -p sigsegv_handler=on -p thread_pool_min=10 -p debug=+vtc_mode -a '127.0.0.1:0' -M '127.0.0.1 37481' -P /tmp/vtc.13912.7d7acb57/v1/varnishd.pid -p vcc_allow_inline_c=true\r\n*** v1 0.0 CMD: cd /usr/src/libvmod-dynamic/src && exec varnishd -d -n /tmp/vtc.13912.7d7acb57/v1 -l 2m,1m,- -p auto_restart=off -p syslog_cli_traffic=off -p sigsegv_handler=on -p thread_pool_min=10 -p debug=+vtc_mode -a '127.0.0.1:0' -M '127.0.0.1 37481' -P /tmp/vtc.13912.7d7acb57/v1/varnishd.pid -p vcc_allow_inline_c=true\r\n*** v1 0.0 PID: 13918\r\n**** v1 0.0 macro def v1_pid=13918\r\n**** v1 0.0 macro def v1_name=/tmp/vtc.13912.7d7acb57/v1\r\n*** v1 0.0 debug|Debug: Platform: Linux,4.4.0-96-generic,x86_64,-junix,-smalloc,-smalloc,-hcritbit\r\n*** v1 0.0 debug|200 282 \r\n*** v1 0.0 debug|-----------------------------\r\n*** v1 0.0 debug|Varnish Cache CLI 1.0\r\n*** v1 0.0 debug|-----------------------------\r\n*** v1 0.0 debug|Linux,4.4.0-96-generic,x86_64,-junix,-smalloc,-smalloc,-hcritbit\r\n*** v1 0.0 debug|varnish-5.1.2 revision 6ece695\r\n*** v1 0.0 debug|\r\n*** v1 0.0 debug|Type 'help' for command list.\r\n*** v1 0.0 debug|Type 'quit' to close CLI session.\r\n*** v1 0.0 debug|Type 'start' to launch worker process.\r\n*** v1 0.0 debug|\r\n*** v1 0.1 vsl|No VSL chunk found (child not started ?)\r\n**** v1 0.1 CLIPOLL 1 0x1 0x0\r\n*** v1 0.1 CLI connection fd = 10\r\n*** v1 0.1 CLI RX 107\r\n**** v1 0.1 CLI RX|xwjyrinmibtzfxggweunpxsicelyacyp\r\n**** v1 0.1 CLI RX|\r\n**** v1 0.1 CLI RX|Authentication required.\r\n**** v1 0.1 CLI TX|auth b3647e8f5e78d945d02d2b980d6e946615c4372711fa2add9f9220eb7724937d\r\n*** v1 0.1 CLI RX 200\r\n**** v1 0.1 CLI RX|-----------------------------\r\n**** v1 0.1 CLI RX|Varnish Cache CLI 1.0\r\n**** v1 0.1 CLI RX|-----------------------------\r\n**** v1 0.1 CLI RX|Linux,4.4.0-96-generic,x86_64,-junix,-smalloc,-smalloc,-hcritbit\r\n**** v1 0.1 CLI RX|varnish-5.1.2 revision 6ece695\r\n**** v1 0.1 CLI RX|\r\n**** v1 0.1 CLI RX|Type 'help' for command list.\r\n**** v1 0.1 CLI RX|Type 'quit' to close CLI session.\r\n**** v1 0.1 CLI RX|Type 'start' to launch worker process.\r\n**** v1 0.1 CLI TX|vcl.inline vcl1 << %XJEIFLH|)Xspa8P\r\n**** v1 0.1 CLI TX|vcl 4.0;\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\timport dynamic from \"/usr/src/libvmod-dynamic/src/.libs/libvmod_dynamic.so\";\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tbackend dummy {\r\n**** v1 0.1 CLI TX|\\t .host = \"192.0.2.255\";\r\n**** v1 0.1 CLI TX|\\t}\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tprobe simple {\r\n**** v1 0.1 CLI TX|\\t .initial = 3;\r\n**** v1 0.1 CLI TX|\\t .timeout = 1s;\r\n**** v1 0.1 CLI TX|\\t .interval = 10s;\r\n**** v1 0.1 CLI TX|\\t}\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tsub vcl_init {\r\n**** v1 0.1 CLI TX|\\t new d1 = dynamic.director(\r\n**** v1 0.1 CLI TX|\\t port = \"29921\",\r\n**** v1 0.1 CLI TX|\\t share = HOST,\r\n**** v1 0.1 CLI TX|\\t probe = simple\r\n**** v1 0.1 CLI TX|\\t );\r\n**** v1 0.1 CLI TX|\\t}\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tsub vcl_recv {\r\n**** v1 0.1 CLI TX|\\t set req.backend_hint = d1.backend();\r\n**** v1 0.1 CLI TX|\\t unset req.http.Host;\r\n**** v1 0.1 CLI TX|\\t # let the probe win the race for the backend\r\n**** v1 0.1 CLI TX|\\t C{\r\n**** v1 0.1 CLI TX|\\t\\t#include \r\n**** v1 0.1 CLI TX|\\t\\t(void)sleep(1);\r\n**** v1 0.1 CLI TX|\\t }C\r\n**** v1 0.1 CLI TX|\\t return (pass);\r\n**** v1 0.1 CLI TX|\\t}\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tsub vcl_backend_error {\r\n**** v1 0.1 CLI TX|\\t # the director may resolve ::1 first\r\n**** v1 0.1 CLI TX|\\t return (retry);\r\n**** v1 0.1 CLI TX|\\t}\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|%XJEIFLH|)Xspa8P\r\n*** v1 0.1 CLI RX 106\r\n**** v1 0.1 CLI RX|Message from C-compiler:\r\n**** v1 0.1 CLI RX|In file included from /usr/include/unistd.h:1151:0,\r\n**** v1 0.1 CLI RX| from vgc.c:1542:\r\n**** v1 0.1 CLI RX|/usr/include/x86_64-linux-gnu/bits/unistd.h: In function \\342\\200\\230VGC_function_vcl_recv\\342\\200\\231:\r\n**** v1 0.1 CLI RX|/usr/include/x86_64-linux-gnu/bits/unistd.h:34:1: error: nested function \\342\\200\\230read\\342\\200\\231 declared \\342\\200\\230extern\\342\\200\\231\r\n**** v1 0.1 CLI RX| read (int __fd, void *__buf, size_t __nbytes)\r\n**** v1 0.1 CLI RX| ^\r\n**** v1 0.1 CLI RX|/usr/include/x86_64-linux-gnu/bits/unistd.h:34:1: error: static declaration of \\342\\200\\230read\\342\\200\\231 follows non-static declaration\r\n**** v1 0.1 CLI RX|In file included from vgc.c:1542:0:\r\n**** v1 0.1 CLI RX|/usr/include/unistd.h:363:16: note: previous declaration of \\342\\200\\230read\\342\\200\\231 was here\r\n**** v1 0.1 CLI RX| extern ssize_t read (int __fd, void *__buf, size_t __nbytes) __wur;\r\n**** v1 0.1 CLI RX|[110 lines truncated]\r\n**** v1 0.1 CLI RX|Running C-compiler failed, exited with 1\r\n**** v1 0.1 CLI RX|VCL compilation failed\r\n---- v1 0.1 VCL compilation failed expected success\r\n* top 0.1 RESETTING after ./tests/test13.vtc\r\n** s1 0.1 Waiting for server (4/-1)\r\n**** s1 0.1 macro undef s1_addr\r\n**** s1 0.1 macro undef s1_port\r\n**** s1 0.1 macro undef s1_sock\r\n** v1 0.1 Wait\r\n**** v1 0.1 CLI TX|backend.list\r\n*** v1 0.2 CLI RX 101\r\n**** v1 0.2 CLI RX|Unknown request in manager process (child not running).\r\n**** v1 0.2 CLI RX|Type 'help' for more info.\r\n**** v1 0.2 STDOUT poll 0x10\r\n** v1 0.2 R 13918 Status: 0000 (u 0.016000 s 0.004000)\r\n*** v1 0.2 vsl|No VSL chunk found (child not started ?)\r\n* top 0.2 TEST ./tests/test13.vtc FAILED\r\n# top TEST ./tests/test13.vtc FAILED (0.204) exit=2\r\n```\r\n\r\ni'm using a aws machine, with ubuntu 16.04 (fully updated), the \r\n`deb https://packagecloud.io/varnishcache/varnish5/ubuntu xenial main` and installed varnish 5.2.0-1~xenial (also tried 5.1.x with the 5.1 branch and same result)\r\n\r\nCompiling in a debian jessie machine, this works fine\r\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/30/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/30/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/31","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/31/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/31/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/31/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/31","id":271576264,"node_id":"MDU6SXNzdWUyNzE1NzYyNjQ=","number":31,"title":"ref-backend 3 total where 2 expected","user":{"login":"danielmotaleite","id":11890049,"node_id":"MDQ6VXNlcjExODkwMDQ5","avatar_url":"https://avatars.githubusercontent.com/u/11890049?v=4","gravatar_id":"","url":"https://api.github.com/users/danielmotaleite","html_url":"https://github.com/danielmotaleite","followers_url":"https://api.github.com/users/danielmotaleite/followers","following_url":"https://api.github.com/users/danielmotaleite/following{/other_user}","gists_url":"https://api.github.com/users/danielmotaleite/gists{/gist_id}","starred_url":"https://api.github.com/users/danielmotaleite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danielmotaleite/subscriptions","organizations_url":"https://api.github.com/users/danielmotaleite/orgs","repos_url":"https://api.github.com/users/danielmotaleite/repos","events_url":"https://api.github.com/users/danielmotaleite/events{/privacy}","received_events_url":"https://api.github.com/users/danielmotaleite/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2017-11-06T18:33:47Z","updated_at":"2018-09-12T15:13:18Z","closed_at":"2018-09-12T15:13:18Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Trying to compile on a ubuntu 16.04 (same setup as #30 ), it works fine in one machine, but just deployed another machine with the same setup and that one fails in test07. Both are ubuntu 16.04 and have almost the same packages installed (the ones missing have nothing to do with network)\r\n\r\nI have tried to find why it fails, did try comparing the machines, but i'm unable to solve this. i have probably made any manual change in the original machine that i miss to port to ansible.\r\n\r\nHave you any idea what is failing here?\r\n\r\nThanks!\r\n```\r\n$ cat src/test-suite.log \r\n=============================================\r\n libvmod-dynamic 0.2: src/test-suite.log\r\n=============================================\r\n\r\n# TOTAL: 13\r\n# PASS: 12\r\n# SKIP: 0\r\n# XFAIL: 0\r\n# FAIL: 1\r\n# XPASS: 0\r\n# ERROR: 0\r\n\r\n.. contents:: :depth: 2\r\n\r\nFAIL: tests/test07\r\n==================\r\n\r\n**** top 0.0 extmacro def pwd=/usr/src/libvmod-dynamic/src\r\n**** top 0.0 extmacro def vmod_dynamic=dynamic from \"/usr/src/libvmod-dynamic/src/.libs/libvmod_dynamic.so\"\r\n**** top 0.0 extmacro def localhost=127.0.0.1\r\n**** top 0.0 extmacro def bad_backend=127.0.0.1 25622\r\n**** top 0.0 extmacro def bad_ip=192.0.2.255\r\n**** top 0.0 macro def tmpdir=/tmp/vtc.23481.62e33210\r\n* top 0.0 TEST ./tests/test07.vtc starting\r\n** top 0.0 === varnishtest \"debugging\"\r\n* top 0.0 TEST debugging\r\n** top 0.0 === server s1 {\r\n** s1 0.0 Starting server\r\n**** s1 0.0 macro def s1_addr=127.0.0.1\r\n**** s1 0.0 macro def s1_port=26117\r\n**** s1 0.0 macro def s1_sock=127.0.0.1 26117\r\n* s1 0.0 Listen on 127.0.0.1 26117\r\n** top 0.0 === varnish v1 -vcl {\r\n** s1 0.0 Started on 127.0.0.1 26117\r\n** v1 0.0 Launch\r\n*** v1 0.0 CMD: cd ${pwd} && exec varnishd -d -n /tmp/vtc.23481.62e33210/v1 -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p sigsegv_handler=on -p thread_pool_min=10 -p debug=+vtc_mode -a '127.0.0.1:0' -M '127.0.0.1 26490' -P /tmp/vtc.23481.62e33210/v1/varnishd.pid \r\n*** v1 0.0 CMD: cd /usr/src/libvmod-dynamic/src && exec varnishd -d -n /tmp/vtc.23481.62e33210/v1 -l 2m -p auto_restart=off -p syslog_cli_traffic=off -p sigsegv_handler=on -p thread_pool_min=10 -p debug=+vtc_mode -a '127.0.0.1:0' -M '127.0.0.1 26490' -P /tmp/vtc.23481.62e33210/v1/varnishd.pid \r\n*** v1 0.0 PID: 23489\r\n**** v1 0.0 macro def v1_pid=23489\r\n**** v1 0.0 macro def v1_name=/tmp/vtc.23481.62e33210/v1\r\n*** v1 0.0 debug|Debug: Platform: Linux,4.4.0-1022-aws,x86_64,-junix,-smalloc,-smalloc,-hcritbit\r\n*** v1 0.0 debug|200 282 \r\n*** v1 0.0 debug|-----------------------------\r\n*** v1 0.0 debug|Varnish Cache CLI 1.0\r\n*** v1 0.0 debug|-----------------------------\r\n*** v1 0.0 debug|Linux,4.4.0-1022-aws,x86_64,-junix,-smalloc,-smalloc,-hcritbit\r\n*** v1 0.0 debug|varnish-5.2.0 revision 4c4875cbf\r\n*** v1 0.0 debug|\r\n*** v1 0.0 debug|Type 'help' for command list.\r\n*** v1 0.0 debug|Type 'quit' to close CLI session.\r\n*** v1 0.0 debug|Type 'start' to launch worker process.\r\n*** v1 0.0 debug|\r\n**** v1 0.1 CLIPOLL 1 0x1 0x0\r\n*** v1 0.1 CLI connection fd = 7\r\n*** v1 0.1 CLI RX 107\r\n**** v1 0.1 CLI RX|kaqnblrsztpytugbvfxgxggrykijepui\r\n**** v1 0.1 CLI RX|\r\n**** v1 0.1 CLI RX|Authentication required.\r\n**** v1 0.1 CLI TX|auth b79b104fbcce80da9117931098daae7d82ecba6a97fef9087481393c31166991\r\n*** v1 0.1 CLI RX 200\r\n**** v1 0.1 CLI RX|-----------------------------\r\n**** v1 0.1 CLI RX|Varnish Cache CLI 1.0\r\n**** v1 0.1 CLI RX|-----------------------------\r\n**** v1 0.1 CLI RX|Linux,4.4.0-1022-aws,x86_64,-junix,-smalloc,-smalloc,-hcritbit\r\n**** v1 0.1 CLI RX|varnish-5.2.0 revision 4c4875cbf\r\n**** v1 0.1 CLI RX|\r\n**** v1 0.1 CLI RX|Type 'help' for command list.\r\n**** v1 0.1 CLI RX|Type 'quit' to close CLI session.\r\n**** v1 0.1 CLI RX|Type 'start' to launch worker process.\r\n**** v1 0.1 CLI TX|vcl.inline vcl1 << %XJEIFLH|)Xspa8P\r\n**** v1 0.1 CLI TX|vcl 4.0;\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\timport dynamic from \"/usr/src/libvmod-dynamic/src/.libs/libvmod_dynamic.so\";\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tbackend dummy { .host = \"192.0.2.255\"; .port = \"9080\"; }\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tacl ipv4_loopback {\r\n**** v1 0.1 CLI TX|\\t\\t\"127/24\";\r\n**** v1 0.1 CLI TX|\\t}\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tsub vcl_init {\r\n**** v1 0.1 CLI TX|\\t\\tnew d1 = dynamic.director(\r\n**** v1 0.1 CLI TX|\\t\\t\\tport = \"26117\",\r\n**** v1 0.1 CLI TX|\\t\\t\\twhitelist = ipv4_loopback,\r\n**** v1 0.1 CLI TX|\\t\\t\\tdomain_usage_timeout = 1s);\r\n**** v1 0.1 CLI TX|\\t\\td1.debug(true);\r\n**** v1 0.1 CLI TX|\\t}\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|\\tsub vcl_recv {\r\n**** v1 0.1 CLI TX|\\t\\tset req.backend_hint = d1.backend();\r\n**** v1 0.1 CLI TX|\\t}\r\n**** v1 0.1 CLI TX|\r\n**** v1 0.1 CLI TX|%XJEIFLH|)Xspa8P\r\n*** v1 0.2 vsl|No VSL chunk found (child not started ?)\r\n*** v1 0.2 CLI RX 200\r\n**** v1 0.2 CLI RX|VCL compiled.\r\n**** v1 0.2 CLI TX|vcl.use vcl1\r\n*** v1 0.2 CLI RX 200\r\n** v1 0.2 Start\r\n**** v1 0.2 CLI TX|start\r\n*** v1 0.3 debug|Debug: Child (23503) Started\r\n*** v1 0.3 CLI RX 200\r\n*** v1 0.3 wait-running\r\n**** v1 0.3 CLI TX|status\r\n*** v1 0.3 debug|Info: Child (23503) said Child starts\r\n**** v1 0.3 vsl| 0 CLI - Rd vcl.load \"vcl1\" vcl_vcl1.1509992321.789111376/vgc.so 1auto\r\n**** v1 0.3 vsl| 0 CLI - Wr 200 55 Loaded \"vcl_vcl1.1509992321.789111376/vgc.so\" as \"vcl1\"\r\n**** v1 0.3 vsl| 0 CLI - Rd vcl.use \"vcl1\"\r\n**** v1 0.3 vsl| 0 CLI - Wr 200 0 \r\n**** v1 0.3 vsl| 0 CLI - Rd start\r\n**** v1 0.3 vsl| 0 CLI - Wr 200 0 \r\n*** v1 0.3 CLI RX 200\r\n**** v1 0.3 CLI RX|Child in state running\r\n**** v1 0.3 CLI TX|debug.xid 999\r\n*** v1 0.4 CLI RX 200\r\n**** v1 0.4 CLI RX|XID is 999\r\n**** v1 0.4 CLI TX|debug.listen_address\r\n*** v1 0.4 CLI RX 200\r\n**** v1 0.4 CLI RX|127.0.0.1 20192\r\n** v1 0.4 Listen on 127.0.0.1 20192\r\n**** v1 0.4 macro def v1_addr=127.0.0.1\r\n**** v1 0.4 macro def v1_port=20192\r\n**** v1 0.4 macro def v1_sock=127.0.0.1 20192\r\n** top 0.4 === logexpect l1 -v v1 -g raw {\r\n** l1 0.4 === expect * * Debug\t\"vmod-dynamic: vcl1 d1 localhost addr 127.0...\r\n** l1 0.4 === expect * * VCL_acl\t\"^MATCH ipv4_loopback\"\r\n** l1 0.4 === expect * * Debug\t\"vmod-dynamic: vcl1 d1 localhost add-backen...\r\n** l1 0.4 === expect * * Debug\t\"vmod-dynamic: vcl1 d1 localhost ref-backen...\r\n** l1 0.4 === expect * * Debug\t\"vmod-dynamic: vcl1 d1 img.localhost addr 1...\r\n** l1 0.4 === expect * * VCL_acl\t\"^MATCH ipv4_loopback\"\r\n** l1 0.4 === expect * * Debug\t\"vmod-dynamic: vcl1 d1 img.localhost ref-ba...\r\n** l1 0.4 === expect * * VCL_Log\t\"vmod-dynamic: vcl1 d1 localhost deleted\"\r\n** l1 0.4 === expect * * Debug\t\"vmod-dynamic: vcl1 d1 localhost unref-back...\r\n** top 0.4 === client c1 {\r\n** c1 0.4 Starting client\r\n** c1 0.4 Waiting for client\r\n*** c1 0.4 Connect to 127.0.0.1 20192\r\n*** c1 0.4 connected fd 22 from 127.0.0.1 62387 to 127.0.0.1 20192\r\n** c1 0.4 === txreq -hdr \"Host: localhost\"\r\n**** c1 0.4 txreq|GET / HTTP/1.1\\r\r\n**** c1 0.4 txreq|Host: localhost\\r\r\n**** c1 0.4 txreq|\\r\r\n** c1 0.4 === rxresp\r\n**** l1 0.4 begin|\r\n*** l1 0.4 expecting| expect * * Debug vmod-dynamic: vcl1 d1 localhost addr 127.0.0.1\r\n*** s1 0.4 accepted fd 5 127.0.0.1 48766\r\n** s1 0.4 === rxreq\r\n**** s1 0.4 rxhdr|GET / HTTP/1.1\\r\r\n**** s1 0.4 rxhdr|Host: localhost\\r\r\n**** s1 0.4 rxhdr|X-Forwarded-For: 127.0.0.1\\r\r\n**** s1 0.4 rxhdr|Accept-Encoding: gzip\\r\r\n**** s1 0.4 rxhdr|X-Varnish: 1002\\r\r\n**** s1 0.4 rxhdr|\\r\r\n**** s1 0.4 rxhdrlen = 103\r\n**** s1 0.4 http[ 0] |GET\r\n**** s1 0.4 http[ 1] |/\r\n**** s1 0.4 http[ 2] |HTTP/1.1\r\n**** s1 0.4 http[ 3] |Host: localhost\r\n**** s1 0.4 http[ 4] |X-Forwarded-For: 127.0.0.1\r\n**** s1 0.4 http[ 5] |Accept-Encoding: gzip\r\n**** s1 0.4 http[ 6] |X-Varnish: 1002\r\n**** s1 0.4 bodylen = 0\r\n** s1 0.4 === txresp\r\n**** s1 0.4 txresp|HTTP/1.1 200 OK\\r\r\n**** s1 0.4 txresp|Content-Length: 0\\r\r\n**** s1 0.4 txresp|\\r\r\n** s1 0.4 === accept\r\n**** s1 0.4 Accepting\r\n**** v1 0.4 vsl| 0 CLI - Rd debug.xid 999 \r\n**** v1 0.4 vsl| 0 CLI - Wr 200 10 XID is 999\r\n**** v1 0.4 vsl| 0 CLI - Rd debug.listen_address \r\n**** v1 0.4 vsl| 0 CLI - Wr 200 16 127.0.0.1 20192\r\n\r\n**** v1 0.4 vsl| 1000 Begin c sess 0 HTTP/1\r\n**** v1 0.4 vsl| 1000 SessOpen c 127.0.0.1 62387 a0 127.0.0.1 20192 1509992322.088882 23\r\n**** v1 0.4 vsl| 1000 Link c req 1001 rxreq\r\n**** v1 0.4 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(localhost) Lookup: 1509992322.089067 0.000000 0.000000\r\n**** v1 0.4 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(localhost) Results: 1509992322.089150 0.000082 0.000082\r\n**** v1 0.4 vsl| 0 Debug - vmod-dynamic: vcl1 d1 localhost addr 127.0.0.1\r\n**** v1 0.4 vsl| 0 VCL_acl - MATCH ipv4_loopback \"127/24\"\r\n**** v1 0.4 vsl| 0 Debug - vmod-dynamic: vcl1 d1 localhost add-backend d1(127.0.0.1)\r\n**** v1 0.4 vsl| 0 Debug - vmod-dynamic: vcl1 d1 localhost ref-backend d1(127.0.0.1) (1 in total)\r\n**** v1 0.4 vsl| 0 Debug - vmod-dynamic: vcl1 d1 localhost addr 127.0.0.1\r\n**** v1 0.4 vsl| 0 VCL_acl - MATCH ipv4_loopback \"127/24\"\r\n**** v1 0.4 vsl| 0 Debug - vmod-dynamic: vcl1 d1 localhost ref-backend d1(127.0.0.1) (2 in total)\r\n**** v1 0.4 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(localhost) Update: 1509992322.089274 0.000207 0.000124\r\n**** v1 0.4 vsl| 0 ExpKill - EXP_Inbox flg=1e p=0x7f9093fb1020 e=0.000000000 f=0x0\r\n**** v1 0.4 vsl| 0 ExpKill - EXP_When p=0x7f9093fb1020 e=1509992452.089462042 f=0x1e\r\n**** v1 0.4 vsl| 0 ExpKill - EXP_expire p=0x7f9093fb1020 e=129.999498844 f=0x0\r\n**** l1 0.4 match| 0 Debug - vmod-dynamic: vcl1 d1 localhost addr 127.0.0.1\r\n*** l1 0.4 expecting| expect * * VCL_acl ^MATCH ipv4_loopback\r\n**** l1 0.4 match| 0 VCL_acl - MATCH ipv4_loopback \"127/24\"\r\n*** l1 0.4 expecting| expect * * Debug vmod-dynamic: vcl1 d1 localhost add-backend d1.127.0.0.1.\r\n**** l1 0.4 match| 0 Debug - vmod-dynamic: vcl1 d1 localhost add-backend d1(127.0.0.1)\r\n*** l1 0.4 expecting| expect * * Debug vmod-dynamic: vcl1 d1 localhost ref-backend d1.127.0.0.1. .1 in total.\r\n**** l1 0.4 match| 0 Debug - vmod-dynamic: vcl1 d1 localhost ref-backend d1(127.0.0.1) (1 in total)\r\n*** l1 0.4 expecting| expect * * Debug vmod-dynamic: vcl1 d1 img.localhost addr 127.0.0.1\r\n**** c1 0.4 rxhdr|HTTP/1.1 200 OK\\r\r\n**** c1 0.4 rxhdr|Content-Length: 0\\r\r\n**** c1 0.4 rxhdr|Date: Mon, 06 Nov 2017 18:18:42 GMT\\r\r\n**** c1 0.4 rxhdr|X-Varnish: 1001\\r\r\n**** c1 0.4 rxhdr|Age: 0\\r\r\n**** c1 0.4 rxhdr|Via: 1.1 varnish (Varnish/5.2)\\r\r\n**** c1 0.4 rxhdr|Accept-Ranges: bytes\\r\r\n**** c1 0.4 rxhdr|Connection: keep-alive\\r\r\n**** c1 0.4 rxhdr|\\r\r\n**** c1 0.4 rxhdrlen = 178\r\n**** c1 0.4 http[ 0] |HTTP/1.1\r\n**** c1 0.4 http[ 1] |200\r\n**** c1 0.4 http[ 2] |OK\r\n**** c1 0.4 http[ 3] |Content-Length: 0\r\n**** c1 0.4 http[ 4] |Date: Mon, 06 Nov 2017 18:18:42 GMT\r\n**** c1 0.4 http[ 5] |X-Varnish: 1001\r\n**** c1 0.4 http[ 6] |Age: 0\r\n**** c1 0.4 http[ 7] |Via: 1.1 varnish (Varnish/5.2)\r\n**** c1 0.4 http[ 8] |Accept-Ranges: bytes\r\n**** c1 0.4 http[ 9] |Connection: keep-alive\r\n**** c1 0.4 bodylen = 0\r\n** c1 0.4 === expect resp.status == 200\r\n**** c1 0.4 EXPECT resp.status (200) == \"200\" match\r\n** c1 0.4 === delay 1.5\r\n*** c1 0.4 delaying 1.5 second(s)\r\n**** v1 0.5 vsl| 1002 Begin b bereq 1001 fetch\r\n**** v1 0.5 vsl| 1002 Timestamp b Start: 1509992322.089027 0.000000 0.000000\r\n**** v1 0.5 vsl| 1002 BereqMethod b GET\r\n**** v1 0.5 vsl| 1002 BereqURL b /\r\n**** v1 0.5 vsl| 1002 BereqProtocol b HTTP/1.1\r\n**** v1 0.5 vsl| 1002 BereqHeader b Host: localhost\r\n**** v1 0.5 vsl| 1002 BereqHeader b X-Forwarded-For: 127.0.0.1\r\n**** v1 0.5 vsl| 1002 BereqHeader b Accept-Encoding: gzip\r\n**** v1 0.5 vsl| 1002 BereqHeader b X-Varnish: 1002\r\n**** v1 0.5 vsl| 1002 VCL_call b BACKEND_FETCH\r\n**** v1 0.5 vsl| 1002 VCL_return b fetch\r\n**** v1 0.5 vsl| 1002 BackendOpen b 26 vcl1.d1(127.0.0.1) 127.0.0.1 26117 127.0.0.1 48766\r\n**** v1 0.5 vsl| 1002 BackendStart b 127.0.0.1 26117\r\n**** v1 0.5 vsl| 1002 Timestamp b Bereq: 1509992322.089329 0.000302 0.000302\r\n**** v1 0.5 vsl| 1002 Timestamp b Beresp: 1509992322.089462 0.000435 0.000134\r\n**** v1 0.5 vsl| 1002 BerespProtocol b HTTP/1.1\r\n**** v1 0.5 vsl| 1002 BerespStatus b 200\r\n**** v1 0.5 vsl| 1002 BerespReason b OK\r\n**** v1 0.5 vsl| 1002 BerespHeader b Content-Length: 0\r\n**** v1 0.5 vsl| 1002 BerespHeader b Date: Mon, 06 Nov 2017 18:18:42 GMT\r\n**** v1 0.5 vsl| 1002 TTL b RFC 120 10 0 1509992322 1509992322 1509992322 0 0\r\n**** v1 0.5 vsl| 1002 VCL_call b BACKEND_RESPONSE\r\n**** v1 0.5 vsl| 1002 VCL_return b deliver\r\n**** v1 0.5 vsl| 1002 Storage b malloc s0\r\n**** v1 0.5 vsl| 1002 ObjProtocol b HTTP/1.1\r\n**** v1 0.5 vsl| 1002 ObjStatus b 200\r\n**** v1 0.5 vsl| 1002 ObjReason b OK\r\n**** v1 0.5 vsl| 1002 ObjHeader b Content-Length: 0\r\n**** v1 0.5 vsl| 1002 ObjHeader b Date: Mon, 06 Nov 2017 18:18:42 GMT\r\n**** v1 0.5 vsl| 1002 Fetch_Body b 0 none -\r\n**** v1 0.5 vsl| 1002 BackendReuse b 26 vcl1.d1(127.0.0.1)\r\n**** v1 0.5 vsl| 1002 Timestamp b BerespBody: 1509992322.100090 0.011063 0.010628\r\n**** v1 0.5 vsl| 1002 Length b 0\r\n**** v1 0.5 vsl| 1002 BereqAcct b 103 0 103 38 0 38\r\n**** v1 0.5 vsl| 1002 End b \r\n**** v1 0.5 vsl| 1001 Begin c req 1000 rxreq\r\n**** v1 0.5 vsl| 1001 Timestamp c Start: 1509992322.088958 0.000000 0.000000\r\n**** v1 0.5 vsl| 1001 Timestamp c Req: 1509992322.088958 0.000000 0.000000\r\n**** v1 0.5 vsl| 1001 ReqStart c 127.0.0.1 62387\r\n**** v1 0.5 vsl| 1001 ReqMethod c GET\r\n**** v1 0.5 vsl| 1001 ReqURL c /\r\n**** v1 0.5 vsl| 1001 ReqProtocol c HTTP/1.1\r\n**** v1 0.5 vsl| 1001 ReqHeader c Host: localhost\r\n**** v1 0.5 vsl| 1001 ReqHeader c X-Forwarded-For: 127.0.0.1\r\n**** v1 0.5 vsl| 1001 VCL_call c RECV\r\n**** v1 0.5 vsl| 1001 VCL_return c hash\r\n**** v1 0.5 vsl| 1001 VCL_call c HASH\r\n**** v1 0.5 vsl| 1001 VCL_return c lookup\r\n**** v1 0.5 vsl| 1001 VCL_call c MISS\r\n**** v1 0.5 vsl| 1001 VCL_return c fetch\r\n**** v1 0.5 vsl| 1001 Link c bereq 1002 fetch\r\n**** v1 0.5 vsl| 1001 Timestamp c Fetch: 1509992322.100111 0.011153 0.011153\r\n**** v1 0.5 vsl| 1001 RespProtocol c HTTP/1.1\r\n**** v1 0.5 vsl| 1001 RespStatus c 200\r\n**** v1 0.5 vsl| 1001 RespReason c OK\r\n**** v1 0.5 vsl| 1001 RespHeader c Content-Length: 0\r\n**** v1 0.5 vsl| 1001 RespHeader c Date: Mon, 06 Nov 2017 18:18:42 GMT\r\n**** v1 0.5 vsl| 1001 RespHeader c X-Varnish: 1001\r\n**** v1 0.5 vsl| 1001 RespHeader c Age: 0\r\n**** v1 0.5 vsl| 1001 RespHeader c Via: 1.1 varnish (Varnish/5.2)\r\n**** v1 0.5 vsl| 1001 VCL_call c DELIVER\r\n**** v1 0.5 vsl| 1001 VCL_return c deliver\r\n**** v1 0.5 vsl| 1001 Timestamp c Process: 1509992322.100124 0.011167 0.000013\r\n**** v1 0.5 vsl| 1001 RespHeader c Accept-Ranges: bytes\r\n**** v1 0.5 vsl| 1001 RespHeader c Connection: keep-alive\r\n**** v1 0.5 vsl| 1001 Timestamp c Resp: 1509992322.100143 0.011186 0.000019\r\n**** v1 0.5 vsl| 1001 ReqAcct c 35 0 35 178 0 178\r\n**** v1 0.5 vsl| 1001 End c \r\n** c1 1.9 === txreq -hdr \"Host: img.localhost\"\r\n**** c1 1.9 txreq|GET / HTTP/1.1\\r\r\n**** c1 1.9 txreq|Host: img.localhost\\r\r\n**** c1 1.9 txreq|\\r\r\n** c1 1.9 === rxresp\r\n*** s1 1.9 Accepted socket fd is 5\r\n** s1 1.9 === rxreq\r\n**** s1 1.9 rxhdr|GET / HTTP/1.1\\r\r\n**** s1 1.9 rxhdr|Host: img.localhost\\r\r\n**** s1 1.9 rxhdr|X-Forwarded-For: 127.0.0.1\\r\r\n**** s1 1.9 rxhdr|Accept-Encoding: gzip\\r\r\n**** s1 1.9 rxhdr|X-Varnish: 1004\\r\r\n**** s1 1.9 rxhdr|\\r\r\n**** s1 1.9 rxhdrlen = 107\r\n**** s1 1.9 http[ 0] |GET\r\n**** s1 1.9 http[ 1] |/\r\n**** s1 1.9 http[ 2] |HTTP/1.1\r\n**** s1 1.9 http[ 3] |Host: img.localhost\r\n**** s1 1.9 http[ 4] |X-Forwarded-For: 127.0.0.1\r\n**** s1 1.9 http[ 5] |Accept-Encoding: gzip\r\n**** s1 1.9 http[ 6] |X-Varnish: 1004\r\n**** s1 1.9 bodylen = 0\r\n** s1 1.9 === txresp\r\n**** s1 1.9 txresp|HTTP/1.1 200 OK\\r\r\n**** s1 1.9 txresp|Content-Length: 0\\r\r\n**** s1 1.9 txresp|\\r\r\n** s1 1.9 === accept\r\n**** s1 1.9 Accepting\r\n**** l1 1.9 match| 0 Debug - vmod-dynamic: vcl1 d1 img.localhost addr 127.0.0.1\r\n*** l1 1.9 expecting| expect * * VCL_acl ^MATCH ipv4_loopback\r\n**** l1 1.9 match| 0 VCL_acl - MATCH ipv4_loopback \"127/24\"\r\n*** l1 1.9 expecting| expect * * Debug vmod-dynamic: vcl1 d1 img.localhost ref-backend d1.127.0.0.1. .2 in total.\r\n**** c1 1.9 rxhdr|HTTP/1.1 200 OK\\r\r\n**** c1 1.9 rxhdr|Content-Length: 0\\r\r\n**** c1 1.9 rxhdr|Date: Mon, 06 Nov 2017 18:18:43 GMT\\r\r\n**** c1 1.9 rxhdr|X-Varnish: 1003\\r\r\n**** c1 1.9 rxhdr|Age: 0\\r\r\n**** c1 1.9 rxhdr|Via: 1.1 varnish (Varnish/5.2)\\r\r\n**** c1 1.9 rxhdr|Accept-Ranges: bytes\\r\r\n**** c1 1.9 rxhdr|Connection: keep-alive\\r\r\n**** c1 1.9 rxhdr|\\r\r\n**** c1 1.9 rxhdrlen = 178\r\n**** c1 1.9 http[ 0] |HTTP/1.1\r\n**** c1 1.9 http[ 1] |200\r\n**** c1 1.9 http[ 2] |OK\r\n**** c1 1.9 http[ 3] |Content-Length: 0\r\n**** c1 1.9 http[ 4] |Date: Mon, 06 Nov 2017 18:18:43 GMT\r\n**** c1 1.9 http[ 5] |X-Varnish: 1003\r\n**** c1 1.9 http[ 6] |Age: 0\r\n**** c1 1.9 http[ 7] |Via: 1.1 varnish (Varnish/5.2)\r\n**** c1 1.9 http[ 8] |Accept-Ranges: bytes\r\n**** c1 1.9 http[ 9] |Connection: keep-alive\r\n**** c1 1.9 bodylen = 0\r\n** c1 1.9 === expect resp.status == 200\r\n**** c1 1.9 EXPECT resp.status (200) == \"200\" match\r\n** c1 1.9 === txreq -hdr \"Host: www.localhost\"\r\n**** c1 1.9 txreq|GET / HTTP/1.1\\r\r\n**** c1 1.9 txreq|Host: www.localhost\\r\r\n**** c1 1.9 txreq|\\r\r\n** c1 1.9 === rxresp\r\n*** s1 1.9 Accepted socket fd is 5\r\n** s1 1.9 === rxreq\r\n**** s1 1.9 rxhdr|GET / HTTP/1.1\\r\r\n**** s1 1.9 rxhdr|Host: www.localhost\\r\r\n**** s1 1.9 rxhdr|X-Forwarded-For: 127.0.0.1\\r\r\n**** s1 1.9 rxhdr|Accept-Encoding: gzip\\r\r\n**** s1 1.9 rxhdr|X-Varnish: 1006\\r\r\n**** s1 1.9 rxhdr|\\r\r\n**** s1 1.9 rxhdrlen = 107\r\n**** s1 1.9 http[ 0] |GET\r\n**** s1 1.9 http[ 1] |/\r\n**** s1 1.9 http[ 2] |HTTP/1.1\r\n**** s1 1.9 http[ 3] |Host: www.localhost\r\n**** s1 1.9 http[ 4] |X-Forwarded-For: 127.0.0.1\r\n**** s1 1.9 http[ 5] |Accept-Encoding: gzip\r\n**** s1 1.9 http[ 6] |X-Varnish: 1006\r\n**** s1 1.9 bodylen = 0\r\n** s1 1.9 === txresp\r\n**** s1 1.9 txresp|HTTP/1.1 200 OK\\r\r\n**** s1 1.9 txresp|Content-Length: 0\\r\r\n**** s1 1.9 txresp|\\r\r\n*** s1 1.9 shutting fd 5\r\n** s1 1.9 Ending\r\n**** c1 1.9 rxhdr|HTTP/1.1 200 OK\\r\r\n**** c1 1.9 rxhdr|Content-Length: 0\\r\r\n**** c1 1.9 rxhdr|Date: Mon, 06 Nov 2017 18:18:43 GMT\\r\r\n**** c1 1.9 rxhdr|X-Varnish: 1005\\r\r\n**** c1 1.9 rxhdr|Age: 0\\r\r\n**** c1 1.9 rxhdr|Via: 1.1 varnish (Varnish/5.2)\\r\r\n**** c1 1.9 rxhdr|Accept-Ranges: bytes\\r\r\n**** c1 1.9 rxhdr|Connection: keep-alive\\r\r\n**** c1 1.9 rxhdr|\\r\r\n**** c1 1.9 rxhdrlen = 178\r\n**** c1 1.9 http[ 0] |HTTP/1.1\r\n**** c1 1.9 http[ 1] |200\r\n**** c1 1.9 http[ 2] |OK\r\n**** c1 1.9 http[ 3] |Content-Length: 0\r\n**** c1 1.9 http[ 4] |Date: Mon, 06 Nov 2017 18:18:43 GMT\r\n**** c1 1.9 http[ 5] |X-Varnish: 1005\r\n**** c1 1.9 http[ 6] |Age: 0\r\n**** c1 1.9 http[ 7] |Via: 1.1 varnish (Varnish/5.2)\r\n**** c1 1.9 http[ 8] |Accept-Ranges: bytes\r\n**** c1 1.9 http[ 9] |Connection: keep-alive\r\n**** c1 1.9 bodylen = 0\r\n** c1 1.9 === expect resp.status == 200\r\n**** c1 1.9 EXPECT resp.status (200) == \"200\" match\r\n*** c1 1.9 closing fd 22\r\n** c1 1.9 Ending\r\n** top 1.9 === logexpect l1 -wait\r\n** l1 1.9 Waiting for logexp\r\n**** v1 2.0 vsl| 1000 Link c req 1003 rxreq\r\n**** v1 2.0 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(localhost) Done: 1509992323.601068 0.000000 0.000000\r\n**** v1 2.0 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(img.localhost) Lookup: 1509992323.601132 0.000000 0.000000\r\n**** v1 2.0 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(img.localhost) Results: 1509992323.601148 0.000016 0.000016\r\n**** v1 2.0 vsl| 0 Debug - vmod-dynamic: vcl1 d1 img.localhost addr 127.0.0.1\r\n**** v1 2.0 vsl| 0 VCL_acl - MATCH ipv4_loopback \"127/24\"\r\n**** v1 2.0 vsl| 0 Debug - vmod-dynamic: vcl1 d1 img.localhost ref-backend d1(127.0.0.1) (3 in total)\r\n**** v1 2.0 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(img.localhost) Update: 1509992323.601160 0.000028 0.000011\r\n**** v1 2.0 vsl| 0 ExpKill - EXP_expire p=0x7f9093fb1020 e=128.488030434 f=0x0\r\n**** v1 2.0 vsl| 0 ExpKill - EXP_Inbox flg=1e p=0x7f9093fb10c0 e=0.000000000 f=0x0\r\n**** v1 2.0 vsl| 0 ExpKill - EXP_When p=0x7f9093fb10c0 e=1509992453.601392269 f=0x1e\r\n**** v1 2.0 vsl| 0 ExpKill - EXP_expire p=0x7f9093fb1020 e=128.488025188 f=0x0\r\n**** v1 2.0 vsl| 1004 Begin b bereq 1003 fetch\r\n**** v1 2.0 vsl| 1004 Timestamp b Start: 1509992323.601037 0.000000 0.000000\r\n**** v1 2.0 vsl| 1004 BereqMethod b GET\r\n**** v1 2.0 vsl| 1004 BereqURL b /\r\n**** v1 2.0 vsl| 1004 BereqProtocol b HTTP/1.1\r\n**** v1 2.0 vsl| 1004 BereqHeader b Host: img.localhost\r\n**** v1 2.0 vsl| 1004 BereqHeader b X-Forwarded-For: 127.0.0.1\r\n**** v1 2.0 vsl| 1004 BereqHeader b Accept-Encoding: gzip\r\n**** v1 2.0 vsl| 1004 BereqHeader b X-Varnish: 1004\r\n**** v1 2.0 vsl| 1004 VCL_call b BACKEND_FETCH\r\n**** v1 2.0 vsl| 1004 VCL_return b fetch\r\n**** v1 2.0 vsl| 1004 BackendOpen b 26 vcl1.d1(127.0.0.1) 127.0.0.1 26117 127.0.0.1 48770\r\n**** v1 2.0 vsl| 1004 BackendStart b 127.0.0.1 26117\r\n**** v1 2.0 vsl| 1004 Timestamp b Bereq: 1509992323.601244 0.000207 0.000207\r\n**** v1 2.0 vsl| 1004 Timestamp b Beresp: 1509992323.601392 0.000355 0.000148\r\n**** v1 2.0 vsl| 1004 BerespProtocol b HTTP/1.1\r\n**** v1 2.0 vsl| 1004 BerespStatus b 200\r\n**** v1 2.0 vsl| 1004 BerespReason b OK\r\n**** v1 2.0 vsl| 1004 BerespHeader b Content-Length: 0\r\n**** v1 2.0 vsl| 1004 BerespHeader b Date: Mon, 06 Nov 2017 18:18:43 GMT\r\n**** v1 2.0 vsl| 1004 TTL b RFC 120 10 0 1509992324 1509992324 1509992323 0 0\r\n**** v1 2.0 vsl| 1004 VCL_call b BACKEND_RESPONSE\r\n**** v1 2.0 vsl| 1004 VCL_return b deliver\r\n**** v1 2.0 vsl| 1004 Storage b malloc s0\r\n**** v1 2.0 vsl| 1004 ObjProtocol b HTTP/1.1\r\n**** v1 2.0 vsl| 1004 ObjStatus b 200\r\n**** v1 2.0 vsl| 1004 ObjReason b OK\r\n**** v1 2.0 vsl| 1004 ObjHeader b Content-Length: 0\r\n**** v1 2.0 vsl| 1004 ObjHeader b Date: Mon, 06 Nov 2017 18:18:43 GMT\r\n**** v1 2.0 vsl| 1004 Fetch_Body b 0 none -\r\n**** v1 2.0 vsl| 1004 BackendReuse b 26 vcl1.d1(127.0.0.1)\r\n**** v1 2.0 vsl| 1004 Timestamp b BerespBody: 1509992323.611567 0.010530 0.010175\r\n**** v1 2.0 vsl| 1004 Length b 0\r\n**** v1 2.0 vsl| 1004 BereqAcct b 107 0 107 38 0 38\r\n**** v1 2.0 vsl| 1004 End b \r\n**** v1 2.0 vsl| 1003 Begin c req 1000 rxreq\r\n**** v1 2.0 vsl| 1003 Timestamp c Start: 1509992323.600570 0.000000 0.000000\r\n**** v1 2.0 vsl| 1003 Timestamp c Req: 1509992323.600570 0.000000 0.000000\r\n**** v1 2.0 vsl| 1003 ReqStart c 127.0.0.1 62387\r\n**** v1 2.0 vsl| 1003 ReqMethod c GET\r\n**** v1 2.0 vsl| 1003 ReqURL c /\r\n**** v1 2.0 vsl| 1003 ReqProtocol c HTTP/1.1\r\n**** v1 2.0 vsl| 1003 ReqHeader c Host: img.localhost\r\n**** v1 2.0 vsl| 1003 ReqHeader c X-Forwarded-For: 127.0.0.1\r\n**** v1 2.0 vsl| 1003 VCL_call c RECV\r\n**** v1 2.0 vsl| 1003 VCL_Log c vmod-dynamic: vcl1 d1 localhost timeout\r\n**** v1 2.0 vsl| 1003 VCL_return c hash\r\n**** v1 2.0 vsl| 1003 VCL_call c HASH\r\n**** v1 2.0 vsl| 1003 VCL_return c lookup\r\n**** v1 2.0 vsl| 1003 VCL_call c MISS\r\n**** v1 2.0 vsl| 1003 VCL_return c fetch\r\n**** v1 2.0 vsl| 1003 Link c bereq 1004 fetch\r\n**** v1 2.0 vsl| 1003 Timestamp c Fetch: 1509992323.611600 0.011030 0.011030\r\n**** v1 2.0 vsl| 1003 RespProtocol c HTTP/1.1\r\n**** v1 2.0 vsl| 1003 RespStatus c 200\r\n**** v1 2.0 vsl| 1003 RespReason c OK\r\n**** v1 2.0 vsl| 1003 RespHeader c Content-Length: 0\r\n**** v1 2.0 vsl| 1003 RespHeader c Date: Mon, 06 Nov 2017 18:18:43 GMT\r\n**** v1 2.0 vsl| 1003 RespHeader c X-Varnish: 1003\r\n**** v1 2.0 vsl| 1003 RespHeader c Age: 0\r\n**** v1 2.0 vsl| 1003 RespHeader c Via: 1.1 varnish (Varnish/5.2)\r\n**** v1 2.0 vsl| 1003 VCL_call c DELIVER\r\n**** v1 2.0 vsl| 1003 VCL_return c deliver\r\n**** v1 2.0 vsl| 1003 Timestamp c Process: 1509992323.611609 0.011038 0.000008\r\n**** v1 2.0 vsl| 1003 RespHeader c Accept-Ranges: bytes\r\n**** v1 2.0 vsl| 1003 RespHeader c Connection: keep-alive\r\n**** v1 2.0 vsl| 1003 Timestamp c Resp: 1509992323.611627 0.011057 0.000019\r\n**** v1 2.0 vsl| 1003 ReqAcct c 39 0 39 178 0 178\r\n**** v1 2.0 vsl| 1003 End c \r\n**** v1 2.0 vsl| 1000 Link c req 1005 rxreq\r\n**** v1 2.0 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(www.localhost) Lookup: 1509992323.611864 0.000000 0.000000\r\n**** v1 2.0 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(www.localhost) Results: 1509992323.611876 0.000013 0.000013\r\n**** v1 2.0 vsl| 0 Debug - vmod-dynamic: vcl1 d1 www.localhost addr 127.0.0.1\r\n**** v1 2.0 vsl| 0 VCL_acl - MATCH ipv4_loopback \"127/24\"\r\n**** v1 2.0 vsl| 0 Debug - vmod-dynamic: vcl1 d1 www.localhost ref-backend d1(127.0.0.1) (2 in total)\r\n**** v1 2.0 vsl| 0 Timestamp - vmod-dynamic vcl1.d1(www.localhost) Update: 1509992323.611887 0.000023 0.000010\r\n**** v1 2.0 vsl| 0 ExpKill - EXP_expire p=0x7f9093fb1020 e=128.477345943 f=0x0\r\n**** v1 2.0 vsl| 0 ExpKill - EXP_Inbox flg=1e p=0x7f9093fb1160 e=0.000000000 f=0x0\r\n**** v1 2.0 vsl| 0 ExpKill - EXP_When p=0x7f9093fb1160 e=1509992453.612084389 f=0x1e\r\n**** v1 2.0 vsl| 0 ExpKill - EXP_expire p=0x7f9093fb1020 e=128.477341175 f=0x0\r\n**** v1 2.0 vsl| 1006 Begin b bereq 1005 fetch\r\n**** v1 2.0 vsl| 1006 Timestamp b Start: 1509992323.611839 0.000000 0.000000\r\n**** v1 2.0 vsl| 1006 BereqMethod b GET\r\n**** v1 2.0 vsl| 1006 BereqURL b /\r\n**** v1 2.0 vsl| 1006 BereqProtocol b HTTP/1.1\r\n**** v1 2.0 vsl| 1006 BereqHeader b Host: www.localhost\r\n**** v1 2.0 vsl| 1006 BereqHeader b X-Forwarded-For: 127.0.0.1\r\n**** v1 2.0 vsl| 1006 BereqHeader b Accept-Encoding: gzip\r\n**** v1 2.0 vsl| 1006 BereqHeader b X-Varnish: 1006\r\n**** v1 2.0 vsl| 1006 VCL_call b BACKEND_FETCH\r\n**** v1 2.0 vsl| 1006 VCL_return b fetch\r\n**** v1 2.0 vsl| 1006 BackendOpen b 26 vcl1.d1(127.0.0.1) 127.0.0.1 26117 127.0.0.1 48772\r\n**** v1 2.0 vsl| 1006 BackendStart b 127.0.0.1 26117\r\n**** v1 2.0 vsl| 1006 Timestamp b Bereq: 1509992323.611935 0.000096 0.000096\r\n**** v1 2.0 vsl| 1006 Timestamp b Beresp: 1509992323.612084 0.000245 0.000150\r\n**** v1 2.0 vsl| 1006 BerespProtocol b HTTP/1.1\r\n**** v1 2.0 vsl| 1006 BerespStatus b 200\r\n**** v1 2.0 vsl| 1006 BerespReason b OK\r\n**** v1 2.0 vsl| 1006 BerespHeader b Content-Length: 0\r\n**** v1 2.0 vsl| 1006 BerespHeader b Date: Mon, 06 Nov 2017 18:18:43 GMT\r\n**** v1 2.0 vsl| 1006 TTL b RFC 120 10 0 1509992324 1509992324 1509992323 0 0\r\n**** v1 2.0 vsl| 1006 VCL_call b BACKEND_RESPONSE\r\n**** v1 2.0 vsl| 1006 VCL_return b deliver\r\n**** v1 2.0 vsl| 1006 Storage b malloc s0\r\n**** v1 2.0 vsl| 1006 ObjProtocol b HTTP/1.1\r\n**** v1 2.0 vsl| 1006 ObjStatus b 200\r\n**** v1 2.0 vsl| 1006 ObjReason b OK\r\n**** v1 2.0 vsl| 1006 ObjHeader b Content-Length: 0\r\n**** v1 2.0 vsl| 1006 ObjHeader b Date: Mon, 06 Nov 2017 18:18:43 GMT\r\n**** v1 2.0 vsl| 1006 Fetch_Body b 0 none -\r\n**** v1 2.0 vsl| 1006 BackendReuse b 26 vcl1.d1(127.0.0.1)\r\n**** v1 2.0 vsl| 1006 Timestamp b BerespBody: 1509992323.622266 0.010427 0.010182\r\n**** v1 2.0 vsl| 1006 Length b 0\r\n**** v1 2.0 vsl| 1006 BereqAcct b 107 0 107 38 0 38\r\n**** v1 2.0 vsl| 1006 End b \r\n**** v1 2.0 vsl| 1005 Begin c req 1000 rxreq\r\n**** v1 2.0 vsl| 1005 Timestamp c Start: 1509992323.611790 0.000000 0.000000\r\n**** v1 2.0 vsl| 1005 Timestamp c Req: 1509992323.611790 0.000000 0.000000\r\n**** v1 2.0 vsl| 1005 ReqStart c 127.0.0.1 62387\r\n**** v1 2.0 vsl| 1005 ReqMethod c GET\r\n**** v1 2.0 vsl| 1005 ReqURL c /\r\n**** v1 2.0 vsl| 1005 ReqProtocol c HTTP/1.1\r\n**** v1 2.0 vsl| 1005 ReqHeader c Host: www.localhost\r\n**** v1 2.0 vsl| 1005 ReqHeader c X-Forwarded-For: 127.0.0.1\r\n**** v1 2.0 vsl| 1005 VCL_call c RECV\r\n**** v1 2.0 vsl| 1005 VCL_Log c vmod-dynamic: vcl1 d1 localhost deleted\r\n**** v1 2.0 vsl| 1005 Debug c vmod-dynamic: vcl1 d1 localhost unref-backend d1(127.0.0.1) (2 remaining)\r\n**** v1 2.0 vsl| 1005 Debug c vmod-dynamic: vcl1 d1 localhost unref-backend d1(127.0.0.1) (1 remaining)\r\n**** v1 2.0 vsl| 1005 VCL_return c hash\r\n**** v1 2.0 vsl| 1005 VCL_call c HASH\r\n**** v1 2.0 vsl| 1005 VCL_return c lookup\r\n**** v1 2.0 vsl| 1005 VCL_call c MISS\r\n**** v1 2.0 vsl| 1005 VCL_return c fetch\r\n**** v1 2.0 vsl| 1005 Link c bereq 1006 fetch\r\n**** v1 2.0 vsl| 1005 Timestamp c Fetch: 1509992323.622296 0.010506 0.010506\r\n**** v1 2.0 vsl| 1005 RespProtocol c HTTP/1.1\r\n**** v1 2.0 vsl| 1005 RespStatus c 200\r\n**** v1 2.0 vsl| 1005 RespReason c OK\r\n**** v1 2.0 vsl| 1005 RespHeader c Content-Length: 0\r\n**** v1 2.0 vsl| 1005 RespHeader c Date: Mon, 06 Nov 2017 18:18:43 GMT\r\n**** v1 2.0 vsl| 1005 RespHeader c X-Varnish: 1005\r\n**** v1 2.0 vsl| 1005 RespHeader c Age: 0\r\n**** v1 2.0 vsl| 1005 RespHeader c Via: 1.1 varnish (Varnish/5.2)\r\n**** v1 2.0 vsl| 1005 VCL_call c DELIVER\r\n**** v1 2.0 vsl| 1005 VCL_return c deliver\r\n**** v1 2.0 vsl| 1005 Timestamp c Process: 1509992323.622311 0.010521 0.000015\r\n**** v1 2.0 vsl| 1005 RespHeader c Accept-Ranges: bytes\r\n**** v1 2.0 vsl| 1005 RespHeader c Connection: keep-alive\r\n**** v1 2.0 vsl| 1005 Timestamp c Resp: 1509992323.622345 0.010555 0.000034\r\n**** v1 2.0 vsl| 1005 ReqAcct c 39 0 39 178 0 178\r\n**** v1 2.0 vsl| 1005 End c \r\n**** v1 2.0 vsl| 1000 SessClose c REM_CLOSE 1.534\r\n**** v1 2.0 vsl| 1000 End c \r\n**** v1 3.3 vsl| 0 CLI - Rd ping\r\n**** v1 3.3 vsl| 0 CLI - Wr 200 19 PONG 1509992324 1.0\r\n**** v1 6.3 vsl| 0 CLI - Rd ping\r\n**** v1 6.3 vsl| 0 CLI - Wr 200 19 PONG 1509992327 1.0\r\n**** v1 9.3 vsl| 0 CLI - Rd ping\r\n**** v1 9.3 vsl| 0 CLI - Wr 200 19 PONG 1509992330 1.0\r\n**** v1 12.3 vsl| 0 CLI - Rd ping\r\n**** v1 12.3 vsl| 0 CLI - Wr 200 19 PONG 1509992333 1.0\r\n**** v1 15.3 vsl| 0 CLI - Rd ping\r\n**** v1 15.3 vsl| 0 CLI - Wr 200 19 PONG 1509992336 1.0\r\n**** v1 18.3 vsl| 0 CLI - Rd ping\r\n**** v1 18.3 vsl| 0 CLI - Wr 200 19 PONG 1509992339 1.0\r\n**** v1 21.3 vsl| 0 CLI - Rd ping\r\n**** v1 21.3 vsl| 0 CLI - Wr 200 19 PONG 1509992342 1.0\r\n**** v1 24.3 vsl| 0 CLI - Rd ping\r\n**** v1 24.3 vsl| 0 CLI - Wr 200 19 PONG 1509992345 1.0\r\n**** v1 27.4 vsl| 0 CLI - Rd ping\r\n**** v1 27.4 vsl| 0 CLI - Wr 200 19 PONG 1509992348 1.0\r\n**** v1 30.4 vsl| 0 CLI - Rd ping\r\n**** v1 30.4 vsl| 0 CLI - Wr 200 19 PONG 1509992351 1.0\r\n**** v1 33.4 vsl| 0 CLI - Rd ping\r\n**** v1 33.4 vsl| 0 CLI - Wr 200 19 PONG 1509992354 1.0\r\n**** v1 36.4 vsl| 0 CLI - Rd ping\r\n**** v1 36.4 vsl| 0 CLI - Wr 200 19 PONG 1509992357 1.0\r\n**** v1 39.4 vsl| 0 CLI - Rd ping\r\n**** v1 39.4 vsl| 0 CLI - Wr 200 19 PONG 1509992360 1.0\r\n**** v1 42.4 vsl| 0 CLI - Rd ping\r\n**** v1 42.4 vsl| 0 CLI - Wr 200 19 PONG 1509992363 1.0\r\n**** v1 45.3 vsl| 0 CLI - Rd ping\r\n**** v1 45.3 vsl| 0 CLI - Wr 200 19 PONG 1509992366 1.0\r\n**** v1 48.3 vsl| 0 CLI - Rd ping\r\n**** v1 48.3 vsl| 0 CLI - Wr 200 19 PONG 1509992369 1.0\r\n**** v1 51.3 vsl| 0 CLI - Rd ping\r\n**** v1 51.3 vsl| 0 CLI - Wr 200 19 PONG 1509992372 1.0\r\n**** v1 54.3 vsl| 0 CLI - Rd ping\r\n**** v1 54.3 vsl| 0 CLI - Wr 200 19 PONG 1509992375 1.0\r\n**** v1 57.3 vsl| 0 CLI - Rd ping\r\n**** v1 57.3 vsl| 0 CLI - Wr 200 19 PONG 1509992378 1.0\r\n# top TEST ./tests/test07.vtc TIMED OUT (kill -9)\r\n# top TEST ./tests/test07.vtc FAILED (60.031) signal=9\r\nFAIL tests/test07.vtc (exit status: 2)\r\n\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/31/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/31/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/32","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/32/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/32/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/32/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/32","id":275660712,"node_id":"MDU6SXNzdWUyNzU2NjA3MTI=","number":32,"title":"Assert error in vca_acct(), cache/cache_acceptor.c line 497 while initailly loading the module","user":{"login":"jpastuszek","id":20052,"node_id":"MDQ6VXNlcjIwMDUy","avatar_url":"https://avatars.githubusercontent.com/u/20052?v=4","gravatar_id":"","url":"https://api.github.com/users/jpastuszek","html_url":"https://github.com/jpastuszek","followers_url":"https://api.github.com/users/jpastuszek/followers","following_url":"https://api.github.com/users/jpastuszek/following{/other_user}","gists_url":"https://api.github.com/users/jpastuszek/gists{/gist_id}","starred_url":"https://api.github.com/users/jpastuszek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jpastuszek/subscriptions","organizations_url":"https://api.github.com/users/jpastuszek/orgs","repos_url":"https://api.github.com/users/jpastuszek/repos","events_url":"https://api.github.com/users/jpastuszek/events{/privacy}","received_events_url":"https://api.github.com/users/jpastuszek/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2017-11-21T10:33:18Z","updated_at":"2017-11-21T14:00:37Z","closed_at":"2017-11-21T14:00:37Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I am using varnish 4.1.3.\r\nWhen loading this module into running Varnish instance it crashes on assertion an I lose my cache:\r\n```Assert error in vca_acct(), cache/cache_acceptor.c line 497: Condition(ls->sock > 0) not true. thread = (cache-acceptor) version = varnish-4.1.3 revision 5e3b6d2 ident = Linux,4.4.16-27.56.amzn1.x86_64,x86_64,-junix,-smalloc,-smalloc,-hcritbit,epoll Backtrace: 0x432f23: varnishd() [0x432f23] 0x40efc0: varnishd(VCA_NewPool+0) [0x40efc0] 0x7f6f5ea69dc5: libpthread.so.0(+0x7dc5) [0x7f6f5ea69dc5] 0x7f6f5e796c9d: libc.so.6(clone+0x6d) [0x7f6f5e796c9d]```\r\nThis makes it difficult to introduce it to running system (cache loss).","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/32/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/32/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/33","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/33/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/33/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/33/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/33","id":291752206,"node_id":"MDU6SXNzdWUyOTE3NTIyMDY=","number":33,"title":"libvmod-dynamic only uses 3 ips from 10: add tcp query support","user":{"login":"danielmotaleite","id":11890049,"node_id":"MDQ6VXNlcjExODkwMDQ5","avatar_url":"https://avatars.githubusercontent.com/u/11890049?v=4","gravatar_id":"","url":"https://api.github.com/users/danielmotaleite","html_url":"https://github.com/danielmotaleite","followers_url":"https://api.github.com/users/danielmotaleite/followers","following_url":"https://api.github.com/users/danielmotaleite/following{/other_user}","gists_url":"https://api.github.com/users/danielmotaleite/gists{/gist_id}","starred_url":"https://api.github.com/users/danielmotaleite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danielmotaleite/subscriptions","organizations_url":"https://api.github.com/users/danielmotaleite/orgs","repos_url":"https://api.github.com/users/danielmotaleite/repos","events_url":"https://api.github.com/users/danielmotaleite/events{/privacy}","received_events_url":"https://api.github.com/users/danielmotaleite/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2018-01-25T23:28:19Z","updated_at":"2019-07-13T16:47:45Z","closed_at":"2018-01-26T02:17:48Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I have a setup where i have multiple backends (10) and use consul to manage the available backend list. Today i noticed that only a few backends (usually 3) are used, but they are always changing, on every minute, as i set `TTL= 60s`\r\n\r\n```\r\n$ while sleep 60; do varnishadm -n $HOSTNAME.live backend.list | grep _p ; echo ; done \r\nvcl_7da98ec3-be47-4ef6-88f6-42c0208b12e0.alice_p(172.30.154.202) probe Healthy 5/5 Thu, 25 Jan 2018 23:00:06 GMT\r\nvcl_7da98ec3-be47-4ef6-88f6-42c0208b12e0.alice_p(172.30.243.214) probe Healthy 5/5 Thu, 25 Jan 2018 23:01:06 GMT\r\nvcl_7da98ec3-be47-4ef6-88f6-42c0208b12e0.alice_p(172.30.249.132) probe Healthy 5/5 Thu, 25 Jan 2018 23:01:06 GMT\r\n\r\nvcl_7da98ec3-be47-4ef6-88f6-42c0208b12e0.alice_p(172.30.243.214) probe Healthy 5/5 Thu, 25 Jan 2018 23:01:06 GMT\r\nvcl_7da98ec3-be47-4ef6-88f6-42c0208b12e0.alice_p(172.30.219.96) probe Healthy 5/5 Thu, 25 Jan 2018 23:02:06 GMT\r\nvcl_7da98ec3-be47-4ef6-88f6-42c0208b12e0.alice_p(172.30.150.186) probe Healthy 5/5 Thu, 25 Jan 2018 23:02:06 GMT\r\n\r\nvcl_7da98ec3-be47-4ef6-88f6-42c0208b12e0.alice_p(172.30.249.132) probe Healthy 5/5 Thu, 25 Jan 2018 23:03:06 GMT\r\nvcl_7da98ec3-be47-4ef6-88f6-42c0208b12e0.alice_p(172.30.251.37) probe Healthy 5/5 Thu, 25 Jan 2018 23:03:06 GMT\r\nvcl_7da98ec3-be47-4ef6-88f6-42c0208b12e0.alice_p(172.30.154.202) probe Healthy 5/5 Thu, 25 Jan 2018 23:03:06 GMT\r\n\r\nvcl_7da98ec3-be47-4ef6-88f6-42c0208b12e0.alice_p(172.30.251.37) probe Healthy 5/5 Thu, 25 Jan 2018 23:03:06 GMT\r\nvcl_7da98ec3-be47-4ef6-88f6-42c0208b12e0.alice_p(172.30.161.48) probe Healthy 5/5 Thu, 25 Jan 2018 23:04:06 GMT\r\nvcl_7da98ec3-be47-4ef6-88f6-42c0208b12e0.alice_p(172.30.209.195) probe Healthy 5/5 Thu, 25 Jan 2018 23:04:06 GMT\r\n```\r\n\r\nA normal udp query return 3 entries:\r\n```\r\n$ host alice-live-p.service.consul.\r\nalice-live-p.service.consul has address 172.30.209.195\r\nalice-live-p.service.consul has address 172.30.251.37\r\nalice-live-p.service.consul has address 172.30.161.48\r\n```\r\nbut using TCP query, we get the list of 10 IPs:\r\n```\r\n$ host -T alice-live-p.service.consul.\r\nalice-live-p.service.consul has address 172.30.251.37\r\nalice-live-p.service.consul has address 172.30.219.96\r\nalice-live-p.service.consul has address 172.30.150.186\r\nalice-live-p.service.consul has address 172.30.209.195\r\nalice-live-p.service.consul has address 172.30.133.54\r\nalice-live-p.service.consul has address 172.30.154.202\r\nalice-live-p.service.consul has address 172.30.161.48\r\nalice-live-p.service.consul has address 172.30.137.218\r\nalice-live-p.service.consul has address 172.30.249.132\r\nalice-live-p.service.consul has address 172.30.243.214\r\n```\r\n\r\nSo looks like the module is using UDP for the query... i think if there is support for TCP queries, it maybe would return the 10 IP list and use all the available backends\r\n\r\n","closed_by":{"login":"danielmotaleite","id":11890049,"node_id":"MDQ6VXNlcjExODkwMDQ5","avatar_url":"https://avatars.githubusercontent.com/u/11890049?v=4","gravatar_id":"","url":"https://api.github.com/users/danielmotaleite","html_url":"https://github.com/danielmotaleite","followers_url":"https://api.github.com/users/danielmotaleite/followers","following_url":"https://api.github.com/users/danielmotaleite/following{/other_user}","gists_url":"https://api.github.com/users/danielmotaleite/gists{/gist_id}","starred_url":"https://api.github.com/users/danielmotaleite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danielmotaleite/subscriptions","organizations_url":"https://api.github.com/users/danielmotaleite/orgs","repos_url":"https://api.github.com/users/danielmotaleite/repos","events_url":"https://api.github.com/users/danielmotaleite/events{/privacy}","received_events_url":"https://api.github.com/users/danielmotaleite/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/33/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/33/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/35","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/35/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/35/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/35/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/35","id":305604786,"node_id":"MDU6SXNzdWUzMDU2MDQ3ODY=","number":35,"title":"Backend seems sick on first access","user":{"login":"ghost","id":10137,"node_id":"MDQ6VXNlcjEwMTM3","avatar_url":"https://avatars.githubusercontent.com/u/10137?v=4","gravatar_id":"","url":"https://api.github.com/users/ghost","html_url":"https://github.com/ghost","followers_url":"https://api.github.com/users/ghost/followers","following_url":"https://api.github.com/users/ghost/following{/other_user}","gists_url":"https://api.github.com/users/ghost/gists{/gist_id}","starred_url":"https://api.github.com/users/ghost/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ghost/subscriptions","organizations_url":"https://api.github.com/users/ghost/orgs","repos_url":"https://api.github.com/users/ghost/repos","events_url":"https://api.github.com/users/ghost/events{/privacy}","received_events_url":"https://api.github.com/users/ghost/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":17,"created_at":"2018-03-15T15:36:34Z","updated_at":"2018-04-17T09:58:02Z","closed_at":"2018-03-16T16:10:07Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi.\r\n\r\nI have Varnish 5.2.1 with vmod dynamic installed from Yum Repositories on CentOS7 Server, and i'm facing this situation: after a vcl reload the first call to a site server by vmod_dynamic director give me the mainenance page, like the backend was sick, bat the backend is up and running, so simply hitting F5 gave me access to the site.\r\n\r\nMaybe a problem with the first dns lookup? Or maybe i've made some misconfiguration?\r\n\r\nWhat other info do you need to help me with this problem?\r\n\r\nBest Regard","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/35/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/35/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/36","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/36/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/36/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/36/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/36","id":307665895,"node_id":"MDU6SXNzdWUzMDc2NjU4OTU=","number":36,"title":"Difficulty building against varnish 5.2.1 for xkey vmod","user":{"login":"hardik8585","id":32997161,"node_id":"MDQ6VXNlcjMyOTk3MTYx","avatar_url":"https://avatars.githubusercontent.com/u/32997161?v=4","gravatar_id":"","url":"https://api.github.com/users/hardik8585","html_url":"https://github.com/hardik8585","followers_url":"https://api.github.com/users/hardik8585/followers","following_url":"https://api.github.com/users/hardik8585/following{/other_user}","gists_url":"https://api.github.com/users/hardik8585/gists{/gist_id}","starred_url":"https://api.github.com/users/hardik8585/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hardik8585/subscriptions","organizations_url":"https://api.github.com/users/hardik8585/orgs","repos_url":"https://api.github.com/users/hardik8585/repos","events_url":"https://api.github.com/users/hardik8585/events{/privacy}","received_events_url":"https://api.github.com/users/hardik8585/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2018-03-22T14:25:40Z","updated_at":"2018-03-22T14:35:00Z","closed_at":"2018-03-22T14:35:00Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"./bootstrap\r\n+ mkdir -p m4\r\n+ aclocal -I m4 -I /usr/share/aclocal\r\n+ libtoolize --copy --force\r\nlibtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `build-aux'.\r\nlibtoolize: copying file `build-aux/ltmain.sh'\r\nlibtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.\r\nlibtoolize: copying file `m4/libtool.m4'\r\nlibtoolize: copying file `m4/ltoptions.m4'\r\nlibtoolize: copying file `m4/ltsugar.m4'\r\nlibtoolize: copying file `m4/ltversion.m4'\r\nlibtoolize: copying file `m4/lt~obsolete.m4'\r\n+ autoheader\r\n+ automake --add-missing --copy --foreign\r\nsrc/Makefile.am:24: error: 'vmod_LTLIBRARIES' is used but 'vmoddir' is undefined\r\nsrc/Makefile.am:51: warning: variable 'libvmod_header_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:51: library has 'libvmod_header_la' as canonical name (possible typo)\r\nsrc/Makefile.am:65: warning: variable 'nodist_libvmod_xkey_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:65: library has 'libvmod_xkey_la' as canonical name (possible typo)\r\nsrc/Makefile.am:61: warning: variable 'nodist_libvmod_vsthrottle_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:61: library has 'libvmod_vsthrottle_la' as canonical name (possible typo)\r\nsrc/Makefile.am:56: warning: variable 'libvmod_xkey_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:56: library has 'libvmod_xkey_la' as canonical name (possible typo)\r\nsrc/Makefile.am:64: warning: variable 'nodist_libvmod_var_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:64: library has 'libvmod_var_la' as canonical name (possible typo)\r\nsrc/Makefile.am:53: warning: variable 'libvmod_saintmode_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:53: library has 'libvmod_saintmode_la' as canonical name (possible typo)\r\nsrc/Makefile.am:58: warning: variable 'nodist_libvmod_bodyaccess_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:58: library has 'libvmod_bodyaccess_la' as canonical name (possible typo)\r\nsrc/Makefile.am:63: warning: variable 'nodist_libvmod_tcp_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:63: library has 'libvmod_tcp_la' as canonical name (possible typo)\r\nsrc/Makefile.am:59: warning: variable 'nodist_libvmod_cookie_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:59: library has 'libvmod_cookie_la' as canonical name (possible typo)\r\nsrc/Makefile.am:62: warning: variable 'nodist_libvmod_saintmode_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:62: library has 'libvmod_saintmode_la' as canonical name (possible typo)\r\nsrc/Makefile.am:50: warning: variable 'libvmod_cookie_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:50: library has 'libvmod_cookie_la' as canonical name (possible typo)\r\nsrc/Makefile.am:55: warning: variable 'libvmod_var_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:55: library has 'libvmod_var_la' as canonical name (possible typo)\r\nsrc/Makefile.am:83: warning: variable 'nodist_libvmod_softpurge_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:83: library has 'libvmod_softpurge_la' as canonical name (possible typo)\r\nsrc/Makefile.am:60: warning: variable 'nodist_libvmod_header_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:60: library has 'libvmod_header_la' as canonical name (possible typo)\r\nsrc/Makefile.am:52: warning: variable 'libvmod_vsthrottle_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:52: library has 'libvmod_vsthrottle_la' as canonical name (possible typo)\r\nsrc/Makefile.am:49: warning: variable 'libvmod_bodyaccess_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:49: library has 'libvmod_bodyaccess_la' as canonical name (possible typo)\r\nsrc/Makefile.am:54: warning: variable 'libvmod_tcp_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:54: library has 'libvmod_tcp_la' as canonical name (possible typo)\r\nsrc/Makefile.am:82: warning: variable 'libvmod_softpurge_la_SOURCES' is defined but no program or\r\nsrc/Makefile.am:82: library has 'libvmod_softpurge_la' as canonical name (possible typo)\r\n\r\n\r\nBecause of this error, its now generating configure file.","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/36/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/36/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/37","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/37/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/37/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/37/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/37","id":308541202,"node_id":"MDU6SXNzdWUzMDg1NDEyMDI=","number":37,"title":"ABI mismatch against Varnish 6.0 - RPM package needs a bump?","user":{"login":"slawekm","id":4246560,"node_id":"MDQ6VXNlcjQyNDY1NjA=","avatar_url":"https://avatars.githubusercontent.com/u/4246560?v=4","gravatar_id":"","url":"https://api.github.com/users/slawekm","html_url":"https://github.com/slawekm","followers_url":"https://api.github.com/users/slawekm/followers","following_url":"https://api.github.com/users/slawekm/following{/other_user}","gists_url":"https://api.github.com/users/slawekm/gists{/gist_id}","starred_url":"https://api.github.com/users/slawekm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slawekm/subscriptions","organizations_url":"https://api.github.com/users/slawekm/orgs","repos_url":"https://api.github.com/users/slawekm/repos","events_url":"https://api.github.com/users/slawekm/events{/privacy}","received_events_url":"https://api.github.com/users/slawekm/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":7,"created_at":"2018-03-26T11:55:15Z","updated_at":"2018-04-02T09:44:10Z","closed_at":"2018-04-02T09:44:10Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi, \r\n\r\nI'm getting ABI mismatch error when running against Varnish 6.0:\r\n\r\n```\r\nbash-4.2# /usr/sbin/varnish_reload_vcl\r\nLoading vcl from /etc/varnish/default.vcl\r\nCurrent running config name is boot\r\nUsing new config name reload_2018-03-26T114607\r\nMessage from VCC-compiler:\r\nIncompatible VMOD dynamic\r\n\tFile name: /usr/lib64/varnish/vmods/libvmod_dynamic.so\r\n\tABI mismatch, expected , got \r\n('/etc/varnish/default.vcl' Line 60 Pos 8)\r\nimport dynamic;\r\n-------#######-\r\n\r\nRunning VCC-compiler failed, exited with 2\r\nVCL compilation failed\r\nCommand failed with error code 106\r\n```\r\n\r\n```\r\nbash-4.2# rpm -qi vmod-dynamic\r\nName : vmod-dynamic\r\nVersion : 0.3\r\nRelease : 12.el7\r\nSource RPM : vmod-dynamic-0.3-12.el7.src.rpm\r\nBuild Date : Fri Nov 24 17:17:58 2017\r\nBuild Host : 5f3d6e6b911d\r\n```\r\n\r\nWorks fine when I've compiled vmod from source.\r\n\r\nThanks.","closed_by":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/37/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/37/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/38","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/38/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/38/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/38/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/38","id":358483593,"node_id":"MDU6SXNzdWUzNTg0ODM1OTM=","number":38,"title":"502 when cache beresp.ttl is exhausted ","user":{"login":"lloiacono","id":1889160,"node_id":"MDQ6VXNlcjE4ODkxNjA=","avatar_url":"https://avatars.githubusercontent.com/u/1889160?v=4","gravatar_id":"","url":"https://api.github.com/users/lloiacono","html_url":"https://github.com/lloiacono","followers_url":"https://api.github.com/users/lloiacono/followers","following_url":"https://api.github.com/users/lloiacono/following{/other_user}","gists_url":"https://api.github.com/users/lloiacono/gists{/gist_id}","starred_url":"https://api.github.com/users/lloiacono/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lloiacono/subscriptions","organizations_url":"https://api.github.com/users/lloiacono/orgs","repos_url":"https://api.github.com/users/lloiacono/repos","events_url":"https://api.github.com/users/lloiacono/events{/privacy}","received_events_url":"https://api.github.com/users/lloiacono/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":6,"created_at":"2018-09-10T06:23:57Z","updated_at":"2018-10-11T06:48:08Z","closed_at":"2018-09-12T15:11:44Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I'm using dynamic directors with rancher and am getting a 502 error once the TTL of my cache object expires, if I try again then it works properly. I can request any URL and I would get a 200, then the page is cache for 5s (I set the TTL to 5s for testing), then after 5s I request the same URL again and I get the 502, then I request the same URL once again and it works. If I repeat the whole process I get the same results over and over.\r\n\r\nError:\r\n> HTTP/1.0 502 Bad Gateway\r\nCache-Control: no-cache\r\nContent-Type: text/html\r\nX-Via: varnish-test\r\n\r\n

502 Bad Gateway

\r\nThe server returned an invalid or incomplete response.\r\n\r\n\r\nConfiguration: \r\n\r\nI have setup varnish with dynamic directors like this:\r\n\r\n```\r\nsub vcl_init {\r\n new www_dir = dynamic.director(\r\n port = 80,\r\n ttl = 5m\r\n );\r\n www_dir.debug(true);\r\n}\r\n```\r\n\r\nAnd added the director as backend in `vcl_recv` like this:\r\n\r\n`set req.backend_hint = www_dir.backend(app);`\r\n\r\n`app` is the name of my backend service in rancher. If I dig to `app` I get something like:\r\n\r\n```\r\napp. 1 IN A 10.42.166.171\r\napp. 1 IN A 10.42.215.78\r\n```\r\n\r\nAlso in `vcl_backend_response` I've this:\r\n\r\n`set beresp.ttl = 5s;`\r\n\r\nI set the cache TTL to 5s to debug this easily.\r\n\r\nOn the varnish instance if I run this `varnishlog -g raw -q '* ~ vmod-dynamic'`, after the 502 error I see this in the logs:\r\n\r\n`Log abandoned (vsl)`\r\n`Log reacquired`\r\n\r\n\r\n\r\n","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/38/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/38/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/39","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/39/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/39/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/39/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/39","id":358557823,"node_id":"MDU6SXNzdWUzNTg1NTc4MjM=","number":39,"title":"Not able to build master","user":{"login":"lloiacono","id":1889160,"node_id":"MDQ6VXNlcjE4ODkxNjA=","avatar_url":"https://avatars.githubusercontent.com/u/1889160?v=4","gravatar_id":"","url":"https://api.github.com/users/lloiacono","html_url":"https://github.com/lloiacono","followers_url":"https://api.github.com/users/lloiacono/followers","following_url":"https://api.github.com/users/lloiacono/following{/other_user}","gists_url":"https://api.github.com/users/lloiacono/gists{/gist_id}","starred_url":"https://api.github.com/users/lloiacono/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lloiacono/subscriptions","organizations_url":"https://api.github.com/users/lloiacono/orgs","repos_url":"https://api.github.com/users/lloiacono/repos","events_url":"https://api.github.com/users/lloiacono/events{/privacy}","received_events_url":"https://api.github.com/users/lloiacono/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2018-09-10T10:16:16Z","updated_at":"2018-09-10T10:24:48Z","closed_at":"2018-09-10T10:24:48Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I was previously using the v 0.4 tag and it was working fine. Now switched to master and I get the following error:\r\n\r\n```\r\nMaking install in src\r\nmake[1]: Entering directory '/varnish-modules/libvmod-dynamic-master/src'\r\nCC vmod_dynamic.lo\r\nvmod_dynamic.c:105:33: error: array type has incomplete element type 'struct vdi_methods'\r\n static const struct vdi_methods vmod_dynamic_methods[1] = {{\r\n ^~~~~~~~~~~~~~~~~~~~\r\nvmod_dynamic.c:106:2: error: field name not in record or union initializer\r\n .magic = VDI_METHODS_MAGIC,\r\n ^\r\nvmod_dynamic.c:106:2: note: (near initialization for 'vmod_dynamic_methods')\r\nvmod_dynamic.c:106:11: error: 'VDI_METHODS_MAGIC' undeclared here (not in a function)\r\n .magic = VDI_METHODS_MAGIC,\r\n ^~~~~~~~~~~~~~~~~\r\nvmod_dynamic.c:107:2: error: field name not in record or union initializer\r\n .type = \"dynamic\",\r\n ^\r\nvmod_dynamic.c:107:2: note: (near initialization for 'vmod_dynamic_methods')\r\nvmod_dynamic.c:108:2: error: field name not in record or union initializer\r\n .healthy = dynamic_healthy,\r\n ^\r\nvmod_dynamic.c:108:2: note: (near initialization for 'vmod_dynamic_methods')\r\nvmod_dynamic.c:109:2: error: field name not in record or union initializer\r\n .resolve = dynamic_resolve\r\n ^\r\nvmod_dynamic.c:109:2: note: (near initialization for 'vmod_dynamic_methods')\r\nvmod_dynamic.c: In function 'dynamic_resolve':\r\nvmod_dynamic.c:151:5: error: too many arguments to function 'VRT_Healthy'\r\n !VRT_Healthy(ctx, next->be->dir, NULL));\r\n ^~~~~~~~~~~\r\nIn file included from /usr/include/varnish/cache/cache.h:45:0,\r\n from vmod_dynamic.c:45:\r\n/usr/include/varnish/vrt.h:419:5: note: declared here\r\n int VRT_Healthy(VRT_CTX, VCL_BACKEND);\r\n ^~~~~~~~~~~\r\nvmod_dynamic.c:156:7: error: too many arguments to function 'VRT_Healthy'\r\n !VRT_Healthy(ctx, next->be->dir, NULL))\r\n ^~~~~~~~~~~\r\nIn file included from /usr/include/varnish/cache/cache.h:45:0,\r\n from vmod_dynamic.c:45:\r\n/usr/include/varnish/vrt.h:419:5: note: declared here\r\n int VRT_Healthy(VRT_CTX, VCL_BACKEND);\r\n ^~~~~~~~~~~\r\nvmod_dynamic.c: In function 'dynamic_healthy':\r\nvmod_dynamic.c:184:12: error: too many arguments to function 'VRT_Healthy'\r\n retval = VRT_Healthy(ctx, r->be->dir, &c);\r\n ^~~~~~~~~~~\r\nIn file included from /usr/include/varnish/cache/cache.h:45:0,\r\n from vmod_dynamic.c:45:\r\n/usr/include/varnish/vrt.h:419:5: note: declared here\r\n int VRT_Healthy(VRT_CTX, VCL_BACKEND);\r\n ^~~~~~~~~~~\r\nvmod_dynamic.c: In function 'dynamic_del':\r\nvmod_dynamic.c:248:27: error: passing argument 2 of 'VRT_delete_backend' from incompatible pointer type [-Werror=incompatible-pointer-types]\r\n VRT_delete_backend(ctx, &b->dir);\r\n ^\r\nIn file included from /usr/include/varnish/cache/cache.h:45:0,\r\n from vmod_dynamic.c:45:\r\n/usr/include/varnish/vrt.h:411:6: note: expected 'struct director **' but argument is of type 'const struct director **'\r\n void VRT_delete_backend(VRT_CTX, struct director **);\r\n ^~~~~~~~~~~~~~~~~~\r\nvmod_dynamic.c: In function 'dynamic_get':\r\nvmod_dynamic.c:708:13: error: implicit declaration of function 'VRT_AddDirector' [-Werror=implicit-function-declaration]\r\n dom->dir = VRT_AddDirector(ctx, vmod_dynamic_methods, dom,\r\n ^~~~~~~~~~~~~~~\r\nAt top level:\r\nvmod_dynamic.c:105:33: error: 'vmod_dynamic_methods' defined but not used [-Werror=unused-variable]\r\n static const struct vdi_methods vmod_dynamic_methods[1] = {{\r\n ^~~~~~~~~~~~~~~~~~~~\r\n```\r\n\r\nMy Dockerfile is \r\n\r\n```\r\nFROM alpine:3.8\r\n\r\nRUN apk update \\\r\n && apk add --no-cache varnish=6.0.0-r1 \\\r\n && apk add git curl \\\r\n && git clone https://github.com/varnish/varnish-modules.git \\\r\n && apk add automake && apk add varnish-dev \\\r\n && apk add autoconf && apk add libtool \\\r\n && apk add py-docutils && apk add make \\\r\n && cd varnish-modules/ \\\r\n && ./bootstrap && ./configure && make && make install\r\n\r\n#\r\n# install libvmod-dynamic\r\n#\r\nENV LIBVMOD_DYNAMIC_VERSION=master\r\n\r\nRUN curl -sfL https://github.com/nigoroll/libvmod-dynamic/archive/${LIBVMOD_DYNAMIC_VERSION}.tar.gz \\\r\n -o libvmod-dynamic-${LIBVMOD_DYNAMIC_VERSION}.tar.gz && \\\r\n tar -xzf libvmod-dynamic-${LIBVMOD_DYNAMIC_VERSION}.tar.gz && \\\r\n cd libvmod-dynamic-${LIBVMOD_DYNAMIC_VERSION} && \\\r\n ./autogen.sh && \\\r\n ./configure && \\\r\n make install && \\\r\n cd .. && rm -rf libvmod-dynamic-${LIBVMOD_DYNAMIC_VERSION}.tar.gz \r\n\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/39/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/39/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/40","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/40/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/40/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/40/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/40","id":367386874,"node_id":"MDU6SXNzdWUzNjczODY4NzQ=","number":40,"title":"Unable to compile on Debian Stretch","user":{"login":"AdrienBigot","id":12624309,"node_id":"MDQ6VXNlcjEyNjI0MzA5","avatar_url":"https://avatars.githubusercontent.com/u/12624309?v=4","gravatar_id":"","url":"https://api.github.com/users/AdrienBigot","html_url":"https://github.com/AdrienBigot","followers_url":"https://api.github.com/users/AdrienBigot/followers","following_url":"https://api.github.com/users/AdrienBigot/following{/other_user}","gists_url":"https://api.github.com/users/AdrienBigot/gists{/gist_id}","starred_url":"https://api.github.com/users/AdrienBigot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AdrienBigot/subscriptions","organizations_url":"https://api.github.com/users/AdrienBigot/orgs","repos_url":"https://api.github.com/users/AdrienBigot/repos","events_url":"https://api.github.com/users/AdrienBigot/events{/privacy}","received_events_url":"https://api.github.com/users/AdrienBigot/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804423,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjM=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/duplicate","name":"duplicate","color":"cccccc","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2018-10-05T22:23:36Z","updated_at":"2018-10-10T05:21:28Z","closed_at":"2018-10-10T05:21:21Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hello,\r\n\r\nWhen trying to build in Debian Strech I encounter these errors :\r\n\r\nmake all-recursive\r\nmake[1]: Entering directory '/tmp/libvmod-dynamic'\r\nMaking all in src\r\nmake[2]: Entering directory '/tmp/libvmod-dynamic/src'\r\n CC vmod_dynamic.lo\r\nvmod_dynamic.c:105:33: error: array type has incomplete element type ‘struct vdi_methods’\r\n static const struct vdi_methods vmod_dynamic_methods[1] = {{\r\n ^~~~~~~~~~~~~~~~~~~~\r\nvmod_dynamic.c:106:2: error: field name not in record or union initializer\r\n .magic = VDI_METHODS_MAGIC,\r\n ^\r\nvmod_dynamic.c:106:2: note: (near initialization for ‘vmod_dynamic_methods’)\r\nvmod_dynamic.c:106:11: error: ‘VDI_METHODS_MAGIC’ undeclared here (not in a function)\r\n .magic = VDI_METHODS_MAGIC,\r\n ^~~~~~~~~~~~~~~~~\r\nvmod_dynamic.c:107:2: error: field name not in record or union initializer\r\n .type = \"dynamic\",\r\n ^\r\nvmod_dynamic.c:107:2: note: (near initialization for ‘vmod_dynamic_methods’)\r\nvmod_dynamic.c:108:2: error: field name not in record or union initializer\r\n .healthy = dynamic_healthy,\r\n ^\r\nvmod_dynamic.c:108:2: note: (near initialization for ‘vmod_dynamic_methods’)\r\nvmod_dynamic.c:109:2: error: field name not in record or union initializer\r\n .resolve = dynamic_resolve\r\n ^\r\nvmod_dynamic.c:109:2: note: (near initialization for ‘vmod_dynamic_methods’)\r\nvmod_dynamic.c: In function ‘dynamic_resolve’:\r\nvmod_dynamic.c:151:5: error: too many arguments to function ‘VRT_Healthy’\r\n !VRT_Healthy(ctx, next->be->dir, NULL));\r\n ^~~~~~~~~~~\r\nIn file included from /usr/include/varnish/cache/cache.h:45:0,\r\n from vmod_dynamic.c:45:\r\n/usr/include/varnish/vrt.h:420:5: note: declared here\r\n int VRT_Healthy(VRT_CTX, VCL_BACKEND);\r\n ^~~~~~~~~~~\r\nvmod_dynamic.c:156:7: error: too many arguments to function ‘VRT_Healthy’\r\n !VRT_Healthy(ctx, next->be->dir, NULL))\r\n ^~~~~~~~~~~\r\nIn file included from /usr/include/varnish/cache/cache.h:45:0,\r\n from vmod_dynamic.c:45:\r\n/usr/include/varnish/vrt.h:420:5: note: declared here\r\n int VRT_Healthy(VRT_CTX, VCL_BACKEND);\r\n ^~~~~~~~~~~\r\nvmod_dynamic.c: In function ‘dynamic_healthy’:\r\nvmod_dynamic.c:184:12: error: too many arguments to function ‘VRT_Healthy’\r\n retval = VRT_Healthy(ctx, r->be->dir, &c);\r\n ^~~~~~~~~~~\r\nIn file included from /usr/include/varnish/cache/cache.h:45:0,\r\n from vmod_dynamic.c:45:\r\n/usr/include/varnish/vrt.h:420:5: note: declared here\r\n int VRT_Healthy(VRT_CTX, VCL_BACKEND);\r\n ^~~~~~~~~~~\r\nvmod_dynamic.c: In function ‘dynamic_del’:\r\nvmod_dynamic.c:248:27: error: passing argument 2 of ‘VRT_delete_backend’ from incompatible pointer type [-Werror=incompatible-pointer-types]\r\n VRT_delete_backend(ctx, &b->dir);\r\n ^\r\nIn file included from /usr/include/varnish/cache/cache.h:45:0,\r\n from vmod_dynamic.c:45:\r\n/usr/include/varnish/vrt.h:412:6: note: expected ‘struct director **’ but argument is of type ‘const struct director **’\r\n void VRT_delete_backend(VRT_CTX, struct director **);\r\n ^~~~~~~~~~~~~~~~~~\r\nvmod_dynamic.c: In function ‘dynamic_free’:\r\nvmod_dynamic.c:546:2: error: implicit declaration of function ‘VRT_DelDirector’ [-Werror=implicit-function-declaration]\r\n VRT_DelDirector(&dom->dir);\r\n ^~~~~~~~~~~~~~~\r\nvmod_dynamic.c: In function ‘dynamic_get’:\r\nvmod_dynamic.c:710:13: error: implicit declaration of function ‘VRT_AddDirector’ [-Werror=implicit-function-declaration]\r\n dom->dir = VRT_AddDirector(ctx, vmod_dynamic_methods, dom,\r\n ^~~~~~~~~~~~~~~\r\nAt top level:\r\nvmod_dynamic.c:105:33: error: ‘vmod_dynamic_methods’ defined but not used [-Werror=unused-variable]\r\n static const struct vdi_methods vmod_dynamic_methods[1] = {{\r\n ^~~~~~~~~~~~~~~~~~~~\r\ncc1: all warnings being treated as errors\r\nMakefile:659: recipe for target 'vmod_dynamic.lo' failed\r\nmake[2]: *** [vmod_dynamic.lo] Error 1\r\nmake[2]: Leaving directory '/tmp/libvmod-dynamic/src'\r\nMakefile:492: recipe for target 'all-recursive' failed\r\nmake[1]: *** [all-recursive] Error 1\r\nmake[1]: Leaving directory '/tmp/libvmod-dynamic'\r\nMakefile:403: recipe for target 'all' failed\r\nmake: *** [all] Error 2\r\n\r\nThanks in advance.\r\n\r\nAdrien","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/40/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/40/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/41","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/41/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/41/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/41/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/41","id":368464148,"node_id":"MDU6SXNzdWUzNjg0NjQxNDg=","number":41,"title":"Can't install on Centos7 Varnish 6.0.1","user":{"login":"chuyenim","id":12079343,"node_id":"MDQ6VXNlcjEyMDc5MzQz","avatar_url":"https://avatars.githubusercontent.com/u/12079343?v=4","gravatar_id":"","url":"https://api.github.com/users/chuyenim","html_url":"https://github.com/chuyenim","followers_url":"https://api.github.com/users/chuyenim/followers","following_url":"https://api.github.com/users/chuyenim/following{/other_user}","gists_url":"https://api.github.com/users/chuyenim/gists{/gist_id}","starred_url":"https://api.github.com/users/chuyenim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chuyenim/subscriptions","organizations_url":"https://api.github.com/users/chuyenim/orgs","repos_url":"https://api.github.com/users/chuyenim/repos","events_url":"https://api.github.com/users/chuyenim/events{/privacy}","received_events_url":"https://api.github.com/users/chuyenim/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804423,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjM=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/duplicate","name":"duplicate","color":"cccccc","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2018-10-10T02:00:20Z","updated_at":"2018-10-10T05:20:35Z","closed_at":"2018-10-10T05:19:20Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hello,\r\nI want to use this vmod on my system but when I install I got tons of errors messages:\r\nMy steps:\r\n-- Download libvmod-dynamic into directory ``/var/lib/varnish/vmods/``\r\n-- Unzip file\r\n-- ``./autogent.sh`` --> OK\r\n-- ``./configure`` --> OK\r\n-- ``make`` --> Errrors:\r\n\r\n [root@vultr libvmod-dynamic-master]# make\r\n make all-recursive\r\n make[1]: Entering directory `/var/lib/varnish/vmods/libvmod-dynamic-master'\r\n Making all in src\r\n make[2]: Entering directory `/var/lib/varnish/vmods/libvmod-dynamic-master/src'\r\n CC vmod_dynamic.lo\r\n vmod_dynamic.c:105:33: error: array type has incomplete element type\r\n static const struct vdi_methods vmod_dynamic_methods[1] = {{\r\n ^\r\n vmod_dynamic.c:106:2: error: field name not in record or union initializer\r\n .magic = VDI_METHODS_MAGIC,\r\n ^\r\n vmod_dynamic.c:106:2: error: (near initialization for ‘vmod_dynamic_methods’)\r\n vmod_dynamic.c:106:11: error: ‘VDI_METHODS_MAGIC’ undeclared here (not in a function)\r\n .magic = VDI_METHODS_MAGIC,\r\n ^\r\n vmod_dynamic.c:107:2: error: field name not in record or union initializer\r\n .type = \"dynamic\",\r\n ^\r\n vmod_dynamic.c:107:2: error: (near initialization for ‘vmod_dynamic_methods’)\r\n vmod_dynamic.c:108:2: error: field name not in record or union initializer\r\n .healthy = dynamic_healthy,\r\n ^\r\n vmod_dynamic.c:108:2: error: (near initialization for ‘vmod_dynamic_methods’)\r\n vmod_dynamic.c:109:2: error: field name not in record or union initializer\r\n .resolve = dynamic_resolve\r\n ^\r\n vmod_dynamic.c:109:2: error: (near initialization for ‘vmod_dynamic_methods’)\r\n vmod_dynamic.c: In function ‘dynamic_resolve’:\r\n vmod_dynamic.c:151:4: error: too many arguments to function ‘VRT_Healthy’\r\n !VRT_Healthy(ctx, next->be->dir, NULL));\r\n ^\r\n In file included from /usr/include/varnish/cache/cache.h:45:0,\r\n from vmod_dynamic.c:45:\r\n /usr/include/varnish/vrt.h:420:5: note: declared here\r\n int VRT_Healthy(VRT_CTX, VCL_BACKEND);\r\n ^\r\n vmod_dynamic.c:156:6: error: too many arguments to function ‘VRT_Healthy’\r\n !VRT_Healthy(ctx, next->be->dir, NULL))\r\n ^\r\n In file included from /usr/include/varnish/cache/cache.h:45:0,\r\n from vmod_dynamic.c:45:\r\n /usr/include/varnish/vrt.h:420:5: note: declared here\r\n int VRT_Healthy(VRT_CTX, VCL_BACKEND);\r\n ^\r\n vmod_dynamic.c: In function ‘dynamic_healthy’:\r\n vmod_dynamic.c:184:3: error: too many arguments to function ‘VRT_Healthy’\r\n retval = VRT_Healthy(ctx, r->be->dir, &c);\r\n ^\r\n In file included from /usr/include/varnish/cache/cache.h:45:0,\r\n from vmod_dynamic.c:45:\r\n /usr/include/varnish/vrt.h:420:5: note: declared here\r\n int VRT_Healthy(VRT_CTX, VCL_BACKEND);\r\n ^\r\n vmod_dynamic.c: In function ‘dynamic_del’:\r\n vmod_dynamic.c:248:3: error: passing argument 2 of ‘VRT_delete_backend’ from incompatible pointer type [-Werror]\r\n VRT_delete_backend(ctx, &b->dir);\r\n ^\r\n In file included from /usr/include/varnish/cache/cache.h:45:0,\r\n from vmod_dynamic.c:45:\r\n /usr/include/varnish/vrt.h:412:6: note: expected ‘struct director **’ but argument is of type ‘const struct director **’\r\n void VRT_delete_backend(VRT_CTX, struct director **);\r\n ^\r\n vmod_dynamic.c: In function ‘dynamic_free’:\r\n vmod_dynamic.c:546:2: error: implicit declaration of function ‘VRT_DelDirector’ [-Werror=implicit-function-declaration]\r\n VRT_DelDirector(&dom->dir);\r\n ^\r\n vmod_dynamic.c: In function ‘dynamic_get’:\r\n vmod_dynamic.c:710:2: error: implicit declaration of function ‘VRT_AddDirector’ [-Werror=implicit-function-declaration]\r\n dom->dir = VRT_AddDirector(ctx, vmod_dynamic_methods, dom,\r\n ^\r\n vmod_dynamic.c: At top level:\r\n vmod_dynamic.c:105:33: error: ‘vmod_dynamic_methods’ defined but not used [-Werror=unused-variable]\r\n static const struct vdi_methods vmod_dynamic_methods[1] = {{\r\n ^\r\n cc1: all warnings being treated as errors\r\n make[2]: *** [vmod_dynamic.lo] Error 1\r\n make[2]: Leaving directory `/var/lib/varnish/vmods/libvmod-dynamic-master/src'\r\n make[1]: *** [all-recursive] Error 1\r\n make[1]: Leaving directory `/var/lib/varnish/vmods/libvmod-dynamic-master'\r\n make: *** [all] Error 2\r\n\r\nSoftware: Varnish 6.0.1\r\nEnvironment: Centos 7\r\n\r\nPlease give me the helps or some suggestions. Thank you","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/41/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/41/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/42","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/42/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/42/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/42/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/42","id":388773285,"node_id":"MDU6SXNzdWUzODg3NzMyODU=","number":42,"title":"Feature request: SRV support for port finding","user":{"login":"danielmotaleite","id":11890049,"node_id":"MDQ6VXNlcjExODkwMDQ5","avatar_url":"https://avatars.githubusercontent.com/u/11890049?v=4","gravatar_id":"","url":"https://api.github.com/users/danielmotaleite","html_url":"https://github.com/danielmotaleite","followers_url":"https://api.github.com/users/danielmotaleite/followers","following_url":"https://api.github.com/users/danielmotaleite/following{/other_user}","gists_url":"https://api.github.com/users/danielmotaleite/gists{/gist_id}","starred_url":"https://api.github.com/users/danielmotaleite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danielmotaleite/subscriptions","organizations_url":"https://api.github.com/users/danielmotaleite/orgs","repos_url":"https://api.github.com/users/danielmotaleite/repos","events_url":"https://api.github.com/users/danielmotaleite/events{/privacy}","received_events_url":"https://api.github.com/users/danielmotaleite/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":5,"created_at":"2018-12-07T18:54:05Z","updated_at":"2019-07-13T16:39:47Z","closed_at":"2019-07-13T16:39:47Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Right now we can find the backend via DNS, but the port is required to be the same for all the backends.\r\n\r\nWith docker, we start to get more and more backends with dynamic ports and to keep using static ports we need some \"load-balancers\". It would be great if we could remove those and allow varnish to find the backends AND ports using DNS SRV entries. \r\nSRV DNS entries give us not only the host/IP for the service, but also the correct port for it.\r\nConsul service discovery do this automatically and gives great flexibility to deploy and manage services\r\n\r\nExample:\r\n$ host -t SRV consul.service.consul.internal.\r\nconsul.service.consul.internal has SRV record 1 2 8300 consul-a01.node.interxion-fra6.consul.internal.\r\nconsul.service.consul.internal has SRV record 1 3 8301 consul-b01.node.interxion-fra6.consul.internal.\r\nconsul.service.consul.internal has SRV record 2 1 8302 consul-a02.node.interxion-fra6.consul.internal.\r\n\r\n\r\nA varnish backend \"consul\" would setup 3 backends for each DNS:PORT\r\n\r\nBonus:\r\nSRV could also later use the priority (1, 1, 2 above) and then weight value (2,3 for priority 1 group, 1 for priority 2 group) to balance the load between nodes \r\n\r\nyes, i know that SRV is not as simple as simple A/CNAME DNS, but they are way more flexible and in a long run they can help a lot","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/42/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/42/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/43","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/43/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/43/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/43/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/43","id":388822767,"node_id":"MDU6SXNzdWUzODg4MjI3Njc=","number":43,"title":"Usage clarification","user":{"login":"absolutejam","id":6817942,"node_id":"MDQ6VXNlcjY4MTc5NDI=","avatar_url":"https://avatars.githubusercontent.com/u/6817942?v=4","gravatar_id":"","url":"https://api.github.com/users/absolutejam","html_url":"https://github.com/absolutejam","followers_url":"https://api.github.com/users/absolutejam/followers","following_url":"https://api.github.com/users/absolutejam/following{/other_user}","gists_url":"https://api.github.com/users/absolutejam/gists{/gist_id}","starred_url":"https://api.github.com/users/absolutejam/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/absolutejam/subscriptions","organizations_url":"https://api.github.com/users/absolutejam/orgs","repos_url":"https://api.github.com/users/absolutejam/repos","events_url":"https://api.github.com/users/absolutejam/events{/privacy}","received_events_url":"https://api.github.com/users/absolutejam/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804427,"node_id":"MDU6TGFiZWw0NDM4MDQ0Mjc=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/question","name":"question","color":"cc317c","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":7,"created_at":"2018-12-07T21:36:53Z","updated_at":"2018-12-10T13:54:13Z","closed_at":"2018-12-10T13:07:49Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hey!\r\n\r\nFirst of all, I want to apologise for posting this as I think it may be a bit outside the realm of what you expect in an issue, but I was hoping you could help clarify usage of the this director. Secondly, thanks for providing this, as all of my searches for similar functionality have been dead ends (Varnish 3, varnish-plus). I'm pretty new to Varnish as a whole, and looking to use it in a dynamic Kubernetes environment.\r\n\r\nBasically, I'm just trying to understand at what I need to facilitate the usage of this director and the limitations. As an overview, my current setup that I'm toying with is a layer of Varnish servers using the shard director to load-balance caching, and a backend 'content' layer (Nginx) for the actual content to be cached.\r\n\r\nFrom my understanding of the man page..\r\n - I set up the director in `sub vcl_init`\r\n - Then in `sub vcl_recv` I basically add any kind of routing logic (eg. based on `req.http.host`) *nothing out of the ordinary so far*\r\n - And then ultimately define `set req.backend_hint = content.backend(\"mybackend\");` which declares my (dns)resolved backend.\r\n\r\nDoes this mean that I cannot now leverage a load-balanced director (as the dynamic director must resolve a hostname), and in turn must use another load-balancing service for my content nodes (ideally. with a hostname that can be resolved by this director). This obviously contrasts from the current setup of my director declaring all 4 or so backends and load-balancing, vs. the dynamic director only being able to target a single, unless there's something like DNS RR in place, which would mean another service for my setup.\r\n\r\nThanks for your time!","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/43/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/43/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/44","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/44/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/44/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/44/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/44","id":395324483,"node_id":"MDU6SXNzdWUzOTUzMjQ0ODM=","number":44,"title":"Tests failing on Varnish 6.0.2","user":{"login":"philipseidel","id":2425213,"node_id":"MDQ6VXNlcjI0MjUyMTM=","avatar_url":"https://avatars.githubusercontent.com/u/2425213?v=4","gravatar_id":"","url":"https://api.github.com/users/philipseidel","html_url":"https://github.com/philipseidel","followers_url":"https://api.github.com/users/philipseidel/followers","following_url":"https://api.github.com/users/philipseidel/following{/other_user}","gists_url":"https://api.github.com/users/philipseidel/gists{/gist_id}","starred_url":"https://api.github.com/users/philipseidel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/philipseidel/subscriptions","organizations_url":"https://api.github.com/users/philipseidel/orgs","repos_url":"https://api.github.com/users/philipseidel/repos","events_url":"https://api.github.com/users/philipseidel/events{/privacy}","received_events_url":"https://api.github.com/users/philipseidel/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":4,"created_at":"2019-01-02T17:44:19Z","updated_at":"2019-01-03T15:26:27Z","closed_at":"2019-01-03T15:26:27Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"I am trying to build the latest `libvmod-dynamic` module based on varnish 6.0.2 and tests 03 and 13 are failing. I am building from c48be899f1f9078b67daf406ba3188fa4ca1a5bd on the 6.0 branch.\r\n```\r\n# varnishd -V\r\nvarnishd (varnish-6.0.2 revision 0458b54db26cfbea79af45ca5c4767c7c2925a91)\r\nCopyright (c) 2006 Verdens Gang AS\r\nCopyright (c) 2006-2018 Varnish Software AS\r\n```\r\n[test-suite.log](https://github.com/nigoroll/libvmod-dynamic/files/2721431/test-suite.log)\r\n","closed_by":{"login":"slimhazard","id":6084911,"node_id":"MDQ6VXNlcjYwODQ5MTE=","avatar_url":"https://avatars.githubusercontent.com/u/6084911?v=4","gravatar_id":"","url":"https://api.github.com/users/slimhazard","html_url":"https://github.com/slimhazard","followers_url":"https://api.github.com/users/slimhazard/followers","following_url":"https://api.github.com/users/slimhazard/following{/other_user}","gists_url":"https://api.github.com/users/slimhazard/gists{/gist_id}","starred_url":"https://api.github.com/users/slimhazard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slimhazard/subscriptions","organizations_url":"https://api.github.com/users/slimhazard/orgs","repos_url":"https://api.github.com/users/slimhazard/repos","events_url":"https://api.github.com/users/slimhazard/events{/privacy}","received_events_url":"https://api.github.com/users/slimhazard/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/44/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/44/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/45","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/45/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/45/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/45/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/45","id":395938107,"node_id":"MDU6SXNzdWUzOTU5MzgxMDc=","number":45,"title":"Worker crashing when calling std.healthy on dynamic director","user":{"login":"b3k","id":903674,"node_id":"MDQ6VXNlcjkwMzY3NA==","avatar_url":"https://avatars.githubusercontent.com/u/903674?v=4","gravatar_id":"","url":"https://api.github.com/users/b3k","html_url":"https://github.com/b3k","followers_url":"https://api.github.com/users/b3k/followers","following_url":"https://api.github.com/users/b3k/following{/other_user}","gists_url":"https://api.github.com/users/b3k/gists{/gist_id}","starred_url":"https://api.github.com/users/b3k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/b3k/subscriptions","organizations_url":"https://api.github.com/users/b3k/orgs","repos_url":"https://api.github.com/users/b3k/repos","events_url":"https://api.github.com/users/b3k/events{/privacy}","received_events_url":"https://api.github.com/users/b3k/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"assignees":[{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false}],"milestone":null,"comments":2,"created_at":"2019-01-04T14:09:35Z","updated_at":"2019-03-22T10:23:43Z","closed_at":"2019-03-22T10:23:43Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Hi,\r\n\r\nWe have problems with crashing worker, it works fine until cache is fresh, when it's stale then crash occures, looks like the problem is in vcl_hit():\r\n\r\n```vcl\r\nsub vcl_hit {\r\n if (obj.ttl >= 0s) {\r\n # If object is fresh everything works\r\n return (deliver);\r\n }\r\n # if object is not fresh it crash here:\r\n if (std.healthy(req.backend_hint)) {\r\n if (obj.ttl + 10s > 0s) {\r\n return (deliver);\r\n } else {\r\n return(miss);\r\n }\r\n } else {\r\n if (obj.ttl + obj.grace > 0s) {\r\n return (deliver);\r\n } else {\r\n return (miss);\r\n }\r\n }\r\n}\r\n```\r\n\r\npanic.show dump:\r\n```\r\nPanic at: Fri, 04 Jan 2019 13:55:23 GMT [301/1873]\r\nWrong turn at cache/cache_director.c:284: \r\nWrong admin health \r\nversion = varnish-6.0.2 revision 0458b54db26cfbea79af45ca5c4767c7c2925a91, vrt api = 7.0\r\nident = Linux,4.14.56+,x86_64,-junix,-smalloc,-sdefault,-hcritbit,epoll \r\nnow = 6044301.424466 (mono), 1546610123.991261 (real) \r\nBacktrace: \r\n 0x5555b6827e77: /usr/sbin/varnishd(+0x4be77) [0x5555b6827e77] \r\n 0x5555b688f9d0: /usr/sbin/varnishd(VAS_Fail+0x40) [0x5555b688f9d0] \r\n 0x5555b680d790: /usr/sbin/varnishd(VRT_Healthy+0) [0x5555b680d790] \r\n 0x5555b680d7c4: /usr/sbin/varnishd(VRT_Healthy+0x34) [0x5555b680d7c4] \r\n 0x7f1e2fc4dc47: vcl_new.1546610095.661100/vgc.so(VGC_function_vcl_hit+0x87) [0x7f1e2fc4dc47]\r\n 0x5555b683a505: /usr/sbin/varnishd(+0x5e505) [0x5555b683a505] \r\n 0x5555b683c4cd: /usr/sbin/varnishd(VCL_hit_method+0x5d) [0x5555b683c4cd] \r\n 0x5555b682be4e: /usr/sbin/varnishd(+0x4fe4e) [0x5555b682be4e] \r\n 0x5555b682d119: /usr/sbin/varnishd(CNT_Request+0xde9) [0x5555b682d119] \r\n 0x5555b68526fa: /usr/sbin/varnishd(+0x766fa) [0x5555b68526fa] \r\nthread = (cache-worker) \r\nthr.req = 0x7f1e2f23e020 { \r\n vxid = 27, transport = HTTP/1 { \r\n state = HTTP1::Proc \r\n } \r\n step = R_STP_LOOKUP, \r\n req_body = R_BODY_NONE,\r\n restarts = 0, esi_level = 0,\r\n sp = 0x7f1e2f097420 {\r\n fd = 21, vxid = 26,\r\n t_open = 1546610123.988345,\r\n t_idle = 1546610123.988345,\r\n ws = 0x7f1e2f097460 {\r\n id = \\\"ses\\\",\r\n {s, f, r, e} = {0x7f1e2f097498, +96, (nil), +352},\r\n },\r\n transport = HTTP/1 {\r\n state = HTTP1::Proc\r\n }\r\n client = 10.114.108.15 19332 0.0.0.0:80,\r\n },\r\n worker = 0x7f1e33978de0 {\r\n ws = 0x7f1e33978e88 {\r\n id = \\\"wrk\\\",\r\n {s, f, r, e} = {0x7f1e339783e0, +0, (nil), +2040},\r\n }, [259/1873]\r\n VCL::method = inside HIT,\r\n VCL::return = 0x0,\r\n VCL::methods = {RECV, HASH, HIT},\r\n },\r\n ws = 0x7f1e2f23e170 {\r\n id = \\\"req\\\",\r\n {s, f, r, e} = {0x7f1e2f2400a8, +53552, (nil), +57168},\r\n },\r\n http_conn = 0x7f1e2f240048 {\r\n fd = 21 (@0x7f1e2f097444),\r\n doclose = NULL,\r\n ws = 0x7f1e2f23e170 {\r\n [Already dumped, see above]\r\n },\r\n {rxbuf_b, rxbuf_e} = {0x7f1e2f2400a8, 0x7f1e2f2414fb},\r\n {pipeline_b, pipeline_e} = {(nil), (nil)},\r\n content_length = -1,\r\n body_status = none,\r\n first_byte_timeout = 0.000000,\r\n between_bytes_timeout = 0.000000,\r\n },\r\n...\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/45/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/45/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/46","repository_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic","labels_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/46/labels{/name}","comments_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/46/comments","events_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/46/events","html_url":"https://github.com/nigoroll/libvmod-dynamic/issues/46","id":423910933,"node_id":"MDU6SXNzdWU0MjM5MTA5MzM=","number":46,"title":"Sometimes vmod_dynamic stops refreshing DNS","user":{"login":"garadox","id":466469,"node_id":"MDQ6VXNlcjQ2NjQ2OQ==","avatar_url":"https://avatars.githubusercontent.com/u/466469?v=4","gravatar_id":"","url":"https://api.github.com/users/garadox","html_url":"https://github.com/garadox","followers_url":"https://api.github.com/users/garadox/followers","following_url":"https://api.github.com/users/garadox/following{/other_user}","gists_url":"https://api.github.com/users/garadox/gists{/gist_id}","starred_url":"https://api.github.com/users/garadox/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/garadox/subscriptions","organizations_url":"https://api.github.com/users/garadox/orgs","repos_url":"https://api.github.com/users/garadox/repos","events_url":"https://api.github.com/users/garadox/events{/privacy}","received_events_url":"https://api.github.com/users/garadox/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":443804426,"node_id":"MDU6TGFiZWw0NDM4MDQ0MjY=","url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/labels/invalid","name":"invalid","color":"e6e6e6","default":true,"description":null}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":10,"created_at":"2019-03-21T19:46:46Z","updated_at":"2019-03-29T15:19:53Z","closed_at":"2019-03-29T15:19:07Z","author_association":"NONE","active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"Even using `varnishlog -g raw -q '* ~ vmod-dynamic'` to watch logs of the DNS refresh occurring, I haven't managed to isolate a repeatable scenario where DNS stops being refreshed.\r\n\r\nWe have docker containers running centos 7 and varnish 4.1.8, and over time some of those containers will stop outputting logs for vmod-dynamic and the backend list will become stale. Eventually if undetected, the backend list has no healthy entries and varnish starts returning 503's.\r\n\r\nWe have found that killing the varnish child process or using varnishadm to reload the existing vcl is enough to fix the dns lookup and everything is good again.\r\n\r\nOne thing I will call out is that our DNS ttl is set to 10 seconds, as we're running in kubernetes and pods can go away pretty quickly.\r\n\r\nExample VCL:\r\n\r\n```\r\nvcl 4.0;\r\n\r\n import std;\r\n import directors;\r\n import saintmode;\r\n import dynamic;\r\n import xkey;\r\n import statsd;\r\n import timers;\r\n import vsthrottle;\r\n import header;\r\n\r\n # Default backend definition.\r\n backend default {\r\n .host = \"0.0.0.0\";\r\n .port = \"80\";\r\n }\r\n\r\n probe default_probe {\r\n .url = \"/test\";\r\n .interval = 4s;\r\n .timeout = 1s;\r\n .window = 3;\r\n .threshold = 2;\r\n .initial = 2;\r\n }\r\n\r\n sub vcl_init {\r\n new default_dir = dynamic.director(\r\n port = \"5050\",\r\n probe = default_probe,\r\n ttl = 10s);\r\n\r\n statsd.server( \"127.0.0.1\", \"8126\" );\r\n }\r\n\r\n \r\n sub vcl_recv {\r\n if ( req.method == \"GET\" || req.method == \"HEAD\" ) {\r\n return(hash);\r\n }\r\n }\r\n\r\n sub vcl_deliver {\r\n if (obj.hits > 0) {\r\n set resp.http.X-CACHE = \"hit\";\r\n } else {\r\n set resp.http.X-CACHE = \"miss\";\r\n }\r\n return (deliver);\r\n }\r\n\r\n sub vcl_backend_response {\r\n set beresp.ttl = 2s;\r\n set beresp.grace = 20s;\r\n set beresp.keep = 2s;\r\n if ( beresp.status == 200 || beresp.status == 400 || beresp.status == 404 ) {\r\n # if s-maxage is not set then set some defaults\r\n set beresp.ttl = 120s;\r\n set beresp.grace = 2m;\r\n set beresp.keep = 0s;\r\n }\r\n }\r\n if (beresp.http.content-type ~ \"(text|json|xml|javascript)\" ) {\r\n set beresp.do_gzip = true;\r\n }\r\n }\r\n\r\n sub vcl_backend_fetch {\r\n set bereq.backend = default_dir.backend(\"example-service\");\r\n\r\n return (fetch);\r\n }\r\n\r\n sub vcl_backend_error {\r\n set beresp.http.Content-Type = \"text/html; charset=utf-8\";\r\n set beresp.http.Retry-After = \"5\";\r\n synthetic( {\"\r\n \r\n \r\n \"} + beresp.status + \" \" + beresp.reason + {\"\r\n \r\n \r\n

Error \"} + beresp.status + \" \" + beresp.reason + {\"

\r\n

\"} + beresp.reason + {\"

\r\n

Redsky TX:

\r\n

X-REQUEST-ID: \"} + bereq.http.X-REQUEST-ID + {\"

\r\n
\r\n

Redsky

\r\n \r\n \r\n \"} );\r\n return (deliver);\r\n }\r\n\r\n```","closed_by":{"login":"nigoroll","id":1528104,"node_id":"MDQ6VXNlcjE1MjgxMDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1528104?v=4","gravatar_id":"","url":"https://api.github.com/users/nigoroll","html_url":"https://github.com/nigoroll","followers_url":"https://api.github.com/users/nigoroll/followers","following_url":"https://api.github.com/users/nigoroll/following{/other_user}","gists_url":"https://api.github.com/users/nigoroll/gists{/gist_id}","starred_url":"https://api.github.com/users/nigoroll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nigoroll/subscriptions","organizations_url":"https://api.github.com/users/nigoroll/orgs","repos_url":"https://api.github.com/users/nigoroll/repos","events_url":"https://api.github.com/users/nigoroll/events{/privacy}","received_events_url":"https://api.github.com/users/nigoroll/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/46/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/nigoroll/libvmod-dynamic/issues/46/timeline","performed_via_github_app":null,"state_reason":"completed"}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672 index 8dac7b406b..041068c55b 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672 @@ -1,23 +1,20 @@ Cache-Control: max-age=0, private, must-revalidate -Etag: W/"c77cec95a47ea2b28a897b9b9eaaf641" -Gitlab-Lb: haproxy-main-28-lb-gprd -Gitlab-Sv: api-gke-us-east1-b -Ratelimit-Reset: 1764067260 Cf-Cache-Status: MISS -Strict-Transport-Security: max-age=31536000 Content-Security-Policy: default-src 'none' -Ratelimit-Limit: 2000 -Ratelimit-Observed: 4 -Referrer-Policy: strict-origin-when-cross-origin -X-Runtime: 0.280463 Content-Type: application/json +Etag: W/"c121b3a20c1098563adf329ff75151ef" +Gitlab-Lb: haproxy-main-42-lb-gprd +Gitlab-Sv: api-gke-us-east1-d +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 4 +Ratelimit-Remaining: 1996 +Ratelimit-Reset: 1771085820 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 Vary: Origin, Accept-Encoding X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN -Ratelimit-Name: throttle_authenticated_api -Ratelimit-Remaining: 1996 -X-Gitlab-Meta: {"correlation_id":"9a40876c7564e0d9-ATL","version":"1"} -Set-Cookie: __cf_bm=pNVcnucqgoXcZjvxr101uQXpAxglmowlLAItA.WHiEE-1764067238-1.0.1.1-bHnsERU82S.3aXviQYZyZ.Wpz1M9bl64MxY81EF8r68DhKfk4q01V_P2K2xdnH2EisJA8NJCH8S6WRN17yBWvtpyv3KTgEM.fWZTzzVvsnE; path=/; expires=Tue, 25-Nov-25 11:10:38 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=IeTcO1.iXZQZ_rk.w1KsaEts1gdvZO2RzZzYRR6IKU0-1764067238254-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None +X-Runtime: 0.265902 -{"id":61363672,"description":"Test repository for testing migration from gitlab to forgejo","name":"test_repo","name_with_namespace":"Forgejo / test_repo","path":"test_repo","path_with_namespace":"forgejo/test_repo","created_at":"2024-09-03T07:44:30.668Z","default_branch":"master","tag_list":["migration","test"],"topics":["migration","test"],"ssh_url_to_repo":"git@gitlab.com:forgejo/test_repo.git","http_url_to_repo":"https://gitlab.com/forgejo/test_repo.git","web_url":"https://gitlab.com/forgejo/test_repo","readme_url":"https://gitlab.com/forgejo/test_repo/-/blob/master/README.md","forks_count":0,"avatar_url":null,"star_count":0,"last_activity_at":"2025-11-25T09:03:01.001Z","visibility":"public","namespace":{"id":64459497,"name":"Forgejo","path":"forgejo","kind":"group","full_path":"forgejo","parent_id":null,"avatar_url":"/uploads/-/system/group/avatar/64459497/73144-c883a242dec5299fbc06bbe3ee71d8c6.png","web_url":"https://gitlab.com/groups/forgejo"},"forked_from_project":{"id":15578026,"description":"Test repository for testing migration from gitlab to gitea","name":"test_repo","name_with_namespace":"gitea / test_repo","path":"test_repo","path_with_namespace":"gitea/test_repo","created_at":"2019-11-28T08:20:33.019Z","default_branch":"master","tag_list":["migration","test"],"topics":["migration","test"],"ssh_url_to_repo":"git@gitlab.com:gitea/test_repo.git","http_url_to_repo":"https://gitlab.com/gitea/test_repo.git","web_url":"https://gitlab.com/gitea/test_repo","readme_url":"https://gitlab.com/gitea/test_repo/-/blob/master/README.md","forks_count":2,"avatar_url":null,"star_count":0,"last_activity_at":"2025-11-25T09:21:43.130Z","visibility":"public","namespace":{"id":3181312,"name":"gitea","path":"gitea","kind":"group","full_path":"gitea","parent_id":null,"avatar_url":"/uploads/-/system/group/avatar/3181312/gitea.png","web_url":"https://gitlab.com/groups/gitea"}},"container_registry_image_prefix":"registry.gitlab.com/forgejo/test_repo","_links":{"self":"https://gitlab.com/api/v4/projects/61363672","issues":"https://gitlab.com/api/v4/projects/61363672/issues","merge_requests":"https://gitlab.com/api/v4/projects/61363672/merge_requests","repo_branches":"https://gitlab.com/api/v4/projects/61363672/repository/branches","labels":"https://gitlab.com/api/v4/projects/61363672/labels","events":"https://gitlab.com/api/v4/projects/61363672/events","members":"https://gitlab.com/api/v4/projects/61363672/members","cluster_agents":"https://gitlab.com/api/v4/projects/61363672/cluster_agents"},"marked_for_deletion_at":null,"marked_for_deletion_on":null,"packages_enabled":true,"empty_repo":false,"archived":false,"resolve_outdated_diff_discussions":false,"container_expiration_policy":{"cadence":"1d","enabled":false,"keep_n":10,"older_than":"90d","name_regex":".*","name_regex_keep":null,"next_run_at":"2024-09-04T07:44:30.699Z"},"repository_object_format":"sha1","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"jobs_enabled":true,"snippets_enabled":true,"container_registry_enabled":true,"service_desk_enabled":true,"service_desk_address":"contact-project+forgejo-test-repo-61363672-issue-@incoming.gitlab.com","can_create_merge_request_in":true,"issues_access_level":"enabled","repository_access_level":"enabled","merge_requests_access_level":"enabled","forking_access_level":"enabled","wiki_access_level":"enabled","builds_access_level":"enabled","snippets_access_level":"enabled","pages_access_level":"enabled","analytics_access_level":"enabled","container_registry_access_level":"enabled","security_and_compliance_access_level":"private","releases_access_level":"enabled","environments_access_level":"enabled","feature_flags_access_level":"enabled","infrastructure_access_level":"enabled","monitor_access_level":"enabled","model_experiments_access_level":"enabled","model_registry_access_level":"enabled","package_registry_access_level":"public","emails_disabled":false,"emails_enabled":true,"show_diff_preview_in_email":true,"shared_runners_enabled":true,"lfs_enabled":true,"creator_id":2005797,"mr_default_target_self":false,"import_url":null,"import_type":null,"import_status":"finished","import_error":null,"open_issues_count":1,"description_html":"\u003cp data-sourcepos=\"1:1-1:60\" dir=\"auto\"\u003eTest repository for testing migration from gitlab to forgejo\u003c/p\u003e","updated_at":"2025-11-25T09:21:03.121Z","ci_default_git_depth":50,"ci_delete_pipelines_in_seconds":null,"ci_forward_deployment_enabled":true,"ci_forward_deployment_rollback_allowed":true,"ci_job_token_scope_enabled":false,"ci_separated_caches":true,"ci_allow_fork_pipelines_to_run_in_parent_project":true,"ci_id_token_sub_claim_components":["project_path","ref_type","ref"],"build_git_strategy":"fetch","keep_latest_artifact":true,"restrict_user_defined_variables":false,"ci_pipeline_variables_minimum_override_role":"developer","runner_token_expiration_interval":null,"group_runners_enabled":true,"resource_group_default_process_mode":"unordered","auto_cancel_pending_pipelines":"enabled","build_timeout":3600,"auto_devops_enabled":false,"auto_devops_deploy_strategy":"continuous","ci_push_repository_for_job_token_allowed":false,"ci_config_path":null,"public_jobs":true,"shared_with_groups":[],"only_allow_merge_if_pipeline_succeeds":false,"allow_merge_on_skipped_pipeline":null,"request_access_enabled":true,"only_allow_merge_if_all_discussions_are_resolved":false,"remove_source_branch_after_merge":true,"printing_merge_request_link_enabled":true,"merge_method":"merge","merge_request_title_regex":null,"merge_request_title_regex_description":null,"squash_option":"default_off","enforce_auth_checks_on_uploads":true,"suggestion_commit_message":null,"merge_commit_template":null,"squash_commit_template":null,"issue_branch_template":null,"warn_about_potentially_unwanted_characters":true,"autoclose_referenced_issues":true,"max_artifacts_size":null,"external_authorization_classification_label":"","requirements_enabled":false,"requirements_access_level":"enabled","security_and_compliance_enabled":true,"compliance_frameworks":[],"duo_remote_flows_enabled":true,"duo_foundational_flows_enabled":false,"web_based_commit_signing_enabled":false,"permissions":{"project_access":{"access_level":40,"notification_level":3},"group_access":null}} \ No newline at end of file +{"id":61363672,"description":"Test repository for testing migration from gitlab to forgejo","name":"test_repo","name_with_namespace":"Forgejo / test_repo","path":"test_repo","path_with_namespace":"forgejo/test_repo","created_at":"2024-09-03T07:44:30.668Z","default_branch":"master","tag_list":["migration","migration test","test"],"topics":["migration","migration test","test"],"ssh_url_to_repo":"git@gitlab.com:forgejo/test_repo.git","http_url_to_repo":"https://gitlab.com/forgejo/test_repo.git","web_url":"https://gitlab.com/forgejo/test_repo","readme_url":"https://gitlab.com/forgejo/test_repo/-/blob/master/README.md","forks_count":0,"avatar_url":null,"star_count":0,"last_activity_at":"2026-02-13T20:46:12.772Z","visibility":"public","namespace":{"id":64459497,"name":"Forgejo","path":"forgejo","kind":"group","full_path":"forgejo","parent_id":null,"avatar_url":"/uploads/-/system/group/avatar/64459497/73144-c883a242dec5299fbc06bbe3ee71d8c6.png","web_url":"https://gitlab.com/groups/forgejo"},"container_registry_image_prefix":"registry.gitlab.com/forgejo/test_repo","_links":{"self":"https://gitlab.com/api/v4/projects/61363672","issues":"https://gitlab.com/api/v4/projects/61363672/issues","merge_requests":"https://gitlab.com/api/v4/projects/61363672/merge_requests","repo_branches":"https://gitlab.com/api/v4/projects/61363672/repository/branches","labels":"https://gitlab.com/api/v4/projects/61363672/labels","events":"https://gitlab.com/api/v4/projects/61363672/events","members":"https://gitlab.com/api/v4/projects/61363672/members","cluster_agents":"https://gitlab.com/api/v4/projects/61363672/cluster_agents"},"marked_for_deletion_at":null,"marked_for_deletion_on":null,"packages_enabled":true,"empty_repo":false,"archived":true,"resolve_outdated_diff_discussions":false,"container_expiration_policy":{"cadence":"1d","enabled":false,"keep_n":10,"older_than":"90d","name_regex":".*","name_regex_keep":null,"next_run_at":"2024-09-04T07:44:30.699Z"},"repository_object_format":"sha1","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"jobs_enabled":true,"snippets_enabled":true,"container_registry_enabled":true,"service_desk_enabled":true,"can_create_merge_request_in":false,"issues_access_level":"enabled","repository_access_level":"enabled","merge_requests_access_level":"enabled","forking_access_level":"enabled","wiki_access_level":"enabled","builds_access_level":"enabled","snippets_access_level":"enabled","pages_access_level":"enabled","analytics_access_level":"enabled","container_registry_access_level":"enabled","security_and_compliance_access_level":"private","releases_access_level":"enabled","environments_access_level":"enabled","feature_flags_access_level":"enabled","infrastructure_access_level":"enabled","monitor_access_level":"enabled","model_experiments_access_level":"enabled","model_registry_access_level":"enabled","package_registry_access_level":"public","emails_disabled":false,"emails_enabled":true,"show_diff_preview_in_email":true,"shared_runners_enabled":true,"lfs_enabled":true,"creator_id":2005797,"import_url":null,"import_type":null,"import_status":"finished","import_error":null,"open_issues_count":2,"description_html":"\u003cp data-sourcepos=\"1:1-1:60\" dir=\"auto\"\u003eTest repository for testing migration from gitlab to forgejo\u003c/p\u003e","updated_at":"2026-02-14T16:16:08.902Z","ci_default_git_depth":50,"ci_delete_pipelines_in_seconds":null,"ci_forward_deployment_enabled":true,"ci_forward_deployment_rollback_allowed":true,"ci_job_token_scope_enabled":false,"ci_separated_caches":true,"ci_allow_fork_pipelines_to_run_in_parent_project":true,"ci_id_token_sub_claim_components":["project_path","ref_type","ref"],"build_git_strategy":"fetch","keep_latest_artifact":true,"restrict_user_defined_variables":false,"ci_pipeline_variables_minimum_override_role":"developer","runner_token_expiration_interval":null,"group_runners_enabled":true,"resource_group_default_process_mode":"unordered","auto_cancel_pending_pipelines":"enabled","build_timeout":3600,"auto_devops_enabled":false,"auto_devops_deploy_strategy":"continuous","ci_push_repository_for_job_token_allowed":false,"ci_config_path":null,"public_jobs":true,"shared_with_groups":[],"only_allow_merge_if_pipeline_succeeds":false,"allow_merge_on_skipped_pipeline":null,"request_access_enabled":true,"only_allow_merge_if_all_discussions_are_resolved":false,"remove_source_branch_after_merge":true,"printing_merge_request_link_enabled":true,"merge_method":"merge","merge_request_title_regex":null,"merge_request_title_regex_description":null,"squash_option":"default_off","enforce_auth_checks_on_uploads":true,"suggestion_commit_message":null,"merge_commit_template":null,"squash_commit_template":null,"issue_branch_template":null,"warn_about_potentially_unwanted_characters":true,"autoclose_referenced_issues":true,"max_artifacts_size":null,"external_authorization_classification_label":"","requirements_enabled":false,"requirements_access_level":"enabled","security_and_compliance_enabled":true,"compliance_frameworks":[],"duo_remote_flows_enabled":true,"duo_foundational_flows_enabled":true,"web_based_commit_signing_enabled":false,"permissions":{"project_access":null,"group_access":{"access_level":50,"notification_level":3}}} \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F1%2Faward_emoji%3Fpage=1&per_page=2 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F1%2Faward_emoji%3Fpage=1&per_page=2 deleted file mode 100644 index c95d5fd2ea..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F1%2Faward_emoji%3Fpage=1&per_page=2 +++ /dev/null @@ -1,30 +0,0 @@ -Ratelimit-Limit: 2000 -X-Gitlab-Meta: {"correlation_id":"9a405365d6794fc7-ATL","version":"1"} -X-Page: 1 -X-Per-Page: 2 -Set-Cookie: __cf_bm=C5GGirb47y1AnxdEybainR1wHe_wFq41P5zDjTZX3yk-1764065107-1.0.1.1-mWi3KtIRmcyLamp2D2O3UsEVFAAu65Kq6r.fkCp9g7iBN9NXkpBwglhkU0pH0XEoKCoY7qLFRA6dcjdYRqzU4Wrezc9nf_FvtZ1tDxbRLM4; path=/; expires=Tue, 25-Nov-25 10:35:07 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=DJAtB6RFRWI32R0nVIBcUFeqnT.fjNBWrZdi.MUzDds-1764065107320-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Link: ; rel="first", ; rel="last" -Content-Security-Policy: default-src 'none' -Gitlab-Lb: haproxy-main-43-lb-gprd -X-Content-Type-Options: nosniff -X-Runtime: 0.114443 -Cache-Control: max-age=0, private, must-revalidate -Strict-Transport-Security: max-age=31536000 -Ratelimit-Remaining: 1991 -Ratelimit-Observed: 9 -X-Next-Page: -X-Prev-Page: -X-Total-Pages: 1 -Cf-Cache-Status: MISS -Referrer-Policy: strict-origin-when-cross-origin -X-Frame-Options: SAMEORIGIN -Content-Type: application/json -Vary: Origin, Accept-Encoding -Gitlab-Sv: api-gke-us-east1-b -Ratelimit-Reset: 1764065160 -Etag: W/"8a63dd18b47e217645efd63790d939b6" -Ratelimit-Name: throttle_authenticated_api -X-Total: 2 - -[{"id":28099429,"name":"thumbsup","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T19:56:19.487Z","updated_at":"2024-09-03T19:56:19.487Z","awardable_id":152568896,"awardable_type":"Issue","url":null},{"id":28099432,"name":"open_mouth","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T19:56:24.365Z","updated_at":"2024-09-03T19:56:24.365Z","awardable_id":152568896,"awardable_type":"Issue","url":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F1%2Faward_emoji%3Fpage=1&per_page=3 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F1%2Faward_emoji%3Fpage=1&per_page=3 index e480d6431f..e2fe469a67 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F1%2Faward_emoji%3Fpage=1&per_page=3 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F1%2Faward_emoji%3Fpage=1&per_page=3 @@ -1,30 +1,27 @@ -Content-Type: application/json -Gitlab-Sv: api-gke-us-east1-c -Ratelimit-Limit: 2000 -X-Total-Pages: 1 +Cache-Control: max-age=0, private, must-revalidate Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"8a63dd18b47e217645efd63790d939b6" +Gitlab-Lb: haproxy-main-31-lb-gprd +Gitlab-Sv: api-gke-us-east1-b +Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 15 +Ratelimit-Remaining: 1985 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 1 X-Per-Page: 3 X-Prev-Page: -Set-Cookie: __cf_bm=AMkW.FglpczGT7nCMi_moniL9P4E.UGt4JDm070vKFE-1764067240-1.0.1.1-3QZwxgak9dKmN8t8sAA11eCLyiWdDjbVaWuGfyVvF.bMk3qQb08X9.n7foHiwljxlG9XcXaGQLJ9RzqwPJGViCz2nTZw7my.wVKi4dECxaA; path=/; expires=Tue, 25-Nov-25 11:10:40 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=VDNJkuLs.DLPThrJdTl9P4NavYEsbxLAbkpfYeG_TIo-1764067240555-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Cache-Control: max-age=0, private, must-revalidate -Strict-Transport-Security: max-age=31536000 -Content-Security-Policy: default-src 'none' -Ratelimit-Remaining: 1991 -Ratelimit-Reset: 1764067260 -X-Frame-Options: SAMEORIGIN -X-Gitlab-Meta: {"correlation_id":"9a40877bd3c5e0d9-ATL","version":"1"} -X-Next-Page: -Vary: Origin, Accept-Encoding -Ratelimit-Observed: 9 -X-Page: 1 -Link: ; rel="first", ; rel="last" +X-Runtime: 0.080698 X-Total: 2 -Ratelimit-Name: throttle_authenticated_api -Referrer-Policy: strict-origin-when-cross-origin -X-Content-Type-Options: nosniff -X-Runtime: 0.114023 -Etag: W/"8a63dd18b47e217645efd63790d939b6" -Gitlab-Lb: haproxy-main-38-lb-gprd +X-Total-Pages: 1 [{"id":28099429,"name":"thumbsup","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T19:56:19.487Z","updated_at":"2024-09-03T19:56:19.487Z","awardable_id":152568896,"awardable_type":"Issue","url":null},{"id":28099432,"name":"open_mouth","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T19:56:24.365Z","updated_at":"2024-09-03T19:56:24.365Z","awardable_id":152568896,"awardable_type":"Issue","url":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F1%2Faward_emoji%3Fpage=2&per_page=2 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F1%2Faward_emoji%3Fpage=2&per_page=2 deleted file mode 100644 index fba1ea703f..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F1%2Faward_emoji%3Fpage=2&per_page=2 +++ /dev/null @@ -1,32 +0,0 @@ -X-Total: 2 -Content-Length: 2 -X-Per-Page: 2 -Cache-Control: max-age=0, private, must-revalidate -Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" -Strict-Transport-Security: max-age=31536000 -Ratelimit-Observed: 10 -X-Runtime: 0.093808 -X-Total-Pages: 1 -Accept-Ranges: bytes -Ratelimit-Name: throttle_authenticated_api -Ratelimit-Remaining: 1990 -X-Next-Page: -Set-Cookie: __cf_bm=krmSIgoXy70nwccNzKrKDrmGomsstoTv.pb2G609iS8-1764065107-1.0.1.1-O3bOtgk9Cm4h3Nr5ppRJDGdeQ7ojT70JRYEWnC7I2W8eegxfQG4mhNRRmmbsU86z9feGvE2FRtyPC8WcznS3cvzBO4v0i1K9bifxgfMT3Jg; path=/; expires=Tue, 25-Nov-25 10:35:07 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=3IXI51wbK6iOCjIgl35YHfmHOshYnQFoepGa8MPgbzQ-1764065107606-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Content-Type: application/json -Link: ; rel="first", ; rel="last" -Vary: Origin, Accept-Encoding -Ratelimit-Limit: 2000 -Cf-Cache-Status: MISS -Gitlab-Sv: api-gke-us-east1-d -X-Prev-Page: -Referrer-Policy: strict-origin-when-cross-origin -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -Content-Security-Policy: default-src 'none' -Gitlab-Lb: haproxy-main-45-lb-gprd -Ratelimit-Reset: 1764065160 -X-Gitlab-Meta: {"correlation_id":"9a40536901af4fc7-ATL","version":"1"} -X-Page: 2 - -[] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=1&per_page=2 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=1&per_page=2 deleted file mode 100644 index 34671df48b..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=1&per_page=2 +++ /dev/null @@ -1,30 +0,0 @@ -X-Content-Type-Options: nosniff -X-Page: 1 -X-Prev-Page: -X-Total-Pages: 3 -Gitlab-Lb: haproxy-main-49-lb-gprd -Ratelimit-Observed: 11 -Strict-Transport-Security: max-age=31536000 -Gitlab-Sv: api-gke-us-east1-b -Ratelimit-Limit: 2000 -X-Next-Page: 2 -X-Total: 6 -Vary: Origin, Accept-Encoding -Ratelimit-Remaining: 1989 -Ratelimit-Reset: 1764065160 -X-Frame-Options: SAMEORIGIN -X-Runtime: 0.145887 -Content-Security-Policy: default-src 'none' -X-Per-Page: 2 -Cf-Cache-Status: MISS -Etag: W/"46d402fdfea4626a5b918865ed2a21b3" -Link: ; rel="next", ; rel="first", ; rel="last" -Referrer-Policy: strict-origin-when-cross-origin -X-Gitlab-Meta: {"correlation_id":"9a40536ad3804fc7-ATL","version":"1"} -Set-Cookie: __cf_bm=iAflLFsTWXue0NdlWTclQNmHmKgpnpLwVGp9zRstYHA-1764065107-1.0.1.1-iBouQbArw5dudRhRG8Gc.oXAcwJckMJKbFw9UkTlVrUCMc8xwY52vD9JDp6LxvnCvrbT_TWiKhCL1tjvXy2.hS7lAOJwjoKLTE8Ilc8GPwg; path=/; expires=Tue, 25-Nov-25 10:35:07 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=Rcq3h31X5A4Y4I4o2L2rg7wfiVvTIFeAnA5MHEHeMtE-1764065107948-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Content-Type: application/json -Cache-Control: max-age=0, private, must-revalidate -Ratelimit-Name: throttle_authenticated_api - -[{"id":28092934,"name":"thumbsup","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:45:50.310Z","updated_at":"2024-09-03T14:45:50.310Z","awardable_id":152568900,"awardable_type":"Issue","url":null},{"id":28092936,"name":"thumbsdown","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:45:51.174Z","updated_at":"2024-09-03T14:45:51.174Z","awardable_id":152568900,"awardable_type":"Issue","url":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=1&per_page=3 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=1&per_page=3 index 9fb6111c05..da1dddaddb 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=1&per_page=3 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=1&per_page=3 @@ -1,30 +1,27 @@ -Cf-Cache-Status: MISS -Gitlab-Lb: haproxy-main-56-lb-gprd -Gitlab-Sv: api-gke-us-east1-c -Ratelimit-Observed: 10 -X-Per-Page: 3 -Content-Security-Policy: default-src 'none' -Ratelimit-Limit: 2000 -Referrer-Policy: strict-origin-when-cross-origin -X-Total: 6 Cache-Control: max-age=0, private, must-revalidate -Ratelimit-Remaining: 1990 -X-Gitlab-Meta: {"correlation_id":"9a40877dc542e0d9-ATL","version":"1"} -X-Total-Pages: 2 +Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' Content-Type: application/json -Link: ; rel="next", ; rel="first", ; rel="last" -Vary: Origin, Accept-Encoding -X-Next-Page: 2 -X-Page: 1 -X-Runtime: 0.094421 Etag: W/"a7f74b6635cdf940405e20b5627e092a" +Gitlab-Lb: haproxy-main-29-lb-gprd +Gitlab-Sv: api-gke-us-east1-c +Link: ; rel="next", ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 11 +Ratelimit-Remaining: 1989 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN +X-Next-Page: 2 +X-Page: 1 +X-Per-Page: 3 X-Prev-Page: -Set-Cookie: __cf_bm=1pVUk5OSzwbz4O8dsFsRnozXAyop91pPTEBHeWWpDnU-1764067240-1.0.1.1-5IYX.blo82vcD5UKTwXG7ln4ys9VsT8BYI8x9c9lF2Q4yBTQxA8DUvNouhqDG6Ge_Ps8oVjgbQrYPMb7Jt2zn5Xh3jOtS9ulH3q7ITiR7ek; path=/; expires=Tue, 25-Nov-25 11:10:40 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=gEvp_O9POy6sfr63Hx3Ama.RZa_hYvDk4vkRpBHycmE-1764067240834-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Ratelimit-Name: throttle_authenticated_api -Ratelimit-Reset: 1764067260 +X-Runtime: 0.087002 +X-Total: 6 +X-Total-Pages: 2 [{"id":28092934,"name":"thumbsup","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:45:50.310Z","updated_at":"2024-09-03T14:45:50.310Z","awardable_id":152568900,"awardable_type":"Issue","url":null},{"id":28092936,"name":"thumbsdown","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:45:51.174Z","updated_at":"2024-09-03T14:45:51.174Z","awardable_id":152568900,"awardable_type":"Issue","url":null},{"id":28092944,"name":"laughing","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:46:00.936Z","updated_at":"2024-09-03T14:46:00.936Z","awardable_id":152568900,"awardable_type":"Issue","url":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=2&per_page=2 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=2&per_page=2 deleted file mode 100644 index ac0ac301b7..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=2&per_page=2 +++ /dev/null @@ -1,30 +0,0 @@ -Etag: W/"15557729ecccd67be90f7632b49d20e5" -Gitlab-Sv: api-gke-us-east1-d -X-Content-Type-Options: nosniff -X-Runtime: 0.176046 -Link: ; rel="prev", ; rel="next", ; rel="first", ; rel="last" -Vary: Origin, Accept-Encoding -Ratelimit-Observed: 12 -Ratelimit-Reset: 1764065160 -Cf-Cache-Status: MISS -X-Gitlab-Meta: {"correlation_id":"9a40536cf55d4fc7-ATL","version":"1"} -X-Total-Pages: 3 -Content-Security-Policy: default-src 'none' -Referrer-Policy: strict-origin-when-cross-origin -X-Per-Page: 2 -X-Prev-Page: 1 -X-Total: 6 -Content-Type: application/json -Cache-Control: max-age=0, private, must-revalidate -Strict-Transport-Security: max-age=31536000 -Gitlab-Lb: haproxy-main-39-lb-gprd -Ratelimit-Name: throttle_authenticated_api -X-Next-Page: 3 -X-Page: 2 -Ratelimit-Limit: 2000 -X-Frame-Options: SAMEORIGIN -Set-Cookie: __cf_bm=6PlKBj6oiuq6_N7epiS8Xm97vcaMAb9oDDhC1roPYgY-1764065108-1.0.1.1-XesydYL7bwOpVgX.ZNZLcgr8fZUWm36QW2vpzPhzl0G3ok_ebr4MVuM_XldppYra8PuF_9X3ErU.u0k.aVkhCwJbtNwJgxrtTycf3bA5gXc; path=/; expires=Tue, 25-Nov-25 10:35:08 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=ww6AGjv1O4W9g8e2r75FKUoE_C9tXI.9LU3S5Ldwk3Q-1764065108312-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Ratelimit-Remaining: 1988 - -[{"id":28092944,"name":"laughing","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:46:00.936Z","updated_at":"2024-09-03T14:46:00.936Z","awardable_id":152568900,"awardable_type":"Issue","url":null},{"id":28092948,"name":"tada","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:46:09.593Z","updated_at":"2024-09-03T14:46:09.593Z","awardable_id":152568900,"awardable_type":"Issue","url":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=2&per_page=3 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=2&per_page=3 index c885b1e7ad..9310ff08ae 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=2&per_page=3 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=2&per_page=3 @@ -1,30 +1,27 @@ -Strict-Transport-Security: max-age=31536000 -Ratelimit-Name: throttle_authenticated_api -Ratelimit-Observed: 11 -Ratelimit-Remaining: 1989 -Set-Cookie: __cf_bm=9AE8CpIjrEnerJtOH7BLyO_OXlXzIs0gOxe3EtqIUuA-1764067241-1.0.1.1-Qs3bffq8SPyos4SyAbcK_5xcCd8OmKP52qPTL7ta5sxW7DtrWmeVuW8GkH.7PLS4D8kxUIGLhr81eTmtH_pcv9Q6Bq_9ACQVIRXQBoDsjXI; path=/; expires=Tue, 25-Nov-25 11:10:41 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=7LR1RtBEpFtdvYmrN.poZNibwl0WEel7bAmYSK4txoU-1764067241094-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -X-Prev-Page: 1 -Cf-Cache-Status: MISS -Ratelimit-Limit: 2000 -Ratelimit-Reset: 1764067260 -X-Runtime: 0.081401 -X-Total: 6 -Gitlab-Lb: haproxy-main-28-lb-gprd -X-Content-Type-Options: nosniff -Etag: W/"412dc0049cf530d17cba7741291c3200" -Vary: Origin, Accept-Encoding -Referrer-Policy: strict-origin-when-cross-origin -X-Next-Page: -X-Per-Page: 3 Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS Content-Security-Policy: default-src 'none' -X-Total-Pages: 2 -Link: ; rel="prev", ; rel="first", ; rel="last" -Gitlab-Sv: api-gke-us-east1-b -X-Frame-Options: SAMEORIGIN -X-Page: 2 Content-Type: application/json -X-Gitlab-Meta: {"correlation_id":"9a40877f76b0e0d9-ATL","version":"1"} +Etag: W/"412dc0049cf530d17cba7741291c3200" +Gitlab-Lb: haproxy-main-45-lb-gprd +Gitlab-Sv: gke-cny-api +Link: ; rel="prev", ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 12 +Ratelimit-Remaining: 1988 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 2 +X-Per-Page: 3 +X-Prev-Page: 1 +X-Runtime: 0.072203 +X-Total: 6 +X-Total-Pages: 2 [{"id":28092948,"name":"tada","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:46:09.593Z","updated_at":"2024-09-03T14:46:09.593Z","awardable_id":152568900,"awardable_type":"Issue","url":null},{"id":28092953,"name":"confused","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:46:18.191Z","updated_at":"2024-09-03T14:46:18.191Z","awardable_id":152568900,"awardable_type":"Issue","url":null},{"id":28092962,"name":"hearts","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:46:35.367Z","updated_at":"2024-09-03T14:46:35.367Z","awardable_id":152568900,"awardable_type":"Issue","url":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=3&per_page=2 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=3&per_page=2 deleted file mode 100644 index d016c95c8f..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=3&per_page=2 +++ /dev/null @@ -1,30 +0,0 @@ -Ratelimit-Reset: 1764065160 -X-Total: 6 -X-Total-Pages: 3 -Gitlab-Lb: haproxy-main-03-lb-gprd -X-Gitlab-Meta: {"correlation_id":"9a40536f57014fc7-ATL","version":"1"} -X-Runtime: 0.292482 -Vary: Origin, Accept-Encoding -Gitlab-Sv: api-gke-us-east1-d -Ratelimit-Remaining: 1987 -Referrer-Policy: strict-origin-when-cross-origin -X-Content-Type-Options: nosniff -Cf-Cache-Status: MISS -Ratelimit-Name: throttle_authenticated_api -X-Frame-Options: SAMEORIGIN -Etag: W/"ceed6f177d5f7e84961ad604a8cddc35" -X-Page: 3 -X-Prev-Page: 2 -Content-Type: application/json -Link: ; rel="prev", ; rel="first", ; rel="last" -Ratelimit-Limit: 2000 -Set-Cookie: __cf_bm=t2tUXdhLqCPmsw4U1LbZRu_gDoywVJmKT1x66aIcKoA-1764065108-1.0.1.1-Q6CudjcxQoHnyXHzHcIH4s_2Pte9_SriSix3lG7t79O.7er2sS7Ltg32UG33iHJMoGh1FRMTXnlFJA3g6mPm3vs2T.Z7rx8LjInyQ98AdCA; path=/; expires=Tue, 25-Nov-25 10:35:08 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=L3s_nmm3ScmGh8cr3YisKfgCl7xvN0vJNxfsvMYEpzk-1764065108869-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Cache-Control: max-age=0, private, must-revalidate -Content-Security-Policy: default-src 'none' -Ratelimit-Observed: 13 -X-Next-Page: -X-Per-Page: 2 -Strict-Transport-Security: max-age=31536000 - -[{"id":28092953,"name":"confused","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:46:18.191Z","updated_at":"2024-09-03T14:46:18.191Z","awardable_id":152568900,"awardable_type":"Issue","url":null},{"id":28092962,"name":"hearts","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:46:35.367Z","updated_at":"2024-09-03T14:46:35.367Z","awardable_id":152568900,"awardable_type":"Issue","url":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=3&per_page=3 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=3&per_page=3 index 7b78f53c9a..222ae67c3d 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=3&per_page=3 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=3&per_page=3 @@ -1,32 +1,29 @@ -Content-Type: application/json -Gitlab-Lb: haproxy-main-53-lb-gprd -Ratelimit-Name: throttle_authenticated_api -X-Prev-Page: -Ratelimit-Reset: 1764067260 -Cache-Control: max-age=0, private, must-revalidate -Gitlab-Sv: api-gke-us-east1-c -Ratelimit-Remaining: 1988 -X-Gitlab-Meta: {"correlation_id":"9a408781100ee0d9-ATL","version":"1"} -Set-Cookie: __cf_bm=ERtdJNpQThaSjqUa1.mZTqn7n0q1_fbzhUfqnAuidrE-1764067241-1.0.1.1-SIVaHdxaT7VFCCtSClSPrkBAOkMKdqMo_6H.18diW8wVohWWzdQkGK1lgp7NSFWYB.9fUd08EGQM4crpdR0vk8L6Lx9vi5tSwI0F9El27Cs; path=/; expires=Tue, 25-Nov-25 11:10:41 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=TWm8WMj9YPkP1A9SyC.xy86EYVqWA5BmefQUd0h0Bh8-1764067241497-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Content-Length: 2 Accept-Ranges: bytes +Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Length: 2 +Content-Security-Policy: default-src 'none' +Content-Type: application/json Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" +Gitlab-Lb: haproxy-main-32-lb-gprd +Gitlab-Sv: api-gke-us-east1-c Link: ; rel="first", ; rel="last" Ratelimit-Limit: 2000 -Vary: Origin, Accept-Encoding -Content-Security-Policy: default-src 'none' -X-Runtime: 0.199084 -Cf-Cache-Status: MISS -X-Next-Page: +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 13 +Ratelimit-Remaining: 1987 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin Strict-Transport-Security: max-age=31536000 -Ratelimit-Observed: 12 +Vary: Origin, Accept-Encoding X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 3 X-Per-Page: 3 +X-Prev-Page: +X-Runtime: 0.069015 X-Total: 6 X-Total-Pages: 2 -Referrer-Policy: strict-origin-when-cross-origin -X-Frame-Options: SAMEORIGIN -X-Page: 3 [] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=4&per_page=2 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=4&per_page=2 deleted file mode 100644 index ebb294094d..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Faward_emoji%3Fpage=4&per_page=2 +++ /dev/null @@ -1,32 +0,0 @@ -X-Total-Pages: 3 -Set-Cookie: __cf_bm=XEiSKl80KAa5zod94SawbVosALj1cNcQ_eq8bE3jYLU-1764065109-1.0.1.1-hnWNajuOroFE7mHA4HInOTO2nVGBGHu9yC6P4yIQZyPkA0jzn2v2QQW3QTNox6wumnUAuRkNfFUCG9tzx2wlteVA0JCboGsGmJY2FADr1LA; path=/; expires=Tue, 25-Nov-25 10:35:09 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=BVV2bFUiotodstANTLeIUoIFj5yU0lMB1WpZbkGzD9Q-1764065109254-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Vary: Origin, Accept-Encoding -Gitlab-Sv: api-gke-us-east1-c -Ratelimit-Observed: 14 -Ratelimit-Reset: 1764065160 -X-Page: 4 -Cf-Cache-Status: MISS -Link: ; rel="first", ; rel="last" -Ratelimit-Limit: 2000 -Ratelimit-Remaining: 1986 -X-Content-Type-Options: nosniff -Accept-Ranges: bytes -X-Frame-Options: SAMEORIGIN -Strict-Transport-Security: max-age=31536000 -Content-Security-Policy: default-src 'none' -X-Next-Page: -Content-Type: application/json -Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" -Gitlab-Lb: haproxy-main-53-lb-gprd -X-Total: 6 -Ratelimit-Name: throttle_authenticated_api -X-Per-Page: 2 -Content-Length: 2 -Referrer-Policy: strict-origin-when-cross-origin -X-Gitlab-Meta: {"correlation_id":"9a405372b1ba4fc7-ATL","version":"1"} -Cache-Control: max-age=0, private, must-revalidate -X-Prev-Page: -X-Runtime: 0.198149 - -[] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Fdiscussions%3Fpage=1&per_page=100 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Fdiscussions%3Fpage=1&per_page=100 index 05e407d106..4f150ff0e5 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Fdiscussions%3Fpage=1&per_page=100 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Fdiscussions%3Fpage=1&per_page=100 @@ -1,30 +1,27 @@ -Link: ; rel="first", ; rel="last" -Vary: Origin, Accept-Encoding -X-Next-Page: -Etag: W/"3f43dfe90694977cf41e442db7d78f76" -Ratelimit-Observed: 14 -Ratelimit-Remaining: 1986 -X-Gitlab-Meta: {"correlation_id":"9a408786746ce0d9-ATL","version":"1"} -X-Runtime: 0.160743 -Strict-Transport-Security: max-age=31536000 -Gitlab-Lb: haproxy-main-51-lb-gprd -Gitlab-Sv: api-gke-us-east1-d -Referrer-Policy: strict-origin-when-cross-origin -X-Page: 1 -Cf-Cache-Status: MISS -Ratelimit-Limit: 2000 -X-Content-Type-Options: nosniff -X-Per-Page: 100 -X-Total-Pages: 1 -Content-Security-Policy: default-src 'none' -Ratelimit-Reset: 1764067260 -X-Prev-Page: Cache-Control: max-age=0, private, must-revalidate -X-Frame-Options: SAMEORIGIN +Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' Content-Type: application/json +Etag: W/"f36dea488bdfeaf39734c472f94fed6b" +Gitlab-Lb: haproxy-main-15-lb-gprd +Gitlab-Sv: api-gke-us-east1-d +Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 Ratelimit-Name: throttle_authenticated_api -X-Total: 2 -Set-Cookie: __cf_bm=yLb0tijb_h6IcP8N5b9_gCUI2Oax.oodlJg5G_org7w-1764067242-1.0.1.1-96nM1EZJz3goO7FuhYyOprR4N67BL_8FlZ8L9TgGmqW2umM_h1xDE8tQNKLmthWt.CBQIfxBfNs1DXkxSv5WLkJ_450s8QqebqHYeHLWzvw; path=/; expires=Tue, 25-Nov-25 11:10:42 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=FKADqckdKPYzioe9Z2r5_0EEWR7cMjHX60K9UT3DE2Q-1764067242301-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None +Ratelimit-Observed: 16 +Ratelimit-Remaining: 1984 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 1 +X-Per-Page: 100 +X-Prev-Page: +X-Runtime: 0.205651 +X-Total: 3 +X-Total-Pages: 1 -[{"id":"8d6017e7426130502cd94fff207224b8a98efabc","individual_note":true,"notes":[{"id":2087994191,"type":null,"body":"This is a comment","author":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:45:20.848Z","updated_at":"2024-09-03T14:45:46.592Z","system":false,"noteable_id":152568900,"noteable_type":"Issue","project_id":61363672,"resolvable":false,"confidential":false,"internal":false,"imported":false,"imported_from":"none","noteable_iid":2,"commands_changes":{}}]},{"id":"c721de2d3f2f0fe9a40005228f50d8c8d8131581","individual_note":true,"notes":[{"id":2087994632,"type":null,"body":"A second comment","author":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:45:30.059Z","updated_at":"2024-09-03T14:45:30.059Z","system":false,"noteable_id":152568900,"noteable_type":"Issue","project_id":61363672,"resolvable":false,"confidential":false,"internal":false,"imported":false,"imported_from":"none","noteable_iid":2,"commands_changes":{}}]}] \ No newline at end of file +[{"id":"8d6017e7426130502cd94fff207224b8a98efabc","individual_note":true,"notes":[{"id":2087994191,"type":null,"body":"This is a comment","author":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:45:20.848Z","updated_at":"2024-09-03T14:45:46.592Z","system":false,"noteable_id":152568900,"noteable_type":"Issue","project_id":61363672,"resolvable":false,"confidential":false,"internal":false,"imported":false,"imported_from":"none","noteable_iid":2,"commands_changes":{}}]},{"id":"c721de2d3f2f0fe9a40005228f50d8c8d8131581","individual_note":true,"notes":[{"id":2087994632,"type":null,"body":"A second comment","author":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:45:30.059Z","updated_at":"2024-09-03T14:45:30.059Z","system":false,"noteable_id":152568900,"noteable_type":"Issue","project_id":61363672,"resolvable":false,"confidential":false,"internal":false,"imported":false,"imported_from":"none","noteable_iid":2,"commands_changes":{}}]},{"id":"6958a4530864f0f8c546f33e25bf09d4a11e0bd7","individual_note":true,"notes":[{"id":3083417271,"type":null,"body":"with an image ![image](/uploads/3756af8a4893bea08b99536df000e932/image.png){width=217 height=280}","author":{"id":2005797,"username":"oliverpool","public_email":"","name":"oliverpool","state":"active","locked":false,"avatar_url":"https://gitlab.com/uploads/-/system/user/avatar/2005797/avatar.png","web_url":"https://gitlab.com/oliverpool"},"created_at":"2026-02-13T20:46:11.841Z","updated_at":"2026-02-13T20:46:11.841Z","system":false,"noteable_id":152568900,"noteable_type":"Issue","project_id":61363672,"resolvable":false,"confidential":false,"internal":false,"imported":false,"imported_from":"none","noteable_iid":2,"commands_changes":{}}]}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Fresource_state_events%3Fpage=1&per_page=100 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Fresource_state_events%3Fpage=1&per_page=100 index 201e5cd4dd..d5ed7c28a9 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Fresource_state_events%3Fpage=1&per_page=100 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F2%2Fresource_state_events%3Fpage=1&per_page=100 @@ -1,30 +1,27 @@ -Vary: Origin, Accept-Encoding -Referrer-Policy: strict-origin-when-cross-origin -X-Next-Page: -X-Per-Page: 100 -X-Prev-Page: -Strict-Transport-Security: max-age=31536000 -Ratelimit-Reset: 1764067260 -Set-Cookie: __cf_bm=3hSvaVOg9Df1RydUBhWv7dmQ6AHasvpAX8RiMf_0IMk-1764067242-1.0.1.1-EFnF8p7l6vPWO.7t.INm4jiU4zIX2q26I0zgX.CvdmU0HESjVmD2HuJVzh_X4vWOmISdYa05_.IJt08.yQ25DsMlnJCYBtAuNHSeGCSl.Lg; path=/; expires=Tue, 25-Nov-25 11:10:42 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=C3.D.QMDCTlck3o2O1IZRIpjzLAzJF.V4LfqOvfHkh0-1764067242832-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Content-Type: application/json -Link: ; rel="first", ; rel="last" -X-Total-Pages: 1 Cache-Control: max-age=0, private, must-revalidate -Etag: W/"2cf51cc8586d98d271cacf42f33dae75" -Content-Security-Policy: default-src 'none' -X-Runtime: 0.123392 -X-Frame-Options: SAMEORIGIN -X-Page: 1 -X-Total: 1 Cf-Cache-Status: MISS -Gitlab-Sv: api-gke-us-east1-c -Ratelimit-Observed: 15 -X-Content-Type-Options: nosniff -X-Gitlab-Meta: {"correlation_id":"9a408788a63de0d9-ATL","version":"1"} -Gitlab-Lb: haproxy-main-53-lb-gprd +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"2cf51cc8586d98d271cacf42f33dae75" +Gitlab-Lb: haproxy-main-09-lb-gprd +Gitlab-Sv: api-gke-us-east1-d +Link: ; rel="first", ; rel="last" Ratelimit-Limit: 2000 Ratelimit-Name: throttle_authenticated_api -Ratelimit-Remaining: 1985 +Ratelimit-Observed: 17 +Ratelimit-Remaining: 1983 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 1 +X-Per-Page: 100 +X-Prev-Page: +X-Runtime: 0.107523 +X-Total: 1 +X-Total-Pages: 1 [{"id":241837962,"user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T14:43:10.947Z","resource_type":"Issue","resource_id":152568900,"source_commit":null,"source_merge_request_id":null,"state":"closed"}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F3%2Faward_emoji%3Fpage=1&per_page=3 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F3%2Faward_emoji%3Fpage=1&per_page=3 index 4659d0f5ab..13a4e37677 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F3%2Faward_emoji%3Fpage=1&per_page=3 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F3%2Faward_emoji%3Fpage=1&per_page=3 @@ -1,32 +1,29 @@ -Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" -Ratelimit-Remaining: 1987 -Referrer-Policy: strict-origin-when-cross-origin -X-Frame-Options: SAMEORIGIN -Vary: Origin, Accept-Encoding -Set-Cookie: __cf_bm=_PiVkq.l17DijVAdAtfuSQ4GuCtCOOl4czL6yY_6g9E-1764067241-1.0.1.1-QlPR96ULIEw44gI9D5uugVOR0hpmBZeL5BOF.IuALd9NwlgztPD8sH2EjiaF8LhWXfarSxmi1I_02t4cRnqlZZJmgCD3nqaOY1DEr2Jd8J8; path=/; expires=Tue, 25-Nov-25 11:10:41 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=5Y9fvzgH44fmICzIWOGlsiNLueIloiAp7j_1MuyHfL0-1764067241958-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -X-Content-Type-Options: nosniff -X-Prev-Page: -Content-Type: application/json -Cf-Cache-Status: MISS Accept-Ranges: bytes Cache-Control: max-age=0, private, must-revalidate -Ratelimit-Name: throttle_authenticated_api -X-Page: 1 -X-Total: 0 +Cf-Cache-Status: MISS Content-Length: 2 -Gitlab-Sv: api-gke-us-east1-d -Ratelimit-Reset: 1764067260 -X-Runtime: 0.069144 Content-Security-Policy: default-src 'none' -Gitlab-Lb: haproxy-main-39-lb-gprd -Ratelimit-Limit: 2000 -X-Gitlab-Meta: {"correlation_id":"9a4087839220e0d9-ATL","version":"1"} -X-Next-Page: -Ratelimit-Observed: 13 -X-Per-Page: 3 +Content-Type: application/json +Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" +Gitlab-Lb: haproxy-main-14-lb-gprd +Gitlab-Sv: api-gke-us-east1-c Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 10 +Ratelimit-Remaining: 1990 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 1 +X-Per-Page: 3 +X-Prev-Page: +X-Runtime: 0.070635 +X-Total: 0 X-Total-Pages: 1 [] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F3%2Fdiscussions%3Fpage=1&per_page=100 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F3%2Fdiscussions%3Fpage=1&per_page=100 index c55e369b30..9c83508ab1 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F3%2Fdiscussions%3Fpage=1&per_page=100 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F3%2Fdiscussions%3Fpage=1&per_page=100 @@ -1,30 +1,27 @@ -Strict-Transport-Security: max-age=31536000 -Etag: W/"d25ee844965ed283636474d7b1195b57" -Ratelimit-Observed: 16 -Ratelimit-Reset: 1764067260 -X-Content-Type-Options: nosniff -X-Prev-Page: -X-Total: 1 -Set-Cookie: __cf_bm=YkiNZjRNirt6PowNRQAhJbAZ1pSohmmpGiWle8vgu8U-1764067243-1.0.1.1-TJDOjL6q1b4S_JjFxO6NHWpxJOK77U_qAYESfRAOSIZjbTTqJ3NAThC009W5Ll0R7aiRVA7d1XnHN1AQz0zaZ2X4M0Ws9FePwJD90gaAZns; path=/; expires=Tue, 25-Nov-25 11:10:43 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=vsL8nPGLjnwrlB9N1iy79xlUSdinKj45qcTl7NrXo5E-1764067243230-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Gitlab-Sv: api-gke-us-east1-c -Ratelimit-Name: throttle_authenticated_api -Referrer-Policy: strict-origin-when-cross-origin -Content-Type: application/json -Ratelimit-Limit: 2000 -X-Page: 1 Cache-Control: max-age=0, private, must-revalidate -Vary: Origin, Accept-Encoding -Ratelimit-Remaining: 1984 -X-Next-Page: -X-Runtime: 0.199882 -X-Per-Page: 100 -X-Total-Pages: 1 Cf-Cache-Status: MISS -X-Frame-Options: SAMEORIGIN -X-Gitlab-Meta: {"correlation_id":"9a40878bf119e0d9-ATL","version":"1"} Content-Security-Policy: default-src 'none' -Gitlab-Lb: haproxy-main-14-lb-gprd +Content-Type: application/json +Etag: W/"d25ee844965ed283636474d7b1195b57" +Gitlab-Lb: haproxy-main-20-lb-gprd +Gitlab-Sv: api-gke-us-east1-c Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 18 +Ratelimit-Remaining: 1982 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 1 +X-Per-Page: 100 +X-Prev-Page: +X-Runtime: 0.167168 +X-Total: 1 +X-Total-Pages: 1 [{"id":"36545838ff9cc7d13fb129f2a97ff49297299158","individual_note":true,"notes":[{"id":2911821024,"type":null,"body":"No actually its !1","author":{"id":10529876,"username":"patdyn","public_email":"","name":"Pat Dyn","state":"active","locked":false,"avatar_url":"https://gitlab.com/uploads/-/system/user/avatar/10529876/avatar.png","web_url":"https://gitlab.com/patdyn"},"created_at":"2025-11-25T09:49:50.899Z","updated_at":"2025-11-25T09:49:50.899Z","system":false,"noteable_id":177633591,"noteable_type":"Issue","project_id":61363672,"resolvable":false,"confidential":false,"internal":false,"imported":false,"imported_from":"none","noteable_iid":3,"commands_changes":{}}]}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F3%2Fresource_state_events%3Fpage=1&per_page=100 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F3%2Fresource_state_events%3Fpage=1&per_page=100 index 6e8c1d9c81..328da03915 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F3%2Fresource_state_events%3Fpage=1&per_page=100 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F3%2Fresource_state_events%3Fpage=1&per_page=100 @@ -1,32 +1,29 @@ -X-Total-Pages: 1 Accept-Ranges: bytes -Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" -Link: ; rel="first", ; rel="last" -Ratelimit-Observed: 17 -X-Content-Type-Options: nosniff -X-Gitlab-Meta: {"correlation_id":"9a40878e7365e0d9-ATL","version":"1"} -X-Per-Page: 100 -Set-Cookie: __cf_bm=K3TOUn2vDaz1qInIfA3ot2QfDGciipMeNz7mTLiUHew-1764067243-1.0.1.1-emtayPBYQbA_Hcjg3SJRaDfSnu1LMo0AwU3oLUo88E9kLsWYkTqQJbtaEa0vquShox_HRWnGFp9s6cIg_iVaPfwR4bzUnIHzO0GNMfRcdls; path=/; expires=Tue, 25-Nov-25 11:10:43 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=Jcc7jNquyhw_7ru6wi24nRmm1pryvsiBqi_0wTQQxNY-1764067243527-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Gitlab-Lb: haproxy-main-49-lb-gprd -X-Next-Page: -Ratelimit-Name: throttle_authenticated_api -Ratelimit-Reset: 1764067260 -X-Total: 0 -Vary: Origin, Accept-Encoding -Content-Security-Policy: default-src 'none' -Ratelimit-Remaining: 1983 -X-Runtime: 0.113354 Cache-Control: max-age=0, private, must-revalidate -Strict-Transport-Security: max-age=31536000 -Referrer-Policy: strict-origin-when-cross-origin -Content-Type: application/json -Content-Length: 2 Cf-Cache-Status: MISS -Gitlab-Sv: api-gke-us-east1-b +Content-Length: 2 +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" +Gitlab-Lb: haproxy-main-05-lb-gprd +Gitlab-Sv: api-gke-us-east1-c +Link: ; rel="first", ; rel="last" Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 19 +Ratelimit-Remaining: 1981 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN -X-Prev-Page: +X-Next-Page: X-Page: 1 +X-Per-Page: 100 +X-Prev-Page: +X-Runtime: 0.116312 +X-Total: 0 +X-Total-Pages: 1 [] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F4%2Faward_emoji%3Fpage=1&per_page=3 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F4%2Faward_emoji%3Fpage=1&per_page=3 new file mode 100644 index 0000000000..03cdff2094 --- /dev/null +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%2F4%2Faward_emoji%3Fpage=1&per_page=3 @@ -0,0 +1,29 @@ +Accept-Ranges: bytes +Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Length: 2 +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" +Gitlab-Lb: haproxy-main-58-lb-gprd +Gitlab-Sv: api-gke-us-east1-b +Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 9 +Ratelimit-Remaining: 1991 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 1 +X-Per-Page: 3 +X-Prev-Page: +X-Runtime: 0.059838 +X-Total: 0 +X-Total-Pages: 1 + +[] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%3Forder_by=created_at&page=1&per_page=3&sort=desc&state=all b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%3Forder_by=created_at&page=1&per_page=3&sort=desc&state=all new file mode 100644 index 0000000000..5888a3279b --- /dev/null +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%3Forder_by=created_at&page=1&per_page=3&sort=desc&state=all @@ -0,0 +1,27 @@ +Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"219f33a99593d492e262065df734c743" +Gitlab-Lb: haproxy-main-45-lb-gprd +Gitlab-Sv: api-gke-us-east1-d +Link: ; rel="next", ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 8 +Ratelimit-Remaining: 1992 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: 2 +X-Page: 1 +X-Per-Page: 3 +X-Prev-Page: +X-Runtime: 0.135940 +X-Total: 4 +X-Total-Pages: 2 + +[{"id":178287958,"iid":4,"project_id":61363672,"title":"Missing \"migration_test\" and \"migration_test_migration_test_migration_test\" topic","description":"This is required for https://codeberg.org/forgejo/forgejo/pulls/10336.","state":"opened","created_at":"2025-12-06T14:02:59.995Z","updated_at":"2025-12-06T15:04:37.324Z","closed_at":null,"closed_by":null,"labels":[],"milestone":null,"assignees":[],"author":{"id":29018602,"username":"amadaluzia","public_email":"amadaluzia@disroot.org","name":"Artur Manuel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/66b976e59f1d5d1938ea360b9cc09127ddf982c2452fdf106f4a9f0c7e3f7175?s=80\u0026d=identicon","web_url":"https://gitlab.com/amadaluzia"},"type":"ISSUE","assignee":null,"user_notes_count":0,"merge_requests_count":0,"upvotes":0,"downvotes":0,"start_date":null,"due_date":null,"confidential":false,"discussion_locked":null,"issue_type":"issue","web_url":"https://gitlab.com/forgejo/test_repo/-/issues/4","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"task_completion_status":{"count":0,"completed_count":0},"blocking_issues_count":0,"has_tasks":true,"task_status":"0 of 0 checklist items completed","_links":{"self":"https://gitlab.com/api/v4/projects/61363672/issues/4","notes":"https://gitlab.com/api/v4/projects/61363672/issues/4/notes","award_emoji":"https://gitlab.com/api/v4/projects/61363672/issues/4/award_emoji","project":"https://gitlab.com/api/v4/projects/61363672","closed_as_duplicate_of":null},"references":{"short":"#4","relative":"#4","full":"forgejo/test_repo#4"},"severity":"UNKNOWN","moved_to_id":null,"imported":false,"imported_from":"none","service_desk_reply_to":null},{"id":177633591,"iid":3,"project_id":61363672,"title":"Fix plz","description":"Can we do something about it? !2 is maybe related to that.","state":"opened","created_at":"2025-11-25T09:49:31.991Z","updated_at":"2025-11-25T09:49:31.991Z","closed_at":null,"closed_by":null,"labels":[],"milestone":null,"assignees":[],"author":{"id":10529876,"username":"patdyn","public_email":"","name":"Pat Dyn","state":"active","locked":false,"avatar_url":"https://gitlab.com/uploads/-/system/user/avatar/10529876/avatar.png","web_url":"https://gitlab.com/patdyn"},"type":"ISSUE","assignee":null,"user_notes_count":1,"merge_requests_count":0,"upvotes":0,"downvotes":0,"start_date":null,"due_date":null,"confidential":false,"discussion_locked":null,"issue_type":"issue","web_url":"https://gitlab.com/forgejo/test_repo/-/issues/3","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"task_completion_status":{"count":0,"completed_count":0},"blocking_issues_count":0,"has_tasks":true,"task_status":"0 of 0 checklist items completed","_links":{"self":"https://gitlab.com/api/v4/projects/61363672/issues/3","notes":"https://gitlab.com/api/v4/projects/61363672/issues/3/notes","award_emoji":"https://gitlab.com/api/v4/projects/61363672/issues/3/award_emoji","project":"https://gitlab.com/api/v4/projects/61363672","closed_as_duplicate_of":null},"references":{"short":"#3","relative":"#3","full":"forgejo/test_repo#3"},"severity":"UNKNOWN","moved_to_id":null,"imported":false,"imported_from":"none","service_desk_reply_to":null},{"id":152568900,"iid":2,"project_id":61363672,"title":"Test issue","description":"This is test issue 2, do not touch!","state":"closed","created_at":"2024-09-03T14:42:35.371Z","updated_at":"2026-02-13T20:46:11.889Z","closed_at":"2024-09-03T14:43:10.906Z","closed_by":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"labels":["duplicate"],"milestone":{"id":4711993,"iid":2,"project_id":61363672,"title":"1.0.0","description":"","state":"closed","created_at":"2024-09-03T13:53:08.516Z","updated_at":"2024-09-03T20:03:57.786Z","due_date":null,"start_date":null,"expired":false,"web_url":"https://gitlab.com/forgejo/test_repo/-/milestones/2"},"assignees":[],"author":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"type":"ISSUE","assignee":null,"user_notes_count":3,"merge_requests_count":0,"upvotes":1,"downvotes":1,"start_date":null,"due_date":null,"confidential":false,"discussion_locked":null,"issue_type":"issue","web_url":"https://gitlab.com/forgejo/test_repo/-/issues/2","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"task_completion_status":{"count":0,"completed_count":0},"blocking_issues_count":0,"has_tasks":true,"task_status":"0 of 0 checklist items completed","_links":{"self":"https://gitlab.com/api/v4/projects/61363672/issues/2","notes":"https://gitlab.com/api/v4/projects/61363672/issues/2/notes","award_emoji":"https://gitlab.com/api/v4/projects/61363672/issues/2/award_emoji","project":"https://gitlab.com/api/v4/projects/61363672","closed_as_duplicate_of":null},"references":{"short":"#2","relative":"#2","full":"forgejo/test_repo#2"},"severity":"UNKNOWN","moved_to_id":null,"imported":false,"imported_from":"none","service_desk_reply_to":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%3Forder_by=created_at&page=2&per_page=3&sort=desc&state=all b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%3Forder_by=created_at&page=2&per_page=3&sort=desc&state=all new file mode 100644 index 0000000000..93174225cd --- /dev/null +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%3Forder_by=created_at&page=2&per_page=3&sort=desc&state=all @@ -0,0 +1,27 @@ +Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"26480a02f633f15960a2189bbf83f74d" +Gitlab-Lb: haproxy-main-12-lb-gprd +Gitlab-Sv: api-gke-us-east1-d +Link: ; rel="prev", ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 14 +Ratelimit-Remaining: 1986 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 2 +X-Per-Page: 3 +X-Prev-Page: 1 +X-Runtime: 0.116035 +X-Total: 4 +X-Total-Pages: 2 + +[{"id":152568896,"iid":1,"project_id":61363672,"title":"Please add an animated gif icon to the merge button","description":"I just want the merge button to hurt my eyes a little. :stuck_out_tongue_closed_eyes:","state":"closed","created_at":"2024-09-03T14:42:34.924Z","updated_at":"2024-09-03T14:48:43.756Z","closed_at":"2024-09-03T14:43:10.708Z","closed_by":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"labels":["bug","discussion"],"milestone":{"id":4711993,"iid":2,"project_id":61363672,"title":"1.0.0","description":"","state":"closed","created_at":"2024-09-03T13:53:08.516Z","updated_at":"2024-09-03T20:03:57.786Z","due_date":null,"start_date":null,"expired":false,"web_url":"https://gitlab.com/forgejo/test_repo/-/milestones/2"},"assignees":[],"author":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"type":"ISSUE","assignee":null,"user_notes_count":0,"merge_requests_count":0,"upvotes":1,"downvotes":0,"start_date":null,"due_date":null,"confidential":false,"discussion_locked":null,"issue_type":"issue","web_url":"https://gitlab.com/forgejo/test_repo/-/issues/1","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"task_completion_status":{"count":0,"completed_count":0},"blocking_issues_count":0,"has_tasks":true,"task_status":"0 of 0 checklist items completed","_links":{"self":"https://gitlab.com/api/v4/projects/61363672/issues/1","notes":"https://gitlab.com/api/v4/projects/61363672/issues/1/notes","award_emoji":"https://gitlab.com/api/v4/projects/61363672/issues/1/award_emoji","project":"https://gitlab.com/api/v4/projects/61363672","closed_as_duplicate_of":null},"references":{"short":"#1","relative":"#1","full":"forgejo/test_repo#1"},"severity":"UNKNOWN","moved_to_id":null,"imported":false,"imported_from":"none","service_desk_reply_to":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%3Fpage=1&per_page=2&sort=asc&state=all b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%3Fpage=1&per_page=2&sort=asc&state=all deleted file mode 100644 index 3281b83fc4..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%3Fpage=1&per_page=2&sort=asc&state=all +++ /dev/null @@ -1,30 +0,0 @@ -Strict-Transport-Security: max-age=31536000 -Gitlab-Lb: haproxy-main-08-lb-gprd -Ratelimit-Limit: 2000 -X-Content-Type-Options: nosniff -Content-Type: application/json -Etag: W/"fed6a858b8cd04cce298928641bdbf91" -Ratelimit-Name: throttle_authenticated_api -X-Total: 3 -Set-Cookie: __cf_bm=56WriCYT.4x.bhoJPAbtvhcoXjX.hSJZSxyA5n4RgGI-1764065106-1.0.1.1-6X71GaEn1440OUYNQyEtihb2G6vdIAldNl8MmJSA8B8vdpeLOu6wJjctKFZf1p4I_We9_fFUHF6bJxrhnd5L1w60cfZKL..QHzcglCDhYbA; path=/; expires=Tue, 25-Nov-25 10:35:06 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=njTrSjqzKoVc9pRMPI0tC9D3oUEVFwisFK8ERC4hPzQ-1764065106798-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Ratelimit-Remaining: 1992 -X-Gitlab-Meta: {"correlation_id":"9a40536354284fc7-ATL","version":"1"} -X-Per-Page: 2 -Link: ; rel="next", ; rel="first", ; rel="last" -Vary: Origin, Accept-Encoding -Referrer-Policy: strict-origin-when-cross-origin -X-Frame-Options: SAMEORIGIN -X-Page: 1 -Ratelimit-Reset: 1764065160 -X-Next-Page: 2 -X-Total-Pages: 2 -Content-Security-Policy: default-src 'none' -X-Prev-Page: -X-Runtime: 0.164380 -Cf-Cache-Status: MISS -Cache-Control: max-age=0, private, must-revalidate -Gitlab-Sv: api-gke-us-east1-c -Ratelimit-Observed: 8 - -[{"id":152568896,"iid":1,"project_id":61363672,"title":"Please add an animated gif icon to the merge button","description":"I just want the merge button to hurt my eyes a little. :stuck_out_tongue_closed_eyes:","state":"closed","created_at":"2024-09-03T14:42:34.924Z","updated_at":"2024-09-03T14:48:43.756Z","closed_at":"2024-09-03T14:43:10.708Z","closed_by":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"labels":["bug","discussion"],"milestone":{"id":4711993,"iid":2,"project_id":61363672,"title":"1.0.0","description":"","state":"closed","created_at":"2024-09-03T13:53:08.516Z","updated_at":"2024-09-03T20:03:57.786Z","due_date":null,"start_date":null,"expired":false,"web_url":"https://gitlab.com/forgejo/test_repo/-/milestones/2"},"assignees":[],"author":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"type":"ISSUE","assignee":null,"user_notes_count":0,"merge_requests_count":0,"upvotes":1,"downvotes":0,"due_date":null,"confidential":false,"discussion_locked":null,"issue_type":"issue","web_url":"https://gitlab.com/forgejo/test_repo/-/issues/1","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"task_completion_status":{"count":0,"completed_count":0},"blocking_issues_count":0,"has_tasks":true,"task_status":"0 of 0 checklist items completed","_links":{"self":"https://gitlab.com/api/v4/projects/61363672/issues/1","notes":"https://gitlab.com/api/v4/projects/61363672/issues/1/notes","award_emoji":"https://gitlab.com/api/v4/projects/61363672/issues/1/award_emoji","project":"https://gitlab.com/api/v4/projects/61363672","closed_as_duplicate_of":null},"references":{"short":"#1","relative":"#1","full":"forgejo/test_repo#1"},"severity":"UNKNOWN","moved_to_id":null,"imported":false,"imported_from":"none","service_desk_reply_to":null},{"id":152568900,"iid":2,"project_id":61363672,"title":"Test issue","description":"This is test issue 2, do not touch!","state":"closed","created_at":"2024-09-03T14:42:35.371Z","updated_at":"2024-09-03T20:03:43.536Z","closed_at":"2024-09-03T14:43:10.906Z","closed_by":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"labels":["duplicate"],"milestone":{"id":4711993,"iid":2,"project_id":61363672,"title":"1.0.0","description":"","state":"closed","created_at":"2024-09-03T13:53:08.516Z","updated_at":"2024-09-03T20:03:57.786Z","due_date":null,"start_date":null,"expired":false,"web_url":"https://gitlab.com/forgejo/test_repo/-/milestones/2"},"assignees":[],"author":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"type":"ISSUE","assignee":null,"user_notes_count":2,"merge_requests_count":0,"upvotes":1,"downvotes":1,"due_date":null,"confidential":false,"discussion_locked":null,"issue_type":"issue","web_url":"https://gitlab.com/forgejo/test_repo/-/issues/2","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"task_completion_status":{"count":0,"completed_count":0},"blocking_issues_count":0,"has_tasks":true,"task_status":"0 of 0 checklist items completed","_links":{"self":"https://gitlab.com/api/v4/projects/61363672/issues/2","notes":"https://gitlab.com/api/v4/projects/61363672/issues/2/notes","award_emoji":"https://gitlab.com/api/v4/projects/61363672/issues/2/award_emoji","project":"https://gitlab.com/api/v4/projects/61363672","closed_as_duplicate_of":null},"references":{"short":"#2","relative":"#2","full":"forgejo/test_repo#2"},"severity":"UNKNOWN","moved_to_id":null,"imported":false,"imported_from":"none","service_desk_reply_to":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%3Fpage=1&per_page=3&sort=asc&state=all b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%3Fpage=1&per_page=3&sort=asc&state=all deleted file mode 100644 index 15ae79e7cb..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fissues%3Fpage=1&per_page=3&sort=asc&state=all +++ /dev/null @@ -1,30 +0,0 @@ -Vary: Origin, Accept-Encoding -Ratelimit-Limit: 2000 -X-Frame-Options: SAMEORIGIN -Ratelimit-Name: throttle_authenticated_api -X-Page: 1 -X-Per-Page: 3 -X-Prev-Page: -X-Total-Pages: 1 -Ratelimit-Remaining: 1992 -Referrer-Policy: strict-origin-when-cross-origin -X-Content-Type-Options: nosniff -X-Next-Page: -Ratelimit-Reset: 1764067260 -X-Runtime: 0.227834 -X-Total: 3 -Gitlab-Lb: haproxy-main-23-lb-gprd -X-Gitlab-Meta: {"correlation_id":"9a408779112ee0d9-ATL","version":"1"} -Link: ; rel="first", ; rel="last" -Strict-Transport-Security: max-age=31536000 -Gitlab-Sv: api-gke-us-east1-c -Set-Cookie: __cf_bm=EQ7pNoZane3xZqZxCf03mAsOGNucyrqojo9wPP4ChLM-1764067240-1.0.1.1-4ICPtyEd80UCX5bM6Pt8v544OsY1V18pcsukJmXJPhb1L13ezQ1ewpmJtxd2DTS7f_.25GTrVvYfuSVBv4FKp.yuXWHEeTpuHVlaqQnByNY; path=/; expires=Tue, 25-Nov-25 11:10:40 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=1Q7FFLgLU1b0P.8Xf.1UYduw1IUBJQTNRCeXyNRWlCs-1764067240233-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Cf-Cache-Status: MISS -Cache-Control: max-age=0, private, must-revalidate -Etag: W/"7799d3664530e11a655130b629f46644" -Content-Security-Policy: default-src 'none' -Content-Type: application/json -Ratelimit-Observed: 8 - -[{"id":152568896,"iid":1,"project_id":61363672,"title":"Please add an animated gif icon to the merge button","description":"I just want the merge button to hurt my eyes a little. :stuck_out_tongue_closed_eyes:","state":"closed","created_at":"2024-09-03T14:42:34.924Z","updated_at":"2024-09-03T14:48:43.756Z","closed_at":"2024-09-03T14:43:10.708Z","closed_by":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"labels":["bug","discussion"],"milestone":{"id":4711993,"iid":2,"project_id":61363672,"title":"1.0.0","description":"","state":"closed","created_at":"2024-09-03T13:53:08.516Z","updated_at":"2024-09-03T20:03:57.786Z","due_date":null,"start_date":null,"expired":false,"web_url":"https://gitlab.com/forgejo/test_repo/-/milestones/2"},"assignees":[],"author":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"type":"ISSUE","assignee":null,"user_notes_count":0,"merge_requests_count":0,"upvotes":1,"downvotes":0,"due_date":null,"confidential":false,"discussion_locked":null,"issue_type":"issue","web_url":"https://gitlab.com/forgejo/test_repo/-/issues/1","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"task_completion_status":{"count":0,"completed_count":0},"blocking_issues_count":0,"has_tasks":true,"task_status":"0 of 0 checklist items completed","_links":{"self":"https://gitlab.com/api/v4/projects/61363672/issues/1","notes":"https://gitlab.com/api/v4/projects/61363672/issues/1/notes","award_emoji":"https://gitlab.com/api/v4/projects/61363672/issues/1/award_emoji","project":"https://gitlab.com/api/v4/projects/61363672","closed_as_duplicate_of":null},"references":{"short":"#1","relative":"#1","full":"forgejo/test_repo#1"},"severity":"UNKNOWN","moved_to_id":null,"imported":false,"imported_from":"none","service_desk_reply_to":null},{"id":152568900,"iid":2,"project_id":61363672,"title":"Test issue","description":"This is test issue 2, do not touch!","state":"closed","created_at":"2024-09-03T14:42:35.371Z","updated_at":"2024-09-03T20:03:43.536Z","closed_at":"2024-09-03T14:43:10.906Z","closed_by":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"labels":["duplicate"],"milestone":{"id":4711993,"iid":2,"project_id":61363672,"title":"1.0.0","description":"","state":"closed","created_at":"2024-09-03T13:53:08.516Z","updated_at":"2024-09-03T20:03:57.786Z","due_date":null,"start_date":null,"expired":false,"web_url":"https://gitlab.com/forgejo/test_repo/-/milestones/2"},"assignees":[],"author":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"type":"ISSUE","assignee":null,"user_notes_count":2,"merge_requests_count":0,"upvotes":1,"downvotes":1,"due_date":null,"confidential":false,"discussion_locked":null,"issue_type":"issue","web_url":"https://gitlab.com/forgejo/test_repo/-/issues/2","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"task_completion_status":{"count":0,"completed_count":0},"blocking_issues_count":0,"has_tasks":true,"task_status":"0 of 0 checklist items completed","_links":{"self":"https://gitlab.com/api/v4/projects/61363672/issues/2","notes":"https://gitlab.com/api/v4/projects/61363672/issues/2/notes","award_emoji":"https://gitlab.com/api/v4/projects/61363672/issues/2/award_emoji","project":"https://gitlab.com/api/v4/projects/61363672","closed_as_duplicate_of":null},"references":{"short":"#2","relative":"#2","full":"forgejo/test_repo#2"},"severity":"UNKNOWN","moved_to_id":null,"imported":false,"imported_from":"none","service_desk_reply_to":null},{"id":177633591,"iid":3,"project_id":61363672,"title":"Fix plz","description":"Can we do something about it? !2 is maybe related to that.","state":"opened","created_at":"2025-11-25T09:49:31.991Z","updated_at":"2025-11-25T09:49:31.991Z","closed_at":null,"closed_by":null,"labels":[],"milestone":null,"assignees":[],"author":{"id":10529876,"username":"patdyn","public_email":"","name":"Pat Dyn","state":"active","locked":false,"avatar_url":"https://gitlab.com/uploads/-/system/user/avatar/10529876/avatar.png","web_url":"https://gitlab.com/patdyn"},"type":"ISSUE","assignee":null,"user_notes_count":1,"merge_requests_count":0,"upvotes":0,"downvotes":0,"due_date":null,"confidential":false,"discussion_locked":null,"issue_type":"issue","web_url":"https://gitlab.com/forgejo/test_repo/-/issues/3","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"task_completion_status":{"count":0,"completed_count":0},"blocking_issues_count":0,"has_tasks":true,"task_status":"0 of 0 checklist items completed","_links":{"self":"https://gitlab.com/api/v4/projects/61363672/issues/3","notes":"https://gitlab.com/api/v4/projects/61363672/issues/3/notes","award_emoji":"https://gitlab.com/api/v4/projects/61363672/issues/3/award_emoji","project":"https://gitlab.com/api/v4/projects/61363672","closed_as_duplicate_of":null},"references":{"short":"#3","relative":"#3","full":"forgejo/test_repo#3"},"severity":"UNKNOWN","moved_to_id":null,"imported":false,"imported_from":"none","service_desk_reply_to":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Flabels%3Fpage=1&per_page=100 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Flabels%3Fpage=1&per_page=100 index a9040ca9c6..a9481f5bf6 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Flabels%3Fpage=1&per_page=100 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Flabels%3Fpage=1&per_page=100 @@ -1,30 +1,27 @@ -Etag: W/"91f61a44ed534ef7d26e391dbef8dc0a" -Strict-Transport-Security: max-age=31536000 -X-Page: 1 -X-Prev-Page: -Ratelimit-Observed: 6 -X-Gitlab-Meta: {"correlation_id":"9a408773b4a6e0d9-ATL","version":"1"} -X-Next-Page: -X-Total: 11 -Set-Cookie: __cf_bm=j7aaqO7rO5ziUIdQvf3RVOCy1YoqvZ3PMMn1F62gies-1764067239-1.0.1.1-O7tT2VIiDucsyQjuWn1XLbewuJ4MmW97cRVANB7hdyWUzZpBkjvWpeR7MtctRTLHGgNDSjZ4cB8rX_vr7.zxtEJNM0LOGN.YT_oQoCMABHs; path=/; expires=Tue, 25-Nov-25 11:10:39 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=ym04h_vUzr0khxRVeGrqFkX54HQowOMaSiPIyov7_dU-1764067239516-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -X-Total-Pages: 1 Cache-Control: max-age=0, private, must-revalidate -Content-Security-Policy: default-src 'none' -Gitlab-Lb: haproxy-main-49-lb-gprd -Referrer-Policy: strict-origin-when-cross-origin -Content-Type: application/json -Ratelimit-Limit: 2000 -X-Frame-Options: SAMEORIGIN -X-Runtime: 0.141755 -Link: ; rel="first", ; rel="last" -Ratelimit-Name: throttle_authenticated_api -X-Content-Type-Options: nosniff -X-Per-Page: 100 -Vary: Origin, Accept-Encoding -Ratelimit-Remaining: 1994 -Ratelimit-Reset: 1764067260 -Gitlab-Sv: api-gke-us-east1-b Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"977ad54e33d2b62b959abfb2a9b801f3" +Gitlab-Lb: haproxy-main-57-lb-gprd +Gitlab-Sv: api-gke-us-east1-d +Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 6 +Ratelimit-Remaining: 1994 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 1 +X-Per-Page: 100 +X-Prev-Page: +X-Runtime: 0.162398 +X-Total: 11 +X-Total-Pages: 1 -[{"id":36554072,"name":"bug","description":null,"description_html":"","text_color":"#FFFFFF","color":"#d9534f","subscribed":false,"priority":null,"is_project_label":true},{"id":36554074,"name":"confirmed","description":null,"description_html":"","text_color":"#FFFFFF","color":"#d9534f","subscribed":false,"priority":null,"is_project_label":true},{"id":36554073,"name":"critical","description":null,"description_html":"","text_color":"#FFFFFF","color":"#d9534f","subscribed":false,"priority":null,"is_project_label":true},{"id":36554077,"name":"discussion","description":null,"description_html":"","text_color":"#FFFFFF","color":"#428bca","subscribed":false,"priority":null,"is_project_label":true},{"id":36554075,"name":"documentation","description":null,"description_html":"","text_color":"#1F1E24","color":"#f0ad4e","subscribed":false,"priority":null,"is_project_label":true},{"id":36556606,"name":"duplicate","description":"","description_html":"","text_color":"#FFFFFF","color":"#7F8C8D","subscribed":false,"priority":null,"is_project_label":true},{"id":36554079,"name":"enhancement","description":null,"description_html":"","text_color":"#FFFFFF","color":"#5cb85c","subscribed":false,"priority":null,"is_project_label":true},{"id":36554078,"name":"suggestion","description":null,"description_html":"","text_color":"#FFFFFF","color":"#428bca","subscribed":false,"priority":null,"is_project_label":true},{"id":36554076,"name":"support","description":null,"description_html":"","text_color":"#1F1E24","color":"#f0ad4e","subscribed":false,"priority":null,"is_project_label":true},{"id":36554080,"name":"test-scope::label0","description":"scoped label","description_html":"scoped label","text_color":"#FFFFFF","color":"#6699cc","subscribed":false,"priority":null,"is_project_label":true},{"id":36554094,"name":"test-scope::label1","description":"","description_html":"","text_color":"#FFFFFF","color":"#dc143c","subscribed":false,"priority":null,"is_project_label":true}] \ No newline at end of file +[{"id":36554072,"name":"bug","description":null,"description_html":"","text_color":"#FFFFFF","color":"#d9534f","archived":false,"subscribed":false,"priority":null,"is_project_label":true},{"id":36554074,"name":"confirmed","description":null,"description_html":"","text_color":"#FFFFFF","color":"#d9534f","archived":false,"subscribed":false,"priority":null,"is_project_label":true},{"id":36554073,"name":"critical","description":null,"description_html":"","text_color":"#FFFFFF","color":"#d9534f","archived":false,"subscribed":false,"priority":null,"is_project_label":true},{"id":36554077,"name":"discussion","description":null,"description_html":"","text_color":"#FFFFFF","color":"#428bca","archived":false,"subscribed":false,"priority":null,"is_project_label":true},{"id":36554075,"name":"documentation","description":null,"description_html":"","text_color":"#1F1E24","color":"#f0ad4e","archived":false,"subscribed":false,"priority":null,"is_project_label":true},{"id":36556606,"name":"duplicate","description":"","description_html":"","text_color":"#FFFFFF","color":"#7F8C8D","archived":false,"subscribed":false,"priority":null,"is_project_label":true},{"id":36554079,"name":"enhancement","description":null,"description_html":"","text_color":"#FFFFFF","color":"#5cb85c","archived":false,"subscribed":false,"priority":null,"is_project_label":true},{"id":36554078,"name":"suggestion","description":null,"description_html":"","text_color":"#FFFFFF","color":"#428bca","archived":false,"subscribed":false,"priority":null,"is_project_label":true},{"id":36554076,"name":"support","description":null,"description_html":"","text_color":"#1F1E24","color":"#f0ad4e","archived":false,"subscribed":false,"priority":null,"is_project_label":true},{"id":36554080,"name":"test-scope::label0","description":"scoped label","description_html":"scoped label","text_color":"#FFFFFF","color":"#6699cc","archived":false,"subscribed":false,"priority":null,"is_project_label":true},{"id":36554094,"name":"test-scope::label1","description":"","description_html":"","text_color":"#FFFFFF","color":"#dc143c","archived":false,"subscribed":false,"priority":null,"is_project_label":true}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1 index fe69777a61..6478282753 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1 @@ -1,23 +1,20 @@ -X-Gitlab-Meta: {"correlation_id":"9a4087994491e0d9-ATL","version":"1"} -X-Runtime: 0.188528 -Cf-Cache-Status: MISS -Vary: Origin, Accept-Encoding -Gitlab-Sv: api-gke-us-east1-c -Ratelimit-Limit: 2000 -X-Frame-Options: SAMEORIGIN -Set-Cookie: __cf_bm=vRq7jzBikEzTq7AnqMSFoJylX9YITdPajG9uX4tCYrc-1764067245-1.0.1.1-Hvlybvw74Kibce1zpFZ5U3RZzRotTcS82dIqQrHeSDN5svoMhXq6s7eKBI.0y2048mnyh3swNvHQJl8uNf2OU7_0q_XKtRC.y7j6Z9HlKLQ; path=/; expires=Tue, 25-Nov-25 11:10:45 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=.7RnvMg3Voknz7jDeEvYmkDEODsSDm7wD3k4HhDyqas-1764067245334-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None Cache-Control: max-age=0, private, must-revalidate -Strict-Transport-Security: max-age=31536000 -Gitlab-Lb: haproxy-main-20-lb-gprd -Ratelimit-Reset: 1764067260 -Etag: W/"03394ce63b5a2ead1d07419720dfe556" -Ratelimit-Remaining: 1977 -Referrer-Policy: strict-origin-when-cross-origin -X-Content-Type-Options: nosniff -Content-Type: application/json +Cf-Cache-Status: MISS Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"cf224bae9251f5868bfb51709dbbd6e3" +Gitlab-Lb: haproxy-main-45-lb-gprd +Gitlab-Sv: api-gke-us-east1-d +Ratelimit-Limit: 2000 Ratelimit-Name: throttle_authenticated_api -Ratelimit-Observed: 23 +Ratelimit-Observed: 25 +Ratelimit-Remaining: 1975 +Ratelimit-Reset: 1771085820 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Runtime: 0.178737 -{"id":324657888,"iid":1,"project_id":61363672,"title":"Test branch","description":"do not merge this PR","state":"opened","created_at":"2024-09-03T07:57:19.866Z","updated_at":"2024-09-03T18:50:21.065Z","merged_by":null,"merge_user":null,"merged_at":null,"closed_by":null,"closed_at":null,"target_branch":"master","source_branch":"feat/test","user_notes_count":0,"upvotes":1,"downvotes":0,"author":{"id":2005797,"username":"oliverpool","public_email":"","name":"oliverpool","state":"active","locked":false,"avatar_url":"https://gitlab.com/uploads/-/system/user/avatar/2005797/avatar.png","web_url":"https://gitlab.com/oliverpool"},"assignees":[],"assignee":null,"reviewers":[],"source_project_id":61363672,"target_project_id":61363672,"labels":["test-scope::label0","test-scope::label1"],"draft":false,"imported":false,"imported_from":"none","work_in_progress":false,"milestone":{"id":4711991,"iid":1,"project_id":61363672,"title":"1.1.0","description":"","state":"active","created_at":"2024-09-03T13:52:48.414Z","updated_at":"2024-09-03T14:52:14.093Z","due_date":null,"start_date":null,"expired":false,"web_url":"https://gitlab.com/forgejo/test_repo/-/milestones/1"},"merge_when_pipeline_succeeds":false,"merge_status":"can_be_merged","detailed_merge_status":"mergeable","merge_after":null,"sha":"9f733b96b98a4175276edf6a2e1231489c3bdd23","merge_commit_sha":null,"squash_commit_sha":null,"discussion_locked":null,"should_remove_source_branch":null,"force_remove_source_branch":true,"prepared_at":"2024-09-03T08:15:46.361Z","reference":"!1","references":{"short":"!1","relative":"!1","full":"forgejo/test_repo!1"},"web_url":"https://gitlab.com/forgejo/test_repo/-/merge_requests/1","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"squash":false,"squash_on_merge":false,"task_completion_status":{"count":0,"completed_count":0},"has_conflicts":false,"blocking_discussions_resolved":true,"approvals_before_merge":null,"subscribed":true,"changes_count":"1","latest_build_started_at":null,"latest_build_finished_at":null,"first_deployed_to_production_at":null,"pipeline":null,"head_pipeline":null,"diff_refs":{"base_sha":"c59c9b451acca9d106cc19d61d87afe3fbbb8b83","head_sha":"9f733b96b98a4175276edf6a2e1231489c3bdd23","start_sha":"c59c9b451acca9d106cc19d61d87afe3fbbb8b83"},"merge_error":null,"first_contribution":true,"user":{"can_merge":true}} \ No newline at end of file +{"id":324657888,"iid":1,"project_id":61363672,"title":"Test branch","description":"do not merge this PR","state":"opened","created_at":"2024-09-03T07:57:19.866Z","updated_at":"2024-09-03T18:50:21.065Z","merged_by":null,"merge_user":null,"merged_at":null,"closed_by":null,"closed_at":null,"target_branch":"master","source_branch":"feat/test","user_notes_count":0,"upvotes":1,"downvotes":0,"author":{"id":2005797,"username":"oliverpool","public_email":"","name":"oliverpool","state":"active","locked":false,"avatar_url":"https://gitlab.com/uploads/-/system/user/avatar/2005797/avatar.png","web_url":"https://gitlab.com/oliverpool"},"assignees":[],"assignee":null,"reviewers":[],"source_project_id":61363672,"target_project_id":61363672,"labels":["test-scope::label0","test-scope::label1"],"draft":false,"imported":false,"imported_from":"none","work_in_progress":false,"milestone":{"id":4711991,"iid":1,"project_id":61363672,"title":"1.1.0","description":"","state":"active","created_at":"2024-09-03T13:52:48.414Z","updated_at":"2024-09-03T14:52:14.093Z","due_date":null,"start_date":null,"expired":false,"web_url":"https://gitlab.com/forgejo/test_repo/-/milestones/1"},"merge_when_pipeline_succeeds":false,"merge_status":"can_be_merged","detailed_merge_status":"mergeable","merge_after":null,"sha":"9f733b96b98a4175276edf6a2e1231489c3bdd23","merge_commit_sha":null,"squash_commit_sha":null,"discussion_locked":null,"should_remove_source_branch":null,"force_remove_source_branch":true,"prepared_at":"2024-09-03T08:15:46.361Z","reference":"!1","references":{"short":"!1","relative":"!1","full":"forgejo/test_repo!1"},"web_url":"https://gitlab.com/forgejo/test_repo/-/merge_requests/1","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"squash":false,"squash_on_merge":false,"task_completion_status":{"count":0,"completed_count":0},"has_conflicts":false,"blocking_discussions_resolved":true,"approvals_before_merge":null,"subscribed":true,"changes_count":"1","latest_build_started_at":null,"latest_build_finished_at":null,"first_deployed_to_production_at":null,"pipeline":null,"head_pipeline":null,"diff_refs":{"base_sha":"c59c9b451acca9d106cc19d61d87afe3fbbb8b83","head_sha":"9f733b96b98a4175276edf6a2e1231489c3bdd23","start_sha":"c59c9b451acca9d106cc19d61d87afe3fbbb8b83"},"merge_error":null,"first_contribution":true,"user":{"can_merge":false}} \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Fapprovals b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Fapprovals index 4a9e817815..6a57040fa3 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Fapprovals +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Fapprovals @@ -1,23 +1,20 @@ -Cf-Cache-Status: MISS -Gitlab-Sv: api-gke-us-east1-d -Ratelimit-Reset: 1764067260 -Referrer-Policy: strict-origin-when-cross-origin -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -Content-Type: application/json Cache-Control: max-age=0, private, must-revalidate -Etag: W/"3da5e3df1b0f9c6ee83a8de4be017f3a" -Vary: Origin, Accept-Encoding +Cf-Cache-Status: MISS Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"3bd641be6f148427c8595a68c455f91f" +Gitlab-Lb: haproxy-main-51-lb-gprd +Gitlab-Sv: api-gke-us-east1-d Ratelimit-Limit: 2000 Ratelimit-Name: throttle_authenticated_api -Ratelimit-Observed: 26 -Gitlab-Lb: haproxy-main-03-lb-gprd -Ratelimit-Remaining: 1974 -X-Gitlab-Meta: {"correlation_id":"9a40879ea04ee0d9-ATL","version":"1"} +Ratelimit-Observed: 28 +Ratelimit-Remaining: 1972 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin Strict-Transport-Security: max-age=31536000 -X-Runtime: 0.089708 -Set-Cookie: __cf_bm=OBdSEa.4KBD148U98yToDpYASVjC3RfvvJChcLJD_Kc-1764067246-1.0.1.1-1dlglt_BfkVGaLI98pb6juSKJMhyzHMY1KT5aZOuQyrf2HisPIb7tFfDgraswOe_IEGXIJyHjGWne9ncfWM_I1ALhUewLlQRlSABre9b17I; path=/; expires=Tue, 25-Nov-25 11:10:46 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=3vl9VuwtU32ij7owL1kgjOEE9G9SIR6v5rGoV1LSWMw-1764067246314-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Runtime: 0.083008 -{"id":324657888,"iid":1,"project_id":61363672,"title":"Test branch","description":"do not merge this PR","state":"opened","created_at":"2024-09-03T07:57:19.866Z","updated_at":"2024-09-03T18:50:21.065Z","merge_status":"can_be_merged","approved":true,"approvals_required":0,"approvals_left":0,"require_password_to_approve":false,"approved_by":[{"user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"approved_at":"2024-09-03T18:50:20.774Z"}],"suggested_approvers":[],"approvers":[],"approver_groups":[],"user_has_approved":false,"user_can_approve":true,"approval_rules_left":[],"has_approval_rules":false,"merge_request_approvers_available":false,"multiple_approval_rules_available":false,"invalid_approvers_rules":[]} \ No newline at end of file +{"id":324657888,"iid":1,"project_id":61363672,"title":"Test branch","description":"do not merge this PR","state":"opened","created_at":"2024-09-03T07:57:19.866Z","updated_at":"2024-09-03T18:50:21.065Z","merge_status":"can_be_merged","approved":true,"approvals_required":0,"approvals_left":0,"require_password_to_approve":false,"approved_by":[{"user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"approved_at":"2024-09-03T18:50:20.774Z"}],"suggested_approvers":[],"approvers":[],"approver_groups":[],"user_has_approved":false,"user_can_approve":false,"approval_rules_left":[],"has_approval_rules":false,"merge_request_approvers_available":false,"multiple_approval_rules_available":false,"invalid_approvers_rules":[]} \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=1&per_page=1 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=1&per_page=1 deleted file mode 100644 index e14fd54fe9..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=1&per_page=1 +++ /dev/null @@ -1,30 +0,0 @@ -X-Total: 2 -Cache-Control: max-age=0, private, must-revalidate -Gitlab-Lb: haproxy-main-52-lb-gprd -Ratelimit-Name: throttle_authenticated_api -X-Page: 1 -Etag: W/"70c4ed058c515311f62a5765a249cc5a" -Referrer-Policy: strict-origin-when-cross-origin -X-Next-Page: 2 -Link: ; rel="next", ; rel="first", ; rel="last" -Content-Security-Policy: default-src 'none' -X-Total-Pages: 2 -Set-Cookie: __cf_bm=XkuPSlZqX6G9cDIjI3kScBSmIE8.DphoKnxS7TLsOkw-1764063483-1.0.1.1-mbTkp1GpKErhvN0TGPwU7C70xZ3hGtyNGmIFwd0ztkPoYV1Sa6EAAmpFv0UvuVIo1MZUfmjpu0nKcM0sgmv5Yq93F_j6Mo5yv42SwqSCp.o; path=/; expires=Tue, 25-Nov-25 10:08:03 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=bAOzKGORp_o4KNjq.9E3ti0ukBGdMCxdTqK0GKzH8HM-1764063483573-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Content-Type: application/json -X-Content-Type-Options: nosniff -X-Prev-Page: -Strict-Transport-Security: max-age=31536000 -Ratelimit-Limit: 2000 -Ratelimit-Remaining: 1993 -X-Frame-Options: SAMEORIGIN -X-Gitlab-Meta: {"correlation_id":"9a402bbdd2c14fc7-ATL","version":"1"} -Gitlab-Sv: gke-cny-api -Ratelimit-Observed: 7 -X-Runtime: 0.556538 -Cf-Cache-Status: MISS -Vary: Origin, Accept-Encoding -Ratelimit-Reset: 1764063540 -X-Per-Page: 1 - -[{"id":28098492,"name":"thumbsup","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T18:49:58.072Z","updated_at":"2024-09-03T18:49:58.072Z","awardable_id":324657888,"awardable_type":"MergeRequest","url":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=1&per_page=2 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=1&per_page=2 index 7f5cac98b4..0c8899056e 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=1&per_page=2 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=1&per_page=2 @@ -1,30 +1,27 @@ -Cf-Cache-Status: MISS -Ratelimit-Reset: 1764067260 -X-Page: 1 -X-Total-Pages: 1 -Content-Type: application/json -Gitlab-Lb: haproxy-main-54-lb-gprd -Ratelimit-Limit: 2000 -Referrer-Policy: strict-origin-when-cross-origin -X-Gitlab-Meta: {"correlation_id":"9a40879b9635e0d9-ATL","version":"1"} -X-Runtime: 0.064452 -Set-Cookie: __cf_bm=b3C7feSdSLcE5xBQkgGd_HSIGeFMUvtzoe7GjmBh4Sk-1764067245-1.0.1.1-69_Md94YSDAyIau0t6tbIWbQGCnD__2bLKIX_WYDa0uRa9WuVm1U9fHC0QdOI_PYD4NVQM68oFumZvLz.O6A93tHnH6PxlVDxJEc1i_gzfQ; path=/; expires=Tue, 25-Nov-25 11:10:45 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=i6_IAh2s573c9vJrB5wlCzyfSOOgp4v9v0gzK1Wr0nk-1764067245571-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Vary: Origin, Accept-Encoding -Ratelimit-Name: throttle_authenticated_api -Ratelimit-Observed: 24 -X-Content-Type-Options: nosniff -X-Total: 2 -Link: ; rel="first", ; rel="last" -Strict-Transport-Security: max-age=31536000 -Gitlab-Sv: api-gke-us-east1-d -Ratelimit-Remaining: 1976 -Etag: W/"bd2f80bb25761a40ac32dfacf2031227" -Content-Security-Policy: default-src 'none' -X-Next-Page: -X-Prev-Page: Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"bd2f80bb25761a40ac32dfacf2031227" +Gitlab-Lb: haproxy-main-39-lb-gprd +Gitlab-Sv: api-gke-us-east1-d +Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 26 +Ratelimit-Remaining: 1974 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 1 X-Per-Page: 2 +X-Prev-Page: +X-Runtime: 0.069272 +X-Total: 2 +X-Total-Pages: 1 [{"id":28098492,"name":"thumbsup","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T18:49:58.072Z","updated_at":"2024-09-03T18:49:58.072Z","awardable_id":324657888,"awardable_type":"MergeRequest","url":null},{"id":28098494,"name":"tada","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T18:50:02.028Z","updated_at":"2024-09-03T18:50:02.028Z","awardable_id":324657888,"awardable_type":"MergeRequest","url":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=2&per_page=1 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=2&per_page=1 deleted file mode 100644 index afd45d6577..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=2&per_page=1 +++ /dev/null @@ -1,30 +0,0 @@ -X-Runtime: 0.081215 -Vary: Origin, Accept-Encoding -X-Frame-Options: SAMEORIGIN -X-Gitlab-Meta: {"correlation_id":"9a402bc4a7d24fc7-ATL","version":"1"} -X-Page: 2 -Set-Cookie: __cf_bm=YmAk0.hRdZg1DtVIkj7YXf8z7q94AXkw7DPT6UASlcg-1764063484-1.0.1.1-rCR7QJGDjGvGw7RA8JmcdbMEKiNoDr3w9Iyu290lGhFN6oyozy1GKI51UR6Ul29VSBh9W2lqUqeBIF2gSCTe227jItc5EnFmEUrzN3_dPUQ; path=/; expires=Tue, 25-Nov-25 10:08:04 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=cQxspr39HLxTXEIAEI3Z8UlOj.KlZ4ayyHo87KzcH9g-1764063484057-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Content-Security-Policy: default-src 'none' -Content-Type: application/json -Cf-Cache-Status: MISS -Strict-Transport-Security: max-age=31536000 -Ratelimit-Reset: 1764063540 -X-Per-Page: 1 -X-Prev-Page: 1 -Ratelimit-Observed: 8 -Referrer-Policy: strict-origin-when-cross-origin -X-Content-Type-Options: nosniff -X-Next-Page: -X-Total: 2 -X-Total-Pages: 2 -Gitlab-Lb: haproxy-main-59-lb-gprd -Gitlab-Sv: api-gke-us-east1-c -Ratelimit-Remaining: 1992 -Cache-Control: max-age=0, private, must-revalidate -Etag: W/"9c7da703c0da01fbfe41ef1d4bd2a84e" -Link: ; rel="prev", ; rel="first", ; rel="last" -Ratelimit-Limit: 2000 -Ratelimit-Name: throttle_authenticated_api - -[{"id":28098494,"name":"tada","user":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"created_at":"2024-09-03T18:50:02.028Z","updated_at":"2024-09-03T18:50:02.028Z","awardable_id":324657888,"awardable_type":"MergeRequest","url":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=2&per_page=2 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=2&per_page=2 index 3eae28338a..460708af72 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=2&per_page=2 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=2&per_page=2 @@ -1,32 +1,29 @@ -Cache-Control: max-age=0, private, must-revalidate -Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" -Ratelimit-Limit: 2000 -Ratelimit-Remaining: 1975 -X-Next-Page: -X-Prev-Page: -Cf-Cache-Status: MISS Accept-Ranges: bytes -Ratelimit-Reset: 1764067260 -Gitlab-Lb: haproxy-main-20-lb-gprd +Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Length: 2 +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" +Gitlab-Lb: haproxy-main-28-lb-gprd +Gitlab-Sv: api-gke-us-east1-b +Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 27 +Ratelimit-Remaining: 1973 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding X-Content-Type-Options: nosniff -X-Gitlab-Meta: {"correlation_id":"9a40879d1756e0d9-ATL","version":"1"} +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 2 +X-Per-Page: 2 +X-Prev-Page: +X-Runtime: 0.064023 X-Total: 2 X-Total-Pages: 1 -Content-Type: application/json -Content-Length: 2 -Gitlab-Sv: api-gke-us-east1-c -Ratelimit-Observed: 25 -X-Page: 2 -X-Runtime: 0.067902 -Ratelimit-Name: throttle_authenticated_api -X-Per-Page: 2 -Vary: Origin, Accept-Encoding -Referrer-Policy: strict-origin-when-cross-origin -X-Frame-Options: SAMEORIGIN -Strict-Transport-Security: max-age=31536000 -Content-Security-Policy: default-src 'none' -Link: ; rel="first", ; rel="last" -Set-Cookie: __cf_bm=h8BkNDjGvwb3L57ZRGQkkABB5U78kXobmi1vtvY8i5c-1764067245-1.0.1.1-qeX.CJTb63vRVrI6u7enwWNE_coj067G.amslx62c.UdglGf2qHOdO25C8bxHlEWtNPaxlkY0ihPzQSjY2B.em1fEWDa98O9iqQxEEgy680; path=/; expires=Tue, 25-Nov-25 11:10:45 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=384Idtls0tkTwfkLTd3hr9ayqErhfdHhmT.uwruZi1E-1764067245816-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None [] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=3&per_page=1 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=3&per_page=1 deleted file mode 100644 index 22dc3f24fc..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=3&per_page=1 +++ /dev/null @@ -1,32 +0,0 @@ -X-Runtime: 0.081756 -Content-Type: application/json -X-Frame-Options: SAMEORIGIN -X-Page: 3 -Strict-Transport-Security: max-age=31536000 -Content-Security-Policy: default-src 'none' -X-Content-Type-Options: nosniff -X-Next-Page: -X-Total: 2 -Content-Length: 2 -Cf-Cache-Status: MISS -X-Prev-Page: -Accept-Ranges: bytes -Gitlab-Sv: api-gke-us-east1-c -Set-Cookie: __cf_bm=AHaUZsC2vGJiM7kOdVaKOrbNwS69trH4NwA4P6H35Vo-1764063484-1.0.1.1-gfqG42z4PvllEAyjj0SNhLcsgPK3u54jS6cGLa78UgC.Any.C_FMzf7kkXJvCnT28XdjZ7_FcCLOVfdz8xG3y9QpvRCvCWhSzmFixx.vluM; path=/; expires=Tue, 25-Nov-25 10:08:04 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=yd78Ii6EQz3b4s8UdQ3cbMCFHi10JBkiCih71Ur2DCY-1764063484541-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Cache-Control: max-age=0, private, must-revalidate -Ratelimit-Name: throttle_authenticated_api -Ratelimit-Reset: 1764063540 -Link: ; rel="first", ; rel="last" -Gitlab-Lb: haproxy-main-38-lb-gprd -Ratelimit-Limit: 2000 -Ratelimit-Observed: 9 -Ratelimit-Remaining: 1991 -X-Gitlab-Meta: {"correlation_id":"9a402bc7a1d04fc7-ATL","version":"1"} -X-Total-Pages: 2 -Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" -X-Per-Page: 1 -Vary: Origin, Accept-Encoding -Referrer-Policy: strict-origin-when-cross-origin - -[] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2 index f28ebfc5b3..06edc96b4f 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2 @@ -1,23 +1,20 @@ -X-Runtime: 0.178866 -Set-Cookie: __cf_bm=HovvnRHtwoTC7rEbSu8TkTRpkxnN64EyEWBOEpKDwU8-1764067244-1.0.1.1-0CLYMFRqlcI0z_A7KhZby1Aw17uQQga6KzLBpEDHWCnRtXpCZQJogK6a4bPwHMTwIX88ao8QGRhAkD.23OgXKxzXH4VrjXO0rYEok74gQd4; path=/; expires=Tue, 25-Nov-25 11:10:44 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=O46TDle0ljANZqt352yHmPEDBXtO70FiLe5dp9Z0Wnw-1764067244738-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Content-Type: application/json -Ratelimit-Name: throttle_authenticated_api -X-Content-Type-Options: nosniff -Strict-Transport-Security: max-age=31536000 -Gitlab-Sv: api-gke-us-east1-b -Ratelimit-Reset: 1764067260 -X-Gitlab-Meta: {"correlation_id":"9a408795917de0d9-ATL","version":"1"} -Cf-Cache-Status: MISS -Etag: W/"e5bb0f6d19fcb489771c0b23b44ef3c7" -Vary: Origin, Accept-Encoding -Gitlab-Lb: haproxy-main-25-lb-gprd -Ratelimit-Limit: 2000 -Referrer-Policy: strict-origin-when-cross-origin Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS Content-Security-Policy: default-src 'none' -Ratelimit-Observed: 21 -Ratelimit-Remaining: 1979 +Content-Type: application/json +Etag: W/"9ee6be6c33814e3e7602172c770ee033" +Gitlab-Lb: haproxy-main-59-lb-gprd +Gitlab-Sv: api-gke-us-east1-c +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 23 +Ratelimit-Remaining: 1977 +Ratelimit-Reset: 1771085820 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN +X-Runtime: 0.186907 -{"id":435564587,"iid":2,"project_id":61363672,"title":"Test/parsing","description":"Simillar to !1 this solves an issue.","state":"opened","created_at":"2025-11-25T09:48:20.259Z","updated_at":"2025-11-25T09:48:21.627Z","merged_by":null,"merge_user":null,"merged_at":null,"closed_by":null,"closed_at":null,"target_branch":"master","source_branch":"test/parsing","user_notes_count":1,"upvotes":0,"downvotes":0,"author":{"id":10529876,"username":"patdyn","public_email":"","name":"Pat Dyn","state":"active","locked":false,"avatar_url":"https://gitlab.com/uploads/-/system/user/avatar/10529876/avatar.png","web_url":"https://gitlab.com/patdyn"},"assignees":[],"assignee":null,"reviewers":[],"source_project_id":61363672,"target_project_id":61363672,"labels":[],"draft":false,"imported":false,"imported_from":"none","work_in_progress":false,"milestone":null,"merge_when_pipeline_succeeds":false,"merge_status":"cannot_be_merged","detailed_merge_status":"commits_status","merge_after":null,"sha":"c59c9b451acca9d106cc19d61d87afe3fbbb8b83","merge_commit_sha":null,"squash_commit_sha":null,"discussion_locked":null,"should_remove_source_branch":null,"force_remove_source_branch":true,"prepared_at":"2025-11-25T09:48:21.605Z","reference":"!2","references":{"short":"!2","relative":"!2","full":"forgejo/test_repo!2"},"web_url":"https://gitlab.com/forgejo/test_repo/-/merge_requests/2","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"squash":false,"squash_on_merge":false,"task_completion_status":{"count":0,"completed_count":0},"has_conflicts":true,"blocking_discussions_resolved":true,"approvals_before_merge":null,"subscribed":true,"changes_count":null,"latest_build_started_at":null,"latest_build_finished_at":null,"first_deployed_to_production_at":null,"pipeline":null,"head_pipeline":null,"diff_refs":{"base_sha":"c59c9b451acca9d106cc19d61d87afe3fbbb8b83","head_sha":"c59c9b451acca9d106cc19d61d87afe3fbbb8b83","start_sha":"c59c9b451acca9d106cc19d61d87afe3fbbb8b83"},"merge_error":null,"first_contribution":true,"user":{"can_merge":true}} \ No newline at end of file +{"id":435564587,"iid":2,"project_id":61363672,"title":"Test/parsing","description":"Simillar to !1 this solves an issue.","state":"opened","created_at":"2025-11-25T09:48:20.259Z","updated_at":"2025-11-25T09:48:21.627Z","merged_by":null,"merge_user":null,"merged_at":null,"closed_by":null,"closed_at":null,"target_branch":"master","source_branch":"test/parsing","user_notes_count":1,"upvotes":0,"downvotes":0,"author":{"id":10529876,"username":"patdyn","public_email":"","name":"Pat Dyn","state":"active","locked":false,"avatar_url":"https://gitlab.com/uploads/-/system/user/avatar/10529876/avatar.png","web_url":"https://gitlab.com/patdyn"},"assignees":[],"assignee":null,"reviewers":[],"source_project_id":61363672,"target_project_id":61363672,"labels":[],"draft":false,"imported":false,"imported_from":"none","work_in_progress":false,"milestone":null,"merge_when_pipeline_succeeds":false,"merge_status":"cannot_be_merged","detailed_merge_status":"commits_status","merge_after":null,"sha":"c59c9b451acca9d106cc19d61d87afe3fbbb8b83","merge_commit_sha":null,"squash_commit_sha":null,"discussion_locked":null,"should_remove_source_branch":null,"force_remove_source_branch":true,"prepared_at":"2025-11-25T09:48:21.605Z","reference":"!2","references":{"short":"!2","relative":"!2","full":"forgejo/test_repo!2"},"web_url":"https://gitlab.com/forgejo/test_repo/-/merge_requests/2","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"squash":false,"squash_on_merge":false,"task_completion_status":{"count":0,"completed_count":0},"has_conflicts":true,"blocking_discussions_resolved":true,"approvals_before_merge":null,"subscribed":false,"changes_count":null,"latest_build_started_at":null,"latest_build_finished_at":null,"first_deployed_to_production_at":null,"pipeline":null,"head_pipeline":null,"diff_refs":{"base_sha":"c59c9b451acca9d106cc19d61d87afe3fbbb8b83","head_sha":"c59c9b451acca9d106cc19d61d87afe3fbbb8b83","start_sha":"c59c9b451acca9d106cc19d61d87afe3fbbb8b83"},"merge_error":null,"first_contribution":true,"user":{"can_merge":false}} \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Fapprovals b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Fapprovals deleted file mode 100644 index 8025baab29..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Fapprovals +++ /dev/null @@ -1,16 +0,0 @@ -Content-Type: application/json -Cache-Control: no-cache -X-Runtime: 0.050861 -Cf-Cache-Status: MISS -Content-Length: 27 -Strict-Transport-Security: max-age=31536000 -X-Content-Type-Options: nosniff -Set-Cookie: _cfuvid=dOl9pLwVdWdrfHK2_lQ8ilTg21PZJf8ErnJ6hi2V6LQ-1725394529656-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Content-Security-Policy: default-src 'none' -X-Gitlab-Meta: {"correlation_id":"8b1408168090614939be8b301aaf8ec1","version":"1"} -Referrer-Policy: strict-origin-when-cross-origin -Gitlab-Lb: haproxy-main-42-lb-gprd -Vary: Origin, Accept-Encoding -Gitlab-Sv: api-gke-us-east1-b - -{"message":"404 Not found"} \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Faward_emoji%3Fpage=1&per_page=1 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Faward_emoji%3Fpage=1&per_page=1 deleted file mode 100644 index 3ed2facd4e..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Faward_emoji%3Fpage=1&per_page=1 +++ /dev/null @@ -1,32 +0,0 @@ -X-Next-Page: -Content-Length: 2 -Cf-Cache-Status: MISS -Content-Security-Policy: default-src 'none' -Gitlab-Lb: haproxy-main-18-lb-gprd -Referrer-Policy: strict-origin-when-cross-origin -Content-Type: application/json -Ratelimit-Observed: 19 -X-Prev-Page: -X-Total: 0 -Accept-Ranges: bytes -Ratelimit-Remaining: 1981 -X-Content-Type-Options: nosniff -X-Per-Page: 1 -X-Runtime: 0.334300 -Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" -Link: ; rel="first", ; rel="last" -Strict-Transport-Security: max-age=31536000 -Gitlab-Sv: api-gke-us-east1-d -Ratelimit-Limit: 2000 -Ratelimit-Reset: 1764065160 -X-Gitlab-Meta: {"correlation_id":"9a40538146934fc7-ATL","version":"1"} -Vary: Origin, Accept-Encoding -X-Page: 1 -X-Total-Pages: 1 -Set-Cookie: __cf_bm=aMNCos1nC670QtjMcPl6AMOr5.gQUvwKoSkkyhFR2hA-1764065111-1.0.1.1-m.0niiKJJIBHdpKYYtPy7xw4tWUWsrxwXv.ZidE9s75fbutM0awLVZIAG4443voqhHhr92y0BEsgfJd2.dEPfqO5y0Zq8U2dIDMlwE7IjUI; path=/; expires=Tue, 25-Nov-25 10:35:11 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=ldTbqSB2WbTEqJNb2dvw._Hp9jvybBVGuhFVSaaB7GA-1764065111752-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Cache-Control: max-age=0, private, must-revalidate -Ratelimit-Name: throttle_authenticated_api -X-Frame-Options: SAMEORIGIN - -[] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Faward_emoji%3Fpage=1&per_page=2 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Faward_emoji%3Fpage=1&per_page=2 index c5c729ae7b..bf1be1a533 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Faward_emoji%3Fpage=1&per_page=2 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Faward_emoji%3Fpage=1&per_page=2 @@ -1,32 +1,29 @@ +Accept-Ranges: bytes +Cache-Control: max-age=0, private, must-revalidate Cf-Cache-Status: MISS +Content-Length: 2 +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" +Gitlab-Lb: haproxy-main-21-lb-gprd +Gitlab-Sv: api-gke-us-east1-d Link: ; rel="first", ; rel="last" -Ratelimit-Remaining: 1978 +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 24 +Ratelimit-Remaining: 1976 +Ratelimit-Reset: 1771055640 Referrer-Policy: strict-origin-when-cross-origin Strict-Transport-Security: max-age=31536000 -Gitlab-Sv: api-gke-us-east1-c +Vary: Origin, Accept-Encoding X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN -X-Gitlab-Meta: {"correlation_id":"9a408797d389e0d9-ATL","version":"1"} -X-Total: 0 -Content-Length: 2 -Ratelimit-Name: throttle_authenticated_api -Ratelimit-Reset: 1764067260 -X-Prev-Page: -Set-Cookie: __cf_bm=H04JUnNcTc5yzKjplGbl_VmPweCoi2aMc578JKU_Q.M-1764067244-1.0.1.1-zcEHZ4sJjriN3Gh0ujBF_3s7qAY.rzjaoXGjAqzJntUfd.fKcKzAnTLjEg70s0xAr7208YETSkoJ7.HlDXm0T3N1s6mI_oGRQ_xeDuc5FP8; path=/; expires=Tue, 25-Nov-25 11:10:44 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=R_C1xCw9pcpiAS2mZ6MTjC9pE2RWjtSAXb5vDH3RRbQ-1764067244972-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Accept-Ranges: bytes -Content-Security-Policy: default-src 'none' -Gitlab-Lb: haproxy-main-23-lb-gprd -X-Total-Pages: 1 -Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" -Ratelimit-Observed: 22 -X-Runtime: 0.058917 -Content-Type: application/json -Ratelimit-Limit: 2000 -Cache-Control: max-age=0, private, must-revalidate X-Next-Page: -Vary: Origin, Accept-Encoding X-Page: 1 X-Per-Page: 2 +X-Prev-Page: +X-Runtime: 0.060605 +X-Total: 0 +X-Total-Pages: 1 [] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Fdiscussions%3Fpage=1&per_page=100 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Fdiscussions%3Fpage=1&per_page=100 index 43a14538b7..59a52da44b 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Fdiscussions%3Fpage=1&per_page=100 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Fdiscussions%3Fpage=1&per_page=100 @@ -1,30 +1,27 @@ -Set-Cookie: __cf_bm=o0aS8o8ajcHs8a5C4vSUXQmZAQazi4dD0KCvTVlvSes-1764067243-1.0.1.1-94CxZwBfz9gJBykfV5Arn2iq8ORj_QBoMo9BmK9tJUwpEf0.WHNvPI5pVdUvZhdhCJGv3Bcxj0RbLwC..n2enJmsCgru1h.kjm0qBMVBCHA; path=/; expires=Tue, 25-Nov-25 11:10:43 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=HmW_.D2rp7JGXPOBvfl0WM76DobWOh6fFYs.z8WTWgw-1764067243834-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Cf-Cache-Status: MISS -Link: ; rel="first", ; rel="last" -Ratelimit-Observed: 18 -X-Total: 2 -Content-Security-Policy: default-src 'none' -Ratelimit-Remaining: 1982 -X-Next-Page: -Content-Type: application/json -Strict-Transport-Security: max-age=31536000 Cache-Control: max-age=0, private, must-revalidate -Gitlab-Lb: haproxy-main-03-lb-gprd -X-Gitlab-Meta: {"correlation_id":"9a40879044cce0d9-ATL","version":"1"} +Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' +Content-Type: application/json Etag: W/"d87805cd93ac626c7e1fe459c808b459" -X-Page: 1 -X-Runtime: 0.131844 -Vary: Origin, Accept-Encoding -Gitlab-Sv: api-gke-us-east1-d -Ratelimit-Name: throttle_authenticated_api -Ratelimit-Reset: 1764067260 -X-Frame-Options: SAMEORIGIN -X-Prev-Page: +Gitlab-Lb: haproxy-main-10-lb-gprd +Gitlab-Sv: api-gke-us-east1-b +Link: ; rel="first", ; rel="last" Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 20 +Ratelimit-Remaining: 1980 +Ratelimit-Reset: 1771055640 Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 1 X-Per-Page: 100 +X-Prev-Page: +X-Runtime: 0.166725 +X-Total: 2 X-Total-Pages: 1 [{"id":"b5ca983c1aa64f694c89a7c6df9a27a7b68b5414","individual_note":true,"notes":[{"id":2911818565,"type":null,"body":"Although we had some trouble with !1.","author":{"id":10529876,"username":"patdyn","public_email":"","name":"Pat Dyn","state":"active","locked":false,"avatar_url":"https://gitlab.com/uploads/-/system/user/avatar/10529876/avatar.png","web_url":"https://gitlab.com/patdyn"},"created_at":"2025-11-25T09:49:00.750Z","updated_at":"2025-11-25T09:49:00.750Z","system":false,"noteable_id":435564587,"noteable_type":"MergeRequest","project_id":61363672,"resolvable":false,"confidential":false,"internal":false,"imported":false,"imported_from":"none","noteable_iid":2,"commands_changes":{}}]},{"id":"d6baff3ff75a892764e7b3cc164689687c875266","individual_note":true,"notes":[{"id":2911820075,"type":null,"body":"mentioned in issue #3","author":{"id":10529876,"username":"patdyn","public_email":"","name":"Pat Dyn","state":"active","locked":false,"avatar_url":"https://gitlab.com/uploads/-/system/user/avatar/10529876/avatar.png","web_url":"https://gitlab.com/patdyn"},"created_at":"2025-11-25T09:49:32.263Z","updated_at":"2025-11-25T09:49:32.265Z","system":true,"noteable_id":435564587,"noteable_type":"MergeRequest","project_id":61363672,"resolvable":false,"confidential":false,"internal":false,"imported":false,"imported_from":"none","noteable_iid":2,"commands_changes":{}}]}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Fresource_state_events%3Fpage=1&per_page=100 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Fresource_state_events%3Fpage=1&per_page=100 index f4f9a26815..6059cfa08d 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Fresource_state_events%3Fpage=1&per_page=100 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%2F2%2Fresource_state_events%3Fpage=1&per_page=100 @@ -1,32 +1,29 @@ -Cf-Cache-Status: MISS -Cache-Control: max-age=0, private, must-revalidate -Content-Security-Policy: default-src 'none' -X-Content-Type-Options: nosniff -X-Per-Page: 100 -Content-Type: application/json -Vary: Origin, Accept-Encoding -Gitlab-Sv: api-gke-us-east1-b -X-Frame-Options: SAMEORIGIN -X-Page: 1 -X-Total: 0 Accept-Ranges: bytes -Link: ; rel="first", ; rel="last" -X-Prev-Page: -X-Total-Pages: 1 -Strict-Transport-Security: max-age=31536000 -Gitlab-Lb: haproxy-main-37-lb-gprd -X-Gitlab-Meta: {"correlation_id":"9a408792362de0d9-ATL","version":"1"} -X-Runtime: 0.082961 -Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" -Ratelimit-Limit: 2000 -Ratelimit-Reset: 1764067260 -Referrer-Policy: strict-origin-when-cross-origin -X-Next-Page: -Set-Cookie: __cf_bm=AnbNdfNVmM4eBwZO07iC8Va19AxPZPp91NRwcAAlm_4-1764067244-1.0.1.1-qdSGqOhjrZDqx4w1MVLdWS9_hLohzXuyB6JjSNSvzdYbcKAB9eHFjLuKigE7JLZOzDMt7b4_O8Z_a9VJwO5qn4QmH1tG0wA3sxAzlkyFpog; path=/; expires=Tue, 25-Nov-25 11:10:44 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=l_1AA94UEp6etDe2M2tLuf3x3bwZqHT2Kexkl1I.K18-1764067244103-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None +Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS Content-Length: 2 +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" +Gitlab-Lb: haproxy-main-21-lb-gprd +Gitlab-Sv: api-gke-us-east1-d +Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 Ratelimit-Name: throttle_authenticated_api -Ratelimit-Observed: 19 -Ratelimit-Remaining: 1981 +Ratelimit-Observed: 21 +Ratelimit-Remaining: 1979 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 1 +X-Per-Page: 100 +X-Prev-Page: +X-Runtime: 0.071763 +X-Total: 0 +X-Total-Pages: 1 [] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%3Fpage=1&per_page=1&view=simple b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%3Fpage=1&per_page=1&view=simple deleted file mode 100644 index bbeec767ae..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%3Fpage=1&per_page=1&view=simple +++ /dev/null @@ -1,30 +0,0 @@ -Ratelimit-Name: throttle_authenticated_api -X-Per-Page: 1 -X-Total: 2 -Content-Type: application/json -Etag: W/"bea70362bb288b76f51e3d14bd31bc42" -Ratelimit-Observed: 17 -X-Runtime: 0.447768 -X-Total-Pages: 2 -Ratelimit-Limit: 2000 -Ratelimit-Remaining: 1983 -Ratelimit-Reset: 1764065160 -Referrer-Policy: strict-origin-when-cross-origin -X-Content-Type-Options: nosniff -Gitlab-Sv: api-gke-us-east1-c -X-Frame-Options: SAMEORIGIN -Content-Security-Policy: default-src 'none' -X-Gitlab-Meta: {"correlation_id":"9a40537b01234fc7-ATL","version":"1"} -Set-Cookie: __cf_bm=_HMrVhG5HY5SHmHF_4ytrh.j8o.Q2PM_KOi9Vc9CQts-1764065110-1.0.1.1-cRPKy84Yt3i5.R5xOiJjfYqrJUDcb2sTotrA4Di5rodGlh4onCATQRN9el4Gx41Mx_TZWH0HatzJ5eRfxxBpy_0QKhMi3U6s46JhXhTzsmU; path=/; expires=Tue, 25-Nov-25 10:35:10 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=J1H2NC_dYKCXaGmgSwM0Ahwl.9DTCQXtQRfhU.LqfQI-1764065110860-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Cf-Cache-Status: MISS -Gitlab-Lb: haproxy-main-08-lb-gprd -X-Page: 1 -Cache-Control: max-age=0, private, must-revalidate -Link: ; rel="next", ; rel="first", ; rel="last" -Strict-Transport-Security: max-age=31536000 -Vary: Origin, Accept-Encoding -X-Next-Page: 2 -X-Prev-Page: - -[{"id":435564587,"iid":2,"project_id":61363672,"title":"Test/parsing","description":"Simillar to !1 this solves an issue.","state":"opened","created_at":"2025-11-25T09:48:20.259Z","updated_at":"2025-11-25T09:48:21.627Z","web_url":"https://gitlab.com/forgejo/test_repo/-/merge_requests/2"}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%3Fpage=1&per_page=2&view=simple b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%3Fpage=1&per_page=2&view=simple index 49b8a01c33..e928372280 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%3Fpage=1&per_page=2&view=simple +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmerge_requests%3Fpage=1&per_page=2&view=simple @@ -1,30 +1,27 @@ +Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"890cf8ae2716f07ebfd15e1c459084c7" +Gitlab-Lb: haproxy-main-55-lb-gprd +Gitlab-Sv: api-gke-us-east1-b +Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 22 +Ratelimit-Remaining: 1978 +Ratelimit-Reset: 1771055640 Referrer-Policy: strict-origin-when-cross-origin -Gitlab-Sv: api-gke-us-east1-c +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN X-Next-Page: X-Page: 1 X-Per-Page: 2 -Link: ; rel="first", ; rel="last" -Ratelimit-Remaining: 1980 -X-Runtime: 0.087096 -X-Total-Pages: 1 -Cache-Control: max-age=0, private, must-revalidate -Strict-Transport-Security: max-age=31536000 -Ratelimit-Observed: 20 -Set-Cookie: __cf_bm=oXDIvscgtcgX.J4BQH6gVUnRcpqDCIxXtIW88H5GkeE-1764067244-1.0.1.1-MRMb6HL_mAeWU7TOSknLwTRt2Vci4So1emQBn4uV6PvsIL4KAA7mEHa7wQYT0M6iXAH7ZrZz9R2cQT9cOsKuj_dxehLZHXdKGWA2H9sXINM; path=/; expires=Tue, 25-Nov-25 11:10:44 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=sto9ErHOck8xfsNxjLefx9wVTcqi24bVZV4T.w0DQSw-1764067244372-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Content-Type: application/json -Vary: Origin, Accept-Encoding -Ratelimit-Limit: 2000 -Ratelimit-Name: throttle_authenticated_api -Ratelimit-Reset: 1764067260 -Cf-Cache-Status: MISS -Content-Security-Policy: default-src 'none' -Gitlab-Lb: haproxy-main-32-lb-gprd -X-Gitlab-Meta: {"correlation_id":"9a408793e7bfe0d9-ATL","version":"1"} -X-Total: 2 -Etag: W/"890cf8ae2716f07ebfd15e1c459084c7" -X-Frame-Options: SAMEORIGIN X-Prev-Page: +X-Runtime: 0.127936 +X-Total: 2 +X-Total-Pages: 1 [{"id":435564587,"iid":2,"project_id":61363672,"title":"Test/parsing","description":"Simillar to !1 this solves an issue.","state":"opened","created_at":"2025-11-25T09:48:20.259Z","updated_at":"2025-11-25T09:48:21.627Z","web_url":"https://gitlab.com/forgejo/test_repo/-/merge_requests/2"},{"id":324657888,"iid":1,"project_id":61363672,"title":"Test branch","description":"do not merge this PR","state":"opened","created_at":"2024-09-03T07:57:19.866Z","updated_at":"2024-09-03T18:50:21.065Z","web_url":"https://gitlab.com/forgejo/test_repo/-/merge_requests/1"}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmilestones%3Fpage=1&per_page=100&state=all b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmilestones%3Fpage=1&per_page=100&state=all index 5583057266..8d10968741 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmilestones%3Fpage=1&per_page=100&state=all +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Fmilestones%3Fpage=1&per_page=100&state=all @@ -1,30 +1,27 @@ -Gitlab-Sv: api-gke-us-east1-c -X-Page: 1 -X-Per-Page: 100 -Cf-Cache-Status: MISS Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"a42f286b703ec341ad7f117b273a51ad" +Gitlab-Lb: haproxy-main-32-lb-gprd +Gitlab-Sv: api-gke-us-east1-c +Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 5 +Ratelimit-Remaining: 1995 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Next-Page: +X-Page: 1 +X-Per-Page: 100 X-Prev-Page: -Set-Cookie: __cf_bm=_41Rh9aSyGsrVkscA.pV8yzJ4_ETNn9QF0Ag5uOwFqM-1764067238-1.0.1.1-bznJbf8viMS6FKcHE5lHz3uctOWh26FtF1avZuq328MUfmiD9DR0UYeWy900ArfK2i6mhadZCuvjqSl5V4hfYb3ndX30EH36gtJnzrDm11I; path=/; expires=Tue, 25-Nov-25 11:10:38 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=rCL0Wxxs.PKqgYyWaT19PeP_2uBvc11akIdy0Wt8f7A-1764067238959-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Content-Type: application/json -Gitlab-Lb: haproxy-main-08-lb-gprd -Ratelimit-Observed: 5 -Referrer-Policy: strict-origin-when-cross-origin -Etag: W/"a42f286b703ec341ad7f117b273a51ad" -Strict-Transport-Security: max-age=31536000 -Ratelimit-Limit: 2000 +X-Runtime: 0.117952 X-Total: 2 -Ratelimit-Remaining: 1995 -Ratelimit-Reset: 1764067260 -X-Gitlab-Meta: {"correlation_id":"9a40876f5056e0d9-ATL","version":"1"} -X-Content-Type-Options: nosniff -X-Runtime: 0.490074 X-Total-Pages: 1 -Link: ; rel="first", ; rel="last" -Vary: Origin, Accept-Encoding -Ratelimit-Name: throttle_authenticated_api -Content-Security-Policy: default-src 'none' [{"id":4711993,"iid":2,"project_id":61363672,"title":"1.0.0","description":"","state":"closed","created_at":"2024-09-03T13:53:08.516Z","updated_at":"2024-09-03T20:03:57.786Z","due_date":null,"start_date":null,"expired":false,"web_url":"https://gitlab.com/forgejo/test_repo/-/milestones/2"},{"id":4711991,"iid":1,"project_id":61363672,"title":"1.1.0","description":"","state":"active","created_at":"2024-09-03T13:52:48.414Z","updated_at":"2024-09-03T14:52:14.093Z","due_date":null,"start_date":null,"expired":false,"web_url":"https://gitlab.com/forgejo/test_repo/-/milestones/1"}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Freleases%3Fpage=1&per_page=100 b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Freleases%3Fpage=1&per_page=100 index 69147618ed..193e78630e 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Freleases%3Fpage=1&per_page=100 +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2F61363672%2Freleases%3Fpage=1&per_page=100 @@ -1,30 +1,27 @@ -Etag: W/"8e9bc910bda56a48f88c6b10688d08e9" -X-Frame-Options: SAMEORIGIN -Set-Cookie: __cf_bm=IqmyzMHjnUzan7uwUHFl.h_L2KH2gn3oinFwKn.ohxw-1764067239-1.0.1.1-U49Lfd8o3XxxNn6s4NaaBb6IVSBNE6qZIXrgjggwzM6hh_Y3AMRrXPgR.cYt2JjjBfysZfQXaB5iC5HN8VZ_KefSkjWzKZTI11._lwVsze8; path=/; expires=Tue, 25-Nov-25 11:10:39 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=bimDaLUdNYksl6173_Be3EXR5YSZBCDuUSR5YDEQP8s-1764067239812-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None Cache-Control: max-age=0, private, must-revalidate -Gitlab-Lb: haproxy-main-01-lb-gprd -Ratelimit-Name: throttle_authenticated_api -X-Total-Pages: 1 Cf-Cache-Status: MISS -Strict-Transport-Security: max-age=31536000 Content-Security-Policy: default-src 'none' -Referrer-Policy: strict-origin-when-cross-origin -Ratelimit-Reset: 1764067260 -X-Prev-Page: -Vary: Origin, Accept-Encoding -X-Gitlab-Meta: {"correlation_id":"9a4087774774e0d9-ATL","version":"1"} -X-Per-Page: 100 Content-Type: application/json +Etag: W/"fc79a561cf4910ed7107f242a4561dab" +Gitlab-Lb: haproxy-main-40-lb-gprd Gitlab-Sv: api-gke-us-east1-b Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api Ratelimit-Observed: 7 +Ratelimit-Remaining: 1993 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN X-Next-Page: X-Page: 1 -X-Runtime: 0.099947 -Ratelimit-Limit: 2000 -Ratelimit-Remaining: 1993 +X-Per-Page: 100 +X-Prev-Page: +X-Runtime: 0.113045 X-Total: 1 +X-Total-Pages: 1 -[{"name":"First Release","tag_name":"v0.9.99","description":"A test release","created_at":"2024-09-03T15:01:01.513Z","released_at":"2024-09-03T15:01:01.000Z","upcoming_release":false,"author":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"commit":{"id":"0720a3ec57c1f843568298117b874319e7deee75","short_id":"0720a3ec","created_at":"2019-11-28T08:49:16.000+00:00","parent_ids":["93ea21ce45d35690c35e80961d239645139e872c"],"title":"Add new file","message":"Add new file","author_name":"Lauris BH","author_email":"lauris@nix.lv","authored_date":"2019-11-28T08:49:16.000+00:00","committer_name":"Lauris BH","committer_email":"lauris@nix.lv","committed_date":"2019-11-28T08:49:16.000+00:00","trailers":{},"extended_trailers":{},"web_url":"https://gitlab.com/forgejo/test_repo/-/commit/0720a3ec57c1f843568298117b874319e7deee75"},"commit_path":"/forgejo/test_repo/-/commit/0720a3ec57c1f843568298117b874319e7deee75","tag_path":"/forgejo/test_repo/-/tags/v0.9.99","assets":{"count":4,"sources":[{"format":"zip","url":"https://gitlab.com/forgejo/test_repo/-/archive/v0.9.99/test_repo-v0.9.99.zip"},{"format":"tar.gz","url":"https://gitlab.com/forgejo/test_repo/-/archive/v0.9.99/test_repo-v0.9.99.tar.gz"},{"format":"tar.bz2","url":"https://gitlab.com/forgejo/test_repo/-/archive/v0.9.99/test_repo-v0.9.99.tar.bz2"},{"format":"tar","url":"https://gitlab.com/forgejo/test_repo/-/archive/v0.9.99/test_repo-v0.9.99.tar"}],"links":[]},"evidences":[{"sha":"e30c1d21d05ff0c73436ee1e97b3ef12a1d6d33d0dcd","filepath":"https://gitlab.com/forgejo/test_repo/-/releases/v0.9.99/evidences/9608487.json","collected_at":"2024-09-03T15:01:02.963Z"}],"_links":{"closed_issues_url":"https://gitlab.com/forgejo/test_repo/-/issues?release_tag=v0.9.99\u0026scope=all\u0026state=closed","closed_merge_requests_url":"https://gitlab.com/forgejo/test_repo/-/merge_requests?release_tag=v0.9.99\u0026scope=all\u0026state=closed","edit_url":"https://gitlab.com/forgejo/test_repo/-/releases/v0.9.99/edit","merged_merge_requests_url":"https://gitlab.com/forgejo/test_repo/-/merge_requests?release_tag=v0.9.99\u0026scope=all\u0026state=merged","opened_issues_url":"https://gitlab.com/forgejo/test_repo/-/issues?release_tag=v0.9.99\u0026scope=all\u0026state=opened","opened_merge_requests_url":"https://gitlab.com/forgejo/test_repo/-/merge_requests?release_tag=v0.9.99\u0026scope=all\u0026state=opened","self":"https://gitlab.com/forgejo/test_repo/-/releases/v0.9.99"}}] \ No newline at end of file +[{"name":"First Release","tag_name":"v0.9.99","description":"A test release","created_at":"2024-09-03T15:01:01.513Z","released_at":"2024-09-03T15:01:01.000Z","upcoming_release":false,"author":{"id":548513,"username":"mkobel","public_email":"","name":"Moritz Kobel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/eae1be6324682816aedc885acbf5858719b40956e0278edabe5c0db7cbc95f3b?s=80\u0026d=identicon","web_url":"https://gitlab.com/mkobel"},"commit":{"id":"0720a3ec57c1f843568298117b874319e7deee75","short_id":"0720a3ec","created_at":"2019-11-28T08:49:16.000+00:00","parent_ids":["93ea21ce45d35690c35e80961d239645139e872c"],"title":"Add new file","message":"Add new file","author_name":"Lauris BH","author_email":"lauris@nix.lv","authored_date":"2019-11-28T08:49:16.000+00:00","committer_name":"Lauris BH","committer_email":"lauris@nix.lv","committed_date":"2019-11-28T08:49:16.000+00:00","trailers":{},"extended_trailers":{},"web_url":"https://gitlab.com/forgejo/test_repo/-/commit/0720a3ec57c1f843568298117b874319e7deee75"},"commit_path":"/forgejo/test_repo/-/commit/0720a3ec57c1f843568298117b874319e7deee75","tag_path":"/forgejo/test_repo/-/tags/v0.9.99","assets":{"count":10,"sources":[{"format":"zip","url":"https://gitlab.com/forgejo/test_repo/-/archive/v0.9.99/test_repo-v0.9.99.zip"},{"format":"tar.gz","url":"https://gitlab.com/forgejo/test_repo/-/archive/v0.9.99/test_repo-v0.9.99.tar.gz"},{"format":"tar.bz2","url":"https://gitlab.com/forgejo/test_repo/-/archive/v0.9.99/test_repo-v0.9.99.tar.bz2"},{"format":"tar","url":"https://gitlab.com/forgejo/test_repo/-/archive/v0.9.99/test_repo-v0.9.99.tar"}],"links":[{"id":10694714,"name":"Forgejo logo","url":"https://gitlab.com/-/project/61363672/uploads/3756af8a4893bea08b99536df000e932/image.png","direct_asset_url":"https://gitlab.com/forgejo/test_repo/-/releases/v0.9.99/downloads/forgejo.png","link_type":"other"},{"id":10687293,"name":"zip (other)","url":"https://gitlab.com/forgejo/test_repo/-/archive/v0.9.99/test_repo-v0.9.99.zip","direct_asset_url":"https://gitlab.com/forgejo/test_repo/-/archive/v0.9.99/test_repo-v0.9.99.zip","link_type":"other"},{"id":10687292,"name":"Forgejo","url":"https://forgejo.org/","direct_asset_url":"https://forgejo.org/","link_type":"other"},{"id":10687291,"name":"Frogejo 🐸","url":"https://frogejo.org/","direct_asset_url":"https://frogejo.org/","link_type":"image"},{"id":10687290,"name":"tar.bz2 (runbook)","url":"https://gitlab.com/forgejo/test_repo/-/archive/v0.9.99/test_repo-v0.9.99.tar.bz2","direct_asset_url":"https://gitlab.com/forgejo/test_repo/-/archive/v0.9.99/test_repo-v0.9.99.tar.bz2","link_type":"runbook"},{"id":10687289,"name":"tar.gz (package)","url":"https://gitlab.com/forgejo/test_repo/-/archive/v0.9.99/test_repo-v0.9.99.tar.gz","direct_asset_url":"https://gitlab.com/forgejo/test_repo/-/archive/v0.9.99/test_repo-v0.9.99.tar.gz","link_type":"package"}]},"evidences":[{"sha":"e30c1d21d05ff0c73436ee1e97b3ef12a1d6d33d0dcd","filepath":"https://gitlab.com/forgejo/test_repo/-/releases/v0.9.99/evidences/9608487.json","collected_at":"2024-09-03T15:01:02.963Z"}],"_links":{"closed_issues_url":"https://gitlab.com/forgejo/test_repo/-/issues?release_tag=v0.9.99\u0026scope=all\u0026state=closed","closed_merge_requests_url":"https://gitlab.com/forgejo/test_repo/-/merge_requests?release_tag=v0.9.99\u0026scope=all\u0026state=closed","edit_url":"https://gitlab.com/forgejo/test_repo/-/releases/v0.9.99/edit","merged_merge_requests_url":"https://gitlab.com/forgejo/test_repo/-/merge_requests?release_tag=v0.9.99\u0026scope=all\u0026state=merged","opened_issues_url":"https://gitlab.com/forgejo/test_repo/-/issues?release_tag=v0.9.99\u0026scope=all\u0026state=opened","opened_merge_requests_url":"https://gitlab.com/forgejo/test_repo/-/merge_requests?release_tag=v0.9.99\u0026scope=all\u0026state=opened","self":"https://gitlab.com/forgejo/test_repo/-/releases/v0.9.99"}}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2Fforgejo%252Ftest_repo b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2Fforgejo%252Ftest_repo index b9f3b5883c..d5c617521b 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2Fforgejo%252Ftest_repo +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2Fforgejo%252Ftest_repo @@ -1,23 +1,20 @@ -X-Runtime: 0.171155 -Etag: W/"c77cec95a47ea2b28a897b9b9eaaf641" -Strict-Transport-Security: max-age=31536000 -Vary: Origin, Accept-Encoding -Gitlab-Lb: haproxy-main-15-lb-gprd -Ratelimit-Remaining: 1998 -Ratelimit-Reset: 1764067260 -X-Gitlab-Meta: {"correlation_id":"9a4087681127e0d9-ATL","version":"1"} -Content-Type: application/json Cache-Control: max-age=0, private, must-revalidate -Ratelimit-Limit: 2000 -Ratelimit-Observed: 2 -X-Content-Type-Options: nosniff Cf-Cache-Status: MISS Content-Security-Policy: default-src 'none' -Gitlab-Sv: api-gke-us-east1-d +Content-Type: application/json +Etag: W/"c121b3a20c1098563adf329ff75151ef" +Gitlab-Lb: haproxy-main-50-lb-gprd +Gitlab-Sv: api-gke-us-east1-c +Ratelimit-Limit: 2000 Ratelimit-Name: throttle_authenticated_api -X-Frame-Options: SAMEORIGIN -Set-Cookie: __cf_bm=ewgZYYeSboiRyGpVTDdPSVDfQthTkGsdCdZ98QAfFxg-1764067237-1.0.1.1-BpQ7IOgWJuKrJMmIUiu_2cbPWhTpSIXcC7t33gKB2xDwnlymfMCkCOBlDVT.dPN4HFT1_6NaM9LC2vHEe.kYzUnW9T5U6aySrghgvKuops0; path=/; expires=Tue, 25-Nov-25 11:10:37 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=vtpk1JkIE1jJ1yKC2ZDs1gmNCGXsPbWYHO.qSKcyAYc-1764067237452-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None +Ratelimit-Observed: 2 +Ratelimit-Remaining: 1998 +Ratelimit-Reset: 1771085820 Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Runtime: 0.160512 -{"id":61363672,"description":"Test repository for testing migration from gitlab to forgejo","name":"test_repo","name_with_namespace":"Forgejo / test_repo","path":"test_repo","path_with_namespace":"forgejo/test_repo","created_at":"2024-09-03T07:44:30.668Z","default_branch":"master","tag_list":["migration","test"],"topics":["migration","test"],"ssh_url_to_repo":"git@gitlab.com:forgejo/test_repo.git","http_url_to_repo":"https://gitlab.com/forgejo/test_repo.git","web_url":"https://gitlab.com/forgejo/test_repo","readme_url":"https://gitlab.com/forgejo/test_repo/-/blob/master/README.md","forks_count":0,"avatar_url":null,"star_count":0,"last_activity_at":"2025-11-25T09:03:01.001Z","visibility":"public","namespace":{"id":64459497,"name":"Forgejo","path":"forgejo","kind":"group","full_path":"forgejo","parent_id":null,"avatar_url":"/uploads/-/system/group/avatar/64459497/73144-c883a242dec5299fbc06bbe3ee71d8c6.png","web_url":"https://gitlab.com/groups/forgejo"},"forked_from_project":{"id":15578026,"description":"Test repository for testing migration from gitlab to gitea","name":"test_repo","name_with_namespace":"gitea / test_repo","path":"test_repo","path_with_namespace":"gitea/test_repo","created_at":"2019-11-28T08:20:33.019Z","default_branch":"master","tag_list":["migration","test"],"topics":["migration","test"],"ssh_url_to_repo":"git@gitlab.com:gitea/test_repo.git","http_url_to_repo":"https://gitlab.com/gitea/test_repo.git","web_url":"https://gitlab.com/gitea/test_repo","readme_url":"https://gitlab.com/gitea/test_repo/-/blob/master/README.md","forks_count":2,"avatar_url":null,"star_count":0,"last_activity_at":"2025-11-25T09:21:43.130Z","visibility":"public","namespace":{"id":3181312,"name":"gitea","path":"gitea","kind":"group","full_path":"gitea","parent_id":null,"avatar_url":"/uploads/-/system/group/avatar/3181312/gitea.png","web_url":"https://gitlab.com/groups/gitea"}},"container_registry_image_prefix":"registry.gitlab.com/forgejo/test_repo","_links":{"self":"https://gitlab.com/api/v4/projects/61363672","issues":"https://gitlab.com/api/v4/projects/61363672/issues","merge_requests":"https://gitlab.com/api/v4/projects/61363672/merge_requests","repo_branches":"https://gitlab.com/api/v4/projects/61363672/repository/branches","labels":"https://gitlab.com/api/v4/projects/61363672/labels","events":"https://gitlab.com/api/v4/projects/61363672/events","members":"https://gitlab.com/api/v4/projects/61363672/members","cluster_agents":"https://gitlab.com/api/v4/projects/61363672/cluster_agents"},"marked_for_deletion_at":null,"marked_for_deletion_on":null,"packages_enabled":true,"empty_repo":false,"archived":false,"resolve_outdated_diff_discussions":false,"container_expiration_policy":{"cadence":"1d","enabled":false,"keep_n":10,"older_than":"90d","name_regex":".*","name_regex_keep":null,"next_run_at":"2024-09-04T07:44:30.699Z"},"repository_object_format":"sha1","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"jobs_enabled":true,"snippets_enabled":true,"container_registry_enabled":true,"service_desk_enabled":true,"service_desk_address":"contact-project+forgejo-test-repo-61363672-issue-@incoming.gitlab.com","can_create_merge_request_in":true,"issues_access_level":"enabled","repository_access_level":"enabled","merge_requests_access_level":"enabled","forking_access_level":"enabled","wiki_access_level":"enabled","builds_access_level":"enabled","snippets_access_level":"enabled","pages_access_level":"enabled","analytics_access_level":"enabled","container_registry_access_level":"enabled","security_and_compliance_access_level":"private","releases_access_level":"enabled","environments_access_level":"enabled","feature_flags_access_level":"enabled","infrastructure_access_level":"enabled","monitor_access_level":"enabled","model_experiments_access_level":"enabled","model_registry_access_level":"enabled","package_registry_access_level":"public","emails_disabled":false,"emails_enabled":true,"show_diff_preview_in_email":true,"shared_runners_enabled":true,"lfs_enabled":true,"creator_id":2005797,"mr_default_target_self":false,"import_url":null,"import_type":null,"import_status":"finished","import_error":null,"open_issues_count":1,"description_html":"\u003cp data-sourcepos=\"1:1-1:60\" dir=\"auto\"\u003eTest repository for testing migration from gitlab to forgejo\u003c/p\u003e","updated_at":"2025-11-25T09:21:03.121Z","ci_default_git_depth":50,"ci_delete_pipelines_in_seconds":null,"ci_forward_deployment_enabled":true,"ci_forward_deployment_rollback_allowed":true,"ci_job_token_scope_enabled":false,"ci_separated_caches":true,"ci_allow_fork_pipelines_to_run_in_parent_project":true,"ci_id_token_sub_claim_components":["project_path","ref_type","ref"],"build_git_strategy":"fetch","keep_latest_artifact":true,"restrict_user_defined_variables":false,"ci_pipeline_variables_minimum_override_role":"developer","runner_token_expiration_interval":null,"group_runners_enabled":true,"resource_group_default_process_mode":"unordered","auto_cancel_pending_pipelines":"enabled","build_timeout":3600,"auto_devops_enabled":false,"auto_devops_deploy_strategy":"continuous","ci_push_repository_for_job_token_allowed":false,"ci_config_path":null,"public_jobs":true,"shared_with_groups":[],"only_allow_merge_if_pipeline_succeeds":false,"allow_merge_on_skipped_pipeline":null,"request_access_enabled":true,"only_allow_merge_if_all_discussions_are_resolved":false,"remove_source_branch_after_merge":true,"printing_merge_request_link_enabled":true,"merge_method":"merge","merge_request_title_regex":null,"merge_request_title_regex_description":null,"squash_option":"default_off","enforce_auth_checks_on_uploads":true,"suggestion_commit_message":null,"merge_commit_template":null,"squash_commit_template":null,"issue_branch_template":null,"warn_about_potentially_unwanted_characters":true,"autoclose_referenced_issues":true,"max_artifacts_size":null,"external_authorization_classification_label":"","requirements_enabled":false,"requirements_access_level":"enabled","security_and_compliance_enabled":true,"compliance_frameworks":[],"duo_remote_flows_enabled":true,"duo_foundational_flows_enabled":false,"web_based_commit_signing_enabled":false,"permissions":{"project_access":{"access_level":40,"notification_level":3},"group_access":null}} \ No newline at end of file +{"id":61363672,"description":"Test repository for testing migration from gitlab to forgejo","name":"test_repo","name_with_namespace":"Forgejo / test_repo","path":"test_repo","path_with_namespace":"forgejo/test_repo","created_at":"2024-09-03T07:44:30.668Z","default_branch":"master","tag_list":["migration","migration test","test"],"topics":["migration","migration test","test"],"ssh_url_to_repo":"git@gitlab.com:forgejo/test_repo.git","http_url_to_repo":"https://gitlab.com/forgejo/test_repo.git","web_url":"https://gitlab.com/forgejo/test_repo","readme_url":"https://gitlab.com/forgejo/test_repo/-/blob/master/README.md","forks_count":0,"avatar_url":null,"star_count":0,"last_activity_at":"2026-02-13T20:46:12.772Z","visibility":"public","namespace":{"id":64459497,"name":"Forgejo","path":"forgejo","kind":"group","full_path":"forgejo","parent_id":null,"avatar_url":"/uploads/-/system/group/avatar/64459497/73144-c883a242dec5299fbc06bbe3ee71d8c6.png","web_url":"https://gitlab.com/groups/forgejo"},"container_registry_image_prefix":"registry.gitlab.com/forgejo/test_repo","_links":{"self":"https://gitlab.com/api/v4/projects/61363672","issues":"https://gitlab.com/api/v4/projects/61363672/issues","merge_requests":"https://gitlab.com/api/v4/projects/61363672/merge_requests","repo_branches":"https://gitlab.com/api/v4/projects/61363672/repository/branches","labels":"https://gitlab.com/api/v4/projects/61363672/labels","events":"https://gitlab.com/api/v4/projects/61363672/events","members":"https://gitlab.com/api/v4/projects/61363672/members","cluster_agents":"https://gitlab.com/api/v4/projects/61363672/cluster_agents"},"marked_for_deletion_at":null,"marked_for_deletion_on":null,"packages_enabled":true,"empty_repo":false,"archived":true,"resolve_outdated_diff_discussions":false,"container_expiration_policy":{"cadence":"1d","enabled":false,"keep_n":10,"older_than":"90d","name_regex":".*","name_regex_keep":null,"next_run_at":"2024-09-04T07:44:30.699Z"},"repository_object_format":"sha1","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"jobs_enabled":true,"snippets_enabled":true,"container_registry_enabled":true,"service_desk_enabled":true,"can_create_merge_request_in":false,"issues_access_level":"enabled","repository_access_level":"enabled","merge_requests_access_level":"enabled","forking_access_level":"enabled","wiki_access_level":"enabled","builds_access_level":"enabled","snippets_access_level":"enabled","pages_access_level":"enabled","analytics_access_level":"enabled","container_registry_access_level":"enabled","security_and_compliance_access_level":"private","releases_access_level":"enabled","environments_access_level":"enabled","feature_flags_access_level":"enabled","infrastructure_access_level":"enabled","monitor_access_level":"enabled","model_experiments_access_level":"enabled","model_registry_access_level":"enabled","package_registry_access_level":"public","emails_disabled":false,"emails_enabled":true,"show_diff_preview_in_email":true,"shared_runners_enabled":true,"lfs_enabled":true,"creator_id":2005797,"import_url":null,"import_type":null,"import_status":"finished","import_error":null,"open_issues_count":2,"description_html":"\u003cp data-sourcepos=\"1:1-1:60\" dir=\"auto\"\u003eTest repository for testing migration from gitlab to forgejo\u003c/p\u003e","updated_at":"2026-02-14T16:16:08.902Z","ci_default_git_depth":50,"ci_delete_pipelines_in_seconds":null,"ci_forward_deployment_enabled":true,"ci_forward_deployment_rollback_allowed":true,"ci_job_token_scope_enabled":false,"ci_separated_caches":true,"ci_allow_fork_pipelines_to_run_in_parent_project":true,"ci_id_token_sub_claim_components":["project_path","ref_type","ref"],"build_git_strategy":"fetch","keep_latest_artifact":true,"restrict_user_defined_variables":false,"ci_pipeline_variables_minimum_override_role":"developer","runner_token_expiration_interval":null,"group_runners_enabled":true,"resource_group_default_process_mode":"unordered","auto_cancel_pending_pipelines":"enabled","build_timeout":3600,"auto_devops_enabled":false,"auto_devops_deploy_strategy":"continuous","ci_push_repository_for_job_token_allowed":false,"ci_config_path":null,"public_jobs":true,"shared_with_groups":[],"only_allow_merge_if_pipeline_succeeds":false,"allow_merge_on_skipped_pipeline":null,"request_access_enabled":true,"only_allow_merge_if_all_discussions_are_resolved":false,"remove_source_branch_after_merge":true,"printing_merge_request_link_enabled":true,"merge_method":"merge","merge_request_title_regex":null,"merge_request_title_regex_description":null,"squash_option":"default_off","enforce_auth_checks_on_uploads":true,"suggestion_commit_message":null,"merge_commit_template":null,"squash_commit_template":null,"issue_branch_template":null,"warn_about_potentially_unwanted_characters":true,"autoclose_referenced_issues":true,"max_artifacts_size":null,"external_authorization_classification_label":"","requirements_enabled":false,"requirements_access_level":"enabled","security_and_compliance_enabled":true,"compliance_frameworks":[],"duo_remote_flows_enabled":true,"duo_foundational_flows_enabled":true,"web_based_commit_signing_enabled":false,"permissions":{"project_access":null,"group_access":{"access_level":50,"notification_level":3}}} \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2Fgitea%252Ftest_repo b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2Fgitea%252Ftest_repo deleted file mode 100644 index 96f1ea86b5..0000000000 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fprojects%2Fgitea%252Ftest_repo +++ /dev/null @@ -1,17 +0,0 @@ -Referrer-Policy: strict-origin-when-cross-origin -Gitlab-Lb: haproxy-main-51-lb-gprd -Cf-Cache-Status: MISS -Etag: W/"8db4917b3be5f4ca0d101a702179b75a" -X-Content-Type-Options: nosniff -Strict-Transport-Security: max-age=31536000 -Gitlab-Sv: api-gke-us-east1-b -Content-Type: application/json -Cache-Control: max-age=0, private, must-revalidate -X-Gitlab-Meta: {"correlation_id":"9b3859cf6d73ce5de261a56d286072a5","version":"1"} -X-Runtime: 0.119487 -Content-Security-Policy: default-src 'none' -Vary: Origin, Accept-Encoding -Set-Cookie: _cfuvid=Cmc.ycVkdwA_tBvmR2tOVLQ5B.khzzU39ZUxgf4RNlw-1710504204838-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -X-Frame-Options: SAMEORIGIN - -{"id":15578026,"description":"Test repository for testing migration from gitlab to gitea","name":"test_repo","name_with_namespace":"gitea / test_repo","path":"test_repo","path_with_namespace":"gitea/test_repo","created_at":"2019-11-28T08:20:33.019Z","default_branch":"master","tag_list":["migration","test"],"topics":["migration","test"],"ssh_url_to_repo":"git@gitlab.com:gitea/test_repo.git","http_url_to_repo":"https://gitlab.com/gitea/test_repo.git","web_url":"https://gitlab.com/gitea/test_repo","readme_url":"https://gitlab.com/gitea/test_repo/-/blob/master/README.md","forks_count":1,"avatar_url":null,"star_count":0,"last_activity_at":"2020-04-19T19:46:04.527Z","namespace":{"id":3181312,"name":"gitea","path":"gitea","kind":"group","full_path":"gitea","parent_id":null,"avatar_url":"/uploads/-/system/group/avatar/3181312/gitea.png","web_url":"https://gitlab.com/groups/gitea"},"container_registry_image_prefix":"registry.gitlab.com/gitea/test_repo","_links":{"self":"https://gitlab.com/api/v4/projects/15578026","issues":"https://gitlab.com/api/v4/projects/15578026/issues","merge_requests":"https://gitlab.com/api/v4/projects/15578026/merge_requests","repo_branches":"https://gitlab.com/api/v4/projects/15578026/repository/branches","labels":"https://gitlab.com/api/v4/projects/15578026/labels","events":"https://gitlab.com/api/v4/projects/15578026/events","members":"https://gitlab.com/api/v4/projects/15578026/members","cluster_agents":"https://gitlab.com/api/v4/projects/15578026/cluster_agents"},"packages_enabled":true,"empty_repo":false,"archived":false,"visibility":"public","resolve_outdated_diff_discussions":false,"repository_object_format":"sha1","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"jobs_enabled":true,"snippets_enabled":true,"container_registry_enabled":true,"service_desk_enabled":true,"can_create_merge_request_in":true,"issues_access_level":"enabled","repository_access_level":"enabled","merge_requests_access_level":"enabled","forking_access_level":"enabled","wiki_access_level":"enabled","builds_access_level":"enabled","snippets_access_level":"enabled","pages_access_level":"enabled","analytics_access_level":"enabled","container_registry_access_level":"enabled","security_and_compliance_access_level":"private","releases_access_level":"enabled","environments_access_level":"enabled","feature_flags_access_level":"enabled","infrastructure_access_level":"enabled","monitor_access_level":"enabled","model_experiments_access_level":"enabled","model_registry_access_level":"enabled","emails_disabled":false,"emails_enabled":true,"shared_runners_enabled":true,"lfs_enabled":true,"creator_id":1241334,"import_status":"none","open_issues_count":0,"description_html":"\u003cp data-sourcepos=\"1:1-1:58\" dir=\"auto\"\u003eTest repository for testing migration from gitlab to gitea\u003c/p\u003e","updated_at":"2024-01-11T01:23:21.057Z","ci_config_path":null,"public_jobs":true,"shared_with_groups":[],"only_allow_merge_if_pipeline_succeeds":false,"allow_merge_on_skipped_pipeline":null,"request_access_enabled":true,"only_allow_merge_if_all_discussions_are_resolved":false,"remove_source_branch_after_merge":true,"printing_merge_request_link_enabled":true,"merge_method":"ff","squash_option":"default_off","enforce_auth_checks_on_uploads":true,"suggestion_commit_message":null,"merge_commit_template":null,"squash_commit_template":null,"issue_branch_template":null,"warn_about_potentially_unwanted_characters":true,"autoclose_referenced_issues":true,"external_authorization_classification_label":"","requirements_enabled":false,"requirements_access_level":"enabled","security_and_compliance_enabled":false,"compliance_frameworks":[],"permissions":{"project_access":null,"group_access":null}} \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fversion b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fversion index 312161fafc..4a73d0774c 100644 --- a/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fversion +++ b/services/migrations/testdata/gitlab/full_download/GET_%2Fapi%2Fv4%2Fversion @@ -1,23 +1,20 @@ -Gitlab-Sv: api-gke-us-east1-c -Ratelimit-Name: throttle_authenticated_api -X-Content-Type-Options: nosniff Cache-Control: max-age=0, private, must-revalidate -Etag: W/"07cf63ed6ca527a8440305b235c1dbe6" -Vary: Origin, Accept-Encoding -Gitlab-Lb: haproxy-main-02-lb-gprd -X-Gitlab-Meta: {"correlation_id":"9a40876657b0e0d9-ATL","version":"1"} -Set-Cookie: __cf_bm=6UrvvT.eVACA2RNxuo3JgYQGOf87viAkfYl9Zk_E3A4-1764067237-1.0.1.1-Eq.xOoKXTaA91xlfvuNCFFzkpGifBiA41K8r8QGdw0f_sTr66SIHXtulqNIs7.A6aF8RcfB6owiKiV_rect7ubdVVRrKTWwxfHtaWvykTrI; path=/; expires=Tue, 25-Nov-25 11:10:37 GMT; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Set-Cookie: _cfuvid=NMsff2_I6aWniAT9LeJhCwEeMAfr8Wkjg5mYqJ06haU-1764067237046-0.0.1.1-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None Cf-Cache-Status: MISS -Strict-Transport-Security: max-age=31536000 -Ratelimit-Limit: 2000 -Ratelimit-Remaining: 1999 -Referrer-Policy: strict-origin-when-cross-origin Content-Security-Policy: default-src 'none' -Ratelimit-Observed: 1 -Ratelimit-Reset: 1764067260 -X-Frame-Options: SAMEORIGIN -X-Runtime: 0.051513 Content-Type: application/json +Etag: W/"eb8caeed3eb2f6feb10c7f2b9610d346" +Gitlab-Lb: haproxy-main-24-lb-gprd +Gitlab-Sv: api-gke-us-east1-d +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 1 +Ratelimit-Remaining: 1999 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Runtime: 0.054657 -{"version":"18.7.0-pre","revision":"6f8cf4c6c2b","kas":{"enabled":true,"externalUrl":"wss://kas.gitlab.com","externalK8sProxyUrl":"https://kas.gitlab.com/k8s-proxy","version":"18.7.0-rc1+5ca8be73a8685a5a9ab2baeb0d3ab7c455f9f819"},"enterprise":true} \ No newline at end of file +{"version":"18.9.0-pre","revision":"dde8b248bb9","kas":{"enabled":true,"externalUrl":"wss://kas.gitlab.com","externalK8sProxyUrl":"https://kas.gitlab.com/k8s-proxy","version":"18.9.0-rc1+f6b096ad1f478a35a7335ec9b905c1230fd27b4e"},"enterprise":true} \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996 b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996 deleted file mode 100644 index db8d596173..0000000000 --- a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996 +++ /dev/null @@ -1,22 +0,0 @@ -X-Runtime: 0.088022 -Strict-Transport-Security: max-age=31536000 -Ratelimit-Observed: 3 -Cache-Control: max-age=0, private, must-revalidate -Etag: W/"03ce4f6ce1c1e8c5a31df8a44cf2fbdd" -Gitlab-Lb: haproxy-main-11-lb-gprd -Content-Security-Policy: default-src 'none' -Ratelimit-Limit: 2000 -X-Gitlab-Meta: {"correlation_id":"b57b226f741f9140a1fea54f65cb5cfd","version":"1"} -Referrer-Policy: strict-origin-when-cross-origin -Ratelimit-Remaining: 1997 -Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:53 GMT -Set-Cookie: _cfuvid=V0ToiOTUW0XbtWq7BirwVNfL1_YP1POMrLBnDSEWS0M-1701332633965-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -Gitlab-Sv: localhost -Content-Type: application/json -Vary: Origin, Accept-Encoding -Ratelimit-Reset: 1701332693 -Cf-Cache-Status: MISS - -{"id":6590996,"description":"Arch packaging and build files","name":"archbuild","name_with_namespace":"Troy Engel / archbuild","path":"archbuild","path_with_namespace":"troyengel/archbuild","created_at":"2018-06-03T22:53:17.388Z","default_branch":"master","tag_list":[],"topics":[],"ssh_url_to_repo":"git@gitlab.com:troyengel/archbuild.git","http_url_to_repo":"https://gitlab.com/troyengel/archbuild.git","web_url":"https://gitlab.com/troyengel/archbuild","readme_url":"https://gitlab.com/troyengel/archbuild/-/blob/master/README.md","forks_count":0,"avatar_url":null,"star_count":0,"last_activity_at":"2020-12-13T18:09:32.071Z","namespace":{"id":1452515,"name":"Troy Engel","path":"troyengel","kind":"user","full_path":"troyengel","parent_id":null,"avatar_url":"https://secure.gravatar.com/avatar/b226c267929f1bcfcc446e75a025591c?s=80\u0026d=identicon","web_url":"https://gitlab.com/troyengel"},"container_registry_image_prefix":"registry.gitlab.com/troyengel/archbuild","_links":{"self":"https://gitlab.com/api/v4/projects/6590996","issues":"https://gitlab.com/api/v4/projects/6590996/issues","merge_requests":"https://gitlab.com/api/v4/projects/6590996/merge_requests","repo_branches":"https://gitlab.com/api/v4/projects/6590996/repository/branches","labels":"https://gitlab.com/api/v4/projects/6590996/labels","events":"https://gitlab.com/api/v4/projects/6590996/events","members":"https://gitlab.com/api/v4/projects/6590996/members","cluster_agents":"https://gitlab.com/api/v4/projects/6590996/cluster_agents"},"packages_enabled":null,"empty_repo":false,"archived":true,"visibility":"public","owner":{"id":1215848,"username":"troyengel","name":"Troy Engel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/b226c267929f1bcfcc446e75a025591c?s=80\u0026d=identicon","web_url":"https://gitlab.com/troyengel"},"resolve_outdated_diff_discussions":false,"issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"jobs_enabled":true,"snippets_enabled":true,"container_registry_enabled":true,"service_desk_enabled":true,"can_create_merge_request_in":false,"issues_access_level":"enabled","repository_access_level":"enabled","merge_requests_access_level":"enabled","forking_access_level":"enabled","wiki_access_level":"enabled","builds_access_level":"enabled","snippets_access_level":"enabled","pages_access_level":"enabled","analytics_access_level":"enabled","container_registry_access_level":"enabled","security_and_compliance_access_level":"private","releases_access_level":"enabled","environments_access_level":"enabled","feature_flags_access_level":"enabled","infrastructure_access_level":"enabled","monitor_access_level":"enabled","model_experiments_access_level":"enabled","emails_disabled":false,"emails_enabled":true,"shared_runners_enabled":true,"lfs_enabled":false,"creator_id":1215848,"import_status":"finished","open_issues_count":0,"description_html":"\u003cp data-sourcepos=\"1:1-1:30\" dir=\"auto\"\u003eArch packaging and build files\u003c/p\u003e","updated_at":"2022-07-13T21:32:12.624Z","ci_config_path":null,"public_jobs":true,"shared_with_groups":[],"only_allow_merge_if_pipeline_succeeds":false,"allow_merge_on_skipped_pipeline":null,"request_access_enabled":false,"only_allow_merge_if_all_discussions_are_resolved":false,"remove_source_branch_after_merge":null,"printing_merge_request_link_enabled":true,"merge_method":"merge","squash_option":"default_off","enforce_auth_checks_on_uploads":true,"suggestion_commit_message":null,"merge_commit_template":null,"squash_commit_template":null,"issue_branch_template":null,"autoclose_referenced_issues":true,"external_authorization_classification_label":"","requirements_enabled":false,"requirements_access_level":"enabled","security_and_compliance_enabled":false,"compliance_frameworks":[],"permissions":{"project_access":null,"group_access":null}} \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fissues%2F2%2Faward_emoji%3Fpage=1&per_page=10 b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fissues%2F2%2Faward_emoji%3Fpage=1&per_page=10 deleted file mode 100644 index 8f829d08f0..0000000000 --- a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fissues%2F2%2Faward_emoji%3Fpage=1&per_page=10 +++ /dev/null @@ -1,31 +0,0 @@ -Gitlab-Sv: localhost -X-Content-Type-Options: nosniff -Gitlab-Lb: haproxy-main-25-lb-gprd -X-Total-Pages: 1 -Referrer-Policy: strict-origin-when-cross-origin -Ratelimit-Observed: 5 -Ratelimit-Remaining: 1995 -Content-Security-Policy: default-src 'none' -X-Gitlab-Meta: {"correlation_id":"eeab46d836341bd4cb18e3d2e82abf97","version":"1"} -Ratelimit-Limit: 2000 -Accept-Ranges: bytes -Content-Type: application/json -X-Page: 1 -X-Frame-Options: SAMEORIGIN -X-Prev-Page: -Cf-Cache-Status: MISS -X-Total: 0 -Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:54 GMT -Link: ; rel="first", ; rel="last" -X-Per-Page: 10 -Set-Cookie: _cfuvid=c5HuTPxOuSXdHSuVrXQALS.uV7WvAYfc5Mc_143EAB8-1701332634513-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Content-Length: 2 -Vary: Origin, Accept-Encoding -Cache-Control: max-age=0, private, must-revalidate -Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" -X-Runtime: 0.069269 -Strict-Transport-Security: max-age=31536000 -Ratelimit-Reset: 1701332694 -X-Next-Page: - -[] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fissues%3Fpage=1&per_page=10&sort=asc&state=all b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fissues%3Fpage=1&per_page=10&sort=asc&state=all deleted file mode 100644 index 99133d5f8d..0000000000 --- a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fissues%3Fpage=1&per_page=10&sort=asc&state=all +++ /dev/null @@ -1,29 +0,0 @@ -Link: ; rel="first", ; rel="last" -Ratelimit-Observed: 4 -Ratelimit-Remaining: 1996 -Gitlab-Lb: haproxy-main-04-lb-gprd -Vary: Origin, Accept-Encoding -Content-Security-Policy: default-src 'none' -X-Next-Page: -Ratelimit-Reset: 1701332694 -Etag: W/"f50a70d0fc1465a289d231f80806ced7" -X-Gitlab-Meta: {"correlation_id":"47afd74254dd7946d2b2bded87448c60","version":"1"} -X-Page: 1 -X-Prev-Page: -Referrer-Policy: strict-origin-when-cross-origin -Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:54 GMT -Cf-Cache-Status: MISS -X-Total: 1 -X-Total-Pages: 1 -Strict-Transport-Security: max-age=31536000 -Content-Type: application/json -X-Frame-Options: SAMEORIGIN -Ratelimit-Limit: 2000 -Gitlab-Sv: localhost -Set-Cookie: _cfuvid=YDWTZ5VoSuLBDZgKsBnXMyYxz.0rHJ9TBYXv5zBj24Q-1701332634294-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Cache-Control: max-age=0, private, must-revalidate -X-Content-Type-Options: nosniff -X-Per-Page: 10 -X-Runtime: 0.179458 - -[{"id":11201348,"iid":2,"project_id":6590996,"title":"vpn unlimited errors","description":"updated version to 2.8.0, build and tried running `vpnu-arch`:\n\n```\nvpn-unlimited: /usr/lib/libcurl.so.3: no version information available (required by /usr/lib/libvpnu_rpc.so.1)\nvpn-unlimited: /usr/lib/libssl.so.1.0.0: no version information available (required by /usr/lib/libvpnu_enc.so.1)\nvpn-unlimited: symbol lookup error: /usr/lib/libvpnu_rpc.so.1: undefined symbol: _ZNK4Json5Value8asStringEv\n```\n","state":"closed","created_at":"2016-03-26T16:41:12.000Z","updated_at":"2016-03-27T12:19:27.000Z","closed_at":null,"closed_by":null,"labels":[],"milestone":null,"assignees":[],"author":{"id":10273,"username":"brauliobo","name":"Bráulio Bhavamitra","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/cd3fcb7a417c8acb989fc320b604a2a8?s=80\u0026d=identicon","web_url":"https://gitlab.com/brauliobo"},"type":"ISSUE","assignee":null,"user_notes_count":1,"merge_requests_count":0,"upvotes":0,"downvotes":0,"due_date":null,"confidential":false,"discussion_locked":null,"issue_type":"issue","web_url":"https://gitlab.com/troyengel/archbuild/-/issues/2","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"task_completion_status":{"count":0,"completed_count":0},"blocking_issues_count":0,"has_tasks":true,"task_status":"0 of 0 checklist items completed","_links":{"self":"https://gitlab.com/api/v4/projects/6590996/issues/2","notes":"https://gitlab.com/api/v4/projects/6590996/issues/2/notes","award_emoji":"https://gitlab.com/api/v4/projects/6590996/issues/2/award_emoji","project":"https://gitlab.com/api/v4/projects/6590996","closed_as_duplicate_of":null},"references":{"short":"#2","relative":"#2","full":"troyengel/archbuild#2"},"severity":"UNKNOWN","moved_to_id":null,"service_desk_reply_to":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fmerge_requests%2F1 b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fmerge_requests%2F1 deleted file mode 100644 index 18e8a8583f..0000000000 --- a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fmerge_requests%2F1 +++ /dev/null @@ -1,22 +0,0 @@ -Ratelimit-Observed: 7 -Set-Cookie: _cfuvid=_b9GQEo3CBPMs9QmGE89dBdOmbSTfnYjZlzValULQPs-1701332635000-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Strict-Transport-Security: max-age=31536000 -Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:54 GMT -Gitlab-Lb: haproxy-main-50-lb-gprd -Gitlab-Sv: localhost -X-Gitlab-Meta: {"correlation_id":"da44cd0303a4e62cc52ed8de3b2adf14","version":"1"} -Referrer-Policy: strict-origin-when-cross-origin -Ratelimit-Remaining: 1993 -Etag: W/"f6299e7e884cb8df8109256c086eb4e7" -X-Runtime: 0.107573 -Content-Type: application/json -Ratelimit-Reset: 1701332694 -X-Frame-Options: SAMEORIGIN -Cache-Control: max-age=0, private, must-revalidate -X-Content-Type-Options: nosniff -Ratelimit-Limit: 2000 -Cf-Cache-Status: MISS -Content-Security-Policy: default-src 'none' -Vary: Origin, Accept-Encoding - -{"id":10518914,"iid":1,"project_id":6590996,"title":"Review","description":"*Created by: cgtx*\n\n### remove patch from makedepends\n- patch is in base-devel\n- The group base-devel is assumed to be already installed when building with makepkg. Members of \"base-devel\" should not be included in makedepends arrays.\n- https://wiki.archlinux.org/index.php/Pkgbuild#makedepends\n### remove python2 from makedepends\n- python2 is a dependency of python2-setuptools. It is redundant to list it again.\n- You do not need to list packages that your software depends on if other packages your software depends on already have those packages listed in their dependency.\n- https://wiki.archlinux.org/index.php/Pkgbuild#depends\n### more simple find/delete command\n- just because\n","state":"merged","created_at":"2014-12-12T15:01:32.000Z","updated_at":"2014-12-12T15:28:38.000Z","merged_by":null,"merge_user":null,"merged_at":null,"closed_by":null,"closed_at":null,"target_branch":"master","source_branch":"cgtx:review","user_notes_count":1,"upvotes":0,"downvotes":0,"author":{"id":1215848,"username":"troyengel","name":"Troy Engel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/b226c267929f1bcfcc446e75a025591c?s=80\u0026d=identicon","web_url":"https://gitlab.com/troyengel"},"assignees":[],"assignee":null,"reviewers":[],"source_project_id":6590996,"target_project_id":6590996,"labels":[],"draft":false,"work_in_progress":false,"milestone":null,"merge_when_pipeline_succeeds":false,"merge_status":"cannot_be_merged","detailed_merge_status":"not_open","sha":"9006fee398299beed8f5d5086f8e6008ffc02280","merge_commit_sha":null,"squash_commit_sha":null,"discussion_locked":null,"should_remove_source_branch":null,"force_remove_source_branch":null,"prepared_at":"2014-12-12T15:01:32.000Z","reference":"!1","references":{"short":"!1","relative":"!1","full":"troyengel/archbuild!1"},"web_url":"https://gitlab.com/troyengel/archbuild/-/merge_requests/1","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"squash":false,"squash_on_merge":false,"task_completion_status":{"count":0,"completed_count":0},"has_conflicts":true,"blocking_discussions_resolved":true,"approvals_before_merge":null,"subscribed":false,"changes_count":"1","latest_build_started_at":null,"latest_build_finished_at":null,"first_deployed_to_production_at":null,"pipeline":null,"head_pipeline":null,"diff_refs":{"base_sha":"6edcf8fc09f6c44213c892f5108d34a5255a47e1","head_sha":"9006fee398299beed8f5d5086f8e6008ffc02280","start_sha":"6edcf8fc09f6c44213c892f5108d34a5255a47e1"},"merge_error":null,"first_contribution":false,"user":{"can_merge":false}} \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=1&per_page=10 b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=1&per_page=10 deleted file mode 100644 index d6f8dd4941..0000000000 --- a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=1&per_page=10 +++ /dev/null @@ -1,31 +0,0 @@ -Link: ; rel="first", ; rel="last" -Set-Cookie: _cfuvid=qK29tijoyp0AdVoHf9Lqjc8Y28h4jplJDW9hOFLfq28-1701332635229-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Cache-Control: max-age=0, private, must-revalidate -Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" -Ratelimit-Observed: 8 -Gitlab-Sv: localhost -Content-Length: 2 -Gitlab-Lb: haproxy-main-16-lb-gprd -X-Total: 0 -Ratelimit-Remaining: 1992 -Ratelimit-Reset: 1701332695 -Ratelimit-Limit: 2000 -Vary: Origin, Accept-Encoding -X-Frame-Options: SAMEORIGIN -Content-Type: application/json -X-Content-Type-Options: nosniff -X-Next-Page: -X-Page: 1 -Strict-Transport-Security: max-age=31536000 -Accept-Ranges: bytes -Content-Security-Policy: default-src 'none' -X-Per-Page: 10 -X-Total-Pages: 1 -Referrer-Policy: strict-origin-when-cross-origin -Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:55 GMT -Cf-Cache-Status: MISS -X-Gitlab-Meta: {"correlation_id":"eb59d63fed23cdbec69308570cc49c3e","version":"1"} -X-Runtime: 0.065972 -X-Prev-Page: - -[] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fmerge_requests%3Fpage=1&per_page=10&view=simple b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fmerge_requests%3Fpage=1&per_page=10&view=simple deleted file mode 100644 index 5339392008..0000000000 --- a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F6590996%2Fmerge_requests%3Fpage=1&per_page=10&view=simple +++ /dev/null @@ -1,29 +0,0 @@ -Vary: Origin, Accept-Encoding -Strict-Transport-Security: max-age=31536000 -Gitlab-Sv: localhost -X-Content-Type-Options: nosniff -X-Prev-Page: -Ratelimit-Reset: 1701332694 -Cache-Control: max-age=0, private, must-revalidate -Ratelimit-Limit: 2000 -Referrer-Policy: strict-origin-when-cross-origin -Ratelimit-Observed: 6 -Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:54 GMT -Cf-Cache-Status: MISS -Content-Type: application/json -Content-Security-Policy: default-src 'none' -Etag: W/"1a50811aa3cccb2e6a404a976422a83a" -X-Total: 1 -Ratelimit-Remaining: 1994 -Set-Cookie: _cfuvid=u.zumTkG1ayCnh_OwrT9Q1Fl3MXV9Gh98W.ma4WN2Xs-1701332634745-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Link: ; rel="first", ; rel="last" -X-Frame-Options: SAMEORIGIN -X-Page: 1 -X-Total-Pages: 1 -Gitlab-Lb: haproxy-main-05-lb-gprd -X-Gitlab-Meta: {"correlation_id":"907f9e1f94131ea7a6d1405100a8cc4b","version":"1"} -X-Next-Page: -X-Per-Page: 10 -X-Runtime: 0.078413 - -[{"id":10518914,"iid":1,"project_id":6590996,"title":"Review","description":"*Created by: cgtx*\n\n### remove patch from makedepends\n- patch is in base-devel\n- The group base-devel is assumed to be already installed when building with makepkg. Members of \"base-devel\" should not be included in makedepends arrays.\n- https://wiki.archlinux.org/index.php/Pkgbuild#makedepends\n### remove python2 from makedepends\n- python2 is a dependency of python2-setuptools. It is redundant to list it again.\n- You do not need to list packages that your software depends on if other packages your software depends on already have those packages listed in their dependency.\n- https://wiki.archlinux.org/index.php/Pkgbuild#depends\n### more simple find/delete command\n- just because\n","state":"merged","created_at":"2014-12-12T15:01:32.000Z","updated_at":"2014-12-12T15:28:38.000Z","web_url":"https://gitlab.com/troyengel/archbuild/-/merge_requests/1"}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606 b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606 new file mode 100644 index 0000000000..4b202ccaf4 --- /dev/null +++ b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606 @@ -0,0 +1,20 @@ +Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"b6cd860c9645dff485548e1592139cb2" +Gitlab-Lb: haproxy-main-38-lb-gprd +Gitlab-Sv: api-gke-us-east1-c +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 31 +Ratelimit-Remaining: 1969 +Ratelimit-Reset: 1771085280 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Runtime: 0.338588 + +{"id":79476606,"description":null,"name":"test_repo-skipped-numbers","name_with_namespace":"Forgejo / test_repo-skipped-numbers","path":"test_repo-skipped-numbers","path_with_namespace":"forgejo/test_repo-skipped-numbers","created_at":"2026-02-13T20:29:32.674Z","default_branch":"main","tag_list":[],"topics":[],"ssh_url_to_repo":"git@gitlab.com:forgejo/test_repo-skipped-numbers.git","http_url_to_repo":"https://gitlab.com/forgejo/test_repo-skipped-numbers.git","web_url":"https://gitlab.com/forgejo/test_repo-skipped-numbers","readme_url":"https://gitlab.com/forgejo/test_repo-skipped-numbers/-/blob/main/README.md","forks_count":0,"avatar_url":null,"star_count":0,"last_activity_at":"2026-02-13T20:29:32.598Z","visibility":"public","namespace":{"id":64459497,"name":"Forgejo","path":"forgejo","kind":"group","full_path":"forgejo","parent_id":null,"avatar_url":"/uploads/-/system/group/avatar/64459497/73144-c883a242dec5299fbc06bbe3ee71d8c6.png","web_url":"https://gitlab.com/groups/forgejo"},"container_registry_image_prefix":"registry.gitlab.com/forgejo/test_repo-skipped-numbers","_links":{"self":"https://gitlab.com/api/v4/projects/79476606","issues":"https://gitlab.com/api/v4/projects/79476606/issues","merge_requests":"https://gitlab.com/api/v4/projects/79476606/merge_requests","repo_branches":"https://gitlab.com/api/v4/projects/79476606/repository/branches","labels":"https://gitlab.com/api/v4/projects/79476606/labels","events":"https://gitlab.com/api/v4/projects/79476606/events","members":"https://gitlab.com/api/v4/projects/79476606/members","cluster_agents":"https://gitlab.com/api/v4/projects/79476606/cluster_agents"},"marked_for_deletion_at":null,"marked_for_deletion_on":null,"packages_enabled":true,"empty_repo":false,"archived":true,"resolve_outdated_diff_discussions":false,"container_expiration_policy":{"cadence":"1d","enabled":false,"keep_n":10,"older_than":"90d","name_regex":".*","name_regex_keep":null,"next_run_at":"2026-02-14T20:29:32.690Z"},"repository_object_format":"sha1","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"jobs_enabled":true,"snippets_enabled":true,"container_registry_enabled":true,"service_desk_enabled":true,"can_create_merge_request_in":false,"issues_access_level":"enabled","repository_access_level":"enabled","merge_requests_access_level":"enabled","forking_access_level":"enabled","wiki_access_level":"enabled","builds_access_level":"enabled","snippets_access_level":"enabled","pages_access_level":"private","analytics_access_level":"enabled","container_registry_access_level":"enabled","security_and_compliance_access_level":"private","releases_access_level":"enabled","environments_access_level":"enabled","feature_flags_access_level":"enabled","infrastructure_access_level":"enabled","monitor_access_level":"enabled","model_experiments_access_level":"enabled","model_registry_access_level":"enabled","package_registry_access_level":"enabled","emails_disabled":false,"emails_enabled":true,"show_diff_preview_in_email":true,"shared_runners_enabled":true,"lfs_enabled":true,"creator_id":2005797,"import_url":null,"import_type":null,"import_status":"none","import_error":null,"open_issues_count":1,"description_html":"","updated_at":"2026-02-14T16:06:34.919Z","ci_default_git_depth":20,"ci_delete_pipelines_in_seconds":null,"ci_forward_deployment_enabled":true,"ci_forward_deployment_rollback_allowed":true,"ci_job_token_scope_enabled":false,"ci_separated_caches":true,"ci_allow_fork_pipelines_to_run_in_parent_project":true,"ci_id_token_sub_claim_components":["project_path","ref_type","ref"],"build_git_strategy":"fetch","keep_latest_artifact":true,"restrict_user_defined_variables":false,"ci_pipeline_variables_minimum_override_role":"developer","runner_token_expiration_interval":null,"group_runners_enabled":true,"resource_group_default_process_mode":"unordered","auto_cancel_pending_pipelines":"enabled","build_timeout":3600,"auto_devops_enabled":false,"auto_devops_deploy_strategy":"continuous","ci_push_repository_for_job_token_allowed":false,"ci_config_path":"","public_jobs":true,"shared_with_groups":[],"only_allow_merge_if_pipeline_succeeds":false,"allow_merge_on_skipped_pipeline":null,"request_access_enabled":true,"only_allow_merge_if_all_discussions_are_resolved":false,"remove_source_branch_after_merge":true,"printing_merge_request_link_enabled":true,"merge_method":"merge","merge_request_title_regex":null,"merge_request_title_regex_description":null,"squash_option":"default_off","enforce_auth_checks_on_uploads":true,"suggestion_commit_message":null,"merge_commit_template":null,"squash_commit_template":null,"issue_branch_template":null,"warn_about_potentially_unwanted_characters":true,"autoclose_referenced_issues":true,"max_artifacts_size":null,"external_authorization_classification_label":"","requirements_enabled":false,"requirements_access_level":"enabled","security_and_compliance_enabled":true,"compliance_frameworks":[],"duo_remote_flows_enabled":true,"duo_foundational_flows_enabled":true,"web_based_commit_signing_enabled":false,"permissions":{"project_access":null,"group_access":{"access_level":50,"notification_level":3}}} \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fissues%2F2%2Faward_emoji%3Fpage=1&per_page=10 b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fissues%2F2%2Faward_emoji%3Fpage=1&per_page=10 new file mode 100644 index 0000000000..11a3a988d2 --- /dev/null +++ b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fissues%2F2%2Faward_emoji%3Fpage=1&per_page=10 @@ -0,0 +1,29 @@ +Accept-Ranges: bytes +Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Length: 2 +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" +Gitlab-Lb: haproxy-main-30-lb-gprd +Gitlab-Sv: api-gke-us-east1-d +Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 33 +Ratelimit-Remaining: 1967 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 1 +X-Per-Page: 10 +X-Prev-Page: +X-Runtime: 0.066401 +X-Total: 0 +X-Total-Pages: 1 + +[] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fissues%3Forder_by=created_at&page=1&per_page=10&sort=desc&state=all b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fissues%3Forder_by=created_at&page=1&per_page=10&sort=desc&state=all new file mode 100644 index 0000000000..d877929b18 --- /dev/null +++ b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fissues%3Forder_by=created_at&page=1&per_page=10&sort=desc&state=all @@ -0,0 +1,27 @@ +Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"cfd6114327ec8067d5d20d5d17c3ba48" +Gitlab-Lb: haproxy-main-40-lb-gprd +Gitlab-Sv: api-gke-us-east1-b +Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 32 +Ratelimit-Remaining: 1968 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 1 +X-Per-Page: 10 +X-Prev-Page: +X-Runtime: 0.241899 +X-Total: 1 +X-Total-Pages: 1 + +[{"id":184077979,"iid":2,"project_id":79476606,"title":"2nd issue","description":"","state":"opened","created_at":"2026-02-13T20:30:05.549Z","updated_at":"2026-02-13T20:30:05.549Z","closed_at":null,"closed_by":null,"labels":[],"milestone":null,"assignees":[],"author":{"id":2005797,"username":"oliverpool","public_email":"","name":"oliverpool","state":"active","locked":false,"avatar_url":"https://gitlab.com/uploads/-/system/user/avatar/2005797/avatar.png","web_url":"https://gitlab.com/oliverpool"},"type":"ISSUE","assignee":null,"user_notes_count":0,"merge_requests_count":0,"upvotes":0,"downvotes":0,"start_date":null,"due_date":null,"confidential":false,"discussion_locked":null,"issue_type":"issue","web_url":"https://gitlab.com/forgejo/test_repo-skipped-numbers/-/issues/2","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"task_completion_status":{"count":0,"completed_count":0},"blocking_issues_count":0,"has_tasks":true,"task_status":"","_links":{"self":"https://gitlab.com/api/v4/projects/79476606/issues/2","notes":"https://gitlab.com/api/v4/projects/79476606/issues/2/notes","award_emoji":"https://gitlab.com/api/v4/projects/79476606/issues/2/award_emoji","project":"https://gitlab.com/api/v4/projects/79476606","closed_as_duplicate_of":null},"references":{"short":"#2","relative":"#2","full":"forgejo/test_repo-skipped-numbers#2"},"severity":"UNKNOWN","moved_to_id":null,"imported":false,"imported_from":"none","service_desk_reply_to":null}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fmerge_requests%2F1 b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fmerge_requests%2F1 new file mode 100644 index 0000000000..7e3cd6054b --- /dev/null +++ b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fmerge_requests%2F1 @@ -0,0 +1,20 @@ +Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"fd4f08163e3a4f801ca3af1abd07f500" +Gitlab-Lb: haproxy-main-35-lb-gprd +Gitlab-Sv: api-gke-us-east1-c +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 35 +Ratelimit-Remaining: 1965 +Ratelimit-Reset: 1771085280 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Runtime: 0.404174 + +{"id":455684411,"iid":1,"project_id":79476606,"title":"cleanup README.md","description":"","state":"opened","created_at":"2026-02-13T20:31:06.580Z","updated_at":"2026-02-13T20:31:10.927Z","merged_by":null,"merge_user":null,"merged_at":null,"closed_by":null,"closed_at":null,"target_branch":"main","source_branch":"mr-1","user_notes_count":0,"upvotes":0,"downvotes":0,"author":{"id":2005797,"username":"oliverpool","public_email":"","name":"oliverpool","state":"active","locked":false,"avatar_url":"https://gitlab.com/uploads/-/system/user/avatar/2005797/avatar.png","web_url":"https://gitlab.com/oliverpool"},"assignees":[],"assignee":null,"reviewers":[],"source_project_id":79476606,"target_project_id":79476606,"labels":[],"draft":false,"imported":false,"imported_from":"none","work_in_progress":false,"milestone":null,"merge_when_pipeline_succeeds":false,"merge_status":"can_be_merged","detailed_merge_status":"mergeable","merge_after":null,"sha":"df1f488cbe903607e5cd80220f8e12db90598490","merge_commit_sha":null,"squash_commit_sha":null,"discussion_locked":null,"should_remove_source_branch":null,"force_remove_source_branch":true,"prepared_at":"2026-02-13T20:31:10.921Z","reference":"!1","references":{"short":"!1","relative":"!1","full":"forgejo/test_repo-skipped-numbers!1"},"web_url":"https://gitlab.com/forgejo/test_repo-skipped-numbers/-/merge_requests/1","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"squash":false,"squash_on_merge":false,"task_completion_status":{"count":0,"completed_count":0},"has_conflicts":false,"blocking_discussions_resolved":true,"approvals_before_merge":null,"subscribed":true,"changes_count":"1","latest_build_started_at":null,"latest_build_finished_at":null,"first_deployed_to_production_at":null,"pipeline":null,"head_pipeline":null,"diff_refs":{"base_sha":"80db4c60fb87dddbcf7158c5a5bbbbd2e8d182cb","head_sha":"df1f488cbe903607e5cd80220f8e12db90598490","start_sha":"80db4c60fb87dddbcf7158c5a5bbbbd2e8d182cb"},"merge_error":null,"first_contribution":true,"user":{"can_merge":false}} \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=1&per_page=10 b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=1&per_page=10 new file mode 100644 index 0000000000..8710ee04ff --- /dev/null +++ b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fmerge_requests%2F1%2Faward_emoji%3Fpage=1&per_page=10 @@ -0,0 +1,29 @@ +Accept-Ranges: bytes +Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Length: 2 +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"4f53cda18c2baa0c0354bb5f9a3ecbe5" +Gitlab-Lb: haproxy-main-53-lb-gprd +Gitlab-Sv: api-gke-us-east1-c +Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 36 +Ratelimit-Remaining: 1964 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 1 +X-Per-Page: 10 +X-Prev-Page: +X-Runtime: 0.063873 +X-Total: 0 +X-Total-Pages: 1 + +[] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fmerge_requests%3Fpage=1&per_page=10&view=simple b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fmerge_requests%3Fpage=1&per_page=10&view=simple new file mode 100644 index 0000000000..b39e3a3526 --- /dev/null +++ b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2F79476606%2Fmerge_requests%3Fpage=1&per_page=10&view=simple @@ -0,0 +1,27 @@ +Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"c5f9d81ed33b3c752a17ced50fddb103" +Gitlab-Lb: haproxy-main-17-lb-gprd +Gitlab-Sv: api-gke-us-east1-c +Link: ; rel="first", ; rel="last" +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 34 +Ratelimit-Remaining: 1966 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Next-Page: +X-Page: 1 +X-Per-Page: 10 +X-Prev-Page: +X-Runtime: 0.084126 +X-Total: 1 +X-Total-Pages: 1 + +[{"id":455684411,"iid":1,"project_id":79476606,"title":"cleanup README.md","description":"","state":"opened","created_at":"2026-02-13T20:31:06.580Z","updated_at":"2026-02-13T20:31:10.927Z","web_url":"https://gitlab.com/forgejo/test_repo-skipped-numbers/-/merge_requests/1"}] \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2Fforgejo%252Ftest_repo-skipped-numbers b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2Fforgejo%252Ftest_repo-skipped-numbers new file mode 100644 index 0000000000..5835b34b49 --- /dev/null +++ b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2Fforgejo%252Ftest_repo-skipped-numbers @@ -0,0 +1,20 @@ +Cache-Control: max-age=0, private, must-revalidate +Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' +Content-Type: application/json +Etag: W/"b6cd860c9645dff485548e1592139cb2" +Gitlab-Lb: haproxy-main-16-lb-gprd +Gitlab-Sv: api-gke-us-east1-b +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 30 +Ratelimit-Remaining: 1970 +Ratelimit-Reset: 1771085280 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Runtime: 0.218526 + +{"id":79476606,"description":null,"name":"test_repo-skipped-numbers","name_with_namespace":"Forgejo / test_repo-skipped-numbers","path":"test_repo-skipped-numbers","path_with_namespace":"forgejo/test_repo-skipped-numbers","created_at":"2026-02-13T20:29:32.674Z","default_branch":"main","tag_list":[],"topics":[],"ssh_url_to_repo":"git@gitlab.com:forgejo/test_repo-skipped-numbers.git","http_url_to_repo":"https://gitlab.com/forgejo/test_repo-skipped-numbers.git","web_url":"https://gitlab.com/forgejo/test_repo-skipped-numbers","readme_url":"https://gitlab.com/forgejo/test_repo-skipped-numbers/-/blob/main/README.md","forks_count":0,"avatar_url":null,"star_count":0,"last_activity_at":"2026-02-13T20:29:32.598Z","visibility":"public","namespace":{"id":64459497,"name":"Forgejo","path":"forgejo","kind":"group","full_path":"forgejo","parent_id":null,"avatar_url":"/uploads/-/system/group/avatar/64459497/73144-c883a242dec5299fbc06bbe3ee71d8c6.png","web_url":"https://gitlab.com/groups/forgejo"},"container_registry_image_prefix":"registry.gitlab.com/forgejo/test_repo-skipped-numbers","_links":{"self":"https://gitlab.com/api/v4/projects/79476606","issues":"https://gitlab.com/api/v4/projects/79476606/issues","merge_requests":"https://gitlab.com/api/v4/projects/79476606/merge_requests","repo_branches":"https://gitlab.com/api/v4/projects/79476606/repository/branches","labels":"https://gitlab.com/api/v4/projects/79476606/labels","events":"https://gitlab.com/api/v4/projects/79476606/events","members":"https://gitlab.com/api/v4/projects/79476606/members","cluster_agents":"https://gitlab.com/api/v4/projects/79476606/cluster_agents"},"marked_for_deletion_at":null,"marked_for_deletion_on":null,"packages_enabled":true,"empty_repo":false,"archived":true,"resolve_outdated_diff_discussions":false,"container_expiration_policy":{"cadence":"1d","enabled":false,"keep_n":10,"older_than":"90d","name_regex":".*","name_regex_keep":null,"next_run_at":"2026-02-14T20:29:32.690Z"},"repository_object_format":"sha1","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"jobs_enabled":true,"snippets_enabled":true,"container_registry_enabled":true,"service_desk_enabled":true,"can_create_merge_request_in":false,"issues_access_level":"enabled","repository_access_level":"enabled","merge_requests_access_level":"enabled","forking_access_level":"enabled","wiki_access_level":"enabled","builds_access_level":"enabled","snippets_access_level":"enabled","pages_access_level":"private","analytics_access_level":"enabled","container_registry_access_level":"enabled","security_and_compliance_access_level":"private","releases_access_level":"enabled","environments_access_level":"enabled","feature_flags_access_level":"enabled","infrastructure_access_level":"enabled","monitor_access_level":"enabled","model_experiments_access_level":"enabled","model_registry_access_level":"enabled","package_registry_access_level":"enabled","emails_disabled":false,"emails_enabled":true,"show_diff_preview_in_email":true,"shared_runners_enabled":true,"lfs_enabled":true,"creator_id":2005797,"import_url":null,"import_type":null,"import_status":"none","import_error":null,"open_issues_count":1,"description_html":"","updated_at":"2026-02-14T16:06:34.919Z","ci_default_git_depth":20,"ci_delete_pipelines_in_seconds":null,"ci_forward_deployment_enabled":true,"ci_forward_deployment_rollback_allowed":true,"ci_job_token_scope_enabled":false,"ci_separated_caches":true,"ci_allow_fork_pipelines_to_run_in_parent_project":true,"ci_id_token_sub_claim_components":["project_path","ref_type","ref"],"build_git_strategy":"fetch","keep_latest_artifact":true,"restrict_user_defined_variables":false,"ci_pipeline_variables_minimum_override_role":"developer","runner_token_expiration_interval":null,"group_runners_enabled":true,"resource_group_default_process_mode":"unordered","auto_cancel_pending_pipelines":"enabled","build_timeout":3600,"auto_devops_enabled":false,"auto_devops_deploy_strategy":"continuous","ci_push_repository_for_job_token_allowed":false,"ci_config_path":"","public_jobs":true,"shared_with_groups":[],"only_allow_merge_if_pipeline_succeeds":false,"allow_merge_on_skipped_pipeline":null,"request_access_enabled":true,"only_allow_merge_if_all_discussions_are_resolved":false,"remove_source_branch_after_merge":true,"printing_merge_request_link_enabled":true,"merge_method":"merge","merge_request_title_regex":null,"merge_request_title_regex_description":null,"squash_option":"default_off","enforce_auth_checks_on_uploads":true,"suggestion_commit_message":null,"merge_commit_template":null,"squash_commit_template":null,"issue_branch_template":null,"warn_about_potentially_unwanted_characters":true,"autoclose_referenced_issues":true,"max_artifacts_size":null,"external_authorization_classification_label":"","requirements_enabled":false,"requirements_access_level":"enabled","security_and_compliance_enabled":true,"compliance_frameworks":[],"duo_remote_flows_enabled":true,"duo_foundational_flows_enabled":true,"web_based_commit_signing_enabled":false,"permissions":{"project_access":null,"group_access":{"access_level":50,"notification_level":3}}} \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2Ftroyengel%252Farchbuild b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2Ftroyengel%252Farchbuild deleted file mode 100644 index a8c2882c26..0000000000 --- a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fprojects%2Ftroyengel%252Farchbuild +++ /dev/null @@ -1,22 +0,0 @@ -Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:53 GMT -Gitlab-Lb: haproxy-main-41-lb-gprd -Cache-Control: max-age=0, private, must-revalidate -Referrer-Policy: strict-origin-when-cross-origin -Cf-Cache-Status: MISS -X-Content-Type-Options: nosniff -Set-Cookie: _cfuvid=r78xThY2IPR6QvHnea1t_L7DbvuQp4.HWOiG1cKTWUg-1701332633720-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Ratelimit-Limit: 2000 -Strict-Transport-Security: max-age=31536000 -Vary: Origin, Accept-Encoding -X-Gitlab-Meta: {"correlation_id":"4c3e0f8b5858454b6e138ecae9902a8d","version":"1"} -X-Runtime: 0.097047 -Ratelimit-Observed: 2 -Ratelimit-Remaining: 1998 -X-Frame-Options: SAMEORIGIN -Content-Security-Policy: default-src 'none' -Etag: W/"03ce4f6ce1c1e8c5a31df8a44cf2fbdd" -Content-Type: application/json -Gitlab-Sv: localhost -Ratelimit-Reset: 1701332693 - -{"id":6590996,"description":"Arch packaging and build files","name":"archbuild","name_with_namespace":"Troy Engel / archbuild","path":"archbuild","path_with_namespace":"troyengel/archbuild","created_at":"2018-06-03T22:53:17.388Z","default_branch":"master","tag_list":[],"topics":[],"ssh_url_to_repo":"git@gitlab.com:troyengel/archbuild.git","http_url_to_repo":"https://gitlab.com/troyengel/archbuild.git","web_url":"https://gitlab.com/troyengel/archbuild","readme_url":"https://gitlab.com/troyengel/archbuild/-/blob/master/README.md","forks_count":0,"avatar_url":null,"star_count":0,"last_activity_at":"2020-12-13T18:09:32.071Z","namespace":{"id":1452515,"name":"Troy Engel","path":"troyengel","kind":"user","full_path":"troyengel","parent_id":null,"avatar_url":"https://secure.gravatar.com/avatar/b226c267929f1bcfcc446e75a025591c?s=80\u0026d=identicon","web_url":"https://gitlab.com/troyengel"},"container_registry_image_prefix":"registry.gitlab.com/troyengel/archbuild","_links":{"self":"https://gitlab.com/api/v4/projects/6590996","issues":"https://gitlab.com/api/v4/projects/6590996/issues","merge_requests":"https://gitlab.com/api/v4/projects/6590996/merge_requests","repo_branches":"https://gitlab.com/api/v4/projects/6590996/repository/branches","labels":"https://gitlab.com/api/v4/projects/6590996/labels","events":"https://gitlab.com/api/v4/projects/6590996/events","members":"https://gitlab.com/api/v4/projects/6590996/members","cluster_agents":"https://gitlab.com/api/v4/projects/6590996/cluster_agents"},"packages_enabled":null,"empty_repo":false,"archived":true,"visibility":"public","owner":{"id":1215848,"username":"troyengel","name":"Troy Engel","state":"active","locked":false,"avatar_url":"https://secure.gravatar.com/avatar/b226c267929f1bcfcc446e75a025591c?s=80\u0026d=identicon","web_url":"https://gitlab.com/troyengel"},"resolve_outdated_diff_discussions":false,"issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"jobs_enabled":true,"snippets_enabled":true,"container_registry_enabled":true,"service_desk_enabled":true,"can_create_merge_request_in":false,"issues_access_level":"enabled","repository_access_level":"enabled","merge_requests_access_level":"enabled","forking_access_level":"enabled","wiki_access_level":"enabled","builds_access_level":"enabled","snippets_access_level":"enabled","pages_access_level":"enabled","analytics_access_level":"enabled","container_registry_access_level":"enabled","security_and_compliance_access_level":"private","releases_access_level":"enabled","environments_access_level":"enabled","feature_flags_access_level":"enabled","infrastructure_access_level":"enabled","monitor_access_level":"enabled","model_experiments_access_level":"enabled","emails_disabled":false,"emails_enabled":true,"shared_runners_enabled":true,"lfs_enabled":false,"creator_id":1215848,"import_status":"finished","open_issues_count":0,"description_html":"\u003cp data-sourcepos=\"1:1-1:30\" dir=\"auto\"\u003eArch packaging and build files\u003c/p\u003e","updated_at":"2022-07-13T21:32:12.624Z","ci_config_path":null,"public_jobs":true,"shared_with_groups":[],"only_allow_merge_if_pipeline_succeeds":false,"allow_merge_on_skipped_pipeline":null,"request_access_enabled":false,"only_allow_merge_if_all_discussions_are_resolved":false,"remove_source_branch_after_merge":null,"printing_merge_request_link_enabled":true,"merge_method":"merge","squash_option":"default_off","enforce_auth_checks_on_uploads":true,"suggestion_commit_message":null,"merge_commit_template":null,"squash_commit_template":null,"issue_branch_template":null,"autoclose_referenced_issues":true,"external_authorization_classification_label":"","requirements_enabled":false,"requirements_access_level":"enabled","security_and_compliance_enabled":false,"compliance_frameworks":[],"permissions":{"project_access":null,"group_access":null}} \ No newline at end of file diff --git a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fversion b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fversion index eb6df2ffb1..19ac3aa53f 100644 --- a/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fversion +++ b/services/migrations/testdata/gitlab/skipped_issue_number/GET_%2Fapi%2Fv4%2Fversion @@ -1,22 +1,20 @@ -Ratelimit-Observed: 1 -X-Gitlab-Meta: {"correlation_id":"aa75720bd9c597c7f2f886a4042d1f80","version":"1"} -Etag: W/"4e5c0a031c3aacb6ba0a3c19e67d7592" -X-Content-Type-Options: nosniff -Ratelimit-Limit: 2000 -Ratelimit-Resettime: Thu, 30 Nov 2023 08:24:53 GMT -X-Runtime: 0.039899 -Ratelimit-Remaining: 1999 -Set-Cookie: _cfuvid=7OAEitQ3J0BOxrXk2pMBApFg1KFnz5aBVqOY7mHwLRk-1701332633452-0-604800000; path=/; domain=.gitlab.com; HttpOnly; Secure; SameSite=None -Content-Security-Policy: default-src 'none' -Gitlab-Sv: localhost -Cf-Cache-Status: MISS -Vary: Origin, Accept-Encoding -X-Frame-Options: SAMEORIGIN Cache-Control: max-age=0, private, must-revalidate -Strict-Transport-Security: max-age=31536000 -Referrer-Policy: strict-origin-when-cross-origin -Ratelimit-Reset: 1701332693 -Gitlab-Lb: haproxy-main-39-lb-gprd +Cf-Cache-Status: MISS +Content-Security-Policy: default-src 'none' Content-Type: application/json +Etag: W/"eb8caeed3eb2f6feb10c7f2b9610d346" +Gitlab-Lb: haproxy-main-52-lb-gprd +Gitlab-Sv: api-gke-us-east1-b +Ratelimit-Limit: 2000 +Ratelimit-Name: throttle_authenticated_api +Ratelimit-Observed: 29 +Ratelimit-Remaining: 1971 +Ratelimit-Reset: 1771055640 +Referrer-Policy: strict-origin-when-cross-origin +Strict-Transport-Security: max-age=31536000 +Vary: Origin, Accept-Encoding +X-Content-Type-Options: nosniff +X-Frame-Options: SAMEORIGIN +X-Runtime: 0.060644 -{"version":"16.7.0-pre","revision":"acd848a9228","kas":{"enabled":true,"externalUrl":"wss://kas.gitlab.com","version":"v16.7.0-rc2"},"enterprise":true} \ No newline at end of file +{"version":"18.9.0-pre","revision":"dde8b248bb9","kas":{"enabled":true,"externalUrl":"wss://kas.gitlab.com","externalK8sProxyUrl":"https://kas.gitlab.com/k8s-proxy","version":"18.9.0-rc1+f6b096ad1f478a35a7335ec9b905c1230fd27b4e"},"enterprise":true} \ No newline at end of file diff --git a/services/moderation/main_test.go b/services/moderation/main_test.go index 3a268260d2..45de4cd7ab 100644 --- a/services/moderation/main_test.go +++ b/services/moderation/main_test.go @@ -7,9 +7,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models/forgefed" - _ "forgejo.org/models/moderation" ) func TestMain(m *testing.M) { diff --git a/services/packages/cleanup/cleanup.go b/services/packages/cleanup/cleanup.go index fac2e62540..3c177abca4 100644 --- a/services/packages/cleanup/cleanup.go +++ b/services/packages/cleanup/cleanup.go @@ -136,8 +136,9 @@ func GetCleanupTargets(ctx context.Context, pcr *packages_model.PackageCleanupRu if err != nil { return nil, fmt.Errorf("failure to SearchVersions for package cleanup rule: %w", err) } - keep := min(len(pvs), pcr.KeepCount) - for _, pv := range pvs[keep:] { + + var keep int + for _, pv := range pvs { if pcr.Type == packages_model.TypeContainer { if skip := container_service.ShouldBeSkipped(pv); skip { log.Debug("Rule[%d]: keep '%s/%s' (container)", pcr.ID, p.Name, pv.Version) @@ -145,6 +146,12 @@ func GetCleanupTargets(ctx context.Context, pcr *packages_model.PackageCleanupRu } } + keep++ + if pcr.KeepCount > 0 && keep <= pcr.KeepCount { + log.Debug("Rule[%d]: keep '%s/%s' (count)", pcr.ID, p.Name, pv.Version) + continue + } + toMatch := pv.LowerVersion if pcr.MatchFullName { toMatch = p.LowerName + "/" + pv.LowerVersion diff --git a/services/packages/cleanup/cleanup_test.go b/services/packages/cleanup/cleanup_test.go new file mode 100644 index 0000000000..d6c0f00400 --- /dev/null +++ b/services/packages/cleanup/cleanup_test.go @@ -0,0 +1,104 @@ +package container + +import ( + "crypto/sha256" + "encoding/hex" + "fmt" + "testing" + "time" + + "forgejo.org/models/db" + "forgejo.org/models/packages" + "forgejo.org/models/unittest" + "forgejo.org/modules/timeutil" + + "github.com/stretchr/testify/require" +) + +func TestGetCleanupTargets(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + ctx := db.DefaultContext + + createPackageCleanupRule := func(t *testing.T, keepCount, removeDays int) *packages.PackageCleanupRule { + t.Helper() + + pcr := packages.PackageCleanupRule{ + Enabled: true, + OwnerID: 2001, + Type: packages.TypeContainer, + KeepCount: keepCount, + RemoveDays: removeDays, + } + _, err := db.GetEngine(ctx).Insert(&pcr) + require.NoError(t, err) + return &pcr + } + + createContainerVersions := func(t *testing.T, name string, count int) { + t.Helper() + + p := packages.Package{ + OwnerID: 2001, + Name: name, + LowerName: name, + Type: packages.TypeContainer, + } + _, err := db.GetEngine(ctx).Insert(&p) + require.NoError(t, err) + + for i := range count { + version := fmt.Sprintf("0.%d.0", i+1) + created := time.Now(). + Add(-720 * time.Hour). + Add(time.Duration(count-i) * time.Hour * -1). + Unix() + + // Create the package version for the amd64 variant of a multi-platform OCI image + platformAmd64Hash := sha256.New() + platformAmd64Hash.Write([]byte(version + "amd64")) + platformAmd64Version := "sha256:" + hex.EncodeToString(platformAmd64Hash.Sum(nil)) + platformAmd64PackageVersion := packages.PackageVersion{ + PackageID: p.ID, + Version: platformAmd64Version, + LowerVersion: platformAmd64Version, + CreatedUnix: timeutil.TimeStamp(created), + } + _, err = db.GetEngine(ctx).NoAutoTime().Insert(&platformAmd64PackageVersion) + require.NoError(t, err) + + // Create the package version for the arm64 variant of a multi-platform OCI image + platformArm64Hash := sha256.New() + platformArm64Hash.Write([]byte(version + "arm64")) + platformArm64Version := "sha256:" + hex.EncodeToString(platformArm64Hash.Sum(nil)) + platformArm64PackageVersion := packages.PackageVersion{ + PackageID: p.ID, + Version: platformArm64Version, + LowerVersion: platformArm64Version, + CreatedUnix: timeutil.TimeStamp(created), + } + _, err = db.GetEngine(ctx).NoAutoTime().Insert(&platformArm64PackageVersion) + require.NoError(t, err) + + // Create the package version for tagged manifest of a multi-platform OCI image + v := packages.PackageVersion{ + PackageID: p.ID, + Version: version, + LowerVersion: version, + CreatedUnix: timeutil.TimeStamp(created), + } + _, err = db.GetEngine(ctx).NoAutoTime().Insert(&v) + require.NoError(t, err) + } + } + + t.Run("keeps the last five versions of multi-platform container images", func(t *testing.T) { + pcr := createPackageCleanupRule(t, 5, 7) + // Create versions 0.1.0 to 0.6.0 + createContainerVersions(t, "unit/test", 6) + targets, err := GetCleanupTargets(ctx, pcr, true) + require.NoError(t, err) + require.Len(t, targets, 1) + require.Equal(t, "0.1.0", targets[0].PackageVersion.LowerVersion) + }) +} diff --git a/services/pull/commit_status.go b/services/pull/commit_status.go index 0a95ea1152..4821e2cceb 100644 --- a/services/pull/commit_status.go +++ b/services/pull/commit_status.go @@ -39,9 +39,12 @@ func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus, var targetStatus structs.CommitStatusState for _, commitStatus := range commitStatuses { if gp.Match(commitStatus.Context) { - targetStatus = commitStatus.State + if targetStatus == "" { + targetStatus = commitStatus.State + } else if commitStatus.State.NoBetterThan(targetStatus) { + targetStatus = commitStatus.State + } matchedCount++ - break } } diff --git a/services/pull/commit_status_test.go b/services/pull/commit_status_test.go index 593c88fb19..39fe587e74 100644 --- a/services/pull/commit_status_test.go +++ b/services/pull/commit_status_test.go @@ -22,8 +22,8 @@ func TestMergeRequiredContextsCommitStatus(t *testing.T) { }, { {Context: "Build 1", State: structs.CommitStatusSuccess}, - {Context: "Build 2", State: structs.CommitStatusSuccess}, - {Context: "Build 2t", State: structs.CommitStatusPending}, + {Context: "Build 2", State: structs.CommitStatusPending}, + {Context: "Build 2t", State: structs.CommitStatusSuccess}, }, { {Context: "Build 1", State: structs.CommitStatusSuccess}, @@ -58,8 +58,6 @@ func TestMergeRequiredContextsCommitStatus(t *testing.T) { } for i, commitStatuses := range testCases { - if MergeRequiredContextsCommitStatus(commitStatuses, testCasesRequiredContexts[i]) != testCasesExpected[i] { - assert.Fail(t, "Test case failed", "Test case %d failed", i+1) - } + assert.Equal(t, testCasesExpected[i], MergeRequiredContextsCommitStatus(commitStatuses, testCasesRequiredContexts[i]), "Test case %d failed", i+1) } } diff --git a/services/pull/main_test.go b/services/pull/main_test.go index 5262b5be50..ccbcd4b798 100644 --- a/services/pull/main_test.go +++ b/services/pull/main_test.go @@ -8,9 +8,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/services/redirect/main_test.go b/services/redirect/main_test.go index 7363791caa..3b3992acfa 100644 --- a/services/redirect/main_test.go +++ b/services/redirect/main_test.go @@ -6,11 +6,6 @@ import ( "testing" "forgejo.org/models/unittest" - - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/services/release/release.go b/services/release/release.go index 69889a1638..9536ebf6dd 100644 --- a/services/release/release.go +++ b/services/release/release.go @@ -192,7 +192,7 @@ func CreateRelease(gitRepo *git.Repository, rel *repo_model.Release, msg string, } } - if err = repo_model.AddReleaseAttachments(gitRepo.Ctx, rel.ID, addAttachmentUUIDs.Values()); err != nil { + if err = repo_model.AddReleaseAttachments(gitRepo.Ctx, rel, addAttachmentUUIDs.Values()); err != nil { return err } @@ -314,44 +314,37 @@ func UpdateRelease(ctx context.Context, doer *user_model.User, gitRepo *git.Repo } } - if err = repo_model.AddReleaseAttachments(ctx, rel.ID, addAttachmentUUIDs.Values()); err != nil { + if err = repo_model.AddReleaseAttachments(ctx, rel, addAttachmentUUIDs.Values()); err != nil { return fmt.Errorf("AddReleaseAttachments: %w", err) } deletedUUIDs := make(container.Set[string]) if len(delAttachmentUUIDs) > 0 { - // Check attachments - attachments, err := repo_model.GetAttachmentsByUUIDs(ctx, delAttachmentUUIDs.Values()) + // Check delAttachments + delAttachments, err := repo_model.FindRepoAttachmentsByUUID(ctx, rel.RepoID, delAttachmentUUIDs.Values(), repo_model.FindAttachmentOptions{ReleaseID: rel.ID}) if err != nil { - return fmt.Errorf("GetAttachmentsByUUIDs [uuids: %v]: %w", delAttachmentUUIDs, err) + return fmt.Errorf("FindRepoAttachmentsByUUID[uuids=%q,repoID=%d,releaseID=%d]: %w", delAttachmentUUIDs.Values(), rel.RepoID, rel.ID, err) } - for _, attach := range attachments { - if attach.ReleaseID != rel.ID { - return util.SilentWrap{ - Message: "delete attachment of release permission denied", - Err: util.ErrPermissionDenied, - } - } + for _, attach := range delAttachments { deletedUUIDs.Add(attach.UUID) } - if _, err := repo_model.DeleteAttachments(ctx, attachments, true); err != nil { + if _, err := repo_model.DeleteAttachments(ctx, delAttachments, true); err != nil { return fmt.Errorf("DeleteAttachments [uuids: %v]: %w", delAttachmentUUIDs, err) } } if len(updateAttachmentUUIDs) > 0 { - // Check attachments - attachments, err := repo_model.GetAttachmentsByUUIDs(ctx, updateAttachmentUUIDs.Values()) + // Check that attachments actually belong to repository and release. + attachments, err := repo_model.FindRepoAttachmentsByUUID(ctx, rel.RepoID, updateAttachmentUUIDs.Values(), repo_model.FindAttachmentOptions{ReleaseID: rel.ID}) if err != nil { - return fmt.Errorf("GetAttachmentsByUUIDs [uuids: %v]: %w", updateAttachmentUUIDs, err) + return fmt.Errorf("FindRepoAttachmentsByUUID[uuids=%q,repoID=%d,releaseID=%d]: %w", updateAttachmentUUIDs.Values(), rel.RepoID, rel.ID, err) } - for _, attach := range attachments { - if attach.ReleaseID != rel.ID { - return util.SilentWrap{ - Message: "update attachment of release permission denied", - Err: util.ErrPermissionDenied, - } + + if len(attachments) != len(updateAttachments) { + return util.SilentWrap{ + Message: "update attachment of release permission denied", + Err: util.ErrPermissionDenied, } } } diff --git a/services/release/release_test.go b/services/release/release_test.go index f03b4d42b8..e05efd9658 100644 --- a/services/release/release_test.go +++ b/services/release/release_test.go @@ -14,11 +14,9 @@ import ( "forgejo.org/modules/git" "forgejo.org/modules/gitrepo" "forgejo.org/modules/test" + "forgejo.org/modules/util" "forgejo.org/services/attachment" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -382,6 +380,39 @@ func TestRelease_Update(t *testing.T) { assert.Equal(t, release.ID, release.Attachments[0].ReleaseID) assert.Equal(t, "test2", release.Attachments[0].Name) assert.Equal(t, "https://about.gitea.com/", release.Attachments[0].ExternalURL) + + // delete the attachment + require.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, false, []*AttachmentChange{ + { + Action: "delete", + UUID: externalAttachmentUUID, + }, + })) + release.Attachments = nil + require.NoError(t, repo_model.GetReleaseAttachments(db.DefaultContext, release)) + assert.Empty(t, release.Attachments) + + t.Run("Permission denied", func(t *testing.T) { + require.NoError(t, UpdateRelease(t.Context(), user, gitRepo, release, false, []*AttachmentChange{ + { + Action: "add", + Type: "attachment", + UUID: "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a13", + }, + })) + require.NoError(t, repo_model.GetReleaseAttachments(t.Context(), release)) + assert.Empty(t, release.Attachments) + + require.ErrorIs(t, UpdateRelease(t.Context(), user, gitRepo, release, false, []*AttachmentChange{ + { + Action: "update", + Name: "test2.txt", + UUID: "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a13", + }, + }), util.ErrPermissionDenied) + require.NoError(t, repo_model.GetReleaseAttachments(t.Context(), release)) + assert.Empty(t, release.Attachments) + }) } func TestRelease_createTag(t *testing.T) { diff --git a/services/repository/archiver/archiver_test.go b/services/repository/archiver/archiver_test.go index 00d82267c9..1b9d062f1f 100644 --- a/services/repository/archiver/archiver_test.go +++ b/services/repository/archiver/archiver_test.go @@ -12,9 +12,6 @@ import ( "forgejo.org/modules/git" "forgejo.org/services/contexttest" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/services/repository/files/content_test.go b/services/repository/files/content_test.go index 8fc8f56b4f..da6c5552ef 100644 --- a/services/repository/files/content_test.go +++ b/services/repository/files/content_test.go @@ -13,9 +13,6 @@ import ( "forgejo.org/modules/gitrepo" api "forgejo.org/modules/structs" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/services/repository/files/update.go b/services/repository/files/update.go index f45ed384e7..9c2fde1c0e 100644 --- a/services/repository/files/update.go +++ b/services/repository/files/update.go @@ -43,7 +43,6 @@ type ChangeRepoFile struct { ContentReader io.ReadSeeker SHA string Options *RepoFileOptions - Symlink bool } // ChangeRepoFilesOptions holds the repository files update options @@ -62,8 +61,13 @@ type ChangeRepoFilesOptions struct { type RepoFileOptions struct { treePath string fromTreePath string - executable bool - symlink bool + entryMode git.EntryMode +} + +func RepoFileOptionMode(entryMode git.EntryMode) *RepoFileOptions { + return &RepoFileOptions{ + entryMode: entryMode, + } } // ChangeRepoFiles adds, updates or removes multiple files in the given repository @@ -114,11 +118,14 @@ func ChangeRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use } } + mode := git.EntryModeBlob + if file.Options != nil && file.Options.entryMode != 0 { + mode = file.Options.entryMode + } file.Options = &RepoFileOptions{ treePath: treePath, fromTreePath: fromTreePath, - executable: false, - symlink: file.Symlink, + entryMode: mode, } treePaths = append(treePaths, treePath) } @@ -320,7 +327,7 @@ func handleCheckErrors(file *ChangeRepoFile, actualBaseCommit *git.Commit, lastK // haven't been made. We throw an error if one wasn't provided. return models.ErrSHAOrCommitIDNotProvided{} } - file.Options.executable = fromEntry.IsExecutable() + file.Options.entryMode = fromEntry.Mode() } if file.Operation == "create" || file.Operation == "update" { // For the path where this file will be created/updated, we need to make @@ -430,13 +437,7 @@ func CreateOrUpdateFile(ctx context.Context, t *TemporaryUploadRepository, file } // Add the object to the index - mode := "100644" // regular file - if file.Options.executable { - mode = "100755" - } else if file.Options.symlink { - mode = "120644" - } - if err := t.AddObjectToIndex(mode, objectHash, file.Options.treePath); err != nil { + if err := t.AddObjectToIndex(file.Options.entryMode.String(), objectHash, file.Options.treePath); err != nil { return err } diff --git a/services/repository/gitgraph/graph.go b/services/repository/gitgraph/graph.go index bf15baed2a..1d1cea4225 100644 --- a/services/repository/gitgraph/graph.go +++ b/services/repository/gitgraph/graph.go @@ -16,7 +16,7 @@ import ( // GetCommitGraph return a list of commit (GraphItems) from all branches func GetCommitGraph(r *git.Repository, page, maxAllowedColors int, hidePRRefs bool, branches, files []string) (*Graph, error) { - format := "DATA:%D|%H|%aD|%h|%s" + format := "DATA:%P|%D|%H|%aD|%h|%s" if page == 0 { page = 1 @@ -112,5 +112,8 @@ func GetCommitGraph(r *git.Repository, page, maxAllowedColors int, hidePRRefs bo }); err != nil { return graph, err } + + graph.ComputeGlyphConnectivity() + return graph, nil } diff --git a/services/repository/gitgraph/graph_models.go b/services/repository/gitgraph/graph_models.go index 20107cc646..2c4133e1f2 100644 --- a/services/repository/gitgraph/graph_models.go +++ b/services/repository/gitgraph/graph_models.go @@ -15,6 +15,7 @@ import ( git_model "forgejo.org/models/git" repo_model "forgejo.org/models/repo" user_model "forgejo.org/models/user" + "forgejo.org/modules/container" "forgejo.org/modules/git" "forgejo.org/modules/log" ) @@ -27,18 +28,20 @@ func NewGraph() *Graph { Column: -1, } graph.Flows = map[int64]*Flow{} + graph.continuationAbove = map[[2]int]bool{} return graph } // Graph represents a collection of flows type Graph struct { - Flows map[int64]*Flow - Commits []*Commit - MinRow int - MinColumn int - MaxRow int - MaxColumn int - relationCommit *Commit + Flows map[int64]*Flow + Commits []*Commit + MinRow int + MinColumn int + MaxRow int + MaxColumn int + relationCommit *Commit + continuationAbove map[[2]int]bool } // Width returns the width of the graph @@ -51,6 +54,69 @@ func (graph *Graph) Height() int { return graph.MaxRow - graph.MinRow + 1 } +// ComputeGlyphConnectivity sets ConnectsUp/ConnectsDown for commit glyphs based on parent/child relationships +func (graph *Graph) ComputeGlyphConnectivity() { + revs := make(container.Set[string]) + revByPos := make(map[[2]int]string) + for _, c := range graph.Commits { + if c.Rev != "" { + revs.Add(c.Rev) + revByPos[[2]int{c.Row, c.Column}] = c.Rev + } + } + + connectsDown := make(container.Set[string]) + connectsUp := make(container.Set[string]) + + // Commits with parents connect down (even if parent is on another page) + // Commits with visible children connect up + for _, c := range graph.Commits { + if len(c.ParentHashes) > 0 { + connectsDown.Add(c.Rev) + } + for _, parentHash := range c.ParentHashes { + if revs.Contains(parentHash) { + connectsUp.Add(parentHash) + } + } + } + + // Commits with a non-commit glyph above also connect up + for _, flow := range graph.Flows { + for _, g := range flow.Glyphs { + if g.Glyph != '*' { + pos := [2]int{g.Row + 1, g.Column} + if rev, exists := revByPos[pos]; exists { + connectsUp.Add(rev) + } + } + } + } + + // Commits with continuation from previous page connect up + for pos := range graph.continuationAbove { + if rev, exists := revByPos[pos]; exists { + connectsUp.Add(rev) + } + } + + for _, flow := range graph.Flows { + for i := range flow.Glyphs { + glyph := &flow.Glyphs[i] + if glyph.Glyph == '*' { + pos := [2]int{glyph.Row, glyph.Column} + if rev, exists := revByPos[pos]; exists { + glyph.ConnectsUp = connectsUp.Contains(rev) + glyph.ConnectsDown = connectsDown.Contains(rev) + } + } else { + glyph.ConnectsUp = true + glyph.ConnectsDown = true + } + } + } +} + // AddGlyph adds glyph to flows func (graph *Graph) AddGlyph(row, column int, flowID int64, color int, glyph byte) { flow, ok := graph.Flows[flowID] @@ -175,17 +241,19 @@ func (flow *Flow) AddGlyph(row, column int, glyph byte) { } flow.Glyphs = append(flow.Glyphs, Glyph{ - row, - column, - glyph, + Row: row, + Column: column, + Glyph: glyph, }) } // Glyph represents a coordinate and glyph type Glyph struct { - Row int - Column int - Glyph byte + Row int + Column int + Glyph byte + ConnectsUp bool + ConnectsDown bool } // RelationCommit represents an empty relation commit @@ -195,28 +263,36 @@ var RelationCommit = &Commit{ // NewCommit creates a new commit from a provided line func NewCommit(row, column int, line []byte) (*Commit, error) { - data := bytes.SplitN(line, []byte("|"), 5) - if len(data) < 5 { + data := bytes.SplitN(line, []byte("|"), 6) + if len(data) < 6 { return nil, fmt.Errorf("malformed data section on line %d with commit: %s", row, string(line)) } // Format is a slight modification from RFC1123Z - t, err := time.Parse("Mon, _2 Jan 2006 15:04:05 -0700", string(data[2])) + t, err := time.Parse("Mon, _2 Jan 2006 15:04:05 -0700", string(data[3])) if err != nil { return nil, fmt.Errorf("could not parse date of commit: %w", err) } + + var parents []string + for p := range bytes.FieldsSeq(data[0]) { + parents = append(parents, string(p)) + } + return &Commit{ Row: row, Column: column, - // 0 matches git log --pretty=format:%d => ref names, like the --decorate option of git-log(1) - Refs: newRefsFromRefNames(data[0]), - // 1 matches git log --pretty=format:%H => commit hash - Rev: string(data[1]), - // 2 matches git log --pretty=format:%aD => author date, RFC2822 style + // 0 matches git log --pretty=format:%P => parent hashes + ParentHashes: parents, + // 1 matches git log --pretty=format:%d => ref names, like the --decorate option of git-log(1) + Refs: newRefsFromRefNames(data[1]), + // 2 matches git log --pretty=format:%H => commit hash + Rev: string(data[2]), + // 3 matches git log --pretty=format:%aD => author date, RFC2822 style Date: t, - // 3 matches git log --pretty=format:%h => abbreviated commit hash - ShortRev: string(data[3]), - // 4 matches git log --pretty=format:%s => subject - Subject: string(data[4]), + // 4 matches git log --pretty=format:%h => abbreviated commit hash + ShortRev: string(data[4]), + // 5 matches git log --pretty=format:%s => subject + Subject: string(data[5]), }, nil } @@ -254,6 +330,7 @@ type Commit struct { Date time.Time ShortRev string Subject string + ParentHashes []string } // OnlyRelation returns whether this a relation only commit diff --git a/services/repository/gitgraph/graph_test.go b/services/repository/gitgraph/graph_test.go index 374341b276..6dafaf03fd 100644 --- a/services/repository/gitgraph/graph_test.go +++ b/services/repository/gitgraph/graph_test.go @@ -10,6 +10,9 @@ import ( "testing" "forgejo.org/modules/git" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func BenchmarkGetCommitGraph(b *testing.B) { @@ -32,7 +35,7 @@ func BenchmarkGetCommitGraph(b *testing.B) { } func BenchmarkParseCommitString(b *testing.B) { - testString := "* DATA:|4e61bacab44e9b4730e44a6615d04098dd3a8eaf|2016-12-20 21:10:41 +0100|4e61bac|Add route for graph" + testString := "* DATA:abc123||4e61bacab44e9b4730e44a6615d04098dd3a8eaf|Tue, 20 Dec 2016 21:10:41 +0100|4e61bac|Add route for graph" parser := &Parser{} parser.Reset() @@ -241,7 +244,7 @@ func TestParseGlyphs(t *testing.T) { } func TestCommitStringParsing(t *testing.T) { - dataFirstPart := "* DATA:|4e61bacab44e9b4730e44a6615d04098dd3a8eaf|Tue, 20 Dec 2016 21:10:41 +0100|4e61bac|" + dataFirstPart := "* DATA:abc123||4e61bacab44e9b4730e44a6615d04098dd3a8eaf|Tue, 20 Dec 2016 21:10:41 +0100|4e61bac|" tests := []struct { shouldPass bool testName string @@ -269,6 +272,138 @@ func TestCommitStringParsing(t *testing.T) { } } +func TestNewCommitParentHashes(t *testing.T) { + tests := []struct { + name string + data string + expectedParents []string + }{ + { + name: "no parents (orphan)", + data: "||4e61bacab44e9b4730e44a6615d04098dd3a8eaf|Tue, 20 Dec 2016 21:10:41 +0100|4e61bac|subject", + expectedParents: nil, + }, + { + name: "single parent", + data: "abc123||4e61bacab44e9b4730e44a6615d04098dd3a8eaf|Tue, 20 Dec 2016 21:10:41 +0100|4e61bac|subject", + expectedParents: []string{"abc123"}, + }, + { + name: "multiple parents (merge)", + data: "abc123 def456||4e61bacab44e9b4730e44a6615d04098dd3a8eaf|Tue, 20 Dec 2016 21:10:41 +0100|4e61bac|subject", + expectedParents: []string{"abc123", "def456"}, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + commit, err := NewCommit(0, 0, []byte(test.data)) + require.NoError(t, err) + assert.Equal(t, test.expectedParents, commit.ParentHashes) + }) + } +} + +func TestComputeGlyphConnectivity(t *testing.T) { + addCommit := func(graph *Graph, row, col int, hash string, parents []string) { + flowID := int64(col + 1) + commit := &Commit{Row: row, Column: col, Rev: hash, ParentHashes: parents, Flow: flowID} + graph.AddGlyph(row, col, flowID, 1, '*') + graph.Commits = append(graph.Commits, commit) + graph.Flows[flowID].Commits = append(graph.Flows[flowID].Commits, commit) + } + + getCommitConnectivity := func(graph *Graph, row, col int) (up, down bool) { + for _, flow := range graph.Flows { + for _, g := range flow.Glyphs { + if g.Row == row && g.Column == col && g.Glyph == '*' { + return g.ConnectsUp, g.ConnectsDown + } + } + } + return false, false + } + + t.Run("ConnectsDown/no parents", func(t *testing.T) { + graph := NewGraph() + addCommit(graph, 0, 0, "orphan", nil) + graph.ComputeGlyphConnectivity() + + _, down := getCommitConnectivity(graph, 0, 0) + assert.False(t, down) + }) + + t.Run("ConnectsDown/has parent in graph", func(t *testing.T) { + graph := NewGraph() + addCommit(graph, 0, 0, "child", []string{"parent"}) + addCommit(graph, 1, 0, "parent", nil) + graph.ComputeGlyphConnectivity() + + _, down := getCommitConnectivity(graph, 0, 0) + assert.True(t, down) + }) + + t.Run("ConnectsDown/has parent outside graph", func(t *testing.T) { + graph := NewGraph() + addCommit(graph, 0, 0, "child", []string{"parent-not-in-graph"}) + graph.ComputeGlyphConnectivity() + + _, down := getCommitConnectivity(graph, 0, 0) + assert.True(t, down) + }) + + t.Run("ConnectsUp/no child, no glyph above, no continuation", func(t *testing.T) { + graph := NewGraph() + addCommit(graph, 0, 0, "orphan", nil) + graph.ComputeGlyphConnectivity() + + up, _ := getCommitConnectivity(graph, 0, 0) + assert.False(t, up) + }) + + t.Run("ConnectsUp/has visible child", func(t *testing.T) { + graph := NewGraph() + addCommit(graph, 0, 0, "child", []string{"parent"}) + addCommit(graph, 1, 0, "parent", nil) + graph.ComputeGlyphConnectivity() + + up, _ := getCommitConnectivity(graph, 1, 0) + assert.True(t, up) + }) + + t.Run("ConnectsUp/has non-commit glyph above", func(t *testing.T) { + graph := NewGraph() + graph.AddGlyph(0, 0, 1, 1, '|') + addCommit(graph, 1, 0, "commit", nil) + graph.ComputeGlyphConnectivity() + + up, _ := getCommitConnectivity(graph, 1, 0) + assert.True(t, up) + }) + + t.Run("ConnectsUp/has continuationAbove", func(t *testing.T) { + graph := NewGraph() + addCommit(graph, 0, 0, "commit", nil) + graph.continuationAbove[[2]int{0, 0}] = true + graph.ComputeGlyphConnectivity() + + up, _ := getCommitConnectivity(graph, 0, 0) + assert.True(t, up) + }) + + t.Run("non-commit glyphs always connect both ways", func(t *testing.T) { + for _, glyph := range []byte{'|', '/', '\\'} { + graph := NewGraph() + graph.AddGlyph(0, 0, 1, 1, glyph) + graph.ComputeGlyphConnectivity() + + g := graph.Flows[1].Glyphs[0] + assert.True(t, g.ConnectsUp, "glyph %q should connect up", glyph) + assert.True(t, g.ConnectsDown, "glyph %q should connect down", glyph) + } + }) +} + var testglyphs = `* * * diff --git a/services/repository/gitgraph/parser.go b/services/repository/gitgraph/parser.go index f6bf9b0b90..3c98e66273 100644 --- a/services/repository/gitgraph/parser.go +++ b/services/repository/gitgraph/parser.go @@ -80,6 +80,9 @@ func (parser *Parser) AddLineToGraph(graph *Graph, row int, line []byte) error { } continue } + if column < len(parser.oldGlyphs) && parser.oldGlyphs[column] == '|' { + graph.continuationAbove[[2]int{row, column}] = true + } err2 := graph.AddCommit(row, column, flowID, line[idx+5:]) if err != nil && err2 != nil { err = fmt.Errorf("%v %w", err2, err) diff --git a/services/user/block_test.go b/services/user/block_test.go index b9f23a7cda..f23a5cf91a 100644 --- a/services/user/block_test.go +++ b/services/user/block_test.go @@ -48,10 +48,17 @@ func TestBlockUser(t *testing.T) { repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: doer.ID}) require.NoError(t, repo_model.WatchRepo(db.DefaultContext, blockedUser.ID, repo.ID, true)) + repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: doer.ID}) + oldNumWatchers := repo.NumWatches + require.NoError(t, BlockUser(db.DefaultContext, doer.ID, blockedUser.ID)) // Ensure blocked user isn't following doer's repository. assert.False(t, repo_model.IsWatching(db.DefaultContext, blockedUser.ID, repo.ID)) + + // Ensure the watcher count was reduced by one. + repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: doer.ID}) + require.Equal(t, oldNumWatchers-1, repo.NumWatches) }) t.Run("Collaboration", func(t *testing.T) { diff --git a/services/webhook/main_test.go b/services/webhook/main_test.go index 97957291ca..6b781633bd 100644 --- a/services/webhook/main_test.go +++ b/services/webhook/main_test.go @@ -9,10 +9,6 @@ import ( "forgejo.org/models/unittest" "forgejo.org/modules/hostmatcher" "forgejo.org/modules/setting" - - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/services/webhook/webhook.go b/services/webhook/webhook.go index 93a863ec49..f163971d46 100644 --- a/services/webhook/webhook.go +++ b/services/webhook/webhook.go @@ -209,6 +209,32 @@ func PrepareWebhook(ctx context.Context, w *webhook_model.Webhook, event webhook return enqueueHookTask(task.ID) } +// PrepareTestWebhook creates a hook task for test delivery and enqueues it for processing. +// It simulates a "push" event even though the webhook might not be enabled for that event. +func PrepareTestWebhook(ctx context.Context, w *webhook_model.Webhook, p api.Payloader) error { + // Skip sending if webhooks are disabled. + if setting.DisableWebhooks { + return errors.New("webhooks are globally disabled") + } + + payload, err := p.JSONPayload() + if err != nil { + return fmt.Errorf("JSONPayload for Test: %w", err) + } + + task, err := webhook_model.CreateHookTask(ctx, &webhook_model.HookTask{ + HookID: w.ID, + PayloadContent: string(payload), + EventType: webhook_module.HookEventPush, + PayloadVersion: 2, + }) + if err != nil { + return fmt.Errorf("CreateHookTask for Test: %w", err) + } + + return enqueueHookTask(task.ID) +} + // PrepareWebhooks adds new webhooks to task queue for given payload. func PrepareWebhooks(ctx context.Context, source EventSource, event webhook_module.HookEventType, p api.Payloader) error { owner := source.Owner diff --git a/services/webhook/webhook_test.go b/services/webhook/webhook_test.go index 15cb8f620c..3a369b7b2b 100644 --- a/services/webhook/webhook_test.go +++ b/services/webhook/webhook_test.go @@ -5,6 +5,8 @@ package webhook import ( "fmt" + "net/http" + "net/http/httptest" "testing" "forgejo.org/models/db" @@ -111,3 +113,42 @@ func TestWebhookUserMail(t *testing.T) { assert.Equal(t, user.GetPlaceholderEmail(), convert.ToUser(db.DefaultContext, user, nil).Email) assert.Equal(t, user.Email, convert.ToUser(db.DefaultContext, user, user).Email) } + +func TestDeliverTestPayloadWithoutPushEvent(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + done := make(chan struct{}, 1) + s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, "/webhook", r.URL.Path) + w.WriteHeader(200) + done <- struct{}{} + })) + t.Cleanup(s.Close) + + hookEvent := webhook_module.HookEvent{ChooseEvents: true, HookEvents: webhook_module.HookEvents{Release: true}} + hook := &webhook_model.Webhook{ + RepoID: 3, + URL: s.URL + "/webhook", + ContentType: webhook_model.ContentTypeJSON, + IsActive: true, + Type: webhook_module.GITEA, + HookEvent: &hookEvent, + } + require.NoError(t, webhook_model.CreateWebhook(t.Context(), hook)) + + // if we deliver this webhook for a push event, nothing happens because the webhook isn't configured to run on those events + require.NoError(t, PrepareWebhook(db.DefaultContext, hook, webhook_module.HookEventPush, &api.ReleasePayload{})) + unittest.AssertNotExistsBean(t, &webhook_model.HookTask{ + HookID: hook.ID, + }) + + // but if we deliver it as a testing payload, the check on event types is bypassed + // (so that webhooks can be tested regardless of the event types they are enabled for) + // See https://codeberg.org/forgejo/forgejo/issues/7934 + require.NoError(t, PrepareTestWebhook(db.DefaultContext, hook, &api.ReleasePayload{})) + + unittest.AssertExistsAndLoadBean(t, &webhook_model.HookTask{ + HookID: hook.ID, + EventType: webhook_module.HookEventPush, + }) +} diff --git a/services/wiki/wiki_test.go b/services/wiki/wiki_test.go index cb984425af..9471904e38 100644 --- a/services/wiki/wiki_test.go +++ b/services/wiki/wiki_test.go @@ -14,7 +14,7 @@ import ( "forgejo.org/modules/git" "forgejo.org/modules/gitrepo" - _ "forgejo.org/models/actions" + _ "forgejo.org/modules/testimport" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index af1467fb5c..6027c13f12 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -8,7 +8,7 @@ - + {{if .GoGetImport}} diff --git a/templates/package/content/rpm.tmpl b/templates/package/content/rpm.tmpl index f5d56623ac..1d7b5b0034 100644 --- a/templates/package/content/rpm.tmpl +++ b/templates/package/content/rpm.tmpl @@ -11,7 +11,7 @@ # {{ctx.Locale.Tr "packages.rpm.distros.redhat"}} {{- range $group := .Groups}} {{- if $group}}{{$group = print "/" $group}}{{end}} -dnf config-manager --add-repo +dnf config-manager addrepo --from-repofile="" {{- end}} # {{ctx.Locale.Tr "packages.rpm.distros.suse"}} diff --git a/templates/repo/actions/list_inner.tmpl b/templates/repo/actions/list_inner.tmpl index 207ca41c59..dce5e16e7b 100644 --- a/templates/repo/actions/list_inner.tmpl +++ b/templates/repo/actions/list_inner.tmpl @@ -1,12 +1,16 @@ {{if .HasWorkflowsOrRuns}}
-