-
Notifications
You must be signed in to change notification settings - Fork 25
/
git_revert.go
69 lines (58 loc) · 1.47 KB
/
git_revert.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package vcs
import (
"fmt"
git "github.com/libgit2/git2go/v33"
)
func (r *repository) RevertOnBranch(revertCommitID, branchName string) (string, error) {
defer getMeterFunc("RevertOnBranch")()
id, err := git.NewOid(revertCommitID)
if err != nil {
return "", err
}
revertCommit, err := r.r.LookupCommit(id)
if err != nil {
return "", err
}
defer revertCommit.Free()
branchHeadCommitId, err := r.BranchCommitID(branchName)
if err != nil {
return "", err
}
branchHeadCommitOid, err := git.NewOid(branchHeadCommitId)
if err != nil {
return "", err
}
branchHeadCommit, err := r.r.LookupCommit(branchHeadCommitOid)
if err != nil {
return "", err
}
opts, err := git.DefaultMergeOptions()
if err != nil {
return "", err
}
idx, err := r.r.RevertCommit(revertCommit, branchHeadCommit, 0, &opts)
if err != nil {
return "", err
}
defer idx.Free()
treeID, err := idx.WriteTreeTo(r.r)
if err != nil {
return "", err
}
tree, err := r.r.LookupTree(treeID)
if err != nil {
return "", fmt.Errorf("lookup tree failed: %w", err)
}
defer tree.Free()
branch, err := r.r.Head()
if err != nil {
return "", fmt.Errorf("get head failed: %w", err)
}
defer branch.Free()
signature := git.Signature{Email: "noreply@getsturdy.com", Name: "Sturdy"}
oid, err := r.r.CreateCommit("refs/heads/"+branchName, &signature, &signature, "revert", tree, branchHeadCommit)
if err != nil {
return "", fmt.Errorf("failed to create commit: %w", err)
}
return oid.String(), nil
}