|
|
|
package dehub
|
|
|
|
|
|
|
|
import (
|
|
|
|
"dehub/fs"
|
|
|
|
"dehub/yamlutil"
|
|
|
|
"errors"
|
normalize how git commits are interacted with, including changing VerifyComit -> VerifyCommits
---
type: change
message: |-
normalize how git commits are interacted with, including changing VerifyComit -> VerifyCommits
This commit attempts to normalize git commit interactions in order to reduce
the amount of manual `GitRepo.CommitObject`, `GitRepo.TreeObject`,
`Commit.UnmarshalText`, and `Commit.Interface` calls are done, by creating a
single structure (`GitCommit`) which holds the output of those calls, and is
only created by a single method (`GetGitCommit`), which is then used by a bunch
of other methods to expand its functionality, including implementing a range
request which can be used by verify and the pre-receive hook (though it's only
used by the hook, currently).
change_hash: AMae4PL6+jrxhn2KEGHejstcdT37Gw/jjkl/UuovHcgd
credentials:
- type: pgp_signature
pub_key_id: 95C46FA6A41148AC
body: iQIzBAABAgAdFiEEJ6tQKp6olvZKJ0lwlcRvpqQRSKwFAl5uhvoACgkQlcRvpqQRSKzJrhAAqi2LEQVTyVktfsOBv/CZmefclLLqWTChVoeIZt2EAGDDGygmrx88hI0SEAviOzPMn0kiZFDeY5k7ICJMhJ9RVDU9WjH7fbOboMJW19rVhx6Ke/M2ERtrT0OFLRmFVJVDM0P8SEheQvR3HE/iiypBICVCtp+meHEq9mOJWZlZnoCqMaulAy/Nnq4N1VD0yPPlr16+yxMqedKHcgKbcH8K61ltNAjXDT+tCWwCq1huA5MVSuTm5EwqIeKPN6JKgwATv8Ku2GhYZWHSGUwecP1J3x2XTDPeChCQVDpC232Pxwk8z/D36F3J/XOfkdl0QYQ077xL1IJfYOnuuHir47CokDf3G0XCQnJ/+X4pZdtP387rc045o/2bhUi2U4eJ5HgS7Hvyi6EApT0Czv7SeJePTvdnRUYse8ZYuIwYXj5GWWxnbKQzLpyjcHdQc2a3B3RN84zXqqAOS6ObFrFPZQIfz2rfQojZN8kvcmUvYhJXSaT65XmqFjyJ4n6grrEnK/N+MfbnpzyF/yvlzxWPqGFQOQj9meosbTAdgZbmdwYqa5r1ee8DmlkzNJJxze96h503a733yciN8Ef4hGZNlRV6YFegkK/cCgKaA4NCEALKb1t0Uri5gnPldXk4HsPF+23GANbE7mjytY8ra3fhXG4VhaFt/WsLg3Bu7djQ0H74y+g=
account: mediocregopher
4 years ago
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"gopkg.in/src-d/go-git.v4/plumbing/object"
|
|
|
|
)
|
|
|
|
|
|
|
|
// CommitChange describes the structure of a change commit message.
|
|
|
|
type CommitChange struct {
|
|
|
|
Message string `yaml:"message"`
|
|
|
|
ChangeHash yamlutil.Blob `yaml:"change_hash"`
|
|
|
|
}
|
|
|
|
|
|
|
|
var _ CommitInterface = CommitChange{}
|
|
|
|
|
|
|
|
// NewCommitChange constructs a Commit populated with a CommitChange
|
|
|
|
// encompassing the currently staged file changes. The Credentials of the
|
|
|
|
// returned Commit will _not_ be filled in.
|
|
|
|
func (r *Repo) NewCommitChange(msg string) (Commit, error) {
|
normalize how git commits are interacted with, including changing VerifyComit -> VerifyCommits
---
type: change
message: |-
normalize how git commits are interacted with, including changing VerifyComit -> VerifyCommits
This commit attempts to normalize git commit interactions in order to reduce
the amount of manual `GitRepo.CommitObject`, `GitRepo.TreeObject`,
`Commit.UnmarshalText`, and `Commit.Interface` calls are done, by creating a
single structure (`GitCommit`) which holds the output of those calls, and is
only created by a single method (`GetGitCommit`), which is then used by a bunch
of other methods to expand its functionality, including implementing a range
request which can be used by verify and the pre-receive hook (though it's only
used by the hook, currently).
change_hash: AMae4PL6+jrxhn2KEGHejstcdT37Gw/jjkl/UuovHcgd
credentials:
- type: pgp_signature
pub_key_id: 95C46FA6A41148AC
body: iQIzBAABAgAdFiEEJ6tQKp6olvZKJ0lwlcRvpqQRSKwFAl5uhvoACgkQlcRvpqQRSKzJrhAAqi2LEQVTyVktfsOBv/CZmefclLLqWTChVoeIZt2EAGDDGygmrx88hI0SEAviOzPMn0kiZFDeY5k7ICJMhJ9RVDU9WjH7fbOboMJW19rVhx6Ke/M2ERtrT0OFLRmFVJVDM0P8SEheQvR3HE/iiypBICVCtp+meHEq9mOJWZlZnoCqMaulAy/Nnq4N1VD0yPPlr16+yxMqedKHcgKbcH8K61ltNAjXDT+tCWwCq1huA5MVSuTm5EwqIeKPN6JKgwATv8Ku2GhYZWHSGUwecP1J3x2XTDPeChCQVDpC232Pxwk8z/D36F3J/XOfkdl0QYQ077xL1IJfYOnuuHir47CokDf3G0XCQnJ/+X4pZdtP387rc045o/2bhUi2U4eJ5HgS7Hvyi6EApT0Czv7SeJePTvdnRUYse8ZYuIwYXj5GWWxnbKQzLpyjcHdQc2a3B3RN84zXqqAOS6ObFrFPZQIfz2rfQojZN8kvcmUvYhJXSaT65XmqFjyJ4n6grrEnK/N+MfbnpzyF/yvlzxWPqGFQOQj9meosbTAdgZbmdwYqa5r1ee8DmlkzNJJxze96h503a733yciN8Ef4hGZNlRV6YFegkK/cCgKaA4NCEALKb1t0Uri5gnPldXk4HsPF+23GANbE7mjytY8ra3fhXG4VhaFt/WsLg3Bu7djQ0H74y+g=
account: mediocregopher
4 years ago
|
|
|
headTree := new(object.Tree)
|
|
|
|
if head, err := r.GetGitHead(); err != nil && !errors.Is(err, ErrNoHead) {
|
|
|
|
return Commit{}, fmt.Errorf("getting HEAD commit: %w", err)
|
|
|
|
} else if err == nil {
|
|
|
|
headTree = head.GitTree
|
|
|
|
}
|
|
|
|
|
|
|
|
_, stagedTree, err := fs.FromStagedChangesTree(r.GitRepo)
|
|
|
|
if err != nil {
|
|
|
|
return Commit{}, err
|
|
|
|
}
|
|
|
|
|
|
|
|
cc := CommitChange{Message: msg}
|
|
|
|
if cc.ChangeHash, err = cc.Hash(headTree, stagedTree); err != nil {
|
|
|
|
return Commit{}, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return Commit{
|
|
|
|
Change: &cc,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// MessageHead implements the method for the CommitInterface interface.
|
|
|
|
func (cc CommitChange) MessageHead(CommitCommon) (string, error) {
|
|
|
|
i := strings.Index(cc.Message, "\n")
|
|
|
|
if i > 0 {
|
|
|
|
return cc.Message[:i], nil
|
|
|
|
}
|
|
|
|
return cc.Message, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Hash implements the method for the CommitInterface interface.
|
|
|
|
func (cc CommitChange) Hash(parent, this *object.Tree) ([]byte, error) {
|
|
|
|
return genChangeHash(nil, cc.Message, parent, this), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetHash implements the method for the CommitInterface interface.
|
|
|
|
func (cc CommitChange) GetHash() []byte {
|
|
|
|
return cc.ChangeHash
|
|
|
|
}
|