get_package_dependencies Subroutine

public subroutine get_package_dependencies(package, main, deps)

Arguments

Type IntentOptional Attributes Name
type(package_config_t), intent(in) :: package

Parsed package meta data

logical, intent(in) :: main

Is the main project

type(dependency_config_t), intent(out), allocatable :: deps(:)

Unprocessed list of all dependencies listed in this manifest


Source Code

    subroutine get_package_dependencies(package, main, deps)

        !> Parsed package meta data
        type(package_config_t), intent(in) :: package
        
        !> Is the main project
        logical, intent(in) :: main        
        
        !> Unprocessed list of all dependencies listed in this manifest
        type(dependency_config_t), allocatable, intent(out) :: deps(:)
        
        integer :: ndeps,k
        
        ndeps = 0
        if (allocated(package%dependency)) &
        ndeps = ndeps + size(package%dependency)
        
        if (main) then 
        
            if (allocated(package%dev_dependency)) &
            ndeps = ndeps + size(package%dev_dependency)
                    
            if (allocated(package%example)) then
               do k = 1, size(package%example)
                  if (allocated(package%example(k)%dependency)) &
                  ndeps = ndeps + size(package%example(k)%dependency)
               end do
            end if

            if (allocated(package%executable)) then
               do k = 1, size(package%executable)
                  if (allocated(package%executable(k)%dependency)) &
                  ndeps = ndeps + size(package%executable(k)%dependency)
               end do
            end if
            
            if (allocated(package%test)) then
               do k = 1, size(package%test)
                  if (allocated(package%test(k)%dependency)) &
                  ndeps = ndeps + size(package%test(k)%dependency)
               end do
            end if     
        
        endif   
        
        allocate(deps(ndeps))
        
        if (ndeps > 0) then
           
           ndeps = 0
           
           if (allocated(package%dependency)) &
           call collect(deps,ndeps,package%dependency)
           
           if (main) then 
           
               if (allocated(package%dev_dependency)) &
               call collect(deps,ndeps,package%dev_dependency)
               
               if (allocated(package%example)) then
                  do k = 1, size(package%example)
                     if (allocated(package%example(k)%dependency)) &
                     call collect(deps,ndeps,package%example(k)%dependency)
                  end do
               end if
               if (allocated(package%executable)) then
                  do k = 1, size(package%executable)
                     if (allocated(package%executable(k)%dependency)) &
                     call collect(deps,ndeps,package%executable(k)%dependency)
                  end do
               end if
               if (allocated(package%test)) then
                  do k = 1, size(package%test)
                     if (allocated(package%test(k)%dependency)) &
                     call collect(deps,ndeps,package%test(k)%dependency)
                  end do
               end if    
           
           endif
         
         endif

      contains
      
         ! Add dependencies to the list      
         pure subroutine collect(list, nreq, new_deps)
            type(dependency_config_t), intent(inout) :: list(:)
            integer,                   intent(inout) :: nreq
            type(dependency_config_t), intent(in)    :: new_deps(:)
            
            integer :: i
            do i = 1, size(new_deps)
               nreq = nreq + 1
               list(nreq) = new_deps(i)
            end do
         end subroutine collect
        
    end subroutine get_package_dependencies