view rust/hg-core/src/testing.rs @ 48409:005ae1a343f8

rhg: add support for narrow clones and sparse checkouts This adds a minimal support that can be implemented without parsing the narrowspec. We can parse the narrowspec and add support for more operations later. The reason we need so few code changes is as follows: Most operations need no special treatment of sparse because some of them only read dirstate (`rhg files` without `-r`), which bakes in the filtering, some of them only read store (`rhg files -r`, `rhg cat`), and some of them read no data at all (`rhg root`, `rhg debugrequirements`). `status` is the command that might care about sparse, so we just disable rhg on it. For narrow clones, `rhg files` clearly needs the narrowspec to work correctly, so we fall back. `rhg cat` seems to work consistently with `hg cat` if the file exists. If the file is hidden by narrow spec, the error message is different and confusing, so that's something that we should improve in follow-up patches. Differential Revision: https://phab.mercurial-scm.org/D11764
author Arseniy Alekseyev <aalekseyev@janestreet.com>
date Tue, 16 Nov 2021 11:53:58 +0000
parents 168041fa6d5f
children 4c5f6e95df84
line wrap: on
line source

// testing.rs
//
// Copyright 2018 Georges Racinet <georges.racinet@octobus.net>
//
// This software may be used and distributed according to the terms of the
// GNU General Public License version 2 or any later version.

use crate::{Graph, GraphError, Revision, NULL_REVISION};

/// A stub `Graph`, same as the one from `test-ancestor.py`
///
/// o  13
/// |
/// | o  12
/// | |
/// | | o    11
/// | | |\
/// | | | | o  10
/// | | | | |
/// | o---+ |  9
/// | | | | |
/// o | | | |  8
///  / / / /
/// | | o |  7
/// | | | |
/// o---+ |  6
///  / / /
/// | | o  5
/// | |/
/// | o  4
/// | |
/// o |  3
/// | |
/// | o  2
/// |/
/// o  1
/// |
/// o  0
#[derive(Clone, Debug)]
pub struct SampleGraph;

impl Graph for SampleGraph {
    fn parents(&self, rev: Revision) -> Result<[Revision; 2], GraphError> {
        match rev {
            0 => Ok([NULL_REVISION, NULL_REVISION]),
            1 => Ok([0, NULL_REVISION]),
            2 => Ok([1, NULL_REVISION]),
            3 => Ok([1, NULL_REVISION]),
            4 => Ok([2, NULL_REVISION]),
            5 => Ok([4, NULL_REVISION]),
            6 => Ok([4, NULL_REVISION]),
            7 => Ok([4, NULL_REVISION]),
            8 => Ok([NULL_REVISION, NULL_REVISION]),
            9 => Ok([6, 7]),
            10 => Ok([5, NULL_REVISION]),
            11 => Ok([3, 7]),
            12 => Ok([9, NULL_REVISION]),
            13 => Ok([8, NULL_REVISION]),
            r => Err(GraphError::ParentOutOfRange(r)),
        }
    }
}

// A Graph represented by a vector whose indices are revisions
// and values are parents of the revisions
pub type VecGraph = Vec<[Revision; 2]>;

impl Graph for VecGraph {
    fn parents(&self, rev: Revision) -> Result<[Revision; 2], GraphError> {
        Ok(self[rev as usize])
    }
}