2016-11-04 01:16:01 +03:00
// Copyright 2015 The Gogs Authors. All rights reserved.
2019-04-19 15:17:27 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2016-11-04 01:16:01 +03:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package git
import (
2019-11-15 05:52:59 +03:00
"bytes"
2019-04-17 19:06:35 +03:00
"encoding/base64"
2016-11-04 01:16:01 +03:00
"io"
2017-11-29 04:50:39 +03:00
"io/ioutil"
2019-04-19 15:17:27 +03:00
2020-03-17 19:19:58 +03:00
"github.com/go-git/go-git/v5/plumbing"
2016-11-04 01:16:01 +03:00
)
// Blob represents a Git object.
type Blob struct {
2019-04-19 15:17:27 +03:00
ID SHA1
2016-11-04 01:16:01 +03:00
2019-04-19 15:17:27 +03:00
gogitEncodedObj plumbing . EncodedObject
name string
2017-11-29 04:50:39 +03:00
}
// DataAsync gets a ReadCloser for the contents of a blob without reading it all.
// Calling the Close function on the result will discard all unread output.
func ( b * Blob ) DataAsync ( ) ( io . ReadCloser , error ) {
2019-04-19 15:17:27 +03:00
return b . gogitEncodedObj . Reader ( )
}
2017-11-29 04:50:39 +03:00
2019-04-19 15:17:27 +03:00
// Size returns the uncompressed size of the blob
func ( b * Blob ) Size ( ) int64 {
return b . gogitEncodedObj . Size ( )
}
2017-11-29 04:50:39 +03:00
2019-04-19 15:17:27 +03:00
// Name returns name of the tree entry this blob object was created from (or empty string)
func ( b * Blob ) Name ( ) string {
return b . name
2017-11-29 04:50:39 +03:00
}
2019-04-17 19:06:35 +03:00
2019-06-29 23:51:10 +03:00
// GetBlobContent Gets the content of the blob as raw text
func ( b * Blob ) GetBlobContent ( ) ( string , error ) {
dataRc , err := b . DataAsync ( )
if err != nil {
return "" , err
}
defer dataRc . Close ( )
buf := make ( [ ] byte , 1024 )
n , _ := dataRc . Read ( buf )
buf = buf [ : n ]
return string ( buf ) , nil
}
2019-11-15 05:52:59 +03:00
// GetBlobLineCount gets line count of lob as raw text
func ( b * Blob ) GetBlobLineCount ( ) ( int , error ) {
reader , err := b . DataAsync ( )
if err != nil {
return 0 , err
}
defer reader . Close ( )
buf := make ( [ ] byte , 32 * 1024 )
count := 0
lineSep := [ ] byte { '\n' }
for {
c , err := reader . Read ( buf )
count += bytes . Count ( buf [ : c ] , lineSep )
switch {
case err == io . EOF :
return count , nil
case err != nil :
return count , err
}
}
}
2019-04-17 19:06:35 +03:00
// GetBlobContentBase64 Reads the content of the blob with a base64 encode and returns the encoded string
func ( b * Blob ) GetBlobContentBase64 ( ) ( string , error ) {
dataRc , err := b . DataAsync ( )
if err != nil {
return "" , err
}
defer dataRc . Close ( )
pr , pw := io . Pipe ( )
encoder := base64 . NewEncoder ( base64 . StdEncoding , pw )
go func ( ) {
_ , err := io . Copy ( encoder , dataRc )
2019-06-12 22:41:28 +03:00
_ = encoder . Close ( )
2019-04-17 19:06:35 +03:00
if err != nil {
2019-06-12 22:41:28 +03:00
_ = pw . CloseWithError ( err )
2019-04-17 19:06:35 +03:00
} else {
2019-06-12 22:41:28 +03:00
_ = pw . Close ( )
2019-04-17 19:06:35 +03:00
}
} ( )
out , err := ioutil . ReadAll ( pr )
if err != nil {
return "" , err
}
return string ( out ) , nil
}