trac

Случайное совпадение

Выбирал hostname машины, на которой будет находится трак и свн. Хотел выбрать название из древнегреческих богов(пытался найти бога памяти), не нашел. Следующая идея — нужно сервер назвать как один из спутников Юпитера. Первый спутник Юпитера - Метида назван в честь древнегреческой богини мудрости Метиды, первой супруги Зевса. =)

Tags: , ,

Friday, April 3rd, 2009 Uncategorized Comments Off

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

Tags: ,

Friday, February 13th, 2009 Uncategorized Comments Off

Ссылки из трака на другие траки

Система 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, правда даты этого релиза пока даже близко нет.

Tags:

Tuesday, January 20th, 2009 Uncategorized Comments Off

Perl процедура для обновления wiki страниц trac-а

Я очень люблю и много пользуюсь системой trac. У меня появилась необходимость обновлять вики страницы трака из внешних программ. Я написал крохотную процедуру на perl, чтобы это делать (и впервые воспользовался pod для ведения документации =):

PERL:
  1. #! /usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use DBI;
  6.  
  7. =head2 Структура таблицы wiki в траке
  8.  
  9.  CREATE TABLE wiki (
  10.     name text,
  11.     version integer,
  12.     time integer,
  13.     author text,
  14.     ipnr text,
  15.     text text,
  16.     comment text,
  17.     readonly integer,
  18.     UNIQUE (name,version)
  19. );
  20. CREATE INDEX wiki_time_idx ON wiki ( time);
  21.  
  22. =cut
  23.  
  24. =head2 sub write_wiki_trac
  25.  Процедуре передаются параметры:
  26.  
  27.   file - файл с базой данных trac
  28.   name - название страницы
  29.   author - кто будет автором редакции страницы
  30.   text - текст, который будет размещен на странице
  31.  
  32.  Процедура создает страницу, если страницы с таким именем нет.
  33.  Время создания страницы выставляется текущее время.
  34.  Процедура записывает новую редакцию страницы, если text не соответствует последней радакчии.
  35.  Если текст полностью идентичен последней редакции, то процедура ничего не изменяет в базе.
  36.  
  37. =cut
  38.  
  39.  
  40. sub write_wiki_trac {
  41.     my ($file, $name, $author, $text) = @_;
  42.    
  43.     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;
  44.  
  45.     $dbh->{unicode} = 1;
  46.  
  47.     # Нахожу последнюю версию страницы
  48.     my $sth = $dbh->prepare("SELECT * FROM wiki WHERE name='$name' ORDER BY version DESC LIMIT 1");
  49.  
  50.     $sth->execute();
  51.  
  52.     my $result = $sth->fetchrow_hashref;
  53.  
  54.     # Несколько дурацких строк ниже, чтобы избавится от warning "Use of uninitialized value in concatenation"
  55.     my $text_db;
  56.     if ( $result->{text} ) {
  57.         $text_db = $result->{text};
  58.     } else {
  59.         $text_db = "";
  60.     }
  61.  
  62.     # Записываем только если текст отличается от того, который сейчас в бд
  63.     if ( $text_db ne $text ) {
  64.  
  65.         my $version;
  66.        
  67.         unless ( $result->{version} ) {
  68.             $version = 1;
  69.         } else {
  70.             $version = $result->{version}+1;
  71.         }
  72.  
  73.         my $time = time();
  74.         $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, '')");
  75.         $sth->execute();
  76.     }
  77.  
  78.     return 1;
  79. }
  80.  
  81.  
  82. # проверка работы процедуры:
  83. my $file = "/var/trac/test/db/trac.db";
  84. &write_wiki_trac($file, "SandBox", "tester", "New page content");

Tags: ,

Friday, December 19th, 2008 Uncategorized Comments Off

Триадж

Наверное, самое глубокое и одновременно простое, что я вычитал по менеджементу за последний год:

Триаж — термин в менеджменте, применяемый для процесса выбора задач для выполнения, в ситуациях когда выполнить все задачи заведомо невозможно. В этом случае, по принципу медицинской сортировки, выбираются только самые важные задачи, у которых есть шанс быть завершенными.

Эта цитата взята с русской википедии, а вообще на это я наткнулся при изучении, как организован процесс разаботки системы Trac.

PS причем впервые мне про это рассказали года полтора назад, вот действительно "слушал, но не слышал".

Tags: ,

Thursday, November 13th, 2008 Uncategorized 1 Comment

Отправка списка открытых тикетов trac-а на почту

Появилась задачка: есть система trac, в 8 часов утра нужно сбрасывать на определенную почту список активных тикетов с определенным владельцем.

Решил все это дело написанием скрипта на perl, который засовывается в кронтаб.

Решение не идеальное, но свою задачу решает:

PERL:
  1. #! /usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use DBI;
  7.  
  8. ###
  9. ### Start - Переменные значение которых нужно переопределить, для того, чтобы скрипт работалY
  10.  
  11. # Путь к базе трака
  12. my $file = "/var/trac/test/db/trac.db";
  13.  
  14. # Кто должен быть владельцем тикета
  15. my $owner = "bessarabov";
  16.  
  17. # Мыло на которое нужно отсылать полученные данные
  18. my $email = "ivan\@bessarabov.ru";
  19.  
  20. ### End - Переменные значение которых нужно переопределить, для того, чтобы скрипт работалY
  21. ###
  22.  
  23.  
  24. # Подключаюсь к базе данных трака
  25. 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;
  26.  
  27. $dbh->{unicode} = 1;
  28.  
  29. # Запрос, который выдает список всех активных тикетов для указанного пользователя
  30. my $sth = $dbh->prepare("
  31. SELECT id, summary
  32. FROM ticket
  33. WHERE
  34.   status IN ('new', 'assigned', 'reopened')
  35.   AND owner = '$owner'
  36. ORDER BY id");
  37.  
  38. $sth->execute();
  39.  
  40. # Переменная в которую я собираю всю необходимую мне инфу
  41. my $content;
  42.  
  43. while (my $result = $sth->fetchrow_hashref) {
  44.     $content .= "#" . $result->{id} . " - ". $result->{summary} . "\n";
  45. }
  46.  
  47. # Если есть хоть один тикет
  48. if ($content) {
  49.  
  50.     # тогда дописываю шапку
  51.     $content = "All active tickets for user $owner\n\n" . $content;
  52.  
  53.     # и отправляю письмо
  54.     open(MAIL, "|mail $email -s 'All active tickets for user $owner'") or die "Cannot open mail: $!";
  55.     binmode MAIL, ":utf8";
  56.     print MAIL $content;
  57.     close(MAIL);
  58. }
  59.  
  60. $sth->finish;

Tags: ,

Wednesday, July 23rd, 2008 Uncategorized Comments Off