repository_spec.rb 56,9 КБ
Newer Older
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
1
2
require 'spec_helper'

Douwe Maan's avatar
Douwe Maan включено в состав коммита
3
describe Repository, models: true do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
4
  include RepoHelpers
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
5
  TestBlob = Struct.new(:name)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
6

Robert Speicher's avatar
Robert Speicher включено в состав коммита
7
  let(:project) { create(:project, :repository) }
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
8
  let(:repository) { project.repository }
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
9
  let(:user) { create(:user) }
Z.J. van de Weg's avatar
Z.J. van de Weg включено в состав коммита
10

Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
11
12
13
14
  let(:commit_options) do
    author = repository.user_to_committer(user)
    { message: 'Test message', committer: author, author: author }
  end
Z.J. van de Weg's avatar
Z.J. van de Weg включено в состав коммита
15

Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
16
  let(:merge_commit) do
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
17
    merge_request = create(:merge_request, source_branch: 'feature', target_branch: 'master', source_project: project)
Sean McGivern's avatar
Sean McGivern включено в состав коммита
18
19
20
21
22
23

    merge_commit_id = repository.merge(user,
                                       merge_request.diff_head_sha,
                                       merge_request,
                                       commit_options)

Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
24
    repository.commit(merge_commit_id)
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
25
  end
Z.J. van de Weg's avatar
Z.J. van de Weg включено в состав коммита
26

Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
27
28
  let(:author_email) { 'user@example.org' }
  let(:author_name) { 'John Doe' }
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
29

Robert Speicher's avatar
Robert Speicher включено в состав коммита
30
  describe '#branch_names_contains' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
31
32
    subject { repository.branch_names_contains(sample_commit.id) }

Jeroen van Baarsen's avatar
Jeroen van Baarsen включено в состав коммита
33
34
35
    it { is_expected.to include('master') }
    it { is_expected.not_to include('feature') }
    it { is_expected.not_to include('fix') }
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
36
  end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
37

Robert Speicher's avatar
Robert Speicher включено в состав коммита
38
  describe '#tag_names_contains' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
39
    subject { repository.tag_names_contains(sample_commit.id) }
Stan Hu's avatar
Stan Hu включено в состав коммита
40

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
41
42
    it { is_expected.to include('v1.1.0') }
    it { is_expected.not_to include('v1.0.0') }
Hannes Rosenögger's avatar
Hannes Rosenögger включено в состав коммита
43
44
  end

Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  describe 'tags_sorted_by' do
    context 'name' do
      subject { repository.tags_sorted_by('name').map(&:name) }

      it { is_expected.to eq(['v1.1.0', 'v1.0.0']) }
    end

    context 'updated' do
      let(:tag_a) { repository.find_tag('v1.0.0') }
      let(:tag_b) { repository.find_tag('v1.1.0') }

      context 'desc' do
        subject { repository.tags_sorted_by('updated_desc').map(&:name) }

        before do
          double_first = double(committed_date: Time.now)
          double_last = double(committed_date: Time.now - 1.second)

Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
63
64
          allow(tag_a).to receive(:dereferenced_target).and_return(double_first)
          allow(tag_b).to receive(:dereferenced_target).and_return(double_last)
Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
65
          allow(repository).to receive(:tags).and_return([tag_a, tag_b])
Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
66
67
68
69
70
71
72
73
74
75
76
77
        end

        it { is_expected.to eq(['v1.0.0', 'v1.1.0']) }
      end

      context 'asc' do
        subject { repository.tags_sorted_by('updated_asc').map(&:name) }

        before do
          double_first = double(committed_date: Time.now - 1.second)
          double_last = double(committed_date: Time.now)

Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
78
79
          allow(tag_a).to receive(:dereferenced_target).and_return(double_last)
          allow(tag_b).to receive(:dereferenced_target).and_return(double_first)
Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
80
          allow(repository).to receive(:tags).and_return([tag_a, tag_b])
Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
81
82
83
84
        end

        it { is_expected.to eq(['v1.1.0', 'v1.0.0']) }
      end
Stan Hu's avatar
Stan Hu включено в состав коммита
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

      context 'annotated tag pointing to a blob' do
        let(:annotated_tag_name) { 'annotated-tag' }

        subject { repository.tags_sorted_by('updated_asc').map(&:name) }

        before do
          options = { message: 'test tag message\n',
                      tagger: { name: 'John Smith', email: 'john@gmail.com' } }
          repository.rugged.tags.create(annotated_tag_name, 'a48e4fc218069f68ef2e769dd8dfea3991362175', options)

          double_first = double(committed_date: Time.now - 1.second)
          double_last = double(committed_date: Time.now)

          allow(tag_a).to receive(:dereferenced_target).and_return(double_last)
          allow(tag_b).to receive(:dereferenced_target).and_return(double_first)
        end

        it { is_expected.to eq(['v1.1.0', 'v1.0.0', annotated_tag_name]) }

        after do
          repository.rugged.tags.delete(annotated_tag_name)
        end
      end
Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
109
110
111
    end
  end

Z.J. van de Weg's avatar
Z.J. van de Weg включено в состав коммита
112
113
114
  describe '#ref_name_for_sha' do
    context 'ref found' do
      it 'returns the ref' do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
115
116
        allow_any_instance_of(Gitlab::Popen).to receive(:popen).
          and_return(["b8d95eb4969eefacb0a58f6a28f6803f8070e7b9 commit\trefs/environments/production/77\n", 0])
