forked from git-lfs/git-lfs
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrefs.go
More file actions
94 lines (81 loc) · 2.21 KB
/
refs.go
File metadata and controls
94 lines (81 loc) · 2.21 KB
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package git
import (
"fmt"
"github.com/rubyist/tracerx"
)
type RefUpdate struct {
git Env
remote string
localRef *Ref
remoteRef *Ref
}
func NewRefUpdate(g Env, remote string, localRef, remoteRef *Ref) *RefUpdate {
return &RefUpdate{
git: g,
remote: remote,
localRef: localRef,
remoteRef: remoteRef,
}
}
func (u *RefUpdate) LocalRef() *Ref {
return u.localRef
}
func (u *RefUpdate) LocalRefCommitish() string {
return refCommitish(u.LocalRef())
}
func (u *RefUpdate) RemoteRef() *Ref {
if u.remoteRef == nil {
u.remoteRef = defaultRemoteRef(u.git, u.remote, u.LocalRef())
}
return u.remoteRef
}
// defaultRemoteRef returns the remote ref receiving a push based on the current
// repository config and local ref being pushed.
//
// See push.default rules in https://git-scm.com/docs/git-config
func defaultRemoteRef(g Env, remote string, localRef *Ref) *Ref {
pushMode, _ := g.Get("push.default")
switch pushMode {
case "", "simple":
brRemote, _ := g.Get(fmt.Sprintf("branch.%s.remote", localRef.Name))
if brRemote == remote {
// in centralized workflow, work like 'upstream' with an added safety to
// refuse to push if the upstream branch’s name is different from the
// local one.
return trackingRef(g, localRef)
}
// When pushing to a remote that is different from the remote you normally
// pull from, work as current.
return localRef
case "upstream", "tracking":
// push the current branch back to the branch whose changes are usually
// integrated into the current branch
return trackingRef(g, localRef)
case "current":
// push the current branch to update a branch with the same name on the
// receiving end.
return localRef
default:
tracerx.Printf("WARNING: %q push mode not supported", pushMode)
return localRef
}
}
func trackingRef(g Env, localRef *Ref) *Ref {
if merge, ok := g.Get(fmt.Sprintf("branch.%s.merge", localRef.Name)); ok {
return ParseRef(merge, "")
}
return localRef
}
func (u *RefUpdate) RemoteRefCommitish() string {
return refCommitish(u.RemoteRef())
}
func refCommitish(r *Ref) string {
if len(r.Sha) > 0 {
return r.Sha
}
return r.Name
}
// copy of env
type Env interface {
Get(key string) (val string, ok bool)
}