diff --git a/mercurial/pure/parsers.py b/mercurial/pure/parsers.py
index b45c4dc65adc46b7801bbb446818135dace5c78b_bWVyY3VyaWFsL3B1cmUvcGFyc2Vycy5weQ==..da304f78a0e10e45840852ec7d728122f8bbbc6c_bWVyY3VyaWFsL3B1cmUvcGFyc2Vycy5weQ== 100644
--- a/mercurial/pure/parsers.py
+++ b/mercurial/pure/parsers.py
@@ -162,7 +162,7 @@
             return cls(p1_tracked=p1_tracked, p2_info=p2_info)
         elif state == b'n':
             if size == FROM_P2:
-                return cls.new_from_p2()
+                return cls(wc_tracked=True, p2_info=True)
             elif size == NONNORMAL:
                 return cls.new_possibly_dirty()
             elif mtime == AMBIGUOUS_TIME:
diff --git a/rust/hg-core/src/dirstate/entry.rs b/rust/hg-core/src/dirstate/entry.rs
index b45c4dc65adc46b7801bbb446818135dace5c78b_cnVzdC9oZy1jb3JlL3NyYy9kaXJzdGF0ZS9lbnRyeS5ycw==..da304f78a0e10e45840852ec7d728122f8bbbc6c_cnVzdC9oZy1jb3JlL3NyYy9kaXJzdGF0ZS9lbnRyeS5ycw== 100644
--- a/rust/hg-core/src/dirstate/entry.rs
+++ b/rust/hg-core/src/dirstate/entry.rs
@@ -68,7 +68,12 @@
         match state {
             EntryState::Normal => {
                 if size == SIZE_FROM_OTHER_PARENT {
-                    Self::new_from_p2()
+                    Self {
+                        // might be missing P1_TRACKED
+                        flags: Flags::WDIR_TRACKED | Flags::P2_INFO,
+                        mode_size: None,
+                        mtime: None,
+                    }
                 } else if size == SIZE_NON_NORMAL {
                     Self::new_possibly_dirty()
                 } else if mtime == MTIME_UNSET {