[devel] Gear и внешние VCS.
Igor Vlasenko
vlasenko на imath.kiev.ua
Чт Июн 19 22:20:35 MSK 2014
On Thu, Jun 19, 2014 at 09:02:06PM +0400, Anton Farygin wrote:
> Игорь, я же говорю - remotes надо описывать в watch файле.
На watch файлы в свое время было много нареканий, что сложный в
освоении и запутанный формат. Основная причина, почему я взялся -
это много тысяч готовых watch файлов, которые можно скопировать
не читая из дистрибутивов, основанных на debian.
git+gear -- alt специфический, там нет такой необходимости
быть с чем-то совместимым. плюс специфика кода, я много
усилий вложил в минимизацию diff с debian в участках кода,
работающего с watch файлами, чтобы можно было бесконфликтно
мержится с debian. Не хочется опять все ломать.
Просто посмотрите на .gear/upstream/remotes, что это такой
хитрый watch файл для git tags, а git-config -- это
такой у него формат.
Прилагаю к письму proof-of-concept скрипт,
"watch для gear tags", test-tag-watch.
пока поддерживает только стандартные теги v на version@ и @version@,
для работы нужно скопировать секцию remote из .git/config
в .gear/upstream/remotes.
Проверьте у себя, пожалуйста. При запуске в корне gear репозитория
должен выдать что-то вроде "Repository is up to date."
> >он выполнил свой долг, создав файл .gear/upstream/remotes.
> Зачем эта информация сообществу ?
Меня тоже надо услышать. Мне лично и прямо сейчас такая информация
уже нужна для пакетов perl-*. Я ведь не исключен из сообщества?
А по закону больших чисел такая информация понадобится не раз и не
два еще не одному десятку майнтайнеров. Да, у нас массовые обновления
и исправления пакетов не очень распространены. Но не потому, что
не нужны, а потому что требуется слишком много усилий из-за
несовершенства инструментов.
--
I V
----------- следующая часть -----------
#!/usr/bin/perl
use strict;
use warnings;
use RPM::uscan;
my $pattern='v?([\d\.]*\d)';
my $pkg_dir='.';
my $debug=0;
print 'remotes=', join("\n",get_remotes($pkg_dir)),"\n" if $debug;
my @tags=get_tags();
@tags = map {$_->[0]} Devscripts::Versort::upstream_versort(map {[$_,$_]}@tags);
print 'tags=', join(" ", на tags),"\n" if $debug;
my (undef, $upackage, $uversion) = RPM::uscan::altlinux_guess_package_and_version($pkg_dir);
my $version_cmp=Devscripts::Versort::myvercmp($uversion, $tags[0]);
if ($version_cmp>1) {
print "Oops! local repository ($uversion) is ahead of remote repository ($tags[0]).\n";
} elsif ($version_cmp==0) {
print "repository is up to date.\n";
} else {
print "New version $tags[0] is available.\n";
}
sub get_tags {
my @tags;
foreach my $remote (&get_remotes($pkg_dir)) {
foreach my $tag (&exec2array('git ls-remote --tags '.$remote)) {
$tag=~s!^\S+\s+refs/tags/!!;
$tag=~s!\^\{\}$!!;
#print "testing: $tag\n";
push @tags, $1 if $tag=~/^$pattern$/;
}
}
return @tags;
}
sub exec2array {
my ($cmd)=@_;
my @out;
my $fn;
open ($fn, "$cmd |") or die "$!: can't exec $cmd\n";
local $_;
while (<$fn>) {
chomp;
push @out, $_;
}
close ($fn);
#print 'out=', join(";", на out),"\n";
return @out;
}
sub get_remotes {
my ($pkg_dir)=@_;
my @remotes;
die "can't find $pkg_dir/.gear/upstream/remotes\n" unless -r $pkg_dir.'/.gear/upstream/remotes';
my $fn;
open ($fn, 'git config --file '.$pkg_dir.'/.gear/upstream/remotes --list|') or die "$!: can't open .gear/upstream/remotes\n";
local $_;
while (<$fn>) {
chomp;
next unless /^remote\.([^\.]+)\.url=(\S+)/;
my $remote=$1;
#my $url=$2;
push @remotes, $remote;
}
close ($fn);
my %local_remotes=map{$_=>1} &exec2array('git remote');
foreach my $remote (@remotes) {
die "Oops: remote $remote is present in .gear/upstream/remotes, but not in .git/config!\n" unless $local_remotes{$remote};
}
return @remotes;
}
Подробная информация о списке рассылки Devel