Compare commits

...

7 Commits

Author SHA1 Message Date
qwerty287 24a8d54bfb
Disable ref selection dropdown if you don't have permissions to use it (#17837)
Co-authored-by: Lauris BH <lauris@nix.lv>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
2021-11-28 12:13:13 +08:00
Galen Suen fbadc1a198
Fix value of User.IsRestricted to default setting when oauth2 user auto registration; (#17839) 2021-11-28 11:27:48 +08:00
zeripath 72d82c5b6f
Handle relative unix socket paths (#17836)
Make relative unix sockets absolute by making them absolute against the AppWorkPath

Fix #17833

## ⚠️ BREAKING ⚠️ 

Prior to this PR relative unix sockets would have been asserted to be relative to the current working directory that gitea, gitea serv, hook and manager etc were running in. Hooks and Serv would have failed to work properly under this situation so we expect that although this is a technically breaking change the previous situation was already broken.

Signed-off-by: Andrew Thornton <art27@cantab.net>
2021-11-27 20:22:03 +00:00
mscherer 04c55e97a2
Fix code formating (#17830)
* fix formatter, format imports first, then go fmt
2021-11-27 19:59:51 +08:00
Gabriel Vasile 2e8fc5b034
Replace regex usage for MIME parsing (#17831)
MIME types can have multiple optional parameters, eg:
    video/webm; codecs="w/e codec"; charset="binary"
This commit replaces the usage of regex for getting the "type/subtype"
with mime.ParseMediaType.
2021-11-27 19:12:43 +08:00
GiteaBot 789d251ae4 [skip ci] Updated translations via Crowdin 2021-11-27 00:25:11 +00:00
mscherer 1f0dab2116
Implement Well-Known URL for password change (#17777)
* Implement Well-Known URL for password change

Fixes #11804
2021-11-26 22:55:11 +08:00
10 changed files with 80 additions and 25 deletions

View File

@ -267,10 +267,10 @@ func main() {
logVerbose("batch cmd: %s %v", subCmd, substArgs)
switch subCmd {
case "gitea-fmt":
cmdErrors = append(cmdErrors, passThroughCmd("gofmt", substArgs))
if containsString(subArgs, "-w") {
cmdErrors = append(cmdErrors, giteaFormatGoImports(files))
}
cmdErrors = append(cmdErrors, passThroughCmd("gofmt", substArgs))
case "misspell":
cmdErrors = append(cmdErrors, passThroughCmd("misspell", substArgs))
default:

View File

@ -247,7 +247,7 @@ The following configuration set `Content-Type: application/vnd.android.package-a
- `HTTP_ADDR`: **0.0.0.0**: HTTP listen address.
- If `PROTOCOL` is set to `fcgi`, Gitea will listen for FastCGI requests on TCP socket
defined by `HTTP_ADDR` and `HTTP_PORT` configuration settings.
- If `PROTOCOL` is set to `unix` or `fcgi+unix`, this should be the name of the Unix socket file to use.
- If `PROTOCOL` is set to `unix` or `fcgi+unix`, this should be the name of the Unix socket file to use. Relative paths will be made absolute against the AppWorkPath.
- `HTTP_PORT`: **3000**: HTTP listen port.
- If `PROTOCOL` is set to `fcgi`, Gitea will listen for FastCGI requests on TCP socket
defined by `HTTP_ADDR` and `HTTP_PORT` configuration settings.

View File

@ -583,6 +583,10 @@ func NewContext() {
sec := Cfg.Section("server")
AppName = Cfg.Section("").Key("APP_NAME").MustString("Gitea: Git with a cup of tea")
Domain = sec.Key("DOMAIN").MustString("localhost")
HTTPAddr = sec.Key("HTTP_ADDR").MustString("0.0.0.0")
HTTPPort = sec.Key("HTTP_PORT").MustString("3000")
Protocol = HTTP
switch sec.Key("PROTOCOL").String() {
case "https":
@ -605,6 +609,9 @@ func NewContext() {
log.Fatal("Failed to parse unixSocketPermission: %s", UnixSocketPermissionRaw)
}
UnixSocketPermission = uint32(UnixSocketPermissionParsed)
if !filepath.IsAbs(HTTPAddr) {
HTTPAddr = filepath.Join(AppWorkPath, HTTPAddr)
}
case "unix":
Protocol = UnixSocket
UnixSocketPermissionRaw := sec.Key("UNIX_SOCKET_PERMISSION").MustString("666")
@ -613,6 +620,9 @@ func NewContext() {
log.Fatal("Failed to parse unixSocketPermission: %s", UnixSocketPermissionRaw)
}
UnixSocketPermission = uint32(UnixSocketPermissionParsed)
if !filepath.IsAbs(HTTPAddr) {
HTTPAddr = filepath.Join(AppWorkPath, HTTPAddr)
}
}
EnableLetsEncrypt = sec.Key("ENABLE_LETSENCRYPT").MustBool(false)
LetsEncryptTOS = sec.Key("LETSENCRYPT_ACCEPTTOS").MustBool(false)
@ -626,9 +636,6 @@ func NewContext() {
SSLMaximumVersion = sec.Key("SSL_MAX_VERSION").MustString("")
SSLCurvePreferences = sec.Key("SSL_CURVE_PREFERENCES").Strings(",")
SSLCipherSuites = sec.Key("SSL_CIPHER_SUITES").Strings(",")
Domain = sec.Key("DOMAIN").MustString("localhost")
HTTPAddr = sec.Key("HTTP_ADDR").MustString("0.0.0.0")
HTTPPort = sec.Key("HTTP_PORT").MustString("3000")
GracefulRestartable = sec.Key("ALLOW_GRACEFUL_RESTARTS").MustBool(true)
GracefulHammerTime = sec.Key("GRACEFUL_HAMMER_TIME").MustDuration(60 * time.Second)
StartupTimeout = sec.Key("STARTUP_TIMEOUT").MustDuration(0 * time.Second)

View File

@ -5,6 +5,7 @@
package upload
import (
"mime"
"net/http"
"net/url"
"path"
@ -31,7 +32,6 @@ func (err ErrFileTypeForbidden) Error() string {
return "This file extension or type is not allowed to be uploaded."
}
var mimeTypeSuffixRe = regexp.MustCompile(`;.*$`)
var wildcardTypeRe = regexp.MustCompile(`^[a-z]+/\*$`)
// Verify validates whether a file is allowed to be uploaded.
@ -51,7 +51,11 @@ func Verify(buf []byte, fileName string, allowedTypesStr string) error {
}
fullMimeType := http.DetectContentType(buf)
mimeType := strings.TrimSpace(mimeTypeSuffixRe.ReplaceAllString(fullMimeType, ""))
mimeType, _, err := mime.ParseMediaType(fullMimeType)
if err != nil {
log.Warn("Detected attachment type could not be parsed %s", fullMimeType)
return ErrFileTypeForbidden{Type: fullMimeType}
}
extension := strings.ToLower(path.Ext(fileName))
// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#Unique_file_type_specifiers

View File

@ -155,6 +155,8 @@ lfs_path=Ruta raĂ­z de Git LFS
lfs_path_helper=Los archivos almacenados con Git LFS se almacenarán en este directorio. Déjelo vacío para deshabilitarlo.
run_user=Ejecutar como usuario
run_user_helper=Introduzca el nombre de usuario del sistema operativo sobre el que está ejecutando Gitea. Tenga en cuenta que este usuario debe tener acceso a la ruta a la raíz de los repositorios.
domain=Dominio del Servidor
domain_helper=Dominio o direcciĂłn de host para el servidor.
ssh_port=Puerto de servidor SSH
ssh_port_helper=Número de puerto en el que está escuchando su servidor SSH. Déjelo vacío para deshabilitarlo.
http_port=Puerto de escucha HTTP de Gitea
@ -519,7 +521,9 @@ website=Página web
location=LocalizaciĂłn
update_theme=Actualizar tema
update_profile=Actualizar perfil
update_language=Actualizar idioma
update_language_not_found=El idioma '%s' no está disponible.
update_language_success=El idioma ha sido actualizado.
update_profile_success=Tu perfil ha sido actualizado.
change_username=Su nombre de usuario ha sido cambiado.
change_username_prompt=Nota: los cambios de nombre de usuario también cambian la URL de su cuenta.
@ -895,6 +899,7 @@ migrate.clone_address_desc=La URL HTTP(S) o de Git 'clone' de un repositorio exi
migrate.github_token_desc=Puedes poner uno o más tokens con comas separadas aquí para hacer migrar más rápido debido al límite de velocidad de Github API. PRECAUCIÓN: Abusar esta característica puede violar la política del proveedor de servicios y llevar a bloquear la cuenta.
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 es invá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
@ -905,12 +910,14 @@ migrate.migrate=Migrar desde %s
migrate.migrating=Migrando desde <b>%s</b>...
migrate.migrating_failed=La migraciĂłn desde <b>%s</b> ha fallado.
migrate.migrating_failed.error=Error: %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.
migrate.gitlab.description=Migrar datos de gitlab.com u otra instancia de GitLab.
migrate.gitea.description=Migrar datos de gitea.com u otra instancia de Gitea.
migrate.gogs.description=Migrar datos de notabug.org u otra instancia de Gogs.
migrate.onedev.description=Migrar datos desde code.onedev.io u otra instancia de OneDev.
migrate.gitbucket.description=Migrar datos de instancias de GitBucket.
migrate.migrating_git=Migrando datos de Git
migrate.migrating_topics=Migrando Temas
migrate.migrating_milestones=Migrando Hitos
@ -939,6 +946,7 @@ clone_this_repo=Clonar 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.
broken_message=Los datos de git subyacentes a este repositorio no pueden ser leĂ­dos. Contacte con el administrador de esta instancia o elimine este repositorio.
code=CĂłdigo
code.desc=Acceder cĂłdigo fuente, archivos, commits, y ramas.
@ -1165,6 +1173,9 @@ issues.add_assignee_at='fue asignado por <b>%s</b> %s'
issues.remove_assignee_at=`fue desasignado por <b>%s</b> %s`
issues.remove_self_assignment=`eliminado su asignaciĂłn %s`
issues.change_title_at=`cambiĂł el tĂ­tulo de <b><strike>%s</strike></b> a <b>%s</b> %s`
issues.change_ref_at=`cambiĂł referencia de <b><strike>%s</strike></b> a <b>%s</b> %s`
issues.remove_ref_at=`eliminĂł la referencia <b>%s</b> %s`
issues.add_ref_at=`añadió la referencia <b>%s</b> %s`
issues.delete_branch_at=`rama eliminada <b>%s</b> %s`
issues.open_tab=%d abiertas
issues.close_tab=%d cerradas
@ -1398,10 +1409,12 @@ pulls.compare_changes_desc=Seleccione la rama en la que se fusiona y la rama a r
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.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: <a href="%[1]s">%[2]s#%[3]d</a>`
pulls.create=Crear Pull Request
pulls.title_desc=desea fusionar %[1]d commits de <code>%[2]s</code> en <code id="branch_target">%[3]s</code>
pulls.merged_title_desc=fusionados %[1]d commits de <code>%[2]s</code> en <code>%[3]s</code> %[4]s
@ -1919,6 +1932,8 @@ 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_protected_file_patterns=Patrones de archivos protegidos (separados con punto y coma '\;'):
settings.protect_protected_file_patterns_desc=Archivos protegidos que no están permitidos a ser cambiados 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 ('\;'). Vea la documentación de <a href="https://pkg.go.dev/github.com/gobwas/glob#Compile">github.com/gobwas/glob</a> para la sintaxis de patrones. Ejemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
settings.protect_unprotected_file_patterns=Patrones de archivos sin protecciĂłn (separados con punto y coma '\;'):
settings.protect_unprotected_file_patterns_desc=Archivos sin protecciĂłn que 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 <a href="https://pkg.go.dev/github.com/gobwas/glob#Compile">github.com/gobwas/glob</a> para la sintaxis de patrones. Ejemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
settings.add_protected_branch=Activar protecciĂłn
settings.delete_protected_branch=Desactivar protecciĂłn
settings.update_protect_branch_success=La protecciĂłn de la rama '%s' ha sido actualizada.
@ -1992,6 +2007,7 @@ settings.lfs_pointers.inRepo=En repositorio
settings.lfs_pointers.exists=Existe en almacén
settings.lfs_pointers.accessible=Accesible al usuario
settings.lfs_pointers.associateAccessible=Asociar %d OID accesibles
settings.rename_branch_failed_exist=No se puede renombrar la rama porque la rama destino %s ya existe.
settings.rename_branch_failed_not_exist=No se puede renombrar la rama %s porque no existe.
settings.rename_branch_success=La rama %s se renombrĂł correctamente a %s.
settings.rename_branch_from=nombre de la rama vieja
@ -2028,6 +2044,7 @@ diff.file_suppressed=La diferencia del archivo ha sido suprimido porque es demas
diff.file_suppressed_line_too_long=Las diferiencias del archivo han sido suprimidas porque una o mas lineas son muy largas
diff.too_many_files=Algunos archivos no se mostraron porque demasiados archivos han cambiado en esta diferencia
diff.show_more=Ver más
diff.load=Cargar Diff
diff.generated=generado
diff.vendored=vendido
diff.comment.placeholder=Deja un comentario
@ -2377,6 +2394,7 @@ users.list_status_filter.reset=Reiniciar
users.list_status_filter.is_active=Activo
users.list_status_filter.not_active=Inactivo
users.list_status_filter.is_admin=Administrador
users.list_status_filter.not_admin=Sin Admin
users.list_status_filter.is_restricted=Restringido
users.list_status_filter.not_restricted=No restringido
users.list_status_filter.is_prohibit_login=Prohibido el inicio de sesiĂłn
@ -2487,6 +2505,7 @@ auths.oauth2_authURL=URL de AutorizaciĂłn
auths.oauth2_profileURL=URL del perfil
auths.oauth2_emailURL=URL de correo
auths.skip_local_two_fa=Omitir 2FA local
auths.skip_local_two_fa_helper=Dejar sin ajustar significa que los usuarios locales con una configuración 2FA tendrán que pasar 2FA para iniciar sesión
auths.oauth2_tenant=Tenant
auths.enable_auto_register=Hablilitar Auto-Registro
auths.sspi_auto_create_users=Crear usuarios automáticamente
@ -2535,6 +2554,7 @@ config.app_ver=VersiĂłn de Gitea
config.app_url=URL base de Gitea
config.custom_conf=Ruta del fichero de configuraciĂłn
config.custom_file_root_path=Ruta raĂ­z de los archivos personalizada
config.domain=Dominio del Servidor
config.offline_mode=Modo offline
config.disable_router_log=Deshabilitar Log del Router
config.run_user=Ejecutar como usuario
@ -2550,6 +2570,7 @@ config.reverse_auth_user=AutenticaciĂłn Inversa de Usuario
config.ssh_config=ConfiguraciĂłn SSH
config.ssh_enabled=Habilitado
config.ssh_start_builtin_server=Utilizar servidor integrado
config.ssh_domain=Dominio del servidor SSH
config.ssh_port=Puerto
config.ssh_listen_port=Puerto de escucha
config.ssh_root_path=Ruta raĂ­z
@ -2746,14 +2767,32 @@ notices.delete_success=Los avisos del sistema se han eliminado.
[action]
create_repo=creĂł el repositorio <a href="%s">%s</a>
rename_repo=repositorio renombrado de <code>%[1]s</code> a <a href="%[2]s">%[3]s</a>
commit_repo=hizo push a <a href="%[2]s">%[3]s</a> en <a href="%[1]s">%[4]s</a>
create_issue=`abriĂł la incidencia <a href="%[1]s">%[3]s#%[2]s</a>`
close_issue=`cerrĂł la incidencia <a href="%[1]s">%[3]s#%[2]s</a>`
reopen_issue=`reabriĂł la incidencia <a href="%[1]s">%[3]s#%[2]s</a>`
create_pull_request=`creĂł el pull request <a href="%[1]s">%[3]s#%[2]s</a>`
close_pull_request=`cerrĂł el pull request <a href="%[1]s">%[3]s#%[2]s</a>`
reopen_pull_request=`reabriĂł el pull request <a href="%[1]s">%[3]s#%[2]s</a>`
comment_issue=`comentĂł en la incidencia <a href="%[1]s">%[3]s#%[2]s</a>`
comment_pull=`comentĂł en el pull request <a href="%[1]s">%[3]s#%[2]s</a>`
merge_pull_request=`fusionĂł el pull request <a href="%[1]s">%[3]s#%[2]s</a>`
transfer_repo=transfiriĂł el repositorio <code>%s</code> a <a href="%s">%s</a>
push_tag=hizĂł push la etiqueta <a href="%[2]s">%[3]s</a> a <a href="%[1]s">%[4]s</a>
delete_tag=etiqueta eliminada %[2]s de <a href="%[1]s">%[3]s</a>
delete_branch=rama %[2]s eliminada, de <a href="%[1]s">%[3]s</a>
compare_branch=Comparar
compare_commits=Comparar %d commits
compare_commits_general=Comparar commits
mirror_sync_push=sincronizó cambios a <a href="%[2]s">%[3]s</a> en <a href="%[1]s">%[4]s</a> desde réplica
mirror_sync_create=sincronizó la nueva referencia <a href="%[2]s">%[3]s</a> a <a href="%[1]s">%[4]s</a> de réplica
mirror_sync_delete=sincronizada y eliminada referencia <code>%[2]s</code> en <a href="%[1]s">%[3]s</a> desde réplica
approve_pull_request=`aprobĂł <a href="%[1]s">%[3]s#%[2]s</a>`
reject_pull_request=`sugiriĂł cambios para <a href="%[1]s">%[3]s#%[2]s</a>`
publish_release=`se lanzĂł <a href="%[2]s"> "%[4]s" </a> en <a href="%[1]s">%[3]s</a>`
review_dismissed=`descartĂł la revisiĂłn de <b>%[4]s</b> para <a href="%[1]s">%[3]s#%[2]s</a>`
review_dismissed_reason=Motivo:
create_branch=creĂł rama <a href="%[2]s">%[3]s</a> en <a href="%[1]s">%[4]s</a>
starred_repo=destacĂł <a href="%[1]s">%[2]s</a>
watched_repo=comenzĂł a seguir <a href="%[1]s">%[2]s</a>

View File

@ -955,7 +955,6 @@ func NewIssuePost(ctx *context.Context) {
ctx.Data["NewIssueChooseTemplate"] = len(ctx.IssueTemplatesFromDefaultBranch()) > 0
ctx.Data["RequireHighlightJS"] = true
ctx.Data["RequireSimpleMDE"] = true
ctx.Data["ReadOnly"] = false
ctx.Data["PullRequestWorkInProgressPrefixes"] = setting.Repository.PullRequest.WorkInProgressPrefixes
ctx.Data["IsAttachmentEnabled"] = setting.Attachment.Enabled
upload.AddUploadContext(ctx, "comment")
@ -1630,7 +1629,6 @@ func ViewIssue(ctx *context.Context) {
ctx.Data["Participants"] = participants
ctx.Data["NumParticipants"] = len(participants)
ctx.Data["Issue"] = issue
ctx.Data["ReadOnly"] = false
ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login?redirect_to=" + url.QueryEscape(ctx.Data["Link"].(string))
ctx.Data["IsIssuePoster"] = ctx.IsSigned && issue.IsPoster(ctx.User.ID)
ctx.Data["HasIssuesOrPullsWritePermission"] = ctx.Repo.CanWriteIssuesOrPulls(issue.IsPull)

View File

@ -681,13 +681,14 @@ func SignInOAuthCallback(ctx *context.Context) {
return
}
u = &user_model.User{
Name: getUserName(&gothUser),
FullName: gothUser.Name,
Email: gothUser.Email,
IsActive: !setting.OAuth2Client.RegisterEmailConfirm,
LoginType: login.OAuth2,
LoginSource: loginSource.ID,
LoginName: gothUser.UserID,
Name: getUserName(&gothUser),
FullName: gothUser.Name,
Email: gothUser.Email,
IsActive: !setting.OAuth2Client.RegisterEmailConfirm,
LoginType: login.OAuth2,
LoginSource: loginSource.ID,
LoginName: gothUser.UserID,
IsRestricted: setting.Service.DefaultUserIsRestricted,
}
if !createAndHandleCreatedUser(ctx, base.TplName(""), nil, u, &gothUser, setting.OAuth2Client.AccountLinking != setting.OAuth2AccountLinkingDisabled) {

View File

@ -232,10 +232,16 @@ func RegisterRoutes(m *web.Route) {
// Routers.
// for health check
m.Get("/", Home)
m.Get("/.well-known/openid-configuration", user.OIDCWellKnown)
if setting.Federation.Enabled {
m.Get("/.well-known/nodeinfo", NodeInfoLinks)
}
m.Group("/.well-known", func() {
m.Get("/openid-configuration", user.OIDCWellKnown)
if setting.Federation.Enabled {
m.Get("/nodeinfo", NodeInfoLinks)
}
m.Get("/change-password", func(w http.ResponseWriter, req *http.Request) {
http.Redirect(w, req, "/user/settings/account", http.StatusTemporaryRedirect)
})
})
m.Group("/explore", func() {
m.Get("", func(ctx *context.Context) {
ctx.Redirect(setting.AppSubURL + "/explore/repos")

View File

@ -11,12 +11,12 @@ import (
"code.gitea.io/gitea/models/login"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/services/auth/source/oauth2"
"code.gitea.io/gitea/services/auth/source/smtp"
_ "code.gitea.io/gitea/services/auth/source/db" // register the sources (and below)
_ "code.gitea.io/gitea/services/auth/source/ldap" // register the ldap source
"code.gitea.io/gitea/services/auth/source/oauth2"
_ "code.gitea.io/gitea/services/auth/source/pam" // register the pam source
"code.gitea.io/gitea/services/auth/source/smtp"
_ "code.gitea.io/gitea/services/auth/source/pam" // register the pam source
_ "code.gitea.io/gitea/services/auth/source/sspi" // register the sspi source
)

View File

@ -5,10 +5,10 @@
{{$.CsrfTokenHtml}}
</form>
<div class="ui {{if .ReadOnly}}disabled{{end}} floating filter select-branch dropdown" data-no-results="{{.i18n.Tr "repo.pulls.no_results"}}">
<div class="ui {{if not .HasIssuesOrPullsWritePermission}}disabled{{end}} floating filter select-branch dropdown" data-no-results="{{.i18n.Tr "repo.pulls.no_results"}}">
<div class="ui basic small button">
<span class="text branch-name">{{if .Issue.Ref}}{{$.RefEndName}}{{else}}{{.i18n.Tr "repo.issues.no_ref"}}{{end}}</span>
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
{{if .HasIssuesOrPullsWritePermission}}{{svg "octicon-triangle-down" 14 "dropdown icon"}}{{end}}
</div>
<div class="menu">
<div class="ui icon search input">