From 84ad0bb2673a1c687b9d41bfabb990abd13d7a44 Mon Sep 17 00:00:00 2001 From: Muir Manders Date: Mon, 4 Mar 2024 14:46:53 -0800 Subject: [PATCH] revsets: support resolving revision numbers in Rust Summary: I wasn't planning on doing this, but I realized that Rust returns the wrong commit when a revnum looks like a valid hash prefix. This will make it easier to turn on Rust checkout in existing tests. Previously I was updating revnum usage in "update" commands to use the "desc(...)" revset, but that isn't ideal since it won't actually use the Rust checkout. Reviewed By: sggutier Differential Revision: D54037554 fbshipit-source-id: 8755733f912728916f3c5a959efdb21ddc1b873b --- .../config/loader/src/builtin_static/core.rs | 1 + eden/scm/lib/revsets/Cargo.toml | 1 + eden/scm/lib/revsets/TARGETS | 1 + eden/scm/lib/revsets/src/utils.rs | 43 ++++++++++++++++--- eden/scm/sapling/configitems.py | 1 - eden/scm/tests/test-hgrc.t | 1 + eden/scm/tests/test-shelve.t | 1 + 7 files changed, 41 insertions(+), 8 deletions(-) diff --git a/eden/scm/lib/config/loader/src/builtin_static/core.rs b/eden/scm/lib/config/loader/src/builtin_static/core.rs index f6844a6d4f2e3..a36bfedbe6218 100644 --- a/eden/scm/lib/config/loader/src/builtin_static/core.rs +++ b/eden/scm/lib/config/loader/src/builtin_static/core.rs @@ -21,6 +21,7 @@ repackfactor=3 timeout=600 color=auto paginate=true +ignorerevnum=True [checkout] resumable=true diff --git a/eden/scm/lib/revsets/Cargo.toml b/eden/scm/lib/revsets/Cargo.toml index e64f9ccb422ab..11610347f98c2 100644 --- a/eden/scm/lib/revsets/Cargo.toml +++ b/eden/scm/lib/revsets/Cargo.toml @@ -12,6 +12,7 @@ async-runtime = { version = "0.1.0", path = "../async-runtime" } configmodel = { version = "0.1.0", path = "../config/model" } dag = { version = "0.1.0", path = "../dag" } edenapi = { version = "0.1.0", path = "../edenapi" } +hgplain = { version = "0.1.0", path = "../util/hgplain" } metalog = { version = "0.1.0", path = "../metalog" } refencode = { version = "0.1.0", path = "../refencode" } thiserror = "1.0.49" diff --git a/eden/scm/lib/revsets/TARGETS b/eden/scm/lib/revsets/TARGETS index c3bc460a43052..f692362cff147 100644 --- a/eden/scm/lib/revsets/TARGETS +++ b/eden/scm/lib/revsets/TARGETS @@ -24,5 +24,6 @@ rust_library( "//eden/scm/lib/refencode:refencode", "//eden/scm/lib/treestate:treestate", "//eden/scm/lib/types:types", + "//eden/scm/lib/util/hgplain:hgplain", ], ) diff --git a/eden/scm/lib/revsets/src/utils.rs b/eden/scm/lib/revsets/src/utils.rs index 927fe948f9439..fd6af6687bd46 100644 --- a/eden/scm/lib/revsets/src/utils.rs +++ b/eden/scm/lib/revsets/src/utils.rs @@ -11,9 +11,12 @@ use anyhow::anyhow; use anyhow::bail; use anyhow::Context; use anyhow::Result; +use async_runtime::block_on; use configmodel::Config; +use configmodel::ConfigExt; use dag::ops::IdConvert; use dag::DagAlgorithm; +use dag::Id; use dag::Vertex; use edenapi::EdenApi; use metalog::MetaLog; @@ -21,6 +24,8 @@ use refencode::decode_bookmarks; use refencode::decode_remotenames; use treestate::treestate::TreeState; use types::hgid::NULL_ID; +use types::hgid::WDIR_ID; +use types::hgid::WDIR_REV; use types::HgId; use crate::errors::RevsetLookupError; @@ -56,6 +61,7 @@ pub fn resolve_single( let fns = [ resolve_special, resolve_dot, + resolve_revnum, resolve_bookmark, resolve_hash_prefix, ]; @@ -78,15 +84,13 @@ fn resolve_special(args: &LookupArgs) -> Result> { } if let Some(tip) = args.metalog.get(args.change_id)? { - if async_runtime::block_on(async { - args.id_map.contains_vertex_name(&tip.clone().into()).await - })? { + if block_on(async { args.id_map.contains_vertex_name(&tip.clone().into()).await })? { return Ok(Some(HgId::from_slice(&tip).context("metalog tip")?)); } } Ok(Some( - async_runtime::block_on(async { args.dag.all().await?.first().await })? + block_on(async { args.dag.all().await?.first().await })? .map_or_else(|| Ok(NULL_ID), |v| HgId::from_slice(v.as_ref()))?, )) } @@ -131,7 +135,7 @@ fn resolve_hash_prefix(args: &LookupArgs) -> Result> { } }; - if async_runtime::block_on(async { + if block_on(async { args.id_map .contains_vertex_name(&Vertex::copy_from(hgid.as_ref())) .await @@ -143,7 +147,7 @@ fn resolve_hash_prefix(args: &LookupArgs) -> Result> { } fn local_hash_prefix_lookup(args: &LookupArgs) -> Result> { - let hgids = async_runtime::block_on(async { + let hgids = block_on(async { args.id_map .vertexes_by_hex_prefix(args.change_id.as_bytes(), 5) .await @@ -165,7 +169,7 @@ fn remote_hash_prefix_lookup(args: &LookupArgs) -> Result> { None => return Ok(None), }; - let mut response = async_runtime::block_on(async { + let mut response = block_on(async { edenapi .hash_prefixes_lookup(vec![args.change_id.to_string()]) .await @@ -233,3 +237,28 @@ fn metalog_bookmarks( Ok(decoder(raw_bookmarks.as_slice()) .map_err(|err| RevsetLookupError::BookmarkDecodeError(bookmark_type.to_owned(), err))?) } + +fn resolve_revnum(args: &LookupArgs) -> Result> { + if !hgplain::is_plain(None) && args.config.get_or_default("ui", "ignorerevnum")? { + return Ok(None); + } + + let rev: i64 = match args.change_id.parse() { + Err(_) => return Ok(None), + Ok(rev) => rev, + }; + + match rev { + -1 => Ok(Some(NULL_ID)), + WDIR_REV => Ok(Some(WDIR_ID)), + rev => { + let name = block_on(async { args.id_map.vertex_name(Id(rev as u64)).await })?; + Ok(Some(HgId::from_byte_array( + name.0 + .into_vec() + .try_into() + .map_err(|v| anyhow!("unexpected vertex name length: {:?}", v))?, + ))) + } + } +} diff --git a/eden/scm/sapling/configitems.py b/eden/scm/sapling/configitems.py index f48fbd0762eb0..1be4122fc9420 100644 --- a/eden/scm/sapling/configitems.py +++ b/eden/scm/sapling/configitems.py @@ -456,7 +456,6 @@ def getitemregister(configtable): coreconfigitem("ui", "gitignore", default=True) coreconfigitem("ui", "graphnodetemplate", default=None) coreconfigitem("ui", "http2debuglevel", default=None) -coreconfigitem("ui", "ignorerevnum", default=True) coreconfigitem("ui", "interactive", default=None) coreconfigitem("ui", "interface", default=None) coreconfigitem("ui", "interface.chunkselector", default=None) diff --git a/eden/scm/tests/test-hgrc.t b/eden/scm/tests/test-hgrc.t index fc864f96da911..6c517fd0cebda 100644 --- a/eden/scm/tests/test-hgrc.t +++ b/eden/scm/tests/test-hgrc.t @@ -67,6 +67,7 @@ make sure global options given on the cmdline take precedence ui.timeout=600 ui.color=auto ui.paginate=true + ui.ignorerevnum=True ui.verbose=false ui.debug=false ui.quiet=true diff --git a/eden/scm/tests/test-shelve.t b/eden/scm/tests/test-shelve.t index 658bb6d6a5fb4..e1017d8af8d41 100644 --- a/eden/scm/tests/test-shelve.t +++ b/eden/scm/tests/test-shelve.t @@ -7,6 +7,7 @@ $ configure modernclient $ setconfig devel.segmented-changelog-rev-compat=true + $ setconfig checkout.use-rust=true $ cat >> $HGRCPATH << 'EOF' > [extensions]