# SPDX-FileCopyrightText: 2012, 2013 Michael Pyne <mpyne@kde.org>
#
# SPDX-License-Identifier: GPL-2.0-or-later

package ksb::Updater::KDEProjectMetadata 0.30;

# Updater used only to specifically update the "repo-metadata" module
# used for storing dependency information, among other things.
#
# Note: 2020-06-20 the previous "kde-build-metadata" module was combined into
# the "repo-metadata" module, under the '/dependencies' folder.

use ksb;

use parent qw(ksb::Updater::KDEProject);

use ksb::BuildException;
use ksb::Debug;
use ksb::IPC::Null;
use ksb::Util;

use JSON::PP;

sub name
{
    return 'metadata';
}

# Returns a list of the full kde-project paths for each module to ignore.
sub ignoredModules
{
    my $self = assert_isa(shift, 'ksb::Updater::KDEProjectMetadata');
    my $path = $self->module()->fullpath('source') . "/dependencies/build-script-ignore";

    # Now that we in theory have up-to-date source code, read in the
    # ignore file and propagate that information to our context object.

    my $fh = pretend_open($path) or
        croak_internal("Unable to read ignore data from $path: $!");

    my $ctx = $self->module()->buildContext();
    my @ignoreModules = map  { chomp $_; $_ } # 3 Remove newlines
                        grep { !/^\s*$/ }     # 2 Filter empty lines
                        map  { s/#.*$//; $_ } # 1 Remove comments
                        (<$fh>);
    close($fh);
    return @ignoreModules;
}

# If JSON support is present, and the metadata has already been downloaded
# (e.g. with ->updateInternal), returns a hashref to the logical module group
# data contained within the kde-build-metadata, decoded from its JSON format.
# See https://community.kde.org/Infrastructure/Project_Metadata
sub logicalModuleGroups
{
    my $self = shift;
    my $path = $self->module()->fullpath('source') . "/dependencies/logical-module-structure.json";

    # The {} is an empty JSON obj to support pretend mode
    my $fh = pretend_open($path, '{}') or
        croak_internal("Unable to read logical module structure: $!");

    my ($json_hashref, $e) = do {
        local $/; # The 'local $/' disables line-by-line reading; slurps the whole file
        undef $@;
        my $json = eval { decode_json(<$fh>) };
        close $fh;

        ($json, $@); # Implicit return
    };

    croak_runtime ("Unable to load module group data from $path! :(\n\t$e") if $e;
    return $json_hashref;
}

sub updateInternal ($self, $ipc = ksb::IPC::Null->new())
{
    return $self->_mockTestMetadata()
        if isTesting();

    $self->SUPER::updateInternal($ipc);
}

sub _mockTestMetadata($self)
{
    # Nothing to do currently, mock data is handled directly by
    # ksb::Application (dependencies) or ksb::KDEProjectReader (project
    # metadata).
}

1;
