mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-10-31 06:21:11 +00:00 
			
		
		
		
	Use git log name-status in get last commit (#16059)
* 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>
This commit is contained in:
		
					parent
					
						
							
								8fa3bbc424
							
						
					
				
			
			
				commit
				
					
						23358bc55d
					
				
			
		
					 40 changed files with 2540 additions and 297 deletions
				
			
		
							
								
								
									
										111
									
								
								vendor/github.com/djherbis/buffer/pool.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								vendor/github.com/djherbis/buffer/pool.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,111 @@ | |||
| package buffer | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/binary" | ||||
| 	"encoding/gob" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"sync" | ||||
| ) | ||||
| 
 | ||||
| // Pool provides a way to Allocate and Release Buffer objects | ||||
| // Pools mut be concurrent-safe for calls to Get() and Put(). | ||||
| type Pool interface { | ||||
| 	Get() (Buffer, error) // Allocate a Buffer | ||||
| 	Put(buf Buffer) error // Release or Reuse a Buffer | ||||
| } | ||||
| 
 | ||||
| type pool struct { | ||||
| 	pool sync.Pool | ||||
| } | ||||
| 
 | ||||
| // NewPool returns a Pool(), it's backed by a sync.Pool so its safe for concurrent use. | ||||
| // Get() and Put() errors will always be nil. | ||||
| // It will not work with gob. | ||||
| func NewPool(New func() Buffer) Pool { | ||||
| 	return &pool{ | ||||
| 		pool: sync.Pool{ | ||||
| 			New: func() interface{} { | ||||
| 				return New() | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (p *pool) Get() (Buffer, error) { | ||||
| 	return p.pool.Get().(Buffer), nil | ||||
| } | ||||
| 
 | ||||
| func (p *pool) Put(buf Buffer) error { | ||||
| 	buf.Reset() | ||||
| 	p.pool.Put(buf) | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| type memPool struct { | ||||
| 	N int64 | ||||
| 	Pool | ||||
| } | ||||
| 
 | ||||
| // NewMemPool returns a Pool, Get() returns an in memory buffer of max size N. | ||||
| // Put() returns the buffer to the pool after resetting it. | ||||
| // Get() and Put() errors will always be nil. | ||||
| func NewMemPool(N int64) Pool { | ||||
| 	return &memPool{ | ||||
| 		N: N, | ||||
| 		Pool: NewPool(func() Buffer { | ||||
| 			return New(N) | ||||
| 		}), | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (m *memPool) MarshalBinary() ([]byte, error) { | ||||
| 	buf := bytes.NewBuffer(nil) | ||||
| 	err := binary.Write(buf, binary.LittleEndian, m.N) | ||||
| 	return buf.Bytes(), err | ||||
| } | ||||
| 
 | ||||
| func (m *memPool) UnmarshalBinary(data []byte) error { | ||||
| 	buf := bytes.NewReader(data) | ||||
| 	err := binary.Read(buf, binary.LittleEndian, &m.N) | ||||
| 	m.Pool = NewPool(func() Buffer { | ||||
| 		return New(m.N) | ||||
| 	}) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| type filePool struct { | ||||
| 	N         int64 | ||||
| 	Directory string | ||||
| } | ||||
| 
 | ||||
| // NewFilePool returns a Pool, Get() returns a file-based buffer of max size N. | ||||
| // Put() closes and deletes the underlying file for the buffer. | ||||
| // Get() may return an error if it fails to create a file for the buffer. | ||||
| // Put() may return an error if it fails to delete the file. | ||||
| func NewFilePool(N int64, dir string) Pool { | ||||
| 	return &filePool{N: N, Directory: dir} | ||||
| } | ||||
| 
 | ||||
| func (p *filePool) Get() (Buffer, error) { | ||||
| 	file, err := ioutil.TempFile(p.Directory, "buffer") | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return NewFile(p.N, file), nil | ||||
| } | ||||
| 
 | ||||
| func (p *filePool) Put(buf Buffer) (err error) { | ||||
| 	buf.Reset() | ||||
| 	if fileBuf, ok := buf.(*fileBuffer); ok { | ||||
| 		fileBuf.file.Close() | ||||
| 		err = os.Remove(fileBuf.file.Name()) | ||||
| 	} | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| func init() { | ||||
| 	gob.Register(&memPool{}) | ||||
| 	gob.Register(&filePool{}) | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue