HOWTO: Собственный репозиторий

Оригинальная Статья в WiKi

Допустим у вас есть папка собранных вами пакетов (aur или собственные PKGBUILD'ы, это не важно). У вас есть огромное желание поделиться этим счастьем с народом или просто упорядочить. Для этого можно создать репозиторий.
Специально для такого дела мной был сперт с wiki скрипт и доведен до ума.
Сам скрипт на перле:
#!/usr/bin/perl
use strict;
unless (defined $ARGV[0] && defined $ARGV[1]){
	print STDERR "\nUsage: gendb <DIR> <NAME>\n\n";
	exit 1;
}
`rm -rf /tmp/pkgdb`;
opendir(DIR, $ARGV[0]) || die "Can't open dir $ARGV[0]: $!";
while(my $file=readdir(DIR)){
	if($file =~ /^(.+)\.pkg.tar.gz$/){
		my $pkg = $1;
		my @filedata=stat($ARGV[0]."/".$file);
		my %info = ();
		my $i;
		print STDERR "Processing $file\n";
		`mkdir -p /tmp/pkgdb/$pkg`;
		`rm -f /tmp/PKGINFO ; tar -O -xzf $ARGV[0]/$file .PKGINFO > /tmp/PKGINFO`;
		open(INPUT,  "/tmp/PKGINFO")  || die "can't open PKGINFO file: $!";
		while(<INPUT>)
		{
			chomp;
			if( /^([a-z]+)\s?[=]\s?(.+)$/ )
			{
				my $attr = $1;
				my $value = $2;
				$info{$attr} .= $value." ";
			}
		}
		close(INPUT);
		open(OUT,  "> /tmp/pkgdb/$pkg/desc")  || die "can't open desc file: $!";
		print OUT "\%NAME\%\n".$info{"pkgname"}."\n\n";
		print OUT "\%VERSION\%\n".$info{"pkgver"}."\n\n";
		print OUT "\%DESC\%\n".$info{"pkgdesc"}."\n\n";
		print OUT "\%CSIZE\%\n".$filedata[7]."\n\n";
		print OUT "\%MD5SUM\%\n";
		close(OUT);
		`md5sum $ARGV[0]/$file | cut -f1 -d' ' >> /tmp/pkgdb/$pkg/desc`;
		open(OUT,  ">> /tmp/pkgdb/$pkg/desc")  || die "can't open desc file: $!";
		print OUT "\n\%REPLACES\%\n";
		foreach $i (split(' ',$info{"replaces"})){ print OUT $i."\n";}
		print OUT "\n";
		close(OUT);
		open(OUT,  "> /tmp/pkgdb/$pkg/depends")  || die "can't open depends file: $!";
		print OUT "\%DEPENDS\%\n";
		foreach $i (split(' ',$info{"depend"})){ print OUT $i."\n";}
		print OUT "\n";
		print OUT "\%CONFLICTS\%\n";
		foreach $i (split(' ',$info{"conflict"})){ print OUT $i."\n";}
		print OUT "\n";
		print OUT "\%PROVIDES\%\n";
		foreach $i (split(' ',$info{"provides"})){ print OUT $i."\n";}
		print OUT "\n";
		close(OUT);
	}
}
closedir DIR;
`cd /tmp/pkgdb ; tar -czf $ARGV[1].db.tar.gz *`;
`cp /tmp/pkgdb/$ARGV[1].db.tar.gz $ARGV[0]/`
Поместите содержимое скрипта в файл gendb и укажите, что он исполняемый:
chmod +x gendb
После этого скриптом уже можно пользоваться и натравливать на папку с пакетами в таком стиле:
./gendb /путь/к/папке название_репозитория
Скрипт сделает свое грязное дело, а в папке появится файл название_репозитория.db.tar.gz
Все! теперь репозиторий готов к использованию.
Остается только добавить репозиторий в /etc/pacman.conf и синхронизировать базы.
Замечу, что чем выше находится репозиторий в /etc/pacman.conf, тем больше у него приоритет.

Замечание, если вы правили /etc/make.conf и конкретно архитектуру, будьте добры, укажите это в описании репозитория, не у всех железо, как у вас.
Ага. Представляю, сейчас все кинулись делать свои репозитарии… А основным отличием АрчЛинукса через пол-года от других будет многоМегабайтный pacman.conf  со всей тучей репозитарев…
Ладно, простите за оффтоп  :) Попробуем этот скриптик…

P.S. Кстати, нарисовалась одна тема. Несколько не связанных Арч`машин. С одной апдейтить остальные. Как по-безболезненней..?.
Alexxx
P.S. Кстати, нарисовалась одна тема. Несколько не связанных Арч`машин. С одной апдейтить остальные. Как по-безболезненней..?.

вариантов два
1) создать локальное зеркало репозитариев. и ежечасно/дневно рсинкать (я так делаю)
2) на машине одной из машин расшаривается кеш, а на других этот кеш монтируется в /var/cache….
zeus
Alexxx
P.S. Кстати, нарисовалась одна тема. Несколько не связанных Арч`машин. С одной апдейтить остальные. Как по-безболезненней..?.

вариантов два
1) создать локальное зеркало репозитариев. и ежечасно/дневно рсинкать (я так делаю)
2) на машине одной из машин расшаривается кеш, а на других этот кеш монтируется в /var/cache….
Угу, спасибо, это конечно оно так, но я спрашивал:  не связанных Арч`машин, тобиш нет общей сети.
Alexxx
Угу, спасибо, это конечно оно так, но я спрашивал:  не связанных Арч`машин, тобиш нет общей сети.
упс!. тада просто кеш сливать и переносить.
pacman -Sy все равно придется делать, ил тогда вручную ставить пакеты. Хотя опять-таки можно сделать репозиторий из кэша :)
zeus
упс!. тада просто кеш сливать и переносить.
Ну да, сейчас так и делаю, не очень то красиво конечно, лишняя колготня с бакапами и пересозданием (удалением старого) кешей, пока через несколько часов принесёшь этот кеш на другую машину, к примеру, синхронизируешься через GPRS, появляются новые обновления, забиваешь из в pacman.conf в IgnorePkg, в следующий раз убираешь их, добавляешь что-то другое, - в общем маразм. Хотелось бы знать как это нормально должно делаться.
pacman -Sc чистит кэш ;) )))
bobrik
pacman -Sc чистит кэш ;) )))
а -Scc сносит его напрочь, это-то понятно. Наверно пока лучший выход это из вновь обновлённого кеша делать локальный репозитарий и при переносе синхронизироваться только с ним. Видимо так…
Ну а как это сделать я уже написал ;) )
 
Зарегистрироваться или войдите чтобы оставить сообщение.