##// END OF EJS Templates
rust-status: use bare hg status fastpath from Python...
Raphaël Gomès -
r45017:4d1634e5 default
parent child Browse files
Show More
@@ -27,6 +27,7 b' from . import ('
27 policy,
27 policy,
28 pycompat,
28 pycompat,
29 scmutil,
29 scmutil,
30 sparse,
30 txnutil,
31 txnutil,
31 util,
32 util,
32 )
33 )
@@ -1083,7 +1084,7 b' class dirstate(object):'
1083 results[next(iv)] = st
1084 results[next(iv)] = st
1084 return results
1085 return results
1085
1086
1086 def _rust_status(self, matcher, list_clean):
1087 def _rust_status(self, matcher, list_clean, list_ignored, list_unknown):
1087 # Force Rayon (Rust parallelism library) to respect the number of
1088 # Force Rayon (Rust parallelism library) to respect the number of
1088 # workers. This is a temporary workaround until Rust code knows
1089 # workers. This is a temporary workaround until Rust code knows
1089 # how to read the config file.
1090 # how to read the config file.
@@ -1101,16 +1102,45 b' class dirstate(object):'
1101 added,
1102 added,
1102 removed,
1103 removed,
1103 deleted,
1104 deleted,
1105 clean,
1106 ignored,
1104 unknown,
1107 unknown,
1105 clean,
1108 warnings,
1109 bad,
1106 ) = rustmod.status(
1110 ) = rustmod.status(
1107 self._map._rustmap,
1111 self._map._rustmap,
1108 matcher,
1112 matcher,
1109 self._rootdir,
1113 self._rootdir,
1110 bool(list_clean),
1114 self._ignorefiles(),
1115 self._checkexec,
1111 self._lastnormaltime,
1116 self._lastnormaltime,
1112 self._checkexec,
1117 bool(list_clean),
1118 bool(list_ignored),
1119 bool(list_unknown),
1113 )
1120 )
1121 if self._ui.warn:
1122 for item in warnings:
1123 if isinstance(item, tuple):
1124 file_path, syntax = item
1125 msg = _(b"%s: ignoring invalid syntax '%s'\n") % (
1126 file_path,
1127 syntax,
1128 )
1129 self._ui.warn(msg)
1130 else:
1131 msg = _(b"skipping unreadable pattern file '%s': %s\n")
1132 self._ui.warn(
1133 msg
1134 % (
1135 pathutil.canonpath(
1136 self._rootdir, self._rootdir, item
1137 ),
1138 b"No such file or directory",
1139 )
1140 )
1141
1142 for (fn, message) in bad:
1143 matcher.bad(fn, encoding.strtolocal(message))
1114
1144
1115 status = scmutil.status(
1145 status = scmutil.status(
1116 modified=modified,
1146 modified=modified,
@@ -1118,7 +1148,7 b' class dirstate(object):'
1118 removed=removed,
1148 removed=removed,
1119 deleted=deleted,
1149 deleted=deleted,
1120 unknown=unknown,
1150 unknown=unknown,
1121 ignored=[],
1151 ignored=ignored,
1122 clean=clean,
1152 clean=clean,
1123 )
1153 )
1124 return (lookup, status)
1154 return (lookup, status)
@@ -1148,26 +1178,34 b' class dirstate(object):'
1148
1178
1149 use_rust = True
1179 use_rust = True
1150
1180
1151 allowed_matchers = (matchmod.alwaysmatcher, matchmod.exactmatcher)
1181 allowed_matchers = (
1182 matchmod.alwaysmatcher,
1183 matchmod.exactmatcher,
1184 matchmod.includematcher,
1185 )
1152
1186
1153 if rustmod is None:
1187 if rustmod is None:
1154 use_rust = False
1188 use_rust = False
1189 elif self._checkcase:
1190 # Case-insensitive filesystems are not handled yet
1191 use_rust = False
1155 elif subrepos:
1192 elif subrepos:
1156 use_rust = False
1193 use_rust = False
1157 elif bool(listunknown):
1194 elif sparse.enabled:
1158 # Pathauditor does not exist yet in Rust, unknown files
1159 # can't be trusted.
1160 use_rust = False
1195 use_rust = False
1161 elif self._ignorefiles() and listignored:
1196 elif match.traversedir is not None:
1162 # Rust has no ignore mechanism yet, so don't use Rust for
1163 # commands that need ignore.
1164 use_rust = False
1197 use_rust = False
1165 elif not isinstance(match, allowed_matchers):
1198 elif not isinstance(match, allowed_matchers):
1166 # Matchers have yet to be implemented
1199 # Matchers have yet to be implemented
1167 use_rust = False
1200 use_rust = False
1168
1201
1169 if use_rust:
1202 if use_rust:
1170 return self._rust_status(match, listclean)
1203 try:
1204 return self._rust_status(
1205 match, listclean, listignored, listunknown
1206 )
1207 except rustmod.FallbackError:
1208 pass
1171
1209
1172 def noop(f):
1210 def noop(f):
1173 pass
1211 pass
@@ -1249,13 +1287,10 b' class dirstate(object):'
1249 aadd(fn)
1287 aadd(fn)
1250 elif state == b'r':
1288 elif state == b'r':
1251 radd(fn)
1289 radd(fn)
1252
1290 status = scmutil.status(
1253 return (
1291 modified, added, removed, deleted, unknown, ignored, clean
1254 lookup,
1255 scmutil.status(
1256 modified, added, removed, deleted, unknown, ignored, clean
1257 ),
1258 )
1292 )
1293 return (lookup, status)
1259
1294
1260 def matches(self, match):
1295 def matches(self, match):
1261 '''
1296 '''
@@ -666,7 +666,10 b' class _dirchildren(object):'
666 class includematcher(basematcher):
666 class includematcher(basematcher):
667 def __init__(self, root, kindpats, badfn=None):
667 def __init__(self, root, kindpats, badfn=None):
668 super(includematcher, self).__init__(badfn)
668 super(includematcher, self).__init__(badfn)
669
669 if rustmod is not None:
670 # We need to pass the patterns to Rust because they can contain
671 # patterns from the user interface
672 self._kindpats = kindpats
670 self._pats, self.matchfn = _buildmatch(kindpats, b'(?:/|$)', root)
673 self._pats, self.matchfn = _buildmatch(kindpats, b'(?:/|$)', root)
671 self._prefix = _prefix(kindpats)
674 self._prefix = _prefix(kindpats)
672 roots, dirs, parents = _rootsdirsandparents(kindpats)
675 roots, dirs, parents = _rootsdirsandparents(kindpats)
@@ -355,6 +355,11 b' A deleted subrepo file is flagged as dir'
355 R sub1/sub2/folder/test.txt
355 R sub1/sub2/folder/test.txt
356 ! sub1/.hgsub
356 ! sub1/.hgsub
357 ? sub1/x.hgsub
357 ? sub1/x.hgsub
358 $ hg status -R sub1
359 warning: subrepo spec file 'sub1/.hgsub' not found
360 R .hgsubstate
361 ! .hgsub
362 ? x.hgsub
358 $ mv sub1/x.hgsub sub1/.hgsub
363 $ mv sub1/x.hgsub sub1/.hgsub
359 $ hg update -Cq
364 $ hg update -Cq
360 $ touch sub1/foo
365 $ touch sub1/foo
General Comments 0
You need to be logged in to leave comments. Login now