* Fix display of >1Kb LFS text files * Make LFS stored Readme files viewable Signed-off-by: Andrew Thornton <art27@cantab.net> * Slight restructure Signed-off-by: Andrew Thornton <art27@cantab.net> * Slight restructure Signed-off-by: Andrew Thornton <art27@cantab.net> * catch errors and restructure LFS sections
This commit is contained in:
		
					parent
					
						
							
								994b1be9d1
							
						
					
				
			
			
				commit
				
					
						3b61ff1895
					
				
			
		
					 1 changed files with 90 additions and 28 deletions
				
			
		| 
						 | 
				
			
			@ -103,13 +103,62 @@ func renderDirectory(ctx *context.Context, treeLink string) {
 | 
			
		|||
		isTextFile := base.IsTextFile(buf)
 | 
			
		||||
		ctx.Data["FileIsText"] = isTextFile
 | 
			
		||||
		ctx.Data["FileName"] = readmeFile.Name()
 | 
			
		||||
		fileSize := int64(0)
 | 
			
		||||
		isLFSFile := false
 | 
			
		||||
		ctx.Data["IsLFSFile"] = false
 | 
			
		||||
 | 
			
		||||
		// FIXME: what happens when README file is an image?
 | 
			
		||||
		if isTextFile && setting.LFS.StartServer {
 | 
			
		||||
			meta := lfs.IsPointerFile(&buf)
 | 
			
		||||
			if meta != nil {
 | 
			
		||||
				meta, err = ctx.Repo.Repository.GetLFSMetaObjectByOid(meta.Oid)
 | 
			
		||||
				if err != nil && err != models.ErrLFSObjectNotExist {
 | 
			
		||||
					ctx.ServerError("GetLFSMetaObject", err)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if meta != nil {
 | 
			
		||||
				ctx.Data["IsLFSFile"] = true
 | 
			
		||||
				isLFSFile = true
 | 
			
		||||
 | 
			
		||||
				// OK read the lfs object
 | 
			
		||||
				var err error
 | 
			
		||||
				dataRc, err = lfs.ReadMetaObject(meta)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					ctx.ServerError("ReadMetaObject", err)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				defer dataRc.Close()
 | 
			
		||||
 | 
			
		||||
				buf = make([]byte, 1024)
 | 
			
		||||
				n, err = dataRc.Read(buf)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					ctx.ServerError("Data", err)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				buf = buf[:n]
 | 
			
		||||
 | 
			
		||||
				isTextFile = base.IsTextFile(buf)
 | 
			
		||||
				ctx.Data["IsTextFile"] = isTextFile
 | 
			
		||||
 | 
			
		||||
				fileSize = meta.Size
 | 
			
		||||
				ctx.Data["FileSize"] = meta.Size
 | 
			
		||||
				filenameBase64 := base64.RawURLEncoding.EncodeToString([]byte(readmeFile.Name()))
 | 
			
		||||
				ctx.Data["RawFileLink"] = fmt.Sprintf("%s%s.git/info/lfs/objects/%s/%s", setting.AppURL, ctx.Repo.Repository.FullName(), meta.Oid, filenameBase64)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if !isLFSFile {
 | 
			
		||||
			fileSize = readmeFile.Size()
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if isTextFile {
 | 
			
		||||
			if readmeFile.Size() >= setting.UI.MaxDisplayFileSize {
 | 
			
		||||
			if fileSize >= setting.UI.MaxDisplayFileSize {
 | 
			
		||||
				// Pretend that this is a normal text file to display 'This file is too large to be shown'
 | 
			
		||||
				ctx.Data["IsFileTooLarge"] = true
 | 
			
		||||
				ctx.Data["IsTextFile"] = true
 | 
			
		||||
				ctx.Data["FileSize"] = readmeFile.Size()
 | 
			
		||||
				ctx.Data["FileSize"] = fileSize
 | 
			
		||||
			} else {
 | 
			
		||||
				d, _ := ioutil.ReadAll(dataRc)
 | 
			
		||||
				buf = templates.ToUTF8WithFallback(append(buf, d...))
 | 
			
		||||
| 
						 | 
				
			
			@ -168,7 +217,8 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
 | 
			
		|||
 | 
			
		||||
	ctx.Data["Title"] = ctx.Data["Title"].(string) + " - " + ctx.Repo.TreePath + " at " + ctx.Repo.BranchName
 | 
			
		||||
 | 
			
		||||
	ctx.Data["FileSize"] = blob.Size()
 | 
			
		||||
	fileSize := blob.Size()
 | 
			
		||||
	ctx.Data["FileSize"] = fileSize
 | 
			
		||||
	ctx.Data["FileName"] = blob.Name()
 | 
			
		||||
	ctx.Data["HighlightClass"] = highlight.FileNameToHighlightClass(blob.Name())
 | 
			
		||||
	ctx.Data["RawFileLink"] = rawLink + "/" + ctx.Repo.TreePath
 | 
			
		||||
| 
						 | 
				
			
			@ -182,32 +232,44 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
 | 
			
		|||
	ctx.Data["IsTextFile"] = isTextFile
 | 
			
		||||
 | 
			
		||||
	//Check for LFS meta file
 | 
			
		||||
	if isTextFile {
 | 
			
		||||
		if meta := lfs.IsPointerFile(&buf); meta != nil {
 | 
			
		||||
			if meta, _ = ctx.Repo.Repository.GetLFSMetaObjectByOid(meta.Oid); meta != nil {
 | 
			
		||||
				ctx.Data["IsLFSFile"] = true
 | 
			
		||||
				isLFSFile = true
 | 
			
		||||
 | 
			
		||||
				// OK read the lfs object
 | 
			
		||||
				dataRc, err := lfs.ReadMetaObject(meta)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					ctx.ServerError("ReadMetaObject", err)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				defer dataRc.Close()
 | 
			
		||||
 | 
			
		||||
				buf = make([]byte, 1024)
 | 
			
		||||
				n, _ = dataRc.Read(buf)
 | 
			
		||||
				buf = buf[:n]
 | 
			
		||||
 | 
			
		||||
				isTextFile = base.IsTextFile(buf)
 | 
			
		||||
				ctx.Data["IsTextFile"] = isTextFile
 | 
			
		||||
 | 
			
		||||
				ctx.Data["FileSize"] = meta.Size
 | 
			
		||||
				filenameBase64 := base64.RawURLEncoding.EncodeToString([]byte(blob.Name()))
 | 
			
		||||
				ctx.Data["RawFileLink"] = fmt.Sprintf("%s%s.git/info/lfs/objects/%s/%s", setting.AppURL, ctx.Repo.Repository.FullName(), meta.Oid, filenameBase64)
 | 
			
		||||
	if isTextFile && setting.LFS.StartServer {
 | 
			
		||||
		meta := lfs.IsPointerFile(&buf)
 | 
			
		||||
		if meta != nil {
 | 
			
		||||
			meta, err = ctx.Repo.Repository.GetLFSMetaObjectByOid(meta.Oid)
 | 
			
		||||
			if err != nil && err != models.ErrLFSObjectNotExist {
 | 
			
		||||
				ctx.ServerError("GetLFSMetaObject", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if meta != nil {
 | 
			
		||||
			ctx.Data["IsLFSFile"] = true
 | 
			
		||||
			isLFSFile = true
 | 
			
		||||
 | 
			
		||||
			// OK read the lfs object
 | 
			
		||||
			var err error
 | 
			
		||||
			dataRc, err = lfs.ReadMetaObject(meta)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				ctx.ServerError("ReadMetaObject", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			defer dataRc.Close()
 | 
			
		||||
 | 
			
		||||
			buf = make([]byte, 1024)
 | 
			
		||||
			n, err = dataRc.Read(buf)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				ctx.ServerError("Data", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			buf = buf[:n]
 | 
			
		||||
 | 
			
		||||
			isTextFile = base.IsTextFile(buf)
 | 
			
		||||
			ctx.Data["IsTextFile"] = isTextFile
 | 
			
		||||
 | 
			
		||||
			fileSize = meta.Size
 | 
			
		||||
			ctx.Data["FileSize"] = meta.Size
 | 
			
		||||
			filenameBase64 := base64.RawURLEncoding.EncodeToString([]byte(blob.Name()))
 | 
			
		||||
			ctx.Data["RawFileLink"] = fmt.Sprintf("%s%s.git/info/lfs/objects/%s/%s", setting.AppURL, ctx.Repo.Repository.FullName(), meta.Oid, filenameBase64)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Assume file is not editable first.
 | 
			
		||||
| 
						 | 
				
			
			@ -219,7 +281,7 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
 | 
			
		|||
 | 
			
		||||
	switch {
 | 
			
		||||
	case isTextFile:
 | 
			
		||||
		if blob.Size() >= setting.UI.MaxDisplayFileSize {
 | 
			
		||||
		if fileSize >= setting.UI.MaxDisplayFileSize {
 | 
			
		||||
			ctx.Data["IsFileTooLarge"] = true
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue