pray-core 1.22.0

Core library for Prayfile, the package manager for the language placed before inference
Documentation
use super::{source_map, ResolvedProject};
use crate::config::load_user_config;
use crate::lockfile::Lockfile;
use crate::package_upstream::{overlay_drift_line, overlay_file_changes};
use crate::resolve_context::ResolveOptions;
use crate::resolve_git_sources::prepare_git_sources;
use crate::PrayResult;

use super::input_output::{content_file_bytes, local_content_for_refresh};
use super::resolution_context::UpstreamResolutionContext;

pub fn path_fork_drift_lines(
    project: &ResolvedProject,
    previous: Option<&Lockfile>,
    options: &ResolveOptions,
) -> PrayResult<Vec<String>> {
    let user_config = load_user_config()?;
    let git_sources = prepare_git_sources(
        &project.project_root,
        &project.manifest.sources,
        previous,
        options,
    )?;
    let sources = source_map(&project.manifest.sources);
    let mut lines = Vec::new();
    for package in &project.packages {
        if package.declaration.path.is_none() {
            continue;
        }
        let Some(upstream) = &package.upstream else {
            continue;
        };
        let resolution_context = UpstreamResolutionContext::new(
            &project.project_root,
            &sources,
            &git_sources,
            &user_config,
            previous,
            options,
        );
        let resolved = resolution_context.resolve(
            &upstream.name,
            &format!("= {}", upstream.version),
            upstream.source.as_deref(),
        )?;
        let upstream_content = content_file_bytes(&resolved.root, &resolved.spec)?;
        let local_content = local_content_for_refresh(&package.root, &package.spec)?;
        if local_content.is_empty() {
            lines.push(format!(
                "{} has no content files; run pray install to copy {} {}",
                package.declaration.name, upstream.name, upstream.version
            ));
            continue;
        }
        for (path, change) in overlay_file_changes(&local_content, &upstream_content) {
            lines.push(overlay_drift_line(
                &package.declaration.name,
                &upstream.name,
                &upstream.version,
                &path,
                &change,
            ));
        }
    }
    Ok(lines)
}