1package git
2
3import (
4 "context"
5 "io/ioutil"
6 "os"
7 "path/filepath"
8
9 "gopkg.in/src-d/go-git.v4/plumbing"
10
11 . "gopkg.in/check.v1"
12 "gopkg.in/src-d/go-git-fixtures.v3"
13)
14
15type SubmoduleSuite struct {
16 BaseSuite
17 Worktree *Worktree
18 path string
19}
20
21var _ = Suite(&SubmoduleSuite{})
22
23func (s *SubmoduleSuite) SetUpTest(c *C) {
24 path := fixtures.ByTag("submodule").One().Worktree().Root()
25
26 dir, err := ioutil.TempDir("", "submodule")
27 c.Assert(err, IsNil)
28
29 r, err := PlainClone(filepath.Join(dir, "worktree"), false, &CloneOptions{
30 URL: path,
31 })
32
33 c.Assert(err, IsNil)
34
35 s.Repository = r
36 s.Worktree, err = r.Worktree()
37 c.Assert(err, IsNil)
38
39 s.path = dir
40}
41
42func (s *SubmoduleSuite) TearDownTest(c *C) {
43 err := os.RemoveAll(s.path)
44 c.Assert(err, IsNil)
45}
46
47func (s *SubmoduleSuite) TestInit(c *C) {
48 sm, err := s.Worktree.Submodule("basic")
49 c.Assert(err, IsNil)
50
51 c.Assert(sm.initialized, Equals, false)
52 err = sm.Init()
53 c.Assert(err, IsNil)
54
55 c.Assert(sm.initialized, Equals, true)
56
57 cfg, err := s.Repository.Config()
58 c.Assert(err, IsNil)
59
60 c.Assert(cfg.Submodules, HasLen, 1)
61 c.Assert(cfg.Submodules["basic"], NotNil)
62
63 status, err := sm.Status()
64 c.Assert(err, IsNil)
65 c.Assert(status.IsClean(), Equals, false)
66}
67
68func (s *SubmoduleSuite) TestUpdate(c *C) {
69 sm, err := s.Worktree.Submodule("basic")
70 c.Assert(err, IsNil)
71
72 err = sm.Update(&SubmoduleUpdateOptions{
73 Init: true,
74 })
75
76 c.Assert(err, IsNil)
77
78 r, err := sm.Repository()
79 c.Assert(err, IsNil)
80
81 ref, err := r.Reference(plumbing.HEAD, true)
82 c.Assert(err, IsNil)
83 c.Assert(ref.Hash().String(), Equals, "6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
84
85 status, err := sm.Status()
86 c.Assert(err, IsNil)
87 c.Assert(status.IsClean(), Equals, true)
88}
89
90func (s *SubmoduleSuite) TestRepositoryWithoutInit(c *C) {
91 sm, err := s.Worktree.Submodule("basic")
92 c.Assert(err, IsNil)
93
94 r, err := sm.Repository()
95 c.Assert(err, Equals, ErrSubmoduleNotInitialized)
96 c.Assert(r, IsNil)
97}
98
99func (s *SubmoduleSuite) TestUpdateWithoutInit(c *C) {
100 sm, err := s.Worktree.Submodule("basic")
101 c.Assert(err, IsNil)
102
103 err = sm.Update(&SubmoduleUpdateOptions{})
104 c.Assert(err, Equals, ErrSubmoduleNotInitialized)
105}
106
107func (s *SubmoduleSuite) TestUpdateWithNotFetch(c *C) {
108 sm, err := s.Worktree.Submodule("basic")
109 c.Assert(err, IsNil)
110
111 err = sm.Update(&SubmoduleUpdateOptions{
112 Init: true,
113 NoFetch: true,
114 })
115
116 // Since we are not fetching, the object is not there
117 c.Assert(err, Equals, plumbing.ErrObjectNotFound)
118}
119
120func (s *SubmoduleSuite) TestUpdateWithRecursion(c *C) {
121 sm, err := s.Worktree.Submodule("itself")
122 c.Assert(err, IsNil)
123
124 err = sm.Update(&SubmoduleUpdateOptions{
125 Init: true,
126 RecurseSubmodules: 2,
127 })
128
129 c.Assert(err, IsNil)
130
131 fs := s.Worktree.Filesystem
132 _, err = fs.Stat(fs.Join("itself", "basic", "LICENSE"))
133 c.Assert(err, IsNil)
134}
135
136func (s *SubmoduleSuite) TestUpdateWithInitAndUpdate(c *C) {
137 sm, err := s.Worktree.Submodule("basic")
138 c.Assert(err, IsNil)
139
140 err = sm.Update(&SubmoduleUpdateOptions{
141 Init: true,
142 })
143 c.Assert(err, IsNil)
144
145 idx, err := s.Repository.Storer.Index()
146 c.Assert(err, IsNil)
147
148 for i, e := range idx.Entries {
149 if e.Name == "basic" {
150 e.Hash = plumbing.NewHash("b029517f6300c2da0f4b651b8642506cd6aaf45d")
151 }
152
153 idx.Entries[i] = e
154 }
155
156 err = s.Repository.Storer.SetIndex(idx)
157 c.Assert(err, IsNil)
158
159 err = sm.Update(&SubmoduleUpdateOptions{})
160 c.Assert(err, IsNil)
161
162 r, err := sm.Repository()
163 c.Assert(err, IsNil)
164
165 ref, err := r.Reference(plumbing.HEAD, true)
166 c.Assert(err, IsNil)
167 c.Assert(ref.Hash().String(), Equals, "b029517f6300c2da0f4b651b8642506cd6aaf45d")
168
169}
170
171func (s *SubmoduleSuite) TestSubmodulesInit(c *C) {
172 sm, err := s.Worktree.Submodules()
173 c.Assert(err, IsNil)
174
175 err = sm.Init()
176 c.Assert(err, IsNil)
177
178 sm, err = s.Worktree.Submodules()
179 c.Assert(err, IsNil)
180
181 for _, m := range sm {
182 c.Assert(m.initialized, Equals, true)
183 }
184}
185
186func (s *SubmoduleSuite) TestSubmodulesStatus(c *C) {
187 sm, err := s.Worktree.Submodules()
188 c.Assert(err, IsNil)
189
190 status, err := sm.Status()
191 c.Assert(err, IsNil)
192 c.Assert(status, HasLen, 2)
193}
194
195func (s *SubmoduleSuite) TestSubmodulesUpdateContext(c *C) {
196 sm, err := s.Worktree.Submodules()
197 c.Assert(err, IsNil)
198
199 ctx, cancel := context.WithCancel(context.Background())
200 cancel()
201
202 err = sm.UpdateContext(ctx, &SubmoduleUpdateOptions{Init: true})
203 c.Assert(err, NotNil)
204}