diff --git a/docs/content/doc/usage/actions/act-runner.en-us.md b/docs/content/doc/usage/actions/act-runner.en-us.md index ddab43530e..1f4475508f 100644 --- a/docs/content/doc/usage/actions/act-runner.en-us.md +++ b/docs/content/doc/usage/actions/act-runner.en-us.md @@ -110,9 +110,9 @@ Note that the repository may still use instance-level or organization-level runn The level of the runner determines where to obtain the registration token. -- Instance level: The admin settings page, like `/admin/runners`. -- Organization level: The organization settings page, like `//settings/runners`. -- Repository level: The repository settings page, like `///settings/runners`. +- Instance level: The admin settings page, like `/admin/actions/runners`. +- Organization level: The organization settings page, like `//settings/actions/runners`. +- Repository level: The repository settings page, like `///settings/actions/runners`. If you cannot see the settings page, please make sure that you have the right permissions and that Actions have been enabled. diff --git a/docs/content/doc/usage/actions/act-runner.zh-cn.md b/docs/content/doc/usage/actions/act-runner.zh-cn.md index fb202e3078..cc57282900 100644 --- a/docs/content/doc/usage/actions/act-runner.zh-cn.md +++ b/docs/content/doc/usage/actions/act-runner.zh-cn.md @@ -109,9 +109,9 @@ docker run -v $(pwd)/config.yaml:/config.yaml -e CONFIG_FILE=/config.yaml ... Runner级别决定了从哪里获取注册令牌。 -- 实例级别:管理员设置页面,例如 `/admin/runners`。 -- 组织级别:组织设置页面,例如 `//settings/runners`。 -- 存储库级别:存储库设置页面,例如 `///settings/runners`。 +- 实例级别:管理员设置页面,例如 `/admin/actions/runners`。 +- 组织级别:组织设置页面,例如 `//settings/actions/runners`。 +- 存储库级别:存储库设置页面,例如 `///settings/actions/runners`。 如果您无法看到设置页面,请确保您具有正确的权限并且已启用 Actions。 diff --git a/docs/content/doc/usage/actions/quickstart.en-us.md b/docs/content/doc/usage/actions/quickstart.en-us.md index 132d11f13f..829f1a62c0 100644 --- a/docs/content/doc/usage/actions/quickstart.en-us.md +++ b/docs/content/doc/usage/actions/quickstart.en-us.md @@ -66,7 +66,11 @@ If you are unsure which address to use, the LAN address is usually the right cho `token` is used for authentication and identification, such as `P2U1U0oB4XaRCi8azcngmPCLbRpUGapalhmddh23`. It is one-time use only and cannot be used to register multiple runners. -You can obtain tokens from `/admin/runners`. +You can obtain different levels of 'tokens' from the following places to create the corresponding level of' runners': + +- Instance level: The admin settings page, like `/admin/actions/runners`. +- Organization level: The organization settings page, like `//settings/actions/runners`. +- Repository level: The repository settings page, like `///settings/actions/runners`. ![register runner](/images/usage/actions/register-runner.png) diff --git a/docs/content/doc/usage/actions/quickstart.zh-cn.md b/docs/content/doc/usage/actions/quickstart.zh-cn.md index 7a06b6edbd..1893300b61 100644 --- a/docs/content/doc/usage/actions/quickstart.zh-cn.md +++ b/docs/content/doc/usage/actions/quickstart.zh-cn.md @@ -66,7 +66,11 @@ Runner和Job容器(由Runner启动以执行Job)将连接到此地址。 `token` 用于身份验证和标识,例如 `P2U1U0oB4XaRCi8azcngmPCLbRpUGapalhmddh23`。 它只能使用一次,并且不能用于注册多个Runner。 -您可以从 `/admin/runners` 获取令牌。 +您可以从以下位置获取不同级别的`token`,从而创建出相应级别的`runner` + +- 实例级别:管理员设置页面,例如 `/admin/actions/runners`。 +- 组织级别:组织设置页面,例如 `//settings/actions/runners`。 +- 存储库级别:存储库设置页面,例如 `///settings/actions/runners`。 ![register runner](/images/usage/actions/register-runner.png) diff --git a/docs/content/doc/usage/secrets.en-us.md b/docs/content/doc/usage/secrets.en-us.md index fe7677fc31..c82628f50c 100644 --- a/docs/content/doc/usage/secrets.en-us.md +++ b/docs/content/doc/usage/secrets.en-us.md @@ -18,7 +18,7 @@ menu: # Secrets Secrets allow you to store sensitive information in your user, organization or repository. -Secrets are available on Gitea 1.19+ and are only visible in 1.20+ when ACTIONS are enabled +Secrets are available on Gitea 1.19+ and are only visible in 1.20+ when ACTIONS are enabled. # Naming your secrets diff --git a/modules/packages/debian/metadata.go b/modules/packages/debian/metadata.go index dee524c8ff..bb77f7524b 100644 --- a/modules/packages/debian/metadata.go +++ b/modules/packages/debian/metadata.go @@ -80,7 +80,9 @@ func ParsePackage(r io.Reader) (*Package, error) { if strings.HasPrefix(hd.Name, controlTar) { var inner io.Reader - switch hd.Name[len(controlTar):] { + // https://man7.org/linux/man-pages/man5/deb-split.5.html#FORMAT + // The file names might contain a trailing slash (since dpkg 1.15.6). + switch strings.TrimSuffix(hd.Name[len(controlTar):], "/") { case "": inner = arr case ".gz": diff --git a/modules/packages/debian/metadata_test.go b/modules/packages/debian/metadata_test.go index 69fd51ea79..26c2a6fc68 100644 --- a/modules/packages/debian/metadata_test.go +++ b/modules/packages/debian/metadata_test.go @@ -69,59 +69,73 @@ func TestParsePackage(t *testing.T) { tw.Write([]byte("Package: gitea\nVersion: 1.0.0\nArchitecture: amd64\n")) tw.Close() - t.Run("None", func(t *testing.T) { - data := createArchive(map[string][]byte{"control.tar": buf.Bytes()}) + cases := []struct { + Extension string + WriterFactory func(io.Writer) io.WriteCloser + }{ + { + Extension: "", + WriterFactory: func(w io.Writer) io.WriteCloser { + return nopCloser{w} + }, + }, + { + Extension: ".gz", + WriterFactory: func(w io.Writer) io.WriteCloser { + return gzip.NewWriter(w) + }, + }, + { + Extension: ".xz", + WriterFactory: func(w io.Writer) io.WriteCloser { + xw, _ := xz.NewWriter(w) + return xw + }, + }, + { + Extension: ".zst", + WriterFactory: func(w io.Writer) io.WriteCloser { + zw, _ := zstd.NewWriter(w) + return zw + }, + }, + } - p, err := ParsePackage(data) - assert.NotNil(t, p) - assert.NoError(t, err) - assert.Equal(t, "gitea", p.Name) - }) + for _, c := range cases { + t.Run(c.Extension, func(t *testing.T) { + var cbuf bytes.Buffer + w := c.WriterFactory(&cbuf) + w.Write(buf.Bytes()) + w.Close() - t.Run("gz", func(t *testing.T) { - var zbuf bytes.Buffer - zw := gzip.NewWriter(&zbuf) - zw.Write(buf.Bytes()) - zw.Close() + data := createArchive(map[string][]byte{"control.tar" + c.Extension: cbuf.Bytes()}) - data := createArchive(map[string][]byte{"control.tar.gz": zbuf.Bytes()}) + p, err := ParsePackage(data) + assert.NotNil(t, p) + assert.NoError(t, err) + assert.Equal(t, "gitea", p.Name) - p, err := ParsePackage(data) - assert.NotNil(t, p) - assert.NoError(t, err) - assert.Equal(t, "gitea", p.Name) - }) + t.Run("TrailingSlash", func(t *testing.T) { + data := createArchive(map[string][]byte{"control.tar" + c.Extension + "/": cbuf.Bytes()}) - t.Run("xz", func(t *testing.T) { - var xbuf bytes.Buffer - xw, _ := xz.NewWriter(&xbuf) - xw.Write(buf.Bytes()) - xw.Close() - - data := createArchive(map[string][]byte{"control.tar.xz": xbuf.Bytes()}) - - p, err := ParsePackage(data) - assert.NotNil(t, p) - assert.NoError(t, err) - assert.Equal(t, "gitea", p.Name) - }) - - t.Run("zst", func(t *testing.T) { - var zbuf bytes.Buffer - zw, _ := zstd.NewWriter(&zbuf) - zw.Write(buf.Bytes()) - zw.Close() - - data := createArchive(map[string][]byte{"control.tar.zst": zbuf.Bytes()}) - - p, err := ParsePackage(data) - assert.NotNil(t, p) - assert.NoError(t, err) - assert.Equal(t, "gitea", p.Name) - }) + p, err := ParsePackage(data) + assert.NotNil(t, p) + assert.NoError(t, err) + assert.Equal(t, "gitea", p.Name) + }) + }) + } }) } +type nopCloser struct { + io.Writer +} + +func (nopCloser) Close() error { + return nil +} + func TestParseControlFile(t *testing.T) { buildContent := func(name, version, architecture string) *bytes.Buffer { var buf bytes.Buffer diff --git a/routers/api/packages/debian/debian.go b/routers/api/packages/debian/debian.go index f7270e0ae0..a6da1a11a8 100644 --- a/routers/api/packages/debian/debian.go +++ b/routers/api/packages/debian/debian.go @@ -187,7 +187,7 @@ func UploadPackageFile(ctx *context.Context) { ) if err != nil { switch err { - case packages_model.ErrDuplicatePackageVersion: + case packages_model.ErrDuplicatePackageVersion, packages_model.ErrDuplicatePackageFile: apiError(ctx, http.StatusBadRequest, err) case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize: apiError(ctx, http.StatusForbidden, err) diff --git a/tests/integration/api_packages_debian_test.go b/tests/integration/api_packages_debian_test.go index 3e25acd8cf..2d92b93159 100644 --- a/tests/integration/api_packages_debian_test.go +++ b/tests/integration/api_packages_debian_test.go @@ -144,6 +144,10 @@ func TestPackageDebian(t *testing.T) { } return seen }) + + req = NewRequestWithBody(t, "PUT", uploadURL, createArchive(packageName, packageVersion, architecture)) + AddBasicAuthHeader(req, user.Name) + MakeRequest(t, req, http.StatusBadRequest) }) t.Run("Download", func(t *testing.T) {