Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Скрипт на BASH для работы с taskjuggler  (Прочитано 660 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Alexey_Pr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 89
    • Просмотр профиля
    • Linux в Туле
Добрый день!
Я веду несколько проектов в TaskJuggler и появилась необходимость в автоматизации. Сначала кратко, что такое taskjuggler - это консольный менеджер проектов, он хранит файлы проекта в обычном текстовом виде с расширением tjp и tji. По команде tj3 main.tjp производит их компиляцию и выдает отчеты в разных форматах.
Собственно в чем проблема - он не отслеживает изменения в файлах проекта автоматически. Предположим я отметил выполнение каких-то задач, чтобы увидеть это в отчете надо выполнить команду  tj3 main.tjp Сейчас у меня более 15 проектов, примерно раз в день я заглядываю в каждый и если надо что-то правлю. Чтобы выполнить их компиляции использую скрипт:
#!/bin/bash
for proj in `cat project.conf`; do
cd $proj
tj3 $proj/main.tjp
done
И еще есть конфигурационный файл (из него несколько строк):
/home/alexey/Проекты/Калининград/ПГУ
/home/alexey/Проекты/Мурманск/360
/home/alexey/Проекты/Мурманск/361
/home/alexey/Проекты/Мурманск/373
Собственно чтобы мне хотелось сделать:
1) Чтобы в конфигурационном файле можно было вводить комментарии
# комментарий..... Тогда я смог закомментировать часть проектов которые уже завершены и по ним не надо строить отчет.
2) Сейчас я запускаю указанный выше скрипт время от времени, чтобы получить актуальные отчеты. Т.к. у меня много проектов их компиляция занимает некоторое время, около минуты, я настроил крон на запуск раз в 3 часа. Хотелось бы такой скрипт, чтобы проверять изменились ли файлы tjp и tji, и если изменились, то тогда уже запускал компиляции конкретного проекта, такой бы я запускал например раз в 5 мин.
В BASH разбираюсь на уровне приведенных выше скриптов, поэтому прошу помощи, с чего начать, как подойти к этим задачам?

С уважением, Алексей.
http://tulalinux.ru

Оффлайн Vitsliputsli

  • Старожил
  • *
  • Сообщений: 1293
    • Просмотр профиля
Re: Скрипт на BASH для работы с taskjuggler
« Ответ #1 : 11 Июнь 2013, 17:35:17 »
Первое что придумалось:
!/bin/bash
touch "project.mod"; strret=$[$[`sed -n '$=' "project.conf"`]-$[`sed -n '$=' "project.mod"`]] # проверка формата project.mod
for b in `seq 1 $strret`; do echo >> project.mod; done # исправление project.mod
numstr=0
for proj in `cat project.conf`; do
        let $[numstr++]
        if [ "${proj::1}" != '#' ]; then # проверка на комментарий
                if [ "x"`stat -c %Y "$proj/main.tjp"` != "x"`sed -n "$[numstr]"'p' project.mod` ]; then # проверка на изменение проекта
                        tj3 $proj/main.tjp
                        sed -i "$numstr"'c\'`stat -c %Y "$proj/main.tjp"`'\' project.mod # обновление информации о дате изменения проекта
                fi
        fi
done
из-за обработки исключений получилось немножко громоздко... Скрипт читает проекты из project.conf, игнорирует закомментированные, компилирует изменившиеся.

Оффлайн Alexey_Pr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 89
    • Просмотр профиля
    • Linux в Туле
Re: Скрипт на BASH для работы с taskjuggler
« Ответ #2 : 11 Июнь 2013, 22:31:40 »
Спасибо. Честно, пока мало что понял в этом скрипте, после выходного буду тестировать и разбираться.
С уважением, Алексей.
http://tulalinux.ru

Оффлайн Vitsliputsli

  • Старожил
  • *
  • Сообщений: 1293
    • Просмотр профиля
Re: Скрипт на BASH для работы с taskjuggler
« Ответ #3 : 12 Июнь 2013, 11:31:54 »
Создается еще один файл project.mod в котором хранятся даты изменения каждого проекта, каждая строка project.mod соответствует строке project.conf. Даже если в conf добавить новые проекты и утратится соответствие mod и conf, это вызовет лишь перекомпиляцию проектов.

2,3 строка необходимы лишь тогда, когда project.mod не существует или в нем меньше строк чем в project.conf. К сожалению, без этой проверки sed не сможет корректно работать.

7 строка проверяет первый символ каждой строки project.conf на '#'.

8 строка сравнивает дату модификации проекта (stat) с датой прошлой модификации сохраненной в project.mod (sed).

10 строка после компиляции проекта, сохраняет текущую дату модификации (stat) в файле модификаций project.mod (sed) в нужной строке.

