Add Wiki import to BB importer

This commit is contained in:
Valery Sizov 2016-12-19 20:44:57 +02:00
parent 2c49c1af66
commit 5b0ebbe5b4
9 changed files with 88 additions and 6 deletions

View file

@ -5,7 +5,7 @@ Bitbucket.org account.
## Overview
You can set up Bitbucket.org as an OAuth provider so that you can use your
You can set up Bitbucket.org as an OAuth2 provider so that you can use your
credentials to authenticate into GitLab or import your projects from
Bitbucket.org.
@ -50,6 +50,7 @@ you to use.
Repositories: Read
Pull Requests: Read
Issues: Read
Wiki: Read and Write
```
![Bitbucket OAuth settings page](img/bitbucket_oauth_settings_page.png)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View file

@ -17,6 +17,7 @@ to enable this if not already.
- the pull requests (GitLab 8.4+)
- the pull request comments (GitLab 8.15+)
- the milestones (GitLab 8.15+)
- the wiki (GitLab 8.15+)
- References to pull requests and issues are preserved (GitLab 8.7+)
- Repository public access is retained. If a repository is private in Bitbucket
it will be created as private in GitLab as well.

View file

@ -51,6 +51,10 @@ module Bitbucket
raw['scm'] == 'git'
end
def has_wiki?
raw['has_wiki']
end
def visibility_level
if raw['is_private']
Gitlab::VisibilityLevel::PRIVATE

View file

@ -1,6 +1,8 @@
module Gitlab
module BitbucketImport
class Importer
include Gitlab::ShellAdapter
LABELS = [{ title: 'bug', color: '#FF0000' },
{ title: 'enhancement', color: '#428BCA' },
{ title: 'proposal', color: '#69D100' },
@ -18,6 +20,7 @@ module Gitlab
end
def execute
import_wiki
import_issues
import_pull_requests
handle_errors
@ -55,6 +58,16 @@ module Gitlab
@repo ||= client.repo(project.import_source)
end
def import_wiki
return if project.wiki.repository_exists?
path_with_namespace = "#{project.path_with_namespace}.wiki"
import_url = project.import_url.sub(/\.git\z/, ".git/wiki")
gitlab_shell.import_repository(project.repository_storage_path, path_with_namespace, import_url)
rescue StandardError => e
errors << { type: :wiki, errors: e.message }
end
def import_issues
return unless repo.issues_enabled?

View file

@ -22,9 +22,16 @@ module Gitlab
import_type: 'bitbucket',
import_source: repo.full_name,
import_url: repo.clone_url(session_data[:token]),
import_data: { credentials: session_data }
import_data: { credentials: session_data },
skip_wiki: skip_wiki
).execute
end
private
def skip_wiki
repo.has_wiki?
end
end
end
end

View file

@ -0,0 +1,49 @@
require 'spec_helper'
describe Bitbucket::Representation::Repo do
describe '#has_wiki?' do
it { expect(described_class.new({ 'has_wiki' => false }).has_wiki?).to be_falsey }
it { expect(described_class.new({ 'has_wiki' => true }).has_wiki?).to be_truthy }
end
describe '#name' do
it { expect(described_class.new({ 'name' => 'test' }).name).to eq('test') }
end
describe '#valid?' do
it { expect(described_class.new({ 'scm' => 'hg' }).valid?).to be_falsey }
it { expect(described_class.new({ 'scm' => 'git' }).valid?).to be_truthy }
end
describe '#full_name' do
it { expect(described_class.new({ 'full_name' => 'test_full' }).full_name).to eq('test_full') }
end
describe '#description' do
it { expect(described_class.new({ 'description' => 'desc' }).description).to eq('desc') }
end
describe '#issues_enabled?' do
it { expect(described_class.new({ 'has_issues' => false }).issues_enabled?).to be_falsey }
it { expect(described_class.new({ 'has_issues' => true }).issues_enabled?).to be_truthy }
end
describe '#owner_and_slug' do
it { expect(described_class.new({ 'full_name' => 'ben/test' }).owner_and_slug).to eq(['ben', 'test']) }
end
describe '#owner' do
it { expect(described_class.new({ 'full_name' => 'ben/test' }).owner).to eq('ben') }
end
describe '#slug' do
it { expect(described_class.new({ 'full_name' => 'ben/test' }).slug).to eq('test') }
end
describe '#clone_url' do
it 'builds url' do
data = { 'links' => { 'clone' => [ { 'name' => 'https', 'href' => 'https://bibucket.org/test/test.git' }] } }
expect(described_class.new(data).clone_url('abc')).to eq('https://x-token-auth:abc@bibucket.org/test/test.git')
end
end
end

View file

@ -69,6 +69,9 @@ describe Gitlab::BitbucketImport::Importer, lib: true do
context 'issues statuses' do
before do
# HACK: Bitbucket::Representation.const_get('Issue') seems to return ::Issue without this
Bitbucket::Representation::Issue.new({})
stub_request(
:get,
"https://api.bitbucket.org/2.0/repositories/#{project_identifier}"
@ -108,13 +111,16 @@ describe Gitlab::BitbucketImport::Importer, lib: true do
body: {}.to_json)
end
it 'map statuses to open or closed' do
# HACK: Bitbucket::Representation.const_get('Issue') seems to return ::Issue without this
Bitbucket::Representation::Issue.new({})
it 'maps statuses to open or closed' do
importer.execute
expect(project.issues.where(state: "closed").size).to eq(5)
expect(project.issues.where(state: "opened").size).to eq(2)
end
it 'calls import_wiki' do
expect(importer).to receive(:import_wiki)
importer.execute
end
end
end

View file

@ -11,7 +11,8 @@ describe Gitlab::BitbucketImport::ProjectCreator, lib: true do
owner: "asd",
full_name: 'Vim repo',
visibility_level: Gitlab::VisibilityLevel::PRIVATE,
clone_url: 'ssh://git@bitbucket.org/asd/vim.git')
clone_url: 'ssh://git@bitbucket.org/asd/vim.git',
has_wiki?: false)
end
let(:namespace){ create(:group, owner: user) }