```
If you are using 2FA or OAuth use a [personal access token](development/api-usage.md#authentication) instead of the password.
+
You cannot publish a file with the same name twice to a package. You must delete the existing package file first.
The server responds with the following HTTP Status codes.
To publish a Composer package perform a HTTP PUT operation with the package content in the request body.
The package content must be the zipped PHP project with the `composer.json` file.
+
You cannot publish a package if a package of the same name and version already exists. You must delete the existing package first.
```
| HTTP Status Code | Meaning |
| ----------------- | ------- |
| `201 Created` | The package has been published. |
-| `400 Bad Request` | The package name and/or version are invalid or a package with the same name and version already exist. |
+| `400 Bad Request` | The package is invalid. |
+| `409 Conflict` | A package file with the same combination of parameters exists already. |
## Configuring the package registry
conan upload --remote=gitea ConanPackage/1.2@gitea/final
```
+You cannot publish a file with the same name twice to a package. You must delete the existing package or file first.
+
The Gitea Conan package registry has full [revision](https://docs.conan.io/en/latest/versioning/revisions.html) support.
## Install a package
https://gitea.example.com/api/packages/testuser/conda/package-1.0.conda
```
+If you are using 2FA or OAuth use a [personal access token](development/api-usage.md#authentication) instead of the password.
+
You cannot publish a package if a package of the same name and version already exists. You must delete the existing package first.
+The server responds with the following HTTP Status codes.
+
+| HTTP Status Code | Meaning |
+| ----------------- | ------- |
+| `201 Created` | The package has been published. |
+| `400 Bad Request` | The package is invalid. |
+| `409 Conflict` | A package file with the same combination of parameters exists already. |
+
## Install a package
To install a package from the package registry, execute one of the following commands:
https://gitea.example.com/api/packages/testuser/cran/bin?platform=windows&rversion=4.2
```
+If you are using 2FA or OAuth use a [personal access token](development/api-usage.md#authentication) instead of the password.
+
You cannot publish a package if a package of the same name and version already exists. You must delete the existing package first.
+The server responds with the following HTTP Status codes.
+
+| HTTP Status Code | Meaning |
+| ----------------- | ------- |
+| `201 Created` | The package has been published. |
+| `400 Bad Request` | The package is invalid. |
+| `409 Conflict` | A package file with the same combination of parameters exists already. |
+
## Install a package
To install a R package from the package registry, execute the following command:
```
If you are using 2FA or OAuth use a [personal access token](development/api-usage.md#authentication) instead of the password.
-You cannot publish a file with the same name twice to a package. You must delete the existing package version first.
+
+You cannot publish a package if a package of the same name, version, distribution, component and architecture already exists. You must delete the existing package first.
The server responds with the following HTTP Status codes.
| HTTP Status Code | Meaning |
| ----------------- | ------- |
| `201 Created` | The package has been published. |
-| `400 Bad Request` | The package name, version, distribution, component or architecture are invalid. |
+| `400 Bad Request` | The package is invalid. |
| `409 Conflict` | A package file with the same combination of parameters exists already. |
## Delete a package
If you are using 2FA or OAuth use a [personal access token](development/api-usage.md#authentication) instead of the password.
+You cannot publish a package if a package of the same name and version already exists. You must delete the existing package first.
+
The server responds with the following HTTP Status codes.
| HTTP Status Code | Meaning |
You cannot publish a package if a package of the same name and version already exists. You must delete the existing package first.
+The server responds with the following HTTP Status codes.
+
+| HTTP Status Code | Meaning |
+| ----------------- | ------- |
+| `201 Created` | The package has been published. |
+| `400 Bad Request` | The package is invalid. |
+| `409 Conflict` | A package file with the same combination of parameters exists already. |
+
## Install a package
To install a Swift package from the package registry, add it in the `Package.swift` file dependencies list:
https://gitea.example.com/api/packages/testuser/vagrant/test_system/1.0.0/hyperv.box
```
+If you are using 2FA or OAuth use a [personal access token](development/api-usage.md#authentication) instead of the password.
+
You cannot publish a box if a box of the same name, version and provider already exists. You must delete the existing package first.
+The server responds with the following HTTP Status codes.
+
+| HTTP Status Code | Meaning |
+| ----------------- | ------- |
+| `201 Created` | The package has been published. |
+| `400 Bad Request` | The package is invalid. |
+| `409 Conflict` | A package with the same combination of parameters exists already. |
+
## Install a package
To install a box from the package registry, execute the following command:
if err != nil {
switch err {
case packages_model.ErrDuplicatePackageVersion, packages_model.ErrDuplicatePackageFile:
- apiError(ctx, http.StatusBadRequest, err)
+ apiError(ctx, http.StatusConflict, err)
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
apiError(ctx, http.StatusForbidden, err)
default:
if err != nil {
switch err {
case packages_model.ErrDuplicatePackageVersion:
- apiError(ctx, http.StatusBadRequest, err)
+ apiError(ctx, http.StatusConflict, err)
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
apiError(ctx, http.StatusForbidden, err)
default:
if err != nil {
switch err {
case packages_model.ErrDuplicatePackageVersion:
- apiError(ctx, http.StatusBadRequest, err)
+ apiError(ctx, http.StatusConflict, err)
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
apiError(ctx, http.StatusForbidden, err)
default:
if err != nil {
switch err {
case packages_model.ErrDuplicatePackageFile:
- apiError(ctx, http.StatusBadRequest, err)
+ apiError(ctx, http.StatusConflict, err)
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
apiError(ctx, http.StatusForbidden, err)
default:
if err != nil {
switch err {
case packages_model.ErrDuplicatePackageVersion, packages_model.ErrDuplicatePackageFile:
- apiError(ctx, http.StatusBadRequest, err)
+ apiError(ctx, http.StatusConflict, err)
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
apiError(ctx, http.StatusForbidden, err)
default:
if err != nil {
switch err {
case packages_model.ErrDuplicatePackageFile:
- apiError(ctx, http.StatusBadRequest, err)
+ apiError(ctx, http.StatusConflict, err)
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
apiError(ctx, http.StatusForbidden, err)
default:
if err != nil {
switch err {
case packages_model.ErrDuplicatePackageVersion:
- apiError(ctx, http.StatusBadRequest, err)
+ apiError(ctx, http.StatusConflict, err)
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
apiError(ctx, http.StatusForbidden, err)
default:
if err != nil {
switch err {
case packages_model.ErrDuplicatePackageVersion:
- apiError(ctx, http.StatusBadRequest, err)
+ apiError(ctx, http.StatusConflict, err)
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
apiError(ctx, http.StatusForbidden, err)
default:
if err != nil {
switch err {
case packages_model.ErrDuplicatePackageFile:
- apiError(ctx, http.StatusBadRequest, err)
+ apiError(ctx, http.StatusConflict, err)
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
apiError(ctx, http.StatusForbidden, err)
default:
if err != nil {
switch err {
case packages_model.ErrDuplicatePackageVersion:
- apiError(ctx, http.StatusBadRequest, err)
+ apiError(ctx, http.StatusConflict, err)
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
apiError(ctx, http.StatusForbidden, err)
default:
assert.Equal(t, fmt.Sprintf("%s.tar.gz", packageVersion), pfs[0].Name)
assert.True(t, pfs[0].IsLead)
- uploadPackage(t, packageVersion, http.StatusBadRequest)
+ uploadPackage(t, packageVersion, http.StatusConflict)
})
t.Run("Download", func(t *testing.T) {
req = NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader(content))
req = AddBasicAuthHeader(req, user.Name)
- MakeRequest(t, req, http.StatusBadRequest)
+ MakeRequest(t, req, http.StatusConflict)
})
})
req = NewRequestWithBody(t, "PUT", uploadURL, createArchive(packageName, packageVersion, architecture))
AddBasicAuthHeader(req, user.Name)
- MakeRequest(t, req, http.StatusBadRequest)
+ MakeRequest(t, req, http.StatusConflict)
})
t.Run("Download", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
putFile(t, fmt.Sprintf("/%s/%s", packageVersion, filename), "test", http.StatusCreated)
- putFile(t, fmt.Sprintf("/%s/%s", packageVersion, filename), "test", http.StatusBadRequest)
+ putFile(t, fmt.Sprintf("/%s/%s", packageVersion, filename), "test", http.StatusConflict)
putFile(t, "/maven-metadata.xml", "test", http.StatusOK)
pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeMaven)
t.Run("UploadExists", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
- putFile(t, fmt.Sprintf("/%s/%s", packageVersion, filename), "test", http.StatusBadRequest)
+ putFile(t, fmt.Sprintf("/%s/%s", packageVersion, filename), "test", http.StatusConflict)
})
t.Run("Download", func(t *testing.T) {
req := NewRequestWithBody(t, "PUT", root, strings.NewReader(buildUpload(packageVersion)))
req = addTokenAuthHeader(req, token)
- MakeRequest(t, req, http.StatusBadRequest)
+ MakeRequest(t, req, http.StatusConflict)
})
t.Run("Download", func(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, int64(len(content)), pb.Size)
- _ = uploadFile(t, result.URL, content, http.StatusBadRequest)
+ _ = uploadFile(t, result.URL, content, http.StatusConflict)
})
t.Run("Download", func(t *testing.T) {
t.Run("UploadExists", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
- uploadFile(t, "test.whl", content, http.StatusBadRequest)
- uploadFile(t, "test.tar.gz", content, http.StatusBadRequest)
+ uploadFile(t, "test.whl", content, http.StatusConflict)
+ uploadFile(t, "test.tar.gz", content, http.StatusConflict)
})
t.Run("Download", func(t *testing.T) {
t.Run("UploadExists", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
- uploadFile(t, http.StatusBadRequest)
+ uploadFile(t, http.StatusConflict)
})
t.Run("Download", func(t *testing.T) {