From b2f828db5e5878d47de32c292d95c95c4217de68 Mon Sep 17 00:00:00 2001 From: 6543 Date: Sat, 21 Oct 2023 04:05:29 +0200 Subject: [PATCH 0001/1066] refactor: make db iterate context aware (#27710) the iteration will run until finished atm. this changes it by checking if if the context got canceled before each run of a loop sequence is executed [View this pull with now whitespace](https://github.com/go-gitea/gitea/pull/27710/files?diff=unified&w=1) --- models/db/iterate.go | 33 ++++++++++++++++++-------------- modules/doctor/repository.go | 37 ++++++++++++++++++++---------------- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/models/db/iterate.go b/models/db/iterate.go index fc8c78d83e..e1caefa72b 100644 --- a/models/db/iterate.go +++ b/models/db/iterate.go @@ -17,22 +17,27 @@ func Iterate[Bean any](ctx context.Context, cond builder.Cond, f func(ctx contex batchSize := setting.Database.IterateBufferSize sess := GetEngine(ctx) for { - beans := make([]*Bean, 0, batchSize) - if cond != nil { - sess = sess.Where(cond) - } - if err := sess.Limit(batchSize, start).Find(&beans); err != nil { - return err - } - if len(beans) == 0 { - return nil - } - start += len(beans) - - for _, bean := range beans { - if err := f(ctx, bean); err != nil { + select { + case <-ctx.Done(): + return ctx.Err() + default: + beans := make([]*Bean, 0, batchSize) + if cond != nil { + sess = sess.Where(cond) + } + if err := sess.Limit(batchSize, start).Find(&beans); err != nil { return err } + if len(beans) == 0 { + return nil + } + start += len(beans) + + for _, bean := range beans { + if err := f(ctx, bean); err != nil { + return err + } + } } } } diff --git a/modules/doctor/repository.go b/modules/doctor/repository.go index aa3f064ddd..d69ba2048b 100644 --- a/modules/doctor/repository.go +++ b/modules/doctor/repository.go @@ -37,24 +37,29 @@ func deleteOrphanedRepos(ctx context.Context) (int64, error) { adminUser := &user_model.User{IsAdmin: true} for { - var ids []int64 - if err := e.Table("`repository`"). - Join("LEFT", "`user`", "repository.owner_id=user.id"). - Where(builder.IsNull{"`user`.id"}). - Select("`repository`.id").Limit(batchSize).Find(&ids); err != nil { - return deleted, err - } - - // if we don't get ids we have deleted them all - if len(ids) == 0 { - return deleted, nil - } - - for _, id := range ids { - if err := repo_service.DeleteRepositoryDirectly(ctx, adminUser, id, true); err != nil { + select { + case <-ctx.Done(): + return deleted, ctx.Err() + default: + var ids []int64 + if err := e.Table("`repository`"). + Join("LEFT", "`user`", "repository.owner_id=user.id"). + Where(builder.IsNull{"`user`.id"}). + Select("`repository`.id").Limit(batchSize).Find(&ids); err != nil { return deleted, err } - deleted++ + + // if we don't get ids we have deleted them all + if len(ids) == 0 { + return deleted, nil + } + + for _, id := range ids { + if err := repo_service.DeleteRepositoryDirectly(ctx, adminUser, id, true); err != nil { + return deleted, err + } + deleted++ + } } } } From b39bb958cc44511c3590e832f77cebdf70616b8c Mon Sep 17 00:00:00 2001 From: silverwind Date: Sat, 21 Oct 2023 12:38:19 +0200 Subject: [PATCH 0002/1066] Improve diff tree spacing (#27714) 1. Un-indent top-level items, matching GitHub rendering 2. Increase item padding and add 1px gap between items Before and After: Screenshot 2023-10-20 at 18 37 32 Screenshot 2023-10-20 at 18 40 46 --------- Co-authored-by: 6543 --- web_src/js/components/DiffFileTree.vue | 10 +++++++++- web_src/js/components/DiffFileTreeItem.vue | 11 +++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/web_src/js/components/DiffFileTree.vue b/web_src/js/components/DiffFileTree.vue index 6136f7b947..3686629df8 100644 --- a/web_src/js/components/DiffFileTree.vue +++ b/web_src/js/components/DiffFileTree.vue @@ -126,7 +126,7 @@ export default { }; + diff --git a/web_src/js/components/DiffFileTreeItem.vue b/web_src/js/components/DiffFileTreeItem.vue index 553ab1464f..22c23f3ca0 100644 --- a/web_src/js/components/DiffFileTreeItem.vue +++ b/web_src/js/components/DiffFileTreeItem.vue @@ -58,11 +58,14 @@ a, a:hover { } .sub-items { - padding-left: 9px; + display: flex; + flex-direction: column; + gap: 1px; + padding-left: 8px; } -.item-file { - margin-left: 20px; +.sub-items .item-file { + padding-left: 24px; } .item-file.selected { @@ -80,7 +83,7 @@ a, a:hover { display: flex; align-items: center; gap: 0.25em; - padding: 2px; + padding: 3px 6px; } .item-file:hover, From 1859bbbf9122b258f27526c4dc7d857028264997 Mon Sep 17 00:00:00 2001 From: Nanguan Lin <70063547+lng2020@users.noreply.github.com> Date: Sun, 22 Oct 2023 07:40:59 +0800 Subject: [PATCH 0003/1066] Fix org team endpoint (#27721) Fix #27711 --- routers/api/v1/api.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 8d8373f0aa..53ae8c4d01 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -1444,10 +1444,10 @@ func Routes() *web.Route { Delete(reqToken(), reqOrgMembership(), org.ConcealMember) }) m.Group("/teams", func() { - m.Get("", reqToken(), org.ListTeams) - m.Post("", reqToken(), reqOrgOwnership(), bind(api.CreateTeamOption{}), org.CreateTeam) - m.Get("/search", reqToken(), org.SearchTeam) - }, reqOrgMembership()) + m.Get("", org.ListTeams) + m.Post("", reqOrgOwnership(), bind(api.CreateTeamOption{}), org.CreateTeam) + m.Get("/search", org.SearchTeam) + }, reqToken(), reqOrgMembership()) m.Group("/labels", func() { m.Get("", org.ListLabels) m.Post("", reqToken(), reqOrgOwnership(), bind(api.CreateLabelOption{}), org.CreateLabel) From a5bdcfc863f674aa12b7f552a572c4ac367480a9 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sun, 22 Oct 2023 00:24:59 +0000 Subject: [PATCH 0004/1066] [skip ci] Updated translations via Crowdin --- options/locale/locale_es-ES.ini | 248 ++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+) diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index 5654d30cec..9eb9e856ce 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -1012,12 +1012,20 @@ delete_preexisting=Eliminar archivos preexistentes delete_preexisting_content=Eliminar archivos en %s delete_preexisting_success=Eliminó archivos no adoptados en %s blame_prior=Ver la culpa antes de este cambio +blame.ignore_revs=Ignorando revisiones en .git-blame-ignore-revs. Haga clic aquí para saltar y para a la vista normal. +blame.ignore_revs.failed=No se pudieron ignorar las revisiones en .git-blame-ignore-revs. +author_search_tooltip=Muestra un máximo de 30 usuarios +tree_path_not_found_commit=La ruta %[1]s no existe en el commit %[2]s +tree_path_not_found_branch=La ruta %[1]s no existe en la rama %[2]s +tree_path_not_found_tag=La ruta %[1]s no existe en la etiqueta %[2]s transfer.accept=Aceptar transferencia transfer.accept_desc=`Transferir a "%s"` transfer.reject=Rechazar transferencia transfer.reject_desc=`Cancelar transferencia a "%s"` +transfer.no_permission_to_accept=No tienes permiso para aceptar esta transferencia. +transfer.no_permission_to_reject=No tienes permiso para rechazar esta transferencia. desc.private=Privado desc.public=Público @@ -1038,11 +1046,15 @@ template.issue_labels=Etiquetas de incidencia template.one_item=Debe seleccionar al menos un elemento de plantilla template.invalid=Debe seleccionar una plantilla de repositorio +archive.title=Este repositorio está archivado. Usted puede ver los archivos y clonarlos, pero no puede hace push o abrir incidencias o pull requests. +archive.title_date=Este repositorio ha sido archivado en %s. Puedes ver archivos y clonarlo, pero no puedes hacer push o abrir incidencias o pull request. archive.issue.nocomment=Este repositorio está archivado. No se puede comentar en las incidencias. archive.pull.nocomment=Este repositorio está archivado. No se puede comentar en los pull requests. form.reach_limit_of_creation_1=Ya han alcanzado su límite de %d repositorios. form.reach_limit_of_creation_n=Ya han alcanzado su límite de repositorios de %d. +form.name_reserved=El nombre del repositorio "%s" está reservado. +form.name_pattern_not_allowed=El patrón "%s" no está permitido en un nombre de repositorio. need_auth=Autorización migrate_options=Opciones de migración @@ -1052,6 +1064,7 @@ migrate_options_lfs=Migrar archivos LFS migrate_options_lfs_endpoint.label=Punto final de LFS migrate_options_lfs_endpoint.description=Migración intentará usar su mando Git para determinar el servidor LFS. También puede especificar un punto final personalizado si los datos LFS del repositorio se almacenan en otro lugar. migrate_options_lfs_endpoint.description.local=También se admite una ruta del servidor local. +migrate_options_lfs_endpoint.placeholder=Si se deja en blanco, el punto final se derivará de la URL de clonación migrate_items=Objetos de migración migrate_items_wiki=Wiki migrate_items_milestones=Hitos @@ -1067,6 +1080,7 @@ migrate.github_token_desc=Puedes poner uno o más tokens con comas separadas aqu migrate.clone_local_path=o una ruta local del servidor migrate.permission_denied=No te está permitido importar repositorios locales. migrate.permission_denied_blocked=No puede importar desde hosts no permitidos, por favor pida al administrador que marque ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS configuración. +migrate.invalid_local_path=La ruta local no es válida. No existe o no es un directorio. migrate.invalid_lfs_endpoint=El punto final de LFS no es válido. migrate.failed=Migración fallida: %v migrate.migrate_items_options=Un token de acceso es necesario para migrar elementos adicionales @@ -1075,6 +1089,7 @@ migrated_from_fake=Migrado desde %[1]s migrate.migrate=Migrar desde %s migrate.migrating=Migrando desde %s... migrate.migrating_failed=La migración desde %s ha fallado. +migrate.migrating_failed.error=Error al migrar: %s migrate.migrating_failed_no_addr=Migración fallida. migrate.github.description=Migrar datos desde github.com u otra instancia de GitHub. migrate.git.description=Migrar un repositorio sólo desde cualquier servicio Git. @@ -1091,6 +1106,8 @@ migrate.migrating_labels=Migrando etiquetas migrate.migrating_releases=Migrando Lanzamientos migrate.migrating_issues=Migrando incidencias migrate.migrating_pulls=Migrando Pull Requests +migrate.cancel_migrating_title=Cancelar la migración +migrate.cancel_migrating_confirm=¿Quiere cancelar esta migración? mirror_from=réplica de forked_from=forkeado de @@ -1105,10 +1122,12 @@ unstar=Eliminar de favoritos star=Destacar fork=Fork download_archive=Descargar repositorio +more_operations=Más operaciones no_desc=Sin descripción quick_guide=Guía rápida clone_this_repo=Clonar este repositorio +cite_this_repo=Citar este repositorio create_new_repo_command=Crear un nuevo repositorio desde línea de comandos push_exist_repo=Hacer push de un repositorio existente desde línea de comandos empty_message=Este repositorio no contiene ningún contenido. @@ -1139,6 +1158,7 @@ release=Lanzamiento releases=Lanzamientos tag=Etiqueta released_this=publicó esto +tagged_this=etiquetó esto file.title=%s de %s file_raw=Original file_history=Histórico @@ -1147,6 +1167,10 @@ file_view_rendered=Ver procesado file_view_raw=Ver original file_permalink=Enlace permanente file_too_large=El archivo es demasiado grande para ser mostrado. +invisible_runes_header=`Este archivo contiene caracteres Unicode invisibles` +invisible_runes_description=`Este archivo contiene caracteres Unicode invisibles que son indistinguibles para los humanos, pero que pueden ser procesados de forma diferente por un ordenador. Si crees que esto es intencional, puedes ignorar esta advertencia. Usa el botón de Escape para revelarlos.` +ambiguous_runes_header=`Este archivo contiene caracteres Unicode ambiguos` +ambiguous_runes_description=`Este archivo contiene caracteres Unicode que pueden confundirse con otros caracteres. Si crees que esto es intencional, puedes ignorar esta advertencia. Usa el botón de Escape para revelarlos.` invisible_runes_line=`Esta línea tiene caracteres unicode invisibles` ambiguous_runes_line=`Esta línea tiene caracteres unicode ambiguos` ambiguous_character=`%[1]c [U+%04[1]X] es confusable con %[2]c [U+%04[2]X]` @@ -1159,16 +1183,21 @@ video_not_supported_in_browser=Su navegador no soporta el tag video de HTML5. audio_not_supported_in_browser=Su navegador no soporta el tag audio de HTML5. stored_lfs=Almacenados con Git LFS symbolic_link=Enlace simbólico +executable_file=Archivo Ejecutable commit_graph=Gráfico de commits commit_graph.select=Seleccionar ramas commit_graph.hide_pr_refs=Ocultar Pull Requests commit_graph.monochrome=Mono commit_graph.color=Color +commit.contained_in=Este commit está contenido en: +commit.contained_in_default_branch=Este commit es parte de la rama por defecto +commit.load_referencing_branches_and_tags=Cargar ramas y etiquetas referenciando este commit blame=Blame download_file=Descargar archivo normal_view=Vista normal line=línea lines=líneas +from_comment=(comentario) editor.add_file=Añadir archivo editor.new_file=Nuevo Archivo @@ -1183,6 +1212,7 @@ editor.must_be_on_a_branch=Debes estar en una rama para hacer o proponer cambios editor.fork_before_edit=Debes hacer fork a este repositorio para hacer o proponer cambios a este archivo. editor.delete_this_file=Eliminar archivo editor.must_have_write_access=Debes tener permisos de escritura para hacer o proponer cambios a este archivo. +editor.file_delete_success=El archivo "%s" ha sido eliminado. editor.name_your_file=Nombre su archivo… editor.filename_help=Añade un directorio escribiendo su nombre seguido de una barra ('/'). Para eliminar un directorio, presione la tecla de retroceso al comienzo del campo de entrada. editor.or=o @@ -1190,8 +1220,12 @@ editor.cancel_lower=Cancelar editor.commit_signed_changes=Crear commit firmado de los cambios editor.commit_changes=Crear commit de los cambios editor.add_tmpl=Añadir '' +editor.add=Añadir %s +editor.update=Actualizar %s +editor.delete=Eliminar %s editor.patch=Aplicar parche editor.patching=Parcheando: +editor.fail_to_apply_patch=`No se puede aplicar el parche "%s"` editor.new_patch=Nuevo parche editor.commit_message_desc=Añadir una descripción extendida opcional… editor.signoff_desc=Añadir un trailer firmado por el committer al final del mensaje de registro de confirmación. @@ -1199,18 +1233,33 @@ editor.commit_directly_to_this_branch=Hacer commit directamente en la rama nueva rama para este commit y hacer un pull request. editor.create_new_branch_np=Crear una nueva rama para este commit. editor.propose_file_change=Proponer cambio de archivo +editor.new_branch_name=Nombra la nueva rama para este commit editor.new_branch_name_desc=Nombre de la rama nueva… editor.cancel=Cancelar editor.filename_cannot_be_empty=El nombre del archivo no puede estar vacío. +editor.filename_is_invalid=El nombre de archivo no es válido: "%s". +editor.branch_does_not_exist=La rama "%s" no existe en este repositorio. +editor.branch_already_exists=La rama "%s" ya existe en este repositorio. +editor.directory_is_a_file=Nombre del directorio "%s" ya se utiliza como nombre de archivo en este repositorio. +editor.file_is_a_symlink=`"%s" es un enlace simbólico. Los enlaces simbólicos no se pueden editar en el editor web` +editor.filename_is_a_directory=Nombre de archivo "%s" ya se utiliza como nombre de directorio en este repositorio. +editor.file_editing_no_longer_exists=El archivo que se está editando, "%s", ya no existe en este repositorio. +editor.file_deleting_no_longer_exists=El archivo que se está eliminando, "%s", ya no existe en este repositorio. editor.file_changed_while_editing=Desde que comenzó a editar, el contenido del archivo ha sido cambiado. Haga clic aquí para ver qué ha cambiado o presione confirmar de nuevo para sobrescribir los cambios. +editor.file_already_exists=Ya existe un archivo llamado "%s" en este repositorio. editor.commit_empty_file_header=Commit un archivo vacío editor.commit_empty_file_text=El archivo que estás tratando de commit está vacío. ¿Proceder? editor.no_changes_to_show=No existen cambios para mostrar. +editor.fail_to_update_file=Error al actualizar/crear el archivo "%s". editor.fail_to_update_file_summary=Mensaje de error editor.push_rejected_no_message=El cambio fue rechazado por el servidor sin un mensaje. Por favor, compruebe Git Hooks. editor.push_rejected=El cambio fue rechazado por el servidor. Por favor, comprueba los Git Hooks. editor.push_rejected_summary=Mensaje completo de rechazo editor.add_subdir=Añadir un directorio… +editor.unable_to_upload_files=Error al subir los archivos a "%s" con error: %v +editor.upload_file_is_locked=El archivo "%s" está bloqueado por %s. +editor.upload_files_to_dir=`Subir archivos a "%s"` +editor.cannot_commit_to_protected_branch=No se puede hacer commit a la rama protegida "%s". editor.no_commit_to_branch=No se puede hacer commit directamente a la rama porque: editor.user_no_push_to_branch=El usuario no puede hacer push a la rama editor.require_signed_commit=Esta rama requiere un commit firmado @@ -1496,6 +1545,7 @@ issues.unsubscribe=Desuscribirse issues.unpin_issue=Desanclar incidencia issues.max_pinned=No puedes anclar más incidencias issues.pin_comment=anclado este %s +issues.unpin_comment=desanclado este %s issues.lock=Bloquear conversación issues.unlock=Desbloquear conversación issues.lock.unknown_reason=No se puede bloquear una incidencia con una razón desconocida. @@ -1527,6 +1577,7 @@ issues.tracking_already_started=`¡Ya has iniciado el seguimiento de tiempo en < issues.stop_tracking=Detener temporizador issues.stop_tracking_history=`dejó de trabajar %s` issues.cancel_tracking=Descartar +issues.cancel_tracking_history=`canceló el seguimiento de tiempo %s` issues.add_time=Añadir tiempo gastado manualmente issues.del_time=Eliminar este registro de tiempo issues.add_time_short=Añadir tiempo gastado @@ -1550,6 +1601,7 @@ issues.due_date_form=aaaa-mm-dd issues.due_date_form_add=Añadir fecha de vencimiento issues.due_date_form_edit=Editar issues.due_date_form_remove=Eliminar +issues.due_date_not_writer=Necesita acceso de escritura a este repositorio para actualizar la fecha límite de de una incidencia. issues.due_date_not_set=Sin fecha de vencimiento. issues.due_date_added=añadió la fecha de vencimiento %s %s issues.due_date_modified=modificó la fecha de vencimiento de %[2]s a %[1]s %[3]s @@ -1559,6 +1611,9 @@ issues.due_date_invalid=La fecha de vencimiento es inválida o está fuera de ra issues.dependency.title=Dependencias issues.dependency.issue_no_dependencies=No se han establecido dependencias. issues.dependency.pr_no_dependencies=No se han establecido dependencias. +issues.dependency.no_permission_1=No tienes permiso para leer la dependencia %d +issues.dependency.no_permission_n=No tienes permiso para leer las dependencias %d +issues.dependency.no_permission.can_remove=No tienes permiso para leer esta dependencia, pero puedes eliminarla issues.dependency.add=Añadir dependencia… issues.dependency.cancel=Cancelar issues.dependency.remove=Eliminar @@ -1570,6 +1625,7 @@ issues.dependency.issue_closing_blockedby=Cerrando esta incidencia esta bloquead issues.dependency.issue_close_blocks=Esta incidencia bloquea el cierre de las siguientes incidencias issues.dependency.pr_close_blocks=Este pull request bloquea el cierre de las siguientes incidencias issues.dependency.issue_close_blocked=Necesita cerrar todos las incidencias que bloquean esta incidencia antes de que se puede cerrar. +issues.dependency.issue_batch_close_blocked=No se pueden cerrar por lotes las incidencias que has seleccionado, ya que la incidencia #%d todavía tiene dependencias abiertas issues.dependency.pr_close_blocked=Necesita cerrar todos las incidencias que bloquean este pull request antes de poder fusionarse. issues.dependency.blocks_short=Bloquea issues.dependency.blocked_by_short=Depende de @@ -1597,9 +1653,13 @@ issues.review.add_review_request=solicitud de revisión de %s %s issues.review.remove_review_request=solicitud de revisión eliminada para %s %s issues.review.remove_review_request_self=rechazó revisar %s issues.review.pending=Pendiente +issues.review.pending.tooltip=Este comentario no es visible actualmente para otros usuarios. Para enviar sus comentarios pendientes, seleccione "%s" -> "%s/%s/%s" en la parte superior de la página. issues.review.review=Revisar issues.review.reviewers=Revisores issues.review.outdated=Obsoleto +issues.review.outdated_description=El contenido ha cambiado desde que se hizo este comentario +issues.review.option.show_outdated_comments=Mostrar comentarios desactualizados +issues.review.option.hide_outdated_comments=Ocultar comentarios desactualizados issues.review.show_outdated=Mostrar obsoletos issues.review.hide_outdated=Ocultar obsoletos issues.review.show_resolved=Mostrar resueltos @@ -1631,12 +1691,21 @@ pulls.compare_changes_desc=Seleccione la rama en la que se fusiona y la rama a r pulls.has_viewed_file=Visto pulls.has_changed_since_last_review=Cambiado desde tu última revisión pulls.viewed_files_label=%[1]d / %[2]d archivos vistos +pulls.expand_files=Expandir todos los archivos +pulls.collapse_files=Contraer todos los archivos pulls.compare_base=fusionar en pulls.compare_compare=recuperar de pulls.switch_comparison_type=Cambiar tipo de comparación pulls.switch_head_and_base=Intercambiar cabeza y base pulls.filter_branch=Filtrar rama pulls.no_results=Sin resultados. +pulls.show_all_commits=Mostrar todos los commits +pulls.show_changes_since_your_last_review=Mostrar cambios desde tu última revisión +pulls.showing_only_single_commit=Mostrando solo los cambios del commit %[1]s +pulls.showing_specified_commit_range=Mostrando solo cambios entre %[1]s..%[2]s +pulls.select_commit_hold_shift_for_range=Seleccionar commit. Mantener pulsado shift + clic para seleccionar un rango +pulls.review_only_possible_for_full_diff=La revisión solo es posible cuando se ve la diff completa +pulls.filter_changes_by_commit=Filtrar por commit pulls.nothing_to_compare=Estas ramas son iguales. No hay necesidad para crear un pull request. pulls.nothing_to_compare_and_allow_empty_pr=Estas ramas son iguales. Este PR estará vacío. pulls.has_pull_request=`Ya existe un pull request entre estas ramas: %[2]s#%[3]d` @@ -1650,7 +1719,10 @@ pulls.tab_files=Archivos modificados pulls.reopen_to_merge=Vuelva a abrir este Pull Request para realizar una fusión. pulls.cant_reopen_deleted_branch=Este pull request no se puede reabrir porque la rama fue eliminada. pulls.merged=Fusionado +pulls.merged_success=Se fusionó y cerró la solicitud de incorporación correctamente +pulls.closed=Se cerró la solicitud de incorporación pulls.manually_merged=Fusionado manualmente +pulls.merged_info_text=Ahora se puede eliminar la rama %s. pulls.is_closed=El pull request ha sido cerrado. pulls.title_wip_desc=`Comience el título con %s para prevenir que el pull request se fusione accidentalmente.` pulls.cannot_merge_work_in_progress=Este pull request está marcado como un trabajo en curso. @@ -1665,6 +1737,12 @@ pulls.is_empty=Los cambios en esta rama ya están en la rama de destino. Esto se pulls.required_status_check_failed=Algunos controles requeridos no han tenido éxito. pulls.required_status_check_missing=Faltan algunos controles necesarios. pulls.required_status_check_administrator=Como administrador, aún puede fusionar este Pull Request. +pulls.blocked_by_approvals=Esta pull request aún no tiene suficientes aprobaciones. %d de %d aprobaciones concedidas. +pulls.blocked_by_rejection=Este pull request tiene cambios solicitados por un revisor oficial. +pulls.blocked_by_official_review_requests=Esta pull request tiene solicitudes de revisión oficiales. +pulls.blocked_by_outdated_branch=Esta pull request está bloqueada porque está desactualizada. +pulls.blocked_by_changed_protected_files_1=Esta pull request está bloqueada porque cambia un archivo protegido: +pulls.blocked_by_changed_protected_files_n=Esta pull request está bloqueada porque cambia archivos protegidos: pulls.can_auto_merge_desc=Este Pull Request puede ser fusionado automáticamente. pulls.cannot_auto_merge_desc=Este pull request no se puede combinar automáticamente debido a conflictos. pulls.cannot_auto_merge_helper=Combinar manualmente para resolver los conflictos. @@ -1699,6 +1777,7 @@ pulls.rebase_conflict_summary=Mensaje de error pulls.unrelated_histories=Fusionar Fallidos: El jefe de fusión y la base no comparten un historial común. Pista: Prueba una estrategia diferente pulls.merge_out_of_date=Fusión fallida: Mientras se generaba la fusión, la base fue actualizada. Pista: Inténtelo de nuevo. pulls.head_out_of_date=Fusión fallida: Mientras se generaba la fusión, la cabeza fue actualizada. Pista: Inténtelo de nuevo. +pulls.has_merged=Error: La pull request ha sido fusionada, no puedes fusionarla de nuevo ni cambiar la rama objetivo. pulls.push_rejected=Fusión fallida: El push fue rechazado. Revise los Git Hooks para este repositorio. pulls.push_rejected_summary=Mensaje completo de rechazo pulls.push_rejected_no_message=Fusión fallida: El push fue rechazado pero no hubo mensaje remoto.
Revise los Git Hooks para este repositorio @@ -1715,11 +1794,14 @@ pulls.update_branch_rebase=Actualizar rama por cambio de base pulls.update_branch_success=La actualización de la rama ha finalizado correctamente pulls.update_not_allowed=No tiene permisos para actualizar esta rama pulls.outdated_with_base_branch=Esta rama está desactualizada con la rama base +pulls.close=Cerrar Pull Request pulls.closed_at=`cerró este pull request %[2]s` pulls.reopened_at=`reabrió este pull request %[2]s` pulls.merge_instruction_hint=`También puede ver instrucciones de línea de comandos.` pulls.merge_instruction_step1_desc=Desde el repositorio de su proyecto, revisa una nueva rama y prueba los cambios. pulls.merge_instruction_step2_desc=Combine los cambios y actualice en Gitea. +pulls.clear_merge_message=Borrar mensaje de fusión +pulls.clear_merge_message_hint=Limpiar el mensaje de fusión solo eliminará el contenido del mensaje de commit y mantendrá frases generadas como "Co-Autorizado por …". pulls.auto_merge_button_when_succeed=(cuando las comprobaciones tengan éxito) pulls.auto_merge_when_succeed=Fusionar automática cuando todas las comprobaciones tengan éxito @@ -1736,13 +1818,17 @@ pulls.auto_merge_canceled_schedule_comment=`canceló la fusión automática de e pulls.delete.title=¿Borrar este pull request? pulls.delete.text=¿Realmente quieres eliminar esta pull request? (Esto eliminará permanentemente todo el contenido. Considera cerrarlo si simplemente deseas archivarlo) +pulls.recently_pushed_new_branches=Has realizado push en la rama %[1]s %[2]s +pull.deleted_branch=(eliminado):%s milestones.new=Nuevo hito milestones.closed=Cerrada %s +milestones.update_ago=Actualizado %s milestones.no_due_date=Sin fecha límite milestones.open=Abrir milestones.close=Cerrar +milestones.new_subheader=Los hitos pueden ayudarle a organizar los problemas y monitorizar su progreso. milestones.completeness=%d%% Completado milestones.create=Crear hito milestones.title=Título @@ -1750,18 +1836,31 @@ milestones.desc=Descripción milestones.due_date=Fecha límite (opcional) milestones.clear=Limpiar milestones.invalid_due_date_format=El formato de fecha de vencimiento debe ser 'AAAA-mm-dd'. +milestones.create_success=Se ha creado el hito "%s". milestones.edit=Editar Milestone milestones.edit_subheader=Los hitos organizan los problemas y siguen el progreso. milestones.cancel=Cancelar milestones.modify=Actualizar hito +milestones.edit_success=Se ha actualizado el hito "%s". milestones.deletion=Eliminar hito milestones.deletion_desc=Eliminando un hito lo elimina de todos los problemas relacionados. ¿Continuar? milestones.deletion_success=El hito se ha eliminado. +milestones.filter_sort.earliest_due_data=Fecha de vencimiento más temprana +milestones.filter_sort.latest_due_date=Fecha de vencimiento más lejana milestones.filter_sort.least_complete=Menos completa milestones.filter_sort.most_complete=Más completa milestones.filter_sort.most_issues=Mayoría de los problemas milestones.filter_sort.least_issues=Menos problemas +signing.will_sign=Este commit se firmará con la clave "%s". +signing.wont_sign.error=Hubo un error mientras se comprobaba si la confirmación podía ser firmada. +signing.wont_sign.nokey=No hay ninguna clave disponible para firmar este commit. +signing.wont_sign.never=Nunca se firman los commits. +signing.wont_sign.always=Siempre se firman los commits. +signing.wont_sign.pubkey=El commit no se firmará porque no tiene una clave pública asociada a su cuenta. +signing.wont_sign.twofa=Debe tener habilitada la autenticación de doble factor para tener los commits firmados. +signing.wont_sign.parentsigned=El commit no será firmado ya que el commit padre no está firmado. +signing.wont_sign.basesigned=La fusión no se firmará ya que el commit base no está firmado. signing.wont_sign.headsigned=La fusión no se firmará ya que el commit principal no está firmado. signing.wont_sign.commitssigned=La fusión no se firmará ya que todos los commits asociados no están firmados. signing.wont_sign.approved=La fusión no se firmará ya que el PR no está aprobado. @@ -2212,8 +2311,17 @@ settings.dismiss_stale_approvals_desc=Cuando los nuevos commits que cambien el c settings.require_signed_commits=Requiere commits firmados settings.require_signed_commits_desc=Rechazar push en esta rama si los commits no están firmados o no son verificables. settings.protect_branch_name_pattern=Patrón de nombre de la rama protegida +settings.protect_branch_name_pattern_desc=Patrones de nombre de rama protegidos. Consulte la documentación para la sintaxis de patrones. Ejemplos: principal, lanzamiento/** +settings.protect_patterns=Patrones +settings.protect_protected_file_patterns=Patrones de archivos protegidos (separados con punto y coma ';'): +settings.protect_protected_file_patterns_desc=No está permitido cambiar archivos directamente incluso si el usuario tiene permiso para agregar, editar o borrar archivos en esta rama. Múltiples patrones pueden separarse usando punto y coma (';'). Refvisa la documentación de github.com/gobwas/glob para la sintaxis de patrones. Ejemplos: .drone.yml, /docs/**/*.txt. +settings.protect_unprotected_file_patterns=Patrones de archivos sin protección (separados con punto y coma ';'): +settings.protect_unprotected_file_patterns_desc=Los archivos sin protección se pueden cambiar directamente si el usuario tiene acceso de escritura, evitando la restricción push. Múltiples patrones pueden separarse usando punto y coma (';'). Vea la documentación de github.com/gobwas/glob para la sintaxis de patrones. Ejemplos: .drone.yml, /docs/**/*.txt. settings.add_protected_branch=Activar protección settings.delete_protected_branch=Desactivar protección +settings.update_protect_branch_success=Se ha actualizado la protección de la rama para la regla "%s". +settings.remove_protected_branch_success=Se ha eliminado la protección de la rama para la regla "%s". +settings.remove_protected_branch_failed=Error al eliminar la regla de protección de rama "%s". settings.protected_branch_deletion=Desactivar protección de rama settings.protected_branch_deletion_desc=Desactivar la protección de la rama permite a los usuarios con permiso de escritura hacer push a la rama. ¿Continuar? settings.block_rejected_reviews=Bloquear fusión en las revisión rechazadas @@ -2223,10 +2331,13 @@ settings.block_on_official_review_requests_desc=Fusionar no será posible cuando settings.block_outdated_branch=Bloquear fusión si la pull request está desactualizada settings.block_outdated_branch_desc=La fusión no será posible cuando la rama principal esté detrás de la rama base. settings.default_branch_desc=Seleccione una rama de repositorio por defecto para los pull request y los commits: +settings.merge_style_desc=Estilos de fusión settings.default_merge_style_desc=Estilo de fusión por defecto para pull requests: settings.choose_branch=Elija una rama… settings.no_protected_branch=No hay ramas protegidas. settings.edit_protected_branch=Editar +settings.protected_branch_required_rule_name=Nombre de regla requerido +settings.protected_branch_duplicate_rule_name=Nombre de regla duplicado settings.protected_branch_required_approvals_min=Las aprobaciones necesarias no pueden ser negativas. settings.tags=Etiquetas settings.tags.protection=Protección de etiquetas @@ -2237,18 +2348,26 @@ settings.tags.protection.allowed.teams=Equipos permitidos settings.tags.protection.allowed.noone=Ningún settings.tags.protection.create=Proteger Etiqueta settings.tags.protection.none=No hay etiquetas protegidas. +settings.tags.protection.pattern.description=Puede usar un solo nombre, un patrón de glob o expresión regular para que coincida con varias etiquetas. Lea más en la guía de etiquetas protegidas. settings.bot_token=Token del Bot settings.chat_id=ID Chat +settings.thread_id=ID del hilo settings.matrix.homeserver_url=URL de Homeserver settings.matrix.room_id=ID de sala settings.matrix.message_type=Tipo de mensaje settings.archive.button=Archivar Repositorio settings.archive.header=Archivar este repositorio +settings.archive.text=Archivar el repositorio lo hará de sólo lectura. Se ocultará del tablero. Nadie (¡ni siquiera tú!) será capaz de hacer nuevos commits, o abrir nuevas incidencias o pull requests. settings.archive.success=El repositorio ha sido archivado exitosamente. settings.archive.error=Ha ocurrido un error al intentar archivar el repositorio. Vea el registro para más detalles. settings.archive.error_ismirror=No puede archivar un repositorio replicado. settings.archive.branchsettings_unavailable=Los ajustes de rama no están disponibles si el repositorio está archivado. settings.archive.tagsettings_unavailable=Los ajustes de las etiquetas no están disponibles si el repositorio está archivado. +settings.unarchive.button=Desarchivar repositorio +settings.unarchive.header=Desarchivar este repositorio +settings.unarchive.text=La desarchivación del repositorio restablecerá su capacidad de recibir commits y pushes, así como nuevas incidencias y pull requests. +settings.unarchive.success=El repositorio se ha desarchivado correctamente. +settings.unarchive.error=Ocurrió un error mientras se trataba de des-archivar el repositorio. Revisa el registro para más detalles. settings.update_avatar_success=El avatar del repositorio ha sido actualizado. settings.lfs=LFS settings.lfs_filelist=No hay archivos LFS almacenados en este repositorio @@ -2315,6 +2434,7 @@ diff.show_more=Ver más diff.load=Cargar Diff diff.generated=generado diff.vendored=vendido +diff.comment.add_line_comment=Añadir comentario en línea diff.comment.placeholder=Deja un comentario diff.comment.markdown_info=Es posible estilizar con markdown. diff.comment.add_single_comment=Añadir solo comentario @@ -2326,13 +2446,17 @@ diff.review.header=Enviar revisión diff.review.placeholder=Comentario de revisión diff.review.comment=Comentario diff.review.approve=Aprobar +diff.review.self_reject=Los autores del pull request no pueden solicitar cambios diff.review.reject=Solicitud de cambios +diff.review.self_approve=Los autores del pull request no pueden aprobarlo diff.committed_by=cometido por diff.protected=Protegido diff.image.side_by_side=Lado a lado diff.image.swipe=Deslizar diff.image.overlay=Superposición diff.has_escaped=Esta línea tiene caracteres Unicode ocultos +diff.show_file_tree=Mostrar árbol de archivos +diff.hide_file_tree=Ocultar árbol de archivos releases.desc=Seguir las versiones y descargas del proyecto. release.releases=Lanzamientos @@ -2346,12 +2470,18 @@ release.compare=Comparar release.edit=editar release.ahead.commits=%d commits release.ahead.target=a %s desde esta versión +tag.ahead.target=a %s desde esta etiqueta release.source_code=Código Fuente release.new_subheader=Los lanzamientos organizan las versiones de proyectos. release.edit_subheader=Los lanzamientos organizan las versiones de proyectos. release.tag_name=Nombre de la etiqueta release.target=Destino release.tag_helper=Escoge una etiqueta existente o crea una nueva. +release.tag_helper_new=Nueva etiqueta. Esta etiqueta se creará desde el destino. +release.tag_helper_existing=Etiqueta actual. +release.title=Título de lanzamiento +release.title_empty=El título no puede estar vacío. +release.message=Describe esta versión release.prerelease_desc=Marcar como Pre-Lanzamiento release.prerelease_helper=Marcar este lanzamiento como no es adecuada para usar en producción. release.cancel=Cancelar @@ -2361,6 +2491,7 @@ release.edit_release=Actualizar Lanzamiento release.delete_release=Eliminar Lanzamiento release.delete_tag=Eliminar Etiqueta release.deletion=Eliminar Lanzamiento +release.deletion_desc=Eliminar un lanzamiento sólo lo elimina de Gitea. No afectará la etiqueta Git, el contenido de su repositorio o su historial. ¿Continuar? release.deletion_success=El lanzamiento ha sido eliminado. release.deletion_tag_desc=Eliminará esta etiqueta del repositorio. El contenido del repositorio y el historial permanecerán sin cambios. ¿Continuar? release.deletion_tag_success=La etiqueta ha sido eliminada. @@ -2372,12 +2503,30 @@ release.downloads=Descargas release.download_count=Descargas: %s release.add_tag_msg=Utilice el título y el contenido de la liberación como mensaje de etiqueta. release.add_tag=Crear solo etiqueta +release.releases_for=Lanzamientos para %s +release.tags_for=Etiquetas para %s branch.name=Nombre de la rama +branch.search=Buscar rama +branch.already_exists=Una rama llamada "%s" ya existe. branch.delete_head=Eliminar +branch.delete=`Eliminar rama "%s "` branch.delete_html=Eliminar rama +branch.delete_desc=Eliminar una rama es permanente. Aunque la rama eliminada puede continuar existiendo durante un corto tiempo antes de que sea eliminada, en la mayoría de los casos NO PUEDE deshacerse. ¿Continuar? +branch.deletion_success=La rama "%s" ha sido eliminada. +branch.deletion_failed=Error al eliminar la rama "%s". +branch.delete_branch_has_new_commits=La rama "%s" no se puede eliminar porque se han añadido nuevos commits después de la fusión. branch.create_branch=Crear rama %s +branch.create_from=`de "%s"` +branch.create_success=La rama "%s" ha sido creada. +branch.branch_already_exists=La rama "%s" ya existe en este repositorio. +branch.branch_name_conflict=El nombre de la rama "%s" entra en conflicto con la rama existente "%s". +branch.tag_collision=La rama "%s" no se puede crear como una etiqueta con el mismo nombre ya existe en el repositorio. branch.deleted_by=Eliminada por %s +branch.restore_success=La rama "%s" ha sido restaurada. +branch.restore_failed=Error al restaurar la rama "%s". +branch.protected_deletion_failed=La rama "%s" está protegida. No se puede eliminar. +branch.default_deletion_failed=La rama "%s" es la rama por defecto. No se puede eliminar. branch.restore=`Restaurar rama "%s"` branch.download=`Descargar rama "%s"` branch.rename=`Renombrar rama "%s"` @@ -2869,6 +3018,7 @@ auths.deletion_success=El origen de autenticación ha sido eliminado. auths.login_source_exist=La fuente de autenticación "%s" ya existe. auths.login_source_of_type_exist=Ya existe un origen de autenticación de este tipo. auths.unable_to_initialize_openid=No se puede inicializar el proveedor de OpenID Connect: %s +auths.invalid_openIdConnectAutoDiscoveryURL=URL de auto descubrimiento no válida (esta debe ser una URL válida comenzando con http:// o https://) config.server_config=Configuración del servidor config.app_name=Título del sitio @@ -2882,6 +3032,7 @@ config.disable_router_log=Deshabilitar Log del Router config.run_user=Ejecutar como usuario config.run_mode=Modo de ejecución config.git_version=Versión de Git +config.app_data_path=Ruta de datos de Gitea config.repo_root_path=Ruta del Repositorio config.lfs_root_path=Ruta raíz de LFS config.log_file_root_path=Ruta de ficheros de registro @@ -2957,6 +3108,9 @@ config.mailer_sendmail_timeout=Tiempo de espera de Sendmail config.mailer_use_dummy=Dummy config.test_email_placeholder=Correo electrónico (ej. test@ejemplo.com) config.send_test_mail=Enviar prueba de correo +config.send_test_mail_submit=Enviar +config.test_mail_failed=Fallo al enviar un correo electrónico de prueba a "%s": %v +config.test_mail_sent=Se ha enviado un correo electrónico de prueba a "%s". config.oauth_config=Configuración OAuth config.oauth_enabled=Activado @@ -2994,12 +3148,15 @@ config.git_pull_timeout=Tiempo de espera de operación de pull config.git_gc_timeout=Tiempo de espera de operación de GC config.log_config=Configuración del Log +config.logger_name_fmt=Registro: %s config.disabled_logger=Desactivado config.access_log_mode=Modo de registro del Acceso +config.access_log_template=Plantilla de registro de acceso config.xorm_log_sql=Registrar SQL config.set_setting_failed=Error al configurar %s +monitor.stats=Estadísticas monitor.cron=Tareas de Cron monitor.name=Nombre @@ -3009,6 +3166,8 @@ monitor.previous=Anterior monitor.execute_times=Ejecuciones monitor.process=Procesos en ejecución monitor.stacktrace=Rastros de pila +monitor.processes_count=%d procesos +monitor.download_diagnosis_report=Descargar informe de diagnóstico monitor.desc=Descripción monitor.start=Hora de Inicio monitor.execute_time=Tiempo de ejecución @@ -3024,14 +3183,19 @@ monitor.queue.name=Nombre monitor.queue.type=Tipo monitor.queue.exemplar=Ejemplo monitor.queue.numberworkers=Número de trabajadores +monitor.queue.activeworkers=Trabajadores activos monitor.queue.maxnumberworkers=Número máximo de trabajadores monitor.queue.numberinqueue=Número en cola +monitor.queue.review_add=Revisar / Añadir Trabajadores monitor.queue.settings.title=Ajustes del grupo +monitor.queue.settings.desc=Los grupos de trabajadores crecen dinámicamente en respuesta al bloqueo de cola de sus trabajadores. monitor.queue.settings.maxnumberworkers=Número máximo de trabajadores monitor.queue.settings.maxnumberworkers.placeholder=Actualmente %[1]d monitor.queue.settings.maxnumberworkers.error=El número máximo de trabajadores debe ser un número monitor.queue.settings.submit=Actualizar ajustes monitor.queue.settings.changed=Ajustes actualizados +monitor.queue.settings.remove_all_items=Eliminar todo +monitor.queue.settings.remove_all_items_done=Todos los elementos en la cola han sido eliminados. notices.system_notice_list=Notificaciones del Sistema notices.view_detail_header=Ver detalles de notificación @@ -3141,7 +3305,9 @@ error.unit_not_allowed=No tiene permisos para acceder a esta sección del reposi title=Paquetes desc=Administrar paquetes del repositorio. empty=Todavía no hay paquetes. +empty.documentation=Para más información sobre el registro de paquetes, consulte la documentación. empty.repo=¿Has subido un paquete, pero no se muestra aquí? Ve a la configuración del paquete y añade el link a este repositorio. +registry.documentation=Para obtener más información sobre el registro %s, consulte la documentación. filter.type=Tipo filter.type.all=Todo filter.no_result=El filtro no produjo ningún resultado. @@ -3157,15 +3323,27 @@ keywords=Palabras clave details=Detalles details.author=Autoría details.project_site=Sitio del proyecto +details.repository_site=Sitio del repositorio +details.documentation_site=Sitio de documentación details.license=Licencia assets=Activos versions=Versiones versions.view_all=Ver todo dependency.id=Id. dependency.version=Versión +alpine.registry=Configura este registro agregando la url en tu archivo ./apk/repositories: +alpine.registry.key=Descargue la clave RSA pública del registro en la carpeta ./apk/keys/ para verificar la firma del índice: +alpine.registry.info=Seleccione $branch y $repository de la siguiente lista. alpine.install=Para instalar el paquete, ejecute el siguiente comando: +alpine.repository=Información del repositorio alpine.repository.branches=Ramas alpine.repository.repositories=Repositorios +alpine.repository.architectures=Arquitecturas +cargo.registry=Configurar este registro en el archivo de configuración de Cargo (por ejemplo ~/.cargo/config.toml): +cargo.install=Para instalar el paquete usando Cargo, ejecute el siguiente comando: +cargo.details.repository_site=Sitio del repositorio +cargo.details.documentation_site=Sitio de documentación +chef.registry=Configura este registro en tu archivo ~/.chef/config.rb: chef.install=Para instalar el paquete, ejecute el siguiente comando: composer.registry=Configura este registro en el archivo ~/.composer/config.json: composer.install=Para instalar el paquete usando Composer, ejecute el siguiente comando: @@ -3174,6 +3352,10 @@ composer.dependencies.development=Dependencias de desarrollo conan.details.repository=Repositorio conan.registry=Configurar este registro desde la línea de comandos: conan.install=Para instalar el paquete usando Conan, ejecuta el siguiente comando: +conda.registry=Configura este registro como un repositorio Conda en tu archivo .condarc: +conda.install=Para instalar el paquete usando Conda, ejecute el siguiente comando: +conda.details.repository_site=Sitio del repositorio +conda.details.documentation_site=Sitio de documentación container.details.type=Tipo de imagen container.details.platform=Plataforma container.pull=Arrastra la imagen desde la línea de comandos: @@ -3183,10 +3365,17 @@ container.layers=Capas de imagen container.labels=Etiquetas container.labels.key=Clave container.labels.value=Valor +cran.registry=Configurar este registro en su archivo Rprofile.site: cran.install=Para instalar el paquete, ejecute el siguiente comando: debian.registry=Configurar este registro desde la línea de comandos: +debian.registry.info=Seleccione $distribution y $component de la siguiente lista. debian.install=Para instalar el paquete, ejecute el siguiente comando: +debian.repository=Información del repositorio +debian.repository.distributions=Distribuciones +debian.repository.components=Componentes +debian.repository.architectures=Arquitecturas generic.download=Descargar paquete desde la línea de comandos: +go.install=Instalar el paquete desde la línea de comandos: helm.registry=Configurar este registro desde la línea de comandos: helm.install=Para instalar el paquete, ejecute el siguiente comando: maven.registry=Configure este registro en su proyecto pom.xml archivo: @@ -3208,6 +3397,8 @@ pub.install=Para instalar el paquete usando Dart, ejecute el siguiente comando: pypi.requires=Requiere Python pypi.install=Para instalar el paquete usando pip, ejecute el siguiente comando: rpm.registry=Configurar este registro desde la línea de comandos: +rpm.distros.redhat=en distribuciones basadas en RedHat +rpm.distros.suse=en distribuciones basadas en SUSE rpm.install=Para instalar el paquete, ejecute el siguiente comando: rubygems.install=Para instalar el paquete usando gem, ejecute el siguiente comando: rubygems.install2=o añádelo al archivo Gemfile: @@ -3216,6 +3407,8 @@ rubygems.dependencies.development=Dependencias de desarrollo rubygems.required.ruby=Requiere versión Ruby rubygems.required.rubygems=Requiere la versión de RubyGem swift.registry=Configurar este registro desde la línea de comandos: +swift.install=Añade el paquete en tu archivo Package.swift: +swift.install2=y ejecuta el siguiente comando: vagrant.install=Para añadir un paquete Vagrant, ejecuta el siguiente comando: settings.link=Vincular este paquete a un repositorio settings.link.description=Si enlaza un paquete con un repositorio, el paquete se enumera en la lista de paquetes del repositorio. @@ -3228,6 +3421,12 @@ settings.delete.description=La eliminación de un paquete es permanente y no se settings.delete.notice=Está a punto de eliminar %s (%s). Esta operación es irreversible, ¿está seguro? settings.delete.success=Se ha eliminado el paquete. settings.delete.error=No se pudo eliminar el paquete. +owner.settings.cargo.title=Índice del registro Cargo +owner.settings.cargo.initialize=Inicializar índice +owner.settings.cargo.initialize.description=Se necesita un repositorio Git de índice especial para usar el registro de Cargo. Usar esta opción (re)creará el repositorio y lo configurará automáticamente. +owner.settings.cargo.initialize.error=Fallo al inicializar el índice de Cargo: %v +owner.settings.cargo.initialize.success=El índice de Cargo se ha creado correctamente. +owner.settings.cargo.rebuild=Reconstruir índice owner.settings.cargo.rebuild.description=Reconstruir puede ser útil si el índice no se sincroniza con los paquetes de Cargo almacenados. owner.settings.cargo.rebuild.error=Fallo al reconstruir el índice de Cargo: %v owner.settings.cargo.rebuild.success=El índice de Cargo se ha reconstruido correctamente. @@ -3294,19 +3493,68 @@ runners.name=Nombre runners.owner_type=Tipo runners.description=Descripción runners.labels=Etiquetas +runners.last_online=Última hora en línea +runners.runner_title=Nodo +runners.task_list=Tareas recientes en este nodo +runners.task_list.no_tasks=Todavía no hay tarea. runners.task_list.run=Ejecutar runners.task_list.status=Estado runners.task_list.repository=Repositorio runners.task_list.commit=Commit +runners.task_list.done_at=Hecho en +runners.edit_runner=Editar nodo +runners.update_runner=Actualizar cambios +runners.update_runner_success=Nodo actualizado correctamente +runners.update_runner_failed=Fallo al actualizar el nodo +runners.delete_runner=Eliminar este nodo +runners.delete_runner_success=Nodo eliminado con éxito +runners.delete_runner_failed=Fallo al eliminar el nodo +runners.delete_runner_header=Confirma para eliminar el nodo +runners.delete_runner_notice=Si una tarea se está ejecutando en este nodo, se terminará y marcará como fallida. Puede romper el flujo de trabajo en curso. +runners.none=No hay nodos disponibles runners.status.unspecified=Desconocido +runners.status.idle=Inactivo runners.status.active=Activo +runners.status.offline=Desconectado runners.version=Versión +runners.reset_registration_token=Restablecer token de registro +runners.reset_registration_token_success=Se ha restablecido correctamente el token de registro del nodo +runs.all_workflows=Todos los flujos de trabajo runs.commit=Commit +runs.scheduled=Programado +runs.pushed_by=push enviado por +runs.invalid_workflow_helper=El archivo de configuración del trabajo no es válido. Revisa tu archivo de configuración: %s +runs.no_matching_runner_helper=No hay nodo coincidente: %s +runs.actor=Actor runs.status=Estado +runs.actors_no_select=Todos los actores +runs.status_no_select=Todo el estado +runs.no_results=No hay resultados coincidentes. +runs.no_runs=El flujo de trabajo no tiene ejecuciones todavía. +workflow.disable=Desactivar fllujo de trabajo +workflow.disable_success=Flujo de trabajo '%s' deshabilitado correctamente. +workflow.enable=Activar flujo de trabajo +workflow.enable_success=Flujo de trabajo '%s' habilitado con éxito. +workflow.disabled=El flujo de trabajo está deshabilitado. +need_approval_desc=Necesita aprobación para ejecutar flujos de trabajo para el pull request del fork. +variables=Variables +variables.management=Gestión de variables +variables.creation=Añadir variable +variables.none=Aún no hay variables. +variables.deletion=Eliminar variable +variables.deletion.description=Eliminar una variable es permanente y no se puede deshacer. ¿Continuar? +variables.description=Las variables se pasarán a ciertas acciones y no se podrán leer de otro modo. +variables.id_not_exist=Variable con id %d no existe. +variables.edit=Editar variable +variables.deletion.failed=No se pudo eliminar la variable. +variables.deletion.success=La variable ha sido eliminada. +variables.creation.failed=No se pudo agregar la variable. +variables.creation.success=La variable "%s" ha sido añadida. +variables.update.failed=Error al editar la variable. variables.update.success=La variable ha sido editada. [projects] From 9b991f2947e923673bf1917ede7e38b71a39afcb Mon Sep 17 00:00:00 2001 From: HoshinoRei <81515470+HoshinoRei@users.noreply.github.com> Date: Sun, 22 Oct 2023 19:37:56 +0800 Subject: [PATCH 0005/1066] Fix an indentation in the Chinese documentation of Act Runner (#27730) In the [English document](https://docs.gitea.com/1.21/usage/actions/act-runner#configuring-cache-when-starting-a-runner-using-docker-image), there is indentation here, but there is no indentation in the Chinese document. --- docs/content/usage/actions/act-runner.zh-cn.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/content/usage/actions/act-runner.zh-cn.md b/docs/content/usage/actions/act-runner.zh-cn.md index f1404bf0b4..11b69960f7 100644 --- a/docs/content/usage/actions/act-runner.zh-cn.md +++ b/docs/content/usage/actions/act-runner.zh-cn.md @@ -208,12 +208,12 @@ services: ```yaml cache: -enabled: true -dir: "" -# 使用步骤 1. 获取的 LAN IP -host: "192.168.8.17" -# 使用步骤 2. 获取的端口号 -port: 8088 + enabled: true + dir: "" + # 使用步骤 1. 获取的 LAN IP + host: "192.168.8.17" + # 使用步骤 2. 获取的端口号 + port: 8088 ``` - 4.启动容器时, 将 Cache 端口映射至主机。 From 16cfa1784402856c7477fefe942d552b49908112 Mon Sep 17 00:00:00 2001 From: Denys Konovalov Date: Sun, 22 Oct 2023 13:59:31 +0200 Subject: [PATCH 0006/1066] fix issues in translation file (#27699) - use correct comment sign for INI (`;`) - remove duplicated `repo.branch.search` key - remove duplicated spaces & similar --- options/locale/locale_en-US.ini | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 84c457e9e8..d34d10566e 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -355,7 +355,6 @@ code_last_indexed_at = Last indexed %s relevant_repositories_tooltip = Repositories that are forks or that have no topic, no icon, and no description are hidden. relevant_repositories = Only relevant repositories are being shown, show unfiltered results. - [auth] create_new_account = Register Account register_helper_msg = Already have an account? Sign in now! @@ -858,7 +857,7 @@ oauth2_client_secret_hint = The secret will not be shown again after you leave o oauth2_application_edit = Edit oauth2_application_create_description = OAuth2 applications gives your third-party application access to user accounts on this instance. oauth2_application_remove_description = Removing an OAuth2 application will prevent it from accessing authorized user accounts on this instance. Continue? -oauth2_application_locked = Gitea pre-registers some OAuth2 applications on startup if enabled in config. To prevent unexpected bahavior, these can neither be edited nor removed. Please refer to the OAuth2 documentation for more information. +oauth2_application_locked = Gitea pre-registers some OAuth2 applications on startup if enabled in config. To prevent unexpected behavior, these can neither be edited nor removed. Please refer to the OAuth2 documentation for more information. authorized_oauth2_applications = Authorized OAuth2 Applications authorized_oauth2_applications_description = You have granted access to your personal Gitea account to these third party applications. Please revoke access for applications you no longer need. @@ -926,7 +925,7 @@ visibility.private = Private visibility.private_tooltip = Visible only to members of organizations you have joined [repo] -new_repo_helper = A repository contains all project files, including revision history. Already hosting one elsewhere? Migrate repository. +new_repo_helper = A repository contains all project files, including revision history. Already hosting one elsewhere? Migrate repository. owner = Owner owner_helper = Some organizations may not show up in the dropdown due to a maximum repository count limit. repo_name = Repository Name @@ -1023,9 +1022,9 @@ tree_path_not_found_branch = Path %[1]s doesn't exist in branch %[2]s tree_path_not_found_tag = Path %[1]s doesn't exist in tag %[2]s transfer.accept = Accept Transfer -transfer.accept_desc = Transfer to "%s" +transfer.accept_desc = Transfer to "%s" transfer.reject = Reject Transfer -transfer.reject_desc = Cancel transfer to "%s" +transfer.reject_desc = Cancel transfer to "%s" transfer.no_permission_to_accept = You do not have permission to accept this transfer. transfer.no_permission_to_reject = You do not have permission to reject this transfer. @@ -1159,7 +1158,7 @@ releases = Releases tag = Tag released_this = released this tagged_this = tagged this -file.title = %s at %s +file.title = %s at %s file_raw = Raw file_history = History file_view_source = View Source @@ -2507,7 +2506,6 @@ release.releases_for = Releases for %s release.tags_for = Tags for %s branch.name = Branch Name -branch.search = Search branches branch.already_exists = A branch named "%s" already exists. branch.delete_head = Delete branch.delete = Delete Branch "%s" @@ -3174,8 +3172,8 @@ monitor.start = Start Time monitor.execute_time = Execution Time monitor.last_execution_result = Result monitor.process.cancel = Cancel process -monitor.process.cancel_desc = Cancelling a process may cause data loss -monitor.process.cancel_notices = Cancel: %s? +monitor.process.cancel_desc = Cancelling a process may cause data loss +monitor.process.cancel_notices = Cancel: %s? monitor.process.children = Children monitor.queues = Queues @@ -3239,7 +3237,7 @@ mirror_sync_create = synced new reference %[3]s to %[3]s from mirror approve_pull_request = `approved %[3]s#%[2]s` reject_pull_request = `suggested changes for %[3]s#%[2]s` -publish_release = `released "%[4]s" at %[3]s` +publish_release = `released "%[4]s" at %[3]s` review_dismissed = `dismissed review from %[4]s for %[3]s#%[2]s` review_dismissed_reason = Reason: create_branch = created branch %[3]s in %[4]s @@ -3565,7 +3563,7 @@ type-3.display_name = Organization Project [git.filemode] changed_filemode = %[1]s → %[2]s -# Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … +; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … directory = Directory normal_file = Normal file executable_file = Executable file From e3afe4a248ac3a961f332e2ba221bedafa3dfb7e Mon Sep 17 00:00:00 2001 From: tomholford <16504501+tomholford@users.noreply.github.com> Date: Sun, 22 Oct 2023 05:34:16 -0700 Subject: [PATCH 0007/1066] teams: new View button (#27685) Per the discussion on #22054, the flow for adding a new team member to an org is not intuitive for new Gitea users. The ideal solution would be to add a new button on the Org > Members index view (see the screenshot mockup in the issue description). However, this would require a refactor of the UX for the flow. The current flow has an implicit context of which team within the org the new member is being added to ('Owners' by default). From the Members index, there is no implicit context; the flow would have to add a picker for which team the new member should be added to. So, as a stopgap, this change simply adds a button to the Teams index page that performs the same action as clicking on the title of the team (a behavior that is currently too obscure as indicated in the comments on the issue). This should reduce support burden and serve as a decent temporary measure until the Add Member flow is refactored. --------- Co-authored-by: tomholford --- options/locale/locale_en-US.ini | 1 + templates/org/team/teams.tmpl | 1 + 2 files changed, 2 insertions(+) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index d34d10566e..b0c21816ae 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -91,6 +91,7 @@ remove = Remove remove_all = Remove All remove_label_str = Remove item "%s" edit = Edit +view = View enabled = Enabled disabled = Disabled diff --git a/templates/org/team/teams.tmpl b/templates/org/team/teams.tmpl index 6b16da9d11..9723294fd6 100644 --- a/templates/org/team/teams.tmpl +++ b/templates/org/team/teams.tmpl @@ -16,6 +16,7 @@
{{.Name}}
+ {{ctx.Locale.Tr "view"}} {{if .IsMember ctx $.SignedUser.ID}}
{{range .LanguageStats}} -
+
{{end}}
{{end}} diff --git a/web_src/js/modules/tippy.js b/web_src/js/modules/tippy.js index 4eed0aa4bb..ec7ee2141f 100644 --- a/web_src/js/modules/tippy.js +++ b/web_src/js/modules/tippy.js @@ -1,4 +1,4 @@ -import tippy from 'tippy.js'; +import tippy, {followCursor} from 'tippy.js'; const visibleInstances = new Set(); @@ -35,6 +35,7 @@ export function createTippy(target, opts = {}) { arrow: ``, role: 'menu', // HTML role attribute, only tooltips should use "tooltip" theme: other.role || 'menu', // CSS theme, we support either "tooltip" or "menu" + plugins: [followCursor], ...other, }); @@ -78,6 +79,7 @@ function attachTooltip(target, content = null) { theme: 'tooltip', hideOnClick, placement: target.getAttribute('data-tooltip-placement') || 'top-start', + followCursor: target.getAttribute('data-tooltip-follow-cursor') || false, ...(target.getAttribute('data-tooltip-interactive') === 'true' ? {interactive: true, aria: {content: 'describedby', expanded: false}} : {}), }; From f3956fcb28e665ee7f2773f4ae14842405bb2462 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Sun, 22 Oct 2023 22:12:27 +0800 Subject: [PATCH 0009/1066] Fix incorrect ctx usage in defer function (#27740) --- services/task/migrate.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/services/task/migrate.go b/services/task/migrate.go index 475fa7a61b..9cef77a6c8 100644 --- a/services/task/migrate.go +++ b/services/task/migrate.go @@ -42,13 +42,11 @@ func handleCreateError(owner *user_model.User, err error) error { } func runMigrateTask(ctx context.Context, t *admin_model.Task) (err error) { - defer func() { + defer func(ctx context.Context) { if e := recover(); e != nil { err = fmt.Errorf("PANIC whilst trying to do migrate task: %v", e) log.Critical("PANIC during runMigrateTask[%d] by DoerID[%d] to RepoID[%d] for OwnerID[%d]: %v\nStacktrace: %v", t.ID, t.DoerID, t.RepoID, t.OwnerID, e, log.Stack(2)) } - // fixme: Because ctx is canceled here, so the db.DefaultContext is needed. - ctx := db.DefaultContext if err == nil { err = admin_model.FinishMigrateTask(ctx, t) if err == nil { @@ -69,7 +67,7 @@ func runMigrateTask(ctx context.Context, t *admin_model.Task) (err error) { } // then, do not delete the repository, otherwise the users won't be able to see the last error - }() + }(graceful.GetManager().ShutdownContext()) // even if the parent ctx is canceled, this defer-function still needs to update the task record in database if err = t.LoadRepo(ctx); err != nil { return err From 61d94b247ab0c9289cd04253fed78283300e8c5e Mon Sep 17 00:00:00 2001 From: Nanguan Lin <70063547+lng2020@users.noreply.github.com> Date: Mon, 23 Oct 2023 20:34:17 +0800 Subject: [PATCH 0010/1066] Fix `link-action` redirect network error (#27734) image --------- Co-authored-by: 6543 <6543@obermui.de> --- routers/web/repo/milestone.go | 7 ++++--- routers/web/repo/projects.go | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/routers/web/repo/milestone.go b/routers/web/repo/milestone.go index 4db02fce9e..0e6f630747 100644 --- a/routers/web/repo/milestone.go +++ b/routers/web/repo/milestone.go @@ -231,14 +231,15 @@ func EditMilestonePost(ctx *context.Context) { // ChangeMilestoneStatus response for change a milestone's status func ChangeMilestoneStatus(ctx *context.Context) { - toClose := false + var toClose bool switch ctx.Params(":action") { case "open": toClose = false case "close": toClose = true default: - ctx.Redirect(ctx.Repo.RepoLink + "/milestones") + ctx.JSONRedirect(ctx.Repo.RepoLink + "/milestones") + return } id := ctx.ParamsInt64(":id") @@ -250,7 +251,7 @@ func ChangeMilestoneStatus(ctx *context.Context) { } return } - ctx.Redirect(ctx.Repo.RepoLink + "/milestones?state=" + url.QueryEscape(ctx.Params(":action"))) + ctx.JSONRedirect(ctx.Repo.RepoLink + "/milestones?state=" + url.QueryEscape(ctx.Params(":action"))) } // DeleteMilestone delete a milestone diff --git a/routers/web/repo/projects.go b/routers/web/repo/projects.go index ada398fdc8..6417024f8b 100644 --- a/routers/web/repo/projects.go +++ b/routers/web/repo/projects.go @@ -161,14 +161,15 @@ func NewProjectPost(ctx *context.Context) { // ChangeProjectStatus updates the status of a project between "open" and "close" func ChangeProjectStatus(ctx *context.Context) { - toClose := false + var toClose bool switch ctx.Params(":action") { case "open": toClose = false case "close": toClose = true default: - ctx.Redirect(ctx.Repo.RepoLink + "/projects") + ctx.JSONRedirect(ctx.Repo.RepoLink + "/projects") + return } id := ctx.ParamsInt64(":id") @@ -180,7 +181,7 @@ func ChangeProjectStatus(ctx *context.Context) { } return } - ctx.Redirect(ctx.Repo.RepoLink + "/projects?state=" + url.QueryEscape(ctx.Params(":action"))) + ctx.JSONRedirect(ctx.Repo.RepoLink + "/projects?state=" + url.QueryEscape(ctx.Params(":action"))) } // DeleteProject delete a project From 51d1dc22ff94b561b1a3c00f8eb8ac04a4ee2674 Mon Sep 17 00:00:00 2001 From: Nanguan Lin <70063547+lng2020@users.noreply.github.com> Date: Mon, 23 Oct 2023 20:40:33 +0800 Subject: [PATCH 0011/1066] Fix duplicate project board when hitting `enter` key (#27746) When hitting the `enter` key to create a new project column, the request is sent twice because the `submit` event and `key up` event are both triggered. Probably a better solution is to rewrite these parts of the code to avoid using native jQuery but reuse the `form-fetch-action` class. But it's beyond my ability. --- web_src/js/features/repo-projects.js | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/web_src/js/features/repo-projects.js b/web_src/js/features/repo-projects.js index f12d4f234f..5a2a7e72ef 100644 --- a/web_src/js/features/repo-projects.js +++ b/web_src/js/features/repo-projects.js @@ -193,20 +193,6 @@ export function initRepoProject() { const url = $(this).data('url'); createNewColumn(url, columnTitle, projectColorInput); }); - - $('.new-project-column').on('input keyup', (e) => { - const columnTitle = $('#new_project_column'); - const projectColorInput = $('#new_project_column_color_picker'); - if (!columnTitle.val()) { - $('#new_project_column_submit').addClass('disabled'); - return; - } - $('#new_project_column_submit').removeClass('disabled'); - if (e.key === 'Enter') { - const url = $(this).data('url'); - createNewColumn(url, columnTitle, projectColorInput); - } - }); } function setLabelColor(label, color) { From 6352114a77cb67e8797f2c8552328f684092c42d Mon Sep 17 00:00:00 2001 From: Earl Warren <109468362+earl-warren@users.noreply.github.com> Date: Tue, 24 Oct 2023 01:02:00 +0200 Subject: [PATCH 0012/1066] Fix label render containing invalid HTML (#27752) - The label HTML contained a quote that wasn't being closed. Refs: https://codeberg.org/forgejo/forgejo/pulls/1651 (cherry picked from commit e2bc2c9a1fff482c49dbeb3a51e4e1c698bf506c) Co-authored-by: Gusted --- modules/templates/util_render.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/templates/util_render.go b/modules/templates/util_render.go index ed6eae326a..84c3a1587a 100644 --- a/modules/templates/util_render.go +++ b/modules/templates/util_render.go @@ -179,7 +179,7 @@ func RenderLabel(ctx context.Context, label *issues_model.Label) template.HTML { s := fmt.Sprintf(""+ "
%s
"+ - "
%s
"+ + "
%s
"+ "
", description, textColor, scopeColor, scopeText, From def907de7b3cda899846d55f99b0da2640a5274b Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Tue, 24 Oct 2023 10:00:06 +0800 Subject: [PATCH 0013/1066] Fix incorrect "tab" parameter for repo search sub-template (#27755) ![image](https://github.com/go-gitea/gitea/assets/2114189/c546824e-4824-4f4d-bd33-e558c6ddf0ef) ![image](https://github.com/go-gitea/gitea/assets/2114189/713eb72c-22fb-412b-a867-9cccbf7548ec) --- templates/explore/repo_search.tmpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/explore/repo_search.tmpl b/templates/explore/repo_search.tmpl index 31b00d29e3..136d3f8e81 100644 --- a/templates/explore/repo_search.tmpl +++ b/templates/explore/repo_search.tmpl @@ -6,8 +6,8 @@ {{template "shared/searchinput" dict "Value" .Keyword "AutoFocus" true}} {{if .PageIsExploreRepositories}} - {{else}} - + {{else if .TabName}} + {{end}}
From ce83609ff636f4c09d91ac53bee75a350bb571d6 Mon Sep 17 00:00:00 2001 From: silverwind Date: Tue, 24 Oct 2023 04:54:59 +0200 Subject: [PATCH 0014/1066] Upgrade to golangci-lint@v1.55.0 (#27756) https://github.com/golangci/golangci-lint/releases/tag/v1.55.0 --- Makefile | 2 +- models/actions/task.go | 2 +- models/activities/action.go | 3 +- models/issues/review.go | 3 +- modules/activitypub/user_settings.go | 7 +- modules/git/submodule.go | 3 +- modules/lfs/transferadapter_test.go | 5 +- modules/markup/html_test.go | 130 +++++++++++------------ modules/markup/markdown/markdown_test.go | 36 +++---- modules/templates/htmlrenderer.go | 3 +- modules/util/path.go | 3 +- routers/api/v1/repo/pull.go | 3 +- routers/web/repo/cherry_pick.go | 5 +- routers/web/repo/issue_dependency.go | 5 +- routers/web/repo/patch.go | 5 +- services/mailer/mailer.go | 3 +- services/repository/files/temp_repo.go | 3 +- tests/integration/integration_test.go | 3 +- 18 files changed, 105 insertions(+), 119 deletions(-) diff --git a/Makefile b/Makefile index 8e03a71b8d..c38e88a8e0 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ XGO_VERSION := go-1.21.x AIR_PACKAGE ?= github.com/cosmtrek/air@v1.44.0 EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/cmd/editorconfig-checker@2.7.0 GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.5.0 -GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.54.1 +GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.55.0 GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11 MISSPELL_PACKAGE ?= github.com/client9/misspell/cmd/misspell@v0.3.4 SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.30.5 diff --git a/models/actions/task.go b/models/actions/task.go index 69f52cf084..db0031b3b8 100644 --- a/models/actions/task.go +++ b/models/actions/task.go @@ -279,7 +279,7 @@ func CreateTaskForRunner(ctx context.Context, runner *ActionRunner) (*ActionTask return nil, false, fmt.Errorf("parse workflow of job %d: %w", job.ID, err) } else if len(gots) != 1 { return nil, false, fmt.Errorf("workflow of job %d: not single workflow", job.ID) - } else { + } else { //nolint:revive _, workflowJob = gots[0].Job() } diff --git a/models/activities/action.go b/models/activities/action.go index 1bfd62438b..15bd9a52ac 100644 --- a/models/activities/action.go +++ b/models/activities/action.go @@ -713,9 +713,8 @@ func DeleteIssueActions(ctx context.Context, repoID, issueID, issueIndex int64) break } else if _, err = db.GetEngine(ctx).In("comment_id", commentIDs).Delete(&Action{}); err != nil { return err - } else { - lastCommentID = commentIDs[len(commentIDs)-1] } + lastCommentID = commentIDs[len(commentIDs)-1] } _, err := e.Where("repo_id = ?", repoID). diff --git a/models/issues/review.go b/models/issues/review.go index 8b64ba8048..1cb5379b2f 100644 --- a/models/issues/review.go +++ b/models/issues/review.go @@ -213,9 +213,8 @@ func GetReviewByID(ctx context.Context, id int64) (*Review, error) { return nil, err } else if !has { return nil, ErrReviewNotExist{ID: id} - } else { - return review, nil } + return review, nil } // CreateReviewOptions represent the options to create a review. Type, Issue and Reviewer are required. diff --git a/modules/activitypub/user_settings.go b/modules/activitypub/user_settings.go index d196a3806e..7f939af352 100644 --- a/modules/activitypub/user_settings.go +++ b/modules/activitypub/user_settings.go @@ -29,11 +29,10 @@ func GetKeyPair(ctx context.Context, user *user_model.User) (pub, priv string, e return pub, priv, err } return pub, priv, err - } else { - priv = settings[user_model.UserActivityPubPrivPem].SettingValue - pub = settings[user_model.UserActivityPubPubPem].SettingValue - return pub, priv, err } + priv = settings[user_model.UserActivityPubPrivPem].SettingValue + pub = settings[user_model.UserActivityPubPubPem].SettingValue + return pub, priv, err } // GetPublicKey function returns a user's public key diff --git a/modules/git/submodule.go b/modules/git/submodule.go index 3afaa334db..37813ea4c7 100644 --- a/modules/git/submodule.go +++ b/modules/git/submodule.go @@ -101,9 +101,8 @@ func getRefURL(refURL, urlPrefix, repoFullName, sshDomain string) string { return ref.Scheme + "://" + ref.Host + ref.Path } else if urlPrefixHostname == refHostname || refHostname == sshDomain { return urlPrefix + path.Clean(path.Join("/", ref.Path)) - } else { - return "http://" + refHostname + ref.Path } + return "http://" + refHostname + ref.Path } } diff --git a/modules/lfs/transferadapter_test.go b/modules/lfs/transferadapter_test.go index f86d2c54be..6023cd07d3 100644 --- a/modules/lfs/transferadapter_test.go +++ b/modules/lfs/transferadapter_test.go @@ -62,10 +62,9 @@ func TestBasicTransferAdapter(t *testing.T) { json.NewEncoder(payload).Encode(er) return &http.Response{StatusCode: http.StatusNotFound, Body: io.NopCloser(payload)} - } else { - t.Errorf("Unknown test case: %s", url) - return nil } + t.Errorf("Unknown test case: %s", url) + return nil } hc := &http.Client{Transport: RoundTripFunc(roundTripHandler)} diff --git a/modules/markup/html_test.go b/modules/markup/html_test.go index 9156bc6331..21bfc8314a 100644 --- a/modules/markup/html_test.go +++ b/modules/markup/html_test.go @@ -14,7 +14,7 @@ import ( "code.gitea.io/gitea/modules/emoji" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/log" - . "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/markup/markdown" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" @@ -37,12 +37,12 @@ func TestMain(m *testing.M) { } func TestRender_Commits(t *testing.T) { - setting.AppURL = TestAppURL + setting.AppURL = markup.TestAppURL test := func(input, expected string) { - buffer, err := RenderString(&RenderContext{ + buffer, err := markup.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, RelativePath: ".md", - URLPrefix: TestRepoURL, + URLPrefix: markup.TestRepoURL, Metas: localMetas, }, input) assert.NoError(t, err) @@ -50,7 +50,7 @@ func TestRender_Commits(t *testing.T) { } sha := "65f1bf27bc3bf70f64657658635e66094edbcb4d" - repo := TestRepoURL + repo := markup.TestRepoURL commit := util.URLJoin(repo, "commit", sha) tree := util.URLJoin(repo, "tree", sha, "src") @@ -87,10 +87,10 @@ func TestRender_Commits(t *testing.T) { } func TestRender_CrossReferences(t *testing.T) { - setting.AppURL = TestAppURL + setting.AppURL = markup.TestAppURL test := func(input, expected string) { - buffer, err := RenderString(&RenderContext{ + buffer, err := markup.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, RelativePath: "a.md", URLPrefix: setting.AppSubURL, @@ -102,43 +102,43 @@ func TestRender_CrossReferences(t *testing.T) { test( "gogits/gogs#12345", - `

gogits/gogs#12345

`) + `

gogits/gogs#12345

`) test( "go-gitea/gitea#12345", - `

go-gitea/gitea#12345

`) + `

go-gitea/gitea#12345

`) test( "/home/gitea/go-gitea/gitea#12345", `

/home/gitea/go-gitea/gitea#12345

`) test( - util.URLJoin(TestAppURL, "gogitea", "gitea", "issues", "12345"), - `

gogitea/gitea#12345

`) + util.URLJoin(markup.TestAppURL, "gogitea", "gitea", "issues", "12345"), + `

gogitea/gitea#12345

`) test( - util.URLJoin(TestAppURL, "go-gitea", "gitea", "issues", "12345"), - `

go-gitea/gitea#12345

`) + util.URLJoin(markup.TestAppURL, "go-gitea", "gitea", "issues", "12345"), + `

go-gitea/gitea#12345

`) test( - util.URLJoin(TestAppURL, "gogitea", "some-repo-name", "issues", "12345"), - `

gogitea/some-repo-name#12345

`) + util.URLJoin(markup.TestAppURL, "gogitea", "some-repo-name", "issues", "12345"), + `

gogitea/some-repo-name#12345

`) } func TestMisc_IsSameDomain(t *testing.T) { - setting.AppURL = TestAppURL + setting.AppURL = markup.TestAppURL sha := "b6dd6210eaebc915fd5be5579c58cce4da2e2579" - commit := util.URLJoin(TestRepoURL, "commit", sha) + commit := util.URLJoin(markup.TestRepoURL, "commit", sha) - assert.True(t, IsSameDomain(commit)) - assert.False(t, IsSameDomain("http://google.com/ncr")) - assert.False(t, IsSameDomain("favicon.ico")) + assert.True(t, markup.IsSameDomain(commit)) + assert.False(t, markup.IsSameDomain("http://google.com/ncr")) + assert.False(t, markup.IsSameDomain("favicon.ico")) } func TestRender_links(t *testing.T) { - setting.AppURL = TestAppURL + setting.AppURL = markup.TestAppURL test := func(input, expected string) { - buffer, err := RenderString(&RenderContext{ + buffer, err := markup.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, RelativePath: "a.md", - URLPrefix: TestRepoURL, + URLPrefix: markup.TestRepoURL, }, input) assert.NoError(t, err) assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer)) @@ -147,8 +147,8 @@ func TestRender_links(t *testing.T) { defaultCustom := setting.Markdown.CustomURLSchemes setting.Markdown.CustomURLSchemes = []string{"ftp", "magnet"} - InitializeSanitizer() - CustomLinkURLSchemes(setting.Markdown.CustomURLSchemes) + markup.InitializeSanitizer() + markup.CustomLinkURLSchemes(setting.Markdown.CustomURLSchemes) test( "https://www.example.com", @@ -227,18 +227,18 @@ func TestRender_links(t *testing.T) { // Restore previous settings setting.Markdown.CustomURLSchemes = defaultCustom - InitializeSanitizer() - CustomLinkURLSchemes(setting.Markdown.CustomURLSchemes) + markup.InitializeSanitizer() + markup.CustomLinkURLSchemes(setting.Markdown.CustomURLSchemes) } func TestRender_email(t *testing.T) { - setting.AppURL = TestAppURL + setting.AppURL = markup.TestAppURL test := func(input, expected string) { - res, err := RenderString(&RenderContext{ + res, err := markup.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, RelativePath: "a.md", - URLPrefix: TestRepoURL, + URLPrefix: markup.TestRepoURL, }, input) assert.NoError(t, err) assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(res)) @@ -289,15 +289,15 @@ func TestRender_email(t *testing.T) { } func TestRender_emoji(t *testing.T) { - setting.AppURL = TestAppURL - setting.StaticURLPrefix = TestAppURL + setting.AppURL = markup.TestAppURL + setting.StaticURLPrefix = markup.TestAppURL test := func(input, expected string) { expected = strings.ReplaceAll(expected, "&", "&") - buffer, err := RenderString(&RenderContext{ + buffer, err := markup.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, RelativePath: "a.md", - URLPrefix: TestRepoURL, + URLPrefix: markup.TestRepoURL, }, input) assert.NoError(t, err) assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer)) @@ -354,19 +354,19 @@ func TestRender_emoji(t *testing.T) { } func TestRender_ShortLinks(t *testing.T) { - setting.AppURL = TestAppURL - tree := util.URLJoin(TestRepoURL, "src", "master") + setting.AppURL = markup.TestAppURL + tree := util.URLJoin(markup.TestRepoURL, "src", "master") test := func(input, expected, expectedWiki string) { - buffer, err := markdown.RenderString(&RenderContext{ + buffer, err := markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, URLPrefix: tree, }, input) assert.NoError(t, err) assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer)) - buffer, err = markdown.RenderString(&RenderContext{ + buffer, err = markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, - URLPrefix: TestRepoURL, + URLPrefix: markup.TestRepoURL, Metas: localMetas, IsWiki: true, }, input) @@ -374,7 +374,7 @@ func TestRender_ShortLinks(t *testing.T) { assert.Equal(t, strings.TrimSpace(expectedWiki), strings.TrimSpace(buffer)) } - rawtree := util.URLJoin(TestRepoURL, "raw", "master") + rawtree := util.URLJoin(markup.TestRepoURL, "raw", "master") url := util.URLJoin(tree, "Link") otherURL := util.URLJoin(tree, "Other-Link") encodedURL := util.URLJoin(tree, "Link%3F") @@ -382,13 +382,13 @@ func TestRender_ShortLinks(t *testing.T) { otherImgurl := util.URLJoin(rawtree, "Link+Other.jpg") encodedImgurl := util.URLJoin(rawtree, "Link+%23.jpg") notencodedImgurl := util.URLJoin(rawtree, "some", "path", "Link+#.jpg") - urlWiki := util.URLJoin(TestRepoURL, "wiki", "Link") - otherURLWiki := util.URLJoin(TestRepoURL, "wiki", "Other-Link") - encodedURLWiki := util.URLJoin(TestRepoURL, "wiki", "Link%3F") - imgurlWiki := util.URLJoin(TestRepoURL, "wiki", "raw", "Link.jpg") - otherImgurlWiki := util.URLJoin(TestRepoURL, "wiki", "raw", "Link+Other.jpg") - encodedImgurlWiki := util.URLJoin(TestRepoURL, "wiki", "raw", "Link+%23.jpg") - notencodedImgurlWiki := util.URLJoin(TestRepoURL, "wiki", "raw", "some", "path", "Link+#.jpg") + urlWiki := util.URLJoin(markup.TestRepoURL, "wiki", "Link") + otherURLWiki := util.URLJoin(markup.TestRepoURL, "wiki", "Other-Link") + encodedURLWiki := util.URLJoin(markup.TestRepoURL, "wiki", "Link%3F") + imgurlWiki := util.URLJoin(markup.TestRepoURL, "wiki", "raw", "Link.jpg") + otherImgurlWiki := util.URLJoin(markup.TestRepoURL, "wiki", "raw", "Link+Other.jpg") + encodedImgurlWiki := util.URLJoin(markup.TestRepoURL, "wiki", "raw", "Link+%23.jpg") + notencodedImgurlWiki := util.URLJoin(markup.TestRepoURL, "wiki", "raw", "some", "path", "Link+#.jpg") favicon := "http://google.com/favicon.ico" test( @@ -462,20 +462,20 @@ func TestRender_ShortLinks(t *testing.T) { } func TestRender_RelativeImages(t *testing.T) { - setting.AppURL = TestAppURL - tree := util.URLJoin(TestRepoURL, "src", "master") + setting.AppURL = markup.TestAppURL + tree := util.URLJoin(markup.TestRepoURL, "src", "master") test := func(input, expected, expectedWiki string) { - buffer, err := markdown.RenderString(&RenderContext{ + buffer, err := markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, URLPrefix: tree, Metas: localMetas, }, input) assert.NoError(t, err) assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer)) - buffer, err = markdown.RenderString(&RenderContext{ + buffer, err = markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, - URLPrefix: TestRepoURL, + URLPrefix: markup.TestRepoURL, Metas: localMetas, IsWiki: true, }, input) @@ -483,8 +483,8 @@ func TestRender_RelativeImages(t *testing.T) { assert.Equal(t, strings.TrimSpace(expectedWiki), strings.TrimSpace(buffer)) } - rawwiki := util.URLJoin(TestRepoURL, "wiki", "raw") - mediatree := util.URLJoin(TestRepoURL, "media", "master") + rawwiki := util.URLJoin(markup.TestRepoURL, "wiki", "raw") + mediatree := util.URLJoin(markup.TestRepoURL, "media", "master") test( ``, @@ -498,7 +498,7 @@ func TestRender_RelativeImages(t *testing.T) { } func Test_ParseClusterFuzz(t *testing.T) { - setting.AppURL = TestAppURL + setting.AppURL = markup.TestAppURL localMetas := map[string]string{ "user": "go-gitea", @@ -508,7 +508,7 @@ func Test_ParseClusterFuzz(t *testing.T) { data := "
` var res strings.Builder - err := PostProcess(&RenderContext{ + err := markup.PostProcess(&markup.RenderContext{ Ctx: git.DefaultContext, URLPrefix: "https://example.com", Metas: localMetas, @@ -593,7 +593,7 @@ func BenchmarkEmojiPostprocess(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { var res strings.Builder - err := PostProcess(&RenderContext{ + err := markup.PostProcess(&markup.RenderContext{ Ctx: git.DefaultContext, URLPrefix: "https://example.com", Metas: localMetas, @@ -604,7 +604,7 @@ func BenchmarkEmojiPostprocess(b *testing.B) { func TestFuzz(t *testing.T) { s := "t/l/issues/8#/../../a" - renderContext := RenderContext{ + renderContext := markup.RenderContext{ Ctx: git.DefaultContext, URLPrefix: "https://example.com/go-gitea/gitea", Metas: map[string]string{ @@ -613,7 +613,7 @@ func TestFuzz(t *testing.T) { }, } - err := PostProcess(&renderContext, strings.NewReader(s), io.Discard) + err := markup.PostProcess(&renderContext, strings.NewReader(s), io.Discard) assert.NoError(t, err) } @@ -622,7 +622,7 @@ func TestIssue18471(t *testing.T) { data := `http://domain/org/repo/compare/783b039...da951ce` var res strings.Builder - err := PostProcess(&RenderContext{ + err := markup.PostProcess(&markup.RenderContext{ Ctx: git.DefaultContext, URLPrefix: "https://example.com", Metas: localMetas, diff --git a/modules/markup/markdown/markdown_test.go b/modules/markup/markdown/markdown_test.go index f2322b2554..8f855f1b13 100644 --- a/modules/markup/markdown/markdown_test.go +++ b/modules/markup/markdown/markdown_test.go @@ -13,7 +13,7 @@ import ( "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/markup" - . "code.gitea.io/gitea/modules/markup/markdown" + "code.gitea.io/gitea/modules/markup/markdown" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" @@ -51,14 +51,14 @@ func TestRender_StandardLinks(t *testing.T) { setting.AppSubURL = AppSubURL test := func(input, expected, expectedWiki string) { - buffer, err := RenderString(&markup.RenderContext{ + buffer, err := markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, URLPrefix: setting.AppSubURL, }, input) assert.NoError(t, err) assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer)) - buffer, err = RenderString(&markup.RenderContext{ + buffer, err = markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, URLPrefix: setting.AppSubURL, IsWiki: true, @@ -82,7 +82,7 @@ func TestRender_Images(t *testing.T) { setting.AppSubURL = AppSubURL test := func(input, expected string) { - buffer, err := RenderString(&markup.RenderContext{ + buffer, err := markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, URLPrefix: setting.AppSubURL, }, input) @@ -289,7 +289,7 @@ func TestTotal_RenderWiki(t *testing.T) { answers := testAnswers(util.URLJoin(AppSubURL, "wiki/"), util.URLJoin(AppSubURL, "wiki", "raw/")) for i := 0; i < len(sameCases); i++ { - line, err := RenderString(&markup.RenderContext{ + line, err := markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, URLPrefix: AppSubURL, Metas: localMetas, @@ -313,7 +313,7 @@ func TestTotal_RenderWiki(t *testing.T) { } for i := 0; i < len(testCases); i += 2 { - line, err := RenderString(&markup.RenderContext{ + line, err := markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, URLPrefix: AppSubURL, IsWiki: true, @@ -330,7 +330,7 @@ func TestTotal_RenderString(t *testing.T) { answers := testAnswers(util.URLJoin(AppSubURL, "src", "master/"), util.URLJoin(AppSubURL, "raw", "master/")) for i := 0; i < len(sameCases); i++ { - line, err := RenderString(&markup.RenderContext{ + line, err := markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, URLPrefix: util.URLJoin(AppSubURL, "src", "master/"), Metas: localMetas, @@ -342,7 +342,7 @@ func TestTotal_RenderString(t *testing.T) { testCases := []string{} for i := 0; i < len(testCases); i += 2 { - line, err := RenderString(&markup.RenderContext{ + line, err := markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, URLPrefix: AppSubURL, }, testCases[i]) @@ -353,17 +353,17 @@ func TestTotal_RenderString(t *testing.T) { func TestRender_RenderParagraphs(t *testing.T) { test := func(t *testing.T, str string, cnt int) { - res, err := RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, str) + res, err := markdown.RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, str) assert.NoError(t, err) assert.Equal(t, cnt, strings.Count(res, "image1
image2

` - res, err := RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, testcase) + res, err := markdown.RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, testcase) assert.NoError(t, err) assert.Equal(t, expected, res) } @@ -412,7 +412,7 @@ func TestRenderEmojiInLinks_Issue12331(t *testing.T) { testcase := `[Link with emoji :moon: in text](https://gitea.io)` expected := `

Link with emoji 🌔 in text

` - res, err := RenderString(&markup.RenderContext{Ctx: git.DefaultContext}, testcase) + res, err := markdown.RenderString(&markup.RenderContext{Ctx: git.DefaultContext}, testcase) assert.NoError(t, err) assert.Equal(t, expected, res) } @@ -446,7 +446,7 @@ func TestColorPreview(t *testing.T) { } for _, test := range positiveTests { - res, err := RenderString(&markup.RenderContext{Ctx: git.DefaultContext}, test.testcase) + res, err := markdown.RenderString(&markup.RenderContext{Ctx: git.DefaultContext}, test.testcase) assert.NoError(t, err, "Unexpected error in testcase: %q", test.testcase) assert.Equal(t, test.expected, res, "Unexpected result in testcase %q", test.testcase) @@ -466,7 +466,7 @@ func TestColorPreview(t *testing.T) { } for _, test := range negativeTests { - res, err := RenderString(&markup.RenderContext{Ctx: git.DefaultContext}, test) + res, err := markdown.RenderString(&markup.RenderContext{Ctx: git.DefaultContext}, test) assert.NoError(t, err, "Unexpected error in testcase: %q", test) assert.NotContains(t, res, ` Date: Tue, 24 Oct 2023 05:26:38 +0200 Subject: [PATCH 0015/1066] Do not force creation of _cargo-index repo on publish (#27266) Hello there, Cargo Index over HTTP is now prefered over git for package updates: we should not force users who do not need the GIT repo to have the repo created/updated on each publish (it can still be created in the packages settings). The current behavior when publishing is to check if the repo exist and create it on the fly if not, then update it's content. Cargo HTTP Index does not rely on the repo itself so this will be useless for everyone not using the git protocol for cargo registry. This PR only disable the creation on the fly of the repo when publishing a crate. This is linked to #26844 (error 500 when trying to publish a crate if user is missing write access to the repo) because it's now optional. --------- Co-authored-by: KN4CK3R --- routers/api/packages/cargo/cargo.go | 4 ++-- services/packages/cargo/index.go | 12 +++++++++--- services/packages/cleanup/cleanup.go | 4 ++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/routers/api/packages/cargo/cargo.go b/routers/api/packages/cargo/cargo.go index 225b6b5ade..8f1e965c9a 100644 --- a/routers/api/packages/cargo/cargo.go +++ b/routers/api/packages/cargo/cargo.go @@ -250,7 +250,7 @@ func UploadPackage(ctx *context.Context) { return } - if err := cargo_service.AddOrUpdatePackageIndex(ctx, ctx.Doer, ctx.Package.Owner, pv.PackageID); err != nil { + if err := cargo_service.UpdatePackageIndexIfExists(ctx, ctx.Doer, ctx.Package.Owner, pv.PackageID); err != nil { if err := packages_service.DeletePackageVersionAndReferences(ctx, pv); err != nil { log.Error("Rollback creation of package version: %v", err) } @@ -301,7 +301,7 @@ func yankPackage(ctx *context.Context, yank bool) { return } - if err := cargo_service.AddOrUpdatePackageIndex(ctx, ctx.Doer, ctx.Package.Owner, pv.PackageID); err != nil { + if err := cargo_service.UpdatePackageIndexIfExists(ctx, ctx.Doer, ctx.Package.Owner, pv.PackageID); err != nil { apiError(ctx, http.StatusInternalServerError, err) return } diff --git a/services/packages/cargo/index.go b/services/packages/cargo/index.go index 0561f168e1..8164ffb01c 100644 --- a/services/packages/cargo/index.go +++ b/services/packages/cargo/index.go @@ -106,10 +106,16 @@ func RebuildIndex(ctx context.Context, doer, owner *user_model.User) error { ) } -func AddOrUpdatePackageIndex(ctx context.Context, doer, owner *user_model.User, packageID int64) error { - repo, err := getOrCreateIndexRepository(ctx, doer, owner) +func UpdatePackageIndexIfExists(ctx context.Context, doer, owner *user_model.User, packageID int64) error { + // We do not want to force the creation of the repo here + // cargo http index does not rely on the repo itself, + // so if the repo does not exist, we just do nothing. + repo, err := repo_model.GetRepositoryByOwnerAndName(ctx, owner.Name, IndexRepositoryName) if err != nil { - return err + if errors.Is(err, util.ErrNotExist) { + return nil + } + return fmt.Errorf("GetRepositoryByOwnerAndName: %w", err) } p, err := packages_model.GetPackageByID(ctx, packageID) diff --git a/services/packages/cleanup/cleanup.go b/services/packages/cleanup/cleanup.go index 77bcfb1942..9bdd9d6aad 100644 --- a/services/packages/cleanup/cleanup.go +++ b/services/packages/cleanup/cleanup.go @@ -110,8 +110,8 @@ func ExecuteCleanupRules(outerCtx context.Context) error { if err != nil { return fmt.Errorf("GetUserByID failed: %w", err) } - if err := cargo_service.AddOrUpdatePackageIndex(ctx, owner, owner, p.ID); err != nil { - return fmt.Errorf("CleanupRule [%d]: cargo.AddOrUpdatePackageIndex failed: %w", pcr.ID, err) + if err := cargo_service.UpdatePackageIndexIfExists(ctx, owner, owner, p.ID); err != nil { + return fmt.Errorf("CleanupRule [%d]: cargo.UpdatePackageIndexIfExists failed: %w", pcr.ID, err) } } } From fba4ee7efcd0baead1611c0885468c15916cc7e1 Mon Sep 17 00:00:00 2001 From: silverwind Date: Wed, 25 Oct 2023 00:47:17 +0200 Subject: [PATCH 0016/1066] Add gap between diff boxes (#27776) Before (almost no gap between files): Screenshot 2023-10-24 at 19 43 32 After (with 8px gap): Screenshot 2023-10-24 at 19 43 22 --- web_src/css/repo.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web_src/css/repo.css b/web_src/css/repo.css index c3e230f8e1..7d76dd8b3f 100644 --- a/web_src/css/repo.css +++ b/web_src/css/repo.css @@ -2734,6 +2734,9 @@ tbody.commit-list { #diff-file-boxes { flex: 1; max-width: 100%; + display: flex; + flex-direction: column; + gap: 8px; } #diff-file-tree { From 572f0963edc71239634ee782a3c69213479f34ba Mon Sep 17 00:00:00 2001 From: silverwind Date: Wed, 25 Oct 2023 05:09:18 +0200 Subject: [PATCH 0017/1066] Only show diff file tree when more than one file changed (#27775) When 0 or 1 files changed in a diff, we don't need to show a file tree. This behaviour matches GitHub. Single-file diff after this change, note absence of button: image Co-authored-by: Giteabot --- templates/repo/diff/box.tmpl | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/templates/repo/diff/box.tmpl b/templates/repo/diff/box.tmpl index 289ed90d3f..c037c3b365 100644 --- a/templates/repo/diff/box.tmpl +++ b/templates/repo/diff/box.tmpl @@ -1,7 +1,8 @@ +{{$showFileTree := (and (not .DiffNotAvailable) (gt .Diff.NumFiles 1))}}
- {{if not .DiffNotAvailable}} + {{if $showFileTree}} {{CountFmt .NumWatches}} @@ -74,7 +75,11 @@ {{$.CsrfTokenHtml}} {{end}} -
-
+
+ {{if $.PullMirror}}
{{ctx.Locale.Tr "repo.mirror_from"}} {{$.PullMirror.RemoteAddress}}
{{end}} + {{if .IsFork}}
{{ctx.Locale.Tr "repo.forked_from"}} {{.BaseRepo.FullName}}
{{end}} + {{if .IsGenerated}}
{{ctx.Locale.Tr "repo.generated_from"}} {{(.TemplateRepo ctx).FullName}}
{{end}} + {{end}} -
+