Z.J. van de Weg's avatar
Z.J. van de Weg включено в состав коммита
117
118
119
120
121
122
123

        expect(repository.ref_name_for_sha('bla', '0' * 40)).to eq 'refs/environments/production/77'
      end
    end

    context 'ref not found' do
      it 'returns nil' do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
124
125
        allow_any_instance_of(Gitlab::Popen).to receive(:popen).
          and_return(["", 0])
Z.J. van de Weg's avatar
Z.J. van de Weg включено в состав коммита
126
127
128
129
130
131

        expect(repository.ref_name_for_sha('bla', '0' * 40)).to eq nil
      end
    end
  end

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  describe '#ref_exists?' do
    context 'when ref exists' do
      it 'returns true' do
        expect(repository.ref_exists?('refs/heads/master')).to be true
      end
    end

    context 'when ref does not exist' do
      it 'returns false' do
        expect(repository.ref_exists?('refs/heads/non-existent')).to be false
      end
    end

    context 'when ref format is incorrect' do
      it 'returns false' do
        expect(repository.ref_exists?('refs/heads/invalid:master')).to be false
      end
    end
  end

Robert Speicher's avatar
Robert Speicher включено в состав коммита
152
  describe '#last_commit_for_path' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
153
    subject { repository.last_commit_for_path(sample_commit.id, '.gitignore').id }
Hannes Rosenögger's avatar
Hannes Rosenögger включено в состав коммита
154

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
155
    it { is_expected.to eq('c1acaa58bbcbc3eafe538cb8274ba387047b69f8') }
Stan Hu's avatar
Stan Hu включено в состав коммита
156
  end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
157

Hiroyuki Sato's avatar
Hiroyuki Sato включено в состав коммита
158
159
160
  describe '#last_commit_id_for_path' do
    subject { repository.last_commit_id_for_path(sample_commit.id, '.gitignore') }

Hiroyuki Sato's avatar
Hiroyuki Sato включено в состав коммита
161
162
163
    it "returns last commit id for a given path" do
      is_expected.to eq('c1acaa58bbcbc3eafe538cb8274ba387047b69f8')
    end
Hiroyuki Sato's avatar
Hiroyuki Sato включено в состав коммита
164

Hiroyuki Sato's avatar
Hiroyuki Sato включено в состав коммита
165
    it "caches last commit id for a given path" do
Hiroyuki Sato's avatar
Hiroyuki Sato включено в состав коммита
166
167
      cache = repository.send(:cache)
      key = "last_commit_id_for_path:#{sample_commit.id}:#{Digest::SHA1.hexdigest('.gitignore')}"
Hiroyuki Sato's avatar
Hiroyuki Sato включено в состав коммита
168

Hiroyuki Sato's avatar
Hiroyuki Sato включено в состав коммита
169
      expect(cache).to receive(:fetch).with(key).and_return('c1acaa5')
Hiroyuki Sato's avatar
Hiroyuki Sato включено в состав коммита
170
      is_expected.to eq('c1acaa5')
Hiroyuki Sato's avatar
Hiroyuki Sato включено в состав коммита
171
172
173
    end
  end

Sean McGivern's avatar
Sean McGivern включено в состав коммита
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
  describe '#commits' do
    it 'sets follow when path is a single path' do
      expect(Gitlab::Git::Commit).to receive(:where).with(a_hash_including(follow: true)).and_call_original.twice

      repository.commits('master', path: 'README.md')
      repository.commits('master', path: ['README.md'])
    end

    it 'does not set follow when path is multiple paths' do
      expect(Gitlab::Git::Commit).to receive(:where).with(a_hash_including(follow: false)).and_call_original

      repository.commits('master', path: ['README.md', 'CHANGELOG'])
    end

    it 'does not set follow when there are no paths' do
      expect(Gitlab::Git::Commit).to receive(:where).with(a_hash_including(follow: false)).and_call_original

      repository.commits('master')
    end
  end

Robert Speicher's avatar
Robert Speicher включено в состав коммита
195
  describe '#find_commits_by_message' do
Adam Niedzielski's avatar
Adam Niedzielski включено в состав коммита
196
197
    it 'returns commits with messages containing a given string' do
      commit_ids = repository.find_commits_by_message('submodule').map(&:id)
Jonathan Schoeffling's avatar
Jonathan Schoeffling включено в состав коммита
198

Adam Niedzielski's avatar
Adam Niedzielski включено в состав коммита
199
200
201
202
203
204
205
206
207
208
209
      expect(commit_ids).to include('5937ac0a7beb003549fc5fd26fc247adbce4a52e')
      expect(commit_ids).to include('6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9')
      expect(commit_ids).to include('cfe32cf61b73a0d5e9f13e774abde7ff789b1660')
      expect(commit_ids).not_to include('913c66a37b4a45b9769037c55c2d238bd0942d2e')
    end

    it 'is case insensitive' do
      commit_ids = repository.find_commits_by_message('SUBMODULE').map(&:id)

      expect(commit_ids).to include('5937ac0a7beb003549fc5fd26fc247adbce4a52e')
    end
Jonathan Schoeffling's avatar
Jonathan Schoeffling включено в состав коммита
210
211
  end

Robert Speicher's avatar
Robert Speicher включено в состав коммита
212
  describe '#blob_at' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
213
214
215
216
217
218
    context 'blank sha' do
      subject { repository.blob_at(Gitlab::Git::BLANK_SHA, '.gitignore') }

      it { is_expected.to be_nil }
    end
  end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
