inquire () {
echo -n "$1 [y/n]? "
read answer
finish="-1"
while [ "$finish" = '-1' ]
do
finish="1"
if [ "$answer" = '' ];
then
answer=""
else
case $answer in
y | Y | yes | YES ) answer="y";;
n | N | no | NO ) answer="n";;
*) finish="-1";
echo -n 'Invalid response -- please reenter:';
read answer;;
esac
fi
done
}
... other stuff
inquire "Install now?"
...
Я никогда не использовал Mercurial, но это очень похоже на то, о чем не так давно говорил Мартин Фаулер в своем блоге:
Реализация интерфейса, просто и ясно продемонстрированного dfa, является чистой и элегантной (и "официально" поддерживаемым способом). Это то, для чего предназначена концепция интерфейса.
В C # мы могли бы использовать делегаты для программистов, которым нравится использовать указатели функций в c, но метод DFA - это способ использовать.
У вас также может быть массив
Command[] commands =
{
new CommandA(), new CommandB(), new CommandC(), ...
}
] Затем вы можете выполнить команду по индексу
commands[7].exec();
Плагиат из DFA, но имея абстрактный базовый класс вместо интерфейса. Обратите внимание на cmdKey, который будет использоваться позже. По опыту я понимаю, что часто команда оборудования также имеет подкоманды.
abstract public class Command()
{
abstract public byte exec(String subCmd);
public String cmdKey;
public String subCmd;
}
Создайте свои команды таким образом,
public class CommandA
extends Command
{
public CommandA(String subCmd)
{
this.cmdKey = "A";
this.subCmd = subCmd;
}
public byte exec()
{
sendWhatever(...);
byte status = receiveWhatever(...);
return status;
}
}
Затем вы можете расширить общий HashMap или HashTable, предоставив функцию отсасывания пары ключ-значение:
public class CommandHash<String, Command>
extends HashMap<String, Command>
(
public CommandHash<String, Command>(Command[] commands)
{
this.commandSucker(Command[] commands);
}
public commandSucker(Command[] commands)
{
for(Command cmd : commands)
{
this.put(cmd.cmdKey, cmd);
}
}
}
Затем создайте свою команду магазин: Предположим, ваша работа связана с наборами изменений от 100 до 110 включительно
Создайте патч:
% hg export -o mypatch 100: 110 --git
Обновите до 99:
% hg update 99
Примените патч с помощью --no-commit (иначе вы вернете все свои изменения):
% hg import --no-commit mypatch
Зафиксировать все изменения сразу:
% hg commit
Теперь у вас есть две головы (110 и 111), которые должны быть эквивалентны с точки зрения файлов, которые они создают в вашем рабочем каталоге - возможно, различите их для здравого смысла, прежде чем удалять старые:
% hg strip 100
Хорошо, теперь, когда я все это изложил, это действительно кажется длинным, но, проделав это несколько раз, я не считаю, что это слишком утомительно ...
Расширение histedit - это именно то, что вы ищете .
hg histedit -o
или
hg histedit --outgoing
откроют список исходящих ревизий. Из списка вы можете
histedit предложит вам новое сообщение о фиксации свернутые наборы изменений, которые по умолчанию представляют собой два сообщения с разделением "\ n *** \ n".
Вы также можете получить аналогичные результаты, используя расширение mq, но это намного сложнее.
Вы также можете используйте расширение сворачивания, чтобы просто выполнить сворачивание, но оно не обеспечивает такого приятного пользовательского интерфейса и не дает возможности редактировать полученное сообщение фиксации.
HistEdit будет делать то, что вы хотите, но, вероятно, это перебор. Если единственное, что вам нужно, это сложить несколько ревизий вместе, Collapse Extension выполнит свою работу.