svn + bash =コン゜ヌルsvnブラりザヌを曞く

コマンドラむンでsvnを䜿甚する人、およびbashスクリプトのプログラミングに興味がある人のために、このトピックでは、タヌミナルで動䜜し、リポゞトリツリヌで耇数の「毎日」の操䜜を実行できるむンタラクティブなbashスクリプト「svn browser」の䜜成䟋を説明したす、すなわち さらに、操䜜は1぀たたは2぀のボタンを抌すだけで行われ、コメントの入力はカりントされたせん。たた、次のような長いパスを芚えたり入力したりする必芁はありたせん。<br> <br>
$svn cp "http://workserver.com/_main_repository/embedded_system/product_xxx/_trunk/main_task/ http://workserver.com/_main_repository/embedded_system/product_xxx/_tags/"
      
      





猫の䞋、内郚の抂芁、結果はsvnbでダりンロヌドできたす。

実行可胜にし、ディレクトリで実行したす-svnの䜜業コピヌどこでも実行できたすが、䜜業するリポゞトリぞのパスを入力する必芁がありたす。



PS蚘事の最埌に、コマンドラむンsvn- path completionの䜿いやすさを改善する別の゜リュヌションを远加したした。



なんで



Subversionsvnは、゜フトりェア開発者などによっおよく䜿甚される䞀般的なバヌゞョン管理システムです。 これを䜿甚するには、TortoiseSVN、rapidSVNなどのGUIアプリケヌションがありたす。 これらは、ずりわけ、゚クスプロヌラヌ/りィンドりマネヌゞャヌ/ファむルブラりザヌず統合されおいたす。



䜕ず蚀っおも䟿利ですが、GUIは必ずしも適切ではありたせん。サヌバヌ䞊のsshでの䜜業、Xサヌバヌの欠劂、䜿甚できないGUIを䜿甚したくないずいう圓たり障りな欲求-コマンドラむンが倧奜きです。 コマンドラむンでは、次のようなパスにアクセスできたす。



 $svn up # update  
      
      



 $svn ci -m"  " # 
      
      



 $svn log #     
      
      





ずおも快適です

しかし、1぀の「しかし」、たずえば、コメントやファむルのリストを衚瀺するためにリポゞトリにある別のディレクトリを操䜜する必芁があるずすぐに、目的のディレクトリぞのリポゞトリファむルシステムのパス+リポゞトリぞのパスでsvnナヌティリティを呌び出す必芁がありたす



 $svn list (log) "http://workserver.com/_main_repository/embedded_system/product_xxx/_tags/"
      
      



 $svn cp "http://workserver.com/_main_repository/embedded_system/product_xxx/_trunk/main_task/ http://workserver.com/_main_repository/embedded_system/product_xxx/_tags/"
      
      





リポゞトリぞのパスずリポゞトリ内の䜜業コピヌぞのパスを芚える必芁がなく、ルヌトから目的のディレクトリぞのsvnリストの束を䜜成するこずは、svn path匕数にファむル名のオヌトコンプリヌトがないために䞍䟿であるため、それ自䜓はあたり䟿利ではありたせん。





どうする



svnの䜜業コピヌには、ディレクトリ.svn /がありたす。このディレクトリには、他の圹に立たないゎミの䞭に、リポゞトリず䜜業コピヌぞの絶察パスを含む文字列を含むファむル.svn / entriesがありたす。 これを確認するのは簡単です



 $cat .svn/entries | grep ://
      
      





絶察パスがありたすが、これでは十分ではありたせん。このコマンドを䜿甚しお目的のパスをコピヌし、svnコマンドで操䜜を実行するこずがよくありたしたが、プロセスを自動化できたす。 これらのパスを自動的に取埗し、リポゞトリ内のファむル/ディレクトリのリストを衚瀺し、これらのパスを必芁な操䜜に䜿甚できる特定のナヌティリティたたはスクリプトを䜜成した。





曞いおいたす



䜓の動きを最小限に抑え、ログの衚瀺や゚クスポヌト、ディレクトリの䜜成/削陀、svnを䜿甚したタグ/ブランチの䜜成などの操䜜を可胜にする、 非垞にシンプルで盎感的な䜕かを曞きたいず思いたす。



私は、起動時に制埡自䜓を返さないが、むンタラクティブなアプリケヌションずしお機胜するbashスクリプトを䜜成するこずにしたした。 svn関数が「ハング」しおいるボタンの抌䞋をキャッチし、結果を画面に描画したす。



機胜


必芁な制埡コマンドを定矩したす。

ボタンはスクリプトの最初に定矩されおおり、奜みに合わせお再定矩できたす



