Skip to content

Commit 13e2d13

Browse files
committedFeb 13, 2020
repo_remote: add unit tests
1 parent 12ae027 commit 13e2d13

File tree

6 files changed

+153
-15
lines changed

6 files changed

+153
-15
lines changed
 

‎error.go

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ var (
1212
ErrParentNotExist = errors.New("parent does not exist")
1313
ErrSubmoduleNotExist = errors.New("submodule does not exist")
1414
ErrRevisionNotExist = errors.New("revision does not exist")
15+
ErrRemoteNotExist = errors.New("remote does not exist")
1516
ErrExecTimeout = errors.New("execution was timed out")
1617
ErrNoMergeBase = errors.New("no merge based was found")
1718
)

‎repo_reference.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ func (r *Repository) ShowRefVerify(ref string, opts ...ShowRefVerifyOptions) (st
5858
return strings.Split(string(stdout), " ")[0], nil
5959
}
6060

61-
// HasReference returns true if given reference exists in the repository.
61+
// HasReference returns true if given reference exists in the repository. The reference must be
62+
// given in full path, e.g. refs/heads/master
6263
func (r *Repository) HasReference(ref string, opts ...ShowRefVerifyOptions) bool {
6364
_, err := r.ShowRefVerify(ref, opts...)
6465
return err == nil

‎repo_reference_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,7 @@ func TestRepository_ShowRef(t *testing.T) {
104104
Refspec: "refs/heads/release-1.0",
105105
},
106106
},
107-
},
108-
{
107+
}, {
109108
opt: ShowRefOptions{
110109
Tags: true,
111110
Patterns: []string{"v1.0.0"},

‎repo_remote.go

+17-12
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@ type LsRemoteOptions struct {
1919
Tags bool
2020
// Indicates whether to not show peeled tags or pseudorefs.
2121
Refs bool
22-
// The URL of the remote repository.
23-
URL string
22+
// The list of patterns to filter results.
23+
Patterns []string
2424
// The timeout duration before giving up. The default timeout duration will be used when not supplied.
2525
Timeout time.Duration
2626
}
2727

2828
// LsRemote returns a list references in the remote repository.
29-
func LsRemote(opts ...LsRemoteOptions) ([]*Reference, error) {
29+
func LsRemote(url string, opts ...LsRemoteOptions) ([]*Reference, error) {
3030
var opt LsRemoteOptions
31-
if len(opts) > 1 {
31+
if len(opts) > 0 {
3232
opt = opts[0]
3333
}
3434

@@ -42,8 +42,9 @@ func LsRemote(opts ...LsRemoteOptions) ([]*Reference, error) {
4242
if opt.Refs {
4343
cmd.AddArgs("--refs")
4444
}
45-
if opt.URL != "" {
46-
cmd.AddArgs(opt.URL)
45+
cmd.AddArgs(url)
46+
if len(opt.Patterns) > 0 {
47+
cmd.AddArgs(opt.Patterns...)
4748
}
4849

4950
stdout, err := cmd.RunWithTimeout(opt.Timeout)
@@ -69,14 +70,15 @@ func LsRemote(opts ...LsRemoteOptions) ([]*Reference, error) {
6970

7071
// IsURLAccessible returns true if given remote URL is accessible via Git.
7172
func IsURLAccessible(timeout time.Duration, url string) bool {
72-
_, err := LsRemote(LsRemoteOptions{
73-
URL: url,
74-
Timeout: timeout,
73+
_, err := LsRemote(url, LsRemoteOptions{
74+
Patterns: []string{"HEAD"},
75+
Timeout: timeout,
7576
})
7677
return err == nil
7778
}
7879

7980
// AddRemoteOptions contains options to add a remote address.
81+
// Docs: https://git-scm.com/docs/git-remote#Documentation/git-remote.txt-emaddem
8082
type AddRemoteOptions struct {
8183
// Indicates whether to execute git fetch after the remote information is set up.
8284
Fetch bool
@@ -89,7 +91,7 @@ type AddRemoteOptions struct {
8991
// AddRemote adds a new remote to the repository.
9092
func (r *Repository) AddRemote(name, url string, opts ...AddRemoteOptions) error {
9193
var opt AddRemoteOptions
92-
if len(opts) > 1 {
94+
if len(opts) > 0 {
9395
opt = opts[0]
9496
}
9597

@@ -115,12 +117,15 @@ type RemoveRemoteOptions struct {
115117
// RemoveRemote removes a remote from the repository.
116118
func (r *Repository) RemoveRemote(name string, opts ...RemoveRemoteOptions) error {
117119
var opt RemoveRemoteOptions
118-
if len(opts) > 1 {
120+
if len(opts) > 0 {
119121
opt = opts[0]
120122
}
121123

122124
_, err := NewCommand("remote", "remove", name).RunInDirWithTimeout(opt.Timeout, r.path)
123-
if err != nil && !strings.Contains(err.Error(), "fatal: No such remote") {
125+
if err != nil {
126+
if strings.Contains(err.Error(), "fatal: No such remote") {
127+
return ErrRemoteNotExist
128+
}
124129
return err
125130
}
126131
return nil

‎repo_remote_test.go

+129
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package git
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestLsRemote(t *testing.T) {
11+
tests := []struct {
12+
url string
13+
opt LsRemoteOptions
14+
expRefs []*Reference
15+
}{
16+
{
17+
url: testrepo.Path(),
18+
opt: LsRemoteOptions{
19+
Heads: true,
20+
Patterns: []string{"release-1.0"},
21+
},
22+
expRefs: []*Reference{
23+
{
24+
ID: "0eedd79eba4394bbef888c804e899731644367fe",
25+
Refspec: "refs/heads/release-1.0",
26+
},
27+
},
28+
}, {
29+
url: testrepo.Path(),
30+
opt: LsRemoteOptions{
31+
Tags: true,
32+
Patterns: []string{"v1.0.0"},
33+
},
34+
expRefs: []*Reference{
35+
{
36+
ID: "0eedd79eba4394bbef888c804e899731644367fe",
37+
Refspec: "refs/tags/v1.0.0",
38+
},
39+
},
40+
}, {
41+
url: testrepo.Path(),
42+
opt: LsRemoteOptions{
43+
Refs: true,
44+
Patterns: []string{"v1.0.0"},
45+
},
46+
expRefs: []*Reference{
47+
{
48+
ID: "0eedd79eba4394bbef888c804e899731644367fe",
49+
Refspec: "refs/tags/v1.0.0",
50+
},
51+
},
52+
},
53+
}
54+
for _, test := range tests {
55+
t.Run("", func(t *testing.T) {
56+
refs, err := LsRemote(test.url, test.opt)
57+
if err != nil {
58+
t.Fatal(err)
59+
}
60+
61+
assert.Equal(t, test.expRefs, refs)
62+
})
63+
}
64+
}
65+
66+
func TestIsURLAccessible(t *testing.T) {
67+
tests := []struct {
68+
url string
69+
expVal bool
70+
}{
71+
{
72+
url: testrepo.Path(),
73+
expVal: true,
74+
}, {
75+
url: os.TempDir(),
76+
expVal: false,
77+
},
78+
}
79+
for _, test := range tests {
80+
t.Run("", func(t *testing.T) {
81+
assert.Equal(t, test.expVal, IsURLAccessible(DefaultTimeout, test.url))
82+
})
83+
}
84+
}
85+
86+
func TestRepository_AddRemote(t *testing.T) {
87+
path := tempPath()
88+
defer func() {
89+
_ = os.RemoveAll(path)
90+
}()
91+
92+
err := Init(path, InitOptions{
93+
Bare: true,
94+
})
95+
if err != nil {
96+
t.Fatal(err)
97+
}
98+
99+
r, err := Open(path)
100+
if err != nil {
101+
t.Fatal(err)
102+
}
103+
104+
// Add testrepo as the mirror remote and fetch right away
105+
err = r.AddRemote("origin", testrepo.Path(), AddRemoteOptions{
106+
Fetch: true,
107+
MirrorFetch: true,
108+
})
109+
if err != nil {
110+
t.Fatal(err)
111+
}
112+
113+
// Check a non-default branch: release-1.0
114+
assert.True(t, r.HasReference(RefsHeads+"release-1.0"))
115+
}
116+
117+
func TestRepository_RemoveRemote(t *testing.T) {
118+
r, cleanup, err := setupTempRepo()
119+
if err != nil {
120+
t.Fatal(err)
121+
}
122+
defer cleanup()
123+
124+
err = r.RemoveRemote("origin", RemoveRemoteOptions{})
125+
assert.Nil(t, err)
126+
127+
err = r.RemoveRemote("origin", RemoveRemoteOptions{})
128+
assert.Equal(t, ErrRemoteNotExist, err)
129+
}

‎repo_tag.go

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package git
66

77
import (
88
"bytes"
9+
"fmt"
910
"strings"
1011
"time"
1112

@@ -92,6 +93,8 @@ func (r *Repository) getTag(timeout time.Duration, id *SHA1) (*Tag, error) {
9293

9394
tag.id = id
9495
tag.repo = r
96+
default:
97+
return nil, fmt.Errorf("unsupported tag type: %s", ObjectType(typ))
9598
}
9699

97100
r.cachedTags.Set(id.String(), tag)

0 commit comments

Comments
 (0)