219

Robert Speicher's avatar
Robert Speicher включено в состав коммита
220
  describe '#merged_to_root_ref?' do
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
221
    context 'merged branch without ff' do
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
222
      subject { repository.merged_to_root_ref?('branch-merged') }
Florent (HP)'s avatar
Florent (HP) включено в состав коммита
223
224
225

      it { is_expected.to be_truthy }
    end
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
226

tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
227
228
    # If the HEAD was ff then it will be false
    context 'merged with ff' do
Florent (HP)'s avatar
Florent (HP) включено в состав коммита
229
230
231
232
      subject { repository.merged_to_root_ref?('improve/awesome') }

      it { is_expected.to be_truthy }
    end
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
233

tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
234
235
236
237
238
    context 'not merged branch' do
      subject { repository.merged_to_root_ref?('not-merged-branch') }

      it { is_expected.to be_falsey }
    end
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
239
240
241
242
243
244

    context 'default branch' do
      subject { repository.merged_to_root_ref?('master') }

      it { is_expected.to be_falsey }
    end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
245
246
  end

Robert Speicher's avatar
Robert Speicher включено в состав коммита
247
  describe '#can_be_merged?' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
248
249
250
251
252
253
254
255
256
257
258
    context 'mergeable branches' do
      subject { repository.can_be_merged?('0b4bc9a49b562e85de7cc9e834518ea6828729b9', 'master') }

      it { is_expected.to be_truthy }
    end

    context 'non-mergeable branches' do
      subject { repository.can_be_merged?('bb5206fee213d983da88c47f9cf4cc6caf9c66dc', 'feature') }

      it { is_expected.to be_falsey }
    end
Florent (HP)'s avatar
Florent (HP) включено в состав коммита
259
260
261
262
263
264
265
266
267
268
269
270

    context 'non merged branch' do
      subject { repository.merged_to_root_ref?('fix') }

      it { is_expected.to be_falsey }
    end

    context 'non existent branch' do
      subject { repository.merged_to_root_ref?('non_existent_branch') }

      it { is_expected.to be_nil }
    end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
271
272
  end

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
273
274
275
  describe '#commit' do
    context 'when ref exists' do
      it 'returns commit object' do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
276
277
        expect(repository.commit('master'))
          .to be_an_instance_of Commit
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
      end
    end

    context 'when ref does not exist' do
      it 'returns nil' do
        expect(repository.commit('non-existent-ref')).to be_nil
      end
    end

    context 'when ref is not valid' do
      context 'when preceding tree element exists' do
        it 'returns nil' do
          expect(repository.commit('master:ref')).to be_nil
        end
      end

      context 'when preceding tree element does not exist' do
        it 'returns nil' do
          expect(repository.commit('non-existent:ref')).to be_nil
        end
      end
    end
  end

Douwe Maan's avatar
Douwe Maan включено в состав коммита
302
  describe "#create_dir" do
Dan Dunckel's avatar
Dan Dunckel включено в состав коммита
303
304
    it "commits a change that creates a new directory" do
      expect do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
305
        repository.create_dir(user, 'newdir',
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
306
          message: 'Create newdir', branch_name: 'master')
Dan Dunckel's avatar
Dan Dunckel включено в состав коммита
307
308
309
310
311
312
      end.to change { repository.commits('master').count }.by(1)

      newdir = repository.tree('master', 'newdir')
      expect(newdir.path).to eq('newdir')
    end

Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
313
314
315
316
317
    context "when committing to another project" do
      let(:forked_project) { create(:project) }

      it "creates a fork and commit to the forked project" do
        expect do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
318
          repository.create_dir(user, 'newdir',
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
319
            message: 'Create newdir', branch_name: 'patch',
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
320
            start_branch_name: 'master', start_project: forked_project)
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
321
322
323
324
325
326
327
328
329
330
        end.to change { repository.commits('master').count }.by(0)

        expect(repository.branch_exists?('patch')).to be_truthy
        expect(forked_project.repository.branch_exists?('patch')).to be_falsy

        newdir = repository.tree('patch', 'newdir')
        expect(newdir.path).to eq('newdir')
      end
    end

Dan Dunckel's avatar
Dan Dunckel включено в состав коммита
331
332
333
    context "when an author is specified" do
      it "uses the given email/name to set the commit's author" do
        expect do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
334
          repository.create_dir(user, 'newdir',
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
335
336
337
            message: 'Add newdir',
            branch_name: 'master',
            author_email: author_email, author_name: author_name)
Dan Dunckel's avatar
Dan Dunckel включено в состав коммита
338
339
340
341
342
343
344
345
346
347
        end.to change { repository.commits('master').count }.by(1)

        last_commit = repository.commit

        expect(last_commit.author_email).to eq(author_email)
        expect(last_commit.author_name).to eq(author_name)
      end
    end
  end

Douwe Maan's avatar
Douwe Maan включено в состав коммита
348
349
  describe "#create_file" do
    it 'commits new file successfully' do
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
350
      expect do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
351
352
353
        repository.create_file(user, 'NEWCHANGELOG', 'Changelog!',
                               message: 'Create changelog',
                               branch_name: 'master')
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
354
355
      end.to change { repository.commits('master').count }.by(1)

Douwe Maan's avatar
Douwe Maan включено в состав коммита
356
      blob = repository.blob_at('master', 'NEWCHANGELOG')
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
357

tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
358
      expect(blob.data).to eq('Changelog!')
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
359
    end
Dan Dunckel's avatar
Dan Dunckel включено в состав коммита
360

Douwe Maan's avatar
Douwe Maan включено в состав коммита
361
    it 'respects the autocrlf setting' do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
362
      repository.create_file(user, 'hello.txt', "Hello,\r\nWorld",
Douwe Maan's avatar
Douwe Maan включено в состав коммита
363
                             message: 'Add hello world',
Douwe Maan's avatar
Douwe Maan включено в состав коммита
364
                             branch_name: 'master')
Douwe Maan's avatar
Douwe Maan включено в состав коммита
365
366
367
368
369
370

      blob = repository.blob_at('master', 'hello.txt')

      expect(blob.data).to eq("Hello,\nWorld")
    end

Dan Dunckel's avatar
Dan Dunckel включено в состав коммита
371
372
373
    context "when an author is specified" do
      it "uses the given email/name to set the commit's author" do
        expect do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
374
          repository.create_file(user, 'NEWREADME', 'README!',
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
375
376
377
378
                                 message: 'Add README',
                                 branch_name: 'master',
                                 author_email: author_email,
                                 author_name: author_name)
Dan Dunckel's avatar
Dan Dunckel включено в состав коммита
379
380
381
382
383
384
385
386
        end.to change { repository.commits('master').count }.by(1)

        last_commit = repository.commit

        expect(last_commit.author_email).to eq(author_email)
        expect(last_commit.author_name).to eq(author_name)
      end
    end
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
387
388
  end

Dan Dunckel's avatar
Dan Dunckel включено в состав коммита
389
  describe "#update_file" do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
390
391
392
393
394
395
396
397
398
399
400
401
    it 'updates file successfully' do
      expect do
        repository.update_file(user, 'CHANGELOG', 'Changelog!',
                               message: 'Update changelog',
                               branch_name: 'master')
      end.to change { repository.commits('master').count }.by(1)

      blob = repository.blob_at('master', 'CHANGELOG')

      expect(blob.data).to eq('Changelog!')
    end

tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
402
    it 'updates filename successfully' do
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
403
404
      expect do
        repository.update_file(user, 'NEWLICENSE', 'Copyright!',
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
405
                                     branch_name: 'master',
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
406
                                     previous_path: 'LICENSE',
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
407
408
                                     message: 'Changes filename')
      end.to change { repository.commits('master').count }.by(1)
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
409
410
411
412
413
414

      files = repository.ls_files('master')

      expect(files).not_to include('LICENSE')
      expect(files).to include('NEWLICENSE')
    end
Dan Dunckel's avatar
Dan Dunckel включено в состав коммита
415
416
417
418

    context "when an author is specified" do
      it "uses the given email/name to set the commit's author" do
        expect do
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
419
420
421
422
423
424
          repository.update_file(user, 'README', 'Updated README!',
                                 branch_name: 'master',
                                 previous_path: 'README',
                                 message: 'Update README',
                                 author_email: author_email,
                                 author_name: author_name)
Dan Dunckel's avatar
Dan Dunckel включено в состав коммита
425
426
427
428
429
430
431
432
433
434
        end.to change { repository.commits('master').count }.by(1)

        last_commit = repository.commit

        expect(last_commit.author_email).to eq(author_email)
        expect(last_commit.author_name).to eq(author_name)
      end
    end
  end

Douwe Maan's avatar
Douwe Maan включено в состав коммита
435
  describe "#delete_file" do
Dan Dunckel's avatar
Dan Dunckel включено в состав коммита
436
437
    it 'removes file successfully' do
      expect do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
438
        repository.delete_file(user, 'README',
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
439
          message: 'Remove README', branch_name: 'master')
Dan Dunckel's avatar
Dan Dunckel включено в состав коммита
440
441
442
443
444
445
446
447
      end.to change { repository.commits('master').count }.by(1)

      expect(repository.blob_at('master', 'README')).to be_nil
    end

    context "when an author is specified" do
      it "uses the given email/name to set the commit's author" do
        expect do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
448
          repository.delete_file(user, 'README',
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
449
450
            message: 'Remove README', branch_name: 'master',
            author_email: author_email, author_name: author_name)
Dan Dunckel's avatar
Dan Dunckel включено в состав коммита
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
        end.to change { repository.commits('master').count }.by(1)

        last_commit = repository.commit

        expect(last_commit.author_email).to eq(author_email)
        expect(last_commit.author_name).to eq(author_name)
      end
    end
  end

  describe '#get_committer_and_author' do
    it 'returns the committer and author data' do
      options = repository.get_committer_and_author(user)
      expect(options[:committer][:email]).to eq(user.email)
      expect(options[:author][:email]).to eq(user.email)
    end

    context 'when the email/name are given' do
      it 'returns an object containing the email/name' do
        options = repository.get_committer_and_author(user, email: author_email, name: author_name)
        expect(options[:author][:email]).to eq(author_email)
        expect(options[:author][:name]).to eq(author_name)
      end
    end

    context 'when the email is given but the name is not' do
      it 'returns the committer as the author' do
        options = repository.get_committer_and_author(user, email: author_email)
        expect(options[:author][:email]).to eq(user.email)
        expect(options[:author][:name]).to eq(user.name)
      end
    end

    context 'when the name is given but the email is not' do
      it 'returns nil' do
        options = repository.get_committer_and_author(user, name: author_name)
        expect(options[:author][:email]).to eq(user.email)
        expect(options[:author][:name]).to eq(user.name)
      end
    end
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
491
492
  end

