#!/usr/bin/perl
use strict;
use warnings;
use File::Basename;
use File::Spec;

#  Name:    br-install
#  Author:  Terry Neve
#  Created: Feb 2022
#
#  Program to determine and install build dependencies for a package.
#  It is designed to be called via Right-Click service menu in pkgutils.
#
#  Revisions:
#       20220218.01  Initial working version
#       20240524.01  Fix for new rpmbuild flags
#       20240623.01  Create .remove files


sub prompt {
  my ($query) = @_;
  local $| = 1;
  print $query;
  chomp(my $answer = <STDIN>);
  return $answer;
}

sub prompt_yn {
  my ($query) = @_;
  my $answer = prompt("$query (y/n): ");
  return lc($answer) eq 'y';
}

# Subroutine to generate a new filename if it already exists
sub generate_new_filename {
    my ($base, $ext) = @_;
    my $counter = 0;

    # Form the initial filename with .remove extension
    my $new_filename = $base . $ext;

    # Check if the filename already exists, and if so, increment the counter
    while (-e $new_filename) {
        $counter++;
        $new_filename = $base . ".$counter" . $ext;
    }

    return $new_filename;
}

my $specfile = shift or die "Usage:\n$0 spec-file\n";
my @packages;
my $instflag = undef;

open(LOG, '-|', "rpmbuild -bd $specfile 2>&1") || die "Can't open SPEC file: $!\n";

while (my $line = <LOG>) {
    if ($instflag) {
        if ($line =~ m#^\s+(\S+)\s+#) {
            push @packages, quotemeta($1);
        }
    }
    else {
        if ($line =~ m/Failed build dependencies:/i) {
            $instflag = 1;
        }
        else {
            if ($line =~ m/^Error:/i) {
                if ($line =~ m/no such file/i) {
                    print $line;
                    print "Please place all required source files in the SOURCES folder.\n";
                    exit 1;
                }
            }
            $instflag = undef;
        }
    }
}

if (@packages) {
    if (prompt_yn("Do \"apt-get-update\" first?")) {
        print "Getting root priviledge\n";
        system(qq(su -c "apt-get -y update"));
    }
    my ($base, $dir, $ext) = fileparse($specfile, qr/\.[^.]*/);
    my $remove_file = generate_new_filename(File::Spec->catfile($dir, $base), ".remove");
    print "Getting root priviledge\n";
    system(qq(su -c "apt-get install @packages | tee $remove_file"));
}
else {
    printf("Nothing to do for $specfile\n");
}

exit 0;
