From 5b0ebbe5b4c18c136aad2a53898c1a6441d39a9d Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Mon, 19 Dec 2016 20:44:57 +0200 Subject: [PATCH] Add Wiki import to BB importer --- doc/integration/bitbucket.md | 3 +- .../img/bitbucket_oauth_settings_page.png | Bin 5607 -> 28719 bytes .../import_projects_from_bitbucket.md | 1 + lib/bitbucket/representation/repo.rb | 4 ++ lib/gitlab/bitbucket_import/importer.rb | 13 +++++ .../bitbucket_import/project_creator.rb | 9 +++- .../lib/bitbucket/representation/repo_spec.rb | 49 ++++++++++++++++++ .../gitlab/bitbucket_import/importer_spec.rb | 12 +++-- .../bitbucket_import/project_creator_spec.rb | 3 +- 9 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 spec/lib/bitbucket/representation/repo_spec.rb diff --git a/doc/integration/bitbucket.md b/doc/integration/bitbucket.md index 5df6e103f42..1dfc985eaea 100644 --- a/doc/integration/bitbucket.md +++ b/doc/integration/bitbucket.md @@ -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) diff --git a/doc/integration/img/bitbucket_oauth_settings_page.png b/doc/integration/img/bitbucket_oauth_settings_page.png index 21ce82a6074e2a5b1d52331a5567634a8c5c7914..3e6dea6cfe9abfe51777318f07f916e6d2806996 100644 GIT binary patch literal 28719 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 literal 5607 zcmaJ_XH-+m7N!`*L=+Tbqlyg)3aAK3?^Tgbf)uIJq=pVk(V!r`h9bQN5J>2~8cL|4 z_aY?(LhpHaz4!ikZ@shjS!d6jZ%_O7-ZN_gR9?!`0&fB-C@5&<<)l<8C@2A^ZyOEu zX^pMOrJocO)D$X8>e6H~d1GT^X=#Z>BCW0xwzs#}*49Ep18r?>351o+%}pYaNFuE- zEG!%!5;`{bpFDYj#kM86!%vQP;T}mCOv&EKiM@k691gd$vkPrr+FPsgb+n(^J&KQy zSs#lzIzA?oPfp0>?c)tiriO;~{npkNdwYjd zsGWl|`Q-TIcx&V6gm8FF=#I#U`4(LN3-03i{eyGg)*%A!aJ)b7>R0>pxxlyB?99wG z?B>230<*kxgvIrgv5fqB<9n$4MbBjzhzPT0+kw zFkNx(PQ%-Woxz^f)s={>@$kqfN0*S9;xD_a=vm@cY>*Fr`!H^Btvoq6s2pG4&>$iI zk~lZey0IS}hm1}`_f==e2tFrmAD$eoZ>>yvfB0DNqbRz1Fg`wdXJt@b=gq+uE+yj2 zMD}MKuIu>=NnHcOFL~`1y^EXEvHKgpzEzERIN9Tgd-z|Q#DTJ{x%7x2#6Ush$P{vJ zxM#UFa-p-*!TDQlelphIZEk)J;bxAh#rk~uytmdi-&5e|5*+L69EM%?46W%JZLVG4 zv+i0UcGnk&dG!rf;Cmt>gR<90>-+lpB&DRc7cBexsuo!R5Y>WGs!r1zGe$hAHazfc(+^YiIMU~8rUQ2o- zKXk6_1~*ko8)mep_@yju&)1ldwx;42w+Sl?R@w^Lb>oPcjivytjT!$ibXT68qPCfn zv8aHly~2maU+>dL`=;CbldLVuXTy_n2z@qnGu@GfGB2I0R{P(>hlwe!u-S^BU_)P8 z3X01q@>1gJE+d45^STU!Os!-HCn2jlpsk2=*HERf(Eb5)Av2Af(8GK>soQZ|?P|}CBcpxc zUm;0ww}QveJrS`5t)uxft6tGb3G_`=Rdt(+_0OhriVbb3#&@Tk?(1NfEv$w#ync`r za=Uk1nFN=t7MW6&XiTYm<+HU&CS=x}ngI0_&;H1btc zIYz!exu&BFFPuF_)G~O4lFvlYR_v}-IdrfkdVdyPJ3D*;9jI&VLU5{dZDxM2A{9k4 zj=FLRH@upn!I5v>c0J)2p3tokpl?|Ia%GMdQyNMJsrV9ZoL|4{8rNIbD$~li$G-M7 zR*8k=`LoBPv&DNRGnD-J%~2wAfhCW3`bLlyuc_QE$H%TvaNVI0OK0Nr9+$V?KwW8m z#9YbAxyQBzF2_dg%||T8p!Hsj4ckq)3SZjBxn!iE&Bu$Hw*y8^+ z=;){7px7{-{$qaRdjf?@Fi4e}<&OA~Lpbj3E4wKe?>{X6;o8HeEN;X$b|j9UT%r=* z0>IjCPuI9Ha&q+vPVSvMc&mw0kT8(*Oelcv8Q4hu%EincF2ntD?=a>S$nCs7pIj-c zp%K1ahB7g__cK=+W-XbqAele^g2ETb*0)hQ)r+;{p0GjU@l;xO6xTIC1>oMvDd>ht zU->v{!@_+gA}Y1WpSwLaZ*OvrQmT9jBz?bkLGiMnlZ+pFi(mzKe1StZ%9bUw0 zL}s=_^CraKF;3Rz2ZZo8q5zxhcUKxE-N3KUU%lIVq6d~?aVDqbvbMKF#=;qB*GcvW z&#xY#(;=D#p&I2T5pSoF6pzbFRaBHJ#9ZW7-EOlf*T`%^+h4~CIiGtRHWg!3I&5W< ztqC8aSk}1Dbtd6n0&987HwA7^aFbrhI|0mEJ$>yhU1&MO)cxG{PeQSao@P=DTNWEk zhgJs?@QaK?Z27mBEW}kcA06ZJ%_k+kFNKB~D@ez26b7BnQpj>~3wyK|Y$o24g2pFQ z+gEk@u-_fPx=AtLxP;*G1blD!aE}-}M^ra+3EYklYpMqwL zzss%K__7Y)J>nb-(jjSg8*o5QP4)F$y0>(hLyy~9GV#vwbZ2iPyWSE?+eN@L5jhA_ zrw*sfV!3v?0kT3t#8J9@&^5eB7%j8g^_*}CDwFopQXX4+d#`@{MzZ$M+sRN0+>IWe zJz#|_EzAMEsw3wbxFf<2?XE#88{&qNZ0mB!~(9QShG)j9i`ygl2rpXpE8Oo_cldH3^ipM;W1DUo+`@cCY*zrpQf z9+C`L36V^c>Z+rpcMvE~7si0pgo0 z2)~~{m!0wOo#X_4ZJLU9B4M!V2W$C9x$D^;GZ@YX56sDOuCpl5M_Z%=TUHxYhRPcqSko6)IkybTH~A9PfC-ilvdx`exdqiUt6?fR+i zgQY@Y?*t(}X-`wP8LIO5c+v^CnS;M5`T63s6@dKV*>XP$qh==pwSjcVhlG$X^c?SR zbW3z>-YXs+Ym7Gq@*@5>S;rOn*(9(}rIVJI(;AqN z39hhQ*8)-A6oPSY4l8pwC4MX^NHNOsXgRfJ)$v=kZOS#@lsQEc8a zwED8e_hO@1Pzq_Y66*RP*ehp?>)wUPwwm;@@;)=vVY$9_-A@M$OlAMU8hQVyQ9{9@ zfx6E?g&BgBhA>8RwauS5(lOYkIiJoPYN_u`zBzQ+kjYD-Ek+KkO1lq?8(^1G-=@jR znee1E==m%^d=sSV+Mq4BP4g*-nUeG2QuBtde$d(GhV|vj^bNls>*~QDmx^(A*_3ZO=)mpA zDzh0|@4~D7`4a%aWBcWhi#!1-irMdMQqNV4E(cf-97=GtYG!KHJP>VB=qOBn>e+GU z?R3)I56gz2jBl%)>76CuD#J%0^!HcU+3!>Ddx&b34qO?{+4YBZ<++(lBp+SpkYF{6Nb44dQ|h?j!V4O zt1J==z$2#;}kDx<<);s>a))s6U!nXwzPe{xC={G?uV>-5?f3-S%BUv#U zZ6WlmXyWl6hH_5RFek9piZ?fU~br{c9qKjbE;Rm&jRq+p>`MYO0e$yON1z$}lng?hRr z?*}Hu@xE{n^!vh)vWCalGClP6A?gjbcDSyfAGq0AgVeH4_#*X7^}favQE1QN34I%` z(;Ep2vGG^RwwC8@P?yG_fH7zS)fm(V*3MCfx?6^h|L?*Ib*U!hZvp={-mVjp_~`0) z!sqXL#*n$5!+=?wwu@ataccaQ@=!%9LPVkVoqTfQ*Q<>TkZ~ia+A8v5@d5**hqQJ@ zYu4`9Sx!raMY`}MmRgTri)*;YkOZ{?#LumyZ2xrq1o`@2VHy1-6>n;$6j4w3cW2k7 z^yI@#4dC&}Se)HGK>Pcdck?`P%rBT1>5i8SH7MjA-?hA&He2&AT6O~#FuKJrp7@J> zUepTfg*~RL?&M%(I~Yq~=-5P%cI|zAeKRj!LR_4N1EXA<<~HJ-O@*{i#2jf#)wpr& zElDCm-*Jc=J#1qy>v@A!2F0D6+7gVI8de#&ga2AIVeViR1LovfWkY817+G6jj4a&| z&2Q|YVrHwJ*DOW=@Js0Ys8Gt9CNF8=K5p!3##H=$L!@lhn+J)E6`R)06L$5VY>BRy zF{igF*IFHI%Bq}o3)$k`6a7}7le~ai)AJkuK%7)#Ds(4aJQ||w5`NXNAiKv=l{m_^ z#-uet*Cp_$;s|pf<+@g8Aj!WgbRNkvU9ARpUyG=`>fQ>t)lmLRe&`4xg8n(LU;3`< zpMIJ|PbW$OUH?6wKTkI|&ztsMq*qqt?Cdfc(u_igSZeGzm@h5VD%bOw=0n?6N6Ib_ zFxcD;za-MR8mDHycL5U=t7ZWJkvXh7f@Piogqd~9xf4!e7R#?(BVU{Kc~lj=9%j`Y=G*4#Ex&xPT`gQpw^2Qk(I5gOibxkc9p5A zk_qRFX=`quIM=JDua7)0A0J`Z(sbv20UlH)f*&!eB^YNAfAoLsD!;Xh0sicje(bj& zifw=GSJA3IjLW`8W>o`-$Bn`oy8CZdA4)0%{~a+B>W&=}j=~yWzI)a8 zngkm?w3$AE$Rq!;Mt?}qZ8y{wSWnO{w^^2&|GgN*z=UV;;3YIf??UnB!{1>&DU2uF z8uBB_iUO*mOg1elwA<8CCIMc%+MvmnV>Dzuz{9Kv&ZSsV*$R#E$uk+AIFB+J)*3g$ zqalYm?ic<9{PJJntLcsOfhpQr3INK`XG){g#CESIy9fTSPsh1&BcNk2#~;uC+f`6h zmO2bPc9ypmD*N1B)s@CZ$o&2>WoYH}x}7}lLUT+q!^||EFPv($*rV_rW`Luq5oLW3 zfHB)Q=(EaILwtsfDgmu<8}%8(nwfN$N-^cR?4!j8|NiVRpZfonU!*L1tQtAW7VsAL zaxO-Bb7f8?!YZR*brZ|c?i4mCDjU?vg^y^+@9}0)FVF+a&20s4*^wwl! diff --git a/doc/workflow/importing/import_projects_from_bitbucket.md b/doc/workflow/importing/import_projects_from_bitbucket.md index b6d47e5afa2..97380bce172 100644 --- a/doc/workflow/importing/import_projects_from_bitbucket.md +++ b/doc/workflow/importing/import_projects_from_bitbucket.md @@ -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. diff --git a/lib/bitbucket/representation/repo.rb b/lib/bitbucket/representation/repo.rb index 8969ecd1c19..423eff8f2a5 100644 --- a/lib/bitbucket/representation/repo.rb +++ b/lib/bitbucket/representation/repo.rb @@ -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 diff --git a/lib/gitlab/bitbucket_import/importer.rb b/lib/gitlab/bitbucket_import/importer.rb index 7d2f92d577a..44323b47dca 100644 --- a/lib/gitlab/bitbucket_import/importer.rb +++ b/lib/gitlab/bitbucket_import/importer.rb @@ -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? diff --git a/lib/gitlab/bitbucket_import/project_creator.rb b/lib/gitlab/bitbucket_import/project_creator.rb index eb03882ab26..d94f70fd1fb 100644 --- a/lib/gitlab/bitbucket_import/project_creator.rb +++ b/lib/gitlab/bitbucket_import/project_creator.rb @@ -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 diff --git a/spec/lib/bitbucket/representation/repo_spec.rb b/spec/lib/bitbucket/representation/repo_spec.rb new file mode 100644 index 00000000000..adcd978e1b3 --- /dev/null +++ b/spec/lib/bitbucket/representation/repo_spec.rb @@ -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 diff --git a/spec/lib/gitlab/bitbucket_import/importer_spec.rb b/spec/lib/gitlab/bitbucket_import/importer_spec.rb index 53f3c73ade4..72b1ba36b58 100644 --- a/spec/lib/gitlab/bitbucket_import/importer_spec.rb +++ b/spec/lib/gitlab/bitbucket_import/importer_spec.rb @@ -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 diff --git a/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb b/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb index b6d052a4612..773d0d4d288 100644 --- a/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb +++ b/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb @@ -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) }