Valery Sizov's avatar
Valery Sizov включено в состав коммита
493
494
  describe "search_files_by_content" do
    let(:results) { repository.search_files_by_content('feature', 'master') }
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
495
496
497
498
    subject { results }

    it { is_expected.to be_an Array }

Robert Speicher's avatar
Robert Speicher включено в состав коммита
499
    it 'regex-escapes the query string' do
Valery Sizov's avatar
Valery Sizov включено в состав коммита
500
      results = repository.search_files_by_content("test\\", 'master')
Robert Speicher's avatar
Robert Speicher включено в состав коммита
501
502
503
504

      expect(results.first).not_to start_with('fatal:')
    end

Robert Speicher's avatar
Robert Speicher включено в состав коммита
505
    it 'properly handles an unmatched parenthesis' do
Valery Sizov's avatar
Valery Sizov включено в состав коммита
506
      results = repository.search_files_by_content("test(", 'master')
Robert Speicher's avatar
Robert Speicher включено в состав коммита
507
508
509
510

      expect(results.first).not_to start_with('fatal:')
    end

Valery Sizov's avatar
Valery Sizov включено в состав коммита
511
    it 'properly handles when query is not present' do
Valery Sizov's avatar
Valery Sizov включено в состав коммита
512
      results = repository.search_files_by_content('', 'master')
Valery Sizov's avatar
Valery Sizov включено в состав коммита
513
514
515
516
517
518

      expect(results).to match_array([])
    end

    it 'properly handles query when repo is empty' do
      repository = create(:empty_project).repository
Valery Sizov's avatar
Valery Sizov включено в состав коммита
519
      results = repository.search_files_by_content('test', 'master')
Valery Sizov's avatar
Valery Sizov включено в состав коммита
520
521
522
523

      expect(results).to match_array([])
    end

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
524
525
526
527
    describe 'result' do
      subject { results.first }

      it { is_expected.to be_an String }
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
528
      it { expect(subject.lines[2]).to eq("master:CHANGELOG:190:  - Feature: Replace teams with group membership\n") }
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
529
530
    end
  end
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
531

Valery Sizov's avatar
Valery Sizov включено в состав коммита
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
  describe "search_files_by_name" do
    let(:results) { repository.search_files_by_name('files', 'master') }

    it 'returns result' do
      expect(results.first).to eq('files/html/500.html')
    end

    it 'properly handles when query is not present' do
      results = repository.search_files_by_name('', 'master')

      expect(results).to match_array([])
    end

    it 'properly handles query when repo is empty' do
      repository = create(:empty_project).repository

      results = repository.search_files_by_name('test', 'master')

      expect(results).to match_array([])
    end
  end

Z.J. van de Weg's avatar
Z.J. van de Weg включено в состав коммита
554
555
556
557
558
559
560
561
562
563
  describe '#create_ref' do
    it 'redirects the call to fetch_ref' do
      ref, ref_path = '1', '2'

      expect(repository).to receive(:fetch_ref).with(repository.path_to_repo, ref, ref_path)

      repository.create_ref(ref, ref_path)
    end
  end

Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
564
  describe "#changelog", caching: true do
Connor Shea's avatar
Connor Shea включено в состав коммита
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
    it 'accepts changelog' do
      expect(repository.tree).to receive(:blobs).and_return([TestBlob.new('changelog')])

      expect(repository.changelog.name).to eq('changelog')
    end

    it 'accepts news instead of changelog' do
      expect(repository.tree).to receive(:blobs).and_return([TestBlob.new('news')])

      expect(repository.changelog.name).to eq('news')
    end

    it 'accepts history instead of changelog' do
      expect(repository.tree).to receive(:blobs).and_return([TestBlob.new('history')])

      expect(repository.changelog.name).to eq('history')
    end

    it 'accepts changes instead of changelog' do
      expect(repository.tree).to receive(:blobs).and_return([TestBlob.new('changes')])

      expect(repository.changelog.name).to eq('changes')
    end

    it 'is case-insensitive' do
      expect(repository.tree).to receive(:blobs).and_return([TestBlob.new('CHANGELOG')])

      expect(repository.changelog.name).to eq('CHANGELOG')
    end
  end

Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
596
  describe "#license_blob", caching: true do
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
597
    before do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
598
      repository.delete_file(
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
599
        user, 'LICENSE', message: 'Remove LICENSE', branch_name: 'master')
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
600
601
    end

Stan Hu's avatar
Stan Hu включено в состав коммита
602
    it 'handles when HEAD points to non-existent ref' do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
603
      repository.create_file(
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
604
        user, 'LICENSE', 'Copyright!',
Douwe Maan's avatar
Douwe Maan включено в состав коммита
605
        message: 'Add LICENSE', branch_name: 'master')
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
606

Douwe Maan's avatar
Douwe Maan включено в состав коммита
607
608
      allow(repository).to receive(:file_on_head).
        and_raise(Rugged::ReferenceError)
Stan Hu's avatar
Stan Hu включено в состав коммита
609
610
611
612

      expect(repository.license_blob).to be_nil
    end

Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
613
    it 'looks in the root_ref only' do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
614
      repository.delete_file(user, 'LICENSE',
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
615
        message: 'Remove LICENSE', branch_name: 'markdown')
