From bd511194607b33cf504de11f0a70c71cd6898192 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Sun, 26 Sep 2010 19:07:46 +0000 Subject: [PATCH] Support spaces in the files or directories in the git adapter. #6054 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Contributed by Felix Schäfer git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4188 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- lib/redmine/scm/adapters/git_adapter.rb | 4 ++-- .../repositories/git_repository.tar.gz | Bin 19452 -> 20118 bytes .../repositories_git_controller_test.rb | 3 ++- .../redmine/scm/adapters/git_adapter_test.rb | 22 ++++++++++++++---- test/unit/repository_git_test.rb | 8 +++---- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/lib/redmine/scm/adapters/git_adapter.rb b/lib/redmine/scm/adapters/git_adapter.rb index 9a79bbb0..f455a57f 100644 --- a/lib/redmine/scm/adapters/git_adapter.rb +++ b/lib/redmine/scm/adapters/git_adapter.rb @@ -88,7 +88,7 @@ module Redmine return nil if path.nil? cmd = "#{GIT_BIN} --git-dir #{target('')} log --date=iso --pretty=fuller --no-merges -n 1 " cmd << " #{shell_quote rev} " if rev - cmd << "-- #{path} " unless path.empty? + cmd << "-- #{shell_quote path} " unless path.empty? shellout(cmd) do |io| begin id = io.gets.split[1] @@ -121,7 +121,7 @@ module Redmine cmd << "#{shell_quote(identifier_from + '..')}" if identifier_from cmd << "#{shell_quote identifier_to}" if identifier_to cmd << " --since=#{shell_quote(options[:since].strftime("%Y-%m-%d %H:%M:%S"))}" if options[:since] - cmd << " -- #{path}" if path && !path.empty? + cmd << " -- #{shell_quote path}" if path && !path.empty? shellout(cmd) do |io| files=[] diff --git a/test/fixtures/repositories/git_repository.tar.gz b/test/fixtures/repositories/git_repository.tar.gz index 8158d583244a12064c1d48d20eb64427d56d3159..8a07a230cc9202a7396d5f4ed6e207087ec63d03 100644 GIT binary patch literal 20118 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 literal 19452 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%0A>0n{OjKsIMt(ySXTBznrqD z?N04hFq4esL1P#PySd8JZkYxiSJYC{X(9__MVx@20L1zMa2vZFz;U6=4dC|^joYjf zQ?ctbYwkB#gUKJNV6vM+@R(!oOFBbN$(^7UW3(j~)bZf^l3$p)`Q_pc)@Tu27drV& z(^u$*@N;4ylC?@{7Xe=mu1p^B;pHLrX4-5w!=~dl}%*i`9u=Bc} zpgiDnZ5$n(q(k17rf#&_=jY$O{Gd+ zUJ6Evw^J-@oa;C=nHSV;UZ=3oC>xK;KouQfN_rbr5p(xiDVyhClUxl`;jZQ@@^Td5 z8u*th%^{O~Dj3u@0(RDgOFGjbq65AQzHhYn4A_+#JfJbO;I{AEj+-<#(Z^1ATv$&p zzYA_$Z{6>Vnex6jCbC!?-W|T&NyDm#f&}>45Nzc*POiD}6!zGN zZtju&YctB$SCnt9>7?N=m!r9-d{_`Pp*;G9^Yj4>Nd5ANVE(lMaI@nTSkTrA2^~)% zV@^p(*KuSsG0M?*cXx5~bC-K+`|R?g;%y6A&E^{?o-?zlkTy`dX+$6Ro#RjY&8juX zQ(4T_ZyI8J)Xmt=+>7 zRexM72__hDT>+S4VC&B`m6G;uLvk^D1a)qnP4kja*+?Dd4FJ{OXsd4B$Y z+0yX3-2N?&KJKs)!)uYfo(#$&UzVsM*=y4>pM(uOCPvyq2JsxcF{?$|eWd7jy#*NM z;aP?SuFK{uO*i{J_3D7@jB@c5`65!E#CCY}%@Jiz-DQbrP{l(W;w= z@Ux4*j}0kHLK+GGtQC%;*=s6I`u8InnphI$o0M0dw!>8;(U42b3d2bW`a=l*M&ih_ z;$WaM&i3(W=~|gP$jNQ={1SM@Mynwk^W|BF9e>UOvpjs3^;(fEJPGMCQIRR8%gqEq#;dSsQFlWASterwWnM)|y`~Sk!gYwDp1wS8e#;H`==8;iG#*uESmhl9 zlWTi8!%;|wS@&VlxfW(c-KK-0iI_HDx4$hVQv?h44*y!fG~N_adN2$WTfaaZu1oTR=ejtV?FOE1x-YrzDvt^eh`F8&!#GenUAmeYrZhFjxdf`-UYePBx=Zp4P0G%dK$|Wk# zoWG|r9H9idjC!WY`DWfKdHk3Oi>kGU01T@SATMB=%pp>}Ut^Gb`1SAefO#VOXO>qV ze#E|o{1GnyvP}xt`C5q0Px_eu(G8(tUPo8v3{}CTqa)X$(JIK_rYY!bMxZzFL!{=V zf#HD9@4u2#E)1c`#-hHC8O=mB{l`HNWZ%Q|D9{HpVv4pfROQv4e+`zzzM&fl`<*;o@KWU7em^So#jr?P zdDhkS^<7f<_Gj}PiFpN8Syq4|W-{-`v#)NfUjgO9_~B+O*%958l*F|dsT!_II3wUf z7FBac9Gd;DRy?pN2I0=7A}15A7Rs6e9(Bst?v;|@dpuq(V!D34+K@43zwRpJUnBpY zp!)VwwuhVS(@KJQ+ZP5+I`tlN)5_6zadn~HdT~f33`|A)%DYpl?;~BMX?y#-KNlmP zjFFqmj+T53&qy`hBA}D8`yQ5(<@F_EX@D0KKYxXy zhDQ&RvMBFknxZI`?6eo~5}+{IYa(@@A?7eHrN~EqBNbPIHQu)^5W-NC)`0R}J3#mv z;)OLGQJZwJ12mj~zHm%6pa?%oUH0<&HDJQghecn&SJe6MfKh0T4|ajO3kxo@>brNU zRfebyva&xvauGdGD7_VrWf?|Y7A0_VA>&U?OrGa`&{Rg#2N*Dyek+yhrcB>Tk}mpu z6wUZ$otC+{Y0l3KjfCuQw@QBR9U{get!Hl(~D7tRWHq1NoahBm&KY z%oc5vY5Rh=tZ>u>bYYXvrr9$`A24xVn8&!%r)0uB@pSQTv5Jv#qV4>@*iW-1tAEAA zo}s60M;~VB|9IBQOPH%p-}`bV)u8jY0uaH*k}~4!js;~dxzU<;*kNU%smUd&0N-%& z*PeKf;yvMClBgPSEGrBvhJMXBk~MuOuw@{s{QazRAef9hP6rXflEY*Th5-g5~WR ze){Io*M`KbAs>^F-(0Z8|3N>`&Xh+R(q&D_46BSsZswPmW@|YAs>WS9`}wIy7>(-g z`h00~j*z$Rk}%9a*c0^{O-7c7+>&6LR~=I7%I^ zP$zYlWj4Bx{TOpUIF6G5#rxaEaTC68T%=e^$RuIoK!M?eG)NKnAj3pLdF^5os)?4G z3e2iO$(Ghz$;{rsFhtr zWnKVNOeC~3sTK}3MNCxYgz{b>rLtu);Q|Rz4q)_=3Zo+s%=9#x5L5z6tg6e(RFTO9 zm8(13yE- zK#Jv*EiVy=#RO0p0^nNA`Nj+X%0Xfpry8;e)V2X&vjkSlj?|I8ihhv2YLr)NhjJ%F zwUR42tzv)GIIpU$s*%cS0~Kb$cal@40Z>tt_e0TPVNx*oW1z?gx?Do10;9@7TPbwC zza%g{B}7#qqUiwvDzB&-Ms@V3gR>d~s|KiEmG!PinbfMD0K>}3bKr>4%rUmA>*2B> zim?`zDJX|W>Cshnx@rt5YN~{&%2-xd>^-Zsm@?VJu?U5wqDPrAOgbNfVnJ0P)kSrn$*dq)-F~dsLJa~-a7UiK(Z6v~oaA1B`7FnxI$_zDC7OXc~ zS+Xgj=-&^^M#h*cjVPr@0az~sT{W%N{y0U2bbG+11XWU{fe(09d0x|`rtT;kpa*O! zpj@jiB+$M~Z30zR0FP0zP>~EAy}yaDYIIUfGWlN3RBo)HK(87tzxXf)+wWAzvX zMiN1hm=u@QP|uZH(-jUCwVYTvZ&mv3mFhc+vNElyf&pSA(om9u1SXS3hJ%zUMA*=1 zkOeeEtnhAYOafp8gvyi!ny5N%_3f7eOO%qMj9S$g1#Fg3lL8imiNuf@A)-(RJZ32& zq+$zTKmk)+b!Ki|XT9H)wGi-tS`-!IHEQ_Q7^-UJz6>15RJEL{+$=99l$a4jihwSt zn!ZHJ9e)xj)e0&&q2>}}AO3#7fiy~N~D1h?f<)Vnn zO@Eb*Q-pz(!4*o!%j8m#f(c@R+E;=}V-$Kx)dMO>qnJ(!FbjajfF_0#LtP=XW6t&Nq{s(42Ep)_R_OlIkhQfn<=E94X_UTIuu-ulU!`f44F)3g1po?CxNWuYCj@*@#xvxR5hDEC@Tt}c zDMk%{MP^|bfl+Jzm7y#Zs{lW(RQm+L&+4F7ngsyZP%U&RY`U7w01T#v4H#Q0drdJp zN|b{O0+u}(>6GM@StAGuHHsjpFA#==LZ4D1-!w=yMk)%Rno`M7piuyV6-Elp4EZyz zDi~VZ;VytQzOp4q;05+XoqmN)@#eADZ zRXtEjLjj3Orb~%11+Y~cPnA8vRDmhLVudmTz@pHk$X=xjfhi}drf$ecsiJxnbhts*mEDgw@r^yft~6kPum239e$(n_GwoUA|>D16Gyq#6$sdSPRwOxqX zNa3W^c!U^O=~66+p!NN(VsC1K4v&Zg`T(eIY7qa>i}6=-Q{k%rIE9K7DU{9!;5wxj z0J5#1DwDff2Z7z9*pBqAd(|6*eBT(AJ8Z3-TUC`Pr+vlZK&29>TNO5Rl;qz_KaBs? z-_|b${bc=@&1QWU|6^+2|EC`M)%9ONm_!I1ok%ez2AV)=3}8Vj&xfGGX~0nUegU|~ z4p3zft#S?622$YTxLSv( z9iU2oL?DqUj8Pc@9Pg-LLSeCd*Yzk-SeW8jWz~9#!uC||W`(M4kE6`U7@)aHEHX?H zV*!SiMBJOQU9D@jMXB9E**|HCA{}L|*3pc5XoPb5{nd7SGqvlXEi|Q|fYidnsY#Fu zA<3snn%n)Fjt zP3>8hSKG#1X-+C4O_j~CHlc!Ul^G$kYR{Z2&2ME;O%_S*fPz#NDk`JOubCM#Wh%BJ z+kd}B*}O7kRrsW;8!AqiK){AlTu|n&I#(9*T{nkQdn9cBq}J~%t(1cTJ+;B2dfH6o zb^^;043Ii-WlsBUVErt2^|UpzgAxC0c|k&RstZ+{C&Usk=9J6cQtL@vWmfpm?nh>hxRWQER6+6IgF(swyyJT%EA04dJT~xrE(taZ4{(8`-C_-TU zo!~4iETEyPHz!nUkFpG4m??onD482UDRv^TvX~GWrqPT z39EdThuWK=bU86fS6eGNP&LFrKbgNs)w-q39YD3lPFZ|qNV(b#g^cM!Os;q@1w@xu zHrc%Tf>0$GtSZ~2$gEfu(o?JlQ3{e_VWsSkIq8HtT_%;Gu#hS{h-(1 z5`W)u<*omu?^W^Azt??gHBL^{?w4E&Os%R(`NtW4B-ror)kj}zmHM|jZJ}(hlQ>2Z zm4Ya(0VZLYYTXK}e%-;GRs$#sdr&b;*Z?e2F;B5VA5vi=rLm|C-H}kGQc=XJsT4I; xi?Vg!8dq)Am{PO@RMCdY^^S(N?lq(#4QWV28q$!4G^C-L^nbsz7GwZu0RR&{C%ymx diff --git a/test/functional/repositories_git_controller_test.rb b/test/functional/repositories_git_controller_test.rb index 317261a1..bea9663c 100644 --- a/test/functional/repositories_git_controller_test.rb +++ b/test/functional/repositories_git_controller_test.rb @@ -50,7 +50,7 @@ class RepositoriesGitControllerTest < ActionController::TestCase assert_response :success assert_template 'show' assert_not_nil assigns(:entries) - assert_equal 7, assigns(:entries).size + assert_equal 8, assigns(:entries).size assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'} assert assigns(:entries).detect {|e| e.name == 'this_is_a_really_long_and_verbose_directory_name' && e.kind == 'dir'} assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'} @@ -58,6 +58,7 @@ class RepositoriesGitControllerTest < ActionController::TestCase assert assigns(:entries).detect {|e| e.name == 'copied_README' && e.kind == 'file'} assert assigns(:entries).detect {|e| e.name == 'new_file.txt' && e.kind == 'file'} assert assigns(:entries).detect {|e| e.name == 'renamed_test.txt' && e.kind == 'file'} + assert assigns(:entries).detect {|e| e.name == 'filemane with spaces.txt' && e.kind == 'file'} end def test_browse_branch diff --git a/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb b/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb index f51d4a31..76dca9ed 100644 --- a/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb +++ b/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb @@ -13,13 +13,17 @@ class GitAdapterTest < ActiveSupport::TestCase end def test_getting_all_revisions - assert_equal 13, @adapter.revisions('',nil,nil,:all => true).length + assert_equal 14, @adapter.revisions('',nil,nil,:all => true).length end def test_getting_certain_revisions assert_equal 1, @adapter.revisions('','899a15d^','899a15d').length end + def test_getting_revisions_with_spaces_in_filename + assert_equal 1, @adapter.revisions("filemane with spaces.txt", nil, nil, :all => true).length + end + def test_annotate annotate = @adapter.annotate('sources/watchers_controller.rb') assert_kind_of Redmine::Scm::Adapters::Annotate, annotate @@ -29,6 +33,12 @@ class GitAdapterTest < ActiveSupport::TestCase assert_equal "jsmith", annotate.revisions[4].author end + def test_annotate_moved_file + annotate = @adapter.annotate('renamed_test.txt') + assert_kind_of Redmine::Scm::Adapters::Annotate, annotate + assert_equal 2, annotate.lines.size + end + def test_last_rev last_rev = @adapter.lastrev("README", "4f26664364207fa8b1af9f8722647ab2d4ac5d43") assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.scmid @@ -37,10 +47,12 @@ class GitAdapterTest < ActiveSupport::TestCase assert_equal "2009-06-24 05:27:38".to_time, last_rev.time end - def test_annotate_moved_file - annotate = @adapter.annotate('renamed_test.txt') - assert_kind_of Redmine::Scm::Adapters::Annotate, annotate - assert_equal 2, annotate.lines.size + def test_last_rev_with_spaces_in_filename + last_rev = @adapter.lastrev("filemane with spaces.txt", "ed5bb786bbda2dee66a2d50faf51429dbc043a7b") + assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.scmid + assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.identifier + assert_equal "Felix Schäfer ", last_rev.author + assert_equal "2010-09-18 19:59:46".to_time, last_rev.time end else puts "Git test repository NOT FOUND. Skipping unit tests !!!" diff --git a/test/unit/repository_git_test.rb b/test/unit/repository_git_test.rb index dad5610a..4f608751 100644 --- a/test/unit/repository_git_test.rb +++ b/test/unit/repository_git_test.rb @@ -34,8 +34,8 @@ class RepositoryGitTest < ActiveSupport::TestCase @repository.fetch_changesets @repository.reload - assert_equal 13, @repository.changesets.count - assert_equal 22, @repository.changes.count + assert_equal 14, @repository.changesets.count + assert_equal 23, @repository.changes.count commit = @repository.changesets.find(:first, :order => 'committed_on ASC') assert_equal "Initial import.\nThe repository contains 3 files.", commit.comments @@ -57,10 +57,10 @@ class RepositoryGitTest < ActiveSupport::TestCase # Remove the 3 latest changesets @repository.changesets.find(:all, :order => 'committed_on DESC', :limit => 3).each(&:destroy) @repository.reload - assert_equal 10, @repository.changesets.count + assert_equal 11, @repository.changesets.count @repository.fetch_changesets - assert_equal 13, @repository.changesets.count + assert_equal 14, @repository.changesets.count end else puts "Git test repository NOT FOUND. Skipping unit tests !!!"