2015-10-06 82 views
1

我想創建一個zsh小部件來執行一個按鈕的版本控制系統的常見任務。例如。如果當前目錄是Subversion簽出的一部分,按F1應該調用「svn status」。如果它在git倉庫中,它應該調用「git status -s」。zsh:找出當前目錄的VCS

現在,創建小部件並沒有什麼大不了的。但是,如何確定當前目錄中的哪個VCS?

我知道約vcs_info,我用了很多。但我找不到任何方法來檢索最基本的信息,它提供了。有任何想法嗎?

回答

0

感謝所有的評論。我的解決方案,現在看起來是這樣的:

vcs-status() { 
    setopt no_autopushd 
    cmd="" 
    cur_dir=`pwd` 
    while [[ `pwd` != "/" ]]; do 
     if [[ -d .svn ]]; then 
     cmd="svn status^M" 
     break 
     elif [[ -d .git ]]; then 
     cmd="git status -s^M" 
     break 
     fi 
     cd .. 
    done 
    cd $cur_dir 
    if [[ -n $cmd ]]; then 
     zle -U $cmd 
    fi 
    setopt autopushd 
} 
zle -N vcs-status 
bindkey "\eOP" vcs-status 

建議冷卻zsh'ish改進,歡迎:-)

我還實施托馬斯的建議,用svn infogit rev-parse。但後來我注意到一個問題:如果我有一個SVN工作副本檢出裏面一個GIT工作副本(是的,這是必要的),反之亦然,我只能找到我檢查的第一個。通過上面的解決方案,我發現了「最內層」,這正是我想要的。事實上,這是一個令我討厭vcs_info一段時間的問題。

2

如何測試特定元數據目錄的存在?

if test -d CVS; then 
    # CVS 
elif test -d .hg; then 
    # Mercurial 
elif test -d .git; then 
    # Git 
elif test -d .svn; then 
    # Subversion 
else 
    # unknown 
fi 
+1

嗯,我不確定它是否那麼簡單。在git中只有根目錄下有.git目錄,但沒有在任何子目錄中(我也聽說過SVN的更新版本)。我會搜索所有父目錄。當然,這也沒有什麼大不了的,但我希望'vcs_info'能提供一個函數或變量(我找不到)。 –

+0

好吧,我想我會隨你的解決方案(和提到的改進)。謝謝! (如果在不久的將來沒有更好的東西出現,我會接受你的答案) –

+1

'svn info'在子目錄中工作(* it *搜索以查找'.svn'目錄)。 'git'同樣靈活。如果腳本被修改以測試相應工具的非錯誤輸出,它將執行OP所要求的操作。 –