Douwe Maan's avatar
Douwe Maan включено в состав коммита
616
      repository.create_file(user, 'LICENSE',
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
617
        Licensee::License.new('mit').content,
Douwe Maan's avatar
Douwe Maan включено в состав коммита
618
        message: 'Add LICENSE', branch_name: 'markdown')
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
619
620
621
622

      expect(repository.license_blob).to be_nil
    end

Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
623
    it 'detects license file with no recognizable open-source license content' do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
624
625
      repository.create_file(user, 'LICENSE', 'Copyright!',
        message: 'Add LICENSE', branch_name: 'master')
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
626
627
628
629

      expect(repository.license_blob.name).to eq('LICENSE')
    end

Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
630
631
    %w[LICENSE LICENCE LiCensE LICENSE.md LICENSE.foo COPYING COPYING.md].each do |filename|
      it "detects '#{filename}'" do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
632
        repository.create_file(user, filename,
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
633
          Licensee::License.new('mit').content,
Douwe Maan's avatar
Douwe Maan включено в состав коммита
634
          message: "Add #{filename}", branch_name: 'master')
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
635

Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
636
637
        expect(repository.license_blob.name).to eq(filename)
      end
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
638
639
640
    end
  end

Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
641
  describe '#license_key', caching: true do
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
642
    before do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
643
      repository.delete_file(user, 'LICENSE',
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
644
        message: 'Remove LICENSE', branch_name: 'master')
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
645
    end
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
646

Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
647
    it 'returns nil when no license is detected' do
Stan Hu's avatar
Stan Hu включено в состав коммита
648
649
650
      expect(repository.license_key).to be_nil
    end

Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
651
652
653
    it 'returns nil when the repository does not exist' do
      expect(repository).to receive(:exists?).and_return(false)

Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
654
655
656
657
      expect(repository.license_key).to be_nil
    end

    it 'detects license file with no recognizable open-source license content' do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
658
659
      repository.create_file(user, 'LICENSE', 'Copyright!',
        message: 'Add LICENSE', branch_name: 'master')
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
660
661

      expect(repository.license_key).to be_nil
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
662
    end
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
663

Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
664
    it 'returns the license key' do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
665
      repository.create_file(user, 'LICENSE',
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
666
        Licensee::License.new('mit').content,
Douwe Maan's avatar
Douwe Maan включено в состав коммита
667
        message: 'Add LICENSE', branch_name: 'master')
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
668

Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
669
      expect(repository.license_key).to eq('mit')
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
670
    end
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
671
  end
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
672

Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
673
  describe "#gitlab_ci_yml", caching: true do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
674
675
676
677
678
679
680
681
682
683
684
685
686
    it 'returns valid file' do
      files = [TestBlob.new('file'), TestBlob.new('.gitlab-ci.yml'), TestBlob.new('copying')]
      expect(repository.tree).to receive(:blobs).and_return(files)

      expect(repository.gitlab_ci_yml.name).to eq('.gitlab-ci.yml')
    end

    it 'returns nil if not exists' do
      expect(repository.tree).to receive(:blobs).and_return([])
      expect(repository.gitlab_ci_yml).to be_nil
    end

    it 'returns nil for empty repository' do
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
687
      allow(repository).to receive(:file_on_head).and_raise(Rugged::ReferenceError)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets включено в состав коммита
688
689
690
691
      expect(repository.gitlab_ci_yml).to be_nil
    end
  end

Robert Speicher's avatar
Robert Speicher включено в состав коммита
692
  describe '#add_branch' do
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
693
    context 'when pre hooks were successful' do
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
694
      it 'runs without errors' do
Valery Sizov's avatar
Valery Sizov включено в состав коммита
695
        hook = double(trigger: [true, nil])
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
696
        expect(Gitlab::Git::Hook).to receive(:new).exactly(3).times.and_return(hook)
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
697
698
699
700

        expect { repository.add_branch(user, 'new_feature', 'master') }.not_to raise_error
      end

tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
701
      it 'creates the branch' do
Valery Sizov's avatar
Valery Sizov включено в состав коммита
702
        allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([true, nil])
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
703
704
705
706
707

        branch = repository.add_branch(user, 'new_feature', 'master')

        expect(branch.name).to eq('new_feature')
      end
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
708
709
710
711
712
713

      it 'calls the after_create_branch hook' do
        expect(repository).to receive(:after_create_branch)

        repository.add_branch(user, 'new_feature', 'master')
      end
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
714
715
716
    end

    context 'when pre hooks failed' do
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
717
      it 'gets an error' do
Valery Sizov's avatar
Valery Sizov включено в состав коммита
718
        allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([false, ''])
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
719
720
721
722
723
724

        expect do
          repository.add_branch(user, 'new_feature', 'master')
        end.to raise_error(GitHooksService::PreReceiveError)
      end

tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
725
      it 'does not create the branch' do
Valery Sizov's avatar
Valery Sizov включено в состав коммита
726
        allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([false, ''])
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
727
728
729
730
731
732
733
734
735

        expect do
          repository.add_branch(user, 'new_feature', 'master')
        end.to raise_error(GitHooksService::PreReceiveError)
        expect(repository.find_branch('new_feature')).to be_nil
      end
    end
  end

