mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 00:20:25 +08:00 
			
		
		
		
	Refactor editor upload, update and delete to use git plumbing and add LFS support (#5702)
* Use git plumbing for upload: #5621 repo_editor.go: UploadRepoFile
* Use git plumbing for upload: #5621 repo_editor.go: GetDiffPreview
* Use git plumbing for upload: #5621 repo_editor.go: DeleteRepoFile
* Use git plumbing for upload: #5621 repo_editor.go: UploadRepoFiles
* Move branch checkout functions out of repo_editor.go as they are no longer used there
* BUGFIX: The default permissions should be 100644
    This is a change from the previous code but is more in keeping
    with the default behaviour of git.
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Standardise cleanUploadFilename to more closely match git
See verify_path in: 7f4e641693/read-cache.c (L951)
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Redirect on bad paths
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Refactor to move the uploading functions out to a module
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Add LFS support
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Update upload.go attribution header
Upload.go is essentially the remnants of repo_editor.go. The remaining code is essentially unchanged from the Gogs code, hence the Gogs attribution.
* Delete upload files after session committed
* Ensure that GIT_AUTHOR_NAME etc. are valid for git
see #5774
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Add in test cases per @lafriks comment
* Add space between gitea and github imports
Signed-off-by: Andrew Thornton <art27@cantab.net>
* more examples in TestCleanUploadName
Signed-off-by: Andrew Thornton <art27@cantab.net>
* fix formatting
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Set the SSH_ORIGINAL_COMMAND to ensure hooks are run
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Switch off SSH_ORIGINAL_COMMAND
Signed-off-by: Andrew Thornton <art27@cantab.net>
			
			
This commit is contained in:
		@@ -1,7 +1,11 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/sha256"
 | 
			
		||||
	"encoding/hex"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
)
 | 
			
		||||
@@ -16,6 +20,11 @@ type LFSMetaObject struct {
 | 
			
		||||
	CreatedUnix  util.TimeStamp `xorm:"created"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Pointer returns the string representation of an LFS pointer file
 | 
			
		||||
func (m *LFSMetaObject) Pointer() string {
 | 
			
		||||
	return fmt.Sprintf("%s\n%s%s\nsize %d\n", LFSMetaFileIdentifier, LFSMetaFileOidPrefix, m.Oid, m.Size)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LFSTokenResponse defines the JSON structure in which the JWT token is stored.
 | 
			
		||||
// This structure is fetched via SSH and passed by the Git LFS client to the server
 | 
			
		||||
// endpoint for authorization.
 | 
			
		||||
@@ -67,6 +76,16 @@ func NewLFSMetaObject(m *LFSMetaObject) (*LFSMetaObject, error) {
 | 
			
		||||
	return m, sess.Commit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GenerateLFSOid generates a Sha256Sum to represent an oid for arbitrary content
 | 
			
		||||
func GenerateLFSOid(content io.Reader) (string, error) {
 | 
			
		||||
	h := sha256.New()
 | 
			
		||||
	if _, err := io.Copy(h, content); err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	sum := h.Sum(nil)
 | 
			
		||||
	return hex.EncodeToString(sum), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetLFSMetaObjectByOid selects a LFSMetaObject entry from database by its OID.
 | 
			
		||||
// It may return ErrLFSObjectNotExist or a database error. If the error is nil,
 | 
			
		||||
// the returned pointer is a valid LFSMetaObject.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user