1
0
Fork 0
devscripts/lib/Devscripts/Uscan/git.pm
Daniel Baumann b543f2e88d
Adding upstream version 2.25.15.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-21 11:04:07 +02:00

192 lines
6.4 KiB
Perl

package Devscripts::Uscan::git;
use strict;
use Cwd qw/abs_path/;
use Devscripts::Uscan::Output;
use Devscripts::Uscan::Utils;
use Devscripts::Uscan::_vcs;
use Dpkg::IPC;
use File::Path 'remove_tree';
use Moo::Role;
######################################################
# search $newfile $newversion (git mode/versionless)
######################################################
sub git_search {
my ($self) = @_;
my ($newfile, $newversion);
if ($self->versionless) {
$newfile = $self->parse_result->{filepattern}; # HEAD or heads/<branch>
if ($self->pretty eq 'describe') {
$self->git->{mode} = 'full';
}
if ( $self->git->{mode} eq 'shallow'
and $self->parse_result->{filepattern} eq 'HEAD') {
uscan_exec(
'git',
'clone',
'--quiet',
'--bare',
'--depth=1',
$self->parse_result->{base},
"$self->{downloader}->{destdir}/" . $self->gitrepo_dir
);
$self->downloader->gitrepo_state(1);
} elsif ($self->git->{mode} eq 'shallow'
and $self->parse_result->{filepattern} ne 'HEAD')
{ # heads/<branch>
$newfile =~ s&^heads/&&; # Set to <branch>
uscan_exec(
'git',
'clone',
'--quiet',
'--bare',
'--depth=1',
'-b',
"$newfile",
$self->parse_result->{base},
"$self->{downloader}->{destdir}/" . $self->gitrepo_dir
);
$self->downloader->gitrepo_state(1);
} else {
uscan_exec(
'git', 'clone', '--quiet', '--bare',
$self->parse_result->{base},
"$self->{downloader}->{destdir}/" . $self->gitrepo_dir
);
$self->downloader->gitrepo_state(2);
}
if ($self->pretty eq 'describe') {
# use unannotated tags to be on safe side
spawn(
exec => [
'git',
"--git-dir=$self->{downloader}->{destdir}/$self->{gitrepo_dir}",
'describe',
'--tags'
],
wait_child => 1,
to_string => \$newversion
);
$newversion =~ s/-/./g;
chomp($newversion);
if (
mangle(
$self->watchfile, \$self->line,
'uversionmangle:', \@{ $self->uversionmangle },
\$newversion
)
) {
return undef;
}
} else {
my $tmp = $ENV{TZ};
$ENV{TZ} = 'UTC';
$newfile
= $self->parse_result->{filepattern}; # HEAD or heads/<branch>
if ($self->parse_result->{filepattern} eq 'HEAD') {
spawn(
exec => [
'git',
"--git-dir=$self->{downloader}->{destdir}/$self->{gitrepo_dir}",
'log',
'-1',
"--date=format-local:$self->{date}",
"--pretty=$self->{pretty}"
],
wait_child => 1,
to_string => \$newversion
);
} else {
$newfile =~ s&^heads/&&; # Set to <branch>
spawn(
exec => [
'git',
"--git-dir=$self->{downloader}->{destdir}/$self->{gitrepo_dir}",
'log',
'-1',
'-b',
"$newfile",
"--date=format-local:$self->{date}",
"--pretty=$self->{pretty}"
],
wait_child => 1,
to_string => \$newversion
);
}
$ENV{TZ} = $tmp;
chomp($newversion);
}
}
################################################
# search $newfile $newversion (git mode w/tag)
################################################
elsif ($self->mode eq 'git') {
my @args = ('ls-remote', $self->parse_result->{base});
# Try to use local upstream branch if available
if (-d '.git') {
my $out;
eval {
spawn(
exec => ['git', 'remote', '--verbose', 'show'],
wait_child => 1,
to_string => \$out
);
};
# Check if git repo found in debian/watch exists in
# `git remote show` output
if ($out and $out =~ /^(\S+)\s+\Q$self->{parse_result}->{base}\E/m)
{
$self->downloader->git_upstream($1);
uscan_warn
"Using $self->{downloader}->{git_upstream} remote origin";
# Found, launch a "fetch" to be up to date
spawn(
exec => ['git', 'fetch', $self->downloader->git_upstream],
wait_child => 1
);
@args = ('show-ref');
}
}
($newversion, $newfile)
= get_refs($self, ['git', @args], qr/^\S+\s+([^\^\{\}]+)$/, 'git');
return undef if !defined $newversion;
}
return ($newversion, $newfile);
}
sub git_upstream_url {
my ($self) = @_;
my $upstream_url
= $self->parse_result->{base} . ' ' . $self->search_result->{newfile};
return $upstream_url;
}
*git_newfile_base = \&Devscripts::Uscan::_vcs::_vcs_newfile_base;
sub git_clean {
my ($self) = @_;
# If git cloned repo exists and not --debug ($verbose=2) -> remove it
if ( $self->downloader->gitrepo_state > 0
and $verbose < 2
and !$self->downloader->git_upstream) {
my $err;
uscan_verbose "Removing git repo ($self->{downloader}->{destdir}/"
. $self->gitrepo_dir . ")";
remove_tree "$self->{downloader}->{destdir}/" . $self->gitrepo_dir,
{ error => \$err };
if (@$err) {
local $, = "\n\t";
uscan_warn "Errors during git repo clean:\n\t@$err";
}
$self->downloader->gitrepo_state(0);
} else {
uscan_debug "Keep git repo ($self->{downloader}->{destdir}/"
. $self->gitrepo_dir . ")";
}
return 0;
}
1;