[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