Stan Hu's avatar
Stan Hu включено в состав коммита
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
  describe '#find_branch' do
    it 'loads a branch with a fresh repo' do
      expect(Gitlab::Git::Repository).to receive(:new).twice.and_call_original

      2.times do
        expect(repository.find_branch('feature')).not_to be_nil
      end
    end

    it 'loads a branch with a cached repo' do
      expect(Gitlab::Git::Repository).to receive(:new).once.and_call_original

      2.times do
        expect(repository.find_branch('feature', fresh_repo: false)).not_to be_nil
      end
    end
  end

Robert Speicher's avatar
Robert Speicher включено в состав коммита
754
  describe '#rm_branch' do
Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
755
756
757
    let(:old_rev) { '0b4bc9a49b562e85de7cc9e834518ea6828729b9' } # git rev-parse feature
    let(:blank_sha) { '0000000000000000000000000000000000000000' }

Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
758
    context 'when pre hooks were successful' do
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
759
      it 'runs without errors' do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
760
761
        expect_any_instance_of(GitHooksService).to receive(:execute).
          with(user, project.repository.path_to_repo, old_rev, blank_sha, 'refs/heads/feature')
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
762
763
764
765

        expect { repository.rm_branch(user, 'feature') }.not_to raise_error
      end

tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
766
      it 'deletes the branch' do
Valery Sizov's avatar
Valery Sizov включено в состав коммита
767
        allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([true, nil])
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
768
769
770
771
772
773
774
775

        expect { repository.rm_branch(user, 'feature') }.not_to raise_error

        expect(repository.find_branch('feature')).to be_nil
      end
    end

    context 'when pre hooks failed' do
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
776
      it 'gets an error' do
Valery Sizov's avatar
Valery Sizov включено в состав коммита
777
        allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([false, ''])
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
778
779

        expect do
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
780
          repository.rm_branch(user, 'feature')
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
781
782
783
        end.to raise_error(GitHooksService::PreReceiveError)
      end

tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
784
      it 'does not delete the branch' do
Valery Sizov's avatar
Valery Sizov включено в состав коммита
785
        allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([false, ''])
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
786
787
788
789
790
791
792
793
794

        expect do
          repository.rm_branch(user, 'feature')
        end.to raise_error(GitHooksService::PreReceiveError)
        expect(repository.find_branch('feature')).not_to be_nil
      end
    end
  end

Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
795
  describe '#update_branch_with_hooks' do
Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
796
    let(:old_rev) { '0b4bc9a49b562e85de7cc9e834518ea6828729b9' } # git rev-parse feature
Jacob Vosmaer's avatar
Jacob Vosmaer включено в состав коммита
797
    let(:new_rev) { 'a74ae73c1ccde9b974a70e82b901588071dc142a' } # commit whose parent is old_rev
Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
798

Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
799
    context 'when pre hooks were successful' do
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
800
      before do
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
801
802
        service = GitHooksService.new
        expect(GitHooksService).to receive(:new).and_return(service)
Douwe Maan's avatar
Douwe Maan включено в состав коммита
803
804
        expect(service).to receive(:execute).
          with(
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
805
806
807
            user,
            repository.path_to_repo,
            old_rev,
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
808
            new_rev,
Douwe Maan's avatar
Douwe Maan включено в состав коммита
809
810
            'refs/heads/feature').
          and_yield(service).and_return(true)
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
811
      end
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
812

tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
813
      it 'runs without errors' do
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
814
        expect do
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
815
816
817
          GitOperationService.new(user, repository).with_branch('feature') do
            new_rev
          end
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
818
819
        end.not_to raise_error
      end
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
820

tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
821
      it 'ensures the autocrlf Git option is set to :input' do
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
822
823
824
        service = GitOperationService.new(user, repository)

        expect(service).to receive(:update_autocrlf_option)
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
825

Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
826
        service.with_branch('feature') { new_rev }
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
827
      end
Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
828
829
830

      context "when the branch wasn't empty" do
        it 'updates the head' do
Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
831
          expect(repository.find_branch('feature').dereferenced_target.id).to eq(old_rev)
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
832
833
834
835
836

          GitOperationService.new(user, repository).with_branch('feature') do
            new_rev
          end

Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
837
          expect(repository.find_branch('feature').dereferenced_target.id).to eq(new_rev)
Alejandro Rodríguez's avatar
Alejandro Rodríguez включено в состав коммита
838
839
        end
      end
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
840
841
    end

Jacob Vosmaer's avatar
Jacob Vosmaer включено в состав коммита
842
    context 'when the update adds more than one commit' do
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
843
      let(:old_rev) { '33f3729a45c02fc67d00adb1b8bca394b0e761d9' }
Jacob Vosmaer's avatar
Jacob Vosmaer включено в состав коммита
844

Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
845
      it 'runs without errors' do
Jacob Vosmaer's avatar
Jacob Vosmaer включено в состав коммита
846
847
848
849
850
851
        # old_rev is an ancestor of new_rev
        expect(repository.rugged.merge_base(old_rev, new_rev)).to eq(old_rev)

        # old_rev is not a direct ancestor (parent) of new_rev
        expect(repository.rugged.lookup(new_rev).parent_ids).not_to include(old_rev)

Jacob Vosmaer's avatar
Jacob Vosmaer включено в состав коммита
852
853
854
        branch = 'feature-ff-target'
        repository.add_branch(user, branch, old_rev)

Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
855
856
857
858
859
        expect do
          GitOperationService.new(user, repository).with_branch(branch) do
            new_rev
          end
        end.not_to raise_error
