changeset 48046:cedfe2606adf

debugsate: Change debug_iter() to yield tuples instead of DirstateItem This removes the need for `DirstateItem` to support the `state == ' '` special case which represents dirstate tree nodes without an item. Differential Revision: https://phab.mercurial-scm.org/D11463
author Simon Sapin <simon.sapin@octobus.net>
date Mon, 20 Sep 2021 20:20:55 +0200
parents 357307feaf61
children 631f6b445a77
files mercurial/debugcommands.py mercurial/dirstatemap.py rust/hg-cpython/src/dirstate/dirstate_map.rs
diffstat 3 files changed, 25 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/debugcommands.py	Mon Sep 20 19:59:09 2021 +0200
+++ b/mercurial/debugcommands.py	Mon Sep 20 20:20:55 2021 +0200
@@ -962,32 +962,29 @@
     datesort = opts.get('datesort')
 
     if datesort:
-        keyfunc = lambda x: (
-            x[1].v1_mtime(),
-            x[0],
-        )  # sort by mtime, then by filename
+
+        def keyfunc(entry):
+            filename, _state, _mode, _size, mtime = entry
+            return (mtime, filename)
+
     else:
         keyfunc = None  # sort by filename
     entries = list(repo.dirstate._map.debug_iter(all=opts['all']))
     entries.sort(key=keyfunc)
-    for file_, ent in entries:
-        if ent.v1_mtime() == -1:
+    for entry in entries:
+        filename, state, mode, size, mtime = entry
+        if mtime == -1:
             timestr = b'unset               '
         elif nodates:
             timestr = b'set                 '
         else:
-            timestr = time.strftime(
-                "%Y-%m-%d %H:%M:%S ", time.localtime(ent.v1_mtime())
-            )
+            timestr = time.strftime("%Y-%m-%d %H:%M:%S ", time.localtime(mtime))
             timestr = encoding.strtolocal(timestr)
-        if ent.mode & 0o20000:
+        if mode & 0o20000:
             mode = b'lnk'
         else:
-            mode = b'%3o' % (ent.v1_mode() & 0o777 & ~util.umask)
-        ui.write(
-            b"%c %s %10d %s%s\n"
-            % (ent.v1_state(), mode, ent.v1_size(), timestr, file_)
-        )
+            mode = b'%3o' % (mode & 0o777 & ~util.umask)
+        ui.write(b"%c %s %10d %s%s\n" % (state, mode, size, timestr, filename))
     for f in repo.dirstate.copies():
         ui.write(_(b"copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
 
--- a/mercurial/dirstatemap.py	Mon Sep 20 19:59:09 2021 +0200
+++ b/mercurial/dirstatemap.py	Mon Sep 20 20:20:55 2021 +0200
@@ -120,9 +120,12 @@
 
     def debug_iter(self, all):
         """
+        Return an iterator of (filename, state, mode, size, mtime) tuples
+
         `all` is unused when Rust is not enabled
         """
-        return self.item()
+        for (filename, item) in self.items():
+            yield (filename, item.state, item.mode, item.size, item.mtime)
 
     def __len__(self):
         return len(self._map)
@@ -705,6 +708,13 @@
             return self._rustmap.copymap()
 
         def debug_iter(self, all):
+            """
+            Return an iterator of (filename, state, mode, size, mtime) tuples
+
+            `all`: also include with `state == b' '` dirstate tree nodes that
+            don't have an associated `DirstateItem`.
+
+            """
             return self._rustmap.debug_iter(all)
 
         def preload(self):
--- a/rust/hg-cpython/src/dirstate/dirstate_map.rs	Mon Sep 20 19:59:09 2021 +0200
+++ b/rust/hg-cpython/src/dirstate/dirstate_map.rs	Mon Sep 20 20:20:55 2021 +0200
@@ -20,7 +20,6 @@
 use crate::{
     dirstate::copymap::{CopyMap, CopyMapItemsIterator, CopyMapKeysIterator},
     dirstate::make_dirstate_item,
-    dirstate::make_dirstate_item_raw,
     dirstate::non_normal_entries::{
         NonNormalEntries, NonNormalEntriesIterator,
     },
@@ -612,8 +611,8 @@
             let (path, (state, mode, size, mtime)) =
                 item.map_err(|e| v2_error(py, e))?;
             let path = PyBytes::new(py, path.as_bytes());
-            let item = make_dirstate_item_raw(py, state, mode, size, mtime)?;
-            dirs.append(py, (path, item).to_py_object(py).into_object())
+            let item = (path, state, mode, size, mtime);
+            dirs.append(py, item.to_py_object(py).into_object())
         }
         Ok(dirs)
     }