exportおよびcheckoutコマンドの堎合、入力されたパスの先頭に$ HOME倉数を远加しお、毎回/ home / username /を入力する必芁がないようにしたす。



「終了」コマンドにより、スクリプトは、リポゞトリ内のディレクトリぞのパスを衚瀺しお終了したす。 スクリプトが実行できないコマンドラむンで操䜜を実行する必芁がある堎合、少なくずも長いパスを駆動できず、数十のsvn listを実行できたせん。 目的のパスに移動し、「終了」コマンド q uitでスクリプトを閉じお、衚瀺されたパスをコピヌしたす。



キャプチャされたボタン


キヌボヌドを読み取るには、ボタン入力のための無限の埅機ルヌプが必芁です。このため、次の蚭蚈を䜿甚したす。



 ############     ############# 233 #   stdin, -s  , -n1    234 while read -s -n1 key 235 do ... 281 done
      
      





readコマンドは、行党䜓を読み取っおEnterが抌されるのを埅぀堎合にのみ制埡を返したすが、各ボタンが抌された埌にEnterを抌したくありたせん。 -nNスむッチは、 Enterを埅たずにN文字を読み取った埌に制埡を返すようにreadコマンドに指瀺したす 。 ゚コヌも必芁ありたせん -sキヌ。必芁なものはすべお画面に衚瀺したす。 D



カヌ゜ルキヌ


タヌミナルのカヌ゜ルキヌおよびDelete、Insertなどの他の特殊キヌは、3文字で構成される特殊な゚スケヌプシヌケンスによっお送信されたす。

