trac
Случайное совпадение
Выбирал hostname машины, на которой будет находится трак и свн. Хотел выбрать название из древнегреческих богов(пытался найти бога памяти), не нашел. Следующая идея — нужно сервер назвать как один из спутников Юпитера. Первый спутник Юпитера - Метида назван в честь древнегреческой богини мудрости Метиды, первой супруги Зевса. =)
trac-post-commit-hook
Было
При разработки программ с использование trac и svn очень удобно в коментариях к комитам в svn писать некий текст и дублировать его в тикете.
Т.е. при коммите:
svn ci -m "#123 - полностью решил тикет"
А в комменте к тикету писать:
[334] - полностью решил тикет
Т.е. чтобы в svn была ссылка на тикет, а в тикте - ссылка на svn. Это очень удобно использовать, но не удобно делать (понятно, что это делается с помощью copy&paste, но все равно лениво).
Стало
Можно настроить svn таким образом, чтобы после комита автоматически выполняллось некоторое действие. Существует вот такой скрипт: http://trac.edgewall.org/browser/trunk/contrib/trac-post-commit-hook - он смотрит, что есть в комментарии к комиту, вычленяет оттуда команду и либо пишет коммент к тикету, либо пишет коммент и закрывает тикет.
Т.е. использование этого скрипта, немного упрощает работу.
Как использовать
Вот такая комманада:
$ svn ci -m "re #1323 - тестирование тикета"
В тикет #123 пишет:
(In [334]) re #1323 - тестирование тикета
Т.е. формат коммента для svn следующий:
Комманда #1
Команды есть следующие:
- references, refs, addresses, re, see - любвая из этих комманд записывает ссылку на коммит и svn комментарий в тикет
- close, closed, closes, fix, fixed, fixes - то же самое + еще и закрывает тикет
Advanced команды можно узнать в докуменации к скрипту: http://trac.edgewall.org/browser/trunk/contrib/trac-post-commit-hook
Как настроить
Далее вместо $SVN нужно везде поставлять путь к svn-у (например /var/svn/test), а вместо $TRAC — путь к trac environment (например /var/trac/test). В тексте выделено курсивом.
1.
Создается файл $SVN/hooks/post-commit со следующим содержанием:
#!/bin/sh
REPOS=”$1″
REV=”$2″
TRAC_ENV=”$TRAC“
/usr/bin/python /usr/local/src/trac/contrib/trac-post-commit-hook \
-p “$TRAC_ENV” -r “$REV”
2.
Выставляем правильные права на файл
$ sudo chmod 755 $SVN/hooks/post-commit
3.
Получаем сам скрипт:
user@server:/usr/local/src/trac/contrib$ sudo wget http://trac.edgewall.org/export/7864/trunk/contrib/trac-post-commit-hook
Ссылки из трака на другие траки
Система trac сейчас не позволяет работать со многими проектами в рамках одной инсталляции (*). Сейчас у меня есть несколько траков в которых я работаю (отдельный трак для каждого проекта). У меня есть специальный трак (он синхронизируется с пальмом), в котором я веду gtd списки. В этом траке я указываю на тикеты в других траках. Я хочу просто написать номер тикета и чтобы он сразу стал ссылкой на нужный мне тикет в правильном траке.
Для этого в траке существует очень удобная штука — InterTrac. В конфиге нужно написать:
[intertrac]
# - Пример прописывания алиаса:
t = trac
# - Ссылка на внешний Трак:
trac.title = Edgewall’s Trac for Trac
trac.url = http://trac.edgewall.org
После этого пишем в вики t:#1 и получаем правильную ссылку на тикет 1.
* вообще-то трак, конечно позволяет работать с несколькими проектами, вот пример, как в одном траке ведется работа над кучей плагинов: http://trac-hacks.org/. Возможность работы с множеством проектов в рамках одной инсталляции запланировано на релиз 1.0, правда даты этого релиза пока даже близко нет.
Perl процедура для обновления wiki страниц trac-а
Я очень люблю и много пользуюсь системой trac. У меня появилась необходимость обновлять вики страницы трака из внешних программ. Я написал крохотную процедуру на perl, чтобы это делать (и впервые воспользовался pod для ведения документации =):
-
#! /usr/bin/perl
-
-
use strict;
-
use warnings;
-
use DBI;
-
-
=head2 Структура таблицы wiki в траке
-
-
CREATE TABLE wiki (
-
name text,
-
version integer,
-
time integer,
-
author text,
-
ipnr text,
-
text text,
-
comment text,
-
readonly integer,
-
UNIQUE (name,version)
-
);
-
-
=cut
-
-
=head2 sub write_wiki_trac
-
Процедуре передаются параметры:
-
-
file - файл с базой данных trac
-
name - название страницы
-
author - кто будет автором редакции страницы
-
text - текст, который будет размещен на странице
-
-
Процедура создает страницу, если страницы с таким именем нет.
-
Время создания страницы выставляется текущее время.
-
Процедура записывает новую редакцию страницы, если text не соответствует последней радакчии.
-
Если текст полностью идентичен последней редакции, то процедура ничего не изменяет в базе.
-
-
=cut
-
-
-
sub write_wiki_trac {
-
my ($file, $name, $author, $text) = @_;
-
-
my $dbh = DBI->connect("dbi:SQLite:dbname=$file","","", { RaiseError => 1, PrintError => 0 }) or die "Failed to connect to SQLite filesystem digest cache database at $file: " . DBI->errstr;
-
-
$dbh->{unicode} = 1;
-
-
# Нахожу последнюю версию страницы
-
my $sth = $dbh->prepare("SELECT * FROM wiki WHERE name='$name' ORDER BY version DESC LIMIT 1");
-
-
$sth->execute();
-
-
my $result = $sth->fetchrow_hashref;
-
-
# Несколько дурацких строк ниже, чтобы избавится от warning "Use of uninitialized value in concatenation"
-
my $text_db;
-
if ( $result->{text} ) {
-
$text_db = $result->{text};
-
} else {
-
$text_db = "";
-
}
-
-
# Записываем только если текст отличается от того, который сейчас в бд
-
if ( $text_db ne $text ) {
-
-
my $version;
-
-
unless ( $result->{version} ) {
-
$version = 1;
-
} else {
-
$version = $result->{version}+1;
-
}
-
-
$sth = $dbh->prepare("INSERT INTO wiki (name, version, time, author, text, ipnr, readonly, comment) VALUES ('$name', '$version', $time, '$author', '$text', '127.0.0.1', 0, '')");
-
$sth->execute();
-
}
-
-
return 1;
-
}
-
-
-
# проверка работы процедуры:
-
my $file = "/var/trac/test/db/trac.db";
-
&write_wiki_trac($file, "SandBox", "tester", "New page content");
Триадж
Наверное, самое глубокое и одновременно простое, что я вычитал по менеджементу за последний год:
Триаж — термин в менеджменте, применяемый для процесса выбора задач для выполнения, в ситуациях когда выполнить все задачи заведомо невозможно. В этом случае, по принципу медицинской сортировки, выбираются только самые важные задачи, у которых есть шанс быть завершенными.
Эта цитата взята с русской википедии, а вообще на это я наткнулся при изучении, как организован процесс разаботки системы Trac.
PS причем впервые мне про это рассказали года полтора назад, вот действительно "слушал, но не слышал".
Отправка списка открытых тикетов trac-а на почту
Появилась задачка: есть система trac, в 8 часов утра нужно сбрасывать на определенную почту список активных тикетов с определенным владельцем.
Решил все это дело написанием скрипта на perl, который засовывается в кронтаб.
Решение не идеальное, но свою задачу решает:
-
#! /usr/bin/perl
-
-
use strict;
-
use warnings;
-
-
use DBI;
-
-
###
-
### Start - Переменные значение которых нужно переопределить, для того, чтобы скрипт работалY
-
-
# Путь к базе трака
-
my $file = "/var/trac/test/db/trac.db";
-
-
# Кто должен быть владельцем тикета
-
my $owner = "bessarabov";
-
-
# Мыло на которое нужно отсылать полученные данные
-
my $email = "ivan\@bessarabov.ru";
-
-
### End - Переменные значение которых нужно переопределить, для того, чтобы скрипт работалY
-
###
-
-
-
# Подключаюсь к базе данных трака
-
my $dbh = DBI->connect("dbi:SQLite:dbname=$file","","", { RaiseError => 1, PrintError => 0 }) or die "Failed to connect to SQLite filesystem digest cache database at $file: " . DBI->errstr;
-
-
$dbh->{unicode} = 1;
-
-
# Запрос, который выдает список всех активных тикетов для указанного пользователя
-
my $sth = $dbh->prepare("
-
SELECT id, summary
-
FROM ticket
-
WHERE
-
status IN ('new', 'assigned', 'reopened')
-
AND owner = '$owner'
-
ORDER BY id");
-
-
$sth->execute();
-
-
# Переменная в которую я собираю всю необходимую мне инфу
-
my $content;
-
-
while (my $result = $sth->fetchrow_hashref) {
-
$content .= "#" . $result->{id} . " - ". $result->{summary} . "\n";
-
}
-
-
# Если есть хоть один тикет
-
if ($content) {
-
-
# тогда дописываю шапку
-
$content = "All active tickets for user $owner\n\n" . $content;
-
-
# и отправляю письмо
-
binmode MAIL, ":utf8";
-
print MAIL $content;
-
}
-
-
$sth->finish;
| M | T | W | T | F | S | S |
|---|---|---|---|---|---|---|
| « Jun | ||||||
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 | |||||