Оффлайн Alexey_Pr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 89
    • Просмотр профиля
    • Linux в Туле
Re: Скрипт на BASH для работы с taskjuggler
« Ответ #4 : 13 Июнь 2013, 14:05:28 »
Сегодня поразбирался и на основе этой идеи сделал такой скрипт:
#!/bin/bash
# имя конфигурационного файла
conf=project.conf
# имя файла с датой последнего отчета
lr=last_report
# имя каталога откуда запускается скрипт
home=`pwd`
# проверяем существует конфиг. Если нет, завершение работы.
if ! [ -f $conf ]; then
echo "В текущей директории нету файла project.conf, он необходим для работы скрипта."
echo "Дальнейшие действия не возможны, скрипт будет завершен"
exit 1
fi
# удаляет пустые строки и строки с пробелами
sed -e '/^\s*$/d' $conf > temp
while read line ; do
# удаляем отступы, пробелы, табуляции и с конца и с начала строки
line=`echo $line | sed 's/^[ t]*//;s/[ t]*$//'`
if [ "${line::1}" != '#' ];
then # строка не комментарий
echo "Обрабатываем строку:" $line
# тут еще надо добавить строку замены пробелов на [\ ], чтобы cd корректно работал
cd $line
# проверяем существует файл с датой отчета или нет. Если нет, создаем.
if ! [ -f $lr ];
then
echo "Отчеты по этому проекту еще не строились, начинаем построение"
date > $lr
tj3 main.tjp
else
# найти самый новый файл в каталого, рассматриваются только файлы проекта *.tji *.tjp
name=`ls -t *.tji *.tjp | head -n1`
if ((`stat -c %Y $name` > `stat -c %Y $lr`));
then
echo "Отчет старый, перекомпиляция"
# новую дату компиляции
date > $lr
# перекомпиляция проекта
tj3 main.tjp
else
echo "Изменений не было, не компилируем"
fi
fi
else # строка комментарий
echo "Пропускаем строку:" $line "т.к. это комментарий"       
fi
done < temp
# уборка
cd $home
rm temp
Осталось вот этот участок доработать:
# тут еще надо добавить строку замены пробелов на [\ ], чтобы cd корректно работал
cd $line
Скрипт корректно обрабатывает конфиг если в нем в комментарии несколько слов, если есть пробелы, табы в начале комментария и пустые строки.
« Последнее редактирование: 13 Июнь 2013, 14:07:23 от Alexey_Pr »
С уважением, Алексей.
http://tulalinux.ru

Оффлайн Vitsliputsli

  • Старожил
  • *
  • Сообщений: 1293
    • Просмотр профиля
Re: Скрипт на BASH для работы с taskjuggler
« Ответ #5 : 13 Июнь 2013, 18:11:36 »
Цитировать
тут еще надо добавить строку замены пробелов на [\ ], чтобы cd корректно работал
cd "$line"

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Скрипт на BASH для работы с taskjuggler
« Ответ #6 : 13 Июнь 2013, 18:39:47 »
Осталось вот этот участок доработать:
# тут еще надо добавить строку замены пробелов на [\ ], чтобы cd корректно работал
cd $line
Это было бы тем ещё извратом.
Старайтесь экранировать переменные везде, где можно, и вы избежите многих проблем.

Оффлайн Alexey_Pr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 89
    • Просмотр профиля
    • Linux в Туле
Re: Скрипт на BASH для работы с taskjuggler
« Ответ #7 : 13 Июнь 2013, 20:49:17 »
Цитировать
тут еще надо добавить строку замены пробелов на [\ ], чтобы cd корректно работал
cd "$line"
Это почему-то не работает, смотрите:
cd ~/Ubuntu\ One/
alexey@Lenovo-home:~/Ubuntu One$ cd "~/Ubuntu\ One/"
bash: cd: ~/Ubuntu\ One/: Нет такого файла или каталога
С уважением, Алексей.
http://tulalinux.ru

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Скрипт на BASH для работы с taskjuggler
« Ответ #8 : 13 Июнь 2013, 20:52:23 »
Это почему-то не работает...
Уберите обратный слэш.

Оффлайн Alexey_Pr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 89
    • Просмотр профиля
    • Linux в Туле
Re: Скрипт на BASH для работы с taskjuggler
« Ответ #9 : 13 Июнь 2013, 20:54:54 »
Это почему-то не работает...
Уберите обратный слэш.
Ну точно, работает. Вот так всегда споткнешься на простом последнем шаге :) Прямо супер скрипт получился, большое спасибо за помощь!
С уважением, Алексей.
http://tulalinux.ru

 

Страница сгенерирована за 0.179 секунд. Запросов: 25.