// Copyright 2019 The Gitea Authors. // All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. package pull import ( "bufio" "context" "io" "strconv" "sync" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/git/pipeline" "code.gitea.io/gitea/modules/lfs" "code.gitea.io/gitea/modules/log" ) // LFSPush pushes lfs objects referred to in new commits in the head repository from the base repository func LFSPush(ctx context.Context, tmpBasePath, mergeHeadSHA, mergeBaseSHA string, pr *models.PullRequest) error { // Now we have to implement git lfs push // git rev-list --objects --filter=blob:limit=1k HEAD --not base // pass blob shas in to git cat-file --batch-check (possibly unnecessary) // ensure only blobs and <=1k size then pass in to git cat-file --batch // to read each sha and check each as a pointer // Then if they are lfs -> add them to the baseRepo revListReader, revListWriter := io.Pipe() shasToCheckReader, shasToCheckWriter := io.Pipe() catFileCheckReader, catFileCheckWriter := io.Pipe() shasToBatchReader, shasToBatchWriter := io.Pipe() catFileBatchReader, catFileBatchWriter := io.Pipe() errChan := make(chan error, 1) wg := sync.WaitGroup{} wg.Add(6) // Create the go-routines in reverse order. // 6. Take the output of cat-file --batch and check if each file in turn // to see if they're pointers to files in the LFS store associated with // the head repo and add them to the base repo if so go createLFSMetaObjectsFromCatFileBatch(catFileBatchReader, &wg, pr) // 5. Take the shas of the blobs and batch read them go pipeline.CatFileBatch(ctx, shasToBatchReader, catFileBatchWriter, &wg, tmpBasePath) // 4. From the provided objects restrict to blobs <=1k go pipeline.BlobsLessThan1024FromCatFileBatchCheck(catFileCheckReader, shasToBatchWriter, &wg) // 3. Run batch-check on the objects retrieved from rev-list go pipeline.CatFileBatchCheck(ctx, shasToCheckReader, catFileCheckWriter, &wg, tmpBasePath) // 2. Check each object retrieved rejecting those without names as they will be commits or trees go pipeline.BlobsFromRevListObjects(revListReader, shasToCheckWriter, &wg) // 1. Run rev-list objects from mergeHead to mergeBase go pipeline.RevListObjects(ctx, revListWriter, &wg, tmpBasePath, mergeHeadSHA, mergeBaseSHA, errChan) wg.Wait() select { case err, has := <-errChan: if has { return err } default: } return nil } func createLFSMetaObjectsFromCatFileBatch(catFileBatchReader *io.PipeReader, wg *sync.WaitGroup, pr *models.PullRequest) { defer wg.Done() defer catFileBatchReader.Close() contentStore := lfs.NewContentStore() bufferedReader := bufio.NewReader(catFileBatchReader) buf := make([]byte, 1025) for { // File descriptor line: sha _, err := bufferedReader.ReadString(' ') if err != nil { _ = catFileBatchReader.CloseWithError(err) break } // Throw away the blob if _, err := bufferedReader.ReadString(' '); err != nil { _ = catFileBatchReader.CloseWithError(err) break } sizeStr, err := bufferedReader.ReadString('\n') if err != nil { _ = catFileBatchReader.CloseWithError(err) break } size, err := strconv.Atoi(sizeStr[:len(sizeStr)-1]) if err != nil { _ = catFileBatchReader.CloseWithError(err) break } pointerBuf := buf[:size+1] if _, err := io.ReadFull(bufferedReader, pointerBuf); err != nil { _ = catFileBatchReader.CloseWithError(err) break } pointerBuf = pointerBuf[:size] // Now we need to check if the pointerBuf is an LFS pointer pointer, _ := lfs.ReadPointerFromBuffer(pointerBuf) if !pointer.IsValid() { continue } exist, _ := contentStore.Exists(pointer) if !exist { continue } // Then we need to check that this pointer is in the db if _, err := models.GetLFSMetaObjectByOid(pr.HeadRepo.ID, pointer.Oid); err != nil { if err == models.ErrLFSObjectNotExist { log.Warn("During merge of: %d in %-v, there is a pointer to LFS Oid: %s which although present in the LFS store is not associated with the head repo %-v", pr.Index, pr.BaseRepo, pointer.Oid, pr.HeadRepo) continue } _ = catFileBatchReader.CloseWithError(err) break } // OK we have a pointer that is associated with the head repo // and is actually a file in the LFS // Therefore it should be associated with the base repo meta := &models.LFSMetaObject{Pointer: pointer} meta.RepositoryID = pr.BaseRepoID if _, err := models.NewLFSMetaObject(meta); err != nil { _ = catFileBatchReader.CloseWithError(err) break } } } ing_a_secondly_created_file'>artonge/fix/opening_a_secondly_created_file Nextcloud server, a safe home for all your data: https://github.com/nextcloud/serverwww-data
summaryrefslogtreecommitdiffstats
path: root/apps/files/l10n/es_419.js
blob: 084f925a9d3a935c51b0fb213af34adf60f133cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
OC.L10N.register(
    "files",
    {
    "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
    "Storage invalid" : "El almacenamiento es inválido",
    "Unknown error" : "Se presentó un error desconocido",
    "File could not be found" : "No fue posible encontrar el archivo",
    "Move or copy" : "Mover o copiar",
    "Download" : "Descargar",
    "Delete" : "Borrar",
    "Home" : "Inicio",
    "Close" : "Cerrar",
    "Favorites" : "Favoritos",
    "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
    "Upload cancelled." : "Carga cancelada.",
    "…" : "...",
    "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
    "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
    "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
    "Not enough free space" : "No cuentas con suficiente espacio libre",
    "Uploading …" : "Cargando...",
    "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
    "Target folder does not exist any more" : "La carpeta destino ya no existe",
    "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
    "Actions" : "Acciones",
    "Rename" : "Renombrar",
    "Copy" : "Copiar",
    "Delete file" : "Borrar archivo",
    "Delete folder" : "Borrar carpeta",
    "Disconnect storage" : "Desconectar almacenamiento",
    "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
    "Files" : "Archivos",
    "Details" : "Detalles",
    "Select" : "Seleccionar",
    "Pending" : "Pendiente",
    "Unable to determine date" : "No fue posible determinar la fecha",
    "This operation is forbidden" : "Esta operación está prohibida",
    "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
    "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
    "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
    "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
    "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
    "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
    "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
    "{newName} already exists" : "{newName} ya existe",
    "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
    "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
    "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
    "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
    "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
    "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
    "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
    "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para  {tag}{filter}{endtag}",
    "Name" : "Nombre",
    "Size" : "Tamaño",
    "Modified" : "Modificado",
    "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
    "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
    "{dirs} and {files}" : "{dirs} y {files}",
    "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
    "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
    "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
    "New" : "Nuevo",
    "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
    "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
    "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
    "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
    "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
    "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"],
    "View in folder" : "Ver en la carpeta",
    "Copied!" : "¡Copiado!",
    "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
    "Path" : "Ruta",
    "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
    "Favorited" : "Marcado como favorito",
    "Favorite" : "Favorito",
    "New folder" : "Carpeta nueva",
    "Upload file" : "Cargar archivo",
    "Recent" : "Reciente",
    "Not favorited" : "No es un favorito",
    "Remove from favorites" : "Eliminar de favoritos",
    "Add to favorites" : "Agregar a favoritos",
    "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
    "Added to favorites" : "Agregado a los favoritos",
    "Removed from favorites" : "Eliminado de los favoritos",
    "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
    "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
    "File changes" : "Cambios al archivo",
    "Created by {user}" : "Creado por {user}",
    "Changed by {user}" : "Cambiado por {user}",
    "Deleted by {user}" : "Borrado por {user}",
    "Restored by {user}" : "Restaurado por {user}",
    "Renamed by {user}" : "Renombrado por {user}",
    "Moved by {user}" : "Movido por {user}",
    "\"remote user\"" : "\"usuario remoto\"",
    "You created {file}" : "Creaste {file}",
    "{user} created {file}" : "{user} creó {file}",
    "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
    "You changed {file}" : "Cambiaste {file}",
    "{user} changed {file}" : "{user} cambió {file}",
    "You deleted {file}" : "Borraste {file}",
    "{user} deleted {file}" : "{user} borró {file}",
    "You restored {file}" : "Restauraste {file}",
    "{user} restored {file}" : "{user} restauró {file}",
    "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
    "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
    "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
    "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
    "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
    "All files" : "Todos los archivos",
    "Unlimited" : "Ilimitado",
    "Upload (max. %s)" : "Cargar (max. %s)",
    "Accept" : "Aceptar",
    "in %s" : "en %s",
    "Change" : "Cambiar",
    "Tags" : "Etiquetas",
    "%s used" : "%s usado",
    "%1$s of %2$s used" : "%1$s de %2$s usados",
    "Settings" : "Configuraciones ",
    "Show hidden files" : "Mostrar archivos ocultos",
    "WebDAV" : "WebDAV",
    "No files in here" : "No hay archivos aquí",
    "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
    "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
    "Select all" : "Seleccionar todo",
    "Upload too large" : "La carga es demasido grande",
    "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
    "No favorites yet" : "Aún no hay favoritos",
    "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
    "Deleted files" : "Archivos borrados",
    "Shares" : "Elementos compartidos",
    "Shared with others" : "Compartido con otros",
    "Shared with you" : "Compartido con usted",
    "Shared by link" : "Compartido por liga",
    "Text file" : "Archivo de texto",
    "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
    "Unshare" : "Dejar de compartir",
    "Storage of {owner} is almost full ({usedSpacePercent}%)" : "El espacio de {owner} está casi lleno ({usedSpacePercent}%)",
    "Your storage is almost full ({usedSpacePercent}%)" : "Tu espacio está casi lleno ({usedSpacePercent}%)",
    "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Un archivo o carpeta ha sido <strong>cambiado </strong> o <strong>renombrado</strong>",
    "A new file or folder has been <strong>created</strong>" : "Un archivo o carpeta ha sido <strong>creado</strong>",
    "A file or folder has been <strong>deleted</strong>" : "Un archivo o carpeta ha sido <strong>borrado</strong>",
    "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limita las notificaciones de la creación y cambios a tus <strong>archivos favoritos</strong> <em>(sólo flujo)</em>",
    "A file or folder has been <strong>restored</strong>" : "Un archivo o carpeta ha sido <strong>restaurado</strong>"
},
"nplurals=2; plural=(n != 1);");