Mercurialのシェルフ拡張機能を使用したときに発生した状況を再現するために、シェルスクリプトを作成しようとしています。
これを行うには、Mercurialコマンドラインユーザーインターフェイス(UI)が提供するプロンプトを中止する必要があります。次のスクリプトを参照してください
rm -rf test-shelveinterrupt
hg init test-shelveinterrupt
cd test-shelveinterrupt
hg branch foo
echo "First line of foo" >> foo
hg add foo
hg ci -m "First line of foo" foo
echo "Second line of foo" >> foo
hg shelve
hg up null
hg branch bar
echo "First line of bar" >> bar
hg add bar
hg ci -m "First line of bar" bar
hg unshelve
pkill -INT shelveinterrupt
このスクリプトを実行すると
bash shelveinterrupt.sh
、 で終了します
file 'foo' was deleted in local [working-copy] but was modified in other [shelve].
You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
What do you want to do?
hg unshelve
これはスクリプトの最後のコマンドへの応答です。
邪魔してメッセージを中断したいです。最後はpkill
シェルプロセスを中断するように設計されていますが、もちろんスクリプトが入力を待っている間は呼び出されません。最初のスクリプトを呼び出すために2番目のスクリプトを作成せずに呼び出す方法はありますか?
スクリプトを中断すると、次のメッセージが表示されます。
未解決の競合(「hg解決」を参照してから「hg unshelve --continue」を参照)
答え1
私がやりたいことがTcl拡張を介して達成できることがわかり、それを期待しています。ただし、これには2つのスクリプトが必要です。
シェルスクリプト。
#################################
shelveinterrupt.sh
#################################
#!/bin/bash
rm -rf test-shelveinterrupt
hg init test-shelveinterrupt
cd test-shelveinterrupt
hg branch foo
echo "First line of foo" >> foo
hg add foo
hg ci -m "First line of foo" foo
echo "Second line of foo" >> foo
hg shelve
hg up null
hg branch bar
echo "First line of bar" >> bar
hg add bar
hg ci -m "First line of bar" bar
hg log -vG
hg branch
hg unshelve
Expectスクリプトもあります。
#################################
shelveinterrupt.exp
#################################
#!/usr/bin/expect -f
spawn ./shelveinterrupt.sh
expect "What do you want to do?"
send -- "^C"
expect eof
# Check `hg status
cd test-shelveinterrupt
set hgst [exec hg status]
puts $hgst
exec hg update .
これにより、次のような出力が生成されます。
faheem@orwell:~/test-mercurial$ ./shelveinterrupt.exp
spawn ./shelveinterrupt.sh
marked working directory as branch foo
(branches are permanent and global, did you want a bookmark?)
shelved as foo
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
marked working directory as branch bar
unshelving change 'foo'
rebasing shelved changes
file 'foo' was deleted in local [working-copy] but was modified in other [shelve].
You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
What do you want to do? interrupted!
# The repository is in an unfinished *update* state.
# Unresolved merge conflicts:
#
# foo
#
# To mark files as resolved: hg resolve --mark FILE
# To continue: hg update .
abort: outstanding merge conflicts
(use 'hg resolve' to resolve)
while executing
"exec hg update ."
(file "./shelveinterrupt.exp" line 11)
だからhg update .
それは動作しません。