リポジトリからプル/プッシュする必要があるかどうかを確認するgitsvn関連の関数がいくつかあります。
私の問題は、この情報を収集するために作成した関数が遅すぎることです。 PS1
になるように、それらを非同期にします 関数によって生成されたデータの準備ができていても、印刷したい場合は、デフォルトを表示します。
git svn fetch
を実行せずに、これらの情報をプロンプトに表示したいのですが、たとえば、プルする必要があるかどうかがわかります。 毎回。
これは、変更をプッシュする必要がある場合にPS1に↑を追加するために呼び出す関数です。
function hasToPush {
(($1 == 0)) &&
(git svn dcommit --dry-run 2>/dev/null | grep -q "diff-tree" && echo "↑")
}
これらは、プルする必要がある場合に↓を追加するために呼び出す関数です。 1つ目は、2分ごとにインデックスを更新して、(($latest > $current))
を実行できるようにするために使用されます。 チェックしてください。
function loopingGitSvnFetch {
sleep 120
git svn fetch &>/dev/null
}
loopingGitSvnFetch &
function hasToPull {
(($1 == 0)) && (
latest=$(git svn log | awk 'NR==2' | cut -d ' ' -f1 | tr -d 'r')
current=$2
(($latest > $current)) && echo "↓"
)
}
それらを非同期にするために、私は次のようにそれらをまとめようとしました:
function async {
{
git diff-index --quiet --cached HEAD &>/dev/null
dirty=$(echo $?)
push=$(hasToPush $dirty)
gitsvn=$(git svn info 2> /dev/null | grep Revision)
gitsvn=${gitsvn#Revision: }
pull=$(hastoPull $dirty $gitsvn)
callback $push $pull
} &
}
しかし、それでも同じ遅い動作が発生します。
結果をファイルに入れて後で読み取ろうとしましたが、そのアプローチは好きではありません。
PROMPT_COMMAND
の使用を検討しました 。しかし、それは非同期ではありません。オンデマンドになります。
PS1
の方法に光を当てていただけませんか 振る舞うのか、それとも私が間違っているのか?
よろしくお願いします。
PS:300 repの誰かが、非同期タグとps1タグを追加できますか?
編集:
簡単なテストとしてこれらの行を.bashrcに追加しましたが、機能しているように見えたので、書き直した(以前の試行を元に戻した)のは良いことのようです🙂
while true;
do
discoverScmInfo &>~/.ps1
sleep 1
done &
PS1='$(customW)$(cat ~/.ps1)\$ '
これを関数に入れて、呼び出す前にジョブがすでに実行されているかどうかを確認します。
申し訳ありませんが、結局のところ、必要なのはそれについて書くことだけだったようです。 🙂
承認された回答:
re:毎秒ループの解決策:ホームディレクトリではなく、/tmpにあるファイルに書き込むことができます。そしてPS1=$(customW)$(< ~/.ps1)\$ '
cat
のフォーク/実行を保存します 。
re:元の質問:PS1
への非同期アップデートを取得する方法 :
非同期書き込みを開始するにはPS1
:
-
PROMPT_COMMAND
を設定します データが利用可能かどうかをチェックする関数に。 -
- そうである場合は、
PS1
を更新しますPROMPT_COMMAND
の設定を解除します
- そうである場合は、
-
- そうでない場合は、
PS1
のままにします 古い値またはプレースホルダー値を使用します。
- そうでない場合は、
/tmp
内のファイルを使用します 非同期IOに書き込むための、およびPROMPT_COMMAND
読むために。
これでうまくいくと思います。