##// END OF EJS Templates
revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV...
Arseniy Alekseyev -
r51878:363620b9 stable
parent child Browse files
Show More
@@ -225,23 +225,13 b' impl Revlog {'
225 &self,
225 &self,
226 node: NodePrefix,
226 node: NodePrefix,
227 ) -> Result<Revision, RevlogError> {
227 ) -> Result<Revision, RevlogError> {
228 let looked_up = if let Some(nodemap) = &self.nodemap {
228 if let Some(nodemap) = &self.nodemap {
229 nodemap
229 nodemap
230 .find_bin(&self.index, node)?
230 .find_bin(&self.index, node)?
231 .ok_or(RevlogError::InvalidRevision)
231 .ok_or(RevlogError::InvalidRevision)
232 } else {
232 } else {
233 self.rev_from_node_no_persistent_nodemap(node)
233 self.rev_from_node_no_persistent_nodemap(node)
234 };
234 }
235
236 if node.is_prefix_of(&NULL_NODE) {
237 return match looked_up {
238 Ok(_) => Err(RevlogError::AmbiguousPrefix),
239 Err(RevlogError::InvalidRevision) => Ok(NULL_REVISION),
240 res => res,
241 };
242 };
243
244 looked_up
245 }
235 }
246
236
247 /// Same as `rev_from_node`, without using a persistent nodemap
237 /// Same as `rev_from_node`, without using a persistent nodemap
@@ -257,16 +247,22 b' impl Revlog {'
257 // TODO: consider building a non-persistent nodemap in memory to
247 // TODO: consider building a non-persistent nodemap in memory to
258 // optimize these cases.
248 // optimize these cases.
259 let mut found_by_prefix = None;
249 let mut found_by_prefix = None;
260 for rev in (0..self.len() as Revision).rev() {
250 for rev in (-1..self.len() as Revision).rev() {
261 let index_entry = self.index.get_entry(rev).ok_or_else(|| {
251 let candidate_node = if rev == -1 {
262 HgError::corrupted(
252 NULL_NODE
263 "revlog references a revision not in the index",
253 } else {
264 )
254 let index_entry =
265 })?;
255 self.index.get_entry(rev).ok_or_else(|| {
266 if node == *index_entry.hash() {
256 HgError::corrupted(
257 "revlog references a revision not in the index",
258 )
259 })?;
260 *index_entry.hash()
261 };
262 if node == candidate_node {
267 return Ok(rev);
263 return Ok(rev);
268 }
264 }
269 if node.is_prefix_of(index_entry.hash()) {
265 if node.is_prefix_of(&candidate_node) {
270 if found_by_prefix.is_some() {
266 if found_by_prefix.is_some() {
271 return Err(RevlogError::AmbiguousPrefix);
267 return Err(RevlogError::AmbiguousPrefix);
272 }
268 }
@@ -315,8 +315,6 b' Rhg status on a sparse repo with nodemap'
315
315
316 $ hg debugsparse -X excluded-dir
316 $ hg debugsparse -X excluded-dir
317 $ $NO_FALLBACK rhg status
317 $ $NO_FALLBACK rhg status
318 abort: dirstate points to non-existent parent node
319 [255]
320
318
321 Specifying revisions by changeset ID
319 Specifying revisions by changeset ID
322 $ $NO_FALLBACK rhg files -r c3ae8dec9fad
320 $ $NO_FALLBACK rhg files -r c3ae8dec9fad
General Comments 0
You need to be logged in to leave comments. Login now