mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-11-04 00:11:04 +00:00 
			
		
		
		
	* Improve get last commit using git log --name-status git log --name-status -c provides information about the diff between a commit and its parents. Using this and adjusting the algorithm to use the first change to a path allows for a much faster generation of commit info. There is a subtle change in the results generated but this will cause the results to more closely match those from elsewhere. Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: techknowlogick <techknowlogick@gitea.io> Co-authored-by: Lauris BH <lauris@nix.lv>
		
			
				
	
	
		
			72 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
		
			Vendored
		
	
	
	
			
		
		
	
	
			72 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
		
			Vendored
		
	
	
	
package buffer
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"encoding/gob"
 | 
						|
	"fmt"
 | 
						|
	"io"
 | 
						|
	"os"
 | 
						|
	"path/filepath"
 | 
						|
 | 
						|
	"github.com/djherbis/buffer/wrapio"
 | 
						|
)
 | 
						|
 | 
						|
// File is used as the backing resource for a the NewFile BufferAt.
 | 
						|
type File interface {
 | 
						|
	Name() string
 | 
						|
	Stat() (fi os.FileInfo, err error)
 | 
						|
	io.ReaderAt
 | 
						|
	io.WriterAt
 | 
						|
	Close() error
 | 
						|
}
 | 
						|
 | 
						|
type fileBuffer struct {
 | 
						|
	file File
 | 
						|
	*wrapio.Wrapper
 | 
						|
}
 | 
						|
 | 
						|
// NewFile returns a new BufferAt backed by "file" with max-size N.
 | 
						|
func NewFile(N int64, file File) BufferAt {
 | 
						|
	return &fileBuffer{
 | 
						|
		file:    file,
 | 
						|
		Wrapper: wrapio.NewWrapper(file, 0, 0, N),
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func init() {
 | 
						|
	gob.Register(&fileBuffer{})
 | 
						|
}
 | 
						|
 | 
						|
func (buf *fileBuffer) MarshalBinary() ([]byte, error) {
 | 
						|
	fullpath, err := filepath.Abs(filepath.Dir(buf.file.Name()))
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	base := filepath.Base(buf.file.Name())
 | 
						|
	buf.file.Close()
 | 
						|
 | 
						|
	buffer := bytes.NewBuffer(nil)
 | 
						|
	fmt.Fprintln(buffer, filepath.Join(fullpath, base))
 | 
						|
	fmt.Fprintln(buffer, buf.Wrapper.N, buf.Wrapper.L, buf.Wrapper.O)
 | 
						|
	return buffer.Bytes(), nil
 | 
						|
}
 | 
						|
 | 
						|
func (buf *fileBuffer) UnmarshalBinary(data []byte) error {
 | 
						|
	buffer := bytes.NewBuffer(data)
 | 
						|
	var filename string
 | 
						|
	var N, L, O int64
 | 
						|
	_, err := fmt.Fscanln(buffer, &filename)
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	file, err := os.Open(filename)
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
	buf.file = file
 | 
						|
 | 
						|
	_, err = fmt.Fscanln(buffer, &N, &L, &O)
 | 
						|
	buf.Wrapper = wrapio.NewWrapper(file, L, O, N)
 | 
						|
	return err
 | 
						|
}
 |