Subversion: Bug แสดงรายการ Repository ทั้งหมดไม่ได้
เวลาอยากให้ SVN ที่รันผ่าน Apache (mod_dav_svn) มันสามารถ List รายการ Repository ทั้งหมดในนั้นได้ ถ้างงลองดูรูปประกอบ
ปกติมันก็ควรทำได้ง่ายๆและเป็นอย่างในรูป โดยการเพิ่มคำสั่ง SVNListParentPath On ลงไปก็แค่นั้น
<Location />
DAV svn
SVNParentPath /home/vhost/<hidden>/svn
SVNListParentPath On
...
</Location>
แต่พอลองทำแล้ว มันดัน Forbidden !@#$%!@#$%
งงมากๆ เกิดอะไรขึ้น หลังจากลองแก้ไปแก้มา พบว่าถ้าเอาคำสั่ง AuthzSVNAccessFile ออกแล้วมันสามารถ List รายการได้ตามปกติ หลังจากทดสอบไปมาจนแน่ใจ ก็ฟันธงว่ามันเป็นบั๊ก
จากนั้นก็พึ่ง Google เพื่อนยาก หาวิธีแก้ไปเรื่อยๆ จนไปเจอความเห็นหนึ่งในเว็บบอกไว้ว่า ถ้าใส่ / ตามหลังคำสั่ง <Location …/> จะสามารถใช้งานได้ตามปกติ
แต่ปัญหาสำคัญสุดคือ ผมรัน SVN ไว้บน / ของเว็บ ซึ่งก็คือ <Location /> แน่นอน… มันมี / อยู่แล้ว ลองเบิ้ลเข้าไปเป็น <Location //> ยิ่งพังหนักกว่าเดิมอีก
ปรึกษา @lewcpe ได้คำแนะนำให้ลองรัน SVN จริงๆไว้ในโฟลเดอร์อื่นแทน เช่น /svn/ เพื่อที่จะได้ใส่ / ตามหลัง แล้วค่อยโยน URL ด้วย mod_rewrite หลังจากนั่งมั่วอยู่นานจนแล้วยังไม่สำเร็จ ก็เลยตัดใจ ค่อยๆกลับไปหาทางแก้ต่อ
เสิร์ชไปเสิร์ชมา ก็พบว่าบั๊กนี้ถูกรายงานไว้ใน Subversion เรียบร้อยแล้ว เลยลองนั่งๆอ่าน comment จนเจอคนโพสต์วิธีแก้ขัดไว้ นั่นคือให้แยก Location เป็น 2 ส่วน ส่วนแรกคือ / ไม่ต้องมี AuthzSVNAccessFile ส่วนที่เหลือก็เขียนตามปกติ ลองดูโค้ด
<Location />
DAV svn
SVNParentPath /home/vhost/<hidden>/svn
SVNListParentPath on
</Location><LocationMatch /.+>
AuthType Basic
AuthName svn.<hidden>
AuthUserFile /home/vhost/<hidden>/svnpasswd
Require valid-userAuthzSVNAccessFile /home/vhost/<hidden>/svnaccess
</LocationMatch>
สาเหตุที่ทำแบบนี้แล้วแก้ได้ เนื่องจากบั๊กของ mod_dav_svn นั้นมีผลให้ Location ที่ไม่ได้ลงท้ายด้วย / ซึ่งรวมถึง / อย่างเดียวด้วย ไม่สามารถใช้คำสั่ง SVNListParentPath คู่กับ AuthzSVNAccessFile ได้ ถ้าใช้แล้วมันจะ List ไม่ได้
วิธ๊แก้ด้านบนนั้นทำได้โดยแยก SVNListParentPath ให้ไปอิงกับ <Location /> ที่จะมีผลเมื่อเข้าตรง / เท่านั้น ส่วน AuthzSVNAccessFile ก็แยกมาอีกส่วนหนึ่งคือ <LocationMatch /.+> ซึ่งก็จะมีผลกับทุกอันที่เป็น / ตามด้วยตัวอะไรอย่างน้อย 1 ตัว (RegEx) ไอ้ 2 คำสั่งเจ้าปัญหานี้มันก็เลยไม่ชนกัน
เท่านี้ก็สามารถ List รายการ Repository และใช้งาน Subversion ได้อย่างสบายใจแล้ว เหลือปัญหาสุดท้ายคือ…
- ติดตั้ง Trac