Jacob Vosmaer's avatar
Jacob Vosmaer включено в состав коммита
860
861
862
863
      end
    end

    context 'when the update would remove commits from the target branch' do
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
864
865
      let(:branch) { 'master' }
      let(:old_rev) { repository.find_branch(branch).dereferenced_target.sha }
Jacob Vosmaer's avatar
Jacob Vosmaer включено в состав коммита
866

Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
867
      it 'raises an exception' do
Jacob Vosmaer's avatar
Jacob Vosmaer включено в состав коммита
868
869
870
871
872
873
        # The 'master' branch is NOT an ancestor of new_rev.
        expect(repository.rugged.merge_base(old_rev, new_rev)).not_to eq(old_rev)

        # Updating 'master' to new_rev would lose the commits on 'master' that
        # are not contained in new_rev. This should not be allowed.
        expect do
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
874
875
876
          GitOperationService.new(user, repository).with_branch(branch) do
            new_rev
          end
Jacob Vosmaer's avatar
Jacob Vosmaer включено в состав коммита
877
        end.to raise_error(Repository::CommitError)
Jacob Vosmaer's avatar
Jacob Vosmaer включено в состав коммита
878
879
880
      end
    end

Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
881
    context 'when pre hooks failed' do
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
882
      it 'gets an error' do
Valery Sizov's avatar
Valery Sizov включено в состав коммита
883
        allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([false, ''])
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
884
885

        expect do
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
886
887
888
          GitOperationService.new(user, repository).with_branch('feature') do
            new_rev
          end
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
889
890
891
        end.to raise_error(GitHooksService::PreReceiveError)
      end
    end
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
892
893
894
895
896
897
898
899
900
901
902
903

    context 'when target branch is different from source branch' do
      before do
        allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([true, ''])
      end

      it 'expires branch cache' do
        expect(repository).not_to receive(:expire_exists_cache)
        expect(repository).not_to receive(:expire_root_ref_cache)
        expect(repository).not_to receive(:expire_emptiness_caches)
        expect(repository).to     receive(:expire_branches_cache)

Douwe Maan's avatar
Douwe Maan включено в состав коммита
904
905
        GitOperationService.new(user, repository).
          with_branch('new-feature') do
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
906
907
            new_rev
          end
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
      end
    end

    context 'when repository is empty' do
      before do
        allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([true, ''])
      end

      it 'expires creation and branch cache' do
        empty_repository = create(:empty_project, :empty_repo).repository

        expect(empty_repository).to receive(:expire_exists_cache)
        expect(empty_repository).to receive(:expire_root_ref_cache)
        expect(empty_repository).to receive(:expire_emptiness_caches)
        expect(empty_repository).to receive(:expire_branches_cache)

Douwe Maan's avatar
Douwe Maan включено в состав коммита
924
        empty_repository.create_file(user, 'CHANGELOG', 'Changelog!',
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
925
                                     message: 'Updates file content',
Douwe Maan's avatar
Douwe Maan включено в состав коммита
926
                                     branch_name: 'master')
tiagonbotelho's avatar
tiagonbotelho включено в состав коммита
927
928
      end
    end
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
929
  end
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
930

Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
931
932
933
934
935
936
  describe '#exists?' do
    it 'returns true when a repository exists' do
      expect(repository.exists?).to eq(true)
    end

    it 'returns false when a repository does not exist' do
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
937
      allow(repository).to receive(:refs_directory_exists?).and_return(false)
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
938
939
940

      expect(repository.exists?).to eq(false)
    end
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
941
942
943
944
945
946

    it 'returns false when there is no namespace' do
      allow(repository).to receive(:path_with_namespace).and_return(nil)

      expect(repository.exists?).to eq(false)
    end
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
947
948
  end

Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
949
950
951
952
953
  describe '#has_visible_content?' do
    subject { repository.has_visible_content? }

    describe 'when there are no branches' do
      before do
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
954
        allow(repository).to receive(:branch_count).and_return(0)
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
955
956
957
958
959
960
      end

      it { is_expected.to eq(false) }
    end

    describe 'when there are branches' do
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
961
      it 'returns true' do
Rubén Dávila's avatar
Rubén Dávila включено в состав коммита
962
        expect(repository).to receive(:branch_count).and_return(3)
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
963
964
965
966
967
968

        expect(subject).to eq(true)
      end
    end
  end

Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
969
970
971
972
973
974
975
  describe '#update_autocrlf_option' do
    describe 'when autocrlf is not already set to :input' do
      before do
        repository.raw_repository.autocrlf = true
      end

      it 'sets autocrlf to :input' do
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
976
        GitOperationService.new(nil, repository).send(:update_autocrlf_option)
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
977
978
979
980
981
982
983
984
985
986
987

        expect(repository.raw_repository.autocrlf).to eq(:input)
      end
    end

    describe 'when autocrlf is already set to :input' do
      before do
        repository.raw_repository.autocrlf = :input
      end

      it 'does nothing' do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
988
989
        expect(repository.raw_repository).not_to receive(:autocrlf=).
          with(:input)
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
990

Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
991
        GitOperationService.new(nil, repository).send(:update_autocrlf_option)
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
992
993
994
995
      end
    end
  end

Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
996
997
998
999
1000
  describe '#empty?' do
    let(:empty_repository) { create(:project_empty_repo).repository }

    it 'returns true for an empty repository' do
      expect(empty_repository.empty?).to eq(true)
Для ускорения просмотра не вся история отображается Просмотреть всю вину