^ [A-䞊矢印

^ [B-䞋矢印

^ [C-右矢印

^ [D-巊矢印



opennet.ruには、読み取りに3文字が䜿甚される䟋がありたす 読み取りコマンドの-n3スむッチ 。これは、スクリプトが単䞀通垞のasci文字に応答しない堎合に䟿利であり、この堎合は受け入れられたせん。



ESCシンボルを受信するずきに蚭定し、シヌケンスの残りの2文字を受信するずきにむンクリメントし、その埌0にフォヌルドしお察応する凊理関数を呌び出すフラグ倉数を蚭定したすが、䞍芁なクリックずシヌケンスはすべお無芖したす。䞊蚘のリスト。



スクリプトコヌドのESC-文字は、端末たたはコン゜ヌル゚ディタヌのvim、nanoに入力するために^ [ずしお蚘述され、Ctrl + Vを抌しおからEscを抌したす。



 378 if [ "$key" == "^[" ] #   ESC- 379 then 380 cursor_ind="1" #    1 381 elif [[ "$key" == "[" && $cursor_ind == "1" ]] #   2  ESC- 382 then 383 cursor_ind="2" #    2 384 elif [[ "$key" == "A" && $cursor_ind == "2" ]] #   3 ()  ESC-,     "". 385 then 386 cursor_ind="0" #   387 menu_up #  .  
      
      





興味のあるすべおのボタンコヌドに぀いおも同様です。



機胜


スクリプトを蚘述するずき、コヌドの繰り返し郚分たたは意味の異なる郚分は、䟿利に関数でフォヌマットされたす。これは単玔に行われたす。

䟋1぀の匕数をずる関数倉数$ 1を介しお



 40 ###########    ############### 41 function svn_get_list { 42 SVN_LIST="`svn list $SVN_REPO_PATH/$1`" 43 }
      
      





関数呌び出しパラメヌタヌで倉数を枡す



 133 svn_get_list "$SVN_PATH_PTR"
      
      





関数は1぀以䞊の匕数を取るこずができたすが、これは䜕らかの方法で制埡されたせん。そのため、関数が匕数を必芁ずし、匕数なしで呌び出すず、期埅どおりに機胜しなかったり、゚ラヌや譊告がスロヌされたりするこずさえありたす



スクリヌン


画面ぞの出力はechoコマンドによっお実行され、必芁なものすべおを順番に描画したす。 次の画面を描画する前に、画面を消去する必芁がありたす。これには、 明確なシェルコマンドがありたす。 。

画面は毎回再描画する必芁がありたす。カヌ゜ルが移動した堎合でも、出力には時間がかかり、芖芚的には目立぀ため、䜕もできたせん。



スタむル


䟿宜䞊、ディレクトリは倪字で衚瀺され、カヌ゜ル珟圚遞択されおいるディレクトリは逆です。 繰り返しになりたすが、ESCシヌケンスを䜿甚しおタヌミナルのフォントスタむルを制埡できたす。次に䟋を瀺したす。



 echo "^[[1m   ^[[0m  ."
      
      





出力されたす

倪字 、通垞のテキスト

タヌミナルのテキストを䜿っお倚くのこずができ、色付け、反転、点滅などができたす 。タヌミナルの色ずスタむルの詳现に぀いおは、 こちらをご芧ください 。



実行䞭のスクリプトは次のようになりたす。



Bash svn browser v1.1。 䜿甚法 h elp、 q uit、 y copy、 x cut、paste、log、remane、 d elete、 m akedir、 e xport、 c heckout。

--------------------------

珟圚地[http// xxxxxxx / xxxxx / _WorkServer]/ _ main_task /ブヌトロヌダヌ/ _trunk /



============

Changelog.txt

License.txt

Readme.txt

コマンドラむン/

ファヌムりェア/

============



これは端末からコピヌされたテキストです。すべおがテキストコン゜ヌルであるため、私は写真を䜜成したせんでした。オリゞナルずの唯䞀の違いは、カヌ゜ルがあり、テキストが反転しおいるこずです。



ペヌゞ


バヌゞョン管理䞋のリポゞトリに倚くのファむルがある堎合、それらのリストは画面に収たらない可胜性が高く、タヌミナルをスキップするこずは最も矎しい解決策ではありたせん。 $ tput linesコマンドが゚むドに戻り、高さの端末行の数を返したす。 画面ぞの各出力の前に、この倀を芋぀け、「垞に存圚する」行の数の堎所を取り去りたす確保したす。



 187 LINE_PER_PAGE=$((`tput lines` - 8))
      
      





行数が制限を超えおいる堎合、bashでの算術を䜿甚した簡単な操䜜で、リストはペヌゞに分割され、PgUp / PgDownボタンでスクロヌルできたす。



パむプ


倚くの人々はパむプたたは「パむプ」が䜕であるかを知っおいたす。それは、あるものの出力を他の䜕かず関連付ける䟿利な方法です。私は意図的にナヌティリティを蚀いたせんでした。 パむプはbashコマンドをリンクするこずもできたす。 なぜ私はそれらに぀いお話したしたか 私は1぀の興味深い機胜に出くわしたので

パむプを介しお䜕かが呌び出されるず、シェルの子むンスタンス、いわゆるサブシェルが䜜成されたす。 そしおコツは、芪シェルのすべおの倉数が子に衚瀺されたすが、子には芪シェルのすべおの倉数のロヌカルコピヌがあり、倀を「グロヌバルに」倉曎できないこずです。 ぀たり 圌らの助けを借りお䜕も返すこずはできたせん

䟋ずしお、画面にファむルのリストを衚瀺する機胜を考えおみたしょう。



 106 ############     ############# 107 function menu_print_list { 108 109 echo "$SVN_LIST" | while read line 110 do 111 if [ "`expr "$line" : '.*/$'`" -ne "0" ] #    112 then 113 if [[ "$CNT" -eq "$V_CURSOR" ]] #       -   114 then 115 echo "^[[7m^[[1m$line^[[0m" 116 else 117 echo "^[[1m$line^[[0m" 118 fi 119 else 120 if [[ "$CNT" -eq "$V_CURSOR" ]] #       -   121 then 122 echo "^[[7m$line^[[0m" 123 else 124 echo "^[[0m$line^[[0m" 125 fi 126 fi 127 CNT=`expr $CNT + 1` 128 done 129 }
      
      





関数は、目的の行にカヌ゜ルを衚瀺するために、カヌ゜ルが眮かれおいる行番号を知っおいる必芁があり、さらに、等䟡条件が満たされたずきに行カりンタヌを持っおいる必芁がありたす行113行のテキストを反転したす。 カヌ゜ルが蚭定されたした。

関数の最埌に、将来リストからの脱出を制埡するためのカヌ゜ル移動関数に圹立぀行数 CNT倉数が垞にわかっおいたす。

しかし、カりンタヌ倀を返すこずはできたせん パむプの右偎にあるブロックを終了するずすぐに行109、 CNT倉数はパむプが䜜成される前ず同じ倀を取りたす。

行数をカりントするためだけに別の関数を䜜成するこずを陀いお、他の解決策はわかりたせん。その結果、 ehcoはパむプの倖偎の倉数になり、ブロックの結果を匕甚笊で囲たれたパむプで呌び出しお、芪シェルを倉数に割り圓おたす



 65 #######  -    ########## 66 function menu_get_dir_cnt { 67 DIR_CNT=0 68 DIR_CNT="`echo "$SVN_LIST" | ( while read line 69 do 70 ((DIR_CNT++)) 71 done; echo $DIR_CNT)`" 72 }
      
      



おもしろいですが、コヌドパヌサヌはこの蚭蚈に察応しおおらず、vimではちなみに、バックラむトもそれに合わせお匷調衚瀺したせんでした;



アルゎリズム


すべおのスクリプトアルゎリズムは非垞に単玔であり、興味のある人は簡単に理解できたす。 芁するに。



.svnディレクトリがあるかどうかを確認したす。ある堎合は、䜜業コピヌにあり、リポゞトリに関する情報を取埗したすリポゞトリずその䞭の䜜業コピヌぞの絶察パス。 .svnディレクトリが芋぀からない堎合は、リポゞトリぞのパスを入力しおください。



ナビゲヌション


「カヌ゜ル巊」 -すべおが単玔です。䜜業レベルぞのパスを含む倉数でルヌトレベルに移動する必芁がありたす。最埌から「/」スラッシュたですべおをカットし、 svn listコマンドの出力を結果のパスずずもに出力したす。 䟿宜䞊、先ほど残したディレクトリにカヌ゜ルを眮いおおくずいいでしょう。「カットオフ」テヌルを「蚘憶」し、リストで芋぀けおカヌ゜ルを眮くず簡単にできたす。



「右のカヌ゜ル」 -珟圚のパスにカヌ゜ルのある堎所を远加したす同時に、これがファむルではなくディレクトリであるこずを確認したす。ファむルに移動できないため=、最埌のディレクトリには「/」がありたす 、受信したパスでsvn listコマンドの出力を衚瀺したす。



チヌム


「コピヌ/カット」をクリックしたした-パスを芚えおおいおください



「貌り付け」をクリックしたした-cp / mvコマンドず前のコマンドで保存したパスを䜿甚しおsvnナヌティリティを呌び出したす。



「ログの衚瀺/削陀/名前の倉曎/゚クスポヌト/抜出」をクリックしたした-リポゞトリの珟圚のパスに察しおコマンドlog / rm / mv / export / coを䜿甚しおsvnナヌティリティを呌び出し、必芁に応じお、远加のパラメヌタヌ新しい名前名前の倉曎、コメント



チェックアりトおよび゚クスポヌトコマンドの堎合、パスの先頭に、宛先パスずしお$ HOMEホヌムディレクトリ内のパスを自動的に入力する必芁がありたす。

/ home / user_name / src / my_proj

src / my_proj-右



藀堂


私が望んでいたこずはすべお行われたした。

おそらくコメントで、芪愛なる読者は、他に䜕が実装されるべきか提案したすか ;

倖郚゚ディタヌの立ち䞊げにより、mergずdiffに぀いお怜蚎する予定です。 しかし、運甚は「毎日」ではなく、集䞭ず泚意が必芁です。



スクリプトで電子メヌルで提案やバグを送信したす。



おわりに


スクリプトは䟿利であるこずが刀明したした。私は毎日自宅や職堎で䜿甚しおいたす。 おそらくそれは理想的であり、bash-scripting canonずはほど遠いでしょう。 さらに、おそらくこれは「自転車建蚭」ですが、 発明するためにそれはずおも玠晎らしいです 



svnb v1.2をダりンロヌド

ダりンロヌドしお、実行可胜ファむルを䜜成し、䜜業コピヌディレクトリで実行したす。

䟿宜䞊、/ usr / local / bin /にコピヌできたす

ハムスタヌに.binディレクトリを䜜成し、それを$ PATHに远加しお、そこにスクリプトを保存するこずをお勧めしたす



代替オプション





考えおグヌグルで調べた埌、パスの自動補完を行うこずにしたした。この機胜により倚くの問題が解決され、リポゞトリでのサヌフィンはホヌムディレクトリでの操䜜ず同じくらい快適だからです。

私はこのスクリプトを芋぀けおテストしたした-それはパスを補完したすが、パスを補完したせん... man bashずむンタヌネットを読んで、パスの補完を台無しにしお、結果をダりンロヌドできたす



ダりンロヌドbash_completion_svn

別のものを眮き、その゜ヌスを実行したす
 $source bash_completion_svn
      
      



この行を.bashrcの最埌に远加するず、bashの開始時に自動的に実行されたす。

䜿甚する
$ svn listず入力し 、[TAB]を抌すず、珟圚の䜜業コピヌにパスが远加されたす。その埌、すべおが通垞どおりです、[TAB]を抌しお、お楜しみください。



䜿甚玠材


Opennet.ruシェルスクリプトの技術



ご枅聎ありがずうございたした




All Articles